
    _ix                       d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddlm
Z
mZmZmZmZ ddlmZmZmZmZ ddlmZmZ ddlmZ ddlmZ dd	lmZ dd
lmZmZ ddl m!Z!m"Z"m#Z# ddl$m%Z% 	 ddl&m'Z'm(Z( dZ)n# e*$ r dZ)Y nw xY w	 ddl+m,Z, dZ-n# e*$ r dZ-e(Z,Y nw xY wddl.m/Z/m0Z0m1Z1 erddl2m3Z3 ddl4m5Z5  ej6        d          j7        Z8 ej6        d          j7        Z9dZ:e;ge/ej<        R Z<dHdZ=ej>        dk    rdId!Z?	 dJdKd)Z@n
dLd+Z?	 dJdMd,Z@dHd-ZAdNd/ZBdOd0ZCdPd2ZDd3ejE        v ZFej>        dk    ZGdQd7ZHdRd8ZI G d9 d:          ZJ G d; d<eJ          ZK G d= d>eJ          ZL G d? d@e          ZMdSdAZNefdTdFZOefdUdGZPdS )Vz&Internal network layer helper methods.    )annotationsN)AbstractEventLoopBaseTransportBufferedProtocolFuture	Transport)TYPE_CHECKINGAnyOptionalUnion)_csotssl_support)create_task)MAX_MESSAGE_SIZE)
decompress)ProtocolError_OperationCancelled)_UNPACK_REPLY_OpMsg_OpReply)_errno_from_exception)SSLError	SSLSocketTF)_sslConn)BLOCKING_IO_LOOKUP_ERRORBLOCKING_IO_READ_ERRORBLOCKING_IO_WRITE_ERROR)AsyncConnection)
Connectionz<iiiiz<iiBg      ?sockUnion[socket.socket, _sslConn]bufbytesreturnNonec                :  K   |                                  }|                     d           t          j                    }	 t          rHt          | t          t          f          r,t          j        t          | ||          |           d {V  n0t          j        |
                    | |          |           d {V  n,# t          j        $ r}t          j        d          |d }~ww xY w|                     |           d S # |                     |           w xY w)N        timeout	timed out)
gettimeout
settimeoutasyncioget_running_loop	_HAVE_SSL
isinstancer   r   wait_for_async_socket_sendall_sslsock_sendallTimeoutErrorsocketr)   )r    r"   r)   loopexcs        8D:\Nbitz\venv\Lib\site-packages\pymongo/network_layer.pyasync_socket_sendallr9   K   s2     ooGOOC#%%D	! 	RD9h*?@@ 	R"#<T3#M#MW^___________"4#4#4T3#?#?QQQQQQQQQQ 3 3 3n[))s23 	         s+    A?C  ?D  C)C$$C))D Dwin32r6   r   c                  K   t          |          }d}d	d}|t          |          k     r.	 ||                     ||d                    z  }n# t          $ r}|                                 }|dk    rt          d          d t          |t                    rd|                                }|	                    |||           	 | d {V  |
                    |           n# |
                    |           w xY wt          |t                    rd|                                }|                    |||           	 | d {V  |                    |           n# |                    |           w xY wt          rt          |t                    r|                                }|	                    |||           	 |                    |||           | d {V  |
                    |           |                    |           n/# |
                    |           |                    |           w xY wY d }~nd }~ww xY w|t          |          k     ,d S d S )
Nr   futFuture[Any]r$   r%   c                \    |                                  rd S |                     d            d S Ndone
set_resultr<   s    r8   	_is_readyz,_async_socket_sendall_ssl.<locals>._is_readyc   /    xxzz NN4         !Underlying socket has been closedr<   r=   r$   r%   )
memoryviewlensendBLOCKING_IO_ERRORSfilenor   r0   r   create_future
add_readerremove_readerr   
add_writerremove_writer_HAVE_PYOPENSSLr   )	r    r"   r6   viewsentrD   r7   fdr<   s	            r8   r2   r2   ]   s      #	! 	! 	! 	!
 SXXoo/		$tuu+...% / / /[[]]88"#FGGTQc#9:: /,,..COOB	3777/!							**2....**2....c#:;; /,,..COOB	3777/!							**2....**2...." /z#7O'P'P /,,..COOB	3777/Is;;;!							**2...**2.... **2...**2....7/ SXXoooooosb    A IA*H<C#H<#C::AH<>EH<E33A
H<>H+H<,H44H<<Iconnr   lengthintonceOptional[bool]rJ   c                  K   t          t          |                    }d}d
d}||k     rB	 |                     ||d                    }|dk    rt          d          |r
|d |         S ||z  }n# t          $ r}|                                 }	|	dk    rt          d	          d t          |t                    rd|	                                }
|
                    |	||
           	 |
 d {V  |                    |	           n# |                    |	           w xY wt          |t                    rd|	                                }
|                    |	||
           	 |
 d {V  |                    |	           n# |                    |	           w xY wt          rt          |t                     r|	                                }
|
                    |	||
           	 |                    |	||
           |
 d {V  |                    |	           |                    |	           n/# |                    |	           |                    |	           w xY wY d }~nd }~ww xY w||k     B|S )Nr   r<   r=   r$   r%   c                \    |                                  rd S |                     d            d S r?   r@   rC   s    r8   rD   z,_async_socket_receive_ssl.<locals>._is_ready   rE   rF   connection closedrG   rH   rI   )rJ   	bytearray	recv_intoOSErrorrM   rN   r   r0   r   rO   rP   rQ   r   rR   rS   rT   r   )rX   rY   r6   r[   mv
total_readrD   readr7   rW   r<   s              r8   _async_socket_receive_sslrf      s      	&))**
	! 	! 	! 	!
 6!!#/~~bo66199!"5666 %ete9$d"

% / / /[[]]88"#FGGTQc#9:: /,,..COOB	3777/!							**2....**2....c#:;; /,,..COOB	3777/!							**2....**2...." /z#7O'P'P /,,..COOB	3777/Is;;;!							**2...**2.... **2...**2....7/ 6!!J 	sh   =A2 +A2 2I$=A*I(D0IDAI!E?)I?FA
I!H+ +I+,III$dummyc                d  K   t          |          }t          |          }d}d}||k     r	 |                     ||d                    }n,# t          $ r t	          j        |           d {V  d}Y nw xY w|dk    rt          |dz  d          }nt          |dz  d          }||z  }||k     d S d S )Nr   MbP?   Mb?)rJ   rK   rL   rM   r-   sleepmaxmin)r    r"   rg   rU   total_length
total_sentbackoffrV   s           r8   r2   r2      s       #3xx
 <''yyjkk!233%   mG,,,,,,,,, axxgk511gk511$J <''''''s   A
 
&A32A3c                  K   t          t          |                    }d}d}||k     r	 |                     ||d                    }|dk    rt          d          |r
|d |         S n,# t          $ r t          j        |           d {V  d}Y nw xY w|dk    rt          |dz  d          }nt          |dz  d          }||z  }||k     |S )Nr   ri   r_   rj   rk   )	rJ   r`   ra   rb   rM   r-   rl   rm   rn   )rX   rY   rg   r[   rc   rd   rq   re   s           r8   rf   rf      s      	&))**
 6!!	~~bo66199!"5666 %ete9$%%   mG,,,,,,,,, axxgk511gk511$J 6!!  	s   =A) )&BBc                0    |                      |           d S r?   )sendall)r    r"   s     r8   rt   rt      s    LLrF   r   c                d   K   	 | j         j        rd S t          j        t                     d {V  .r?   )cancel_context	cancelledr-   rl   _POLL_TIMEOUTrX   s    r8   _poll_cancellationrz      sE      +( 	FmM*********	+rF   c                ^  K   |                                  }|}|                     d           t          j                    }	 t          r_t          | t          t          f          rCt          j        t          | ||d          |           d {V 	 |                     |           S t          j        t          | ||          |           d {V 	 |                     |           S # t          j        $ r}t          j        d          |d }~ww xY w# |                     |           w xY w)Nr'   T)r[   r(   r*   )r+   r,   r-   r.   r/   r0   r   r   r1   rf   _async_socket_receiver4   r5   r)   )r    rY   sock_timeoutr)   r6   errs         r8   async_receive_data_socketr      sy      ??$$LGOOC#%%D& 		D9h*?@@ 		 ))$4HHH          	%%%% !)%dFD99          	%%%%  3 3 3n[))s23 	%%%%s+   AC) (*C) )D8DDD D,socket.socketc                   K   t          t          |                    }d}||k     rD|                    | ||d                     d {V }|dk    rt          d          ||z  }||k     D|S )Nr   r_   )rJ   r`   sock_recv_intorb   )rX   rY   r6   rc   
bytes_readchunk_lengths         r8   r|   r|     s       
If%%	&	&BJ
v

!00r*++GGGGGGGG1-...l"
	 v


 IrF   PyPyr   deadlineOptional[float]c                   | j         j        }d}|                                dk    rdS 	 t          |d          r|                                dk    rd}nh|rB|t          j                    z
  }|dk    rd}t          t          |t                    d          }nt          }| j
                            |d|          }| j        j        rt          d          |rdS |rt          j        d	          )
zABlock until at least one byte is read, or a timeout, or a cancel.FrG   NTpendingr   )re   r)   operation cancelledr*   )rX   r    rN   hasattrr   time	monotonicrm   rn   rx   socket_checkerselectrv   rw   r   r5   r)   )rX   r   r    	timed_outreadable	remainingr)   s          r8   wait_for_readr   $  s	   9>DI{{}}.4## 	T(:(:HH  	($t~'7'77	 >> $Ic)];;Q??'*11$T71SSH( 	=%&;<<< 	F 	..---/.rF   c                   t          |          }t          |          }d}| j                                        }	 ||k     r	 t          st
          r]t          | |           t          j                    r9|7| 	                    t          |t          j                    z
  d                     nV|8t          t          |t          j                    z
  d          t                    }nt          }| 	                    |           | j                            ||d                    }n# t           $ r2 | j        j        rt'          d          d t)          j        d          d t(          j        $ rR | j        j        rt'          d          d t          s*t
          s#| j        s||t          j                    z
  dk     r Y t.          $ rE}	| j        j        rt'          d          d t1          |	          t2          j        k    rY d }	~	΂ d }	~	ww xY w|dk    rt/          d          ||z  }||k     | 	                    |           n# | 	                    |           w xY w|S )Nr   r   r*   r_   )r`   rJ   rX   r+   _PYPY_WINDOWSr   r   get_timeoutset_conn_timeoutrm   r   r   rn   rx   ra   rM   rv   rw   r   r5   r)   is_sdamrb   r   errnoEINTR)
rX   rY   r   r"   rc   r   orig_timeoutshort_timeoutr   r7   s
             r8   receive_datar   E  s   
F

C	CBJ 9''))L.,6!!&  	9H 	9!$111(** Sx/C--c(T^=M=M2Mq.Q.QRRR+(+C4>;K;K0KQ,O,OQ^(_(_(5))-888#y222jkk?CC% < < <&0 O-.CDD$Nn[11t;>   &0 O-.CDD$N  < !, 4>#3#33a77    &0 O-.CDD$N(--<<HHHH q  1222,&JW 6!!Z 	l++++l++++IsI   I	 C#D' &I	 'BH>I	 	H
9H
I	 	H

H$I	 	I c                  v    e Zd ZddZedd            Zdd	Zdd
ZddZedd            Z	edd            Z
dS )NetworkingInterfaceBaserX   r
   c                    || _         d S r?   ry   )selfrX   s     r8   __init__z NetworkingInterfaceBase.__init__  s    			rF   r$   c                    t           r?   NotImplementedErrorr   s    r8   r+   z"NetworkingInterfaceBase.gettimeout      !!rF   r)   float | Noner%   c                    t           r?   r   r   r)   s     r8   r,   z"NetworkingInterfaceBase.settimeout      !!rF   c                    t           r?   r   r   s    r8   closezNetworkingInterfaceBase.close  r   rF   boolc                    t           r?   r   r   s    r8   
is_closingz"NetworkingInterfaceBase.is_closing  r   rF   c                    t           r?   r   r   s    r8   get_connz NetworkingInterfaceBase.get_conn  r   rF   c                    t           r?   r   r   s    r8   r    zNetworkingInterfaceBase.sock  r   rF   N)rX   r
   )r$   r
   r)   r   r$   r%   r$   r   )__name__
__module____qualname__r   propertyr+   r,   r   r   r   r     rF   r8   r   r     s            " " " X"" " " "" " " "" " " " " " " X" " " " X" " "rF   r   c                       e Zd Zd fdZedd            Zdd	Zdd
ZddZedd            Z	edd            Z
 xZS )AsyncNetworkingInterfacerX   !tuple[Transport, PyMongoProtocol]c                J    t                                          |           d S r?   superr   r   rX   	__class__s     r8   r   z!AsyncNetworkingInterface.__init__  !    rF   r$   r   c                &    | j         d         j        S N   rX   r+   r   s    r8   r+   z#AsyncNetworkingInterface.gettimeout  s    y|&&rF   r)   r%   c                F    | j         d                             |           d S r   rX   r,   r   s     r8   r,   z#AsyncNetworkingInterface.settimeout  s"    	!(((((rF   c                   K   | j         d                                          | j         d                                          d {V  d S r   )rX   r   wait_closedr   s    r8   r   zAsyncNetworkingInterface.close  sN      	!il&&(((((((((((rF   r   c                @    | j         d                                         S )Nr   rX   r   r   s    r8   r   z#AsyncNetworkingInterface.is_closing  s    y|&&(((rF   PyMongoProtocolc                    | j         d         S r   ry   r   s    r8   r   z!AsyncNetworkingInterface.get_conn  s    y|rF   r   c                B    | j         d                             d          S )Nr   r5   )rX   get_extra_infor   s    r8   r    zAsyncNetworkingInterface.sock  s    y|**8444rF   )rX   r   r$   r   r   r$   r%   r   )r$   r   )r$   r   )r   r   r   r   r   r+   r,   r   r   r   r    __classcell__r   s   @r8   r   r     s              ' ' ' X') ) ) )) ) ) )) ) ) )    X 5 5 5 X5 5 5 5 5rF   r   c                       e Zd Zd fdZddZdd	Zdd
ZddZedd            Z	edd            Z
ddZddZ xZS )NetworkingInterfacerX   r!   c                J    t                                          |           d S r?   r   r   s     r8   r   zNetworkingInterface.__init__  r   rF   r$   r   c                4    | j                                         S r?   r   r   s    r8   r+   zNetworkingInterface.gettimeout      y##%%%rF   r)   r%   c                :    | j                             |           d S r?   r   r   s     r8   r,   zNetworkingInterface.settimeout  s    	W%%%%%rF   c                8    | j                                          d S r?   )rX   r   r   s    r8   r   zNetworkingInterface.close  s    	rF   r   c                4    | j                                         S r?   r   r   s    r8   r   zNetworkingInterface.is_closing  r   rF   c                    | j         S r?   ry   r   s    r8   r   zNetworkingInterface.get_conn  
    yrF   c                    | j         S r?   ry   r   s    r8   r    zNetworkingInterface.sock  r   rF   rZ   c                4    | j                                         S r?   )rX   rN   r   s    r8   rN   zNetworkingInterface.fileno  s    y!!!rF   bufferbytes | memoryviewc                6    | j                             |          S r?   )rX   ra   )r   r   s     r8   ra   zNetworkingInterface.recv_into  s    y""6***rF   )rX   r!   r   r   r   r   )r$   r!   )r$   rZ   )r   r   r$   rZ   )r   r   r   r   r+   r,   r   r   r   r   r    rN   ra   r   r   s   @r8   r   r     s             & & & && & & &   & & & &    X    X" " " "+ + + + + + + +rF   r   c                      e Zd Zd%d&dZd'dZed(d	            Zd)dZd*dZd+dZ	d,dZ
d-dZd.dZd/dZd%d0d!Zd%d0d"Zd%d0d#Zd1d$ZdS )2r   Nr)   r   c                (   d | _         t          t          d                    | _        d| _        t          t          d                    | _        d| _        d | _        d| _        d| _	        d| _
        d| _        d| _        d| _        d | _        || _        d| _        d | _        t$          | _        d | _        t+          j                                                    | _        t3          j                    | _        t3          j                    | _        d S )N   r   	   TF)	transportrJ   r`   _header_header_index_compression_header_compression_index_message_message_index_expecting_header_expecting_compression_message_size_op_code_connection_lost_read_waiter_timeout_is_compressed_compressor_idr   _max_message_size_response_tor-   r.   rO   _closedcollectionsdeque_pending_messages_done_messagesr   s     r8   r   zPyMongoProtocol.__init__  s    $( ")B--00#-ill#;#; "#.2!%&+# %37#-1!1+//11??AAALARATAT>I>O>Q>QrF   r   r$   r%   c                    || _         d S r?   r   r   s     r8   r,   zPyMongoProtocol.settimeout  s    rF   c                    | j         S )zGThe configured timeout for the socket that underlies our protocol pair.r  r   s    r8   r+   zPyMongoProtocol.gettimeout  s     }rF   r   r   c                ^    || _         | j                             t          t                     dS )zCalled exactly once when a connection is made.
        The transport argument is the transport representing the write side of the connection.
        N)r   set_write_buffer_limitsr   )r   r   s     r8   connection_madezPyMongoProtocol.connection_made  s+     #../?AQRRRRRrF   messager#   c                   K   | j                                         rt          d          | j                             |           | j                                          dS )z/Write a message to this connection's transport.zConnection is closedN)r   r   rb   writeresume_reading)r   r  s     r8   r	  zPyMongoProtocol.write  s[      >$$&& 	20111W%%%%%'''''rF   
request_idOptional[int]max_message_sizerZ   tuple[bytes, int]c                   K   | j         r9	 | j                                          n# t          $ r t          d          dw xY w|| _        | j        r | j                                         d{V }n| j         r(| j                                         rt          d          t          j	                    
                                }| j                            |           	 | d{V }|| j        v r| j                            |           n)# || j        v r| j                            |           w w xY w|r:|\  }}}}|||k    rt          d|d|          |t          ||          }||fS t          d          )zARead a single MongoDB Wire Protocol message from this connection.zconnection is already closedNGot response id  but expected r_   )r   r
  AttributeErrorrb   r   r   popleftr   r-   r.   rO   r   appendremover   r   )	r   r  r  r  read_waiterop_codecompressor_idresponse_todatas	            r8   re   zPyMongoProtocol.read	  s     > 	HH--////! H H H<==4GH!1 	< /7799999999GG~ >$.";";"="= ><===!244BBDDK"))+666< +++++++$"555'..{;;; $"555'..{;;;; 6 
	!8?5G]K%,,'V;VV
VV   (!$66= )***s   % A  D &D2sizehintrJ   c                   | j         r/| j        s!t          t          d                    | _        | j        S | j        r| j        | j        d         S | j        r| j        | j	        d         S | j        | j
        d         S )a8  Called to allocate a new receive buffer.
        The asyncio loop calls this method expecting to receive a non-empty buffer to fill with data.
        If any data does not fit into the returned buffer, this method will be called again until
        either no data remains or an empty buffer is returned.
        i @  N)r   r   rJ   r`   r   r   r   r   r   r   r   )r   r  s     r8   
get_bufferzPyMongoProtocol.get_buffer+  s       	!= = *9U+;+; < <=  ! 	6< 2 4 455& 	G+D,C,E,EFF}T02233rF   nbytesc                   |dk    r$|                      t          d                     dS | j        rdS | j        r| xj        |z  c_        | j        dk    rd| _        	 |                                 \  | _        | _        | _        | _	        n-# t          $ r }|                      |           Y d}~dS d}~ww xY wt          t          | j                            | _        dS | j	        rE| xj        |z  c_        | j        dk    r(d| _	        |                                 \  | _        | _        dS | xj        |z  c_        | j        | j        k    rd| _        | j                                         | j        r| j                                        }n%t-          j                                                    }|                                r|                      d           dS |                    | j        | j        | j        | j        f           | j                            |           d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        dS dS )z9Called when the buffer was updated with the received datar   r_   Nr   Fr   T)r   rb   r   r   r   process_headerr   r   r   r   r   rJ   r`   r   r   process_compression_headerr   r   r   pause_readingr   r  r-   r.   rO   rA   rB   r   r  )r   r  r7   results       r8   buffer_updatedzPyMongoProtocol.buffer_updated@  s    Q;;JJw233444F  	F! 	&(!R'').&	 ++--*)33$   JJsOOOFFFFF !+9T5G+H+H I IF& 	##v-##&!++.3+595T5T5V5V2t2Fv%$"444%)D"N((***% D/7799 133AACC{{}} 

4    3T5FV   &&v...!"D&'D#"#D!"D DMDM"&D $D3 54s   -B 
B6B11B6tuple[int, int, int, bool]c                   t          | j                  \  }}}}d}|dk    r |dk    rt          d|d          d}|dz  }|dk    rt          d|d	          || j        k    rt          d|d
| j        d          |dz
  |||fS )z&Unpack a MongoDB Wire Protocol header.F     Message length (zA) not longer than standard OP_COMPRESSED message header size (25)Tr   r   3) not longer than standard message header size (16)*) is larger than server max message size ())_UNPACK_HEADERr   r   r   )r   rY   _r  r  expecting_compressions         r8   r   zPyMongoProtocol.process_header{  s    *8*F*F'; %d??||#rvrrr   %)!aKFR<<`6```   D***=6 = =!%!7= = =  
 {G[2GGGrF   tuple[int, int]c                :    t          | j                  \  }}}||fS )z2Unpack a MongoDB Wire Protocol compression header.)_UNPACK_COMPRESSION_HEADERr   )r   r  r.  r  s       r8   r!  z*PyMongoProtocol.process_compression_header  s$    $>t?W$X$X!M%%rF   r7   Optional[Exception]c                    t          | j                  }|D ]]}|                                s-||                    d            n|                    |           | j                            |           ^d S r?   )listr   rA   rB   set_exceptionr   r  )r   r7   r   msgs       r8   _resolve_pending_messagesz)PyMongoProtocol._resolve_pending_messages  s    t-.. 	, 	,C88:: +;NN4((((%%c***&&s++++	, 	,rF   c                p    | j                                          |                     |           d| _        d S )NT)r   abortr8  r   r   r7   s     r8   r   zPyMongoProtocol.close  s8    &&s+++ $rF   c                    |                      |           | j                                        s| j                            d            d S d S r?   )r8  r   rA   rB   r;  s     r8   connection_lostzPyMongoProtocol.connection_lost  sR    &&s+++|  "" 	*L##D)))))	* 	*rF   c                $   K   | j          d {V  d S r?   )r   r   s    r8   r   zPyMongoProtocol.wait_closed  s&      lrF   r?   )r)   r   r   r   )r   r   r$   r%   )r  r#   r$   r%   )r  r  r  rZ   r$   r  )r  rZ   r$   rJ   )r  rZ   r$   r%   )r$   r%  )r$   r0  )r7   r3  r$   r%   r   )r   r   r   r   r,   r   r+   r  r	  re   r  r$  r   r!  r8  r   r=  r   r   rF   r8   r   r     s[       R R R R R4           XS S S S( ( ( ( +  +  +  +D4 4 4 4*9% 9% 9% 9%vH H H H.& & & &
, , , , ,% % % % %
* * * * *
     rF   r   c                   K   	 t          j        |                     |          | j                   d {V  d S # t           j        $ r}t          j        d          |d }~ww xY w)Nr(   r*   )r-   r1   r	  r+   r4   r5   r)   )rX   r"   r7   s      r8   async_sendallr@    sy      3tzz#HHHHHHHHHHHH 3 3 3n[))s23s   4: A#	AA#r  r  r  Union[_OpReply, _OpMsg]c                  K   | j         j        }t          j                    rt          j                    }n|rt          j                    |z   }nd}|r$t          |t          j                    z
  d          }t          t          |                     }t          | j         j
                            ||                    }||g}	 t          j        ||t          j                   d{V \  }}	|	D ]}
|
                                 |	rt          j        |	           d{V  t!          |          dk    rt#          j        d          ||v rf|                                \  }}	 t(          |         }n5# t*          $ r( t-          d|dt)          j                              dw xY w ||          S t1          d          # t          j        $ r5 |D ]}
|
                                 t          j        |           d{V   w xY w)1Receive a raw BSON message or raise socket.error.Nr   )r)   return_whenr*   Got opcode r  r   )rX   r+   r   r   get_deadliner   r   rm   r   rz   r   re   r-   waitFIRST_COMPLETEDcancelrK   r5   r)   r#  r   KeyErrorr   keysr   CancelledError)rX   r  r  r)   r   cancellation_task	read_tasktasksrA   r   taskr  r  unpack_replys                 r8   async_receive_messagerR    sn      i"G %'' 	~'''1HHH 6 h!1!11155#$6t$<$<==DI.33J@PQQRRI)*E%l70G
 
 
 
 
 
 
 
 
g  	 	DKKMMMM 	(,w'''''''''t99>>.---%,,..MD',W5   #S'SS=;M;O;OSS   <%%%!"7888!    	 	DKKMMMMl5!!!!!!!!!	s,   B!G 'E5 4G 52F''G 5G AHc                   t          j                    rt          j                    }n4| j                                        }|rt          j                    |z   }nd}t          t          | d|                    \  }}}}|||k    rt          d|d|          |dk    rt          d|d          ||k    rt          d|d|d          |d	k    rEt          t          | d
|                    \  }}}	t          t          | |dz
  |          |	          }
nt          | |dz
  |          }
	 t          |         }n5# t          $ r( t          d|dt          j                              dw xY w ||
          S )rC  Nr   r  r  r)  r*  r+  r,  r'  r   r(  rE  )r   r   rF  rX   r+   r   r   r-  r   r   r2  r   r   rJ  rK  )rX   r  r  r   r)   rY   r.  r  r  r  r  rQ  s               r8   receive_messagerT    s     %'')&&(( 	~'''1HHH&4\$H5U5U&V&V#FA{G$$ ^; ^ ^PZ ^ ^___||\v\\\
 
 	
    3v 3 3-3 3 3
 
 	

 $$>|DRSU]?^?^$_$_!M,tVb[(CC]SSD&2+x88$W-   K'KK=3E3G3GKK
 
	 <s   1D? ?2E1)r    r!   r"   r#   r$   r%   )r    r!   r"   r#   r6   r   r$   r%   )F)
rX   r   rY   rZ   r6   r   r[   r\   r$   rJ   )r    r!   r"   r#   rg   r   r$   r%   )
rX   r   rY   rZ   rg   r   r[   r\   r$   rJ   )rX   r   r$   r%   )r    r!   rY   rZ   r$   rJ   )rX   r   rY   rZ   r6   r   r$   rJ   )rX   r   r   r   r$   r%   )rX   r   rY   rZ   r   r   r$   rJ   )rX   r   r"   r#   r$   r%   )rX   r   r  r  r  rZ   r$   rA  )rX   r   r  r  r  rZ   r$   rA  )Q__doc__
__future__r   r-   r   r   r5   structsysr   r   r   r   r   r   typingr	   r
   r   r   pymongor   r   pymongo._asyncio_taskr   pymongo.commonr   pymongo.compression_supportr   pymongo.errorsr   r   pymongo.messager   r   r   pymongo.socket_checkerr   sslr   r   r/   ImportErrorpymongo.pyopenssl_contextr   rT   pymongo.ssl_supportr   r   r   pymongo.asynchronous.poolr   pymongo.synchronous.poolr   Structunpackr-  r2  rx   BlockingIOErrorrM   r9   platformr2   rf   rt   rz   r   r|   versionr   r   r   r   r   r   r   r   r@  rR  rT  r   rF   r8   <module>rl     s   - , " " " " " "         



  Y Y Y Y Y Y Y Y Y Y Y Y Y Y            ' & & & & & & & - - - - - - + + + + + + 2 2 2 2 2 2 = = = = = = = = ; ; ; ; ; ; ; ; ; ; 8 8 8 8 8 8''''''''II   III222222OO   OHHH           4999999333333w''.*V]6229 %b(@b;Cabb 
! ! ! !  <7)/ )/ )/ )/X V[0 0 0 0 0 0l   , W\    6   + + + +& & & &2
 
 
 
 	#+<7". . . .B< < < <~" " " " " " " "45 5 5 5 56 5 5 56+ + + + +1 + + +>T T T T T& T T Tn3 3 3 3 -0 0 0 0 0h JZ( ( ( ( ( ( (s$   2
A= =BBB 	B B 