§
    mö¬jz  ã                   ó†   — d Z ddlZddlmc m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ZddlmZmZ d„ Zd„ Zd„ Zd„ Zd	„ ZdS )
uX  AutoPOE2 - Unit & Stress Tests: WinRT OCR Thread-Safety & Center Modal Fast-Path
PhÃ¢n há»‡: SÆ° Ä‘oÃ n 2: Lead Perception Architect
Bá»‘i cáº£nh: NÄƒm 2026 (Path of Exile 2 v0.5.5+, WinRT OCR, Python 3.11).

Kiá»ƒm chá»©ng cÃ¡c báº¥t biáº¿n kiáº¿n trÃºc:
1. INV-OCR-THREAD-SAFETY: WinRT OCR xá»­ lÃ½ Ä‘a luá»“ng Ä‘á»“ng thá»�i (50 luá»“ng) khÃ´ng bao giá»� dÃ­nh crash 0xc0000005.
2. INV-MODAL-FAST-PATH: is_center_modal_present phÃ¡t hiá»‡n nhanh (< 1ms) khÃ´ng cáº§n cháº¡y WinRT OCR.
3. 100% Authentic Data Protocol (Rule 5): Kiá»ƒm chá»©ng trÃªn cÃ¡c artifact tháº­t trong thÆ° má»¥c captures/.
é    N)ÚImage)Úis_center_modal_presentÚsafe_recognize_pil_syncc                  ó´  ‡‡‡‡— t          j        ddd¬¦  «        Šg Šg Šdt          fˆˆˆfd„Šˆfd„t          d¦  «        D ¦   «         } t	          j        ¦   «         }| D ]}|                     ¦   «          Œ| D ]}|                     d	¬
¦  «         Œt	          j        ¦   «         |z
  }t          ‰¦  «        }d}||k    }|�st          j
        d|fd||f¦  «        dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddt          j        ¦   «         v st          j        ‰¦  «        rt          j        ‰¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }t          j        dt          ‰¦  «        › d‰› �¦  «        dz   d|iz  }t!          t          j        |¦  «        ¦  «        ‚dx}x}}t          ‰¦  «        }d}||k    }|�st          j
        d|fd||f¦  «        dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddt          j        ¦   «         v st          j        ‰¦  «        rt          j        ‰¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }t          j        dt          ‰¦  «        › d�¦  «        dz   d|iz  }t!          t          j        |¦  «        ¦  «        ‚dx}x}}d	}||k     }	|	s±t          j
        d|	fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }
t          j        d|d›d�¦  «        d z   d!|
iz  }t!          t          j        |¦  «        ¦  «        ‚dx}	}dS )"uk   INV-OCR-THREAD-SAFETY: Cháº¡y 50 luá»“ng gá»�i OCR Ä‘á»“ng thá»�i, kháº³ng Ä‘á»‹nh khÃ´ng crash 0xc0000005.ÚRGBA)é    é(   )éÿ   r
   r
   r
   ©ÚcolorÚidxc                 óÎ   •— 	 t          ‰¦  «        }‰                     | |f¦  «         d S # t          $ r/}‰                     | t          |¦  «        f¦  «         Y d }~d S d }~ww xY w)N)r   ÚappendÚ	ExceptionÚstr)r   ÚresÚeÚerrorsÚresultsÚtest_imgs      €€€ú7C:\Projects\AutoPOE2\tests\test_winocr_thread_safety.pyÚworkerz:test_winocr_multi_threaded_stress_50_calls.<locals>.worker   s~   ø€ ð	)Ý)¨(Ñ3Ô3ˆCØ�NŠN˜C ˜:Ñ&Ô&Ð&Ð&Ð&øÝð 	)ð 	)ð 	)Ø�MŠM˜3¥ A¡¤˜-Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(øøøøð	)øøøs   ƒ&+ «
A$µ$AÁA$c                 ó@   •— g | ]}t          j        ‰|fd ¬¦  «        ‘ŒS ©T)ÚtargetÚargsÚdaemon©Ú	threadingÚThread©Ú.0Úir   s     €r   ú
<listcomp>z>test_winocr_multi_threaded_stress_50_calls.<locals>.<listcomp>&   ó-   ø€ ÐZÐZÐZÈ1�yÔ v°Q°DÀÐFÑFÔFÐZÐZÐZó    é2   ç      >@©Útimeoutr   ©ú==©z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sÚlenr   ©Úpy0Úpy1Úpy3Úpy6u   CÃ³ u(    lá»—i phÃ¡t sinh trong 50 luá»“ng OCR: ú
>assert %(py8)sÚpy8Nr   õ   Chá»‰ hoÃ n thÃ nh u   /50 luá»“ng!©ú<©z%(py0)s < %(py3)sÚelapsed©r0   r2   u"   Thá»�i gian thá»±c thi quÃ¡ lÃ¢u (ú.2fzs)!ú
>assert %(py5)sÚpy5)r   ÚnewÚintÚrangeÚtimeÚperf_counterÚstartÚjoinr.   Ú
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚ_format_assertmsgÚAssertionErrorÚ_format_explanation)ÚthreadsÚt0Útr:   Ú@py_assert2Ú@py_assert5Ú@py_assert4Ú@py_format7Ú@py_format9Ú@py_assert1Ú@py_format4Ú@py_format6r   r   r   r   s               @@@@r   Ú*test_winocr_multi_threaded_stress_50_callsrZ      sJ  øøøø€ åŒy˜ Ð2FÐGÑGÔG€Hà€FØ€Gð)•Cð )ð )ð )ð )ð )ð )ð )ð )ð [ÐZÐZÐZÕPUÐVXÑPYÔPYÐZÑZÔZ€GÝ	Ô	Ñ	Ô	€BØð ð ˆØ	�Š‰	Œ	ˆ	ˆ	Øð ð ˆØ	�Š�tˆÑÔÐÐÝÔÑ!Ô! BÑ&€Gåˆv‰;Œ;Ða˜!Ðaˆ;˜!ÒÐaÐaÑaÕaÔaÐaÐaÐaÐaˆ;˜!ÐaÑaÔaÐaÕaÔaÑaÔaÐaÐaÕaÔa�3ÑaÔaÐaÕaÔa�3ÑaÔaÐaÐaÐaÕaÔaÑaÔaÐaÐaÕaÔaˆvÑaÔaÐaÕaÔaˆvÑaÔaÐaÐaÕaÔaˆ;ÑaÔaÕaÔa˜!ÑaÔaÐaÐaÑaÐaÕaÔaÐa¥C¨¡K¤KÐaÐaÐY_ÐaÐaÑaÔaÐaÑaÐaÐaÐaÑaÐaÕaÕaÔaÐaÑaÔaÑaÔaÐaÐaÐaÐaÐaÐaÐaÝˆw‰<Œ<ÐO˜2ÐOˆ<˜2ÒÐOÐOÑOÕOÔOÐOÐOÐOÐOˆ<˜2ÐOÑOÔOÐOÕOÔOÑOÔOÐOÐOÕOÔO�3ÑOÔOÐOÕOÔO�3ÑOÔOÐOÐOÐOÕOÔOÑOÔOÐOÐOÕOÔOˆwÑOÔOÐOÕOÔOˆwÑOÔOÐOÐOÕOÔOˆ<ÑOÔOÕOÔO˜2ÑOÔOÐOÐOÑOÐOÕOÔOÐOµS¸±\´\ÐOÐOÐOÑOÔOÐOÑOÐOÐOÐOÑOÐOÕOÕOÔOÐOÑOÔOÑOÔOÐOÐOÐOÐOÐOÐOÐOØÐPˆ7�TŠ>ÐPÐPÐPÕPÔPÐPÐPÐPÐPˆ7�TÐPÑPÔPÐPÕPÔPÑPÔPÐPÐPÕPÔPˆ7ÑPÔPÐPÕPÔPˆ7ÑPÔPÐPÐPÕPÔP�TÑPÔPÐPÐPÑPÐPÕPÔPÐPÀÐPÐPÐPÐPÑPÔPÐPÑPÐPÐPÐPÑPÐPÕPÕPÔPÐPÑPÔPÑPÔPÐPÐPÐPÐPÐPÐPÐPr&   c                  óÄ  ‡‡‡	‡
— t          j        ddd¬¦  «        Š	g Šg Šdt          fˆˆˆ	fd„Š
ˆ
fd„t          d¦  «        D ¦   «         } | D ]}|                     ¦   «          Œ| D ]}|                     d	¬
¦  «         Œt          ‰¦  «        }d}||k    }|�s
t          j        d|fd||f¦  «        dt          j
        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddt          j
        ¦   «         v st          j        ‰¦  «        rt          j        ‰¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }t          j        d‰› �¦  «        dz   d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}t          ‰¦  «        }d}||k    }|�st          j        d|fd||f¦  «        dt          j
        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddt          j
        ¦   «         v st          j        ‰¦  «        rt          j        ‰¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }t          j        dt          ‰¦  «        › d�¦  «        dz   d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}dS )ut   Kiá»ƒm tra trá»±c tiáº¿p winocr.recognize_pil_sync 50 luá»“ng Ä‘á»“ng thá»�i khÃ´ng bá»‹ rÃ² rá»‰ hoáº·c uninit COM.r   )éx   é   )éð   r^   r^   r
   r   r#   c                 ó  •— 	 t          j        ‰¦  «        }t          |t          ¦  «        }|�sddt	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddt	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        dœz  }t          t          j
        |¦  «        ¦  «        ‚d }‰                     | |f¦  «         d S # t          $ r/}‰                     | t          |¦  «        f¦  «         Y d }~d S d }~ww xY w)Nz5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}Ú
isinstancer   Údict)r0   r1   Úpy2Úpy4)ÚwinocrÚrecognize_pil_syncr`   ra   rH   rI   rF   rJ   rK   rM   rN   r   r   r   )r#   r   Ú@py_assert3Ú@py_format5r   r   r   r   s        €€€r   r   z5test_winocr_direct_sync_multithreaded.<locals>.worker9   s„  ø€ ð	'ÝÔ+¨HÑ5Ô5ˆCÝ˜c¥4Ñ(Ô(Ð(Ð(Ñ(Ð(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô(•:Ñ(Ô(Ð(Õ(Ô(•:Ñ(Ô(Ð(Ð(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô(˜cÑ(Ô(Ð(Õ(Ô(˜cÑ(Ô(Ð(Ð(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô(¥4Ñ(Ô(Ð(Õ(Ô(¥4Ñ(Ô(Ð(Ð(Õ(Ô(Ð(Ñ(Ô(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ø�NŠN˜A˜s˜8Ñ$Ô$Ð$Ð$Ð$øÝð 	'ð 	'ð 	'Ø�MŠM˜1�c !™fœf˜+Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&øøøøð	'øøøs   ƒEE Å
FÅ$FÆFc                 ó@   •— g | ]}t          j        ‰|fd ¬¦  «        ‘ŒS r   r   r!   s     €r   r$   z9test_winocr_direct_sync_multithreaded.<locals>.<listcomp>A   r%   r&   r'   r(   r)   r   r+   r-   r.   r   r/   u   Lá»—i direct winocr call: r4   r5   Nr   r6   u   /50 luá»“ng direct winocr!)r   r?   r@   rA   rD   rE   r.   rF   rG   rH   rI   rJ   rK   rL   rM   rN   )rO   rQ   rR   rS   rT   rU   rV   r   r   r   r   s          @@@@r   Ú%test_winocr_direct_sync_multithreadedri   3   s9  øøøø€ åŒy˜ Ð2FÐGÑGÔG€HØ€FØ€Gð'•#ð 'ð 'ð 'ð 'ð 'ð 'ð 'ð 'ð [ÐZÐZÐZÕPUÐVXÑPYÔPYÐZÑZÔZ€GØð ð ˆØ	�Š‰	Œ	ˆ	ˆ	Øð ð ˆØ	�Š�tˆÑÔÐÐåˆv‰;Œ;ÐB˜!ÐBˆ;˜!ÒÐBÐBÑBÕBÔBÐBÐBÐBÐBˆ;˜!ÐBÑBÔBÐBÕBÔBÑBÔBÐBÐBÕBÔB�3ÑBÔBÐBÕBÔB�3ÑBÔBÐBÐBÐBÕBÔBÑBÔBÐBÐBÕBÔBˆvÑBÔBÐBÕBÔBˆvÑBÔBÐBÐBÕBÔBˆ;ÑBÔBÕBÔB˜!ÑBÔBÐBÐBÑBÐBÕBÔBÐB¸&ÐBÐBÑBÔBÐBÑBÐBÐBÐBÑBÐBÕBÕBÔBÐBÑBÔBÑBÔBÐBÐBÐBÐBÐBÐBÐBÝˆw‰<Œ<Ð]˜2Ð]ˆ<˜2ÒÐ]Ð]Ñ]Õ]Ô]Ð]Ð]Ð]Ð]ˆ<˜2Ð]Ñ]Ô]Ð]Õ]Ô]Ñ]Ô]Ð]Ð]Õ]Ô]�3Ñ]Ô]Ð]Õ]Ô]�3Ñ]Ô]Ð]Ð]Ð]Õ]Ô]Ñ]Ô]Ð]Ð]Õ]Ô]ˆwÑ]Ô]Ð]Õ]Ô]ˆwÑ]Ô]Ð]Ð]Õ]Ô]ˆ<Ñ]Ô]Õ]Ô]˜2Ñ]Ô]Ð]Ð]Ñ]Ð]Õ]Ô]Ð]µS¸±\´\Ð]Ð]Ð]Ñ]Ô]Ð]Ñ]Ð]Ð]Ð]Ñ]Ð]Õ]Õ]Ô]Ð]Ñ]Ô]Ñ]Ô]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð]r&   c                  ó²  — ddl m}  g d¢}d}|D �]Œ}t          j                             |¦  «        sŒ#|dz  } | |¦  «        }d}||u}|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        d	œz  }d
d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}t          j        ¦   «         }	t          |¦  «        }
t          j        ¦   «         |	z
  dz  }d}|
|u }|s°t          j        d|fd|
|f¦  «        dt          j        ¦   «         v st          j	        |
¦  «        rt          j
        |
¦  «        ndt          j
        |¦  «        d	œz  }t          j        d|› d�¦  «        dz   d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}d}||k     }|s±t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        d	œz  }t          j        d|d›d�¦  «        dz   d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}�ŒŽd}||k    }|s¬t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        d	œz  }t          j        d¦  «        dz   d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}dS )ud   INV-MODAL-FAST-PATH: Kiá»ƒm tra áº£nh in-game tháº­t khÃ´ng bá»‹ nháº­n nháº§m thÃ nh Modal (< 5ms).r   )Ú_load_image)z.captures/reconnect/RECONNECT_STEP4_IN_GAME.pngzBcaptures/pipeline_run/20260917_065154_045_DISMISS_MODALS_CHECK.pngzBcaptures/pipeline_run/20260917_065332_861_DISMISS_MODALS_CHECK.pngzBcaptures/pipeline_run/20260917_073322_410_DISMISS_MODALS_CHECK.pngé   N)úis not)z%(py0)s is not %(py3)sÚimg_objr;   úassert %(py5)sr>   g     @�@F©Úis©z%(py0)s is %(py3)sÚ	has_modalu   áº¢nh in-game 'u)   ' bá»‹ nháº­n diá»‡n nháº§m thÃ nh Modal!r=   g      @r7   r9   Ú
elapsed_msu   Fast-Path quÃ¡ cháº­m (r<   zms >= 5ms)!)ú>=)z%(py0)s >= %(py3)sÚtested_countu:   Cáº§n cÃ³ Ã­t nháº¥t 1 capture in-game Ä‘á»ƒ kiá»ƒm thá»­!)Úsrc.common.vision_ocrrk   ÚosÚpathÚexistsrF   rG   rH   rI   rJ   rK   rM   rN   rB   rC   r   rL   )rk   Úingame_capturesrv   ry   rn   rR   rW   rX   rY   rP   rs   rt   s               r   Ú4test_is_center_modal_present_on_real_ingame_capturesr|   K   s  € à1Ð1Ð1Ð1Ð1Ð1ðð ð €Oð €LØð Wñ WˆÝŒw�~Š~˜dÑ#Ô#ð 	ØØ˜ÑˆØ�+˜dÑ#Ô#ˆØ"Ð"ˆw˜dÐ"Ð"Ð"Ð"Õ"Ô"Ð"Ð"Ð"Ð"ˆw˜dÐ"Ñ"Ô"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"ˆwÑ"Ô"Ð"Õ"Ô"ˆwÑ"Ô"Ð"Ð"Õ"Ô"˜dÑ"Ô"Ð"Ð"Ñ"Ð"Ð"Ð"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"Ð"Ð"åÔÑ Ô ˆÝ+¨GÑ4Ô4ˆ	ÝÔ'Ñ)Ô)¨BÑ.°&Ñ8ˆ
à!Ðdˆy˜EÐ!ÐdÐdÐdÕdÔdÐdÐdÐdÐdˆy˜EÐdÑdÔdÐdÕdÔdÑdÔdÐdÐdÕdÔdˆyÑdÔdÐdÕdÔdˆyÑdÔdÐdÐdÕdÔd˜EÑdÔdÐdÐdÑdÐdÕdÔdÐ#d°TÐ#dÐ#dÐ#dÑdÔdÐdÑdÐdÐdÐdÑdÐdÕdÕdÔdÐdÑdÔdÑdÔdÐdÐdÐdÐdÐdØÐVˆz˜CÒÐVÐVÐVÕVÔVÐVÐVÐVÐVˆz˜CÐVÑVÔVÐVÕVÔVÑVÔVÐVÐVÕVÔVˆzÑVÔVÐVÕVÔVˆzÑVÔVÐVÐVÕVÔV˜CÑVÔVÐVÐVÑVÐVÕVÔVÐ!V¸:Ð!VÐ!VÐ!VÐ!VÑVÔVÐVÑVÐVÐVÐVÑVÐVÕVÕVÔVÐVÑVÔVÑVÔVÐVÐVÐVÐVÐVÑVàÐZˆ<˜1ÒÐZÐZÐZÕZÔZÐZÐZÐZÐZˆ<˜1ÐZÑZÔZÐZÕZÔZÑZÔZÐZÐZÕZÔZˆ<ÑZÔZÐZÕZÔZˆ<ÑZÔZÐZÐZÕZÔZ˜1ÑZÔZÐZÐZÑZÐZÕZÔZÐZÑZÔZÐZÑZÐZÐZÐZÑZÐZÕZÕZÔZÐZÑZÔZÑZÔZÐZÐZÐZÐZÐZÐZÐZr&   c                  óî  — ddg} | D ]í}t           j                             |¦  «        sŒ"t          |¦  «        }d}||u }|s°t	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        dœz  }t	          j
        d|› d	�¦  «        d
z   d|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}}ŒîdS )u`   INV-MODAL-FAST-PATH: Nháº­n diá»‡n chÃ­nh xÃ¡c Modal khi cÃ³ panel há»™p thoáº¡i che trung tÃ¢m.z!captures/debug_full_modal_ref.pngzcaptures/death_modal_crop.pngTrp   rr   rs   r;   zArtifact Modal 'u*   ' khÃ´ng Ä‘Æ°á»£c nháº­n diá»‡n lÃ  modal!r=   r>   N)rx   ry   rz   r   rF   rG   rH   rI   rJ   rK   rL   rM   rN   )Úmodal_capturesry   rs   rR   rW   rX   rY   s          r   Ú3test_is_center_modal_present_on_real_modal_capturesr   g   s8  € ð 	,Ø'ð€Nð
 ð fð fˆÝŒw�~Š~˜dÑ#Ô#ð 	ØÝ+¨DÑ1Ô1ˆ	Ø Ðeˆy˜DÐ ÐeÐeÐeÕeÔeÐeÐeÐeÐeˆy˜DÐeÑeÔeÐeÕeÔeÑeÔeÐeÐeÕeÔeˆyÑeÔeÐeÕeÔeˆyÑeÔeÐeÐeÕeÔe˜DÑeÔeÐeÐeÑeÐeÕeÔeÐ"e°TÐ"eÐ"eÐ"eÑeÔeÐeÑeÐeÐeÐeÑeÐeÕeÕeÔeÐeÑeÔeÑeÔeÐeÐeÐeÐeÐeÐeð	fð fr&   c                  ót  — t          d¦  «        } g ddœ}| |k    }|s—t          j        d|fd| |f¦  «        dt          j        ¦   «         v st          j        | ¦  «        rt          j        | ¦  «        ndt          j        |¦  «        dœz  }dd	|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}dS )
uf   Kiá»ƒm tra tÃ­nh bá»�n bá»‰ cá»§a safe_recognize_pil_sync khi truyá»�n Ä‘áº§u vÃ o None hoáº·c rá»—ng.NÚ )ÚlinesÚtextr+   )z%(py0)s == %(py3)sÚres_noner;   ro   r>   )	r   rF   rG   rH   rI   rJ   rK   rM   rN   )r„   rR   rW   rX   rY   s        r   Ú'test_safe_recognize_pil_sync_resiliencer…   u   sâ   € å& tÑ,Ô,€HØ!#¨RÐ0Ð0Ð0ˆ8Ð0Ò0Ð0Ð0Ð0Õ0Ô0Ð0Ð0Ð0Ð0ˆ8Ð0Ð0Ñ0Ô0Ð0Õ0Ô0Ñ0Ô0Ð0Ð0Õ0Ô0ˆ8Ñ0Ô0Ð0Õ0Ô0ˆ8Ñ0Ô0Ð0Ð0Õ0Ô0Ð0Ñ0Ô0Ð0Ð0Ñ0Ð0Ð0Ð0Ð0Ð0Ñ0Ð0Õ0Õ0Ô0Ð0Ñ0Ô0Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0r&   )Ú__doc__ÚbuiltinsrH   Ú_pytest.assertion.rewriteÚ	assertionÚrewriterF   rx   r   rB   ÚpytestÚPILr   rd   rw   r   r   rZ   ri   r|   r   r…   © r&   r   ú<module>rŽ      sö   ððð ð € € € € € € € € € € € € €	€	€	€	Ø Ð Ð Ð Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð à €€€ðð ð ð ð ð ð ð ðQð Qð Qð6^ð ^ð ^ð0[ð [ð [ð8fð fð fð1ð 1ð 1ð 1ð 1r&   