§
    HŠtj_W  ã                   óÌ  — d Z ddlZddlZ ej        e¦  «        ZddlmZ ddlm	Z	m
Z
mZ ddlmZmZ ddlmZmZmZmZmZ ddlmZ ddlmc mZ g d¢Zd	Zd
„ Zd„ Zd„ Zd„ Z  G d„ dej!        ej"        ej#        ej$        ¦  «        Z% G d„ dej"        ej&        ej#        ej$        ¦  «        Z' G d„ dej#        ej$        ¦  «        Z( G d„ dej!        ej#        ej$        ¦  «        Z)dS )zFpasslib.handlers.des_crypt - traditional unix (DES) crypt and variantsé    N)Úwarn)Ú
safe_cryptÚ
test_cryptÚ
to_unicode)Úh64Úh64big)Úbyte_elem_valueÚuÚuascii_to_strÚunicodeÚsuppress_cause)Údes_encrypt_int_block)Ú	des_cryptÚ
bsdi_cryptÚbigcryptÚcrypt16ó    c                 ó^   — t          d„ t          | dd…         ¦  «        D ¦   «         ¦  «        S )zØconvert secret to 64-bit DES key.

    this only uses the first 8 bytes of the secret,
    and discards the high 8th bit of each byte at that.
    a null parity bit is inserted after every 7th bit of the output.
    c              3   óR   K  — | ]"\  }}t          |¦  «        d z  d|dz  z
  z  V — Œ#dS )é   é9   é   N)r	   )Ú.0ÚiÚcs      úX/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/passlib/handlers/des_crypt.pyú	<genexpr>z'_crypt_secret_to_key.<locals>.<genexpr>(   sT   è è € ð 2ð 2Ù�1�aõ   Ñ"Ô" TÑ)¨r°!°A±#©vÑ6ð 2ð 2ð 2ð 2ð 2ð 2ó    Nr   )ÚsumÚ	enumerate)Úsecrets    r   Ú_crypt_secret_to_keyr"      sB   € õ ð 2ð 2Ý$ V¨B¨Q¨B¤ZÑ0Ô0ð2ñ 2ô 2ñ 2ô 2ð 2r   c                 óš  — t          |¦  «        dk    sJ ‚t          j        |¦  «        }t          | t          ¦  «        r|                      d¦  «        } t          | t          ¦  «        sJ ‚t          | v r$t          j	         
                    t          ¦  «        ‚t          | ¦  «        }t          |d|d¦  «        }t          j        |¦  «        S )z pure-python backed for des_crypté   úutf-8r   é   )Úlenr   Údecode_int12Ú
isinstancer   ÚencodeÚbytesÚ_BNULLÚuhÚexcÚNullPasswordErrorr   r"   r   r   Úencode_int64)r!   ÚsaltÚ
salt_valueÚ	key_valueÚresults        r   Ú_raw_des_cryptr5   +   s¼   € åˆt‰9Œ9˜Š>ˆ>ˆ>ˆ>õ Ô! $Ñ'Ô'€Jõ �&�'Ñ"Ô"ð (Ø—’˜wÑ'Ô'ˆÝ�f�eÑ$Ô$Ð$Ð$Ð$õ �ÐÐÝŒf×&Ò&¥yÑ1Ô1Ð1õ % VÑ,Ô,€Iõ # 9¨a°¸RÑ@Ô@€Fõ Ô˜vÑ&Ô&Ð&r   c                 óÀ   — t          | ¦  «        }d}t          | ¦  «        }||k     r7|dz   }t          | ||…         ¦  «        }t          ||¦  «        |z  }|}||k     °7|S )z,convert secret to DES key used by bsdi_cryptr   )r"   r'   r   )r!   r3   ÚidxÚendÚnextÚ	tmp_values         r   Ú_bsdi_secret_to_keyr;   I   ss   € å$ VÑ,Ô,€IØ
€CÝ
ˆf‰+Œ+€CØ
�Š)ˆ)Ø�Q‰wˆÝ(¨°°D°Ô)9Ñ:Ô:ˆ	Ý)¨)°YÑ?Ô?À)ÑKˆ	Øˆð	 �Š)ˆ)ð
 Ðr   c                 óp  — t          j        |¦  «        }t          | t          ¦  «        r|                      d¦  «        } t          | t
          ¦  «        sJ ‚t          | v r$t          j         	                    t          ¦  «        ‚t          | ¦  «        }t          |d||¦  «        }t          j        |¦  «        S )z"pure-python backend for bsdi_cryptr%   r   )r   Údecode_int24r)   r   r*   r+   r,   r-   r.   r/   r   r;   r   r   r0   )r!   Úroundsr1   r2   r3   r4   s         r   Ú_raw_bsdi_cryptr?   U   s©   € õ Ô! $Ñ'Ô'€Jõ �&�'Ñ"Ô"ð (Ø—’˜wÑ'Ô'ˆÝ�f�eÑ$Ô$Ð$Ð$Ð$õ �ÐÐÝŒf×&Ò&¥zÑ2Ô2Ð2õ $ FÑ+Ô+€Iõ # 9¨a°¸VÑDÔD€Fõ Ô˜vÑ&Ô&Ð&r   c                   óò   — e Zd ZdZd ZdZej        ZdZ	dxZ
Zej        ZdZ ej         ed¦  «        ej        ej        z  ¦  «        Zed„ ¦   «         Zd„ Zd	„ Zd
Zed„ ¦   «         Zd„ Zed„ ¦   «         Zd„ ZdS )r   a›  This class implements the des-crypt password hash, and follows the :ref:`password-hash-api`.

    It supports a fixed-length salt.

    The :meth:`~passlib.ifc.PasswordHash.using` method accepts the following optional keywords:

    :type salt: str
    :param salt:
        Optional salt string.
        If not specified, one will be autogenerated (this is recommended).
        If specified, it must be 2 characters, drawn from the regexp range ``[./0-9A-Za-z]``.

    :param bool truncate_error:
        By default, des_crypt will silently truncate passwords larger than 8 bytes.
        Setting ``truncate_error=True`` will cause :meth:`~passlib.ifc.PasswordHash.hash`
        to raise a :exc:`~passlib.exc.PasswordTruncateError` instead.

        .. versionadded:: 1.7

    :type relaxed: bool
    :param relaxed:
        By default, providing an invalid value for one of the other
        keywords will result in a :exc:`ValueError`. If ``relaxed=True``,
        and the error can be corrected, a :exc:`~passlib.exc.PasslibHashWarning`
        will be issued instead. Correctable errors include
        ``salt`` strings that are too long.

        .. versionadded:: 1.6
    ©r1   Útruncate_erroré   r$   r   zU
        ^
        (?P<salt>[./a-z0-9]{2})
        (?P<chk>[./a-z0-9]{11})?
        $c                 ój   — t          |dd¦  «        }|d d…         |dd …         }} | ||pd ¬¦  «        S )NÚasciiÚhashr$   ©r1   Úchecksum)r   )ÚclsrF   r1   Úchks       r   Úfrom_stringzdes_crypt.from_string´   sE   € å˜$ ¨Ñ0Ô0ˆØ˜˜!˜”H˜d 1 2 2œhˆcˆØˆs˜ s {¨dÐ3Ñ3Ô3Ð3r   c                 ó\   — t          d¦  «        | j        | j        fz  }t          |¦  «        S ©Nz%s%s©r
   r1   rH   r   ©ÚselfrF   s     r   Ú	to_stringzdes_crypt.to_stringº   ó)   € Ý�‰yŒy˜DœI t¤}Ð5Ñ5ˆÝ˜TÑ"Ô"Ð"r   c                 ód   — | j         r|                      |¦  «         |                      |¦  «        S )N)Úuse_defaultsÚ_check_truncate_policyÚ_calc_checksum_backend©rP   r!   s     r   Ú_calc_checksumzdes_crypt._calc_checksumÁ   s5   € àÔð 	0Ø×'Ò'¨Ñ/Ô/Ð/à×*Ò*¨6Ñ2Ô2Ð2r   ©Úos_cryptÚbuiltinc                 ó^   — t          dd¦  «        r|                      | j        ¦  «         dS dS )NÚtestÚabgOeLfPimXQoTF©r   Ú_set_calc_checksum_backendÚ_calc_checksum_os_crypt©rI   s    r   Ú_load_backend_os_cryptz des_crypt._load_backend_os_cryptÐ   s5   € å�f˜oÑ.Ô.ð 	Ø×*Ò*¨3Ô+FÑGÔGÐGØ�4à�5r   c                 ó  — t          || j        ¦  «        }|€|                      |¦  «        S |                     | j        ¦  «        rt	          |¦  «        dk    r&t
          j                             | | j        |¦  «        ‚|dd …         S )Né   r$   )r   r1   Ú_calc_checksum_builtinÚ
startswithr'   r-   r.   ÚCryptBackendError)rP   r!   rF   s      r   ra   z!des_crypt._calc_checksum_os_cryptØ   s~   € õ ˜& $¤)Ñ,Ô,ˆØˆ<ð ×.Ò.¨vÑ6Ô6Ð6Ø�Š˜tœyÑ)Ô)ð 	B­S°©Y¬Y¸"ª_¨_Ý”&×*Ò*¨4°´¸DÑAÔAÐAØ�A�B�BŒxˆr   c                 ó:   — |                       | j        ¦  «         dS ©NT©r`   rf   rb   s    r   Ú_load_backend_builtinzdes_crypt._load_backend_builtinç   ó   € à×&Ò& sÔ'AÑBÔBÐBØˆtr   c                 óx   — t          || j                             d¦  «        ¦  «                             d¦  «        S ©NrE   )r5   r1   r*   ÚdecoderW   s     r   rf   z des_crypt._calc_checksum_builtinì   s0   € Ý˜f d¤i×&6Ò&6°wÑ&?Ô&?Ñ@Ô@×GÒGÈÑPÔPÐPr   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚnameÚsetting_kwdsr-   ÚHASH64_CHARSÚchecksum_charsÚchecksum_sizeÚmin_salt_sizeÚmax_salt_sizeÚ
salt_charsÚtruncate_sizeÚreÚcompiler
   ÚXÚIÚ_hash_regexÚclassmethodrK   rQ   rX   Úbackendsrc   ra   rl   rf   © r   r   r   r   p   s!  € € € € € ðð ðH €DØ-€Lð
 ”_€NØ€Mð
 %&Ð%€M�MØ”€Jð
 €Mð �"”*˜Q˜Qð  ñ ô ð Œt�B”D‰yñ	ô €Kð ð4ð 4ñ „[ð4ð
#ð #ð #ð3ð 3ð 3ð '€Hð
 ðð ñ „[ðð
ð 
ð 
ð ðð ñ „[ððQð Qð Qð Qð Qr   r   c                   ó@  ‡ — e Zd ZdZd ZdZdZej        Z	dxZ
Zej        ZdZdZdZdZ ej         ed	¦  «        ej        ej        z  ¦  «        Zed
„ ¦   «         Zd„ ZdZeˆ fd„¦   «         Zeˆ fd„¦   «         Zˆ fd„ZdZed„ ¦   «         Zd„ Z ed„ ¦   «         Z!d„ Z"ˆ xZ#S )r   a
  This class implements the BSDi-Crypt password hash, and follows the :ref:`password-hash-api`.

    It supports a fixed-length salt, and a variable number of rounds.

    The :meth:`~passlib.ifc.PasswordHash.using` method accepts the following optional keywords:

    :type salt: str
    :param salt:
        Optional salt string.
        If not specified, one will be autogenerated (this is recommended).
        If specified, it must be 4 characters, drawn from the regexp range ``[./0-9A-Za-z]``.

    :type rounds: int
    :param rounds:
        Optional number of rounds to use.
        Defaults to 5001, must be between 1 and 16777215, inclusive.

    :type relaxed: bool
    :param relaxed:
        By default, providing an invalid value for one of the other
        keywords will result in a :exc:`ValueError`. If ``relaxed=True``,
        and the error can be corrected, a :exc:`~passlib.exc.PasslibHashWarning`
        will be issued instead. Correctable errors include ``rounds``
        that are too small or too large, and ``salt`` strings that are too long.

        .. versionadded:: 1.6

    .. versionchanged:: 1.6
        :meth:`hash` will now issue a warning if an even number of rounds is used
        (see :ref:`bsdi-crypt-security-issues` regarding weak DES keys).
    )r1   r>   rC   é   i‰  é   iÿÿÿ Úlinearz�
        ^
        _
        (?P<rounds>[./a-z0-9]{4})
        (?P<salt>[./a-z0-9]{4})
        (?P<chk>[./a-z0-9]{11})?
        $c                 ó6  — t          |dd¦  «        }| j                             |¦  «        }|st          j                             | ¦  «        ‚|                     ddd¦  «        \  }}} | t          j        | 	                    d¦  «        ¦  «        ||¬¦  «        S )NrE   rF   r>   r1   rJ   )r>   r1   rH   )
r   r‚   Úmatchr-   r.   ÚInvalidHashErrorÚgroupr   r=   r*   )rI   rF   Úmr>   r1   rJ   s         r   rK   zbsdi_crypt.from_string4  s›   € å˜$ ¨Ñ0Ô0ˆØŒO×!Ò! $Ñ'Ô'ˆØð 	/Ý”&×)Ò)¨#Ñ.Ô.Ð.ØŸGšG H¨f°eÑ<Ô<Ñˆ��cØˆsÝÔ# F§M¢M°'Ñ$:Ô$:Ñ;Ô;ØØð
ñ 
ô 
ð 	
r   c                 ó²   — t          d¦  «        t          j        | j        ¦  «                             d¦  «        | j        | j        fz  }t          |¦  «        S )Nz_%s%s%srE   )r
   r   Úencode_int24r>   rp   r1   rH   r   rO   s     r   rQ   zbsdi_crypt.to_stringA  sK   € Ý�‰|Œ|�sÔ/°´Ñ<Ô<×CÒCÀGÑLÔLØ#œy¨$¬-ð9ñ 9ˆå˜TÑ"Ô"Ð"r   Tc                 óš   •—  t          t          | ¦  «        j        di |¤Ž}|j        dz  st	          dt
          j        j        ¦  «         |S )Nrˆ   zHbsdi_crypt rounds should be odd, as even rounds may reveal weak DES keysr…   )Úsuperr   ÚusingÚdefault_roundsr   r-   r.   ÚPasslibSecurityWarning)rI   ÚkwdsÚsubclsÚ	__class__s      €r   r“   zbsdi_crypt.usingN  sW   ø€ à-••z 3Ñ'Ô'Ô-Ð5Ð5°Ð5Ð5ˆØÔ$ qÑ(ð 	0åÐ[Ý”Ô.ñ0ô 0ð 0àˆr   c                 ó\   •— t          t          | ¦  «                             ¦   «         }|dz  S )Nrˆ   )r’   r   Ú_generate_rounds)rI   r>   r˜   s     €r   rš   zbsdi_crypt._generate_roundsW  s)   ø€ å•z 3Ñ'Ô'×8Ò8Ñ:Ô:ˆð �a‰xˆr   c                 ó\   •— | j         dz  sdS  t          t          | ¦  «        j        di |¤ŽS )Nrˆ   Tr…   )r>   r’   r   Ú_calc_needs_update)rP   r–   r˜   s     €r   rœ   zbsdi_crypt._calc_needs_updatee  s9   ø€ àŒ{˜Q‰ð 	Ø�4à9�u•Z Ñ&Ô&Ô9ÐAÐA¸DÐAÐAÐAr   rY   c                 ó^   — t          dd¦  «        r|                      | j        ¦  «         dS dS )Nr]   z_/...lLDAxARksGCHin.TFr_   rb   s    r   rc   z!bsdi_crypt._load_backend_os_cryptt  s6   € å�fÐ4Ñ5Ô5ð 	Ø×*Ò*¨3Ô+FÑGÔGÐGØ�4à�5r   c                 ó.  — |                       ¦   «         }t          ||¦  «        }|€|                      |¦  «        S |                     |d d…         ¦  «        rt	          |¦  «        dk    r!t
          j                             | ||¦  «        ‚|dd …         S )Né	   é   éõÿÿÿ)rQ   r   rf   rg   r'   r-   r.   rh   )rP   r!   ÚconfigrF   s       r   ra   z"bsdi_crypt._calc_checksum_os_crypt|  s�   € Ø—’Ñ!Ô!ˆÝ˜& &Ñ)Ô)ˆØˆ<ð ×.Ò.¨vÑ6Ô6Ð6Ø�Š˜v b q bœzÑ*Ô*ð 	?­c°$©i¬i¸2ªo¨oÝ”&×*Ò*¨4°¸Ñ>Ô>Ð>Ø�C�D�DŒzÐr   c                 ó:   — |                       | j        ¦  «         dS rj   rk   rb   s    r   rl   z bsdi_crypt._load_backend_builtinŠ  rm   r   c                 ó„   — t          || j        | j                             d¦  «        ¦  «                             d¦  «        S ro   )r?   r>   r1   r*   rp   rW   s     r   rf   z!bsdi_crypt._calc_checksum_builtin�  s5   € Ý˜v t¤{°D´I×4DÒ4DÀWÑ4MÔ4MÑNÔN×UÒUÐV]Ñ^Ô^Ð^r   )$rq   rr   rs   rt   ru   rv   ry   r-   rw   rx   rz   r{   r|   r”   Ú
min_roundsÚ
max_roundsÚrounds_costr~   r   r
   r€   r�   r‚   rƒ   rK   rQ   Ú_avoid_even_roundsr“   rš   rœ   r„   rc   ra   rl   rf   Ú__classcell__©r˜   s   @r   r   r   ó   sš  ø€ € € € € ðð ðF €DØ%€LØ€MØ”_€Nð %&Ð%€M�MØ”€Jð €NØ€JØ€JØ€Kð �"”*˜Q˜Qð  ñ ô ð Œt�B”D‰yñô €Kð ð

ð 

ñ „[ð

ð#ð #ð #ð Ðàðð ð ð ñ „[ðð ðð ð ð ñ „[ððBð Bð Bð Bð Bð '€Hð
 ðð ñ „[ðð	ð 	ð 	ð ðð ñ „[ðð_ð _ð _ð _ð _ð _ð _r   r   c                   óÀ   ‡ — e Zd ZdZd ZdZej        ZdxZ	Z
ej        Z ej         ed¦  «        ej        ej        z  ¦  «        Zed„ ¦   «         Zd„ Zd
ˆ fd„	Zd	„ Zˆ xZS )r   ag  This class implements the BigCrypt password hash, and follows the :ref:`password-hash-api`.

    It supports a fixed-length salt.

    The :meth:`~passlib.ifc.PasswordHash.using` method accepts the following optional keywords:

    :type salt: str
    :param salt:
        Optional salt string.
        If not specified, one will be autogenerated (this is recommended).
        If specified, it must be 22 characters, drawn from the regexp range ``[./0-9A-Za-z]``.

    :type relaxed: bool
    :param relaxed:
        By default, providing an invalid value for one of the other
        keywords will result in a :exc:`ValueError`. If ``relaxed=True``,
        and the error can be corrected, a :exc:`~passlib.exc.PasslibHashWarning`
        will be issued instead. Correctable errors include
        ``salt`` strings that are too long.

        .. versionadded:: 1.6
    )r1   r$   zX
        ^
        (?P<salt>[./a-z0-9]{2})
        (?P<chk>([./a-z0-9]{11})+)?
        $c                 óæ   — t          |dd¦  «        }| j                             |¦  «        }|st          j                             | ¦  «        ‚|                     dd¦  «        \  }} | ||¬¦  «        S ©NrE   rF   r1   rJ   rG   ©r   r‚   r‹   r-   r.   rŒ   r�   ©rI   rF   rŽ   r1   rJ   s        r   rK   zbigcrypt.from_stringÃ  ór   € å˜$ ¨Ñ0Ô0ˆØŒO×!Ò! $Ñ'Ô'ˆØð 	/Ý”&×)Ò)¨#Ñ.Ô.Ð.Ø—G’G˜F EÑ*Ô*‰	ˆˆcØˆs˜ sÐ+Ñ+Ô+Ð+r   c                 ó\   — t          d¦  «        | j        | j        fz  }t          |¦  «        S rM   rN   rO   s     r   rQ   zbigcrypt.to_stringÌ  rR   r   Fc                 ó¾   •— t          t          | ¦  «                             ||¬¦  «        }t          |¦  «        dz  rt          j                             | ¦  «        ‚|S )N)ÚrelaxedrC   )r’   r   Ú_norm_checksumr'   r-   r.   rŒ   )rP   rH   r³   r˜   s      €r   r´   zbigcrypt._norm_checksumÐ  sS   ø€ Ý� 4Ñ(Ô(×7Ò7¸È'Ð7ÑRÔRˆÝˆx‰=Œ=˜2Ñð 	0Ý”&×)Ò)¨$Ñ/Ô/Ð/Øˆr   c                 ó^  — t          |t          ¦  «        r|                     d¦  «        }t          || j                             d¦  «        ¦  «        }d}t          |¦  «        }||k     r0|dz   }|t          |||…         |dd…         ¦  «        z  }|}||k     °0|                     d¦  «        S )Nr%   rE   r   r¡   i÷ÿÿÿ)r)   r   r*   r5   r1   r'   rp   )rP   r!   rJ   r7   r8   r9   s         r   rX   zbigcrypt._calc_checksumÙ  s¯   € Ý�f�gÑ&Ô&ð 	,Ø—]’] 7Ñ+Ô+ˆFÝ˜V T¤Y×%5Ò%5°gÑ%>Ô%>Ñ?Ô?ˆØˆÝ�&‰kŒkˆØ�CŠiˆiØ˜‘7ˆDØ•> &¨¨T¨Ô"2°C¸¸B¸´KÑ@Ô@Ñ@ˆCØˆCð �CŠiˆið �zŠz˜'Ñ"Ô"Ð"r   )F)rq   rr   rs   rt   ru   rv   r-   rw   rx   rz   r{   r|   r~   r   r
   r€   r�   r‚   rƒ   rK   rQ   r´   rX   r©   rª   s   @r   r   r   –  sÛ   ø€ € € € € ðð ð4 €DØ€LØ”_€Nð %&Ð%€M�MØ”€Jð
 �"”*˜Q˜Qð  ñ ô ð Œt�B”D‰yñ	ô €Kð ð,ð ,ñ „[ð,ð#ð #ð #ðð ð ð ð ð ð
#ð 
#ð 
#ð 
#ð 
#ð 
#ð 
#r   r   c                   ó¶   — e Zd ZdZd ZdZdZej        Z	dxZ
Zej        ZdZ ej         ed¦  «        ej        ej        z  ¦  «        Zed„ ¦   «         Zd„ Zd	„ Zd
S )r   a˜  This class implements the crypt16 password hash, and follows the :ref:`password-hash-api`.

    It supports a fixed-length salt.

    The :meth:`~passlib.ifc.PasswordHash.using` method accepts the following optional keywords:

    :type salt: str
    :param salt:
        Optional salt string.
        If not specified, one will be autogenerated (this is recommended).
        If specified, it must be 2 characters, drawn from the regexp range ``[./0-9A-Za-z]``.

    :param bool truncate_error:
        By default, crypt16 will silently truncate passwords larger than 16 bytes.
        Setting ``truncate_error=True`` will cause :meth:`~passlib.ifc.PasswordHash.hash`
        to raise a :exc:`~passlib.exc.PasswordTruncateError` instead.

        .. versionadded:: 1.7

    :type relaxed: bool
    :param relaxed:
        By default, providing an invalid value for one of the other
        keywords will result in a :exc:`ValueError`. If ``relaxed=True``,
        and the error can be corrected, a :exc:`~passlib.exc.PasslibHashWarning`
        will be issued instead. Correctable errors include
        ``salt`` strings that are too long.

        .. versionadded:: 1.6
    rA   é   r$   é   zU
        ^
        (?P<salt>[./a-z0-9]{2})
        (?P<chk>[./a-z0-9]{22})?
        $c                 óæ   — t          |dd¦  «        }| j                             |¦  «        }|st          j                             | ¦  «        ‚|                     dd¦  «        \  }} | ||¬¦  «        S r­   r®   r¯   s        r   rK   zcrypt16.from_string+  r°   r   c                 ó\   — t          d¦  «        | j        | j        fz  }t          |¦  «        S rM   rN   rO   s     r   rQ   zcrypt16.to_string4  rR   r   c                 óN  — t          |t          ¦  «        r|                     d¦  «        }| j        r|                      |¦  «         	 t          j        | j                             d¦  «        ¦  «        }n*# t          $ r t          t          d¦  «        ¦  «        ‚w xY wt          |¦  «        }t          |d|d¦  «        }t          |dd…         ¦  «        }t          |d|d¦  «        }t          j        |¦  «        t          j        |¦  «        z   }|                     d¦  «        S )	Nr%   rE   zinvalid chars in saltr   r    r   r¸   é   )r)   r   r*   rT   rU   r   r(   r1   Ú
ValueErrorr   r"   r   r   r0   rp   )rP   r!   r2   Úkey1Úresult1Úkey2Úresult2rJ   s           r   rX   zcrypt16._calc_checksum;  s(  € Ý�f�gÑ&Ô&ð 	,Ø—]’] 7Ñ+Ô+ˆFð Ôð 	0Ø×'Ò'¨Ñ/Ô/Ð/ð	FÝÔ)¨$¬)×*:Ò*:¸7Ñ*CÔ*CÑDÔDˆJˆJøÝð 	Fð 	Fð 	FÝ ¥Ð,CÑ!DÔ!DÑEÔEÐEð	Føøøõ $ FÑ+Ô+ˆõ (¨¨a°¸RÑ@Ô@ˆõ $ F¨1¨R¨4¤LÑ1Ô1ˆõ (¨¨a°¸QÑ?Ô?ˆõ Ô! 'Ñ*Ô*­VÔ-@ÀÑ-IÔ-IÑIˆØ�zŠz˜'Ñ"Ô"Ð"s   Á,A5 Á5'BN)rq   rr   rs   rt   ru   rv   ry   r-   rw   rx   rz   r{   r|   r}   r~   r   r
   r€   r�   r‚   rƒ   rK   rQ   rX   r…   r   r   r   r   é  sÁ   € € € € € ðð ðH €DØ-€Lð
 €MØ”_€Nð
 %&Ð%€M�MØ”€Jð
 €Mð
 �"”*˜Q˜Qð  ñ ô ð Œt�B”D‰yñ	ô €Kð ð,ð ,ñ „[ð,ð#ð #ð #ð#ð #ð #ð #ð #r   r   )*rt   r~   ÚloggingÚ	getLoggerrq   ÚlogÚwarningsr   Úpasslib.utilsr   r   r   Úpasslib.utils.binaryr   r   Úpasslib.utils.compatr	   r
   r   r   r   Úpasslib.crypto.desr   Úpasslib.utils.handlersÚutilsÚhandlersr-   Ú__all__r,   r"   r5   r;   r?   ÚTruncateMixinÚHasManyBackendsÚHasSaltÚGenericHandlerr   Ú	HasRoundsr   r   r   r…   r   r   ú<module>rÓ      sA  ðØ LÐ Lð
 
€	€	€	Ø €€€Ð'�gÔ'¨Ñ1Ô1�Ø Ð Ð Ð Ð Ð ð =Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø [Ð [Ð [Ð [Ð [Ð [Ð [Ð [Ð [Ð [Ð [Ð [Ð [Ð [Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø #Ð #Ð #Ð #Ð #Ð #Ð #Ð #Ð #ðð ð €ð 
€ð2ð 2ð 2ð'ð 'ð 'ð<
ð 
ð 
ð'ð 'ð 'ð6}Qð }Qð }Qð }Qð }Q�Ô  "Ô"4°b´jÀ"ÔBSñ }Qô }Qð }QðF]_ð ]_ð ]_ð ]_ð ]_�Ô# R¤\°2´:¸rÔ?Pñ ]_ô ]_ð ]_ðFM#ð M#ð M#ð M#ð M#ˆrŒz˜2Ô,ñ M#ô M#ð M#ðfn#ð n#ð n#ð n#ð n#ˆbÔ ¤
¨BÔ,=ñ n#ô n#ð n#ð n#ð n#r   