
    wg\j<                        S SK r S SKrS SKJrJr  S SKJrJr  S SKJ	r	  S SK
Jr  S SKJrJrJr  S SKJr  S SKJr  S S	KJr  S S
KJrJrJr  S SKJr  S SKJr  S SKJrJr  S SK J!r!  S SK"J#r#  S SK"J$r$  S SK"J%r%  S SK"J&r&  S SK"J'r'  S SK"J(r(J)r)  S SK"J*r*  S SK+J,r,  Sr- Sr.  " S S\S9r/S r0S r1S r2S r3S  r4 " S! S"5      r5 " S# S$\55      r6 " S% S&\55      r7 " S' S(\55      r8 " S) S*\55      r9 " S+ S,\6\/5      r: " S- S.\6\/5      r; " S/ S0\6\/5      r< " S1 S2\7\/5      r= " S3 S4\7\/5      r> " S5 S6\7\/5      r? " S7 S8\8\/5      r@ " S9 S:\8\/5      rA " S; S<\8\/5      rB " S= S>\8\/5      rC " S? S@\7\/5      rD " SA SB\7\/5      rE " SC SD\7\/5      rF " SE SF\9\/5      rG " SG SH5      rH " SI SJ\H5      rI " SK SL\I\/5      rJ " SM SN\I\/5      rK " SO SP\I\/5      rL " SQ SR\H5      rM " SS ST\M\/5      rN " SU SV\M\/5      rO " SW SX\M\/5      rP " SY SZ\H5      rQ " S[ S\\Q\/5      rR " S] S^\Q\/5      rS " S_ S`\Q\/5      rT " Sa Sb\H5      rU " Sc Sd\U\/5      rV " Se Sf\U\/5      rW " Sg Sh\U\/5      rX " Si Sj\H\/5      rY " Sk Sl\H\/5      rZ " Sm Sn\Z5      r[ " So Sp\Z5      r\ " Sq Sr\Z5      r] " Ss St\5\/5      r^ " Su Sv\5\/5      r_ " Sw Sx\5\/5      r` " Sy Sz5      ra " S{ S|\a5      rb " S} S~\b\/5      rc " S S\b\/5      rd " S S\b\/5      re " S S\a5      rf " S S\f\/5      rg " S S\f\/5      rh " S S\f\/5      ri " S S\8\/5      rj " S S\8\/5      rk " S S\8\/5      rl " S S5      rmg)    N)ABCMetaabstractmethod)hexlify	unhexlify)InvalidSignature)default_backend)constant_timehasheshmac)ec)padding)utils)Cipher
algorithmsmodes)ConcatKDFHash)
PBKDF2HMAC)aes_key_unwrapaes_key_wrap)PKCS7)InvalidCEKeyLength)InvalidJWAAlgorithm)InvalidJWEKeyLength)InvalidJWEKeyType)InvalidJWEOperation)base64url_decodebase64url_encode)json_decode)JWKi @  Tc                       \ rS rSr\\S 5       5       r\\S 5       5       r\\S 5       5       r\\S 5       5       r	\\S 5       5       r
\S 5       rSrg	)
JWAAlgorithm5   c                     g)zThe algorithm NameN selfs    G/home/edenadmin/noVNC/venv/lib/python3.13/site-packages/jwcrypto/jwa.pynameJWAAlgorithm.name7           c                     g)zA short descriptionNr$   r%   s    r'   descriptionJWAAlgorithm.description<   r*   r+   c                     g)zThe algorithm key sizeNr$   r%   s    r'   keysizeJWAAlgorithm.keysizeA   r*   r+   c                     g)zOne of 'alg', 'enc' or 'JWK'Nr$   r%   s    r'   algorithm_usage_location%JWAAlgorithm.algorithm_usage_locationF   r*   r+   c                     g)zOne of 'sig', 'kex', 'enc'Nr$   r%   s    r'   algorithm_useJWAAlgorithm.algorithm_useK   r*   r+   c                 T     U R                   $ ! [         a    U R                  s $ f = f)zThe input key size)wrap_key_sizeAttributeErrorr0   r%   s    r'   input_keysizeJWAAlgorithm.input_keysizeP   s,    	 %%% 	 <<	 s    ''r$   N)__name__
__module____qualname____firstlineno__propertyr   r(   r-   r0   r3   r6   r;   __static_attributes__r$   r+   r'   r!   r!   5   s    !  ! "  " %  % +  + )  )    r+   r!   )	metaclassc                     [        U 5      S-  $ N   )lenxs    r'   _bitsizerJ   Y   s    q6A:r+   c                     U S-  $ rE   r$   rH   s    r'   _inbytesrL   ]   s    6Mr+   c                 h    U S-  S:w  a  [        S5      e[        R                  " [        U 5      5      $ )NrF   r   zlength must be a multiple of 8)
ValueErrorosurandomrL   rH   s    r'   _randombitsrQ   a   s,    1uz9::::hqk""r+   c                 v    SR                  U 5      nUS-   S-  S-  n[        UR                  US5      S U 5      $ )Nz{:x}   rF      0)formatr   rjust)nbitseilens       r'   _encode_intr\   h   s?    aAAX!Oq DQWWT3'.//r+   c                 ,    [        [        U 5      S5      $ )N   )intr   )rX   s    r'   _decode_intr`   n   s    wqz2r+   c                        \ rS rSrS rS rSrg)_RawJWSr   c                     [         eNNotImplementedErrorr&   keypayloads      r'   sign_RawJWS.signt       !!r+   c                     [         ere   rf   r&   ri   rj   	signatures       r'   verify_RawJWS.verifyw   rm   r+   r$   Nr=   r>   r?   r@   rk   rq   rB   r$   r+   r'   rb   rb   r       ""r+   rb   c                   0    \ rS rSrSrS rS rS rS rSr	g)_RawHMAC{   Nc                 .    [        5       U l        Xl        g re   )r   backendhashfnr&   rz   s     r'   __init___RawHMAC.__init__   s    &(r+   c                     [         (       a8  [        U5      U R                  :  a  [        U R                  [        U5      5      e[        R
                  " XR                  U R                  S9nUR                  U5        U$ )Nry   )	default_enforce_hmac_key_lengthrJ   r0   r   r   HMACrz   ry   update)r&   ri   rj   hs       r'   _hmac_setup_RawHMAC._hmac_setup   sU    **x}t||/K%dllHSMBBIIc;;=	r+   c                 x    [        UR                  S5      5      nU R                  X25      nUR                  5       $ Nrk   )r   
get_op_keyr   finalize)r&   ri   rj   skeyr   s        r'   rk   _RawHMAC.sign   s1    v 67T+zz|r+   c                 |    [        UR                  S5      5      nU R                  XB5      nUR                  U5        g Nrq   )r   r   r   rq   )r&   ri   rj   rp   vkeyr   s         r'   rq   _RawHMAC.verify   s1    x 89T+	r+   )ry   rz   )
r=   r>   r?   r@   r0   r|   r   rk   rq   rB   r$   r+   r'   rv   rv   {   s    G
r+   rv   c                   &    \ rS rSrS rS rS rSrg)_RawRSA   c                     Xl         X l        g re   )padfnrz   )r&   r   rz   s      r'   r|   _RawRSA.__init__   s    
r+   c                 p    UR                  S5      nUR                  X R                  U R                  5      $ r   )r   rk   r   rz   r&   ri   rj   r   s       r'   rk   _RawRSA.sign   s)    ~~f%yy**dkk::r+   c                 t    UR                  S5      nUR                  X2U R                  U R                  5        g r   )r   rq   r   rz   r&   ri   rj   rp   pkeys        r'   rq   _RawRSA.verify   s(    ~~h'I

DKK@r+   )rz   r   N)r=   r>   r?   r@   r|   rk   rq   rB   r$   r+   r'   r   r      s    ;Ar+   r   c                   6    \ rS rSrS r\S 5       rS rS rSr	g)_RawEC   c                     Xl         X l        g re   _curverz   )r&   curverz   s      r'   r|   _RawEC.__init__   s    r+   c                     U R                   $ re   )r   r%   s    r'   r   _RawEC.curve   s    {{r+   c                    UR                  SU R                  5      nUR                  nUR                  U[        R
                  " U R                  5      5      n[        R                  " U5      u  pg[        Xd5      [        Xt5      -   $ r   )
r   r   key_sizerk   r   ECDSArz   ec_utilsdecode_dss_signaturer\   )r&   ri   rj   r   sizerp   rss           r'   rk   _RawEC.sign   sc    ~~fdkk2}}IIgrxx'<=	,,Y71#k!&:::r+   c                 Z   UR                  SU R                  5      nUS [        U5      S-   nU[        U5      S-  S  n[        R                  " [        [        U5      S5      [        [        U5      S5      5      nUR                  Xr[        R                  " U R                  5      5        g )Nrq   rT   r^   )r   r   rG   r   encode_dss_signaturer_   r   rq   r   r   rz   )r&   ri   rj   rp   r   r   r   enc_signatures           r'   rq   _RawEC.verify   s    ~~h4*s9~*+c)n)*+ 55
BWQZ!46MBHHT[[,ABr+   r   N)
r=   r>   r?   r@   r|   rA   r   rk   rq   rB   r$   r+   r'   r   r      s&      ;Cr+   r   c                        \ rS rSrS rS rSrg)_RawNone   c                     g)N r$   rh   s      r'   rk   _RawNone.sign   s    r+   c                 T    US   S:w  d  UR                  5       S:w  a  [        S5      eg )Nktyoctr   z'The "none" signature cannot be verified)r   r   ro   s       r'   rq   _RawNone.verify   s-    u:#.."2b"8"#LMM #9r+   r$   Nrs   r$   r+   r'   r   r      s    Nr+   r   c                   <   ^  \ rS rSrSrSrSrSrSrU 4S jr	Sr
U =r$ )	_HS256   HS256zHMAC using SHA-256   algsigc                 R   > [         [        U ]  [        R                  " 5       5        g re   )superr   r|   r
   SHA256r&   	__class__s    r'   r|   _HS256.__init__       fd$V]]_5r+   r$   r=   r>   r?   r@   r(   r-   r0   r3   r6   r|   rB   __classcell__r   s   @r'   r   r      '    D&KG$M6 6r+   r   c                   <   ^  \ rS rSrSrSrSrSrSrU 4S jr	Sr
U =r$ )	_HS384   HS384zHMAC using SHA-384  r   r   c                 R   > [         [        U ]  [        R                  " 5       5        g re   )r   r   r|   r
   SHA384r   s    r'   r|   _HS384.__init__   r   r+   r$   r   r   s   @r'   r   r      r   r+   r   c                   <   ^  \ rS rSrSrSrSrSrSrU 4S jr	Sr
U =r$ )	_HS512   HS512zHMAC using SHA-512   r   r   c                 R   > [         [        U ]  [        R                  " 5       5        g re   )r   r   r|   r
   SHA512r   s    r'   r|   _HS512.__init__   r   r+   r$   r   r   s   @r'   r   r      r   r+   r   c                   <   ^  \ rS rSrSrSrSrSrSrU 4S jr	Sr
U =r$ )	_RS256   RS256zRSASSA-PKCS1-v1_5 using SHA-256   r   r   c                 z   > [         [        U ]  [        R                  " 5       [
        R                  " 5       5        g re   )r   r   r|   r   PKCS1v15r
   r   r   s    r'   r|   _RS256.__init__   #    fd$W%5%5%7Ir+   r$   r   r   s   @r'   r   r      )    D3KG$MJ Jr+   r   c                   <   ^  \ rS rSrSrSrSrSrSrU 4S jr	Sr
U =r$ )	_RS384   RS384zRSASSA-PKCS1-v1_5 using SHA-384r   r   r   c                 z   > [         [        U ]  [        R                  " 5       [
        R                  " 5       5        g re   )r   r   r|   r   r   r
   r   r   s    r'   r|   _RS384.__init__   r   r+   r$   r   r   s   @r'   r   r      r   r+   r   c                   <   ^  \ rS rSrSrSrSrSrSrU 4S jr	Sr
U =r$ )	_RS512i  RS512zRSASSA-PKCS1-v1_5 using SHA-512r   r   r   c                 z   > [         [        U ]  [        R                  " 5       [
        R                  " 5       5        g re   )r   r   r|   r   r   r
   r   r   s    r'   r|   _RS512.__init__  r   r+   r$   r   r   s   @r'   r   r     r   r+   r   c                   <   ^  \ rS rSrSrSrSrSrSrU 4S jr	Sr
U =r$ )	_ES256i  ES256zECDSA using P-256 and SHA-256r   r   r   c                 T   > [         [        U ]  S[        R                  " 5       5        g )NzP-256)r   r   r|   r
   r   r   s    r'   r|   _ES256.__init__      fd$Wfmmo>r+   r$   r   r   s   @r'   r   r     '    D1KG$M? ?r+   r   c                   <   ^  \ rS rSrSrSrSrSrSrU 4S jr	Sr
U =r$ )	_ES256Ki  ES256Kz'ECDSA using secp256k1 curve and SHA-256r   r   r   c                 T   > [         [        U ]  S[        R                  " 5       5        g )N	secp256k1)r   r   r|   r
   r   r   s    r'   r|   _ES256K.__init__#  s    gt%k6==?Cr+   r$   r   r   s   @r'   r   r     s)    D;KG$MD Dr+   r   c                   <   ^  \ rS rSrSrSrSrSrSrU 4S jr	Sr
U =r$ )	_ES384i'  ES384zECDSA using P-384 and SHA-384r   r   r   c                 T   > [         [        U ]  S[        R                  " 5       5        g )NzP-384)r   r  r|   r
   r   r   s    r'   r|   _ES384.__init__/  r   r+   r$   r   r   s   @r'   r  r  '  r   r+   r  c                   <   ^  \ rS rSrSrSrSrSrSrU 4S jr	Sr
U =r$ )	_ES512i3  ES512zECDSA using P-521 and SHA-512r   r   r   c                 T   > [         [        U ]  S[        R                  " 5       5        g )NzP-521)r   r  r|   r
   r   r   s    r'   r|   _ES512.__init__;  r   r+   r$   r   r   s   @r'   r  r  3  r   r+   r  c                   <   ^  \ rS rSrSrSrSrSrSrU 4S jr	Sr
U =r$ )	_PS256i?  PS256z.RSASSA-PSS using SHA-256 and MGF1 with SHA-256r   r   r   c                    > [         R                  " [         R                  " [        R                  " 5       5      [        R                  R
                  5      n[        [        U ]#  U[        R                  " 5       5        g re   )	r   PSSMGF1r
   r   digest_sizer   r  r|   r&   r   r   s     r'   r|   _PS256.__init__G  F    GLL9"MM557fd$UFMMO<r+   r$   r   r   s   @r'   r  r  ?  '    DBKG$M= =r+   r  c                   <   ^  \ rS rSrSrSrSrSrSrU 4S jr	Sr
U =r$ )	_PS384iM  PS384z.RSASSA-PSS using SHA-384 and MGF1 with SHA-384r   r   r   c                    > [         R                  " [         R                  " [        R                  " 5       5      [        R                  R
                  5      n[        [        U ]#  U[        R                  " 5       5        g re   )	r   r  r  r
   r   r  r   r  r|   r  s     r'   r|   _PS384.__init__U  r  r+   r$   r   r   s   @r'   r  r  M  r  r+   r  c                   <   ^  \ rS rSrSrSrSrSrSrU 4S jr	Sr
U =r$ )	_PS512i[  PS512z.RSASSA-PSS using SHA-512 and MGF1 with SHA-512r   r   r   c                    > [         R                  " [         R                  " [        R                  " 5       5      [        R                  R
                  5      n[        [        U ]#  U[        R                  " 5       5        g re   )	r   r  r  r
   r   r  r   r  r|   r  s     r'   r|   _PS512.__init__c  r  r+   r$   r   r   s   @r'   r  r  [  r  r+   r  c                   (    \ rS rSrSrSrSrSrSrSr	g)	_Noneii  nonez%No digital signature or MAC performedr   r   r   r$   N
r=   r>   r?   r@   r(   r-   r0   r3   r6   rB   r$   r+   r'   r"  r"  i  s    D9KG$Mr+   r"  c                        \ rS rSrS rS rSrg)_RawKeyMgmtir  c                     [         ere   rf   )r&   ri   bitsizecekheaderss        r'   wrap_RawKeyMgmt.wrapt  rm   r+   c                     [         ere   rf   )r&   ri   r(  ekr*  s        r'   unwrap_RawKeyMgmt.unwrapw  rm   r+   r$   N)r=   r>   r?   r@   r+  r/  rB   r$   r+   r'   r&  r&  r  rt   r+   r&  c                   ,    \ rS rSrS rS rS rS rSrg)_RSAi{  c                     Xl         g re   r   )r&   r   s     r'   r|   _RSA.__init__}  s    
r+   c                 t    [        U[        5      (       d  [        S5      eUS   S:w  a  [        SUS   5      eg )Nkey is not a JWK objectr   RSA
isinstancer   rN   r   r&   ri   s     r'   
_check_key_RSA._check_key  =    #s##677u:#E3u:66 r+   c                     U R                  U5        U(       d  [        U5      nUR                  S5      nUR                  X0R                  5      nX6S.$ )NwrapKeyr)  r.  )r<  rQ   r   encryptr   r&   ri   r(  r)  r*  rkr.  s          r'   r+  	_RSA.wrap  sD    g&C^^I&ZZZZ(%%r+   c                     U R                  U5        UR                  S5      nUR                  X0R                  5      n[	        U5      U:w  a  [        U[	        U5      5      eU$ )N	unwrapKey)r<  r   decryptr   rJ   r   r&   ri   r(  r.  r*  rD  r)  s          r'   r/  _RSA.unwrap  sP    ^^K(jjZZ(C=G#%gx}==
r+   r4  N)	r=   r>   r?   r@   r|   r<  r+  r/  rB   r$   r+   r'   r2  r2  {  s    7&r+   r2  c                   H   ^  \ rS rSrSrSrSrSrSrU 4S jr	U 4S jr
S	rU =r$ )
_Rsa15i  RSA1_5zRSAES-PKCS1-v1_5r   r   kexc                 R   > [         [        U ]  [        R                  " 5       5        g re   )r   rL  r|   r   r   r   s    r'   r|   _Rsa15.__init__  s    fd$W%5%5%78r+   c                    > U R                  U5        [        U5      n [        [        U ]  XX45      n[        S5      e! [         a    Us $ f = f)NDummy)r<  rQ   r   rL  r/  rN   	Exception)r&   ri   r(  r.  r*  r)  r   s         r'   r/  _Rsa15.unwrap  sT     '"	,S2GC W%% 	J	s   > AAr$   )r=   r>   r?   r@   r(   r-   r0   r3   r6   r|   r/  rB   r   r   s   @r'   rL  rL    s,    D$KG$M9 r+   rL  c                   <   ^  \ rS rSrSrSrSrSrSrU 4S jr	Sr
U =r$ )	_RsaOaepi  RSA-OAEPz#RSAES OAEP using default parametersr   r   rN  c                    > [         [        U ]  [        R                  " [        R
                  " [        R                  " 5       5      [        R                  " 5       S 5      5        g re   )r   rV  r|   r   OAEPr  r
   SHA1r   s    r'   r|   _RsaOaep.__init__  s:    h&LLfkkm4.	/r+   r$   r   r   s   @r'   rV  rV    s'    D7KG$M/ /r+   rV  c                   <   ^  \ rS rSrSrSrSrSrSrU 4S jr	Sr
U =r$ )	_RsaOaep256i  RSA-OAEP-256z.RSAES OAEP using SHA-256 and MGF1 with SHA-256r   r   rN  c                    > [         [        U ]  [        R                  " [        R
                  " [        R                  " 5       5      [        R                  " 5       S 5      5        g re   )r   r]  r|   r   rY  r  r
   r   r   s    r'   r|   _RsaOaep256.__init__  s:    k4)LLfmmo6$0	1r+   r$   r   r   s   @r'   r]  r]    s'    DBKG$M1 1r+   r]  c                   0    \ rS rSrSrS rS rS rS rSr	g)_AesKwi  Nc                 "    [        5       U l        g re   r   ry   r%   s    r'   r|   _AesKw.__init__      &(r+   c                    [        U[        5      (       d  [        S5      eUS   S:w  a  [        SUS   5      e[	        UR                  U5      5      n[        U5      U R                  :w  a  [        U R                  [        U5      5      eU$ Nr7  r   r   	r:  r   rN   r   r   r   rJ   r0   r   r&   ri   oprD  s       r'   _get_key_AesKw._get_key  u    #s##677u:#E3u:66cnnR01B<4<<'%dllHRLAA	r+   c                 z    U R                  US5      nU(       d  [        U5      n[        XS[        5       5      nX6S.$ )NrB  rA  )rl  rQ   r   r   rC  s          r'   r+  _AesKw.wrap  s7    ]]3	*g&C"?#45%%r+   c                     U R                  US5      n[        XS[        5       5      n[        U5      U:w  a  [	        U[        U5      5      eU$ )NrH  )rl  r   r   rJ   r   rI  s          r'   r/  _AesKw.unwrap  sC    ]]3	*R_%67C=G#%gx}==
r+   r   
r=   r>   r?   r@   r0   r|   rl  r+  r/  rB   r$   r+   r'   rb  rb    s    G)&r+   rb  c                   (    \ rS rSrSrSrSrSrSrSr	g)	_A128KWi  A128KWzAES Key Wrap using 128-bit key   r   rN  r$   Nr$  r$   r+   r'   ru  ru        D2KG$Mr+   ru  c                   (    \ rS rSrSrSrSrSrSrSr	g)	_A192KWi  A192KWzAES Key Wrap using 192-bit key   r   rN  r$   Nr$  r$   r+   r'   rz  rz    rx  r+   rz  c                   (    \ rS rSrSrSrSrSrSrSr	g)	_A256KWi  A256KWzAES Key Wrap using 256-bit keyr   r   rN  r$   Nr$  r$   r+   r'   r~  r~    rx  r+   r~  c                   0    \ rS rSrSrS rS rS rS rSr	g)	_AesGcmKwi  Nc                 "    [        5       U l        g re   rd  r%   s    r'   r|   _AesGcmKw.__init__  rf  r+   c                    [        U[        5      (       d  [        S5      eUS   S:w  a  [        SUS   5      e[	        UR                  U5      5      n[        U5      U R                  :w  a  [        U R                  [        U5      5      eU$ rh  ri  rj  s       r'   rl  _AesGcmKw._get_key  rn  r+   c                    U R                  US5      nU(       d  [        U5      n[        S5      n[        [        R                  " U5      [
        R                  " U5      U R                  S9nUR                  5       nUR                  U5      UR                  5       -   n	UR                  n
X9[        U5      [        U
5      S.S.$ )NrB  `   r   )ivtag)r)  r.  header)rl  rQ   r   r   AESr   GCMry   	encryptorr   r   r  r   )r&   ri   r(  r)  r*  rD  r  cipherr  r.  r  s              r'   r+  _AesGcmKw.wrap   s    ]]3	*g&C_
r*EIIbM $.$$&	c"Y%7%7%99mm!1"!5"23"79: 	:r+   c                    U R                  US5      nSU;  a  [        S5      e[        US   5      nSU;  a  [        S5      e[        US   5      n[        [        R
                  " U5      [        R                  " Xg5      U R                  S9nUR                  5       n	U	R                  U5      U	R                  5       -   n
[        U
5      U:w  a  [        U[        U
5      5      eU
$ )NrH  r  z&Invalid Header, missing "iv" parameterr  z'Invalid Header, missing "tag" parameterr   )rl  rN   r   r   r   r  r   r  ry   	decryptorr   r   rJ   r   )r&   ri   r(  r.  r*  rD  r  r  r  r  r)  s              r'   r/  _AesGcmKw.unwrap0  s    ]]3	*wEFFgdm,FGGwu~.
r*EIIb,> $.$$&	r"Y%7%7%99C=G#%gx}==
r+   r   rs  r$   r+   r'   r  r    s    G): r+   r  c                   (    \ rS rSrSrSrSrSrSrSr	g)	
_A128GcmKwiC  	A128GCMKWz+Key wrapping with AES GCM using 128-bit keyrw  r   rN  r$   Nr$  r$   r+   r'   r  r  C      D?KG$Mr+   r  c                   (    \ rS rSrSrSrSrSrSrSr	g)	
_A192GcmKwiL  	A192GCMKWz+Key wrapping with AES GCM using 192-bit keyr|  r   rN  r$   Nr$  r$   r+   r'   r  r  L  r  r+   r  c                   (    \ rS rSrSrSrSrSrSrSr	g)	
_A256GcmKwiU  	A256GCMKWz+Key wrapping with AES GCM using 256-bit keyr   r   rN  r$   Nr$  r$   r+   r'   r  r  U  r  r+   r  c                   8    \ rS rSrSrSrSrS rS rS r	S r
Srg)_Pbes2HsAesKwi^  Nc                 P    [        5       U l        [        [        [        S.U l        g N)rw  r|  r   r   ry   ru  rz  r~  aeskwmapr%   s    r'   r|   _Pbes2HsAesKw.__init__d      &(%G'Br+   c                 6   U[         :  a  [        S5      e[        U[        5      (       d*  [        U[        5      (       a  UnO+UR                  S5      nO[        UR                  5       5      n[	        U R                  R                  S5      5      S-   U-   nU R                  S:X  a  [        R                  " 5       nOWU R                  S:X  a  [        R                  " 5       nO1U R                  S:X  a  [        R                  " 5       nO[        S5      e[        U[        U R                   5      XdU R"                  S9nUR%                  U5      n	['        U	5      U R                   :w  a  [)        U R                   [+        U	5      5      e[        S	S
[-        U	5      S9$ )NzInvalid p2c value, too largeutf8    r   r   r   zUnknown Hash Size)	algorithmlengthsalt
iterationsry   r   encr   usek)default_max_pbkdf2_iterationsrN   r:  r   bytesencoder   r   r(   hashsizer
   r   r   r   r   rL   r0   ry   deriverJ   r   rG   r   )
r&   r   ri   p2sp2cplainr  hashalgkdfrD  s
             r'   rl  _Pbes2HsAesKw._get_keyh  s2   ..;<<#s###u%%

6*$S^^%56ETYY%%f-.83>==CmmoG]]c!mmoG]]c!mmoG01178DLL3I"DLLJZZB<4<<'%dllCG<<u%+;B+?@@r+   c                 p   0 nSU;   a)  [        US   5      n[        U5      S:  a  [        S5      eO[        S5      n[	        U5      US'   SU;   a  US   nOSnXuS'   U R                  US   XU5      nU R                  U R                     " 5       n	U	R                  XX45      n
[        U5      S:  a  XZS	'   U
$ )
Nr  rF   z'Invalid Salt, must be 8 or more octectsrw  r  i    r   r   r  )	r   rG   rN   rQ   r   rl  r  r0   r+  )r&   ri   r(  r)  r*  
ret_headerr  r  kekaeskwrets              r'   r+  _Pbes2HsAesKw.wrap  s    
G"75>2C3x!| !JKK  c"C 0 5JuG%.CC #ummGENCc:dll+-jjs4z?Q&M
r+   c                     SU;  a  [        S5      eSU;  a  [        S5      e[        US   5      nUS   nU R                  US   XU5      nU R                  U R                     " 5       nUR                  XrX45      $ )Nr  z'Invalid Header, missing "p2s" parameterr  z'Invalid Header, missing "p2c" parameterr   )rN   r   rl  r  r0   r/  )	r&   ri   r(  r.  r*  r  r  r  r  s	            r'   r/  _Pbes2HsAesKw.unwrap  s}    FGGFGGwu~.enmmGENCc:dll+-||C"66r+   r  ry   )r=   r>   r?   r@   r(   r0   r  r|   rl  r+  r/  rB   r$   r+   r'   r  r  ^  s'    DGHCA>,
7r+   r  c                   ,    \ rS rSrSrSrSrSrSrSr	Sr
g	)
_Pbes2Hs256A128Kwi  PBES2-HS256+A128KWz-PBES2 with HMAC SHA-256 and "A128KW" wrappingrw  r   rN  r   r$   Nr=   r>   r?   r@   r(   r-   r0   r3   r6   r  rB   r$   r+   r'   r  r    !    DAKG$MHr+   r  c                   ,    \ rS rSrSrSrSrSrSrSr	Sr
g	)
_Pbes2Hs384A192Kwi  PBES2-HS384+A192KWz-PBES2 with HMAC SHA-384 and "A192KW" wrappingr|  r   rN  r   r$   Nr  r$   r+   r'   r  r    r  r+   r  c                   ,    \ rS rSrSrSrSrSrSrSr	Sr
g	)
_Pbes2Hs512A256Kwi  PBES2-HS512+A256KWz-PBES2 with HMAC SHA-512 and "A256KW" wrappingr   r   rN  r   r$   Nr  r$   r+   r'   r  r    r  r+   r  c                   :    \ rS rSrSrSrSrSrSrS r	S r
S	 rS
rg)_Directi  dirz$Direct use of a shared symmetric keyrw  r   rN  c                 t    [        U[        5      (       d  [        S5      eUS   S:w  a  [        SUS   5      eg rh  r9  r;  s     r'   r<  _Direct._check_key  r>  r+   c                     U R                  U5        U(       a  US 4$ [        UR                  S5      5      n[        U5      U:w  a  [	        U[        U5      5      eSU0$ )NrB  r)  )r<  r   r   rJ   r   )r&   ri   r(  r)  r*  r  s         r'   r+  _Direct.wrap  sU    ;S^^I67A;'!$Whqk::qzr+   c                     U R                  U5        US:w  a  [        S5      e[        UR                  S5      5      n[	        U5      U:w  a  [        U[	        U5      5      eU$ )Nr+   zInvalid Encryption Key.rH  )r<  rN   r   r   rJ   r   )r&   ri   r(  r.  r*  r)  s         r'   r/  _Direct.unwrap  sV    9677s~~i89C=G#%gx}==
r+   r$   N)r=   r>   r?   r@   r(   r-   r0   r3   r6   r<  r+  r/  rB   r$   r+   r'   r  r    s+    D8KG$M7r+   r  c                   F    \ rS rSrSrSrSrSrSrS r	S r
S	 rS
 rS rSrg)_EcdhEsi  ECDH-ESzECDH-ES using Concat KDFr   rN  Nc                 P    [        5       U l        [        [        [        S.U l        g r  r  r%   s    r'   r|   _EcdhEs.__init__  r  r+   c                     [        U[        5      (       d  [        S5      eUS   S;  a  [        SUS   5      eUS   S:X  a  US   S;  a  [        SUS   5      eg g )	Nr7  r   )ECOKPz	EC or OKPr  crv)X25519X448zX25519 or X448r9  r;  s     r'   r<  _EcdhEs._check_key  sr    #s##677u:]*#KU<<u:5z!33'(8(+E
4 4 4 r+   c                    [         R                  " S[        U5      5      nU[        UR	                  S5      5      -  nSU;   a  [        US   5      OSnU[         R                  " S[        U5      5      -  nXg-  nSU;   a  [        US   5      OSnU[         R                  " S[        U5      5      -  nXh-  nU[         R                  " SU5      -  n[        U[        R                  5      (       a&  UR                  [        R                  " 5       U5      n	OUR                  U5      n	[        [        R                  " 5       [        U5      UU R                  S9n
U
R!                  U	5      $ )Nz>Ir  apur+   apv)r  r  	otherinfory   )structpackrG   r  r  r   r:  r   EllipticCurvePrivateKeyexchangeECDHr   r
   r   rL   ry   r  )r&   privkeypubkeyr   r(  r*  r  r  r  
shared_keyckdfs              r'   _derive_EcdhEs._derive  s1    KKc#h/	U3::f-..	 3872Bwu~.V[[s3x00		 3872Bwu~.V[[s3x00		 	V[[w//	
 gr99:: ))"'')V<J !))&1Jv}}$,W$5'0%)\\3 {{:&&r+   c                    U R                  U5        U R                  nU R                  c  Ub  [        S5      eUS   nUnOUS   n[        R                  " US   US   S9nU R                  UR                  S5      UR                  S5      XeU5      nU R                  c  S	U0n	ODU R                  U R                     " 5       n
[        S
S[        U5      S9nU
R                  XX45      n	S[        UR                  5       5      0U	S'   U	$ )Nz"ECDH-ES cannot use an existing CEKr  r   r   r  )r   r  rG  r@  r)  r   r  epkr  )r<  r0   r   r   generater  r   r  r   r+  r   export_public)r&   ri   r(  r)  r*  dk_sizer   r  dkr  r  r  s               r'   r+  _EcdhEs.wrap"  s    ,,<<)*NOO%.CG%.Clls5zs5z:\\#..5..31 <<"+CMM$,,/1E%U.>r.BCC**S38CC,=,=,? @AH
r+   c                    SU;  a  [        S5      eU R                  U5        U R                  nU R                  c  US   nUnOUS   n[        S	0 US   D6nU R	                  UR                  S5      UR                  S5      XeU5      nU R                  c  U$ U R                  U R                     " 5       n	[        SS[        U5      S9n
U	R                  XX45      nU$ )
Nr  z'Invalid Header, missing "epk" parameterr  r   rG  r@  r   r  r$   )	rN   r<  r0   r   r  r   r  r   r/  )r&   ri   r(  r.  r*  r  r   r  r  r  r  r)  s               r'   r/  _EcdhEs.unwrap<  s    FGG,,<<%.CG%.C#GEN#\\#..5..31 <<IMM$,,/1E%U.>r.BCC,,sR9CJr+   r  )r=   r>   r?   r@   r(   r-   r3   r6   r0   r|   r<  r  r+  r/  rB   r$   r+   r'   r  r    s7    D,K$MGC4!'F4r+   r  c                   (    \ rS rSrSrSrSrSrSrSr	g)	_EcdhEsAes128KwiT  ECDH-ES+A128KWz.ECDH-ES using Concat KDF and "A128KW" wrappingrw  r   rN  r$   Nr$  r$   r+   r'   r  r  T      DBKG$Mr+   r  c                   (    \ rS rSrSrSrSrSrSrSr	g)	_EcdhEsAes192Kwi]  ECDH-ES+A192KWz.ECDH-ES using Concat KDF and "A192KW" wrappingr|  r   rN  r$   Nr$  r$   r+   r'   r  r  ]  r  r+   r  c                   (    \ rS rSrSrSrSrSrSrSr	g)	_EcdhEsAes256Kwif  ECDH-ES+A256KWz.ECDH-ES using Concat KDF and "A256KW" wrappingr   r   rN  r$   Nr$  r$   r+   r'   r  r  f  r  r+   r  c                   4    \ rS rSrSrSrSrSrSrS r	S r
S	rg)
_EdDsaio  EdDSAz'EdDSA using Ed25519 or Ed448 algorithmsr   r   Nc                 d    US   S;   a"  UR                  S5      nUR                  U5      $ [        e)Nr  Ed25519Ed448rk   )r   rk   rg   r   s       r'   rk   _EdDsa.signw  s2    u:-->>&)D99W%%!!r+   c                 d    US   S;   a"  UR                  S5      nUR                  X25      $ [        e)Nr  r
  rq   )r   rq   rg   r   s        r'   rq   _EdDsa.verify}  s2    u:-->>(+D;;y22!!r+   r$   r=   r>   r?   r@   r(   r-   r3   r6   r0   rk   rq   rB   r$   r+   r'   r  r  o  s&    D;K$MG""r+   r  c                   4    \ rS rSrSrSrSrSrSrS r	S r
S	rg)
_Ed25519i  r  zEdDSA using Ed25519r   r   Nc                 v    US   S:w  a  [        SUS   5      eUR                  S5      nUR                  U5      $ )Nr  r  rk   r   r   rk   r   s       r'   rk   _Ed25519.sign  s<    u:"#Is5z::~~f%yy!!r+   c                 v    US   S:w  a  [        SUS   5      eUR                  S5      nUR                  X25      $ )Nr  r  rq   r   r   rq   r   s        r'   rq   _Ed25519.verify  s<    u:"#Is5z::~~h'{{9..r+   r$   r  r$   r+   r'   r  r    s&    D'K$MG"/r+   r  c                   4    \ rS rSrSrSrSrSrSrS r	S r
S	rg)
_Ed448i  r  zEdDSA using Ed448r   r   Nc                 v    US   S:w  a  [        SUS   5      eUR                  S5      nUR                  U5      $ )Nr  r  rk   r  r   s       r'   rk   _Ed448.sign  s<    u: #GSZ88~~f%yy!!r+   c                 v    US   S:w  a  [        SUS   5      eUR                  S5      nUR                  X25      $ )Nr  r  rq   r  r   s        r'   rq   _Ed448.verify  s<    u: #GSZ88~~h'{{9..r+   r$   r  r$   r+   r'   r  r    s&    D%K$MG"/r+   r  c                        \ rS rSrS rS rSrg)_RawJWEi  c                     [         ere   rf   )r&   r  aadms       r'   rB  _RawJWE.encrypt  rm   r+   c                     [         ere   rf   )r&   r  r"  r  rZ   ts         r'   rH  _RawJWE.decrypt  rm   r+   r$   N)r=   r>   r?   r@   rB  rH  rB   r$   r+   r'   r   r     rt   r+   r   c                   0    \ rS rSrSrS rS rS rS rSr	g)_AesCbcHmacSha2i  Nc                     [        5       U l        Xl        [        R                  R
                  U l        U R                  S-  U l        g )NrT   )	r   ry   rz   r   r  
block_size	blocksizer0   r9   r{   s     r'   r|   _AesCbcHmacSha2.__init__  s3    &(#22!\\A-r+   c                 V   [        [        U5      S5      n[        R                  " XR                  U R
                  S9nUR                  U5        UR                  U5        UR                  U5        UR                  U5        UR                  5       nUS [        U R                  5       $ )N@   r   )
r\   rJ   r   r   rz   ry   r   r   rL   r0   )r&   r  r"  r  rZ   alr   r#  s           r'   _mac_AesCbcHmacSha2._mac  sx    #+IIadll;				JJL((4<<())r+   c                 z   [        U5      [        U R                  5      :w  a  [        S5      eUS[        U R                  5       nU[        U R                  5      S n[        U R                  5      n[        [        R                  " U5      [        R                  " U5      U R                  S9nUR                  5       n[        U R                  5      R                  5       n	U	R!                  U5      U	R#                  5       -   n
UR!                  U
5      UR#                  5       -   nU R%                  XBXk5      nXkU4$ )Encrypt according to the selected encryption and hashing
functions.

:param k: Encryption key
:param aad: Additional Authentication Data
:param m: Plaintext

Returns a dictionary with the computed data.
Invalid input key sizeNr   )rG   rL   r9   rN   r0   rQ   r,  r   r   r  r   CBCry   r  r   padderr   r   r1  )r&   r  r"  r#  hkeyekeyr  r  r  r7  padded_datarZ   r&  s                r'   rB  _AesCbcHmacSha2.encrypt  s    q6Xd0011566((4<<()$,,'() (
t,eiim $.$$&	t~~&--/mmA&)::[)I,>,>,@@ IId'qzr+   c           	         [        U5      [        U R                  5      :w  a  [        S5      eUS[        U R                  5       nU[        U R                  5      S n[
        R                  " XPR                  XbX45      5      (       d  [        S5      e[        [        R                  " U5      [        R                  " U5      U R                  S9nUR                  5       n	U	R!                  U5      U	R#                  5       -   n
[%        U R&                  5      R)                  5       nUR!                  U
5      UR#                  5       -   $ )   Decrypt according to the selected encryption and hashing
functions.
:param k: Encryption key
:param aad: Additional Authenticated Data
:param iv: Initialization Vector
:param e: Ciphertext
:param t: Authentication Tag

Returns plaintext or raises an error
r5  NzFailed to verify MACr   )rG   rL   r9   rN   r0   r	   bytes_eqr1  r   r   r   r  r   r6  ry   r  r   r   r   r,  unpadder)r&   r  r"  r  rZ   r&  r8  dkeyr  r  dr?  s               r'   rH  _AesCbcHmacSha2.decrypt  s    q6Xd0011566((4<<()$,,'() %%a4b)DEE"#9:: 
t,eiim $.$$&	Q)"4"4"66(113q!H$5$5$777r+   )ry   r,  rz   r9   )
r=   r>   r?   r@   r0   r|   r1  rB  rH  rB   r$   r+   r'   r)  r)    s    G.*<8r+   r)  c                   <   ^  \ rS rSrSrSrSrSrSrU 4S jr	Sr
U =r$ )_A128CbcHs256i  A128CBC-HS256z&AES_128_CBC_HMAC_SHA_256 authenticatedrw  r  c                 R   > [         [        U ]  [        R                  " 5       5        g re   )r   rD  r|   r
   r   r   s    r'   r|   _A128CbcHs256.__init__      mT+FMMO<r+   r$   r   r   s   @r'   rD  rD    '    D:KG$M= =r+   rD  c                   <   ^  \ rS rSrSrSrSrSrSrU 4S jr	Sr
U =r$ )_A192CbcHs384i  A192CBC-HS384z&AES_192_CBC_HMAC_SHA_384 authenticatedr|  r  c                 R   > [         [        U ]  [        R                  " 5       5        g re   )r   rK  r|   r
   r   r   s    r'   r|   _A192CbcHs384.__init__  rH  r+   r$   r   r   s   @r'   rK  rK    rI  r+   rK  c                   <   ^  \ rS rSrSrSrSrSrSrU 4S jr	Sr
U =r$ )_A256CbcHs512i   A256CBC-HS512z&AES_256_CBC_HMAC_SHA_512 authenticatedr   r  c                 R   > [         [        U ]  [        R                  " 5       5        g re   )r   rP  r|   r
   r   r   s    r'   r|   _A256CbcHs512.__init__(  rH  r+   r$   r   r   s   @r'   rP  rP     rI  r+   rP  c                   *    \ rS rSrSrS rS rS rSrg)_AesGcmi,  Nc                 D    [        5       U l        U R                  U l        g re   )r   ry   r0   r9   r%   s    r'   r|   _AesGcm.__init__0  s    &(!\\r+   c                 4   [        S5      n[        [        R                  " U5      [        R
                  " U5      U R                  S9nUR                  5       nUR                  U5        UR                  U5      UR                  5       -   nXGUR                  4$ )r4  r  r   )rQ   r   r   r  r   r  ry   r  authenticate_additional_datar   r   r  )r&   r  r"  r#  r  r  r  rZ   s           r'   rB  _AesGcm.encrypt5  s|     _
q)599R= $.$$&	..s3Q)"4"4"66y}}%%r+   c                    [        [        R                  " U5      [        R                  " X55      U R
                  S9nUR                  5       nUR                  U5        UR                  U5      UR                  5       -   $ )r=  r   )
r   r   r  r   r  ry   r  rY  r   r   )r&   r  r"  r  rZ   r&  r  r  s           r'   rH  _AesGcm.decryptH  sf     
q)599R+; $.$$&	..s3"Y%7%7%999r+   )ry   r9   )	r=   r>   r?   r@   r0   r|   rB  rH  rB   r$   r+   r'   rU  rU  ,  s    G*
&&:r+   rU  c                   (    \ rS rSrSrSrSrSrSrSr	g)_A128GcmiZ  A128GCMzAES GCM using 128-bit keyrw  r  r$   Nr$  r$   r+   r'   r^  r^  Z      D-KG$Mr+   r^  c                   (    \ rS rSrSrSrSrSrSrSr	g)_A192Gcmic  A192GCMzAES GCM using 192-bit keyr|  r  r$   Nr$  r$   r+   r'   rb  rb  c  r`  r+   rb  c                   (    \ rS rSrSrSrSrSrSrSr	g)_A256Gcmil  A256GCMzAES GCM using 256-bit keyr   r  r$   Nr$  r$   r+   r'   re  re  l  r`  r+   re  c                   <   ^  \ rS rSrSrSrSrSrSrU 4S jr	Sr
U =r$ )	_BP256R1iu  BP256R1zsECDSA using Brainpool256R1 curve and SHA-256 (unregistered, custom-defined in breach of IETF rules by gematik GmbH)r   r   r   c                 T   > [         [        U ]  S[        R                  " 5       5        g )NzBP-256)r   rh  r|   r
   r   r   s    r'   r|   _BP256R1.__init__      h&xAr+   r$   r   r   s   @r'   rh  rh  u  0    D	* 
 G$MB Br+   rh  c                   <   ^  \ rS rSrSrSrSrSrSrU 4S jr	Sr
U =r$ )	_BP384R1i  BP384R1zsECDSA using Brainpool384R1 curve and SHA-384 (unregistered, custom-defined in breach of IETF rules by gematik GmbH)r   r   r   c                 T   > [         [        U ]  S[        R                  " 5       5        g )NzBP-384)r   ro  r|   r
   r   r   s    r'   r|   _BP384R1.__init__  rl  r+   r$   r   r   s   @r'   ro  ro    rm  r+   ro  c                   <   ^  \ rS rSrSrSrSrSrSrU 4S jr	Sr
U =r$ )	_BP512R1i  BP512R1zsECDSA using Brainpool512R1 curve and SHA-512 (unregistered, custom-defined in breach of IETF rules by gematik GmbH)r   r   r   c                 T   > [         [        U ]  S[        R                  " 5       5        g )NzBP-512)r   rt  r|   r
   r   r   s    r'   r|   _BP512R1.__init__  rl  r+   r$   r   r   s   @r'   rt  rt    rm  r+   rt  c                   H   \ rS rSrSr0 S\_S\_S\_S\_S\	_S\
_S	\_S
\_S\_S\_S\_S\_S\_S\_S\_S\_S\_0 S\_S\_S\_S\_S\_S\_S\_S\_S\_S\_S\ _S\!_S \"_S!\#_S"\$_S#\%_S$\&_E\'\(\)\*\+\,\-\.\/S%.	Er0\1S,S' j5       r2\1S( 5       r3\1S) 5       r4\1S* 5       r5S+r6g&)-JWAi  zKJWA Signing Algorithms.

This class provides access to all JWA algorithms.
r   r   r   r   r   r   r   r   r  r	  r  r  r  r#  rM  rW  r^  rv  r{  r  r  r  r  r  r  r  r  r  r  r  r  r  rE  rL  )	rQ  r_  rc  rf  ri  rp  ru  r  r  Nc                 `    U R                   U   nUb  UR                  U:w  a  [        eU" 5       $ re   )algorithms_registryr6   KeyError)clsr(   r  r   s       r'   instantiate_algJWA.instantiate_alg  s0    %%d+?s00C7Nur+   c                 ^     U R                  USS9$ ! [         a    [        SU-  5      S ef = f)Nr   r  z(%s is not a valid Signing algorithm namer~  r|  r   r}  r(   s     r'   signing_algJWA.signing_alg  sM    	@&&t&77 	@% '.04'5 6;?@	@    ,c                 ^     U R                  USS9$ ! [         a    [        SU-  5      S ef = f)NrN  r  z/%s is not a valid Key Management algorithm namer  r  s     r'   keymgmt_algJWA.keymgmt_alg  N    	J&&t&77 	J% '8:>'? @EIJ	Jr  c                 ^     U R                  USS9$ ! [         a    [        SU-  5      S ef = f)Nr  r  z+%s is not a valid Encryption algorithm namer  r  s     r'   encryption_algJWA.encryption_alg  r  r  r$   re   )7r=   r>   r?   r@   __doc__r   r   r   r   r   r   r   r   r  r  r  r  r  r"  rL  rV  r]  ru  rz  r~  r  r  r  r  r  r  r  r  r  r  r  r  rD  rK  rP  r^  rb  re  rh  ro  rt  r  r  r{  classmethodr~  r  r  r  rB   r$   r+   r'   ry  ry    s'   
,,, 	, 		,
 	, 	, 	, 	', 	, 	, 	, 	, 	, 	, 	&,  	H!," 	#,$ 	'%,& 	'',( 	'),* 	w+,, 	7-,. 	//,0 	/1,2 	/3,4 	5,6 	Z7,8 	Z9,: 	Z;,< 	/=,> 	/?,@ 	/A,B 	C,D 	E,F 'W,\   @ @ J J J Jr+   ry  )nrO   r  abcr   r   binasciir   r   cryptography.exceptionsr   cryptography.hazmat.backendsr   cryptography.hazmat.primitivesr	   r
   r   )cryptography.hazmat.primitives.asymmetricr   r   r   r   &cryptography.hazmat.primitives.ciphersr   r   r   ,cryptography.hazmat.primitives.kdf.concatkdfr   )cryptography.hazmat.primitives.kdf.pbkdf2r   &cryptography.hazmat.primitives.keywrapr   r   &cryptography.hazmat.primitives.paddingr   jwcrypto.commonr   r   r   r   r   r   r   r   jwcrypto.jwkr   r  r   r!   rJ   rL   rQ   r\   r`   rb   rv   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r"  r&  r2  rL  rV  r]  rb  ru  rz  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r)  rD  rK  rP  rU  r^  rb  re  rh  ro  rt  ry  r$   r+   r'   <module>r     s   
  ' ' 4 8 F F 8 = G L L F @ O 8 . / / - / > '  !&  #' ! W ! H#0" "w 6Ag ACW C2Nw N	6X| 	6	6X| 	6	6X| 	6	JWl 	J	JWl 	J	JWl 	J	?V\ 	?	Dfl 	D	?V\ 	?	?V\ 	?=Wl ==Wl ==Wl =Hl " "; :T< :/t\ /1$ 1 [  Ffl fl fl 1 1hL L L I7K I7X| | | k< Bhk< hVg g g "Wl "*/w /*/Wl /*" "N8g N8b	=O\ 	=	=O\ 	=	=O\ 	=+:g +:\w w w Bv| B Bv| B Bv| B QJ QJr+   