
    9bh                        	 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
Z
d dl
mZ d dlZd dlmZ d dlmZ d Zd Zd	 Zd
 Z G d de      Z G d de
j0                  j2                        Z G d d      Z G d dej8                        Z G d d      Z ej>                   e ed      d       G d deej8                               Z! ej>                   e ed      d       G d deej8                               Z" G d deej8                        Z# G d d      Z$ ej>                   e ed      d       G d d e$ej8                               Z% ej>                   e ed      d       G d! d"e$ej8                               Z& G d# d$e$ej8                        Z' G d% d&      Z( G d' d(e(ej8                        Z) ej>                   e ed      d       G d) d*e(ej8                               Z*e+d+k(  r ejX                          yy),    N)mock)GenericAlias)futures)utils)supportc                  .    t        j                  d        y N)asyncioset_event_loop_policy     H/opt/python-3.12.12/usr/lib/python3.12/test/test_asyncio/test_futures.pytearDownModuler      s    !!$'r   c                     | S r	   r   fs    r   	_fakefuncr      s    Hr   c                       y r	   r   r   r   r   first_cbr          r   c                       y r	   r   r   r   r   last_cbr      r   r   c                       e Zd Zy)ReachableCodeN__name__
__module____qualname__r   r   r   r   r   "   s    r   r   c                       e Zd Z	 d Zd Zy)SimpleEvilEventLoopc                      yNFr   selfs    r   	get_debugzSimpleEvilEventLoop.get_debug,   s    r   c                 h    | j                         s"| j                         s| j                          y y y r	   )	is_closed
is_runningcloser#   s    r   __del__zSimpleEvilEventLoop.__del__/   s&    ~~(9JJL ):r   N)r   r   r   r%   r*   r   r   r   r    r    )   s    Or   r    c                   L    e Zd ZdZdZdZdZd Zd Zd Z	d Z
d Zd Zd	 Zd
 Zy)
DuckFutureFNc                 4    | j                         ryd| _        y)NFT)done_DuckFuture__cancelledr#   s    r   cancelzDuckFuture.cancel>   s    99;r   c                     | j                   S r	   )r/   r#   s    r   	cancelledzDuckFuture.cancelledD   s    r   c                 Z    | j                   xs | j                  d uxs | j                  d uS r	   )r/   _DuckFuture__result_DuckFuture__exceptionr#   s    r   r.   zDuckFuture.doneG   s4       0==,0##4/	1r   c                     | j                  | j                                | j                  | j                  | j                  S r	   )assertFalser2   r5   r4   r#   s    r   resultzDuckFuture.resultL   s9    )*'"""}}r   c                 X    | j                  | j                                | j                  S r	   )r7   r2   r5   r#   s    r   	exceptionzDuckFuture.exceptionR   s#    )*r   c                 r    | j                  | j                                | j                  |       || _        y r	   )r7   r.   assertIsNotNoner4   )r$   r8   s     r   
set_resultzDuckFuture.set_resultV   s+    %V$r   c                 r    | j                  | j                                | j                  |       || _        y r	   )r7   r.   r<   r5   )r$   r:   s     r   set_exceptionzDuckFuture.set_exception[   s,    %Y'$r   c              #      K   | j                         sd| _        |  | j                  | j                                | j                         S wNT)r.   _asyncio_future_blocking
assertTruer8   r#   s    r   __iter__zDuckFuture.__iter__`   s:     yy{,0D)J		${{}s   AA)r   r   r   rB   r/   r4   r5   r0   r2   r.   r8   r:   r=   r?   rD   r   r   r   r,   r,   5   sA      %KHK 1
 
%
r   r,   c                   *     e Zd Z fdZd Zd Z xZS )	DuckTestsc                     t         |           | j                         | _        | j	                  | j                  j
                         y r	   supersetUpnew_test_looploop
addCleanupr)   r$   	__class__s    r   rJ   zDuckTests.setUpj   0    &&(			(r   c                 f    t               }t        j                  |      }| j                  ||       y r	   )r,   r
   wrap_futureassertIsr$   r   gs      r   test_wrap_futurezDuckTests.test_wrap_futureo   s'    L"ar   c                 f    t               }t        j                  |      }| j                  ||       y r	   )r,   r
   ensure_futurerS   rT   s      r   test_ensure_futurezDuckTests.test_ensure_futuret   s'    L!!!$ar   )r   r   r   rJ   rV   rY   __classcell__rO   s   @r   rF   rF   h   s    )

r   rF   c                       e Zd Zd Z fdZd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd ZefdZd Zd Zd Zd Zd Zd Zd Z ej8                  d      d        Z ej8                  d      d        Z ej8                  d      d        Z ej8                  d      d        Z  ej8                  d      d        Z! ej8                  d      d        Z" ej8                  d      d        Z#d  Z$d! Z%d" Z&d# Z'd$ Z(d% Z)d& Z*d' Z+ ej8                  d      d(        Z,d) Z-d* Z.d+ Z/d, Z0d- Z1d. Z2d/ Z3d0 Z4 xZ5S )1BaseFutureTestsc                 &     | j                   |i |S r	   )clsr$   argskwargss      r   _new_futurezBaseFutureTests._new_future|   s    txx(((r   c                     t         |           | j                         | _        | j	                  | j                  j
                         y r	   rH   rN   s    r   rJ   zBaseFutureTests.setUp   rP   r   c                     | j                   t           }| j                  |j                  t        f       | j	                  |t
               y r	   )r_   strassertEqual__args__assertIsInstancer   )r$   futures     r   test_generic_aliasz"BaseFutureTests.test_generic_alias   s5    #3&1fl3r   c           	          G d d      }| j                  t        j                  |             | j                  t        j                   |                    | j                  t        j                  d             | j                  t        j                  t	        j
                                      | j                  | j                        }| j                  t        j                  |             | j                  t        j                  t        |                   | j                  t        j                  t	        j
                  t        |                         |j                          y )Nc                       e Zd ZdZd Zy)/BaseFutureTests.test_isfuture.<locals>.MyFutureNc                     d| _         y r"   )rB   r#   s    r   __init__z8BaseFutureTests.test_isfuture.<locals>.MyFuture.__init__   s
    05-r   )r   r   r   rB   rp   r   r   r   MyFuturern      s    '+$6r   rq      rL   )
r7   r
   isfuturerC   r   Mockrc   rL   typer0   )r$   rq   r   s      r   test_isfuturezBaseFutureTests.test_isfuture   s    	6 	6 	))(34((45))!,- 	))$))+67$)),((+,))$q'23 	((47);<=	
r   c                    | j                  | j                        }| j                  |j                                | j                  |j	                                |j                          | j                  |j                                y Nrs   )rc   rL   r7   r2   r.   r0   rC   r$   r   s     r   test_initial_statez"BaseFutureTests.test_initial_state   s\    $)),'"	
&r   c                 z    | j                  t        d      5  | j                          d d d        y # 1 sw Y   y xY w)Nno current event loop)assertRaisesRegexRuntimeErrorrc   r#   s    r   test_constructor_without_loopz-BaseFutureTests.test_constructor_without_loop   s,    ##L2IJ KJJs   1:c                       fd} j                   j                   |             } j                  |j                   j                           j                  |j	                          j                          y )Nc                  ,   K    j                         S wr	   )rc   r#   s   r   testz?BaseFutureTests.test_constructor_use_running_loop.<locals>.test   s     ##%%s   )rL   run_until_completerS   _loopget_loop)r$   r   r   s   `  r   !test_constructor_use_running_loopz1BaseFutureTests.test_constructor_use_running_loop   sL    	&II((0aggtyy)ajjlDII.r   c                 B   t        j                  | j                         | j                  t         j                  d        | j	                         }| j                  |j                  | j                         | j                  |j                         | j                         y r	   )r
   set_event_looprL   rM   rc   rS   r   r   rz   s     r    test_constructor_use_global_loopz0BaseFutureTests.test_constructor_use_global_loop   sd    tyy)..5aggtyy)ajjlDII.r   c                 F    | j                  t        | j                  d       y )N*   )assertRaises	TypeErrorrc   r#   s    r   test_constructor_positionalz+BaseFutureTests.test_constructor_positional   s    )T%5%5r:r   c                    | j                   j                  | j                   | j                        }| j                  t        j
                  |j                         | j                   j                  | j                   | j                        }| j                  t        j
                  |j                         | j                   j                  | j                   | j                        }| j                  t        t        f      5  |j                  d        d d d        | j                   j                  | j                   | j                        }| j                  t        t        f      5  |j                  t               d d d        | j                   j                  | j                   | j                        }| j                  t        t        f      5  |j                          d d d        | j                   j                  | j                   | j                        }| j                  t        t        f      5  |j                  d        d d d        | j                   j                  | j                   | j                        }| j                  t        t        f      5  |j                  d        d d d        | j                   j                  | j                   | j                        }	 t!        |       | j                   j                  | j                   | j                        }	 |j#                          | j                   j                  | j                   | j                        }	 t%        |       | j                   j                  | j                   | j                        }| j'                  |j)                                | j'                  |j+                                y # 1 sw Y   xY w# 1 sw Y   vxY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   jxY w# t        t        f$ r Y Bw xY w# t        $ r Y w xY w# t        $ r Y w xY w)Nrs   c                      y r	   r   r   s    r   <lambda>z4BaseFutureTests.test_uninitialized.<locals>.<lambda>   s    Dr   c                      y r	   r   r   s    r   r   z4BaseFutureTests.test_uninitialized.<locals>.<lambda>   s    tr   )r_   __new__rL   r   r
   InvalidStateErrorr8   r:   r   AttributeErrorr=   r?   	Exceptionr0   add_done_callbackremove_done_callbackrepr	__await__iterr7   r2   r.   r$   futs     r   test_uninitializedz"BaseFutureTests.test_uninitialized   s$    hhtxxdii8'33SZZ@hhtxxdii8'33S]]Chhtxxdii8n=>NN4  ? hhtxxdii8n=>i( ? hhtxxdii8n=>JJL ? hhtxxdii8n=>!!.1 ? hhtxxdii8n=>$$^4 ? hhtxxdii8	I hhtxxdii8	MMO hhtxxdii8	I hhtxxdii8)$O ?> ?> ?> ?> ?> n- 		  		  		sr   O&)O3P 8PP,P' )P= +Q &O03O= P
PP$'P:9P:=	Q
	Q
	QQc                    | j                  | j                        }| j                  t        |d             | j	                  |j
                  d        |j                  d       | j                  t        j                        5  | j                  j                  |       d d d        | j	                  |j
                  d       y # 1 sw Y   &xY w)Nrs   _cancel_message
my message)rc   rL   rC   hasattrrg   r   r0   r   r
   CancelledErrorr   rz   s     r   !test_future_cancel_message_getterz1BaseFutureTests.test_future_cancel_message_getter   s    $)),#456**D1	w556II((+ 7**L9 76s   CCc                 z   | j                  | j                        }|j                  d       d|_        | j	                  |j                  d       | j                  t        j                        5  | j                  j                  |       d d d        | j	                  |j                  d       y # 1 sw Y   &xY w)Nrs   r   zmy new message)	rc   rL   r0   r   rg   r   r
   r   r   rz   s     r   !test_future_cancel_message_setterz1BaseFutureTests.test_future_cancel_message_setter   s    $)),	,**,<= w556II((+ 7**,<= 76s   0B11B:c                    | j                  | j                        }| j                  |j                                | j                  |j	                                | j                  |j                                | j                  t        j                  |j                         | j                  t        j                  |j                         | j                  t        j                  |j                  d        | j                  t        j                  |j                  d        | j                  |j                                y ry   )rc   rL   rC   r0   r2   r.   r   r
   r   r8   r:   r   r=   r?   r7   rz   s     r   test_cancelzBaseFutureTests.test_cancel  s    $)),
#&!'00!((;'00!++>'33Q\\4H'33Q__dK$r   c                    | j                  | j                        }| j                  t        j                  |j
                         |j                  d       | j                  |j                                | j                  |j                                | j                  |j                         d       | j                  |j                         d        | j                  t        j                  |j                  d        | j                  t        j                  |j                  d        | j                  |j                                y Nrs   r   )rc   rL   r   r
   r   r8   r=   r7   r2   rC   r.   rg   r:   r?   r0   rz   s     r   test_resultzBaseFutureTests.test_result  s    $)),'33QXX>	R'!R(-'33Q\\4H'33Q__dK$r   c                    t               }| j                  | j                        }| j                  t        j
                  |j                         |j                  |       | j                  |j                                | j                  |j                                | j                  t         |j                         | j                  |j                         |       | j                  t        j
                  |j                  d        | j                  t        j
                  |j                  d        | j                  |j                                y ry   )r   rc   rL   r   r
   r   r:   r?   r7   r2   rC   r.   r8   rg   r=   r0   )r$   excr   s      r   test_exceptionzBaseFutureTests.test_exception  s    n$)),'33Q[[A	'!,1,'33Q\\4H'33Q__dK$r   c                     |       }| j                  | j                        }|j                  |       | j                  |j	                                | j                  |j                                | j                  t        |j                         |j                         }|j                  }| j                  |t               | j                  t        |      d       | j                  ||       y )Nrs   z!StopIteration .* cannot be raised)rc   rL   r?   r7   r2   rC   r.   r   r   r8   r:   	__cause__ri   assertRegexrf   )r$   stop_iteration_classr   r   causes        r   test_stop_iteration_exceptionz-BaseFutureTests.test_stop_iteration_exception-  s    "$$)),	'!,1kkmc<0S#FGe%9:r   c                 D     G d dt               }| j                  |       y )Nc                       e Zd Zy)OBaseFutureTests.test_stop_iteration_subclass_exception.<locals>.MyStopIterationNr   r   r   r   MyStopIterationr   ;      r   r   )StopIterationr   )r$   r   s     r   &test_stop_iteration_subclass_exceptionz6BaseFutureTests.test_stop_iteration_subclass_exception:  s    	m 	 	**?;r   c                     | j                  | j                        }|j                  t               | j	                  |j                         t               y ry   )rc   rL   r?   r   ri   r:   rz   s     r   test_exception_classz$BaseFutureTests.test_exception_class@  s;    $)),	%akkm\:r   c                 P   | j                  | j                        fd} |       }| j                  t        |      d       | j                  t        |             j	                  d       | j                  t        |      d       | j                  t        |      d       y )Nrs   c               3   ^   K   d E d {   } d| f E d {   }d|f y 7 7 w)NABCr   )xyr   s     r   fixturez6BaseFutureTests.test_yield_from_twice.<locals>.fixtureH  s5     IAq&LAq&L s   
-)-+--r   r   )r   r   )r   r   )rc   rL   rg   nextr=   )r$   r   rU   r   s      @r   test_yield_from_twicez%BaseFutureTests.test_yield_from_twiceE  s    $)),	 Ia#&a!$	Ra),a),r   c           
      x	   | j                   j                  d       | j                  | j                         }|j                  d   }| j	                  t        |      d| j                  j                   d|d    d|d    d	       |j                          | j                   j                  d
       | j                  | j                         }| j	                  t        |      d| j                  j                   d       |j                          | j                  | j                         }|j                          | j	                  t        |      d| j                  j                   d       | j                  | j                         }|j                  d       | j	                  t        |      d| j                  j                   d       | j	                  |j                         d       t               }| j                  | j                         }|j                  |       | j	                  t        |      d| j                  j                   d       | j                  |j                         |       d }| j                  | j                         }	|	j                  t                 |t               }
| j#                  t        |	      d| j                  j                  z   d|
z  z          |	j                          | j	                  t        |	      d| j                  j                   d       | j                  | j                         }|j                  t$               |j                  t&                |t$              } |t&              }| j#                  t        |      d| j                  j                  z   d|d|dz          | j                  | j                         }|j                  t$               t)        d      D ]  }|j                  t                 |j                  t&               |d|}| j#                  t        |      d| j                  j                  z   d|z  z          |j                          | j	                  t        |      d| j                  j                   d       y )NTrs   <z pending created at r   :rr   >Fz	 pending>z cancelled>   z finished result=4>z# finished exception=RuntimeError()>c                     t        j                  |       \  }}| j                  d|d|}t        j                  |      S )Nz() at r   )
test_utilsget_function_sourcer   reescape)funcfilenamelinenotexts       r   	func_reprz3BaseFutureTests.test_future_repr.<locals>.func_reprw  s7    )==dCHf&*&7&76JD99T?"r   z pending cb=\[%s\]>z pending cb=\[z, z\]>   z, <8 more>, )rL   	set_debugrc   _source_tracebackrg   r   r_   r   r0   r=   r8   r   r?   rS   r:   r   r   r   r   r   range)r$   f_pending_debugframe	f_pendingf_cancelledf_resultr   f_exceptionr   f_one_callbacks	fake_reprf_two_callbacks
first_repr	last_reprf_many_callbacksicb_regexs                    r   test_future_reprz BaseFutureTests.test_future_reprW  s   		D!**		*:11"5!!!""6uQxj%(1M	O 	 		E"$$$))$4	iAdhh.?.?-@	*JK&&DII&6k*a0A0A/B+,NO###3ANa 1 122EF	H*A.n&&DII&6!!#&!!""EF	H 	k++-s3	#
 **		*:)))4i(	!488$$$'=	'II	K 	 o.TXX../{;	= **		*:))(3))'2x(
g&	o. 1 11&	53 3	4  +++;**84qA..y9 **73*4i@!"488$$$'='HH	J 	!./TXX../{;	=r   c                 D   ddl m} | j                  | j                        }|j	                  d       | j                  | j                        } |||       | j                  |j                                | j                  |j                         d       | j                  | j                        }|j                  t                      | j                  | j                        } |||       | j                  |j                                | j                  t        |j                         | j                  | j                        }|j                          | j                  | j                        } |||       | j                  |j                                y )Nr   )_copy_future_staters   
   )asyncio.futuresr   rc   rL   r=   rC   r.   rg   r8   r?   r   r   r0   r2   )r$   r   r   newfr   newf_exceptionr   newf_cancelleds           r   test_copy_statezBaseFutureTests.test_copy_state  s=   6$)),	RTYY/1d#		$+&&DII&6!!,.1))tyy)9;7++-.,(=(=>&&DII&6))tyy)9;70023r   c                     | j                  | j                        fdfd}| j                  t        d      5   |        d d d        j	                          y # 1 sw Y   xY w)Nrs   c               3   &   K    E d {    y 7 wr	   r   r   s   r   coroz'BaseFutureTests.test_iter.<locals>.coro  s     NNs   c                              \  } }y r	   r   )arg1arg2r   s     r   r   z'BaseFutureTests.test_iter.<locals>.test  s    JD$r   zawait wasn't used)rc   rL   r~   r   r0   )r$   r   r   r   s     @@r   	test_iterzBaseFutureTests.test_iter  sU    DII.		  ##L2EFF G

 GFs   A  A)c                     | j                  | j                        }| j                  t        d      5  d|_        d d d        y # 1 sw Y   y xY w)Nrs   zcan only be set to FalseT)rc   rL   r~   
ValueError_log_tracebackr   s     r   test_log_tracebackz"BaseFutureTests.test_log_traceback  s?    DII.##J0JK!%C LKKs   AAzasyncio.base_events.loggerc                     | j                  | j                        }~| j                  |j                  j                         y ry   )rc   rL   r7   errorcalledr$   m_logr   s      r   test_tb_logger_abandonedz(BaseFutureTests.test_tb_logger_abandoned  s4    DII.++,r   c                     | j                  | j                        }|j                  t                      |j	                          ~| j                  |j                  j                         y ry   )rc   rL   r?   r   r0   r7   r  r  r  s      r   &test_tb_logger_not_called_after_cancelz6BaseFutureTests.test_tb_logger_not_called_after_cancel  sM    DII.)+&

++,r   c                     | j                  | j                        }|j                  d       ~| j                  |j                  j
                         y r   )rc   rL   r=   r7   r  r  r  s      r   !test_tb_logger_result_unretrievedz1BaseFutureTests.test_tb_logger_result_unretrieved  s@    DII.r++,r   c                     | j                  | j                        }|j                  d       |j                          ~| j	                  |j
                  j                         y r   )rc   rL   r=   r8   r7   r  r  r  s      r   test_tb_logger_result_retrievedz/BaseFutureTests.test_tb_logger_result_retrieved  sI    DII.r

++,r   c                 "   | j                  | j                        }|j                  t        d             ~t	        j
                  | j                         t        j                          | j                  |j                  j                         y Nrs   boom)rc   rL   r?   r   r   run_brieflyr   
gc_collectrC   r  r  r  s      r   $test_tb_logger_exception_unretrievedz4BaseFutureTests.test_tb_logger_exception_unretrieved  sc    DII.,v./tyy)**+r   c                     | j                  | j                        }|j                  t        d             |j	                          ~| j                  |j                  j                         y r  )rc   rL   r?   r   r:   r7   r  r  r  s      r   "test_tb_logger_exception_retrievedz2BaseFutureTests.test_tb_logger_exception_retrieved  sP    DII.,v./++,r   c                     | j                  | j                        }|j                  t        d             | j	                  t        |j
                         ~| j                  |j                  j                         y r  )	rc   rL   r?   r   r   r8   r7   r  r  r  s      r   )test_tb_logger_exception_result_retrievedz9BaseFutureTests.test_tb_logger_exception_result_retrieved  s[    DII.,v./,

3++,r   c                    d }t         j                  j                  d      }|j                  |d      }t	        j
                  || j                        }| j                  j                  |      \  }}| j                  t	        j                  |             | j                  |d       | j                  |t        j                                |j                  d       y )Nc                 .    | t        j                         fS r	   	threading	get_identargs    r   runz-BaseFutureTests.test_wrap_future.<locals>.run       ,,.//r   rr   oirs   Twait)
concurrentr   ThreadPoolExecutorsubmitr
   rR   rL   r   rC   rt   rg   assertNotEqualr  r  shutdown)r$   r  exf1f2residents          r   rV   z BaseFutureTests.test_wrap_future  s    	02215YYsD!  $))4YY11"5
U((,-d#E9#6#6#89
r   c                     | j                  | j                        }t        j                  |      }| j	                  ||       y ry   )rc   rL   r
   rR   rS   r$   r(  r)  s      r   test_wrap_future_futurez'BaseFutureTests.test_wrap_future_future  s7    499-  $b"r   c                    d }t         j                  j                  d      }|j                  |d      }| j	                  t
        d      5  t        j                  |       d d d        |j                  d       y # 1 sw Y   xY w)Nc                 .    | t        j                         fS r	   r  r  s    r   r  z:BaseFutureTests.test_wrap_future_without_loop.<locals>.run  r  r   rr   r  r}   Tr   )	r"  r   r#  r$  r~   r   r
   rR   r&  )r$   r  r'  r(  s       r   test_wrap_future_without_loopz-BaseFutureTests.test_wrap_future_without_loop  sj    	02215YYsD!##L2IJ# K
 KJs   A<<Bc                 (   d }t         j                  j                  d      }|j                  |d      fd}| j                  j                   |             }| j                  | j                  |j                         |j                  d       y )Nc                 .    | t        j                         fS r	   r  r  s    r   r  z>BaseFutureTests.test_wrap_future_use_running_loop.<locals>.run  r  r   rr   r  c                  6   K   t        j                         S wr	   )r
   rR   )r(  s   r   r   z?BaseFutureTests.test_wrap_future_use_running_loop.<locals>.test  s     &&r**s   Tr   )	r"  r   r#  r$  rL   r   rS   r   r&  )r$   r  r'  r   r)  r(  s        @r   !test_wrap_future_use_running_loopz1BaseFutureTests.test_wrap_future_use_running_loop  sm    	02215YYsD!	+YY))$&1dii*
r   c                    t        j                  | j                         | j                  t         j                  d        d }t        j
                  j                  d      }|j                  |d      }t        j                  |      }| j                  | j                  |j                         |j                  d       y )Nc                 .    | t        j                         fS r	   r  r  s    r   r  z=BaseFutureTests.test_wrap_future_use_global_loop.<locals>.run(  r  r   rr   r  Tr   )r
   r   rL   rM   r"  r   r#  r$  rR   rS   r   r&  )r$   r  r'  r(  r)  s        r    test_wrap_future_use_global_loopz0BaseFutureTests.test_wrap_future_use_global_loop$  s    tyy)..5	02215YYsD!  $dii*
r   c                 \   t         j                  j                         }t        j                  || j
                        }|j                          t        j                  | j
                         | j                  |j                                | j                  |j                                y ry   )r"  r   Futurer
   rR   rL   r0   r   r  rC   r2   r-  s      r   test_wrap_future_cancelz'BaseFutureTests.test_wrap_future_cancel0  sk    &&(  $))4
		tyy)''r   c                    t         j                  j                         }t        j                  || j
                        }|j                  d       |j                          t        j                  | j
                         | j                  |j                                | j                  |j                         d       | j                  |j                                y r   )r"  r   r:  r
   rR   rL   r=   r0   r   r  r7   r2   rg   r8   rC   r-  s      r   test_wrap_future_cancel2z(BaseFutureTests.test_wrap_future_cancel28  s    &&(  $))4
b
		tyy)(b)'r   c                 F   | j                   j                  d       | j                  | j                         }t        j                         j
                  dz
  }| j                  |j                  t               | j                  |j                  d   d d t        |df       y )NTrs   rr      test_future_source_traceback)rL   r   rc   sys	_getframef_linenori   r   listrg   __file__)r$   rj   r   s      r   rA  z,BaseFutureTests.test_future_source_tracebackB  s    		D!!!tyy!1))A-f66=11"5bq9" 8:	;r   c                 l   | j                   j                  |       d } |       }| j                  | j                         }|j                  |       d }t	        j
                  | j                          t        j                          d| j                  j                   d}t        |      ||j                  f}|j                  j                  t        j                  |       |j                  j                   d   d   }| j#                  |t%        j&                  |t$        j(                               y )Nc                  H    	 t               # t        $ r} | cY d } ~ S d } ~ ww xY wr	   )MemoryErrorBaseException)r   s    r   memory_errorzLBaseFutureTests.check_future_exception_never_retrieved.<locals>.memory_errorQ  s$    !m#  
s   
 	!!!rs   ^z exception was never retrieved
)exc_infor   )rL   r   rc   r?   r   r  r   r  r_   r   rv   __traceback__r  assert_called_once_withr   ANY	call_argsr   r   compileDOTALL)	r$   debugr  rK  r   rj   regexrM  messages	            r   &check_future_exception_never_retrievedz6BaseFutureTests.check_future_exception_never_retrievedM  s    		E"	
 n!!tyy!1S!tyy)DHH%%&&FGIsC$5$56++DHHx+H++''*1-"**UBII">?r   c                 &    | j                  d       y r"   rW  r#   s    r   %test_future_exception_never_retrievedz5BaseFutureTests.test_future_exception_never_retrievede  s    33E:r   c                 &    | j                  d       y rA   rY  r#   s    r   +test_future_exception_never_retrieved_debugz;BaseFutureTests.test_future_exception_never_retrieved_debugh  s    33D9r   c                     | j                  | j                        }|j                          t        j                  |d       | j                  |j                                y )Nrs      )rc   rL   r0   r   _set_result_unless_cancelledrC   r2   r   s     r    test_set_result_unless_cancelledz0BaseFutureTests.test_set_result_unless_cancelledk  sD    DII.

,,S!4(r   c                 6   | j                  | j                        }|j                  d       |j                         }d }	 |j	                  d        | j                  d       | j                  |d       y # t        $ r}|j                  d   }Y d }~0d }~ww xY w)Nrs   )rr   r^  zStopIteration was expectedr   )	rc   rL   r=   rD   sendfailr   ra   rg   )r$   r   fir8   r'  s        r   test_future_stop_iteration_argsz/BaseFutureTests.test_future_stop_iteration_argsq  s    DII.v\\^	4GGDM II23(	  	 WWQZF	 s   A6 6	B?BBc           	         | j                  | j                        }t        |      }| j                  t              5  | j                  t        |j                  t        t        d      d        d d d        t        j                         5  t        j                  dt               | j                  t        |j                  t        t        d      d       | j                  t        |j                  t        d      t        d             | j                  t        |j                  t        d d        d d d        | j                  t        |j                  t               y # 1 sw Y   xY w# 1 sw Y   ;xY w)Nrs   zebraignore)categoryelephant    )rc   rL   r   assertWarnsDeprecationWarningr   r   throwwarningscatch_warningsfilterwarningsr   r   rE  )r$   r   rd  s      r   test_future_iter_throwz&BaseFutureTests.test_future_iter_throw~  s   DII.#Y01i9i>PRVW 2$$&##H7IJi%y'<bBi%j19Z3HJ j"((JdK ' 	)RXXt4 21&&s   1E
B'E+E(+E4c                      G d d      }t        d      D ]4  }| j                  | j                        }|j                   |              6 y )Nc                       e Zd Zd Zy)5BaseFutureTests.test_future_del_collect.<locals>.Evilc                 ,    t        j                          y r	   )gccollectr#   s    r   r*   z=BaseFutureTests.test_future_del_collect.<locals>.Evil.__del__  s    

r   N)r   r   r   r*   r   r   r   Evilru    s    r   ry  d   rs   )r   rc   rL   r=   )r$   ry  r   r   s       r   test_future_del_collectz'BaseFutureTests.test_future_del_collect  sA    	 	 sA""		"2CNN46" r   c                 2   | j                  | j                        }|j                          d }	 |j                          | j                  |       | j                  t        j                  |      g        y # t        j
                  $ r}|}Y d }~Qd }~ww xY wry   )
rc   rL   r0   r8   r
   r   r<   assertListEqualrw  get_referrersr$   r   r   es       r   &test_future_cancelled_result_refcyclesz6BaseFutureTests.test_future_cancelled_result_refcycles  s}    $)),	
	HHJ 	S!R--c2B7 %% 	C	   A7 7B
BBc                 2   | j                  | j                        }|j                          d }	 |j                          | j                  |       | j                  t        j                  |      g        y # t        j
                  $ r}|}Y d }~Qd }~ww xY wry   )
rc   rL   r0   r:   r
   r   r<   r}  rw  r~  r  s       r   )test_future_cancelled_exception_refcyclesz9BaseFutureTests.test_future_cancelled_exception_refcycles  s}    $)),	
	KKM 	S!R--c2B7 %% 	C	r  )6r   r   r   rc   rJ   rk   rw   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   patchr  r  r	  r  r  r  r  rV   r.  r1  r5  r8  r;  r=  rA  rW  rZ  r\  r`  re  rr  r{  r  r  rZ   r[   s   @r   r]   r]   z   s   ))
4
.'//;2%h:	>	%%% BO ;<;
-$C=J44&
 TZZ,-- .-
 TZZ,-- .- TZZ,-- .- TZZ,-- .- TZZ,-, ., TZZ,-- .- TZZ,-- .-
	
((	; TZZ,-@ .@.;:))5#	8	8r   r]   _CFuturezrequires the C _asyncio modulec                   R    e Zd Z	 ej                  Zd Zd Zd Z	y# e$ r dZY w xY w)CFutureTestsNc                     | j                  | j                        }| j                  t              5  |`d d d        | j                  t              5  |`d d d        y # 1 sw Y   *xY w# 1 sw Y   y xY wry   )rc   rL   r   r   rB   r   r   s     r   test_future_del_segfaultz%CFutureTests.test_future_del_segfault  s^    DII.~., /~." /. /...s   AA*A'*A3c                     dd l }t        | j                  | j                              }~t	        j
                  |      }t	        j                          y )Nr   rs   )_asyncior   rc   rL   rw  get_referentsrx  )r$   r  itevils       r   'test_future_iter_get_referents_segfaultz4CFutureTests.test_future_iter_get_referents_segfault  s=    $""		"23)


r   c                    | j                  | j                        }d }d }|j                  |       |j                  |       |j                  }| j	                  ||j                         |j                  |       |j                  }| j	                  ||j                         |j                  |       | j                  |j                         y )Nrs   c                      y)Nrr   r   _s    r   r   z2CFutureTests.test_callbacks_copy.<locals>.<lambda>      qr   c                      y)Nr^  r   r  s    r   r   z2CFutureTests.test_callbacks_copy.<locals>.<lambda>  r  r   )rc   rL   r   
_callbacksassertIsNotr   assertIsNone)r$   r   r(  r)  	callbackss        r   test_callbacks_copyz CFutureTests.test_callbacks_copy  s    
 DII.b!b!NN	CNN3  $NN	CNN3  $#..)r   )
r   r   r   r   r  r_   r   r  r  r  r   r   r   r  r    s7    #*%  s    &&r  c                   V    e Zd Z	  G d dej                        ZeZy# e$ r dZY yw xY w)CSubFutureTestsc                       e Zd Zy)CSubFutureTests.CSubFutureNr   r   r   r   
CSubFuturer    r   r   r  N)r   r   r   r   r  r  r_   r   r   r   r   r  r    s4    	)) 	  s    ((r  c                   $    e Zd Zej                  Zy)PyFutureTestsN)r   r   r   r   	_PyFuturer_   r   r   r   r  r    s    


Cr   r  c                        e Zd Z fdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Z xZS )BaseFutureDoneCallbackTestsc                 L    t         |           | j                         | _        y r	   )rI   rJ   rK   rL   rN   s    r   rJ   z!BaseFutureDoneCallbackTests.setUp  s    &&(	r   c                 B    t        j                  | j                         y r	   )r   r  rL   r#   s    r   r  z'BaseFutureDoneCallbackTests.run_briefly  s    tyy)r   c                     fd}|S )Nc                 (    j                         y r	   )append)rj   bagthings    r   bag_appenderz@BaseFutureDoneCallbackTests._make_callback.<locals>.bag_appender  s    JJur   r   )r$   r  r  r  s    `` r   _make_callbackz*BaseFutureDoneCallbackTests._make_callback  s    	r   c                     t         r	   NotImplementedErrorr#   s    r   rc   z'BaseFutureDoneCallbackTests._new_future      !!r   c                    g }| j                         }| j                  |d      }| j                  |d      }| j                  |d      }|j                  |       |j                  |       |j                  |       |j                  |       |j                  |       | j	                  |g        |j                  d       | j                          | j	                  |ddg       | j	                  |j                         d       y Nr      rz  foorc   r  r   r   rg   r=   r  r8   r$   r  r   cb1cb2cb3s         r   $test_callbacks_remove_first_callbackz@BaseFutureDoneCallbackTests.test_callbacks_remove_first_callback  s    !!#r*!!#r*!!#s+	C 	C 	C 	s#	s#b!	Ur3i(U+r   c                 ,   g }| j                         }| j                  |d      }| j                  |d      }| j                  |d      }|j                  |       |j                  |       |j                  |       |j                  |       |j                  |       |j                  |       | j	                  |g        |j                  d       | j                          | j	                  |dg       | j	                  |j                         d       y r  r  r  s         r   /test_callbacks_remove_first_and_second_callbackzKBaseFutureDoneCallbackTests.test_callbacks_remove_first_and_second_callback  s    !!#r*!!#r*!!#s+	C 	C 	C 	s#	s#	s#b!	Use$U+r   c                    g }| j                         }| j                  |d      }| j                  |d      }| j                  |d      }|j                  |       |j                  |       |j                  |       |j                  |       |j                  |       | j	                  |g        |j                  d       | j                          | j	                  |ddg       | j	                  |j                         d       y r  r  r  s         r   $test_callbacks_remove_third_callbackz@BaseFutureDoneCallbackTests.test_callbacks_remove_third_callback(  s    !!#r*!!#r*!!#s+	C 	C 	C 	s#	s#b!	Ur2h'U+r   c                 z   g }| j                         }|j                  | j                  |d             |j                  | j                  |d             | j                  |g        |j	                  d       | j                          | j                  |ddg       | j                  |j                         d       y )Nr   r  r  )rc   r   r  rg   r=   r  r8   )r$   r  r   s      r   $test_callbacks_invoked_on_set_resultz@BaseFutureDoneCallbackTests.test_callbacks_invoked_on_set_result?  s    	D//R89	D//R89b!	Ur2h'U+r   c                 J   g }| j                         }|j                  | j                  |d             | j                  |g        t	               }|j                  |       | j                          | j                  |dg       | j                  |j                         |       y )Nrz  )rc   r   r  rg   r   r?   r  r:   )r$   r  r   r   s       r   'test_callbacks_invoked_on_set_exceptionzCBaseFutureDoneCallbackTests.test_callbacks_invoked_on_set_exceptionM  s    	D//S9:b!n	se$,r   c                    g }| j                         }| j                  |d      }| j                  |d      }| j                  |d      }|j                  |       |j                  |       | j                  |j	                  |      d       | j                  |j	                  |      d       |j                  |       t        d      D ]  }|j                  |        | j                  |j	                  |      d       | j                  |g        |j                  d       | j                          | j                  |dg       | j                  |j                         d       y )Nrr   r^  r@  r         r  )	rc   r  r   rg   r   r   r=   r  r8   )r$   r  r   r  r  r  r   s          r   test_remove_done_callbackz5BaseFutureDoneCallbackTests.test_remove_done_callback[  s<   !!#q)!!#q)!!#q) 	
C 	C  	//4a8 	//4a8 	
C qA$  	//4a8b!	Uqc"U+r   c                     | j                         j                  t               t        d      D ]  }j                  t                 G fdd      }j                   |              y )N?   c                       e Zd Z fdZy)RBaseFutureDoneCallbackTests.test_remove_done_callbacks_list_mutation.<locals>.evilc                 0    j                  t               yr"   )r   idr$   otherr   s     r   __eq__zYBaseFutureDoneCallbackTests.test_remove_done_callbacks_list_mutation.<locals>.evil.__eq__  s    ((,r   Nr   r   r   r  r   s   r   r  r    s    r   r  rc   r   rf   r   r  r   r$   r  r  r   s      @r   (test_remove_done_callbacks_list_mutationzDBaseFutureDoneCallbackTests.test_remove_done_callbacks_list_mutation|  sY      c"rA!!"% 	 	
 	  (r   c                     | j                         j                  t               t        d      D ]  }j                  t                 G fdd      }j                   |              y )Nr  c                       e Zd Z fdZy)OBaseFutureDoneCallbackTests.test_remove_done_callbacks_list_clear.<locals>.evilc                 (    j                  |       y r	   )r   r  s     r   r  zVBaseFutureDoneCallbackTests.test_remove_done_callbacks_list_clear.<locals>.evil.__eq__  s    ((/r   Nr  r   s   r   r  r    s    0r   r  r  r  s      @r   %test_remove_done_callbacks_list_clearzABaseFutureDoneCallbackTests.test_remove_done_callbacks_list_clear  sY      c"rA!!"% 	0 	0 	  (r   c                     d }| j                         }|j                  |       |j                  t               |j                  t               |j                  d       t	        j
                  | j                         y )Nc                 .    | j                  t               y r	   )r   rf   r   s    r   mutzPBaseFutureDoneCallbackTests.test_schedule_callbacks_list_mutation_1.<locals>.mut  s    ""3'r   rr   )rc   r   rf   r=   r   r  rL   )r$   r  r   s      r   'test_schedule_callbacks_list_mutation_1zCBaseFutureDoneCallbackTests.test_schedule_callbacks_list_mutation_1  s_    	(  c"c"c"qtyy)r   c                     | j                         j                  t               t        d      D ]  }j                  t                dd G fdd      }j                   |              y )Nr  rz  r   c                       e Zd Z fdZy)QBaseFutureDoneCallbackTests.test_schedule_callbacks_list_mutation_2.<locals>.evilc                 D    dz  k  rj                  t               y)Nrr   F)r   r  )r$   r  	extra_cbsr   max_extra_cbss     r   r  zXBaseFutureDoneCallbackTests.test_schedule_callbacks_list_mutation_2.<locals>.evil.__eq__  s%    Q	},))"-r   Nr  )r  r   r  s   r   r  r    s    r   r  r  )r$   r  r  r  r   r  s      @@@r   'test_schedule_callbacks_list_mutation_2zCBaseFutureDoneCallbackTests.test_schedule_callbacks_list_mutation_2  se      c"rA!!"%  		 	 	  (r   c                    dd fd}t               }||_        t        j                  j	                  | d|      5  | j                         | j                  j                         |       j                  t               j                  t               j                         j                         j                  d       | j                  j                  d g f       d d d        y # 1 sw Y   y xY w)NFc                       yN.r   r   r   r   r   zOBaseFutureDoneCallbackTests.test_evil_call_soon_list_mutation.<locals>.<lambda>  s    cr   c                  \    r'j                  t               j                         y dy rA   )r   int)ra   rb   called_on_fut_callback0r   pads     r   evil_call_soonzUBaseFutureDoneCallbackTests.test_evil_call_soon_list_mutation.<locals>.evil_call_soon  s*    & ((-((-*.'r   rL   r  )r    	call_soonr   r  objectrc   rS   r   r   rf   r  r=   assertInr  )r$   r  fake_event_loopr  r   r  s      @@@r   !test_evil_call_soon_list_mutationz=BaseFutureDoneCallbackTests.test_evil_call_soon_list_mutation  s    "'	/ ./$2!ZZtV_=""$CMM#,,./:!!#&!!#&!!#&!!#&NN6" MM#..4*5 >==s   B,C77D c                     | j                          G d d      } G fdd|      }j                   |              j                   |              y )Nc                       e Zd Zd Zy)aBaseFutureDoneCallbackTests.test_use_after_free_on_fut_callback_0_with_evil__eq__.<locals>.cb_padc                      yrA   r   )r$   r  s     r   r  zhBaseFutureDoneCallbackTests.test_use_after_free_on_fut_callback_0_with_evil__eq__.<locals>.cb_pad.__eq__  s    r   Nr  r   r   r   cb_padr    s    r   r  c                       e Zd Z fdZy)_BaseFutureDoneCallbackTests.test_use_after_free_on_fut_callback_0_with_evil__eq__.<locals>.evilc                 2    j                  d        t        S r	   )r   NotImplementedr  s     r   r  zfBaseFutureDoneCallbackTests.test_use_after_free_on_fut_callback_0_with_evil__eq__.<locals>.evil.__eq__  s    ((.%%r   Nr  r   s   r   r  r    s    &r   r  )rc   r   r   )r$   r  r  r   s      @r   5test_use_after_free_on_fut_callback_0_with_evil__eq__zQBaseFutureDoneCallbackTests.test_use_after_free_on_fut_callback_0_with_evil__eq__  sK      	 		&6 	&
 	fh'  (r   c                 p    G fddt               } |       }t        j                  j                  | d|      5  | j	                         | j                  j                         |       d j                         | j                  t        j                  d       d d d        y # 1 sw Y   y xY w)Nc                   ,     e Zd Z fdZfdZ xZS )rBaseFutureDoneCallbackTests.test_use_after_free_on_fut_callback_0_with_evil__getattribute__.<locals>.EvilEventLoopc                 .    t        |   |i | t        r	   rI   r  r   r$   ra   rb   rO   s      r   r  z|BaseFutureDoneCallbackTests.test_use_after_free_on_fut_callback_0_with_evil__getattribute__.<locals>.EvilEventLoop.call_soon      !4262##r   c                 ^    |dk(  rj                         t        j                  | |      S )Nr  )r   r  __getattribute__)r$   namer   fut_callback_0s     r   r  zBaseFutureDoneCallbackTests.test_use_after_free_on_fut_callback_0_with_evil__getattribute__.<locals>.EvilEventLoop.__getattribute__  s/    ;&,,^<&..tT::r   r   r   r   r  r  rZ   )rO   r   r  s   @r   EvilEventLoopr    s    $; ;r   r	  rL   c                       yr  r   r   r   r   r   zmBaseFutureDoneCallbackTests.test_use_after_free_on_fut_callback_0_with_evil__getattribute__.<locals>.<lambda>  s    Sr   r  )r    r   r  r  rc   rS   r   r   r   r   r=   )r$   r	  	evil_loopr   r  s      @@r   ?test_use_after_free_on_fut_callback_0_with_evil__getattribute__z[BaseFutureDoneCallbackTests.test_use_after_free_on_fut_callback_0_with_evil__getattribute__  s    
	;/ 
	; "O	ZZtVY7""$CMM#,,.)4(N!!.1mS^^VD 877s   A&B,,B5c                     G fddt               } |       }t        j                  j                  | d|      5  | j	                         | j                  j                         |       t        j                         }t        j                         }j                  ||       ~~| j                  t        j                  d       d d d        y # 1 sw Y   y xY w)Nc                   *     e Zd Z fdZfdZ xZS )qBaseFutureDoneCallbackTests.test_use_after_free_on_fut_context_0_with_evil__getattribute__.<locals>.EvilEventLoopc                 .    t        |   |i | t        r	   r  r  s      r   r  z{BaseFutureDoneCallbackTests.test_use_after_free_on_fut_context_0_with_evil__getattribute__.<locals>.EvilEventLoop.call_soon  r  r   c                 n    |dk(  rj                  t                      t        j                  | |      S )Nr  rs   )rp   r    r  r  )r$   r  r   s     r   r  zBaseFutureDoneCallbackTests.test_use_after_free_on_fut_context_0_with_evil__getattribute__.<locals>.EvilEventLoop.__getattribute__  s0    ;&LL&9&;L<..tT::r   r  )rO   r   s   @r   r	  r    s    $; ;r   r	  rL   )contextr  )r    r   r  r  rc   rS   r   ru   r   r   r   r=   )r$   r	  r  r  fut_context_0r   s        @r   >test_use_after_free_on_fut_context_0_with_evil__getattribute__zZBaseFutureDoneCallbackTests.test_use_after_free_on_fut_context_0_with_evil__getattribute__	  s    		;/ 		; "O	ZZtVY7""$CMM#,,.)4!YY[N IIKM!!.-!HmS^^VD 877s   BCC)r   r   r   rJ   r  r  rc   r  r  r  r  r  r  r  r  r  r  r  r  r  r  rZ   r[   s   @r   r  r    sa    )*",.,0,.,-,B) )*),6B)$E0Er   r  c                       e Zd Zd Zy)CFutureDoneCallbackTestsc                 B    t        j                  | j                        S ry   r   r  rL   r#   s    r   rc   z$CFutureDoneCallbackTests._new_future)  s    TYY//r   Nr   r   r   rc   r   r   r   r  r  $  s    
0r   r  c                       e Zd Zd Zy)CSubFutureDoneCallbackTestsc                 Z     G d dt         j                        } || j                        S )Nc                       e Zd Zy);CSubFutureDoneCallbackTests._new_future.<locals>.CSubFutureNr   r   r   r   r  r  3  r   r   r  rs   r  )r$   r  s     r   rc   z'CSubFutureDoneCallbackTests._new_future2  s#    	)) 	tyy))r   Nr  r   r   r   r  r  -  s    
*r   r  c                       e Zd Zd Zy)PyFutureDoneCallbackTestsc                 B    t        j                  | j                        S ry   )r   r  rL   r#   s    r   rc   z%PyFutureDoneCallbackTests._new_future;  s      dii00r   Nr  r   r   r   r   r   8  s    1r   r   c                   *     e Zd Zd Z fdZd Z xZS )BaseFutureInheritanceTestsc                     t         r	   r  r#   s    r   _get_future_clsz*BaseFutureInheritanceTests._get_future_clsA  r  r   c                     t         |           | j                         | _        | j	                  | j                  j
                         y r	   rH   rN   s    r   rJ   z BaseFutureInheritanceTests.setUpD  rP   r   c                     | j                         } G d d|      } || j                        }| j                  t        d      5  |j	                          d d d        y # 1 sw Y   y xY w)Nc                       e Zd Zd Zy)QBaseFutureInheritanceTests.test_inherit_without_calling_super_init.<locals>.MyFutc                      y r	   r   r`   s      r   rp   zZBaseFutureInheritanceTests.test_inherit_without_calling_super_init.<locals>.MyFut.__init__N  s    r   N)r   r   r   rp   r   r   r   MyFutr)  M  s    r   r+  rs   z!Future object is not initialized.)r%  rL   r~   r   r   )r$   r_   r+  r   s       r   'test_inherit_without_calling_super_initzBBaseFutureInheritanceTests.test_inherit_without_calling_super_initI  s[    ""$	C 	
 ###/
 LLN	
 
 
s   AA()r   r   r   r%  rJ   r,  rZ   r[   s   @r   r#  r#  ?  s    ")
r   r#  c                       e Zd Zd Zy)PyFutureInheritanceTestsc                 "    t         j                  S r	   )r   r  r#   s    r   r%  z(PyFutureInheritanceTests._get_future_cls\  s       r   Nr   r   r   r%  r   r   r   r.  r.  Z  s    !r   r.  c                       e Zd Zd Zy)CFutureInheritanceTestsc                 "    t         j                  S r	   )r   r  r#   s    r   r%  z'CFutureInheritanceTests._get_future_clsd  s    r   Nr0  r   r   r   r2  r2  `  s     r   r2  __main__)-concurrent.futuresr"  rw  r   rB  r  unittestr   typesr   r
   r   ro  test.test_asyncior   r   r   r   r   r   r   r   r   r   base_eventsBaseEventLoopr    r,   TestCaserF   r]   
skipUnlessr   r  r  r  r  r  r  r   r#  r.  r2  r   mainr   r   r   <module>r>     s7     	 	 
        1 (		I 	'--;; 	0 0f
## $p8 p8f WWj157%*?J$7$7 %*7%*P WWj157oz':': 7OZ%8%8 zE zEz	 WWj1570:)22070 WWj157*"=","5"5*7*1 ; * 3 31 6!9)22! WWj157 8(11 7  zHMMO r   