<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</html>
3
Ii                @   sv  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 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hZeeB Zdd 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Z.G d8d9 d9eZ/G d:d; d;eZ0G d<d= d=eZ1G d>d? d?eZ2G d@dA dAeZ3G dBdC dCeZ4G dDdE dEeZ5G dFdG dGeZ6G dHdI dIeZ7G dJdK dKe Z8G dLdM dMeZ9G dNdO dOeZ:G dPdQ dQeZ;G dRdS dSeZ<G dTdU dUe<Z=G dVdW dWeZ>G dXdY dYeZ?G dZd[ d[eZ@G d\d] d]eZAG d^d_ d_eZBG d`da daeBZCG dbdc dceBZDG ddde deeZEG dfdg dgeZFG dhdi dieZGG djdk dkeHZIG dldm dmeIZJG dndo doeIZKG dpdq dqeJZLeKddrZMeKdsdtZNeKdudvZOe jPdwjQdxjRejSZTe jPdyjQdxjRejUdzd{jUd|d}jVZWe jPd~jXZYe jPdyjQdxjRejUdzd{jUd|d}jVZZe jPdyjQdxjRejUdzd{jUd|d}jVZ[e jPdyjQdxjRejUdzd{jUd|d}jVZ\dd Z]dd Z^dd Z_dd Z`dd Zadd 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 ZdS )    N)	hexdigits)OrderedDict)
itemgetter)_encoded_words)errors)utilsz 	(z()<>@,:;.\"[].z."(z/?=z*'%%
c             C   s    dt | jddjdd d S )N"\z\\z\")strreplace)value r   2/usr/lib64/python3.6/email/_header_value_parser.pyquote_stringb   s    r   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|| g | _d S )N)super__init__defects)selfargskw)	__class__r   r   r   o   s    zTokenList.__init__c             C   s   dj dd | D S )N c             s   s   | ]}t |V  qd S )N)r   ).0xr   r   r   	<genexpr>t   s    z$TokenList.__str__.<locals>.<genexpr>)join)r   r   r   r   __str__s   s    zTokenList.__str__c                s   dj | jjt j S )Nz{}({}))formatr   __name__r   __repr__)r   )r   r   r   r%   v   s    
zTokenList.__repr__c             C   s   dj dd | D S )Nr   c             s   s   | ]}|j r|j V  qd S )N)r   )r   r   r   r   r   r    |   s    z"TokenList.value.<locals>.<genexpr>)r!   )r   r   r   r   r   z   s    zTokenList.valuec             C   s   t dd | D | jS )Nc             s   s   | ]}|j V  qd S )N)all_defects)r   r   r   r   r   r       s    z(TokenList.all_defects.<locals>.<genexpr>)sumr   )r   r   r   r   r&   ~   s    zTokenList.all_defectsc             C   s   | d j  S )Nr   )startswith_fws)r   r   r   r   r(      s    zTokenList.startswith_fwsc             C   s   t dd | D S )Nc             s   s   | ]}|j V  qd S )N)as_ew_allowed)r   partr   r   r   r       s    z*TokenList.as_ew_allowed.<locals>.<genexpr>)all)r   r   r   r   r)      s    zTokenList.as_ew_allowedc             C   s"   g }x| D ]}|j |j q
W |S )N)extendcomments)r   r-   tokenr   r   r   r-      s    
zTokenList.commentsc            C   s   t | |dS )N)policy)_refold_parse_tree)r   r/   r   r   r   fold   s    zTokenList.foldr   c             C   s   t | j|d d S )N)indent)printppstr)r   r2   r   r   r   pprint   s    zTokenList.pprintc             C   s   dj | j|dS )Nr   )r2   )r!   _pp)r   r2   r   r   r   r4      s    zTokenList.ppstrc             c   s~   dj || jj| jV  x<| D ]4}t|ds<|dj | V  q|j|d E d H  qW | jrhdj | j}nd}dj ||V  d S )Nz{}{}/{}(r6   z*    !! invalid element in token list: {!r}z    z Defects: {}r   z{}){})r#   r   r$   
token_typehasattrr6   r   )r   r2   r.   Zextrar   r   r   r6      s    


zTokenList._pp)r   )r   )r   )r$   
__module____qualname__r7   syntactic_breakew_combine_allowedr   r"   r%   propertyr   r&   r(   r)   r-   r1   r5   r4   r6   __classcell__r   r   )r   r   r   i   s   

r   c               @   s$   e Zd Zedd Zedd ZdS )WhiteSpaceTokenListc             C   s   dS )N r   )r   r   r   r   r      s    zWhiteSpaceTokenList.valuec             C   s   dd | D S )Nc             S   s   g | ]}|j d kr|jqS )comment)r7   content)r   r   r   r   r   
<listcomp>   s    z0WhiteSpaceTokenList.comments.<locals>.<listcomp>r   )r   r   r   r   r-      s    zWhiteSpaceTokenList.commentsN)r$   r9   r:   r=   r   r-   r   r   r   r   r?      s   r?   c               @   s   e Zd ZdZdS )UnstructuredTokenListunstructuredN)r$   r9   r:   r7   r   r   r   r   rD      s   rD   c               @   s   e Zd ZdZdS )PhrasephraseN)r$   r9   r:   r7   r   r   r   r   rF      s   rF   c               @   s   e Zd ZdZdS )WordZwordN)r$   r9   r:   r7   r   r   r   r   rH      s   rH   c               @   s   e Zd ZdZdS )CFWSListcfwsN)r$   r9   r:   r7   r   r   r   r   rI      s   rI   c               @   s   e Zd ZdZdS )AtomatomN)r$   r9   r:   r7   r   r   r   r   rK      s   rK   c               @   s   e Zd ZdZdZdS )Tokenr.   FN)r$   r9   r:   r7   Zencode_as_ewr   r   r   r   rM      s   rM   c               @   s   e Zd ZdZdZdZdZdS )EncodedWordzencoded-wordN)r$   r9   r:   r7   ctecharsetlangr   r   r   r   rN      s   rN   c               @   s4   e Zd ZdZedd Zedd Zedd ZdS )	QuotedStringzquoted-stringc             C   s"   x| D ]}|j dkr|jS qW d S )Nzbare-quoted-string)r7   r   )r   r   r   r   r   rB      s    

zQuotedString.contentc             C   sB   g }x2| D ]*}|j dkr(|jt| q
|j|j q
W dj|S )Nzbare-quoted-stringr   )r7   appendr   r   r!   )r   resr   r   r   r   quoted_value   s    

zQuotedString.quoted_valuec             C   s"   x| D ]}|j dkr|jS qW d S )Nzbare-quoted-string)r7   r   )r   r.   r   r   r   stripped_value   s    

zQuotedString.stripped_valueN)r$   r9   r:   r7   r=   rB   rU   rV   r   r   r   r   rR      s   
rR   c               @   s$   e Zd ZdZdd Zedd ZdS )BareQuotedStringzbare-quoted-stringc             C   s   t djdd | D S )Nr   c             s   s   | ]}t |V  qd S )N)r   )r   r   r   r   r   r       s    z+BareQuotedString.__str__.<locals>.<genexpr>)r   r!   )r   r   r   r   r"      s    zBareQuotedString.__str__c             C   s   dj dd | D S )Nr   c             s   s   | ]}t |V  qd S )N)r   )r   r   r   r   r   r      s    z)BareQuotedString.value.<locals>.<genexpr>)r!   )r   r   r   r   r      s    zBareQuotedString.valueN)r$   r9   r:   r7   r"   r=   r   r   r   r   r   rW      s   rW   c               @   s8   e Zd ZdZdd Zdd Zedd Zedd	 Zd
S )CommentrA   c                s(   dj tdg fdd D dggg S )Nr   r   c                s   g | ]} j |qS r   )quote)r   r   )r   r   r   rC     s    z#Comment.__str__.<locals>.<listcomp>))r!   r'   )r   r   )r   r   r"     s
    zComment.__str__c             C   s2   |j dkrt|S t|jddjddjddS )NrA   r   z\\r   z\(rZ   z\))r7   r   r   )r   r   r   r   r   rY     s
    
zComment.quotec             C   s   dj dd | D S )Nr   c             s   s   | ]}t |V  qd S )N)r   )r   r   r   r   r   r      s    z"Comment.content.<locals>.<genexpr>)r!   )r   r   r   r   rB     s    zComment.contentc             C   s   | j gS )N)rB   )r   r   r   r   r-     s    zComment.commentsN)	r$   r9   r:   r7   r"   rY   r=   rB   r-   r   r   r   r   rX     s
   rX   c               @   s4   e Zd ZdZedd Zedd Zedd ZdS )	AddressListzaddress-listc             C   s   dd | D S )Nc             S   s   g | ]}|j d kr|qS )address)r7   )r   r   r   r   r   rC   $  s    z)AddressList.addresses.<locals>.<listcomp>r   )r   r   r   r   	addresses"  s    zAddressList.addressesc             C   s   t dd | D g S )Nc             s   s   | ]}|j d kr|jV  qdS )r\   N)r7   	mailboxes)r   r   r   r   r   r    (  s   z(AddressList.mailboxes.<locals>.<genexpr>)r'   )r   r   r   r   r^   &  s    zAddressList.mailboxesc             C   s   t dd | D g S )Nc             s   s   | ]}|j d kr|jV  qdS )r\   N)r7   all_mailboxes)r   r   r   r   r   r    -  s   z,AddressList.all_mailboxes.<locals>.<genexpr>)r'   )r   r   r   r   r_   +  s    zAddressList.all_mailboxesN)r$   r9   r:   r7   r=   r]   r^   r_   r   r   r   r   r[     s   r[   c               @   s4   e Zd ZdZedd Zedd Zedd ZdS )	Addressr\   c             C   s   | d j dkr| d jS d S )Nr   group)r7   display_name)r   r   r   r   rb   5  s    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   mailboxzinvalid-mailbox)r7   r^   )r   r   r   r   r^   :  s
    
zAddress.mailboxesc             C   s:   | d j dkr| d gS | d j dkr0| d gS | d jS )Nr   rc   zinvalid-mailbox)r7   r_   )r   r   r   r   r_   B  s
    

zAddress.all_mailboxesN)r$   r9   r:   r7   r=   rb   r^   r_   r   r   r   r   r`   1  s   r`   c               @   s(   e Zd ZdZedd Zedd ZdS )MailboxListzmailbox-listc             C   s   dd | D S )Nc             S   s   g | ]}|j d kr|qS )rc   )r7   )r   r   r   r   r   rC   P  s    z)MailboxList.mailboxes.<locals>.<listcomp>r   )r   r   r   r   r^   N  s    zMailboxList.mailboxesc             C   s   dd | D S )Nc             S   s   g | ]}|j dkr|qS )rc   invalid-mailbox)rc   re   )r7   )r   r   r   r   r   rC   T  s    z-MailboxList.all_mailboxes.<locals>.<listcomp>r   )r   r   r   r   r_   R  s    zMailboxList.all_mailboxesN)r$   r9   r:   r7   r=   r^   r_   r   r   r   r   rd   J  s   rd   c               @   s(   e Zd ZdZedd Zedd ZdS )	GroupListz
group-listc             C   s"   |  s| d j dkrg S | d jS )Nr   zmailbox-list)r7   r^   )r   r   r   r   r^   \  s    zGroupList.mailboxesc             C   s"   |  s| d j dkrg S | d jS )Nr   zmailbox-list)r7   r_   )r   r   r   r   r_   b  s    zGroupList.all_mailboxesN)r$   r9   r:   r7   r=   r^   r_   r   r   r   r   rf   X  s   rf   c               @   s4   e Zd ZdZedd Zedd Zedd ZdS )	Groupra   c             C   s   | d j dkrg S | d jS )N   z
group-list)r7   r^   )r   r   r   r   r^   m  s    zGroup.mailboxesc             C   s   | d j dkrg S | d jS )Nrh   z
group-list)r7   r_   )r   r   r   r   r_   s  s    zGroup.all_mailboxesc             C   s
   | d j S )Nr   )rb   )r   r   r   r   rb   y  s    zGroup.display_nameN)r$   r9   r:   r7   r=   r^   r_   rb   r   r   r   r   rg   i  s   rg   c               @   sL   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 )NameAddrz	name-addrc             C   s   t | dkrd S | d jS )N   r   )lenrb   )r   r   r   r   rb     s    zNameAddr.display_namec             C   s
   | d j S )Nrj   )
local_part)r   r   r   r   rm     s    zNameAddr.local_partc             C   s
   | d j S )Nrj   rl   )domain)r   r   r   r   rn     s    zNameAddr.domainc             C   s
   | d j S )Nrj   rl   )route)r   r   r   r   ro     s    zNameAddr.routec             C   s
   | d j S )Nrj   rl   )	addr_spec)r   r   r   r   rp     s    zNameAddr.addr_specN)
r$   r9   r:   r7   r=   rb   rm   rn   ro   rp   r   r   r   r   ri   ~  s   ri   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   s"   x| D ]}|j dkr|jS qW d S )Nz	addr-spec)r7   rm   )r   r   r   r   r   rm     s    

zAngleAddr.local_partc             C   s"   x| D ]}|j dkr|jS qW d S )Nz	addr-spec)r7   rn   )r   r   r   r   r   rn     s    

zAngleAddr.domainc             C   s"   x| D ]}|j dkr|jS qW d S )Nz	obs-route)r7   domains)r   r   r   r   r   ro     s    

zAngleAddr.routec             C   s<   x6| D ]*}|j dkr|jr |jS t|j|j S qW dS d S )Nz	addr-specz<>)r7   rm   rp   r   )r   r   r   r   r   rp     s    

zAngleAddr.addr_specN)	r$   r9   r:   r7   r=   rm   rn   ro   rp   r   r   r   r   rq     s
   rq   c               @   s   e Zd ZdZedd ZdS )ObsRoutez	obs-routec             C   s   dd | D S )Nc             S   s   g | ]}|j d kr|jqS )rn   )r7   rn   )r   r   r   r   r   rC     s    z$ObsRoute.domains.<locals>.<listcomp>r   )r   r   r   r   rr     s    zObsRoute.domainsN)r$   r9   r:   r7   r=   rr   r   r   r   r   rs     s   rs   c               @   sL   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 )Mailboxrc   c             C   s   | d j dkr| d jS d S )Nr   z	name-addr)r7   rb   )r   r   r   r   rb     s    zMailbox.display_namec             C   s
   | d j S )Nr   )rm   )r   r   r   r   rm     s    zMailbox.local_partc             C   s
   | d j S )Nr   )rn   )r   r   r   r   rn     s    zMailbox.domainc             C   s   | d j dkr| d jS d S )Nr   z	name-addr)r7   ro   )r   r   r   r   ro     s    zMailbox.routec             C   s
   | d j S )Nr   )rp   )r   r   r   r   rp     s    zMailbox.addr_specN)
r$   r9   r:   r7   r=   rb   rm   rn   ro   rp   r   r   r   r   rt     s   rt   c               @   s,   e Zd ZdZedd Ze Z Z ZZ	dS )InvalidMailboxzinvalid-mailboxc             C   s   d S )Nr   )r   r   r   r   rb     s    zInvalidMailbox.display_nameN)
r$   r9   r:   r7   r=   rb   rm   rn   ro   rp   r   r   r   r   ru     s   ru   c                   s(   e Zd ZdZdZe fddZ  ZS )Domainrn   Fc                s   dj t jj S )Nr   )r!   r   r   split)r   )r   r   r   rn     s    zDomain.domain)r$   r9   r:   r7   r)   r=   rn   r>   r   r   )r   r   rv     s   rv   c               @   s   e Zd ZdZdS )DotAtomzdot-atomN)r$   r9   r:   r7   r   r   r   r   rx     s   rx   c               @   s   e Zd ZdZdZdS )DotAtomTextzdot-atom-textTN)r$   r9   r:   r7   r)   r   r   r   r   ry     s   ry   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 )AddrSpecz	addr-specFc             C   s
   | d j S )Nr   )rm   )r   r   r   r   rm     s    zAddrSpec.local_partc             C   s   t | dk rd S | d jS )N   rj   rl   )rk   rn   )r   r   r   r   rn     s    zAddrSpec.domainc             C   s<   t | dk r| d jS | d jj | d j | d jj  S )Nr{   r   rj   rh   )rk   r   rstriplstrip)r   r   r   r   r     s    
zAddrSpec.valuec             C   sL   t | j}t|t|t kr*t| j}n| j}| jd k	rH|d | j S |S )N@)setrm   rk   DOT_ATOM_ENDSr   rn   )r   ZnamesetZlpr   r   r   rp     s    

zAddrSpec.addr_specN)
r$   r9   r:   r7   r)   r=   rm   rn   r   rp   r   r   r   r   rz     s   rz   c               @   s   e Zd ZdZdZdS )ObsLocalPartzobs-local-partFN)r$   r9   r:   r7   r)   r   r   r   r   r      s   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 | }|d jdkr"|jd n*|d d jdkrLt |d dd  |d< |d jdkrd|j  n*|d d jdkrt |d d d |d	< |jS )
Nr   rJ   rj   rl   rl   rl   rl   rl   rl   )r   r7   popr   )r   rT   r   r   r   rb   +  s    
zDisplayName.display_namec                s   d}| j rd}nx| D ]}|jdkrd}qW |rd }}| d jdksX| d d jdkr\d}| d	 jdks|| d
 d jdkrd}|t| j | S t jS d S )NFTzquoted-stringr   r   rJ   r@   rj   rl   rl   rl   )r   r7   r   rb   r   r   )r   rY   r   ZpreZpost)r   r   r   r   :  s    

  zDisplayName.value)	r$   r9   r:   r7   r<   r=   rb   r   r>   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 d S )Nr   zquoted-string)r7   rU   r   )r   r   r   r   r   S  s    
zLocalPart.valuec             C   s   t g}t }d}x| d t g D ]}|jdkr.q|r^|jdkr^|d jdkr^t|d d |d< t|t}|r|jdkr|d jdkr|jt|dd   n
|j| |d	 }|}qW t|dd
 }|jS )NFr   rJ   dotrj   rl   rl   rl   rl   rl   )DOTr7   r   
isinstancerS   r   )r   rT   ZlastZ
last_is_tltokZis_tlr   r   r   rm   Z  s$    


zLocalPart.local_partN)r$   r9   r:   r7   r)   r=   r   rm   r   r   r   r   r   N  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                s   dj t jj S )Nr   )r!   r   r   rw   )r   )r   r   r   rn   w  s    zDomainLiteral.domainc             C   s"   x| D ]}|j dkr|jS qW d S )Nptext)r7   r   )r   r   r   r   r   ip{  s    

zDomainLiteral.ip)	r$   r9   r:   r7   r)   r=   rn   r   r>   r   r   )r   r   r   r  s   r   c               @   s   e Zd ZdZdZdZdS )MIMEVersionzmime-versionN)r$   r9   r:   r7   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	parameterFzus-asciic             C   s   | j r| d jS dS )Nrj   r   )	sectionednumber)r   r   r   r   section_number  s    zParameter.section_numberc             C   sb   x\| D ]T}|j dkr|jS |j dkrx4|D ],}|j dkr*x|D ]}|j dkr>|jS q>W q*W qW dS )Nr   zquoted-stringzbare-quoted-stringr   )r7   rV   )r   r.   r   r   r   param_value  s    






zParameter.param_valueN)
r$   r9   r:   r7   r   extendedrP   r=   r   r   r   r   r   r   r     s   r   c               @   s   e Zd ZdZdS )InvalidParameterzinvalid-parameterN)r$   r9   r:   r7   r   r   r   r   r     s   r   c               @   s   e Zd ZdZedd ZdS )	Attribute	attributec             C   s$   x| D ]}|j jdr|jS qW d S )Nattrtext)r7   endswithr   )r   r.   r   r   r   rV     s    
zAttribute.stripped_valueN)r$   r9   r:   r7   r=   rV   r   r   r   r   r     s   r   c               @   s   e Zd ZdZdZdS )SectionsectionN)r$   r9   r:   r7   r   r   r   r   r   r     s   r   c               @   s   e Zd ZdZedd ZdS )Valuer   c             C   s2   | d }|j dkr| d }|j jdr,|jS | jS )Nr   rJ   rj   quoted-stringr   extended-attribute)r   r   r   )r7   r   rV   r   )r   r.   r   r   r   rV     s    
zValue.stripped_valueN)r$   r9   r:   r7   r=   rV   r   r   r   r   r     s   r   c               @   s(   e Zd ZdZdZedd Zdd ZdS )MimeParameterszmime-parametersFc             c   s  t  }x\| D ]T}|jjdsq|d jdkr.q|d jj }||krLg ||< || j|j|f qW x|j D ]\}}t|t	dd}|d d }|j
}|j rt|dkr|d d dkr|d d jjtjd |d d }g }d}x|D ]\}	}
|	|kr6|
js$|
jjtjd qn|
jjtjd |d7 }|
j}|
jrytjj|}W n& tk
r   tjj|d	d
}Y nRX y|j|d}W n" tk
r   |jdd}Y nX tj|r|
jjtj  |j| qW dj|}||fV  qpW d S )Nr   r   r   )keyrj   z.duplicate parameter name; duplicate(s) ignoredz+duplicate parameter name; duplicate ignoredz(inconsistent RFC2231 parameter numberingzlatin-1)encodingsurrogateescapezus-asciir   )r   r7   r   r   striprS   r   itemssortedr   rP   r   rk   r   r   InvalidHeaderDefectr   urllibparseZunquote_to_bytesUnicodeEncodeErrorZunquotedecodeLookupErrorr   _has_surrogatesUndecodableBytesDefectr!   )r   paramsr.   namepartsZfirst_paramrP   Zvalue_partsir   paramr   r   r   r   r     sZ    




zMimeParameters.paramsc             C   sX   g }x8| j D ].\}}|r0|jdj|t| q|j| qW dj|}|rTd| S dS )Nz{}={}z; r@   r   )r   rS   r#   r   r!   )r   r   r   r   r   r   r   r"     s    
zMimeParameters.__str__N)r$   r9   r:   r7   r;   r=   r   r"   r   r   r   r   r     s   Fr   c               @   s   e Zd ZdZedd ZdS )ParameterizedHeaderValueFc             C   s&   x t | D ]}|jdkr
|jS q
W i S )Nzmime-parameters)reversedr7   r   )r   r.   r   r   r   r   %  s    

zParameterizedHeaderValue.paramsN)r$   r9   r:   r;   r=   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)r$   r9   r:   r7   r)   maintypesubtyper   r   r   r   r   -  s   r   c               @   s   e Zd ZdZdZdZdS )ContentDispositionzcontent-dispositionFN)r$   r9   r:   r7   r)   content_dispositionr   r   r   r   r   5  s   r   c               @   s   e Zd ZdZdZdZdS )ContentTransferEncodingzcontent-transfer-encodingFZ7bitN)r$   r9   r:   r7   r)   rO   r   r   r   r   r   <  s   r   c               @   s   e Zd ZdZdZdS )HeaderLabelzheader-labelFN)r$   r9   r:   r7   r)   r   r   r   r   r   C  s   r   c               @   s   e Zd ZdZdS )HeaderheaderN)r$   r9   r:   r7   r   r   r   r   r   I  s   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  j| |}||_g |_|S )N)r   __new__r7   r   )clsr   r7   r   )r   r   r   r   X  s    zTerminal.__new__c                s   dj | jjt j S )Nz{}({}))r#   r   r$   r   r%   )r   )r   r   r   r%   ^  s    zTerminal.__repr__c             C   s   t | jjd | j  d S )N/)r3   r   r$   r7   )r   r   r   r   r5   a  s    zTerminal.pprintc             C   s
   t | jS )N)listr   )r   r   r   r   r&   d  s    zTerminal.all_defectsr   c                s2   dj || jj| jt j | js"dn
dj | jgS )Nz{}{}/{}({}){}r   z {})r#   r   r$   r7   r   r%   r   )r   r2   )r   r   r   r6   h  s    zTerminal._ppc             C   s   d S )Nr   )r   r   r   r   pop_trailing_wsq  s    zTerminal.pop_trailing_wsc             C   s   g S )Nr   )r   r   r   r   r-   u  s    zTerminal.commentsc             C   s   t | | jfS )N)r   r7   )r   r   r   r   __getnewargs__y  s    zTerminal.__getnewargs__)r   )r$   r9   r:   r)   r<   r;   r   r%   r5   r=   r&   r6   r   r-   r   r>   r   r   )r   r   r   R  s   	r   c               @   s    e Zd Zedd Zdd ZdS )WhiteSpaceTerminalc             C   s   dS )Nr@   r   )r   r   r   r   r     s    zWhiteSpaceTerminal.valuec             C   s   dS )NTr   )r   r   r   r   r(     s    z!WhiteSpaceTerminal.startswith_fwsN)r$   r9   r:   r=   r   r(   r   r   r   r   r   }  s   r   c               @   s    e Zd Zedd Zdd ZdS )ValueTerminalc             C   s   | S )Nr   )r   r   r   r   r     s    zValueTerminal.valuec             C   s   dS )NFr   )r   r   r   r   r(     s    zValueTerminal.startswith_fwsN)r$   r9   r:   r=   r   r(   r   r   r   r   r     s   r   c               @   s    e Zd Zedd Zdd ZdS )EWWhiteSpaceTerminalc             C   s   dS )Nr   r   )r   r   r   r   r     s    zEWWhiteSpaceTerminal.valuec             C   s   dS )Nr   r   )r   r   r   r   r"     s    zEWWhiteSpaceTerminal.__str__N)r$   r9   r:   r=   r   r"   r   r   r   r   r     s   r   r   ,zlist-separatorr~   zroute-component-markerz([{}]+)r   z[^{}]+r   z\\]z\]z[\x00-\x20\x7F]c             C   s>   t | }|r| jjtj| tj| r:| jjtjd d S )Nz*Non-ASCII characters found in header token)_non_printable_finderr   rS   r   ZNonPrintableDefectr   r   r   )xtextZnon_printablesr   r   r   _validate_xtext  s    

r   c             C   s   t | d^}}g }d}d}xbtt|D ]J}|| dkrL|rFd}d}nd}q(|rVd}n|| |krdP |j||  q(W |d }dj|dj||d  g| |fS )Nrj   Fr   Tr   )_wsp_splitterrangerk   rS   r!   )r   endcharsZfragment	remainderZvcharsescapehad_qpposr   r   r   _get_ptext_to_endchars  s$    	r   c             C   s.   | j  }t| d t| t|  d}||fS )Nfws)r}   r   rk   )r   Znewvaluer   r   r   r   get_fws  s    r   c             C   s  t  }| jds tjdj| | dd  jdd^}}|| dd  krXtjdj| dj|}t|dkr|d tkr|d tkr|jdd^}}|d | }t|j dkr|j	j
tjd | |_dj|} ytjd| d \}}}}	W n( tk
r   tjd	j|jY nX ||_||_|j	j|	 xh|r|d tkrdt|\}
}|j
|
 q6t|d^}}t|d
}t| |j
| dj|}q6W || fS )Nz=?z"expected encoded word but found {}rh   z?=rj   r   r   zwhitespace inside encoded wordz!encoded word format invalid: '{}'vtext)rN   
startswithr   HeaderParseErrorr#   rw   r!   rk   r   r   rS   r   rO   _ewr   
ValueErrorrP   rQ   r,   WSPr   r   r   r   )r   ewr   r   Zremstrrestr   rP   rQ   r   r.   charsr   r   r   r   get_encoded_word  sH    

$




r   c             C   s  t  }x| r| d tkr4t| \}} |j| q
| jdryt| \}} W n tjk
rd   Y nrX d}t|dkr|d j	dkr|j
jtjd d}|rt|dkr|d j	d	krt|d d|d< |j| q
t| d^}}t|d
}t| |j| dj|} q
W |S )Nr   z=?Trj   r   z&missing whitespace before encoded wordFrh   zencoded-wordr   r   rl   rl   rl   )rD   r   r   rS   r   r   r   r   rk   r7   r   r   r   r   r   r   r!   )r   rE   r.   Zhave_wsr   r   r   r   r   r   get_unstructured!  s:    






r   c             C   s*   t | d\}} }t|d}t| || fS )Nz()r   )r   r   r   )r   r   _r   r   r   get_qp_ctextY  s    
r   c             C   s*   t | d\}} }t|d}t| || fS )Nr   r   )r   r   r   )r   r   r   r   r   r   get_qcontentj  s    

r   c             C   sN   t | }|stjdj| |j }| t|d  } t|d}t| || fS )Nzexpected atext but found '{}'atext)_non_atom_end_matcherr   r   r#   ra   rk   r   r   )r   mr   r   r   r   	get_atexty  s    
r   c             C   s  | d dkrt jdj| t }| dd  } | d dkrPt| \}} |j| x| r| d dkr| d tkr|t| \}} nd| d d dkry"t| \}} |j	jt j
d W q t jk
r   t| \}} Y qX nt| \}} |j| qRW | s|j	jt j
d || fS || dd  fS )	Nr   r   zexpected '"' but found '{}'rj   rh   z=?z!encoded word inside quoted stringz"end of header inside quoted string)r   r   r#   rW   r   rS   r   r   r   r   r   )r   Zbare_quoted_stringr.   r   r   r   get_bare_quoted_string  s2    


r   c             C   s   | r | d dkr t jdj| t }| dd  } x^| r| d dkr| d tkr^t| \}} n&| d dkrxt| \}} nt| \}} |j| q4W | s|j	jt j
d || fS || dd  fS )Nr   r   zexpected '(' but found '{}'rj   rZ   zend of header inside comment)r   r   r#   rX   r   r   get_commentr   rS   r   r   )r   rA   r.   r   r   r   r     s"    
r   c             C   sT   t  }xD| rJ| d tkrJ| d tkr2t| \}} nt| \}} |j| qW || fS )Nr   )rI   CFWS_LEADERr   r   r   rS   )r   rJ   r.   r   r   r   get_cfws  s    r   c             C   sp   t  }| r,| d tkr,t| \}} |j| t| \}} |j| | rh| d tkrht| \}} |j| || fS )Nr   )rR   r   r   rS   r   )r   Zquoted_stringr.   r   r   r   get_quoted_string  s    


r   c             C   s   t  }| r,| d tkr,t| \}} |j| | rL| d tkrLtjdj| | jdryt	| \}} W q tjk
r   t
| \}} Y qX nt
| \}} |j| | r| d tkrt| \}} |j| || fS )Nr   zexpected atom but found '{}'z=?)rK   r   r   rS   	ATOM_ENDSr   r   r#   r   r   r   )r   rL   r.   r   r   r   get_atom  s$    



r   c             C   s   t  }|  s| d tkr(tjdj| xP| rx| d tkrxt| \}} |j| | r*| d dkr*|jt | dd  } q*W |d tkrtjdjd|  || fS )Nr   z8expected atom at a start of dot-atom-text but found '{}'r	   rj   z4expected atom at end of dot-atom-text but found '{}'rl   )ry   r   r   r   r#   r   rS   r   )r   Zdot_atom_textr.   r   r   r   get_dot_atom_text  s    

r   c             C   s   t  }| d tkr(t| \}} |j| | jdrhyt| \}} W qt tjk
rd   t| \}} Y qtX nt| \}} |j| | r| d tkrt| \}} |j| || fS )Nr   z=?)	rx   r   r   rS   r   r   r   r   r   )r   Zdot_atomr.   r   r   r   get_dot_atom  s    



r   c             C   s   | d t krt| \}} nd }| d dkr8t| \}} n*| d tkrVtjdj| nt| \}} |d k	rx|g|d d< || fS )Nr   r   z1Expected 'atom' or 'quoted-string' but found '{}')r   r   r   SPECIALSr   r   r#   r   )r   leaderr.   r   r   r   get_word*  s    
r   c             C   s   t  }yt| \}} |j| W n( tjk
rH   |jjtjd Y nX x| r| d tkr| d dkr|jt |jjtj	d | dd  } qLyt| \}} W nD tjk
r   | d t
krt| \}} |jjtj	d n Y nX |j| qLW || fS )Nzphrase does not start with wordr   r	   zperiod in 'phrase'rj   zcomment found without atom)rF   r   rS   r   r   r   r   PHRASE_ENDSr   ObsoleteHeaderDefectr   r   )r   rG   r.   r   r   r   
get_phraseI  s.    




r   c             C   st  t  }d }| d tkr"t| \}} | s6tjdj| yt| \}} W n^ tjk
r   yt| \}} W n6 tjk
r   | d dkr| d tkr t	 }Y nX Y nX |d k	r|g|d d< |j
| | o| d dks| d tkr2tt||  \}} |jdkr|jj
tjd n|jj
tjd ||d< y|jjd W n( tk
rj   |jj
tjd Y nX || fS )	Nr   z"expected local-part but found '{}'r   z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   r   r   r   r   r#   r   r   r   r   rS   get_obs_local_partr   r7   r   r   r   r   encoder   ZNonASCIILocalPartDefect)r   rm   r   r.   obs_local_partr   r   r   get_local_parto  sB    




r   c             C   s  t  }d}x| o(| d dks,| d tkr*| d dkrl|rN|jjtjd |jt d}| dd  } qnD| d dkr|jt| d d | dd  } |jjtjd	 d}q|r|d jd
kr|jjtjd yt	| \}} d}W n4 tj
k
r   | d tkr t| \}} Y nX |j| qW |d jd
ks\|d jdkrn|d jd
krn|jjtjd |d jd
ks|d jdkr|d jd
kr|jjtjd |jrd|_|| fS )NFr   r   r	   zinvalid repeated '.'Trj   zmisplaced-specialz/'\' character outside of quoted-string/ccontentr   zmissing '.' between wordsrJ   z!Invalid leading '.' in local partrh   z"Invalid trailing '.' in local partzinvalid-obs-local-partrl   rl   rl   r   )r   r   r   rS   r   r   r   r   r7   r   r   r   r   )r   r   Zlast_non_ws_was_dotr.   r   r   r   r     sV    "





r   c             C   s@   t | d\}} }t|d}|r0|jjtjd t| || fS )Nz[]r   z(quoted printable found in domain-literal)r   r   r   rS   r   r   r   )r   r   r   r   r   r   	get_dtext  s    

r   c             C   s,   | rdS |j tjd |j tdd dS )NFz"end of input inside domain-literalr   zdomain-literal-endT)rS   r   r   r   )r   domain_literalr   r   r   _check_for_early_dl_end  s    r  c             C   sl  t  }| d tkr(t| \}} |j| | s6tjd| d dkrRtjdj| | dd  } t| |rp|| fS |jtdd | d t	krt
| \}} |j| t| \}} |j| t| |r|| fS | d t	krt
| \}} |j| t| |r || fS | d dkrtjdj| |jtdd	 | dd  } | rd| d tkrdt| \}} |j| || fS )
Nr   zexpected domain-literal[z6expected '[' at start of domain-literal but found '{}'rj   zdomain-literal-startr   z4expected ']' at end of domain-literal but found '{}'zdomain-literal-end)r   r   r   rS   r   r   r#   r  r   r   r   r   )r   r  r.   r   r   r   get_domain_literal  sD    







r  c             C   st  t  }d }| d tkr"t| \}} | s6tjdj| | d dkrvt| \}} |d k	rd|g|d d< |j| || fS yt| \}} W n" tjk
r   t	| \}} Y nX | r| d dkrtjd|d k	r|g|d d< |j| | o| d dkrl|j
jtjd |d jdkr(|d |d d < xB| rj| d dkrj|jt t	| d	d  \}} |j| q*W || fS )
Nr   zexpected domain but found '{}'r  r~   zInvalid Domainr	   z(domain is not a dot-atom (contains CFWS)zdot-atomrj   )rv   r   r   r   r   r#   r  rS   r   r   r   r   r7   r   )r   rn   r   r.   r   r   r   
get_domain  s@    




r  c             C   s~   t  }t| \}} |j| |  s.| d dkrH|jjtjd || fS |jtdd t| dd  \}} |j| || fS )Nr   r~   z"add-spec local part with no domainzaddress-at-symbolrj   )rz   r   rS   r   r   r   r   r  )r   rp   r.   r   r   r   get_addr_spec.  s    


r  c             C   s  t  }xf| rl| d dks$| d tkrl| d tkrHt| \}} |j| q| d dkr|jt | dd  } qW |  s| d dkrtjdj| |jt t	| dd  \}} |j| x| o| d dkrB|jt | dd  } | sP | d tkrt| \}} |j| | d dkr|jt t	| dd  \}} |j| qW | sTtjd| d dkrrtjdj| |jt
dd	 || dd  fS )
Nr   r   rj   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)rs   r   r   rS   ListSeparatorr   r   r#   RouteComponentMarkerr  r   )r   Z	obs_router.   r   r   r   get_obs_route>  sB    






r
  c             C   s  t  }| d tkr(t| \}} |j| |  s:| d dkrJtjdj| |jtdd | dd  } | d dkr|jtdd |jjtj	d | dd  } || fS yt
| \}} W nz tjk
r2   y"t| \}} |jjtjd	 W n( tjk
r   tjd
j| Y nX |j| t
| \}} Y nX |j| | r`| d dkr`| dd  } n|jjtj	d |jtdd | r| d tkrt| \}} |j| || fS )Nr   <z"expected angle-addr but found '{}'zangle-addr-startrj   >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)rq   r   r   rS   r   r   r#   r   r   r   r  r
  r   )r   Z
angle_addrr.   r   r   r   get_angle_addrg  sJ    






r  c             C   s<   t  }t| \}} |j|d d   |jd d  |_|| fS )N)r   r   r,   r   )r   rb   r.   r   r   r   get_display_name  s
    r  c             C   s   t  }d }| d tkr6t| \}} | s6tjdj|| d dkr| d tkr^tjdj| t| \}} | s~tjdj||d k	r|g|d d d< d }|j| t	| \}} |d k	r|g|d d< |j| || fS )Nr   z!expected name-addr but found '{}'r  )
ri   r   r   r   r   r#   r   r  rS   r  )r   Z	name_addrr   r.   r   r   r   get_name_addr  s0    

r  c             C   s   t  }yt| \}} W nN tjk
rd   yt| \}} W n& tjk
r^   tjdj| Y nX Y nX tdd |jD rd|_|j	| || fS )Nzexpected mailbox but found '{}'c             s   s   | ]}t |tjV  qd S )N)r   r   r   )r   r   r   r   r   r      s   zget_mailbox.<locals>.<genexpr>zinvalid-mailbox)
rt   r  r   r   r  r#   anyr&   r7   rS   )r   rc   r.   r   r   r   get_mailbox  s    
r  c             C   sh   t  }xX| r^| d |kr^| d tkrF|jt| d d | dd  } qt| \}} |j| qW || fS )Nr   zmisplaced-specialrj   )ru   r   rS   r   r   )r   r   Zinvalid_mailboxr.   r   r   r   get_invalid_mailbox  s    r  c             C   s  t  }x| o| d dkryt| \}} |j| W n tjk
r@   d }| d tkrt| \}} |  sz| d dkr|j| |jjtjd n@t	| d\}} |d k	r|g|d d< |j| |jjtj
d nb| d dkr|jjtjd nBt	| d\}} |d k	r |g|d d< |j| |jjtj
d Y nX | r| d dkr|d	 }d|_t	| d\}} |j| |jjtj
d | r
| d dkr
|jt | dd  } q
W || fS )
Nr   ;z,;zempty element in mailbox-listzinvalid mailbox in mailbox-listr   rj   zinvalid-mailboxrl   )rd   r  rS   r   r   r   r   r   r   r  r   r7   r,   r  )r   Zmailbox_listr.   r   rc   r   r   r   get_mailbox_list  sN    













r  c             C   s  t  }| s$|jjtjd || fS d }| r| d tkrt| \}} | sl|jjtjd |j| || fS | d dkr|j| || fS t| \}} t|j	dkr|d k	r|j| |j
| |jjtjd || fS |d k	r|g|d d< |j| || fS )Nzend of header before group-listr   zend of header in group-listr  zgroup-list with empty entries)rf   r   rS   r   r   r   r   r  rk   r_   r,   r   )r   Z
group_listr   r.   r   r   r   get_group_list"  s8    







r  c             C   s"  t  }t| \}} |  s$| d dkr4tjdj| |j| |jtdd | dd  } | r| d dkr|jtdd || dd  fS t| \}} |j| | s|jjtj	d n| d dkrtjd	j| |jtdd | dd  } | r| d t
krt| \}} |j| || fS )
Nr   r  z8expected ':' at end of group display name but found '{}'zgroup-display-name-terminatorrj   r  zgroup-terminatorzend of header in groupz)expected ';' at end of group but found {})rg   r  r   r   r#   rS   r   r  r   r   r   r   )r   ra   r.   r   r   r   	get_groupG  s2    




r  c             C   sx   t  }yt| \}} W nN tjk
rd   yt| \}} W n& tjk
r^   tjdj| Y nX Y nX |j| || fS )Nzexpected address but found '{}')r`   r  r   r   r  r#   rS   )r   r\   r.   r   r   r   get_addresse  s    
r  c             C   s  t  }x| ryt| \}} |j| W n$ tjk
rP } zd }| d tkrt| \}} |  sr| d dkr|j| |jjtjd nFt	| d\}} |d k	r|g|d d< |jt
|g |jjtjd nh| d dkr|jjtjd nHt	| d\}} |d k	r|g|d d< |jt
|g |jjtjd W Y d d }~X nX | r| d dkr|d	 d }d|_t	| d\}} |j| |jjtjd | r
|jtdd | dd  } q
W || fS )
Nr   r   z"address-list entry with no contentzinvalid address in address-listzempty element in address-listrj   zinvalid-mailboxzlist-separatorrl   )r[   r  rS   r   r   r   r   r   r   r  r`   r   r7   r,   r   )r   Zaddress_listr.   errr   rc   r   r   r   get_address_list  sN    












r  c             C   s  t  }| s |jjtjd |S | d tkrXt| \}} |j| | sX|jjtjd d}x8| r| d dkr| d tkr|| d 7 }| dd  } q^W |j s|jjtjdj	| |jt
|d nt||_|jt
|d	 | o| d tkr
t| \}} |j| |  s | d dkrX|jd k	r>|jjtjd
 | rT|jt
| d |S |jt
dd | dd  } | r| d tkrt| \}} |j| | s|jd k	r|jjtjd
 |S d}x2| r| d tkr|| d 7 }| dd  } qW |j s2|jjtjdj	| |jt
|d nt||_|jt
|d	 | rv| d tkrvt| \}} |j| | r|jjtjd |jt
| d |S )Nz%Missing MIME version number (eg: 1.0)r   z0Expected MIME version number but found only CFWSr   r	   rj   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   rS   r   HeaderMissingRequiredValuer   r   isdigitr   r#   r   intr   r   )r   Zmime_versionr.   r  r   r   r   parse_mime_version  sv    













r  c             C   sh   t  }xX| r^| d dkr^| d tkrF|jt| d d | dd  } qt| \}} |j| qW || fS )Nr   r  zmisplaced-specialrj   )r   r   rS   r   r   )r   Zinvalid_parameterr.   r   r   r   get_invalid_parameter  s    r  c             C   sN   t | }|stjdj| |j }| t|d  } t|d}t| || fS )Nzexpected ttext but found '{}'ttext)_non_token_end_matcherr   r   r#   ra   rk   r   r   )r   r   r   r   r   r   	get_ttext  s    	
r"  c             C   s   t  }| r,| d tkr,t| \}} |j| | rL| d tkrLtjdj| t| \}} |j| | r| d tkrt| \}} |j| || fS )Nr   zexpected token but found '{}')	rM   r   r   rS   
TOKEN_ENDSr   r   r#   r"  )r   Zmtokenr.   r   r   r   	get_token)  s    	


r$  c             C   sN   t | }|stjdj| |j }| t|d  } t|d}t| || fS )Nz expected attrtext but found {!r}r   )_non_attribute_end_matcherr   r   r#   ra   rk   r   r   )r   r   r   r   r   r   get_attrtext@  s    	
r&  c             C   s   t  }| r,| d tkr,t| \}} |j| | rL| d tkrLtjdj| t| \}} |j| | r| d tkrt| \}} |j| || fS )Nr   zexpected token but found '{}')	r   r   r   rS   ATTRIBUTE_ENDSr   r   r#   r&  )r   r   r.   r   r   r   get_attributeS  s    	


r(  c             C   sN   t | }|stjdj| |j }| t|d  } t|d}t| || fS )Nz)expected extended attrtext but found {!r}zextended-attrtext)#_non_extended_attribute_end_matcherr   r   r#   ra   rk   r   r   )r   r   r   r   r   r   get_extended_attrtextj  s    
r*  c             C   s   t  }| r,| d tkr,t| \}} |j| | rL| d tkrLtjdj| t| \}} |j| | r| d tkrt| \}} |j| || fS )Nr   zexpected token but found '{}')	r   r   r   rS   EXTENDED_ATTRIBUTE_ENDSr   r   r#   r*  )r   r   r.   r   r   r   get_extended_attribute|  s    


r,  c             C   s   t  }|  s| d dkr(tjdj| |jtdd | dd  } |  sX| d j  rhtjdj| d}x,| r| d j r|| d 7 }| dd  } qnW |d dkr|dkr|jjtjd	 t	||_
|jt|d
 || fS )Nr   *zExpected section but found {}zsection-markerrj   z$Expected section number but found {}r   0z'section number has an invalid leading 0r  )r   r   r   r#   rS   r   r  r   ZInvalidHeaderErrorr  r   )r   r   r  r   r   r   get_section  s&    	

r/  c             C   s   t  }| stjdd }| d tkr0t| \}} | sDtjdj|| d dkr^t| \}} nt| \}} |d k	r|g|d d< |j| || fS )Nz&Expected value but found end of stringr   z Expected value but found only {}r   )	r   r   r   r   r   r#   r   r,  rS   )r   vr   r.   r   r   r   	get_value  s     

r1  c             C   sv  t  }t| \}} |j| |  s.| d dkrN|jjtjdj| || fS | d dkry t| \}} d|_|j| W n tj	k
r   Y nX | stj	d| d dkr|jt
dd | dd  } d|_| d d	krtj	d
|jt
d	d | dd  } d }| r.| d tkr.t| \}} |j| d }|}|jrH| rH| d dkrHt| \}}|j}d}|jdkr|r|d dkrd}n$t|\}}	|	r|	d dkrd}n(yt|\}}	W n   Y nX |	sd}|r2|jjtjd |j| x,|D ]$}
|
jdkrg |
d d < |
}P qW |} nd }|jjtjd | rb| d dkrbd }nt| \}} |j s|jdkr|  s| d dkr|j| |d k	r|} || fS |jjtjd | s|jjtjd |j| |d kr|| fS n|d k	rFx|D ]}
|
jdkrP qW |
jdk |j|
 |
j|_| d dkrdtj	dj| |jt
dd | dd  } | r| d dkrt| \}} |j| |j|_|  s| d dkrtj	dj| |jt
dd | dd  } |d k	rJt }x>| rB| d tkr(t| \}} nt| \}} |j| qW |}nt| \}} |j| |d k	rn|} || fS )Nr   r  z)Parameter contains name ({}) but no valuer-  TzIncomplete parameterzextended-parameter-markerrj   =zParameter not followed by '='zparameter-separatorr   F'z5Quoted string value for extended parameter is invalidzbare-quoted-stringzZParameter 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 delimiterszextended-attrtextr   z=Expected RFC2231 char/lang encoding delimiter, but found {!r}zRFC2231-delimiterz;Expected RFC2231 char/lang encoding delimiter, but found {})r   r(  rS   r   r   r   r#   r/  r   r   r   r   r   r   r   rV   r   r&  r*  r7   r1  r   rP   rQ   r   r   r   r   )r   r   r.   r   r   ZappendtoZqstringZinner_valueZ
semi_validr   tr0  r   r   r   get_parameter  s    























r5  c             C   sh  t  }xZ| rbyt| \}} |j| W n tjk
r } zd }| d tkrZt| \}} | sl|j| |S | d dkr|d k	r|j| |jjtjd n@t	| \}} |r|g|d d< |j| |jjtjdj
| W Y d d }~X nX | r@| d dkr@|d	 }d|_t	| \}} |j| |jjtjdj
| | r
|jtdd | dd  } q
W |S )
Nr   r  zparameter entry with no contentzinvalid parameter {!r}rj   zinvalid-parameterz)parameter with invalid trailing text {!r}zparameter-separatorrl   )r   r5  rS   r   r   r   r   r   r   r  r#   r7   r,   r   )r   Zmime_parametersr.   r  r   r   r   r   r   parse_mime_parametersQ	  sD    






 

r6  c             C   s   xX|rX|d dkrX|d t kr@| jt|d d |dd  }qt|\}}| j| qW |sbd S | jtdd | jt|dd   d S )Nr   r  zmisplaced-specialrj   zparameter-separator)r   rS   r   r   r6  )Z	tokenlistr   r.   r   r   r   _find_mime_parameters	  s    r7  c             C   s  t  }d}| s$|jjtjd |S yt| \}} W n8 tjk
rl   |jjtjdj|  t	||  |S X |j| |  s| d dkr|jjtjd | rt	||  |S |j
j j |_|jtdd | dd  } yt| \}} W n: tjk
r$   |jjtjd	j|  t	||  |S X |j| |j
j j |_| sJ|S | d d
kr|jjtjdj|  |`|`t	||  |S |jtd
d |jt| dd   |S )NFz"Missing content type specificationz(Expected content maintype but found {!r}r   r   zInvalid content typezcontent-type-separatorrj   z'Expected content subtype but found {!r}r  z<Only parameters are valid after content type, but found {!r}zparameter-separator)r   r   rS   r   r  r$  r   r   r#   r7  r   r   lowerr   r   r   r6  )r   ZctypeZrecoverr.   r   r   r   parse_content_type_header	  sX    











r9  c             C   s   t  }| s |jjtjd |S yt| \}} W n8 tjk
rh   |jjtjdj|  t	||  |S X |j| |j
j j |_| s|S | d dkr|jjtjdj|  t	||  |S |jtdd |j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}zparameter-separatorrj   )r   r   rS   r   r  r$  r   r   r#   r7  r   r   r8  r   r   r6  )r   Zdisp_headerr.   r   r   r    parse_content_disposition_header	  s2    






r:  c             C   s   t  }| s |jjtjd |S yt| \}} W n. tjk
r^   |jjtjdj|  Y nX |j| |j	j
 j |_| s|S x^| r|jjtjd | d tkr|jt| d d | dd  } qt| \}} |j| qW |S )Nz!Missing content transfer encodingz1Expected content transfer encoding but found {!r}z*Extra text after content transfer encodingr   zmisplaced-specialrj   )r   r   rS   r   r  r$  r   r   r#   r   r   r8  rO   r   r   r   )r   Z
cte_headerr.   r   r   r   &parse_content_transfer_encoding_header	  s.    



r;  c             C   sD   d}| r@| d r@| d d t kr@| d d }| d d d	 | d
< |S )Nr   rj   rl   rl   rl   rl   rl   rl   rl   rl   )r   )linesZwspr   r   r   _steal_trailing_WSP_if_exists
  s
    r=  c            C   s  |j ptd}|jrdnd}dg}d }d}d}tdd}t| }	xz|	r|	jd}
|
|krf|d8 }qDt|
}|s|
jd	krtj	| }nt
j	| }y|j| |}W n6 tk
r   td
d |
jD rd}nd}d}Y nX |
jdkrt|
||| qD|r| r|
jsd}d }|
jr|
j|dd t|j  }|j|krt||t|d  krtt|}|j| |d  |7  < qDt|
dst|
|	 }	nt|||||
j|}d}qDt||t|d  kr|d  |7  < qD|
jr(t|d |kr(t|}|s|
j r(|j||  qDt|
ds`t|
}|
jsV|d7 }|j| ||	 }	qD|
jr| r|	jd|
 d}qDt|}|s|
j r|j||  qD|d  |7  < qDW |jj||j S )Nz+infzutf-8zus-asciir   r   Fwrap_as_ew_blockedrj   r   c             s   s   | ]}t |tjV  qd S )N)r   r   r   )r   r   r   r   r   r    @
  s   z%_refold_parse_tree.<locals>.<genexpr>zunknown-8bitTzmime-parameters)r/   r   rl   rl   rl   rl   rl   )Zmax_line_lengthfloatutf8r   r   r   r   r7   
SPECIALSNL
isdisjointNLSETr   r   r  r&   _fold_mime_parametersr)   r;   r1   rk   linesepr=  rS   r8   _fold_as_ewr<   r(   insertr!   )Z
parse_treer/   maxlenr   r<  last_ewr>  Zwant_encodingZend_ew_not_allowedr   r*   tstrrP   Zencoded_partnewlineZnewpartsr   r   r   r0   "
  s    










r0   c             C   s  |d k	r<|r<t t|d	 |d  |  } |d
 d | |d< | d tkr| d }| dd  } t|d |krz|jt| |d  |7  < d}| d tkr| d }| d d } |d krt|d n|}x| r|t|d  }	|dkrdn|}
|	t|
 d }|dkr|jd q| d | }tj||
d}t||	 }|dkr\|d |  }tj|}|d  |7  < | t|d  } | r|jd t|d }qW |d  |7  < |r|S d S )Nrj   r   r   zus-asciizutf-8   r@   )rP   rl   rl   rl   rl   rl   rl   rl   rl   rl   rl   rl   rl   rl   )r   r   r   rk   rS   r=  r   r   )Z	to_encoder<  rH  rI  r<   rP   Zleading_wspZtrailing_wspZnew_last_ewZremaining_spaceZ	encode_asZ
text_spaceZ
first_partr   Zexcessr   r   r   rF  
  sF    




rF  c             C   s  x| j D ]\}}|d j jds6|d  d7  < |}d}y|j| d}W n0 tk
r   d}tj|rxd}d}nd}Y nX |rtjj	|d	|d
}	dj
|||	}
ndj
|t|}
t|d t|
 d |k r|d d |
 |d< q
n"t|
d |kr|jd|
  q
d}|d }x|rt|tt| d t| }||d krTd}|| d  }}x<|d | }tjj	|d	|d
}	t|	|krP |d8 }qfW |jdj
||||	 d	}|d7 }||d  }|r|d  d7  < qW q
W d S )Nrj   r  strictFTzunknown-8bitr   zutf-8r   )Zsafer   z
{}*={}''{}z{}={}r@   rh   r   z''r{   N   z {}*{}*={}{}rl   rl   rl   rl   rl   rl   )r   r|   r   r   r   r   r   r   r   rY   r#   r   rk   rS   r   )r*   r<  rH  r   r   r   rP   Zerror_handlerZencoding_requiredZencoded_valuerJ  r   Zextra_chromeZ
chrome_lenZ
splitpointZmaxcharspartialr   r   r   rD  
  s\    


 rD  )rer   stringr   collectionsr   operatorr   Zemailr   r   r   r   r   r   r   r   r   r   r   Z	TSPECIALSr#  Z	ASPECIALSr'  r+  rC  rA  r   r   r   r?   rD   rF   rH   rI   rK   rM   rN   rR   rW   rX   r[   r`   rd   rf   rg   ri   rq   rs   rt   ru   rv   rx   ry   rz   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	  compiler#   r!   rw   r   r   matchr   findallr   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  r  r"  r$  r&  r(  r*  r,  r/  r1  r5  r6  r7  r9  r:  r;  r=  r0   rF  rD  r   r   r   r   <module>F   s  C"	
!($
V	+




   

*8"&'/'&).9%>D 49/j7