o
    €¨Êh‡  ã                   @   sX  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Zddl	m
Z
 ddl	mZ ddl	mZmZ ddlmZ ddlmZmZ d dlmZ dd	l
mZ zdd
lmZ W n eyk   ejdkrg‚ dZY nw ejdkr}ejZejZejZejZg d¢ZeedƒZdZ dZ!e "¡ Z#dZ$dgZ%eedƒrŸdZ$e%dg7 Z%ejdkr«dZ$e%dg7 Z%e!fdd„Z&dd„ Z'dd„ Z(dd„ Z)dd„ Z*G dd„ dƒZ+G dd „ d ƒZ,erÙG d!d"„ d"e,ƒZ-G d#d$„ d$e,ƒZ.G d%d&„ d&ƒZ/d]d'd(„Z0d)d*„ Z1ejdkrüd^d-d.„Z2nd^d/d.„Z2G d0d1„ d1ƒZ3d2d3„ Z4ejdk�r#G d4d5„ d5ƒZ5ej6ej7ffd6d7„Z8d8Z9d9Z:d:Z;d;Z<d<d=„ Z=d>d?„ Z>G d@dA„ dAƒZ?dBdC„ Z@dDdE„ ZAG dFdG„ dGe/ƒZBdHdI„ ZCejdk�rddJdK„ ZDejEejFhZGd_dLdM„ZHneedNƒ�rodOdP„ ZIndQdP„ ZId_dRdM„ZHejdk�rœdSdT„ ZJdUdV„ ZKe
 Le.eJ¡ dWdX„ ZMdYdZ„ ZNe
 Le-eM¡ dS d[dT„ ZJd\dV„ ZKe
 Le.eJ¡ dS )`é    Né   )Ú	reduction)Úutil)ÚAuthenticationErrorÚBufferTooShort)Ú	_billiard)ÚsetblockingÚsend_offset©Ú	monotonic)ÚForkingPickler)Ú_winapiÚwin32)ÚClientÚListenerÚPipeÚwaitÚpypy_version_infoi    g      4@ÚAF_INETÚAF_UNIXÚAF_PIPEc                 C   s
   t ƒ |  S ©Nr
   )Útimeout© r   úE/var/www/html/env/lib/python3.10/site-packages/billiard/connection.pyÚ_init_timeoutE   ó   
r   c                 C   s
   t ƒ | kS r   r
   )Útr   r   r   Ú_check_timeoutI   r   r   c                 C   sT   | dkrdS | dkrt jdt ¡ d�S | dkr&t jdt ¡ ttƒf dd�S td	ƒ‚)
z?
    Return an arbitrary free address for the given family
    r   )Ú	localhostr   r   z	listener-)ÚprefixÚdirr   z\\.\pipe\pyc-%d-%d-Ú zunrecognized family)	ÚtempfileÚmktempr   Úget_temp_dirÚosÚgetpidÚnextÚ_mmap_counterÚ
ValueError©Úfamilyr   r   r   Úarbitrary_addressQ   s   ÿÿr-   c                 C   sR   t jdkr| dkrtd|  ƒ‚t jdkr#| dkr%tt| ƒs'td|  ƒ‚dS dS dS )zD
    Checks if the family is valid for the current environment.
    r   r   zFamily %s is not recognized.r   N)ÚsysÚplatformr*   ÚhasattrÚsocketr+   r   r   r   Ú_validate_family`   s   
ýr2   c                 C   sF   t | ƒtkrdS t | ƒtu r|  d¡rdS t | ƒtu rdS td|  ƒ‚)z]
    Return the types of the address

    This can be 'AF_INET', 'AF_UNIX', or 'AF_PIPE'
    r   z\\r   r   zaddress type of %r unrecognized)ÚtypeÚtupleÚstrÚ
startswithr*   )Úaddressr   r   r   Úaddress_typem   s   r8   c                   @   ó   e Zd Zdd„ ZdS )Ú_SocketContainerc                 C   s
   || _ d S r   ©Úsock)Úselfr<   r   r   r   Ú__init__ƒ   r   z_SocketContainer.__init__N)Ú__name__Ú
__module__Ú__qualname__r>   r   r   r   r   r:   �   ó    r:   c                   @   sÎ   e Zd ZdZd/dd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	e
dd„ ƒZe
dd„ ƒZe
dd„ ƒZdd„ Zdd„ Zd0dd„Zdd„ Zd1dd„Zd2d d!„Zd"d#„ Zd3d%d&„Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ ZdS )4Ú_ConnectionBaseNTc                 C   sZ   t |tƒr|j| _|j ¡ }| ¡ }|dk rtdƒ‚|s"|s"tdƒ‚|| _|| _|| _	d S )Nr   zinvalid handlez6at least one of `readable` and `writable` must be True)
Ú
isinstancer:   r<   Ú_socketÚfilenoÚ	__index__r*   Ú_handleÚ	_readableÚ	_writable)r=   ÚhandleÚreadableÚwritabler   r   r   r>   Š   s   

ÿ
z_ConnectionBase.__init__c                 C   s   | j d ur|  ¡  d S d S r   ©rH   Ú_close©r=   r   r   r   Ú__del__š   s   
ÿz_ConnectionBase.__del__c                 C   s   | j d u r	tdƒ‚d S )Nzhandle is closed)rH   ÚOSErrorrP   r   r   r   Ú_check_closedž   s   
ÿz_ConnectionBase._check_closedc                 C   ó   | j stdƒ‚d S )Nzconnection is write-only)rI   rR   rP   r   r   r   Ú_check_readable¢   ó   ÿz_ConnectionBase._check_readablec                 C   rT   )Nzconnection is read-only)rJ   rR   rP   r   r   r   Ú_check_writable¦   rV   z_ConnectionBase._check_writablec                 C   s$   | j r
d| _tdƒ‚|  ¡  tdƒ‚)NFzbad message length)rJ   rI   ÚcloserR   rP   r   r   r   Ú_bad_message_lengthª   s
   ÿz#_ConnectionBase._bad_message_lengthc                 C   s
   | j du S )z True if the connection is closedN©rH   rP   r   r   r   Úclosed±   s   
z_ConnectionBase.closedc                 C   ó   | j S )z"True if the connection is readable)rI   rP   r   r   r   rL   ¶   ó   z_ConnectionBase.readablec                 C   r\   )z"True if the connection is writable)rJ   rP   r   r   r   rM   »   r]   z_ConnectionBase.writablec                 C   s   |   ¡  | jS )z+File descriptor or handle of the connection)rS   rH   rP   r   r   r   rF   À   s   z_ConnectionBase.filenoc                 C   s,   | j durz
|  ¡  W d| _ dS d| _ w dS )zClose the connectionNrN   rP   r   r   r   rX   Å   s
   

üz_ConnectionBase.closer   c                 C   s¦   |   ¡  |  ¡  t|ƒ}|jdkrtt|ƒƒ}t|ƒ}|dk r#tdƒ‚||k r+tdƒ‚|du r4|| }n|dk r<tdƒ‚|| |krFtdƒ‚|  |||| … ¡ dS )z,Send the bytes data from a bytes-like objectr   r   zoffset is negativezbuffer length < offsetNzsize is negativezbuffer length < offset + size)rS   rW   Ú
memoryviewÚitemsizeÚbytesÚlenr*   Ú_send_bytes)r=   ÚbufÚoffsetÚsizeÚmÚnr   r   r   Ú
send_bytesÍ   s"   

z_ConnectionBase.send_bytesc                 C   s$   |   ¡  |  ¡  |  t |¡¡ dS )zSend a (picklable) objectN)rS   rW   rb   r   Údumps©r=   Úobjr   r   r   Úsendâ   s   z_ConnectionBase.sendc                 C   sJ   |   ¡  |  ¡  |dur|dk rtdƒ‚|  |¡}|du r!|  ¡  | ¡ S )z7
        Receive bytes data as a bytes object.
        Nr   znegative maxlength)rS   rU   r*   Ú_recv_bytesrY   Úgetvalue)r=   Ú	maxlengthrc   r   r   r   Ú
recv_bytesè   s   
z_ConnectionBase.recv_bytesc                 C   sÂ   |   ¡  |  ¡  t|ƒ�K}|j}|t|ƒ }|dk rtdƒ‚||kr&tdƒ‚|  ¡ }| ¡ }||| k r:t| 	¡ ƒ‚| 
d¡ | ||| || | … ¡ |W  d  ƒ S 1 sZw   Y  dS )zq
        Receive bytes data into a writeable bytes-like object.
        Return the number of bytes read.
        r   znegative offsetzoffset too largeN)rS   rU   r^   r_   ra   r*   rm   Útellr   rn   ÚseekÚreadinto)r=   rc   rd   rf   r_   ÚbytesizeÚresultre   r   r   r   Úrecv_bytes_intoõ   s&   

ÿ$ïz_ConnectionBase.recv_bytes_intoc                 C   s"   |   ¡  |  ¡  |  ¡ }t |¡S )zReceive a (picklable) object)rS   rU   rm   r   Úloadbuf)r=   rc   r   r   r   Úrecv  s   
z_ConnectionBase.recvç        c                 C   s   |   ¡  |  ¡  |  |¡S )z/Whether there is any input available to be read)rS   rU   Ú_poll©r=   r   r   r   r   Úpoll  s   
z_ConnectionBase.pollc                 C   ó   | S r   r   rP   r   r   r   Ú	__enter__  ó   z_ConnectionBase.__enter__c                 C   ó   |   ¡  d S r   ©rX   ©r=   Úexc_typeÚ	exc_valueÚexc_tbr   r   r   Ú__exit__  ó   z_ConnectionBase.__exit__c                 C   s   t |  ¡ ||ƒS r   )r	   rF   )r=   rc   rd   r   r   r   r	   "  ó   z_ConnectionBase.send_offsetc                 C   s   t |  ¡ |ƒ d S r   )r   rF   )r=   Úblockingr   r   r   r   %  s   z_ConnectionBase.setblocking)TT)r   Nr   )r   )ry   )r?   r@   rA   rH   r>   rQ   rS   rU   rW   rY   Úpropertyr[   rL   rM   rF   rX   rh   rl   rp   rv   rx   r|   r~   r†   r	   r   r   r   r   r   rC   ‡   s4    







rC   c                   @   sD   e Zd ZdZdZejfdd„Zdd„ Zddd	„Z	d
d„ Z
dd„ ZdS )ÚPipeConnectionzª
        Connection class based on a Windows named pipe.
        Overlapped I/O is used, so the handles must have been created
        with FILE_FLAG_OVERLAPPED.
        Fc                 C   ó   || j ƒ d S r   rZ   )r=   Ú_CloseHandler   r   r   rO   3  ó   zPipeConnection._closec              	   C   s˜   t j| j|dd�\}}z(z|t jkr!t  |jgdt¡}|tks!J ‚W n   | ¡  ‚ W | 	d¡\}}n| 	d¡\}}w |dksBJ ‚|t
|ƒksJJ ‚d S )NT©Ú
overlappedFr   )r   Ú	WriteFilerH   ÚERROR_IO_PENDINGÚWaitForMultipleObjectsÚeventÚINFINITEÚWAIT_OBJECT_0ÚcancelÚGetOverlappedResultra   )r=   rc   ÚovÚerrÚwaitresÚnwrittenr   r   r   rb   6  s   

þ€€ zPipeConnection._send_bytesNc           	   
   C   sh  | j r
d| _ t ¡ S |d u rdnt|dƒ}z‰tj| j|dd�\}}zFz|tjkr7t |j	gdt
¡}|tks7J ‚W n   | ¡  ‚ W | d¡\}}|dkr[t ¡ }| | ¡ ¡ |W S |tjkrg|  ||¡W S n2| d¡\}}|dkr‡t ¡ }| | ¡ ¡ |     Y W S |tjkr™|  ||¡     Y W S w W tdƒ‚ ty³ } z	|jtjkr®t‚‚ d }~ww )NFé€   Tr�   r   z.shouldn't get here; expected KeyboardInterrupt)Ú_got_empty_messageÚioÚBytesIOÚminr   ÚReadFilerH   r’   r“   r”   r•   r–   r—   r˜   ÚwriteÚ	getbufferÚERROR_MORE_DATAÚ_get_more_datarR   ÚwinerrorÚERROR_BROKEN_PIPEÚEOFErrorÚRuntimeError)	r=   ÚmaxsizeÚbsizer™   rš   r›   ÚnreadÚfÚer   r   r   rm   F  sX   
ÿ

ÿ€€
ÿû
ÿÿû€üzPipeConnection._recv_bytesc                 C   s.   | j st | j¡d dkrdS tt| g|ƒƒS )Nr   T)rž   r   ÚPeekNamedPiperH   Úboolr   r{   r   r   r   rz   h  s   zPipeConnection._pollc                 C   s¤   |  ¡ }t ¡ }| |¡ t | j¡d }|dksJ ‚|d ur+t|ƒ| |kr+|  ¡  tj	| j|dd�\}}| 
d¡\}}|dksCJ ‚||ksIJ ‚| |  ¡ ¡ |S )Nr   r   Tr�   )r¤   rŸ   r    r£   r   r°   rH   ra   rY   r¢   r˜   )r=   r™   r«   rc   r®   Úleftrš   Úrbytesr   r   r   r¦   n  s   
zPipeConnection._get_more_datar   )r?   r@   rA   Ú__doc__rž   r   ÚCloseHandlerO   rb   rm   rz   r¦   r   r   r   r   r‹   +  s    
"r‹   c                   @   s€   e Zd ZdZerejfdd„ZejZ	ej
Znejfdd„ZejZ	ejZe	fdd„Zefdd„Zefd	d
„Zddd„Zdd„ ZdS )Ú
Connectionzo
    Connection class based on an arbitrary file descriptor (Unix only), or
    a socket handle (Windows).
    c                 C   rŒ   r   rZ   ©r=   rO   r   r   r   rO   …  rŽ   zConnection._closec                 C   rŒ   r   rZ   r·   r   r   r   rO   Š  rŽ   c              
   C   s~   t |ƒ}	 z|| j|ƒ}W n  tttjfy- } zt|dd ƒtjkr#‚ W Y d }~nd }~ww ||8 }|dkr8d S ||d … }q)NTÚerrnor   )	ra   rH   rR   ÚIOErrorr1   ÚerrorÚgetattrr¸   ÚEINTR)r=   rc   r£   Ú	remainingrg   Úexcr   r   r   Ú_send�  s   ÿ€ÿözConnection._sendc           	   
   C   s¬   t  ¡ }| j}|}|dkrTz|||ƒ}W n  tttjfy4 } zt|dd ƒtj	kr*‚ W Y d }~n d }~ww t
|ƒ}|dkrG||krCt‚tdƒ‚| |¡ ||8 }|dks|S )Nr   r¸   zgot end of file during message)rŸ   r    rH   rR   r¹   r1   rº   r»   r¸   r¼   ra   r©   r£   )	r=   re   Úreadrc   rK   r½   Úchunkr¾   rg   r   r   r   Ú_recv�  s*   ÿ€ÿ
òzConnection._recvc                 C   sX   t |ƒ}t d|¡}|dkr|  |¡ |  |¡ d S t||ƒr#| ¡ }|  || ¡ d S )Nú!ii @  )ra   ÚstructÚpackr¿   rD   Útobytes)r=   rc   r^   rg   Úheaderr   r   r   rb   ²  s   

zConnection._send_bytesNc                 C   s:   |   d¡}t d| ¡ ¡\}|d ur||krd S |   |¡S )Né   rÃ   )rÂ   rÄ   Úunpackrn   )r=   r«   rc   re   r   r   r   rm   Ä  s
   

zConnection._recv_bytesc                 C   s   t | g|ƒ}t|ƒS r   )r   r±   )r=   r   Úrr   r   r   rz   Ë  s   zConnection._pollr   )r?   r@   rA   r´   r   r   ÚclosesocketrO   rl   Ú_writerx   Ú_readr&   rX   r£   rÀ   r¿   rÂ   r^   rb   rm   rz   r   r   r   r   r¶   ~  s    
r¶   c                   @   sR   e Zd ZdZddd„Zdd„ Zdd	„ Zed
d„ ƒZedd„ ƒZ	dd„ Z
dd„ ZdS )r   z•
    Returns a listener object.

    This is a wrapper for a bound socket which is 'listening' for
    connections, or for a Windows named pipe.
    Nr   c                 C   sp   |p	|ot |ƒp	t}|pt|ƒ}t|ƒ |dkrt||ƒ| _nt|||ƒ| _|d ur3t|tƒs3t	dƒ‚|| _
d S )Nr   úauthkey should be a byte string)r8   Údefault_familyr-   r2   ÚPipeListenerÚ	_listenerÚSocketListenerrD   r`   Ú	TypeErrorÚ_authkey)r=   r7   r,   ÚbacklogÚauthkeyr   r   r   r>   Û  s   
ÿÿ
zListener.__init__c                 C   s>   | j du r	tdƒ‚| j  ¡ }| jrt|| jƒ t|| jƒ |S )zz
        Accept a connection on the bound socket or named pipe of `self`.

        Returns a `Connection` object.
        Nzlistener is closed)rÑ   rR   ÚacceptrÔ   Údeliver_challengeÚanswer_challenge)r=   Úcr   r   r   r×   ë  s   

zListener.acceptc                 C   s$   | j }|durd| _ | ¡  dS dS )zA
        Close the bound socket or named pipe of `self`.
        N)rÑ   rX   )r=   Úlistenerr   r   r   rX   ù  s
   þzListener.closec                 C   ó   | j jS r   )rÑ   Ú_addressrP   r   r   r   Ú<lambda>  ó    zListener.<lambda>c                 C   rÜ   r   )rÑ   Ú_last_acceptedrP   r   r   r   rÞ     rß   c                 C   r}   r   r   rP   r   r   r   r~     r   zListener.__enter__c                 C   r€   r   r�   r‚   r   r   r   r†     r‡   zListener.__exit__)NNr   N)r?   r@   rA   r´   r>   r×   rX   rŠ   r7   Úlast_acceptedr~   r†   r   r   r   r   r   Ô  s    
	r   c                 C   sh   |pt | ƒ}t|ƒ |dkrt| ƒ}nt| ƒ}|dur$t|tƒs$tdƒ‚|dur2t||ƒ t||ƒ |S )z=
    Returns a connection to the address of a `Listener`
    r   NrÎ   )	r8   r2   Ú
PipeClientÚSocketClientrD   r`   rÓ   rÙ   rØ   )r7   r,   rÖ   rÚ   r   r   r   r     s   


r   c                 C   s   t | dƒr	|  ¡ S t| ƒS )NÚdetach)r0   rä   r:   r;   r   r   r   rä   !  s   
rä   TFc           	      C   s�   | r$t  ¡ \}}| | ¡ | | ¡ tt|ƒƒ}tt|ƒƒ}||fS t ¡ \}}|r1t|dƒ |r8t|dƒ t|dd�}t|dd�}||fS )úL
        Returns pair of connection objects at either end of a pipe
        r   F©rM   ©rL   )r1   Ú
socketpairr   r¶   rä   r&   Úpipe)	ÚduplexÚ	rnonblockÚ	wnonblockÚs1Ús2Úc1Úc2Úfd1Úfd2r   r   r   r   +  s   
ø

r   c              
   C   s  |rJ dƒ‚|rJ dƒ‚t dƒ}| r!tj}tjtjB }tt}}ntj}tj}dt}}t ||tjB tj	B tj
tjB tjB d||tjtj¡}t ||dtjtjtjtj¡}	t |	tjdd¡ tj|dd�}
|
 d¡\}}|dkssJ ‚t|| d	�}t|	| d
�}||fS )rå   z"rnonblock not supported on windowsz"wnonblock not supported on windowsr   r   r   NTr�   ræ   rç   )r-   r   ÚPIPE_ACCESS_DUPLEXÚGENERIC_READÚGENERIC_WRITEÚBUFSIZEÚPIPE_ACCESS_INBOUNDÚCreateNamedPipeÚFILE_FLAG_OVERLAPPEDÚFILE_FLAG_FIRST_PIPE_INSTANCEÚPIPE_TYPE_MESSAGEÚPIPE_READMODE_MESSAGEÚ	PIPE_WAITÚNMPWAIT_WAIT_FOREVERÚNULLÚ
CreateFileÚOPEN_EXISTINGÚSetNamedPipeHandleStateÚConnectNamedPiper˜   r‹   )rê   rë   rì   r7   ÚopenmodeÚaccessÚobsizeÚibsizeÚh1Úh2r�   Ú_rš   rï   rð   r   r   r   r   B  sB   

ÿ
ÿ
ù	þ
ÿc                   @   s*   e Zd ZdZd
dd„Zdd„ Zdd„ Zd	S )rÒ   zO
    Representation of a socket which is bound to an address and listening
    r   c                 C   sº   t   tt |ƒ¡| _z)tjdkr| j t jt jd¡ | j d¡ | j 	|¡ | j 
|¡ | j ¡ | _W n ty?   | j ¡  ‚ w || _d | _|dkrXtj| tj|fdd�| _d S d | _d S )NÚposixr   Tr   r   ©ÚargsÚexitpriority)r1   r»   rE   r&   ÚnameÚ
setsockoptÚ
SOL_SOCKETÚSO_REUSEADDRr   ÚbindÚlistenÚgetsocknamerÝ   rR   rX   Ú_familyrà   r   ÚFinalizeÚunlinkÚ_unlink)r=   r7   r,   rÕ   r   r   r   r>   u  s*   

ÿ
þÿ
zSocketListener.__init__c              
   C   sr   	 z
| j  ¡ \}| _W n  tttjfy+ } zt|dd ƒtj	kr!‚ W Y d }~nd }~ww nq| 
d¡ tt|ƒƒS )NTr¸   )rE   r×   rà   rR   r¹   r1   rº   r»   r¸   r¼   r   r¶   rä   )r=   Úsr¾   r   r   r   r×   �  s   ÿ€ÿù
zSocketListener.acceptc                 C   sN   z| j  ¡  W | j}|d urd | _|ƒ  d S d S | j}|d ur&d | _|ƒ  w w r   )rE   rX   r  )r=   r  r   r   r   rX   ™  s   
þÿþzSocketListener.closeN)r   )r?   r@   rA   r´   r>   r×   rX   r   r   r   r   rÒ   q  s
    
rÒ   c                 C   s8   t | ƒ}t tt|ƒ¡}| d¡ | | ¡ tt|ƒƒS )zO
    Return a connection object connected to the socket given by `address`
    T)r8   r1   r»   r   Úconnectr¶   rä   )r7   r,   r  r   r   r   rã   £  s
   

rã   c                   @   s8   e Zd ZdZddd„Zddd„Zdd	„ Zed
d„ ƒZdS )rÐ   z0
        Representation of a named pipe
        Nc                 C   sL   || _ | jdd�g| _d | _t d| j ¡ tj| tj| j| j fdd�| _	d S )NT)Úfirstz listener created with address=%rr   r  )
rÝ   Ú_new_handleÚ_handle_queuerà   r   Ú	sub_debugr  rÐ   Ú_finalize_pipe_listenerrX   )r=   r7   rÕ   r   r   r   r>   ·  s   þzPipeListener.__init__Fc              
   C   sH   t jt jB }|r|t jO }t  | j|t jt jB t jB t j	t
t
t jt j¡S r   )r   ró   rù   rú   rø   rÝ   rû   rü   rý   ÚPIPE_UNLIMITED_INSTANCESrö   rþ   rÿ   )r=   r  Úflagsr   r   r   r  Â  s   

ÿûzPipeListener._new_handlec              
   C   sÜ   | j  |  ¡ ¡ | j  d¡}z	tj|dd�}W n ty3 } z|jtjkr&‚ W Y d }~t|ƒS d }~ww z+zt 	|j
gdt¡ W n   | ¡  t |¡ ‚ W | d¡\}}|dks\J ‚t|ƒS | d¡\}}|dksmJ ‚w )Nr   Tr�   F)r  Úappendr  Úpopr   r  rR   r§   ÚERROR_NO_DATAr“   r”   r•   r—   rµ   r˜   r‹   )r=   rK   r™   r¯   r
  rš   r   r   r   r×   Î  s2   
ÿ€ð
ÿ
ûþzPipeListener.acceptc                 C   s$   t  d|¡ | D ]}t |¡ qd S )Nz closing listener with address=%r)r   r  r   rµ   )Úqueuer7   rK   r   r   r   r   å  s   ÿz$PipeListener._finalize_pipe_listenerr   )F)	r?   r@   rA   r´   r>   r  r×   Ústaticmethodr   r   r   r   r   rÐ   ³  s    

rÐ   c              
   C   s–   t ƒ }	 zt | d¡ t | tjtjB dtjtjtjtj¡}W n t	y; } z|j
|vs0t|ƒr1‚ W Y d}~nd}~ww nqt |tjdd¡ t|ƒS )zU
        Return a connection object connected to the pipe given by `address`
        r   éè  r   N)r   r   ÚWaitNamedPiper   rô   rõ   rÿ   r  rù   rR   r§   r   r  rü   r‹   )r7   Ú_ignorer   Úhr¯   r   r   r   râ   ë  s*   
ýÿ€ÿô
ÿrâ   é   s   #CHALLENGE#s	   #WELCOME#s	   #FAILURE#c                 C   sr   dd l }t|tƒsJ ‚t t¡}|  t| ¡ | ||d¡ 	¡ }|  
d¡}||kr0|  t¡ d S |  t¡ tdƒ‚)Nr   Úmd5é   zdigest received was wrong)ÚhmacrD   r`   r&   ÚurandomÚMESSAGE_LENGTHrh   Ú	CHALLENGEÚnewÚdigestrp   ÚWELCOMEÚFAILUREr   ©Ú
connectionrÖ   r/  Úmessager4  Úresponser   r   r   rØ     s   


rØ   c                 C   sŠ   dd l }t|tƒsJ ‚|  d¡}|d ttƒ… tks J d| ƒ‚|ttƒd … }| ||d¡ ¡ }|  |¡ |  d¡}|t	krCt
dƒ‚d S )Nr   r.  zmessage = %rr-  zdigest sent was rejected)r/  rD   r`   rp   ra   r2  r3  r4  rh   r5  r   r7  r   r   r   rÙ     s   
 

ÿrÙ   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚConnectionWrapperc                 C   s6   || _ || _|| _dD ]}t||ƒ}t| ||ƒ qd S )N)rF   rX   r|   rp   rh   )Ú_connÚ_dumpsÚ_loadsr»   Úsetattr)r=   Úconnri   ÚloadsÚattrrk   r   r   r   r>   2  s   
þzConnectionWrapper.__init__c                 C   s   |   |¡}| j |¡ d S r   )r=  r<  rh   )r=   rk   r  r   r   r   rl   :  s   
zConnectionWrapper.sendc                 C   s   | j  ¡ }|  |¡S r   )r<  rp   r>  )r=   r  r   r   r   rx   >  s   

zConnectionWrapper.recvN)r?   r@   rA   r>   rl   rx   r   r   r   r   r;  0  s    r;  c                 C   s   t  | fd d d d¡}| d¡S )Nr   úutf-8)Ú	xmlrpclibri   Úencode)rk   Úor   r   r   Ú
_xml_dumpsC  s   
rG  c                 C   s   t  |  d¡¡\\}}|S )NrC  )rD  rA  Údecode)r  rk   Úmethodr   r   r   Ú
_xml_loadsH  s   rJ  c                   @   r9   )ÚXmlListenerc                 C   s"   dd l ma t | ¡}t|ttƒS ©Nr   )Úxmlrpc.clientÚclientrD  r   r×   r;  rG  rJ  rj   r   r   r   r×   O  s   
zXmlListener.acceptN)r?   r@   rA   r×   r   r   r   r   rK  M  rB   rK  c                  O   s"   dd l ma tt| i |¤ŽttƒS rL  )rM  rN  rD  r;  r   rG  rJ  )r  Úkwdsr   r   r   Ú	XmlClientV  s   rP  c                 C   s¸   t | ƒ}g }|rZt |d|¡}|tkr	 |S t|  kr$tt|ƒ k r+n n|t8 }nt|  kr9tt|ƒ k rCn tdƒ‚|t8 }ntdƒ‚| || ¡ ||d d … }d}|s|S )NFzShould not get herer   r   )	Úlistr   r“   ÚWAIT_TIMEOUTr–   ra   ÚWAIT_ABANDONED_0rª   r#  )Úhandlesr   ÚLÚreadyÚresr   r   r   Ú_exhaustive_waita  s$   
 ÷

þôrX  c           
         sx  |du rt }n|dk rd}nt|d d ƒ}t| ƒ} i ‰g }tƒ ‰ tƒ }z°| D ]W}zt|dƒ}W n ty?   |ˆ| ¡ < Y q'w zt |ƒ dd¡\}}W n t	yf } z|j
}|tvr\‚ W Y d}~nd}~ww |tjkrw| |¡ |ˆ|j< q'ˆ  |¡ d}q'tˆ ¡ |ƒ}W |D ]}| ¡  q‰|D ]A}z	| d¡\}	}W n t	y· } z|j
}|tvr­‚ W Y d}~nd}~ww |tjkrÓˆ|j }ˆ  |¡ |dkrÓt|dƒrÓd|_q’nR|D ]}| ¡  q×|D ]E}z	| d¡\}	}W n t	�y } z|j
}|tvrü‚ W Y d}~nd}~ww |tjk�r%ˆ|j }ˆ  |¡ |dk�r%t|dƒ�r%d|_qàw ˆ  ‡fdd	„|D ƒ¡ ‡ fd
d„| D ƒS )ú—
        Wait till an object in object_list is ready/readable.

        Returns list of those objects in object_list which are ready/readable.
        Nr   r(  g      à?rF   Trž   c                 3   s   � | ]}ˆ | V  qd S r   r   )Ú.0r+  )Úwaithandle_to_objr   r   Ú	<genexpr>¹  s   € zwait.<locals>.<genexpr>c                    s   g | ]}|ˆ v r|‘qS r   r   )rZ  Úp)Úready_objectsr   r   Ú
<listcomp>º  s    zwait.<locals>.<listcomp>)r•   ÚintrQ  Úsetr»   ÚAttributeErrorrG   r   r¢   rR   r§   Ú_ready_errorsr’   r#  r”   ÚaddrX  Úkeysr—   r˜   ÚERROR_OPERATION_ABORTEDr0   rž   Úupdate)
Úobject_listr   Úov_listÚready_handlesrF  rF   r™   rš   r¯   r
  r   )r^  r[  r   r   w  s”   ÿÿ€þ



ÿ€þ



€òü
ÿ€þ


€òr   r|   c                 C   s˜   |d ur
t |d ƒ}i }t ¡ }| D ]}| |tj¡ t|dƒr'||| ¡ < q|||< qg }| |¡D ]\}}|tj@ rBtd| ƒ‚| 	|| ¡ q3|S )Nr(  rF   zinvalid file descriptor %i)
r`  Úselectr|   ÚregisterÚPOLLINr0   rF   ÚPOLLNVALr*   r#  )Úfdsr   Úfd_mapÚpollsterÚfdÚlsr”   r   r   r   rz   ¿  s   


rz   c                 C   s   t   | g g |¡d S rL  )rk  )ro  r   r   r   r   rz   Ñ  s   c              
   C   s‚   |dur|dkrt | dƒS tƒ | }	 zt | |ƒW S  tttjfy6 } z|jtjkr,‚ W Y d}~nd}~ww |dur@|tƒ  }q)rY  Nr   )rz   r   rR   r¹   r1   rº   r¸   r¼   )rh  r   Údeadliner¯   r   r   r   r   Ô  s    

ÿ€ÿ
ùc                 C   sf   |   ¡ }t |tjtj¡�}ddlm} | |¡}t|| j	| j
ffW  d   ƒ S 1 s,w   Y  d S )Nr   )Úresource_sharer)rF   r1   Úfromfdr   ÚSOCK_STREAMr"   ru  Ú	DupSocketÚrebuild_connectionrL   rM   )r@  rK   r  ru  Údsr   r   r   Úreduce_connectioní  s   
$ýr{  c                 C   s   |   ¡ }tt |ƒ||ƒS r   )rä   r¶   )rz  rL   rM   r<   r   r   r   ry  ô  s   ry  c                 C   sB   | j rtjnd| jrtjndB }t |  ¡ |¡}t|| j | jffS rL  )	rL   r   ÚFILE_GENERIC_READrM   ÚFILE_GENERIC_WRITEr   Ú	DupHandlerF   Úrebuild_pipe_connection)r@  r  Údhr   r   r   Úreduce_pipe_connectionù  s
   ÿr�  c                 C   ó   t t| ƒ||ƒS r   )r‹   rä   )r€  rL   rM   r   r   r   r  ÿ  rˆ   r  c                 C   s    t  |  ¡ ¡}t|| j| jffS r   )r   ÚDupFdrF   ry  rL   rM   )r@  Údfr   r   r   r{    s   c                 C   r‚  r   )r¶   rä   )r„  rL   rM   r   r   r   ry    rˆ   )NN)TFFr   )Or¸   rŸ   r&   r.   r1   rk  rÄ   r#   Ú	itertoolsr"   r   r   r   r   Ú_extr   Úcompatr   r	   Útimer   r   r   ÚImportErrorr/   r–   rS  rR  r•   Ú__all__r0   Úis_pypyrö   ÚCONNECTION_TIMEOUTÚcountr)   rÏ   Úfamiliesr   r   r-   r2   r8   r:   rC   r‹   r¶   r   r   rä   r   rÒ   rã   rÐ   ÚERROR_SEM_TIMEOUTÚERROR_PIPE_BUSYrâ   r1  r2  r5  r6  rØ   rÙ   r;  rG  rJ  rK  rP  rX  r¨   ÚERROR_NETNAME_DELETEDrc  r   rz   r{  ry  rl  r�  r  r   r   r   r   Ú<module>   s¼   	
ý





 #SV
8

/28ÿ		G

