o
    ºiÍ  ã                   @   sF  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 d dlm	Z	 d dl
mZmZ d dlmZ d dlmZ dd„ Zd	d
„ Zedv r`ejjjZejjjZejjjZejjjZejjjZejjjZdddddœZe edkd¡G dd„ de	ƒƒZe edkd¡G dd„ de	ƒƒZe edkd¡G dd„ de	ƒƒZe dkr¡e !¡  dS dS )é    N)ÚMockÚcall)ÚTestCase)ÚjitÚobjmode)Ú	PYVERSION)Ú_numba_unpicklec                 C   s
   d| _ | S )z4Decorator to enable sys.monitoring on the dispatcherT)Ú_enable_sysmon)Údisp© r   ú\/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/numba/tests/test_sys_monitoring.pyr	      s   r	   c                     s(   t tdƒdd„ ƒƒ‰ ‡ fdd„} ˆ | fS )Núint64(int64)c                 S   ó   | d S ©Né   r   ©Úxr   r   r   Úfoo   ó   zgenerate_usecase.<locals>.fooc                    s   dˆ | d ƒ S )Né   é   r   r   ©r   r   r   Úcall_foo   s   z"generate_usecase.<locals>.call_foo)r	   r   )r   r   r   r   Úgenerate_usecase   s
   r   )©é   é   )r   é   ÚDebuggerÚCoverageÚProfilerÚ	Optimizer)r   r   r   r   r   zneeds Python 3.12+c                   @   s®   e Zd Zdd„ Zdd„ Zdd„ Zd*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d„ Z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S )+ÚTestMonitoringc                 C   sŒ   g }t dƒD ]}tj |¡d ur| t| ¡ q|r'dd |¡› }|  |¡ tƒ \| _	| _
d| _| jd d | _d| j | _tjj| _d S )Né   zVCannot run monitoring tests when other monitors are active, found monitor(s) of type: z, é
   r   r   r   )ÚrangeÚsysÚ
monitoringÚget_toolÚappendÚTOOL2MONITORTYPEÚjoinÚskipTestr   r   r   ÚargÚ
foo_resultÚcall_foo_resultÚPROFILER_IDÚtool_id)ÚselfÚmonitor_kindsÚiÚmsgr   r   r   ÚsetUp7   s   €þ
zTestMonitoring.setUpc                 C   s`   |t  }|  |jd¡ dd„ t | j¡D ƒ}|d j}t| jj|ƒt| j	jdƒf}| 
|¡ d S )Nr   c                 S   s   g | ]	}|j d kr|‘qS )ÚRESUME)Úopname©Ú.0r   r   r   r   Ú
<listcomp>S   s    
ÿz7TestMonitoring.check_py_start_calls.<locals>.<listcomp>r   )ÚPY_STARTÚassertEqualÚ
call_countÚdisÚget_instructionsr   Úoffsetr   Ú__code__r   Úassert_has_calls)r2   ÚallcallsÚ	mockcallsÚinstrA   Úcallsr   r   r   Úcheck_py_start_callsM   s   
ÿz#TestMonitoring.check_py_start_callsc                 C   sd   |t  }|  |jd¡ dd„ t | j¡D ƒd j}t| jj	d| j
ƒt| jj	|| jƒg}| |¡ d S )Nr   c                 S   s   g | ]}|‘qS r   r   r9   r   r   r   r;   f   s    z8TestMonitoring.check_py_return_calls.<locals>.<listcomp>éÿÿÿÿr   )Ú	PY_RETURNr=   r>   r?   r@   r   rA   r   r   rB   r.   r/   rC   )r2   rD   rE   rA   rG   r   r   r   Úcheck_py_return_calls[   s   ÿz$TestMonitoring.check_py_return_callsNc           
      C   sâ   zU|d u r	| j }n|}tj |d¡ i }d}|D ]}tƒ }	tj |||	¡ |	||< ||O }qtj ||¡ ||Ž  W |D ]
}tj ||d ¡ q<tj |t¡ tj |¡ |S |D ]
}tj ||d ¡ qXtj |t¡ tj |¡ w )NÚcustom_monitorr   )	r1   r&   r'   Úuse_tool_idr   Úregister_callbackÚ
set_eventsÚ	NO_EVENTSÚfree_tool_id)
r2   ÚfunctionÚargsÚeventsr1   Ú_tool_idÚ	callbacksÚevent_bitmaskÚeventÚcallbackr   r   r   Úrun_with_eventsk   s.   

üzTestMonitoring.run_with_eventsc                 C   ó4   |   | j| jftf¡}|  t|ƒd¡ |  |¡ d S r   )rZ   r   r-   r<   r=   ÚlenrH   ©r2   Úcbr   r   r   Útest_start_event‡   ó   zTestMonitoring.test_start_eventc                 C   r[   r   )rZ   r   r-   rJ   r=   r\   rK   r]   r   r   r   Útest_return_eventŽ   r`   z TestMonitoring.test_return_eventc                 C   s@   |   | j| jfttf¡}|  t|ƒd¡ |  |¡ |  |¡ d S )Nr   )	rZ   r   r-   r<   rJ   r=   r\   rK   rH   r]   r   r   r   Útest_call_event_chain•   s   ÿ
z$TestMonitoring.test_call_event_chainc           	      C   s8  t dƒdd„ ƒ}zV| j}tj |d¡ i }d}ttf}|D ]}tƒ }tj |||¡ |||< ||O }qtj 	||j
|¡ || jƒ}W |D ]
}tj ||d ¡ qDtj 	||j
d¡ tj |¡ n|D ]
}tj ||d ¡ qatj 	||j
d¡ tj |¡ w |  || | j¡¡ |  t|ƒd¡ |t  ¡  |t  ¡  d S )Nr   c                 S   r   )Nr   r   r   r   r   r   r   ®   ó   zPTestMonitoring.test_instrumented_code_does_not_trigger_numba_events.<locals>.foorL   r   r   )r   r1   r&   r'   rM   r<   rJ   r   rN   Úset_local_eventsrB   r-   rQ   r=   Úpy_funcr\   Úassert_not_called)	r2   r   r1   rV   rW   rT   rX   rY   Úresultr   r   r   Ú4test_instrumented_code_does_not_trigger_numba_events¬   s:   

ÿýzCTestMonitoring.test_instrumented_code_does_not_trigger_numba_eventsc                 C   sÆ   dd„ }zF| j }tj |d¡ tj ||jt¡ tj |ttƒ ¡ t	|ƒ| j
ƒ}|  ||| j
ƒ¡ W tj |td ¡ tj ||jd¡ tj |¡ d S tj |td ¡ tj ||jd¡ tj |¡ w )Nc                 S   r   r   r   r   r   r   r   r   Ð   s   zBTestMonitoring.test_instrumented_code_can_be_compiled.<locals>.foorL   r   )r1   r&   r'   rM   rd   rB   r<   rN   r   r   r-   r=   rQ   )r2   r   r1   rg   r   r   r   Ú&test_instrumented_code_can_be_compiledÍ   s   þz5TestMonitoring.test_instrumented_code_can_be_compiledc                 C   sf   dd„ }t jjj}dd„ }||ƒ}|  |d|f¡}||  ¡  |tƒ}|  |d|f¡}||  ¡  d S )Nc                    s(   | dƒdd„ ƒ‰ | dƒ‡ fdd„ƒ}|S )Nzvoid()c                   s   s    dV  d S )Nr$   r   r   r   r   r   Úproducerã   s   €
zTTestMonitoring.test_unhandled_events_are_ignored.<locals>.generate.<locals>.producerzint64()c                     s   ˆ ƒ } t | ƒS ©N)Únext)Úp©rj   r   r   Úconsumerç   s   zTTestMonitoring.test_unhandled_events_are_ignored.<locals>.generate.<locals>.consumerr   )Údecro   r   rn   r   Úgenerateâ   s
   
zBTestMonitoring.test_unhandled_events_are_ignored.<locals>.generatec                 S   s   dd„ S )Nc                 S   s   | S rk   r   )Úfnr   r   r   Ú<lambda>ð   s    zTTestMonitoring.test_unhandled_events_are_ignored.<locals>.<lambda>.<locals>.<lambda>r   )Úsigr   r   r   rs   ð   s    zBTestMonitoring.test_unhandled_events_are_ignored.<locals>.<lambda>r   )r&   r'   rT   ÚPY_YIELDrZ   Úassert_called_oncer   rf   )r2   rq   rX   ÚwrapperÚpy_consumerÚpy_cbÚnb_consumerÚnb_cbr   r   r   Ú!test_unhandled_events_are_ignoredà   s   
z0TestMonitoring.test_unhandled_events_are_ignoredc              
   C   s®   zHt }| j}tj |d¡ tj ||¡ tj |¡}|  ||¡ |  | j	¡}tj |¡}|  ||¡ |  || j
¡ W tj |t¡ tj |¡ d S tj |t¡ tj |¡ w )NrL   )r<   r1   r&   r'   rM   rO   Ú
get_eventsr=   r   r-   r/   rP   rQ   )r2   rX   r1   Úactive_eventsrg   r   r   r   Ú test_event_with_no_callback_runsù   s   ÿz/TestMonitoring.test_event_with_no_callback_runsc                 C   s  t tjjd}zat}| j}tj |d¡ tj ||¡ tj |||¡ tj 	|¡}|  
||¡ |  | j¡}tj 	|¡}|  
||¡ |  
|| j¡ | ¡  W tj ¡  tj ||d ¡ tj |t¡ tj |¡ d S tj ¡  tj ||d ¡ tj |t¡ tj |¡ w )N)Úreturn_valuerL   )r   r&   r'   ÚDISABLEr<   r1   rM   rO   rN   r}   r=   r   r-   r/   Úassert_calledÚrestart_eventsrP   rQ   )r2   rY   rX   r1   r~   rg   r   r   r   Útest_disable_from_callback  s,   



ýz)TestMonitoring.test_disable_from_callbackc                    sî   z`| j ‰tj ˆd¡ t‰ tƒ }tj ˆˆ |¡ ‡ ‡fdd„‰ttdƒ‡fdd„ƒƒ}|dƒ | 	¡  |dƒ tj 
ˆt¡ | ¡  |  |jd	¡ W tj 
ˆt¡ tj ˆˆ d ¡ tj ˆ¡ d S tj 
ˆt¡ tj ˆˆ d ¡ tj ˆ¡ w )
NrL   c                    s   | rt j ˆˆ ¡ d S d S rk   )r&   r'   rO   )Úswitch_on_event)rX   r1   r   r   Úobjmode_enable_event>  s   ÿzGTestMonitoring.test_mutation_from_objmode.<locals>.objmode_enable_eventr   c                    s:   t  ˆ | ƒ W d   ƒ | d S 1 sw   Y  | d S )Né   )r   )Úenable)r†   r   r   r   B  s   

ÿþz6TestMonitoring.test_mutation_from_objmode.<locals>.foor   r   r   )r1   r&   r'   rM   rJ   r   rN   r	   r   rf   rO   rP   r‚   r=   r>   rQ   )r2   rY   r   r   )rX   r†   r1   r   Útest_mutation_from_objmode2  s,   þz)TestMonitoring.test_mutation_from_objmodec                 C   s  t jjtft jjtft jjtft jjttfi}i }zt| 	¡ D ]2\}}t j 
|d|› ¡ d}i }|||< |D ]}tƒ }|tkrGt j |||¡ |||< ||O }q6q| ¡ D ]	}t j ||¡ qU|  | j¡ W | 	¡ D ]"\}}|D ]}|tkr~t j ||d ¡ qpt j |t¡ t j |¡ qjn(| 	¡ D ]"\}}|D ]}|tkr¦t j ||d ¡ q˜t j |t¡ t j |¡ q’w |t jj }	|  t|	ƒd¡ |	t }| ¡  |t jj }
|  t|
ƒd¡ |  |
¡ |t jj }|  t|ƒd¡ |  |¡ |t jj }|  t|ƒd¡ |  |¡ |  |¡ d S )NÚcustom_monitor_r   r   r   )r&   r'   ÚDEBUGGER_IDrP   ÚCOVERAGE_IDr<   r0   rJ   ÚOPTIMIZER_IDÚitemsrM   r   rN   ÚkeysrO   r   r-   rQ   r=   r\   rf   rH   rK   )r2   Útool_ids_2_eventsÚall_callbacksr1   rT   rW   rV   rX   rY   Údbg_toolÚcov_toolÚ	prof_toolÚopt_toolr   r   r   Útest_multiple_tool_id\  sl   


ü
ÿ
ù	€ú€ú


z$TestMonitoring.test_multiple_tool_idc                    s¦  t ƒ }t ƒ }t ƒ }d‰ ttdƒ‡ fdd„ƒƒ}d }z| j}tj |d¡ tj |t|¡ tj |t	|¡ tj |t
|¡ tj |tt	B t
B ¡ z|ƒ  W n tya } z|}W Y d }~nd }~ww tj |t¡ | ¡  |jd }|  |jd tj¡ |  |jd d t¡ |  |jd d d ˆ ¡ | ¡  |jd }	|  |	jd tj¡ |  |	jd t¡ |jd }
|  |
jd |jj¡ |  |
jd t¡ |  ˆ t|
jd ƒ¡ | ¡  |jd }|  |jd |jj¡ |  |jd t¡ |  ˆ t|jd ƒ¡ W tj |t¡ tj |td ¡ tj |t	d ¡ tj |t
d ¡ tj |¡ n&tj |t¡ tj |td ¡ tj |t	d ¡ tj |t
d ¡ tj |¡ w |  ˆ t|ƒ¡ d S )	Núexception raisedú()c                      ó   t ˆ ƒ‚rk   )Ú
ValueErrorr   ©r5   r   r   r   ¨  r   z9TestMonitoring.test_raising_under_monitoring.<locals>.foorL   r   r   r   )r   r	   r   r1   r&   r'   rM   rN   rJ   ÚRAISEÚ	PY_UNWINDrO   rš   rP   rv   Úcall_args_listr=   rS   r   rB   r‚   ÚassertIsInstanceÚKeyErrorre   ÚassertInÚstrrQ   )r2   Úret_callbackÚraise_callbackÚunwind_callbackr   Ústore_raisedr1   ÚraisesÚthe_callÚnumba_unpickle_callÚfoo_callÚunwind_callr   r›   r   Útest_raising_under_monitoring  sn   
ÿ
€ÿ

ÿ

üz,TestMonitoring.test_raising_under_monitoringc                    sº  t ƒ }t ƒ }t ƒ }d‰ ttdƒ‡ fdd„ƒƒ}d }z| j}tj |d¡ tj |t|¡ tj |t	|¡ tj |t
|¡ tj |tt
B t	B ¡ z|ƒ  W n tya } z|}W Y d }~nd }~ww tj |t¡ | ¡  |jd }|  |jd tj¡ |  |jd d t¡ |  |jd d d ˆ ¡ | ¡  |  |jd	¡ |jd }	|  |	jd tj¡ |  |	jd t¡ |jd }
|  |
jd |jj¡ |  |
jd t¡ |  ˆ t|
jd ƒ¡ |jd }t ¡ j}|  |jd |¡ |  |jd t¡ |  ˆ t|jd ƒ¡ | ¡  W tj |t¡ tj |td ¡ tj |t
d ¡ tj |t	d ¡ tj |¡ n&tj |t¡ tj |td ¡ tj |t
d ¡ tj |t	d ¡ tj |¡ w |  ˆ t|ƒ¡ d S )
Nr—   r˜   c                      r™   rk   )ÚStopIterationr   r›   r   r   r   î  r   z@TestMonitoring.test_stop_iteration_under_monitoring.<locals>.foorL   r   r   r   r   )r   r	   r   r1   r&   r'   rM   rN   rJ   rœ   ÚSTOP_ITERATIONrO   r­   rP   rv   rž   r=   rS   r   rB   r‚   r>   rŸ   r    re   r¡   r¢   Ú	_getframeÚf_coderf   rQ   )r2   Úreturn_callbackr¤   Ústopiter_callbackr   r¦   r1   r§   r¨   r©   rª   Ú	meth_callÚtest_method_coder   r›   r   Ú$test_stop_iteration_under_monitoringà  s~   
ÿ
ÿ
ÿ
ÿ
€ÿ

ÿ



üz3TestMonitoring.test_stop_iteration_under_monitoringc                 C   sþ   d}t t|ƒd}d }zOz#t}| j}tj |d¡ tj ||¡ tj |||¡ |  	| j
¡ W n tyC } z|}W Y d }~nd }~ww W tj ||d ¡ tj |t¡ tj |¡ ntj ||d ¡ tj |t¡ tj |¡ w | ¡  |  |t|ƒ¡ d S )Núdeliberately broken callback©Úside_effectrL   )r   rš   r<   r1   r&   r'   rM   rO   rN   r   r-   rP   rQ   rv   r¡   r¢   )r2   r5   rY   r¦   rX   r1   r§   r   r   r   Ú6test_raising_callback_unwinds_from_jit_on_success_path2  s.   €ÿ€þzETestMonitoring.test_raising_callback_unwinds_from_jit_on_success_pathc                    sÐ  d}d‰t t|ƒd}G dd„ dtƒ‰ ttdƒ‡ ‡fdd„ƒƒ}d }zLz t}| j}tj 	|d	¡ tj 
||¡ tj |||¡ |ƒ  W n tyW } z|}W Y d }~nd }~ww W tj ||d ¡ tj 
|t¡ tj |¡ ntj ||d ¡ tj 
|t¡ tj |¡ w | ¡  |  |jd
¡ |jd }|  |jd tj¡ |  |jd t¡ |jd }	|  |	jd |jj¡ |  |	jd |j¡ |jd }
t ¡ j}|  |
jd |¡ |  |
jd |j¡ |  ||j¡ d S )Nr¶   údeliberately broken executionr·   c                   @   ó   e Zd ZdS )z]TestMonitoring.test_raising_callback_unwinds_from_jit_on_raising_path.<locals>.LocalExceptionN©Ú__name__Ú
__module__Ú__qualname__r   r   r   r   ÚLocalExceptionZ  ó    rÀ   r˜   c                      ó   ˆ ˆƒ‚rk   r   r   ©rÀ   Úmsg_executionr   r   Úraising]  r   zVTestMonitoring.test_raising_callback_unwinds_from_jit_on_raising_path.<locals>.raisingrL   r   r   r   r   )r   rš   Ú	Exceptionr	   r   rœ   r1   r&   r'   rM   rO   rN   rP   rQ   r‚   r=   r>   rž   rS   r   rB   rŸ   r    re   ÚassertIsr¸   r¯   r°   )r2   Úmsg_callbackrY   rÅ   r¦   rX   r1   r§   r©   Úraising_callr³   r´   r   rÃ   r   Ú6test_raising_callback_unwinds_from_jit_on_raising_pathM  sN   
€ÿ€þ



zETestMonitoring.test_raising_callback_unwinds_from_jit_on_raising_pathc           	         sp  d}d‰t t|ƒd}G dd„ dtƒ‰ ttdƒ‡ ‡fdd„ƒƒ}d }zLz t}| j}tj 	|d	¡ tj 
||¡ tj |||¡ |ƒ  W n tyW } z|}W Y d }~nd }~ww W tj ||d ¡ tj 
|t¡ tj |¡ ntj ||d ¡ tj 
|t¡ tj |¡ w | ¡  |jd
 }|  |jd
 |jj¡ |  t|jd ƒˆ ¡ |  t|jd ƒˆ¡ |  ||j¡ d S )Nr¶   rº   r·   c                   @   r»   )z\TestMonitoring.test_raising_callback_unwinds_from_jit_on_unwind_path.<locals>.LocalExceptionNr¼   r   r   r   r   rÀ   –  rÁ   rÀ   r˜   c                      rÂ   rk   r   r   rÃ   r   r   rÅ   ™  r   zUTestMonitoring.test_raising_callback_unwinds_from_jit_on_unwind_path.<locals>.raisingrL   r   r   )r   rš   rÆ   r	   r   r   r1   r&   r'   rM   rO   rN   rP   rQ   rv   rž   r=   rS   re   rB   Útyper¢   rÇ   r¸   )	r2   rÈ   rY   rÅ   r¦   rX   r1   r§   rÉ   r   rÃ   r   Ú5test_raising_callback_unwinds_from_jit_on_unwind_pathˆ  s@   	
€ÿ€þ
zDTestMonitoring.test_raising_callback_unwinds_from_jit_on_unwind_pathc           
         s   dd„ }dd„ }t  ¡ }tj|ˆ |fd}t  ¡ }tj|ˆ |fd}||f}|D ]}| ¡  q(|D ]}| ¡  q1‡ fdd„}	|	|ƒ |	|ƒ d S )Nc              
   S   óp   z| j | j| jftftjjd}|  t|ƒd¡ |  	|¡ W d S  t
y7 } z| |¡ W Y d }~d S d }~ww ©N)r1   r   )rZ   r   r-   r<   r&   r'   r‹   r=   r\   rH   rÆ   Úput©r2   Úqr^   Úer   r   r   Út1_work»  ó   þ€ÿz@TestMonitoring.test_monitoring_multiple_threads.<locals>.t1_workc              
   S   rÍ   rÎ   )rZ   r   r-   rJ   r&   r'   rŒ   r=   r\   rK   rÆ   rÏ   rÐ   r   r   r   Út2_workÇ  rÔ   z@TestMonitoring.test_monitoring_multiple_threads.<locals>.t2_work)ÚtargetrS   c                    s:   |   ¡ dkr|  ¡ st|  ¡ ƒ |  ¡ r
ˆ  d¡ d S d S )Nr   zqueue supposed to be empty)ÚqsizeÚemptyÚprintÚgetÚfail)rÑ   ©r2   r   r   Úassert_empty_queueß  s   ÿýzKTestMonitoring.test_monitoring_multiple_threads.<locals>.assert_empty_queue)ÚqueueÚQueueÚ	threadingÚThreadÚstartr+   )
r2   rÓ   rÕ   Úq1Út1Úq2Út2ÚthreadsÚtrÝ   r   rÜ   r   Ú test_monitoring_multiple_threads¸  s   

z/TestMonitoring.test_monitoring_multiple_threadsrk   )r½   r¾   r¿   r6   rH   rK   rZ   r_   ra   rb   rh   ri   r|   r   r„   r‰   r–   r¬   rµ   r¹   rÊ   rÌ   ré   r   r   r   r   r"   .   s*    	
!$*ACR;0r"   c                   @   s   e Zd Zdd„ ZdS )ÚTestMonitoringSelfTestc                 C   s,   | j tjddddid}|  dt|ƒ¡ d S )Nr"   r_   z-mÚcProfile)Úflagsz	skipped=1)Úsubprocess_test_runnerr"   r¾   r¡   r¢   )r2   Úrr   r   r   Ú+test_skipping_of_tests_if_monitoring_in_useì  s   ýzBTestMonitoringSelfTest.test_skipping_of_tests_if_monitoring_in_useN)r½   r¾   r¿   rï   r   r   r   r   rê   é  s    rê   c                   @   sT   e Zd Zejddiddd„ ƒZejddiddd„ ƒZejdd	idd
d„ ƒZdS )ÚTestMonitoringEnvVarControlÚNUMBA_ENABLE_SYS_MONITORINGÚ )Úenvvarsc                 C   ó   t dd„ ƒ}|  |j¡ d S )Nc                 S   r   r   r   r   r   r   r   r   ü  rc   z9TestMonitoringEnvVarControl.test_default_off.<locals>.foo©r   ÚassertFalser	   ©r2   r   r   r   r   Útest_default_offù  ó   
z,TestMonitoringEnvVarControl.test_default_offÚ0c                 C   rô   )Nc                 S   r   r   r   r   r   r   r   r     rc   z:TestMonitoringEnvVarControl.test_override_off.<locals>.foorõ   r÷   r   r   r   Útest_override_off  rù   z-TestMonitoringEnvVarControl.test_override_offÚ1c                 C   rô   )Nc                 S   r   r   r   r   r   r   r   r     rc   z9TestMonitoringEnvVarControl.test_override_on.<locals>.foo)r   Ú
assertTruer	   r÷   r   r   r   Útest_override_on  rù   z,TestMonitoringEnvVarControl.test_override_onN)r½   r¾   r¿   r   Úrun_test_in_subprocessrø   rû   rþ   r   r   r   r   rð   ÷  s    ÿ
ÿ
ÿrð   Ú__main__)"r?   rÞ   r&   rà   ÚunittestÚunittest.mockr   r   Únumba.tests.supportr   Únumbar   r   Únumba.core.utilsr   Únumba.core.serializer   r	   r   r'   rT   r<   rJ   rœ   r   r®   rP   r*   Ú
skipUnlessr"   rê   rð   r½   Úmainr   r   r   r   Ú<module>   sL    





ý     ?ÿ