a XC?hLšã@s$dZdZddlZddlZddlZddlZddlZddlZddlZz ddl Z Wne ybdZ Yn0ddl m Z ddl m Z ddl mZddl mZdd l mZdd l mZdd l mZdd l mZdd lmZdd„ZGdd„de jƒZGdd„dejejƒZGdd„deƒZGdd„deƒZdS)zÄEvent loop using a selector and related classes. A selector is a "notify-when-ready" multiplexer. For a subclass which also includes support for signal handling, see the unix_events sub-module. )ÚBaseSelectorEventLoopéNé)Ú base_events)Ú constants)Úevents)Úfutures)Ú protocols)Ússlproto)Ú transports)Útrsock)ÚloggercCs6z| |¡}Wnty"YdS0t|j|@ƒSdS©NF)Úget_keyÚKeyErrorÚboolr)ÚselectorÚfdZeventÚkey©rú„Z!d?d@„Z"dAdB„Z#dCdD„Z$dXdEdF„Z%dGdH„Z&dIdJ„Z'dKdL„Z(dMdN„Z)dOdP„Z*dQdR„Z+‡Z,S)YrzJSelector event loop. See events.EventLoop for API specification. NcsFtƒ ¡|durt ¡}t d|jj¡||_|  ¡t   ¡|_ dS)NzUsing selector: %s) ÚsuperÚ__init__Ú selectorsZDefaultSelectorr ÚdebugÚ __class__Ú__name__Ú _selectorÚ_make_self_pipeÚweakrefZWeakValueDictionaryÚ _transports)Úselfr©rrrr1s zBaseSelectorEventLoop.__init__©ÚextraÚservercCst||||||ƒS©N)Ú_SelectorSocketTransport)r!ÚsockÚprotocolÚwaiterr$r%rrrÚ_make_socket_transport;s ÿz,BaseSelectorEventLoop._make_socket_transportF)Ú server_sideÚserver_hostnamer$r%Ússl_handshake_timeoutc Cs0tj||||||| d�} t||| ||d�| jS)N)r.r#)r Z SSLProtocolr'Z_app_transport) r!Zrawsockr)Ú sslcontextr*r,r-r$r%r.Z ssl_protocolrrrÚ_make_ssl_transport@sýÿz)BaseSelectorEventLoop._make_ssl_transportcCst||||||ƒSr&)Ú_SelectorDatagramTransport)r!r(r)Úaddressr*r$rrrÚ_make_datagram_transportMsÿz.BaseSelectorEventLoop._make_datagram_transportcsL| ¡rtdƒ‚| ¡rdS| ¡tƒ ¡|jdurH|j ¡d|_dS)Nz!Cannot close a running event loop)Z is_runningÚ RuntimeErrorÚ is_closedÚ_close_self_piperÚcloser©r!r"rrr7Rs   zBaseSelectorEventLoop.closecCsB| |j ¡¡|j ¡d|_|j ¡d|_|jd8_dS)Nr)Ú_remove_readerÚ_ssockÚfilenor7Ú_csockÚ _internal_fdsr8rrrr6]s   z&BaseSelectorEventLoop._close_self_pipecCsNt ¡\|_|_|j d¡|j d¡|jd7_| |j ¡|j¡dS)NFr) ÚsocketZ socketpairr:r<Ú setblockingr=Ú _add_readerr;Ú_read_from_selfr8rrrres   z%BaseSelectorEventLoop._make_self_pipecCsdSr&r©r!ÚdatarrrÚ_process_self_datamsz(BaseSelectorEventLoop._process_self_datacCsTz"|j d¡}|sWqP| |¡Wqty8YqYqtyLYqPYq0qdS)Ni)r:ÚrecvrDÚInterruptedErrorÚBlockingIOErrorrBrrrrAps   z%BaseSelectorEventLoop._read_from_selfcCsL|j}|durdSz| d¡Wn&tyF|jrBtjddd�Yn0dS)Nóz3Fail to write a null byte into the self-pipe socketT©Úexc_info)r<ÚsendÚOSErrorÚ_debugr r)r!ZcsockrrrÚ_write_to_self|s þz$BaseSelectorEventLoop._write_to_selfédc Cs"| | ¡|j||||||¡dSr&)r@r;Ú_accept_connection)r!Úprotocol_factoryr(r/r%Úbacklogr.rrrÚ_start_servingŽs þz$BaseSelectorEventLoop._start_servingc Cst|ƒD]ú}z0| ¡\}} |jr0t d|| |¡| d¡WnžtttfyXYdSt yÚ} zl| j t j t j t j t jfvrÄ| d| t |¡dœ¡| | ¡¡| tj|j||||||¡n‚WYd} ~ qd} ~ 00d| i} | ||| |||¡} | | ¡qdS)Nz#%r got a new connection from %r: %rFz&socket.accept() out of system resource)ÚmessageÚ exceptionr>Úpeername)ÚrangeÚacceptrMr rr?rGrFÚConnectionAbortedErrorrLÚerrnoZEMFILEZENFILEZENOBUFSZENOMEMÚcall_exception_handlerr ÚTransportSocketr9r;Z call_laterrZACCEPT_RETRY_DELAYrSÚ_accept_connection2Z create_task) r!rQr(r/r%rRr.Ú_ÚconnÚaddrÚexcr$rXrrrrP•s@  ÿ ÿýý þz(BaseSelectorEventLoop._accept_connectionc Ãsôd}d}zr|ƒ}| ¡} |r8|j|||| d|||d�}n|j||| ||d�}z| IdHWntyv| ¡‚Yn0Wntttfy’‚Yn^tyî} zF|jrÚd| dœ} |durÀ|| d<|durÐ|| d<| | ¡WYd} ~ n d} ~ 00dS)NT)r*r,r$r%r.)r*r$r%z3Error on transport creation for incoming connection)rTrUr)Ú transport) Ú create_futurer0r+Ú BaseExceptionr7Ú SystemExitÚKeyboardInterruptrMr[) r!rQr_r$r/r%r.r)rbr*raÚcontextrrrr]Ás@ýþ  ýz)BaseSelectorEventLoop._accept_connection2c CsŠ|}t|tƒsHzt| ¡ƒ}Wn(tttfyFtd|›�ƒd‚Yn0z|j|}WntyhYn0| ¡s†t d|›d|›�ƒ‚dS)NzInvalid file object: zFile descriptor z is used by transport ) Ú isinstanceÚintr;ÚAttributeErrorÚ TypeErrorÚ ValueErrorr rÚ is_closingr4)r!rr;rbrrrÚ_ensure_fd_no_transportês   ÿÿz-BaseSelectorEventLoop._ensure_fd_no_transportc Gs’| ¡t |||d¡}z|j |¡}Wn(tyP|j |tj|df¡Yn>0|j|j }\}}|j  ||tjB||f¡|durŽ|  ¡|Sr&) Ú _check_closedrÚHandlerrrÚregisterrÚ EVENT_READrCÚmodifyÚcancel© r!rÚcallbackÚargsÚhandlerÚmaskÚreaderÚwriterrrrr@üs  ÿ ÿz!BaseSelectorEventLoop._add_readercCs’| ¡r dSz|j |¡}Wnty0YdS0|j|j}\}}|tjM}|sb|j |¡n|j  ||d|f¡|durŠ|  ¡dSdSdS)NFT) r5rrrrrCrrrÚ unregisterrsrt©r!rrryrzr{rrrr9 s  z$BaseSelectorEventLoop._remove_readerc Gs’| ¡t |||d¡}z|j |¡}Wn(tyP|j |tjd|f¡Yn>0|j|j }\}}|j  ||tjB||f¡|durŽ|  ¡|Sr&) rorrprrrrqrÚ EVENT_WRITErCrsrtrurrrÚ _add_writer!s  ÿ ÿz!BaseSelectorEventLoop._add_writercCs’| ¡r dSz|j |¡}Wnty0YdS0|j|j}\}}|tjM}|sb|j |¡n|j  |||df¡|durŠ|  ¡dSdSdS)úRemove a writer callback.FNT) r5rrrrrCrr~r|rsrtr}rrrÚ_remove_writer1s  z$BaseSelectorEventLoop._remove_writercGs"| |¡|j||g|¢RŽdS)zAdd a reader callback.N)rnr@©r!rrvrwrrrÚ add_readerHs z BaseSelectorEventLoop.add_readercCs| |¡| |¡S)zRemove a reader callback.)rnr9©r!rrrrÚ remove_readerMs z#BaseSelectorEventLoop.remove_readercGs"| |¡|j||g|¢RŽdS)zAdd a writer callback..N)rnrr‚rrrÚ add_writerRs z BaseSelectorEventLoop.add_writercCs| |¡| |¡S)r€)rnr�r„rrrÚ remove_writerWs z#BaseSelectorEventLoop.remove_writerc Ãs˜t |¡|jr$| ¡dkr$tdƒ‚z | |¡WSttfyFYn0| ¡}|  ¡}|  |¡|  ||j |||¡}|  tj|j||d�¡|IdHS)zÌReceive data from the socket. The return value is a bytes object representing the data received. The maximum amount of data to be received at once is specified by nbytes. rúthe socket must be non-blocking©rxN)rÚ_check_ssl_socketrMÚ gettimeoutrlrErGrFrcr;rnr@Ú _sock_recvÚadd_done_callbackÚ functoolsÚpartialÚ_sock_read_done)r!r(ÚnÚfutrrxrrrÚ sock_recv\s   ÿzBaseSelectorEventLoop.sock_recvcCs|dus| ¡s| |¡dSr&)Ú cancelledr…©r!rr’rxrrrr�rsz%BaseSelectorEventLoop._sock_read_donec Cs„| ¡r dSz| |¡}WnZttfy2YdSttfyH‚Yn8tyt}z| |¡WYd}~nd}~00| |¡dSr&) ÚdonerErGrFrerfrdÚ set_exceptionÚ set_result)r!r’r(r‘rCrarrrrŒvs z BaseSelectorEventLoop._sock_recvc Ãs˜t |¡|jr$| ¡dkr$tdƒ‚z | |¡WSttfyFYn0| ¡}|  ¡}|  |¡|  ||j |||¡}|  tj|j||d�¡|IdHS)z¥Receive data from the socket. The received data is written into *buf* (a writable buffer). The return value is the number of bytes written. rrˆr‰N)rrŠrMr‹rlÚ recv_intorGrFrcr;rnr@Ú_sock_recv_intor�rŽr�r�)r!r(Úbufr’rrxrrrÚsock_recv_into†s   ÿz$BaseSelectorEventLoop.sock_recv_intoc Cs„| ¡r dSz| |¡}WnZttfy2YdSttfyH‚Yn8tyt}z| |¡WYd}~nd}~00| |¡dSr&) r–r™rGrFrerfrdr—r˜)r!r’r(r›Únbytesrarrrrš›s z%BaseSelectorEventLoop._sock_recv_intoc Ãs¶t |¡|jr$| ¡dkr$tdƒ‚z| |¡}WnttfyLd}Yn0|t|ƒkr^dS|  ¡}|  ¡}|  |¡|  ||j ||t|ƒ|g¡}| tj|j||d�¡|IdHS)ašSend data to the socket. The socket must be connected to a remote socket. This method continues to send data from data until either all data has been sent or an error occurs. None is returned on success. On error, an exception is raised, and there is no way to determine how much data, if any, was successfully processed by the receiving end of the connection. rrˆNr‰)rrŠrMr‹rlrKrGrFÚlenrcr;rnrÚ _sock_sendallÚ memoryviewr�rŽr�Ú_sock_write_done)r!r(rCr‘r’rrxrrrÚ sock_sendall¬s&     ÿÿz"BaseSelectorEventLoop.sock_sendallc Cs´| ¡r dS|d}z| ||d…¡}Wn\ttfyBYdSttfyX‚Yn0ty†}z| |¡WYd}~dSd}~00||7}|t|ƒkr¨|  d¡n||d<dS)Nr) r–rKrGrFrerfrdr—ržr˜)r!r’r(ZviewÚposÚstartr‘rarrrrŸËs    z#BaseSelectorEventLoop._sock_sendallcÃs”t |¡|jr$| ¡dkr$tdƒ‚|jtjksBtjrt|jtj krt|j ||j|j |j |d�IdH}|d\}}}}}|  ¡}| |||¡|IdHS)zTConnect to a remote socket at address. This method is a coroutine. rrˆ)ÚfamilyÚtypeÚprotoÚloopN)rrŠrMr‹rlr¥r>ZAF_INETZ _HAS_IPv6ZAF_INET6Z_ensure_resolvedr¦r§rcÚ _sock_connect)r!r(r2Zresolvedr^r’rrrÚ sock_connectás   ÿ ÿþ z"BaseSelectorEventLoop.sock_connectc Cs´| ¡}z| |¡WnŽttfyb| |¡| ||j|||¡}| tj |j ||d�¡YnNt t fyx‚Yn8t y¤}z| |¡WYd}~nd}~00| d¡dS)Nr‰)r;ZconnectrGrFrnrÚ_sock_connect_cbr�rŽr�r¡rerfrdr—r˜)r!r’r(r2rrxrarrrr©ös   ÿÿ z#BaseSelectorEventLoop._sock_connectcCs|dus| ¡s| |¡dSr&)r”r‡r•rrrr¡ sz&BaseSelectorEventLoop._sock_write_donec Cs | ¡r dSz,| tjtj¡}|dkr6t|d|›�ƒ‚WnXttfyNYnNtt fyd‚Yn8t y�}z|  |¡WYd}~nd}~00|  d¡dS)NrzConnect call failed ) r–Z getsockoptr>Z SOL_SOCKETZSO_ERRORrLrGrFrerfrdr—r˜)r!r’r(r2Úerrrarrrr«s z&BaseSelectorEventLoop._sock_connect_cbcÃsBt |¡|jr$| ¡dkr$tdƒ‚| ¡}| ||¡|IdHS)aWAccept a connection. The socket must be bound to an address and listening for connections. The return value is a pair (conn, address) where conn is a new socket object usable to send and receive data on the connection, and address is the address bound to the socket on the other end of the connection. rrˆN)rrŠrMr‹rlrcÚ _sock_accept)r!r(r’rrrÚ sock_accept"s   z!BaseSelectorEventLoop.sock_acceptc CsÂ| ¡}z| ¡\}}| d¡WnŒttfyl| |¡| ||j||¡}| t j |j ||d�¡YnRt t fy‚‚Yn<ty®}z| |¡WYd}~nd}~00| ||f¡dS)NFr‰)r;rXr?rGrFrnr@r­r�rŽr�r�rerfrdr—r˜)r!r’r(rr_r2rxrarrrr­1s  ÿ z"BaseSelectorEventLoop._sock_acceptc Ãsœ|j|j=| ¡}| ¡| ¡IdHzL|j|j|||dd�IdHW| ¡|rZ| ¡||j|j<S||j|j<n"| ¡|rŠ| ¡||j|j<0dS)NF)Zfallback) r Ú_sock_fdÚ is_readingÚ pause_readingÚ_make_empty_waiterZ sock_sendfileÚ_sockÚ_reset_empty_waiterÚresume_reading)r!ZtranspÚfileÚoffsetÚcountrµrrrÚ_sendfile_nativeBs* ÿ  úýz&BaseSelectorEventLoop._sendfile_nativecCs€|D]v\}}|j|j}\}}|tj@rL|durL|jrB| |¡n | |¡|tj@r|dur|jrp| |¡q| |¡qdSr&) ÚfileobjrCrrrZ _cancelledr9Z _add_callbackr~r�)r!Z event_listrryrºrzr{rrrÚ_process_eventsPs    z%BaseSelectorEventLoop._process_eventscCs| | ¡¡| ¡dSr&)r9r;r7)r!r(rrrÚ _stop_serving^sz#BaseSelectorEventLoop._stop_serving)N)N)N)NNN)N)N)-rÚ __module__Ú __qualname__Ú__doc__rr+rZSSL_HANDSHAKE_TIMEOUTr0r3r7r6rrDrArNrSrPr]rnr@r9rr�rƒr…r†r‡r“r�rŒrœršr¢rŸrªr©r¡r«r®r­r¹r»r¼Ú __classcell__rrr"rr+sj ÿ ÿü ÿ   þ ý .ý )  rcs’eZdZdZeZdZd‡fdd„ Zdd„Zdd„Z d d „Z d d „Z d d„Z dd„Z ejfdd„Zddd„Zdd„Zdd„Zdd„Zdd„Z‡ZS) Ú_SelectorTransportiNcsêtƒ ||¡t |¡|jd<z| ¡|jd<WntyLd|jd<Yn0d|jvrŠz| ¡|jd<Wntj yˆd|jd<Yn0||_ |  ¡|_ d|_ | |¡||_| ¡|_d|_d|_|jdurÚ|j ¡||j|j <dS)Nr>ZsocknamerVFr)rrr r\Ú_extraZ getsocknamerLZ getpeernamer>Úerrorr³r;r¯Ú_protocol_connectedÚ set_protocolÚ_serverÚ_buffer_factoryÚ_bufferÚ _conn_lostÚ_closingZ_attachr )r!r¨r(r)r$r%r"rrros,       z_SelectorTransport.__init__cCsÖ|jjg}|jdur | d¡n|jr0| d¡| d|j›�¡|jdurÆ|j ¡sÆt|jj |jt j ƒ}|rz| d¡n | d¡t|jj |jt j ƒ}|r¢d}nd}|  ¡}| d|›d |›d �¡d  d  |¡¡S) NÚclosedÚclosingzfd=z read=pollingz read=idleÚpollingZidlezwrite=z<{}>ú )rrr³ÚappendrÊr¯Ú_loopr5rrrrrr~Úget_write_buffer_sizeÚformatÚjoin)r!ÚinforÍÚstateÚbufsizerrrÚ__repr__‰s.    ÿ  þz_SelectorTransport.__repr__cCs| d¡dSr&)Ú _force_closer8rrrÚabort¥sz_SelectorTransport.abortcCs||_d|_dS©NT)Ú _protocolrÄ©r!r)rrrrŨsz_SelectorTransport.set_protocolcCs|jSr&)rÜr8rrrÚ get_protocol¬sz_SelectorTransport.get_protocolcCs|jSr&)rÊr8rrrrm¯sz_SelectorTransport.is_closingcCsT|jr dSd|_|j |j¡|jsP|jd7_|j |j¡|j |jd¡dS©NTr) rÊrÑr9r¯rÈrÉr�Ú call_soonÚ_call_connection_lostr8rrrr7²sz_SelectorTransport.closecCs,|jdur(|d|›�t|d�|j ¡dS)Nzunclosed transport )Úsource)r³ÚResourceWarningr7)r!Z_warnrrrÚ__del__¼s z_SelectorTransport.__del__úFatal error on transportcCsNt|tƒr(|j ¡r@tjd||dd�n|j ||||jdœ¡| |¡dS)Nz%r: %sTrI)rTrUrbr)) rhrLrÑÚ get_debugr rr[rÜrÙ)r!rarTrrrÚ _fatal_errorÁs  üz_SelectorTransport._fatal_errorcCsd|jr dS|jr(|j ¡|j |j¡|jsBd|_|j |j¡|jd7_|j |j |¡dSrß) rÉrÈÚclearrÑr�r¯rÊr9ràrá©r!rarrrrÙÏs z_SelectorTransport._force_closecCsŽzN|jr|j |¡W|j ¡d|_d|_d|_|j}|durŠ| ¡d|_n:|j ¡d|_d|_d|_|j}|durˆ| ¡d|_0dSr&)rÄrÜZconnection_lostr³r7rÑrÆZ_detach)r!rar%rrrráÛs& ù z(_SelectorTransport._call_connection_lostcCs t|jƒSr&)ržrÈr8rrrrÒész(_SelectorTransport.get_write_buffer_sizecGs$|jr dS|jj||g|¢RŽdSr&)rÊrÑr@r‚rrrr@ìsz_SelectorTransport._add_reader)NN)rå)rr½r¾Úmax_sizeÚ bytearrayrÇr³rrØrÚrÅrÞrmr7ÚwarningsÚwarnrärçrÙrárÒr@rÀrrr"rrÁcs    rÁcsªeZdZdZejjZd#‡fdd„ Z‡fdd„Z dd„Z d d „Z d d „Z d d„Z dd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Z‡fdd„Zdd „Zd!d"„Z‡ZS)$r'TNcs~d|_tƒ |||||¡d|_d|_d|_t |j¡|j   |j j |¡|j   |j |j|j¡|durz|j   tj|d¡dSr )Ú_read_ready_cbrrÚ_eofÚ_pausedÚ _empty_waiterrZ _set_nodelayr³rÑràrÜÚconnection_mader@r¯Ú _read_readyrÚ_set_result_unless_cancelled)r!r¨r(r)r*r$r%r"rrrøs  ÿ ÿz!_SelectorSocketTransport.__init__cs.t|tjƒr|j|_n|j|_tƒ |¡dSr&)rhrZBufferedProtocolÚ_read_ready__get_bufferrîÚ_read_ready__data_receivedrrÅrÝr"rrrÅs  z%_SelectorSocketTransport.set_protocolcCs|j o|j Sr&)rðrÊr8rrrr°sz#_SelectorSocketTransport.is_readingcCs>|js |jrdSd|_|j |j¡|j ¡r:t d|¡dS)NTz%r pauses reading)rÊrðrÑr9r¯rær rr8rrrr±s   z&_SelectorSocketTransport.pause_readingcCs@|js |jsdSd|_| |j|j¡|j ¡rÿ      z_SelectorSocketTransport.writec Cs|jr dSz|j |j¡}Wnˆttfy2YnàttfyH‚YnÊty¤}zF|j   |j ¡|j  ¡|  |d¡|jdur�|j |¡WYd}~nvd}~00|r¶|jd|…=| ¡|j�s|j   |j ¡|jdurê|j d¡|jrü| d¡n|j�r|j tj¡dS)Nrü)rÉr³rKrÈrGrFrerfrdrÑr�r¯rèrçrñr—Ú_maybe_resume_protocolr˜rÊrárïÚshutdownr>ÚSHUT_WR)r!r‘rarrrr§s2   "    z%_SelectorSocketTransport._write_readycCs.|js |jrdSd|_|js*|j tj¡dSrÛ)rÊrïrÈr³rr>rr8rrrÚ write_eofÅs  z"_SelectorSocketTransport.write_eofcCsdSrÛrr8rrrÚ can_write_eofÌsz&_SelectorSocketTransport.can_write_eofcs*tƒ |¡|jdur&|j tdƒ¡dS)NzConnection is closed by peer)rrárñr—ÚConnectionErrorrér"rrráÏs   ÿz._SelectorSocketTransport._call_connection_lostcCs6|jdurtdƒ‚|j ¡|_|js0|j d¡|jS)NzEmpty waiter is already set)rñr4rÑrcrÈr˜r8rrrr²Õs    z+_SelectorSocketTransport._make_empty_waitercCs d|_dSr&)rñr8rrrr´Ýsz,_SelectorSocketTransport._reset_empty_waiter)NNN)rr½r¾Z_start_tls_compatiblerZ _SendfileModeZ TRY_NATIVEZ_sendfile_compatiblerrÅr°r±rµrórõrörùrrrrrár²r´rÀrrr"rr'ós(ÿ %' r'csFeZdZejZd ‡fdd„ Zdd„Zdd„Zd dd „Z d d „Z ‡Z S)r1Ncs^tƒ ||||¡||_|j |jj|¡|j |j|j|j ¡|durZ|j t j |d¡dSr&) rrÚ_addressrÑràrÜròr@r¯rórrô)r!r¨r(r)r2r*r$r"rrrås ÿ ÿz#_SelectorDatagramTransport.__init__cCstdd„|jDƒƒS)Ncss|]\}}t|ƒVqdSr&)rž)Ú.0rCr^rrrÚ óózC_SelectorDatagramTransport.get_write_buffer_size..)ÚsumrÈr8rrrrÒòsz0_SelectorDatagramTransport.get_write_buffer_sizec Cs¼|jr dSz|j |j¡\}}Wnˆttfy6Yn‚tyd}z|j |¡WYd}~n\d}~0t t fyz‚Yn>t y¨}z|  |d¡WYd}~nd}~00|j  ||¡dS)Nz&Fatal read error on datagram transport)rÉr³ZrecvfromrêrGrFrLrÜÚerror_receivedrerfrdrçZdatagram_received©r!rCr`rarrrróõs "z&_SelectorDatagramTransport._read_readyc Cs„t|tttfƒs$tdt|ƒj›�ƒ‚|s,dS|jrV|d|jfvrPtd|j›�ƒ‚|j}|j rŠ|jrŠ|j t j krxt   d¡|j d7_ dS|j�sdz,|jdr¬|j |¡n|j ||¡WdSttfyæ|j |j|j¡Yn~t�y}z|j |¡WYd}~dSd}~0ttf�y0‚Yn4t�yb}z| |d¡WYd}~dSd}~00|j  t|ƒ|f¡| !¡dS)Nrúz!Invalid address: must be None or rûrrVú'Fatal write error on datagram transport)"rhrýrër rkr¦rr rlrÉrrþr rÿrÈrÂr³rKÚsendtorGrFrÑrr¯Ú _sendto_readyrLrÜrrerfrdrçrÐrrrrrrsJÿ ÿ     ÿz!_SelectorDatagramTransport.sendtoc Cs|jrâ|j ¡\}}z*|jdr.|j |¡n|j ||¡Wqttfyh|j ||f¡YqâYqt y˜}z|j   |¡WYd}~dSd}~0t t fy®‚YqtyÞ}z| |d¡WYd}~dSd}~00q| ¡|j�s|j |j¡|j�r| d¡dS)NrVr)rÈÚpopleftrÂr³rKrrGrFÚ appendleftrLrÜrrerfrdrçrrÑr�r¯rÊrárrrrr0s0  ÿz(_SelectorDatagramTransport._sendto_ready)NNN)N) rr½r¾Ú collectionsÚdequerÇrrÒrórrrÀrrr"rr1ásÿ  +r1)r¿Ú__all__rrZrŽrr>rìrZsslÚ ImportErrorÚrrrrrr r r Úlogr rZ BaseEventLooprZ_FlowControlMixinZ TransportrÁr'r1rrrrÚsD             <ÿo