Ë
    uPêj+_  ã                   óˆ  — U d Z ddlZddlZddlmZ ddlmZ ddlmZm	Z	m
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 d	d
lmZmZ erddlmZ ddlmZ eZee	z  Zne	Ze	ZdZe
e d<   de!ddfd„Z"de!dz  de#fd„Z$ejJ                  dfejL                  dfejN                  dfejP                  dfejR                  dfejT                  dfejV                  dfejX                  dfejZ                  dff	Z.e
e/e/e0e1f   df      e d<   dee1e	f   dz  de1de2e3z  dz  fd „Z4d!ed"e1de/ee1e2f   dz  e2dz  f   fd#„Z5d$ee1e2f   dz  de6de2dz  fd%„Z7d!ed"e1d&e6d'ee1e2f   dz  d(e2dz  d)e#de#fd*„Z8d!ed"e1dz  d&e6de#fd+„Z9	 d?d!ed,e1d-e1e2z  d.e1dz  de#f
d/„Z:	 d?d!ed"e1dz  d-e1e2z  d&e	d0e3dz  de#fd1„Z;	 d?d!ed"e1d-e1e2z  d&e	d2e1dz  de#fd3„Z<	 	 	 d@d!ed&e	d-e1e2z  d"e1dz  d0e3dz  d2e1dz  de#fd4„Z=d!ed5edz  de>e1   fd6„Z?d!ed5edz  de>e/   fd7„Z@d!ed5edz  de>e1   fd8„ZA	 	 	 d@d!ed"e1d&e	d9e2dz  d:e3dz  d;e1dz  de#fd<„ZBd!ede#fd=„ZCd-e1e2z  de2fd>„ZDy)Aa  
Router cooldown handlers
- _set_cooldown_deployments: puts a deployment in the cooldown list
- get_cooldown_deployments: returns the list of deployments in the cooldown list
- async_get_cooldown_deployments: ASYNC: returns the list of deployments in the cooldown list

é    N)ÚMapping)ÚMappingProxyType)ÚTYPE_CHECKINGÚAnyÚFinal)Úverbose_router_logger)ÚDEFAULT_COOLDOWN_TIME_SECONDSÚ*DEFAULT_FAILURE_THRESHOLD_MINIMUM_REQUESTSÚ!DEFAULT_FAILURE_THRESHOLD_PERCENTÚ+SINGLE_DEPLOYMENT_TRAFFIC_FAILURE_THRESHOLD)Úrouter_cooldown_event_callbacké   )Ú*get_deployment_failures_for_current_minuteÚ+get_deployment_successes_for_current_minute)ÚSpan)ÚRouterÚ&_litellm_advisor_orchestration_failureÚ#_ADVISOR_ORCHESTRATION_FAILURE_ATTRÚ	exceptionÚreturnc                 ó&   — t        | t        d«       y)aK  Tag an exception as originating from advisor orchestration rather than the
    health of the router-selected deployment.

    Advisor orchestration failures (an advisor sub-call that targets different
    provider/credentials, or the orchestration loop exceeding max_uses) are not
    caused by the selected deployment, so they must not be attributed to (and
    cool down) that otherwise-healthy deployment. The exception object is tagged
    rather than wrapped so its type is preserved and the router's retry/fallback
    classification and the client-facing error are unchanged.
    TN)Úsetattrr   ©r   s    úk/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/router_utils/cooldown_handlers.pyÚ"mark_advisor_orchestration_failurer   ,   s   € ô ˆIÔ:¸DÕAó    c                 ó6   — t        t        | t        d«      «      S )zKWhether ``exception`` was tagged by ``mark_advisor_orchestration_failure``.F)ÚboolÚgetattrr   r   s    r   Ú is_advisor_orchestration_failurer    :   s   € ä”˜	Ô#FÈÓNÓOÐOr   Ú'ContentPolicyViolationErrorAllowedFailsÚBadRequestErrorAllowedFailsÚAuthenticationErrorAllowedFailsÚTimeoutErrorAllowedFailsÚRateLimitErrorAllowedFailsÚInternalServerErrorAllowedFailsÚ#ServiceUnavailableErrorAllowedFailsÚBadGatewayErrorAllowedFailsÚNotFoundErrorAllowedFails.Ú_EXCEPTION_POLICY_FIELDSÚsourcesÚkeyc                 óF   — |D ]  }|€Œ|j                  | «      }|€Œ|c S  y)záReturn *key* from the first source mapping where it's set, so callers can
    support a setting living in more than one deployment config location. Sources
    are checked in order from most to least specific to that setting.N)Úget)r,   r+   ÚsourceÚvalues       r   Ú_first_presentr1   M   s8   € ð ò ˆØˆ>ØØ—
‘
˜3“ˆØÑØŠLðð r   Úlitellm_router_instanceÚ
deploymentc                 óÜ   — | j                  |¬«      }|€y|j                  d«      xs t        i «      }|j                  d«      }t        |t        «      r|nd}|j                  d«      }||fS )a  Return (allowed_fails_policy, allowed_fails) from deployment model_info, or (None, None).

    `model_info` is the only supported location for these two fields (unlike
    `cooldown_time`, they have no pre-existing `litellm_params` precedent): `litellm_params`
    gets copied wholesale into the actual provider call kwargs (see e.g.
    Router._image_generation's `data = deployment["litellm_params"].copy()`), so a new
    field placed there would leak into the outgoing LLM request instead of staying
    router-internal.
    ©ÚidN)NNÚ
model_infoÚallowed_fails_policyÚallowed_fails)Úget_model_infor.   r   Ú
isinstanceÚdict)r2   r3   ÚdepÚmiÚrawÚpolicyÚalloweds          r   Ú_get_deployment_cooldown_policyrB   Z   sp   € ð )×7Ñ7¸:Ð7ÓF€CØ
€{ØØ#&§7¡7¨<Ó#8Ò#PÔ<LÈRÓ<P€BØ—‘Ð.Ó/€CÜ5?ÀÄTÔ5J©cÐPT€FØ!#§¡¨Ó!8€GØ�7ˆ?Ðr   r@   c                 ón   — | €yt         D ])  \  }}t        ||«      sŒ| j                  |«      }|€Œ'|c S  y)zYMatch *exception* against *policy* and return the configured allowed-fail count, or None.N)r*   r;   r.   )r@   r   Úexc_typeÚfieldr0   s        r   Ú"_resolve_allowed_fails_from_policyrF   q   sG   € ð
 €~ØÜ3ò ‰ˆ�%Ü�i Õ*Ø—J‘J˜uÓ%ˆEØÑ Ø’ð	ð
 r   Úoriginal_exceptionÚ
dep_policyÚdep_allowed_failsÚ is_single_deployment_model_groupc                 ó  — t        ||«      }|€|�|ry|�|n|}|�t        |«      j                  n|�dnd}| j                  |¬«      }	|	�,t	        |	j                  d«      |	j                  d«      d¬«      nd}
t        | ||||
|¬	«      S )
aC  Resolve deployment-level allowed-fails and delegate to the shared counting logic.

    When the deployment's policy doesn't cover *original_exception*'s type and no
    deployment-wide `allowed_fails` is set either, defer to router-level behavior
    instead of forcing an immediate cooldown.

    A generic, deployment-wide `allowed_fails` predates this feature's per-exception-type
    policy and is a much less deliberate opt-in, so on a single-deployment model group it
    still defers to the "avoid cooldowns on single deployment model groups" safety net
    (see `_should_cooldown_deployment`'s BASE CASE) rather than silently disabling it. An
    explicit, named-exception-type `allowed_fails_policy` entry is unambiguous enough to
    override that safety net, matching `_has_explicit_allowed_fails_policy_for_exception`.
    NFÚgenericr5   r7   Úlitellm_paramsÚcooldown_time©r,   )r2   r3   rG   Úallowed_fails_overrideÚcooldown_time_overrideÚcache_key_suffix)rF   ÚtypeÚ__name__r:   r1   r.   Ú-should_cooldown_based_on_allowed_fails_policy)r2   r3   rG   rH   rI   rJ   Úallowed_fails_from_policyrP   rR   r=   rQ   s              r   Ú+_should_cooldown_based_on_deployment_policyrW   €   sÆ   € ô* (JÈ*ÐVhÓ'iÐØ Ð(Ð->Ð-JÑOoØð &?Ð%JÑ!ÐPað ð
 %Ð0ô 	ÐÓ ×)Ò)à,Ð8‰i¸dð ð )×7Ñ7¸:Ð7ÓF€Cð ˆ?ô 	�s—w‘w˜|Ó,¨c¯g©gÐ6FÓ.GÈ_Õ]àð ô 9Ø 7ØØ-Ø5Ø5Ø)ôð r   c                 óB   — |€yt        | |«      \  }}t        ||«      duS )aÍ  True if this deployment has an explicit, deployment-level allowed_fails_policy
    entry matching *original_exception*'s type.

    `_is_cooldown_required` skips cooldown evaluation for most 4XX errors (BadRequestError,
    ContentPolicyViolationError) by default, since a generic client error is usually not the
    deployment's fault. A deployment-level allowed_fails_policy entry naming that exact
    exception type is this PR's own per-deployment opt-in, so it overrides that default.

    Deliberately scoped to the deployment level only, and to the named-exception-type
    policy dict rather than a plain `allowed_fails` integer: a pre-existing router-wide
    `allowed_fails_policy` (or a deployment's generic `allowed_fails`) predates this
    feature and must keep its existing behavior for 4XX types `_is_cooldown_required`
    already excludes, rather than silently start cooling down deployments whose configs
    never opted into this specific override.
    NF)rB   rF   )r2   r3   rG   rH   Ú_s        r   Ú0_has_explicit_allowed_fails_policy_for_exceptionrZ   ³   s2   € ð( ÐØÜ3Ð4KÈZÓX�M€J�Ü-¨jÐ:LÓMÐUYÐYÐYr   Úmodel_idÚexception_statusÚexception_strc                 óà   — 	 dg}|�|D ]  }||v sŒ y t        |t        «      rt        |«      dk(  ryt        |«      }|dk\  r|dk  r|dk(  ry|dk(  ry|d	k(  s|d
k(  ryyy# t        $ r Y yw xY w)a>  
    A function to determine if a cooldown is required based on the exception status.

    Parameters:
        model_id (str) The id of the model in the model list
        exception_status (Union[str, int]): The status of the exception.

    Returns:
        bool: True if a cooldown is required, False otherwise.
    ÚAPIConnectionErrorFr   i�  éô  é­  Ti‘  i˜  i”  )r;   ÚstrÚlenÚintÚ	Exception)r2   r[   r\   r]   Úignored_stringsÚignored_strings         r   Ú_is_cooldown_requiredrh   Í   s®   € ð "Ø"6Ð!7ˆØÐ$Ø"1ò !�Ø! ]Ò2Ù ð!ô Ð&¬Ô,ÜÐ#Ó$¨Ò)ØÜ"Ð#3Ó4Ðà˜sÒ"Ð'7¸#Ò'=Ø 3Ò&àà! SÒ(àà! SÒ(Ð,<ÀÒ,CØð ð øäò áðús,   ‚A! ‘A! “A! ³A! ÁA! Á
A! Á!	A-Á,A-Útime_to_cooldownc                 óì  — |�| j                  |¬«      €t        j                  d«       y|�.t        j                  |dd¬«      rt        j                  d«       y| j
                  rt        j                  d«       y|€t        j                  d	«       yt        | ||t        |«      ¬
«      s$t        | ||¬«      st        j                  d«       y|| j                  v rt        j                  d«       yy)a¥  
    Helper that decides if cooldown logic should be run
    Returns False if cooldown logic should not be run

    Does not run cooldown logic when:
    - router.disable_cooldowns is True
    - deployment is None
    - _is_cooldown_required() returns False
    - deployment is in litellm_router_instance.provider_default_deployment_ids
    - exception_status is not one that should be immediately retried (e.g. 401)
    r5   zSShould Not Run Cooldown Logic: deployment id is none or model group can't be found.Fç        g•Ö&è.>)ÚaÚbÚabs_tolz@Should Not Run Cooldown Logic: time_to_cooldown is effectively 0z8Should Not Run Cooldown Logic: disable_cooldowns is Truez1Should Not Run Cooldown Logic: deployment is None)r2   r[   r\   r]   ©r2   r3   rG   zCShould Not Run Cooldown Logic: _is_cooldown_required returned FalsezOShould Not Run Cooldown Logic: deployment is in provider_default_deployment_idsT)
Úget_model_groupr   ÚdebugÚmathÚiscloseÚdisable_cooldownsrh   rb   rZ   Úprovider_default_deployment_ids©r2   r3   r\   rG   ri   s        r   Ú_should_run_cooldown_logicrw     s÷   € ð$ ÐÐ4×DÑDÈ
ÐDÓSÐ[Ü×#Ñ#Øaô	
ð ð
 Ð#¬¯©Ð7GÈ3ÐX\Õ(]Ü×#Ñ#Ð$fÔgØà×0Ò0Ü×#Ñ#Ð$^Ô_ØàÐÜ×#Ñ#Ð$WÔXØä Ø 7ØØ)ÜÐ,Ó-õ	ô
 ?Ø 7ØØ-õô
 	×#Ñ#Ð$iÔjØàÐ,×LÑLÑLÜ×#Ñ#Ð$uÔvØàr   Úrequested_model_groupc                 óF  — | j                  |¬«      }d}|� t        |«      dk(  r| j                  |«       }t        | |«      \  }}|€|�t	        | |||||«      S | j
                  €¯t        | ¬«      du r¡t        | |¬«      }	t        | |¬«      }
|	|
z   }d}|dkD  r|
|	|
z   z  }t        j                  d|||	|
«       t        |«      }|d	k(  r|sy
|dk(  r
|t        k\  ry
|t        kD  r|t        k\  r|sy
t        j                   t        |«      ¬«      du ry
yt#        | ||¬«      S )a_  
    Helper that decides if a deployment should be put in cooldown

    Returns True if the deployment should be put in cooldown
    Returns False if the deployment should not be put in cooldown


    Deployment is put in cooldown when:
    - v2 logic (Current):
    cooldown if:
        - got a 429 error from LLM API
        - if %fails/%(successes + fails) > ALLOWED_FAILURE_RATE_PER_MINUTE
        - got 401 Auth error, 404 NotFounder - checked by litellm._should_retry()



    - v1 logic (Legacy): if allowed fails or allowed fail policy set, coolsdown if num fails in this minute > allowed fails
    r5   Fr   ©r2   )r2   Údeployment_idrk   r   zYpercent fails for deployment = %s, percent fails = %s, num successes = %s, num fails = %sra   Tg      ð?)Ústatus_codero   )rp   rc   Úrouting_group_has_alternativesrB   rW   r8   Ú_is_allowed_fails_set_on_routerr   r   r   rq   Úcast_exception_status_to_intr   r   r
   ÚlitellmÚ_should_retryrU   )r2   r3   r\   rG   rx   Úmodel_grouprJ   rH   rI   Únum_successes_this_minuteÚnum_fails_this_minuteÚtotal_requests_this_minuteÚpercent_failsÚexception_status_ints                 r   Ú_should_cooldown_deploymentrˆ   =  s–  € ð2 1×@Ñ@ÀJÐ@ÓO€KØ',Ð$ØÐ¤3 {Ó#3°qÒ#8Ø/F×/eÑ/eØ!ó0
ð ,
Ð(ô
 %DÐD[Ð]gÓ$hÑ!€JÐ!ØÐÐ!2Ð!>Ü:Ø#ØØØØØ,ó
ð 	
ð 	 ×4Ñ4Ð<Ü+ÐD[Ô\Ð`eÑeä+VØ$;È:ô,
Ð!ô (RØ$;È:ô(
Ðð -FÐH]Ñ,]Ð"ØˆØ%¨Ò)Ø1Ð5NÐQfÑ5fÑgˆMÜ×#Ñ#ØgØØØ%Ø!ô	
ô 'CÐCSÓ&TÐØ 3Ò&Ñ/OØØ˜cÒ!Ð&@ÔDoÒ&oààÔ=Ò=Ø*Ô.XÒXÙ4ð ä×"Ñ"Ô/KÐL\Ó/]Ô^ÐbgÑgØàä<Ø$;Ø!Ø1ô
ð 	
r   c                 óh  — t        j                  d«       t        | ||||¬«      du s|€t        j                  d«       yt        |«      }t        j                  d|«       t	        | ||||¬«      rB| j
                  j                  ||||¬«       t        j                  t        | |||¬«      «       y	y)
aL  
    Add a model to the list of models being cooled down for that minute, if it exceeds the allowed fails / minute

    or

    the exception is not one that should be immediately retried (e.g. 401)

    Returns:
    - True if the deployment should be put in cooldown
    - False if the deployment should not be put in cooldown
    z"checks 'should_run_cooldown_logic'rv   Fz(should_run_cooldown_logic returned Falsez%Attempting to add %s to cooldown list)r2   r3   r\   rG   rx   )r[   rG   r\   rN   )r2   r{   r\   rN   T)
r   rq   rw   r   rˆ   Úcooldown_cacheÚadd_deployment_to_cooldownÚasyncioÚcreate_taskr   )r2   rG   r\   r3   ri   rx   r‡   s          r   Ú_set_cooldown_deploymentsrŽ   �  sØ   € ô& ×ÑÐ DÔEô 	#Ø$;Ø!Ø-Ø1Ø-ô	
ð ñ	ð Ðä×#Ñ#Ð$NÔOØä">Ð?OÓ"PÐÜ×ÑÐ GÈÔTä"Ø 7ØØ)Ø-Ø3õð 	 ×.Ñ.×IÑIØØ1Ø1Ø*ð	 	Jô 	
ô 	×ÑÜ*Ø(?Ø(Ø!1Ø.ô	ô	
ð Ør   Úparent_otel_spanc              ƒ   ó@  K  — | j                  «       }| j                  j                  ||¬«      ƒ d{  –—† }g }|�Ct        |t        «      r3t        |«      dkD  r%t        |d   t        «      r|D �cg c]  }|d   ‘Œ	 }}t        j                  d|«       |S 7 Œcc c}w ­w)ú=
    Async implementation of '_get_cooldown_deployments'
    ©Ú	model_idsr�   Nr   úretrieve cooldown models: %s)	Úget_model_idsrŠ   Úasync_get_active_cooldownsr;   Úlistrc   Útupler   rq   ©r2   r�   r“   Úcooldown_modelsÚcached_value_deployment_idsÚcvs         r   Ú_async_get_cooldown_deploymentsr�   Þ  s«   è ø€ ð /×<Ñ<Ó>€IØ#:×#IÑ#I×#dÑ#dØØ)ð $eó $÷ €Oð
 #%ÐàÐ#Ü�¬Ô-Ü�Ó  1Ò$Ü� qÑ)¬5Ô1à7FÖ&G° r¨!£uÐ&GÐ#Ð&Gä×ÑÐ >ÀÔPØ&Ð&ðúò 'Hùs!   ‚1B³B´=BÁ1BÁ=BÂBc              ƒ   ó¨   K  — | j                  «       }| j                  j                  ||¬«      ƒ d{  –—† }t        j                  d|«       |S 7 Œ­w)r‘   r’   Nr”   )r•   rŠ   r–   r   rq   )r2   r�   r“   rš   s       r   Ú/_async_get_cooldown_deployments_with_debug_inforŸ   ø  s[   è ø€ ð /×<Ñ<Ó>€IØ#:×#IÑ#I×#dÑ#dØÐ.>ð $eó $÷ €Oô ×ÑÐ >ÀÔPØÐðús   ‚1A³A´Ac                 óø   — | j                  «       }| j                  j                  ||¬«      }g }|�Ct        |t        «      r3t        |«      dkD  r%t        |d   t        «      r|D �cg c]  }|d   ‘Œ	 }}|S c c}w )zB
    Get the list of models being cooled down for this minute
    r’   r   )r•   rŠ   Úget_active_cooldownsr;   r—   rc   r˜   r™   s         r   Ú_get_cooldown_deploymentsr¢     sŒ   € ð /×<Ñ<Ó>€Ià4×CÑC×XÑXØÐ.>ð Yó €Oð #%ÐàÐ#Ü�¬Ô-Ü�Ó  1Ò$Ü� qÑ)¬5Ô1à7FÖ&G° r¨!£uÐ&GÐ#Ð&Gà&Ð&ùò 'Hs   Á'A7rP   rQ   rR   c                 ó(  — | j                  |¬«      }|�|n|�|n| j                  }|�|n| j                  xs t        }|r|› d|› �n|}	| j                  j                  |	¬«      xs d}
|
dz   }||kD  ry| j                  j                  |	||¬«       y)	aO  
    Check if fails are within the allowed limit and update the number of fails.

    When *allowed_fails_override* / *cooldown_time_override* are supplied they
    take precedence over the router-level values (used by deployment-level overrides).

    When *cache_key_suffix* is supplied the fail counter is keyed as
    ``{deployment}:{cache_key_suffix}`` so that different exception types are
    tracked independently per deployment.

    Returns:
    - True if fails exceed the allowed limit (should cooldown)
    - False if fails are within the allowed limit (should not cooldown)
    r   ú:rO   r   r   T)r,   r0   ÚttlF)Úget_allowed_fails_from_policyr9   rN   r	   Úfailed_callsÚ	get_cacheÚ	set_cache)r2   r3   rG   rP   rQ   rR   rV   r9   rN   Ú	cache_keyÚcurrent_failsÚupdated_failss               r   rU   rU   #  sÔ   € ð, (?×'\Ñ'\Ø$ð (]ó (Ðð
 "Ð-ñ 	ð )Ð4ñ &à(×6Ñ6ð ð "Ð-ñ 	à%×3Ñ3ÒTÔ7Tð ñ >N˜*˜ QÐ'7Ð&8Ñ9ÐS]€IØ2×?Ñ?×IÑIÈiÐIÓXÒ]Ð\]€MØ(¨1Ñ,€Mà�}Ò$Øà×,Ñ,×6Ñ6¸9ÈMÐ_lÐ6Ômàr   c                 óZ   — | j                   €y| j                   t        j                   k7  ryy)zÖ
    Check if Router.allowed_fails is set or is Non-default Value

    Returns:
    - True if Router.allowed_fails is set or is Non-default Value
    - False if Router.allowed_fails is None or is Default Value
    FT)r9   r€   rz   s    r   r~   r~   W  s-   € ð ×,Ñ,Ð4ØØ×,Ñ,´×0EÑ0EÒEØØr   c                 ó’   — t        | t        «      r	 t        | «      } | S | S # t        $ r t	        j
                  d| «       d} Y | S w xY w)NzDUnable to cast exception status to int %s. Defaulting to status=500.r`   )r;   rb   rd   re   r   rq   )r\   s    r   r   r   h  s_   € ÜÐ"¤CÔ(ð	#Ü"Ð#3Ó4Ðð ÐÐÐøô ò 	#Ü!×'Ñ'ØVÐXhôð  #ÑØÐð	#ús   ’! ¡!AÁA)N)NNN)EÚ__doc__rŒ   rr   Úcollections.abcr   Útypesr   Útypingr   r   r   r€   Úlitellm._loggingr   Úlitellm.constantsr	   r
   r   r   Ú'litellm.router_utils.cooldown_callbacksr   Ú)router_callbacks.track_deployment_metricsr   r   Úopentelemetry.tracer   Ú_SpanÚlitellm.routerr   Ú_RouterÚLitellmRouterr   Ú__annotations__ÚBaseExceptionr   r   r    ÚContentPolicyViolationErrorÚBadRequestErrorÚAuthenticationErrorÚTimeoutÚRateLimitErrorÚInternalServerErrorÚServiceUnavailableErrorÚBadGatewayErrorÚNotFoundErrorr*   r˜   rS   rb   rd   Úfloatr1   rB   re   rF   rW   rZ   rh   rw   rˆ   rŽ   r—   r�   rŸ   r¢   rU   r~   r   © r   r   ú<module>rÉ      s·  ðòó Û Ý #Ý "ß ,Ñ ,ã Ý 2÷ó õ S÷ñ
 Ý1å0à€MØ�3‰;�Dà€MØ€Dà-UÐ # UÓ UðB°-ð BÀDó BðP°ÀÑ0Dð PÈó Pð ×(Ñ(Ð*SÐTØ×ÑÐ;Ð<Ø× Ñ Ð"CÐDØ‡_�_Ð0Ð1Ø×ÑÐ9Ð:Ø× Ñ Ð"CÐDØ×$Ñ$Ð&KÐLØ×ÑÐ;Ð<Ø×ÑÐ7Ð8ðAÐ ˜%  e¨D°#¨IÑ&6¸Ð&;Ñ <Ñ=ó ð
˜W S¨# XÑ.°Ñ5ð 
¸Cð 
ÀCÈ%ÁKÐRVÑDVó 
ðØ*ðàðð ˆ7�3˜�8Ñ˜tÑ# S¨4¡ZÐ/Ñ0óð.Ø�C˜�HÑ Ñ$ðàðð 	ˆ4�Zóð0Ø*ð0àð0ð "ð0ð ˜˜S˜Ñ! DÑ(ð	0ð
 ˜T‘zð0ð '+ð0ð 
ó0ðfZØ*ðZà�d‘
ðZð "ðZð 
ó	Zð< !%ñ	2Ø*ð2àð2ð ˜C‘ið2ð ˜‘:ð	2ð
 
ó2ðt &*ñ8Ø*ð8à�d‘
ð8ð ˜C‘ið8ð ð	8ð
 ˜d‘lð8ð 
ó8ð@ )-ñ]Ø*ð]àð]ð ˜C‘ið]ð ð	]ð
  ™:ð]ð 
ó]ðH "Ø%)Ø(,ñ>Ø*ð>àð>ð ˜C‘ið>ð �d‘
ð	>ð
 ˜d‘lð>ð  ™:ð>ð 
ó>ðB'Ø*ð'à˜T‘kð'ð 
ˆ#�Yó'ð4Ø*ðà˜T‘kðð 
ˆ%�[óð '°}ð 'ÐX\Ð_cÑXcð 'ÐhlÐmpÑhqó 'ð> *.Ø+/Ø#'ñ1Ø*ð1àð1ð ð1ð   $™Jð	1ð
 " D™Lð1ð ˜D‘jð1ð 
ó1ðhØ*ðà	óð"	°3¸±9ð 	Àô 	r   