| Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa |
| tutorial_de_its [2023/10/27 16:24] – [Sistema de Archivos] peron | tutorial_de_its [2026/04/21 16:09] (actual) – editor externo 127.0.0.1 |
|---|
| Gracias al [[pubnix]] HACTRN.org, podrás utilizar una instancia del [[ITS]] sobre una minicomputadora [[PDP#pdp10|DEC PDP-10]] emulada. | Gracias al [[pubnix]] HACTRN.org, podrás utilizar una instancia del [[ITS]] sobre una minicomputadora [[PDP#pdp10|DEC PDP-10]] emulada. |
| |
| Con este tutorial podrás aprender ciertos detalles de uso de uno de los más míticos sistemas operativos de la cultura [[hacker]], desarrollado en el [[MIT]]. | HACTRN.ORG es un [[pubnix]] que corre una instancia de [[its|Incompatible Timesharing System]]. Con este tutorial podrás aprender ciertos detalles de uso de uno de los más míticos sistemas operativos de la cultura [[hacker]], desarrollado en el [[MIT]]. |
| ====Loguearse a ITS==== | |
| |
| Desde nuestro sistema compartido texto-plano.xyz, podrás acceder a HACTRN utilizando [[telnet]]. Para ello ingresa: | ====Iniciar sesión en HACTRN==== |
| | |
| | Debido a la seguridad laxa del MIT - fundamento de la cultura hacker - podrá darse de alta en HACTRN al igual que en el ITS clásico, esto significa sin sin suplir //luser// (forma risueña de "usuario de laboratorio"), ni contraseña. |
| | |
| | |
| | ===Loguearse a ITS con TVCon=== |
| | Podrás utilizar el [[emulador de terminal]] [[https://hactrn.org/tvcon/tvcon-linux.gz|TVcon]] si lo instalas en tu propio sistema Linux. En tal caso deberías conectarte a HACTRN desde tu sistema con: |
| |
| <code bash> | <code bash> |
| telnet hactrn.org 10003 | tvcon -2BCS bitzone.sdf.org |
| </code> | </code> |
| |
| Notablemente también podrías utilizar el [[emulador de terminal]] [[https://hactrn.org/tvcon/tvcon-linux.gz|TVcon]] si lo instalas en tu propio sistema Linux. En tal caso deberías conectarte a HACTRN desde tu sistema con: | Al lograr contacto, recibirá una pantalla de bienvenida al entorno HACTRN emulado. |
| | |
| | {{ :its.png?200 |}} |
| | |
| | Una vez presentados este "lobby" electrónico se le invita a activar una consola de terminal. Active su terminal en HACTRN presionando la **tecla F1** e ingresa: |
| |
| <code bash> | <code bash> |
| tvcon -2BCS hactrn.org | luser<ESC>u |
| </code> | </code> |
| | ...siendo luser tu //nombre de usuario// de HACTRN. |
| |
| | ===Loguearse a ITS con Telnet=== |
| | |
| | Desde nuestro sistema compartido texto-plano.xyz, podrás acceder al ITS HACTRN por medio de nuestro cliente de [[telnet]]. Para ello ingresa: |
| | |
| | <code bash> |
| | telnet bitzone.sdf.org 10003 |
| | </code> |
| | |
| | Si utilizas telnet, lama la atención de la terminal mediante **Ctrl+z** e ingresa tu nombre de usuario para adentrarte en ITS: |
| | |
| | <code> |
| | :login luser |
| | </code> |
| |
| Al conectar tu [[terminal de computadora|terminal]] a la PDP-10 simulada, deberás activar HACTRN (pronunciado "hac-tran"), un programa oficia de [[intérpretes de comandos|interprete de comando]] presentando un prompt en forma de ''*''. Actívalo presionando **Ctrl+z** (**F1** si usas TVcon). HACTRN te mostrará una pantalla inicial similar a la siguiente: | Ante cualquiera de ambos casos, se refrescará la pantalla de login: |
| |
| <code> | <code> |
| </code> | </code> |
| |
| Si utilizas telnet, conviene configurar una emulación de [[vt100|DEC VT100]] mediante el comando: | |
| |
| <code bash> | |
| :crtsty vt100 | |
| </code> | |
| |
| No es necesario contar con un usuario de sistema ITS para utilizar la mayoría de los programas; simplemente puedes introducir **Ctrl+z** (o F1) para activar el terminal y comenzar a operar. Ciertos programas requieren utilizar un nombre de usuario, y tal vez incluso contar con un directorio de almacenamiento ("home"). | >Originalmente, ITS no pedía una contraseña de modo que no existía protección que impidiese loguearse como otra persona. __Sin embargo, debes considerarlo un sistema con poco resguardo de la privacía__. |
| |
| Si deseas loguearte bajo un nombre de usuario, ingresa :login ''usuario'' o bien introduce ''usuario''+**Esc**+u. | ===Cerrar Sesión=== |
| |
| >Originalmente, ITS no pedía una contraseña de modo que no existía protección que impidiese loguearse como otra persona. __Sin embargo, debes considerarlo un sistema con poco resguardo de la privacía__. | Al finalizar tu trabajo __usa el comando '':logout'' para cerrar su sesión de usuario en HACTRN__. |
| |
| ===Ingresar comandos en DDT=== | Esto cierra la sesión e interrumpe todos los trabajos de cómputo bajo el luser asociado, PERO NO CIERRA LA CONSOLA TELNET. |
| Cada comando de ITS suele empezar con '':'', y para ejecutarlo debes presionar la **tecla Intro** de tu terminal. | |
| |
| Muchas veces podrás interrumpir un programa en pleno funcionamiento mediante la combinación de teclas **Ctrl+z**. En otros casos los programas finalizan su ejecución por si mismos, por lo que DDT te presentará el reporte //:kill//, lo que indica que el programa mismo se autoeliminó y liberó la memoria que consumía. | Para cerrar y liberar la consola Telnet, una vez cerrada la sesión de usuario tenga a bien usar la combinación **Ctrl+AltGr+]**, y cuando aparezca el //prompt// ''telnet>'' ingrese el comando ''quit''. |
| |
| El programa de ayuda más simple que podrás ejecutar es '':luser'', que indicará advertencias al usuario novato. En tanto el comando '':help'' indica una introducción básica del intérprete DDT. El comando '':?'' te listará los comandos mas usuales de ITS (puedes paginarlos con la **Barra Espaciadora**). El comando '':info'' presentará ayuda en pantalla. | |
| |
| === Crear un usuario de ITS en HACTRN === | |
| | ===Ingresar comandos en DDT=== |
| |
| El prompt ''*'' te indicará que te encuentras usando DDT, el intérprete de comandos y depurador de nivel superior del [[tiempo de cómputo compartido|sistema de cómputo de tiempo compartido]] ITS. | El prompt ''*'' te indicará que te encuentras usando DDT, el intérprete de comandos y depurador de nivel superior del [[tiempo de cómputo compartido|sistema de cómputo de tiempo compartido]] ITS. |
| |
| Crea tu propio directorio. Para ello Presiona **Ctrl+r** e ingresa el comando ''usuario; ..new (uder)'' (siendo ''usuario'' tu nombre de usuario). Si bien DDT te informará "no such file", aún así creará el directorio. El directorio ''USUARIO'' será suyo en virtud de ser el mismo que su nombre de usuario. Esto podría no ser el caso para todos los usuarios. | Cada comando de ITS suele comenzar con '':'', y para ejecutarlo debes presionar la **tecla Intro** de tu terminal. |
| |
| Contar con un directorio home te será suficiente para la mayoría de las aplicaciones, pero para convertirte a tí mismo en un usuario "oficial" de ITS, será necesario registrarte en la base de datos de usuarios INQUIR. Para ello, ingresa el comando: | Si utilizas Telnet, te conviene primero configurar una emulación de [[vt100|DEC VT100]] mediante el comando: |
| |
| | <code bash> |
| | :crtsty vt100 |
| | :tctyp scroll |
| | </code> |
| | |
| | Muchas veces podrás interrumpir un programa en pleno funcionamiento mediante la combinación de teclas **Ctrl+z**. En otros casos los programas finalizan su ejecución por si mismos, por lo que DDT te presentará el reporte //:kill//, lo que indica que el programa mismo se autoeliminó y liberó la memoria que consumía. |
| | |
| | El programa de ayuda más simple que podrás ejecutar es '':luser'', que indicará advertencias al usuario novato. En tanto el comando '':help'' indica una introducción básica del intérprete DDT. El comando '':?'' te listará los comandos mas usuales de ITS (puedes paginarlos con la **Barra Espaciadora**). El comando '':info'' presentará ayuda en pantalla. |
| | |
| | ==== Crear un usuario de ITS en HACTRN ==== |
| | |
| | Ciertos programas requieren utilizar un nombre de //luser//, y tal vez incluso contar con un directorio de almacenamiento (“home”). Si desea crear tal directorio de almacenamiento debe decidir su nombre de luser, presionar **Ctrl+r** e ingresar el comando |
| <code> | <code> |
| :INQUIR | luser; ..new. (uder) |
| </code>. | </code> |
| |
| Responde todas las preguntas (en inglés). Para completar los campos solicitados presiona la **tecla Intro** o **Ctrl+c** según se indique. Al terminar, deberás almacenarla con el comando **DONE**. | (siendo "luser" el //nombre de usuario// deseado). Aunque DDT informe "no such file", aún así creará el directorio. Este directorio LUSER simplemente le será asignado a cualquier usuario que ingrese al sistema HACTRN con dicho nombre. |
| |
| Cuando te loguees, DDT recavará la base de datos INQUIR por el nombre de tu directorio home. Al usar este programa, si directorio home podría ser distinto al de tu nombre de usuario (si así lo has dispuesto). Por supuesto, para cerrar la sesión de usuario, emplea el comando '':logout'' | Contar con un directorio home implica en la práctica poder usar la mayoría de las aplicaciones de ITS, pero para oficializar el luser en el ambiente deberá completar el formulario con las preguntas realizadas por el programa INQUIR. Para ello, ingrese el comando: |
| | <code> |
| | :inquir |
| | </code> |
| | Complete los campos que aparezcan en forma de preguntas en inglés. Debe mecanografiar las respuestas y presionar la **tecla Intro** o bien **Ctrl+c** según se le indique. Al finalizar, almacene los resultandos con el comando ''DONE''. |
| |
| | Al iniciar sesión nuevamente, DDT recabará la base de datos INQUIR por el nombre de su directorio home. Al usar este programa, si directorio home podría ser distinto al de su nombre de usuario (si así ha decidido determinarlo). |
| ==== Sistema de Archivos ==== | ==== Sistema de Archivos ==== |
| El sistema de archivaje de ITS carece de consiste en directorios (sin subdirectorios) y ficheros, con control de versionado. Carece de permisos de usuario. | |
| |
| Los nombres de ficheros son insensibles a mayúsculas y constan de cuatro partes, cada una de hasta seis letras. Por ejemplo ''DSK:LUSER;carta 5''. Las partes descriptivas que componen el nombre completo son: | El sistema de archivos de ITS es relativamente potente, y consiste en directorios y ficheros, con control de versionado. |
| | |
| | Los nombres de ficheros son insensibles a mayúsculas y constan de cuatro partes, cada una de hasta seis caracteres. Las partes descriptivas que componen el nombre completo son: |
| * //Dispositivo de almacenamiento// terminado por '':'', puede ser ''DSK:'' o ''MD:'', | * //Dispositivo de almacenamiento// terminado por '':'', puede ser ''DSK:'' o ''MD:'', |
| * //Directorio//, terminado en '';'', por ejemplo ''LUSER;'', ''.INFO;'' o ''HACK;'' | * //Directorio//, terminado en '';'', por ejemplo ''LUSER;'', ''.INFO;'' o ''HACK;'' |
| * //Versión o descripción// (va separada del nombre de fichero por un caracter de espacio). | * //Versión o descripción// (va separada del nombre de fichero por un caracter de espacio). |
| |
| Usa '':prufd'' para imprimir el contenido del dispositivo de almacenamiento actual (normalmente DSK:). Puedes usar '':cwd directorio'' para cambiarte de directorio. Si ingresaste con un nombre de luser, al introducir '':cwd'' volverás a al directorio del luser. | Ejemplo: ''DSK;LUSER;FICHER EXTEN.1'' |
| |
| Emplea el comando '':listf'' (**Ctrl+f** su usas TVcon) para obtener un listado de los ficheros de un directorio. | Use '':cwd'' para ver su directorio home, y '':cwd directorio'' para cambiar a otro directorio. |
| |
| Mediante '':print fichero'' podrás imprimir en pantalla el contenido de un fichero. El directorio ''.info'' cuenta con muchos archivos que documentan los programas del sistema. | Use el comando '':listf'' o la combinación de teclas **Ctrl+f** para listar los ficheros del directorio de trabajo actual. |
| |
| Usa '':dskuse'' para conocer el estado de uso en disco del directorio. | Imprima en pantalla el contenido de un fichero mediante '':print fichero'' o **Ctrl+r** ''fichero''. |
| |
| | Use '':prufd'' para imprimir el contenido del dispositivo de almacenamiento actual (normalmente DSK:). |
| | |
| | Use '':dskuse'' para conocer el estado de uso en disco del directorio. |
| |
| ====Control de Trabajos en ITS==== | ====Control de Trabajos en ITS==== |
| Un trabajo ("job") es la entidad en la cual los programas ejecutan un trabajo de cómputo en el sistema, unívocamente identificado por sus dos nombres, su //uname//, que identifica al poseedor, y el //jname// que usualmente no se menciona. | |
| |
| DDT es bueno en manipular estos trabajos. Un luser puede tener varios trabajos en concurrente ejecución, dispuestos de manera arbolada en el cual HACTRN (que contiene DDDT) en su cima. En cualquier momento puede haber más de un trabajo en ejecución, pero sólo un trabajo tiene control de la consola de terminal. | ITS fue un sistema multiusuario multitarea, señero en el sentido que podía operar distintos planos los trabajos de cómputo en ejecución ("jobs"). |
| | |
| | Un trabajo ("job") es la entidad en la cual los programas ejecutan un trabajo de cómputo en el sistema, unívocamente identificado por sus dos nombres, su //uname//, que identifica al poseedor, y el //jname// que usualmente no se menciona. DDT es bueno en manipular estos trabajos. Cada luser puede tener varios trabajos en concurrente ejecución, dispuestos de manera arbolada en el cual HACTRN (que contiene DDT) se encontrará en su cima. En cualquier momento puede haber más de un trabajo en ejecución, __pero sólo un trabajo tiene control de la consola de terminal__. |
| |
| Sabiendo que DDT es el nombre del programa, y HACTRN es el nombre del trabajo //jname// en el que se ejecuta, usaremos ambos nombres para referir al trabajo en primer plano. | Sabiendo que DDT es el nombre del programa, y HACTRN es el nombre del trabajo //jname// en el que se ejecuta, usaremos ambos nombres para referir al trabajo en primer plano. |
| |
| Para continuar un trabajo detenido con una combinación de teclas, se puede usar el comando '':continue'' o **Esc+p**. | Para continuar un trabajo detenido con una combinación de teclas, se puede usar el comando '':continue'' o **Esc+p**. |
| |
| |
| |
| |
| ====Comunicaciones==== | ====Comunicaciones==== |
| Con el comadno :who podrás ver qué usuarios están conectados en el sistema. En cualquier caso, podrás mandar un mensaje a otro usuario con '':send'' ''usuario'' //mensaje//, y utiliza **Ctrl+c** para enviar el mensaje a ''usuario''. | Use el comando '':who'' para listar los lusers conectados al sistema. |
| |
| Si usas '':shout'' //mensaje// y lo envías con Ctrl+c, enviarás el mensaje a todos los usuarios conectados. | Use '':finger'', '':telnet'', '':ftpu'', '':kermit'', '':xmodem'', para tareas respectivas de comunicación saliente con dichas aplicaciones de transmisión de datos. |
| |
| | En cualquier caso, podrá remitir un mensaje a otro usuario con '':send usuario mensaje'' y presiuone **Ctrl+c** para producir el envío al usuario. |
| | |
| | Al usar '':shout mensaje'' y enviarlo con **Ctrl+c**, se propalará el mensaje a todos los usuarios conectados. |
| | ===Correo electrónico en ITS=== |
| | Puede utilizar correo electrónico interno dentro del sistema. |
| | |
| | El programa para ello puede invocarse con '':mail'', o bien '':msend'' para enviar a varios usuarios internos. |
| | |
| | Como siempre, el envío final del mensaje se produce con **Ctrl+c**. |
| | |
| | Para leer los mensajes de correo puede usar '':rmail'' (lector en Emacs). |
| ====Comandos de ITS==== | ====Comandos de ITS==== |
| He aquí una serie de equivalencias de comandos de UNIX a un equivalente para el ITS. En ITS el ''$'' equivale a presionar la tecla **tecla Escape**. | He aquí una serie de equivalencias de comandos de UNIX a un equivalente para el ITS. En ITS el ''$'' equivale a presionar la tecla **tecla Escape**. |
| |
| ^ **Comando de UNIX** ^ **Comando de DDT** ^ **Comando con :** ^ | ^ **Comando de UNIX** ^ **Comando de DDT** ^ **Comando con :** ^ |
| | login: ''usuario'' | ''usuario''$u | :login ''usuario'' | | | login: ''usuario'' | ''usuario''**Esc**,u | :login ''usuario'' | |
| | logout | $$u | :logout | | | logout | **Esc,Esc**+u | :logout | |
| | TERM=vt52 | | :tctyp vt52 | | | TERM=vt52 | | :tctyp vt52 | |
| | TERM=vt100 | | :crtsty vt100 | | | TERM=vt100 | | :crtsty vt100 | |
| | clear | | :clear | | | clear | | :clear | |
| | ls | **Ctrl+f** | :listf | | | ls | **Ctrl+f** | :listf | |
| | ls //directorio// | ''directorio''Ctrl+F | :listf ''directorio'' | | | ls ''directorio'' | ''directorio''Ctrl+F | :listf ''directorio'' | |
| | ls / | **Ctrl-R** m.f.d. (''fichero'') | :print m.f.d. (''fichero'') | | | ls / | **Ctrl-R** m.f.d. (''fichero'') | :print m.f.d. (''fichero'') | |
| | ls *.foo | **Ctrl-R** ''directorio'': second foo | :print ''directorio'': second foo | | | ls *.foo | **Ctrl-R** ''directorio'': second foo | :print ''directorio'': second foo | |
| | mkdir //directorio// | **Ctrl+R** ''directorio'';..new. (udir) | :print ''directorio'';..new. (udir) | | | mkdir //directorio// | **Ctrl+R** ''directorio'';..new. (udir) | :print ''directorio'';..new. (udir) | |
| | cd directorio | ''directorio''$$**CTRL-S** | :cwd ''directorio'' | | | cd directorio | ''directorio''$$**CTRL-S** | :cwd ''directorio'' | |
| | cp //f1// //f2// | $**Ctrl+r** f1,f2 | :copy ''f1'',''f2'' | | | cp ''f1'' ''f2'' | **Esc**,**Ctrl+r** f1,f2 | :copy ''fichero1'',''fichero2'' | |
| | rm //fichero// | **CTRL+o** fichero | :delete ''fichero'' | | | rm ''fichero'' | **CTRL+o** fichero | :delete ''fichero'' | |
| | ln //f1// //f2// | $**Ctrl+o** f1,f2 | :link ''f1'',''f2'' | | | ln ''fichero1'' ''fichero2'' | **Esc**,**Ctrl+o** f1,f2 | :link ''fichero1'',''fichero2'' | |
| | mv //f1// //f2// | $$**Ctrl+o** f1,f2 | :rename ''f1'',''f2'' | | | mv ''fichero1'' ''fichero2'' | **Esc**,**Esc**,**Ctrl+o** ''fichero1'',''fichero2'' | :rename ''fichero1'',''fichero2'' | |
| | mv //fichero// //directorio// | :move ''fichero'',''directorio'' | | | | mv //fichero// //directorio// | :move ''fichero'',''directorio'' | | |
| | emacs | emacs**Ctrl+K** | <nowiki>:emacs</nowiki> | | | emacs | emacs**Ctrl+K** | '':emacs'' | |
| | ps | $$v | :listj | | | ps | **Esc**,**Esc**,v | '':listj'' | |
| | kill pid | pid$Ctrl+x | :job pid :kill | | | kill pid | pid**Esc**,**Ctrl+x** | :job pid :kill | |
| | sudo -u u ''comando'' | u$**Ctrl+s** ''comando'' | | | sudo -u //usuario// ''comando'' | u**Esc**,**Ctrl+s** ''comando'' | |
| | top | ''peek''**Ctrl+h** | :peek | | | top | ''peek''**Ctrl+h** | :peek | |
| | **Ctrl+u** | **Ctrl+d** | | | | **Ctrl+u** | **Ctrl+d** | | |
| | **Ctrl+z** | **Ctrl+z** | | | | **Ctrl+z** | **Ctrl+z** | | |
| | **Ctrl+d** | **Ctrl+c** | | | | **Ctrl+d** | **Ctrl+c** | | |
| | fg | $P | :continue | | | fg | **Esc**,p | :continue | |
| | bg | **Ctrl+p** | :proceed | | | bg | **Ctrl+p** | :proceed | |
| |
| ====Emacs ==== | ====Editores ==== |
| | Introduzca textos o código de progarmación al sistema mediante sus editores. |
| | Use el comando ":emacs fichero" para editar con Emacs, o bien use ":teco". |
| |
| ITS contaba con el editor EMACS, un editor de texto que inspiró el [[emacs|GNU Emacs]]. Como tal los comandos son algo diferentes: | Los comandos de Emacs de ITS son mayormente similares a los de la versión GNU Emacs. |
| |
| | **Ctrl+x,Ctrl+f** ''fichero'' **Intro** | Carga fichero | | | **Ctrl+x,Ctrl+f** ''fichero''(**Intro**) | Carga fichero | |
| | **Ctrl+x,Ctrl+s** ''fichero'' **Intro** | Guarda fichero | | | **Ctrl+x,Ctrl+s** ''fichero''(**Intro**) | Guarda fichero | |
| | **Ctrl+x,Ctrl+c** | sale (pero no mata emacs) | | | **Ctrl+x,Ctrl+c** | sale (pero no mata emacs) | |
| | **Ctrl+f** | cursor derecha | | | **Ctrl+f** | cursor derecha | |
| | **Ctrl+k** | Borra hasta el final de la línea | | | **Ctrl+k** | Borra hasta el final de la línea | |
| |
| | ==== Subsistemas==== |
| | |
| | ITS es una plataforma de programación y virtualización que cuenta con gran |
| | cantidad de intérpretes y subsistemas. |
| | |
| | | '':cc'' | Compilador de C | |
| | | '':macsyma'' | MacSyma 1001 | |
| | | '':forth'' | Forth | |
| | | '':macn80'' | Macro Z80 | |
| | | '':macro-10'' | DEC Macro-10 | |
| | | '':lisp'' | LISP PDP-10 | |
| | | '':lisp11'' | Lisp PDP-11 | |
| | | '':scheme'' | Scheme | |
| | | '':llogo'' | Logo | |
| | | '':logas'' | Logo SAIL | |
| | | '':fail'' | Ensamblador del SAIL | |
| | | '':cross'' | Compilador cruzado de microcomputadoras. | |
| | |
| | A su vez, contará con una [[sh|shell tipo Unix]] con '':shell'' (lo abandonará con q). |
| | ====Juegos==== |
| | |
| | El ITS cuenta con varios juegos, entre ellos: |
| | |
| | | '':advent'' | Versión clásica de la aventura de texto Colossal Cave. | |
| | | '':wumpus'' | Juego para cazar la míticaa criatura Wumpus. | |
| | | '':eliza'' | Juegos de psiquiatría. | |
| | | '':games,ckr'' | Damas | |
| | | '':games;ocm'' | Ajedrez | |
| | | '':chess'' | Ajedrez | |
| | | '':games;chess2'' | Ajedrez | |
| | | '':go'' | Ajedrez chino Go | |
| | | '':games;maze'' | FPS multiusuario | |
| | | '':chase'' | Laberinto para dos jugadores. | |
| | | '':cube'' | juego de cubo de rubik. | |
| | | '':games;mlife'' | Juego de la vida de Comway | |
| | | '':games;trek'' | Viaje a las Esterllas | |
| | | '':games;guess'' | Adivinar nros. | |
| | |
| | También puede jugar la aventura de texto Zork, pero requiere tener un archivo en su directorio para trabajar, de modo que debe ingresar: |
| | |
| | <code> |
| | :login luser |
| | :print luser; ..new. (udir) |
| | :create luser; _msgs_ luser |
| | </code> |
| | |
| | Presione **Ctrl+c** e ingresa: '':zork'' |
| ====Otros programas de ITS ==== | ====Otros programas de ITS ==== |
| |