
    ⾙h                        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 	 dd
lmZ ej.                  dk(  r1ej0                  Zej2                  Zej4                  Zej6                  Z	 g dZ eed      ZdZ dZ! ejD                         Z#dZ$dgZ% eed      rdZ$e%dgz  Z%ej.                  dk(  rdZ$e%dgz  Z%e!fdZ&d Z'd Z(d Z)d Z* G d d      Z+ G d d      Z,er G d de,      Z- G d de,      Z. G d  d!      Z/dEd"Z0d# Z1ej.                  dk7  rdFd$Z2ndFd%Z2 G d& d'      Z3d( Z4ej.                  dk(  r% G d) d*      Z5ejl                  ejn                  ffd+Z8d,Z9d-Z:d.Z;d/Z<d0 Z=d1 Z> G d2 d3      Z?d4 Z@d5 ZA G d6 d7e/      ZBd8 ZCej.                  dk(  r d9 ZDej                  ej                  hZGdGd:ZHn eed;      rd< ZInd= ZIdGd>ZHej.                  dk(  r3d? ZJd@ ZK e
j                  e.eJ       dA ZMdB ZN e
j                  e-eM       ydC ZJdD ZK e
j                  e.eJ       y# e$ r ej.                  dk(  r dZY w xY w)H    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                     t               | z   S Nr   )timeouts    O/var/www/Befach/backend/env/lib/python3.12/site-packages/billiard/connection.py_init_timeoutr   E   s    ;      c                     t               | kD  S r   r   )ts    r   _check_timeoutr    I   s    ;?r   c                     | dk(  ry| dk(  r)t        j                  dt        j                               S | dk(  r;t        j                  dt	        j
                         t        t              fz  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familys    r   arbitrary_addressr0   Q   sy     	9	kt7H7H7JKK	9	&< "		T--@A'BGIK 	K .//r   c                     t         j                  dk7  r| dk(  rt        d| z        t         j                  dk(  r%| dk(  rt        t        |       st        d| z        yyy)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.   s    r   _validate_familyr6   `   sc     ||w6Y#67&@AA
||w6Y#6vv&;fDEE ' $7r   c                     t        |       t        k(  ryt        |       t        u r| j                  d      ryt        |       t        u ryt	        d| z        )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-   )addresss    r   address_typer=   m   sO     G}	g#	'"4"4V"<	g#	:WDEEr   c                       e Zd Zd Zy)_SocketContainerc                     || _         y r   sock)selfrB   s     r   __init__z_SocketContainer.__init__   s	    	r   N)__name__
__module____qualname__rD    r   r   r?   r?      s    r   r?   c                       e Zd ZdZddZd Zd Zd Zd Zd Z	e
d        Ze
d	        Ze
d
        Zd Zd ZddZd ZddZddZd ZddZd Zd Zd Zd Zy)_ConnectionBaseNc                    t        |t              r+|j                  | _        |j                  j	                         }|j                         }|dk  rt        d      |s|st        d      || _        || _        || _	        y )Nr   zinvalid handlez6at least one of `readable` and `writable` must be True)

isinstancer?   rB   _socketfileno	__index__r-   _handle	_readable	_writable)rC   handlereadablewritables       r   rD   z_ConnectionBase.__init__   sw    f./!;;DL[['')F!!#A:-..HJ J!!r   c                 >    | j                   | j                          y y r   rP   _closerC   s    r   __del__z_ConnectionBase.__del__   s    <<#KKM $r   c                 2    | j                   t        d      y )Nzhandle is closed)rP   OSErrorrY   s    r   _check_closedz_ConnectionBase._check_closed   s    <<,--  r   c                 2    | j                   st        d      y )Nzconnection is write-only)rQ   r\   rY   s    r   _check_readablez_ConnectionBase._check_readable   s    ~~455 r   c                 2    | j                   st        d      y )Nzconnection is read-only)rR   r\   rY   s    r   _check_writablez_ConnectionBase._check_writable   s    ~~344 r   c                 t    | j                   rd| _        t        d      | j                          t        d      )NFzbad message length)rR   rQ   closer\   rY   s    r   _bad_message_lengthz#_ConnectionBase._bad_message_length   s5    >>"DN *++ JJL*++r   c                     | j                   du S )z True if the connection is closedNrP   rY   s    r   closedz_ConnectionBase.closed   s     ||t##r   c                     | j                   S )z"True if the connection is readable)rQ   rY   s    r   rT   z_ConnectionBase.readable        ~~r   c                     | j                   S )z"True if the connection is writable)rR   rY   s    r   rU   z_ConnectionBase.writable   ri   r   c                 :    | j                          | j                  S )z+File descriptor or handle of the connection)r]   rP   rY   s    r   rN   z_ConnectionBase.fileno   s    ||r   c                 f    | j                   	 | j                          d| _         yy# d| _         w xY w)zClose the connectionNrW   rY   s    r   rc   z_ConnectionBase.close   s1    <<#$#	 $  $s   ' 	0c                 z   | j                          | j                          t        |      }|j                  dkD  rt        t	        |            }t        |      }|dk  rt        d      ||k  rt        d      |||z
  }n#|dk  rt        d      ||z   |kD  rt        d      | j                  ||||z           y)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)r]   ra   
memoryviewitemsizebyteslenr-   _send_bytes)rC   bufoffsetsizemns         r   
send_bytesz_ConnectionBase.send_bytes   s    sO::>58$AFA:122v:566<v:DAX/00d]Q<==6&4-01r   c                     | j                          | j                          | j                  t        j                  |             y)zSend a (picklable) objectN)r]   ra   rr   r   dumpsrC   objs     r   sendz_ConnectionBase.send   s3    --c23r   c                     | j                          | j                          ||dk  rt        d      | j                  |      }|| j	                          |j                         S )z7
        Receive bytes data as a bytes object.
        r   znegative maxlength)r]   r_   r-   _recv_bytesrd   getvalue)rC   	maxlengthrs   s      r   
recv_bytesz_ConnectionBase.recv_bytes   sa     	 Y]122y);$$&||~r   c                    | j                          | j                          t        |      5 }|j                  }|t	        |      z  }|dk  rt        d      ||kD  rt        d      | j                         }|j                         }|||z   k  rt        |j                               |j                  d       |j                  |||z  ||z   |z          |cddd       S # 1 sw Y   yxY w)zq
        Receive bytes data into a writeable bytes-like object.
        Return the number of bytes read.
        r   znegative offsetzoffset too largeN)r]   r_   rn   ro   rq   r-   r   tellr   r   seekreadinto)rC   rs   rt   rv   ro   bytesizeresultru   s           r   recv_bytes_intoz_ConnectionBase.recv_bytes_into   s    
 	_ 	zzH#a&(Hz !233(" !344%%'F;;=D&4-'$V__%677KKNOOA("FTMh#>  #	 	 	s   B+C!!C*c                     | j                          | j                          | j                         }t        j                  |      S )zReceive a (picklable) object)r]   r_   r   r   loadbuf)rC   rs   s     r   recvz_ConnectionBase.recv  s9     %%c**r   c                 d    | j                          | j                          | j                  |      S )z/Whether there is any input available to be read)r]   r_   _pollrC   r   s     r   pollz_ConnectionBase.poll  s)    zz'""r   c                     | S r   rH   rY   s    r   	__enter__z_ConnectionBase.__enter__      r   c                 $    | j                          y r   rc   rC   exc_type	exc_valueexc_tbs       r   __exit__z_ConnectionBase.__exit__      

r   c                 8    t        | j                         ||      S r   )r
   rN   )rC   rs   rt   s      r   r
   z_ConnectionBase.send_offset"  s    4;;=#v66r   c                 8    t        | j                         |       y r   )r	   rN   )rC   blockings     r   r	   z_ConnectionBase.setblocking%  s    DKKM8,r   )TT)r   Nr   )r   )g        )rE   rF   rG   rP   rD   rZ   r]   r_   ra   rd   propertyrg   rT   rU   rN   rc   rx   r}   r   r   r   r   r   r   r
   r	   rH   r   r   rJ   rJ      s    G" .65, $ $    
$2*44+#7-r   rJ   c                   L    e Zd ZdZdZej                  fdZd Zd	dZ	d Z
d Zy)
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                 (     || j                          y r   rf   )rC   _CloseHandles     r   rX   zPipeConnection._close3  s    &r   c                    t        j                  | j                  |d      \  }}	 |t         j                  k(  r1t        j                  |j
                  gdt              }|t        k(  sJ |j                  d      \  }}|dk(  sJ |t        |      k(  sJ y #  |j                           xY w# |j                  d      \  }}w xY w)NT
overlappedFr   )r   	WriteFilerP   ERROR_IO_PENDINGWaitForMultipleObjectseventINFINITEWAIT_OBJECT_0cancelGetOverlappedResultrq   )rC   rs   overrwaitresnwrittens         r   rr   zPipeConnection._send_bytes6  s    ''cdKGB
='222%<<
E85G #m333
 !# 6 6t <#!8O8s3x'''		 " 6 6t <#s   AB B**B- -CNc                    | j                   rd| _         t        j                         S |dnt        |d      }	 t	        j
                  | j                  |d      \  }}	 |t        j                  k(  r1t	        j                  |j                  gdt              }|t        k(  sJ |j                  d      \  }}|dk(  r5t        j                         }|j                  |j                                |S |t        j                   k(  r| j#                  ||      S 	 t-        d      #  |j                           xY w# |j                  d      \  }}|dk(  r9t        j                         }|j                  |j                                |c cY S |t        j                   k(  r| j#                  ||      c cY S w xY w# t$        $ r)}|j&                  t        j(                  k(  rt*         d }~ww xY w)NF   Tr   r   z.shouldn't get here; expected KeyboardInterrupt)_got_empty_messageioBytesIOminr   ReadFilerP   r   r   r   r   r   r   r   write	getbufferERROR_MORE_DATA_get_more_datar\   winerrorERROR_BROKEN_PIPEEOFErrorRuntimeError)	rC   maxsizebsizer   r   r   nreadfes	            r   r   zPipeConnection._recv_bytesF  s   &&*/'zz|#&C4E%..eGBD'":"::&-&D&D!#
E8'=G#*m#;;#;
 &(%;%;D%A
s!8 "

AGGBLLN3#$H G$;$;;#'#6#6r7#CC < @B B!		%'%;%;D%A
s!8 "

AGGBLLN3#$H G$;$;;#'#6#6r7#CC < zzW%>%>>&	s\   %F8 AD" #AF8 1$F8 "D55D8 8AF5	F8 'F52F8 4F55F8 8	G*$G%%G*c                     | j                   s%t        j                  | j                        d   dk7  ryt	        t        | g|            S )Nr   T)r   r   PeekNamedPiperP   boolr   r   s     r   r   zPipeConnection._pollh  s>    ''))$,,7:a?dVW-..r   c                    |j                         }t        j                         }|j                  |       t	        j
                  | j                        d   }|dkD  sJ |!t        |      |z   |kD  r| j                          t	        j                  | j                  |d      \  }}|j                  d      \  }}|dk(  sJ ||k(  sJ |j                  |j                                |S )Nr   r   Tr   )r   r   r   r   r   r   rP   rq   rd   r   r   )rC   r   r   rs   r   leftr   rbytess           r   r   zPipeConnection._get_more_datan  s    ,,.C

AGGCL((6q9D!8O8"s3x$'@((*&&t||TdKGB006KFC!8O8T>!>GGBLLN#Hr   r   )rE   rF   rG   __doc__r   r   CloseHandlerX   rr   r   r   r   rH   r   r   r   r   +  s3    	
 #&-&9&9 	'	(  	BD	/	r   r   c                       e Zd ZdZer(ej                  fdZej                  Z	ej                  Zn'ej                  fdZej                  Z	ej                  Ze	fdZefdZefdZd
dZd	 Zy)
Connectionzo
    Connection class based on an arbitrary file descriptor (Unix only), or
    a socket handle (Windows).
    c                 (     || j                          y r   rf   rC   rX   s     r   rX   zConnection._close      4<< r   c                 (     || j                          y r   rf   r   s     r   rX   zConnection._close  r   r   c                     t        |      }	 	  || j                  |      }||z  }|dk(  ry ||d  }%# t        t        t        j
                  f$ r)}t        |dd       t        j                  k7  r Y d }~Cd }~ww xY w)Nr   errno)	rq   rP   r\   IOErrorr5   errorgetattrr   EINTR)rC   rs   r   	remainingrw   excs         r   _sendzConnection._send  s    H		$,,,
 Q	>!"g  Wfll3 3.%++= >s   2 A9A44A9c                    t        j                         }| j                  }|}|dkD  rL	  |||      }t        |      }|dk(  r||k(  rt        t        d      |j                  |       ||z  }|dkD  rL|S # t
        t        t        j                  f$ r)}t        |dd       t        j                  k7  r Y d }~Jd }~ww xY w)Nr   zgot end of file during messager   )r   r   rP   rq   r   r\   r   r   r5   r   r   r   r   )	rC   ru   readrs   rS   r   chunkrw   r   s	            r   _recvzConnection._recv  s    jjl	!mVY/
 J6 D(&%&FGG		% Q	 !m 
 Wfll3 3.%++= >s   	A6 6B=B88B=c                     t        |      }t        j                  d|      }|dkD  r#| j                  |       | j                  |       y t	        ||      r|j                         }| j                  ||z          y )N!ii @  )rq   structpackr   rL   tobytes)rC   rs   rn   rw   headers        r   rr   zConnection._send_bytes  sb    HT1%u9 JJvJJsO #z*kkmJJv|$r   Nc                     | j                  d      }t        j                  d|j                               \  }|||kD  ry | j                  |      S )N   r   )r   r   unpackr   )rC   r   rs   ru   s       r   r   zConnection._recv_bytes  sE    jjmdCLLN34'>zz$r   c                 2    t        | g|      }t        |      S r   )r   r   )rC   r   rs      r   r   zConnection._poll  s    $!Awr   r   )rE   rF   rG   r   r   r   closesocketrX   r}   _writer   _readr)   rc   r   r   r   r   rn   rr   r   r   rH   r   r   r   r   ~  sp    
  ) 5 5 	! " 	!%   % * +5 %$ r   r   c                   T    e Zd ZdZd
dZd Zd Z ed       Z ed       Z	d Z
d	 Zy)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.
    Nc                    |xs |xr t        |      xs t        }|xs t        |      }t        |       |dk(  rt	        ||      | _        nt        |||      | _        |t        |t              st        d      || _
        y )Nr   authkey should be a byte string)r=   default_familyr0   r6   PipeListener	_listenerSocketListenerrL   rp   	TypeError_authkey)rC   r<   r/   backlogauthkeys        r   rD   zListener.__init__  s     H4|G4H9G 	6.v6 Y)'7;DN+GVWEDNz'5'A=>>r   c                     | j                   t        d      | j                   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.
        zlistener is closed)r   r\   acceptr   deliver_challengeanswer_challenge)rC   cs     r   r   zListener.accept  sT     >>!.//NN!!#==a/Q.r   c                 P    | j                   }|d| _         |j                          yy)zA
        Close the bound socket or named pipe of `self`.
        N)r   rc   )rC   listeners     r   rc   zListener.close  s)     >>!DNNN  r   c                 .    | j                   j                  S r   )r   _addressrY   s    r   <lambda>zListener.<lambda>  s    DNN$;$;r   c                 .    | j                   j                  S r   )r   _last_acceptedrY   s    r   r  zListener.<lambda>  s    $..*G*Gr   c                     | S r   rH   rY   s    r   r   zListener.__enter__  r   r   c                 $    | j                          y r   r   r   s       r   r   zListener.__exit__  r   r   )NNr   N)rE   rF   rG   r   rD   r   rc   r   r<   last_acceptedr   r   rH   r   r   r   r     s8       ;<GGHMr   r   c                     |xs t        |       }t        |       |dk(  rt        |       }nt        |       }|t	        |t
              st        d      |t        ||       t        ||       |S )z=
    Returns a connection to the address of a `Listener`
    r   r   )	r=   r6   
PipeClientSocketClientrL   rp   r   r   r   )r<   r/   r   r   s       r   r   r     sq     ,|G,FVw!:gu#=9::G$!W%Hr   c                 P    t        | d      r| j                         S t        |       S )Ndetach)r4   r  r?   rA   s    r   r  r  !  s%    tX{{} D!!r   c                 v   | rgt        j                         \  }}|j                  |        |j                  |        t        t	        |            }t        t	        |            }||fS t        j                         \  }}|rt        |d       |rt        |d       t        |d      }t        |d      }||fS )L
        Returns pair of connection objects at either end of a pipe
        r   FrU   rT   )r5   
socketpairr	   r   r  r)   pipe)	duplex	rnonblock	wnonblocks1s2c1c2fd1fd2s	            r   r   r   +  s     &&(FBNNy=)NNy=)F2J'BF2J'B 2v wwyHCC#C#C%0BC%0B2vr   c           
         |rJ d       |rJ d       t        d      }| r>t        j                  }t        j                  t        j                  z  }t
        t
        }}n(t        j                  }t        j                  }dt
        }}t        j                  ||t        j                  z  t        j                  z  t        j                  t        j                  z  t        j                  z  d||t        j                  t        j                        }t        j                  ||dt        j                  t        j                   t        j                  t        j                        }	t        j"                  |	t        j                  dd       t        j$                  |d      }
|
j'                  d      \  }}|dk(  sJ t)        || 	      }t)        |	| 
      }||fS )r  z"rnonblock not supported on windowsz"wnonblock not supported on windowsr   r   r   NTr   r  r  )r0   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  r<   openmodeaccessobsizeibsizeh1h2r   _r   r  r  s                  r   r   r   B  s    BBB}BBB}#I.11H))G,A,AAF$gFF22H**FFF$$X < <<112%%(E(EEvvw;;LL
 VQg.C.C((',,
 	''--tT	
 --bTB
//53axxB0B02vr   c                   $    e Zd ZdZddZd Zd Zy)r   zO
    Representation of a socket which is bound to an address and listening
    c                    t        j                   t        t         |            | _        	 t        j                  dk(  r9| j                  j                  t         j                  t         j                  d       | j                  j                  d       | j                  j                  |       | j                  j                  |       | j                  j                         | _        || _        d | _        |dk(  r.t#        j$                  | t        j&                  |fd      | _        y d | _        y # t        $ r | j                  j                           w xY w)Nposixr   Tr   r   argsexitpriority)r5   r   rM   r)   name
setsockopt
SOL_SOCKETSO_REUSEADDRr	   bindlistengetsocknamer  r\   rc   _familyr  r   Finalizeunlink_unlink)rC   r<   r/   r   s       r   rD   zSocketListener.__init__u  s    }}WVV%<=	ww'!''(9(9(.(;(;Q@LL$$T*LLg&LL( LL446DM "Y==biiwjqDL  DL  	LL 	s   B<D/ /%Ec                 ,   	 	 | j                   j                         \  }| _        	 |j                  d       t        t        |            S # t        t        t
        j                  f$ r)}t        |dd       t        j                  k7  r Y d }~nd }~ww xY w)NTr   )rM   r   r  r\   r   r5   r   r   r   r   r	   r   r  )rC   sr   s      r   r   zSocketListener.accept  s    )-)<)<)>&4&
 	d&)$$ Wfll3 3.%++= > s   "A B)BBc                     	 | j                   j                          | j                  }|d | _         |        y y # | j                  }|d | _         |        w w xY wr   )rM   rc   rG  )rC   rF  s     r   rc   zSocketListener.close  s[    	LL \\F!# " \\F!# "s	   : AN)r   )rE   rF   rG   r   rD   r   rc   rH   r   r   r   r   q  s     0
%r   r   c                     t        |       }t        j                  t        t        |            }|j                  d       |j	                  |        t        t        |            S )zO
    Return a connection object connected to the socket given by `address`
    T)r=   r5   r   r	   connectr   r  )r<   r/   rI  s      r   r  r    sJ     '"Fgff-.AMM$IIgfQi  r   c                   6    e Zd ZdZddZddZd Zed        Zy)	r   z0
        Representation of a named pipe
        Nc                    || _         | j                  d      g| _        d | _        t	        j
                  d| j                          t	        j                  | t        j                  | j                  | j                   fd      | _	        y )NT)firstz listener created with address=%rr   r:  )
r  _new_handle_handle_queuer  r   	sub_debugrE  r   _finalize_pipe_listenerrc   )rC   r<   r   s      r   rD   zPipeListener.__init__  sl    #DM"&"2"2"2">!?D"&DNN=t}}Ml::(($--8qDJr   c           
      ~   t         j                  t         j                  z  }|r|t         j                  z  }t        j                  | j
                  |t         j                  t         j                  z  t         j                  z  t         j                  t        t        t         j                  t         j                        S r   )r   r  r%  r&  r$  r  r'  r(  r)  PIPE_UNLIMITED_INSTANCESr"  r*  r+  )rC   rO  flagss      r   rP  zPipeListener._new_handle  s    ..1M1MME>>>**u))G,I,II!!"00'7,,gll r   c                 h   | j                   j                  | j                                | j                   j                  d      }	 t	        j
                  |d      }	 t	        j                  |j                  gdt               	 |j                  d      \  }}|dk(  sJ t        |      S #  |j                          t	        j                  |        xY w# |j                  d      \  }}|dk(  sJ w xY w# t        $ r2}|j                  t        j                  k7  r Y d }~t        |      S d }~ww xY w)Nr   Tr   F)rQ  appendrP  popr   r/  r   r   r   r   r   r   r\   r   ERROR_NO_DATAr   )rC   rS   r   r6  r   r   s         r   r   zPipeListener.accept  s   %%d&6&6&89''++A.F$--fF	$22
E85  33D9FAs!8O8!&))IIK''/33D9FAs!8O8  ::!6!66 7 "&))!s0   C6 &B+ +(CC C36	D1?D,,D1c                 h    t        j                  d|       | D ]  }t        j                  |        y )Nz closing listener with address=%r)r   rR  r   r   )queuer<   rS   s      r   rS  z$PipeListener._finalize_pipe_listener  s)    NN=wG##F+  r   r   )F)	rE   rF   rG   r   rD   rP  r   staticmethodrS  rH   r   r   r   r     s*    			
		*. 
	, 
	,r   r   c           	         t               }	 	 t        j                  | d       t        j                  | t        j                  t        j
                  z  dt        j                  t        j                  t        j                  t        j                        }	 t        j                  |t        j                  dd       t        |      S # t        $ r$}|j                  |vst        |      r Y d}~nd}~ww xY w)zU
        Return a connection object connected to the pipe given by `address`
          r   N)r   r   WaitNamedPiper,  r   r!  r+  r-  r%  r\   r   r    r.  r(  r   )r<   _ignorer   hr   s        r   r  r    s    
 O%%gt4&&W11G4I4IIw||W%:%:00',,  	''w,,dD	
 a    ::W,q0A 1B s   BC 	C4C//C4   s   #CHALLENGE#s	   #WELCOME#s	   #FAILURE#c                 j   dd l }t        |t              sJ t        j                  t
              }| j                  t        |z          |j                  ||d      j                         }| j                  d      }||k(  r| j                  t               y | j                  t               t        d      )Nr   md5   zdigest received was wrong)hmacrL   rp   r)   urandomMESSAGE_LENGTHrx   	CHALLENGEnewdigestr   WELCOMEFAILUREr   
connectionr   rg  messagerl  responses         r   r   r     s    gu%%%jj(G)g-.XXgw.557F$$S)H6g&g&!"=>>r   c                 j   dd l }t        |t              sJ | j                  d      }|d t	        t
               t
        k(  s
J d|z         |t	        t
              d  }|j                  ||d      j                         }| j                  |       | j                  d      }|t        k7  rt        d      y )Nr   rf  zmessage = %rre  zdigest sent was rejected)rg  rL   rp   r   rq   rj  rk  rl  rx   rm  r   ro  s         r   r   r     s    gu%%%##C(G?C	N#y0J.72JJ0c)no&GXXgw.557F&!$$S)H7!"<== r   c                       e Zd Zd Zd Zd Zy)ConnectionWrapperc                 n    || _         || _        || _        dD ]  }t        ||      }t	        | ||        y )N)rN   rc   r   r   rx   )_conn_dumps_loadsr   setattr)rC   connrz   loadsattrr|   s         r   rD   zConnectionWrapper.__init__2  s:    
KD$%CD$$ Lr   c                 \    | j                  |      }| j                  j                  |       y r   )rx  rw  rx   )rC   r|   rI  s      r   r}   zConnectionWrapper.send:  s"    KK

a r   c                 X    | j                   j                         }| j                  |      S r   )rw  r   ry  )rC   rI  s     r   r   zConnectionWrapper.recv>  s"    JJ!!#{{1~r   N)rE   rF   rG   rD   r}   r   rH   r   r   ru  ru  0  s    %!r   ru  c                 X    t         j                  | fd d d d      }|j                  d      S )Nr   utf-8)	xmlrpclibrz   encode)r|   os     r   
_xml_dumpsr  C  s)    tT15A88Gr   c                 X    t         j                  | j                  d            \  \  }}|S )Nr  )r  r|  decode)rI  r|   methods      r   
_xml_loadsr  H  s$    __QXXg%67NFSFJr   c                       e Zd Zd Zy)XmlListenerc                 b    dd l ma t        j	                  |       }t        |t        t              S Nr   )xmlrpc.clientclientr  r   r   ru  r  r  r{   s     r   r   zXmlListener.acceptO  s"    )ood# j*==r   N)rE   rF   rG   r   rH   r   r   r  r  M  s    >r   r  c                  J    dd l ma t        t	        | i |t
        t              S r  )r  r  r  ru  r   r  r  )r;  kwdss     r   	XmlClientr  V  s    %VT2T2J
KKr   c                    t        |       }g }|rt        j                  |d|      }|t        k(  r	 |S t        |cxk  rt        t        |      z   k  rn n
|t        z  }nAt        |cxk  rt        t        |      z   k  rn t        d      |t        z  }nt        d      |j                  ||          ||dz   d  }d}|r|S )NFzShould not get herer   r   )	listr   r   WAIT_TIMEOUTr   rq   WAIT_ABANDONED_0r   rX  )handlesr   Lreadyress        r   _exhaustive_waitr  a  s     M00E7CCl"  #>A(>>}$!SD+;c!f+DD ##899 ''"#899LL3 #'(AG  r   c                 ~   |t         }n|dk  rd}nt        |dz  dz         }t        |       } i g }t               }t               }	 | D ]v  }	 t	        |d      }	 t        j                   |       dd      \  }}|t
        j                  k(  r!|j                         ||j                  <   d|j                  |       d}x t!        j#                         |      }|D ]  }|j%                           |D ]e  }	 |j'                  d      \  }
}|t
        j(                  k7  s,|j                     }|j                  |       |dk(  sRt+        |d      s_d|_        g 	 |j/                  fd|D               | D cg c]	  }||v s| c}S # t        $ r }	|	j                  }|t        vr Y d}	~	8d}	~	ww xY w# t        $ r ||j                         <   Y w xY w# t        $ r}	|	j                  }|t        vr Y d}	~	d}	~	ww xY w# |D ]  }|j%                           |D ]  }	 |j'                  d      \  }
}n+# t        $ r}	|	j                  }|t        vr Y d}	~	nd}	~	ww xY w|t
        j(                  k7  sX|j                     }|j                  |       |dk(  s~t+        |d      sd|_         w xY wc c}w )	
        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      ?rN   Tr   c              3   (   K   | ]	  }|     y wr   rH   ).0rb  waithandle_to_objs     r   	<genexpr>zwait.<locals>.<genexpr>  s     Ia.q1Is   )r   intr  setr   r   r   r\   r   _ready_errorsr   rX  r   addAttributeErrorrO   r  keysr   r   ERROR_OPERATION_ABORTEDr4   r   update)object_listr   ov_listready_objectsready_handlesr  rN   r   r   r   r6  pr  s               @r   r   r   w  s    ?Gq[G'D.3./G;'-	8 $$Q1F
"")"2"268Q"EC
 g666r*67)"((3
 &))!,"#+ !. -->-C-C-EwOM 		  33D9FAs
 '999)"((3A!%%a(ax #1&:;37A0   	I=II&=a!}*<==M # "jjm3! 4" & 978%akkm49<  **C-/ 0 		  33D9FAs **C-/ 0 '999)"((3A!%%a(ax #1&:;37A0 " >s   H F:F:A#H :G=	J:J:	F7F2,H 2F77H :GH GH 	H&H  HJ7&H;:J7;	I#	I	J7I#	#J7:%J7 J7-
J7r   c                    |t        |dz        }i }t        j                         }| D ]G  }|j                  |t        j                         t        |d      r|||j                         <   C|||<   I g }|j                  |      D ]:  \  }}|t        j                  z  rt        d|z        |j                  ||          < |S )Nr_  rN   zinvalid file descriptor %i)
r  selectr   registerPOLLINr4   rN   POLLNVALr-   rX  )fdsr   fd_mappollsterfdlsr   s          r   r   r     s    "gn-F{{}H!!"fmm42x(*,F299;'!#F2J  B%]]73	E6??*$%AB%FGG		&*% 4 Ir   c                 8    t        j                   | g g |      d   S r  )r  )r  r   s     r   r   r     s    ==b"g6q99r   c                    ||dk  rt        | d      S t               |z   }	 	 t        | |      S # t        t        t        j
                  f$ r(}|j                  t        j                  k7  r Y d}~nd}~ww xY w|t               z
  }f)r  Nr   )r   r   r\   r   r5   r   r   r   )r  r   deadliner   s       r   r   r     s     !|[!,,$;0['22Wfll3 77ekk) * ""Y[0 s   / A5A00A5c                     | j                         }t        j                  |t        j                  t        j                        5 }ddlm} |j                  |      }t        || j                  | j                  ffcd d d        S # 1 sw Y   y xY w)Nr   )resource_sharer)rN   r5   fromfdr   SOCK_STREAMr%   r  	DupSocketrebuild_connectionrT   rU   )r{  rS   rI  r  dss        r   reduce_connectionr    sl    ]]66>>63E3EF 	J!) **1-B%DMM4=='II	J 	J 	Js   6BBc                 N    | j                         }t        t        |      ||      S r   )r  r   )r  rT   rU   rB   s       r   r  r    s     yy{&,(;;r   c                    | j                   rt        j                  nd| j                  rt        j                  ndz  }t        j                  | j                         |      }t        || j                   | j                  ffS r  )	rT   r   FILE_GENERIC_READrU   FILE_GENERIC_WRITEr   	DupHandlerN   rebuild_pipe_connection)r{  r1  dhs      r   reduce_pipe_connectionr    s^    047,,1157--AG  7&T]]DMM(JJJr   c                 .    t        t        |       ||      S r   )r   r  )r  rT   rU   s      r   r  r    s    fRj(H==r   c                     t        j                  | j                               }t        || j                  | j
                  ffS r   )r   DupFdrN   r  rT   rU   )r{  dfs     r   r  r    s0    __T[[]+!Bt}}#EEEr   c                 .    t        t        |       ||      S r   )r   r  )r  rT   rU   s      r   r  r    s    &*h99r   )NN)TFFr   )Or   r   r)   r2   r5   r  r   r&   	itertoolsr%   r   r   r   r   _extr   compatr	   r
   timer   r   r   r3   r   r  r  r   ImportError__all__r4   is_pypyr"  CONNECTION_TIMEOUTcountr,   r   familiesr   r    r0   r6   r=   r?   rJ   r   r   r   r   r  r   r   r  r   ERROR_SEM_TIMEOUTERROR_PIPE_BUSYr  ri  rj  rm  rn  r   r   ru  r  r  r  r  r  r   ERROR_NETNAME_DELETEDr  r   r   r  r  r  r  r  rH   r   r   <module>r     s    	 	 
        1  ,  %$ ||w--"33++##
0
#*
+  	!;
69NH<<7NH - !0
FF( _- _-D P PfO Ol5 5p*" <<7.(^/ /d! <<76, 6,p &-%>%>%,%<%<%> !> 	

?
>" &

>( >L <<7( ..0M0MNMC>N vv	$	:10 <<7J< Iz#45K>I~'=>F:Iz#45W  
||wGs   I I65I6