§
    /¿ju+  ã                  óü   — 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mZmZmZmZmZ ddlmZmZmZmZmZmZmZmZ ddlmZmZ  G d„ d¦  «        Z G d	„ d
¦  «        Z G d„ d¦  «        Z G d„ d¦  «        Z dS )zò
Canonical Opaque-Box Test Harness and Reference Engines for FreeExile Social & Party.
Binds to server modules when present; otherwise provides reference oracle engines
conforming 100% to specifications in PROJECT.md and ORIGINAL_REQUEST.md.
é    )ÚannotationsN)ÚDictÚListÚOptionalÚSetÚTuple)ÚFriendPresenceDTOÚGroundLootDropÚGuildMemberPresenceDTOÚInterruptReasonÚLootAllocationModeÚPartyMemberStateÚ
PartyStateÚ
TargetType)ÚTeleportServiceÚTownPortalEnginec                  óZ   — e Zd ZdZedd„¦   «         Zedd„¦   «         Zedd„¦   «         ZdS )ÚPartyScalingCalculatorzACanonical mathematical oracle for EXP, loot, and monster scaling.Úbase_expÚintÚmembersúList[PartyMemberState]ÚreturnúDict[str, int]c                ó:  ‡‡‡‡— t          |¦  «        Š‰dk    ri S dd‰dz
  z  z   }t          t          j        | |z  ¦  «        ¦  «        Šd„ |D ¦   «         Št	          ‰                     ¦   «         ¦  «        Š‰dk    rˆˆfd„|D ¦   «         S ˆˆˆfd„|D ¦   «         S )Nr   ç      ð?ç333333Ó?é   c                ó4   — i | ]}|j         |j        d z   dz  “ŒS )é
   g®Gáz®@)Ú	player_idÚlevel)Ú.0Úms     ú<C:\Projects\FreeExile\tests\e2e_social_party\test_harness.pyú
<dictcomp>z>PartyScalingCalculator.calculate_party_exp.<locals>.<dictcomp>'   s'   € ÐHÐHÐH¸1�1”; ¤¨2¡°$Ñ 6ÐHÐHÐHó    c                ó&   •— i | ]}|j         ‰‰z  “ŒS © )r!   )r#   r$   ÚnÚ
total_pools     €€r%   r&   z>PartyScalingCalculator.calculate_party_exp.<locals>.<dictcomp>*   s!   ø€ ÐBÐBÐB°Q�A”K ¨q¡ÐBÐBÐBr'   c           
     ó€   •— i | ]:}|j         t          t          j        ‰‰|j                  ‰z  z  ¦  «        ¦  «        “Œ;S r)   )r!   r   ÚmathÚfloor)r#   r$   r+   Útotal_weightÚweightss     €€€r%   r&   z>PartyScalingCalculator.calculate_party_exp.<locals>.<dictcomp>+   sP   ø€ ð 
ð 
ð 
àð ŒK��TœZ¨
°g¸a¼kÔ6JÈ\Ñ6YÑ(ZÑ[Ô[Ñ\Ô\ð
ð 
ð 
r'   )Úlenr   r-   r.   ÚsumÚvalues)r   r   Ú	pool_multr*   r+   r/   r0   s      @@@@r%   Úcalculate_party_expz*PartyScalingCalculator.calculate_party_exp    sÔ   øøøø€ å�‰LŒLˆØ�Š6ˆ6ØˆIØ˜$ ! a¡%™.Ñ(ˆ	Ý�œ H¨yÑ$8Ñ9Ô9Ñ:Ô:ˆ
ØHÐHÀÐHÑHÔHˆÝ˜7Ÿ>š>Ñ+Ô+Ñ,Ô,ˆØ˜1ÒÐØBÐBÐBÐBÐB¸'ÐBÑBÔBÐBð
ð 
ð 
ð 
ð 
ð 
àð
ñ 
ô 
ð 	
r'   Únearby_countúTuple[float, float, float]c                óV   — | dk    rdS | dz
  }dd|z  z   }dd|z  z   }dd|z  z   }|||fS )Nr   )r   r   r   r   r   ç      à?r   r)   )r6   ÚextraÚitem_qtyÚcurr_qtyÚraritys        r%   Úcalculate_loot_multipliersz1PartyScalingCalculator.calculate_loot_multipliers0   sS   € à˜1ÒÐØ �=Ø˜qÑ ˆØ˜ ™Ñ%ˆØ˜ ™Ñ%ˆØ�t˜e‘|Ñ#ˆØ˜ 6Ð)Ð)r'   Úmonster_typeÚstrÚ
party_sizeúDict[str, float]c                óà   — t          d|dz
  ¦  «        }|                      ¦   «         }|dk    r	dd|z  z   }n|dk    r	dd|z  z   }ndd|z  z   }dd|z  z   }t          d	d
|z  ¦  «        }|||ddœS )Nr   r   ÚBOSSr   ÚRAREgffffffæ?r9   gš™™™™™¹?g     ÀR@g       @g333333Ã?)Úhp_multÚ
armor_multÚ	res_bonusÚpoise_ratio)ÚmaxÚupperÚmin)r?   rA   r:   Úm_typerF   rG   rH   s          r%   Úcalculate_monster_scalingz0PartyScalingCalculator.calculate_monster_scaling:   s¦   € å�A�z A‘~Ñ&Ô&ˆØ×#Ò#Ñ%Ô%ˆØ�VÒÐØ˜D 5™LÑ(ˆGˆGØ�vÒÐØ˜D 5™LÑ(ˆGˆGà˜D 5™LÑ(ˆGØ˜4 %™<Ñ'ˆ
Ý˜˜c E™kÑ*Ô*ˆ	àØ$Ø"Øð	
ð 
ð 	
r'   N)r   r   r   r   r   r   )r6   r   r   r7   )r?   r@   rA   r   r   rB   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ústaticmethodr5   r>   rN   r)   r'   r%   r   r      sx   € € € € € ØKÐKàð
ð 
ð 
ñ „\ð
ð ð*ð *ð *ñ „\ð*ð ð
ð 
ð 
ñ „\ð
ð 
ð 
r'   r   c                  óh   — e Zd ZdZd%d„Zd&d'd„Zd(d„Zd&d)d„Zd*d„Zd+d„Z	d,d„Z
d-d„Zd.d„Zd/d0d#„Zd$S )1ÚPartyServicez>Canonical party lifecycle & nearby spatial membership manager.r   ÚNonec                ó0   — i | _         i | _        i | _        d S ©N)ÚpartiesÚplayer_party_mapÚpending_invites©Úselfs    r%   Ú__init__zPartyService.__init__Q   s   € Ø.0ˆŒØ02ˆÔØ46ˆÔÐÐr'   Úzone_boundless_sanctuaryÚinst_1Ú	leader_idr@   Únamer"   r   Úzone_idÚinstance_idr   c           	     ó.  — || j         v rt          d¦  «        ‚d|› dt          t          j        ¦   «         dz  ¦  «        › �}t	          |||||dd¦  «        }t          ||||i¬¦  «        }|| j        |<   || j         |<   t          ¦   «         | j        |<   |S )NzPlayer is already in a partyÚparty_Ú_iè  ç        )Úparty_idra   r   )	rZ   Ú
ValueErrorr   Útimer   r   rY   Úsetr[   )	r]   ra   rb   r"   rc   rd   ri   ÚleaderÚps	            r%   Úcreate_partyzPartyService.create_partyV   s«   € Ø˜Ô-Ð-Ð-ÝÐ;Ñ<Ô<Ð<Ø?˜IÐ?Ð?­­D¬I©K¬K¸Ñ,<Ñ(=Ô(=Ð?Ð?ˆÝ! )¨T°5¸'À;ÐPSÐUXÑYÔYˆÝ °IÈ	ÐSYÐGZÐ[Ñ[Ô[ˆØ!"ˆŒ�XÑØ+3ˆÔ˜iÑ(Ý),©¬ˆÔ˜XÑ&Øˆr'   ri   Ú	sender_idÚ	target_idÚboolc                óè   — | j                              |¦  «        }|r|j        |k    rdS t          |j        ¦  «        |j        k    s	|| j        v rdS | j        |                              |¦  «         dS ©NFT)	rY   Úgetra   r1   r   Úmax_membersrZ   r[   Úadd)r]   ri   rp   rq   rn   s        r%   Úinvite_playerzPartyService.invite_playera   sx   € ØŒL×Ò˜XÑ&Ô&ˆØð 	�A”K 9Ò,Ð,Ø�5ÝˆqŒy‰>Œ>˜Qœ]Ò*Ð*¨i¸4Ô;PÐ.PÐ.PØ�5ØÔ˜XÔ&×*Ò*¨9Ñ5Ô5Ð5Øˆtr'   r!   c           	     ór  — | j                              |¦  «        }|r)|| j                             |t          ¦   «         ¦  «        vrdS t	          |j        ¦  «        |j        k    s	|| j        v rdS | j        |                              |¦  «         t          |||||dd¦  «        |j        |<   || j        |<   dS )NFrh   T)
rY   ru   r[   rl   r1   r   rv   rZ   Úremover   )r]   ri   r!   rb   r"   rc   rd   rn   s           r%   Úaccept_invitezPartyService.accept_invitej   s½   € ØŒL×Ò˜XÑ&Ô&ˆØð 	�I TÔ%9×%=Ò%=¸hÍÉÌÑ%NÔ%NÐNÐNØ�5ÝˆqŒy‰>Œ>˜Qœ]Ò*Ð*¨i¸4Ô;PÐ.PÐ.PØ�5ØÔ˜XÔ&×-Ò-¨iÑ8Ô8Ð8Ý/°	¸4ÀÈÐQ\Ð^aÐcfÑgÔgˆŒ	�)ÑØ+3ˆÔ˜iÑ(Øˆtr'   c                óz   — || j         v r1|| j         |         v r"| j         |                              |¦  «         dS dS ©NTF)r[   rz   )r]   ri   r!   s      r%   Údecline_invitezPartyService.decline_inviteu   sI   € Ø�tÔ+Ð+Ð+°	¸TÔ=QÐRZÔ=[Ð0[Ð0[ØÔ  Ô*×1Ò1°)Ñ<Ô<Ð<Ø�4Øˆur'   úOptional[PartyState]c                ó„  — | j                              |d ¦  «        }|r	|| j        vrd S | j        |         }|j                             |d ¦  «         |j        s%| j        |= | j                             |d ¦  «         d S |j        |k    r8t          t          |j                             ¦   «         ¦  «        ¦  «        |_        |S rX   )	rZ   ÚpoprY   r   r[   ra   ÚnextÚiterÚkeys)r]   r!   ri   rn   s       r%   Úleave_partyzPartyService.leave_party{   s¼   € ØÔ(×,Ò,¨Y¸Ñ=Ô=ˆØð 	˜8¨4¬<Ð7Ð7Ø�4ØŒL˜Ô"ˆØ	Œ	�Š�i Ñ&Ô&Ð&ØŒyð 	Ø”˜XÐ&ØÔ ×$Ò$ X¨tÑ4Ô4Ð4Ø�4ØŒ;˜)Ò#Ð#Ý�t A¤I§N¢NÑ$4Ô$4Ñ5Ô5Ñ6Ô6ˆAŒKØˆr'   c                ó¼   — | j                              |¦  «        }|r|j        |k    s||j        vs||k    rdS |j        |= | j                             |d ¦  «         dS rt   )rY   ru   ra   r   rZ   r�   )r]   ri   ra   rq   rn   s        r%   Úkick_memberzPartyService.kick_member‰   so   € ØŒL×Ò˜XÑ&Ô&ˆØð 	�A”K 9Ò,Ð,°	ÀÄÐ0JÐ0JÈiÐ[dÒNdÐNdØ�5ØŒI�iÐ ØÔ×!Ò! )¨TÑ2Ô2Ð2Øˆtr'   Úcurrent_leader_idÚnew_leader_idc                óx   — | j                              |¦  «        }|r|j        |k    s	||j        vrdS ||_        dS rt   )rY   ru   ra   r   )r]   ri   rˆ   r‰   rn   s        r%   Úpromote_leaderzPartyService.promote_leader‘   sI   € ØŒL×Ò˜XÑ&Ô&ˆØð 	�A”KÐ#4Ò4Ð4¸ÈQÌYÐ8VÐ8VØ�5Ø#ˆŒØˆtr'   c                ó&  — | j                              |¦  «        }|r|j        |k    rdS t          |j                             ¦   «         ¦  «        D ]}| j                             |d ¦  «         Œ| j         |= | j                             |d ¦  «         dS rt   )	rY   ru   ra   Úlistr   r„   rZ   r�   r[   )r]   ri   ra   rn   Úpids        r%   Údisband_partyzPartyService.disband_party˜   s—   € ØŒL×Ò˜XÑ&Ô&ˆØð 	�A”K 9Ò,Ð,Ø�5Ý˜œ	ŸšÑ(Ô(Ñ)Ô)ð 	1ð 	1ˆCØÔ!×%Ò% c¨4Ñ0Ô0Ð0Ð0ØŒL˜Ð"ØÔ× Ò  ¨4Ñ0Ô0Ð0Øˆtr'   ç      .@ÚradiusÚfloatr   c                óº  — | j                              |¦  «        }|r	|| j        vrg S | j        |         }|j                             |¦  «        }|sg S g }|j                             ¦   «         D ]l}|j        |j        k    rZ|j        |j        k    rJt          j        |j	        |j	        z
  |j
        |j
        z
  ¦  «        }||k    r|                     |¦  «         Œm|S rX   )rZ   ru   rY   r   r3   rc   rd   r-   ÚhypotÚxÚyÚappend)	r]   r!   r‘   ri   ÚpartyÚrefÚnearbyr$   Údists	            r%   Úget_nearby_memberszPartyService.get_nearby_members¢   sà   € ØÔ(×,Ò,¨YÑ7Ô7ˆØð 	˜8¨4¬<Ð7Ð7ØˆIØ”˜XÔ&ˆØŒm×Ò 	Ñ*Ô*ˆØð 	ØˆIØˆØ”×%Ò%Ñ'Ô'ð 	%ð 	%ˆAØŒy˜CœKÒ'Ð'¨A¬M¸S¼_Ò,LÐ,LÝ”z !¤#¨¬¡+¨q¬s°S´U©{Ñ;Ô;�Ø˜6’>�>Ø—M’M !Ñ$Ô$Ð$øØˆr'   N©r   rV   )r_   r`   )ra   r@   rb   r@   r"   r   rc   r@   rd   r@   r   r   )ri   r@   rp   r@   rq   r@   r   rr   )ri   r@   r!   r@   rb   r@   r"   r   rc   r@   rd   r@   r   rr   )ri   r@   r!   r@   r   rr   )r!   r@   r   r   )ri   r@   ra   r@   rq   r@   r   rr   )ri   r@   rˆ   r@   r‰   r@   r   rr   )ri   r@   ra   r@   r   rr   )r�   )r!   r@   r‘   r’   r   r   )rO   rP   rQ   rR   r^   ro   rx   r{   r~   r…   r‡   r‹   r�   rœ   r)   r'   r%   rU   rU   N   sñ   € € € € € ØHÐHð7ð 7ð 7ð 7ð
	ð 	ð 	ð 	ð 	ðð ð ð ð	ð 	ð 	ð 	ð 	ðð ð ð ðð ð ð ðð ð ð ðð ð ð ðð ð ð ðð ð ð ð ð ð r'   rU   c                  ór   — e Zd ZdZd d„Zd!d	„Zd"d„Zd"d„Zd!d„Zd#d„Z	d#d„Z
d$d„Zd%d„Zd&d„Zd'd„Zd(d„ZdS ))ÚSocialServicezECanonical Friend lifecycle, bidirectional block, and presence engine.r   rV   c                óL   — i | _         i | _        i | _        i | _        i | _        d S rX   )ÚfriendsÚfriend_requestsÚ
block_listÚnotesÚpresencer\   s    r%   r^   zSocialService.__init__¶   s*   € Ø,.ˆŒØ46ˆÔØ/1ˆŒØ13ˆŒ
Ø68ˆŒˆˆr'   rp   r@   rq   rr   c                ó¦   — || j                              |t          ¦   «         ¦  «        v p(|| j                              |t          ¦   «         ¦  «        v S rX   )r£   ru   rl   ©r]   rp   rq   s      r%   Ú
is_blockedzSocialService.is_blocked½   sI   € Ø˜Tœ_×0Ò0°½C¹E¼EÑBÔBÐBÐ{È	ÐUYÔUd×UhÒUhÐirÕtwÑtyÔtyÑUzÔUzÐHzÐ{r'   r!   c                ób  — | j                              |t          ¦   «         ¦  «                             |¦  «         | j                             |t          ¦   «         ¦  «                             |¦  «         | j                             |t          ¦   «         ¦  «                             |¦  «         d S rX   )r£   Ú
setdefaultrl   rw   r¡   ru   Údiscard©r]   r!   rq   s      r%   Úblock_playerzSocialService.block_playerÀ   s†   € ØŒ×"Ò" 9­c©e¬eÑ4Ô4×8Ò8¸ÑCÔCÐCØŒ×Ò˜¥C¡E¤EÑ*Ô*×2Ò2°9Ñ=Ô=Ð=ØŒ×Ò˜¥C¡E¤EÑ*Ô*×2Ò2°9Ñ=Ô=Ð=Ð=Ð=r'   c                óz   — | j                              |t          ¦   «         ¦  «                             |¦  «         d S rX   )r£   ru   rl   r«   r¬   s      r%   Úunblock_playerzSocialService.unblock_playerÅ   s2   € ØŒ×Ò˜I¥s¡u¤uÑ-Ô-×5Ò5°iÑ@Ô@Ð@Ð@Ð@r'   c                ó  — ||k    s|                       ||¦  «        rdS || j                             |t          ¦   «         ¦  «        v rdS | j                             |t          ¦   «         ¦  «                             |¦  «         dS rt   )r¨   r¡   ru   rl   r¢   rª   rw   r§   s      r%   Úsend_friend_requestz!SocialService.send_friend_requestÈ   s{   € Ø˜	Ò!Ð! T§_¢_°YÀ	Ñ%JÔ%JÐ!Ø�5Ø˜œ×(Ò(¨µC±E´EÑ:Ô:Ð:Ð:Ø�5ØÔ×'Ò'¨	µ3±5´5Ñ9Ô9×=Ò=¸iÑHÔHÐHØˆtr'   c                ó´  — || j                              |t          ¦   «         ¦  «        vrdS |                      ||¦  «        rdS | j         |                              |¦  «         | j                             |t          ¦   «         ¦  «                             |¦  «         | j                             |t          ¦   «         ¦  «                             |¦  «         dS rt   )r¢   ru   rl   r¨   rz   r¡   rª   rw   ©r]   rq   rp   s      r%   Úaccept_friend_requestz#SocialService.accept_friend_requestÐ   s¹   € Ø˜DÔ0×4Ò4°YÅÁÄÑFÔFÐFÐFØ�5Ø�?Š?˜9 iÑ0Ô0ð 	Ø�5ØÔ˜YÔ'×.Ò.¨yÑ9Ô9Ð9ØŒ×Ò 	­3©5¬5Ñ1Ô1×5Ò5°iÑ@Ô@Ð@ØŒ×Ò 	­3©5¬5Ñ1Ô1×5Ò5°iÑ@Ô@Ð@Øˆtr'   c                óœ   — || j                              |t          ¦   «         ¦  «        v r"| j         |                              |¦  «         dS dS r}   )r¢   ru   rl   rz   r³   s      r%   Údecline_friend_requestz$SocialService.decline_friend_requestÚ   sJ   € Ø˜Ô,×0Ò0°½C¹E¼EÑBÔBÐBÐBØÔ  Ô+×2Ò2°9Ñ=Ô=Ð=Ø�4Øˆur'   Ú	friend_idc                óJ  — || j                              |t          ¦   «         ¦  «        v ry| j         |                              |¦  «         | j                              |t          ¦   «         ¦  «                             |¦  «         | j                             ||fd ¦  «         dS dS r}   )r¡   ru   rl   rz   r«   r¤   r�   )r]   r!   r·   s      r%   Úremove_friendzSocialService.remove_friendà   s�   € Ø˜œ×(Ò(¨µC±E´EÑ:Ô:Ð:Ð:ØŒL˜Ô#×*Ò*¨9Ñ5Ô5Ð5ØŒL×Ò˜Y­©¬Ñ.Ô.×6Ò6°yÑAÔAÐAØŒJ�NŠN˜I yÐ1°4Ñ8Ô8Ð8Ø�4Øˆur'   c                ó‚   — || j                              |t          ¦   «         ¦  «        v o|                      ||¦  «         S rX   )r¡   ru   rl   r¨   r¬   s      r%   Ú	is_friendzSocialService.is_friendè   s;   € Ø˜DœL×,Ò,¨Y½¹¼Ñ>Ô>Ð>ÐlÀtÇÂÐW`ÐbkÑGlÔGlÐClÐlr'   Úowner_idÚnotec                óN   — |                       ||¦  «        sdS || j        ||f<   dS rt   )r»   r¤   )r]   r¼   r·   r½   s       r%   Úset_friend_notezSocialService.set_friend_noteë   s3   € Ø�~Š~˜h¨	Ñ2Ô2ð 	Ø�5Ø,0ˆŒ
�H˜iÐ(Ñ)Øˆtr'   rb   r"   r   Ú	is_onlinerc   Ú	zone_namec                ó>   — t          ||||||¦  «        | j        |<   d S rX   )r	   r¥   )r]   r!   rb   r"   rÀ   rc   rÁ   s          r%   Úupdate_presencezSocialService.update_presenceñ   s(   € Ý#4°YÀÀeÈYÐX_ÐajÑ#kÔ#kˆŒ�iÑ Ð Ð r'   úList[FriendPresenceDTO]c                ó  — g }| j                              |t          ¦   «         ¦  «        D ]Ü}|                      ||¦  «        rŒ| j                             |¦  «        }|rd| j                             ||fd¦  «        }|                     t          |j        |j	        |j
        |j        |j        |j        |¦  «        ¦  «         Œ™|                     t          |ddddd| j                             ||fd¦  «        ¦  «        ¦  «         ŒÝ|S )NÚ ÚUnknownr   FÚunknown)r¡   ru   rl   r¨   r¥   r¤   r—   r	   r!   rb   r"   rÀ   rc   rÁ   )r]   r!   ÚresÚfidÚdtor½   s         r%   Úget_friend_presencez!SocialService.get_friend_presenceô   s<  € ØˆØ”<×#Ò# I­s©u¬uÑ5Ô5ð 	Dð 	DˆCØ�Š˜y¨#Ñ.Ô.ð ØØ”-×#Ò# CÑ(Ô(ˆCØð DØ”z—~’~ y°#Ð&6¸Ñ;Ô;�Ø—
’
Õ,¨S¬]¸C¼HÀcÄiÐQTÔQ^Ð`cÔ`kÐmpÔmzð  }Añ  Bô  Bñ  Cô  Cð  Cð  Cà—
’
Õ,¨S°)¸QÀÀyÐR[Ð]aÔ]g×]kÒ]kÐmvÐx{Ðl|ð  Añ  ^Bô  ^Bñ  Cô  Cñ  Dô  Dð  Dð  DØˆ
r'   Nr�   )rp   r@   rq   r@   r   rr   )r!   r@   rq   r@   r   rV   )rq   r@   rp   r@   r   rr   )r!   r@   r·   r@   r   rr   )r!   r@   rq   r@   r   rr   )r¼   r@   r·   r@   r½   r@   r   rr   )r!   r@   rb   r@   r"   r   rÀ   rr   rc   r@   rÁ   r@   r   rV   )r!   r@   r   rÄ   )rO   rP   rQ   rR   r^   r¨   r­   r¯   r±   r´   r¶   r¹   r»   r¿   rÃ   rÌ   r)   r'   r%   rŸ   rŸ   ³   s  € € € € € ØOÐOð9ð 9ð 9ð 9ð|ð |ð |ð |ð>ð >ð >ð >ð
Að Að Að Aðð ð ð ðð ð ð ðð ð ð ðð ð ð ðmð mð mð mðð ð ð ðlð lð lð lðð ð ð ð ð r'   rŸ   c                  ó*   — e Zd ZdZdd„Zdd	„Zdd„ZdS )ÚGuildRosterServicez2Canonical lightweight guild member roster service.r   rV   c                ó   — i | _         d S rX   )Úguildsr\   s    r%   r^   zGuildRosterService.__init__  s   € Ø?AˆŒˆˆr'   Úguild_idr@   Úmemberr   c                ób   — | j                              |g ¦  «                             |¦  «         d S rX   )rÐ   rª   r—   )r]   rÑ   rÒ   s      r%   Úregister_memberz"GuildRosterService.register_member  s.   € ØŒ×Ò˜x¨Ñ,Ô,×3Ò3°FÑ;Ô;Ð;Ð;Ð;r'   úList[GuildMemberPresenceDTO]c                óR   — t          | j                             |g ¦  «        ¦  «        S rX   )r�   rÐ   ru   )r]   rÑ   s     r%   Úget_guild_roster_with_presencez1GuildRosterService.get_guild_roster_with_presence  s    € Ý�D”K—O’O H¨bÑ1Ô1Ñ2Ô2Ð2r'   Nr�   )rÑ   r@   rÒ   r   r   rV   )rÑ   r@   r   rÕ   )rO   rP   rQ   rR   r^   rÔ   r×   r)   r'   r%   rÎ   rÎ     sZ   € € € € € Ø<Ð<ðBð Bð Bð Bð<ð <ð <ð <ð3ð 3ð 3ð 3ð 3ð 3r'   rÎ   )!rR   Ú
__future__r   ÚbuiltinsÚ@py_builtinsÚ_pytest.assertion.rewriteÚ	assertionÚrewriteÚ
@pytest_arr-   rk   Útypingr   r   r   r   r   Ú*tests.e2e_social_party.test_harness_modelsr	   r
   r   r   r   r   r   r   Ú*tests.e2e_social_party.test_harness_portalr   r   r   rU   rŸ   rÎ   r)   r'   r%   ú<module>râ      sÂ  ððð ð #Ð "Ð "Ð "Ð "Ð "Ø  € € € € € € € € € € € € €€€€Ø €€€Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3ð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ðð ð ð ð ð ð ð ð.
ð .
ð .
ð .
ð .
ñ .
ô .
ð .
ðbbð bð bð bð bñ bô bð bðJLð Lð Lð Lð Lñ Lô Lð Lð^
3ð 
3ð 
3ð 
3ð 
3ñ 
3ô 
3ð 
3ð 
3ð 
3r'   