§
    £¿j}:  ã                  ó  — d Z ddlmZ ddlZddlmZ ddlmZ ddlm	Z	 ddl
mZ ddlmZ dd	lmZ dd
lmZmZmZmZmZmZ ej        d„ ¦   «         Z G d„ d¦  «        Z G d„ d¦  «        Z G d„ d¦  «        Z G d„ d¦  «        ZdS )ao  
Comprehensive Unit Tests for Safe Teleportation & PoE2 Hideout Town Portal Engine.

Verifies:
1. Domain models, enums, backward-compatibility aliases, and immutability.
2. Authoritative 3.5s channeling state machine with movement/damage interrupts.
3. 5-Gate Destination Validation and spiral ray landing coordinate resolver.
4. Dynamic 2-way TownPortalLink, personal exclusivity, and party member traversal.
5. 6-portal Map Device charge tracking and permanent sealing at 0 charges.
6. Anti-exploit quarantine for active boss encounters and secret chambers.
7. Death penalty handling across wilderness and map instances.
é    )ÚannotationsN)ÚPartyService)ÚGuildRosterService)ÚSocialService)ÚGuildMemberPresenceDTO)ÚTeleportService)ÚTownPortalEngine)ÚInterruptReasonÚPortalQuarantineStatusÚ
TargetTypeÚTeleportChannelSessionÚTeleportChannelStatusÚTownPortalLinkc                 ó¢   — t          ¦   «         } t          ¦   «         }t          ¦   «         }t          | ||¦  «        }t	          ¦   «         }| ||||fS )N)r   r   r   r   r	   )Ú	party_svcÚ
social_svcÚ	guild_svcÚteleport_svcÚportal_engines        ú<C:\Projects\FreeExile\tests\unit\test_teleport_and_portal.pyÚservicesr   "   sL   € å‘”€IÝ‘”€JÝ"Ñ$Ô$€IÝ" 9¨j¸)ÑDÔD€LÝ$Ñ&Ô&€MØ�j )¨\¸=ÐHÐHó    c                  ó"   — e Zd ZdZdd„Zdd„ZdS )ÚTestTownPortalTypesAndAliaseszOVerifies dataclass immutability, slotted properties, and compatibility aliases.ÚreturnÚNonec                ó(  — t          ddddddddd¬	¦	  «	        }|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|d
         dk    sJ ‚|d         dk    sJ ‚|d         du sJ ‚d|d<   |j        du sJ ‚d S )NÚ	tp_hero_1Úhero_1Úzone_tang_kiem_nhaig      ^@g     @u@Úzone_player_hideoutç        T)	Ú	portal_idÚowner_idÚwilderness_zone_idÚwilderness_xÚwilderness_yÚhub_zone_idÚhub_xÚhub_yÚ	is_activeÚorigin_zoneÚhub_zoner+   F)r   Ú	player_idr,   Úorigin_xÚorigin_yr-   r+   )ÚselfÚportals     r   Ú1test_town_portal_link_properties_and_subscriptingzOTestTownPortalTypesAndAliases.test_town_portal_link_properties_and_subscripting/   sþ   € ÝØ!ØØ4ØØØ-ØØØð

ñ 

ô 

ˆð Ô 8Ò+Ð+Ð+Ð+ØÔ!Ð%:Ò:Ð:Ð:Ð:ØŒ %Ò'Ð'Ð'Ð'ØŒ %Ò'Ð'Ð'Ð'ØŒÐ"7Ò7Ð7Ð7Ð7à�mÔ$Ð(=Ò=Ð=Ð=Ð=Ø�jÔ!Ð%:Ò:Ð:Ð:Ð:Ø�kÔ" dÐ*Ð*Ð*Ð*à#ˆˆ{ÑØÔ 5Ð(Ð(Ð(Ð(Ð(Ð(r   c           	     ó   — t          ddt          j        dddd¬¦  «        }|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|d	         dk    sJ ‚|d
         dk    sJ ‚d S )NÚchan_p1_100Úp1Úp2g     @�@ç      @Ú	zone_wild)Ú
session_idr.   Útarget_typeÚ	target_idÚ
start_timeÚduration_secondsÚtarget_zone_idi¬  r?   r=   )r   r   ÚPARTY_MEMBERÚ
channel_idÚ	caster_idÚtarget_player_idÚ	cast_timeÚduration_ms)r1   Úsessions     r   Ú9test_teleport_channel_session_properties_and_subscriptingzWTestTownPortalTypesAndAliases.test_teleport_channel_session_properties_and_subscriptingH   sÇ   € Ý(Ø$ØÝ"Ô/ØØØ Ø&ð
ñ 
ô 
ˆð Ô! ]Ò2Ð2Ð2Ð2ØÔ  DÒ(Ð(Ð(Ð(ØÔ'¨4Ò/Ð/Ð/Ð/ØÔ  CÒ'Ð'Ð'Ð'ØÔ" dÒ*Ð*Ð*Ð*ØÐ'Ô(¨KÒ7Ð7Ð7Ð7Ø�|Ô$¨Ò.Ð.Ð.Ð.Ð.Ð.r   N©r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r3   rG   © r   r   r   r   ,   sB   € € € € € ØYÐYð)ð )ð )ð )ð2/ð /ð /ð /ð /ð /r   r   c                  ó:   — e Zd ZdZd
d„Zd
d„Zd
d„Zd
d„Zd
d„Zd	S )ÚTestTeleportChannelStateMachinezXVerifies 3.5s channeling lifecycle, movement/damage interrupts, and spiral ray resolver.r   r   c                óö  — |\  }}}}}|                      ddd¦  «        }|                     |j        dd¦  «         |                     |j        ddd¦  «         |                     dt
          j        dd¦  «        \  }}|du r|                     d¦  «        sJ ‚d|j        v sJ ‚| 	                    dd	¬
¦  «        \  }}	|du rd|	v sJ ‚| 	                    dd¬
¦  «        \  }
}|
du r|dk    sJ ‚d|j        vsJ ‚d S )Nr6   ÚCasteré   r7   ÚTargetr9   TÚchan_p1_g333333@)Úelapsed_timeFÚCAST_INCOMPLETEr8   )
Úcreate_partyÚinvite_playerÚparty_idÚaccept_inviteÚstart_teleport_channelr   r@   Ú
startswithÚactive_channelsÚcomplete_channel)r1   r   r   Ú_r   ÚpÚokÚchan_idÚok_prematureÚerrÚok_doneÚ	dest_zones               r   Ú#test_channel_full_lifecycle_successzCTestTeleportChannelStateMachine.test_channel_full_lifecycle_success^   sB  € Ø+3Ñ(ˆ	�1�a˜ qØ×"Ò" 4¨°2Ñ6Ô6ˆØ×Ò ¤
¨D°$Ñ7Ô7Ð7Ø×Ò ¤
¨D°(¸BÑ?Ô?Ð?à"×9Ò9¸$Å
Ô@WÐY]Ð_jÑkÔk‰ˆˆGØ�Tˆzˆz˜g×0Ò0°Ñ<Ô<ˆzˆzÐ<Ø�|Ô3Ð3Ð3Ð3Ð3ð )×9Ò9¸$ÈSÐ9ÑQÔQÑˆ�cØ˜uÐ$Ð$Ð):¸cÐ)AÐ)AÐ)AÐAð *×:Ò:¸4ÈcÐ:ÑRÔRÑˆ�Ø˜$ˆˆ 9°Ò#;Ð#;Ð#;Ð;Ø˜<Ô7Ð7Ð7Ð7Ð7Ð7Ð7r   c                óª  — |\  }}}}}|                      ddd¦  «        }|                     |j        dd¦  «         |                     |j        ddd¦  «         |                     dt
          j        dd¦  «         |                     dd¬¦  «        �J ‚d|j        v sJ ‚|                     dd	¬¦  «        }|t          j
        k    sJ ‚d|j        vsJ ‚d S )
Nr6   rQ   rR   r7   rS   r9   g{®Gáz¤?)Úmagg¸…ëQ¸®?)rW   rX   rY   rZ   r[   r   r@   Úon_player_movedr]   r
   ÚINTERRUPT_MOVEMENT©r1   r   r   r_   r   r`   Úreasons          r   Ú test_movement_interrupt_triggersz@TestTeleportChannelStateMachine.test_movement_interrupt_triggersq   sø   € Ø+3Ñ(ˆ	�1�a˜ qØ×"Ò" 4¨°2Ñ6Ô6ˆØ×Ò ¤
¨D°$Ñ7Ô7Ð7Ø×Ò ¤
¨D°(¸BÑ?Ô?Ð?à×+Ò+¨Dµ*Ô2IÈ4ÐQ\Ñ]Ô]Ð]à×+Ò+¨D°dÐ+Ñ;Ô;ÐCÐCÐCØ�|Ô3Ð3Ð3Ð3Ð3ð ×-Ò-¨d¸Ð-Ñ=Ô=ˆØ�Ô;Ò;Ð;Ð;Ð;Ø˜<Ô7Ð7Ð7Ð7Ð7Ð7Ð7r   c                óª  — |\  }}}}}|                      ddd¦  «        }|                     |j        dd¦  «         |                     |j        ddd¦  «         |                     dt
          j        dd¦  «         |                     dd¬¦  «        �J ‚d|j        v sJ ‚|                     dd	¬¦  «        }|t          j
        k    sJ ‚d|j        vsJ ‚d S )
Nr6   rQ   rR   r7   rS   r9   r"   )Údamageg      ø?)rW   rX   rY   rZ   r[   r   r@   Úon_player_damagedr]   r
   ÚINTERRUPT_DAMAGErl   s          r   Útest_damage_interrupt_triggersz>TestTeleportChannelStateMachine.test_damage_interrupt_triggers�   sø   € Ø+3Ñ(ˆ	�1�a˜ qØ×"Ò" 4¨°2Ñ6Ô6ˆØ×Ò ¤
¨D°$Ñ7Ô7Ð7Ø×Ò ¤
¨D°(¸BÑ?Ô?Ð?à×+Ò+¨Dµ*Ô2IÈ4ÐQ\Ñ]Ô]Ð]à×-Ò-¨d¸3Ð-Ñ?Ô?ÐGÐGÐGØ�|Ô3Ð3Ð3Ð3Ð3ð ×/Ò/°¸SÐ/ÑAÔAˆØ�Ô9Ò9Ð9Ð9Ð9Ø˜<Ô7Ð7Ð7Ð7Ð7Ð7Ð7r   c                ó^  — |\  }}}}}|                      ddd¦  «        }|                     |j        dd¦  «         |                     |j        ddd¦  «         |                     dt
          j        dd¦  «         |                     d¦  «        du sJ ‚|                     d¦  «        du sJ ‚d S )	Nr6   rQ   rR   r7   rS   r9   TF)rW   rX   rY   rZ   r[   r   r@   Úcancel_channel)r1   r   r   r_   r   r`   s         r   Útest_manual_cancellationz8TestTeleportChannelStateMachine.test_manual_cancellation‘   sÁ   € Ø+3Ñ(ˆ	�1�a˜ qØ×"Ò" 4¨°2Ñ6Ô6ˆØ×Ò ¤
¨D°$Ñ7Ô7Ð7Ø×Ò ¤
¨D°(¸BÑ?Ô?Ð?à×+Ò+¨Dµ*Ô2IÈ4ÐQ\Ñ]Ô]Ð]Ø×*Ò*¨4Ñ0Ô0°DÐ8Ð8Ð8Ð8Ø×*Ò*¨4Ñ0Ô0°EÐ9Ð9Ð9Ð9Ð9Ð9r   c                ó´   — |\  }}}}}|                      dd¦  «        \  }}|dk    r|dk    sJ ‚dd	„}|                      dd|¦  «        \  }}||fd
k    sJ ‚d S )Nç      $@ç      4@ç      (@ÚxÚfloatÚyr   Úboolc                ó   — | dk    o|dk    S )Nrz   ry   rM   )r{   r}   s     r   Úmock_blockedzVTestTeleportChannelStateMachine.test_spiral_ray_landing_resolver.<locals>.mock_blocked¢   s   € Ø˜’9Ð*  d¢Ð*r   )rz   ry   )r{   r|   r}   r|   r   r~   )Úresolve_safe_landing_coords)	r1   r   r_   r   ÚlxÚlyr€   Úlx2Úly2s	            r   Ú test_spiral_ray_landing_resolverz@TestTeleportChannelStateMachine.test_spiral_ray_landing_resolver›   s�   € Ø#+Ñ ˆˆ1ˆa�˜qà×9Ò9¸$ÀÑEÔE‰ˆˆBØ�TŠzˆz˜b Dšj˜j˜jÐ(ð	+ð 	+ð 	+ð 	+ð  ×;Ò;¸DÀ$ÈÑUÔU‰ˆˆSØ�Sˆz˜\Ò)Ð)Ð)Ð)Ð)Ð)r   NrH   )	rI   rJ   rK   rL   rg   rn   rs   rv   r†   rM   r   r   rO   rO   [   s~   € € € € € ØbÐbð8ð 8ð 8ð 8ð&8ð 8ð 8ð 8ð 8ð 8ð 8ð 8ð :ð :ð :ð :ð*ð *ð *ð *ð *ð *r   rO   c                  ó2   — e Zd ZdZd	d„Zd	d„Zd	d„Zd	d„ZdS )
Ú!TestFiveGateDestinationValidationz,Verifies all 5 destination validation gates.r   r   c                óx   — |\  }}}}}|                      ddt          j        dd¬¦  «        \  }}|du rd|v sJ ‚d S )Nr6   r7   Úzone_wF)Útarget_aliveÚGATE_1_TARGET_DEAD)Úvalidate_destination_5_gatesr   r@   )r1   r   r_   r   ra   rm   s         r   Útest_gate_1_livenessz6TestFiveGateDestinationValidation.test_gate_1_liveness¬   sc   € Ø#+Ñ ˆˆ1ˆa�˜qØ!×>Ò>¸tÀTÍ:ÔKbÐdlð  |AÐ>ñ  Bô  B‰
ˆˆFØ�Uˆ{ˆ{Ð3°vÐ=Ð=Ð=Ð=Ð=Ð=r   c                óÚ  — |\  }}}}}|                      ddt          j        d¦  «        \  }}|du rd|v sJ ‚|                      ddt          j        d¦  «        \  }}	|du rd|	v sJ ‚|                      ddt          j        d¦  «        \  }}
|du rd|
v sJ ‚t          dddd	d
d¦  «        }|                     d|¦  «         |                      ddt          j        d¦  «        \  }}|d
u sJ ‚d S )Nr6   ÚstrangerrŠ   FÚGATE_2_RELATIONSHIPÚg_mateÚMateé2   u   Huynh Ä�á»‡TÚguild_1)r�   r   r@   ÚFRIENDÚ	GUILDMATEr   Úregister_member)r1   r   r   r   r   r   r_   ra   Úr1Úr2Úr3ÚmÚok_gs                r   Ú&test_gate_2_relationship_authorizationzHTestFiveGateDestinationValidation.test_gate_2_relationship_authorization±   s(  € Ø<DÑ9ˆ	�:˜y¨,¸à×:Ò:¸4ÀÍZÔMdÐfnÑoÔo‰ˆˆBØ�Uˆ{ˆ{Ð4¸Ð:Ð:Ð:Ð:ð ×:Ò:¸4ÀÍZÔM^Ð`hÑiÔi‰ˆˆBØ�Uˆ{ˆ{Ð4¸Ð:Ð:Ð:Ð:ð ×:Ò:¸4ÀÍZÔMaÐckÑlÔl‰ˆˆBØ�Uˆ{ˆ{Ð4¸Ð:Ð:Ð:Ð:õ # 8¨V°R¸ÈÈhÑWÔWˆØ×!Ò! )¨QÑ/Ô/Ð/Ø×;Ò;¸DÀ(ÍJÔL`ÐbjÑkÔk‰ˆˆaØ�tˆ|ˆ|ˆ|ˆ|ˆ|ˆ|r   c                óÐ  — |\  }}}}}|                      ddd¦  «        }|                     |j        dd¦  «         |                     |j        ddd¦  «         |                     ddd¬¦  «         |                     ddt          j        d¦  «        \  }}|d	u rd
|v sJ ‚|                     dd	¬¦  «         |                     ddt          j        d¦  «        \  }}	|d	u rd|	v sJ ‚d S )Nr6   rQ   rR   r7   rS   Ú	zone_fullé   )Úplayer_countÚmax_capacityFÚGATE_3_CAPACITYÚ	zone_dead)r+   ÚGATE_4_LIFECYCLE©rW   rX   rY   rZ   Úset_zone_stater�   r   r@   )
r1   r   r   r_   r   r`   Úok3r›   Úok4Úr4s
             r   Ú(test_gate_3_and_4_capacity_and_lifecyclezJTestFiveGateDestinationValidation.test_gate_3_and_4_capacity_and_lifecycleÅ   s  € Ø+3Ñ(ˆ	�1�a˜ qØ×"Ò" 4¨°2Ñ6Ô6ˆØ×Ò ¤
¨D°$Ñ7Ô7Ð7Ø×Ò ¤
¨D°(¸BÑ?Ô?Ð?ð 	×#Ò# K¸aÈaÐ#ÑPÔPÐPØ×;Ò;¸DÀ$Í
ÔH_ÐalÑmÔm‰ˆˆRØ�eˆ|ˆ|Ð 1°RÐ 7Ð 7Ð 7Ð7ð 	×#Ò# K¸5Ð#ÑAÔAÐAØ×;Ò;¸DÀ$Í
ÔH_ÐalÑmÔm‰ˆˆRØ�eˆ|ˆ|Ð 2°bÐ 8Ð 8Ð 8Ð8Ð 8Ð 8r   c                ó,  — |\  }}}}}|                      ddd¦  «        }|                     |j        dd¦  «         |                     |j        ddd¦  «         |                     dd¬¦  «         |                     ddt          j        d¦  «        \  }}|d	u rd
|v sJ ‚|                     dd¬¦  «         |                     ddt          j        d¦  «        \  }}	|d	u rd|	v sJ ‚|                     ddt          j        d¦  «        \  }
}|
d	u rd|v sJ ‚d S )Nr6   rQ   rR   r7   rS   Ú	zone_bossT)Úis_boss_activeFÚGATE_5_QUARANTINE_BOSSÚzone_secret)Úis_secret_activeÚGATE_5_QUARANTINE_SECRETÚzone_player_hideout_otherÚGATE_5_RESTRICTED_ISOLATIONr§   )r1   r   r   r_   r   r`   Úok_bÚrbÚok_sÚrsÚok_hÚrhs               r   Ú$test_gate_5_quarantine_and_isolationzFTestFiveGateDestinationValidation.test_gate_5_quarantine_and_isolationÕ   sN  € Ø+3Ñ(ˆ	�1�a˜ qØ×"Ò" 4¨°2Ñ6Ô6ˆØ×Ò ¤
¨D°$Ñ7Ô7Ð7Ø×Ò ¤
¨D°(¸BÑ?Ô?Ð?ð 	×#Ò# KÀÐ#ÑEÔEÐEØ×<Ò<¸TÀ4ÍÔI`ÐbmÑnÔn‰ˆˆbØ�uˆ}ˆ}Ð!9¸RÐ!?Ð!?Ð!?Ð?ð 	×#Ò# MÀDÐ#ÑIÔIÐIØ×<Ò<¸TÀ4ÍÔI`ÐboÑpÔp‰ˆˆbØ�uˆ}ˆ}Ð!;¸rÐ!AÐ!AÐ!AÐAð  ×<Ò<¸TÀ4ÍÔI`Ðb}Ñ~Ô~‰ˆˆbØ�uˆ}ˆ}Ð!>À"Ð!DÐ!DÐ!DÐDÐ!DÐ!Dr   NrH   )rI   rJ   rK   rL   rŽ   rž   r¬   r¼   rM   r   r   rˆ   rˆ   ©   sp   € € € € € Ø6Ð6ð>ð >ð >ð >ð
ð ð ð ð(9ð 9ð 9ð 9ð Eð Eð Eð Eð Eð Er   rˆ   c                  ó:   — e Zd ZdZd
d„Zd
d„Zd
d„Zd
d„Zd
d„Zd	S )Ú!TestTownPortalEngineAndQuarantinezWVerifies 2-way TownPortalLink, 6 map charges, encounter quarantines, and death penalty.r   r   c                ó6  — |\  }}}}}|                      ddddd¦  «        \  }}}|du r|€J ‚|j        |         j        du sJ ‚|                      ddddd¦  «        \  }}}|du r||k    sJ ‚|j        |         j        d	u sJ ‚|j        |         j        du sJ ‚d S )
NÚheror9   Úinst_1rx   ry   Tg      I@g      N@F)Úrequest_town_portalÚportalsr+   )r1   r   r_   r   Úok1Úp1_idÚok2Úp2_ids           r   Ú*test_2_way_portal_creation_and_exclusivityzLTestTownPortalEngineAndQuarantine.test_2_way_portal_creation_and_exclusivityí   sÞ   € Ø$,Ñ!ˆˆ1ˆa��MØ%×9Ò9¸&À+ÈxÐY]Ð_cÑdÔd‰ˆˆQ�Ø�dˆ{ˆ{˜uÐ0Ð0Ð0ØÔ$ UÔ+Ô5¸Ð=Ð=Ð=Ð=ð &×9Ò9¸&À+ÈxÐY]Ð_cÑdÔd‰ˆˆQ�Ø�dˆ{ˆ{˜u¨š~˜~˜~Ð-ØÔ$ UÔ+Ô5¸Ð>Ð>Ð>Ð>ØÔ$ UÔ+Ô5¸Ð=Ð=Ð=Ð=Ð=Ð=r   c                óê  — |\  }}}}}|                      ddd¦  «        }|                     |j        dd¦  «         |                     |j        ddd¦  «         |                     ddddd	¦  «        \  }}}|                     d||d
¬¦  «        \  }}}|du r|d         dk    sJ ‚|                     d||d¬¦  «        \  }	}}
|	du r|
dk    sJ ‚|                     d||¦  «        \  }}}|d
u rd|v sJ ‚d S )NÚleaderÚLeaderé(   Úmater“   r9   rÁ   ç      .@ç      9@F)Ú	is_returnTr   r!   )r9   rÎ   rÏ   r�   ÚPORTAL_UNAUTHORIZED)rW   rX   rY   rZ   rÂ   Útraverse_town_portal)r1   r   r   r_   r   r`   Úp_idÚok_ownÚdest1Úok_mateÚdest2Úok_strangerrd   s                r   Ú"test_party_member_portal_traversalzDTestTownPortalEngineAndQuarantine.test_party_member_portal_traversalù   sI  € Ø,4Ñ)ˆ	�1�a˜˜MØ×"Ò" 8¨X°rÑ:Ô:ˆØ×Ò ¤
¨H°fÑ=Ô=Ð=Ø×Ò ¤
¨F°F¸BÑ?Ô?Ð?à"×6Ò6°xÀÈhÐX\Ð^bÑcÔc‰
ˆˆ1ˆdð )×=Ò=¸hÈÈiÐchÐ=ÑiÔiÑˆ��5Ø˜ˆ~ˆ~ %¨¤(Ð.CÒ"CÐ"CÐ"CÐCð *×>Ò>¸vÀtÈYÐbfÐ>ÑgÔgÑˆ��EØ˜$ˆˆ 5Ð,EÒ#EÐ#EÐ#EÐEð ,×@Ò@ÀÈTÐS\Ñ]Ô]Ñˆ�S˜!Ø˜eÐ#Ð#Ð(=ÀÐ(DÐ(DÐ(DÐDÐ(DÐ(Dr   c                óP  — |\  }}}}}|                      dd¬¦  «         |j        d         dk    sJ ‚|                     d¦  «        \  }}}|du r|dk    sJ ‚|                     d¦  «        \  }}}|du r|dk    sJ ‚|                     d¦  «        \  }}	}
|du r
|
dk    rd|	v sJ ‚d S )	NÚmap_t16é   ©Úinitial_chargesTé   r   FÚ
MAP_SEALED)Úregister_astral_map_deviceÚmap_chargesÚenter_map_portal)r1   r   r_   r   rÄ   Úrem1rÆ   Úrem2r©   Úmsg3Úrem3s              r   Ú2test_map_device_charge_tracking_and_permanent_sealzTTestTownPortalEngineAndQuarantine.test_map_device_charge_tracking_and_permanent_seal  sä   € Ø$,Ñ!ˆˆ1ˆa��MØ×0Ò0°ÈAÐ0ÑNÔNÐNØÔ(¨Ô3°qÒ8Ð8Ð8Ð8à$×5Ò5°iÑ@Ô@‰ˆˆQ�Ø�dˆ{ˆ{˜t qšy˜y˜yÐ(à$×5Ò5°iÑ@Ô@‰ˆˆQ�Ø�dˆ{ˆ{˜t qšy˜y˜yÐ(ð (×8Ò8¸ÑCÔC‰ˆˆT�4Ø�eˆ|ˆ| ¨¢	 	¨l¸dÐ.BÐ.BÐ.BÐBÐ.BÐ.Br   c                ó–  — |\  }}}}}|                      dd¬¦  «         |                     ddddd¦  «        \  }}}|du r|�J ‚d|v sJ ‚|                      dd¬¦  «         |                     ddddd¦  «        \  }}}|du r|€J ‚|                      d	d¬
¦  «         |                     ddd	dd¦  «        \  }	}
}|	du r|�J ‚d|
v sJ ‚d S )NÚ	inst_bossT)Úboss_activerÀ   r®   r"   FÚQUARANTINE_BOSS_ENGAGEDÚinst_secret)Úsecret_activer±   ÚQUARANTINE_SECRET_CHAMBER)Úset_encounter_staterÂ   )r1   r   r_   r   r¶   Úmsg_bÚp_bÚok_b2Úp_b2r¸   Úmsg_sÚp_ss               r   Ú,test_anti_exploit_boss_and_secret_quarantinezNTestTownPortalEngineAndQuarantine.test_anti_exploit_boss_and_secret_quarantine  s1  € Ø$,Ñ!ˆˆ1ˆa��MØ×)Ò)¨+À4Ð)ÑHÔHÐHð )×<Ò<¸VÀ[ÐR]Ð_bÐdgÑhÔhÑˆˆe�SØ�uˆ}ˆ}   Ð,Ø(¨EÐ1Ð1Ð1Ð1ð 	×)Ò)¨+À5Ð)ÑIÔIÐIØ&×:Ò:¸6À;ÐP[Ð]`ÐbeÑfÔf‰ˆˆq�$Ø˜ˆ}ˆ} Ð!1Ð!1Ð1ð 	×)Ò)¨-ÀtÐ)ÑLÔLÐLØ(×<Ò<¸VÀ]ÐTaÐcfÐhkÑlÔlÑˆˆe�SØ�uˆ}ˆ}   Ð,Ø*¨eÐ3Ð3Ð3Ð3Ð3Ð3r   c                óÎ  — |\  }}}}}|                      ddddd¦  «        \  }}}|                      ddddd¦  «        \  }}}|                     dddd¬¦  «        \  }}|du rd	|v sJ ‚|j        |         j        du sJ ‚|j        |         j        du sJ ‚|                     d
d¬¦  «         |                     ddd
d¬¦  «        \  }}	|du rd|	v sJ ‚|j        d
         dk    sJ ‚d S )Nr   rŠ   rÁ   r"   Úhero_2F)Úis_map_instanceTÚWILDERNESS_DEATHÚmap_insté   rÝ   Úzone_mapÚMAP_DEATH_CONSUMED_PORTALé   )rÂ   Úon_player_deathrÃ   r+   rá   râ   )
r1   r   r_   r   r6   r7   Úok_wÚmsg_wÚok_mÚmsg_ms
             r   Ú-test_death_penalty_wilderness_vs_map_instancezOTestTownPortalEngineAndQuarantine.test_death_penalty_wilderness_vs_map_instance0  s@  € Ø$,Ñ!ˆˆ1ˆa��Mà ×4Ò4°X¸xÈÐSVÐX[Ñ\Ô\‰ˆˆ1ˆbØ ×4Ò4°X¸xÈÐSVÐX[Ñ\Ô\‰ˆˆ1ˆbØ#×3Ò3°H¸hÈÐbgÐ3ÑhÔh‰ˆˆeØ�tˆ|ˆ|Ð 2°eÐ ;Ð ;Ð ;Ð;ØÔ$ RÔ(Ô2°eÐ;Ð;Ð;Ð;ØÔ$ RÔ(Ô2°dÐ:Ð:Ð:Ð:ð 	×0Ò0°ÈQÐ0ÑOÔOÐOØ#×3Ò3°H¸jÈ*ÐfjÐ3ÑkÔk‰ˆˆeØ�tˆ|ˆ|Ð ;¸uÐ DÐ DÐ DÐDØÔ(¨Ô4¸Ò9Ð9Ð9Ð9Ð9Ð9r   NrH   )	rI   rJ   rK   rL   rÈ   rÙ   rè   r÷   r  rM   r   r   r¾   r¾   ê   s†   € € € € € ØaÐað
>ð 
>ð 
>ð 
>ðEð Eð Eð Eð(Cð Cð Cð Cð4ð 4ð 4ð 4ð(:ð :ð :ð :ð :ð :r   r¾   )rL   Ú
__future__r   ÚpytestÚserver.party.party_servicer   Ú"server.social.guild_roster_servicer   Úserver.social.social_servicer   Úserver.social.social_typesr   Úserver.world.teleport_servicer   Úserver.world.town_portal_enginer	   Úserver.world.town_portal_typesr
   r   r   r   r   r   Úfixturer   r   rO   rˆ   r¾   rM   r   r   ú<module>r     sÏ  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€à 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø AÐ AÐ AÐ AÐ AÐ AØ 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø =Ð =Ð =Ð =Ð =Ð =Ø 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø <Ð <Ð <Ð <Ð <Ð <ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð „ðIð Iñ „ðIð,/ð ,/ð ,/ð ,/ð ,/ñ ,/ô ,/ð ,/ð^K*ð K*ð K*ð K*ð K*ñ K*ô K*ð K*ð\>Eð >Eð >Eð >Eð >Eñ >Eô >Eð >EðBT:ð T:ð T:ð T:ð T:ñ T:ô T:ð T:ð T:ð T:r   