o
    Œõ±j›x  ã                   @   sp  d dl mZmZmZmZ ddlmZ ddlmZm	Z	m
Z
mZmZmZmZmZmZmZ ddlmZ ddlmZ ddlmZmZ eƒ Zed	krTdd
lmZmZmZmZmZ nddl m!Z!m"Z"mZm#Z#m$Z$ g d¢Z%dd„ Z&dd„ Z'dd„ Z(dd„ Z)dd„ Z*dd„ Z+dd„ Z,dd„ Z-dd„ Z.dd „ Z/d!d"„ Z0d#d$„ Z1d%d&„ Z2d'd(„ Z3d)d*„ Z4d+d,„ Z5d-d.„ Z6d/d0„ Z7d1d2„ Z8d3d4„ Z9d5S )6é    )Úunicode_literalsÚdivisionÚabsolute_importÚprint_functioné   )Úpretty_message)
Úbuffer_from_bytesÚbytes_from_bufferÚderefÚnewÚnullÚpointer_setÚstructÚstruct_bytesÚunwrapÚwrite_to_bufferé   )Ú
rand_bytes)Úbackend)Ú	type_nameÚbyte_clsÚ	winlegacy)Úadvapi32ÚAdvapi32ConstÚhandle_errorÚopen_context_handleÚclose_context_handle)ÚbcryptÚBcryptConstr   Úopen_alg_handleÚclose_alg_handle)Úaes_cbc_no_padding_decryptÚaes_cbc_no_padding_encryptÚaes_cbc_pkcs7_decryptÚaes_cbc_pkcs7_encryptÚdes_cbc_pkcs5_decryptÚdes_cbc_pkcs5_encryptÚrc2_cbc_pkcs5_decryptÚrc2_cbc_pkcs5_encryptÚrc4_decryptÚrc4_encryptÚtripledes_cbc_pkcs5_decryptÚtripledes_cbc_pkcs5_encryptc                 C   s€   t | ƒdvrttdt | ƒƒƒ‚|stdƒ}nt |ƒdkr%ttdt |ƒƒƒ‚t |ƒd dkr6ttdt |ƒƒƒ‚|td| ||dƒfS )	aß  
    Encrypts plaintext using AES in CBC mode with a 128, 192 or 256 bit key and
    no padding. This means the ciphertext must be an exact multiple of 16 bytes
    long.

    :param key:
        The encryption key - a byte string either 16, 24 or 32 bytes long

    :param data:
        The plaintext - a byte string

    :param iv:
        The initialization vector - either a byte string 16-bytes long or None
        to generate an IV

    :raises:
        ValueError - when any of the parameters contain an invalid value
        TypeError - when any of the parameters are of the wrong type
        OSError - when an error is returned by the OS crypto library

    :return:
        A tuple of two byte strings (iv, ciphertext)
    ©é   é   é    úo
            key must be either 16, 24 or 32 bytes (128, 192 or 256 bits)
            long - is %s
            r.   ú:
            iv must be 16 bytes long - is %s
            r   zJ
            data must be a multiple of 16 bytes long - is %s
            ÚaesF©ÚlenÚ
ValueErrorr   r   Ú_encrypt©ÚkeyÚdataÚiv© r<   úŠ/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/oscrypto/_win/symmetric.pyr"   -   s$   û
üür"   c                 C   óL   t | ƒdvrttdt | ƒƒƒ‚t |ƒdkrttdt |ƒƒƒ‚td| ||dƒS )a[  
    Decrypts AES ciphertext in CBC mode using a 128, 192 or 256 bit key and no
    padding.

    :param key:
        The encryption key - a byte string either 16, 24 or 32 bytes long

    :param data:
        The ciphertext - a byte string

    :param iv:
        The initialization vector - a byte string 16-bytes long

    :raises:
        ValueError - when any of the parameters contain an invalid value
        TypeError - when any of the parameters are of the wrong type
        OSError - when an error is returned by the OS crypto library

    :return:
        A byte string of the plaintext
    r-   r1   r.   r2   r3   F©r5   r6   r   Ú_decryptr8   r<   r<   r=   r!   d   s   ûür!   c                 C   s^   t | ƒdvrttdt | ƒƒƒ‚|stdƒ}nt |ƒdkr%ttdt |ƒƒƒ‚|td| ||dƒfS )a™  
    Encrypts plaintext using AES in CBC mode with a 128, 192 or 256 bit key and
    PKCS#7 padding.

    :param key:
        The encryption key - a byte string either 16, 24 or 32 bytes long

    :param data:
        The plaintext - a byte string

    :param iv:
        The initialization vector - either a byte string 16-bytes long or None
        to generate an IV

    :raises:
        ValueError - when any of the parameters contain an invalid value
        TypeError - when any of the parameters are of the wrong type
        OSError - when an error is returned by the OS crypto library

    :return:
        A tuple of two byte strings (iv, ciphertext)
    r-   r1   r.   r2   r3   Tr4   r8   r<   r<   r=   r$   �   s   û
ür$   c                 C   r>   )aG  
    Decrypts AES ciphertext in CBC mode using a 128, 192 or 256 bit key

    :param key:
        The encryption key - a byte string either 16, 24 or 32 bytes long

    :param data:
        The ciphertext - a byte string

    :param iv:
        The initialization vector - a byte string 16-bytes long

    :raises:
        ValueError - when any of the parameters contain an invalid value
        TypeError - when any of the parameters are of the wrong type
        OSError - when an error is returned by the OS crypto library

    :return:
        A byte string of the plaintext
    r-   r1   r.   r2   r3   Tr?   r8   r<   r<   r=   r#   ½   s   ûür#   c                 C   ó:   t | ƒdk st | ƒdkrttdt | ƒƒƒ‚td| |ddƒS )a×  
    Encrypts plaintext using RC4 with a 40-128 bit key

    :param key:
        The encryption key - a byte string 5-16 bytes long

    :param data:
        The plaintext - a byte string

    :raises:
        ValueError - when any of the parameters contain an invalid value
        TypeError - when any of the parameters are of the wrong type
        OSError - when an error is returned by the OS crypto library

    :return:
        A byte string of the ciphertext
    é   r.   úQ
            key must be 5 to 16 bytes (40 to 128 bits) long - is %s
            Úrc4N)r5   r6   r   r7   ©r9   r:   r<   r<   r=   r*   ç   ó   ür*   c                 C   rA   )aÓ  
    Decrypts RC4 ciphertext using a 40-128 bit key

    :param key:
        The encryption key - a byte string 5-16 bytes long

    :param data:
        The ciphertext - a byte string

    :raises:
        ValueError - when any of the parameters contain an invalid value
        TypeError - when any of the parameters are of the wrong type
        OSError - when an error is returned by the OS crypto library

    :return:
        A byte string of the plaintext
    rB   r.   rC   rD   Nr?   rE   r<   r<   r=   r)     rF   r)   c                 C   sj   t | ƒdk st | ƒdkrttdt | ƒƒƒ‚|stdƒ}nt |ƒdkr+ttdt |ƒƒƒ‚|td| ||dƒfS )ab  
    Encrypts plaintext using RC2 with a 64 bit key

    :param key:
        The encryption key - a byte string 8 bytes long

    :param data:
        The plaintext - a byte string

    :param iv:
        The 8-byte initialization vector to use - a byte string - set as None
        to generate an appropriate one

    :raises:
        ValueError - when any of the parameters contain an invalid value
        TypeError - when any of the parameters are of the wrong type
        OSError - when an error is returned by the OS crypto library

    :return:
        A tuple of two byte strings (iv, ciphertext)
    rB   r.   rC   é   ú9
            iv must be 8 bytes long - is %s
            Úrc2Tr4   r8   r<   r<   r=   r(   #  s   ü
ür(   c                 C   sX   t | ƒdk st | ƒdkrttdt | ƒƒƒ‚t |ƒdkr$ttdt |ƒƒƒ‚td| ||dƒS )a"  
    Decrypts RC2 ciphertext using a 64 bit key

    :param key:
        The encryption key - a byte string 8 bytes long

    :param data:
        The ciphertext - a byte string

    :param iv:
        The initialization vector used for encryption - a byte string

    :raises:
        ValueError - when any of the parameters contain an invalid value
        TypeError - when any of the parameters are of the wrong type
        OSError - when an error is returned by the OS crypto library

    :return:
        A byte string of the plaintext
    rB   r.   rC   rG   rH   rI   Tr?   r8   r<   r<   r=   r'   O  s   üür'   c                 C   s~   t | ƒdkrt | ƒdkrttdt | ƒƒƒ‚|stdƒ}nt |ƒdkr+ttdt |ƒƒƒ‚d}t | ƒdkr5d}|t|| ||dƒfS )	a„  
    Encrypts plaintext using 3DES in either 2 or 3 key mode

    :param key:
        The encryption key - a byte string 16 or 24 bytes long (2 or 3 key mode)

    :param data:
        The plaintext - a byte string

    :param iv:
        The 8-byte initialization vector to use - a byte string - set as None
        to generate an appropriate one

    :raises:
        ValueError - when any of the parameters contain an invalid value
        TypeError - when any of the parameters are of the wrong type
        OSError - when an error is returned by the OS crypto library

    :return:
        A tuple of two byte strings (iv, ciphertext)
    r.   r/   úW
            key must be 16 bytes (2 key) or 24 bytes (3 key) long - is %s
            rG   rH   Útripledes_3keyÚtripledes_2keyTr4   ©r9   r:   r;   Úcipherr<   r<   r=   r,   x  s    ü
ür,   c                 C   sl   t | ƒdkrt | ƒdkrttdt | ƒƒƒ‚t |ƒdkr$ttdt |ƒƒƒ‚d}t | ƒdkr.d}t|| ||dƒS )	aC  
    Decrypts 3DES ciphertext in either 2 or 3 key mode

    :param key:
        The encryption key - a byte string 16 or 24 bytes long (2 or 3 key mode)

    :param data:
        The ciphertext - a byte string

    :param iv:
        The initialization vector used for encryption - a byte string

    :raises:
        ValueError - when any of the parameters contain an invalid value
        TypeError - when any of the parameters are of the wrong type
        OSError - when an error is returned by the OS crypto library

    :return:
        A byte string of the plaintext
    r.   r/   rJ   rG   rH   rK   rL   Tr?   rM   r<   r<   r=   r+   ¨  s   üür+   c                 C   s^   t | ƒdkrttdt | ƒƒƒ‚|stdƒ}nt |ƒdkr%ttdt |ƒƒƒ‚|td| ||dƒfS )a‹  
    Encrypts plaintext using DES with a 56 bit key

    :param key:
        The encryption key - a byte string 8 bytes long (includes error
        correction bits)

    :param data:
        The plaintext - a byte string

    :param iv:
        The 8-byte initialization vector to use - a byte string - set as None
        to generate an appropriate one

    :raises:
        ValueError - when any of the parameters contain an invalid value
        TypeError - when any of the parameters are of the wrong type
        OSError - when an error is returned by the OS crypto library

    :return:
        A tuple of two byte strings (iv, ciphertext)
    rG   úT
            key must be 8 bytes (56 bits + 8 parity bits) long - is %s
            rH   ÚdesTr4   r8   r<   r<   r=   r&   Õ  s   ü
ür&   c                 C   sL   t | ƒdkrttdt | ƒƒƒ‚t |ƒdkrttdt |ƒƒƒ‚td| ||dƒS )aK  
    Decrypts DES ciphertext using a 56 bit key

    :param key:
        The encryption key - a byte string 8 bytes long (includes error
        correction bits)

    :param data:
        The ciphertext - a byte string

    :param iv:
        The initialization vector used for encryption - a byte string

    :raises:
        ValueError - when any of the parameters contain an invalid value
        TypeError - when any of the parameters are of the wrong type
        OSError - when an error is returned by the OS crypto library

    :return:
        A byte string of the plaintext
    rG   rO   rH   rP   Tr?   r8   r<   r<   r=   r%     s   üür%   c                 C   s¾  d}| dkrt jt jt jdœt|ƒ }nt jt jt jt jt j	dœ|  }t j
}t|dd�}ttdƒ}t|ƒ}t j|_t j|_d|_||_ttd	ƒ}t|ƒ}	||	_t|ƒ|	_t|ƒ| }
d}| td
dgƒv rmt|ƒdkrmt j}ttdƒ}t ||
t|
ƒtƒ ||¡}t|ƒ t|ƒ}| d
kr¢ttdt|ƒd ƒ}t |t j|d¡}t|ƒ | dkrÛt |t j |d¡}t|ƒ ttdt j!ƒ}t |t j"|d¡}t|ƒ ttdt j#ƒ}t |t j$|d¡}t|ƒ ||fS )a  
    Creates an HCRYPTPROV and HCRYPTKEY for symmetric encryption/decryption. The
    HCRYPTPROV must be released by close_context_handle() and the
    HCRYPTKEY must be released by advapi32.CryptDestroyKey() when done.

    :param cipher:
        A unicode string of "aes", "des", "tripledes_2key", "tripledes_3key",
        "rc2", "rc4"

    :param key:
        A byte string of the symmetric key

    :param iv:
        The initialization vector - a byte string - unused for RC4

    :return:
        A tuple of (HCRYPTPROV, HCRYPTKEY)
    Nr3   r-   )rP   rL   rK   rI   rD   F)Úverify_onlyÚ
BLOBHEADERr   ÚPLAINTEXTKEYBLOBrI   rD   rB   zHCRYPTKEY *úDWORD *rG   )%r   ÚCALG_AES_128ÚCALG_AES_192ÚCALG_AES_256r5   ÚCALG_DESÚCALG_3DES_112Ú	CALG_3DESÚCALG_RC2ÚCALG_RC4ÚMS_ENH_RSA_AES_PROVr   r   r   r   rS   ÚbTypeÚCUR_BLOB_VERSIONÚbVersionÚreservedÚaiKeyAlgÚhdrÚ	dwKeySizer   ÚsetÚCRYPT_NO_SALTr   ÚCryptImportKeyr   r   ÚCryptSetKeyParamÚKP_EFFECTIVE_KEYLENÚKP_IVÚCRYPT_MODE_CBCÚKP_MODEÚPKCS5_PADDINGÚ
KP_PADDING)rN   r9   r;   Úcontext_handleÚalgorithm_idÚproviderÚblob_header_pointerÚblob_headerÚblob_struct_pointerÚblob_structÚblobÚflagsÚkey_handle_pointerÚresÚ
key_handleÚbufr<   r<   r=   Ú_advapi32_create_handles,  sš   ýüûú



úüüüür|   c                 C   s  d}t jt jt jt jt jt jdœ|  }zet|ƒ}t j}t	t
dƒ}t|ƒ}t j|_t j|_t|ƒ|_t|ƒ| }| dkrStt
dt|ƒd ƒ}t
 |t j|dd¡}	t|	ƒ tt
d	ƒ}
t
 |tƒ ||
tƒ d|t|ƒd¡	}	t|	ƒ t|
ƒW |rxt|ƒ S S |r€t|ƒ w w )
ao  
    Creates a BCRYPT_KEY_HANDLE for symmetric encryption/decryption. The
    handle must be released by bcrypt.BCryptDestroyKey() when done.

    :param cipher:
        A unicode string of "aes", "des", "tripledes_2key", "tripledes_3key",
        "rc2", "rc4"

    :param key:
        A byte string of the symmetric key

    :return:
        A BCRYPT_KEY_HANDLE
    N)r3   rP   rL   rK   rI   rD   ÚBCRYPT_KEY_DATA_BLOB_HEADERrI   rT   rG   é   r   zBCRYPT_KEY_HANDLE *)r   ÚBCRYPT_AES_ALGORITHMÚBCRYPT_DES_ALGORITHMÚBCRYPT_3DES_112_ALGORITHMÚBCRYPT_3DES_ALGORITHMÚBCRYPT_RC2_ALGORITHMÚBCRYPT_RC4_ALGORITHMr   ÚBCRYPT_KEY_DATA_BLOBr   r   r   ÚBCRYPT_KEY_DATA_BLOB_MAGICÚdwMagicÚBCRYPT_KEY_DATA_BLOB_VERSION1Ú	dwVersionr5   Ú	cbKeyDatar   r   ÚBCryptSetPropertyÚBCRYPT_EFFECTIVE_KEY_LENGTHr   ÚBCryptImportKeyr   r    )rN   r9   Ú
alg_handleÚalg_constantÚ	blob_typert   ru   rv   r{   ry   rx   r<   r<   r=   Ú_bcrypt_create_key_handle›  s`   úù	

û
÷
ÿ
ÿr‘   c                 C   s°   t |tƒsttdt|ƒƒƒ‚t |tƒsttdt|ƒƒƒ‚| dkr.t |tƒs.ttdt|ƒƒƒ‚| dkrD|sD| dkr@t|ƒd dksDtdƒ‚td	krPt| ||||ƒS t	| ||||ƒS )
aÒ  
    Encrypts plaintext

    :param cipher:
        A unicode string of "aes", "des", "tripledes_2key", "tripledes_3key",
        "rc2", "rc4"

    :param key:
        The encryption key - a byte string 5-16 bytes long

    :param data:
        The plaintext - a byte string

    :param iv:
        The initialization vector - a byte string - unused for RC4

    :param padding:
        Boolean, if padding should be used - unused for RC4

    :raises:
        ValueError - when any of the parameters contain an invalid value
        TypeError - when any of the parameters are of the wrong type
        OSError - when an error is returned by the OS crypto library

    :return:
        A byte string of the ciphertext
    ú;
            key must be a byte string, not %s
            ú<
            data must be a byte string, not %s
            rD   ú:
            iv must be a byte string, not %s
            r3   r.   r   úpadding must be specifiedr   )
Ú
isinstancer   Ú	TypeErrorr   r   r5   r6   Ú_backendÚ_advapi32_encryptÚ_bcrypt_encrypt©rN   r9   r:   r;   Úpaddingr<   r<   r=   r7   â  s*   
ü
üür7   c              	   C   s  d}d}zst | ||ƒ\}}ttdt|ƒƒ}t |tƒ ddtƒ |d¡}t|ƒ t|ƒ}	t|	ƒ}
t	|
|ƒ t
|t|ƒƒ t |tƒ dd|
||	¡}t|ƒ t|
t|ƒƒ}| dkrg|sgt|ƒt|ƒd krg|dd… }|W |rpt |¡ |rwt|ƒ S S |rt |¡ |r†t|ƒ w w )aà  
    Encrypts plaintext via CryptoAPI

    :param cipher:
        A unicode string of "aes", "des", "tripledes_2key", "tripledes_3key",
        "rc2", "rc4"

    :param key:
        The encryption key - a byte string 5-16 bytes long

    :param data:
        The plaintext - a byte string

    :param iv:
        The initialization vector - a byte string - unused for RC4

    :param padding:
        Boolean, if padding should be used - unused for RC4

    :raises:
        ValueError - when any of the parameters contain an invalid value
        TypeError - when any of the parameters are of the wrong type
        OSError - when an error is returned by the OS crypto library

    :return:
        A byte string of the ciphertext
    NrT   Tr   r3   r.   iðÿÿÿ)r|   r   r   r5   ÚCryptEncryptr   r   r
   r   r   r   r	   ÚCryptDestroyKeyr   )rN   r9   r:   r;   rœ   ro   rz   Úout_lenry   Ú
buffer_lenÚbufferÚoutputr<   r<   r=   r™   "  sV   ù	
ù	 

ÿþ

ÿr™   c                 C   óî   d}zkt | |ƒ}|du rd}nt|ƒ}d}|du rtj}ttdƒ}t ||t|ƒtƒ tƒ dtƒ d||¡
}	t|	ƒ t	|ƒ}
t
|
ƒ}|rFt
|ƒntƒ }t ||t|ƒtƒ ||||
||¡
}	t|	ƒ t|t	|ƒƒW |rmt |¡ S S |rvt |¡ w w )aÚ  
    Encrypts plaintext via CNG

    :param cipher:
        A unicode string of "aes", "des", "tripledes_2key", "tripledes_3key",
        "rc2", "rc4"

    :param key:
        The encryption key - a byte string 5-16 bytes long

    :param data:
        The plaintext - a byte string

    :param iv:
        The initialization vector - a byte string - unused for RC4

    :param padding:
        Boolean, if padding should be used - unused for RC4

    :raises:
        ValueError - when any of the parameters contain an invalid value
        TypeError - when any of the parameters are of the wrong type
        OSError - when an error is returned by the OS crypto library

    :return:
        A byte string of the ciphertext
    Nr   TúULONG *)r‘   r5   r   ÚBCRYPT_BLOCK_PADDINGr   r   ÚBCryptEncryptr   r   r
   r   r	   ÚBCryptDestroyKey©rN   r9   r:   r;   rœ   rz   Úiv_lenrw   rŸ   ry   r    r¡   Ú	iv_bufferr<   r<   r=   rš   q  óZ   

ööÿÿrš   c                 C   s    t |tƒsttdt|ƒƒƒ‚t |tƒsttdt|ƒƒƒ‚| dkr.t |tƒs.ttdt|ƒƒƒ‚| tddgƒvr<|s<tdƒ‚tdkrHt| ||||ƒS t	| ||||ƒS )aè  
    Decrypts AES/RC4/RC2/3DES/DES ciphertext

    :param cipher:
        A unicode string of "aes", "des", "tripledes_2key", "tripledes_3key",
        "rc2", "rc4"

    :param key:
        The encryption key - a byte string 5-16 bytes long

    :param data:
        The ciphertext - a byte string

    :param iv:
        The initialization vector - a byte string - unused for RC4

    :param padding:
        Boolean, if padding should be used - unused for RC4

    :raises:
        ValueError - when any of the parameters contain an invalid value
        TypeError - when any of the parameters are of the wrong type
        OSError - when an error is returned by the OS crypto library

    :return:
        A byte string of the plaintext
    r’   r“   rD   r”   r3   r•   r   )
r–   r   r—   r   r   re   r6   r˜   Ú_advapi32_decryptÚ_bcrypt_decryptr›   r<   r<   r=   r@   Ä  s(   
ü
üür@   c           
   	   C   sÎ   d}d}zSt | ||ƒ\}}| dkr|st|ƒd dkrtdƒ‚t|ƒ}ttdt|ƒƒ}t |tƒ | dkr8|s8dndd||¡}	t|	ƒ t	|t
|ƒƒW |rPt |¡ |rWt|ƒ S S |r_t |¡ |rft|ƒ w w )	aö  
    Decrypts AES/RC4/RC2/3DES/DES ciphertext via CryptoAPI

    :param cipher:
        A unicode string of "aes", "des", "tripledes_2key", "tripledes_3key",
        "rc2", "rc4"

    :param key:
        The encryption key - a byte string 5-16 bytes long

    :param data:
        The ciphertext - a byte string

    :param iv:
        The initialization vector - a byte string - unused for RC4

    :param padding:
        Boolean, if padding should be used - unused for RC4

    :raises:
        ValueError - when any of the parameters contain an invalid value
        TypeError - when any of the parameters are of the wrong type
        OSError - when an error is returned by the OS crypto library

    :return:
        A byte string of the plaintext
    Nr3   r.   r   z9Invalid data - ciphertext length must be a multiple of 16rT   FT)r|   r5   r6   r   r   r   ÚCryptDecryptr   r   r	   r
   rž   r   )
rN   r9   r:   r;   rœ   ro   rz   r¡   rŸ   ry   r<   r<   r=   r¬     s8   ø


ÿþ

ÿr¬   c                 C   r£   )að  
    Decrypts AES/RC4/RC2/3DES/DES ciphertext via CNG

    :param cipher:
        A unicode string of "aes", "des", "tripledes_2key", "tripledes_3key",
        "rc2", "rc4"

    :param key:
        The encryption key - a byte string 5-16 bytes long

    :param data:
        The ciphertext - a byte string

    :param iv:
        The initialization vector - a byte string - unused for RC4

    :param padding:
        Boolean, if padding should be used - unused for RC4

    :raises:
        ValueError - when any of the parameters contain an invalid value
        TypeError - when any of the parameters are of the wrong type
        OSError - when an error is returned by the OS crypto library

    :return:
        A byte string of the plaintext
    Nr   Tr¤   )r‘   r5   r   r¥   r   r   ÚBCryptDecryptr   r   r
   r   r	   r§   r¨   r<   r<   r=   r­   >  r«   r­   N):Ú
__future__r   r   r   r   Ú_errorsr   Ú_ffir   r	   r
   r   r   r   r   r   r   r   Úutilr   Ú r   Ú_typesr   r   r˜   Ú	_advapi32r   r   r   r   r   Ú_cngr   r   r   r    Ú__all__r"   r!   r$   r#   r*   r)   r(   r'   r,   r+   r&   r%   r|   r‘   r7   r™   rš   r@   r¬   r­   r<   r<   r<   r=   Ú<module>   s>   07+.*,)0--*oG@OS==