+
    jHàj’I  ã                   ó  € R t ^ RIt^ RIHt ^ RIt^ RIt^ RIHt ^ RIH	t	H
t
Ht ^ RIHt ^ RIHtHtHt ^ RIHtHt R tRR	 ltR
 tRR ltRR ltR tR tRR/R ltR tRR/R lt RRRRRRRR/R lt!RRRRRRRR/R lt"R t#R t$R# )zLServer-only binding of API transcript identities to the existing TurnRunner.N)Úpartial)ÚPlatform)ÚSessionEntryÚSessionSourceÚ_is_path_unsafe)Ú
SessionRef)ÚRuntimeStoreErrorÚ_epochÚ_json)ÚAPI_BINDING_PREFIXÚAPI_DECLARED_PREFIXc                 ó0  € V P                  4       ;_uu_ 4       pVP                  R \        V,           34      P                  4       pRRR4       X'       d
   V^ ,          # V P	                  RVR7      pV'       d
   VR,          # R#   + '       g   i     LG; i)ú(SELECT value FROM state_meta WHERE key=?NÚ
api_server)ÚsourceÚsession_keyÚid)Ú	_read_ctxÚexecuteÚ_DECLARED_PREFIXÚfetchoneÚ$find_latest_gateway_session_for_peer)ÚdbÚkeyÚconnÚrowÚlegacys   &&   Ú8/home/ubuntu/.hermes/hermes-agent/gateway/session_api.pyÚdeclared_api_sessionr      sy   € Ø	�‰�Œ˜4Ø�l‰lÐEÜ,¨sÕ2Ð4ó6ß6>±h³jð 	÷ 
÷ Ø�1�vˆð ×4Ñ4¸LÐVYÐ4ÓZ€Fß!ˆ6�$�<Ð+ tÐ+÷ 
�ús   ™-BÂB	c                ó€   aa€ ^ RI Hp ^ RIHo S'       g   RMVV3R lpV! V \	        \
        V4      VR7      ^,          # )a7  The session a header-less Chat Completions turn lands on. Its id is derived from the
conversation's opening, and a deleted id stays retired for good, so a NEW conversation that
opens like a deleted one moves to the next generation of that opening, the way a deleted Bot
Chat is replaced: the first ``api-<digest(id, n)>`` that is not retired. Read from durable rows
only, so every later turn of that conversation (same opening) lands on the same session. An
exact retry stays on the generation holding its request id's terminal identity; explicit ids
never come here.©Úfirst_generation)Úidentity_keyNc                 óZ   <€ V P                  R S! RVS4      34      P                  4       RJ# )ú$SELECT 1 FROM state_meta WHERE key=?ÚapiN)r   r   )r   Úsidr"   Ú
request_ids   &&€€r   Ú<lambda>Ú&implicit_api_session.<locals>.<lambda>&   s2   ø€ ¸4¿<¹<Ø.±¸eÀSÈ*Ó1UÐ0Wó<YßYaÑYaÓYcÐkoñ<pó    )Úpinned)Ú hermes_state_mutation_retirementr!   Úhermes_state_terminalr"   r   Úapi_generation_id)r   Ú
session_idr'   r!   r+   r"   s   &&f  @r   Úimplicit_api_sessionr0      s6   ù€ õ BÝ2ß#‰Tõ *p€Fá˜B¤Ô(9¸:Ó FÈvÔVÐWXÕYÐYr*   c                ó    € V'       g   V # R\         P                  ! V  RV 2P                  4       4      P                  4       R,          ,           # )zyGeneration *generation* of an API session id ``implicit_api_session`` walks: the id itself,
then ``api-<digest(id, n)>``.zapi-Ú :Né   N)ÚhashlibÚsha256ÚencodeÚ	hexdigest)r/   Ú
generations   &&r   r.   r.   +   sD   € ÷ ØÐØ”G—N’N j \°°J°<Ð#@×#GÑ#GÓ#IÓJ×TÑTÓVÐWZÕ[Õ[Ð[r*   c                ój   € ^ RI Hp V'       d	   V! V 4      MRpVe   \        VP                  W4      # T# )a  The session a new turn on a retained chain (``previous_response_id``, a named conversation)
lands on: its stored id, or that id's next generation once the user deleted it (the history
comes from the response store). An exact retry stays on the generation holding its identity.)Úactive_authorityN)Úgateway.session_authoritiesr:   r0   r   )Úrunnerr/   r'   r:   Ú	authoritys   &&&  r   Úcontinued_api_sessionr>   3   s3   € õ =ß,6Ñ  Ô(¸D€IØIRÒI^Ô 	§¡¨jÓEÐnÐdnÐnr*   c                óÌ   € RP                  V 4      V'       d   RV 2MR,           pR\        P                  ! VP                  4       4      P	                  4       R,          ,           # )z—``room_<digest>`` of a hosted room member's identity (home install, room, member, target
profile); a later generation folds its number into the digest.r2   Ú Úroom_:Né    N)Újoinr4   r5   r6   r7   )Úidentityr8   Úseeds   && r   Úroom_session_idrF   <   sJ   € ð �9‰9�XÓ·z B z lÑ"3ÀrÕJ€DØ”W—^’^ D§K¡K£MÓ2×<Ñ<Ó>¸sÕCÕCÐCr*   c                ó*   a€ ^ RI Hp V! V V3R l4      # )a  ``(generation, session_id)`` of the hidden session a hosted room member's dispatches land on:
a deleted one stays retired, so the room's next task moves to the next generation. A room
retry is replayed by the run's Idempotency-Key, never by this id, so nothing pins it.r    c                 ó   <€ \        SV 4      # ©N)rF   )ÚnrD   s   &€r   r(   Ú'hosted_member_session.<locals>.<lambda>H   s   ø€ ¬/¸(ÀAÔ*Fr*   )r,   r!   )r   rD   r!   s   &f r   Úhosted_member_sessionrL   C   s   ø€ õ BÙ˜BÔ FÓGÐGr*   c                ó^   € \        V P                  RR4      pVe   VP                  V 4      # R# )z©Name of the profile *authority* serves; None for the launch profile (and for bare runners
without a registry), which is what ``SessionSource.profile`` means on the wire.Úsession_authoritiesN)Úgetattrr<   Úprofile_name)r=   Úregistrys   & r   Ú_served_profilerR   K   s4   € ô �y×'Ñ'Ð)>ÀÓE€HØ/7Ò/Cˆ8× Ñ  Ó+ÐMÈÐMr*   Útransport_profilec               ó|   € ^ RI Hp Vf   \        V RR4      ;'       g    RpV! WVR7      pVe   VP                  # R# )a  Pin the shared-listener identity on an API source: transport = the launch profile whose
listener received ``/p/<name>/``, runtime = ``source.profile``. Returns the transport profile to
persist; None outside multiplexing, where the launch adapter is the only one by construction.)Úrestore_identityNÚ_primary_profile_nameÚdefault)r<   rS   )Úgateway.session_identityrU   rO   rS   )r<   r   rS   rU   rD   s   &&$  r   Ú_pin_api_identityrY   R   sH   € õ :ØÒ Ü# FÐ,CÀTÓJ×WÐWÈiÐÙ ÐIZÔ[€HØ)1Ò)=ˆ8×%Ñ%ÐGÀ4ÐGr*   c                óî   € R;r  Ve   V P                  V4      MV P                  V4      p T! 4       Rr!K3    \         d   pTP                  u Rp?# Rp?ii ; i  \         d   pRTr! Rp?Kk  Rp?ii ; i)zYDrive a write-step generator (see ``run_steps_off_loop``) inline: tests and sync callers.N©ÚthrowÚsendÚStopIterationÚvalueÚ	Exception)ÚstepsÚresultÚerrorÚwriteÚdoneÚexcs   &     r   Ú	run_stepsrg   ]   sr   € àÐ€FØ
ð	Ø*/Ò*;�E—K‘K Ô&ÀÇÁÈFÓASˆEð	&Ù!›G T’Eøô ô 	Ø—:‘:Õûð	ûô ô 	&Ø  #–Eûð	&ús2   †&7 ­A ·AÁAÁAÁAÁA4Á&A/Á/A4Úorphanedc             ƒ  ó  a aaaa"  € ^ RI HpHo V VV3R loV V3R lpV! S V! 4       4      p \        P                  ! V4      G Rj  x€L
 #  L  \        P
                   d    Se   TP                  T3R l4       h i ; i5i)ao  Drive a write-step generator on the owner loop, each yielded SQLite write in a worker thread
in admission order (``tracked_write(ordered=True)``): a held writer must not freeze every session.
The whole drive is one tracked, shielded task, so a cancelled caller cannot separate a commit
from the steps after it; ``orphaned(result)`` then runs when the drive completes.)Útrack_mutationÚtracked_writec               “   ó  <"  € R ;r  Ve   SP                  V4      MSP                  V 4      p S! STRR7      G R j  x€L
 R rK?    \         d   pTP                  u R p?# R p?ii ; i L+  \         d   pR Tr R p?Ky  R p?ii ; i5i)NT)Úorderedr[   )rb   rc   rd   re   rf   r=   ra   rk   s        €€€r   ÚdriveÚ!run_steps_off_loop.<locals>.driver   s†   øé € ØÐˆØð"Ø.3Ò.?˜Ÿ™ EÔ*ÀUÇZÁZÐPVÓEW�ð*Ù&3°I¸uÈdÔ&S× SÐUYšøô !ô "Ø—z‘zÕ!ûð"úñ !TøÜô *Ø $ cžûð*üsg   ƒB‰&A °A, ¾A*¿A, ÁBÁA'ÁA"ÁA'ÁBÁ"A'Á'BÁ*A, Á,BÁ7B Á:BÂ BÂBc               “   ó  <"  € \        SR R4      p V f   \        P                  ! 4       ;p Sn        T ;_uu_4       GRj  x€L
  S! 4       G Rj  x€L
 uuRRR4      GRj  x€L
  #  L% L L	  + GRj  x€L 
 '       g   i     R# ; i5i)Ú_api_admissionsN)rO   ÚasyncioÚLockrq   )Úlockr=   rn   s    €€r   Ú
serializedÚ&run_steps_off_loop.<locals>.serialized}   sT   øé € ô �yÐ"3°TÓ:ˆØŠ<Ü/6¯|ª|«~Ð=ˆD�9Ô,ß—4’4Ù›—=÷ —4”4Ù ÷ —4—4“4üs^   ƒ<B¿A%Á BÁA+ÁA'ÁA+ÁBÁA)Á BÁ'A+Á)BÁ+B	Á1A4Á2
B	Á=B	Á?	BNc                 ó�   <€ V P                  4       ;'       g/    V P                  4       ;'       g    S! V P                  4       4      # rI   )Ú	cancelledÚ	exceptionrb   )re   rh   s   &€r   r(   Ú$run_steps_off_loop.<locals>.<lambda>Š   s6   ø€ °·±Ó0@×0oÐ0oÀDÇNÁNÓDT×0oÐ0oÑX`Ðae×alÑalÓanÓXoÐ0or*   )Úgateway.session_runtime_workersrj   rk   rr   ÚshieldÚCancelledErrorÚadd_done_callback)r=   ra   rh   rj   ru   Útaskrn   rk   s   ffd   @@r   Úrun_steps_off_loopr€   k   sl   üé € ÷
 N÷
*ö!ñ ˜)¡Z£\Ó2€DðÜ—^’^ DÓ)×)Ð)Ñ)øÜ×!Ñ!ô ØÒØ×"Ñ"Ô#oÔpØðüs.   ‡&B®A ÁAÁA ÁBÁA Á0A>Á>BÚhosted_dispatchÚdeclared_keyÚ
caller_keyÚwalked_fromc               ó2   € \        \        WVW4VR7      4      # )zLOnly the authenticated API edge may reserve an API source; never public RPC.)r�   r‚   rƒ   r„   )rg   Úbind_api_steps)r=   r/   r�   r‚   rƒ   r„   s   &&$$$$r   Úbind_api_sessionr‡   Ž   s%   € ô ”^ IÈ?Ø1=Ðbmôoó pð pr*   c             #  ó  a aaaaaaaaaaa"  € S P                  4        \        S\        4      '       d   S'       d   \        S4      '       d   \	        R4      hRw  oorgVe‚   ^ RIHp VP                  V4      p	V	P                  V	P                  V	P                  V	P                  .p\        S P                  V4      w  rzV
S8w  d   \	        R4      hRRV	P                   2uooSS P                  9   dm   S P                  S,          P                  P                   \"        P$                  8w  g(   S P                  P'                  S4      R,          S8w  d   \	        R4      h\)        \"        P$                  SRR	\+        S 4      R
7      o\-        S P.                  S4      pS P.                  P0                  P3                  S4      o^ RIHp V! 4       o\9        SSSSS\"        P$                  VR7      oRS P:                  RSRSRSP=                  4       /oS'       d   SSR&   Ve!   SP?                  SVR7       V'       d   VSR&   V VVVVVVVVVVV3R lp\A        S P                  PB                  V4      x € \E        S S4      # 5i)aÐ  ``bind_api_session`` as write steps (``run_steps``): the binding transaction is yielded.

``caller_key`` is this request's validated ``X-Hermes-Session-Key`` even when an explicit
session id selected the conversation (``declared_key`` is set only when the key selected it).
It is used only to adopt a row an earlier release stamped with that same key, and is then
registered as that session's declared key (and stamped into its binding receipt).

``walked_from`` is the stored session a Responses/Runs chain continued from when the chain moved
past it to *session_id* (``continued_api_session``): the fences it passed stay for good. If one
aged out since that lookup, the bind refuses with the retryable ``chain_moved``.Úinvalid_params)ÚHostedMemberDispatchÚadmission_conflictÚbot_roomúGroup: r   Úpermission_deniedr%   Údm)ÚplatformÚchat_idÚuser_idÚ	chat_typeÚprofile)Ú_now)Úoriginr�   rS   Ú
profile_idr/   ÚrouteÚentryr‚   )Ústorage_sourceÚroom_identityÚroom_generationc                 ó&  <€ \        V S
P                  4       S
P                  4        ^ RIHpHp V P                  RVS,           34      P                  4       '       d   \        R4      hS'       d*   V! V \        \        S4      S4      '       g   \        R4      hV P                  R\        S,           34      P                  4       pVek   \        P                  ! V^ ,          4      pVP                  RR4      S8w  d   \        R	4      hS'       d"   VP                  R
4      S8w  d   \        R4      hR# S'       dm   V P                  R\        S,           34      P                  4       pV'       d   V^ ,          S8w  d   \        R4      hV P                  R\        S,           S34       V P                  RS34      P                  4       pVe   VR,          S8w  d   \        R	4      hSR8X  dQ   Ve   VR,          S8w  d   \        R4      hV P                  RSS34      P                  4       '       d   \        R4      hS;'       g    SpVe    VR,          RRS39  d�   V'       d   VR,          V8w  d   \        R4      hV P                  R\        V,           34      P                  4       pVe   V^ ,          S8w  d   \        R4      hV P                  R\        V,           S34       VSR
&   V P                  RS34      P                  4       p	V	e5   \        P                  ! V	^ ,          4      R,          S8w  d   \        R4      hV P                  RSSS\!        SR8H  4      SP#                  4       34       V P                  RSSSP$                  R\'        SP)                  4       4      S34       V P                  RS\'        SP)                  4       4      SP#                  4       34       V P                  R\        S,           \'        S4      34       R# )é    )ÚRETIRED_PREFIXÚkeep_passed_fencesr$   Ú	not_foundÚchain_movedr   Nrš   r   rŽ   r‚   r‹   zIINSERT INTO state_meta(key,value) VALUES(?,?) ON CONFLICT(key) DO NOTHINGz8SELECT source,session_key,title FROM sessions WHERE id=?r   rŒ   Útitlez.SELECT 1 FROM sessions WHERE title=? AND id!=?r   r@   zGSELECT entry_json FROM gateway_routing WHERE scope='' AND session_key=?r/   z|INSERT INTO sessions(id,source,title,hidden,started_at) VALUES(?,?,?,?,?)
                        ON CONFLICT(id) DO NOTHINGzZUPDATE sessions SET session_key=?,chat_id=?,user_id=?,chat_type=?,origin_json=? WHERE id=?r�   z¡INSERT INTO gateway_routing(scope,session_key,entry_json,updated_at) VALUES('',?,?,?) ON CONFLICT(scope,session_key) DO UPDATE SET entry_json=excluded.entry_jsonz-INSERT INTO state_meta(key,value) VALUES(?,?))r	   ÚepochÚ_require_admission_openr,   rŸ   r    r   r   r   r   r.   Ú_BINDING_PREFIXÚjsonÚloadsÚgetr   ÚintÚ	timestampr’   r
   Úto_dict)r   rŸ   r    ÚsavedÚbindingÚexisting_declaredr   Ú
legacy_keyÚownerÚexistingr=   rƒ   r‚   r™   ÚnowÚreceiptr˜   r/   r   rš   r£   r„   s   &         €€€€€€€€€€€€r   rd   Úbind_api_steps.<locals>.writeÇ   sœ  ø€ Üˆt�Y—_‘_Ô%Ø×)Ñ)Ô+ßWØ�<‰<Ð>ÀÐR\ÕA\Ð@^Ó_×hÑh×jÒjÜ# KÓ0Ð0÷ Ñ1°$¼Ô@QÐS^Ó8_Ðak×lÒlÜ# MÓ2Ð2Ø—‘ÐGÜ-°
Õ:Ð<ó>ß>F¹h»jð 	àÒÜ—j’j  q¥Ó*ˆGØ�{‰{Ð+¨\Ó:¸nÔLÜ'Ð(;Ó<Ð<ß §¡¨NÓ ;¸|Ô KÜ'Ð(<Ó=Ð=ÙßØ $§¡Ð-WÜ! LÕ0Ð2ó!4ß4<±H³Jð ç Ð%6°qÕ%9¸ZÔ%GÜ'Ð(<Ó=Ð=Ø�L‰LÐdÜ*¨\Õ9¸:ÐFôHà�l‰lÐUÐXbÐWdÓe×nÑnÓpˆØŠ?˜s 8�}°Ô>Ü#Ð$7Ó8Ð8Ø˜ZÔ'ØŠ 3 w¥<°5Ô#8Ü'Ð(<Ó=Ð=Ø�|‰|ÐLÈuÐV`ÐNaÓb×kÑk×mÒmÜ'Ð(<Ó=Ð=ð
 "×/Ð/ Zˆ
ØŠ?˜s =Õ1¸$ÀÀEÐ9JÔJß  ]Õ!3°zÔ!AÜ'Ð(<Ó=Ð=ð —L‘LÐ!KÜ"2°ZÕ"?Ð!AóCßCKÁ8Ã:ð àÒ  U¨1¥X°Ô%;Ü'Ð(<Ó=Ð=Ø�L‰LÐdÜ*¨ZÕ7¸ÐDôFà&0ˆG�NÑ#Ø—<‘<Ð iØ!& ó*ß*2©(«*ð 	àÒ¤D§J¢J¨x¸­{Ó$;¸LÕ$IÈZÔ$WÜ#Ð$8Ó9Ð9Ø�‰ð 6Ø8BÀNÐTYÜ7:¸>ÈZÑ;WÓ7XÐZ]×ZgÑZgÓZið8kô	lð 	�‰ÐqØ˜Z¨¯©¸¼uÀVÇ^Á^ÓEUÓ?VÐXbÐcô	eà�‰ð càœU 5§=¡=£?Ó3°S·]±]³_ÐEô	Gð 	�‰ÐDÜ%¨
Õ2´E¸'³NÐCö	Er*   )r   NNrž   )#r¥   Ú
isinstanceÚstrr   r   Úgateway.hosted_room_peerrŠ   Úfrom_mappingÚhome_install_idÚroom_idÚ	member_idÚtarget_profilerL   r   Úsessionsr   r�   r   Ú
API_SERVERÚget_sessionr   rR   rY   r<   Úsession_storeÚ_generate_session_keyÚgateway.session_lifecycler•   r   r—   r¬   Úupdater   Ú_execute_writeÚrestore_api_session)r=   r/   r�   r‚   rƒ   r„   r›   rœ   rŠ   ÚdispatchÚexpectedrS   r•   rd   r™   r³   r´   r˜   r   rš   r£   s   ff$ddd        @@@@@@@r   r†   r†   •   s0  ÿûé € ð ×%Ñ%Ô'Ü�j¤#×&Ò&¯j¼OÈJ×<WÒ<WÜÐ 0Ó1Ð1Ø<WÑ9€N�E˜=ØÒ"ÝAØ'×4Ñ4°_ÓEˆØ!×1Ñ1°8×3CÑ3CÀX×EWÑEWÐYa×YpÑYpÐqˆÜ$9¸)¿,¹,ÈÓ$VÑ!ˆØ�zÔ!Ü#Ð$8Ó9Ð9Ø *¨g°h×6FÑ6FÐ5GÐ,HÐˆ˜Ø�Y×'Ñ'Ô'Ø×Ñ˜zÕ*×1Ñ1×:Ñ:¼h×>QÑ>QÔQØ—<‘<×+Ñ+¨JÓ7¸ÕAÀ^ÔSÜ#Ð$7Ó8Ð8ô ¤H×$7Ñ$7ÀØ#(°DÄ/ÐR[ÓB\ô^€Fä)¨)×*:Ñ*:¸FÓCÐØ×Ñ×*Ñ*×@Ñ@ÀÓH€EÝ.Ù
‹&€CÜ˜ 
¨C°¸VÌh×NaÑNaØ+<ô>€Eà˜Y×1Ñ1°<ÀØ˜˜w¨¯©«ð9€GçØ".ˆ�ÑØÒ Ø�‰ nÀMˆÔRßØ)8ˆGÐ%Ñ&÷@E÷ @Eð @EôB �)—,‘,×-Ñ-¨uÓ
5Ò5Ü˜y¨*Ó5Ð5ùs   Ž.J½H JÈ>AJc                 óB  € VR 8w  d   V# V P                  4       ;_uu_ 4       pVP                  R\        V,           34      P                  4       pRRR4       X'       d.   \        P
                  ! V^ ,          4      P                  RV4      # T#   + '       g   i     LG; i)r   r   Nrš   )r   r   r¦   r   r§   r¨   r©   )r   r/   Úfallbackr   r­   s   &&&  r   Úapi_storage_sourcerË     s{   € Ø�<ÔØˆØ	�‰�Œ˜4Ø—‘ÐGÜ-°
Õ:Ð<ó>ß>F¹h»jð 	÷ 
÷ DIŒ4�:Š:�e˜A•hÓ×#Ñ#Ð$4°hÓ?ÐVÈhÐV÷ 
�ús   ¢-BÂB	c                 ó¢  € ^ RI Hp V P                  P                  4       ;_uu_ 4       pVP	                  R\
        V,           34      P                  4       pRRR4       Xf   \        R4      h\        P                  ! V^ ,          4      pVR,          V P                  8w  d   \        R4      h\        P                  ! VR,          4      pVP                  p\        V P                  WvP                   R7       V P                  P#                  V4      pVR	,          V8w  gÍ   VP$                  V8w  g¼   VP&                  \(        P*                  8w  g�   VP,                  V8w  gŒ   Veˆ   VR
,          VP/                  RR4      8w  gj   VR,          VR,          VR,          3VP0                  WP2                  38w  g5   VP0                  V P                  P4                  P7                  V4      8w  d   \        R4      hVP/                  R4      R8X  da   VR,          p	\9        W•P/                  R^ 4      4      p
W¡8w  g,   VR,          RV	^,          ,           8w  g   VR,          '       g   \        R4      hV P                  P4                  pV P;                  \=        V P                  V4      4      pWÆn        VP>                  ;_uu_ 4        VPA                  4        VPB                  P/                  VP0                  4      pVe6   VP$                  V P                  PE                  V4      9  d   \        R4      hVe   VP$                  V8X  d   TMTVPB                  VP0                  &   RRR4       V PF                  PI                  W! WvP0                  4      4       \=        V P                  V4      #   + '       g   i     EL]; i  + '       g   i     Le; i)rž   )ÚLiveSessionr   Nr¡   r—   Úprofile_mismatchr™   )rS   r/   r   rš   r   r   r‘   r’   r‹   rŒ   r›   rœ   r£   r�   Úhidden)%Úgateway.session_authorityrÍ   r   r   r   r¦   r   r   r§   r¨   r—   r   Ú	from_dictr–   rY   r<   rS   rÀ   r/   r�   r   r¿   r‘   r©   r   r’   rÁ   rÂ   rF   Úphysical_targetr   Ú_lockÚ_ensure_loaded_lockedÚ_entriesÚget_compression_lineager¾   Ú
setdefault)r=   r/   rÍ   r   r­   r´   r™   r   r   rD   rÈ   ÚstoreÚtargetÚcurrents   &&            r   rÆ   rÆ     só  € Ý5Ø	�‰×	Ñ	×	!Ô	! TØ—‘ÐGÜ-°
Õ:Ð<ó>ß>F¹h»jð 	÷ 
"ð ‚}Ü Ó,Ð,Ü�jŠj˜˜q�Ó"€GØˆ|Õ 	× 4Ñ 4Ô4ÜÐ 2Ó3Ð3Ü×"Ò" 7¨7Õ#3Ó4€EØ�\‰\€FÜ�i×&Ñ&¨×BYÑBYÕZØ
�,‰,×
"Ñ
" :Ó
.€CØ�Õ Ô+¨u×/?Ñ/?À:Ô/MØ�‰¤(×"5Ñ"5Ô5¸¿¹È:Ô9UØŠ{˜c (�m¨w¯{©{Ð;KÈ\Ó/ZÔZØ�MÕ" C¨	¥N°C¸	µNÐCÈ×HYÑHYÐ[e×guÑguÐGvÔvØ× Ñ  I×$4Ñ$4×$BÑ$B×$XÑ$XÐY_Ó$`Ô`ÜÐ 4Ó5Ð5Ø‡{�{Ð#Ó$¨
Ô2Ø˜?Õ+ˆÜ" 8¯[©[Ð9JÈAÓ-NÓOˆØÔ! S¨¥\°YÀÈ!ÅÕ5LÔ%LÐTWÐX`×TaÔTaÜ#Ð$8Ó9Ð9Ø×Ñ×*Ñ*€EØ×&Ñ&¤z°)×2FÑ2FÈ
Ó'SÓT€FØÔØ	��‹Ø×#Ñ#Ô%Ø—.‘.×$Ñ$ U×%6Ñ%6Ó7ˆØÒ 7×#5Ñ#5¸Y¿\¹\×=aÑ=aÐblÓ=mÔ#mÜ#Ð$8Ó9Ð9Ø7>Ò7JÈw×OaÑOaÐekÔOk©GÐqvˆ�‰�u×(Ñ(Ñ)÷ 
ð ×Ñ×!Ñ! *¨k¸&×BSÑBSÓ.TÔUÜ�i×*Ñ*¨JÓ7Ð7÷C 
"×	!Ð	!ú÷4 
�ús   ©-N*ËBN>Î*N;	Î>O	rI   )rž   )%Ú__doc__rr   Ú	functoolsr   r4   r§   Úgateway.configr   Úgateway.sessionr   r   r   Úgateway.session_contractr   Úhermes_state_runtimer   r	   r
   Úhermes_state_localr   r¦   r   r   r   r0   r.   r>   rF   rL   rR   rY   rg   r€   r‡   r†   rË   rÆ   © r*   r   Ú<module>rã      sÐ   ðÙ RÛ Ý Û Û å #ß HÑ HÝ /ß AÑ Aç mò
,ôZò\ôoôDòHòNðH¸4ô Hò&ð ¸4ô  ðFp¸tð pÐRVð pÐcgð pØ!%ôpðt6¸Tð t6ÐPTð t6Ðaeð t6Ø#ôt6ònWô#8r*   