§
    ‡¬j,  ã                  ó  — d Z ddlm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mZ ddlZddlmZ ddlmZmZmZ ddlmZ ej        d„ ¦   «         Z G d	„ d
¦  «        Z G d„ d¦  «        Z G d„ d¦  «        Z G d„ d¦  «        ZdS )uo  AutoPOE2 - Unit & Integration Tests cho Reconnect Invariants & Anti-False-Positive.
=====================================================================================
Domain: QA & Governance Sentinel (SÆ° Ä‘oÃ n 4)
TuÃ¢n thá»§ nghiÃªm ngáº·t Master Invariant Matrix (Rule 8) & Rule 4C/5:
- INV-RECONNECT-PROCESS-ALIVE: Client PID pháº£i tá»“n táº¡i vÃ  Ä‘ang cháº¡y trÃªn Windows.
- INV-RECONNECT-HWND-VALID: HWND pháº£i há»£p lá»‡ (win32gui.IsWindow).
- INV-RECONNECT-NO-HARDCODED-VITALS: Cáº¥m gÃ¡n cá»©ng chá»‰ sá»‘ sinh tá»“n (es=4284, hp=1, mana=897)
  khi bá»™ nhá»› chÆ°a gáº¯n káº¿t (memory_attached=False) hoáº·c player.address == 0x0.
- INV-CAPTURE-CLIENT-ONLY: ScreenCapturer cáº¥m fallback chá»¥p áº£nh toÃ n mÃ n hÃ¬nh Desktop khi khÃ´ng cÃ³ window.
- KhÃ©p kÃ­n vÃ²ng láº·p tá»± sá»­a lá»—i (Rule 6): Incident Dossier INCIDENT_20260918_RECONNECT_FALSE_POSITIVE.
é    )ÚannotationsN)Ú	MagicMockÚpatch)ÚImage)ÚHARDCODED_PROHIBITED_VITALSÚReconnectValidationResultÚvalidate_reconnect_result)ÚScreenCapturerc               #  óh   K  — t          j        d¬¦  «        } | V — t          j        | d¬¦  «         dS )u:   Táº¡o thÆ° má»¥c táº¡m cÃ´ láº­p cho ScreenCapturer tests.Úcapturer_inv_test_)ÚprefixT)Úignore_errorsN)ÚtempfileÚmkdtempÚshutilÚrmtree)Útemp_dirs    ú7C:\Projects\AutoPOE2\tests\test_reconnect_invariants.pyÚtemp_output_dirr       s@   è è € õ ÔÐ';Ð<Ñ<Ô<€HØ
€N€N€NÝ
„M�(¨$Ð/Ñ/Ô/Ð/Ð/Ð/ó    c                  ó   — e Zd ZdZd„ Zd„ ZdS )ÚTestReconnectResultAuditu^   Kiá»ƒm toÃ¡n Ä‘á»‘i soÃ¡t chÃ©o artifact hiá»‡n trÆ°á»�ng sá»± cá»‘ vÃ  file káº¿t quáº£ live.c                ó’  — t           j                             dddd¦  «        }t           j        }|j        } ||¦  «        }|sÿt	          j        d|› d�¦  «        dz   dt          j        ¦   «         v st	          j        t           ¦  «        rt	          j	        t           ¦  «        ndt	          j	        |¦  «        t	          j	        |¦  «        d	t          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        nd	t	          j	        |¦  «        d
œz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}}t          |dd¬¦  «        5 }t          j        |¦  «        }ddd¦  «         n# 1 swxY w Y   t           j                             ddd¦  «        }t           j        }|j        } ||¦  «        }|sþt	          j        d|› �¦  «        dz   dt          j        ¦   «         v st	          j        t           ¦  «        rt	          j	        t           ¦  «        ndt	          j	        |¦  «        t	          j	        |¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        d
œz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}}t          |dd¬¦  «        5 }t          j        |¦  «        }	ddd¦  «         n# 1 swxY w Y   t          ||	dd¬¦  «        }
|
j        }| }|s�t	          j        d¦  «        dz   dt          j        ¦   «         v st	          j        |
¦  «        rt	          j	        |
¦  «        ndt	          j	        |¦  «        dœz  }t          t	          j        |¦  «        ¦  «        ‚dx}}|
j        }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	        |¦  «        t	          j	        |¦  «        dœz  }d d!|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}x}}d"                     |
j        ¦  «        }d#}||v }|s—t	          j        d$|fd%||f¦  «        t	          j	        |¦  «        d&t          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        nd&d'œz  }d(d)|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}}d*}||v }|s—t	          j        d$|fd%||f¦  «        t	          j	        |¦  «        d&t          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        nd&d'œz  }d(d)|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}}dS )+u  [MÃ” PHá»ŽNG KIá»‚M TOÃ�N THá»°C NGHIá»†M Tá»ª INCIDENT DOSSIER]
        Ä�á»�c artifact reconnect_result_false_positive.json vÃ  artifact RAM táº¡i captures/reconnect/.
        XÃ¡c nháº­n há»‡ thá»‘ng phÃ¡t hiá»‡n chÃ­nh xÃ¡c vi pháº¡m False Positive (Rule 4C & Rule 5).
        Údebug_harnessÚ	incidentsÚ*INCIDENT_20260918_RECONNECT_FALSE_POSITIVEz$reconnect_result_false_positive.jsonu   Thiáº¿u file z trong incident dossierúd
>assert %(py7)s
{%(py7)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.path
}.exists
}(%(py5)s)
}ÚosÚresult_file©Úpy0Úpy2Úpy4Úpy5Úpy7NÚrúutf-8©ÚencodingÚcapturesÚ	reconnectz420260918_070449_424_RECONNECT_STEP4_IN_GAME_RAM.jsonu   Thiáº¿u artifact RAM Úram_artifactTF©Úresult_dataÚram_snapshotÚcheck_live_processÚcheck_live_hwndu?   Validator pháº£i REJECT file reconnect_result.json giáº£ máº¡o!z2
>assert not %(py2)s
{%(py2)s = %(py0)s.is_valid
}Ú
val_result©r!   r"   é   )ú>=)zL%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.errors
})
} >= %(py8)sÚlen©r!   Úpy1Úpy3r$   Úpy8úassert %(py10)sÚpy10ú ú!INV-RECONNECT-NO-HARDCODED-VITALS©Úin©z%(py1)s in %(py3)sÚ
errors_str©r8   r9   úassert %(py5)sr$   Ú4284)r   ÚpathÚjoinÚexistsÚ
@pytest_arÚ_format_assertmsgÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanationÚopenÚjsonÚloadr	   Úis_validÚerrorsr6   Ú_call_reprcompare)Úselfr   Ú@py_assert1Ú@py_assert3Ú@py_assert6Ú@py_format8ÚfÚres_datar,   Úram_datar2   Ú@py_format4Ú@py_assert2Ú@py_assert4Ú@py_assert7Ú@py_format9Ú@py_format11rB   Ú@py_assert0Ú@py_format6s                       r   Ú:test_audit_current_reconnect_result_rejects_false_positivezSTestReconnectResultAudit.test_audit_current_reconnect_result_rejects_false_positive+   s  € õ
 ”g—l’lØ˜[Ð*VØ2ñ
ô 
ˆõ ŒwÐ`ˆwŒ~Ð`ˆ~ˆ~˜kÑ*Ô*Ð`Ð*Ð`Õ`Ô`Ð,`¸KÐ,`Ð,`Ð,`Ñ`Ô`Ð`Ñ`Ð`Õ`Ô`Ñ`Ô`Ð`Ð`Õ`Ô`�rÑ`Ô`Ð`Õ`Ô`�rÑ`Ô`Ð`Ð`Õ`Ô`ˆwÑ`Ô`Õ`Ô`ˆ~Ñ`Ô`Ð`Õ`Ô`Ñ`Ô`Ð`Ð`Õ`Ô`˜kÑ`Ô`Ð`Õ`Ô`˜kÑ`Ô`Ð`Ð`Õ`Ô`Ð*Ñ`Ô`Ð`Ð`Ñ`Ð`Õ`Õ`Ô`Ð`Ñ`Ô`Ñ`Ô`Ð`Ð`Ð`Ð`Ð`Ð`Ð`å�+˜s¨WÐ5Ñ5Ô5ð 	$¸Ý”y ‘|”|ˆHð	$ð 	$ð 	$ñ 	$ô 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$øøøð 	$ð 	$ð 	$ð 	$õ ”w—|’|Ø˜Ð%[ñ
ô 
ˆõ ŒwÐSˆwŒ~ÐSˆ~ˆ~˜lÑ+Ô+ÐSÐ+ÐSÕSÔSÐ-SÀ\Ð-SÐ-SÑSÔSÐSÑSÐSÕSÔSÑSÔSÐSÐSÕSÔS�rÑSÔSÐSÕSÔS�rÑSÔSÐSÐSÕSÔSˆwÑSÔSÕSÔSˆ~ÑSÔSÐSÕSÔSÑSÔSÐSÐSÕSÔS˜lÑSÔSÐSÕSÔS˜lÑSÔSÐSÐSÕSÔSÐ+ÑSÔSÐSÐSÑSÐSÕSÕSÔSÐSÑSÔSÑSÔSÐSÐSÐSÐSÐSÐSÐSå�, ¨gÐ6Ñ6Ô6ð 	$¸!Ý”y ‘|”|ˆHð	$ð 	$ð 	$ñ 	$ô 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$øøøð 	$ð 	$ð 	$ð 	$õ /Ø Ø!Ø#Ø!ð	
ñ 
ô 
ˆ
ð Ô&ÐiÐ&Ð&ÐiÐ&ÐiÕiÔiÐ(iÑiÔiÐiÑiÐiÕiÔiÑiÔiÐiÐiÕiÔi�:ÑiÔiÐiÕiÔi�:ÑiÔiÐiÐiÕiÔiÐ&ÑiÔiÐiÐiÑiÐiÕiÕiÔiÐiÑiÔiÑiÔiÐiÐiÐiÐiÐiØÔ$Ð*�sÐ$Ñ%Ô%Ð*¨Ð*Ð%¨Ò*Ð*Ð*Ñ*Õ*Ô*Ð*Ð*Ð*Ð*Ð%¨Ð*Ñ*Ô*Ð*Õ*Ô*Ñ*Ô*Ð*Ð*Õ*Ô*�sÑ*Ô*Ð*Õ*Ô*�sÑ*Ô*Ð*Ð*Ð*Õ*Ô*Ñ*Ô*Ð*Ð*Õ*Ô*�:Ñ*Ô*Ð*Õ*Ô*�:Ñ*Ô*Ð*Ð*Õ*Ô*Ð$Ñ*Ô*Õ*Ô*Ð%Ñ*Ô*Õ*Ô*¨Ñ*Ô*Ð*Ð*Ñ*Ð*Ð*Ð*Ð*Ð*Ñ*Ð*Õ*Õ*Ô*Ð*Ñ*Ô*Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ð*ð —X’X˜jÔ/Ñ0Ô0ˆ
Ø2Ð@Ð2°jÐ@Ð@Ð@Ð@Õ@Ô@Ð@Ð@Ð@Ð@Ð2°jÐ@Ñ@Ô@Õ@Ô@Ð2Ñ@Ô@Ð@Õ@Ô@Ñ@Ô@Ð@Ð@Õ@Ô@°jÑ@Ô@Ð@Õ@Ô@°jÑ@Ô@Ð@Ð@Ð@Ð@Ñ@Ð@Ð@Ð@Ð@Ð@Ñ@Ð@Õ@Õ@Ô@Ð@Ñ@Ô@Ñ@Ô@Ð@Ð@Ð@Ð@Ð@ØÐ#ˆv˜Ð#Ð#Ð#Ð#Õ#Ô#Ð#Ð#Ð#Ð#ˆv˜Ð#Ñ#Ô#Õ#Ô#ˆvÑ#Ô#Ð#Õ#Ô#Ñ#Ô#Ð#Ð#Õ#Ô#˜Ñ#Ô#Ð#Õ#Ô#˜Ñ#Ô#Ð#Ð#Ð#Ð#Ñ#Ð#Ð#Ð#Ð#Ð#Ñ#Ð#Õ#Õ#Ô#Ð#Ñ#Ô#Ñ#Ô#Ð#Ð#Ð#Ð#Ð#Ð#Ð#s$   ÅE;Å;E?ÆE?ËK>Ë>LÌLc                óL  — d}t           j                             |¦  «        st          j        d¦  «         t          |dd¬¦  «        5 }t          j        |¦  «        }ddd¦  «         n# 1 swxY w Y   g }|j        }d} ||¦  «        }d}||k    }	|	}
|	r>|j        }d	} ||¦  «        }d
}||k    }|}
|r|j        }d} ||¦  «        }d}||k    }|}
|
 }|�s¦t          j
        d|	fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }|                     |¦  «         |	�rŠt          j
        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }|                     |¦  «         |rÄt          j
        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }|                     |¦  «         t          j        |d¦  «        i z  }t          j        d¦  «        dz   d|iz  }t%          t          j        |¦  «        ¦  «        ‚dx}
x}x}x}x}x}	x}x}x}x}x}x}x}x}x}x}x}}dS )u÷   [KIá»‚M TOÃ�N Dá»® LIá»†U THáº¬T 100% TRÃŠN WORKSPACE]
        Kiá»ƒm tra file reconnect_result.json hiá»‡n táº¡i trÃªn workspace:
        Náº¿u client tháº­t Ä‘ang cháº¡y (PID 22512), xÃ¡c nháº­n khÃ´ng cÃ²n gÃ¡n cá»©ng ES 4284 á»Ÿ root.
        zreconnect_result.jsonu*   reconnect_result.json chÆ°a Ä‘Æ°á»£c táº¡or&   r'   r(   NÚesé¼  Úhpr4   Úmanaé�  ©ú==)zJ%(py8)s
{%(py8)s = %(py4)s
{%(py4)s = %(py2)s.get
}(%(py6)s)
} == %(py11)sr]   )r"   r#   Úpy6r:   Úpy11z%(py13)sÚpy13)zP%(py21)s
{%(py21)s = %(py17)s
{%(py17)s = %(py15)s.get
}(%(py19)s)
} == %(py24)s)Úpy15Úpy17Úpy19Úpy21Úpy24z%(py26)sÚpy26)zP%(py34)s
{%(py34)s = %(py30)s
{%(py30)s = %(py28)s.get
}(%(py32)s)
} == %(py37)s)Úpy28Úpy30Úpy32Úpy34Úpy37z%(py39)sÚpy39r   uR   reconnect_result.json váº«n cÃ²n chá»©a háº±ng sá»‘ gÃ¡n cá»©ng vi pháº¡m Rule 4C!z
>assert not %(py42)sÚpy42)r   rF   rH   ÚpytestÚskiprQ   rR   rS   ÚgetrI   rV   rK   rL   rM   rN   ÚappendÚ_format_booloprJ   rO   rP   )rW   r   r\   r]   rX   rY   Ú@py_assert5rb   Ú@py_assert10Ú@py_assert9re   Ú@py_assert16Ú@py_assert18Ú@py_assert20Ú@py_assert23Ú@py_assert22Ú@py_assert29Ú@py_assert31Ú@py_assert33Ú@py_assert36Ú@py_assert35Ú@py_assert43Ú@py_format12Ú@py_format14Ú@py_format25Ú@py_format27Ú@py_format38Ú@py_format40Ú@py_format41Ú@py_format44s                                 r   Ú/test_audit_live_reconnect_result_file_integrityzHTestReconnectResultAudit.test_audit_live_reconnect_result_file_integrityR   sš  € ð
 .ˆÝŒw�~Š~˜kÑ*Ô*ð 	FÝŒKÐDÑEÔEÐEå�+˜s¨WÐ5Ñ5Ô5ð 	$¸Ý”y ‘|”|ˆHð	$ð 	$ð 	$ñ 	$ô 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$øøøð 	$ð 	$ð 	$ð 	$ð	að 	a�H”Lð 	a ð 	a�L�L Ñ&Ô&ð 	a¨$ð 	aÐ&¨$Ò.ð 	að 	að 	að 	að 	a°8´<ð 	aÀð 	a°<°<ÀÑ3EÔ3Eð 	aÈð 	aÐ3EÈÒ3Jð 	að 	að 	að 	að 	aÈxÌ|ð 	aÐ\bð 	aÈ|È|Ð\bÑOcÔOcð 	aÐgjð 	aÐOcÐgjÒOjð 	að 	að 	að 	aÐkð 	aÐkñ 	aõ 	aÜO`ð	að 	að 	að 	aÐ&¨$ð 	añ 	aô 	að 	aõ 	aÜZ`ñ	aô 	að 	að 	aõ 	aÜH`ð ñ 	aô 	að 	aõ 	aÜW`ð ñ 	aô 	að 	að 	aõ 	aÜW`ð !ñ 	aô 	aõ 	aÜW`ð "&ñ 	aô 	aõ 	aÜW`ð 'ñ 	aô 	aõ 	aÜW`ð +/ñ 	aô 	að 	að 	añ 	að 	að 	að 	að 	að 	añ 	að 	að 	aßZ`ÒZ`ð	aÙZ`ÔZ`ÐZ`ð	añ 	aõ 	aÜO`ð	að 	að 	að 	aÐ3EÈð 	añ 	aô 	að 	aõ 	aÜZ`ñ	aô 	að 	að 	aõ 	aÜH`ð 4<ñ 	aô 	að 	aõ 	aÜW`ð 4<ñ 	aô 	að 	að 	aõ 	aÜW`ð 4@ñ 	aô 	aõ 	aÜW`ð AEñ 	aô 	aõ 	aÜW`ð 4Fñ 	aô 	aõ 	aÜW`ð JKñ 	aô 	að 	að 	añ 	að 	að 	að 	að 	að 	añ 	að 	að 	aßZ`ÒZ`ð	aÙZ`ÔZ`ÐZ`ð	að 	aõ 	aÜO`ð	að 	að 	að 	aÐOcÐgjð 	añ 	aô 	að 	aõ 	aÜZ`ñ	aô 	að 	að 	aõ 	aÜH`ð PXñ 	aô 	að 	aõ 	aÜW`ð PXñ 	aô 	að 	að 	aõ 	aÜW`ð P\ñ 	aô 	aõ 	aÜW`ð ]cñ 	aô 	aõ 	aÜW`ð Pdñ 	aô 	aõ 	aÜW`ð hkñ 	aô 	að 	að 	añ 	að 	að 	að 	að 	að 	añ 	að 	að 	aßZ`ÒZ`ð	aÙZ`ÔZ`ÐZ`õ	aÜR`ð	að 	añ 	aô 	að 	añ 	að 	aõ 	aÜO`Ð`ñ	aô 	að 	añ 	að 	að 	að 	añ 	að 	aõ 	aõ 	aÜM`ð	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ð 	að 	að 	að 	að 	að 	að 	að 	að 	að 	að 	að 	að 	að 	að 	að 	að 	að 	as   ÁA)Á)A-Á0A-N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rg   r›   © r   r   r   r   (   s>   € € € € € ØhÐhð%$ð %$ð %$ðNað að að að ar   r   c                  ó*   — e Zd ZdZd„ Zd„ Zd„ Zd„ ZdS )ÚTestReconnectValidatorUnitu[   Kiá»ƒm thá»­ Ä‘Æ¡n vá»‹ chi tiáº¿t tá»«ng quy táº¯c báº¥t biáº¿n trong reconnect_validator.c                óº  — dddœ}t          |dd¬¦  «        }|j        }| }|sxddt          j        ¦   «         v st	          j        |¦  «        rt	          j        |¦  «        ndt	          j        |¦  «        dœz  }t          t	          j        |¦  «        ¦  «        ‚d	x}}d
„ |j	        D ¦   «         }t          |¦  «        }|s•ddt          j        ¦   «         v st	          j        t          ¦  «        rt	          j        t          ¦  «        ndt	          j        |¦  «        t	          j        |¦  «        dœz  }t          t	          j        |¦  «        ¦  «        ‚d	x}}d	S )u_   Result thiáº¿u cÃ¡c trÆ°á»�ng cá»‘t lÃµi (status, pid, hwnd) bá»‹ tá»« chá»‘i ngay láº­p tá»©c.ÚSUCCESSzShoreline Hideout)ÚstatusÚzoneF©r0   r1   ú0assert not %(py2)s
{%(py2)s = %(py0)s.is_valid
}Úresr3   Nc              3  ó   K  — | ]}d |v V — Œ	dS )zMissing required fieldNr    ©Ú.0Úerrs     r   ú	<genexpr>zZTestReconnectValidatorUnit.test_validator_rejects_missing_schema_fields.<locals>.<genexpr>k   s(   è è € ÐIÐI°sÐ+¨sÐ2ÐIÐIÐIÐIÐIÐIr   ú,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}Úany©r!   r"   r#   ©r	   rT   rK   rL   rI   rM   rN   rO   rP   rU   r°   )rW   Úincomplete_datar©   rX   rY   r_   Ú@py_format5s          r   Ú,test_validator_rejects_missing_schema_fieldszGTestReconnectValidatorUnit.test_validator_rejects_missing_schema_fieldsf   sw  € à%.Ð8KÐLÐLˆÝ'¨ÈEÐchÐiÑiÔiˆØ”<Ð�<ÐÐÐÐÐÐÕÔÑÔÐÐÕÔ�3ÑÔÐÕÔ�3ÑÔÐÐÕÔ�<ÑÔÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØIÐI¸c¼jÐIÑIÔIÐI�sÐIÑIÔIÐIÐIÐIÐIÐIÕIÔIÑIÔIÐIÐIÕIÔI�sÑIÔIÐIÕIÔI�sÑIÔIÐIÐIÕIÔIÐIÑIÔIÕIÔIÐIÑIÔIÐIÐIÑIÐIÕIÕIÔIÐIÑIÔIÑIÔIÐIÐIÐIÐIÐIÐIÐIr   c                ó8  — dddddddœ}t          |dd¬¦  «        }|j        }| }|sxd	d
t          j        ¦   «         v st	          j        |¦  «        rt	          j        |¦  «        nd
t	          j        |¦  «        dœz  }t          t	          j        |¦  «        ¦  «        ‚dx}}d„ |j	        D ¦   «         }t          |¦  «        }|s•ddt          j        ¦   «         v st	          j        t          ¦  «        rt	          j        t          ¦  «        ndt	          j        |¦  «        t	          j        |¦  «        dœz  }t          t	          j        |¦  «        ¦  «        ‚dx}}d„ |j	        D ¦   «         }t          |¦  «        }|s•ddt          j        ¦   «         v st	          j        t          ¦  «        rt	          j        t          ¦  «        ndt	          j        |¦  «        t	          j        |¦  «        dœz  }t          t	          j        |¦  «        ¦  «        ‚dx}}dS )ua   INV-RECONNECT-PROCESS-ALIVE: PID khÃ´ng tá»“n táº¡i trong Windows process table bá»‹ tá»« chá»‘i.r¤   iÿàõÚ0x12345éd   ©r¥   ÚpidÚhwndri   rk   rl   TFr§   r¨   r©   r3   Nc              3  ó   K  — | ]}d |v V — Œ	dS )zINV-RECONNECT-PROCESS-ALIVENr    r«   s     r   r®   zTTestReconnectValidatorUnit.test_validator_rejects_dead_process_id.<locals>.<genexpr>y   s(   è è € ÐNÐN¸CÐ0°CÐ7ÐNÐNÐNÐNÐNÐNr   r¯   r°   r±   c              3  ó   K  — | ]}d |v V — Œ	dS )z'does not exist in Windows process tableNr    r«   s     r   r®   zTTestReconnectValidatorUnit.test_validator_rejects_dead_process_id.<locals>.<genexpr>z   s(   è è € ÐZÐZÈÐ<ÀÐCÐZÐZÐZÐZÐZÐZr   r²   )rW   Ú	fake_datar©   rX   rY   r_   r´   s          r   Ú&test_validator_rejects_dead_process_idzATestReconnectValidatorUnit.test_validator_rejects_dead_process_idm   sC  € ð  ØØØØØð
ð 
ˆ	õ (¨	ÀdÐ\aÐbÑbÔbˆØ”<Ð�<ÐÐÐÐÐÐÕÔÑÔÐÐÕÔ�3ÑÔÐÕÔ�3ÑÔÐÐÕÔ�<ÑÔÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØNÐNÀ3Ä:ÐNÑNÔNÐN�sÐNÑNÔNÐNÐNÐNÐNÐNÕNÔNÑNÔNÐNÐNÕNÔN�sÑNÔNÐNÕNÔN�sÑNÔNÐNÐNÕNÔNÐNÑNÔNÕNÔNÐNÑNÔNÐNÐNÑNÐNÕNÕNÔNÐNÑNÔNÑNÔNÐNÐNÐNÐNÐNØZÐZÈsÌzÐZÑZÔZÐZ�sÐZÑZÔZÐZÐZÐZÐZÐZÕZÔZÑZÔZÐZÐZÕZÔZ�sÑZÔZÐZÕZÔZ�sÑ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                ót  — t          j        ¦   «         }d|dddddœ}ddd	d	d	d
œdœ}t          ||dd¬¦  «        }|j        }| }|sxddt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }t          t          j
        |¦  «        ¦  «        ‚dx}}d„ |j        D ¦   «         }t          |¦  «        }|s•ddt	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }t          t          j
        |¦  «        ¦  «        ‚dx}}d„ |j        D ¦   «         }t          |¦  «        }|s•ddt	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }t          t          j
        |¦  «        ¦  «        ‚dx}}dS )ug   INV-RECONNECT-NO-HARDCODED-VITALS: Cáº¥m gÃ¡n cá»©ng template CI khi RAM unattached hoáº·c address 0x0.r¤   Ú0x1000rj   r4   rm   r¹   FÚ0x0r   ©Úaddressrk   ri   rl   ©Úmemory_attachedÚplayerTr-   r¨   r©   r3   Nc              3  ó   K  — | ]}d |v V — Œ	dS )r>   Nr    r«   s     r   r®   ziTestReconnectValidatorUnit.test_validator_rejects_hardcoded_vitals_when_ram_unattached.<locals>.<genexpr>œ   s(   è è € ÐTÐTÀ#Ð6¸#Ð=ÐTÐTÐTÐTÐTÐTr   r¯   r°   r±   c              3  ó   K  — | ]}d |v V — Œ	dS )z%Detected hardcoded CI template vitalsNr    r«   s     r   r®   ziTestReconnectValidatorUnit.test_validator_rejects_hardcoded_vitals_when_ram_unattached.<locals>.<genexpr>�   s(   è è € ÐXÐXÀcÐ:¸cÐAÐXÐXÐXÐXÐXÐXr   )r   Úgetpidr	   rT   rK   rL   rI   rM   rN   rO   rP   rU   r°   )	rW   Úcurr_pidÚfake_resultÚdead_ramr©   rX   rY   r_   r´   s	            r   Ú;test_validator_rejects_hardcoded_vitals_when_ram_unattachedzVTestReconnectValidatorUnit.test_validator_rejects_hardcoded_vitals_when_ram_unattached|   s„  € õ ”9‘;”;ˆð  ØØØØØð
ð 
ˆð  %à ØØØð	ð ð
ð 
ˆõ (Ø#Ø!Ø#Ø!ð	
ñ 
ô 
ˆð ”<Ð�<ÐÐÐÐÐÐÕÔÑÔÐÐÕÔ�3ÑÔÐÕÔ�3ÑÔÐÐÕÔ�<ÑÔÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØTÐTÈÌÐTÑTÔTÐT�sÐTÑTÔTÐTÐTÐTÐTÐTÕTÔTÑTÔTÐTÐTÕTÔT�sÑTÔTÐTÕTÔT�sÑTÔTÐTÐTÕTÔTÐTÑTÔTÕTÔTÐTÑTÔTÐTÐTÑTÐTÕTÕTÔTÐTÑTÔTÑTÔTÐTÐTÐTÐTÐTØXÐXÈSÌZÐXÑXÔXÐX�sÐXÑXÔXÐXÐXÐXÐXÐXÕXÔXÑXÔXÐXÐXÕXÔX�sÑXÔXÐXÕXÔX�sÑXÔXÐXÐXÕXÔXÐXÑXÔXÕXÔXÐXÑXÔXÐXÐXÑXÐXÕXÕXÔXÐXÑXÔXÑXÔXÐXÐXÐXÐXÐXÐXÐXr   c                óÚ  — t          j        ¦   «         }d|dddddœ}dddddd	œd
œ}t          ||dd¬¦  «        }|j        }|sxddt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }t          t          j
        |¦  «        ¦  «        ‚d}|j        }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        |¦  «        t          j        |	¦  «        dœz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}x}
}	dS )uZ   Dá»¯ liá»‡u thá»±c nghiá»‡m Ä‘á»�c tá»« RAM tháº­t, PID sá»‘ng, HWND há»£p lá»‡ -> PASSED.r¤   rÁ   i¬  i°  iÂ  r¹   TÚ0x7FF712345678rÃ   rÅ   Fr-   z,assert %(py2)s
{%(py2)s = %(py0)s.is_valid
}r©   r3   Nr   rn   )zL%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.errors
})
} == %(py8)sr6   r7   r;   r<   )r   rÊ   r	   rT   rK   rL   rI   rM   rN   rO   rP   rU   r6   rV   )rW   rË   Úauthentic_resultÚauthentic_ramr©   rX   Ú@py_format3r`   ra   rb   rZ   rc   rd   s                r   Ú*test_validator_accepts_authentic_telemetryzETestReconnectValidatorUnit.test_validator_accepts_authentic_telemetryŸ   s:  € å”9‘;”;ˆð  ØØØØØð
ð 
Ðð  $à+ØØØð	ð ð
ð 
ˆõ (Ø(Ø&Ø#Ø!ð	
ñ 
ô 
ˆð Œ|Ðˆ|ÐÐÐÕÔÑÔÐÐÕÔˆsÑÔÐÕÔˆsÑÔÐÐÕÔˆ|ÑÔÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐØ”:Ð#�s�:‰ŒÐ# !Ð#ˆ !Ò#Ð#Ð#Ñ#Õ#Ô#Ð#Ð#Ð#Ð#ˆ !Ð#Ñ#Ô#Ð#Õ#Ô#Ñ#Ô#Ð#Ð#Õ#Ô#�sÑ#Ô#Ð#Õ#Ô#�sÑ#Ô#Ð#Ð#Ð#Õ#Ô#Ñ#Ô#Ð#Ð#Õ#Ô#�3Ñ#Ô#Ð#Õ#Ô#�3Ñ#Ô#Ð#Ð#Õ#Ô#�:Ñ#Ô#Õ#Ô#ˆÑ#Ô#Õ#Ô# !Ñ#Ô#Ð#Ð#Ñ#Ð#Ð#Ð#Ð#Ð#Ñ#Ð#Õ#Õ#Ô#Ð#Ñ#Ô#Ñ#Ô#Ð#Ð#Ð#Ð#Ð#Ð#Ð#Ð#Ð#Ð#Ð#r   N)rœ   r�   rž   rŸ   rµ   r¿   rÎ   rÔ   r    r   r   r¢   r¢   c   s`   € € € € € ØeÐeðJð Jð Jð[ð [ð [ð!Yð !Yð !YðF$ð $ð $ð $ð $r   r¢   c                  ó   — e Zd ZdZd„ ZdS )ÚTestScreenCapturerInvariantsuG   Kiá»ƒm thá»­ báº¥t biáº¿n INV-CAPTURE-CLIENT-ONLY trÃªn ScreenCapturer.c                ó^  — t          |¬¦  «        }t          j        |dd¬¦  «        5  t          d¦  «        5 }|                     dd¬¦  «        }|                     ¦   «          ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   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        }|j        }	 |	|¦  «        }
|
sæddt          j        ¦   «         v st          j	        t          ¦  «        rt          j
        t          ¦  «        ndt          j
        |¦  «        t          j
        |	¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |
¦  «        dœz  }t          t          j        |¦  «        ¦  «        ‚dx}x}	}
t!          j        |¦  «        5 }|j        }d}||k    }	|	sªt          j        d|	fd||f¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        t          j
        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}	}|                     d¦  «        }|dd…         }d}	||	k    }|slt          j        d|fd||	f¦  «        t          j
        |¦  «        t          j
        |	¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}	ddd¦  «         n# 1 swxY w Y   |                     d d!¦  «        }t          j        }|j        }	 |	|¦  «        }
|
sæddt          j        ¦   «         v st          j	        t          ¦  «        rt          j
        t          ¦  «        ndt          j
        |¦  «        t          j
        |	¦  «        d"t          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nd"t          j
        |
¦  «        dœz  }t          t          j        |¦  «        ¦  «        ‚dx}x}	}
t#          |d#d$¬%¦  «        5 }t+          j        |¦  «        }ddd¦  «         n# 1 swxY w Y   |d&         }d}	||	u }|slt          j        d'|fd(||	f¦  «        t          j
        |¦  «        t          j
        |	¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}	|d)         }d}	||	u }|slt          j        d'|fd(||	f¦  «        t          j
        |¦  «        t          j
        |	¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}	dS )*u  INV-CAPTURE-CLIENT-ONLY: Khi khÃ´ng tÃ¬m tháº¥y cá»­a sá»• POE2 (hwnd=None, bbox=None),
        ScreenCapturer TUYá»†T Ä�á»�I KHÃ”NG Ä‘Æ°á»£c gá»�i ImageGrab.grab() chá»¥p toÃ n Desktop,
        mÃ  pháº£i táº¡o áº£nh chuáº©n Ä‘oÃ¡n ná»�n tá»‘i chuyÃªn dá»¥ng.
        )Ú
output_dirÚfind_poe2_windowN)Úreturn_valuezPIL.ImageGrab.grabÚTEST_INVARIANT_WINDOW_NOT_FOUNDF)Ú
event_nameÚcapture_ram)úis not)z%(py0)s is not %(py3)sÚ
saved_path)r!   r9   rD   r$   zbassert %(py7)s
{%(py7)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.path
}.exists
}(%(py5)s)
}r   r    )i   iÐ  rn   )z,%(py2)s
{%(py2)s = %(py0)s.size
} == %(py5)sÚimg)r!   r"   r$   zassert %(py7)sr%   )é   rá   é   )é   é   é*   ©z%(py1)s == %(py4)s©r8   r#   úassert %(py6)srp   z.pngz.jsonÚ	json_pathr&   r'   r(   Úwindow_found)Úis)z%(py1)s is %(py4)sÚbbox)r
   r   ÚobjectÚcapture_screenshotÚassert_not_calledrI   rV   rK   rL   rM   rN   rO   rP   r   rF   rH   r   rQ   ÚsizeÚgetpixelÚreplacerR   rS   )rW   r   ÚcapturerÚ	mock_grabrß   r`   rX   r_   rf   rY   rZ   r[   rà   ra   Úbg_pixelre   r´   Ú@py_format7ré   r\   Úmetas                        r   Ú:test_screen_capturer_never_captures_desktop_when_hwnd_nonezWTestScreenCapturerInvariants.test_screen_capturer_never_captures_desktop_when_hwnd_noneÄ   s¶  € õ
 "¨_Ð=Ñ=Ô=ˆõ Œ\˜(Ð$6ÀTÐJÑJÔJð 		.ð 		.åÐ+Ñ,Ô,ð .°	Ø%×8Ò8Ø@Ø %ð 9ñ ô �
ð ×+Ò+Ñ-Ô-Ð-ð.ð .ð .ñ .ô .ð .ð .ð .ð .ð .ð .øøøð .ð .ð .ð .ð		.ð 		.ð 		.ñ 		.ô 		.ð 		.ð 		.ð 		.ð 		.ð 		.ð 		.øøøð 		.ð 		.ð 		.ð 		.ð "&Ð%ˆz Ð%Ð%Ð%Ð%Õ%Ô%Ð%Ð%Ð%Ð%ˆz Ð%Ñ%Ô%Ð%Õ%Ô%Ñ%Ô%Ð%Ð%Õ%Ô%ˆzÑ%Ô%Ð%Õ%Ô%ˆzÑ%Ô%Ð%Ð%Õ%Ô% Ñ%Ô%Ð%Ð%Ñ%Ð%Ð%Ð%Ð%Ð%Ñ%Ð%Õ%Õ%Ô%Ð%Ñ%Ô%Ñ%Ô%Ð%Ð%Ð%Ð%Ð%ÝŒwÐ)ˆwŒ~Ð)ˆ~ˆ~˜jÑ)Ô)Ð)Ð)Ð)Ð)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô)�rÑ)Ô)Ð)Õ)Ô)�rÑ)Ô)Ð)Ð)Õ)Ô)ˆwÑ)Ô)Õ)Ô)ˆ~Ñ)Ô)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô)˜jÑ)Ô)Ð)Õ)Ô)˜jÑ)Ô)Ð)Ð)Õ)Ô)Ð)Ñ)Ô)Ð)Ð)Ñ)Ð)Õ)Õ)Ô)Ð)Ñ)Ô)Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)õ ŒZ˜
Ñ#Ô#ð 	0 sØ”8Ð*˜{Ð*�8˜{Ò*Ð*Ð*Ð*Õ*Ô*Ð*Ð*Ð*Ð*�8˜{Ð*Ñ*Ô*Ð*Õ*Ô*Ñ*Ô*Ð*Ð*Õ*Ô*�3Ñ*Ô*Ð*Õ*Ô*�3Ñ*Ô*Ð*Ð*Õ*Ô*�8Ñ*Ô*Õ*Ô*˜{Ñ*Ô*Ð*Ð*Ñ*Ð*Ð*Ð*Ð*Ð*Ñ*Ð*Õ*Õ*Ô*Ð*Ñ*Ô*Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*à—|’| HÑ-Ô-ˆHØ˜B˜Q˜B”<Ð/ <Ð/�< <Ò/Ð/Ð/Ð/Õ/Ô/Ð/Ð/Ð/Ð/�< <Ð/Ñ/Ô/Õ/Ô/�<Ñ/Ô/Õ/Ô/ <Ñ/Ô/Ð/Ð/Ñ/Ð/Ð/Ð/Ð/Ð/Ñ/Ð/Õ/Õ/Ô/Ð/Ñ/Ô/Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/ð		0ð 	0ð 	0ñ 	0ô 	0ð 	0ð 	0ð 	0ð 	0ð 	0ð 	0øøøð 	0ð 	0ð 	0ð 	0ð ×&Ò& v¨wÑ7Ô7ˆ	ÝŒwÐ(ˆwŒ~Ð(ˆ~ˆ~˜iÑ(Ô(Ð(Ð(Ð(Ð(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô(�rÑ(Ô(Ð(Õ(Ô(�rÑ(Ô(Ð(Ð(Õ(Ô(ˆwÑ(Ô(Õ(Ô(ˆ~Ñ(Ô(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô(˜iÑ(Ô(Ð(Õ(Ô(˜iÑ(Ô(Ð(Ð(Õ(Ô(Ð(Ñ(Ô(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ý�)˜S¨7Ð3Ñ3Ô3ð 	 °qÝ”9˜Q‘<”<ˆDð	 ð 	 ð 	 ñ 	 ô 	 ð 	 ð 	 ð 	 ð 	 ð 	 ð 	 øøøð 	 ð 	 ð 	 ð 	 ð �NÔ#Ð, uÐ,Ð# uÐ,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Ð# uÐ,Ñ,Ô,Õ,Ô,Ð#Ñ,Ô,Õ,Ô, uÑ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ø�FŒ|Ð#˜tÐ#ˆ|˜tÐ#Ð#Ð#Ð#Õ#Ô#Ð#Ð#Ð#Ð#ˆ|˜tÐ#Ñ#Ô#Õ#Ô#ˆ|Ñ#Ô#Õ#Ô#˜tÑ#Ô#Ð#Ð#Ñ#Ð#Ð#Ð#Ð#Ð#Ñ#Ð#Õ#Õ#Ô#Ð#Ñ#Ô#Ñ#Ô#Ð#Ð#Ð#Ð#Ð#Ð#Ð#Ð#Ð#sY   ¨B¸,A0Á$BÁ0A4	Á4BÁ7A4	Á8BÂBÂBÉEN>Î>OÏOÓ=TÔT"Ô%T"N)rœ   r�   rž   rŸ   rø   r    r   r   rÖ   rÖ   Á   s)   € € € € € ØQÐQð$$ð $$ð $$ð $$ð $$r   rÖ   c                  ó   — e Zd ZdZd„ ZdS )ÚTestIncidentDossierGovernanceuS   Kiá»ƒm toÃ¡n há»“ sÆ¡ sá»± cá»‘ Rule 6: INCIDENT_20260918_RECONNECT_FALSE_POSITIVE.c                ó¼  — t           j                             ddd¦  «        }t           j        }|j        } ||¦  «        }|sþt	          j        d|› �¦  «        dz   dt          j        ¦   «         v st	          j        t           ¦  «        rt	          j	        t           ¦  «        ndt	          j	        |¦  «        t	          j	        |¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        dœz  }t          t	          j        |¦  «        ¦  «        ‚d	x}x}}t           j                             |d
¦  «        }t           j                             |d¦  «        }t           j        }|j        } ||¦  «        }|sût	          j        d¦  «        dz   dt          j        ¦   «         v st	          j        t           ¦  «        rt	          j	        t           ¦  «        ndt	          j	        |¦  «        t	          j	        |¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        dœz  }t          t	          j        |¦  «        ¦  «        ‚d	x}x}}t           j        }|j        } ||¦  «        }|sût	          j        d¦  «        dz   dt          j        ¦   «         v st	          j        t           ¦  «        rt	          j	        t           ¦  «        ndt	          j	        |¦  «        t	          j	        |¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        dœz  }t          t	          j        |¦  «        ¦  «        ‚d	x}x}}t          |dd¬¦  «        5 }t          j        |¦  «        }	d	d	d	¦  «         n# 1 swxY w Y   |	d         }
d}|
|k    }|slt	          j        d|fd|
|f¦  «        t	          j	        |
¦  «        t	          j	        |¦  «        dœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚d	x}
x}}|	d         }
d}|
|k    }|slt	          j        d|fd|
|f¦  «        t	          j	        |
¦  «        t	          j	        |¦  «        dœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚d	x}
x}}d}
|	d         }|
|v }|slt	          j        d|fd|
|f¦  «        t	          j	        |
¦  «        t	          j	        |¦  «        dœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚d	x}
x}}d }
|	d         }|
|v }|slt	          j        d|fd|
|f¦  «        t	          j	        |
¦  «        t	          j	        |¦  «        dœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚d	x}
x}}t          |dd¬¦  «        5 }|                     ¦   «         }d	d	d	¦  «         n# 1 swxY w Y   d!}
|
|v }|s—t	          j        d|fd"|
|f¦  «        t	          j	        |
¦  «        d#t          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        nd#d$œz  }d%d&|iz  }t          t	          j        |¦  «        ¦  «        ‚d	x}
}d'}
|
|v }|s—t	          j        d|fd"|
|f¦  «        t	          j	        |
¦  «        d#t          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        nd#d$œz  }d%d&|iz  }t          t	          j        |¦  «        ¦  «        ‚d	x}
}d(}
|
|v }|s—t	          j        d|fd"|
|f¦  «        t	          j	        |
¦  «        d#t          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        nd#d$œz  }d%d&|iz  }t          t	          j        |¦  «        ¦  «        ‚d	x}
}d)}
|
|v }|s—t	          j        d|fd"|
|f¦  «        t	          j	        |
¦  «        d#t          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        nd#d$œz  }d%d&|iz  }t          t	          j        |¦  «        ¦  «        ‚d	x}
}d	S )*uv   KhÃ©p kÃ­n vÃ²ng láº·p tá»± sá»­a lá»—i: Incident Dossier pháº£i Ä‘áº§y Ä‘á»§ 4 bÆ°á»›c RCA vÃ  artifacts liÃªn káº¿t.r   r   r   u   Thiáº¿u thÆ° má»¥c dossier zc
>assert %(py7)s
{%(py7)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.path
}.isdir
}(%(py5)s)
}r   Údossier_dirr    Nzincident_report.jsonzRCA_4_STEPS_ANALYSIS.mdu!   Thiáº¿u file incident_report.jsonr   Úreport_jsonu$   Thiáº¿u file RCA_4_STEPS_ANALYSIS.mdÚrca_mdr&   r'   r(   Úincident_idrn   ræ   rç   rè   rp   ÚseverityÚCRITICALr>   Úviolated_invariantsr?   )z%(py1)s in %(py4)szINV-CAPTURE-CLIENT-ONLYu$   BÆ¯á»šC 1: HIá»†N TÆ¯á»¢NG Sá»° Cá»�rA   Úrca_textrC   rD   r$   u4   BÆ¯á»šC 2: Báº°NG CHá»¨NG MÃ‚U THUáºªN THá»°C Ä�á»ŠAu/   BÆ¯á»šC 3: PHÃ‚N TÃ�CH NGUYÃŠN NHÃ‚N Gá»�C Rá»„uB   BÆ¯á»šC 4: GIáº¢I PHÃ�P KHáº®C PHá»¤C & CHá»�T CHáº¶N NGÄ‚N NGá»ªA)r   rF   rG   ÚisdirrI   rJ   rK   rL   rM   rN   rO   rP   rH   rQ   rR   rS   rV   Úread)rW   rü   rX   rY   rZ   r[   rý   rþ   r\   Údatare   r`   r´   rö   r  r_   rf   s                    r   Ú'test_incident_dossier_structure_and_rcazETestIncidentDossierGovernance.test_incident_dossier_structure_and_rcaî   sB
  € å”g—l’lØ˜[Ð*Vñ
ô 
ˆõ ŒwÐVˆwŒ}ÐVˆ}ˆ}˜[Ñ)Ô)ÐVÐ)ÐVÕVÔVÐ+VÈÐ+VÐ+VÑVÔVÐVÑVÐVÕVÔVÑVÔVÐVÐVÕVÔV�rÑVÔVÐVÕVÔV�rÑVÔVÐVÐVÕVÔVˆwÑ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ÑVÔVÑVÔVÐVÐVÐVÐVÐVÐVÐVå”g—l’l ;Ð0FÑGÔGˆÝ”—’˜kÐ+DÑEÔEˆåŒwÐOˆwŒ~ÐOˆ~ˆ~˜kÑ*Ô*ÐOÐ*ÐOÕOÔOÐ,OÑOÔOÐOÑOÐOÕOÔOÑOÔOÐOÐOÕOÔO�rÑOÔOÐOÕOÔO�rÑOÔOÐOÐOÕOÔOˆwÑOÔOÕOÔOˆ~ÑOÔOÐOÕOÔOÑOÔOÐOÐOÕOÔO˜kÑOÔOÐOÕOÔO˜kÑ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ÝŒwÐMˆwŒ~ÐMˆ~ˆ~˜fÑ%Ô%ÐMÐ%ÐMÕMÔMÐ'MÑMÔMÐMÑMÐMÕMÔMÑMÔMÐMÐMÕMÔM�rÑMÔMÐMÕMÔM�rÑMÔMÐMÐMÕMÔMˆwÑMÔMÕMÔMˆ~ÑMÔMÐMÕMÔMÑMÔMÐMÐMÕMÔM˜fÑMÔMÐMÕMÔM˜fÑMÔMÐMÐMÕMÔMÐ%ÑMÔMÐMÐMÑMÐMÕMÕMÔMÐMÑMÔMÑMÔMÐMÐMÐMÐMÐMÐMÐMå�+˜s¨WÐ5Ñ5Ô5ð 	 ¸Ý”9˜Q‘<”<ˆDð	 ð 	 ð 	 ñ 	 ô 	 ð 	 ð 	 ð 	 ð 	 ð 	 ð 	 øøøð 	 ð 	 ð 	 ð 	 ð �MÔ"ÐRÐ&RÐRÐ"Ð&RÒRÐRÐRÐRÕRÔRÐRÐRÐRÐRÐ"Ð&RÐRÑRÔRÕRÔRÐ"ÑRÔRÕRÔRÐ&RÑRÔRÐRÐRÑRÐRÐRÐRÐRÐRÑRÐRÕRÕRÔRÐRÑRÔRÑRÔRÐRÐRÐRÐRÐRÐRÐRØ�JÔÐ- :Ð-Ð :Ò-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-Ð :Ð-Ñ-Ô-Õ-Ô-ÐÑ-Ô-Õ-Ô- :Ñ-Ô-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ø2ÐQ°dÐ;PÔ6QÐQÐ2Ð6QÐQÐQÐQÐQÕQÔQÐQÐQÐQÐQÐ2Ð6QÐQÑQÔQÕQÔQÐ2ÑQÔQÕQÔQÐ6QÑQÔQÐQÐQÑQÐQÐQÐQÐQÐQÑQÐQÕQÕQÔQÐQÑQÔQÑQÔQÐQÐQÐQÐQÐQÐQÐQØ(ÐG¨DÐ1FÔ,GÐGÐ(Ð,GÐGÐGÐGÐGÕGÔGÐGÐGÐGÐGÐ(Ð,GÐGÑGÔGÕGÔGÐ(ÑGÔGÕGÔGÐ,GÑGÔGÐGÐGÑGÐGÐGÐGÐGÐGÑGÐGÕGÕGÔGÐGÑGÔGÑGÔGÐGÐGÐGÐGÐGÐGÐGå�&˜#¨Ð0Ñ0Ô0ð 	 °AØ—v’v‘x”xˆHð	 ð 	 ð 	 ñ 	 ô 	 ð 	 ð 	 ð 	 ð 	 ð 	 ð 	 øøøð 	 ð 	 ð 	 ð 	 ð 6ÐAÐ5¸ÐAÐAÐAÐAÕAÔAÐAÐAÐAÐAÐ5¸ÐAÑAÔAÕAÔAÐ5Ñ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ÐAÐAÑAÐAÕAÕAÔAÐAÑAÔAÑAÔAÐAÐAÐAÐAÐAØEÐQÐEÈÐQÐQÐQÐQÕQÔQÐQÐQÐQÐQÐEÈÐQÑQÔQÕQÔQÐEÑQÔQÐQÕQÔQÑQÔQÐQÐQÕQÔQÈÑQÔQÐQÕQÔQÈÑQÔQÐQÐQÐQÐQÑQÐQÐQÐQÐQÐQÑQÐQÕQÕQÔQÐQÑQÔQÑQÔQÐQÐQÐQÐQÐQØ@ÐLÐ@ÀHÐLÐLÐLÐLÕLÔLÐLÐLÐLÐLÐ@ÀHÐLÑLÔLÕLÔLÐ@ÑLÔLÐLÕLÔLÑLÔLÐLÐLÕLÔLÀHÑLÔLÐLÕLÔLÀHÑLÔLÐLÐLÐLÐLÑLÐLÐLÐLÐLÐLÑLÐLÕLÕLÔLÐLÑLÔLÑLÔLÐLÐLÐLÐLÐLØSÐ_ÐSÐW_Ð_Ð_Ð_Ð_Õ_Ô_Ð_Ð_Ð_Ð_ÐSÐW_Ð_Ñ_Ô_Õ_Ô_ÐSÑ_Ô_Ð_Õ_Ô_Ñ_Ô_Ð_Ð_Õ_Ô_ÐW_Ñ_Ô_Ð_Õ_Ô_ÐW_Ñ_Ô_Ð_Ð_Ð_Ð_Ñ_Ð_Ð_Ð_Ð_Ð_Ñ_Ð_Õ_Õ_Ô_Ð_Ñ_Ô_Ñ_Ô_Ð_Ð_Ð_Ð_Ð_Ð_Ð_s$   ÏO;Ï;O?ÐO?Ø$YÙY	ÙY	N)rœ   r�   rž   rŸ   r  r    r   r   rú   rú   ë   s.   € € € € € Ø]Ð]ð`ð `ð `ð `ð `r   rú   )rŸ   Ú
__future__r   ÚbuiltinsrK   Ú_pytest.assertion.rewriteÚ	assertionÚrewriterI   rR   r   r   r   Úunittest.mockr   r   r€   ÚPILr   Ú&src.assistant_tool.reconnect_validatorr   r   r	   Ú"src.assistant_tool.screen_capturerr
   Úfixturer   r   r¢   rÖ   rú   r    r   r   ú<module>r     s¾  ðð
ð 
ð #Ð "Ð "Ð "Ð "Ð "à  € € € € € € € € € € € € €€€€Ø 	€	€	€	Ø €€€Ø €€€Ø *Ð *Ð *Ð *Ð *Ð *Ð *Ð *à €€€Ø Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð ð ð
 >Ð =Ð =Ð =Ð =Ð =ð „ð0ð 0ñ „ð0ð8að 8að 8að 8að 8añ 8aô 8að 8aðv[$ð [$ð [$ð [$ð [$ñ [$ô [$ð [$ð|'$ð '$ð '$ð '$ð '$ñ '$ô '$ð '$ðT`ð `ð `ð `ð `ñ `ô `ð `ð `ð `r   