ó
	Q˜[c           @` sÀ  d  Z  d d l m Z d d l m Z d d l m Z d d l m Z d d l m Z d d d	 d
 g Z d d l	 Z	 d d l
 Z
 d Z d Z d Z d d d d d d d d d d d d d d d d d d d  d! d" d# d$ d% g Z d& d' d( d) d* d+ d, g Z i d d- 6d d. 6d d/ 6d d0 6d1 d2 6d3 d4 6d5 d6 6d1 d7 6d8 d9 6d5 d: 6d; d< 6d8 d= 6d> d? 6d; d@ 6Z dA „  Z dB „  Z dC „  Z dD „  Z dE „  Z dF e f dG „  ƒ  YZ dH e f dI „  ƒ  YZ d S(J   uc   Email address parsing code.

Lifted directly from rfc822.py.  This should eventually be rewritten.
i    (   t   unicode_literals(   t   print_function(   t   division(   t   absolute_import(   t   intu	   mktime_tzu	   parsedateu   parsedate_tzu   quoteNu    u    u   , u   janu   febu   maru   apru   mayu   junu   julu   augu   sepu   octu   novu   decu   januaryu   februaryu   marchu   aprilu   juneu   julyu   augustu	   septemberu   octoberu   novemberu   decemberu   monu   tueu   wedu   thuu   friu   satu   sunu   UTu   UTCu   GMTu   Zipþÿÿu   ASTiÔþÿÿu   ADTiþÿÿu   ESTu   EDTi¨ýÿÿu   CSTu   CDTiDýÿÿu   MSTu   MDTiàüÿÿu   PSTu   PDTc         C` s=   t  |  ƒ } | s d S| d d k r3 d | d <n  t | ƒ S(   uQ   Convert a date string to a time tuple.

    Accounts for military timezones.
    Ni	   i    (   t   _parsedate_tzt   Nonet   tuple(   t   datat   res(    (    s@   lib/python2.7/site-packages/future/backports/email/_parseaddr.pyt   parsedate_tz3   s    c      
   C` sÓ  |  s
 d S|  j  ƒ  }  |  d j d ƒ s? |  d j ƒ  t k rI |  d =n8 |  d j d ƒ } | d k r |  d | d |  d <n  t |  ƒ d k rÌ |  d j  d ƒ } t | ƒ d k rÌ | |  d }  qÌ n  t |  ƒ d k rL|  d } | j d ƒ } | d	 k r| j d ƒ } n  | d k r<| |  | | g |  d )qL|  j d
 ƒ n  t |  ƒ d k  rbd S|  d  }  |  \ } } } } } | j ƒ  } | t	 k r¿| | j ƒ  } } | t	 k r¿d Sn  t	 j
 | ƒ d } | d k rë| d 8} n  | d	 d k r| d	  } n  | j d ƒ } | d k r3| | } } n  | d	 d k rP| d	  } n  | d j ƒ  sp| | } } n  | d	 d k r| d	  } n  | j  d ƒ } t | ƒ d k rÃ| \ }	 }
 d } n« t | ƒ d k rç| \ }	 }
 } n‡ t | ƒ d k rjd | d k rj| d j  d ƒ } t | ƒ d k rC| \ }	 }
 d } qnt | ƒ d k rn| \ }	 }
 } qnn d Sy@ t | ƒ } t | ƒ } t |	 ƒ }	 t |
 ƒ }
 t | ƒ } Wn t k
 rÂd SX| d k  rõ| d k rè| d 7} qõ| d 7} n  d } | j ƒ  } | t k r t | } nH y t | ƒ } Wn t k
 rCn X| d k rh| j d ƒ rhd } n  | r±| d k  rŠd	 } | } n d } | | d d | d d } n  | | | |	 |
 | d d d	 | g
 S(   u†  Convert date to extended time tuple.

    The last (additional) element is the time zone offset in seconds, except if
    the timezone was specified as -0000.  In that case the last element is
    None.  This indicates a UTC timestamp that explicitly declaims knowledge of
    the source timezone, as opposed to a +0000 timestamp that indicates the
    source timezone really was UTC.

    Ni    u   ,i   i   u   -i   u   +iÿÿÿÿu    i   i   u   :i   u   0u   .id   iD   il  iÐ  i  i<   (   t   splitt   endswitht   lowert	   _daynamest   rfindt   lent   findt   appendR   t   _monthnamest   indext   isdigitR   t
   ValueErrort   uppert
   _timezonest
   startswith(   R   t   it   stufft   st   ddt   mmt   yyt   tmt   tzt   thht   tmmt   tsst   tzoffsett   tzsign(    (    s@   lib/python2.7/site-packages/future/backports/email/_parseaddr.pyR   ?   s¬    
)


	"		
!c         C` s+   t  |  ƒ } t | t ƒ r# | d  S| Sd S(   u&   Convert a time string to a time tuple.i	   N(   R
   t
   isinstanceR   (   R   t   t(    (    s@   lib/python2.7/site-packages/future/backports/email/_parseaddr.pyt	   parsedate´   s    c         C` sD   |  d d k r% t j |  d  d ƒ St j |  ƒ } | |  d Sd S(   uE   Turn a 10-tuple as returned by parsedate_tz() into a POSIX timestamp.i	   i   iÿÿÿÿN(   iÿÿÿÿ(   R   t   timet   mktimet   calendart   timegm(   R   R(   (    (    s@   lib/python2.7/site-packages/future/backports/email/_parseaddr.pyt	   mktime_tz½   s    c         C` s   |  j  d d ƒ j  d d ƒ S(   uø   Prepare string to be used in a quoted string.

    Turns backslash and double quote characters into quoted pairs.  These
    are the only characters that need to be quoted inside a quoted string.
    Does not add the surrounding double quotes.
    u   \u   \\u   "u   \"(   t   replace(   t   str(    (    s@   lib/python2.7/site-packages/future/backports/email/_parseaddr.pyt   quoteÇ   s    t   AddrlistClassc           B` s‰   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 e
 d „ Z d	 „  Z d
 „  Z d „  Z d d „ Z d „  Z RS(   u  Address parser class by Ben Escoto.

    To understand what this class does, it helps to have a copy of RFC 2822 in
    front of you.

    Note: this class interface is deprecated and may be removed in the future.
    Use email.utils.AddressList instead.
    c         C` s   d |  _  d |  _ d |  _ d |  _ |  j |  j |  _ |  j  |  j |  j |  _ |  j j d d ƒ |  _ | |  _ g  |  _	 d S(   uƒ   Initialize a new instance.

        `field' is an unparsed address header field, containing
        one or more addresses.
        u   ()<>@,:;."[]i    u    	u   
u   .u    N(
   t   specialst   post   LWSt   CRt   FWSt   atomendsR/   t
   phraseendst   fieldt   commentlist(   t   selfR:   (    (    s@   lib/python2.7/site-packages/future/backports/email/_parseaddr.pyt   __init__Û   s    					c         C` sÁ   g  } x« |  j  t |  j ƒ k  r³ |  j |  j  |  j d k r€ |  j |  j  d k rn | j |  j |  j  ƒ n  |  j  d 7_  q	 |  j |  j  d k r¯ |  j j |  j ƒ  ƒ q	 Pq	 Wt j | ƒ S(   u&   Skip white space and extract comments.u   
i   u   ((	   R4   R   R:   R5   R   R;   t
   getcommentt   EMPTYSTRINGt   join(   R<   t   wslist(    (    s@   lib/python2.7/site-packages/future/backports/email/_parseaddr.pyt   gotonextî   s    c         C` sU   g  } xH |  j  t |  j ƒ k  rP |  j ƒ  } | r@ | | 7} q	 | j d ƒ q	 W| S(   uV   Parse all addresses.

        Returns a list containing all of the addresses.
        u    (   u    u    (   R4   R   R:   t
   getaddressR   (   R<   t   resultt   ad(    (    s@   lib/python2.7/site-packages/future/backports/email/_parseaddr.pyt   getaddrlistü   s    c         C` sž  g  |  _  |  j ƒ  |  j } |  j  } |  j ƒ  } |  j ƒ  g  } |  j t |  j ƒ k r„ | rPt j |  j  ƒ | d f g } qPnÌ|  j |  j d k rÖ | |  _ | |  _  |  j ƒ  } t j |  j  ƒ | f g } nz|  j |  j d k r„g  } t |  j ƒ } |  j d 7_ x=|  j t |  j ƒ k  r€|  j ƒ  |  j | k  rm|  j |  j d k rm|  j d 7_ Pn  | |  j	 ƒ  } qWnÌ |  j |  j d k rý|  j
 ƒ  } |  j  rât j | ƒ d d j |  j  ƒ d	 | f g } qPt j | ƒ | f g } nS | r%t j |  j  ƒ | d f g } n+ |  j |  j |  j k rP|  j d 7_ n  |  j ƒ  |  j t |  j ƒ k  rš|  j |  j d
 k rš|  j d 7_ n  | S(   u   Parse the next address.i    u   .@u   :i   u   ;u   <u    (u    u   )u   ,(   R;   RB   R4   t   getphraselistR   R:   t   SPACER@   t   getaddrspecRC   t   getrouteaddrR3   (   R<   t   oldpost   oldclt   plistt
   returnlistt   addrspect   fieldlent	   routeaddr(    (    s@   lib/python2.7/site-packages/future/backports/email/_parseaddr.pyRC   
  sL    	
		
%		
%	3"
.c         C` s   |  j  |  j d k r d St } |  j d 7_ |  j ƒ  d } xÚ |  j t |  j  ƒ k  r| rs |  j ƒ  t } n› |  j  |  j d k rœ |  j d 7_ Pnr |  j  |  j d k rÊ |  j d 7_ t } nD |  j  |  j d k rò |  j d 7_ n |  j ƒ  } |  j d 7_ P|  j ƒ  qB W| S(   u   Parse a route address (Return-path value).

        This method just skips all the route stuff and returns the addrspec.
        u   <Ni   u    u   >u   @u   :(   R:   R4   t   FalseRB   R   t	   getdomaint   TrueRI   (   R<   t   expectroutet   adlist(    (    s@   lib/python2.7/site-packages/future/backports/email/_parseaddr.pyRJ   E  s.    

		c         C` s¾  g  } |  j  ƒ  x3|  j t |  j ƒ k  rEt } |  j |  j d k r | rk | d j ƒ  rk | j ƒ  n  | j d ƒ |  j d 7_ t } nŠ |  j |  j d k rÆ | j d t	 |  j
 ƒ  ƒ ƒ nT |  j |  j |  j k r| r| d j ƒ  r| j ƒ  n  Pn | j |  j ƒ  ƒ |  j  ƒ  } | r | r | j | ƒ q q W|  j t |  j ƒ k st|  j |  j d k rt j | ƒ S| j d ƒ |  j d 7_ |  j  ƒ  t j | ƒ |  j ƒ  S(   u   Parse an RFC 2822 addr-spec.u   .iÿÿÿÿi   u   "u   "%s"u   @(   RB   R4   R   R:   RT   t   stript   popR   RR   R1   t   getquoteR8   t   getatomR?   R@   RS   (   R<   t   aslistt   preserve_wst   ws(    (    s@   lib/python2.7/site-packages/future/backports/email/_parseaddr.pyRI   e  s4    
	 .
c         C` s  g  } x|  j  t |  j ƒ k  r|  j |  j  |  j k rL |  j  d 7_  q	 |  j |  j  d k r{ |  j j |  j ƒ  ƒ q	 |  j |  j  d k r§ | j |  j ƒ  ƒ q	 |  j |  j  d k rÜ |  j  d 7_  | j d ƒ q	 |  j |  j  |  j k rù Pq	 | j |  j	 ƒ  ƒ q	 Wt
 j | ƒ S(   u-   Get the complete domain name from an address.i   u   (u   [u   .(   R4   R   R:   R5   R;   R   R>   t   getdomainliteralR8   RZ   R?   R@   (   R<   t   sdlist(    (    s@   lib/python2.7/site-packages/future/backports/email/_parseaddr.pyRS   †  s    c         C` s-  |  j  |  j | k r d Sd g } t } |  j d 7_ xå |  j t |  j  ƒ k  r| ry | j |  j  |  j ƒ t } n” |  j  |  j | k r¢ |  j d 7_ Pnk | r× |  j  |  j d k r× | j |  j ƒ  ƒ q; n6 |  j  |  j d k rö t } n | j |  j  |  j ƒ |  j d 7_ q; Wt j | ƒ S(   uæ  Parse a header fragment delimited by special characters.

        `beginchar' is the start character for the fragment.
        If self is not looking at an instance of `beginchar' then
        getdelimited returns the empty string.

        `endchars' is a sequence of allowable end-delimiting characters.
        Parsing stops when one of these is encountered.

        If `allowcomments' is non-zero, embedded RFC 2822 comments are allowed
        within the parsed fragment.
        u    i   u   (u   \(	   R:   R4   RR   R   R   R>   RT   R?   R@   (   R<   t	   beginchart   endcharst   allowcommentst   slistR1   (    (    s@   lib/python2.7/site-packages/future/backports/email/_parseaddr.pyt   getdelimited™  s(    			c         C` s   |  j  d d t ƒ S(   u1   Get a quote-delimited fragment from self's field.u   "u   "(   Rd   RR   (   R<   (    (    s@   lib/python2.7/site-packages/future/backports/email/_parseaddr.pyRY   ¾  s    c         C` s   |  j  d d t ƒ S(   u7   Get a parenthesis-delimited fragment from self's field.u   (u   )(   Rd   RT   (   R<   (    (    s@   lib/python2.7/site-packages/future/backports/email/_parseaddr.pyR>   Â  s    c         C` s   d |  j  d d t ƒ S(   u!   Parse an RFC 2822 domain-literal.u   [%s]u   [u   ](   Rd   RR   (   R<   (    (    s@   lib/python2.7/site-packages/future/backports/email/_parseaddr.pyR^   Æ  s    c         C` s   d g } | d k r! |  j } n  x\ |  j t |  j ƒ k  r |  j |  j | k rV Pn | j |  j |  j ƒ |  j d 7_ q$ Wt j | ƒ S(   u  Parse an RFC 2822 atom.

        Optional atomends specifies a different set of end token delimiters
        (the default is to use self.atomends).  This is used e.g. in
        getphraselist() since phrase endings must not include the `.' (which
        is legal in phrases).u    i   N(   R   R8   R4   R   R:   R   R?   R@   (   R<   R8   t   atomlist(    (    s@   lib/python2.7/site-packages/future/backports/email/_parseaddr.pyRZ   Ê  s    	c         C` så   g  } xØ |  j  t |  j ƒ k  rà |  j |  j  |  j k rL |  j  d 7_  q	 |  j |  j  d k rx | j |  j ƒ  ƒ q	 |  j |  j  d k r§ |  j j |  j ƒ  ƒ q	 |  j |  j  |  j k rÄ Pq	 | j |  j	 |  j ƒ ƒ q	 W| S(   uý   Parse a sequence of RFC 2822 phrases.

        A phrase is a sequence of words, which are in turn either RFC 2822
        atoms or quoted-strings.  Phrases are canonicalized by squeezing all
        runs of continuous whitespace into one space.
        i   u   "u   ((
   R4   R   R:   R7   R   RY   R;   R>   R9   RZ   (   R<   RM   (    (    s@   lib/python2.7/site-packages/future/backports/email/_parseaddr.pyRG   Þ  s    N(   t   __name__t
   __module__t   __doc__R=   RB   RF   RC   RJ   RI   RS   RT   Rd   RY   R>   R^   R   RZ   RG   (    (    (    s@   lib/python2.7/site-packages/future/backports/email/_parseaddr.pyR2   Ñ   s   				;	 	!	%			t   AddressListc           B` sM   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 RS(   u@   An AddressList encapsulates a list of parsed RFC 2822 addresses.c         C` s5   t  j |  | ƒ | r( |  j ƒ  |  _ n	 g  |  _ d  S(   N(   R2   R=   RF   t   addresslist(   R<   R:   (    (    s@   lib/python2.7/site-packages/future/backports/email/_parseaddr.pyR=   ÷  s    c         C` s   t  |  j ƒ S(   N(   R   Rj   (   R<   (    (    s@   lib/python2.7/site-packages/future/backports/email/_parseaddr.pyt   __len__þ  s    c         C` sS   t  d  ƒ } |  j | _ x3 | j D]( } | |  j k r# | j j | ƒ q# q# W| S(   N(   Ri   R   Rj   R   (   R<   t   othert   newaddrt   x(    (    s@   lib/python2.7/site-packages/future/backports/email/_parseaddr.pyt   __add__  s    c         C` s:   x3 | j  D]( } | |  j  k r
 |  j  j | ƒ q
 q
 W|  S(   N(   Rj   R   (   R<   Rl   Rn   (    (    s@   lib/python2.7/site-packages/future/backports/email/_parseaddr.pyt   __iadd__
  s    c         C` sF   t  d  ƒ } x3 |  j D]( } | | j k r | j j | ƒ q q W| S(   N(   Ri   R   Rj   R   (   R<   Rl   Rm   Rn   (    (    s@   lib/python2.7/site-packages/future/backports/email/_parseaddr.pyt   __sub__  s
    c         C` s:   x3 | j  D]( } | |  j  k r
 |  j  j | ƒ q
 q
 W|  S(   N(   Rj   t   remove(   R<   Rl   Rn   (    (    s@   lib/python2.7/site-packages/future/backports/email/_parseaddr.pyt   __isub__  s    c         C` s   |  j  | S(   N(   Rj   (   R<   R   (    (    s@   lib/python2.7/site-packages/future/backports/email/_parseaddr.pyt   __getitem__   s    (
   Rf   Rg   Rh   R=   Rk   Ro   Rp   Rq   Rs   Rt   (    (    (    s@   lib/python2.7/site-packages/future/backports/email/_parseaddr.pyRi   õ  s   							(   Rh   t
   __future__R    R   R   R   t   future.builtinsR   t   __all__R*   R,   RH   R?   t
   COMMASPACER   R   R   R
   R   R)   R.   R1   t   objectR2   Ri   (    (    (    s@   lib/python2.7/site-packages/future/backports/email/_parseaddr.pyt   <module>   s@   			u			
	
ÿ %