§
    ¢+¬jÞ>  ã                  ó8  — 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
mZmZmZmZ ddlmZmZ ddlZddlmZmZmZmZ ddlmZ ddlmZmZmZmZ dd	lm Z m!Z! dd
l"m#Z#m$Z$ ddl%m&Z&  G d„ d¦  «        Z' G d„ d¦  «        Z( G d„ d¦  «        Z) G d„ d¦  «        Z*dS )ub  AutoPOE2 - Bá»™ Kiá»ƒm Thá»­ Phá»¥c Há»“i Lá»—i & Kiá»ƒm ToÃ¡n Sá»©c Bá»�n (Fault Injection & Resilience Harness)
Domain: QA & Governance Sentinel (SÆ° Ä‘oÃ n 4)
TuÃ¢n thá»§ nghiÃªm ngáº·t:
- Rule 8: Kiá»ƒm toÃ¡n toÃ n diá»‡n Master Invariant Matrix.
- Rule 9: Verification Gate Ä‘á»™c láº­p.
- Rule 11: PhÃ²ng ngá»«a há»“i quy báº±ng Mock Harness tá»± Ä‘á»™ng.
- Rule 14: 100% dá»¯ liá»‡u cáº¥u trÃºc thá»±c nghiá»‡m, khÃ´ng mock áº£o.

Kiá»ƒm chá»©ng 3 ká»‹ch báº£n trá»�ng yáº¿u:
1. Scenario 1 (Focus Loss): Cá»­a sá»• game máº¥t focus tiá»�n cáº£nh -> Focus Interlock cháº·n 100% phÃ­m/chuá»™t.
2. Scenario 2 (IPC Watchdog Degradation): Heartbeat giÃ¡n Ä‘oáº¡n > 3000ms -> Co-Pilot chuyá»ƒn sang Passive Degrade, nháº£ WASD an toÃ n.
3. Scenario 3 (Faustus Gold Exhaustion Guard): Quá»¹ vÃ ng <= 5,000 Gold -> KhÃ³a giao dá»‹ch báº£o vá»‡ INV-EXCHANGE-GOLD-TAX.
é    )ÚannotationsN)ÚAnyÚDictÚListÚOptional)Ú	MagicMockÚpatch)ÚALL_INVARIANT_CODESÚERR_CORE_DISCONNECTEDÚERR_WATCHDOG_HEARTBEAT_TIMEOUTÚInvariantSentinel)ÚAgentWatcherSentinel)ÚExchangeActionTypeÚExchangeOrderÚExchangeOrderStatusÚExchangePortfolioConfig)ÚCurrencyPortfolioOptimizerÚOptimizationResult)ÚCurrencyExchangeOrchestratorÚExchangeExecutionReport)ÚItemHoverWatcherc                  ó$   — e Zd ZdZd„ Zd„ Zd„ ZdS )ÚTestFocusLossInterlockuÊ   Kiá»ƒm tra pháº£n á»©ng khi cá»­a sá»• game Ä‘á»™t ngá»™t máº¥t focus tiá»�n cáº£nh.
    
    Báº¥t biáº¿n liÃªn quan:
    - INV-INPUT-ABS-MOUSE
    - INV-WASD-NO-BLIND-LMB
    - INV-F8-MUTES-BRAIN
    c                ó^	  — t          dd¬¦  «        }t          ¦   «         |_        t          d¬¦  «        |_        d|_        |j        } |¦   «         }d}||u }|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        |¦  «        d	œz  }d
d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}}dddddœ}|                     dd|¦  «         |j        }|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        |¦  «        t          j        |¦  «        d	œz  }d
d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}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|_        |j        } |¦   «         }d}||u }|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        |¦  «        d	œz  }d
d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}}|j                             ¦   «          d|d<   d|d<   |                     dd|¦  «         |j        }|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        |¦  «        t          j        |¦  «        d	œz  }t          j        d¦  «        dz   d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}}dS )ug   Khi cá»­a sá»• game máº¥t focus, ItemHoverWatcher KHÃ”NG Ä�Æ¯á»¢C gá»­i Ctrl+C hoáº·c phÃ­m báº¥t ká»³.g      Y@T)Údwell_time_msÚenable_focus_interlockzItem Class: Boots
Rarity: Rare©Úreturn_value©Úis)zU%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.is_game_window_focused
}()
} is %(py7)sÚwatcher©Úpy0Úpy2Úpy4Úpy7úassert %(py9)sÚpy9N)éô  r)   g      ^@F©Úlast_posÚ
anchor_posÚdwell_accum_msÚhas_triggeredr)   é   ©ú==©zS%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.send_ctrl_c
}.call_count
} == %(py7)sr.   )z%(py1)s is %(py4)s)Úpy1r%   zassert %(py6)sÚpy6r-   r   uM   VI PHáº M FOCUS INTERLOCK: send_ctrl_c bá»‹ gá»�i khi game Ä‘ang máº¥t focus!z
>assert %(py9)s)r   r   Úsend_ctrl_cÚread_clipboard_textÚ_mock_is_focusedÚis_game_window_focusedÚ
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanationÚprocess_tickÚ
call_countÚ
reset_mockÚ_format_assertmsg)Úselfr!   Ú@py_assert1Ú@py_assert3Ú@py_assert6Ú@py_assert5Ú@py_format8Ú@py_format10ÚstateÚ@py_assert0Ú@py_assert2Ú@py_format5Ú@py_format7s                ú=C:\Projects\AutoPOE2\tests\test_fault_injection_resilience.pyÚ/test_focus_loss_blocks_item_hover_watcher_inputzFTestFocusLossInterlock.test_focus_loss_blocks_item_hover_watcher_input<   s!  € å"°ÈtÐTÑTÔTˆÝ'™kœkˆÔÝ&/Ð=^Ð&_Ñ&_Ô&_ˆÔ#ð $(ˆÔ ØÔ-Ð7Ð-Ð-Ñ/Ô/Ð7°4Ð7Ð/°4Ð7Ð7Ð7Ð7Õ7Ô7Ð7Ð7Ð7Ð7Ð/°4Ð7Ñ7Ô7Ð7Õ7Ô7Ñ7Ô7Ð7Ð7Õ7Ô7ˆwÑ7Ô7Ð7Õ7Ô7ˆwÑ7Ô7Ð7Ð7Õ7Ô7Ð-Ñ7Ô7Õ7Ô7Ð/Ñ7Ô7Õ7Ô7°4Ñ7Ô7Ð7Ð7Ñ7Ð7Ð7Ð7Ð7Ð7Ñ7Ð7Õ7Õ7Ô7Ð7Ñ7Ô7Ñ7Ô7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7ð #Ø$Ø#Ø"ð	
ð 
ˆð 	×Ò˜S # uÑ-Ô-Ð-ØÔ"Ð2Ð"Ô-Ð2°Ð2Ð-°Ò2Ð2Ð2Ð2Õ2Ô2Ð2Ð2Ð2Ð2Ð-°Ð2Ñ2Ô2Ð2Õ2Ô2Ñ2Ô2Ð2Ð2Õ2Ô2ˆwÑ2Ô2Ð2Õ2Ô2ˆwÑ2Ô2Ð2Ð2Õ2Ô2Ð"Ñ2Ô2Õ2Ô2Ð-Ñ2Ô2Õ2Ô2°Ñ2Ô2Ð2Ð2Ñ2Ð2Ð2Ð2Ð2Ð2Ñ2Ð2Õ2Õ2Ô2Ð2Ñ2Ô2Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ø�_Ô%Ð-¨Ð-Ð%¨Ð-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-Ð%¨Ð-Ñ-Ô-Õ-Ô-Ð%Ñ-Ô-Õ-Ô-¨Ñ-Ô-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-ð $)ˆÔ ØÔ-Ð8Ð-Ð-Ñ/Ô/Ð8°5Ð8Ð/°5Ð8Ð8Ð8Ð8Õ8Ô8Ð8Ð8Ð8Ð8Ð/°5Ð8Ñ8Ô8Ð8Õ8Ô8Ñ8Ô8Ð8Ð8Õ8Ô8ˆwÑ8Ô8Ð8Õ8Ô8ˆwÑ8Ô8Ð8Ð8Õ8Ô8Ð-Ñ8Ô8Õ8Ô8Ð/Ñ8Ô8Õ8Ô8°5Ñ8Ô8Ð8Ð8Ñ8Ð8Ð8Ð8Ð8Ð8Ñ8Ð8Õ8Õ8Ô8Ð8Ñ8Ô8Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8àÔ×&Ò&Ñ(Ô(Ð(Ø"'ˆÐÑØ!&ˆˆoÑð 	×Ò˜S # uÑ-Ô-Ð-ØÔ"ð 	
Ð"Ô-ð 	
°ð 	
Ð-°Ò2ð 	
ð 	
ð 	
õ 	
ìð	
ð 	
ð 	
ð 	
Ð-°ð 	
ñ 	
ô 	
ð 	
õ 	
ä	ñ	
ô 	
ð 	
ð 	
õ 	
ìð ñ 	
ô 	
ð 	
õ 	
ä 	ð ñ 	
ô 	
ð 	
ð 	
õ 	
ä 	ð #ñ 	
ô 	
õ 	
ä 	ð .ñ 	
ô 	
õ 	
ä 	ð 23ñ 	
ô 	
ð 	
ð 	
ñ 	
ð 	
õ 	
ìð \ñ	
ô 	
ð 	
ñ 	
ð 	
ð 	
ð 	
ñ 	
ð 	
õ 	
õ 	
ìð	
ñ 	
ô 	
ñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ó    c           	     ó   — ddl m}  |¦   «         }t          ¦   «         }t          d¬¦  «        }t          d¬¦  «        }t          dd¬¦  «        5  t          d¦  «        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  }
t          j        d¦  «        dz   d|
iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}	}ddd¦  «         n# 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS )up   Khi HideoutNavigator báº¯t Ä‘áº§u Ä‘iá»�u hÆ°á»›ng, pháº£i xÃ¡c nháº­n focus cá»­a sá»• trÆ°á»›c khi gá»­i WASD.r   )ÚHideoutNavigatorztest.pngr   )i—  i…  z(src.common.win32_window.find_poe2_windowi90  z+src.common.win32_window.ensure_window_focus)Úsend_wasd_funcÚcapture_funcÚfind_map_device_funcr/   ©ú>=©z2%(py2)s
{%(py2)s = %(py0)s.call_count
} >= %(py5)sÚmock_ensure_focus©r#   r$   Úpy5u:   Pháº£i gá»�i ensure_window_focus trÆ°á»›c khi di chuyá»ƒn!z
>assert %(py7)sr&   N)Ú$src.assistant_tool.hideout_navigatorrU   r   r	   Ú#navigate_from_salvage_to_map_devicerB   r9   r:   r;   r<   r=   r>   rD   r?   r@   )rE   rU   ÚnavÚmock_send_wasdÚmock_captureÚmock_find_mdr\   rF   Ú@py_assert4rG   Ú@py_format6rJ   s               rQ   Ú3test_hideout_navigator_focus_interlock_verificationzJTestFocusLossInterlock.test_hideout_navigator_focus_interlock_verification^   sf  € àIÐIÐIÐIÐIÐIàÐÑ Ô ˆÝ"™œˆÝ ¨jÐ9Ñ9Ô9ˆÝ ¨kÐ:Ñ:Ô:ˆåÐ=ÈEÐRÑRÔRð 	wð 	wÝÐDÑEÔEð wÐIZØ×7Ò7Ø#1Ø!-Ø)5ð 8ñ ô ð ð
 )Ô3Ðv°qÐvÐ3°qÒ8ÐvÐvÐvÕvÔvÐvÐvÐvÐvÐ3°qÐvÑvÔvÐvÕvÔvÑvÔvÐvÐvÕvÔvÐ(ÑvÔvÐvÕvÔvÐ(ÑvÔvÐvÐvÕvÔvÐ3ÑvÔvÕvÔv°qÑ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ðwð wð wñ wô wð wð wð wð wð wð wøøøð wð wð wð wð	wð 	wð 	wñ 	wô 	wð 	wð 	wð 	wð 	wð 	wð 	wð 	wøøøð 	wð 	wð 	wð 	wð 	wð 	ws7   ÁE3Á C/EÅE3ÅE	ÅE3Å"E	Å#E3Å3E7Å:E7c                óZ  — t          d¬¦  «        }t          ¦   «         |_        d|_        dddddœ}|                     dd|¦  «         |j        }|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        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}}d|_        d|d<   d|d<   |                     dd|¦  «         |j        }|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        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}}dS )ug   Kiá»ƒm tra khÃ´i phá»¥c focus: Sau khi láº¥y láº¡i focus, há»‡ thá»‘ng cho phÃ©p tiáº¿p tá»¥c an toÃ n.T)r   F)éÈ   ri   g      i@r*   ri   r   r0   r2   r!   r"   r'   r(   Nr.   r-   r/   )r   r   r5   r7   rA   rB   r9   r:   r;   r<   r=   r>   r?   r@   )	rE   r!   rL   rF   rG   rH   rI   rJ   rK   s	            rQ   Ú2test_focus_loss_safety_interlock_state_consistencyzITestFocusLossInterlock.test_focus_loss_safety_interlock_state_consistencyp   sŽ  € å"¸$Ð?Ñ?Ô?ˆÝ'™kœkˆÔð $)ˆÔ Ø'°zÐUZÐmrÐsÐsˆØ×Ò˜S # uÑ-Ô-Ð-ØÔ"Ð2Ð"Ô-Ð2°Ð2Ð-°Ò2Ð2Ð2Ð2Õ2Ô2Ð2Ð2Ð2Ð2Ð-°Ð2Ñ2Ô2Ð2Õ2Ô2Ñ2Ô2Ð2Ð2Õ2Ô2ˆwÑ2Ô2Ð2Õ2Ô2ˆwÑ2Ô2Ð2Ð2Õ2Ô2Ð"Ñ2Ô2Õ2Ô2Ð-Ñ2Ô2Õ2Ô2°Ñ2Ô2Ð2Ð2Ñ2Ð2Ð2Ð2Ð2Ð2Ñ2Ð2Õ2Õ2Ô2Ð2Ñ2Ô2Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2ð $(ˆÔ Ø!&ˆˆoÑØ"'ˆÐÑØ×Ò˜S # uÑ-Ô-Ð-ØÔ"Ð2Ð"Ô-Ð2°Ð2Ð-°Ò2Ð2Ð2Ð2Õ2Ô2Ð2Ð2Ð2Ð2Ð-°Ð2Ñ2Ô2Ð2Õ2Ô2Ñ2Ô2Ð2Ð2Õ2Ô2ˆwÑ2Ô2Ð2Õ2Ô2ˆwÑ2Ô2Ð2Ð2Õ2Ô2Ð"Ñ2Ô2Õ2Ô2Ð-Ñ2Ô2Õ2Ô2°Ñ2Ô2Ð2Ð2Ñ2Ð2Ð2Ð2Ð2Ð2Ñ2Ð2Õ2Õ2Ô2Ð2Ñ2Ô2Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2rS   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rR   rg   rj   © rS   rQ   r   r   3   sO   € € € € € ðð ð 
ð  
ð  
ðDwð wð wð$3ð 3ð 3ð 3ð 3rS   r   c                  ó*   — e Zd ZdZd„ Zd„ Zd„ Zd„ ZdS )ÚTestIpcWatchdogDegradationuÏ   Kiá»ƒm tra pháº£n á»©ng khi kÃªnh giao tiáº¿p IPC giÃ¡n Ä‘oáº¡n nhá»‹p tim > 3000ms.
    
    Báº¥t biáº¿n liÃªn quan:
    - INV-F8-MUTES-BRAIN
    - INV-WASD-NO-BLIND-LMB
    - INV-CLIENT-CRASH-RECOVER
    c                ó¾  — t          t          j        ¦   «         dz  ¦  «        }t          j        |dz
  dd|¬¦  «        }g }||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}}t          j        |dz
  dd|¬¦  «        }t          |v }|sÑt	          j        d|fdt          |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dœz  }dd|iz  }	t          t	          j        |	¦  «        ¦  «        ‚d}dS )uZ   GiÃ¡n Ä‘oáº¡n nhá»‹p tim > 3000ms kÃ­ch hoáº¡t cáº£nh bÃ¡o ERR_WATCHDOG_HEARTBEAT_TIMEOUT.éè  éú   Té¸  ©Úlast_heartbeat_msÚcore_is_onlineÚ
timeout_msÚnow_msr0   ©z%(py0)s == %(py3)sÚerrs_healthy©r#   Úpy3zassert %(py5)sr^   Ni€  ©Úin©z%(py0)s in %(py2)sr   Úerrs_timeout©r#   r$   úassert %(py4)sr%   )ÚintÚtimer   Úcheck_watchdog_invariantsr9   r:   r;   r<   r=   r>   r?   r@   r   )
rE   rz   r|   rN   rF   Ú@py_format4rf   r‚   Ú@py_format3rO   s
             rQ   Ú0test_watchdog_heartbeat_interruption_over_3000mszKTestIpcWatchdogDegradation.test_watchdog_heartbeat_interruption_over_3000ms�   s  € å•T”Y‘[”[ 4Ñ'Ñ(Ô(ˆõ )ÔBØ$ s™lØØØð	
ñ 
ô 
ˆð  "Ð!ˆ|˜rÒ!Ð!Ð!Ð!Õ!Ô!Ð!Ð!Ð!Ð!ˆ|˜rÐ!Ñ!Ô!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!ˆ|Ñ!Ô!Ð!Õ!Ô!ˆ|Ñ!Ô!Ð!Ð!Õ!Ô!˜rÑ!Ô!Ð!Ð!Ñ!Ð!Ð!Ð!Ð!Ð!Ñ!Ð!Õ!Õ!Ô!Ð!Ñ!Ô!Ñ!Ô!Ð!Ð!Ð!Ð!Ð!õ )ÔBØ$ t™mØØØð	
ñ 
ô 
ˆõ .°Ð=Ð=Ð=Ð=Õ=Ô=Ð=Ð=Ð=Ð=Õ-°Ð=Ñ=Ô=Ð=Õ=Ô=Ñ=Ô=Ð=Ð=Õ=Ô=Õ-Ñ=Ô=Ð=Õ=Ô=Õ-Ñ=Ô=Ð=Ð=Ð=Õ=Ô=Ñ=Ô=Ð=Ð=Õ=Ô=°Ñ=Ô=Ð=Õ=Ô=°Ñ=Ô=Ð=Ð=Ð=Ð=Ñ=Ð=Ð=Ð=Ð=Ð=Ñ=Ð=Õ=Õ=Ô=Ð=Ñ=Ô=Ñ=Ô=Ð=Ð=Ð=Ð=Ð=rS   c           	     ób	  ‡— g Šˆfd„}t          d|¬¦  «        5  t          d¦  «        5 }ddlm}m}m}m}m}  |¦   «          |‰v }|s×t          j        d|fd|‰f¦  «        d	t          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd	d
t          j
        ¦   «         v st          j        ‰¦  «        rt          j        ‰¦  «        nd
dœz  }	t          j        d¦  «        dz   d|	iz  }
t          t          j        |
¦  «        ¦  «        ‚d}|‰v }|s×t          j        d|fd|‰f¦  «        dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndd
t          j
        ¦   «         v st          j        ‰¦  «        rt          j        ‰¦  «        nd
dœz  }	t          j        d¦  «        dz   d|	iz  }
t          t          j        |
¦  «        ¦  «        ‚d}|‰v }|s×t          j        d|fd|‰f¦  «        dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndd
t          j
        ¦   «         v st          j        ‰¦  «        rt          j        ‰¦  «        nd
dœz  }	t          j        d¦  «        dz   d|	iz  }
t          t          j        |
¦  «        ¦  «        ‚d}|‰v }|s×t          j        d|fd|‰f¦  «        dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndd
t          j
        ¦   «         v st          j        ‰¦  «        rt          j        ‰¦  «        nd
dœz  }	t          j        d¦  «        dz   d|	iz  }
t          t          j        |
¦  «        ¦  «        ‚d}|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¦  «         n# 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS )uË   Khi Co-Pilot phÃ¡t hiá»‡n máº¥t nhá»‹p tim, pháº£i kÃ­ch hoáº¡t nháº£ toÃ n bá»™ phÃ­m WASD.
        
        XÃ¡c minh báº¥t biáº¿n INV-F8-MUTES-BRAIN vÃ  quy táº¯c an toÃ n chá»‘ng cháº¡y mÃ¹.
        c                ó@   •— |dz  r‰                      | ¦  «         d S d S )Né   )Úappend)ÚvkÚscanÚflagsÚextraÚreleased_keyss       €rQ   Úmock_keybd_eventzmTestIpcWatchdogDegradation.test_watchdog_passive_degrade_triggers_safe_wasd_release.<locals>.mock_keybd_event­   s3   ø€ à�v‰~ð )Ø×$Ò$ RÑ(Ô(Ð(Ð(Ð(ð)ð )rS   z ctypes.windll.user32.keybd_event)Úside_effectz ctypes.windll.user32.mouse_eventr   )Ú"emergency_f8_pause_and_release_allÚVK_WÚVK_AÚVK_SÚVK_Dr   r�   r—   r“   rƒ   u   Pháº£i nháº£ phÃ­m Wz
>assert %(py4)sr%   Nr˜   u   Pháº£i nháº£ phÃ­m Ar™   u   Pháº£i nháº£ phÃ­m Srš   u   Pháº£i nháº£ phÃ­m Dr�   rY   r[   Ú
mock_mouser]   úassert %(py7)sr&   )r	   Úsrc.common.win32_inputr–   r—   r˜   r™   rš   r9   r:   r;   r<   r=   r>   rD   r?   r@   rB   )rE   r”   r›   r–   r—   r˜   r™   rš   rF   r‰   rO   re   rG   rf   rJ   r“   s                  @rQ   Ú8test_watchdog_passive_degrade_triggers_safe_wasd_releasezSTestIpcWatchdogDegradation.test_watchdog_passive_degrade_triggers_safe_wasd_release¦   sï  ø€ ð
 $&ˆð	)ð 	)ð 	)ð 	)ð 	)õ
 Ð5ÐCSÐTÑTÔTð 	2ð 	2ÝÐ9Ñ:Ô:ð 2¸jØmÐmÐmÐmÐmÐmÐmÐmÐmÐmÐmÐmÐmÐmà2Ð2Ñ4Ô4Ð4ð ˜}Ð,ÐDÐDÐDÕDÔDÐDÐDÐDÐD�t˜}ÐDÑDÔDÐDÕDÔDÑDÔDÐDÐDÕDÔD�tÑ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Ð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ÐDÐDÕDÔDÐDÐDÐDÐD�t˜}ÐDÑDÔDÐDÕDÔDÑDÔDÐDÐDÕDÔD�tÑ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Ð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ÐDÐDÕDÔDÐDÐDÐDÐD�t˜}ÐDÑDÔDÐDÕDÔDÑDÔDÐDÐDÕDÔD�tÑ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Ð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ÐDÐDÕDÔDÐDÐDÐDÐD�t˜}ÐDÑDÔDÐDÕDÔDÑDÔDÐDÐDÕDÔD�tÑ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ÐDÕDÔDÐ.DÑDÔDÐDÑDÐDÐDÐDÑDÐDÕDÕDÔDÐDÑDÔDÑDÔDÐDÐDÐDà!Ô,Ð1°Ð1Ð,°Ò1Ð1Ð1Ð1Õ1Ô1Ð1Ð1Ð1Ð1Ð,°Ð1Ñ1Ô1Ð1Õ1Ô1Ñ1Ô1Ð1Ð1Õ1Ô1�zÑ1Ô1Ð1Õ1Ô1�zÑ1Ô1Ð1Ð1Õ1Ô1Ð,Ñ1Ô1Õ1Ô1°Ñ1Ô1Ð1Ð1Ñ1Ð1Ð1Ð1Ð1Ð1Ñ1Ð1Õ1Õ1Ô1Ð1Ñ1Ô1Ñ1Ô1Ð1Ð1Ð1Ð1Ð1Ð1Ð1ð2ð 2ð 2ñ 2ô 2ð 2ð 2ð 2ð 2ð 2ð 2øøøð 2ð 2ð 2ð 2ð	2ð 	2ð 	2ñ 	2ô 	2ð 	2ð 	2ð 	2ð 	2ð 	2ð 	2ð 	2øøøð 	2ð 	2ð 	2ð 	2ð 	2ð 	2s5   šR$ªQRÒ R$ÒR	ÒR$ÒR	ÒR$Ò$R(Ò+R(c                óò  — t          t          j        ¦   «         dz  ¦  «        }t          j        |dz
  dd|¬¦  «        }t          |v }|sÑt          j        d|fdt          |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	d
œz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d}|dz   }t          j        |dz
  dd|¬¦  «        }g }||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 )ul   Khi nhá»‹p tim phá»¥c há»“i sau giÃ¡n Ä‘oáº¡n, há»‡ thá»‘ng pháº£i tá»± Ä‘á»™ng xÃ³a cá»� cáº£nh bÃ¡o lá»—i.rs   é”  Tru   rv   r   r�   r   Úerrs1rƒ   r„   r%   Né2   r0   r{   Úerrs2r}   uN   Há»‡ thá»‘ng pháº£i trá»Ÿ láº¡i tráº¡ng thÃ¡i Healthy sau khi nháº­n heartbeatú
>assert %(py5)sr^   )r…   r†   r   r‡   r   r9   r:   r;   r<   r=   r>   r?   r@   rD   )rE   rz   r¡   rF   r‰   rO   Ú
now_ms_newr£   rN   rˆ   rf   s              rQ   Ú8test_watchdog_recovers_to_healthy_when_heartbeat_resumeszSTestIpcWatchdogDegradation.test_watchdog_recovers_to_healthy_when_heartbeat_resumesÀ   s8  € å•T”Y‘[”[ 4Ñ'Ñ(Ô(ˆõ "Ô;Ø$ t™mØØØð	
ñ 
ô 
ˆõ .°Ð6Ð6Ð6Ð6Õ6Ô6Ð6Ð6Ð6Ð6Õ-°Ð6Ñ6Ô6Ð6Õ6Ô6Ñ6Ô6Ð6Ð6Õ6Ô6Õ-Ñ6Ô6Ð6Õ6Ô6Õ-Ñ6Ô6Ð6Ð6Ð6Õ6Ô6Ñ6Ô6Ð6Ð6Õ6Ô6°Ñ6Ô6Ð6Õ6Ô6°Ñ6Ô6Ð6Ð6Ð6Ð6Ñ6Ð6Ð6Ð6Ð6Ð6Ñ6Ð6Õ6Õ6Ô6Ð6Ñ6Ô6Ñ6Ô6Ð6Ð6Ð6ð ˜d‘]ˆ
Ý!Ô;Ø(¨2™oØØØð	
ñ 
ô 
ˆð Ðlˆu˜Š{ÐlÐlÐlÕlÔlÐlÐlÐlÐlˆu˜ÐlÑlÔlÐlÕlÔlÑlÔlÐlÐlÕlÔlˆuÑlÔlÐlÕlÔlˆuÑ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ÐlÑlÔlÑlÔlÐlÐlÐlÐlÐlÐlÐlrS   c                ó2  — t          j        t          t          j        ¦   «         dz  ¦  «        dd¬¦  «        }t          |v }|sÑt          j        d|fdt          |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d	œz  }d
d|iz  }t          t          j        |¦  «        ¦  «        ‚d}dS )uQ   Náº¿u core bÃ¡o offline hoÃ n toÃ n, Sentinel kÃ­ch hoáº¡t ERR_CORE_DISCONNECTED.rs   Fru   )rw   rx   ry   r   r�   r   Úerrsrƒ   r„   r%   N)r   r‡   r…   r†   r   r9   r:   r;   r<   r=   r>   r?   r@   )rE   r¨   rF   r‰   rO   s        rQ   Útest_core_disconnect_isolationz9TestIpcWatchdogDegradation.test_core_disconnect_isolation×   s#  € å Ô:Ý!¥$¤)¡+¤+°Ñ"4Ñ5Ô5Ø Øð
ñ 
ô 
ˆõ
 %¨Ð,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Õ$¨Ð,Ñ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô,Õ$Ñ,Ô,Ð,Õ,Ô,Õ$Ñ,Ô,Ð,Ð,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô,¨Ñ,Ô,Ð,Õ,Ô,¨Ñ,Ô,Ð,Ð,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,rS   N)rk   rl   rm   rn   rŠ   rž   r¦   r©   ro   rS   rQ   rq   rq   ‡   s]   € € € € € ðð ð>ð >ð >ð,2ð 2ð 2ð4mð mð mð.-ð -ð -ð -ð -rS   rq   c                  ó*   — e Zd ZdZd„ Zd„ Zd„ Zd„ ZdS )ÚTestFaustusGoldExhaustionGuardu  Kiá»ƒm tra cÆ¡ cháº¿ ngáº¯t giao dá»‹ch báº£o vá»‡ quá»¹ vÃ ng sinh tá»“n tá»‘i thiá»ƒu 5,000 Gold.
    
    Báº¥t biáº¿n liÃªn quan:
    - INV-EXCHANGE-GOLD-TAX: Cáº¥m thá»±c hiá»‡n báº¥t ká»³ giao dá»‹ch nÃ o khiáº¿n quá»¹ vÃ ng sau thuáº¿ < 5000 Gold.
    c                óÚ  — t          d¬¦  «        }t          |¬¦  «        }dddœ}ddd	œ}|                     ||d¬
¦  «        }|j        }d}||u }|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}}|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 ¦   «         }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 )ul   VÃ­ vÃ ng Ä‘Ãºng báº±ng 5,000 Gold: Pháº£i tá»« chá»‘i giao dá»‹ch Ä‘á»ƒ báº£o toÃ n Ä‘á»‹nh má»©c an toÃ n.éˆ  ©Úmin_gold_reserve©Úconfigé   é
   ©úExalted Orbz	Chaos Orbg      (@ç     Àb@©rµ   z
Divine Orb©Úcurrent_goldFr   ©z5%(py2)s
{%(py2)s = %(py0)s.is_affordable
} is %(py5)sÚresultr]   rœ   r&   Nr   r0   ©zL%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.orders
})
} == %(py8)sÚlen©r#   r3   r~   r^   Úpy8úassert %(py10)sÚpy10c              3  ó&   K  — | ]}d |v pd|v V — ŒdS )zINV-EXCHANGE-GOLD-TAXõ   KhÃ³a an toÃ n VÃ ngNro   ©Ú.0Únotes     rQ   ú	<genexpr>zdTestFaustusGoldExhaustionGuard.test_gold_at_exact_5000_threshold_rejects_exchange.<locals>.<genexpr>ø   s5   è è € ÐvÐvÐY]Ð*¨dÐ2ÐTÐ6LÐPTÐ6TÐvÐvÐvÐvÐvÐvrS   ú,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}Úany©r#   r$   r%   ©r   r   Úoptimize_portfolioÚis_affordabler9   r:   r;   r<   r=   r>   r?   r@   Úordersr½   Úsummary_notesrÉ   ©rE   ÚcfgÚ	optimizerÚwalletÚmarket_pricesr»   rF   re   rG   rf   rJ   rN   Ú@py_assert7rH   Ú@py_format9Ú@py_format11rO   s                    rQ   Ú2test_gold_at_exact_5000_threshold_rejects_exchangezQTestFaustusGoldExhaustionGuard.test_gold_at_exact_5000_threshold_rejects_exchangeì   s5  € å%°tÐ<Ñ<Ô<ˆÝ.°cÐ:Ñ:Ô:ˆ	à!#°"Ð5Ð5ˆØ(,¸EÐBÐBˆð ×-Ò-¨f°mÐRVÐ-ÑWÔWˆØÔ#Ð, uÐ,Ð# uÐ,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Ð# uÐ,Ñ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô,ˆvÑ,Ô,Ð,Õ,Ô,ˆvÑ,Ô,Ð,Ð,Õ,Ô,Ð#Ñ,Ô,Õ,Ô, uÑ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ø”=Ð&�s�=Ñ!Ô!Ð& QÐ&Ð! QÒ&Ð&Ð&Ñ&Õ&Ô&Ð&Ð&Ð&Ð&Ð! QÐ&Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&�sÑ&Ô&Ð&Õ&Ô&�sÑ&Ô&Ð&Ð&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&�6Ñ&Ô&Ð&Õ&Ô&�6Ñ&Ô&Ð&Ð&Õ&Ô&�=Ñ&Ô&Õ&Ô&Ð!Ñ&Ô&Õ&Ô& QÑ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&ØvÐvÐagÔauÐvÑvÔvÐv�sÐvÑvÔvÐvÐvÐvÐvÐvÕvÔvÑvÔvÐvÐvÕvÔv�sÑvÔvÐvÕvÔv�sÑ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ÐvrS   c                óÚ  — t          d¬¦  «        }t          |¬¦  «        }dddœ}ddd	œ}|                     ||d
¬¦  «        }|j        }d}||u }|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}}|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 ¦   «         }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 )uc   VÃ­ vÃ ng tá»¥t xuá»‘ng 4,999 Gold: Thuáº­t toÃ¡n pháº£i láº­p tá»©c ngáº¯t toÃ n bá»™ Ä‘Æ¡n hÃ ng.r­   r®   r°   r¢   ri   r´   ç      $@g     €a@r·   i‡  r¸   Fr   rº   r»   r]   rœ   r&   Nr   r0   r¼   r½   r¾   rÀ   rÁ   c              3  ó   K  — | ]}d |v V — Œ	dS )rÃ   Nro   rÄ   s     rQ   rÇ   zaTestFaustusGoldExhaustionGuard.test_gold_below_5000_threshold_rejects_exchange.<locals>.<genexpr>  s(   è è € ÐSÐS°dÐ)¨TÐ1ÐSÐSÐSÐSÐSÐSrS   rÈ   rÉ   rÊ   rË   rÐ   s                    rQ   Ú/test_gold_below_5000_threshold_rejects_exchangezNTestFaustusGoldExhaustionGuard.test_gold_below_5000_threshold_rejects_exchangeú   s4  € å%°tÐ<Ñ<Ô<ˆÝ.°cÐ:Ñ:Ô:ˆ	à!#°#Ð6Ð6ˆØ(,¸EÐBÐBˆð ×-Ò-¨f°mÐRVÐ-ÑWÔWˆØÔ#Ð, uÐ,Ð# uÐ,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Ð# uÐ,Ñ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô,ˆvÑ,Ô,Ð,Õ,Ô,ˆvÑ,Ô,Ð,Ð,Õ,Ô,Ð#Ñ,Ô,Õ,Ô, uÑ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ø”=Ð&�s�=Ñ!Ô!Ð& QÐ&Ð! QÒ&Ð&Ð&Ñ&Õ&Ô&Ð&Ð&Ð&Ð&Ð! QÐ&Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&�sÑ&Ô&Ð&Õ&Ô&�sÑ&Ô&Ð&Ð&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&�6Ñ&Ô&Ð&Õ&Ô&�6Ñ&Ô&Ð&Ð&Õ&Ô&�=Ñ&Ô&Õ&Ô&Ð!Ñ&Ô&Õ&Ô& QÑ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&ØSÐS¸fÔ>RÐ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�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ÐSÐSÐSÐSÐSÐSÐSrS   c                ó4  — t          d¬¦  «        }t          |¬¦  «        }dddœ}ddd	œ}|                     ||d
¬¦  «        }|j        D ]Í}d
|j        z
  }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 )uË   VÃ­ vÃ ng cÃ³ 5,050 Gold nhÆ°ng thuáº¿ phÃ­ 100 Gold lÃ m quá»¹ cÃ²n 4,950 Gold (<5000):
        Pháº£i tá»« chá»‘i hoáº·c Ä‘iá»�u chá»‰nh Ä‘á»ƒ khÃ´ng bao giá»� vi pháº¡m INV-EXCHANGE-GOLD-TAX.
        r­   r®   r°   é   r³   r´   rÚ   r¶   r·   iº  r¸   rY   )z%(py0)s >= %(py3)sÚremaining_gold_after_orderr}   u   Lá»‡nh u3    vi pháº¡m INV-EXCHANGE-GOLD-TAX: VÃ ng sau lá»‡nh=z < 5000!r¤   r^   N)r   r   rÌ   rÎ   Úestimated_gold_taxr9   r:   r;   r<   r=   r>   rD   r?   r@   )rE   rÑ   rÒ   rÓ   rÔ   r»   Úorderrß   rN   rF   rˆ   rf   s               rQ   Ú?test_gold_above_5000_but_order_tax_depletes_reserve_is_rejectedz^TestFaustusGoldExhaustionGuard.test_gold_above_5000_but_order_tax_depletes_reserve_is_rejected  sé  € õ &°tÐ<Ñ<Ô<ˆÝ.°cÐ:Ñ:Ô:ˆ	à!#°"Ð5Ð5ˆØ(,¸EÐBÐBˆà×-Ò-¨f°mÐRVÐ-ÑWÔWˆà”]ð 	ð 	ˆEØ)-°Ô0HÑ)HÐ&Ø15ð Ð-°Ò5ð ð ð õ ìðð ð ð Ð-°ð ñ ô ð õ äñô ð ð õ ìð .ñ ô ð õ äð .ñ ô ð ð õ äð 26ñ ô ð ð ñ ð õ ìð y˜%ÐxÐxÐTnÐxÐxÐxñô ð ñ ð ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ð ð	ð 	rS   c                óH
  — t          d¬¦  «        }t          |¬¦  «        }dddœ}ddd	œ}|                     ||d
¬¦  «        }|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}}|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}}|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}}g }d}g }|j        }|}|sd}|}||v }|}|sd}g }|j        }|}|sd}|}||v }|}|�sGddt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        dœz  }|                     |¦  «         |s.ddt	          j	        |¦  «        iz  }|                     |¦  «         t	          j        |d¦  «        i z  }t	          j        d|fd ||f¦  «        t	          j	        |¦  «        |d!œz  }d"d#|iz  }|                     |¦  «         |�sd$dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        d%œz  }|                     |¦  «         |s.d&d't	          j	        |¦  «        iz  }|                     |¦  «         t	          j        |d¦  «        i z  }t	          j        d|fd(||f¦  «        t	          j	        |¦  «        |d)œz  }d*d+|iz  } |                     | ¦  «         t	          j        |d¦  «        i z  }!d,d-|!iz  }"t          t	          j        |"¦  «        ¦  «        ‚dx}x}x}x}x}x}x}x}x}x}x}x}x}}dS ).u_   ExchangeOrchestrator pháº£i ngáº¯t quy trÃ¬nh vÃ  khÃ´ng gá»­i phÃ­m chuá»™t khi vÃ ng <= 5000.r­   r®   r°   r²   r¢   r´   rÚ   r¶   r·   r    )rÓ   Úmarket_prices_in_chaosr¹   r   r0   )z6%(py2)s
{%(py2)s = %(py0)s.orders_planned
} == %(py5)sÚreportr]   rœ   r&   N)z7%(py2)s
{%(py2)s = %(py0)s.orders_executed
} == %(py5)sÚREJECTED)z.%(py2)s
{%(py2)s = %(py0)s.status
} == %(py5)su   ngÆ°á»¡ng an toÃ nÚ u   Quá»¹ vÃ ngz"%(py9)s
{%(py9)s = %(py7)s.error
})r&   r(   z%(py12)sÚpy12r/   r   )z%(py3)s in (%(py15)s))r~   Úpy15z%(py17)sÚpy17z%%(py26)s
{%(py26)s = %(py24)s.error
})Úpy24Úpy26z%(py29)sÚpy29)z%(py20)s in (%(py32)s))Úpy20Úpy32z%(py34)sÚpy34zassert %(py37)sÚpy37)r   r   Úexecute_sessionÚorders_plannedr9   r:   r;   r<   r=   r>   r?   r@   Úorders_executedÚstatusÚerrorrŽ   Ú_format_boolop)#rE   rÑ   ÚorchestratorrÓ   rÔ   rå   rF   re   rG   rf   rJ   rN   rH   Ú@py_assert8rI   Ú@py_assert11rM   Ú@py_assert19Ú@py_assert23Ú@py_assert25Ú@py_assert22Ú@py_assert28Ú@py_assert21rK   Ú@py_format13Ú@py_format14Ú@py_format16Ú@py_format18Ú@py_format27Ú@py_format30Ú@py_format31Ú@py_format33Ú@py_format35Ú@py_format36Ú@py_format38s#                                      rQ   Ú<test_exchange_orchestrator_aborts_cleanly_on_gold_exhaustionz[TestFaustusGoldExhaustionGuard.test_exchange_orchestrator_aborts_cleanly_on_gold_exhaustion  s{  € å%°tÐ<Ñ<Ô<ˆÝ3¸3Ð?Ñ?Ô?ˆà!#°"Ð5Ð5ˆØ(,¸EÐBÐBˆà×-Ò-ØØ#0Øð .ñ 
ô 
ˆð
 Ô$Ð)¨Ð)Ð$¨Ò)Ð)Ð)Ð)Õ)Ô)Ð)Ð)Ð)Ð)Ð$¨Ð)Ñ)Ô)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô)ˆvÑ)Ô)Ð)Õ)Ô)ˆvÑ)Ô)Ð)Ð)Õ)Ô)Ð$Ñ)Ô)Õ)Ô)¨Ñ)Ô)Ð)Ð)Ñ)Ð)Ð)Ð)Ð)Ð)Ñ)Ð)Õ)Õ)Ô)Ð)Ñ)Ô)Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)ØÔ%Ð*¨Ð*Ð%¨Ò*Ð*Ð*Ð*Õ*Ô*Ð*Ð*Ð*Ð*Ð%¨Ð*Ñ*Ô*Ð*Õ*Ô*Ñ*Ô*Ð*Ð*Õ*Ô*ˆvÑ*Ô*Ð*Õ*Ô*ˆvÑ*Ô*Ð*Ð*Õ*Ô*Ð%Ñ*Ô*Õ*Ô*¨Ñ*Ô*Ð*Ð*Ñ*Ð*Ð*Ð*Ð*Ð*Ñ*Ð*Õ*Õ*Ô*Ð*Ñ*Ô*Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*ØŒ}Ð* 
Ð*ˆ} 
Ò*Ð*Ð*Ð*Õ*Ô*Ð*Ð*Ð*Ð*ˆ} 
Ð*Ñ*Ô*Ð*Õ*Ô*Ñ*Ô*Ð*Ð*Õ*Ô*ˆvÑ*Ô*Ð*Õ*Ô*ˆvÑ*Ô*Ð*Ð*Õ*Ô*ˆ}Ñ*Ô*Õ*Ô* 
Ñ*Ô*Ð*Ð*Ñ*Ð*Ð*Ð*Ð*Ð*Ñ*Ð*Õ*Õ*Ô*Ð*Ñ*Ô*Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*ØdÐdÐ#ÐdÐdÐd¨¬Ðd¨Ðd¨Ðd¸Ðd¸ÐdÐ#ÐdÐ;ÐdÐdÐdÐdÐd¸}ÐdÐdÐdÐQWÔQ]ÐdÐQ]ÐdÐQ]ÐdÐacÐdÐacÐ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Ð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Ñ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Ð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ÐdÑdÐdÐdÕdÔdÑdÔdÐdÐdÕdÔdÐQWÑdÔdÐdÕdÔdÐQWÑdÔdÐdÐdÕdÔdÐQ]ÑdÔdÐdÐdÑdÐdÐd×dÒdÐdÑdÔdÐdÐQ]ÐdÐdÐdÕdÔdÐacÑ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Ð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Ñ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Ô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ÐdÐdÐdÐdÐdÐdÐdrS   N)rk   rl   rm   rn   rØ   rÜ   râ   r  ro   rS   rQ   r«   r«   å   se   € € € € € ðð ðwð wð wðTð Tð Tðð ð ð$eð eð eð eð erS   r«   c                  ó*   — e Zd ZdZd„ Zd„ Zd„ Zd„ ZdS )Ú%TestEighteenInvariantsResilienceAuditu{   Kiá»ƒm tra sá»©c bá»�n vÃ  tÃ­nh báº¥t kháº£ xÃ¢m pháº¡m cá»§a 18 báº¥t biáº¿n kiáº¿n trÃºc khi gáº·p lá»—i ngoáº¡i cáº£nh.c                ó´  — dddddddœ}t          j        |¦  «        }g }||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 )ui   [INV-CI-01]: NhÃ¢n váº­t Chaos Inoculation (HP 1/1) khi tá»¥t ES tuyá»‡t Ä‘á»‘i khÃ´ng uá»‘ng Life Flask.r/   i   iÐ  éd   ri   )Ú
current_hpÚmax_hpÚ
current_esÚmax_esÚcurrent_manaÚmax_manar0   r{   Ú	anomaliesr}   u@   Build CI 1/1 HP lÃ  há»£p lá»‡ vÃ  khÃ´ng Ä‘Æ°á»£c coi lÃ  lá»—ir¤   r^   N)r   Úcheck_vitals_invariantsr9   r:   r;   r<   r=   r>   rD   r?   r@   )rE   Ú	player_cir  rN   rF   rˆ   rf   s          rQ   Ú5test_ci_hp_one_with_es_drop_does_not_drink_life_flaskz[TestEighteenInvariantsResilienceAudit.test_ci_hp_one_with_es_drop_does_not_drink_life_flask4  s  € ð ØØØØØð
ð 
ˆ	õ &Ô=¸iÑHÔHˆ	ØÐbˆy˜BŠÐbÐbÐbÕbÔbÐbÐbÐbÐbˆy˜BÐbÑbÔbÐbÕbÔbÑbÔbÐbÐbÕbÔbˆyÑbÔbÐbÕbÔbˆyÑ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ÐbrS   c                óÜ  — dddddœ}t          j        |¦  «        }ddlm} ||v }|sÂt	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        nddt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndd	œz  }d
d|iz  }t          t	          j        |¦  «        ¦  «        ‚d}dS )uF   [INV-VIT-01]: Báº¯t struct quÃ¡i giáº£ máº¡o 778/778 ngay láº­p tá»©c.i
  r   )r  r  r  r  )ÚERR_BOGUS_VITAL_STRUCT_778r   r�   r  r  rƒ   r„   r%   N)r   r  Ú%src.agentic_engine.invariant_sentinelr  r9   r:   r;   r<   r=   r>   r?   r@   )rE   Úbogus_playerr  r  rF   r‰   rO   s          rQ   Ú*test_bogus_marker_778_rejected_immediatelyzPTestEighteenInvariantsResilienceAudit.test_bogus_marker_778_rejected_immediatelyB  s,  € ð ØØØð	
ð 
ˆõ &Ô=¸lÑKÔKˆ	ØTÐTÐTÐTÐTÐTØ)¨YÐ6Ð6Ð6Ð6Õ6Ô6Ð6Ð6Ð6Ð6Ð)¨YÐ6Ñ6Ô6Ð6Õ6Ô6Ñ6Ô6Ð6Ð6Õ6Ô6Ð)Ñ6Ô6Ð6Õ6Ô6Ð)Ñ6Ô6Ð6Ð6Ð6Õ6Ô6Ñ6Ô6Ð6Ð6Õ6Ô6¨YÑ6Ô6Ð6Õ6Ô6¨YÑ6Ô6Ð6Ð6Ð6Ð6Ñ6Ð6Ð6Ð6Ð6Ð6Ñ6Ð6Õ6Õ6Ô6Ð6Ñ6Ô6Ñ6Ô6Ð6Ð6Ð6Ð6Ð6rS   c                ó®	  — ddl m} |j        }d} ||¦  «        }d}||u }|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  }t          t          j
        |¦  «        ¦  «        ‚dx}x}x}x}}|j        }d} ||¦  «        }d}||u }|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  }t          t          j
        |¦  «        ¦  «        ‚dx}x}x}x}}|j        }d} ||¦  «        }d}||u }|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  }t          t          j
        |¦  «        ¦  «        ‚dx}x}x}x}}|j        }d} ||¦  «        }d}||u }|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  }t          t          j
        |¦  «        ¦  «        ‚dx}x}x}x}}|j        }d} ||¦  «        }d}||u }|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  }t          t          j
        |¦  «        ¦  «        ‚dx}x}x}x}}dS )ui   [INV-KEY-NO-U-FOR-MAP-DEVICE]: Nháº­n diá»‡n UI Scene khÃ´ng má»Ÿ báº£n Ä‘á»“ tháº¿ giá»›i táº¡i Hideout.r   )ÚAutonomousLifecycleManagerÚatlasTr   )zQ%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.is_ui_scene
}(%(py4)s)
} is %(py9)sr!  )r#   r$   r%   r4   r(   zassert %(py11)sÚpy11Nz	world mapzact 1zShoreline HideoutFzSandswept Marsh)Ú'src.assistant_tool.autonomous_lifecycler!  Úis_ui_scener9   r:   r;   r<   r=   r>   r?   r@   )	rE   r!  rF   rG   rI   rù   rÕ   rK   Ú@py_format12s	            rQ   Ú@test_ui_scene_detector_prevents_world_map_interaction_in_hideoutzfTestEighteenInvariantsResilienceAudit.test_ui_scene_detector_prevents_world_map_interaction_in_hideoutN  sÊ  € àVÐVÐVÐVÐVÐVà)Ô5ÐF°gÐFÐ5Ð5°gÑ>Ô>ÐFÀ$ÐFÐ>À$ÐFÐFÐFÐFÕFÔFÐFÐFÐFÐFÐ>À$ÐFÑFÔFÐFÕFÔFÑFÔFÐFÐFÕFÔFÐ)ÑFÔFÐFÕFÔFÐ)ÑFÔFÐFÐFÕFÔFÐ5ÑFÔFÕFÔF°gÑFÔFÕFÔFÐ>ÑFÔFÕFÔFÀ$ÑFÔFÐFÐFÑFÐFÐFÐFÐFÐFÑFÐFÕFÕFÔFÐFÑFÔFÑFÔFÐFÐFÐFÐFÐFÐFÐFÐFÐFÐFÐFØ)Ô5ÐJ°kÐJÐ5Ð5°kÑBÔBÐJÀdÐJÐBÀdÐJÐJÐJÐJÕJÔJÐJÐJÐJÐJÐBÀdÐJÑJÔJÐJÕJÔJÑJÔJÐJÐJÕJÔJÐ)ÑJÔJÐJÕJÔJÐ)ÑJÔJÐJÐJÕJÔJÐ5ÑJÔJÕJÔJ°kÑJÔJÕJÔJÐBÑJÔJÕJÔJÀdÑJÔJÐJÐJÑJÐJÐJÐJÐJÐJÑJÐJÕJÕJÔJÐJÑJÔJÑJÔJÐJÐJÐJÐJÐJÐJÐJÐJÐJÐJÐJØ)Ô5ÐF°gÐFÐ5Ð5°gÑ>Ô>ÐFÀ$ÐFÐ>À$ÐFÐFÐFÐFÕFÔFÐFÐFÐFÐFÐ>À$ÐFÑFÔFÐFÕFÔFÑFÔFÐFÐFÕFÔFÐ)ÑFÔFÐFÕFÔFÐ)ÑFÔFÐFÐFÕFÔFÐ5ÑFÔFÕFÔF°gÑFÔFÕFÔFÐ>ÑFÔFÕFÔFÀ$ÑFÔFÐFÐFÑFÐFÐFÐFÐFÐFÑFÐFÕFÕFÔFÐFÑFÔFÑFÔFÐFÐFÐFÐFÐFÐFÐFÐFÐFÐFÐFà)Ô5ÐSÐ6IÐSÐ5Ð5Ð6IÑJÔJÐSÈeÐSÐJÈeÐSÐSÐSÐSÕSÔSÐSÐSÐSÐSÐJÈeÐSÑSÔSÐSÕSÔSÑSÔSÐSÐSÕSÔSÐ)ÑSÔSÐSÕSÔSÐ)ÑSÔSÐSÐSÕSÔSÐ5ÑSÔSÕSÔSÐ6IÑSÔSÕSÔSÐJÑSÔSÕSÔSÈeÑ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ÐSÐSÐSÐSØ)Ô5ÐQÐ6GÐQÐ5Ð5Ð6GÑHÔHÐQÈEÐQÐHÈEÐQÐQÐQÐQÕQÔQÐQÐQÐQÐQÐHÈEÐQÑQÔQÐQÕQÔQÑQÔQÐQÐQÕQÔQÐ)ÑQÔQÐQÕQÔQÐ)ÑQÔQÐQÐQÕQÔQÐ5ÑQÔQÕQÔQÐ6GÑQÔQÕQÔQÐHÑ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ÐQrS   c                ó  — t          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        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚d	x}x}}t          t          v }|sàt          j        d
|fdt          t          f¦  «        dt	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddt	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚d	}t          t          v }|sàt          j        d
|fdt          t          f¦  «        dt	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddt	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚d	}d	S )u`   XÃ¡c minh há»‡ thá»‘ng InvariantSentinel bao quÃ¡t toÃ n bá»™ danh má»¥c mÃ£ lá»—i chuáº©n hÃ³a.é   r0   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr½   r
   )r#   r3   r~   r4   zassert %(py8)sr¿   Nr   r�   r   rƒ   r„   r%   r   )r½   r
   r9   r:   r;   r<   r=   r>   r?   r@   r   r   )	rE   rN   rI   re   rP   rÖ   rF   r‰   rO   s	            rQ   Ú(test_all_18_invariants_taxonomy_coveragezNTestEighteenInvariantsResilienceAudit.test_all_18_invariants_taxonomy_coverageY  sÿ  € åÕ&Ñ'Ô'Ð-¨2Ð-Ð'¨2Ò-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-Ð'¨2Ð-Ñ-Ô-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô-�sÑ-Ô-Ð-Õ-Ô-�sÑ-Ô-Ð-Ð-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô-Õ&Ñ-Ô-Ð-Õ-Ô-Õ&Ñ-Ô-Ð-Ð-Õ-Ô-Ð'Ñ-Ô-Õ-Ô-¨2Ñ-Ô-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-å-Õ1DÐDÐDÐDÐDÕDÔDÐDÐDÐDÐDÕ-Õ1DÐ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ÔDÐDÐDÕDÔDÕ1DÑDÔDÐDÕDÔDÕ1DÑ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Ý$Õ(;Ð;Ð;Ð;Ð;Õ;Ô;Ð;Ð;Ð;Ð;Õ$Õ(;Ð;Ñ;Ô;Ð;Õ;Ô;Ñ;Ô;Ð;Ð;Õ;Ô;Õ$Ñ;Ô;Ð;Õ;Ô;Õ$Ñ;Ô;Ð;Ð;Ð;Õ;Ô;Ñ;Ô;Ð;Ð;Õ;Ô;Õ(;Ñ;Ô;Ð;Õ;Ô;Õ(;Ñ;Ô;Ð;Ð;Ð;Ð;Ñ;Ð;Ð;Ð;Ð;Ð;Ñ;Ð;Õ;Õ;Ô;Ð;Ñ;Ô;Ñ;Ô;Ð;Ð;Ð;Ð;Ð;rS   N)rk   rl   rm   rn   r  r  r'  r*  ro   rS   rQ   r  r  1  sb   € € € € € ð Fð  Fðcð cð cð
7ð 
7ð 
7ð	Rð 	Rð 	Rð<ð <ð <ð <ð <rS   r  )+rn   Ú
__future__r   Úbuiltinsr;   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter9   r†   Útypingr   r   r   r   Úunittest.mockr   r	   Úpytestr  r
   r   r   r   Ú src.assistant_tool.agent_watcherr   Ú+src.assistant_tool.currency_exchange.modelsr   r   r   r   Ú8src.assistant_tool.currency_exchange.portfolio_optimizerr   r   Ú:src.assistant_tool.currency_exchange.exchange_orchestratorr   r   Ú%src.assistant_tool.item_hover_watcherr   r   rq   r«   r  ro   rS   rQ   ú<module>r8     sJ  ððð ð #Ð "Ð "Ð "Ð "Ð "à  € € € € € € € € € € € € €€€€Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø *Ð *Ð *Ð *Ð *Ð *Ð *Ð *à €€€ðð ð ð ð ð ð ð ð ð ð ð ð BÐ AÐ AÐ AÐ AÐ Aðð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð CÐ BÐ BÐ BÐ BÐ BðM3ð M3ð M3ð M3ð M3ñ M3ô M3ð M3ðhW-ð W-ð W-ð W-ð W-ñ W-ô W-ð W-ð|Eeð Eeð Eeð Eeð Eeñ Eeô Eeð EeðX-<ð -<ð -<ð -<ð -<ñ -<ô -<ð -<ð -<ð -<rS   