+
    „WÝjF  ã                  óè   € R t ^ RIHt ^ RIt^ RIt^ RIHtHtHt ^ RI	H
t
 ^ RIHt ^ RIHt ^ RIHtHtHt R tR	 R
 ltR R ltRRRRRR/R R lltRRRR/R R lltR R ltR R ltR R ltR# )u¹  Provider-specific runtime builders for :mod:`hermes_cli.runtime_provider`: Azure Foundry, the
OpenRouter / bare-custom fallback resolver, Bedrock, and external-process providers. Origin-internal
collaborators are resolved on the origin module at call time via :func:`_rp` so test patches on
``hermes_cli.runtime_provider.*`` (``_get_model_config``, ``load_config``, ``has_usable_secret``,
``_try_resolve_from_custom_pool``, â€¦) still apply.)ÚannotationsN)ÚAnyÚDictÚOptional)Úis_token_provider)Úget_secret_str)ÚOPENROUTER_BASE_URL)Úbase_url_host_matchesÚbase_url_hostnameÚbase_url_originc                 ó   € ^ RI Hp  V # )é    N)Úhermes_cli.runtime_providerÚruntime_provider)Úorigins    ÚXC:\Users\johnn\AppData\Local\hermes\hermes-agent\hermes_cli\runtime_provider_backends.pyÚ_rpr      s
   € Ý0Ø€Mó    c               ó    € V ^8„  d   QhRRRR/# )é   Ú	cfg_entraúdict[str, Any]Úreturnr   © )Úformats   "r   Ú__annotate__r      s   € ÷ +ñ +¨ð +¸3ñ +r   c                ód  € \        4       P                  p ^ RIHpHpHp \        T P                  R4      ;'       g    R4      P                  4       ;'       g    Tp T! T! TR7      R7      #   \         d   pT! RT R24      ThRp?ii ; i  \         d   pT! \        T4      4      ThRp?ii ; i)	z™Callable api_key minting a fresh Entra JWT per request (OpenAI SDK accepts it natively;
``build_anthropic_client`` injects the bearer via an httpx hook).)ÚSCOPE_AI_AZURE_DEFAULTÚEntraIdentityConfigÚbuild_token_providerznCould not load the Azure Foundry Entra ID adapter. Run hermes pm repair, then restart Hermes. (import failed: Ú)NÚscopeÚ )r!   )Úconfig)r   Ú	AuthErrorÚagent.azure_identity_adapterr   r   r   Ú	ExceptionÚstrÚgetÚstripÚImportError)r   r$   r   r   r   Úexcr!   s   &      r   Ú_azure_entra_credentialsr,      s¶   € ô “—‘€IðßrÑrô �	—‘˜gÓ&×,Ð,¨"Ó-×3Ñ3Ó5×OÐOÐ9O€Eð+Ù#Ñ+>ÀUÔ+KÔLÐLøô ô Ùðà"˜e 1ð&ó
ð ð		ûðûô ô +Ùœ˜C›Ó! sÐ*ûð+ús/   –
A- ÁB Á-B
Á8BÂB
ÂB/ÂB*Â*B/c               ó    € V ^8„  d   QhRRRR/# )r   Úexplicit_api_keyr'   r   r   )r   s   "r   r   r   .   s   € ÷ ñ °ð ¸ñ r   c                óì   € V'       d   V#  ^ RI Hp V! R4      ;'       g    RpT;'       g    \        RR4      P	                  4       pV'       g   V P                  R4      hV#   \         d    Rp LNi ; i)r   )Úget_env_valueÚAZURE_FOUNDRY_API_KEYr"   a  Azure Foundry requires an API key. Set AZURE_FOUNDRY_API_KEY in ~/.hermes/.env or run 'hermes model' to configure. To use keyless Microsoft Entra ID auth instead, set model.auth_mode: entra_id in config.yaml (or pick 'Microsoft Entra ID' in 'hermes model').)Úhermes_cli.configr0   r&   r   r)   r$   )Úrpr.   r0   Úapi_keys   &&  r   Ú_azure_foundry_api_keyr5   .   s|   € ßØÐðÝ3ÙÐ 7Ó8×>Ð>¸Bˆð ×LÐLœÐ(?ÀÓD×JÑJÓL€GßØ�l‰lð7ó
ð 	
ð €Nøô ô ØŠðús   ŒA# ¡A# Á#A3Á2A3r.   Úexplicit_base_urlÚtarget_modelc               ó0   € V ^8„  d   QhRRRRRRRRRRR	R/# )
r   Úrequested_providerr'   Ú	model_cfgr   r.   úOptional[str]r6   r7   r   r   )r   s   "r   r   r   B   s:   € ÷ ,>ñ ,>¸#ð ,>È.ð ,>Ø5Bð,>Ø^kð,>à1>ð,>àJXñ,>r   c                ó´  € \        4       p\        V4      '       d   TMRpV'       d   RM"\        T;'       g    R4      P                  4       p\        T;'       g    R4      P                  4       P	                  R4      pRRR/ 3w  r‰r«VP                  V4      R8X  dµ   VP                  VR4      pVP                  VP                  R4      4      ;'       g    Rp	\        VP                  R4      ;'       g    R4      P                  4       P                  4       ;'       g    Rp
\        VP                  R	4      \        4      '       d
   VR	,          p\        T;'       g    VP                  R
4      ;'       g    R4      P                  4       pVP                  WÉ4      p	\        RR4      P                  4       P	                  R4      pT;'       g    T;'       g    TpV'       g   VP                  R4      hV	R8X  d   \        P                   ! RRV4      pV
R8X  d†   V'       d   VRR/ 3w  ppppMY\        VP                  R4      ;'       g    R4      P                  4       pT;'       g    \#        V4      pRRV'       d   RV/M/ pppVP%                  RWžVVVVV R7      # TP%                  RYž\'        WR4      RV'       g	   V'       d	   RV R7      # RV R7      # )zóAzure Foundry: ``model.base_url`` + ``model.api_mode`` (or explicit overrides), API key from
``.env``/env or a per-request Entra ID token, trailing ``/v1`` stripped for Anthropic-style
endpoints (the Anthropic SDK appends /v1/messages itself).Nr"   Ú/Úchat_completionsr4   zazure-foundryÚapi_modeÚ	auth_modeÚentraÚdefaultÚAZURE_FOUNDRY_BASE_URLzpAzure Foundry requires a base URL. Set it via 'hermes model' or the AZURE_FOUNDRY_BASE_URL environment variable.Úanthropic_messagesz/v1/?$Úentra_idÚexplicitr!   )r@   rA   Úsourcer9   r#   )r@   rG   r9   )r   r   r'   r)   ÚrstripÚ_cfg_providerÚ_config_base_url_for_providerÚ_parse_api_moder(   ÚlowerÚ
isinstanceÚdictÚ_azure_inferred_api_moder   r$   ÚreÚsubr,   Ú_runtimer5   )r9   r:   r.   r6   r7   r3   Úforwarded_token_providerÚexplicit_base_url_cleanÚcfg_base_urlÚcfg_api_modeÚcfg_auth_moder   Úeffective_modelÚenv_base_urlÚbase_urlr4   rG   r@   rA   r!   s   $$$$$               r   Ú_resolve_azure_foundry_runtimer[   B   s¬  € ô 
‹€Bô 4EÐEU×3VÒ3VÑ/Ð\`Ðß5‘r¼3Ð?O×?UÐ?UÐSUÓ;V×;\Ñ;\Ó;^ÐÜ!Ð"3×"9Ð"9°rÓ:×@Ñ@ÓB×IÑIÈ#ÓNÐØ;=Ð?QÐS\Ð^`Ð;`Ñ8€L Ø	×Ñ˜	Ó" oÔ5Ø×7Ñ7¸	À?ÓSˆØ×)Ñ)¨)¯-©-¸
Ó*CÓD×ZÐZÐHZˆÜ˜IŸM™M¨+Ó6×CÐC¸)ÓD×JÑJÓL×RÑRÓT×aÐaÐXaˆÜ�i—m‘m GÓ,¬d×3Ò3Ø! 'Õ*ˆIä˜,×HÐH¨)¯-©-¸	Ó*B×HÐHÀbÓI×OÑOÓQ€OØ×.Ñ.¨ÓM€LÜ!Ð":¸BÓ?×EÑEÓG×NÑNÈsÓS€LØ&×FÐF¨,×FÐF¸,€HßØ�l‰lð?ó
ð 	
ð Ð+Ô+Ü—6’6˜) R¨Ó2ˆØ˜
Ô"÷ Ø0@À*ÈiÐY[Ð0[Ñ-ˆG�V˜Y©ä˜	Ÿ™ gÓ.×4Ð4°"Ó5×;Ñ;Ó=ˆEØ.×UÐUÔ2JÈ9Ó2UˆGØ'1°:×TYÀÈ%Ñ@PÐ_a˜u�IˆFØ�{‰{˜?¨LÀGÐW`ÐhmÐv|Ø.@ð ó Bð 	Bà�;‰;�¨Ô@VÐWYÓ@lØ!*×BR×Vg°:Ø*<ð ó >ð >ØnvØ*<ð ó >ð >r   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   r9   r'   r.   r;   r6   r   r   r   )r   s   "r   r   r   t   s8   € ÷ X{ñ X{ØðX{Ø2?ðX{Ø[hðX{àñX{r   c                ó
  a€ \        4       oSP                  4       p\        VP                  R4      \        4      '       d   VP                  R4      MRp\        VP                  R4      \        4      '       d   VP                  R4      MRP                  4       P                  4       p\        R VP                  R4      VP                  R4      3 4       R4      pT ;'       g    RP                  4       P                  4       pV'       d!   VR8w  d   SP                  V4      '       d   Rp\        RR4      P                  4       p\        R	R4      P                  4       p	\        VP                  4       4      ;'       db    V'       * ;'       dS    VR
8H  ;'       d    VR9   ;'       g9    VR8H  ;'       d    SP                  WE4      ;'       g    VR8H  ;'       d    VR8H  p
T;'       g    RP                  4       ;'       g=    T	;'       g3    V
'       d   VP                  4       MR;'       g    T;'       g    \        P                  R4      p\        VR4      pT;'       g�    VR8H  ;'       dt    T
;'       d7    VR8H  ;'       d*    W´P                  4       P                  R4      8H  ;'       g4    T;'       g    W¸8H  ;'       d    Y¸;'       g    RP                  R4      8H  p^ RIHpHp VR8X  d
   V! SV4      MRw  ppV'       d¿   ^ RIHp V! R4      ;'       g    Rp\        RR4      P                  4       p\)        V4      '       d5   \+        V4      p\        V^,          4      ;'       d    V\+        V4      8H  pM V'       * ;'       g    SP-                  V4      pV.pV'       g   TV! R4      V'       d   TMR.,          pM;Y'       d   TMRV
'       d	   V! W;4      MR.V'       d   . MSP/                  VRR7      Op\        V3R lV 4       R4      ;'       g    TpV'       g	   V'       d   RMRpSP1                  VP                  R4      4      pVR8w  d:   SP3                  RT;'       g    SP5                  V4      ;'       g    RVVVR7      # V'       d7   SP7                  V4      '       g    SP9                  VRVRR7      pV'       d   V# V'       g   V'       g   RpSP3                  RSP;                  W;4      VVVR7      # ) a  Terminal resolver: OpenRouter, or a bare/aliased ``custom`` endpoint. base_url precedence:
explicit > CUSTOM_BASE_URL > trusted ``model.base_url`` > OPENROUTER_BASE_URL > default.
OPENAI_BASE_URL never picks the endpoint (config.yaml is the single source of truth for endpoint
URLs); it is read only to keep an OPENAI_API_KEY bound to another host out of the OpenRouter
fallback. OpenRouter contexts prefer OPENROUTER_API_KEY; custom endpoints never receive the
OpenRouter key and only get env keys gated on their authoritative hosts.rZ   r"   Úproviderc              3  ó¢   "  € T FE  p\        V\        4      '       g   K  VP                  4       '       g   K3  VP                  4       x € KG  	  R # 5i)N)rM   r'   r)   )Ú.0Úvs   & r   Ú	<genexpr>Ú._resolve_openrouter_runtime.<locals>.<genexpr>�   s9   é € ð  AÑ+[ aÔ_iÐjkÔmp×_qœ	Ðvw×v}Ñv}×vœ	˜Ÿ™Ÿ	˜	Ó+[ùs   ‚AŸA·Ar4   ÚapiÚcustomr   ÚCUSTOM_BASE_URLÚautoÚ
openrouterr=   zopenrouter.ai)Ú_model_cfg_key_env_forÚ_owning_entry_credential)Úget_env_value_prefer_dotenvÚOPENAI_API_KEYÚOPENAI_BASE_URLÚOPENROUTER_API_KEYT)Úollamac              3  óœ   <"  € T FA  pSP                  V4      '       g   K  \        T;'       g    R 4      P                  4       x € KC  	  R# 5i)r"   N)Úhas_usable_secretr'   r)   )r`   Úcr3   s   & €r   rb   rc   ½   s8   øé € ÐX±*¨QÀ×@TÑ@TÐUV×@WÔ(”C˜Ÿ˜˜R“L×&Ñ&×(Ð(³*ùs   ƒA¡A¯ArF   z
env/configr?   r>   )rG   N)Úprovider_namezno-key-required)r"   rg   )Fr"   )r   Ú_get_model_configrM   r(   r'   r)   rL   ÚnextÚ_resolves_to_customr   ÚboolÚ,_config_base_url_trustworthy_for_bare_customr   rH   r	   Ú"hermes_cli.runtime_provider_customri   rj   r2   rk   r
   r   Úlooks_like_openrouter_keyÚ_host_gated_env_key_candidatesrK   rR   Ú_detect_api_mode_for_urlrq   Ú_try_resolve_from_custom_poolÚ_resolve_plain_custom_api_mode)r9   r.   r6   r:   rU   Úcfg_providerÚcfg_api_keyÚrequested_normÚenv_openrouter_base_urlÚenv_custom_base_urlÚuse_config_base_urlrZ   Úis_openrouter_urlÚis_openrouter_contextri   rj   ÚdeclaredÚ	entry_keyrk   Ú
openai_keyÚopenai_base_urlÚopenai_originÚopenai_key_okÚ
candidatesr4   rG   rV   Úpool_resultr3   s   $$$                         @r   Ú_resolve_openrouter_runtimer�   t   sÊ  ø€ ô 
‹€BØ×$Ñ$Ó&€IÜ0:¸9¿=¹=ÈÓ;TÔVY×0ZÒ0Z�9—=‘= Ô,Ð`b€LÜ1;¸I¿M¹MÈ*Ó<UÔWZ×1[Ò1[�I—M‘M *Ô-Ðac×jÑjÓl×rÑrÓt€LÜñ  A¨I¯M©M¸)Ó,DÀiÇmÁmÐTYÓFZÑ+[ó  Að  CEó  F€KØ(×.Ð.¨B×5Ñ5Ó7×=Ñ=Ó?€Nç˜.¨HÔ4¸×9OÑ9OÐP^×9_Ò9_Ø!ˆÜ,Ð-BÀBÓG×MÑMÓOÐÜ(Ð):¸BÓ?×EÑEÓGÐÜ˜|×1Ñ1Ó3Ó4÷ ð Ð=NÔ9N÷ ð Ø	˜6Ñ	!×	BÐ	B l°lÑ&B÷ 	Mð 	MØ˜hÑ&×vÐv¨2×+ZÑ+ZÐ[gÓ+v÷	Mð 	Mð ˜lÑ*×KÐK¨|¸|Ñ/Kð	 ð #×(Ð( b×/Ñ/Ó1÷ Bð BÐ5H÷ Bð B×exÈ\×M_ÑM_ÔMað  A÷ Bð BØ*÷Bð BÜ.AÇ6Á6È#Ã;ð ô
 .¨h¸ÓHÐð
 .÷ ð Ø˜,Ñ&÷ 	
ð 	
Ø ×rÐr \°\Ñ%A×rÐrÀh×RdÑRdÓRf×RmÑRmÐnqÓRrÑFr÷ Mð MØ(×OÐO¨HÑ,O÷ Lð LØ×!>Ð!>¸B× FÑ FÀsÓ KÑKð	 ÷ dØDRÐV^ÔD^Ñ2°2°xÔ@ÐdoÑ€Hˆißõ 	BÙ0Ð1AÓB×HÐHÀbˆ
Ü(Ð):¸BÓ?×EÑEÓGˆÜ˜_×-Ò-Ü+¨OÓ<ˆMÜ  ¨qÕ!1Ó2×aÐa°}ÌÐX`ÓHaÑ7a‰Mà 1Ô1×]Ð]°R×5QÑ5QÐR\Ó5]ˆMØ&Ð'ˆ
ßØÑ6Ð7KÓL×\iÉjÐoqÐrÕrˆJøð 'Ö8K©ÐQSßFYÑ-¨iÔBÐ_aðgç&™¨B×,MÑ,MÈhÐ_cÐ,MÓ,dðgˆ
ô ÔX±*ÓXÐZ\Ó]×jÐjÐaj€Gß,×0A‰ZÈ€FØ×%Ñ% i§m¡m°JÓ&?Ó@€Là˜Ô!Ø�{‰{˜<¨×)tÐ)t¸×9TÑ9TÐU]Ó9^×)tÐ)tÐbtÐv~Ø"¨6ð ó 3ð 	3÷ ˜×,Ñ,Ð-=×>Ò>Ø×6Ñ6°xÀÈ<ÐgkÐ6ÓlˆßØÐç×,Ø#ˆØ�;‰;�x ×!BÑ!BÀ9Ó!WÐYaÐcjÐsyˆ;ÓzÐzr   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   r9   r'   r:   r   r7   r;   r   r   )r   s   "r   r   r   Ò   s*   € ÷ (ñ (°ð (Àð (Ð_lð (Ðqñ (r   c           
     ó6  € ^ RI HpHpHpHpHpHpHp	Hp
 ^ RI	H
p \        4       pV R9   pV'       g!   V! 4       '       g   VP                  RRR7      hV! 4       P                  R/ 4      pV	! RV/4      pV! 4       ;'       g    RpV
! RV/4      p\        T;'       g    VP                  R4      ;'       g    R	4      P                  4       p\!        \"        P$                  P                  R
R	4      P                  4       4      pVP'                  RRRV R2RVWðR7      pV! V4      '       d:   V! 4       pTP)                  RV! V4      T;'       g    RV'       d   R
MTVRR7       M)V! V4      '       d   V'       g   VP)                  RRR7       V'       d   VVR&   V# )uŸ  AWS Bedrock with triple-path routing: bare in-Region OpenAI IDs â†’ Bedrock Mantle's Responses
endpoint (their ``us.``/``global.`` profile IDs are bedrock-runtime IDs and take Converse);
Claude â†’ AnthropicBedrock SDK (prompt caching, thinking budgets); others â†’ Converse API.
AWS_BEARER_TOKEN_BEDROCK auth is unsupported by AnthropicBedrock (SigV4 only), so bearer users
go through Converse regardless of model.)Úbedrock_openai_base_urlÚbedrock_openai_uses_mantleÚhas_aws_credentialsÚis_anthropic_bedrock_modelÚresolve_aws_auth_env_varÚresolve_bedrock_bearer_tokenÚresolve_bedrock_runtime_regionÚbedrock_guardrail_config)Úload_configÚbedrockzçNo AWS credentials found for Bedrock. Configure one of:
  - AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY
  - AWS_PROFILE (for SSO / named profiles)
  - IAM instance role (EC2, ECS, Lambda)
Or run 'aws configure' to set up credentials.Úno_aws_credentials)Úcodezaws-sdk-default-chainrB   r"   ÚAWS_BEARER_TOKEN_BEDROCKÚbedrock_conversezhttps://bedrock-runtime.z.amazonaws.comzaws-sdk)rG   Úregionr9   Úcodex_responsesT)r?   rZ   r4   rG   ÚmodelÚbedrock_openairD   )r?   Úbedrock_anthropicÚguardrail_config>   ÚawsÚamazonr›   úaws-bedrockúamazon-bedrock)Úagent.bedrock_adapterr’   r“   r”   r•   r–   r—   r˜   r™   r2   rš   r   r$   r(   r'   r)   rw   ÚosÚenvironrR   Úupdate)r9   r:   r7   r’   r“   r”   r•   r–   r—   r˜   r™   rš   r3   Úis_explicitÚbedrock_cfgr    Úauth_sourcer¥   Úcurrent_modelÚhas_bearer_tokenÚruntimeÚbearers   &&&                   r   Ú_resolve_bedrock_runtimerµ   Ò   sœ  € ÷a÷ aó aõ .Ü	‹€Bð %Ð(eÑe€KßÑ2×4Ò4Ø�l‰lð<ð
 &ð ó 
ð 	
ñ “-×#Ñ# I¨rÓ2€Ká+¨Y¸Ð,DÓE€FÙ*Ó,×GÐGÐ0G€KÙ/°¸KÐ0HÓIÐÜ˜×FÐF¨	¯©°iÓ(@×FÐFÀBÓG×MÑMÓO€MÜœBŸJ™JŸN™NÐ+EÀrÓJ×PÑPÓRÓSÐØ�k‰k˜)Ð%7Ð;SÐTZÐS[Ð[iÐ9jÐluØ!,°Vð ó d€Gá! -×0Ò0Ù-Ó/ˆØ�‰Ð 1Ñ<SÐTZÓ<[Ðek×exÐexÐoxß<BÑ8ÈÐ[hÐy}ð 	õ 	á	# M×	2Ò	2×;KØ�‰Ð 4ÈˆÔMßØ&6ˆÐ"Ñ#Ø€Nr   c               ó    € V ^8„  d   QhRRRR/# )r   r^   r'   r   rw   r   )r   s   "r   r   r      s   € ÷ [ñ [¨Cð [°Dñ [r   c                ór  € T ;'       g    RP                  4       P                  4       pV'       g   R#  \        4       P                  P	                  V4      pVe   VP
                  R8H  #   ^ RIHp V! V4      pTRJ;'       d    \        TRR4      R8H  #   \         d     L8i ; i  \         d     R# i ; i)zšKeyed on the registered provider's auth_type (CLI registry first, then the profile registry
so the check works before the CLI registry has been extended).r"   FNÚexternal_process)Úget_provider_profileÚ	auth_type)
r)   rL   r   ÚPROVIDER_REGISTRYr(   rº   r&   Ú	providersr¹   Úgetattr)r^   ÚnameÚpconfigr¹   Úprofiles   &    r   Ú_is_external_process_providerrÁ      s¾   € ð �NˆN˜×!Ñ!Ó#×)Ñ)Ó+€DßÙðÜ“%×)Ñ)×-Ñ-¨dÓ3ˆØÒØ×$Ñ$Ð(:Ñ:Ð:ð ðÝ2á& tÓ,ˆð ˜$Ð×ZÐZ¤7¨7°KÀÓ#DÐHZÑ#ZÐZøô ô Ùðûô ô Úðús#   ´5B Á,B' ÂB$Â#B$Â'B6Â5B6c               ó$   € V ^8„  d   QhRRRRRR/# )r   r^   r'   r9   r   r   r   )r   s   "r   r   r     s'   € ÷ eñ e°ð eÈð eÐQ_ñ er   c                óL  € \        4       pVP                  V 4      pTP                  T R VP                  RR4      P	                  R4      VP                  RR4      VP                  RR4      \        VP                  R4      ;'       g    . 4      VP                  RR4      VR	7      # )
r>   rZ   r"   r=   r4   ÚcommandÚargsrG   Úprocess)rÄ   rÅ   rG   r9   )r   Ú-resolve_external_process_provider_credentialsrR   r(   rH   Úlist)r^   r9   r3   Úcredss   &&  r   Ú!_resolve_external_process_runtimerÊ     s™   € Ü	‹€BØ×<Ñ<¸XÓF€EØ�;‰;�xÐ!3°U·Y±Y¸zÈ2Ó5N×5UÑ5UÐVYÓ5ZÐ\a×\eÑ\eÐfoÐqsÓ\tØ$Ÿy™y¨°BÓ7¼dÀ5Ç9Á9ÈVÓCT×CZÐCZÐXZÓ>[Ø#Ÿi™i¨°)Ó<ÐQcð ó eð er   )Ú__doc__Ú
__future__r   r«   rP   Útypingr   r   r   r%   r   Úagent.secret_scoper   Úhermes_constantsr   Úutilsr	   r
   r   r   r,   r5   r[   r�   rµ   rÁ   rÊ   r   r   r   Ú<module>rÑ      s…   ðñ8õ #ã 	Û 	ß &Ñ &å :Ý -Ý 0ß KÑ Kòõ+õ&ð(,>ØEIð,>Ønrð,>àAE÷,>ðdX{ØBFðX{Øko÷X{õ|(õ\[÷*er   