Ë
    :vžj>  ã                  ó�  — d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlmZ ddlmZ ddlmZmZmZ erddlmZ 	 ddlmZ dd	„ZddlmZ dZdZ G d„ d«      Z dd„Z!ddd„Z" G d„ d«      Z# G d„ de#«      Z$ G d„ de%«      Z& G d„ de#«      Z' G d„ de#«      Z(y# e$ r 	 dd
lmZ n# e$ r eZY nw xY wdZY Œrw xY w) zMTerminal management for exposing terminals to a web interface using Tornado.
é    )ÚannotationsN)Údeque)Úfutures)ÚTYPE_CHECKINGÚAnyÚ	Coroutine)Ú
TermSocket)ÚPtyProcessUnicodec                 óh   — t        j                   t         j                  t         j                  «       y)z-A prexec function to set up a signal handler.N)ÚsignalÚSIGPIPEÚSIG_DFL© ó    úe/workspace/moltex-experiments/.pixi/envs/default/lib/python3.12/site-packages/terminado/management.pyÚ
preexec_fnr      s   € ä�‰”f—n‘n¤f§n¡nÕ5r   )Ú
PtyProcess)ÚIOLoopÚPYXTERM_zxterm-256colorc                  óx   — e Zd ZU dZded<   d
dd„Zdd„Zej                  fdd„Z	ej                  fdd„Z
ddd	„Zy)ÚPtyWithClientsz%A pty object with associated clients.ú
str | NoneÚ	term_nameNc                óò   — g | _         t        g d¬«      | _        ||xs g |dœ}t        �	t        |d<   t	        j
                  d	i |¤Ž| _         t        j                  d«      d¬«      | j                  _	        y)
zInitialize the pty.éè  )Úmaxlen)ÚargvÚenvÚcwdNr   zutf-8Úreplace)Úerrorsr   )
Úclientsr   Úread_bufferr   r
   ÚspawnÚptyprocÚcodecsÚgetincrementaldecoderÚdecoder)Úselfr   r   r   Úkwargss        r   Ú__init__zPtyWithClients.__init__2   sn   € à"$ˆŒä',¨R¸Ô'=ˆÔØ s¢y¨b¸Ñ=ˆÜÐ!Ü#-ˆF�<Ñ Ü(×.Ñ.Ñ8°Ñ8ˆŒð  Eœv×;Ñ;¸GÓDÈIÔVˆ�‰Õr   c                ó  — dx}}| j                   D ]%  }|j                  \  }}|�||k  r|}|€Œ||k  sŒ$|}Œ' |dk(  s|dk(  ry| j                  j                  «       \  }}||f||fk7  r| j                  j	                  ||«       yy)a  Set the terminal size to that of the smallest client dimensions.

        A terminal not using the full space available is much nicer than a
        terminal trying to use more than the available space, so we keep it
        sized to the smallest client.
        i'  N)r"   Úsizer%   Ú
getwinsizeÚ
setwinsize)r)   ÚminrowsÚmincolsÚclientÚrowsÚcolss         r   Úresize_to_smallestz!PtyWithClients.resize_to_smallest@   sŸ   € ð "Ð!ˆ�'Ø—l”lˆFØŸ™‰JˆD�$ØÐ D¨7¢NØ�ØÑ D¨7£NØ‘ð #ð �eÒ˜w¨%Ò/Øà—\‘\×,Ñ,Ó.‰
ˆˆdØ�$ˆ<˜G WÐ-Ò-Ø�L‰L×#Ñ# G¨WÕ5ð .r   c                ó:   — | j                   j                  |«       y)z'Send a signal to the process in the ptyN)r%   Úkill)r)   Úsigs     r   r7   zPtyWithClients.killV   s   € à�‰×Ñ˜#Õr   c                óÞ   — t         j                  dk(  r| j                  j                  |«      S t        j                  | j                  j
                  «      }t        j                  ||«       y)z<Send a signal to the process group of the process in the ptyÚntN)ÚosÚnamer%   r7   ÚgetpgidÚpidÚkillpg)r)   r8   Úpgids      r   r?   zPtyWithClients.killpgZ   sK   € ä�7‰7�dŠ?Ø—<‘<×$Ñ$ SÓ)Ð)Ü�z‰z˜$Ÿ,™,×*Ñ*Ó+ˆÜ
�	‰	�$˜ÔØr   c              ƒ  ó  ‡ K  — t         j                  dk(  r!t        j                  t        j                  g}n>t        j
                  t        j                  t        j                  t        j                  g}t        j                  «       }dˆ fd„}‰ j                  j                  «       sy	 |D ]>  }‰ j                  |«        |«       ƒ d{  –—†  ‰ j                  j                  «       rŒ> y |rR‰ j                  t        j                  «        |«       ƒ d{  –—†  t        ‰ j                  j                  «        «      S y7 Œw7 Œ+# t        $ r7  |«       ƒ d{  –—†7   t        ‰ j                  j                  «        «      cY S w xY w­w)zþThis forces a child process to terminate. It starts nicely with
        SIGHUP and SIGINT. If "force" is True then moves onto SIGKILL. This
        returns True if the child was terminated. This returns False if the
        child could not be terminated.r:   c                 óV   •— t        j                  ‰ j                  j                  «      S )z/Sleep to allow the terminal to exit gracefully.)ÚasyncioÚsleepr%   Údelayafterterminate©r)   s   €r   rD   z'PtyWithClients.terminate.<locals>.sleepn   s   ø€ ä—=‘= §¡×!AÑ!AÓBÐBr   TNF)ÚreturnzCoroutine[Any, Any, None])r;   r<   r   ÚSIGINTÚSIGTERMÚSIGHUPÚSIGCONTr   Úcurrentr%   Úisaliver7   ÚSIGKILLÚboolÚOSError)r)   ÚforceÚsignalsÚ_rD   r8   s   `     r   Ú	terminatezPtyWithClients.terminateb   s  øè ø€ ô
 �7‰7�dŠ?Ü—}‘}¤f§n¡nÐ5‰Gä—}‘}¤f§n¡n´f·m±mÄVÇ^Á^ÐTˆGä�N‰NÓˆõ	Cð �|‰|×#Ñ#Ô%Øð	4Û�Ø—	‘	˜#”Ù“g—�Ø—|‘|×+Ñ+Õ-Ùð	 ñ
 Ø—	‘	œ&Ÿ.™.Ô)Ù“g—�Ü §¡× 4Ñ 4Ó 6Ð6Ó7Ð7Øð øð
 ùô ò 	4ñ
 “'�M‰MÜ˜DŸL™L×0Ñ0Ó2Ð2Ó3Ò3ð	4üsl   ƒB(FÂ, E ÃEÃE Ã,E Ã-FÃ.,E ÄEÄ'E ÅFÅE ÅE ÅFÅEÅ)FÆFÆFÆF)NN)r   r   r   zdict[str, str] | Noner   r   ©rG   ÚNone)r8   ÚintrG   rV   )r8   rW   rG   r   ©F)rQ   rO   rG   rO   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r+   r5   r   rI   r7   r?   rT   r   r   r   r   r   -   s7   … Ù/àÓôWó6ð, %Ÿn™nô ð !'§¡ô õ#4r   r   c                óh   — |j                  «       D ]  \  }}|€| j                  |d«       Œ|| |<   Œ! y)z<Like dict.update(), but remove keys where the value is None.N)ÚitemsÚpop)ÚtargetÚchangesÚkÚvs       r   Ú_update_removingre   ˆ   s2   € à—‘–‰ˆˆ1Øˆ9Ø�J‰J�q˜$ÕàˆF�1ŠIñ	  r   c                ó\  — t         j                  dk(  r{t        j                  «       }|j	                  | t        j
                  t        j                  z  t        j                  z  t        j                  z  «       |j                  |dz  «      S t        j                  | gg g |«      \  }}}|S )zIPoll using poll() on posix systems and select() elsewhere (e.g., Windows)Úposixr   )	r;   r<   ÚselectÚpollÚregisterÚPOLLINÚPOLLPRIÚPOLLHUPÚPOLLERR)ÚfdÚtimeoutÚpollerÚrrS   s        r   Ú_pollrs   ‘   s   € ä	‡w�w�'ÒÜ—‘“ˆØ�‰Ø”—‘¤§¡Ñ.´·±Ñ?Ä&Ç.Á.ÑPô	
ð �{‰{˜7 T™>Ó*Ð*ä�m‰m˜R˜D " b¨'Ó2�G€A€qˆ!Ø€Hr   c                  ó®   — e Zd ZdZ	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 dd„Z	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 dd„Zdd„Zdd„Zdd„Zddd„Z	dd	„Z
ddd
„Zdd„Zdd„Zdd„Zy)ÚTermManagerBasez"Base class for a terminal manager.Nc                ób  — || _         || _        |xs i | _        || _        t	        j
                  t        «      | _        i | _        |€#d| _	        t        j                  d¬«      | _        nd| _	        || _        |�5t        j                  d| j                  j                  › d�t         d¬	«       yy)
úInitialize the manager.NFé   )Úmax_workersTzSetting z!.ioloop is deprecated and ignoredé   )Ú
stacklevel)Úshell_commandÚ
server_urlÚterm_settingsÚ	extra_envÚloggingÚ	getLoggerrY   ÚlogÚ
ptys_by_fdÚ!_blocking_io_executor_is_externalr   ÚThreadPoolExecutorÚblocking_io_executorÚwarningsÚwarnÚ	__class__ÚDeprecationWarning)r)   r|   r}   r~   r   Úioloopr†   s          r   r+   zTermManagerBase.__init__¡   s¦   € ð +ˆÔØ$ˆŒØ*Ò0¨bˆÔØ"ˆŒÜ×$Ñ$¤XÓ.ˆŒà57ˆŒàÐ'Ø5:ˆDÔ2Ü(/×(BÑ(BÈqÔ(QˆDÕ%à59ˆDÔ2Ø(<ˆDÔ%àÐÜ�M‰MØ˜4Ÿ>™>×2Ñ2Ð3Ð3TÐUÜ"Øöð r   c                óê  — t         j                  j                  «       }| j                  j	                  dt
        «      |d<   d||fz  }|r|r
|d||fz  z  }||t        dz   <   t        |«      |d<   t        |«      |d<   | j                  r| j                  |t        dz   <   | j                  rt        || j                  «       |j	                  d	i «      }|rt        |t        «      rt        ||«       |S )
z@Build the environment variables for the process in the terminal.ÚtypeÚTERMz%dx%dz;%dx%dÚ
DIMENSIONSÚCOLUMNSÚLINESÚURLr   )r;   ÚenvironÚcopyr~   ÚgetÚDEFAULT_TERM_TYPEÚ
ENV_PREFIXÚstrr}   r   re   Ú
isinstanceÚdict)	r)   ÚheightÚwidthÚ	winheightÚwinwidthr*   r   Ú
dimensionsÚterm_envs	            r   Úmake_term_envzTermManagerBase.make_term_envÁ   sÝ   € ô �j‰j�o‰oÓˆð ×(Ñ(×,Ñ,¨VÔ5FÓGˆˆF‰Ø  v˜Ñ.ˆ
Ù™	Ø˜( h°	Ð%:Ñ:Ñ:ˆJØ)3ˆŒJ˜Ñ%Ñ&Ü˜U›ˆˆI‰Ü˜6“{ˆˆG‰à�?Š?Ø&*§o¡oˆC”
˜UÑ"Ñ#à�>Š>Ü˜S $§.¡.Ô1à—:‘:˜k¨2Ó.ˆÙœ
 8¬TÔ2Ü˜S (Ô+àˆ
r   c                óâ   — | j                   j                  «       }| j                  |d<   |j                  |«       |d   } | j                  di |¤Ž}|j                  dd«      }t        |||«      S )z?Make a new terminal, return a :class:`PtyWithClients` instance.r|   r   Nr   )r~   r”   r|   Úupdater¡   r•   r   )r)   r*   Úoptionsr   r   r   s         r   Únew_terminalzTermManagerBase.new_terminalá   sp   € à×$Ñ$×)Ñ)Ó+ˆØ#'×#5Ñ#5ˆ�Ñ Ø�‰�vÔØ�Ñ'ˆØ ˆd× Ñ Ñ+ 7Ñ+ˆØ�k‰k˜% Ó&ˆÜ˜d C¨Ó-Ð-r   c                óÄ   — |j                   j                  }|| j                  |<   t        j                  «       }|j                  || j                  |j                  «       y)zBConnect a terminal to the tornado event loop to read data from it.N)r%   ro   rƒ   r   rL   Úadd_handlerÚpty_readÚREAD)r)   Úptywclientsro   Úloops       r   Ústart_readingzTermManagerBase.start_readingë   sG   € à× Ñ ×#Ñ#ˆØ)ˆ�‰˜ÑÜ�~‰~ÓˆØ×Ñ˜˜TŸ]™]¨D¯I©IÕ6r   c                óü   — |j                   j                  }| j                  j                  d|«       | j                  |= t        j                  «       j                  |«       |j                   j                  «        y)zCalled when the pty has closed.zEOF on FD %d; stopping readingN)	r%   ro   r‚   Úinforƒ   r   rL   Úremove_handlerÚclose)r)   rª   ro   s      r   Úon_eofzTermManagerBase.on_eofò   s]   € ð × Ñ ×#Ñ#ˆØ�‰�‰Ð6¸Ô;Ø�O‰O˜BÐÜ�‰Ó×'Ñ'¨Ô+ð 	×Ñ×!Ñ!Õ#r   c                óÌ  — t        |d¬«      s| j                  j                  d|«       y| j                  |   }	 | j	                  |«       |j
                  j                  d«      }|j                  j                  |«       |j                  D ]  }|j                  |«       Œ y# t        $ r5 | j                  |«       |j                  D ]  }|j                  «        Œ Y yw xY w)z>Called by the event loop when there is pty data ready to read.çš™™™™™¹?)rp   zSpurious pty_read() on fd %sNi   )rs   r‚   Údebugrƒ   Úpre_pty_read_hookr%   Úreadr#   Úappendr"   Úon_pty_readÚEOFErrorr±   Úon_pty_died)r)   ro   Úeventsrª   Úsr2   s         r   r¨   zTermManagerBase.pty_readý   sÄ   € ô �R Õ%Ø�H‰H�N‰NÐ9¸2Ô>ØØ—o‘o bÑ)ˆð		%Ø×"Ñ" ;Ô/Ø×#Ñ#×(Ñ(¨Ó/ˆAØ×#Ñ#×*Ñ*¨1Ô-Ø%×-Ô-�Ø×"Ñ" 1Õ%ñ .øäò 	%Ø�K‰K˜Ô$Ø%×-Ô-�Ø×"Ñ"Õ$ò .ð	%ús   »A)B% Â%;C#Ã"C#c                 ó   — y)zQHook before pty read, subclass can patch something into ptywclients when pty_readNr   )r)   rª   s     r   rµ   z!TermManagerBase.pre_pty_read_hook  ó   � r   c                ó   — t         ‚)a7  Override in a subclass to give a terminal to a new websocket connection

        The :class:`TermSocket` handler works with zero or one URL components
        (capturing groups in the URL spec regex). If it receives one, it is
        passed as the ``url_component`` parameter; otherwise, this is None.
        )ÚNotImplementedError©r)   Úurl_components     r   Úget_terminalzTermManagerBase.get_terminal  s
   € ô "Ð!r   c                 ó   — y)z=Override this to e.g. kill terminals on client disconnection.Nr   ©r)   Ú	websockets     r   Úclient_disconnectedz#TermManagerBase.client_disconnected  r¾   r   c              ƒ  ó”   K  — | j                  «       ƒ d{  –—†  | j                  s| j                  j                  dd¬«       yy7 Œ/­w)zShutdown the manager.NFT)ÚwaitÚcancel_futures)Úkill_allr„   r†   ÚshutdownrF   s    r   rÌ   zTermManagerBase.shutdown  sA   è ø€ à�m‰m‹o×ÐØ×5Ò5Ø×%Ñ%×.Ñ.°EÈ$Ð.ÕOð 6ð 	ús   ‚A–A—0Ac              ƒ  óÐ   K  — g }| j                   j                  «       D ]$  } |j                  |j                  d¬«      «       Œ& |rt	        j
                  |Ž ƒ d{  –—†  yy7 Œ­w)úKill all terminals.T©rQ   N)rƒ   Úvaluesr·   rT   rC   Úgather)r)   r   Úterms      r   rË   zTermManagerBase.kill_all$  sZ   è ø€ àˆØ—O‘O×*Ñ*Ö,ˆDØˆG�N‰N˜4Ÿ>™>°˜>Ó5Õ6ð -ñ Ü—.‘. 'Ð*×*Ñ*ð Ø*ús   ‚AA&ÁA$ÁA&)Ú NNNN)r|   r˜   r}   r˜   r~   r   r   r   r‹   r   r†   r   )é   éP   r   r   )r›   rW   rœ   rW   r�   rW   rž   rW   r*   r   rG   zdict[str, str])r*   r   rG   r   ©rª   r   rG   rV   ©N)ro   rW   r»   r   rG   rV   ©rÂ   r   rG   r   )rÆ   r   rG   rV   rU   )rY   rZ   r[   r\   r+   r¡   r¥   r¬   r±   r¨   rµ   rÃ   rÇ   rÌ   rË   r   r   r   ru   ru   ž   sÔ   „ Ù,ð
 Ø!ØØØ$(ðàðð ðð ð	ð
 ðð ðð "óðD ØØØðàðð ðð ð	ð
 ðð ðð 
óó@.ó7ó	$ô%ó$`ô"óLóPô+r   ru   c                  ó:   ‡ — e Zd ZdZdˆ fd„Zddd„Zdˆ fd„Zˆ xZS )	ÚSingleTermManagerz9All connections to the websocket share a common terminal.c                ó2   •— t        ‰| �  di |¤Ž d| _        y©rw   Nr   )Úsuperr+   Úterminal)r)   r*   r‰   s     €r   r+   zSingleTermManager.__init__1  s   ø€ ä‰ÑÑ"˜6Ò"Ø/3ˆ�r   c                ó’   — | j                   €0| j                  «       | _         | j                  | j                   «       | j                   S )z "Get the singleton terminal.)rÞ   r¥   r¬   rÁ   s     r   rÃ   zSingleTermManager.get_terminal6  s8   € à�=‰=Ð Ø ×-Ñ-Ó/ˆDŒMØ×Ñ˜tŸ}™}Ô-Ø�}‰}Ðr   c              ƒ  óL   •K  — t         ‰| �  «       ƒ d{  –—†  d| _        y7 Œ­w)zKill the singletone terminal.N)rÝ   rË   rÞ   ©r)   r‰   s    €r   rË   zSingleTermManager.kill_all=  s$   øè ø€ ä‰gÑÓ × Ð Øˆ�ð 	!úó   ƒ$•"–$)r*   r   rG   rV   r×   rØ   rU   )rY   rZ   r[   r\   r+   rÃ   rË   Ú__classcell__©r‰   s   @r   rÚ   rÚ   .  s   ø„ ÙCõ4ô
÷ñ r   rÚ   c                  ó    — e Zd ZdZdd„Zdd„Zy)ÚMaxTerminalsReachedz;An error raised when we exceed the max number of terminals.c                ó   — || _         y)zInitialize the error.N©Úmax_terminals)r)   ré   s     r   r+   zMaxTerminalsReached.__init__F  s
   € à*ˆÕr   c                ó    — d| j                   z  S )z'The string representation of the error.z$Cannot create more than %d terminalsrè   rF   s    r   Ú__str__zMaxTerminalsReached.__str__J  s   € à5¸×8JÑ8JÑJÐJr   N)ré   rW   rG   rV   )rG   r˜   )rY   rZ   r[   r\   r+   rë   r   r   r   ræ   ræ   C  s   „ ÙEó+ôKr   ræ   c                  ó8   ‡ — e Zd ZdZddˆ fd„Zddd„Zdd„Zˆ xZS )	ÚUniqueTermManagerz-Give each websocket a unique terminal to use.c                ó2   •— t        ‰| �  di |¤Ž || _        yrÜ   )rÝ   r+   ré   ©r)   ré   r*   r‰   s      €r   r+   zUniqueTermManager.__init__R  s   ø€ ä‰ÑÑ"˜6Ò"Ø*ˆÕr   c                óÎ   — | j                   r7t        | j                  «      | j                   k\  rt        | j                   «      ‚| j	                  «       }| j                  |«       |S )z Get a terminal from the manager.)ré   Úlenrƒ   ræ   r¥   r¬   )r)   rÂ   rÒ   s      r   rÃ   zUniqueTermManager.get_terminalW  sS   € à×Ò¤# d§o¡oÓ"6¸$×:LÑ:LÒ"LÜ% d×&8Ñ&8Ó9Ð9à× Ñ Ó"ˆØ×Ñ˜4Ô Øˆr   c                ó`  — | j                   j                  d«       |j                  r‡t        j                  dk(  rJ|j                  j                  «        | j                  |j                  j                  j                  «       y|j                  j                  t        j                  «       yy)z-Send terminal SIGHUP when client disconnects.z-Websocket closed, sending SIGHUP to terminal.r:   N)r‚   r®   rÞ   r;   r<   r7   r¨   r%   ro   r?   r   rJ   rÅ   s     r   rÇ   z%UniqueTermManager.client_disconnected`  sy   € à�‰�‰ÐEÔFØ×ÒÜ�w‰w˜$ŠØ×"Ñ"×'Ñ'Ô)ð —‘˜i×0Ñ0×8Ñ8×;Ñ;Ô<ØØ×Ñ×%Ñ%¤f§m¡mÕ4ð r   r×   )ré   z
int | Noner*   r   rG   rV   rØ   )rÆ   r	   rG   rV   )rY   rZ   r[   r\   r+   rÃ   rÇ   rã   rä   s   @r   rí   rí   O  s   ø„ Ù7ö+ô
÷
5r   rí   c                  ó„   ‡ — e Zd ZdZddˆ fd„Zdd„ZdZdd„Zdd„Ze	j                  fdd„Zddd„Zdˆ fd	„Zdˆ fd
„Zˆ xZS )ÚNamedTermManagerzBShare terminals between websockets connected to the same endpoint.c                ó@   •— t        ‰| �  di |¤Ž || _        i | _        yrÜ   )rÝ   r+   ré   Ú	terminalsrï   s      €r   r+   zNamedTermManager.__init__p  s"   ø€ ä‰ÑÑ"˜6Ò"Ø*ˆÔØ46ˆ�r   c                ót  — |€J ‚|| j                   v r| j                   |   S | j                  r7t        | j                   «      | j                  k\  rt        | j                  «      ‚| j                  j                  d|«       | j                  «       }||_        || j                   |<   | j                  |«       |S )z!Get or create a terminal by name.z$New terminal with specified name: %s)	rö   ré   rñ   ræ   r‚   r®   r¥   r   r¬   )r)   r   rÒ   s      r   rÃ   zNamedTermManager.get_terminalv  s¤   € àÐ$Ð$Ð$à˜Ÿ™Ñ&Ø—>‘> )Ñ,Ð,à×Ò¤# d§n¡nÓ"5¸×9KÑ9KÒ"KÜ% d×&8Ñ&8Ó9Ð9ð 	�‰�‰Ð<¸iÔHØ× Ñ Ó"ˆØ"ˆŒØ$(ˆ�‰�yÑ!Ø×Ñ˜4Ô Øˆr   z%dc                ó|   — t        j                  d¬«      D ]#  }| j                  |z  }|| j                  vsŒ!|c S  y )Nrx   )Ústart)Ú	itertoolsÚcountÚname_templaterö   )r)   Únr<   s      r   Ú_next_available_namez%NamedTermManager._next_available_nameŠ  s;   € Ü—‘ q×)ˆAØ×%Ñ%¨Ñ)ˆDØ˜4Ÿ>™>Ò)Ø’ð *ð r   c                óæ   — d|v r|d   n| j                  «       } | j                  di |¤Ž}| j                  j                  d|«       ||_        || j
                  |<   | j                  |«       ||fS )z3Create a new named terminal with an automatic name.r<   z$New terminal with automatic name: %sr   )rþ   r¥   r‚   r®   r   rö   r¬   )r)   r*   r<   rÒ   s       r   Únew_named_terminalz#NamedTermManager.new_named_terminal‘  sr   € à!'¨6Ñ!1ˆv�fŠ~°t×7PÑ7PÓ7RˆØ ˆt× Ñ Ñ* 6Ñ*ˆØ�‰�‰Ð<¸dÔCØˆŒØ#ˆ�‰�tÑØ×Ñ˜4Ô Ø�TˆzÐr   c                óD   — | j                   |   }|j                  |«       y)zKill a terminal by name.N)rö   r7   )r)   r<   r8   rÒ   s       r   r7   zNamedTermManager.kill›  s   € à�~‰~˜dÑ#ˆØ�	‰	�#�r   c              ƒ  ób   K  — | j                   |   }|j                  |¬«      ƒ d{  –—†  y7 Œ­w)zTerminate a terminal by name.rÏ   N)rö   rT   )r)   r<   rQ   rÒ   s       r   rT   zNamedTermManager.terminate   s(   è ø€ à�~‰~˜dÑ#ˆØ�n‰n 5ˆnÓ)×)Ò)ús   ‚%/§-¨/c                ó´   •— t         ‰| �  |«       |j                  }| j                  j	                  d|«       |€J ‚| j
                  j                  |d«       y)z*Handle end of file for a pty with clients.zTerminal %s closedN)rÝ   r±   r   r‚   r®   rö   r`   )r)   rª   r<   r‰   s      €r   r±   zNamedTermManager.on_eof¥  sM   ø€ ä‰‰�{Ô#Ø×$Ñ$ˆØ�‰�‰Ð*¨DÔ1ØÐÐÐØ�‰×Ñ˜4 Õ&r   c              ƒ  óL   •K  — t         ‰| �  «       ƒ d{  –—†  i | _        y7 Œ­w)rÎ   N)rÝ   rË   rö   rá   s    €r   rË   zNamedTermManager.kill_all­  s$   øè ø€ ä‰gÑÓ × Ð Øˆ�ð 	!úrâ   r×   )ré   r   r*   r   rG   rV   )r   r˜   rG   r   )rG   r   )r*   r   rG   ztuple[str, PtyWithClients])r<   r˜   r8   rW   rG   rV   rX   )r<   r˜   rQ   rO   rG   rV   rÖ   rU   )rY   rZ   r[   r\   r+   rÃ   rü   rþ   r   r   rI   r7   rT   r±   rË   rã   rä   s   @r   rô   rô   m  sC   ø„ ÙLö7óð$ €Móóð *0¯©ô ô
*õ
'÷ñ r   rô   rU   )ra   r   rb   r   rG   rV   )r³   )ro   rW   rp   ÚfloatrG   zlist[tuple[int, int]]))r\   Ú
__future__r   rC   r&   rú   r€   r;   rh   r   r‡   Úcollectionsr   Ú
concurrentr   Útypingr   r   r   Úterminado.websocketr	   Ú
ptyprocessr
   r   ÚImportErrorÚwinptyr   ÚobjectÚtornado.ioloopr   r—   r–   r   re   rs   ru   rÚ   Ú	Exceptionræ   rí   rô   r   r   r   Ú<module>r     sä   ðñõ
 #ã Û Û Û Û 	Û Û Û Ý Ý ß 0Ñ 0áÝ.ðÝ,ó6õ "à€
ð %Ð ÷X4ñ X4óvô
÷M+ñ M+ô`˜ô ô*	K˜)ô 	Kô5˜ô 5ô<C�õ Cøð_
 ò ð#Þ:øØò #Ø"Òð#úà‚Jðús6   Á
B& Â&CÂ,B3Â2CÂ3B=Â:CÂ<B=Â=CÃC