§
    pïgž]  ã                   óÊ  — U 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
 d dlmZmZmZmZ d dlmZmZmZ d dlmZmZmZmZmZmZ 	 d dlmZ d	Zn# e$ r d
Z	 dPde de de!de!de"de fd„ZY nw xY wdZ#dZ$dZ%dZ&dZ'dZ(dZ) ej*        d¦  «        Z+dZ,dZ-dZ.dZ/dZ0dZ1d Z2 ej*        e-d!z   e.z   ej3        ¦  «        Z4 e5 e6 e7d"d#¦  «        ¦  «        ¦  «        Z8ej9        d$ej:        d fej9        d$ej;        d fd%œZ<ej=        e ej>        ej?        ej9                 e!ej@        ej?        ej:                 ej?        ej;                 f         e!f         f         eAd&<   e&e'e(d'œZBd(ejC        de fd)„ZDe-d*z   e.d*z   fd+e d,e d-e de fd.„ZEd+e d/e!ddfd0„ZFd+e ddfd1„ZGd2e dejH        e          de de!deej@        ej;        ej:        f                  f
d3„ZId+e5dej>        e!e5f         fd4„ZJd+e5dej>        e!e5f         fd5„ZKd+e5dej>        e5e5f         fd6„ZLd+e5dej>        e!e5f         fd7„ZMd8e!de fd9„ZN G d:„ d;¦  «        ZO G d<„ d=¦  «        ZP G d>„ d?¦  «        ZQ G d@„ dA¦  «        ZR G dB„ dC¦  «        ZSe$ eP¦   «         e% eQ¦   «         e# eS¦   «         e& eRdD ejT        ¦   «         ¦  «        e' eRdE ejU        ¦   «         ¦  «        e( eRdF ejV        ¦   «         ¦  «        iZWdGe fdH„ZXej@        ejY        ejZ        ej[        ej\        f         Z]	 dQd+e dejH        e          dIej^        de]fdJ„Z_dKe]de dLede fdM„Z`ej@        ejC        eja        ejb        ejc        f         Zd	 dQd+e dIej^        dedfdN„Zed(edde fdO„ZfdS )Ré    N)Úencodebytes)Úutils©ÚUnsupportedAlgorithm)ÚdsaÚecÚed25519Úrsa)ÚCipherÚ
algorithmsÚmodes)ÚEncodingÚKeySerializationEncryptionÚNoEncryptionÚPrivateFormatÚPublicFormatÚ_KeySerializationEncryption)ÚkdfTFÚpasswordÚsaltÚdesired_key_bytesÚroundsÚignore_few_roundsÚreturnc                 ó    — t          d¦  «        ‚)NzNeed bcrypt moduler   )r   r   r   r   r   s        úR/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/serialization/ssh.pyÚ_bcrypt_kdfr       s   € õ #Ð#7Ñ8Ô8Ð8ó    s   ssh-ed25519s   ssh-rsas   ssh-dsss   ecdsa-sha2-nistp256s   ecdsa-sha2-nistp384s   ecdsa-sha2-nistp521s   -cert-v01@openssh.coms   \A(\S+)[ \t]+(\S+)s   openssh-key-v1 s#   -----BEGIN OPENSSH PRIVATE KEY-----s!   -----END OPENSSH PRIVATE KEY-----s   bcrypts   noneó
   aes256-ctré   s   (.*?)é   é   é    )r   s
   aes256-cbcÚ_SSH_CIPHERS)Ú	secp256r1Ú	secp384r1Ú	secp521r1Ú
public_keyc                 ó~   — | j         }|j        t          vrt          d|j        ›�¦  «        ‚t          |j                 S )z3Return SSH key_type and curve_name for private key.z'Unsupported curve for ssh private key: )ÚcurveÚnameÚ_ECDSA_KEY_TYPEÚ
ValueError)r(   r*   s     r   Ú_ecdsa_key_typer.   W   sE   € àÔ€EØ„z�Ð(Ð(ÝØD°e´jÐDÐDñ
ô 
ð 	
õ ˜5œ:Ô&Ð&r   ó   
ÚdataÚprefixÚsuffixc                 óL   — d                      |t          | ¦  «        |g¦  «        S )Nr   )ÚjoinÚ_base64_encode)r0   r1   r2   s      r   Ú_ssh_pem_encoder6   a   s%   € ð
 �8Š8�V�^¨DÑ1Ô1°6Ð:Ñ;Ô;Ð;r   Ú	block_lenc                 óT   — | rt          | ¦  «        |z  dk    rt          d¦  «        ‚dS )zRequire data to be full blocksr   zCorrupt data: missing paddingN)Úlenr-   )r0   r7   s     r   Ú_check_block_sizer:   i   s6   € àð :•3�t‘9”9˜yÑ(¨AÒ-Ð-ÝÐ8Ñ9Ô9Ð9ð .Ð-r   c                 ó(   — | rt          d¦  «        ‚dS )z!All data should have been parsed.zCorrupt data: unparsed dataN)r-   ©r0   s    r   Ú_check_emptyr=   o   s#   € àð 8ÝÐ6Ñ7Ô7Ð7ð8ð 8r   Ú
ciphernamec                 óØ   — |st          d¦  «        ‚t          |          \  }}}}t          ||||z   |d¦  «        }t           ||d|…         ¦  «         |||d…         ¦  «        ¦  «        S )z$Generate key + iv and return cipher.zKey is password-protected.TN)r-   r$   r   r   )	r>   r   r   r   ÚalgoÚkey_lenÚmodeÚiv_lenÚseeds	            r   Ú_init_cipherrE   u   s|   € ð ð 7ÝÐ5Ñ6Ô6Ð6å".¨zÔ":Ñ€Dˆ'�4˜Ý�x  w°Ñ'7¸ÀÑFÔF€DÝ�$�$�t˜H˜W˜H”~Ñ&Ô&¨¨¨T°'°(°(¬^Ñ(<Ô(<Ñ=Ô=Ð=r   c                 ó¢   — t          | ¦  «        dk     rt          d¦  «        ‚t                               | dd…         d¬¦  «        | dd…         fS )ÚUint32é   úInvalid dataNÚbig©Ú	byteorder©r9   r-   ÚintÚ
from_bytesr<   s    r   Ú_get_u32rP   „   óJ   € å
ˆ4�y„y�1‚}€}Ý˜Ñ(Ô(Ð(Ý�>Š>˜$˜r ˜rœ(¨eˆ>Ñ4Ô4°d¸1¸2¸2´hÐ>Ð>r   c                 ó¢   — t          | ¦  «        dk     rt          d¦  «        ‚t                               | dd…         d¬¦  «        | dd…         fS )ÚUint64é   rI   NrJ   rK   rM   r<   s    r   Ú_get_u64rU   ‹   rQ   r   c                 ó’   — t          | ¦  «        \  }} |t          | ¦  «        k    rt          d¦  «        ‚| d|…         | |d…         fS )zBytes with u32 length prefixrI   N)rP   r9   r-   )r0   Úns     r   Ú_get_sshstrrX   ’   sI   € å�t‰nŒn�G€A€tØ�3ˆt‰9Œ9‚}€}Ý˜Ñ(Ô(Ð(Ø���Œ8�T˜!˜"˜"”XÐÐr   c                 óš   — t          | ¦  «        \  }} |r|d         dk    rt          d¦  «        ‚t                               |d¦  «        | fS )zBig integer.r   é   rI   rJ   )rX   r-   rN   rO   )r0   Úvals     r   Ú
_get_mpintr\   š   sN   € å˜DÑ!Ô!�I€CˆØ
ð )ˆs�1Œv˜Š}ˆ}Ý˜Ñ(Ô(Ð(Ý�>Š>˜#˜uÑ%Ô% tÐ+Ð+r   r[   c                 ó’   — | dk     rt          d¦  «        ‚| sdS |                      ¦   «         dz   dz  }t          j        | |¦  «        S )z!Storage format for signed bigint.r   znegative mpint not allowedr   rT   )r-   Ú
bit_lengthr   Úint_to_bytes)r[   Únbytess     r   Ú	_to_mpintra   ¢   sS   € à
ˆQ‚w€wÝÐ5Ñ6Ô6Ð6Øð ØˆsØ�nŠnÑÔ Ñ" qÑ(€FÝÔ˜c 6Ñ*Ô*Ð*r   c                   óü   — e Zd ZU dZej        e         ed<   	 ddej        ej        e                  ddfd„Z	deddfd„Z
deddfd	„Zdej        ed f         ddfd
„Zdeddfd„Zdefd„Zddededefd„Zdefd„ZdS )Ú	_FragListz,Build recursive structure without data copy.ÚflistNÚinitr   c                 óP   — g | _         |r| j                              |¦  «         d S d S ©N)rd   Úextend)Úselfre   s     r   Ú__init__z_FragList.__init__±   s9   € ð ˆŒ
Øð 	$ØŒJ×Ò˜dÑ#Ô#Ð#Ð#Ð#ð	$ð 	$r   r[   c                 ó:   — | j                              |¦  «         dS )zAdd plain bytesN)rd   Úappend©ri   r[   s     r   Úput_rawz_FragList.put_raw¸   s   € àŒ
×Ò˜#ÑÔÐÐÐr   c                 ód   — | j                              |                     dd¬¦  «        ¦  «         dS )zBig-endian uint32rH   rJ   )ÚlengthrL   N)rd   rl   Úto_bytesrm   s     r   Úput_u32z_FragList.put_u32¼   s.   € àŒ
×Ò˜#Ÿ,š,¨a¸5˜,ÑAÔAÑBÔBÐBÐBÐBr   c                 óR  — t          |t          t          t          f¦  «        r>|                      t          |¦  «        ¦  «         | j                             |¦  «         dS |                      |                     ¦   «         ¦  «         | j         	                    |j        ¦  «         dS )zBytes prefixed with u32 lengthN)
Ú
isinstanceÚbytesÚ
memoryviewÚ	bytearrayrr   r9   rd   rl   Úsizerh   rm   s     r   Ú
put_sshstrz_FragList.put_sshstrÀ   s‡   € å�c�E¥:­yÐ9Ñ:Ô:ð 	)Ø�LŠL�˜S™œÑ"Ô"Ð"ØŒJ×Ò˜cÑ"Ô"Ð"Ð"Ð"à�LŠL˜Ÿš™œÑ$Ô$Ð$ØŒJ×Ò˜cœiÑ(Ô(Ð(Ð(Ð(r   c                 óJ   — |                       t          |¦  «        ¦  «         dS )z*Big-endian bigint prefixed with u32 lengthN)ry   ra   rm   s     r   Ú	put_mpintz_FragList.put_mpintÉ   s    € à�Š�	 #™œÑ'Ô'Ð'Ð'Ð'r   c                 óP   — t          t          t          | j        ¦  «        ¦  «        S )zCurrent number of bytes)ÚsumÚmapr9   rd   )ri   s    r   rx   z_FragList.sizeÍ   s   € å•3•s˜DœJÑ'Ô'Ñ(Ô(Ð(r   r   ÚdstbufÚposc                 óT   — | j         D ]}t          |¦  «        }|||z   }}||||…<   Œ |S )zWrite into bytearray)rd   r9   )ri   r   r€   ÚfragÚflenÚstarts         r   Úrenderz_FragList.renderÑ   sA   € à”Jð 	%ð 	%ˆDÝ�t‘9”9ˆDØ˜c D™j�3ˆEØ $ˆF�5˜�9ÑÐØˆ
r   c                 ó°   — t          t          |                      ¦   «         ¦  «        ¦  «        }|                      |¦  «         |                     ¦   «         S )zReturn as bytes)rv   rw   rx   r…   Útobytes)ri   Úbufs     r   r‡   z_FragList.tobytesÙ   s?   € å� 4§9¢9¡;¤;Ñ/Ô/Ñ0Ô0ˆØ�Š�CÑÔÐØ�{Š{‰}Œ}Ðr   rg   )r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚtypingÚListru   Ú__annotations__ÚOptionalrj   rn   rN   rr   ÚUnionry   r{   rx   rv   r…   r‡   © r   r   rc   rc   ¬   si  € € € € € € Ø6Ð6àŒ;�uÔÐÐÑð ;?ð$ð $Ø”O F¤K°Ô$6Ô7ð$à	ð$ð $ð $ð $ð˜5ð  Tð ð ð ð ðC˜3ð C 4ð Cð Cð Cð Cð)˜fœl¨5°+Ð+=Ô>ð )À4ð )ð )ð )ð )ð(˜Sð ( Tð (ð (ð (ð (ð)�cð )ð )ð )ð )ðð ˜Zð ¨cð ¸#ð ð ð ð ð˜ð ð ð ð ð ð r   rc   c                   óÂ   — e Zd ZdZdefd„Zdedej        ej	        ef         fd„Z
dedej        ej        ef         fd„Zdej	        dedd	fd
„Zdej        dedd	fd„Zd	S )Ú_SSHFormatRSAzhFormat for RSA keys.

    Public:
        mpint e, n
    Private:
        mpint n, e, d, iqmp, p, q
    r0   c                 óV   — t          |¦  «        \  }}t          |¦  «        \  }}||f|fS )zRSA public fields©r\   )ri   r0   ÚerW   s       r   Ú
get_publicz_SSHFormatRSA.get_publicé   s2   € å˜TÑ"Ô"‰ˆˆ4Ý˜TÑ"Ô"‰ˆˆ4Ø�1ˆv�tˆ|Ðr   r   c                 ó’   — |                       |¦  «        \  \  }}}t          j        ||¦  «        }|                     ¦   «         }||fS )zMake RSA public key from data.)r˜   r
   ÚRSAPublicNumbersr(   )ri   r0   r—   rW   Úpublic_numbersr(   s         r   Úload_publicz_SSHFormatRSA.load_publicï   sK   € ð —’ tÑ,Ô,‰‰ˆˆA�ÝÔ-¨a°Ñ3Ô3ˆØ#×.Ò.Ñ0Ô0ˆ
Ø˜4ÐÐr   c           	      óê  — t          |¦  «        \  }}t          |¦  «        \  }}t          |¦  «        \  }}t          |¦  «        \  }}t          |¦  «        \  }}t          |¦  «        \  }}||f|k    rt          d¦  «        ‚t          j        ||¦  «        }	t          j        ||¦  «        }
t          j        ||¦  «        }t          j        ||||	|
||¦  «        }|                     ¦   «         }||fS )zMake RSA private key from data.z Corrupt data: rsa field mismatch)r\   r-   r
   Úrsa_crt_dmp1Úrsa_crt_dmq1rš   ÚRSAPrivateNumbersÚprivate_key)ri   r0   Ú	pubfieldsrW   r—   ÚdÚiqmpÚpÚqÚdmp1Údmq1r›   Úprivate_numbersr¡   s                 r   Úload_privatez_SSHFormatRSA.load_privateø   sý   € õ ˜TÑ"Ô"‰ˆˆ4Ý˜TÑ"Ô"‰ˆˆ4Ý˜TÑ"Ô"‰ˆˆ4Ý Ñ%Ô%‰
ˆˆdÝ˜TÑ"Ô"‰ˆˆ4Ý˜TÑ"Ô"‰ˆˆ4àˆqˆ6�YÒÐÝÐ?Ñ@Ô@Ð@ÝÔ  1Ñ%Ô%ˆÝÔ  1Ñ%Ô%ˆÝÔ-¨a°Ñ3Ô3ˆÝÔ/Øˆq�!�T˜4  ~ñ
ô 
ˆð &×1Ò1Ñ3Ô3ˆØ˜DÐ Ð r   r(   Úf_pubNc                 ó–   — |                      ¦   «         }|                     |j        ¦  «         |                     |j        ¦  «         dS )zWrite RSA public keyN)r›   r{   r—   rW   )ri   r(   r«   Úpubns       r   Úencode_publicz_SSHFormatRSA.encode_public  sC   € ð ×(Ò(Ñ*Ô*ˆØ�Š˜œÑÔÐØ�Š˜œÑÔÐÐÐr   r¡   Úf_privc                 ót  — |                      ¦   «         }|j        }|                     |j        ¦  «         |                     |j        ¦  «         |                     |j        ¦  «         |                     |j        ¦  «         |                     |j        ¦  «         |                     |j        ¦  «         dS )zWrite RSA private keyN)	r©   r›   r{   rW   r—   r£   r¤   r¥   r¦   )ri   r¡   r¯   r©   r›   s        r   Úencode_privatez_SSHFormatRSA.encode_private  s­   € ð &×5Ò5Ñ7Ô7ˆØ(Ô7ˆà×Ò˜Ô)Ñ*Ô*Ð*Ø×Ò˜Ô)Ñ*Ô*Ð*à×Ò˜Ô*Ñ+Ô+Ð+Ø×Ò˜Ô-Ñ.Ô.Ð.Ø×Ò˜Ô*Ñ+Ô+Ð+Ø×Ò˜Ô*Ñ+Ô+Ð+Ð+Ð+r   )r‰   rŠ   r‹   rŒ   rv   r˜   r�   ÚTupler
   ÚRSAPublicKeyrœ   ÚRSAPrivateKeyrª   rc   r®   r±   r’   r   r   r”   r”   à   sý   € € € € € ðð ð˜zð ð ð ð ð Øð à	Œ�cÔ&¨
Ð2Ô	3ð ð  ð  ð  ð!Øð!à	Œ�cÔ'¨Ð3Ô	4ð!ð !ð !ð !ð, ØÔ*ð Ø3<ð à	ð ð  ð  ð  ð,ØÔ,ð,Ø6?ð,à	ð,ð ,ð ,ð ,ð ,ð ,r   r”   c                   ó  — e Zd ZdZdedej        ej        ef         fd„Zdedej        ej	        ef         fd„Z
dedej        ej        ef         fd„Zdej	        dedd	fd
„Zdej        dedd	fd„Zdej        dd	fd„Zd	S )Ú_SSHFormatDSAzhFormat for DSA keys.

    Public:
        mpint p, q, g, y
    Private:
        mpint p, q, g, y, x
    r0   r   c                 ó¢   — t          |¦  «        \  }}t          |¦  «        \  }}t          |¦  «        \  }}t          |¦  «        \  }}||||f|fS )zDSA public fieldsr–   )ri   r0   r¥   r¦   ÚgÚys         r   r˜   z_SSHFormatDSA.get_public/  s[   € õ ˜TÑ"Ô"‰ˆˆ4Ý˜TÑ"Ô"‰ˆˆ4Ý˜TÑ"Ô"‰ˆˆ4Ý˜TÑ"Ô"‰ˆˆ4Ø�1�a˜ˆ|˜TÐ!Ð!r   c                 óì   — |                       |¦  «        \  \  }}}}}t          j        |||¦  «        }t          j        ||¦  «        }|                      |¦  «         |                     ¦   «         }||fS )zMake DSA public key from data.)r˜   r   ÚDSAParameterNumbersÚDSAPublicNumbersÚ	_validater(   )	ri   r0   r¥   r¦   r¸   r¹   Úparameter_numbersr›   r(   s	            r   rœ   z_SSHFormatDSA.load_public9  sx   € ð "Ÿ_š_¨TÑ2Ô2Ñ‰ˆˆAˆq�!�dÝÔ3°A°q¸!Ñ<Ô<ÐÝÔ-¨aÐ1BÑCÔCˆØ�Š�~Ñ&Ô&Ð&Ø#×.Ò.Ñ0Ô0ˆ
Ø˜4ÐÐr   c                 ól  — |                       |¦  «        \  \  }}}}}t          |¦  «        \  }}||||f|k    rt          d¦  «        ‚t          j        |||¦  «        }t          j        ||¦  «        }	|                      |	¦  «         t          j        ||	¦  «        }
|
                     ¦   «         }||fS )zMake DSA private key from data.z Corrupt data: dsa field mismatch)	r˜   r\   r-   r   r»   r¼   r½   ÚDSAPrivateNumbersr¡   )ri   r0   r¢   r¥   r¦   r¸   r¹   Úxr¾   r›   r©   r¡   s               r   rª   z_SSHFormatDSA.load_privateD  s½   € ð "Ÿ_š_¨TÑ2Ô2Ñ‰ˆˆAˆq�!�dÝ˜TÑ"Ô"‰ˆˆ4àˆq�!�Qˆ<˜9Ò$Ð$ÝÐ?Ñ@Ô@Ð@ÝÔ3°A°q¸!Ñ<Ô<ÐÝÔ-¨aÐ1BÑCÔCˆØ�Š�~Ñ&Ô&Ð&ÝÔ/°°>ÑBÔBˆØ%×1Ò1Ñ3Ô3ˆØ˜DÐ Ð r   r(   r«   Nc                 ó6  — |                      ¦   «         }|j        }|                      |¦  «         |                     |j        ¦  «         |                     |j        ¦  «         |                     |j        ¦  «         |                     |j        ¦  «         dS )zWrite DSA public keyN)r›   r¾   r½   r{   r¥   r¦   r¸   r¹   )ri   r(   r«   r›   r¾   s        r   r®   z_SSHFormatDSA.encode_publicT  s�   € ð $×2Ò2Ñ4Ô4ˆØ*Ô<ÐØ�Š�~Ñ&Ô&Ð&à�ŠÐ)Ô+Ñ,Ô,Ð,Ø�ŠÐ)Ô+Ñ,Ô,Ð,Ø�ŠÐ)Ô+Ñ,Ô,Ð,Ø�Š˜Ô(Ñ)Ô)Ð)Ð)Ð)r   r¡   r¯   c                 ó®   — |                       |                     ¦   «         |¦  «         |                     |                     ¦   «         j        ¦  «         dS )zWrite DSA private keyN)r®   r(   r{   r©   rÁ   )ri   r¡   r¯   s      r   r±   z_SSHFormatDSA.encode_privatea  sO   € ð 	×Ò˜;×1Ò1Ñ3Ô3°VÑ<Ô<Ð<Ø×Ò˜×4Ò4Ñ6Ô6Ô8Ñ9Ô9Ð9Ð9Ð9r   r›   c                 ól   — |j         }|j                             ¦   «         dk    rt          d¦  «        ‚d S )Ni   z#SSH supports only 1024 bit DSA keys)r¾   r¥   r^   r-   )ri   r›   r¾   s      r   r½   z_SSHFormatDSA._validateh  s<   € Ø*Ô<ÐØÔ×)Ò)Ñ+Ô+¨tÒ3Ð3ÝÐBÑCÔCÐCð 4Ð3r   )r‰   rŠ   r‹   rŒ   rv   r�   r²   r˜   r   ÚDSAPublicKeyrœ   ÚDSAPrivateKeyrª   rc   r®   r±   r¼   r½   r’   r   r   r¶   r¶   &  sA  € € € € € ðð ð"Øð"à	Œ�f”l JÐ.Ô	/ð"ð "ð "ð "ð	 Øð	 à	Œ�cÔ&¨
Ð2Ô	3ð	 ð 	 ð 	 ð 	 ð!Øð!à	Œ�cÔ'¨Ð3Ô	4ð!ð !ð !ð !ð *ØÔ*ð*Ø3<ð*à	ð*ð *ð *ð *ð:ØÔ,ð:Ø6?ð:à	ð:ð :ð :ð :ðD¨Ô(<ð DÀð Dð Dð Dð Dð Dð Dr   r¶   c                   ó  — e Zd ZdZdedej        fd„Zdede	j
        e	j
        ef         fd„Zdede	j
        ej        ef         fd„Zdede	j
        ej        ef         fd	„Zd
ej        deddfd„Zdej        deddfd„ZdS )Ú_SSHFormatECDSAz–Format for ECDSA keys.

    Public:
        str curve
        bytes point
    Private:
        str curve
        bytes point
        mpint secret
    Ússh_curve_namer*   c                 ó"   — || _         || _        d S rg   )rÉ   r*   )ri   rÉ   r*   s      r   rj   z_SSHFormatECDSA.__init__z  s   € Ø,ˆÔØˆŒ
ˆ
ˆ
r   r0   r   c                 óÀ   — t          |¦  «        \  }}t          |¦  «        \  }}|| j        k    rt          d¦  «        ‚|d         dk    rt          d¦  «        ‚||f|fS )zECDSA public fieldszCurve name mismatchr   rH   zNeed uncompressed point)rX   rÉ   r-   ÚNotImplementedError)ri   r0   r*   Úpoints       r   r˜   z_SSHFormatECDSA.get_public~  sn   € õ " $Ñ'Ô'‰ˆˆtÝ! $Ñ'Ô'‰ˆˆtØ�DÔ'Ò'Ð'ÝÐ2Ñ3Ô3Ð3Ø�Œ8�qŠ=ˆ=Ý%Ð&?Ñ@Ô@Ð@Ø�uˆ~˜tÐ#Ð#r   c                 ó®   — |                       |¦  «        \  \  }}}t          j                             | j        |                     ¦   «         ¦  «        }||fS )z Make ECDSA public key from data.)r˜   r   ÚEllipticCurvePublicKeyÚfrom_encoded_pointr*   r‡   )ri   r0   Ú
curve_namerÍ   r(   s        r   rœ   z_SSHFormatECDSA.load_publicŠ  sS   € ð %)§O¢O°DÑ$9Ô$9Ñ!Ñˆ�U˜TÝÔ.×AÒAØŒJ˜Ÿš™œñ
ô 
ˆ
ð ˜4ÐÐr   c                 óÆ   — |                       |¦  «        \  \  }}}t          |¦  «        \  }}||f|k    rt          d¦  «        ‚t          j        || j        ¦  «        }||fS )z!Make ECDSA private key from data.z"Corrupt data: ecdsa field mismatch)r˜   r\   r-   r   Úderive_private_keyr*   )ri   r0   r¢   rÑ   rÍ   Úsecretr¡   s          r   rª   z_SSHFormatECDSA.load_private”  sn   € ð %)§O¢O°DÑ$9Ô$9Ñ!Ñˆ�U˜TÝ! $Ñ'Ô'‰ˆ�à˜Ð )Ò+Ð+ÝÐAÑBÔBÐBÝÔ+¨F°D´JÑ?Ô?ˆØ˜DÐ Ð r   r(   r«   Nc                 ó¸   — |                      t          j        t          j        ¦  «        }|                     | j        ¦  «         |                     |¦  «         dS )zWrite ECDSA public keyN)Úpublic_bytesr   ÚX962r   ÚUncompressedPointry   rÉ   )ri   r(   r«   rÍ   s       r   r®   z_SSHFormatECDSA.encode_public   sV   € ð ×'Ò'ÝŒM�<Ô9ñ
ô 
ˆð 	×Ò˜Ô,Ñ-Ô-Ð-Ø×Ò˜ÑÔÐÐÐr   r¡   r¯   c                 ó¶   — |                      ¦   «         }|                     ¦   «         }|                      ||¦  «         |                     |j        ¦  «         dS )zWrite ECDSA private keyN)r(   r©   r®   r{   Úprivate_value)ri   r¡   r¯   r(   r©   s        r   r±   z_SSHFormatECDSA.encode_privateª  sY   € ð !×+Ò+Ñ-Ô-ˆ
Ø%×5Ò5Ñ7Ô7ˆà×Ò˜: vÑ.Ô.Ð.Ø×Ò˜Ô6Ñ7Ô7Ð7Ð7Ð7r   )r‰   rŠ   r‹   rŒ   ru   r   ÚEllipticCurverj   rv   r�   r²   r˜   rÏ   rœ   ÚEllipticCurvePrivateKeyrª   rc   r®   r±   r’   r   r   rÈ   rÈ   n  s9  € € € € € ð	ð 	ð uð °RÔ5Eð ð ð ð ð
$Øð
$à	Œ�f”l JÐ.Ô	/ð
$ð 
$ð 
$ð 
$ð Øð à	Œ�bÔ/°Ð;Ô	<ð ð  ð  ð  ð
!Øð
!à	Œ�bÔ0°*Ð<Ô	=ð
!ð 
!ð 
!ð 
!ð ØÔ3ð Ø<Eð à	ð ð  ð  ð  ð8ØÔ5ð8Ø?Hð8à	ð8ð 8ð 8ð 8ð 8ð 8r   rÈ   c                   óê   — e Zd ZdZdedej        ej        ef         fd„Zdedej        ej	        ef         fd„Z
dedej        ej        ef         fd„Zdej	        dedd	fd
„Zdej        dedd	fd„Zd	S )Ú_SSHFormatEd25519z~Format for Ed25519 keys.

    Public:
        bytes point
    Private:
        bytes point
        bytes secret_and_point
    r0   r   c                 ó0   — t          |¦  «        \  }}|f|fS )zEd25519 public fields)rX   )ri   r0   rÍ   s      r   r˜   z_SSHFormatEd25519.get_public¿  s!   € õ " $Ñ'Ô'‰ˆˆtØˆx˜ˆ~Ðr   c                 ó    — |                       |¦  «        \  \  }}t          j                             |                     ¦   «         ¦  «        }||fS )z"Make Ed25519 public key from data.)r˜   r	   ÚEd25519PublicKeyÚfrom_public_bytesr‡   )ri   r0   rÍ   r(   s       r   rœ   z_SSHFormatEd25519.load_publicÆ  sK   € ð Ÿš¨Ñ.Ô.‰‰ˆ�$ÝÔ-×?Ò?Ø�MŠM‰OŒOñ
ô 
ˆ
ð ˜4ÐÐr   c                 ó   — |                       |¦  «        \  \  }}t          |¦  «        \  }}|dd…         }|dd…         }||k    s|f|k    rt          d¦  «        ‚t          j                             |¦  «        }||fS )z#Make Ed25519 private key from data.Nr#   z$Corrupt data: ed25519 field mismatch)r˜   rX   r-   r	   ÚEd25519PrivateKeyÚfrom_private_bytes)ri   r0   r¢   rÍ   ÚkeypairrÔ   Úpoint2r¡   s           r   rª   z_SSHFormatEd25519.load_privateÐ  s‹   € ð Ÿš¨Ñ.Ô.‰‰ˆ�$Ý# DÑ)Ô)‰ˆ�à˜˜"˜”ˆØ˜˜˜”ˆØ�FŠ?ˆ?˜u˜h¨)Ò3Ð3ÝÐCÑDÔDÐDÝÔ/×BÒBÀ6ÑJÔJˆØ˜DÐ Ð r   r(   r«   Nc                 ó„   — |                      t          j        t          j        ¦  «        }|                     |¦  «         dS )zWrite Ed25519 public keyN)rÖ   r   ÚRawr   ry   )ri   r(   r«   Úraw_public_keys       r   r®   z_SSHFormatEd25519.encode_publicÞ  s?   € ð $×0Ò0ÝŒL�,Ô*ñ
ô 
ˆð 	×Ò˜Ñ(Ô(Ð(Ð(Ð(r   r¡   r¯   c                 óh  — |                      ¦   «         }|                     t          j        t          j        t          ¦   «         ¦  «        }|                     t          j        t          j        ¦  «        }t          ||g¦  «        }|  	                    ||¦  «         | 
                    |¦  «         dS )zWrite Ed25519 private keyN)r(   Úprivate_bytesr   ré   r   r   rÖ   r   rc   r®   ry   )ri   r¡   r¯   r(   Úraw_private_keyrê   Ú	f_keypairs          r   r±   z _SSHFormatEd25519.encode_privateç  sŸ   € ð !×+Ò+Ñ-Ô-ˆ
Ø%×3Ò3ÝŒL�-Ô+­\©^¬^ñ
ô 
ˆð $×0Ò0ÝŒL�,Ô*ñ
ô 
ˆõ ˜°Ð?Ñ@Ô@ˆ	à×Ò˜: vÑ.Ô.Ð.Ø×Ò˜)Ñ$Ô$Ð$Ð$Ð$r   )r‰   rŠ   r‹   rŒ   rv   r�   r²   r˜   r	   rá   rœ   rä   rª   rc   r®   r±   r’   r   r   rÞ   rÞ   µ  s  € € € € € ðð ðØðà	Œ�f”l JÐ.Ô	/ðð ð ð ð Øð à	Œ�gÔ.°
Ð:Ô	;ð ð  ð  ð  ð!Øð!à	Œ�gÔ/°Ð;Ô	<ð!ð !ð !ð !ð)Ø!Ô2ð)Ø;Dð)à	ð)ð )ð )ð )ð%Ø"Ô4ð%Ø>Gð%à	ð%ð %ð %ð %ð %ð %r   rÞ   s   nistp256s   nistp384s   nistp521Úkey_typec                 ó¾   — t          | t          ¦  «        s!t          | ¦  «                             ¦   «         } | t          v rt          |          S t          d| ›�¦  «        ‚)z"Return valid format or throw errorzUnsupported key type: )rt   ru   rv   r‡   Ú_KEY_FORMATSr   )rï   s    r   Ú_lookup_kformatrò     sZ   € å�h¥Ñ&Ô&ð 2Ý˜hÑ'Ô'×/Ò/Ñ1Ô1ˆØ•<ÐÐÝ˜HÔ%Ð%Ý
ÐD¸ÐDÐDÑ
EÔ
EÐEr   Úbackendc                 ód  — t          j        d| ¦  «         |�t          j        d|¦  «         t                               | ¦  «        }|st          d¦  «        ‚|                     d¦  «        }|                     d¦  «        }t          j	        t          | ¦  «        ||…         ¦  «        } |                      t          ¦  «        st          d¦  «        ‚t          | ¦  «        t          t          ¦  «        d…         } t          | ¦  «        \  }} t          | ¦  «        \  }} t          | ¦  «        \  }} t          | ¦  «        \  }	} |	dk    rt          d¦  «        ‚t          | ¦  «        \  }
} t          |
¦  «        \  }}
t!          |¦  «        }|                     |
¦  «        \  }}
t%          |
¦  «         t          | ¦  «        \  }} t%          | ¦  «         ||ft&          t&          fk    rû|                     ¦   «         }|t*          vrt-          d|›�¦  «        ‚|t.          k    rt-          d|›�¦  «        ‚t*          |         d	         }t1          ||¦  «         t          |¦  «        \  }}t          |¦  «        \  }}t%          |¦  «         t3          |||                     ¦   «         |¦  «        }t          |                     ¦   «                              |¦  «        ¦  «        }nd
}t1          ||¦  «         t          |¦  «        \  }}t          |¦  «        \  }}||k    rt          d¦  «        ‚t          |¦  «        \  }}||k    rt          d¦  «        ‚|                     ||¦  «        \  }}t          |¦  «        \  }}|t:          dt          |¦  «        …         k    rt          d¦  «        ‚|S )z.Load private key from OpenSSH custom encoding.r0   Nr   zNot OpenSSH private key formatr!   zOnly one key supportedzUnsupported cipher: zUnsupported KDF: é   rT   zCorrupt data: broken checksumzCorrupt data: key type mismatchzCorrupt data: invalid padding)r   Ú_check_byteslikeÚ_check_bytesÚ_PEM_RCÚsearchr-   r„   ÚendÚbinasciiÚ
a2b_base64rv   Ú
startswithÚ	_SK_MAGICr9   rX   rP   rò   r˜   r=   Ú_NONEr‡   r$   r   Ú_BCRYPTr:   rE   Ú	decryptorÚupdaterª   Ú_PADDING)r0   r   ró   ÚmÚp1Úp2r>   ÚkdfnameÚ
kdfoptionsÚnkeysÚpubdataÚpub_key_typeÚkformatr¢   ÚedataÚciphername_bytesÚblklenr   Úkbufr   ÚciphÚck1Úck2rï   r¡   Úcomments                             r   Úload_ssh_private_keyr    s‡  € õ 
Ô˜6 4Ñ(Ô(Ð(ØÐÝÔ˜: xÑ0Ô0Ð0å�Š�tÑÔ€AØð ;ÝÐ9Ñ:Ô:Ð:Ø	
�Š�‰Œ€BØ	
�Šˆq‰Œ€BÝÔ�z¨$Ñ/Ô/°°2°Ô6Ñ7Ô7€DØ�?Š?�9Ñ%Ô%ð ;ÝÐ9Ñ:Ô:Ð:Ý�dÑÔ�C¥	™NœNÐ,Ð,Ô-€Dõ # 4Ñ(Ô(Ñ€J�Ý Ñ%Ô%�M€GˆTÝ" 4Ñ(Ô(Ñ€J�Ý˜4‘.”.�K€Eˆ4Ø�‚z€zÝÐ1Ñ2Ô2Ð2õ   Ñ%Ô%�M€GˆTÝ'¨Ñ0Ô0Ñ€L�'Ý˜lÑ+Ô+€GØ ×+Ò+¨GÑ4Ô4Ñ€IˆwÝ�ÑÔÐõ ˜dÑ#Ô#�K€Eˆ4Ý�ÑÔÐà�GÐ¥­ Ò.Ð.Ø%×-Ò-Ñ/Ô/ÐØ¥<Ð/Ð/Ý&Ø;Ð'7Ð;Ð;ñô ð ð •gÒÐÝ&Ð'F¸7Ð'FÐ'FÑGÔGÐGÝÐ.Ô/°Ô2ˆÝ˜% Ñ(Ô(Ð(Ý  Ñ,Ô,‰
ˆˆdÝ ‘~”~‰ˆ�Ý�TÑÔÐÝÐ,¨h¸¿º¹¼ÈÑOÔOˆÝ˜4Ÿ>š>Ñ+Ô+×2Ò2°5Ñ9Ô9Ñ:Ô:ˆˆàˆÝ˜% Ñ(Ô(Ð(Ý˜%‘”�J€CˆÝ˜%‘”�J€CˆØ
ˆc‚z€zÝÐ8Ñ9Ô9Ð9õ " %Ñ(Ô(�O€HˆeØ�<ÒÐÝÐ:Ñ;Ô;Ð;Ø ×-Ò-¨e°YÑ?Ô?Ñ€K�Ý  Ñ'Ô'�N€GˆUð •˜�3˜u™:œ:˜Ô&Ò&Ð&ÝÐ8Ñ9Ô9Ð9àÐr   r¡   Úencryption_algorithmc                 óª  — t          j        d|¦  «         t          | t          j        ¦  «        r"t          |                      ¦   «         ¦  «        }nut          | t          j        ¦  «        rt          }nSt          | t          j        ¦  «        rt          }n1t          | t          j        ¦  «        rt          }nt!          d¦  «        ‚t#          |¦  «        }t%          ¦   «         }|rœt&          }t(          |         d         }t*          }t,          }	t          |t.          ¦  «        r|j        �|j        }	t3          j        d¦  «        }
|                     |
¦  «         |                     |	¦  «         t;          |||
|	¦  «        }nt<          x}}d}d}d}t3          j        d¦  «        }d	}t%          ¦   «         }|                     |¦  «         |                     |                      ¦   «         |¦  «         t%          ||g¦  «        }|                     |¦  «         |                      | |¦  «         |                     |¦  «         | !                    tD          d|| #                    ¦   «         |z  z
  …         ¦  «         t%          ¦   «         }| !                    tH          ¦  «         |                     |¦  «         |                     |¦  «         |                     |¦  «         |                     |¦  «         |                     |¦  «         |                     |¦  «         | #                    ¦   «         }| #                    ¦   «         }tK          tM          ||z   ¦  «        ¦  «        }| '                    |¦  «         ||z
  }|�8| (                    ¦   «          )                    |||…         ||d…         ¦  «         tU          |d|…         ¦  «        S )
z3Serialize private key with OpenSSH custom encoding.r   úUnsupported key typerõ   Nr    rT   r!   rH   r   )+r   r÷   rt   r   rÜ   r.   r(   r
   r´   Ú_SSH_RSAr   rÆ   Ú_SSH_DSAr	   rä   Ú_SSH_ED25519r-   rò   rc   Ú_DEFAULT_CIPHERr$   r   Ú_DEFAULT_ROUNDSr   Ú_kdf_roundsÚosÚurandomry   rr   rE   rÿ   r®   r±   rn   r  rx   rþ   rv   rw   r…   Ú	encryptorÚupdate_intor6   )r¡   r   r  rï   r  Úf_kdfoptionsr>   r  r  r   r   r  r	  Úcheckvalr  Úf_public_keyÚ	f_secretsÚf_mainÚslenÚmlenrˆ   Úofss                         r   Ú_serialize_ssh_private_keyr+  `  sy  € õ 
Ô�z 8Ñ,Ô,Ð,å�+�rÔ9Ñ:Ô:ð 	1Ý" ;×#9Ò#9Ñ#;Ô#;Ñ<Ô<ˆˆÝ	�K¥Ô!2Ñ	3Ô	3ð 1ÝˆˆÝ	�K¥Ô!2Ñ	3Ô	3ð 1ÝˆˆÝ	�K¥Ô!:Ñ	;Ô	;ð 1ÝˆˆåÐ/Ñ0Ô0Ð0Ý˜hÑ'Ô'€Gõ ‘;”;€LØð Ý$ˆ
Ý˜jÔ)¨!Ô,ˆÝˆÝ ˆåÐ+Õ-HÑIÔIð	6à$Ô0Ð<à)Ô5ˆFÝŒz˜"‰~Œ~ˆØ×Ò Ñ%Ô%Ð%Ø×Ò˜VÑ$Ô$Ð$Ý˜J¨°$¸Ñ?Ô?ˆˆå$Ð$ˆ
�WØˆØˆØ€EÝŒz˜!‰}Œ}€HØ€Gõ ‘;”;€LØ×Ò˜HÑ%Ô%Ð%Ø×Ò˜+×0Ò0Ñ2Ô2°LÑAÔAÐAå˜8 XÐ.Ñ/Ô/€IØ×Ò˜Ñ"Ô"Ð"Ø×Ò˜;¨	Ñ2Ô2Ð2Ø×Ò˜Ñ!Ô!Ð!Ø×Ò•hÐE ¨9¯>ª>Ñ+;Ô+;¸fÑ+DÑ!EÐEÔFÑGÔGÐGõ ‰[Œ[€FØ
‡N‚N•9ÑÔÐØ
×Ò�jÑ!Ô!Ð!Ø
×Ò�gÑÔÐØ
×Ò�lÑ#Ô#Ð#Ø
‡N‚N�5ÑÔÐØ
×Ò�lÑ#Ô#Ð#Ø
×Ò�iÑ Ô Ð ð �>Š>ÑÔ€DØ�;Š;‰=Œ=€DÝ
•Y˜t f™}Ñ-Ô-Ñ
.Ô
.€CØ
‡M‚M�#ÑÔÐØ
�‰+€Cð ÐØ�ŠÑÔ×$Ò$ S¨¨T¨¤]°C¸¸¸´IÑ>Ô>Ð>å˜3˜u ˜uœ:Ñ&Ô&Ð&r   c                 óv  — t          j        d| ¦  «         t                               | ¦  «        }|st	          d¦  «        ‚|                     d¦  «        x}}|                     d¦  «        }d}t          |t          t          ¦  «         d…         k    rd}|dt          t          ¦  «         …         }t          |¦  «        }	 t          t          j        |¦  «        ¦  «        }n)# t          t          j        f$ r t	          d¦  «        ‚w xY wt          |¦  «        \  }	}|	|k    rt	          d¦  «        ‚|rt          |¦  «        \  }
}|                     |¦  «        \  }}|rÆt!          |¦  «        \  }}t#          |¦  «        \  }}t          |¦  «        \  }}t          |¦  «        \  }}t!          |¦  «        \  }}t!          |¦  «        \  }}t          |¦  «        \  }}t          |¦  «        \  }}t          |¦  «        \  }}t          |¦  «        \  }}t          |¦  «        \  }}t%          |¦  «         |S )	z-Load public key from OpenSSH one-line format.r0   zInvalid line formatr!   é   FNTzInvalid key format)r   rö   Ú_SSH_PUBKEY_RCÚmatchr-   ÚgroupÚ_CERT_SUFFIXr9   rò   rv   rû   rü   Ú	TypeErrorÚErrorrX   rœ   rU   rP   r=   )r0   ró   r  rï   Úorig_key_typeÚkey_bodyÚ	with_certr  ÚrestÚinner_key_typeÚnoncer(   ÚserialÚcctypeÚkey_idÚ
principalsÚvalid_afterÚvalid_beforeÚcrit_optionsÚ
extensionsÚreservedÚsig_keyÚ	signatures                          r   Úload_ssh_public_keyrE  ·  s:  € õ 
Ô˜6 4Ñ(Ô(Ð(å×Ò˜TÑ"Ô"€AØð 0ÝÐ.Ñ/Ô/Ð/Ø Ÿwšw q™zœzÐ)€Hˆ}Ø�wŠw�q‰zŒz€HØ€IÝ�x¥¥\Ñ!2Ô!2Ð 2Ð 4Ð 4Ô5Ò5Ð5Øˆ	ØÐ0�s¥<Ñ0Ô0Ð0Ð0Ô1ˆÝ˜hÑ'Ô'€Gð/Ý�(Ô-¨hÑ7Ô7Ñ8Ô8ˆˆøÝ•x”~Ð&ð /ð /ð /ÝÐ-Ñ.Ô.Ð.ð/øøøõ ' tÑ,Ô,Ñ€N�DØ˜Ò&Ð&ÝÐ-Ñ.Ô.Ð.Øð (Ý! $Ñ'Ô'‰ˆˆtØ×*Ò*¨4Ñ0Ô0Ñ€J�Øð ,Ý ‘~”~‰ˆ�Ý ‘~”~‰ˆ�Ý" 4Ñ(Ô(‰ˆ�Ý& tÑ,Ô,Ñˆ
�DÝ$ T™NœNÑˆ�TÝ% d™^œ^Ñˆ�dÝ(¨Ñ.Ô.Ñˆ�dÝ& tÑ,Ô,Ñˆ
�DÝ$ TÑ*Ô*‰ˆ�$Ý# DÑ)Ô)‰ˆ�Ý% dÑ+Ô+‰ˆ	�4Ý�ÑÔÐØÐs   Ã!C& Ã&&Dc                 óp  — t          | t          j        ¦  «        rt          | ¦  «        }nut          | t          j        ¦  «        rt          }nSt          | t          j        ¦  «        rt          }n1t          | t          j        ¦  «        rt          }nt          d¦  «        ‚t          |¦  «        }t          ¦   «         }|                     |¦  «         |                     | |¦  «         t%          j        |                     ¦   «         ¦  «                             ¦   «         }d                     |d|g¦  «        S )z&One-line public key format for OpenSSHr  r   ó    )rt   r   rÏ   r.   r
   r³   r  r   rÅ   r  r	   rá   r  r-   rò   rc   ry   r®   rû   Ú
b2a_base64r‡   Ústripr4   )r(   rï   r  r«   Úpubs        r   Úserialize_ssh_public_keyrK  ã  s  € å�*�bÔ7Ñ8Ô8ð 	1Ý" :Ñ.Ô.ˆˆÝ	�J¥Ô 0Ñ	1Ô	1ð 1ÝˆˆÝ	�J¥Ô 0Ñ	1Ô	1ð 1ÝˆˆÝ	�J¥Ô 8Ñ	9Ô	9ð 1ÝˆˆåÐ/Ñ0Ô0Ð0Ý˜hÑ'Ô'€Gå‰KŒK€EØ	×Ò�XÑÔÐØ×Ò˜* eÑ,Ô,Ð,å
Ô
˜eŸmšm™oœoÑ
.Ô
.×
4Ò
4Ñ
6Ô
6€CØ�8Š8�X˜t SÐ)Ñ*Ô*Ð*r   )Frg   )grû   r  Úrer�   Úbase64r   r5   Úcryptographyr   Úcryptography.exceptionsr   Ú)cryptography.hazmat.primitives.asymmetricr   r   r	   r
   Ú&cryptography.hazmat.primitives.ciphersr   r   r   Ú,cryptography.hazmat.primitives.serializationr   r   r   r   r   r   Úbcryptr   r   Ú_bcrypt_supportedÚImportErrorru   rN   Úboolr  r  r  Ú_ECDSA_NISTP256Ú_ECDSA_NISTP384Ú_ECDSA_NISTP521r1  Úcompiler.  rþ   Ú	_SK_STARTÚ_SK_ENDr   rÿ   r  r  ÚDOTALLrø   rv   rw   Úranger  ÚAESÚCTRÚCBCr$   ÚDictr²   ÚTyper‘   r�   r,   rÏ   r.   r6   r:   r=   r�   rE   rP   rU   rX   r\   ra   rc   r”   r¶   rÈ   rÞ   Ú	SECP256R1Ú	SECP384R1Ú	SECP521R1rñ   rò   rÜ   r´   rÆ   rä   Ú_SSH_PRIVATE_KEY_TYPESÚAnyr  r+  r³   rÅ   rá   Ú_SSH_PUBLIC_KEY_TYPESrE  rK  r’   r   r   ú<module>rj     s·  ðð €€€€Ø 	€	€	€	Ø 	€	€	€	Ø €€€Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0à Ð Ð Ð Ð Ð Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KØ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ Lðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð9Ø)Ð)Ð)Ð)Ð)Ð)àÐÐøØð 
9ð 
9ð 
9ØÐð #(ð9ð 9Øð9àð9ð ð9ð ð	9ð
  ð9ð 
ð9ð 9ð 9ð 9ð 9ð 9ð
9øøøð €Ø€Ø€Ø(€Ø(€Ø(€Ø'€à�”Ð2Ñ3Ô3€Ø€	Ø2€	Ø
.€Ø
€Ø€Ø€Ø€ð ˆ"Œ*�Y Ñ)¨GÑ3°R´YÑ
?Ô
?€ð ˆ:�i�i   a¨Ñ 0Ô 0Ñ1Ô1Ñ2Ô2€ð ”N B¨¬	°2Ð6Ø”N B¨¬	°2Ð6ðð ð ˆfŒkØ	Ø
„LØŒ�J”NÔ#ØØŒ�V”[ ¤Ô+¨V¬[¸¼Ô-CÐCÔDØð	ôðôð ð ñ ð !Ø Ø ðð €ð' Ô 9ð '¸eð 'ð 'ð 'ð 'ð  Ñ%Ø˜e‘Oð<ð <Ø
ð<àð<ð ð<ð ð	<ð <ð <ð <ð:˜Eð :¨cð :°dð :ð :ð :ð :ð8�uð 8 ð 8ð 8ð 8ð 8ð>Øð>àŒo˜eÔ$ð>ð ð>ð ð	>ð
 ˆFŒL˜œ E¤IÐ-Ô.Ô/ð>ð >ð >ð >ð?�:ð ? &¤,¨s°J¨Ô"?ð ?ð ?ð ?ð ?ð?�:ð ? &¤,¨s°J¨Ô"?ð ?ð ?ð ?ð ?ð�jð  V¤\°*¸jÐ2HÔ%Ið ð ð ð ð,�Zð , F¤L°°j°Ô$Að ,ð ,ð ,ð ,ð+�3ð +˜5ð +ð +ð +ð +ð1ð 1ð 1ð 1ð 1ñ 1ô 1ð 1ðhC,ð C,ð C,ð C,ð C,ñ C,ô C,ð C,ðLEDð EDð EDð EDð EDñ EDô EDð EDðPD8ð D8ð D8ð D8ð D8ñ D8ô D8ð D8ðN@%ð @%ð @%ð @%ð @%ñ @%ô @%ð @%ðH ˆmˆm‰oŒoØˆmˆm‰oŒoØÐ#Ð#Ñ%Ô%Ø�_�_ [°,°"´,±.´.ÑAÔAØ�_�_ [°,°"´,±.´.ÑAÔAØ�_�_ [°,°"´,±.´.ÑAÔAð€ðF˜eð Fð Fð Fð Fð  œØÔØÔØÔØÔðôÐ ð ðJð JØ
ðJàŒo˜eÔ$ðJð ŒZðJð ð	Jð Jð Jð JðZL'Ø'ðL'àðL'ð 5ðL'ð ð	L'ð L'ð L'ð L'ð^ œØÔØÔØÔØÔðôÐ ð (,ð)ð )Ø
ð)Ø œ*ð)àð)ð )ð )ð )ðX+Ð)>ð +À5ð +ð +ð +ð +ð +ð +s   ÁA ÁA0Á/A0