o
    éT•jc  ã                   @   s²   d Z g d¢ZdZdZdZdZz
ddlmZmZ W n e	y%   dZdZY nw d	d
„ Z
dd„ Zddd„Zddd„Zddd„Zddd„Zdd„ Zdd„ Zdd„ ZedkrWeƒ  dS dS )zHConversions to/from quoted-printable transport encoding as per RFC 1521.)ÚencodeÚdecodeÚencodestringÚdecodestringó   =éL   s   0123456789ABCDEFó    é    )Úa2b_qpÚb2a_qpNc                 C   sH   t | tƒsJ ‚| dv r|S | dkr|S | tkp#d|   ko dkn   S )zìDecide whether a particular byte ordinal needs to be quoted.

    The 'quotetabs' flag indicates whether embedded tabs and spaces should be
    quoted.  Note that line-ending tabs and spaces are always encoded, as per
    RFC 1521.
    ó    	ó   _ó    ó   ~)Ú
isinstanceÚbytesÚESCAPE)ÚcÚ	quotetabsÚheader© r   ú/usr/lib/python3.10/quopri.pyÚneedsquoting   s   "r   c                 C   sB   t | tƒrt| ƒdksJ ‚t| ƒ} ttt| d  t| d  fƒ S )zQuote a single character.é   é   )r   r   ÚlenÚordr   ÚHEX©r   r   r   r   Úquote$   s    r   Fc                 C   s<  t dur|  ¡ }t |||d�}| |¡ dS |dfdd„}d}	 |  ¡ }|s'nig }	d}
|dd… dkr;|dd… }d}
|D ]"}t|fƒ}t|||ƒrNt|ƒ}|rZ|d	krZ|	 d
¡ q=|	 |¡ q=|durh||ƒ t 	|	¡}t
|ƒtkr�||dtd … dd� |td d… }t
|ƒtkss|}q |durœ|||
d� dS dS )av  Read 'input', apply quoted-printable encoding, and write to 'output'.

    'input' and 'output' are binary file objects. The 'quotetabs' flag
    indicates whether embedded tabs and spaces should be quoted. Note that
    line-ending tabs and spaces are always encoded, as per RFC 1521.
    The 'header' flag indicates whether we are encoding spaces as _ as per RFC
    1522.N©r   r   ó   
c                 S   sn   | r| dd … dv r|  | d d… t| dd … ƒ | ¡ d S | dkr.|  t| ƒ| ¡ d S |  | | ¡ d S )Néÿÿÿÿr   ó   .)Úwriter   )ÚsÚoutputÚlineEndr   r   r   r#   ;   s
   *zencode.<locals>.writer   r   r!   r   r   s   =
)r&   )r
   Úreadr#   Úreadliner   r   r   ÚappendÚEMPTYSTRINGÚjoinr   ÚMAXLINESIZE)Úinputr%   r   r   ÚdataÚodatar#   ÚprevlineÚlineÚoutlineÚstrippedr   Úthisliner   r   r   r   ,   sF   	



üá!ÿr   c                 C   sF   t d urt | ||d�S ddlm} || ƒ}|ƒ }t||||ƒ | ¡ S )Nr   r   ©ÚBytesIO)r
   Úior6   r   Úgetvalue)r$   r   r   r6   ÚinfpÚoutfpr   r   r   r   j   s   r   c                 C   s  t dur|  ¡ }t ||d�}| |¡ dS d}	 |  ¡ }|snØdt|ƒ}}|dkr[||d |… dkr[d}	|d }|dkrZ||d |… dv rZ|d }|dkrZ||d |… dv sHnd}	||k rë|||d … }
|
dkrx|rx|d	 }|d }no|
tkr…||
 }|d }nb|d |kr�|	s�d}	n[|d |k r«||d |d
 … tkr«|t }|d
 }n<|d
 |k rßt||d |d
 … ƒrßt||d
 |d … ƒrß|tt||d |d … ƒfƒ }|d }n||
 }|d }||k sa|	sö| |d ¡ d}q|�r| |¡ dS dS )z»Read 'input', apply quoted-printable decoding, and write to 'output'.
    'input' and 'output' are binary file objects.
    If 'header' is true, decode underscore as space (per RFC 1522).N©r   r   r   r   r    s    	r   r   é   é   )	r	   r'   r#   r(   r   r   Úishexr   Úunhex)r-   r%   r   r.   r/   Únewr1   ÚiÚnÚpartialr   r   r   r   r   u   sL   
ÿ€$<,óåÿr   c                 C   sD   t d ur
t | |d�S ddlm} || ƒ}|ƒ }t|||d� | ¡ S )Nr;   r   r5   )r	   r7   r6   r   r8   )r$   r   r6   r9   r:   r   r   r   r       s   r   c                 C   sV   t | tƒsJ ‚d|   kodkn  p*d|   kodkn  p*d|   ko(dkS   S )zDReturn true if the byte ordinal 'c' is a hexadecimal digit in ASCII.ó   0ó   9ó   aó   fó   Aó   F)r   r   r   r   r   r   r>   ¬   s   Hr>   c                 C   s®   d}| D ]P}t |fƒ}d|  krdkrn ntdƒ}n.d|  kr&dkr/n ntdƒd }nd	|  kr9d
krBn ntd	ƒd }nJ dt|ƒ ƒ‚|d t|ƒ|  }q|S )z.Get the integer value of a hexadecimal number.r   rD   rE   Ú0rF   rG   Úaé
   rH   rI   Fznon-hex digit r   )r   r   Úrepr)r$   Úbitsr   rA   r   r   r   r?   ±   s   

r?   c                  C   s°  dd l } dd l}z| | jdd … d¡\}}W n, |jyC } z| j| _t|ƒ tdƒ tdƒ tdƒ |  d¡ W Y d }~nd }~ww d}d}|D ]\}}|d	krTd
}|dkrZd
}qJ|rl|rl| j| _tdƒ |  d¡ |sqdg}d}	|D ]W}
|
dkr€| jj	}n&zt
|
dƒ}W n ty¥ } z| j d|
|f ¡ d}	W Y d }~qud }~ww z|r±t|| jj	ƒ nt|| jj	|ƒ W |
dkrÂ| ¡  qu|
dkrÌ| ¡  w w |	rÖ|  |	¡ d S d S )Nr   r   Útdz"usage: quopri [-t | -d] [file] ...z-t: quote tabsz-d: decode; default encoder<   Fz-tTz-dz -t and -d are mutually exclusiveú-Úrbz%s: can't open (%s)
)ÚsysÚgetoptÚargvÚerrorÚstderrÚstdoutÚprintÚexitÚstdinÚbufferÚopenÚOSErrorr#   r   r   Úclose)rR   rS   ÚoptsÚargsÚmsgÚdecoÚtabsÚorK   ÚstsÚfileÚfpr   r   r   ÚmainÃ   sd   €ú€


€ý€€ÿ
ÿÿrh   Ú__main__)F)FF)Ú__doc__Ú__all__r   r,   r   r*   Úbinasciir	   r
   ÚImportErrorr   r   r   r   r   r   r>   r?   rh   Ú__name__r   r   r   r   Ú<module>   s0   þ

>

+.
ÿ