+
    jHàj—9  ã                  óÞ  a € 0 t $ R t^ RIHt ^ RIt^ RIt^ RIt^ RIt]P                  ! ]	4      t
R)t^t^-t^t^-t^
t^t]P$                  ! RRRR/4      t^tRtRRRR/t^-t^
t]P$                  ! RRRR	/4      t]P4                  ! 4       t/ tR
]R&   / tR]R&   / tR]R&   / t R]R&   Rs!Rs"R R lt#R R lt$R R lt%R R lt&R R lt'R t(R R lt)R R  lt*R! t+R" t,R# t-R$ R% lt.R& t/R' R( lt0R# )*aç  The desktop window bridges for a local viewer's turn on the session authority.

Main's TUI sidecar wired two things per session (``tui_gateway/session_notifications.py::
_wire_desktop_sinks`` and ``tui_gateway/agent_callbacks.py::_agent_cbs``):

* the ``tools.desktop_ui`` emitter, so ``desktop_preview`` open/close, ``focus_pane``,
  ``close_terminal`` and the other window events reach the renderer as ``event`` frames;
* the GUI callbacks (``read_preview_callback``, ``drive_preview_callback``,
  ``read_terminal_callback``, ``read_window_below_callback``, ``theme_callback``, ``tour_callback``,
  ``setup_beat_callback``), answered by the renderer through ``preview.read`` / ``preview.act`` /
  ``terminal.read`` / ``window.read`` / ``theme.apply`` / ``theme.pick`` / ``tour`` /
  ``setup_beat`` server requests;
* the process-registry sinks (``on_output`` / ``on_close``) that stream a background process into
  its read-only terminal tab (``agent.terminal.output``) and let ``close_terminal`` drop the tab
  (``terminal.close``).

On the session authority none was installed, so every ``desktop_ui`` tool the session policy
still offers a GUI session failed with "only available in the Hermes desktop app". Here the
emitter and the process sinks are installed once per process; the emitter routes each event to the
turn that raised it (by the turn's bound ``HERMES_SESSION_ID``) through the generation-fenced
execution stream, and the process sinks route by the process's ``session_key`` to the owning
session's event stream (a background process outlives the turn that started it). The callbacks
are installed per turn on the cached agent and restored with the other turn sinks.

Card for ``manage_connections``: ``connection_callback`` publishes ``connection.request`` on the turn, and each later change of an operation is published as ``connection.update`` on the session that owns it (looked up by its session key, the route); the card answers through ``connection.respond`` (``gateway/session_connections.py``).
)ÚannotationsNÚsuccessFÚerroram  No Hermes Desktop window answered the preview action request. The drive_preview / annotate_preview bridge is served by the desktop app's renderer, which updates separately from this backend, so an app build older than the tool has nothing listening. Update the Hermes Desktop app, open a page with open_preview, and try again in this session after a short cooldown.i,  z4No Hermes Desktop window answered the theme request.a+  No Hermes Desktop window answered the tour request. The tour is driven by the desktop app's renderer, which updates separately from this backend, so an app build older than the tour tool has nothing listening. Update the Hermes Desktop app and start a new session. Do not retry tour in this session.zdict[str, object]Ú_turnszdict[str, dict]Ú_preview_bridgezdict[str, str]Ú_tour_bridgezdict[str, tuple]Ú_process_routesc               ó   € V ^8„  d   QhRR/# ©é   ÚreturnÚNone© )Úformats   "Ú=/home/ubuntu/.hermes/hermes-agent/gateway/local_desktop_ui.pyÚ__annotate__r   R   s   € ÷ 	(ñ 	( $ñ 	(ó    c                ó  € ^ RI Hp \        T ;'       g    R4      V! RR4      .p\        ;_uu_ 4        \	        R V 4       R4      pRRR4       Xf   \        R4      hT! T\        T;'       g    / 4      4       R#   + '       g   i     L=; i)zN``desktop_ui`` sink: publish *event* on the stream of the turn that raised it.)Úget_session_envÚ ÚHERMES_SESSION_IDc              3  óh   "  € T F(  q'       g   K  V\         9   g   K  \         V,          x € K*  	  R # 5i©N)r   )Ú.0Úkeys   & r   Ú	<genexpr>Ú_emit.<locals>.<genexpr>W   s"   é € ÐM©t¨³sœ¸sÄf¹}œœ˜sŸš«tùs   ‚	2�2�2Nz1no Hermes desktop window is attached to this turn)Úgateway.session_contextr   ÚstrÚ_lockÚnextÚRuntimeErrorÚdict)ÚsidÚeventÚpayloadr   ÚkeysÚpublishs   &&&   r   Ú_emitr(   R   sk   € å7Ü�—	�	�r‹N™OÐ,?ÀÓDÐE€Dß	ŽÜÑM©tÓMÈtÓTˆ÷ 
à‚äÐNÓOÐOÙˆE”4˜Ÿ˜ 2Ó&Ö'÷ 
�ús   ³A<Á<B	c               ó   € V ^8„  d   QhRR/# r
   r   )r   s   "r   r   r   ^   s   € ÷ ñ ˜$ñ r   c                 ó\   € \         '       d   R # ^ RIHp  V P                  \        4       Rs R # )N©Ú
desktop_uiT)Ú_emitter_installedÚtoolsr,   Úset_emitterr(   r+   s    r   Ú_install_emitterr0   ^   s"   € çÓÙÝ Ø×Ñœ5Ô!ØÒr   c               ó   € V ^8„  d   QhRR/# r
   r   )r   s   "r   r   r   g   s   € ÷ Jñ J°dñ Jr   c                ó˜  € V e!   \        \        V RR4      ;'       g    R4      MRp\        ;_uu_ 4        V'       d   \        P	                  V4      MRpRRR4       Xf   \        R4      hVw  rVVP                  P	                  V4      pVf   \        R4      hVP                  P                  WbVR7       R#   + '       g   i     Ll; i)zKPublish a process event on the stream of the session that owns the process.NÚsession_keyr   z*no Hermes desktop window owns this processz4the session that owns this process is no longer live©Ú
event_type)	r   Úgetattrr   r   Úgetr!   ÚsessionsÚevent_streamr'   )Úsessionr5   r%   r   ÚrouteÚ	authorityÚ
session_idÚlives   &&&     r   Ú_publish_processr?   g   s¤   € à<CÒ<OŒ#Œg�g˜}¨bÓ1×7Ð7°RÔ
8ÐUW€Cß	Žß,/”×#Ñ# CÔ(°Tˆ÷ 
à‚}ÜÐGÓHÐHØ!Ñ€IØ×Ñ×!Ñ! *Ó-€DØ‚|ÜÐQÓRÐRØ×Ñ×Ñ˜j¸jÐÖI÷ 
�ús   µ B9Â9C		c               ó   € V ^8„  d   QhRR/# r
   r   )r   s   "r   r   r   u   s   € ÷ $ñ $ ñ $r   c                 óŽ   € \         '       d   R# ^ RIHp  \        V RR4      f	   R V n        \        V RR4      f	   R V n        Rs R# )zZmain's ``_wire_desktop_sinks``: live output and tab close for background processes (once).N©Úprocess_registryÚ	on_outputc                ó8   € \        V R RV P                  RV/4      # )zagent.terminal.outputÚ
process_idÚchunk)r?   Úid)r:   rG   s   &&r   Ú<lambda>Ú(_install_process_sinks.<locals>.<lambda>|   s!   € Ô<LØÐ,¨|¸W¿Z¹ZÈÐRWÐ.Xô=Zr   Úon_closec                ó    € \        V R RV/4      # )zterminal.closerF   )r?   )r:   Úpids   &&r   rI   rJ      s   € Ô9IØÐ%¨°cÐ':ô:<r   T)Ú_process_sinks_installedÚtools.process_registryrC   r6   rD   rK   rB   s    r   Ú_install_process_sinksrP   u   sM   € ÷  ÓÙÝ7ÜÐ ¨dÓ3Ò;ñ&ZÐÔ"äÐ ¨TÓ2Ò:ñ%<ÐÔ!à#Òr   c               ó   € V ^8„  d   QhRR/# r
   r   )r   s   "r   r   r   „   s   € ÷ <ñ < $ñ <r   c                 ó�   a€ ^ RI Hp  V P                  o\        SRR4      '       d   R# V3R lpRVn        \        V4      V n        R# )aG  ``connection.update`` for an operation opened by one of our turns, on the session that owns it (same session key and profile, as the sidecar matches its own); any other operation goes to the hook this one wraps (the sidecar's, for its own sessions). Re-wraps whenever another hook replaced it, so install order does not matter.)ÚConnectionOperationÚ_local_desktop_uiFNc                óD  <€ ^ RI Hp \        ;_uu_ 4        \        P	                  V P
                  4      pRRR4       Xe*   V^ ,          P                  P	                  V^,          4      MRpVe)   V! V^ ,          P                  4      V P                  8w  d   Se
   S! WV4       R# ^ RI	H
p / VCRVP	                  R4      RJ/CT;'       g    / CRRRR	V^,          //CpVP                  P                  V^,          V! V4      R
R7       R#   + '       g   i     Lá; i)é    )Úhermes_home_keyN)Úconnector_ui_payloadÚsettledÚ
settled_atÚownerÚtyper:   r=   zconnection.updater4   )Úhermes_constantsrW   r   r   r7   r3   r8   Ú
profile_idÚprofile_keyÚtui_gateway.connector_payloadrX   r9   r'   )	Ú	operationÚchangeÚsnapshotrW   r;   r>   rX   r%   Úpreviouss	   &&&     €r   Ú	on_changeÚ+_install_connection_hook.<locals>.on_change‹   s  ø€ Ý4ßŽUÜ#×'Ñ'¨	×(=Ñ(=Ó>ˆE÷ à27Ò2Cˆu�Q�x× Ñ ×$Ñ$ U¨1¥XÔ.ÈˆØŠ<™?¨5°­8×+>Ñ+>Ó?À9×CXÑCXÔXØÒ#Ù˜¨HÔ5ÙÝFðI�Xð I˜y¨(¯,©,°|Ó*DÈDÐ*Pñ IÐU[×UaÐUaÐ_að IØ˜V Y°¸eÀA½hÐGñIˆà×Ñ×!Ñ! %¨¥(Ñ,@ÀÓ,IÐViÐ!Öj÷ �Uús   – DÄD	T)Útools.connectors.operationrS   re   r6   rT   Ústaticmethod)rS   re   rd   s     @r   Ú_install_connection_hookri   „   sB   ø€ å>Ø"×,Ñ,€HÜˆxÐ,¨e×4Ò4Ùõkð #'€IÔÜ$0°Ó$;ÐÖ!r   c           	     ó¸   a€ ^ RI Hp V P                  w  rgpVP                  P	                  V4      p	V	f   R# V! V	P
                  Wr\        V4      VV3R lR7      # )zXOne structured server request; the viewer's ``result`` dict, or None when none answered.)Úask_viewer_resultNc                 ó0   <€ \        \        S R R4      4      # ©Ú_interrupt_requestedF©Úboolr6   ©Úagents   €r   rI   Ú_ask_result.<locals>.<lambda>¥   s   ø€ ¬t´G¸EÐCYÐ[`Ó4aÔ/br   ©ÚtimeoutÚ	cancelled)Úgateway.session_server_requestsrk   Ú_approval_ownerr8   r7   r9   r"   )
Úturnrr   ÚmethodÚparamsru   rk   r<   r=   Ú_generationr>   s
   &f&&&     r   Ú_ask_resultr}   �   sY   ø€ åAØ)-×)=Ñ)=Ñ&€I˜;Ø×Ñ×!Ñ! *Ó-€DØ‚|ÙÙ˜T×.Ñ.°
ÄDÈÃLÐZaÜ'bôdð dr   c               ó   € V ^8„  d   QhRR/# )r   r   r"   r   )r   s   "r   r   r   ¨   s   € ÷ ñ  Dñ r   c                ó�  € RV9  dA   \        WRV\        4      pV'       g   \        \        4      #  \        P
                  ! V4      # \        P                  ! 4       p\        WRV\        4      pVf.   \        P                  ! 4       V,
          \        8¼  d   RR/# RR/# \        VP                  R	4      \        4      '       d   RRR	VR	,          /# \        VP                  R
4      \        4      '       d7   VR
,          P                  4       '       d   R
VR
,          P                  4       /# RR/#   \         d
    RRRT/u # i ; i)zZmain's ``theme_request``: ``theme.apply`` for values, or a ``theme.pick`` card that waits.Úpickerztheme.applyr   TÚtextz
theme.pickÚ	timed_outrv   ÚpickedÚsaid)Ú_askÚ_THEME_TIMEOUT_Sr"   Ú_THEME_UNANSWEREDÚjsonÚloadsÚ
ValueErrorÚtimeÚ	monotonicr}   Ú_THEME_PICK_TIMEOUT_SÚ
isinstancer7   r   Ústrip)ry   rr   r%   ÚanswerÚstartedÚresults   &&&   r   Ú_themer“   ¨   s"  € à�wÔÜ�d =°'Ô;KÓLˆßÜÔ)Ó*Ð*ð	5Ü—:’:˜fÓ%Ð%ô �nŠnÓ€GÜ˜ l°GÔ=RÓS€FØ‚~Ü&*§n¢nÓ&6¸Õ&@ÔDYÔ&Y�˜TÐ"ÐrÐ`kÐmqÐ_rÐrÜ�&—*‘*˜XÓ&¬×-Ò-Ø˜4 ¨6°(Õ+;Ð<Ð<Ü�&—*‘*˜VÓ$¤c×*Ò*¨v°f­~×/CÑ/C×/EÒ/EØ˜˜v�×,Ñ,Ó.Ð/Ð/Ø˜ÐÐøô ô 	5Ø˜t V¨VÐ4Ò4ð	5ús   ²D1 Ä1EÅEc               ó   € V ^8„  d   QhRR/# ©r   r   r   r   )r   s   "r   r   r   ½   s   € ÷ .ñ . 3ñ .r   c                óÚ  € V P                   ^,          p\        ;_uu_ 4        \        P                  V4      pRRR4       XR8X  d   \        # \        YRY$R8X  d   \        M\        4      p\        ;_uu_ 4        V'       d   R\        V&   M#VR8w  d   \        VRR4      '       g
   R\        V&   RRR4       T;'       g    \        #   + '       g   i     L—; i  + '       g   i     L3; i)zVmain's ``_tour_request``: probe once per session, then the full deadline or fail fast.NÚ
unansweredÚtourÚansweredrn   F)	rx   r   r   r7   Ú_TOUR_BRIDGE_UNAVAILABLEr…   Ú_TOUR_TIMEOUT_SÚ_TOUR_PROBE_TIMEOUT_Sr6   )ry   rr   r%   r=   Ústater�   s   &&&   r   Ú_tourrž   ½   s¬   € à×%Ñ% aÕ(€Jß	ŽÜ× Ñ  Ó,ˆ÷ 
à�ÔÜ'Ð'Ü�$˜v wÈJÔCVµÔ\qÓr€Fß	ŽßØ'1ŒL˜Ò$Ø�jÔ ¬°Ð8NÐPU×)VÒ)VØ'3ŒL˜Ñ$÷	 
ð
 ×-Ð-Ô-Ð-÷ 
�ú÷
 
�ús   ¢CÁ96CÃC	ÃC*	c                ó(   € ^ RI Hp \        WRW#4      # )rV   )ÚCARD_TIMEOUT_SÚ
setup_beat)Úagent.onboarding_flowr    r}   )ry   rr   r%   r    s   &&& r   Ú_setup_beatr£   Í   s   € Ý4Ü�t L°'ÓJÐJr   c           	     ó  a€ ^ RI Hp V P                  w  rgpVP                  P	                  V4      p	V	f   R# V! V	P
                  Wr\        V4      VV3R lR7      p
\        V
\        4      '       d   V
# \        P                  ! V
RR7      # )z\One ``ValueResult`` server request to the session's attached viewers; "" when none answered.)Ú
ask_viewerr   c                 ó0   <€ \        \        S R R4      4      # rm   ro   rq   s   €r   rI   Ú_ask.<locals>.<lambda>Ú   s   ø€ ¬¬g°eÐ=SÐUZÓ.[Ô)\r   rt   F)Úensure_ascii)rw   r¥   rx   r8   r7   r9   r"   rŽ   r   rˆ   Údumps)ry   rr   rz   r{   ru   r¥   r<   r=   r|   r>   Úvalues   &f&&&      r   r…   r…   Ò   sw   ø€ å:Ø)-×)=Ñ)=Ñ&€I˜;Ø×Ñ×!Ñ! *Ó-€DØ‚|ÙÙ�t×(Ñ(¨*¼dÀ6»lÐT[Ü!\ô^€Eä˜u¤c×*Ò*ˆ5ÐU´·
²
¸5ÈuÔ0UÐUr   c                ó    a aaa€ RVVVV 3R ll# )Nc                ón   <€ \        SSSR V 3RV33 UUu/ uF  w  r#Vf   K  W#bK  	  uppS4      # u uppi )ÚstartÚcount)r…   )r­   r®   ÚkÚvrr   rz   ru   ry   s   &&  €€€€r   rI   Ú_read_block.<locals>.<lambda>ß   sC   ø€ ¬$Øˆe�V°¸%Ð0@À7ÈEÐBRÑ/SÔeÑ/S¡t qÐWXœd˜ašdÑ/SÒeÐgnô+pùÛes   •1¢1)NNr   )ry   rr   rz   ru   s   ffffr   Ú_read_blockr²   Þ   s   û€ ÷pñ pð pr   c               ó   € V ^8„  d   QhRR/# r•   r   )r   s   "r   r   r   ã   s   € ÷ 8ñ 8¨Sñ 8r   c                óì  € V P                   ^,          p\        P                  ! 4       p\        ;_uu_ 4        \        P                  V/ 4      pVP                  R4      pVR8X  d'   WEP                  R^ 4      8  d   \        uuRRR4       # VR8X  d   V\        ,           VR&   RRR4       \        YRTXR8X  d   \        M\        4      p\        ;_uu_ 4        V'       d   RXR&   MQXP                  R4      R8w  d<   \        VRR4      '       g)   RVR&   \        P                  ! 4       \        ,           VR&   RRR4       T;'       g    \        #   + '       g   i     Lµ; i  + '       g   i     L3; i)	z¿main's ``_preview_action_request`` ladder: a short probe until the renderer has answered once,
then the full deadline; an unanswered probe fails fast for a cooldown instead of stacking waits.r�   r—   Úretry_atNzpreview.actr™   rn   F)rx   r‹   rŒ   r   r   Ú
setdefaultr7   Ú"_PREVIEW_ACTION_BRIDGE_UNAVAILABLEÚ"_PREVIEW_ACTION_REPROBE_COOLDOWN_Sr…   Ú_PREVIEW_ACTION_TIMEOUT_SÚ_PREVIEW_ACTION_PROBE_TIMEOUT_Sr6   )ry   rr   r%   r=   ÚnowÚbridger�   r�   s   &&&     r   Ú_preview_actionr½   ã   s  € ð ×%Ñ% aÕ(€JÜ
�.Š.Ó
€Cß	ŽÜ ×+Ñ+¨J¸Ó;ˆØ—
‘
˜7Ó#ˆØ�LÔ  S¯:©:°jÀ!Ó+DÔ%DÜ5÷	 
Šð
 �LÔ Ø!$Ô'IÕ!IˆF�:Ñ÷ 
ô �$˜}¨gØ/4¸
Ô/BÕ+ÔHgói€Fç	ŽßØ(ˆF�7ŠOØ�Z‰Z˜Ó  JÔ.´w¸uÐF\Ð^c×7dÒ7dØ*ˆF�7‰OÜ!%§¢Ó!1Ô4VÕ!VˆF�:Ñ÷ 
ð ×7Ð7Ô7Ð7÷ 
�ú÷ 
�ús   ·A
EÂEÃA E#ÅE 	Å#E3	c                ó&  a aa€ \        S RR4      pVf   R#  \        4        \        4        \        4        \        \        S P                  RR4      ;'       g
    V^,          4      pS P                  o\        \        S P                  RR4      ;'       g    R4      p\        ;_uu_ 4        S\        V&   V'       d   V^ ,          V^,          3\        V&   RRR4       \        S SR	\        4      Sn        \        S SR
\         4      Sn        VV 3R lSn        VV 3R lSn        VV 3R lSn        VV 3R lSn        VV 3R lSn        V3R lSn        VS3#   \         d    \
        P                  RRR7        ELFi ; i  + '       g   i     L²; i)zZInstall the window bridges for one local-viewer turn; returns the registry key to release.rx   NzDesktop UI sink install failedT)Úexc_infor=   r   r3   zterminal.readzpreview.readc                óD   <€ \        SS\        T ;'       g    / 4      4      # r   )r½   r"   ©r%   rr   ry   s   &€€r   rI   Úwire.<locals>.<lambda>  s   ø€ ´?À4ÈÔPTÐU\×UbÐUbÐ`bÓPcÔ3dr   c                 ó*   <€ \        SS R / \        4      # )zwindow.read)r…   Ú_WINDOW_READ_TIMEOUT_S)rr   ry   s   €€r   rI   rÂ     s   ø€ ¬t°D¸%ÀÐPRÔTjÔ/kr   c                óD   <€ \        SS\        T ;'       g    / 4      4      # r   )r“   r"   rÁ   s   &€€r   rI   rÂ     s   ø€ ¬6°$¸¼tÀGÇMÀMÈrÓ?RÔ+Sr   c                óD   <€ \        SS\        T ;'       g    / 4      4      # r   )rž   r"   rÁ   s   &€€r   rI   rÂ     s   ø€ ¬%°°e¼TÀ'Ç-À-ÈRÓ=PÔ*Qr   c                óD   <€ \        SS\        T ;'       g    / 4      4      # r   )r£   r"   rÁ   s   &€€r   rI   rÂ     s   ø€ ´¸DÀ%ÌÈgÏmÈmÐY[ÓI\Ô0]r   c                ó<   <€ S! R \        V 4      4      ;'       d    R# )zconnection.requestN)r"   )r%   r'   s   &€r   rI   rÂ     s   ø€ ±Ð8LÌdÐSZËmÓ0\×0eÐ0eÐaeÐ0er   )r6   r0   rP   ri   Ú	ExceptionÚloggerÚwarningr   Ú_ctxÚ_publish_executionr   r   r   r²   Ú_TERMINAL_READ_TIMEOUT_SÚread_terminal_callbackÚ_PREVIEW_READ_TIMEOUT_SÚread_preview_callbackÚdrive_preview_callbackÚread_window_below_callbackÚtheme_callbackÚtour_callbackÚsetup_beat_callbackÚconnection_callback)ry   rr   r[   r   Úprocess_keyr'   s   ff   @r   ÚwirerÙ   ú   s>  ú€ ä�DÐ+¨TÓ2€EØ‚}ÙðHÜÔÜÔ Ü Ô"ô Œg�d—i‘i ¨rÓ2×>Ð>°e¸AµhÓ
?€CØ×%Ñ%€GÜ”g˜dŸi™i¨¸Ó;×AÐA¸rÓB€Kß	ŽØŒˆs‰ßØ,1°!­H°e¸AµhÐ+?ŒO˜KÑ(÷ 
ô $/¨t°U¸OÔMeÓ#f€EÔ Ü"-¨d°E¸>ÔKbÓ"c€EÔÝ#d€EÔ Ý'k€EÔ$ÝS€EÔÝQ€EÔÝ ]€EÔä e€EÔØ�ˆ<Ðøô% ô HÜ�‰Ð7À$ˆ×GðHú÷
 
�ús   ˜E Â++F Å"E=Å<E=Æ F	c               ó   € V ^8„  d   QhRR/# r
   r   )r   s   "r   r   r     s   € ÷ "ñ "�dñ "r   c                óÖ   € V '       g   R# V w  r\         ;_uu_ 4        \        P                  V4      VJ d   \        P                  VR4       RRR4       R#   + '       g   i     R# ; i)z\Drop this turn's routing entry, unless a newer turn of the same session already replaced it.N)r   r   r7   Úpop)Útokenr   r'   s   &  r   ÚreleaserÞ     s>   € çÙØ�L€Cß	ŽÜ�:‰:�c‹?˜gÓ%Ü�J‰J�s˜DÔ!÷ 
��Šús   �0AÁA(	)rÏ   rÑ   rÒ   rÓ   rÔ   rÕ   rÖ   r×   )1Ú__conditional_annotations__Ú__doc__Ú
__future__r   rˆ   ÚloggingÚ	threadingr‹   Ú	getLoggerÚ__name__rÊ   ÚCALLBACK_ATTRSrÎ   rÐ   rÄ   r¹   rº   r¸   r©   r·   r†   r�   r‡   r›   rœ   rš   ÚLockr   r   Ú__annotations__r   r   r   r-   rN   r(   r0   r?   rP   ri   r}   r“   rž   r£   r…   r²   r½   rÙ   rÞ   )rß   s   @r   Ú<module>ré      sU  øðôõ4 #ã Û Û Û à	×	Ò	˜8Ó	$€ð)€ð
 Ð ØÐ ØÐ ØÐ Ø"$Ð Ø%'Ð "Ø%)§Z¢ZØˆuØð >ð1@ó &AÐ "ð Ð ØÐ Ø  wÐ0fÐgÐ Ø€ØÐ ØŸ:š:ØˆuØð !ð'#ó $Ð ð 	�ŠÓ€à€ÐÓ à#%€�Ó %à!€ˆnÓ !à$&€Ð!Ó &ØÐ Ø Ð õ	(õõJõ$õ<ò2dõõ*.ò Kò
	Vòpõ
8ò.÷<"r   