o
     JAf                 	   @   s  	 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
 d dlmZ edZeedB Zed	ZeeB Zeed
 Zeed ZeedB ed
 ZeeB ZeedB ZeeB Zeed Zdd Ze de je jB ZG dd deZG dd deZG dd deZ G dd deZ!G dd deZ"G dd deZ#G dd deZ$G d d! d!eZ%G d"d# d#eZ&G d$d% d%eZ'G d&d' d'e'Z(G d(d) d)eZ)G d*d+ d+eZ*G d,d- d-eZ+G d.d/ d/eZ,G d0d1 d1eZ-G d2d3 d3eZ.G d4d5 d5eZ/G d6d7 d7eZ0G d8d9 d9eZ1G d:d; d;eZ2G d<d= d=eZ3G d>d? d?eZ4G d@dA dAeZ5G dBdC dCeZ6G dDdE dEeZ7G dFdG dGeZ8G dHdI dIeZ9G dJdK dKe!Z:G dLdM dMeZ;G dNdO dOeZ<G dPdQ dQeZ=G dRdS dSeZ>G dTdU dUe>Z?G dVdW dWeZ@G dXdY dYeZAG dZd[ d[eZBG d\d] d]eZCG d^d_ d_eZDG d`da daeDZEG dbdc dceDZFG ddde deeZGG dfdg dgeZHG dhdi dieZIG djdk dkeIZJG dldm dmeJZKG dndo doeZLG dpdq dqeMZNG drds dseNZOG dtdu dueNZPG dvdw dweOZQG dxdy dye
jRZSePd
dzZTePd{d|ZUePd}d~ZVe dWdXejYZZe dWe [dXej\Z]e dj^Z_e dWe [dXej\Z`e dWe [dXej\Zae dWe [dXej\Zbdd Zcdd Zddd Zedd Zfdd Zgdd Zhdd Zidd Zjdd Zkdd Zldd Zmdd Zndd Zodd Zpdd Zqdd Zrdd Zsdd Ztdd Zudd Zvdd Zwdd Zxdd Zydd Zzdd Z{dd Z|dd Z}dd Z~dd Zdd Zdd Zdd ZddĄ ZddƄ ZddȄ Zddʄ Zdd̄ Zdd΄ ZddЄ Zdd҄ ZddԄ Zddք Zdd؄ Zddڄ Zdd܄ Zddބ Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdS )    N)	hexdigits)
itemgetter)_encoded_words)errors)utilsz 	(z()<>@,:;.\"[].z."(z/?=z*'%%c                 C   s    dt | dddd d S )N"\\\z\")strreplacevalue r   1/usr/lib/python3.10/email/_header_value_parser.pyquote_string`   s    r   z
   =\?            # literal =?
   [^?]*          # charset
   \?             # literal ?
   [qQbB]         # literal 'q' or 'b', case insensitive
   \?             # literal ?
  .*?             # encoded word
  \?=             # literal ?=
c                       s   e Zd ZdZdZdZ fddZdd Z fddZe	d	d
 Z
e	dd Zdd Ze	dd Ze	dd Zdd ZdddZdddZdddZ  ZS )	TokenListNTc                    s   t  j|i | g | _d S N)super__init__defects)selfargskw	__class__r   r   r   y   s   
zTokenList.__init__c                 C      d dd | D S )N c                 s       | ]}t |V  qd S r   r   .0xr   r   r   	<genexpr>~       z$TokenList.__str__.<locals>.<genexpr>joinr   r   r   r   __str__}      zTokenList.__str__c                       d | jjt  S Nz{}({})formatr   __name__r   __repr__r)   r   r   r   r1      s   
zTokenList.__repr__c                 C   r   )Nr   c                 s   s    | ]	}|j r|j V  qd S r   r   r"   r   r   r   r%      s    z"TokenList.value.<locals>.<genexpr>r'   r)   r   r   r   r         zTokenList.valuec                 C   s   t dd | D | jS )Nc                 s       | ]}|j V  qd S r   )all_defectsr"   r   r   r   r%          z(TokenList.all_defects.<locals>.<genexpr>)sumr   r)   r   r   r   r4      s   zTokenList.all_defectsc                 C   s   | d   S Nr   )startswith_fwsr)   r   r   r   r8         zTokenList.startswith_fwsc                 C   s   	 t dd | D S )Nc                 s   r3   r   )as_ew_allowed)r#   partr   r   r   r%      r5   z*TokenList.as_ew_allowed.<locals>.<genexpr>)allr)   r   r   r   r:      s   zTokenList.as_ew_allowedc                 C   s   g }| D ]}| |j q|S r   )extendcomments)r   r>   tokenr   r   r   r>      s   zTokenList.commentsc                C   s   t | |dS )Npolicy)_refold_parse_treer   rA   r   r   r   fold   r9   zTokenList.foldr   c                 C   s   t | j|d d S )Nindent)printppstrr   rF   r   r   r   pprint   r+   zTokenList.pprintc                 C   s   d | j|dS )N
rE   )r(   _pprI   r   r   r   rH      s   zTokenList.ppstrc                 c   s|    d || jj| jV  | D ]}t|ds|d | V  q||d E d H  q| jr3d | j}nd}d ||V  d S )Nz{}{}/{}(rL   z*    !! invalid element in token list: {!r}z    z Defects: {}r   z{}){})r/   r   r0   
token_typehasattrrL   r   )r   rF   r?   extrar   r   r   rL      s    
zTokenList._ppr   )r0   
__module____qualname__rM   syntactic_breakew_combine_allowedr   r*   r1   propertyr   r4   r8   r:   r>   rD   rJ   rH   rL   __classcell__r   r   r   r   r   s   s(    





r   c                   @   s$   e Zd Zedd Zedd ZdS )WhiteSpaceTokenListc                 C      dS N r   r)   r   r   r   r         zWhiteSpaceTokenList.valuec                 C      dd | D S )Nc                 S      g | ]
}|j d kr|jqS )comment)rM   contentr"   r   r   r   
<listcomp>       z0WhiteSpaceTokenList.comments.<locals>.<listcomp>r   r)   r   r   r   r>         zWhiteSpaceTokenList.commentsN)r0   rQ   rR   rU   r   r>   r   r   r   r   rW      s
    
rW   c                   @      e Zd ZdZdS )UnstructuredTokenListunstructuredNr0   rQ   rR   rM   r   r   r   r   rd          rd   c                   @   rc   )PhrasephraseNrf   r   r   r   r   rh      rg   rh   c                   @   rc   )WordZwordNrf   r   r   r   r   rj      rg   rj   c                   @   rc   )CFWSListcfwsNrf   r   r   r   r   rk      rg   rk   c                   @   rc   )AtomatomNrf   r   r   r   r   rm      rg   rm   c                   @      e Zd ZdZdZdS )Tokenr?   FN)r0   rQ   rR   rM   Zencode_as_ewr   r   r   r   rp          rp   c                   @   s   e Zd ZdZdZdZdZdS )EncodedWordencoded-wordN)r0   rQ   rR   rM   ctecharsetlangr   r   r   r   rr      
    rr   c                   @   4   e Zd ZdZedd Zedd Zedd ZdS )	QuotedStringquoted-stringc                 C   "   | D ]}|j dkr|j  S qd S Nbare-quoted-stringrM   r   r   r$   r   r   r   r_      
   

zQuotedString.contentc                 C   s>   g }| D ]}|j dkr|t| q||j qd|S )Nr}   r   )rM   appendr   r   r(   )r   resr$   r   r   r   quoted_value   s   

zQuotedString.quoted_valuec                 C   r{   r|   r~   r   r?   r   r   r   stripped_value   r   zQuotedString.stripped_valueN)r0   rQ   rR   rM   rU   r_   r   r   r   r   r   r   ry      s    

	ry   c                   @   s$   e Zd ZdZdd Zedd ZdS )BareQuotedStringr}   c                 C   s   t ddd | D S )Nr   c                 s   r    r   r!   r"   r   r   r   r%      r&   z+BareQuotedString.__str__.<locals>.<genexpr>)r   r(   r)   r   r   r   r*      s   zBareQuotedString.__str__c                 C   r   )Nr   c                 s   r    r   r!   r"   r   r   r   r%     r&   z)BareQuotedString.value.<locals>.<genexpr>r'   r)   r   r   r   r     r2   zBareQuotedString.valueN)r0   rQ   rR   rM   r*   rU   r   r   r   r   r   r      s
    r   c                   @   s8   e Zd ZdZdd Zdd Zedd Zedd	 Zd
S )Commentr^   c                    s(   d tdg fdd D dggg S )Nr   r   c                    s   g | ]}  |qS r   )quoter"   r)   r   r   r`     s    z#Comment.__str__.<locals>.<listcomp>))r(   r6   r)   r   r)   r   r*     s   zComment.__str__c                 C   s2   |j dkr	t|S t|ddddddS )Nr^   r   r   r   z\(r   z\))rM   r   r   )r   r   r   r   r   r     s   
zComment.quotec                 C   r   )Nr   c                 s   r    r   r!   r"   r   r   r   r%     r&   z"Comment.content.<locals>.<genexpr>r'   r)   r   r   r   r_     r2   zComment.contentc                 C   s   | j gS r   )r_   r)   r   r   r   r>     s   zComment.commentsN)	r0   rQ   rR   rM   r*   r   rU   r_   r>   r   r   r   r   r     s    
r   c                   @   rx   )	AddressListzaddress-listc                 C   r\   )Nc                 S      g | ]	}|j d kr|qS )addressrM   r"   r   r   r   r`   '      z)AddressList.addresses.<locals>.<listcomp>r   r)   r   r   r   	addresses%  rb   zAddressList.addressesc                 C      t dd | D g S )Nc                 s        | ]}|j d kr|jV  qdS r   NrM   	mailboxesr"   r   r   r   r%   +      z(AddressList.mailboxes.<locals>.<genexpr>r6   r)   r   r   r   r   )  
   zAddressList.mailboxesc                 C   r   )Nc                 s   r   r   rM   all_mailboxesr"   r   r   r   r%   0  r   z,AddressList.all_mailboxes.<locals>.<genexpr>r   r)   r   r   r   r   .  r   zAddressList.all_mailboxesN)r0   rQ   rR   rM   rU   r   r   r   r   r   r   r   r   !  s    

r   c                   @   rx   )	Addressr   c                 C      | d j dkr| d jS d S )Nr   grouprM   display_namer)   r   r   r   r   8     
zAddress.display_namec                 C   s4   | d j dkr| d gS | d j dkrg S | d jS Nr   mailboxinvalid-mailboxr   r)   r   r   r   r   =  s
   

zAddress.mailboxesc                 C   s:   | d j dkr| d gS | d j dkr| d gS | d jS r   r   r)   r   r   r   r   E  s
   


zAddress.all_mailboxesN)r0   rQ   rR   rM   rU   r   r   r   r   r   r   r   r   4  s    

r   c                   @   (   e Zd ZdZedd Zedd ZdS )MailboxListmailbox-listc                 C   r\   )Nc                 S   r   )r   r   r"   r   r   r   r`   S  r   z)MailboxList.mailboxes.<locals>.<listcomp>r   r)   r   r   r   r   Q  rb   zMailboxList.mailboxesc                 C   r\   )Nc                 S   s   g | ]	}|j d v r|qS ))r   r   r   r"   r   r   r   r`   W  s    
z-MailboxList.all_mailboxes.<locals>.<listcomp>r   r)   r   r   r   r   U  rb   zMailboxList.all_mailboxesNr0   rQ   rR   rM   rU   r   r   r   r   r   r   r   M  s    
r   c                   @   r   )	GroupList
group-listc                 C       | r	| d j dkrg S | d jS Nr   r   r   r)   r   r   r   r   _     
zGroupList.mailboxesc                 C   r   r   r   r)   r   r   r   r   e  r   zGroupList.all_mailboxesNr   r   r   r   r   r   [  s    
r   c                   @   rx   )	Groupr   c                 C      | d j dkr	g S | d jS N   r   r   r)   r   r   r   r   p     
zGroup.mailboxesc                 C   r   r   r   r)   r   r   r   r   v  r   zGroup.all_mailboxesc                 C   
   | d j S r7   )r   r)   r   r   r   r   |     
zGroup.display_nameN)r0   rQ   rR   rM   rU   r   r   r   r   r   r   r   r   l  s    

r   c                   @   L   e Zd ZdZedd Zedd Zedd Zedd	 Zed
d Z	dS )NameAddr	name-addrc                 C   s   t | dkrd S | d jS N   r   )lenr   r)   r   r   r   r        
zNameAddr.display_namec                 C   r   N
local_partr)   r   r   r   r     r   zNameAddr.local_partc                 C   r   r   domainr)   r   r   r   r     r   zNameAddr.domainc                 C   r   r   )router)   r   r   r   r     r   zNameAddr.routec                 C   r   r   	addr_specr)   r   r   r   r     r   zNameAddr.addr_specN
r0   rQ   rR   rM   rU   r   r   r   r   r   r   r   r   r   r     s    



r   c                   @   s@   e Zd ZdZedd Zedd Zedd Zedd	 Zd
S )	AngleAddrz
angle-addrc                 C   r{   N	addr-spec)rM   r   r   r   r   r   r     r   zAngleAddr.local_partc                 C   r{   r   rM   r   r   r   r   r   r     r   zAngleAddr.domainc                 C   r{   )N	obs-route)rM   domainsr   r   r   r   r     r   zAngleAddr.routec                 C   s<   | D ]}|j dkr|jr|j  S t|j|j   S qdS )Nr   z<>)rM   r   r   r   r   r   r   r   r     s   

zAngleAddr.addr_specN)	r0   rQ   rR   rM   rU   r   r   r   r   r   r   r   r   r     s    


r   c                   @      e Zd ZdZedd ZdS )ObsRouter   c                 C   r\   )Nc                 S   r]   r   r   r"   r   r   r   r`     ra   z$ObsRoute.domains.<locals>.<listcomp>r   r)   r   r   r   r     rb   zObsRoute.domainsN)r0   rQ   rR   rM   rU   r   r   r   r   r   r         r   c                   @   r   )Mailboxr   c                 C   r   Nr   r   r   r)   r   r   r   r     r   zMailbox.display_namec                 C   r   r7   r   r)   r   r   r   r     r   zMailbox.local_partc                 C   r   r7   r   r)   r   r   r   r     r   zMailbox.domainc                 C   r   r   )rM   r   r)   r   r   r   r     r   zMailbox.routec                 C   r   r7   r   r)   r   r   r   r     r   zMailbox.addr_specNr   r   r   r   r   r     s    



r   c                   @   s,   e Zd ZdZedd Ze Z Z ZZ	dS )InvalidMailboxr   c                 C      d S r   r   r)   r   r   r   r     r[   zInvalidMailbox.display_nameNr   r   r   r   r   r     s
    
r   c                       s(   e Zd ZdZdZe fddZ  ZS )Domainr   Fc                       d t j S Nr   r(   r   r   splitr)   r   r   r   r        zDomain.domain)r0   rQ   rR   rM   r:   rU   r   rV   r   r   r   r   r     s
    r   c                   @   rc   )DotAtomdot-atomNrf   r   r   r   r   r     rg   r   c                   @   ro   )DotAtomTextzdot-atom-textTNr0   rQ   rR   rM   r:   r   r   r   r   r     rq   r   c                   @   ro   )NoFoldLiteralzno-fold-literalFNr   r   r   r   r   r      rq   r   c                   @   sD   e Zd ZdZdZedd Zedd Zedd Zed	d
 Z	dS )AddrSpecr   Fc                 C   r   r7   r   r)   r   r   r   r   
  r   zAddrSpec.local_partc                 C   s   t | dk rd S | d jS )N   r   )r   r   r)   r   r   r   r     r   zAddrSpec.domainc                 C   s<   t | dk r| d jS | d j | d j | d j  S )Nr   r   r   r   )r   r   rstriplstripr)   r   r   r   r     s   
&zAddrSpec.valuec                 C   sL   t | j}t|t|t krt| j}n| j}| jd ur$|d | j S |S )N@)setr   r   DOT_ATOM_ENDSr   r   )r   ZnamesetZlpr   r   r   r     s   

zAddrSpec.addr_specN)
r0   rQ   rR   rM   r:   rU   r   r   r   r   r   r   r   r   r     s    


r   c                   @   ro   )ObsLocalPartzobs-local-partFNr   r   r   r   r   r   &      r   c                       s4   e Zd ZdZdZedd Ze fddZ  ZS )DisplayNamezdisplay-nameFc                 C   s   t | }t|dkr|jS |d jdkr|d n|d d jdkr/t |d dd  |d< |d jdkr=|  |jS |d d jdkrRt |d d d |d< |jS )Nr   rl   r   r   )r   r   r   rM   pop)r   r   r   r   r   r   1  s   zDisplayName.display_namec                    s   d}| j rd}n| D ]	}|jdkrd}q
t| dkrM|rMd }}| d jdks0| d d jdkr2d}| d jdksB| d d jdkrDd}|t| j | S t jS )	NFTrz   r   r   rl   rZ   r   )r   rM   r   r   r   r   r   )r   r   r$   preZpostr   r   r   r   B  s   
  zDisplayName.value)	r0   rQ   rR   rM   rT   rU   r   r   rV   r   r   r   r   r   ,  s    
r   c                   @   s,   e Zd ZdZdZedd Zedd ZdS )	LocalPartz
local-partFc                 C   s"   | d j dkr| d jS | d jS )Nr   rz   )rM   r   r   r)   r   r   r   r   [  s   

zLocalPart.valuec                 C   s   t g}t }d}| d t g D ]J}|jdkrq|r.|jdkr.|d jdkr.t|d d |d< t|t}|rM|jdkrM|d jdkrM|t|dd   n|| |d }|}qt|dd }|jS )NFr   rl   dotr   r   )DOTrM   r   
isinstancer   r   )r   r   ZlastZ
last_is_tltokZis_tlr   r   r   r   b  s$   


zLocalPart.local_partN)r0   rQ   rR   rM   r:   rU   r   r   r   r   r   r   r   V  s    
r   c                       s4   e Zd ZdZdZe fddZedd Z  ZS )DomainLiteralzdomain-literalFc                    r   r   r   r)   r   r   r   r     r   zDomainLiteral.domainc                 C   r{   )Nptextr~   r   r   r   r   ip  r   zDomainLiteral.ip)	r0   rQ   rR   rM   r:   rU   r   r   rV   r   r   r   r   r   z  s    r   c                   @   s   e Zd ZdZdZdZdS )MIMEVersionzmime-versionN)r0   rQ   rR   rM   majorminorr   r   r   r   r     s    r   c                   @   s4   e Zd ZdZdZdZdZedd Zedd Z	dS )		Parameter	parameterFus-asciic                 C   s   | j r| d jS dS r   )	sectionednumberr)   r   r   r   section_number  s   zParameter.section_numberc                 C   sf   | D ].}|j dkr|j  S |j dkr0|D ]}|j dkr/|D ]}|j dkr.|j      S qqqdS )Nr   rz   r}   r   )rM   r   r   r   r   r   param_value  s   




zParameter.param_valueN)
r0   rQ   rR   rM   r   extendedru   rU   r   r   r   r   r   r   r     s    
r   c                   @   rc   )InvalidParameterinvalid-parameterNrf   r   r   r   r   r     s    r   c                   @   r   )	Attribute	attributec                 C   s$   | D ]}|j dr|j  S qd S )Nattrtext)rM   endswithr   r   r   r   r   r     s
   
zAttribute.stripped_valueNr0   rQ   rR   rM   rU   r   r   r   r   r   r     r   r   c                   @   s   e Zd ZdZdZdS )SectionsectionN)r0   rQ   rR   rM   r   r   r   r   r   r    r   r  c                   @   r   )Valuer   c                 C   s2   | d }|j dkr| d }|j dr|jS | jS )Nr   rl   r   )rz   r   zextended-attribute)rM   r   r   r   r   r   r   r   r     s   
zValue.stripped_valueNr  r   r   r   r   r    r   r  c                   @   s(   e Zd ZdZdZedd Zdd ZdS )MimeParametersmime-parametersFc                 c   s   i }| D ]*}|j dsq|d j dkrq|d j }||vr%g ||< || |j|f q| D ]\}}t|tdd}|d d }|j	}|j
smt|dkrm|d d dkrm|d d jtd |d d }g }d}|D ]n\}	}
|	|kr|
j
s|
jtd qs|
jtd |d7 }|
j}|
j
rztj|}W n ty   tjj|d	d
}Y n(w z||d}W n ttfy   |dd}Y nw t|r|
jt  || qsd|}||fV  q4d S )Nr   r   r   )keyr   z.duplicate parameter name; duplicate(s) ignoredz+duplicate parameter name; duplicate ignoredz(inconsistent RFC2231 parameter numberingzlatin-1)encodingsurrogateescaper   r   )rM   r   r   stripr   r   itemssortedr   ru   r   r   r   r   InvalidHeaderDefectr   urllibparseunquote_to_bytesUnicodeEncodeErrorunquotedecodeLookupErrorr   _has_surrogatesUndecodableBytesDefectr(   )r   paramsr?   namepartsZfirst_paramru   Zvalue_partsir   paramr   r   r   r   r    sh   



zMimeParameters.paramsc                 C   sT   g }| j D ]\}}|r|d|t| q|| qd|}|r(d| S dS )N{}={}z; rZ   r   )r  r   r/   r   r(   )r   r  r  r   r   r   r   r*     s   
zMimeParameters.__str__N)r0   rQ   rR   rM   rS   rU   r  r*   r   r   r   r   r    s    
Er  c                   @   r   )ParameterizedHeaderValueFc                 C   s&   t | D ]}|jdkr|j  S qi S )Nr  )reversedrM   r  r   r   r   r   r  -  s
   

zParameterizedHeaderValue.paramsN)r0   rQ   rR   rS   rU   r  r   r   r   r   r  '  s    r  c                   @   s   e Zd ZdZdZdZdZdS )ContentTypezcontent-typeFtextZplainN)r0   rQ   rR   rM   r:   maintypesubtyper   r   r   r   r  5  rw   r  c                   @   s   e Zd ZdZdZdZdS )ContentDispositionzcontent-dispositionFN)r0   rQ   rR   rM   r:   content_dispositionr   r   r   r   r#  <      r#  c                   @   s   e Zd ZdZdZdZdS )ContentTransferEncodingzcontent-transfer-encodingFZ7bitN)r0   rQ   rR   rM   r:   rt   r   r   r   r   r&  B  r%  r&  c                   @   ro   )HeaderLabelzheader-labelFNr   r   r   r   r   r'  H  rq   r'  c                   @   s   e Zd ZdZdZdd ZdS )MsgIDzmsg-idFc                 C   s   t | |j S r   )r   lineseprC   r   r   r   rD   Q  rb   z
MsgID.foldN)r0   rQ   rR   rM   r:   rD   r   r   r   r   r(  M  s    r(  c                   @   rc   )	MessageIDz
message-idNrf   r   r   r   r   r*  V  rg   r*  c                   @   rc   )InvalidMessageIDzinvalid-message-idNrf   r   r   r   r   r+  Z  rg   r+  c                   @   rc   )HeaderheaderNrf   r   r   r   r   r,  ^  rg   r,  c                       sr   e Zd ZdZdZdZ fddZ fddZdd Ze	dd	 Z
d fdd	Zdd Ze	dd Zdd Z  ZS )TerminalTc                    s   t  | |}||_g |_|S r   )r   __new__rM   r   )clsr   rM   r   r   r   r   r/  l  s   zTerminal.__new__c                    r,   r-   r.   r)   r   r   r   r1   r  s   zTerminal.__repr__c                 C   s   t | jjd | j  d S )N/)rG   r   r0   rM   r)   r   r   r   rJ   u  s   zTerminal.pprintc                 C   s
   t | jS r   )listr   r)   r   r   r   r4   x  r   zTerminal.all_defectsr   c              	      s6   d || jj| jt  | jsdgS d | jgS )Nz{}{}/{}({}){}r   z {})r/   r   r0   rM   r   r1   r   rI   r   r   r   rL   |  s   
zTerminal._ppc                 C   r   r   r   r)   r   r   r   pop_trailing_ws  r[   zTerminal.pop_trailing_wsc                 C   s   g S r   r   r)   r   r   r   r>     r[   zTerminal.commentsc                 C   s   t | | jfS r   )r   rM   r)   r   r   r   __getnewargs__  s   zTerminal.__getnewargs__rP   )r0   rQ   rR   r:   rT   rS   r/  r1   rJ   rU   r4   rL   r3  r>   r4  rV   r   r   r   r   r.  f  s    
	
r.  c                   @       e Zd Zedd Zdd ZdS )WhiteSpaceTerminalc                 C   rX   rY   r   r)   r   r   r   r     r[   zWhiteSpaceTerminal.valuec                 C   rX   )NTr   r)   r   r   r   r8        z!WhiteSpaceTerminal.startswith_fwsNr0   rQ   rR   rU   r   r8   r   r   r   r   r6        
r6  c                   @   r5  )ValueTerminalc                 C   s   | S r   r   r)   r   r   r   r     r[   zValueTerminal.valuec                 C   rX   )NFr   r)   r   r   r   r8     r7  zValueTerminal.startswith_fwsNr8  r   r   r   r   r:    r9  r:  c                   @   r5  )EWWhiteSpaceTerminalc                 C   rX   r   r   r)   r   r   r   r     r[   zEWWhiteSpaceTerminal.valuec                 C   rX   r   r   r)   r   r   r   r*     r7  zEWWhiteSpaceTerminal.__str__N)r0   rQ   rR   rU   r   r*   r   r   r   r   r;    r9  r;  c                   @   s   e Zd ZdS )_InvalidEwErrorN)r0   rQ   rR   r   r   r   r   r<    s    r<  r   ,list-separatorr   zroute-component-markerz([{}]+)r   z[^{}]+z[\x00-\x20\x7F]c                 C   sD   	 t | }|r| jt| t| r | jtd d S d S )Nz*Non-ASCII characters found in header token)_non_printable_finderr   r   r   ZNonPrintableDefectr   r  r  )xtextZnon_printablesr   r   r   _validate_xtext  s   


rA  c                 C   s   	 t | d^}}g }d}d}tt|D ]&}|| dkr&|r#d}d}nd}q|r+d}n|| |v r3 n|||  q|d }d|d||d  g| |fS )Nr   Fr   Tr   )_wsp_splitterranger   r   r(   )r   endcharsfragment	remainderZvcharsescapehad_qpposr   r   r   _get_ptext_to_endchars  s&   $rJ  c                 C   s0   	 |   }t| d t| t|  d}||fS )Nfws)r   r6  r   )r   ZnewvaluerK  r   r   r   get_fws  s   rL  c              	   C   s  	 t  }| dstd| | dd  dd^}}|| dd  kr-td| d|}t|dkrY|d tv rY|d tv rY|	ddk rY|dd^}}|d | }t| dkrj|j
td	 | |_d|} ztd| d \}}}}	W n ttfy   td
|jw ||_||_|j
|	 |r|d tv rt|\}
}||
 qt|d^}}t|d}t| || d|}|s| r| d tvr|j
td || fS )N=?z"expected encoded word but found {}r   z?=r   r   r   ?zwhitespace inside encoded wordz!encoded word format invalid: '{}'vtextz.missing trailing whitespace after encoded-word)rr   
startswithr   HeaderParseErrorr/   r   r(   r   r   countr   r   r  rt   _ewr  
ValueErrorKeyErrorr<  ru   rv   r=   WSPrL  rB  r:  rA  )r   Zewr   rF  Zremstrrestr   ru   rv   r   r?   charsrO  r   r   r   get_encoded_word  sd   









rY  c                 C   s@  	 t  }| r| d tv rt| \}} || qd}| drtzt| \}} W n ty2   d}Y nB tjy;   Y n9w d}t	|dkrV|d j
dkrV|jtd d}|rnt	|dkrn|d	 j
d
krnt|d d|d< || qt| d^}}|rt|r| d^}}t|d}t| || d|} | s|S )Nr   TrM  Fr   rK  z&missing whitespace before encoded wordr   rs   rO  r   )rd   rV  rL  r   rP  rY  r<  r   rQ  r   rM   r   r  r;  rB  rfc2047_matchersearch	partitionr:  rA  r(   )r   re   r?   valid_ewZhave_wsr   rF  rO  r   r   r   get_unstructured?  sN   






)r_  c                 C   ,   	 t | d\}} }t|d}t| || fS )Nz()r   )rJ  r6  rA  r   r   _r   r   r   get_qp_ctext  s
   
rc  c                 C   r`  )Nr
   r   )rJ  r:  rA  ra  r   r   r   get_qcontent  s
   	
rd  c                 C   P   	 t | }|std| | }| t|d  } t|d}t| || fS )Nzexpected atext but found '{}'atext)_non_atom_end_matcherr   rQ  r/   r   r   r:  rA  )r   mrf  r   r   r   	get_atext  s   
ri  c                 C   sp  	 | d dkrt d| t }| dd  } | r+| d dkr+t| \}} || | r| d dkr| d tv r@t| \}} nT| d d dkrd}zt| \}} |j	t 
d d	}W n t jym   t| \}} Y nw |rt|dkr|d
 jdkr|d jdkrt|d
 d|d
< nt| \}} || | r| d dks3| s|j	t 
d || fS || dd  fS )Nr   r
   zexpected '"' but found '{}'r   r   rM  Fz!encoded word inside quoted stringTr   rK  rZ  rs   z"end of header inside quoted string)r   rQ  r/   r   rd  r   rV  rL  rY  r   r  r   rM   r;  )r   Zbare_quoted_stringr?   r^  r   r   r   get_bare_quoted_string  sP   



rj  c                 C   s   	 | r| d dkrt d| t }| dd  } | rO| d dkrO| d tv r/t| \}} n| d dkr<t| \}} nt| \}} || | rO| d dks"| s^|j	t 
d || fS || dd  fS )Nr   r   zexpected '(' but found '{}'r   r   zend of header inside comment)r   rQ  r/   r   rV  rL  get_commentrc  r   r   r  )r   r^   r?   r   r   r   rk    s*   

rk  c                 C   s`   	 t  }| r,| d tv r,| d tv rt| \}} nt| \}} || | r,| d tv s|| fS r7   )rk   CFWS_LEADERrV  rL  rk  r   )r   rl   r?   r   r   r   get_cfws  s   
rm  c                 C   sr   	 t  }| r| d tv rt| \}} || t| \}} || | r5| d tv r5t| \}} || || fS r7   )ry   rl  rm  r   rj  )r   Zquoted_stringr?   r   r   r   get_quoted_string  s   


rn  c                 C   s   	 t  }| r| d tv rt| \}} || | r'| d tv r'td| | drEzt	| \}} W n tjyD   t
| \}} Y nw t
| \}} || | rc| d tv rct| \}} || || fS )Nr   zexpected atom but found '{}'rM  )rm   rl  rm  r   	ATOM_ENDSr   rQ  r/   rP  rY  ri  )r   rn   r?   r   r   r   get_atom  s*   



rp  c                 C   s   	 t  }| r| d tv rtd| | rB| d tvrBt| \}} || | r:| d dkr:|t | dd  } | rB| d tvs|d tu rRtdd|  || fS )Nr   z8expected atom at a start of dot-atom-text but found '{}'r   r   r   z4expected atom at end of dot-atom-text but found '{}')r   ro  r   rQ  r/   ri  r   r   )r   Zdot_atom_textr?   r   r   r   get_dot_atom_text0  s$   


rq  c                 C   s   	 t  }| d tv rt| \}} || | dr3zt| \}} W n tjy2   t| \}} Y nw t| \}} || | rQ| d tv rQt| \}} || || fS )Nr   rM  )	r   rl  rm  r   rP  rY  r   rQ  rq  )r   Zdot_atomr?   r   r   r   get_dot_atomC  s"   



rr  c                 C   s   	 | d t v rt| \}} nd }| std| d dkr$t| \}} n| d tv r2td| t| \}} |d urC|g|d d< || fS )Nr   z5Expected 'atom' or 'quoted-string' but found nothing.r
   z1Expected 'atom' or 'quoted-string' but found '{}')rl  rm  r   rQ  rn  SPECIALSr/   rp  )r   leaderr?   r   r   r   get_word\  s$   ru  c                 C   s  	 t  }zt| \}} || W n tjy$   |jtd Y nw | r| d tvr| d dkrH|t |jt	d | dd  } n/zt| \}} W n! tjyq   | d t
v rnt| \}} |jt	d n Y nw || | r| d tvs-|| fS )Nzphrase does not start with wordr   r   zperiod in 'phrase'r   zcomment found without atom)rh   ru  r   r   rQ  r   r  PHRASE_ENDSr   ObsoleteHeaderDefectrl  rm  )r   ri   r?   r   r   r   
get_phrase~  s>   





rx  c                 C   sn  	 t  }d }| d tv rt| \}} | std| zt| \}} W n- tjyQ   zt| \}} W n tjyN   | d dkrI| d tv rI t	 }Y nw Y nw |d ur]|g|d d< |
| | r| d dksp| d tvrtt||  \}} |jdkr|j
td n	|j
td ||d< z|jd W || fS  ty   |j
td Y || fS w )	Nr   z"expected local-part but found '{}'r   invalid-obs-local-partz<local-part is not dot-atom, quoted-string, or obs-local-partz,local-part is not a dot-atom (contains CFWS)asciiz)local-part contains non-ASCII characters))r   rl  rm  r   rQ  r/   rr  ru  rv  r   r   get_obs_local_partr   rM   r   r  rw  r   encoder  ZNonASCIILocalPartDefect)r   r   rt  r?   obs_local_partr   r   r   get_local_part  sV   





r~  c                 C   s  	 t  }d}| r| d dks| d tvr| d dkr3|r%|jtd |t d}| dd  } q| d dkrU|t| d d | dd  } |jtd	 d}q|rg|d
 jdkrg|jtd z
t	| \}} d}W n tj
y   | d tvr t| \}} Y nw || | r| d dks| d tvs|d jdks|d jdkr|d jdkr|jtd |d
 jdks|d
 jdkr|d jdkr|jtd |jrd|_|| fS )NFr   r   r   zinvalid repeated '.'Tr   misplaced-specialz/'\' character outside of quoted-string/ccontentr   r   zmissing '.' between wordsrl   z!Invalid leading '.' in local partrZ  z"Invalid trailing '.' in local partry  )r   rv  r   r   r   r  r   r:  rM   ru  rQ  rl  rm  )r   r}  Zlast_non_ws_was_dotr?   r   r   r   r{    sh   






r{  c                 C   sB   	 t | d\}} }t|d}|r|jtd t| || fS )Nz[]r   z(quoted printable found in domain-literal)rJ  r:  r   r   r   rw  rA  )r   r   rH  r   r   r   	get_dtext  s   

r  c                 C   s,   | rdS | td | tdd dS )NFz"end of input inside domain-literal]domain-literal-endT)r   r   r  r:  )r   domain_literalr   r   r   _check_for_early_dl_end  s   r  c                 C   sf  	 t  }| d tv rt| \}} || | std| d dkr*td| | dd  } t| |r9|| fS |tdd | d t	v rRt
| \}} || t| \}} || t| |rf|| fS | d t	v rwt
| \}} || t| |r|| fS | d dkrtd| |tdd	 | dd  } | r| d tv rt| \}} || || fS )
Nr   zexpected domain-literal[z6expected '[' at start of domain-literal but found '{}'r   zdomain-literal-startr  z4expected ']' at end of domain-literal but found '{}'r  )r   rl  rm  r   r   rQ  r/   r  r:  rV  rL  r  )r   r  r?   r   r   r   get_domain_literal  sJ   








r  c                 C   st  	 t  }d }| d tv rt| \}} | std| | d dkr<t| \}} |d ur3|g|d d< || || fS zt| \}} W n tjyT   t	| \}} Y nw | rb| d dkrbtd|d urm|g|d d< || | r| d dkr|j
td |d jdkr|d |d d < | r| d dkr|t t	| d	d  \}} || | r| d dks|| fS )
Nr   zexpected domain but found '{}'r  r   zInvalid Domainr   z(domain is not a dot-atom (contains CFWS)r   r   )r   rl  rm  r   rQ  r/   r  r   rr  rp  r   rw  rM   r   )r   r   rt  r?   r   r   r   
get_domain=  sJ   





r  c                 C   s~   	 t  }t| \}} || | r| d dkr$|jtd || fS |tdd t| dd  \}} || || fS )Nr   r   z#addr-spec local part with no domainaddress-at-symbolr   )r   r~  r   r   r   r  r:  r  )r   r   r?   r   r   r   get_addr_specc  s   


r  c                 C   s  	 t  }| rC| d dks| d tv rC| d tv r$t| \}} || n| d dkr5|t | dd  } | rC| d dks| d tv s| rK| d dkrStd| |t t	| dd  \}} || | r| d dkr|t | dd  } | s}n3| d tv rt| \}} || | d dkr|t t	| dd  \}} || | r| d dkso| std| d dkrtd| |t
dd	 || dd  fS )
Nr   r=  r   r   z(expected obs-route domain but found '{}'z%end of header while parsing obs-route:z4expected ':' marking end of obs-route but found '{}'zend-of-obs-route-marker)r   rl  rm  r   ListSeparatorr   rQ  r/   RouteComponentMarkerr  r:  )r   Z	obs_router?   r   r   r   get_obs_routes  sL   







r  c                 C   s  	 t  }| d tv rt| \}} || | r| d dkr%td| |tdd | dd  } | d dkrT|tdd |jt	d | dd  } || fS zt
| \}} W n7 tjy   zt| \}} |jtd	 W n tjy   td
| w || t
| \}} Y nw || | r| d dkr| dd  } n	|jt	d |tdd | r| d tv rt| \}} || || fS )Nr   <z"expected angle-addr but found '{}'zangle-addr-startr   >zangle-addr-endznull addr-spec in angle-addrz*obsolete route specification in angle-addrz.expected addr-spec or obs-route but found '{}'z"missing trailing '>' on angle-addr)r   rl  rm  r   r   rQ  r/   r:  r   r  r  r  rw  )r   Z
angle_addrr?   r   r   r   get_angle_addr  sZ   








r  c                 C   s>   	 t  }t| \}} ||d d   |jd d  |_|| fS r   )r   rx  r=   r   )r   r   r?   r   r   r   get_display_name  s   r  c                 C   s   	 t  }d }| d tv rt| \}} | std|| d dkrT| d tv r0td| t| \}} | s@td||d urO|g|d d d< d }|| t	| \}} |d ure|g|d d< || || fS )Nr   z!expected name-addr but found '{}'r  )
r   rl  rm  r   rQ  r/   rv  r  r   r  )r   Z	name_addrrt  r?   r   r   r   get_name_addr  s8   

r  c                 C   s   	 t  }zt| \}} W n# tjy/   zt| \}} W n tjy,   td| w Y nw tdd |jD r=d|_|	| || fS )Nzexpected mailbox but found '{}'c                 s       | ]	}t |tjV  qd S r   )r   r   r  r"   r   r   r   r%         zget_mailbox.<locals>.<genexpr>r   )
r   r  r   rQ  r  r/   anyr4   rM   r   )r   r   r?   r   r   r   get_mailbox  s(   
r  c                 C   st   	 t  }| r6| d |vr6| d tv r#|t| d d | dd  } nt| \}} || | r6| d |vs|| fS )Nr   r  r   )r   rv  r   r:  rx  )r   rD  Zinvalid_mailboxr?   r   r   r   get_invalid_mailbox     
r  c                 C   s  	 t  }| r| d dkrzt| \}} || W n tjy   d }| d tv rgt| \}} | r7| d dv rF|| |jtd nQt	| d\}} |d urX|g|d d< || |jt
d n0| d dkrw|jtd n t	| d\}} |d ur|g|d d< || |jt
d Y nw | r| d dvr|d }d|_t	| d\}} || |jt
d | r| d dkr|t | d	d  } | r| d dks|| fS )
Nr   ;z,;zempty element in mailbox-listzinvalid mailbox in mailbox-listr=  r   r   r   )r   r  r   r   rQ  rl  rm  r   rw  r  r  rM   r=   r  )r   Zmailbox_listr?   rt  r   r   r   r   get_mailbox_list  s`   









)r  c                 C   s  	 t  }| s|jtd || fS d }| rF| d tv rFt| \}} | s7|jtd || || fS | d dkrF|| || fS t| \}} t|j	dkrn|d ur\|| |
| |jtd || fS |d ury|g|d d< || || fS )Nzend of header before group-listr   zend of header in group-listr  zgroup-list with empty entries)r   r   r   r   r  rl  rm  r  r   r   r=   rw  )r   Z
group_listrt  r?   r   r   r   get_group_listW  s@   







r  c                 C   s  	 t  }t| \}} | r| d dkrtd| || |tdd | dd  } | rE| d dkrE|tdd || dd  fS t| \}} || | s\|jt	d n| d dkrjtd	| |tdd | dd  } | r| d t
v rt| \}} || || fS )
Nr   r  z8expected ':' at end of group display name but found '{}'zgroup-display-name-terminatorr   r  zgroup-terminatorzend of header in groupz)expected ';' at end of group but found {})r   r  r   rQ  r/   r   r:  r  r   r  rl  rm  )r   r   r?   r   r   r   	get_group|  s:   



r  c                 C   sr   	 t  }zt| \}} W n# tjy/   zt| \}} W n tjy,   td| w Y nw || || fS )Nzexpected address but found '{}')r   r  r   rQ  r  r/   r   )r   r   r?   r   r   r   get_address  s    
r  c              
   C   s  	 t  }| rzt| \}} || W n tjy } zd }| d tv ret| \}} | r2| d dkrA|| |jtd nWt	| d\}} |d urS|g|d d< |t
|g |jtd n3| d dkru|jtd n#t	| d\}} |d ur|g|d d< |t
|g |jtd W Y d }~nd }~ww | r| d dkr|d d }d|_t	| d\}} || |jtd | r|tdd | d	d  } | s|| fS )
Nr   r=  z"address-list entry with no contentzinvalid address in address-listzempty element in address-listr   r   r>  r   )r   r  r   r   rQ  rl  rm  r   rw  r  r   r  rM   r=   r:  )r   Zaddress_listr?   errrt  r   r   r   r   get_address_list  s`   	






)r  c                 C   s   	 t  }| std| | d dkrtd| |tdd | dd  } t| \}} || | r=| d dkrEtd| |tdd	 || dd  fS )
Nz'expected no-fold-literal but found '{}'r   r  z;expected '[' at the start of no-fold-literal but found '{}'zno-fold-literal-startr   r  z9expected ']' at the end of no-fold-literal but found '{}'zno-fold-literal-end)r   r   rQ  r/   r   r:  r  )r   Zno_fold_literalr?   r   r   r   get_no_fold_literal  s,   
r  c                 C   sr  	 t  }| r| d tv rt| \}} || | r| d dkr'td| |tdd | dd  } zt| \}} W n, tjyi   zt	| \}} |j
td W n tjyf   td| w Y nw || | rw| d dkr|j
td	 | r| d d
kr|td
d | dd  } || fS |tdd | dd  } zt| \}} W nH tjy   zt| \}} W n5 tjy } z(zt| \}} |j
td W n tjy   td| w W Y d }~nd }~ww Y nw || | r| d d
kr| dd  } n	|j
td |td
d | r5| d tv r5t| \}} || || fS )Nr   r  zexpected msg-id but found '{}'zmsg-id-startr   zobsolete id-left in msg-idz4expected dot-atom-text or obs-id-left but found '{}'r   zmsg-id with no id-rightr  z
msg-id-endr  zobsolete id-right in msg-idzFexpected dot-atom-text, no-fold-literal or obs-id-right but found '{}'zmissing trailing '>' on msg-id)r(  rl  rm  r   r   rQ  r/   r:  rq  r{  r   rw  r  r  r  )r   Zmsg_idr?   er   r   r   
get_msg_id  s   










r  c              
   C   s   	 t  }zt| \}} || W n( tjy9 } zt| }t|}|jtd	| W Y d }~|S d }~ww | rH|jtd	|  |S )NzInvalid msg-id: {!r}zUnexpected {!r})
r*  r  r   r   rQ  r_  r+  r   r  r/   )r   Z
message_idr?   exr   r   r   parse_message_idI  s&   
r  c                 C   s  	 t  }| s|jtd |S | d tv r-t| \}} || | s-|jtd d}| rW| d dkrW| d tvrW|| d 7 }| dd  } | rW| d dkrW| d tvs=| sp|jtd	| |t
|d nt||_|t
|d	 | r| d tv rt| \}} || | r| d dkr|jd ur|jtd
 | r|t
| d |S |t
dd | dd  } | r| d tv rt| \}} || | s|jd ur|jtd
 |S d}| r| d tvr|| d 7 }| dd  } | r| d tvs| s |jtd	| |t
|d nt||_|t
|d	 | rB| d tv rBt| \}} || | rV|jtd |t
| d |S )Nz%Missing MIME version number (eg: 1.0)r   z0Expected MIME version number but found only CFWSr   r   r   z1Expected MIME major version number but found {!r}r@  digitsz0Incomplete MIME version; found only major numberzversion-separatorz1Expected MIME minor version number but found {!r}z'Excess non-CFWS text after MIME version)r   r   r   r   HeaderMissingRequiredValuerl  rm  isdigitr  r/   r:  intr   r   )r   Zmime_versionr?   r  r   r   r   parse_mime_versione  s   















r  c                 C   st   	 t  }| r6| d dkr6| d tv r#|t| d d | dd  } nt| \}} || | r6| d dks|| fS )Nr   r  r  r   )r   rv  r   r:  rx  )r   Zinvalid_parameterr?   r   r   r   get_invalid_parameter  r  r  c                 C   re  )Nzexpected ttext but found '{}'ttext)_non_token_end_matcherr   rQ  r/   r   r   r:  rA  )r   rh  r  r   r   r   	get_ttext     
r  c                 C      	 t  }| r| d tv rt| \}} || | r'| d tv r'td| t| \}} || | rE| d tv rEt| \}} || || fS Nr   zexpected token but found '{}')	rp   rl  rm  r   
TOKEN_ENDSr   rQ  r/   r  )r   Zmtokenr?   r   r   r   	get_token     


r  c                 C   re  )Nz expected attrtext but found {!r}r   )_non_attribute_end_matcherr   rQ  r/   r   r   r:  rA  r   rh  r   r   r   r   get_attrtext  r  r  c                 C   r  r  )	r   rl  rm  r   ATTRIBUTE_ENDSr   rQ  r/   r  r   r   r?   r   r   r   get_attribute  r  r  c                 C   re  )Nz)expected extended attrtext but found {!r}extended-attrtext)#_non_extended_attribute_end_matcherr   rQ  r/   r   r   r:  rA  r  r   r   r   get_extended_attrtext	  s   
r  c                 C   r  r  )	r   rl  rm  r   EXTENDED_ATTRIBUTE_ENDSr   rQ  r/   r  r  r   r   r   get_extended_attribute!	  s   


r  c                 C   s   	 t  }| r| d dkrtd| |tdd | dd  } | r*| d  s2td| d}| rP| d  rP|| d 7 }| dd  } | rP| d  s<|d dkrc|dkrc|jtd	 t	||_
|t|d
 || fS )Nr   *zExpected section but found {}zsection-markerr   z$Expected section number but found {}r   0z'section number has an invalid leading 0r  )r  r   rQ  r/   r   r:  r  r   r  r  r   )r   r  r  r   r   r   get_section7	  s0   

r  c                 C   s   	 t  }| stdd }| d tv rt| \}} | s#td|| d dkr0t| \}} nt| \}} |d urA|g|d d< || || fS )Nz&Expected value but found end of stringr   z Expected value but found only {}r
   )	r  r   rQ  rl  rm  r/   rn  r  r   )r   vrt  r?   r   r   r   	get_valueU	  s$   

r  c                 C   sz  	 t  }t| \}} || | r| d dkr'|jtd| || fS | d dkrfzt| \}} d|_|| W n
 tj	yG   Y nw | sOt	d| d dkrf|t
dd | dd  } d|_| d d	krqt	d
|t
d	d | dd  } d }| r| d tv rt| \}} || d }|}|jr| r| d dkrt| \}}|j}d}|jdkr|r|d dkrd}n#t|\}}	|	r|	d dkrd}nzt|\}}	W n   Y n|	sd}|r|jtd || |D ]}
|
jdkr	g |
d d < |
} nq|} nd }|jtd | r%| d dkr%d }nt| \}} |jr5|jdkrX| r?| d dkrO|| |d urK|} || fS |jtd | ss|jtd || |d u rr|| fS nw|d ur|D ]}
|
jdkr nqz|
jdk ||
 |
j|_| d dkrt	d| |t
dd | dd  } | r| d dkrt| \}} || |j|_| r| d dkrt	d| |t
dd | dd  } |d ur't }| r$| d tv rt| \}} n| d dkrt
dd}| dd  } nt| \}} || | s|}nt| \}} || |d ur9|} || fS )Nr   r  z)Parameter contains name ({}) but no valuer  TzIncomplete parameterzextended-parameter-markerr   =zParameter not followed by '='parameter-separatorr
   F'z5Quoted string value for extended parameter is invalidr}   zZParameter marked as extended but appears to have a quoted string value that is non-encodedzcApparent initial-extended-value but attribute was not marked as extended or was not initial sectionz(Missing required charset/lang delimitersr  r   z=Expected RFC2231 char/lang encoding delimiter, but found {!r}zRFC2231-delimiterz;Expected RFC2231 char/lang encoding delimiter, but found {}ZDQUOTE)r   r  r   r   r   r  r/   r  r   rQ  r:  r   rl  rm  rn  r   r   r  r  rM   r  r   ru   rv   r  rV  rL  rd  )r   r  r?   rt  rF  ZappendtoZqstringZinner_valueZ
semi_validrW  tr  r   r   r   get_parameterk	  s   





















	

r  c              
   C   sn  	 t  }| rzt| \}} || W ni tjy| } z\d }| d tv r*t| \}} | s9|| |W  Y d }~S | d dkrR|d urH|| |jtd n t	| \}} |ra|g|d d< || |jtd
| W Y d }~nd }~ww | r| d dkr|d }d|_t	| \}} || |jtd
| | r|tdd | d	d  } | s|S )
Nr   r  zparameter entry with no contentzinvalid parameter {!r}r   r   z)parameter with invalid trailing text {!r}r  r   )r  r  r   r   rQ  rl  rm  r   r  r  r/   rM   r=   r:  )r   Zmime_parametersr?   r  rt  r  r   r   r   parse_mime_parameters	  sR   






$r  c                 C   s   	 |r3|d dkr3|d t v r | t|d d |dd  }nt|\}}| | |r3|d dks	|s7d S | tdd | t|dd   d S )Nr   r  r  r   r  )rv  r   r:  rx  r  )Z	tokenlistr   r?   r   r   r   _find_mime_parameters-
  s   
r  c              
   C   s  	 t  }d}| s|jtd |S zt| \}} W n tjy8   |jtd|  t	||  | Y S w || | rF| d dkrX|jtd | rVt	||  |S |j
  |_|tdd | dd  } zt| \}} W n tjy   |jtd	|  t	||  | Y S w || |j
  |_| s|S | d d
kr|jtd|  |`|`t	||  |S |td
d |t| dd   |S )NFz"Missing content type specificationz(Expected content maintype but found {!r}r   r1  zInvalid content typezcontent-type-separatorr   z'Expected content subtype but found {!r}r  z<Only parameters are valid after content type, but found {!r}r  )r  r   r   r   r  r  rQ  r  r/   r  r   r
  lowerr!  r:  r"  r  )r   ZctypeZrecoverr?   r   r   r   parse_content_type_header=
  sh   










r  c              
   C   s   	 t  }| s|jtd |S zt| \}} W n tjy6   |jtd|  t	||  | Y S w || |j
  |_| sH|S | d dkra|jtd|  t	||  |S |tdd |t| dd   |S )NzMissing content dispositionz+Expected content disposition but found {!r}r   r  zCOnly parameters are valid after content disposition, but found {!r}r  r   )r#  r   r   r   r  r  rQ  r  r/   r  r   r
  r  r$  r:  r  )r   Zdisp_headerr?   r   r   r    parse_content_disposition_headerv
  s<   





r  c              
   C   s   	 t  }| s|jtd |S zt| \}} W n tjy/   |jtd|  Y nw || |j	
  |_| sA|S | rp|jtd | d tv rc|t| d d | dd  } nt| \}} || | sC|S )Nz!Missing content transfer encodingz1Expected content transfer encoding but found {!r}z*Extra text after content transfer encodingr   r  r   )r&  r   r   r   r  r  rQ  r  r/   r   r
  r  rt   rv  r:  rx  )r   Z
cte_headerr?   r   r   r   &parse_content_transfer_encoding_header
  s:   





	r  c                 C   sD   d}| r | d r | d d t v r | d d }| d d d | d< |S )Nr   r   )rV  )linesZwspr   r   r   _steal_trailing_WSP_if_exists
  s
   r  c                C   s  	 |j ptj}|jrdnd}dg}d }d}d}tdd}t| }	|	rI|	d}
|
|u r1|d8 }q t|
}|
jdkrBt	|t
@ rBd	}z	|| |}W n tye   td
d |
jD r_d}nd}d	}Y nw |
jdkrst|
||| q |r|s|
jsd}d }|
jr|
j|dd t|j  }|j|vrt||t|d  krt|}|| |d  |7  < q t|
dst|
|	 }	n
t|||||
j|}d}q t||t|d  kr|d  |7  < q |
jrt|d |krt|}|s|
 r|||  d }q t|
dst|
}|
js|d7 }|| ||	 }	q |
jr+|s+|	d|
 d	}q t|}|s7|
 r?|||  n|d  |7  < |	s#|j||j S )Nutf-8r   r   r   Fwrap_as_ew_blockedr   r   Tc                 s   r  r   )r   r   r  r"   r   r   r   r%   
  r  z%_refold_parse_tree.<locals>.<genexpr>unknown-8bitr  r@   r   r|  )Zmax_line_lengthsysmaxsizeutf8r.  r2  r   r   rM   r   rs  r|  r  r  r4   _fold_mime_parametersr:   rS   rD   r   r)  r  r   rN   _fold_as_ewrT   r8   insertr(   )Z
parse_treerA   maxlenr  r  last_ewr  Zwant_encodingZend_ew_not_allowedr  r;   tstrru   Zencoded_partnewlineZnewpartsr   r   r   rB   
  s   



	




XrB   c                 C   s  	 |d ur|rt t|d |d  |  } |d d | |d< | d tv rF| d }| dd  } t|d |kr>|t| |d  |7  < d}| d tv rX| d }| d d } |d u rbt|d n|}|dkrjdn|}	t|	d }
|
d |kr}td| r|t|d  }||
 }|dkr|d	 q}| d | }tj	||	d
}t|| }|dkr|d d }tj	||	d
}t|| }|dks|d  |7  < | t|d  } | r|d	 t|d }| s|d  |7  < |r|S d S )Nr   r   r   r   r   r     z3max_line_length is too small to fit an encoded wordrZ   )ru   )
r   r_  rV  r   r   r  r   rQ  rS  r|  )Z	to_encoder  r  r  rT   ru   Zleading_wspZtrailing_wspZnew_last_ewZ	encode_as
chrome_lenZremaining_spaceZ
text_spaceZto_encode_wordZencoded_wordZexcessr   r   r   r  1  sZ   


r  c              	   C   s  	 | j D ]\}}|d  ds|d  d7  < |}d}z	|| d}W n ty=   d}t|r9d}d}nd}Y nw |rQtjj	|d	|d
}	d
|||	}
nd
|t|}
t|d t|
 d |k rr|d d |
 |d< qt|
d |kr|d|
  qd}|d }|rt|tt| d t| }||d krd}|| d  }}	 |d | }tjj	|d	|d
}	t|	|krn|d8 }q|d
||||	 d	}|d7 }||d  }|r|d  d7  < |sqd S )Nr   r  strictFTr  r	  r  r   )safer   z
{}*={}''{}r  r   rZ   r   r   z''r   N   z {}*{}*={}{})r  r   r   r|  r  r   r  r  r  r   r/   r   r   r   r   )r;   r  r  r  r  r   ru   Zerror_handlerZencoding_requiredZencoded_valuer  r  Zextra_chromer  Z
splitpointZmaxcharspartialr   r   r   r  r  sp   

 r  )rer  r  stringr   operatorr   Zemailr   rS  r   r   r   rV  rl  rs  ro  r   rv  Z	TSPECIALSr  Z	ASPECIALSr  r  r   compileVERBOSE	MULTILINEr[  r2  r   rW   rd   rh   rj   rk   rm   rp   rr   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r#  r&  r'  r(  r*  r+  r,  r   r.  r6  r:  r;  rQ  r<  r   r  r  r/   r(   r   rB  rG  matchrg  findallr?  r  r  r  rA  rJ  rL  rY  r_  rc  rd  ri  rj  rk  rm  rn  rp  rq  rr  ru  rx  r~  r{  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rB   r  r  r   r   r   r   <module>   s@   E
C"	
!*$
V	+






1C+"&'/'&).9%7ED 49/gA