
    0j}~                        d dl Z d dl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
 d dlmZmZmZ ddlmZ ddlmZ ddlmZmZ dd	lmZ dd
lmZmZ  ej        e          Z G d de          Z  G d de
          Z! G d de!          Z" G d de!          Z# G d de          Z$ G d de%          Z&d Z'd Z( e%            Z) e%            Z* e%            Z+ e%            Z, e%            Z- e%            Z.d Z/ddddee0         deee0                  fdZ1d)dZ2d Z3d  Z4d! Z5dddde0deee0                  fd"Z6d#ej7        8                    d$          d%Z9 G d& d'e           Z:d( Z;dS )*    N)urlparse)UserDict)ListOptionalUnion   )
TokenCache)_IndividualCache)ThrottledHttpClientBaseRetryAfterParser)_is_running_in_cloud_shell)SKU__version__c                       e Zd ZdS )ManagedIdentityErrorN__name__
__module____qualname__     ]/home/rurouni/.hermes/hermes-agent/venv/lib/python3.11/site-packages/msal/managed_identity.pyr   r              Dr   r   c                        e Zd ZdZdZdZdZdZdZdZ	eded	ed
iZ
ed             Zed             Zed             Zd fd	Z xZS )ManagedIdentityzFeed an instance of this class to :class:`msal.ManagedIdentityClient`
    to acquire token for the specified managed identity.
    ManagedIdentityIdTypeIdClientId
ResourceIdObjectIdSystemAssigned	client_id
msi_res_id	object_idc                     t          |t                    p)|                     |          p|                     |          S N)
isinstancer   is_system_assignedis_user_assignedclsunknowns     r   is_managed_identityz#ManagedIdentity.is_managed_identity1   s@    7O44 -%%g..-##G,,	.r   c                     t          |t                    p7t          |t                    o"|                    | j                  | j        k    S r&   )r'   SystemAssignedManagedIdentitydictgetID_TYPESYSTEM_ASSIGNEDr*   s     r   r(   z"ManagedIdentity.is_system_assigned7   sH    '#@AA Aw%% @CK((C,??	Ar   c                     t          |t                    pOt          |t                    o:|                    | j                  | j        v o|                    | j                  S r&   )r'   UserAssignedManagedIdentityr0   r1   r2   _types_mappingIDr*   s     r   r)   z ManagedIdentity.is_user_assigned=   s[    '#>?? %w%% $CK((C,>>$CF##	%r   Nc                 t    t          t          |                               | j        || j        |i           d S r&   )superr   __init__r2   r7   )self
identifierid_type	__class__s      r   r:   zManagedIdentity.__init__D   sB    ot$$--L'GZ/
 	 	 	 	 	r   )NN)r   r   r   __doc__r2   r7   	CLIENT_IDRESOURCE_ID	OBJECT_IDr3   r6   classmethodr-   r(   r)   r:   __classcell__r>   s   @r   r   r      s          &G	B IKI&O 	;\;N . . [.
 A A [A
 % % [%         r   r   c                   "     e Zd ZdZ fdZ xZS )r/   zRepresent a system-assigned managed identity.

    It is equivalent to a Python dict of::

        {"ManagedIdentityIdType": "SystemAssigned", "Id": None}

    or a JSON blob of::

        {"ManagedIdentityIdType": "SystemAssigned", "Id": null}
    c                 d    t          t          |                               | j                   d S )N)r=   )r9   r/   r:   r3   )r;   r>   s    r   r:   z&SystemAssignedManagedIdentity.__init__W   s.    +T22;;DDX;YYYYYr   r   r   r   r?   r:   rD   rE   s   @r   r/   r/   L   sK        	 	Z Z Z Z Z Z Z Z Zr   r/   c                   ,     e Zd ZdZdddd fd
Z xZS )r5   a9  Represent a user-assigned managed identity.

    Depends on the id you provided, the outcome is equivalent to one of the below::

        {"ManagedIdentityIdType": "ClientId", "Id": "foo"}
        {"ManagedIdentityIdType": "ResourceId", "Id": "foo"}
        {"ManagedIdentityIdType": "ObjectId", "Id": "foo"}
    N)r"   resource_idr$   c                l   |r5|s3|s1t          t          |                               | j        |           d S |s5|r3|s1t          t          |                               | j        |           d S |s5|s3|r1t          t          |                               | j        |           d S t          d          )N)r=   r<   zPYou shall specify one of the three parameters: client_id, resource_id, object_id)r9   r5   r:   r@   rA   rB   r   )r;   r"   rJ   r$   r>   s       r   r:   z$UserAssignedManagedIdentity.__init__d   s    	5[ 	5 	5-t44==9 > > > > > > 		5{ 		59 		5-t44==([ > B B B B B 	5; 	59 	5-t44==9 > > > > > > '45 5 5r   rH   rE   s   @r   r5   r5   [   sU          %)dd 5 5 5 5 5 5 5 5 5 5 5r   r5   c                        e Zd Z fdZ xZS )_ThrottledHttpClientc                       t          t                     j        |i |  t           j         fdt          d          j                   j                   _        d S )Nc                     d                     |d                             t          |                    d                    t          |                    d                    z                       S )Nz"REQ {} hash={} 429/5xx/Retry-Afterr   paramsdata)format_hashstrr1   )funcargskwargsr;   s      r   <lambda>z/_ThrottledHttpClient.__init__.<locals>.<lambda>y   sd    1U1\1\Q

 

8,,--FJJv4F4F0G0GGI I2 2 r      )mapping	key_maker
expires_in)r9   rM   r:   IndividualCache_expiring_mappingr   parser1   )r;   rV   rW   r>   s   `  r   r:   z_ThrottledHttpClient.__init__u   s    2"D))2DCFCCC
?*    (**0
 
 
 h
 
r   )r   r   r   r:   rD   rE   s   @r   rM   rM   t   s8                r   rM   c                       e Zd ZdZdZdZdZdZdZddddde	e
eeef         d	eee                  fd
Zdddedee         fdZdS )ManagedIdentityClienta*  This API encapsulates multiple managed identity back-ends:
    VM, App Service, Azure Automation (Runbooks), Azure Function, Service Fabric,
    and Azure Arc.

    It also provides token cache support.

    .. note::

        Cloud Shell support is NOT implemented in this class.
        Since MSAL Python 1.18 in May 2022, it has been implemented in
        :func:`PublicClientApplication.acquire_token_interactive` via calling pattern
        ``PublicClientApplication(...).acquire_token_interactive(scopes=[...], prompt="none")``.
        That is appropriate, because Cloud Shell yields a token with
        delegated permissions for the end user who has signed in to the Azure Portal
        (like what a ``PublicClientApplication`` does),
        not a token with application permissions for an app.
    	localhostmanaged_identitytoken_sourceidentity_providercacheN)token_cache
http_cacheclient_capabilitiesri   c                    t                               |          st          d|           || _        t	          ||          | _        |pt                      | _        || _        dS )a  Create a managed identity client.

        :param managed_identity:
            It accepts an instance of :class:`SystemAssignedManagedIdentity`
            or :class:`UserAssignedManagedIdentity`.
            They are equivalent to a dict with a certain shape,
            which may be loaded from a JSON configuration file or an env var.

        :param http_client:
            An http client object. For example, you can use ``requests.Session()``,
            optionally with exponential backoff behavior demonstrated in this recipe::

                import msal, requests
                from requests.adapters import HTTPAdapter, Retry
                s = requests.Session()
                retries = Retry(total=3, backoff_factor=0.1, status_forcelist=[
                    429, 500, 501, 502, 503, 504])
                s.mount('https://', HTTPAdapter(max_retries=retries))
                managed_identity = ...
                client = msal.ManagedIdentityClient(managed_identity, http_client=s)

        :param token_cache:
            Optional. It accepts a :class:`msal.TokenCache` instance to store tokens.
            It will use an in-memory token cache by default.

        :param http_cache:
            Optional. It has the same characteristics as the
            :paramref:`msal.ClientApplication.http_cache`.

        :param list[str] client_capabilities: (optional)
            Allows configuration of one or more client capabilities, e.g. ["CP1"].

            Client capability is meant to inform the Microsoft identity platform
            (STS) what this client is capable for,
            so STS can decide to turn on certain features.

            Implementation details:
            Client capability in Managed Identity is relayed as-is
            via ``xms_cc`` parameter on the wire.

        Recipe 1: Hard code a managed identity for your app::

            import msal, requests
            client = msal.ManagedIdentityClient(
                msal.UserAssignedManagedIdentity(client_id="foo"),
                http_client=requests.Session(),
                )
            token = client.acquire_token_for_client("resource")

        Recipe 2: Write once, run everywhere.
        If you use different managed identity on different deployment,
        you may use an environment variable (such as MY_MANAGED_IDENTITY_CONFIG)
        to store a json blob like
        ``{"ManagedIdentityIdType": "ClientId", "Id": "foo"}`` or
        ``{"ManagedIdentityIdType": "SystemAssigned", "Id": null}``.
        The following app can load managed identity configuration dynamically::

            import json, os, msal, requests
            config = os.getenv("MY_MANAGED_IDENTITY_CONFIG")
            assert config, "An ENV VAR with value should exist"
            client = msal.ManagedIdentityClient(
                json.loads(config),
                http_client=requests.Session(),
                )
            token = client.acquire_token_for_client("resource")
        zIncorrect managed_identity: )rh   N)	r   r-   r   _managed_identityrM   _http_clientr	   _token_cache_client_capabilities)r;   rc   http_clientrg   rh   ri   s         r   r:   zManagedIdentityClient.__init__   s    ` 223CDD 	C&A/?AAC C C!10 !
 
 
 (7:<<$7!!!r   )claims_challengeresourcerp   c          
         d}d}| j                             t          j        d          }t	          j                    }	 | j                            | j        j        j        |gt          || j
        | j        d                    }|D ]}t          |d                   |z
  }	|	dk     r!|r|s
|d         } nt                              d	           d
|d         d|                    dd          dt          |	          | j        | j        i}d|v r3t          |d                   |d<   t          |d                   |k     r n|c S 	 t#          | j        | j         ||r9t'          j        |                    d                                                    nd| j                  }
d
|
v r|
                    dd          }	d|
vr|	dk    rt          |	dz            |
d<   | j                            t          ||gd                    | j
        | j                  |
i i                      d|
v rt          ||
d         z             |
d<   | j        |
| j        <   |
rd|
vs|s|
S n
#  |s Y nxY w|S )aE  Acquire token for the managed identity.

        The result will be automatically cached.
        Subsequent calls will automatically search from cache first.

        :param resource: The resource for which the token is acquired.

        :param claims_challenge:
            Optional.
            It is a string representation of a JSON object
            (which contains lists of claims being requested).

            The tenant admin may choose to revoke all Managed Identity tokens,
            and then a *claims challenge* will be returned by the target resource,
            as a `claims_challenge` directive in the `www-authenticate` header,
            even if the app developer did not opt in for the "CP1" client capability.
            Upon receiving a `claims_challenge`, MSAL will attempt to acquire a new token.

        .. note::

            Known issue: When an Azure VM has only one user-assigned managed identity,
            and your app specifies to use system-assigned managed identity,
            Azure VM may still return a token for your user-assigned identity.

            This is a service-side behavior that cannot be changed by this library.
            `Azure VM docs <https://learn.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/how-to-use-vm-token#get-a-token-using-http>`_
        N SYSTEM_ASSIGNED_MANAGED_IDENTITYT)r"   environmentrealmhome_account_id)targetquery
expires_oni,  secretzCache hit an ATaccess_token
token_typeBearerr\   
refresh_onzutf-8access_token_sha256_to_refreshri   i  
refresh_ini      zhttps://{}/{})r"   scopetoken_endpointresponserP   rQ   error)rk   r1   r   r7   timerm   searchCredentialTypeACCESS_TOKENr0    _ManagedIdentityClient__instance_tenantintloggerdebug_TOKEN_SOURCE_TOKEN_SOURCE_CACHE_obtain_tokenrl   hashlibsha256encode	hexdigestrn   addrR   _TOKEN_SOURCE_IDP)r;   rq   rp   access_token_to_refreshaccess_token_from_cacheclient_id_in_cachenowmatchesentryr\   results              r   acquire_token_for_clientz.ManagedIdentityClient.acquire_token_for_client  s   B #'"&!377 BD Dikk 	/'..!0= z0 $,$(	   / 	 	G ! / / |!455;
$$# ,C  /4Ho+E.///"E(O %))L("C"C #j//&(@	+'  5((<?l@S<T<T+L95.//#55....	"!4#98 /09w~+227;;0= 0==FY[[[48$($=  F ''#ZZd;;
v--*2D2D+.zA~+>+>F<(!%%d0#*#2#9#9$7 $7#' ' '     6))+.sVL5I/I+J+JF<(-1-Ct)* 7&00:Q0 1	*  &&s   DI$ $I+)r   r   r   r?   r   r   r   r   r   r   r0   r   r/   r5   r   r   rT   r:   r   r   r   r   ra   ra      s         " J !G"M+! 37c8 c8 c8)')c8 &d3i0c8 c8 c8 c8R +/	e' e' e' e' #3-	e' e' e' e' e' e'r   ra   c                 r    t          |           }|j        r d                    |j        |j                  S | S )Nz{}://{})r   schemerR   netloc)r   us     r   _scope_to_resourcer   k  s6    Ax 4!(333Lr   c                  `   dt           j        v r dt           j        v rt           j        d         S t          j        dk    rt           j                            d          sLt          j        dk    r>t           j                            t           j                            d                    rdS d S d S )NIDENTITY_ENDPOINTIMDS_ENDPOINTlinuxz/opt/azcmagent/bin/himdswin32z4${ProgramFiles}\AzureConnectedMachineAgent\himds.exez5http://localhost:40342/metadata/identity/oauth2/token)osenvironsysplatformpathexists
expandvarsr   r   r   _get_arc_endpointr   r  s    bj((_
-J-Jz-..BGNN3M$N$N<7""rw~~bg6H6HC7
 7
 ( ("
 GF #"""r   c                  R   dt           j        v r#dt           j        v rdt           j        v rt          S dt           j        v rdt           j        v rt          S dt           j        v rdt           j        v rt          S t                      rt          S t                      rt          S t          S )zDetect the current environment and return the likely identity source.

    When this function returns ``CLOUD_SHELL``, you should use
    :func:`msal.PublicClientApplication.acquire_token_interactive` with ``prompt="none"``
    to obtain a token.
    r   IDENTITY_HEADERIDENTITY_SERVER_THUMBPRINTMSI_ENDPOINT
MSI_SECRET)
r   r   SERVICE_FABRICAPP_SERVICEMACHINE_LEARNINGr   	AZURE_ARCr   CLOUD_SHELLDEFAULT_TO_VMr   r   r   get_managed_identity_sourcer     s     	rz)).?2:.M.M,
::bj((->"*-L-L##
(B(B !## r   r   r   ri   c          	         dt           j        v r~dt           j        v rpdt           j        v rb|rt                              d           t	          | t           j        d         t           j        d         t           j        d         |||          S dt           j        v rAdt           j        v r3t          | t           j        d         t           j        d         ||          S dt           j        v rAdt           j        v r3t          | t           j        d         t           j        d         ||          S t                      }|r:t          	                    |          rt          d          t          | ||          S t          | ||          S )	Nr   r   r   zIgnoring managed_identity parameter. Managed Identity in Service Fabric is configured in the cluster, not during runtime. See also https://learn.microsoft.com/en-us/azure/service-fabric/configure-existing-cluster-enable-managed-identity-token-servicer   r   r   zInvalid managed_identity parameter. Azure Arc supports only system-assigned managed identity, See also https://learn.microsoft.com/en-us/azure/service-fabric/configure-existing-cluster-enable-managed-identity-token-service)r   r   r   r   _obtain_token_on_service_fabric_obtain_token_on_app_service!_obtain_token_on_machine_learningr   r   r)   r   _obtain_token_on_arc_obtain_token_on_azure_vm)ro   rc   rq   r   ri   arc_endpoints         r   r   r     s    	rz)).?2:.M.M,
:: 	KLLJK K K
 /J*+J()J34+I 3
 
 
 	
 bj((->"*-L-L+J*+J()
 
 	
 ##
(B(B0J~&J|$
 
 	
 %&&L I++,<== 	K&JK K K
 $KxHHH$[2BHMMMr   c                     |pt           j                            |                    t           j                            }|r|t           j                 | |<   d S d S r&   )r   r6   r1   r2   r7   )rP   rc   types_mappingid_names       r   _adjust_paramr     sZ    > >CC_4557 7G ?*?+=>w? ?r   c                    t                               d           d|d}t          ||           |                     t	          j        dd                              d          dz   |dt          t          t          t          j                              d	
          }	 t          j        |j                  }|                    d          r\|                    d          rG|d         t          |d                   |                    d          |                    dd          dS |S # t          j        j        $ r" t                               d|j                    w xY w)Nz0Obtaining token via managed identity on Azure VMz
2018-02-01api-versionrq   !AZURE_POD_IDENTITY_AUTHORITY_HOSTzhttp://169.254.169.254/z/metadata/identity/oauth2/tokentrue)Metadatazx-client-SKUzx-client-Verzx-ms-client-request-idrP   headersr{   r\   rq   r|   r}   r{   r\   rq   r|   !IMDS emits unexpected payload: %s)r   r   r   r1   r   getenvstripr   r   rT   uuiduuid4jsonloadstextr   decoderJSONDecodeError)ro   rc   rq   rP   resppayloads         r   r   r     sh   
LLCDDD#
 
F &*+++??
	/1I	 	eCjj<	= '&)$*,,&7&7	   
 
D*TY'';;~&& 	7;;|+D+D 	 ' 7!',"788#KK
33%kk,AA	   <'   8$)DDDs   B	D+ )D+ +6E!c           
      *   t                               d           d|d}t          ||t          j        dt          j        dt          j        di           |                     |||dd	
          }	 t          j	        |j
                  }|                    d          r}|                    d          rh|d         t          |d                   t          t          j                              z
  |                    d          |                    dd          dS dd                    |                    d          |                    d                    dS # t          j        j        $ r" t                               d|j
                    w xY w)zObtains token for
    `App Service <https://learn.microsoft.com/en-us/azure/app-service/overview-managed-identity?tabs=portal%2Chttp#rest-endpoint-reference>`_,
    Azure Functions, and Azure Automation.
    z9Obtaining token via managed identity on Azure App Servicez
2019-08-01r   r"   	mi_res_idr$   )r   r   )zX-IDENTITY-HEADERr   r   r{   ry   rq   r|   r}   r   invalid_scopez{}, {}
statusCodemessager   error_descriptionr   )r   r   r   r   r@   rA   rB   r1   r   r   r   r   r   rR   r   r   )ro   endpointidentity_headerrc   rq   rP   r   r   s           r   r   r     s    LLLMMM#
 
F &*!;#[!;;     ??!0   	
 	
D*TY'';;~&& 	7;;|+D+D 	 ' 7!',"7883ty{{;K;KK#KK
33%kk,AA	   %!)L))7;;y+A+A"C "C  	
 <'   8$)DDDs   2B*E >E 6Fc                    t                               d           d|d}t          ||           |d         dk    rd|v r|                    d          |d<   |                     ||d|i          }	 t          j        |j                  }|                    d	          r}|                    d
          rh|d	         t          |d
                   t          t          j	                              z
  |                    d          |                    dd          dS dd
                    |          dS # t
          j        j        $ r" t                               d|j                    w xY w)Nz>Obtaining token via managed identity on Azure Machine Learningz
2017-09-01r   r   r"   clientidrz   r   r{   ry   rq   r|   r}   r   r   z{}r   r   )r   r   r   popr1   r   r   r   r   r   rR   r   r   )ro   r   rz   rc   rq   rP   r   r   s           r   r   r   +  s   
 LLQRRR)x@@F&*+++m,,1F1F#ZZ44z??6"  
 
D
*TY'';;~&& 	7;;|+D+D 	 ' 7!',"7883ty{{;K;KK#KK
33%kk,AA	   %!%W!5!5  	 <'   8$)DDDs   3B*D6 D6 66E,c          
      "   t                               d           |                     |d d|||rd                    |          ndd                                D             d|i          }	 t          j        |j                  }|                    d	          ro|                    d
          rZ|d	         t          |d
                   t          t          j	                              z
  |                    d          |d         dS |                    di           }	dddd}
|
                    |	                    d          d          |j        dS # t
          j
        j        $ r" t                               d|j                    w xY w)zfObtains token for
    `Service Fabric <https://learn.microsoft.com/en-us/azure/service-fabric/>`_
    z<Obtaining token via managed identity on Azure Service Fabricc                     i | ]
\  }}|||S r&   r   ).0kvs      r   
<dictcomp>z3_obtain_token_on_service_fabric.<locals>.<dictcomp>\  s.     ( ( (A
  1
 'r   z2019-07-01-preview,N)r   rq   token_sha256_to_refreshxms_ccSecretr   r{   ry   rq   r|   r   r   unauthorized_clientinvalid_clientr   )SecretHeaderNotFoundManagedIdentityNotFoundArgumentNullOrEmptycodeinvalid_requestr   r   )r   r   r1   joinitemsr   r   r   r   r   r   r   )ro   r   r   server_thumbprintrq   r   ri   r   r   r   error_mappings              r   r   r   M  s    LLOPPP??( (/ 'E7JTchh2333PT	" "
 egg( ( ( ?+  	
 	
D*TY'';;~&& 	7;;|+D+D 	 ' 7!L) DIKK(() $KK
33%l3   GR(($9'7#2  #&&uyy'8'8:KLL!%  	 <'   8$)DDDs   .BE AE 6Fz/var/opt/azcmagent/tokensz/%ProgramData%\AzureConnectedMachineAgent\Tokens)r   r   c                       e Zd ZdS )ArcPlatformNotSupportedErrorNr   r   r   r   r  r    r   r   r  c           	        
 t                               d           |                     |d|dddi          }d

fd|j                                        D                                 
d	                              d
          }t          |          dk    r|d                                         dk    s't          d	                    |j                            t          j        t          vrt          dt          j         d          t          j                            t          t          j                 t          j                            t          j                            |d                             d         dz             }t          j        |          j        dk    rt          d          t+          |          5 }|                                }d d d            n# 1 swxY w Y   |                     |d|ddd	                    |          d          }	 t/          j        |j                  }	|	                    d          r\|	                    d          rG|	d         t5          |	d                   |	                    dd          |	                    d          dS n# t.          j        j        $ r Y nw xY wd|j        dS )Nz1Obtaining token via managed identity on Azure Arcz
2020-06-01r   r   r   r   zwww-authenticatec                 p    i | ]2\  }}|                                 k    |                                 |3S r   )lower)r   r   r   www_auths      r   r   z(_obtain_token_on_arc.<locals>.<dictcomp>  sB     
 
 
 Ah9N9N		19N9N9Nr    =r   r   zbasic realmz*Unrecognizable WWW-Authenticate header: {}z	Platform z was undefined and unsupportedr   z.keyi   z+Local key file shall not be larger than 4KBzBasic {})r   Authorizationr{   r\   r|   r}   rq   )r{   r\   r|   rq   r   r   )r   r   r1   r   r   splitlenr  r   rR   r   r   +_supported_arc_platforms_and_their_prefixesr  r   r   r   splitextbasenamestatst_sizeopenreadr   r   r   r   r   r   )ro   r   rq   r   	challengefilenamefrz   r   r   r  s             @r   r   r     s   
LLDEEE??+BBV$  
 
D
 "H
 
 
 
 "&!3!3!5!5
 
 
 #h

EE#JJ	  	NNaIaL$6$6$8$8M$I$I"8??MMO O 	O
|FFF*DDDDF F 	Fw||3CLA
)))A,7788;fDF FH 
wx 4''"#PQQQ	h 1              +BB#j6G6G6O6OPP  
 
H
*X]++;;~&& 	7;;|+D+D 	 !( 7!',"788%kk,AA#KK
33	   <'    #%]
 
 
s%   G))G-0G-&B	J1 1KKr&   )<r   r   loggingr   r   r   r   urllib.parser   collectionsr   typingr   r   r   rg   r	   individual_cacher
   r]   throttled_http_clientr   r   
cloudshellr   skur   r   	getLoggerr   r   
ValueErrorr   r   r/   r5   rM   objectra   r   r   r   r   r   r   r   r   r   rT   r   r   r   r   r   r   r   r   r  r  r   r   r   r   <module>r!     s  
    				 



   ! ! ! ! ! !             ( ( ( ( ( ( ( ( ( ( # # # # # # A A A A A A L L L L L L L L 2 2 2 2 2 2 ! ! ! ! ! ! ! ! 
	8	$	$	 	 	 	 	: 	 	 	, , , , ,h , , ,^Z Z Z Z ZO Z Z Z5 5 5 5 5/ 5 5 52    2    d' d' d' d' d'F d' d' d'N  
G 
G 
G fhhFHH	fhh688   2 59/3	2N 2N 2N %-SM2N "$s),	2N 2N 2N 2Nj? ? ? ?     D/ / /b  J +//3	. . . %(. "$s),	. . . .d )W RSS/ / +
	 	 	 	 	#7 	 	 	1
 1
 1
 1
 1
r   