U &Ì.ep|ã@s ddddgZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl m Z ddl m Z m Z dd lmZejZz$ddlZdd lmZmZmZmZWn$ek rÊejd kr‚dZYnXd Zd ZdZe ¡ZdZdgZe edƒ�rdZedg7Zejd k�rdZedg7Zefdd„Z!dd„Z"dd„Z#dd„Z$dd„Z%Gdd„dƒZ&e�rnGdd„de&ƒZ'Gd d!„d!e&ƒZ(Gd"d„de)ƒZ*dPd#d„Z+ejd k�r°dQd%d„Z,n dRd&d„Z,Gd'd(„d(e)ƒZ-d)d*„Z.ejd k�röGd+d,„d,e)ƒZ/d-d.„Z0d/Z1d0Z2d1Z3d2Z4d3d4„Z5d5d6„Z6Gd7d8„d8e)ƒZ7d9d:„Z8d;d<„Z9Gd=d>„d>e*ƒZ:d?d@„Z;ejd k�rzdAdB„ZhZ?dSdCd„Z@n,ddlAZAe eAdDƒ�r–eAjBZCneAjDZCdTdEd„Z@ejd k�rìdFdG„ZEdHdI„ZFe Ge(eE¡dJdK„ZHdLdM„ZIe Ge'eH¡ndNdG„ZEdOdI„ZFe Ge(eE¡dS)UÚClientÚListenerÚPipeÚwaitéNé)Úutil)ÚAuthenticationErrorÚBufferTooShort)Ú reduction)Ú WAIT_OBJECT_0ÚWAIT_ABANDONED_0Ú WAIT_TIMEOUTÚINFINITEÚwin32i g4@Zsha256ÚAF_INETÚAF_UNIXÚAF_PIPEcCs t ¡|S©N©ÚtimeÚ monotonic)Útimeout©rú2/usr/lib64/python3.8/multiprocessing/connection.pyÚ _init_timeout?srcCs t ¡|kSrr)ÚtrrrÚ_check_timeoutBsrcCsX|dkr dS|dkr&tjdt ¡d�S|dkrLtjdt ¡ttƒfdd�Std ƒ‚d S) z? Return an arbitrary free address for the given family r)Z localhostrrz listener-)ÚprefixÚdirrz\\.\pipe\pyc-%d-%d-Úzunrecognized familyN) ÚtempfileZmktemprZ get_temp_dirÚosÚgetpidÚnextÚ _mmap_counterÚ ValueError©ÚfamilyrrrÚarbitrary_addressIsÿÿr(cCsJtjdkr|dkrtd|ƒ‚tjdkrF|dkrFtt|ƒsFtd|ƒ‚dS)zD Checks if the family is valid for the current environment. rrzFamily %s is not recognized.rN)ÚsysÚplatformr%ÚhasattrÚsocketr&rrrÚ_validate_familyWs   r-cCsTt|ƒtkrdSt|ƒtkr*| d¡r*dSt|ƒtks@t |¡rDdStd|ƒ‚dS)z] Return the types of the address This can be 'AF_INET', 'AF_UNIX', or 'AF_PIPE' rz\\rrzaddress type of %r unrecognizedN)ÚtypeÚtupleÚstrÚ startswithrÚis_abstract_socket_namespacer%)ÚaddressrrrÚ address_typecs r4c@s¾eZdZdZd+dd„Zdd„Zdd„Zd d „Zd d „Zd d„Z e dd„ƒZ e dd„ƒZ e dd„ƒZ dd„Zdd„Zd,dd„Zdd„Zd-dd„Zd.d d!„Zd"d#„Zd/d%d&„Zd'd(„Zd)d*„ZdS)0Ú_ConnectionBaseNTcCs>| ¡}|dkrtdƒ‚|s(|s(tdƒ‚||_||_||_dS)Nrzinvalid handlez6at least one of `readable` and `writable` must be True)Ú __index__r%Ú_handleÚ _readableÚ _writable)ÚselfÚhandleÚreadableÚwritablerrrÚ__init__ysÿz_ConnectionBase.__init__cCs|jdk r| ¡dSr©r7Ú_close©r:rrrÚ__del__†s z_ConnectionBase.__del__cCs|jdkrtdƒ‚dS)Nzhandle is closed)r7ÚOSErrorrArrrÚ _check_closedŠs z_ConnectionBase._check_closedcCs|jstdƒ‚dS)Nzconnection is write-only)r8rCrArrrÚ_check_readableŽsz_ConnectionBase._check_readablecCs|jstdƒ‚dS)Nzconnection is read-only)r9rCrArrrÚ_check_writable’sz_ConnectionBase._check_writablecCs"|jrd|_n| ¡tdƒ‚dS)NFzbad message length)r9r8ÚcloserCrArrrÚ_bad_message_length–sz#_ConnectionBase._bad_message_lengthcCs |jdkS)z True if the connection is closedN©r7rArrrÚclosed�sz_ConnectionBase.closedcCs|jS)z"True if the connection is readable)r8rArrrr<¢sz_ConnectionBase.readablecCs|jS)z"True if the connection is writable)r9rArrrr=§sz_ConnectionBase.writablecCs| ¡|jS)z+File descriptor or handle of the connection)rDr7rArrrÚfileno¬sz_ConnectionBase.filenocCs$|jdk r z | ¡W5d|_XdS)zClose the connectionNr?rArrrrG±s  z_ConnectionBase.closercCs¨| ¡| ¡t|ƒ}|jdkr.tt|ƒƒ}t|ƒ}|dkrFtdƒ‚||krVtdƒ‚|dkrh||}n&|dkrztdƒ‚n|||krŽtdƒ‚| ||||…¡dS)z,Send the bytes data from a bytes-like objectrrzoffset is negativezbuffer length < offsetNzsize is negativezbuffer length < offset + size)rDrFÚ memoryviewÚitemsizeÚbytesÚlenr%Ú _send_bytes)r:ÚbufÚoffsetÚsizeÚmÚnrrrÚ send_bytes¹s"     z_ConnectionBase.send_bytescCs$| ¡| ¡| t |¡¡dS)zSend a (picklable) objectN)rDrFrPÚ_ForkingPicklerÚdumps©r:ÚobjrrrÚsendÎsz_ConnectionBase.sendcCsJ| ¡| ¡|dk r(|dkr(tdƒ‚| |¡}|dkrB| ¡| ¡S)z7 Receive bytes data as a bytes object. Nrznegative maxlength)rDrEr%Ú _recv_bytesrHÚgetvalue)r:Z maxlengthrQrrrÚ recv_bytesÔs z_ConnectionBase.recv_bytesc Cs¸| ¡| ¡t|ƒ�–}|j}|t|ƒ}|dkr>tdƒ‚n||krNtdƒ‚| ¡}| ¡}|||krvt|  ¡ƒ‚|  d¡|  ||||||…¡|W5QR£SQRXdS)zq Receive bytes data into a writeable bytes-like object. Return the number of bytes read. rznegative offsetzoffset too largeN) rDrErLrMrOr%r\Útellr r]ÚseekÚreadinto)r:rQrRrTrMZbytesizeÚresultrSrrrÚrecv_bytes_intoás$        ÿz_ConnectionBase.recv_bytes_intocCs&| ¡| ¡| ¡}t | ¡¡S)zReceive a (picklable) object)rDrEr\rWÚloadsÚ getbuffer)r:rQrrrÚrecvúsz_ConnectionBase.recvçcCs| ¡| ¡| |¡S)z/Whether there is any input available to be read)rDrEÚ_poll©r:rrrrÚpollsz_ConnectionBase.pollcCs|SrrrArrrÚ __enter__sz_ConnectionBase.__enter__cCs | ¡dSr©rG©r:Úexc_typeÚ exc_valueZexc_tbrrrÚ__exit__ sz_ConnectionBase.__exit__)TT)rN)N)r)rg)Ú__name__Ú __module__Ú __qualname__r7r>rBrDrErFrHÚpropertyrJr<r=rKrGrVr[r^rcrfrjrkrprrrrr5vs.       r5c@sDeZdZdZdZejfdd„Zdd„Zddd „Z d d „Z d d „Z dS)Ú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. FcCs||jƒdSrrI)r:Z _CloseHandlerrrr@szPipeConnection._closec Cs�tj|j|dd�\}}zHz,|tjkrBt |jgdt¡}|tksBt ‚Wn|  ¡‚YnXW5| d¡\}}X|dks|t ‚|t |ƒksŒt ‚dS)NT©Ú overlappedFr) Ú_winapiZ WriteFiler7ÚGetOverlappedResultÚERROR_IO_PENDINGÚWaitForMultipleObjectsÚeventrr ÚAssertionErrorÚcancelrO)r:rQÚovÚerrZnwrittenÚwaitresrrrrPs ÿ  zPipeConnection._send_bytesNc Cs2|jrd|_t ¡S|dkr dnt|dƒ}zÀtj|j|dd�\}}dzHz,|tj krpt  |jgdt¡}|tkspt‚Wn| ¡‚YnXW5| d¡\}}|dkrÆt ¡}| |  ¡¡|£WS|tj krä|  ||¡£WSXWn:tk �r$}z|jtjk�rt‚n‚W5d}~XYnXtdƒ‚dS)NFé€Trvrz.shouldn't get here; expected KeyboardInterrupt)Ú_got_empty_messageÚioÚBytesIOÚminrxÚReadFiler7ryÚwritereZERROR_MORE_DATAÚ_get_more_datarzr{r|rr r}r~rCÚwinerrorÚERROR_BROKEN_PIPEÚEOFErrorÚ RuntimeError) r:ÚmaxsizeZbsizerr€ZnreadÚfr�Úerrrr\*s> ÿ  ÿ   zPipeConnection._recv_bytescCs.|jst |j¡ddkrdStt|g|ƒƒS)NrT)rƒrxÚ PeekNamedPiper7ÚboolrrirrrrhJs ÿzPipeConnection._pollcCs¤| ¡}t ¡}| |¡t |j¡d}|dks6t‚|dk rVt|ƒ||krV|  ¡tj |j|dd�\}}|  d¡\}}|dks†t‚||ks’t‚| | ¡¡|S)NrrTrv) rer„r…rˆrxr‘r7r}rOrHr‡ry)r:rrŽrQr�Úleftr€Zrbytesrrrr‰Ps    zPipeConnection._get_more_data)N) rqrrrsÚ__doc__rƒrxÚ CloseHandler@rPr\rhr‰rrrrrus ruc@s|eZdZdZer,ejfdd„ZejZ ej Z ne j fdd„Ze jZ e jZ e fdd„Ze fdd„Zd d „Zdd d „Zdd„Zd S)Ú Connectionzo Connection class based on an arbitrary file descriptor (Unix only), or a socket handle (Windows). cCs||jƒdSrrI©r:r@rrrr@gszConnection._closecCs||jƒdSrrIr—rrrr@lscCs8t|ƒ}||j|ƒ}||8}|dkr&q4||d…}qdS©Nr)rOr7)r:rQrˆÚ remainingrUrrrÚ_sendqs  zConnection._sendcCsbt ¡}|j}|}|dkr^|||ƒ}t|ƒ}|dkrJ||krBt‚ntdƒ‚| |¡||8}q|S)Nrzgot end of file during message)r„r…r7rOrŒrCrˆ)r:rSÚreadrQr;r™ÚchunkrUrrrÚ_recvzs   zConnection._recvcCs„t|ƒ}|dkrHt dd¡}t d|¡}| |¡| |¡| |¡n8t d|¡}|dkrr| |¡| |¡n| ||¡dS)Niÿÿÿú!iéÿÿÿÿú!Qi@)rOÚstructZpackrš)r:rQrUZ pre_headerÚheaderrrrrPŠs        zConnection._send_bytesNcCs^| d¡}t d| ¡¡\}|dkr@| d¡}t d| ¡¡\}|dk rT||krTdS| |¡S)NéržrŸér )r�r¡Zunpackr])r:rŽrQrSrrrr\¡s  zConnection._recv_bytescCst|g|ƒ}t|ƒSr)rr’)r:rÚrrrrrh«s zConnection._poll)N)rqrrrsr”rxÚ_multiprocessingZ closesocketr@r[Z_writerfZ_readr!rGrˆr›ršr�rPr\rhrrrrr–`s  r–c@sReZdZdZddd„Zdd„Zdd „Zed d „ƒZed d „ƒZ dd„Z dd„Z dS)rz• Returns a listener object. This is a wrapper for a bound socket which is 'listening' for connections, or for a Windows named pipe. NrcCsp|p|rt|ƒpt}|pt|ƒ}t|ƒ|dkr>t||ƒ|_nt|||ƒ|_|dk rft|tƒsft dƒ‚||_ dS)Nrúauthkey should be a byte string) r4Údefault_familyr(r-Ú PipeListenerÚ _listenerÚSocketListenerÚ isinstancerNÚ TypeErrorÚ_authkey)r:r3r'ÚbacklogÚauthkeyrrrr>»sÿ zListener.__init__cCs>|jdkrtdƒ‚|j ¡}|jr:t||jƒt||jƒ|S)zz Accept a connection on the bound socket or named pipe of `self`. Returns a `Connection` object. Nzlistener is closed)rªrCÚacceptr®Údeliver_challengeÚanswer_challenge)r:Úcrrrr±Ës    zListener.acceptcCs |j}|dk rd|_| ¡dS)zA Close the bound socket or named pipe of `self`. N)rªrG)r:ZlistenerrrrrGÙszListener.closecCs|jjSr)rªÚ_addressrArrrr3âszListener.addresscCs|jjSr)rªÚ_last_acceptedrArrrÚ last_acceptedæszListener.last_acceptedcCs|SrrrArrrrkêszListener.__enter__cCs | ¡dSrrlrmrrrrpíszListener.__exit__)NNrN) rqrrrsr”r>r±rGrtr3r·rkrprrrrr´s    cCsh|p t|ƒ}t|ƒ|dkr&t|ƒ}nt|ƒ}|dk rHt|tƒsHtdƒ‚|dk rdt||ƒt||ƒ|S)z= Returns a connection to the address of a `Listener` rNr§) r4r-Ú PipeClientÚ SocketClientr¬rNr­r³r²)r3r'r°r´rrrrñs    TcCsj|r>t ¡\}}| d¡| d¡t| ¡ƒ}t| ¡ƒ}n$t ¡\}}t|dd�}t|dd�}||fS)úL Returns pair of connection objects at either end of a pipe TF©r=©r<)r,Z socketpairÚ setblockingr–Údetachr!Úpipe)ÚduplexÚs1Ús2Úc1Úc2Zfd1Zfd2rrrrs       c Csîtdƒ}|r*tj}tjtjB}tt}}ntj}tj}dt}}t ||tjBtj Btj tj Btj Bd||tj tj¡}t ||dtjtjtjtj¡}t |tj dd¡tj|dd�}| d¡\} } | dksÎt‚t||d�} t||d�} | | fS) rºrrrNTrvr»r¼)r(rxÚPIPE_ACCESS_DUPLEXÚ GENERIC_READÚ GENERIC_WRITEÚBUFSIZEZPIPE_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ÚConnectNamedPiperyr}ru) rÀr3ZopenmodeÚaccessZobsizeZibsizeZh1Zh2rwÚ_r€rÃrÄrrrrsV   ÿ ÿù þÿ   c@s*eZdZdZd dd„Zdd„Zdd„Zd S) r«zO Representation of a socket which is bound to an address and listening rcCsÈt tt|ƒ¡|_zRtjdkr2|j tjtjd¡|j d¡|j  |¡|j  |¡|j  ¡|_ Wn t k r„|j ¡‚YnX||_d|_|dkr¾t |¡s¾tj|tj|fdd�|_nd|_dS)NÚposixrTrr©ÚargsZ exitpriority)r,ÚgetattrÚ_socketr!ÚnameZ setsockoptZ SOL_SOCKETZ SO_REUSEADDRr½ZbindZlistenZ getsocknamerµrCrGZ_familyr¶rr2ÚFinalizeÚunlinkÚ_unlink)r:r3r'r¯rrrr>Ks0  ÿ    ÿ zSocketListener.__init__cCs&|j ¡\}|_| d¡t| ¡ƒS)NT)rÛr±r¶r½r–r¾©r:Úsrrrr±ds zSocketListener.acceptcCs0z|j ¡W5|j}|dk r*d|_|ƒXdSr)rßrÛrG)r:rÞrrrrGis zSocketListener.closeN)r)rqrrrsr”r>r±rGrrrrr«Gs r«c CsPt|ƒ}t tt|ƒ¡�.}| d¡| |¡t| ¡ƒW5QR£SQRXdS)zO Return a connection object connected to the socket given by `address` TN)r4r,rÚr½Zconnectr–r¾)r3r'rárrrr¹ss   r¹c@s8eZdZdZd dd„Zd dd„Zdd „Zed d „ƒZdS)r©z0 Representation of a named pipe NcCsL||_|jdd�g|_d|_t d|j¡tj|tj|j|jfdd�|_ dS)NT)Úfirstz listener created with address=%rrrØ) rµÚ _new_handleÚ _handle_queuer¶rÚ sub_debugrÝr©Ú_finalize_pipe_listenerrG)r:r3r¯rrrr>‡s þzPipeListener.__init__Fc CsHtjtjB}|r|tjO}t |j|tjtjBtjBtj t t tj tj ¡Sr) rxrÅrÊrËrÉrµrÌrÍrÎZPIPE_UNLIMITED_INSTANCESrÈrÏrÐ)r:râÚflagsrrrrã’s   ÿûzPipeListener._new_handlec CsÂ|j | ¡¡|j d¡}ztj|dd�}Wn0tk r^}z|jtjkrN‚W5d}~XYn\Xzrãr±Ú staticmethodrærrrrr©ƒs  r©c Csœtƒ}z6t |d¡t |tjtjBdtjtjtjtj¡}Wq‚t k rz}z |j tj tj fksht |ƒrj‚W5d}~XYqXq‚q‚t |tjdd¡t|ƒS)zU Return a connection object connected to the pipe given by `address` éèrN)rrxZ WaitNamedPiperÑrÆrÇrÐrÒrÊrCrŠZERROR_SEM_TIMEOUTZERROR_PIPE_BUSYrrÓrÍru)r3rÚhr�rrrr¸»s8  ýÿÿÿr¸és #CHALLENGE#s #WELCOME#s #FAILURE#cCs‚ddl}t|tƒs$td t|ƒ¡ƒ‚t t¡}|  t |¡|  ||t ¡  ¡}| d¡}||krl|  t¡n|  t¡tdƒ‚dS)Nrú Authkey must be bytes, not {0!s}ézdigest received was wrong)Úhmacr¬rNr%Úformatr.r!ÚurandomÚMESSAGE_LENGTHrVÚ CHALLENGEÚnewÚHMAC_DIGEST_NAMEÚdigestr^ÚWELCOMEÚFAILUREr©Z connectionr°rñÚmessagerøZresponserrrr²às  ÿ    r²cCs˜ddl}t|tƒs$td t|ƒ¡ƒ‚| d¡}|dttƒ…tksNt d|ƒ‚|ttƒd…}|  ||t ¡  ¡}|  |¡| d¡}|tkr”tdƒ‚dS)Nrrïrðz message = %rzdigest sent was rejected)rñr¬rNr%ròr.r^rOrõr}rör÷rørVrùrrûrrrr³ïs  ÿ    r³c@s$eZdZdd„Zdd„Zdd„ZdS)ÚConnectionWrappercCs6||_||_||_dD]}t||ƒ}t|||ƒqdS)N)rKrGrjr^rV)Ú_connÚ_dumpsÚ_loadsrÚÚsetattr)r:ÚconnrXrdÚattrrZrrrr>s  zConnectionWrapper.__init__cCs| |¡}|j |¡dSr)rÿrþrV)r:rZrárrrr[ s zConnectionWrapper.sendcCs|j ¡}| |¡Sr)rþr^rràrrrrf s zConnectionWrapper.recvN)rqrrrsr>r[rfrrrrrýsrýcCst |fdddd¡ d¡S)Nrúutf-8)Ú xmlrpclibrXÚencode)rZrrrÚ _xml_dumpssrcCst | d¡¡\\}}|S)Nr)rrdÚdecode)rárZÚmethodrrrÚ _xml_loadssr c@seZdZdd„ZdS)Ú XmlListenercCs"ddlmat |¡}t|ttƒSr˜)Ú xmlrpc.clientÚclientrrr±rýrr rYrrrr±s  zXmlListener.acceptN)rqrrrsr±rrrrr sr cOsddlmatt||ŽttƒSr˜)r r rrýrrr )rÙÚkwdsrrrÚ XmlClients rcCs®t|ƒ}g}|rªt |d|¡}|tkr*qªn\t|krFtt|ƒkrTnn |t8}n2t|krptt|ƒkr~nn |t8}ntdƒ‚| ||¡||dd…}d}q |S)NFzShould not get hererr) Úlistrxr{r r rOr r�rè)ZhandlesrÚLÚreadyrêrrrÚ_exhaustive_wait)s    rc s^|dkrt}n|dkrd}nt|ddƒ}t|ƒ}i‰g}tƒ‰tƒ}�z@|D�]&}zt|dƒ} Wn tk r„|ˆ| ¡<YqPXzt  | ƒdd¡\}}Wn8tk rÖ}zd|j}}|tkrÆ‚W5d}~XYnX|t jkrø| |¡|ˆ|j <qP|�rjt ¡dd…d k�rjz| d ¡\}}Wn*tk �rP}z |j}W5d}~XYnX|�sjt |dƒ�rjd|_ˆ  |¡d}qPtˆ ¡|ƒ}W5|D]}| ¡�q�|D]Œ}z| d¡\}}Wn6tk �rð}z|j}|tk�rà‚W5d}~XYnX|t j k�r¤ˆ|j }ˆ  |¡|dk�r¤t |dƒ�r¤d|_�q¤Xˆ ‡fd d „|Dƒ¡‡fd 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. Nrrìgà?TrƒrKé)érFc3s|]}ˆ|VqdSrr)Ú.0rí)Úwaithandle_to_objrrÚ Šszwait..csg|]}|ˆkr|‘qSrr)rÚo)Ú ready_objectsrrÚ ‹súwait..)rÚintrÚsetr~ryrCrŠÚ _ready_errorsrxZERROR_OPERATION_ABORTEDr|Úaddr+rƒrÚÚAttributeErrorr6r‡rzrèr)ZgetwindowsversionrÚkeysÚupdate) Ú object_listrZov_listZ ready_handlesrrÖr€r�rrKr)rrrr?sh              Ú PollSelectorc Cs˜tƒ�ˆ}|D]}| |tj¡q |dk r4t ¡|}| |¡}|r\dd„|DƒW5QR£S|dk r4|t ¡}|dkr4|W5QR£Sq4W5QRXdS)rNcSsg|]\}}|j‘qSr)Zfileobj)rÚkeyZeventsrrrr©srr)Ú _WaitSelectorÚregisterÚ selectorsZ EVENT_READrrZselect)r%rZselectorrZZdeadlinerrrrr™s   c CsZ| ¡}t |tjtj¡�6}ddlm}| |¡}t||j |j ffW5QR£SQRXdS)Nr)Úresource_sharer) rKr,ZfromfdrZ SOCK_STREAMrr+Z DupSocketÚrebuild_connectionr<r=)rr;rár+ÚdsrrrÚreduce_connectionµs   r.cCs| ¡}t| ¡||ƒSr©r¾r–)r-r<r=Zsockrrrr,»sr,cCsB|jr tjnd|jrtjndB}t | ¡|¡}t||j|jffSr˜) r<rxZFILE_GENERIC_READr=ZFILE_GENERIC_WRITEr Z DupHandlerKÚrebuild_pipe_connection)rrÕÚdhrrrÚreduce_pipe_connectionÀs ÿr2cCs| ¡}t|||ƒSr)r¾ru)r1r<r=r;rrrr0Åsr0cCs t | ¡¡}t||j|jffSr)r ZDupFdrKr,r<r=)rÚdfrrrr.ËscCs| ¡}t|||ƒSrr/)r3r<r=Úfdrrrr,Îs)NN)T)T)N)N)JÚ__all__r„r!r)r,r¡rr Ú itertoolsr¦rrrr Úcontextr ZForkingPicklerrWrxr r r rÚ ImportErrorr*rÈZCONNECTION_TIMEOUTr÷Úcountr$r¨Zfamiliesr+rrr(r-r4r5rur–Úobjectrrrr«r¹r©r¸rôrõrùrúr²r³rýrr r rrr‹ZERROR_NETNAME_DELETEDr rr*r&r(ZSelectSelectorr.r,r)r2r0rrrrÚ s¤           PT=    ,, 8   P