Ë
    áß²jô=  ã                  ó°  — U d Z ddlmZ ddlZddlZddlZddlZddlZddlm	Z	 ddl
mZmZmZmZ ddl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  ej:                  e«      ZdZ d	Z!d
Z"ee#e#e#e#f   Z$dZ%d-d„Z& ee%e&¬«      Z'de(d<   e'jR                  Z*dZ+ejX                  dfejZ                  dfej\                  dfej^                  dfej`                  dffZ1d.d„Z2d/d„Z3d0d„Z4d1d„Z5d2d3d„Z6d4d„Z7d5d„Z8dddœd6d„Z9de!ddd d!dd"œ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d7d#„Z:d8d$„Z;dde!dd d!dd%œ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d9d&„Z< G d'„ d(e«      Z=d:d;d)„Z>e>Z?ddl@Z@d*d+iZAd,„ ZBy)<u  1Password (`op` CLI) secret source.

Users map env-var names to ``op://vault/item/field`` references in
``secrets.onepassword.env``; each is resolved with one ``op read -- <ref>``
call using whatever auth the user's ``op`` already has (``OP_SERVICE_ACCOUNT_TOKEN``
headless, ``OP_SESSION_*`` interactive) â€” Hermes never authenticates on the
user's behalf, and failures never block startup. Complete pulls are cached
in-process and under ``<hermes_home>/cache/op_cache.json`` (values only; auth
material is fingerprinted, never stored).
é    )ÚannotationsN)ÚPath)ÚDictÚListÚOptionalÚTuple)ÚCachedFetchÚSecretCacheÚfingerprint)Ú	ErrorKindÚFetchResultÚSecretSourceÚclassify_cli_errorÚcoerce_floatÚget_source_environmentÚis_valid_env_nameÚrun_clié   ÚOP_SERVICE_ACCOUNT_TOKEN)ÚPATHÚHOMEÚUSERPROFILEÚAPPDATAÚLOCALAPPDATAÚ
SystemRootÚTMPDIRÚTMPÚTEMPÚXDG_CONFIG_HOMEÚXDG_RUNTIME_DIRÚOP_CONFIG_DIRÚ
OP_ACCOUNTÚOP_CONNECT_HOSTÚOP_CONNECT_TOKENÚOP_LOAD_DESKTOP_APP_SETTINGSzop_cache.jsonc                ó$   — | \  }}}}|› d|› d|› �S )NÚ|© )Ú	cache_keyÚauth_fpÚaccountÚ_homeÚrefs_fps        úE/home/ubuntu/.hermes/hermes-agent/agent/secret_sources/onepassword.pyÚ_disk_key_strr/   7   s'   € Ø'0Ñ$€GˆW�e˜WØˆY�a˜�y  ' Ð+Ð+ó    )Úkey_serializerzSecretCache[_CacheKey]Ú_STOREzyInstall the 1Password CLI (https://developer.1password.com/docs/cli/get-started/) or set secrets.onepassword.binary_path.)z	timed out)znot found on pathznot an executablezfailed to invoke)Úunauthorizedznot signed inzsession expiredÚauthenticationÚ401Ú403)zempty value)ÚnetworkÚ
connectionzresolve hostÚdnsc                ó"   — t        | t        «      S ©N)r   Ú_OP_ERROR_RULES)Úmessages    r.   Ú_classify_op_errorr>   O   s   € Ü˜g¤Ó7Ð7r0   c                ón  — i }g }| xs i j                  «       D ]—  \  }}t        |«      s|j                  d|›d�«       Œ't        |t        «      s|j                  d|›d�«       ŒM|j                  «       j                  d«      s|j                  d|›d|›d�«       Œ…|j                  «       ||<   Œ™ ||fS )zU``(valid_refs, warnings)``: keep valid env names bound to stripped ``op://`` strings.z	Skipping z: not a valid env-var namez: reference is not a stringzop://ú: z! is not an op:// secret reference)Úitemsr   ÚappendÚ
isinstanceÚstrÚstripÚ
startswith)Ú
referencesÚvalidÚwarningsÚnameÚrefs        r.   Ú_validate_referencesrL   S   s¶   € à€EØ€HØ Ò& B×-Ñ-Ó/ò &‰	ˆˆcÜ  Ô&Ø�O‰O˜i¨ xÐ/IÐJÕKÜ˜C¤Ô%Ø�O‰O˜i¨ xÐ/JÐKÕLØ—‘“×'Ñ'¨Ô0Ø�O‰O˜i¨ x¨r°#°Ð8YÐZÕ[àŸ)™)›+ˆE�$ŠKð&ð �(ˆ?Ðr0   c           
     ó*  — t        «       }d| fdddfD ��cg c]  \  }}|› d|j                  |d«      › �‘Œ }}}|t        |«      D �cg c]  }|j                  d«      sŒ|› d||   › �‘Œ  c}z  }t	        dj                  |«      «      S c c}}w c c}w )	z§SHA-256 prefix over everything `op` would authenticate with (token, account,
    Connect host/token, ``OP_SESSION_*``), so a new identity never sees old cached values.Útoken)r+   r"   )Úconnect_hostr#   )Úconnect_tokenr$   Ú=Ú ÚOP_SESSION_Ú
)r   ÚgetÚsortedrF   Ú_fingerprintÚjoin)Ú	token_envÚ
source_envÚlabelÚvarÚpartsÚkeys         r.   Ú_auth_fingerprintr_   c   s°   € ô (Ó)€Jà	�)ÐÐ7Ø+Ð-RðPT÷ UÁÀÈ˜5˜'  :§>¡>°#°rÓ#:Ð";Ò<ð U€Eñ Uð 
´F¸:Ó4FÖh¨SÈ#Ï.É.ÐYfÕJg���Q�z #‘Ð'Ò(ÒhÑh€EÜ˜Ÿ	™	 %Ó(Ó)Ð)ùó	Uùò is   –!B
ÁBÁBc                ó\   ‡ — t        dj                  ˆ fd„t        ‰ «      D «       «      «      S )NrT   c              3  ó2   •K  — | ]  }|› d ‰|   › �–— Œ y­w)rQ   Nr(   )Ú.0rJ   rG   s     €r.   ú	<genexpr>z$_refs_fingerprint.<locals>.<genexpr>o   s"   øè ø€ Ò!^À4 T F¨!¨J°tÑ,<Ð+=Ô">Ñ!^ùs   ƒ)rW   rX   rV   )rG   s   `r.   Ú_refs_fingerprintrd   n   s#   ø€ Ü˜Ÿ	™	Ó!^Ì6ÐR\ÓK]Ô!^Ó^Ó_Ð_r0   rR   c                óœ   — | xs t        j                  d«      }|r&| r%t        j                  | t        j                  «      syt        |«      S )uœ   Resolve a usable ``op`` binary, or None. A pinned ``binary_path`` is used
    verbatim â€” pinned-but-missing returns None rather than falling back to PATH.ÚopN)ÚshutilÚwhichÚosÚaccessÚX_OKr   )Úbinary_pathÚfounds     r.   Úfind_oprn   r   s:   € ð Ò-œ6Ÿ<™<¨Ó-€EÙ‘[¬¯©°;ÄÇÁÔ)HØÜ�‹;Ðr0   c                óZ   — ddl m}  || «      j                  dd«      j                  «       S )z`Full ECMA-48 ANSI strip (so a control sequence can't hide text after a redaction marker) + trim.r   )Ú
strip_ansiúrR   )Útools.ansi_striprp   ÚreplacerE   )Útextrp   s     r.   Ú_scrubru   {   s&   € å+á�dÓ×#Ñ# F¨BÓ/×5Ñ5Ó7Ð7r0   c                óÀ   — t        «       }t        D �ci c]  }||v sŒ|||   “Œ }}|j                  d„ |j                  «       D «       «       | r| |d<   d|d<   |S c c}w )Nc              3  óN   K  — | ]  \  }}|j                  d «      sŒ||f–— Œ y­w)rS   N)rF   )rb   ÚkÚvs      r.   rc   z _op_child_env.<locals>.<genexpr>…   s#   è ø€ ÒT™$˜!˜Q¸¿¹À]Õ8S��1ŒvÑTùs   ‚%œ	%r   Ú1ÚNO_COLOR)r   Ú_OP_ENV_ALLOWLISTÚupdaterA   )Útoken_valuerZ   rx   Úenvs       r.   Ú_op_child_envr€   ‚   si   € Ü'Ó)€JÜ%6Ö
J ¸!¸zº/ˆ1ˆj˜‰mÑÐ
J€CÐ
JØ‡J�JÑT *×"2Ñ"2Ó"4ÔTÔTÙØ*5ˆÐ&Ñ'Ø€Cˆ
�OØ€Jùò Ks
   “	A�A©r+   r~   c          
     ó¼  — t        | «      dg}|r|d|gz  }|d|gz  }t        |t        |«      t        ddt        › d|›�d¬«      }|j                  d	k7  rJt        |j                  xs d
«      dd }|rt        d|›d|› �«      ‚t        d|j                  › d|›�«      ‚|j                  xs d
j                  d«      }|j                  «       st        d|›�«      ‚|S )z§Resolve one ``op://`` reference; raises ``RuntimeError`` on any failure, including
    an exit-0 empty value (applying it would clobber a good credential with ``""``).Úreadz	--accountz--rf   zop read timed out after zs for N)r   Útimeoutr[   Útimeout_messageÚstdinr   rR   éÈ   zop read failed for r@   zop read exited z for z
z$op read returned an empty value for )rD   r   r€   Ú_OP_RUN_TIMEOUTÚ
returncoderu   ÚstderrÚRuntimeErrorÚstdoutÚrstriprE   )rf   Ú	referencer+   r~   ÚcmdÚprocÚerrÚvalues           r.   Ú_run_op_readr“   Œ   sÿ   € ô ˜"“g˜vÐ&€CÙØ�˜WÐ%Ñ%ˆØˆD�)ÐÑ€Cä�3œM¨+Ó6ÄÐW[Ø%=¼oÐ=NÈfÐU^ÐTaÐ#bÐjnôp€Dð ‡�˜!ÒÜ�T—[‘[Ò& BÓ'¨¨Ð-ˆÙÜÐ!4°Y°MÀÀCÀ5ÐIÓJÐJÜ˜_¨T¯_©_Ð,=¸UÀ9À-ÐPÓQÐQð �[‰[Ò˜B×&Ñ& vÓ.€EØ�;‰;Œ=ÜÐAÀ)ÀÐOÓPÐPØ€Lr0   Té,  )r+   rY   Úbinaryrl   Ú	use_cacheÚcache_ttl_secondsÚ	home_pathc                ó¶  — t        | «      \  }}	|si |	fS t        «       j                  |d«      j                  «       }
t	        |«      |xs d|�t        |«      ndt        |«      f}|r0t        j                  |||«      }|�t        |j                  «      |	fS |xs t        |«      }|€t        d«      ‚i }d}t        |«      D ]  }	 t        |||   ||
¬«      ||<   Œ |rB|s@|r>t        j!                  |t#        t        |«      t%        j$                  «       ¬«      ||«       ||	fS # t        $ r)}|	j                  t        |«      «       |dz  }Y d}~Œ�d}~ww xY w)u1  Resolve ``references`` (name â†’ ``op://â€¦``) to ``(secrets, warnings)``.

    Raises ``RuntimeError`` only when no ``op`` binary is available; per-ref
    failures become warnings. Only a complete, error-free pull is cached, so a
    transient auth failure isn't frozen in for the whole TTL window.
    rR   Nz¥op CLI not found.  Install the 1Password CLI (https://developer.1password.com/docs/cli/get-started/) or set secrets.onepassword.binary_path to its absolute location.r   r�   é   )ÚsecretsÚ
fetched_at)rL   r   rU   rE   r_   rD   rd   r2   ÚlookupÚdictr›   rn   r‹   rV   r“   rB   Ústorer	   Útime)rG   r+   rY   r•   rl   r–   r—   r˜   rH   rI   r~   r)   Úcachedrf   r›   Úread_errorsrJ   Úexcs                     r.   Úfetch_onepassword_secretsr¤   ¤   sj  € ô +¨:Ó6�O€Eˆ8ÙØ�8ˆ|Ðä(Ó*×.Ñ.¨y¸"Ó=×CÑCÓE€KÜ-¨iÓ8¸'º-ÀRØ.7Ð.CœC 	œNÈÔM^Ð_dÓMeðg€Iñ Ü—‘˜yÐ*;¸YÓGˆØÐÜ˜Ÿ™Ó'¨Ð1Ð1à	Ò	'”7˜;Ó'€BØ	€zÜð Wó Xð 	Xð !€GØ€KÜ�u“ò ˆð	Ü(¨¨U°4©[À'ÐWbÔcˆG�DŠMðñ ™©Ü�‰�Y¤´D¸³MÌdÏiÉiËkÔ ZØ&¨	ô	3ð �HÐÐøô ò 	Ø�O‰OœC ›HÔ%Ø˜1Ñ�Kûð	ús   ÃD&Ä&	EÄ/EÅEc                ó   — | rd| ›d�S y)Nz!secrets.onepassword.binary_path (z!) is not an executable op binary.zµsecrets.onepassword.enabled is true but the op CLI was not found on PATH.  Install it (https://developer.1password.com/docs/cli/get-started/) or set secrets.onepassword.binary_path.r(   )rl   s    r.   Ú_missing_binary_errorr¦   Ò   s   € ÙØ2°;°/ÐAbÐcÐcðnr0   )r   r+   Úservice_account_token_envrl   Úoverride_existingr—   r˜   c                ó6  ‡‡‡— t        «       }| s|S t        |«      \  }	}
|j                  j                  |
«       dˆˆfd„Š|j                  j                  ˆfd„|	D «       «       |	j                  «       D ��ci c]  \  }} ‰|«      rŒ||“Œ }}}|s|S t        |«      }||_        |€t        |«      |_	        |S 	 t        ||‰|||¬«      \  }}||_        |j                  j                  |«       |j                  «       D ]e  \  }} ‰|«      r*||j                  vr|j                  j                  |«       Œ8|t        j                   |<   |j"                  j                  |«       Œg |S c c}}w # t        $ r}t        |«      |_	        |cY d}~S d}~ww xY w)a4  Resolve configured ``op://`` references and set them on ``os.environ``
    (``hermes secrets onepassword sync --apply``). Never raises. Refs already
    satisfied by the env (when ``override_existing`` is false) and the token var
    are skipped *before* fetching, so ``op`` never runs for a discarded value.c                ól   •— | ‰k(  xs- ‰ xr( t        t        j                  j                  | «      «      S )zFTrue when ``name`` must not be applied (token var or env already set).)Úboolri   ÚenvironrU   )rJ   r¨   r§   s    €€r.   Ú_guardedz+apply_onepassword_secrets.<locals>._guardedé   s5   ø€ àÐ0Ñ0ÒjÐ9JÐ5JÒ5iÌtÔTV×T^ÑT^×TbÑTbÐcgÓThÓOiÐjr0   c              3  ó4   •K  — | ]  } ‰|«      sŒ|–— Œ y ­wr;   r(   )rb   Únr­   s     €r.   rc   z,apply_onepassword_secrets.<locals>.<genexpr>í   s   øè ø€ Ò: ©h°q­kœ!Ñ:ùs   ƒ‘N©rG   r+   rY   r•   r—   r˜   )rJ   rD   Úreturnr«   )r   rL   rI   ÚextendÚskippedrA   rn   rl   r¦   Úerrorr¤   r‹   rD   r›   rB   ri   r¬   Úapplied)Úenabledr   r+   r§   rl   r¨   r—   r˜   ÚresultrH   rI   r¯   rK   Úrefs_to_fetchr•   r›   Úfetch_warningsr£   rJ   r’   r­   s      ` `              @r.   Úapply_onepassword_secretsrº   Ù   s{  ú€ ô ‹]€FÙØˆä*¨3Ó/�O€Eˆ8Ø
‡O�O×Ñ˜8Ô$ökð ‡N�N×ÑÓ: UÔ:Ô:Ø*/¯+©+«-×K¡  3¹xÈ½{�Q˜‘VÐK€MÑKÙØˆä�[Ó!€FØ€FÔØ€~Ü,¨[Ó9ˆŒØˆðÜ";Ø$¨gÐAZØÐ->È)ô#UÑˆ�ð €F„NØ
‡O�O×Ñ˜>Ô*Ø—}‘}“ò $‰ˆˆeÙ�DŒ>Ø˜6Ÿ>™>Ñ)Ø—‘×%Ñ% dÔ+ØØ Œ�
‰
�4ÑØ�‰×Ñ˜dÕ#ð$ð €Mùó7 Løô ò Ü˜3“xˆŒØ�ûðús*   Á9E-Â
E-Â=E3 Å3	FÅ<FÆFÆFc                  óŒ   — e Zd ZdZdZdZdZdZdZe	Z
dZdZej                  eej                  eej                   eiZdd	„Zdd
„Zy)ÚOnePasswordSourcez‚1Password as a registered **mapped** source (explicit per-var bindings, so
    its claims outrank bulk sources on contested vars).ÚonepasswordÚ	1PasswordÚmappedrf   r§   Tz‡Run `hermes secrets onepassword token` to paste a fresh service-account token ({token_env}), or `op signin` for an interactive session.c           	     óH   — dddœdi dœdddœdt         dœdddœd	d
dœdddœdœS )NzMaster switchF)ÚdescriptionÚdefaultz1Map of ENV_VAR -> op://vault/item/field referencez0op --account shorthand (empty = default account)rR   zOEnv var holding the service-account token (unset = desktop/interactive session)z,Pin the op binary (empty = resolve via PATH)z!Disk+memory cache TTL; 0 disablesr”   z+Resolved values overwrite .env/shell valuesT)r¶   r   r+   r§   rl   r—   r¨   )Ú_DEFAULT_TOKEN_ENV)Úselfs    r.   Úconfig_schemazOnePasswordSource.config_schema  sS   € à'6À5ÑIØ#VÐceÑfØ'YÐfhÑið:aä5Gñ*Ið ,ZÐfhÑiØ1TÐadÑ!eØ1^ÐkoÑ!pñ

ð 
	
r0   c                óZ  — t        |t        «      r|ni }t        «       }|j                  d«      }t	        t        |t        «      r|nd «      \  }}|j
                  j                  |«       |s$|s |j                  dt        j                  «       |S t        |j                  d«      xs d«      }t        |«      }||_        |€)|j                  t        |«      t        j                  «      S 	 t        |t        |j                  d«      xs d«      | j!                  |«      |t#        |j                  dd«      d«      |¬	«      \  }	}
|	|_        |j
                  j                  |
«       |S # t$        $ r7}|j                  t        |«      t'        t        |«      «      «      cY d }~S d }~ww xY w)
Nr   zksecrets.onepassword.enabled is true but the env: map is empty.  Add ENV_VAR: op://vault/item/field entries.rl   rR   r+   r—   r”   g     Àr@r°   )rC   rž   r   rU   rL   rI   r²   Úfailr   ÚNOT_CONFIGUREDrD   rn   rl   r¦   ÚBINARY_MISSINGr¤   rY   r   r‹   r>   r›   )rÄ   Úcfgr˜   r·   Úenv_maprH   rI   rl   r•   r›   r¹   r£   s               r.   ÚfetchzOnePasswordSource.fetch+  sq  € Ü ¤TÔ*‰c°ˆÜ“ˆà—'‘'˜%“.ˆÜ.¼*ÀWÌdÔ:S©wÐY]Ó^‰ˆˆxØ�‰×Ñ˜xÔ(ÙÙØ—‘ð RÜS\×SkÑSkômàˆMä˜#Ÿ'™' -Ó0Ò6°BÓ7ˆÜ˜Ó%ˆØ#ˆÔØˆ>Ø—;‘;Ô4°[ÓAÄ9×C[ÑC[Ó\Ð\ð	GÜ&?Ø ¬#¨c¯g©g°iÓ.@Ò.FÀBÓ*GÐSW×SaÑSaÐbeÓSfØ´¸c¿g¹gÐFYÐ[^Ó>_ÐafÓ1gØ#ô'%Ñ#ˆG�^ð !ˆŒØ�‰×Ñ˜~Ô.Øˆøô ò 	GØ—;‘;œs 3›xÔ);¼CÀ»HÓ)EÓFÕFûð	Gús   Ã-AE* Å*	F*Å3,F%ÆF*Æ%F*N)r±   rž   )rÊ   rž   r˜   r   r±   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rJ   r[   ÚshapeÚschemeÚtoken_env_keyrÃ   Údefault_token_envÚoverride_existing_defaultÚ
_AUTH_HINTr   ÚAUTH_FAILEDÚAUTH_EXPIREDrÉ   Ú_MISSING_BINARY_HINTÚremediation_hintsrÅ   rÌ   r(   r0   r.   r¼   r¼     sm   „ ñ;ð €DØ€EØ€EØ€FØ/€MØ*Ðð !%ÐðN€Jà"×.Ñ.°
¸I×<RÑ<RÐT^Ø"×1Ñ1Ð3GðIÐó
ôr0   r¼   c                ó.   — t         j                  | «       y)z–Drop in-process AND disk caches (after a token rotation, so the next
    startup resolves fresh instead of serving values cached under the old token).N)r2   Úclear)r˜   s    r.   Úclear_cachesrÝ   K  s   € ô ‡L�L�Õr0   Ú	DiskCache)zagent.secret_sources._cacherÞ   c                óÌ   — t         j                  | «      }|€t        dt        ›d| ›�«      ‚dd l}ddlm}  |t        | g|¢­Ž  t        |j                  |d   «      |d   «      S )Nzmodule z has no attribute r   )Ú	warn_oncerš   )	Ú_PLUGIN_COMPAT_LAZYrU   ÚAttributeErrorrÍ   Ú	importlibÚhermes_cli.plugin_compatrà   ÚgetattrÚimport_module)rJ   Útargetrã   rà   s       r.   Ú__getattr__rè   `  se   € Ü ×$Ñ$ TÓ*€FØ€~Ü˜w¤x lÐ2DÀTÀHÐMÓNÐNÛÝ2ÙŒh˜Ð&˜vÓ&Ü�9×*Ñ*¨6°!©9Ó5°v¸a±yÓAÐAr0   )r)   Ú	_CacheKeyr±   rD   )r=   rD   r±   r   )rG   úOptional[Dict[str, str]]r±   ú Tuple[Dict[str, str], List[str]])rY   rD   r±   rD   )rG   úDict[str, str]r±   rD   )rR   )rl   rD   r±   úOptional[Path])rt   rD   r±   rD   )r~   rD   r±   rì   )
rf   r   rŽ   rD   r+   rD   r~   rD   r±   rD   )rG   rì   r+   rD   rY   rD   r•   rí   rl   rD   r–   r«   r—   Úfloatr˜   rí   r±   rë   )rl   rD   r±   rD   )r¶   r«   r   rê   r+   rD   r§   rD   rl   rD   r¨   r«   r—   rî   r˜   rí   r±   r   r;   )r˜   rí   r±   ÚNone)CrÐ   Ú
__future__r   Úloggingri   rg   Ú
subprocessr    Úpathlibr   Útypingr   r   r   r   Úagent.secret_sources._cacher	   r
   r   rW   Úagent.secret_sources.baser   r   r   r   r   r   r   r   Ú	getLoggerrÍ   Úloggerrˆ   rÃ   r|   rD   ré   Ú_DISK_CACHE_BASENAMEr/   r2   Ú__annotations__ÚmemoryÚ_CACHErÙ   ÚTIMEOUTrÉ   r×   ÚEMPTY_VALUEÚNETWORKr<   r>   rL   r_   rd   rn   ru   r€   r“   r¤   r¦   rº   r¼   rÝ   Ú_reset_cache_for_testsÚhashlibrá   rè   r(   r0   r.   ú<module>r     sF  ðò	õ #ã Û 	Û Û Û Ý ß .Ó .ç ]Ñ ]÷÷ ó ð
 
ˆ×	Ñ	˜8Ó	$€à€ð 0Ð ð
Ð ð �#�s˜C Ð$Ñ%€	Ø&Ð ó,ñ
 "-Ð-AÐR_Ô!`€ÐÓ `Ø	�‰€ð.ð ð ×Ñ˜Ð'Ø×ÑÐ]Ð^Ø×Ñð =ð >à×ÑÐ,Ð-Ø×ÑÐHÐIð€ó8óó *ó`ôó8óð >@ÐTVõ ð2 35ÐGYØ!°bÈDØ"Àñ+Ø!ð+Ø,/ð+ØADð+àð+à03ð+àEIð+ð ð+ð 0>ð+ð &ó	+ó\oð 7;È2Ø%7ÈBØ"¸sÐ`dñ0Øð0Ø3ð0ØEHð0à"ð0àFIð0ð ð0ð 8=ð0ð P^ð0ð ó	0ôf<˜ô <ô~ð &Ð ó ð Ð=ðÐ ó
Br0   