
    4bh             	       
   	 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      z  Z ed	      Zeez  Ze ed
      z
  Ze ed      z
  Ze ed      z   ed
      z
  Zeez  Ze ed      z  Zeez  Ze ed      z
  ZddhZeez  Zd Zd Z e j8                  de j:                  e j<                  z        Z G d de       Z! G d de!      Z" G d de!      Z# G d de!      Z$ G d de!      Z% G d de"      Z& G d  d!e!      Z' G d" d#e!      Z( G d$ d%e!      Z) G d& d'e!      Z* G d( d)e*      Z+ G d* d+e"      Z, G d, d-e!      Z- G d. d/e!      Z. G d0 d1e!      Z/ G d2 d3e!      Z0 G d4 d5e!      Z1 G d6 d7e!      Z2 G d8 d9e!      Z3 G d: d;e!      Z4 G d< d=e!      Z5 G d> d?e!      Z6 G d@ dAe!      Z7 G dB dCe!      Z8 G dD dEe!      Z9 G dF dGe!      Z: G dH dIe!      Z; G dJ dKe!      Z< G dL dMe$      Z= G dN dOe!      Z> G dP dQe!      Z? G dR dSe!      Z@ G dT dUe!      ZA G dV dWeA      ZB G dX dYe!      ZC G dZ d[e!      ZD G d\ d]e!      ZE G d^ d_e!      ZF G d` dae!      ZG G db dceG      ZH G dd deeG      ZI G df dge!      ZJ G dh die!      ZK G dj dke!      ZL G dl dmeL      ZM G dn doeM      ZN G dp dqe!      ZO G dr dseP      ZQ G dt dueQ      ZR G dv dweQ      ZS G dx dyeR      ZT G dz d{e
j                        ZV eSd
d|      ZW eSd}d~      ZXdeX_Y        deX_Z         eSdd      Z[ e j8                  dj                  dj                  e                  j                  Z_ e j8                  dj                   e j                  dj                  e                        j                  Zb e j8                  d      j                  Zd e j8                  dj                   e j                  dj                  e                        j                  Ze e j8                  dj                   e j                  dj                  e                        j                  Zf e j8                  dj                   e j                  dj                  e                        j                  Zgd Zhd Zid ZjddZkd Zld Zmd Znd Zod Zpd Zqd Zrd Zsd Ztd Zud Zvd Zwd Zxd Zyd Zzd Z{d Z|d Z}d Z~d Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)    N)	hexdigits)
itemgetter)_encoded_words)errors)utilsz 	(z()<>@,:;.\"[].z."(z/?=z*'%%
c                 Z    	 t        |       j                  dd      j                  dd      S )N\\\"z\")strreplacevalues    D/opt/python-3.12.12/usr/lib/python3.12/email/_header_value_parser.pymake_quoted_pairsr   c   s)    Eu:dF+33C??    c                 $    t        |       }d| dS )Nr   )r   )r   escapeds     r   quote_stringr   h   s    &Gwiq>r   z
   =\?            # literal =?
   [^?]*          # charset
   \?             # literal ?
   [qQbB]         # literal 'q' or 'b', case insensitive
   \?             # literal ?
  .*?             # encoded word
  \?=             # literal ?=
c                        e Zd ZdZdZdZ fdZd Z fdZe	d        Z
e	d        Zd Ze	d	        Ze	d
        Zd ZddZddZddZ xZS )	TokenListNTc                 2    t        |   |i | g | _        y N)super__init__defects)selfargskw	__class__s      r   r    zTokenList.__init__   s    $%"%r   c                 2    dj                  d | D              S )N c              3   2   K   | ]  }t        |        y wr   r   .0xs     r   	<genexpr>z$TokenList.__str__.<locals>.<genexpr>        ,t!s1vt   joinr"   s    r   __str__zTokenList.__str__   s    ww,t,,,r   c                 h    dj                  | j                  j                  t        |                S Nz{}({})formatr%   __name__r   __repr__r"   r%   s    r   r9   zTokenList.__repr__   s+    t~~66"W-/1 	1r   c                 2    dj                  d | D              S )Nr'   c              3   N   K   | ]  }|j                   s|j                     y wr   r   r*   s     r   r-   z"TokenList.value.<locals>.<genexpr>   s     81qwws   %%r0   r2   s    r   r   zTokenList.value   s    ww8888r   c                 <    t        d | D        | j                        S )Nc              3   4   K   | ]  }|j                     y wr   )all_defectsr*   s     r   r-   z(TokenList.all_defects.<locals>.<genexpr>   s     04aAMM4   )sumr!   r2   s    r   r?   zTokenList.all_defects   s    040$,,??r   c                 (    | d   j                         S Nr   )startswith_fwsr2   s    r   rD   zTokenList.startswith_fws   s    Aw%%''r   c                 (    	 t        d | D              S )Nc              3   4   K   | ]  }|j                     y wr   )as_ew_allowed)r+   parts     r   r-   z*TokenList.as_ew_allowed.<locals>.<genexpr>   s     7$$4%%$r@   )allr2   s    r   rG   zTokenList.as_ew_allowed   s    O7$777r   c                 N    g }| D ]  }|j                  |j                          |S r   )extendcomments)r"   rL   tokens      r   rL   zTokenList.comments   s&    EOOENN+ r   c                    t        | |      S )Npolicy)_refold_parse_treer"   rP   s     r   foldzTokenList.fold   s    !$v66r   c                 :    t        | j                  |             y )Nindent)printppstrr"   rV   s     r   pprintzTokenList.pprint   s    djjj'(r   c                 D    dj                  | j                  |            S )Nr   rU   )r1   _pprY   s     r   rX   zTokenList.ppstr   s    yy011r   c              #   ~  K   dj                  || j                  j                  | j                         | D ]A  }t	        |d      s|dj                  |      z    &|j                  |dz         E d {    C | j                  rdj                  | j                        }nd}dj                  ||       y 7 Ew)Nz{}{}/{}(r\   z*    !! invalid element in token list: {!r}z    z Defects: {}r'   z{}){})r7   r%   r8   
token_typehasattrr\   r!   )r"   rV   rM   extras       r   r\   zTokenList._pp   s     NN##OO 	 E5%( !55;VE]C D !99VF]333  <<"))$,,7EEnnVU++ 4s   A3B=5B;6AB=r'   )r8   
__module____qualname__r^   syntactic_breakew_combine_allowedr    r3   r9   propertyr   r?   rD   rG   rL   rS   rZ   rX   r\   __classcell__r%   s   @r   r   r   }   s    JO-1 9 9 @ @( 8 8  7)2,r   r   c                   ,    e Zd Zed        Zed        Zy)WhiteSpaceTokenListc                      yN  r2   s    r   r   zWhiteSpaceTokenList.value       r   c                 `    | D cg c]  }|j                   dk(  s|j                    c}S c c}w )Ncomment)r^   contentr"   r,   s     r   rL   zWhiteSpaceTokenList.comments   s)    #'C4a1<<+B		4CCC   ++N)r8   rb   rc   rf   r   rL   rn   r   r   rj   rj      s*      D Dr   rj   c                       e Zd ZdZy)UnstructuredTokenListunstructuredNr8   rb   rc   r^   rn   r   r   rv   rv      s    Jr   rv   c                       e Zd ZdZy)PhrasephraseNrx   rn   r   r   rz   rz          Jr   rz   c                       e Zd ZdZy)WordwordNrx   rn   r   r   r~   r~          Jr   r~   c                       e Zd ZdZy)CFWSListcfwsNrx   rn   r   r   r   r      r   r   r   c                       e Zd ZdZy)AtomatomNrx   rn   r   r   r   r      r   r   r   c                       e Zd ZdZdZy)TokenrM   FN)r8   rb   rc   r^   encode_as_ewrn   r   r   r   r      s    JLr   r   c                       e Zd ZdZdZdZdZy)EncodedWordencoded-wordN)r8   rb   rc   r^   ctecharsetlangrn   r   r   r   r      s    J
CGDr   r   c                   @    e Zd ZdZed        Zed        Zed        Zy)QuotedStringquoted-stringc                 L    | D ]  }|j                   dk(  s|j                  c S  y Nbare-quoted-stringr^   r   rs   s     r   rr   zQuotedString.content   s"    A||33ww r   c                     g }| D ]G  }|j                   dk(  r|j                  t        |             -|j                  |j                         I dj	                  |      S )Nr   r'   )r^   appendr   r   r1   )r"   resr,   s      r   quoted_valuezQuotedString.quoted_value   sN    A||33

3q6"

177#	 
 wws|r   c                 L    | D ]  }|j                   dk(  s|j                  c S  y r   r   r"   rM   s     r   stripped_valuezQuotedString.stripped_value   s%    E#77{{" r   N)r8   rb   rc   r^   rf   rr   r   r   rn   r   r   r   r      sA     J 
   # #r   r   c                   &    e Zd ZdZd Zed        Zy)BareQuotedStringr   c                 D    t        dj                  d | D                    S )Nr'   c              3   2   K   | ]  }t        |        y wr   r)   r*   s     r   r-   z+BareQuotedString.__str__.<locals>.<genexpr>
  s     #9DqCFDr/   )r   r1   r2   s    r   r3   zBareQuotedString.__str__	  s    BGG#9D#99::r   c                 2    dj                  d | D              S )Nr'   c              3   2   K   | ]  }t        |        y wr   r)   r*   s     r   r-   z)BareQuotedString.value.<locals>.<genexpr>  r.   r/   r0   r2   s    r   r   zBareQuotedString.value      ww,t,,,r   N)r8   rb   rc   r^   r3   rf   r   rn   r   r   r   r     s     %J; - -r   r   c                   <    e Zd ZdZd Zd Zed        Zed        Zy)Commentrq   c                     dj                  t        dg| D cg c]  }| j                  |       c}dggg             S c c}w )Nr'   r   ))r1   rA   quoters   s     r   r3   zComment.__str__  sK    wws E489DqTZZ]D9 E  "	# $ 	$9s   >c                     |j                   dk(  rt        |      S t        |      j                  dd      j                  dd      j                  dd      S )Nrq   r   r   r   z\(r   z\))r^   r   r   )r"   r   s     r   r   zComment.quote  sR    y(u:5z!!$/77"%u..5g"%u/.	.r   c                 2    dj                  d | D              S )Nr'   c              3   2   K   | ]  }t        |        y wr   r)   r*   s     r   r-   z"Comment.content.<locals>.<genexpr>%  r.   r/   r0   r2   s    r   rr   zComment.content#  r   r   c                     | j                   gS r   )rr   r2   s    r   rL   zComment.comments'  s    ~r   N)	r8   rb   rc   r^   r3   r   rf   rr   rL   rn   r   r   r   r     s9    J$. - -  r   r   c                   @    e Zd ZdZed        Zed        Zed        Zy)AddressListzaddress-listc                 L    | D cg c]  }|j                   dk(  s| c}S c c}w )Naddressr^   rs   s     r   	addresseszAddressList.addresses/  %    ;4a1<<#:4;;;   !!c                 (    t        d | D        g       S )Nc              3   R   K   | ]  }|j                   d k(  r|j                   ! ywr   Nr^   	mailboxesr*   s     r   r-   z(AddressList.mailboxes.<locals>.<genexpr>5  s'      >!Q\\9%< KK!   %'rA   r2   s    r   r   zAddressList.mailboxes3  !     >!>?AC 	Cr   c                 (    t        d | D        g       S )Nc              3   R   K   | ]  }|j                   d k(  r|j                   ! ywr   r^   all_mailboxesr*   s     r   r-   z,AddressList.all_mailboxes.<locals>.<genexpr>:  s'      >!Q\\9%< OO!r   r   r2   s    r   r   zAddressList.all_mailboxes8  r   r   N)r8   rb   rc   r^   rf   r   r   r   rn   r   r   r   r   +  sE    J< < C C C Cr   r   c                   @    e Zd ZdZed        Zed        Zed        Zy)Addressr   c                 F    | d   j                   dk(  r| d   j                  S y )Nr   groupr^   display_namer2   s    r   r   zAddress.display_nameB  s)    7(7''' )r   c                 x    | d   j                   dk(  r| d   gS | d   j                   dk(  rg S | d   j                  S Nr   mailboxinvalid-mailboxr   r2   s    r   r   zAddress.mailboxesG  sH    7*G9!W#44IAw   r   c                     | d   j                   dk(  r| d   gS | d   j                   dk(  r| d   gS | d   j                  S r   r   r2   s    r   r   zAddress.all_mailboxesO  sO    7*G9!W#44G9Aw$$$r   N)r8   rb   rc   r^   rf   r   r   r   rn   r   r   r   r   >  sA    J( ( ! ! % %r   r   c                   0    e Zd ZdZed        Zed        Zy)MailboxListmailbox-listc                 L    | D cg c]  }|j                   dk(  s| c}S c c}w )Nr   r   rs   s     r   r   zMailboxList.mailboxes[  r   r   c                 H    | D cg c]  }|j                   dv r| c}S c c}w )N)r   r   r   rs   s     r   r   zMailboxList.all_mailboxes_  s2     ?4a||== 4 ? 	? ?s   Nr8   rb   rc   r^   rf   r   r   rn   r   r   r   r   W  s-    J< < ? ?r   r   c                   0    e Zd ZdZed        Zed        Zy)	GroupList
group-listc                 L    | r| d   j                   dk7  rg S | d   j                  S Nr   r   r   r2   s    r   r   zGroupList.mailboxesi  s+    tAw))^;IAw   r   c                 L    | r| d   j                   dk7  rg S | d   j                  S r   r   r2   s    r   r   zGroupList.all_mailboxeso  s+    tAw))^;IAw$$$r   Nr   rn   r   r   r   r   e  s-    J! !
 % %r   r   c                   @    e Zd ZdZed        Zed        Zed        Zy)Groupr   c                 H    | d   j                   dk7  rg S | d   j                  S N   r   r   r2   s    r   r   zGroup.mailboxesz  s)    7-IAw   r   c                 H    | d   j                   dk7  rg S | d   j                  S r   r   r2   s    r   r   zGroup.all_mailboxes  s)    7-IAw$$$r   c                      | d   j                   S rC   )r   r2   s    r   r   zGroup.display_name  s    Aw###r   N)r8   rb   rc   r^   rf   r   r   r   rn   r   r   r   r   v  sA    J! !
 % %
 $ $r   r   c                   `    e Zd ZdZed        Zed        Zed        Zed        Zed        Z	y)NameAddr	name-addrc                 >    t        |       dk(  ry | d   j                  S N   r   )lenr   r2   s    r   r   zNameAddr.display_name  s     t9>Aw###r   c                      | d   j                   S N
local_partr2   s    r   r   zNameAddr.local_part  s    Bx"""r   c                      | d   j                   S r   domainr2   s    r   r   zNameAddr.domain  s    Bxr   c                      | d   j                   S r   )router2   s    r   r   zNameAddr.route  s    Bx~~r   c                      | d   j                   S r   	addr_specr2   s    r   r   zNameAddr.addr_spec  s    Bx!!!r   N
r8   rb   rc   r^   rf   r   r   r   r   r   rn   r   r   r   r     si    J$ $
 # #     " "r   r   c                   P    e Zd ZdZed        Zed        Zed        Zed        Zy)	AngleAddrz
angle-addrc                 L    | D ]  }|j                   dk(  s|j                  c S  y N	addr-spec)r^   r   rs   s     r   r   zAngleAddr.local_part  s"    A||{*||# r   c                 L    | D ]  }|j                   dk(  s|j                  c S  y r   r^   r   rs   s     r   r   zAngleAddr.domain  s!    A||{*xx r   c                 L    | D ]  }|j                   dk(  s|j                  c S  y )N	obs-route)r^   domainsrs   s     r   r   zAngleAddr.route  s"    A||{*yy  r   c                     | D ]O  }|j                   dk(  s|j                  r|j                  c S t        |j                        |j                  z   c S  y)Nr   z<>)r^   r   r   r   rs   s     r   r   zAngleAddr.addr_spec  sF    A||{*<<;;&'5CC  r   N)	r8   rb   rc   r^   rf   r   r   r   r   rn   r   r   r   r     sU    J$ $
    
 ! !
  r   r   c                        e Zd ZdZed        Zy)ObsRouter   c                 `    | D cg c]  }|j                   dk(  s|j                    c}S c c}w )Nr   r   rs   s     r   r   zObsRoute.domains  s)    "&C$Q!,,(*B$CCCrt   N)r8   rb   rc   r^   rf   r   rn   r   r   r  r    s    JD Dr   r  c                   `    e Zd ZdZed        Zed        Zed        Zed        Zed        Z	y)Mailboxr   c                 F    | d   j                   dk(  r| d   j                  S y Nr   r   r   r2   s    r   r   zMailbox.display_name  s)    7,7''' -r   c                      | d   j                   S rC   r   r2   s    r   r   zMailbox.local_part      Aw!!!r   c                      | d   j                   S rC   r   r2   s    r   r   zMailbox.domain  s    Aw~~r   c                 F    | d   j                   dk(  r| d   j                  S y r  )r^   r   r2   s    r   r   zMailbox.route  s'    7,7==  -r   c                      | d   j                   S rC   r   r2   s    r   r   zMailbox.addr_spec  s    Aw   r   Nr   rn   r   r   r  r    si    J( ( " "   ! ! ! !r   r  c                   0    e Zd ZdZed        ZexZxZxZZ	y)InvalidMailboxr   c                      y r   rn   r2   s    r   r   zInvalidMailbox.display_name      r   Nr   rn   r   r   r  r    s/    "J  /;:J::%)r   r  c                   0     e Zd ZdZdZe fd       Z xZS )Domainr   Fc                 R    dj                  t        |   j                               S Nr'   r1   r   r   splitr:   s    r   r   zDomain.domain      wwuw}**,--r   )r8   rb   rc   r^   rG   rf   r   rg   rh   s   @r   r  r    s    JM. .r   r  c                       e Zd ZdZy)DotAtomdot-atomNrx   rn   r   r   r  r    s    Jr   r  c                       e Zd ZdZdZy)DotAtomTextzdot-atom-textTNr8   rb   rc   r^   rG   rn   r   r   r  r    s     JMr   r  c                       e Zd ZdZdZy)NoFoldLiteralzno-fold-literalFNr  rn   r   r   r  r  
  s    "JMr   r  c                   T    e Zd ZdZdZed        Zed        Zed        Zed        Z	y)AddrSpecr   Fc                      | d   j                   S rC   r   r2   s    r   r   zAddrSpec.local_part  r  r   c                 >    t        |       dk  ry | d   j                  S )N   r   )r   r   r2   s    r   r   zAddrSpec.domain  s    t9q=Bxr   c                     t        |       dk  r| d   j                  S | d   j                  j                         | d   j                  z   | d   j                  j                         z   S )Nr#  r   r   r   )r   r   rstriplstripr2   s    r   r   zAddrSpec.value  sU    t9q=7== Aw}}##%d1gmm3DGMM4H4H4JJJr   c                     t        | j                        }t        |      t        |t        z
        kD  rt	        | j                        }n| j                  }| j
                  |dz   | j
                  z   S |S )N@)setr   r   DOT_ATOM_ENDSr   r   )r"   namesetlps      r   r   zAddrSpec.addr_spec$  s_    doo&w<#gm344doo.BB;;"8dkk))	r   N)
r8   rb   rc   r^   rG   rf   r   r   r   r   rn   r   r   r   r     s\    JM" "  
 K K
  r   r   c                       e Zd ZdZdZy)ObsLocalPartzobs-local-partFNr  rn   r   r   r.  r.  0  s    !JMr   r.  c                   @     e Zd ZdZdZed        Ze fd       Z xZS )DisplayNamezdisplay-nameFc                    t        |       }t        |      dk(  r|j                  S |d   j                  dk(  r|j	                  d       n<t        |d   t               r)|d   d   j                  dk(  rt        |d   dd        |d<   |d   j                  dk(  r|j	                          |j                  S t        |d   t               r)|d   d   j                  dk(  rt        |d   d d       |d<   |j                  S )Nr   r   r   r   )r   r   r   r^   pop
isinstance)r"   r   s     r   r   zDisplayName.display_name;  s    os8q=99q6&GGAJ3q69-F1I((F2"3q6!":.Ar7'GGI
 yy 3r7I.GBK**f4#CGCRL1Byyr   c                    d}| j                   rd}n| D ]  }|j                  dk(  sd} t        |       dk7  r|rdx}}| d   j                  dk(  s(t        | d   t              r| d   d   j                  dk(  rd}| d   j                  dk(  s(t        | d   t              r| d   d   j                  dk(  rd}|t        | j                        z   |z   S t        |    S )	NFTr   r   r'   r   rm   r   )	r!   r^   r   r3  r   r   r   r   r   )r"   r   r,   prepostr%   s        r   r   zDisplayName.valueN  s    <<E<<?2 E  t9>eOC$Q""f,47I.Q
%%/R##v-48Y/R''61|D$5$566t;;7= r   )	r8   rb   rc   r^   re   rf   r   r   rg   rh   s   @r   r0  r0  6  s4    J $ ! !r   r0  c                   4    e Zd ZdZdZed        Zed        Zy)	LocalPartz
local-partFc                 b    | d   j                   dk(  r| d   j                  S | d   j                  S )Nr   r   )r^   r   r   r2   s    r   r   zLocalPart.valuek  s2    707'''7== r   c                    t         g}t         }d}| d   t         gz   D ]  }|j                  dk(  r|r2|j                  dk(  r#|d   j                  dk(  rt        |d d       |d<   t        |t              }|r?|j                  dk(  r0|d   j                  dk(  r|j	                  t        |dd               n|j	                  |       |d   }|} t        |dd       }|j
                  S )NFr   r   dotr   r   )DOTr^   r   r3  r   r   )r"   r   last
last_is_tltokis_tls         r   r   zLocalPart.local_partr  s     e
7cU?C~~'s~~6H''61#D"I.BsI.E$//U2F%%/

9SW-.

3r7DJ # Ab	"yyr   N)r8   rb   rc   r^   rG   rf   r   r   rn   r   r   r8  r8  f  s2    JM! !  r   r8  c                   @     e Zd ZdZdZe fd       Zed        Z xZS )DomainLiteralzdomain-literalFc                 R    dj                  t        |   j                               S r  r  r:   s    r   r   zDomainLiteral.domain  r  r   c                 L    | D ]  }|j                   dk(  s|j                  c S  y )Nptextr   rs   s     r   ipzDomainLiteral.ip  s!    A||w&ww r   )	r8   rb   rc   r^   rG   rf   r   rF  rg   rh   s   @r   rB  rB    s3    !JM. .  r   rB  c                       e Zd ZdZdZdZy)MIMEVersionzmime-versionN)r8   rb   rc   r^   majorminorrn   r   r   rH  rH    s    JEEr   rH  c                   <    e Zd ZdZdZdZdZed        Zed        Z	y)	Parameter	parameterFus-asciic                 <    | j                   r| d   j                  S dS r   )	sectionednumberr2   s    r   section_numberzParameter.section_number  s     "&tAw~~6Q6r   c                     | D ]n  }|j                   dk(  r|j                  c S |j                   dk(  s0|D ]:  }|j                   dk(  s|D ]#  }|j                   dk(  s|j                  c c c S  < p y)Nr   r   r   r'   )r^   r   r   s     r   param_valuezParameter.param_value  sx     E7*+++?2"E''+??%*E$//7:',';'; ; &+ #	  r   N)
r8   rb   rc   r^   rP  extendedr   rf   rR  rT  rn   r   r   rL  rL    s<    JIHG7 7
  r   rL  c                       e Zd ZdZy)InvalidParameterinvalid-parameterNrx   rn   r   r   rW  rW    s    $Jr   rW  c                        e Zd ZdZed        Zy)	Attribute	attributec                 d    | D ]+  }|j                   j                  d      s|j                  c S  y )Nattrtext)r^   endswithr   r   s     r   r   zAttribute.stripped_value  s*    E((4{{" r   Nr8   rb   rc   r^   rf   r   rn   r   r   rZ  rZ    s    J# #r   rZ  c                       e Zd ZdZdZy)SectionsectionN)r8   rb   rc   r^   rQ  rn   r   r   ra  ra    s    JFr   ra  c                        e Zd ZdZed        Zy)Valuer   c                     | d   }|j                   dk(  r| d   }|j                   j                  d      r|j                  S | j                  S )Nr   r   r   )r   r[  zextended-attribute)r^   r^  r   r   r   s     r   r   zValue.stripped_value  sP    Qv%GE$$DF'''zzr   Nr_  rn   r   r   rd  rd    s    J r   rd  c                   *    e Zd ZdZdZed        Zd Zy)MimeParametersmime-parametersFc              #   l  K   i }| D ]w  }|j                   j                  d      s|d   j                   dk7  r2|d   j                  j                         }||vrg ||<   ||   j	                  |j
                  |f       y |j                         D ]  \  }}t        |t        d            }|d   d   }|j                  }|j                  sRt        |      dkD  rD|d   d   dk(  r9|d   d   j                  j	                  t        j                  d             |d d }g }d}|D ]  \  }	}
|	|k7  ri|
j                  s/|
j                  j	                  t        j                  d             G|
j                  j	                  t        j                  d             |dz  }|
j                  }|
j                  rv	 t         j"                  j%                  |      }	 |j'                  |d	      }t-        j.                  |      r.|
j                  j	                  t        j0                                	 |j	                  |        dj5                  |      }||f  y # t(        t*        f$ r |j'                  d
d	      }Y w xY w# t*        $ r$ t         j"                  j3                  |d      }Y w xY ww)NrM  r   r[  )keyr   z.duplicate parameter name; duplicate(s) ignoredz+duplicate parameter name; duplicate ignoredz(inconsistent RFC2231 parameter numberingsurrogateescaperN  zlatin-1)encodingr'   )r^   r^  r   stripr   rR  itemssortedr   r   rU  r   r!   r   InvalidHeaderDefectrT  urllibparseunquote_to_bytesdecodeLookupErrorUnicodeEncodeErrorr   _has_surrogatesUndecodableBytesDefectunquoter1   )r"   paramsrM   namepartsfirst_paramr   value_partsirR  paramr   s               r   rz  zMimeParameters.params  s     E##,,[9Qx""k18>>'')D6!!t4L!5!5u =>  "<<>KD%5jm4E(1+K!))G ''CJN8A;!#!HQK''..v/I/IH0J K!"1IE KA).%!Q& !>>,,V-G-GI.K L ,,V-G-GF.H IQ))>>R & = =e DP$)LL:K$LE !007!MM001N1N1PQ""5)C */D GGK(E+g *R !,-?@ P
 %*LL=N$OEP . P !' 4 4UY 4 O	PsI   F6J49JI+A2J4!J>J4 JJ4*J1.J40J11J4c           	          g }| j                   D ]C  \  }}|r+|j                  dj                  |t        |                   3|j                  |       E dj	                  |      }|rd|z   S dS )N{}={}z; rm   r'   )rz  r   r7   r   r1   )r"   rz  r{  r   s       r   r3   zMimeParameters.__str__,  se    ;;KD%gnnT<3FGHd#	 '
 6"%sV|-2-r   N)r8   rb   rc   r^   rd   rf   rz  r3   rn   r   r   rg  rg    s&    "JOC CJ.r   rg  c                        e Zd ZdZed        Zy)ParameterizedHeaderValueFc                 `    t        |       D ]  }|j                  dk(  s|j                  c S  i S )Nrh  )reversedr^   rz  r   s     r   rz  zParameterizedHeaderValue.params=  s0    d^E#44||# $ 	r   N)r8   rb   rc   rd   rf   rz  rn   r   r   r  r  7  s     O r   r  c                       e Zd ZdZdZdZdZy)ContentTypezcontent-typeFtextplainN)r8   rb   rc   r^   rG   maintypesubtypern   r   r   r  r  E  s    JMHGr   r  c                       e Zd ZdZdZdZy)ContentDispositionzcontent-dispositionFN)r8   rb   rc   r^   rG   content_dispositionrn   r   r   r  r  L  s    &JMr   r  c                       e Zd ZdZdZdZy)ContentTransferEncodingzcontent-transfer-encodingF7bitN)r8   rb   rc   r^   rG   r   rn   r   r   r  r  R  s    ,JM
Cr   r  c                       e Zd ZdZdZy)HeaderLabelzheader-labelFNr  rn   r   r   r  r  X  s    JMr   r  c                       e Zd ZdZdZd Zy)MsgIDzmsg-idFc                 2    t        |       |j                  z   S r   )r   lineseprR   s     r   rS   z
MsgID.folda  s    4y6>>))r   N)r8   rb   rc   r^   rG   rS   rn   r   r   r  r  ]  s    JM*r   r  c                       e Zd ZdZy)	MessageIDz
message-idNrx   rn   r   r   r  r  f  s    Jr   r  c                       e Zd ZdZy)InvalidMessageIDzinvalid-message-idNrx   rn   r   r   r  r  j  s    %Jr   r  c                       e Zd ZdZy)HeaderheaderNrx   rn   r   r   r  r  n  r|   r   r  c                   r     e Zd ZdZdZdZ fdZ fdZd Ze	d        Z
d
 fd	Zd Ze	d        Zd	 Z xZS )TerminalTc                 D    t         |   | |      }||_        g |_        |S r   )r   __new__r^   r!   )clsr   r^   r"   r%   s       r   r  zTerminal.__new__|  s&    wsE*$r   c                 h    dj                  | j                  j                  t        |                S r5   r6   r:   s    r   r9   zTerminal.__repr__  s&    t~~668H8JKKr   c                 b    t        | j                  j                  dz   | j                  z          y )N/)rW   r%   r8   r^   r2   s    r   rZ   zTerminal.pprint  s"    dnn%%+doo=>r   c                 ,    t        | j                        S r   )listr!   r2   s    r   r?   zTerminal.all_defects  s    DLL!!r   c           	          dj                  || j                  j                  | j                  t        |          | j                  sd      gS dj                  | j                              gS )Nz{}{}/{}({}){}r'   z {})r7   r%   r8   r^   r   r9   r!   )r"   rV   r%   s     r   r\   zTerminal._pp  sg    &&NN##OOGllB  	
 ).T\\(B  	r   c                      y r   rn   r2   s    r   pop_trailing_wszTerminal.pop_trailing_ws  r  r   c                     g S r   rn   r2   s    r   rL   zTerminal.comments  s    	r   c                 0    t        |       | j                  fS r   )r   r^   r2   s    r   __getnewargs__zTerminal.__getnewargs__  s    4y$//**r   ra   )r8   rb   rc   rG   re   rd   r  r9   rZ   rf   r?   r\   r  rL   r  rg   rh   s   @r   r  r  v  sZ    MOL? " "  +r   r  c                   "    e Zd Zed        Zd Zy)WhiteSpaceTerminalc                      yrl   rn   r2   s    r   r   zWhiteSpaceTerminal.value  ro   r   c                      y)NTrn   r2   s    r   rD   z!WhiteSpaceTerminal.startswith_fws  s    r   Nr8   rb   rc   rf   r   rD   rn   r   r   r  r    s     r   r  c                   "    e Zd Zed        Zd Zy)ValueTerminalc                     | S r   rn   r2   s    r   r   zValueTerminal.value  s    r   c                      y)NFrn   r2   s    r   rD   zValueTerminal.startswith_fws  s    r   Nr  rn   r   r   r  r    s     r   r  c                   "    e Zd Zed        Zd Zy)EWWhiteSpaceTerminalc                      yr  rn   r2   s    r   r   zEWWhiteSpaceTerminal.value  s    r   c                      yr  rn   r2   s    r   r3   zEWWhiteSpaceTerminal.__str__  s    r   N)r8   rb   rc   rf   r   r3   rn   r   r   r  r    s     r   r  c                       e Zd Zy)_InvalidEwErrorN)r8   rb   rc   rn   r   r   r  r    s    ;r   r  r;  ,zlist-separatorFr(  zroute-component-markerz([{}]+)r'   z[^{}]+z[\x00-\x20\x7F]c                    	 t        |       }|r.| j                  j                  t        j                  |             t        j                  |       r/| j                  j                  t        j                  d             y y )Nz*Non-ASCII characters found in header token)_non_printable_finderr!   r   r   NonPrintableDefectr   rw  rx  )xtextnon_printabless     r   _validate_xtextr    sd    J*51NV66~FGU#V::8: 	; $r   c                 $   	 t        | d      ^}}g }d}d}t        t        |            D ]6  }||   dk(  r
|rd}d}nd}|rd}n	||   |v r n|j                  ||          8 dz   }dj	                  |      dj	                  ||d  g|z         |fS )Nr   Fr   Tr'   )_wsp_splitterranger   r   r1   )r   endcharsfragment	remaindervcharsescapehad_qpposs           r   _get_ptext_to_endcharsr    s     )2HyFFFS]#C=D Fc]h&hsm$ $ Ag776?BGGXcd^$4y$@A6IIr   c                 t    	 | j                         }t        | d t        |       t        |      z
   d      }||fS )Nfws)r&  r  r   )r   newvaluer  s      r   get_fwsr    s?     ||~H
U#<CJs8}$<=u
EC=r   c                    	 t               }| j                  d      s$t        j                  dj	                  |             | dd  j                  dd      ^}}|| dd  k(  r$t        j                  dj	                  |             dj                  |      }t        |      dkD  rF|d   t        v r;|d   t        v r0|j                  d      dk  r|j                  dd      ^}}|dz   |z   }t        |j                               dkD  r.|j                  j                  t        j                  d	             | |_        dj                  |      } 	 t        j                  d|z   dz         \  }}}	}
||_        |	|_        |j                  j+                  |
       |ru|d   t,        v r t/        |      \  }}|j                  |       -t1        |d      ^}}t3        ||      }t5        |       |j                  |       dj                  |      }|ru| r9| d   t,        vr.|j                  j                  t        j                  d             || fS # t         t"        f$ r% t%        d
j	                  |j                              w xY w)N=?z"expected encoded word but found {}r   z?=r   r'   r   ?zwhitespace inside encoded wordz!encoded word format invalid: '{}'z.missing trailing whitespace after encoded-word)r   
startswithr   HeaderParseErrorr7   r  r1   r   r   countr!   r   rp  r   _ewrt  
ValueErrorKeyErrorr  r   r   rK   WSPr  r  r  r  )r   terminal_typeewr?  r  remstrrestr  r   r   r!   rM   charsvtexts                 r   get_encoded_wordr     se    
BD!%%077>@ 	@ABioodA.OC)
eABi%%077>@ 	@WWYFFaq	Yq	Y		#!<<a0yDj4
399;!


&44,. 	/BFGGIE@'*zz$*t2C'D$gtW BJBGJJg
7c>!$-KE4IIe)$2	e]3
		%wwy!  q$


&44<> 	?u9) ! @/66rvv>@ 	@@s    I 4I?c                 "   	 t               }| r[| d   t        v r t        |       \  }} |j                  |       .d}| j	                  d      r	 t        | d      \  }} d}t        |      dkD  rB|d   j                  dk7  r0|j                  j                  t        j                  d             d}|r2t        |      d	kD  r$|d
   j                  dk(  rt        |d   d      |d<   |j                  |       t        | d	      ^}}|r(t        j!                  |      r| j#                  d      ^}}t%        |d      }t'        |       |j                  |       dj)                  |      } | r[|S # t        $ r d}Y t        j                  $ r Y w xY w)Nr   Tr  utextr   r  z&missing whitespace before encoded wordFr   r   r'   )rv   r  r  r   r  r  r   r^   r!   r   rp  r  r  r  r  rfc2047_matchersearch	partitionr  r  r1   )r   rw   rM   valid_ewhave_wsr?  r  r  s           r   get_unstructuredr  Q  s   , )*L
8s?"5>LE5&D!/w?u |$q(#B'22e;$,,33F4N4ND5F G"'s<014#B'22nD+?(,e,5R(##E*'q1i ..s3#ood3OC)c7+E"	"Q R A # ! **  s   E, ,F9FFc                 Z    	 t        | d      \  }} }t        |d      }t        |       || fS )Nz()rE  )r  r  r  r   rE  _s      r   get_qp_ctextr    s9    
 -UD9OE5!ug.EE%<r   c                 Z    	 t        | d      \  }} }t        |d      }t        |       || fS )Nr   rE  )r  r  r  r  s      r   get_qcontentr    s9     -UC8OE5!%)EE%<r   c                     	 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  r7   r   r   r  r  )r   mr  s      r   	get_atextr    sp    
 	e$A%%+2259; 	;GGIE#e*+E%)EE%<r   c                 P   	 | r| d   dk7  r$t        j                  dj                  |             t               }| dd  } | r'| d   dk(  rt	        |       \  }} |j                  |       | r| d   dk7  r| d   t        v rt        |       \  }} n| d d dk(  rd}	 t        |       \  }} |j                  j                  t        j                  d             d	}|rSt        |      dkD  rE|d
   j                  dk(  r3|d   j                  dk(  r!t        |d
   d      |d
<   nt	        |       \  }} |j                  |       | r	| d   dk7  r| s2|j                  j                  t        j                  d             || fS || dd  fS # t         j                  $ r t	        |       \  }} Y w xY w)Nr   r   zexpected '"' but found '{}'r   r   r  Fz!encoded word inside quoted stringTr   r  r  r   z"end of header inside quoted string)r   r  r7   r   r  r   r  r  r  r!   rp  r   r^   r  )r   bare_quoted_stringrM   r  s       r   get_bare_quoted_stringr    s    E!HO%%*11%8: 	:)+!"IEqS#E*u!!%(
E!HO8s?"5>LE52AY$H3/6u"**11&2L2L739 :
 C 23a7&r*55>*2.99^K-A*2..7&r* (.LE5!!%(+ E!HO, ""))&*D*D0+2 	3!5((uQRy((! ** 3+E2u3s   >F !F%$F%c                    	 | r,| d   dk7  r$t        j                  dj                  |             t               }| dd  } | rc| d   dk7  r[| d   t        v rt        |       \  }} n%| d   dk(  rt        |       \  }} nt        |       \  }} |j                  |       | r	| d   dk7  r[| s2|j                  j                  t        j                  d             || fS || dd  fS )Nr   r   zexpected '(' but found '{}'r   r   zend of header inside comment)r   r  r7   r   r  r  get_commentr  r   r!   rp  )r   rq   rM   s      r   r  r    s    
 qS%%)0079 	9iG!"IE
E!HO8s?"5>LE51X_&u-LE5'.LE5u E!HO v99* , 	-~E!"Ir   c                     	 t               }| rR| d   t        v rG| d   t        v rt        |       \  }} nt	        |       \  }} |j                  |       | r| d   t        v rG|| fS rC   )r   CFWS_LEADERr  r  r  r   )r   r   rM   s      r   get_cfwsr    sl     :D
E!H+8s?"5>LE5&u-LE5E E!H+ ;r   c                    	 t               }| r*| d   t        v rt        |       \  }} |j                  |       t	        |       \  }} |j                  |       | r*| d   t        v rt        |       \  }} |j                  |       || fS rC   )r   r   r  r   r  )r   quoted_stringrM   s      r   get_quoted_stringr    s     !NMq[(uU#)%0LE5q[(uU#%r   c                     	 t               }| r*| d   t        v rt        |       \  }} |j                  |       | r/| d   t        v r$t        j                  dj                  |             | j                  d      r	 t        |       \  }} nt        |       \  }} |j                  |       | r*| d   t        v rt        |       \  }} |j                  |       || fS # t
        j                  $ r t        |       \  }} Y dw xY w)Nr   zexpected atom but found '{}'r  )r   r   r  r   	ATOM_ENDSr   r  r7   r  r  r  )r   r   rM   s      r   get_atomr  '  s     6Dq[(uEqY&%%*11%8: 	:	,+E2LE5 !'uKKq[(uE; && 	, %U+LE5	,s   ;C !C=<C=c                    	 t               }| r| d   t        v r$t        j                  dj	                  |             | r\| d   t        vrQt        |       \  }} |j                  |       | r"| d   dk(  r|j                  t               | dd  } | r| d   t        vrQ|d   t        u r't        j                  dj	                  d| z               || 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  r  r   r  r7   r  r   r<  )r   dot_atom_textrM   s      r   get_dot_atom_textr
  B  s      MME!H	)%% '++16%=: 	:
E!HI- 'uU#U1X_  %!"IE E!HI- RC%% '#VCI.0 	0%r   c                    	 t               }| d   t        v rt        |       \  }} |j                  |       | j	                  d      r	 t        |       \  }} nt        |       \  }} |j                  |       | r*| d   t        v rt        |       \  }} |j                  |       || fS # t        j                  $ r t        |       \  }} Y dw xY w)Nr   r  )	r  r   r  r   r  r  r   r  r
  )r   dot_atomrM   s      r   get_dot_atomr  U  s    
 yHQx;u	4+E2LE5 )/uOOEq[(uU? && 	4 -U3LE5	4s   B& &!C
	C
c                 *   	 | d   t         v rt        |       \  }} nd }| st        j                  d      | d   dk(  rt	        |       \  }} n=| d   t
        v r$t        j                  dj                  |             t        |       \  }} ||g|d d || fS )Nr   z5Expected 'atom' or 'quoted-string' but found nothing.r   z1Expected 'atom' or 'quoted-string' but found '{}')r   r  r   r  r  SPECIALSr7   r  )r   leaderrM   s      r   get_wordr  n  s     Qx; %%CE 	EQx}(/u	qX	%% '77=ve}F 	F  uHbq	%<r   c                    	 t               }	 t        |       \  }} |j                  |       | r| d   t        vr| d   dk(  rI|j                  t               |j
                  j                  t        j                  d             | dd  } n 	 t        |       \  }} |j                  |       | r| d   t        vr|| fS # t        j                  $ r1 |j
                  j                  t        j                  d             Y w xY w# t        j                  $ rL | d   t        v r=t        |       \  }} |j
                  j                  t        j                  d             n Y w xY w)Nzphrase does not start with wordr   r	   zperiod in 'phrase'r   zcomment found without atom)rz   r  r   r   r  r!   rp  PHRASE_ENDSr<  ObsoleteHeaderDefectr   r  )r   r{   rM   s      r   
get_phraser    sR   
 XF0ue E!HK/8S=MM#NN!!&"="=$#& '!"IE'u MM% ! E!HK/" 5=) "" 0f88-/ 	00 ** 8{*#+E?LE5NN))&*E*E4+6 7 7s%   B< D <AD ?D AE"!E"c                    	 t               }d }| r| d   t        v rt        |       \  }} | s$t        j                  dj                  |             	 t        |       \  }} ||g|d d |j                  |       | r| d   dk(  s| d   t        vrt        t        |      | z         \  }} |j                  dk(  r/|j                  j                  t        j                  d             n.|j                  j                  t        j                   d             ||d<   	 |j"                  j%                  d       || fS # t        j                  $ rK 	 t        |       \  }} n7# t        j                  $ r! | d   dk7  r| d   t        v r t               }Y nw xY wY 6w xY w# t&        $ r4 |j                  j                  t        j(                  d             Y || fS w xY 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))r8  r   r  r   r  r7   r  r  r  r   r   get_obs_local_partr   r^   r!   rp  r  r   encoderv  NonASCIILocalPartDefect)r   r   r  rM   obs_local_parts        r   get_local_partr    s    JFq[( %%077>@ 	@ #E*u Hbq	e%(D.E!HK$? 23z?U3J K$$(@@%%f&@&@N'P Q %%f&A&A>'@ A&
1>( u1 ""  	 #E?LE5&& 	 Qx4E!H$;KE	  *  >!!&"@"@;#= 	>u>sH   D7 F 7FEF1FFFFF7GGc                 P   	 t               }d}| rB| d   dk(  s| d   t        vr.| d   dk(  rM|r.|j                  j                  t	        j
                  d             |j                  t               d}| dd  } l| d   dk(  rT|j                  t        | d   d             | dd  } |j                  j                  t	        j
                  d	             d}|r@|d
   j                  dk7  r.|j                  j                  t	        j
                  d             	 t        |       \  }} d}|j                  |       | r| d   dk(  r!| d   t        vr.|s$t	        j                  dj                  |             |d   j                  dk(  s2|d   j                  dk(  rNt        |      dkD  r@|d   j                  dk(  r.|j                  j                  t	        j
                  d             |d
   j                  dk(  s2|d
   j                  dk(  rNt        |      dkD  r@|d   j                  dk(  r.|j                  j                  t	        j
                  d             |j                  rd|_        || fS # t        j                  $ r | d   t        vr t        |       \  }} Y {w xY w)NFr   r   r	   zinvalid repeated '.'Tr   misplaced-specialz/'\' character outside of quoted-string/ccontentr   r;  zmissing '.' between wordsz&expected obs-local-part but found '{}'r   z!Invalid leading '.' in local partr  z"Invalid trailing '.' in local partr  )r.  r  r!   r   r   rp  r<  r  r^   r  r  r   r  r7   r   )r   r  last_non_ws_was_dotrM   s       r   r  r    s   !^N
U1Xt^uQx{'B8s?"&&--f.H.H*/, -!!#&"&!"IE1Xt^!!-a0C#E F!"IE""))&*D*DB+D E"'nR0;;uD""))&*D*D++- .	+#E?LE5"'
 	e$7 U1Xt^uQx{'B8 %%4;;EBD 	Dq$$-1((&0!#1((%/%%f&@&@/'1 	2r%%.2))61!#2))50%%f&@&@0'2 	3$<!5  - && 	+Qx{*#E?LE5	+s   I4 4-J%$J%c                     	 t        | d      \  }} }t        |d      }|r.|j                  j                  t	        j
                  d             t        |       || fS )Nz[]rE  z(quoted printable found in domain-literal)r  r  r!   r   r   r  r  )r   rE  r  s      r   	get_dtextr"    s_    
 2%>E5&%)EV8868 	9E%<r   c                     | ry|j                  t        j                  d             |j                  t        dd             y)NFz"end of input inside domain-literal]domain-literal-endT)r   r   rp  r  )r   domain_literals     r   _check_for_early_dl_endr'  %  s?    &44,. /--ABCr   c                 p   	 t               }| d   t        v rt        |       \  }} |j                  |       | st	        j
                  d      | d   dk7  r$t	        j
                  dj                  |             | dd  } t        | |      r|| fS |j                  t        dd             | d   t        v rt        |       \  }} |j                  |       t        |       \  }} |j                  |       t        | |      r|| fS | d   t        v rt        |       \  }} |j                  |       t        | |      r|| fS | d   dk7  r$t	        j
                  dj                  |             |j                  t        dd	             | dd  } | r*| d   t        v rt        |       \  }} |j                  |       || 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%  )rB  r   r  r   r   r  r7   r'  r  r  r  r"  )r   r&  rM   s      r   get_domain_literalr*  -  s    #_NQx;ue$%%&?@@Qx3%% '!!'0 	0!"IEun5u$$--CDEQx3u~ue$U#LE5% un5u$$Qx3u~ue$un5u$$Qx3%% '!!'0 	0--ABC!"IEq[(ue$5  r   c                 $   	 t               }d }| r| d   t        v rt        |       \  }} | s$t        j                  dj                  |             | d   dk(  r+t        |       \  }} ||g|d d |j                  |       || fS 	 t        |       \  }} | r| d   dk(  rt        j                  d      ||g|d d |j                  |       | r| d   dk(  r|j                  j                  t        j                  d             |d   j                  dk(  r|d   |d d  | rJ| d   dk(  rB|j                  t               t        | d	d        \  }} |j                  |       | r	| d   dk(  rB|| fS # t        j                  $ r t        |       \  }} Y w xY w)
Nr   zexpected domain but found '{}'r)  r(  zInvalid Domainr	   z(domain is not a dot-atom (contains CFWS)r  r   )r  r   r  r   r  r7   r*  r   r  r  r!   r  r^   r<  )r   r   r  rM   s       r   
get_domainr,  T  s    XFFq[( %%,33E:< 	<Qx3)%0uE"1Ieu}'#E*u qS%%&677Hbq	
MM%qSf9968 	9!9:-q	F1IaCMM##E!"I.LE5MM%  aC 5=! "" 'u's   E+ +!FFc                 P   	 t               }t        |       \  }} |j                  |       | r| d   dk7  r2|j                  j                  t	        j
                  d             || fS |j                  t        dd             t        | dd        \  }} |j                  |       || fS )Nr   r(  z#addr-spec local part with no domainaddress-at-symbolr   )r   r  r   r!   r   rp  r  r,  )r   r   rM   s      r   get_addr_specr/  z  s     
I!%(LE5UE!HO  !;!;1"3 	4%]3(;<=eABi(LE5Uer   c                    	 t               }| rw| d   dk(  s| d   t        v rd| d   t        v r t        |       \  }} |j                  |       n"| d   dk(  r|j                  t               | dd  } | r| d   dk(  rX| d   t        v rd| r| d   dk7  r$t        j                  dj                  |             |j                  t               t        | dd        \  }} |j                  |       | r| d   dk(  r|j                  t               | dd  } | snw| d   t        v rt        |       \  }} |j                  |       | snJ| d   dk(  r7|j                  t               t        | dd        \  }} |j                  |       | r	| d   dk(  r| st        j                  d      | d   dk7  r$t        j                  dj                  |             |j                  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  r   r  r   ListSeparatorr   r  r7   RouteComponentMarkerr,  r  )r   	obs_routerM   s      r   get_obs_router5    s    
I
U1Xs]eAh+&=8{"#E?LE5U#1X_]+!"IE U1Xs]eAh+&= E!HO%%6==eDF 	F)*eABi(LE5U
E!HcM'ab	8{"#E?LE5U#8s?12%eABi0LE5U# E!HcM %%&MNNQx3%% (''-ve}6 	6]3(ABCeABir   c                 z   	 t               }| r*| d   t        v rt        |       \  }} |j                  |       | r| d   dk7  r$t	        j
                  dj                  |             |j                  t        dd             | dd  } | rZ| d   dk(  rR|j                  t        dd             |j                  j                  t	        j                  d             | dd  } || fS 	 t        |       \  }} |j                  |       | r| d   dk(  r| dd  } n.|j                  j                  t	        j                  d             |j                  t        dd             | r*| d   t        v rt        |       \  }} |j                  |       || fS # t        j
                  $ r 	 t        |       \  }} |j                  j                  t	        j                  d	             n;# t        j
                  $ r% t	        j
                  d
j                  |             w xY w|j                  |       t        |       \  }} Y Hw xY w)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   r   r  r   r   r  r7   r  r!   rp  r/  r5  r  )r   
angle_addrrM   s      r   get_angle_addrr:    s9    Jq[(u% E!HO%%077>@ 	@mC);<=!"IE qS--=>?!!&"<"<*#, 	-ab	5  ,$U+u eqSab	!!&"<"<0#2 	3mC)9:;q[(u% u) "" 	,	P(/LE5%%f&A&A<'> ?&& 	P))@GGNP P	P 	% $U+u	,s*   #F H:<GH:8H"H:9H:c                     	 t               }t        |       \  }} |j                  |d d         |j                  d d  |_        || fS r   )r0  r  rK   r!   )r   r   rM   s      r   get_display_namer<    sL     =Le$LE5a! ==+Lr   c                    	 t               }d }| s$t        j                  dj                  |             | d   t        v r4t        |       \  }} | s$t        j                  dj                  |            | d   dk7  r| d   t        v r$t        j                  dj                  |             t        |       \  }} | s$t        j                  dj                  |            |%t        |d   t              r
|g|d   d d n|g|d d d }|j                  |       t        |       \  }} ||g|d d |j                  |       || fS )Nz!expected name-addr but found '{}'r   r7  )r   r   r  r7   r   r  r  r<  r3  r   r   r:  )r   	name_addrr  rM   s       r   get_name_addrr?    se    
IF%%/66u=? 	?Qx; ))3::6BD DQx38{"))3::5AC C'.u))3::5AC C%(I. &xa!#Hbq	F!%(LE5Hbq	Uer   c                 n   	 t               }	 t        |       \  }} t        d |j                  D              rd|_        |j                  |       || fS # t        j                  $ rN 	 t	        |       \  }} n;# t        j                  $ r% t        j                  dj                  |             w xY wY w xY w)Nzexpected mailbox but found '{}'c              3   P   K   | ]  }t        |t        j                           y wr   )r3  r   rp  r*   s     r   r-   zget_mailbox.<locals>.<genexpr>%  s%      3 11 a334 1   $&r   )
r  r?  r   r  r/  r7   anyr?   r^   r   )r   r   rM   s      r   get_mailboxrD    s    
 iGA$U+u  3 % 1 13 3.NN5E> "" A	A(/LE5&& 	A))188?A A	A As)   A B4'A65B468B..B43B4c                     	 t               }| r_| d   |vrX| d   t        v r$|j                  t        | d   d             | dd  } nt	        |       \  }} |j                  |       | r| d   |vrX|| fS )Nr   r  r   )r  r  r   r  r  )r   r  invalid_mailboxrM   s       r   get_invalid_mailboxrG  +  s     %&O
E!HH,8{"""=q1D$F G!"IE%e,LE5""5) E!HH, E!!r   c                 ^   	 t               }| r| d   dk7  r	 t        |       \  }} |j                  |       | ra| d   dvrZ|d   }d|_        t        | d      \  }} |j                  |       |j                  j                  t        j                  d             | r"| d   dk(  r|j                  t               | d	d  } | r	| d   dk7  r|| fS # t        j                  $ rL d }| d   t
        v rt        |       \  }} | r| d   dv r@|j                  |       |j                  j                  t        j                  d             nt        | d      \  }} ||g|d d |j                  |       |j                  j                  t        j                  d             n| d   dk(  r/|j                  j                  t        j                  d             nVt        | d      \  }} ||g|d d |j                  |       |j                  j                  t        j                  d             Y w xY w)
Nr   ;z,;zempty element in mailbox-listzinvalid mailbox in mailbox-listr  r   r   r   )r   rD  r   r   r  r   r  r!   r  rG  rp  r^   rK   r2  )r   mailbox_listrM   r  r   s        r   get_mailbox_listrK  =  s:   
 =L
E!HO	8&u-LE5&4 U1XT) #2&G!2G.ud;LE5NN5!  ''(B(B1)3 4U1X_.!"IEQ E!HOR K && 	8FQx;& (aD 0 ''/ ((//0K0K719 : $7ud#CLE5)%+Hbq	 ''. ((//0J0J91; <qS$$++F,G,G3-5 6  35$?u%!'E"1I##E*$$++F,F,F5-7 8/	8s   C EH,+H,c                    	 t               }| s2|j                  j                  t        j                  d             || fS d }| r{| d   t
        v rpt        |       \  }} | sC|j                  j                  t        j                  d             |j                  |       || fS | d   dk(  r|j                  |       || fS t        |       \  }} t        |j                        dk(  rV||j                  |       |j                  |       |j                  j                  t        j                  d             || fS ||g|d d |j                  |       || fS )Nzend of header before group-listr   zend of header in group-listrI  zgroup-list with empty entries)r   r!   r   r   rp  r   r  rK  r   r   rK   r  )r   
group_listr  rM   s       r   get_group_listrN  v  sf    J!!&"<"<-#/ 	05  Fq[(  %%f&@&@-'/ 0f%u$$8s?f%u$$#E*LE5
5"f%% !!&"="=+#- 	.5  Hbq	eur   c                    	 t               }t        |       \  }} | r| d   dk7  r$t        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k7  r$t        j                  d	j	                  |             |j                  t        dd             | dd  } | r*| d   t        v rt        |       \  }} |j                  |       || fS )
Nr   r1  z8expected ':' at end of group display name but found '{}'zgroup-display-name-terminatorr   rI  zgroup-terminatorzend of header in groupz)expected ';' at end of group but found {})r   r<  r   r  r7   r   r  rN  r!   rp  r   r  )r   r   rM   s      r   	get_grouprP    sf    GE#E*LE5E!HO%% '**0&-9 	9	LL	LLs$CDE!"IEqS]3(:;<eABi!%(LE5	LLV77$& 	'	qS%%7>>uEG 	G	LLs$678!"IEq[(uU%<r   c                 (   	 t               }	 t        |       \  }} |j                  |       || fS # t        j                  $ rN 	 t	        |       \  }} n;# t        j                  $ r% t        j                  dj                  |             w xY wY uw xY w)Nzexpected address but found '{}')r   rP  r   r  rD  r7   r   )r   r   rM   s      r   get_addressrR    s      iGA 'u NN5E> "" A	A&u-LE5&& 	A))188?A A	A As'   0 BAB8BBBc                 `   	 t               }| r	 t        |       \  }} |j                  |       | re| d   dk7  r]|d   d   }d|_        t        | d      \  }} |j                  |       |j                  j                  t        j                  d             | r|j                  t               | dd  } | r|| fS # t        j                  $ ra d }| d   t
        v rt        |       \  }} | r| d   dk(  r@|j                  |       |j                  j                  t        j                  d             nt        | d      \  }} ||g|d d |j                  t        |g             |j                  j                  t        j                  d             n| d   dk(  r/|j                  j                  t        j                  d             n`t        | d      \  }} ||g|d d |j                  t        |g             |j                  j                  t        j                  d             Y w xY w)	Nr   r  z"address-list entry with no contentzinvalid address in address-listzempty element in address-listr   r   r   )r   rR  r   r   r  r   r  r!   r  rG  r   rp  r^   rK   r2  )r   address_listrM   r  r   s        r   get_address_listrU    s-    =L
	8&u-LE5&4 U1X_ #2&q)G!2G.uc:LE5NN5!  ''(B(B1)3 4.!"IEQ R K && 	8FQx;& (aC ''/ ((//0K0K<1> ? $7uc#BLE5)%+Hbq	 ''(89 ((//0J0J91; <qS$$++F,G,G3-5 6  35#>u%!'E"1I##GUG$45$$++F,F,F5-7 8/	8s   B8 8E1H-,H-c                    	 t               }| s$t        j                  dj                  |             | d   dk7  r$t        j                  dj                  |             |j	                  t        dd             | dd  } t        |       \  }} |j	                  |       | r| d   dk7  r$t        j                  dj                  |             |j	                  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   r  r7   r   r  r"  )r   no_fold_literalrM   s      r   get_no_fold_literalrX    s    #oO%%5<<UCE 	EQx3%%#VE], 	, =.EFG!"IEU#LE55!E!HO%%#VE], 	, =.CDEE!"I%%r   c                 H   	 t               }| r*| d   t        v rt        |       \  }} |j                  |       | r| d   dk7  r$t	        j
                  dj                  |             |j                  t        dd             | dd  } 	 t        |       \  }} |j                  |       | r| d   dk7  r\|j                  j                  t	        j                  d	             | r(| d   d
k(  r |j                  t        d
d             | dd  } || fS |j                  t        dd             | dd  } 	 t        |       \  }} |j                  |       | r| d   d
k(  r| dd  } n.|j                  j                  t	        j                  d             |j                  t        d
d             | r*| d   t        v rt        |       \  }} |j                  |       || fS # t        j
                  $ r} 	 t        |       \  }} |j                  j                  t	        j                  d             n;# t        j
                  $ r% t	        j
                  dj                  |             w xY wY w xY w# t        j
                  $ r 	 t        |       \  }} n# t        j
                  $ r| 	 t        |       \  }} |j                  j                  t	        j                  d             n;# t        j
                  $ r% t	        j
                  dj                  |             w xY wY nw xY wY w xY w)Nr   r7  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-rightr8  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  r   r  r   r   r  r7   r  r
  r  r!   r  rp  rX  r,  )r   msg_idrM   s      r   
get_msg_idr[  #  s   
 WFq[(ueE!HO%%,33E:< 	<
MM-^45!"IE1(/u MM%E!HOf88%' 	(
 U1X_MM-\:;!"IEu}
MM-%89:!"IE5(/u MM%qSab	f88,. 	/
MM-\23q[(ue5=a "" 	1	1-e4LE5NN!!&"="=,#. /&& 	1))""(&-1 1	1/		14 "" 5
	5.u5LE5&& 	55)%0u%%f&A&A1'3 4** 5--&&,fUm5 554	55sx   G -I( I%)<H&%I%&8II%$I%(L!<J
L!L<KL8LLL!LL! L!c                    	 t               }	 t        |       \  }} |j                  |       | r=|j                  j                  t	        j
                  dj                  |                    |S # t        j                  $ r^}t        |       }t        |      }|j                  j                  t	        j
                  dj                  |                   Y d }~|S d }~ww xY w)NzUnexpected {!r}zInvalid msg-id: {!r})
r  r[  r   r!   r   rp  r7   r  r  r  )r   
message_idrM   exs       r   parse_message_idr_  h  s    J2!%(u%  %%f&@&@!((/'1 2  "" K '%e,
!!&&'='D'DR'HI	K 	K Ks   A- -C ACCc                 l   	 t               }| s0|j                  j                  t        j                  d             |S | d   t
        v rOt        |       \  }} |j                  |       | s.|j                  j                  t        j                  d             d}| r6| d   dk7  r.| d   t
        vr#|| d   z  }| dd  } | r| d   dk7  r| d   t
        vr#|j                         sY|j                  j                  t        j                  dj                  |                   |j                  t        |d             n+t        |      |_        |j                  t        |d	             | r*| d   t
        v rt        |       \  }} |j                  |       | r| d   dk7  rY|j                  .|j                  j                  t        j                  d
             | r|j                  t        | d             |S |j                  t        dd             | dd  } | r*| d   t
        v rt        |       \  }} |j                  |       | s<|j                  .|j                  j                  t        j                  d
             |S d}| r&| d   t
        vr|| d   z  }| dd  } | r| d   t
        vr|j                         sY|j                  j                  t        j                  dj                  |                   |j                  t        |d             n+t        |      |_        |j                  t        |d	             | r*| d   t
        v rt        |       \  }} |j                  |       | rI|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	   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)rH  r!   r   r   HeaderMissingRequiredValuer   r  isdigitrp  r7   r  intrI  rJ  )r   mime_versionrM   ra  s       r   parse_mime_versionrf    su   
 =L##F$E$E3%5 	6Qx;uE"  ''(I(IB)D EF
E!HOa(C%(ab	 E!HOa(C >>##F$>$>?FFvN%P 	QM&':; [M&(;<q[(uE"E!HO)  ''(B(BB)D EeW =>c+>?@!"IEq[(uE")  ''(B(BB)D EF
E!HK/%(ab	 E!HK/ >>##F$>$>?FFvN%P 	QM&':; [M&(;<q[(uE"##F$>$>5%7 	8M%9:r   c                     	 t               }| ra| d   dk7  rY| d   t        v r$|j                  t        | d   d             | dd  } nt	        |       \  }} |j                  |       | r	| d   dk7  rY|| fS )Nr   rI  r  r   )rW  r  r   r  r  )r   invalid_parameterrM   s      r   get_invalid_parameterri    s     )*
E!HO8{"$$]583F&H I!"IE%e,LE5$$U+ E!HO e##r   c                     	 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  r7   r   r   r  r  )r   r  rk  s      r   	get_ttextrm    sp     	u%A%%+2259; 	;GGIE#e*+E%)EE%<r   c                 p   	 t               }| r*| d   t        v rt        |       \  }} |j                  |       | r/| d   t        v r$t        j                  dj                  |             t        |       \  }} |j                  |       | r*| d   t        v rt        |       \  }} |j                  |       || fS Nr   zexpected token but found '{}')	r   r   r  r   
TOKEN_ENDSr   r  r7   rm  )r   mtokenrM   s      r   	get_tokenrr    s     WFq[(ueqZ'%%+2259; 	;U#LE5
MM%q[(ue5=r   c                     	 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  r7   r   r   r  r  r   r  r]  s      r   get_attrtextrv  	  sp     	#5)A%%.55e<> 	>wwyH#h-.!EXz2HHU?r   c                 p   	 t               }| r*| d   t        v rt        |       \  }} |j                  |       | r/| d   t        v r$t        j                  dj                  |             t        |       \  }} |j                  |       | r*| d   t        v rt        |       \  }} |j                  |       || fS ro  )	rZ  r   r  r   ATTRIBUTE_ENDSr   r  r7   rv  r   r[  rM   s      r   get_attributerz  	  s     Iq[(uq^+%%+2259; 	;&LE5Uq[(uer   c                     	 t        |       }|s$t        j                  dj                  |             |j	                         }| t        |      d  } t        |d      }t        |       || fS )Nz)expected extended attrtext but found {!r}extended-attrtext)#_non_extended_attribute_end_matcherr   r  r7   r   r   r  r  ru  s      r   get_extended_attrtextr~  .	  ss     	,E2A%%7>>uEG 	GwwyH#h-.!EX':;HHU?r   c                 p   	 t               }| r*| d   t        v rt        |       \  }} |j                  |       | r/| d   t        v r$t        j                  dj                  |             t        |       \  }} |j                  |       | r*| d   t        v rt        |       \  }} |j                  |       || fS ro  )	rZ  r   r  r   EXTENDED_ATTRIBUTE_ENDSr   r  r7   r~  ry  s      r   get_extended_attributer  @	  s     Iq[(uq44%%+2259; 	;(/LE5Uq[(uer   c                 n   	 t               }| r| d   dk7  r$t        j                  dj                  |             |j	                  t        dd             | dd  } | r| d   j                         s$t        j                  dj                  |             d}| r6| d   j                         r#|| d   z  }| dd  } | r| d   j                         r#|d   dk(  r3|dk7  r.|j                  j	                  t        j                  d	             t        |      |_
        |j	                  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 0ra  )ra  r   r  r7   r   r  rc  r!   rp  rd  rQ  )r   rb  ra  s      r   get_sectionr  V	  s7    iGE!HO%%&E&L&L(-'/ 0 	0NN=&678!"IEa((*%% '117@ 	@F
E!H$$&%(ab	 E!H$$& ayCFcMv999 ; 	<[GNNN=23E>r   c                 L   	 t               }| st        j                  d      d }| d   t        v rt	        |       \  }} | s$t        j                  dj                  |            | d   dk(  rt        |       \  }} nt        |       \  }} ||g|d d |j                  |       || fS )Nz&Expected value but found end of stringr   z Expected value but found only {}r   )	rd  r   r  r   r  r7   r  r  r   )r   vr  rM   s       r   	get_valuer  t	  s     	A%%&NOOFQx; %% '006v@ 	@Qx3(/u-e4uHbq	HHUOe8Or   c                 
   	 t               }t        |       \  }} |j                  |       | r| d   dk(  rA|j                  j                  t	        j
                  dj                  |                   || fS | d   dk(  rm	 t        |       \  }} d|_        |j                  |       | st	        j                  d      | d   dk(  r'|j                  t        dd             | dd  } d|_        | d   d	k7  rt	        j                  d
      |j                  t        d	d             | dd  } | r*| d   t        v rt        |       \  }} |j                  |       d }|}|j                  r| r| d   dk(  rt        |       \  }}|j                  }d}|j                   dk(  r(|r|d   dk(  rd}n/t#        |      \  }}|r|d   dk(  rd}n	 t%        |      \  }}|sd}	 |ra|j                  j                  t	        j
                  d             |j                  |       |D ]  }	|	j&                  dk(  sg |	d d  |	} n |} n0d }|j                  j                  t	        j
                  d             | r| d   dk(  rd }nt)        |       \  }} |j                  r|j                   dkD  rQ| r| d   dk7  r|j                  |       ||} || fS |j                  j                  t	        j
                  d             | sF|j                  j                  t	        j
                  d             |j                  |       |#|| fS |I|D ]  }	|	j&                  dk(  s n 	j&                  dk(   |j                  |	       |	j*                  |_        | d   dk7  r$t	        j                  dj                  |             |j                  t        dd             | dd  } | rf| d   dk7  r^t#        |       \  }} |j                  |       |j*                  |_        | r| d   dk7  r$t	        j                  dj                  |             |j                  t        dd             | dd  } |et1               }
| rV| d   t2        v rt5        |       \  }} n(| d   dk(  rt        dd      }| dd  } nt7        |       \  }} |
j                  |       | rV|
}nt)        |       \  }} |j                  |       ||} || fS # t        j                  $ r Y Ww xY w#  Y .xY w)Nr   rI  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 {}DQUOTE)rL  rz  r   r!   r   rp  r7   r  rP  r  r  rU  r   r  r  r   rR  rv  r~  r^   r  r   r   r   rd  r  r  r  )r   r  rM   r  appendtoqstringinner_value
semi_validr  tr  s              r   get_parameterr  	  s    KE 'LE5	LLE!HOV77 9%%+VE]4 	5e|Qx3	&u-LE5"EOLL ))*@AA8s?LLs,GHI!"IE!ENQx3%%&EFF	LLs$9:;!"IEq[(uUIH~~%E!HO /u5,,
1${1~4!
*;7tDGsN!%J&3K@t !%JMM  !;!;G"I JLL!<<#77AaD H	 
  EIMM  !;!;:"; < qS 'u>>U11A5aCOOE"$!%<V77DE 	F V7768 	9%<<<#66  LLJ&OOAGGEM8s?)) +FFLfUmU Uc+>?@ab	U1X_'.LE5OOE"EJE!HO-- /<<BF5MK Kc+>?@ab	GQx3&u~uqS%c84ab	+E2uHHUO   'uOOE%<i && 		Ds   ?&S& T  &S=<S= Tc                    	 t               }| r	 t        |       \  }} |j                  |       | rp| d   dk7  rh|d   }d|_        t        |       \  }} |j                  |       |j                  j                  t        j                  dj                  |                   | r |j                  t        dd             | d	d  } | r|S # t        j                  $ r d }| d   t
        v rt        |       \  }} | s|j                  |       |cY S | d   dk(  rB||j                  |       |j                  j                  t        j                  d             ndt        |       \  }} |r|g|d d |j                  |       |j                  j                  t        j                  dj                  |                   Y w xY w)
Nr   rI  zparameter entry with no contentzinvalid parameter {!r}r   rX  z)parameter with invalid trailing text {!r}r  r   )rg  r  r   r   r  r   r  r!   rp  ri  r7   r^   rK   r  )r   mime_parametersrM   r  r  s        r   parse_mime_parametersr  
  s    %&O
	=(/LE5""5)( U1X_ $B'E2E07LE5LL##**6+E+E;BB5I,K L""=6K#LM!"IEG H A && 	=FQx;& (&&v.&&Qx3%#**62''..v/I/I507 8  5U;u!'E"1I&&u-''..v/I/I,33E:0< =#	=s   C AF>B.F>=F>c                 B   	 |ra|d   dk7  rY|d   t         v r$| j                  t        |d   d             |dd  }nt        |      \  }}| j                  |       |r	|d   dk7  rY|sy | j                  t        dd             | j                  t	        |dd               y )Nr   rI  r  r   r  )r  r   r  r  r  )	tokenlistr   rM   s      r   _find_mime_parametersr  K
  s     E!HO8{"]585HIJ!"IE%e,LE5U# E!HO ]3(=>?*5956r   c                 :   	 t               }| s0|j                  j                  t        j                  d             |S 	 t        |       \  }} |j                  |       | r| d   dk7  r>|j                  j                  t        j                  d             | rt        ||        |S |j                  j                         j                         |_        |j                  t        dd             | dd  } 	 t        |       \  }} |j                  |       |j                  j                         j                         |_        | s|S | d   d	k7  rO|j                  j                  t        j                  d
j                  |                    |`|`t        ||        |S |j                  t        d	d             |j                  t!        | dd               |S # t        j                  $ rN |j                  j                  t        j                  dj                  |                    t        ||        |cY S w xY w# t        j                  $ rN |j                  j                  t        j                  dj                  |                    t        ||        |cY S w xY w)Nz"Missing content type specificationz(Expected content maintype but found {!r}r   r  zInvalid content typezcontent-type-separatorr   z'Expected content subtype but found {!r}rI  z<Only parameters are valid after content type, but found {!r}r  )r  r!   r   r   rb  rr  r  rp  r7   r  r   rm  lowerr  r  r  r  )r   ctyperM   s      r   parse_content_type_headerr  [
  sM    MEV>>02 	3 'u 
LL E!HOV77"$ 	%!%/[[&&(..0EN	LLs$<=>!"IE 'u 
LLKK%%'--/EMQx3V77( 	) NEMeU+	LLs$9:;	LL&uQRy12LQ "" V776==eDF 	GeU+	& "" V775<<UCE 	FeU+	s%   G 4H9 AH65H69AJJc                     	 t               }| s0|j                  j                  t        j                  d             |S 	 t        |       \  }} |j                  |       |j                  j                         j                         |_        | s|S | d   dk7  rK|j                  j                  t        j                  dj                  |                    t        ||        |S |j                  t        dd             |j                  t        | dd               |S # t        j                  $ rN |j                  j                  t        j                  dj                  |                    t        ||        |cY S w xY w)NzMissing content dispositionz+Expected content disposition but found {!r}r   rI  zCOnly parameters are valid after content disposition, but found {!r}r  r   )r  r!   r   r   rb  rr  r  rp  r7   r  r   rm  r  r  r  r  )r   disp_headerrM   s      r    parse_content_disposition_headerr  
  sb    %&K""6#D#D)$+ 	, 'u u&+kk&7&7&9&?&?&AK#Qx3""6#=#=$( 	) 	k51}S*?@A,U12Y78# "" ""6#=#=9@@G$I 	Jk51	s   D AE=<E=c                    	 t               }| s0|j                  j                  t        j                  d             |S 	 t        |       \  }} |j                  |       |j                  j                         j                         |_	        | s|S | r|j                  j                  t        j                  d             | d   t        v r$|j                  t        | d   d             | dd  } nt        |       \  }} |j                  |       | r|S # t        j                  $ r@ |j                  j                  t        j                  dj                  |                    Y w xY w)Nz!Missing content transfer encodingz1Expected content transfer encoding but found {!r}z*Extra text after content transfer encodingr   r  r   )r  r!   r   r   rb  rr  r   rm  r  r   r  rp  r7   r  r  r  )r   
cte_headerrM   s      r   &parse_content_transfer_encoding_headerr  
  sR    )*J!!&"C"C/#1 	25 'u
 	% **,224

!!&"<"<8#: 	;8{"mE!H6IJK!"IE%e,LE5e$  # "" P!!&"<"<?FFuM#O 	PPs   D AE%$E%c                 Z    d}| r&| d   r!| d   d   t         v r| d   d   }| d   d d | d<   |S )Nr'   r   )r  )lineswsps     r   _steal_trailing_WSP_if_existsr  
  sD    
CruRy}3Bim"IcrNb	Jr   c          	         	 |j                   xs t        j                  }|j                  rdnd}dg}d}d }d }d}d}	t	        dd      }
t        |       }|rL|j                  d      }||
u r|dz  }t        |      }|	s;|j                  dv rt        j                  |       }	nt        j                  |       }		 |j                  |       |}|j                  dk(  rt!        ||||       |	r|s|j"                  sd}	d }|j$                  r|j'                  |      d t)        |j*                          }|j*                  |vrHt)        |      |t)        |d         z
  kD  rt-        |      }|j/                  |       |dxx   |z  cc<   9t1        |d      st        |      |z   }d}	W|j"                  r;|||k7  r|d
k(  s
|dk(  r|dk7  rd }t3        |||||j4                  ||      }d}|}d}	d }d}	t)        |      |t)        |d         z
  k  r|dxx   |z  cc<   d}|j$                  r~t)        |      dz   |k  rmt-        |      }|s|j7                         rP|j/                  ||z          g }|d   D ]  }|t8        vr n|j/                  |        dj;                  |      }d }Zt1        |d      st        |      }|j                  dk(  r?t=        dd      g|D cg c]  }t=        t?        |      d       c}z   t=        dd      gz   }|j"                  s|dz  }|j/                  |
       ||z   }|j"                  r|s|jA                  d|       d}	t-        |      }|s|j7                         r|j/                  ||z          n|dxx   |z  cc<   |rL|j*                  j;                  |      |j*                  z   S # t        $ r' t        d	 |j                  D              rd
}nd}d}	Y ,w xY wc c}w )Nutf-8rN  r'   r   Fwrap_as_ew_blockedr   )rE  r  c              3   P   K   | ]  }t        |t        j                           y wr   )r3  r   rx  r*   s     r   r-   z%_refold_parse_tree.<locals>.<genexpr>
  s%      .,q a!>!>?,rB  unknown-8bitTrh  rO   r   r  r   r   rE  )!max_line_lengthsysmaxsizeutf8r  r  r2  r   r^   
SPECIALSNL
isdisjointNLSETr  rv  rC  r?   _fold_mime_parametersrG   rd   rS   r   r  r  r   r_   _fold_as_ewre   rD   r  r1   r  r   insert)
parse_treerP   maxlenrl  r  leading_whitespacelast_ewlast_charsetr  want_encodingend_ew_not_allowedr|  rH   tstrr   encoded_partnewlinewhitespace_accumulatorcharnewpartsps                        r   rQ   rQ   
  sX    ##2s{{F ++w:HDE GLM!"&:;E
yy|%%!#4y"44$.$9$9$$? ? %*$4$4T$: :	!KK!G ??//!$vx@!3%% %''#'99F9#;<Qc&..>Q=Q#RL~~\9|,vE"I/FF&CE&JG!LL1b	\1	 
 4*T
U* %## '|+!^3!W,J1F"G%dE67&*&=&=wHZ\ &("& %  % t9U2Y//"II
    D	A'3E:G$--/
 Wt^,)+&!"ID3*11$7 & &(WW-C%D"tX&DzH"66
 #301&(& ##4Q#7A&(( #3012 
 %%"a'" 23u$E&8 LLD! M/6d))+LL4( "IIK N >>u%66o " 	! . ,,. .( " M	!B(s   ;O $O>,O;:O;c                     	 |+|r)t        t        |d   |d  | z               } |d   d | |d<   nM| d   t        v rB| d   }| dd  } t        |d         |k(  r|j	                  t        |             |dxx   |z  cc<   d}| d   t        v r
| d   }| d d } |t        |d         n|}	|dk(  rdn|}
t        |
      dz   }|dz   |k\  rt        j                  d      | r!|t        |d         z
  }||z
  t        |      z
  }|dk  r|j	                  d	       <t        |      dkD  r9t        |d         dk(  r(|r&t        j                  ||

      }|dxx   |z  cc<   d}| d | }t        j                  ||

      }t        |      |z
  }|dkD  r0|d d }t        j                  ||

      }t        |      |z
  }|dkD  r0|dxx   |z  cc<   | t        |      d  } d}| r|j	                  d	       t        |d         }	| r!|dxx   |z  cc<   |r|	S d S )Nr   r   r   r'   rN  r     z3max_line_length is too small to fit an encoded wordrm   )r   )
r   r  r  r   r   r  r   r  r  r  )	to_encoder  r  r  re   r   r  leading_wsptrailing_wspnew_last_ew	encode_as
chrome_lenremaining_space
text_spaceencoded_wordto_encode_wordexcesss                    r   r  r    si   	 1U2Ywx09<=?	"Ihw'b		1	  labM	b	Nf$LL6u=>b	[ 	L} }crN	$+O#eBi.K"j0gI Y!#JQ6!%%AC 	C  3uRy>1$z1C8J4KK
?LL u:>c%)n16H::&8)LL"I%I!#";J/zz.)D\"_4qj ,CR0N::niHL&8F qj 	b	\!	c.123	LLeBi.K? @ 
"II,;6$6r   c           	         	 | j                   D ]  \  }}|d   j                         j                  d      s|dxx   dz  cc<   |}d}	 |j                  |       d}|r6t        j                  j                  |d	|
      }	dj                  |||	      }
ndj                  |t        |            }
t        |d         t        |
      z   dz   |k  r|d   dz   |
z   |d<   t        |
      dz   |k  r|j                  d|
z          d}|dz   }|st        |      t        t        |            z   dz   t        |      z   }||dz   k  rd}||z
  dz
  x}}	 |d | }t        j                  j                  |d	|
      }	t        |	      |k  rn|dz  }<|j                  dj                  ||||	             d	}|dz  }||d  }|r|dxx   dz  cc<   |r y # t        $ r" d}t        j                  |      rd}d}nd}Y w xY w)Nr   rI  strictFTr  rk  r  r'   )safer   z
{}*={}''{}r  r   rm   r   r   z''r#  N   z {}*{}*={}{})rz  r%  r^  r  rv  r   rw  rq  rr  r   r7   r   r   r   r   )rH   r  r  rl  r{  r   r   error_handlerencoding_requiredencoded_valuer  rb  extra_chromer  
splitpointmaxcharspartials                    r   r  r    sF    {{e Ry!**3/"II 		"LL" % "LL..B} / 6M&&tWmDD>>$U(;<DuRy>CI%)F2b	C$.E"IY]f$LLt$ ~TSW%66:S=NNJa'
 $*Z$7!$;;J, & 2 2"] !3 !<}%1a
  LL..g|]< =LqLG*+&Eb	S 	- I # " 	" $$$U+( 1!	"s   	G'G?>G?)r  )rer  rq  stringr   operatorr   emailr   r  r   r   r)  r  r   r  r  r*  r  	TSPECIALSrp  	ASPECIALSrx  r  r  r  r   r   compileVERBOSE	MULTILINEr  r  r   rj   rv   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.  r0  r8  rB  rH  rL  rW  rZ  ra  rd  rg  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r<  r2  rG   rd   r3  r7   r1   r  r  r  matchr  findallr  rl  rt  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/  r5  r:  r<  r?  rD  rG  rK  rN  rP  rR  rU  rX  r[  r_  rf  ri  rm  rr  rv  rz  r~  r  r  r  r  r  r  r  r  r  r  rQ   r  r  rn   r   r   <module>r     s5  CJ 
 
    '   
%jCHn sN	CH$U#E
"c#h.	_
E
"	S(3s83 	t
@
 "**  ZZ",, @, @,FD) D I  Y 9 " 9 I 
) #9 #6	-| 	-! 4C) C&%i %2?) ?%	 %"$I $*"y "6	 DDy D!i !6;Y ;.Y .i ) 
I 
y B9 -!& -!`!	 !HI  ) 	 8%y %
#	 #i I S.Y S.ly * 1 i ) 
*I * &y &Y (+s (+V H - <f-- < Cc#34#  % $S*BC . 

:,,RWWS\:;AA"

9#3#3BIIbggi !$# $$)E "

#56>> #I$4$4BIIbggj!"%$ %%*U 'RZZ	(8(8BIIbggn%&)( )). &0bjj1A1ABIIbgg-./21 '227% $;J<
/bAF" ))V2 $6 &2 D$L%N2!h(%!N$L ) V,\"H*"$6r#J<:4n&,BJ8BH$$&.&.$,<,KZ2h7 6p<^Y7vJ7XI!r   