o
    4˜Žj?^  ã                   @   s$  U d dl Z d dlZd dlZd dl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mZmZmZmZ ddlmZ ddlmZ d	Ze
d
ƒZG dd„ deƒZG dd„ de	e ƒZG dd„ dƒZG dd„ dƒZG dd„ deƒZeƒ Z ee e!d< G dd„ de	e ƒZ"G dd„ de"e ƒZ#dS )é    N)Ú	AwaitableÚCallable)ÚFinalÚGenericÚTypeVaré   )ÚBaseProtocol)Ú_EXC_SENTINELÚDEFAULT_CHUNK_SIZEÚBaseTimerContextÚ	TimerNoopÚset_exceptionÚ
set_result)ÚLineTooLong)Úinternal_logger)ÚEMPTY_PAYLOADÚ	EofStreamÚStreamReaderÚ	DataQueueÚ_Tc                   @   s   e Zd ZdZdS )r   zeof stream indication.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r   r   úL/var/www/kodo/Anonymous/send/lib/python3.10/site-packages/aiohttp/streams.pyr      s    r   c                   @   sF   e Zd ZdZdeg ee f ddfdd„Zddd	„Zdefd
d„Z	dS )ÚAsyncStreamIterator©Ú	read_funcr   ÚreturnNc                 C   ó
   || _ d S ©Nr   )Úselfr   r   r   r   Ú__init__&   ó   
zAsyncStreamIterator.__init__úAsyncStreamIterator[_T]c                 C   ó   | S r!   r   ©r"   r   r   r   Ú	__aiter__)   ó   zAsyncStreamIterator.__aiter__c                 Ã   s8   �z	|   ¡ I d H }W n	 ty   t‚w |dkrt‚|S ©Nó    )r   r   ÚStopAsyncIteration©r"   Úrvr   r   r   Ú	__anext__,   s   €ÿzAsyncStreamIterator.__anext__)r   r%   )
r   r   r   Ú	__slots__r   r   r   r#   r(   r/   r   r   r   r   r   "   s
    
r   c                   @   s:   e Zd ZdZddd„Zddd	„Zdeeef fd
d„Z	dS )ÚChunkTupleAsyncStreamIterator©Ú_streamÚstreamr   r   Nc                 C   r    r!   r2   )r"   r4   r   r   r   r#   :   r$   z&ChunkTupleAsyncStreamIterator.__init__c                 C   r&   r!   r   r'   r   r   r   r(   =   r)   z'ChunkTupleAsyncStreamIterator.__aiter__c                 Ã   s"   �| j  ¡ I d H }|dkrt‚|S )N©r+   F)r3   Ú	readchunkr,   r-   r   r   r   r/   @   s
   €z'ChunkTupleAsyncStreamIterator.__anext__)r4   r   r   N)r   r1   )
r   r   r   r0   r#   r(   ÚtupleÚbytesÚboolr/   r   r   r   r   r1   6   s
    

r1   c                   @   s\  e Zd ZdZdZdddœdedededB dej	dB d	df
d
d„Z
d	efdd„Zd	ee fdd„Zded	ee fdd„Zd	ee fdd„Zd	efdd„Zd	eeef fdd„Zded	dfdd„Zd	edB fdd„Zefdeded	dfdd „Zd!eg df d	dfd"d#„ZdUd$d%„Zd	efd&d'„Zd	efd(d)„Z dUd*d+„Z!e"d	efd,d-„ƒZ#d.ed	dfd/d0„Z$dVd.ed2ed	efd3d4„Z%dUd5d6„Z&dUd7d8„Z'd9ed	dfd:d;„Z(dd<œd=edB d	efd>d?„Z)	@dWddAœdBedCedB d	efdDdE„Z*dXded	efdGdH„Z+d	efdIdJ„Z,d	eeef fdKdL„Z-ded	efdMdN„Z.dXded	efdOdP„Z/ded	efdQdR„Z0ded	efdSdT„Z1dS )Yr   a*  An enhancement of asyncio.StreamReader.

    Supports asynchronous iteration by line, chunk or as available::

        async for line in reader:
            ...
        async for chunk in reader.iter_chunked(1024):
            ...
        async for slice in reader.iter_any():
            ...

    )Ú	_protocolÚ
_low_waterÚ_high_waterÚ_low_water_chunksÚ_high_water_chunksÚ_loopÚ_sizeÚ_cursorÚ_http_chunk_splitsÚ_bufferÚ_buffer_offsetÚ_eofÚ_waiterÚ_eof_waiterÚ
_exceptionÚ_timerÚ_eof_callbacksÚ_eof_counterÚtotal_bytesÚtotal_compressed_bytesN)ÚtimerÚloopÚprotocolÚlimitrN   rO   r   c                C   s²   || _ || _|d | _|d u rt ¡ }td|d ƒ| _| jd | _|| _d| _	d| _
d | _t ¡ | _d| _d| _d | _d | _d | _|d u rHtƒ n|| _g | _d| _d| _d | _d S )Né   é   é   r   F)r:   r;   r<   ÚasyncioÚget_event_loopÚmaxr>   r=   r?   r@   rA   rB   ÚcollectionsÚdequerC   rD   rE   rF   rG   rH   r   rI   rJ   rK   rL   rM   )r"   rP   rQ   rN   rO   r   r   r   r#   l   s,   


zStreamReader.__init__c                 C   sŠ   | j jg}| jr| d| j ¡ | jr| d¡ | jtkr(| d| j| jf ¡ | jr3| d| j ¡ | j	r>| d| j	 ¡ dd 
|¡ S )Nz%d bytesÚeofzlow=%d high=%dzw=%rze=%rú<%s>ú )Ú	__class__r   r@   ÚappendrE   r;   r
   r<   rF   rH   Újoin)r"   Úinfor   r   r   Ú__repr__Ž   s   


zStreamReader.__repr__c                 C   ó
   t | jƒS r!   )r   Úreadliner'   r   r   r   r(   œ   r$   zStreamReader.__aiter__Únc                    s   ˆ  ˆ ¡ t‡ ‡fdd„ƒS )z>Returns an asynchronous iterator that yields chunks of size n.c                      s
   ˆ  ˆ ¡S r!   )Úreadr   ©rd   r"   r   r   Ú<lambda>¢   s   
 z+StreamReader.iter_chunked.<locals>.<lambda>)Úset_read_chunk_sizer   ©r"   rd   r   rf   r   Úiter_chunkedŸ   s   
zStreamReader.iter_chunkedc                 C   rb   )z3Yield all available data as soon as it is received.)r   Úreadanyr'   r   r   r   Úiter_any¤   s   
zStreamReader.iter_anyc                 C   s   t | ƒS )z´Yield chunks of data as they are received by the server.

        The yielded objects are tuples
        of (bytes, bool) as returned by the StreamReader.readchunk method.
        )r1   r'   r   r   r   Úiter_chunks¨   s   zStreamReader.iter_chunksc                 C   s   | j | jfS r!   ©r;   r<   r'   r   r   r   Úget_read_buffer_limits°   ó   z#StreamReader.get_read_buffer_limitsc                 C   s"   || j kr|| _ |d | _dS dS )z7Raise buffer limits to match the consumer's chunk size.rR   Nrn   ri   r   r   r   rh   ³   s   
þz StreamReader.set_read_chunk_sizec                 C   ó   | j S r!   ©rH   r'   r   r   r   Ú	exception¹   ó   zStreamReader.exceptionÚexcÚ	exc_causec                 C   sX   || _ | j ¡  | j}|d urd | _t|||ƒ | j}|d ur*d | _t|||ƒ d S d S r!   )rH   rJ   ÚclearrF   r   rG   ©r"   ru   rv   Úwaiterr   r   r   r   ¼   s   
þzStreamReader.set_exceptionÚcallbackc                 C   sB   | j rz|ƒ  W d S  ty   t d¡ Y d S w | j |¡ d S ©NúException in eof callback)rE   Ú	Exceptionr   rs   rJ   r^   ©r"   rz   r   r   r   Úon_eofÎ   s   ÿzStreamReader.on_eofc              	   C   s�   d| _ | j}|d urd | _t|d ƒ | j}|d ur!d | _t|d ƒ | jjdd� | jD ]}z|ƒ  W q+ ty@   t 	d¡ Y q+w | j 
¡  d S )NTF)Úresume_parserr|   )rE   rF   r   rG   r:   Úresume_readingrJ   r}   r   rs   rw   )r"   ry   Úcbr   r   r   Úfeed_eof×   s"   



ÿzStreamReader.feed_eofc                 C   rq   )z&Return True if  'feed_eof' was called.©rE   r'   r   r   r   Úis_eofï   s   zStreamReader.is_eofc                 C   ó   | j o| j S )z=Return True if the buffer is empty and 'feed_eof' was called.©rE   rC   r'   r   r   r   Úat_eofó   s   zStreamReader.at_eofc                 Ã   sH   �| j rd S | jd u sJ ‚| j ¡ | _z| jI d H  W d | _d S d | _w r!   )rE   rG   r?   Úcreate_futurer'   r   r   r   Úwait_eof÷   s   €zStreamReader.wait_eofc                 C   s   | j d u r| jS | j S r!   )rM   rL   r'   r   r   r   Útotal_raw_bytes  s   
zStreamReader.total_raw_bytesÚdatac                 C   sx   t jdtdd� |sdS | jr| jd | jd… | jd< d| _|  jt|ƒ7  _|  jt|ƒ8  _| j |¡ d| _	dS )zDrollback reading some data from stream, inserting it to buffer head.zJunread_data() is deprecated and will be removed in future releases (#3260)rR   )Ú
stacklevelNr   )
ÚwarningsÚwarnÚDeprecationWarningrD   rC   r@   ÚlenrA   Ú
appendleftrK   )r"   rŒ   r   r   r   Úunread_data  s   ü
zStreamReader.unread_datar   Úsizec                 C   s~   | j rJ dƒ‚|sdS t|ƒ}|  j|7  _| j |¡ |  j|7  _| j}|d ur2d | _t|d ƒ | j| jkr=| j	 
¡  dS )Nzfeed_data after feed_eofF)rE   r‘   r@   rC   r^   rL   rF   r   r<   r:   Úpause_reading)r"   rŒ   r”   Údata_lenry   r   r   r   Ú	feed_data  s   

zStreamReader.feed_datac                 C   s*   | j d u r| jrtdƒ‚t ¡ | _ d S d S )Nz@Called begin_http_chunk_receiving when some data was already fed)rB   rL   ÚRuntimeErrorrX   rY   r'   r   r   r   Úbegin_http_chunk_receiving0  s   
ÿûz'StreamReader.begin_http_chunk_receivingc                 C   s‚   | j d u r	tdƒ‚| j r| j d nd}| j|krd S | j  | j¡ t| j ƒ| jkr.| j ¡  | j}|d ur?d | _t	|d ƒ d S d S )NzFCalled end_chunk_receiving without calling begin_chunk_receiving firstéÿÿÿÿr   )
rB   r˜   rL   r^   r‘   r>   r:   r•   rF   r   )r"   Úposry   r   r   r   Úend_http_chunk_receiving8  s   
ÿ


þz%StreamReader.end_http_chunk_receivingÚ	func_namec                 Ã   sŠ   �| j js	tdƒ‚| jd urtd| ƒ‚| j ¡  }| _z$| j� |I d H  W d   ƒ n1 s0w   Y  W d | _d S W d | _d S d | _w )NzConnection closed.zH%s() called while another coroutine is already waiting for incoming data)r:   Ú	connectedr˜   rF   r?   r‰   rI   )r"   r�   ry   r   r   r   Ú_wait\  s"   €
ÿÿÿ
ýzStreamReader._wait©Úmax_line_lengthr¡   c                Ã   s   �| j |d�I d H S )N©Úmax_size)Ú	readuntil©r"   r¡   r   r   r   rc   q  s   €zStreamReader.readlineó   
r¢   Ú	separatorr£   c          
      Ã   sô   �t |ƒ}|dkrtdƒ‚| jd ur| j‚d}d}d}|p| j}|rx| jrf|rf| j}| jd  ||¡d }|  |rA|| | d nd¡}	||	7 }|t |	ƒ7 }|rRd}||krat|d d… d	 |ƒ‚| jrf|s'| j	rl	 |S |rv|  
d
¡I d H  |s"|S )Nr   z,Separator should be at least one-byte stringr+   Tr   rš   Féd   s   ...r¤   )r‘   Ú
ValueErrorrH   r<   rC   rD   ÚfindÚ_read_nowait_chunkr   rE   rŸ   )
r"   r§   r£   ÚseplenÚchunkÚ
chunk_sizeÚ
not_enoughÚoffsetÚicharrŒ   r   r   r   r¤   t  s>   €


ÿ
óýìzStreamReader.readuntilrš   c                 Ã   sÒ   �| j d ur	| j ‚	 | jr%| js%t| ddƒd | _| jdkr%tjddd� |s)dS |dk rK|  tj	¡ g }	 |  
¡ I d H }|s@n| |¡ q6d |¡S |  |¡ | jsd| jsd|  d	¡I d H  | jsd| jrV|  |¡S )
NTrK   r   r   é   zEMultiple access to StreamReader in eof state, might be infinite loop.)Ú
stack_infor+   re   )rH   rE   rC   ÚgetattrrK   r   Úwarningrh   ÚsysÚmaxsizerk   r^   r_   rŸ   Ú_read_nowait)r"   rd   ÚblocksÚblockr   r   r   re   ›  s8   €

ý
ü

ÿ
zStreamReader.readc                 Ã   sD   �| j d ur	| j ‚| js| js|  d¡I d H  | js| jr|  d¡S )Nrk   rš   )rH   rC   rE   rŸ   r¸   r'   r   r   r   rk   Ä  s   €
ÿ
zStreamReader.readanyc                 Ã   s�   �	 | j dur
| j ‚| jr0| j ¡ }|| jkrdS || jkr(|  || j ¡dfS t d¡ | js| jr:|  d¡dfS | j	r?dS |  
d¡I dH  q)	a  Returns a tuple of (data, end_of_http_chunk).

        When chunked transfer
        encoding is used, end_of_http_chunk is a boolean indicating if the end
        of the data corresponds to the end of a HTTP chunk , otherwise it is
        always False.
        TN©r+   TzESkipping HTTP chunk end due to data consumption beyond chunk boundaryrš   Fr5   r6   )rH   rB   ÚpopleftrA   r¸   r   rµ   rC   r«   rE   rŸ   )r"   r›   r   r   r   r6   Ð  s(   €



ÿúèzStreamReader.readchunkc                 Ã   sx   �| j d ur	| j ‚g }|dkr7|  |¡I d H }|s(d |¡}t |t|ƒ| ¡‚| |¡ |t|ƒ8 }|dksd |¡S )Nr   r+   )rH   re   r_   rU   ÚIncompleteReadErrorr‘   r^   )r"   rd   r¹   rº   Úpartialr   r   r   Úreadexactlyò  s   €


ú
zStreamReader.readexactlyc                 C   s2   | j d ur| j ‚| jr| j ¡ stdƒ‚|  |¡S )Nz9Called while some coroutine is waiting for incoming data.)rH   rF   Údoner˜   r¸   ri   r   r   r   Úread_nowait  s   
ÿ
zStreamReader.read_nowaitc                 C   sþ   | j d }| j}|dkr$t|ƒ| |kr$|||| … }|  j|7  _n|r5| j  ¡  ||d … }d| _n| j  ¡ }t|ƒ}|  j|8  _|  j|7  _| j}|re|d | jk re| ¡  |re|d | jk sX| j| jk r}| jd u sxt| jƒ| jk r}| j	 
¡  |S )Nr   rš   )rC   rD   r‘   r¼   r@   rA   rB   r;   r=   r:   r�   )r"   rd   Úfirst_bufferr°   rŒ   r–   Úchunk_splitsr   r   r   r«     s,   


ÿ

zStreamReader._read_nowait_chunkc                    s–   ˆ j  ¡  |dkr%tˆ jƒ}|dkrˆ  d¡S d ‡ fdd„t|ƒD ƒ¡S g }ˆ jrBˆ  |¡}| |¡ |t|ƒ8 }|dkr?nˆ js*|rId |¡S dS )z6Read not more than n bytes, or whole buffer if n == -1rš   r   r+   c                    s   g | ]}ˆ   d ¡‘qS ©rš   )r«   )Ú.0Ú_r'   r   r   Ú
<listcomp>9  s    z-StreamReader._read_nowait.<locals>.<listcomp>r   )rI   Úassert_timeoutr‘   rC   r«   r_   Úranger^   )r"   rd   ÚcountÚchunksr­   r   r'   r   r¸   /  s   




ûzStreamReader._read_nowait©r   N©r   )r¦   rÄ   )2r   r   r   r   r0   r   Úintr   rU   ÚAbstractEventLoopr#   Ústrra   r   r8   r(   rj   rl   r1   rm   r7   ro   rh   ÚBaseExceptionrs   r	   r   r   r   rƒ   r9   r…   rˆ   rŠ   Úpropertyr‹   r“   r—   r™   rœ   rŸ   rc   r¤   re   rk   r6   r¿   rÁ   r«   r¸   r   r   r   r   r   G   s|    úþýûú
ù"ýþý
ü
	


$ÿÿÿÿ
þ')"r   c                   @   sB  e Zd ZdZd/dd„Zdefdd„ZdedB fdd	„Ze	fd
ededdfdd„Z
deg df ddfdd„Zd/dd„Zdefdd„Zdefdd„Zd/dd„Zd0dededefdd„Zdeddfdd„Zdd œd!edB defd"d#„Zd1dedefd%d&„Zdefd'd(„Zdeeef fd)d*„Zdedefd+d,„Zd1dedefd-d.„ZdS )2ÚEmptyStreamReader©Ú_read_eof_chunkr   Nc                 C   s   d| _ d| _d S )NFr   )rÕ   rL   r'   r   r   r   r#   J  s   
zEmptyStreamReader.__init__c                 C   s   d| j j S )Nr[   )r]   r   r'   r   r   r   ra   N  rp   zEmptyStreamReader.__repr__c                 C   ó   d S r!   r   r'   r   r   r   rs   Q  r)   zEmptyStreamReader.exceptionru   rv   c                 C   rÖ   r!   r   )r"   ru   rv   r   r   r   r   T  s   zEmptyStreamReader.set_exceptionrz   c                 C   s,   z|ƒ  W d S  t y   t d¡ Y d S w r{   )r}   r   rs   r~   r   r   r   r   [  s
   ÿzEmptyStreamReader.on_eofc                 C   rÖ   r!   r   r'   r   r   r   rƒ   a  r)   zEmptyStreamReader.feed_eofc                 C   ó   dS ©NTr   r'   r   r   r   r…   d  r)   zEmptyStreamReader.is_eofc                 C   r×   rØ   r   r'   r   r   r   rˆ   g  r)   zEmptyStreamReader.at_eofc                 Ã   s   �d S r!   r   r'   r   r   r   rŠ   j  ó   €zEmptyStreamReader.wait_eofr   rŒ   rd   c                 C   r×   ©NFr   )r"   rŒ   rd   r   r   r   r—   m  r)   zEmptyStreamReader.feed_datac                 C   rÖ   r!   r   ri   r   r   r   rh   p  r)   z%EmptyStreamReader.set_read_chunk_sizer    r¡   c                Ã   ó   �dS r*   r   r¥   r   r   r   rc   s  rÙ   zEmptyStreamReader.readlinerš   c                 Ã   rÛ   r*   r   ri   r   r   r   re   v  rÙ   zEmptyStreamReader.readc                 Ã   rÛ   r*   r   r'   r   r   r   rk   {  rÙ   zEmptyStreamReader.readanyc                 Ã   s   �| j s	d| _ dS dS )NTr5   r»   rÔ   r'   r   r   r   r6   ~  s
   €zEmptyStreamReader.readchunkc                 Ã   s   �t  d|¡‚r*   )rU   r½   ri   r   r   r   r¿   …  s   €zEmptyStreamReader.readexactlyc                 C   r×   r*   r   ri   r   r   r   rÁ   ˆ  r)   zEmptyStreamReader.read_nowaitrÌ   rÍ   rÄ   )r   r   r   r0   r#   rÐ   ra   rÑ   rs   r	   r   r   r   rƒ   r9   r…   rˆ   rŠ   r8   rÎ   r—   rh   rc   re   rk   r7   r6   r¿   rÁ   r   r   r   r   rÓ   F  s4    
ýþý
ü

rÓ   r   c                   @   s¼   e Zd ZdZdejddfdd„Zdefdd„Zde	fd	d
„Z
de	fdd„ZdedB fdd„Zefdededdfdd„Zddededdfdd„Zddd„Zdefdd„Zdee fdd„ZdS ) r   z>DataQueue is a general-purpose blocking queue with one reader.rO   r   Nc                 C   s&   || _ d| _d | _d | _t ¡ | _d S rÚ   )r?   rE   rF   rH   rX   rY   rC   )r"   rO   r   r   r   r#   ’  s
   zDataQueue.__init__c                 C   rb   r!   )r‘   rC   r'   r   r   r   Ú__len__™  r$   zDataQueue.__len__c                 C   rq   r!   r„   r'   r   r   r   r…   œ  rt   zDataQueue.is_eofc                 C   r†   r!   r‡   r'   r   r   r   rˆ   Ÿ  s   zDataQueue.at_eofc                 C   rq   r!   rr   r'   r   r   r   rs   ¢  rt   zDataQueue.exceptionru   rv   c                 C   s4   d| _ || _| j }d urd | _t|||ƒ d S d S rØ   )rE   rH   rF   r   rx   r   r   r   r   ¥  s   þzDataQueue.set_exceptionr   rŒ   r”   c                 C   s6   | j  ||f¡ | j }d urd | _t|d ƒ d S d S r!   )rC   r^   rF   r   )r"   rŒ   r”   ry   r   r   r   r—   °  s
   þzDataQueue.feed_datac                 C   s,   d| _ | j }d urd | _t|d ƒ d S d S rØ   )rE   rF   r   )r"   ry   r   r   r   rƒ   ¶  s
   þzDataQueue.feed_eofc              	   Ã   s€   �| j s*| js*| jrJ ‚| j ¡ | _z| jI d H  W n tjtjfy)   d | _‚ w | j r6| j  ¡ \}}|S | j	d ur>| j	‚t
‚r!   )rC   rE   rF   r?   r‰   rU   ÚCancelledErrorÚTimeoutErrorr¼   rH   r   )r"   rŒ   rÆ   r   r   r   re   ¼  s    €
þ
zDataQueue.readc                 C   rb   r!   )r   re   r'   r   r   r   r(   Ì  r$   zDataQueue.__aiter__rÍ   rÌ   )r   r   r   r   rU   rÏ   r#   rÎ   rÜ   r9   r…   rˆ   rÑ   rs   r	   r   r   r—   rƒ   re   r   r(   r   r   r   r   r   �  s&    ýþý
ü
r   c                       s^   e Zd ZdZdededejddf‡ fdd„Zdd
e	deddf‡ fdd„Z
de	fdd„Z‡  ZS )ÚFlowControlDataQueuez®FlowControlDataQueue resumes and pauses an underlying stream.

    It is a destination for parsed data.

    This class is deprecated and will be removed in version 4.0.
    rP   rQ   rO   r   Nc                   s(   t ƒ j|d� d| _|| _|d | _d S )N)rO   r   rR   )Úsuperr#   r@   r:   Ú_limit)r"   rP   rQ   rO   ©r]   r   r   r#   Ø  s   zFlowControlDataQueue.__init__r   rŒ   r”   c                    sF   t ƒ  ||¡ |  j|7  _| j| jkr| jjs!| j ¡  d S d S d S r!   )rà   r—   r@   rá   r:   Ú_reading_pausedr•   ©r"   rŒ   r”   râ   r   r   r—   à  s
   ÿzFlowControlDataQueue.feed_datac              	   Ã   s¬   �| j s*| js*| jrJ ‚| j ¡ | _z| jI d H  W n tjtjfy)   d | _‚ w | j rL| j  ¡ \}}|  j	|8  _	| j	| j
k rJ| jjrJ| j ¡  |S | jd urT| j‚t‚r!   )rC   rE   rF   r?   r‰   rU   rÝ   rÞ   r¼   r@   rá   r:   rã   r�   rH   r   rä   r   r   r   re   ç  s&   €
þ

zFlowControlDataQueue.readrÍ   )r   r   r   r   r   rÎ   rU   rÏ   r#   r   r—   re   Ú__classcell__r   r   râ   r   rß   Ð  s    ÿÿÿþrß   )$rU   rX   r¶   rŽ   Úcollections.abcr   r   Útypingr   r   r   Úbase_protocolr   Úhelpersr	   r
   r   r   r   r   Úhttp_exceptionsr   Úlogr   Ú__all__r   r}   r   r   r1   r   rÓ   r   Ú__annotations__r   rß   r   r   r   r   Ú<module>   s0   
      FA