
    d3                    v   d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Zddl
ZddlZddlZddlmZ 	 ddlZn# e$ r dZY nw xY wg dZej                            d          Z G d d          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j        j                  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%          Z$ G d& d'e$          Z%d9d)Z&d* Z'd+ Z(d, Z)d- Z*d. Z+ G d/ d0e,          Z- G d1 d2e-          Z. G d3 d4e-          Z/ G d5 d6e-          Z0 G d7 d8e-          Z1dS ):zDRead/write support for Maildir, mbox, MH, Babyl, and MMDF mailboxes.    N)GenericAlias)MailboxMaildirmboxMHBabylMMDFMessageMaildirMessagemboxMessage	MHMessageBabylMessageMMDFMessageErrorNoSuchMailboxErrorNotEmptyErrorExternalClashErrorFormatErrorasciic                       e Zd ZdZd$dZd Zd Zd Zd Zd	 Z	d%d
Z
d Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd%dZd Zd%dZd Zd Zd Zd  Z d! Z!d"Z"d&d#Z# e$e%          Z&dS )'r   z*A group of messages in a particular place.NTc                     t           j                            t           j                            |                    | _        || _        dS )zInitialize a Mailbox instance.N)ospathabspath
expanduser_path_factoryselfr   factorycreates         /croot/python-split_1694437901252/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_plac/lib/python3.11/mailbox.py__init__zMailbox.__init__%   s2    W__RW%7%7%=%=>>
    c                      t          d          )$Add message and return assigned key.&Method must be implemented by subclassNotImplementedErrorr   messages     r"   addzMailbox.add*       !"JKKKr$   c                      t          d          )=Remove the keyed message; raise KeyError if it doesn't exist.r'   r(   r   keys     r"   removezMailbox.remove.   r-   r$   c                 0    |                      |           d S N)r2   r0   s     r"   __delitem__zMailbox.__delitem__2   s    Cr$   c                 T    	 |                      |           dS # t          $ r Y dS w xY wz'If the keyed message exists, remove it.N)r2   KeyErrorr0   s     r"   discardzMailbox.discard5   sA    	KK 	 	 	DD	s    
''c                      t          d          )>Replace the keyed message; raise KeyError if it doesn't exist.r'   r(   r   r1   r+   s      r"   __setitem__zMailbox.__setitem__<   r-   r$   c                 R    	 |                      |          S # t          $ r |cY S w xY w)z9Return the keyed message, or default if it doesn't exist.)__getitem__r8   )r   r1   defaults      r"   getzMailbox.get@   s?    	##C((( 	 	 	NNN	s    &&c                     | j         s|                     |          S t          j        |                     |                    5 }|                      |          cddd           S # 1 swxY w Y   dS )z=Return the keyed message; raise KeyError if it doesn't exist.N)r   get_message
contextlibclosingget_file)r   r1   files      r"   r?   zMailbox.__getitem__G   s    } 	+##C(((#DMM#$6$677 +4}}T**+ + + + + + + + + + + + + + + + + +s   A&&A*-A*c                      t          d          )4Return a Message representation or raise a KeyError.r'   r(   r0   s     r"   rC   zMailbox.get_messageO   r-   r$   c                 t    t          j        |                     |                                                    S )zReturn a string representation or raise a KeyError.

        Uses email.message.Message to create a 7bit clean string
        representation of the message.emailmessage_from_bytes	get_bytes	as_stringr0   s     r"   
get_stringzMailbox.get_stringS   s-    
 's(;(;<<FFHHHr$   c                      t          d          )z8Return a byte string representation or raise a KeyError.r'   r(   r0   s     r"   rN   zMailbox.get_bytesZ   r-   r$   c                      t          d          )6Return a file-like representation or raise a KeyError.r'   r(   r0   s     r"   rF   zMailbox.get_file^   r-   r$   c                      t          d          )Return an iterator over keys.r'   r(   r   s    r"   iterkeyszMailbox.iterkeysb   r-   r$   c                 D    t          |                                           S )zReturn a list of keys.)listrW   rV   s    r"   keyszMailbox.keysf   s    DMMOO$$$r$   c              #   t   K   |                                  D ] }	 | |         }n# t          $ r Y w xY w|V  !dS )z%Return an iterator over all messages.NrW   r8   r   r1   values      r"   
itervalueszMailbox.itervaluesj   sb      ==?? 	 	CS	   KKKK	 	   #
00c                 *    |                                  S r4   )r_   rV   s    r"   __iter__zMailbox.__iter__s   s       r$   c                 D    t          |                                           S )z,Return a list of messages. Memory intensive.)rY   r_   rV   s    r"   valueszMailbox.valuesv   s    DOO%%&&&r$   c              #   x   K   |                                  D ]"}	 | |         }n# t          $ r Y w xY w||fV  #dS )z.Return an iterator over (key, message) tuples.Nr\   r]   s      r"   	iteritemszMailbox.iteritemsz   sj      ==?? 	 	CS	   ,	 	r`   c                 D    t          |                                           S )z9Return a list of (key, message) tuples. Memory intensive.)rY   rf   rV   s    r"   itemszMailbox.items   s    DNN$$%%%r$   c                      t          d          )9Return True if the keyed message exists, False otherwise.r'   r(   r0   s     r"   __contains__zMailbox.__contains__   r-   r$   c                      t          d          )*Return a count of messages in the mailbox.r'   r(   rV   s    r"   __len__zMailbox.__len__   r-   r$   c                 ^    |                                  D ]}|                     |           dS )zDelete all messages.N)rZ   r9   r0   s     r"   clearzMailbox.clear   s8    99;; 	 	CLL	 	r$   c                 h    	 | |         }n# t           $ r |cY S w xY w|                     |           |S )z3Delete the keyed message and return it, or default.)r8   r9   )r   r1   r@   results       r"   popzMailbox.pop   sM    	#YFF 	 	 	NNN	Ss    c                 ~    |                                  D ]}||                     |          fc S t          d          )z6Delete an arbitrary (key, message) pair and return it.zNo messages in mailbox)rW   rs   r8   r0   s     r"   popitemzMailbox.popitem   sC    ==?? 	5 	5C#''''3444r$   c                    t          |d          r|                                }n't          |d          r|                                }n|}d}|D ]\  }}	 || |<   # t          $ r d}Y w xY w|rt          d          dS )z4Change the messages that correspond to certain keys.rf   rh   FTzNo message with key(s)N)hasattrrf   rh   r8   )r   argsourcebad_keyr1   r+   s         r"   updatezMailbox.update   s    3$$ 	]]__FFS'"" 	YY[[FFF" 	 	LC#S		    	53444	5 	5s   AA,+A,c                      t          d          )&Write any pending changes to the disk.r'   r(   rV   s    r"   flushzMailbox.flush   r-   r$   c                      t          d          )Lock the mailbox.r'   r(   rV   s    r"   lockzMailbox.lock   r-   r$   c                      t          d          )#Unlock the mailbox if it is locked.r'   r(   rV   s    r"   unlockzMailbox.unlock   r-   r$   c                      t          d          )Flush and close the mailbox.r'   r(   rV   s    r"   closezMailbox.close   r-   r$   c                 h    	 |                     d          S # t          $ r t          d          w xY w)Nr   z?String input must be ASCII-only; use bytes or a Message instead)encodeUnicodeError
ValueErrorr*   s     r"   _string_to_byteszMailbox._string_to_bytes   sK    	2>>'*** 	2 	2 	2 1 2 2 2	2s    1Fc                    t          |t          j        j                  rt	          j                    }t          j                            ||d          }|                    |           |	                    d           |
                                }|                    dt                    }|                    |           | j        r6|                    t                    s|                    t                     d
S d
S d
S t          |t           t"          t          j        f          rt          |t          j                  r/t'          j        dt*          d           |                                }t          |t                     r|                     |          }|r|                    dd          }|                    dt                    }|                    |           | j        r6|                    t                    s|                    t                     d
S d
S d
S t1          |d          r-t1          |d          r"t'          j        d	t*          d           |j        }d
}	 |                                }|                    d          r|d
d         dz   }n"|                    d          r|d
d         dz   }|snW|r"|                    d          rd|dd
         z   }|                    dt                    }|                    |           |}| j        r8|r8|                    t                    s |                    t                     d
S d
S d
S d
S t9          dt;          |          z            )z%Dump message contents to target file.r      
8Use of StringIO input is deprecated, use BytesIO instead   s   
From s   
>From readbufferDUse of text mode files is deprecated, use a binary mode file insteadNT   
      From s   >From    Invalid message type: %s)
isinstancerL   r+   r
   ioBytesIO	generatorBytesGeneratorflattenseekr   replacelinesepwrite_append_newlineendswithstrbytesStringIOwarningswarnDeprecationWarninggetvaluer   rw   r   readline
startswith	TypeErrortype)	r   r+   targetmangle_from_r   gendatalastlinelines	            r"   _dump_messagezMailbox._dump_message   s    gu}455 1	HZ\\F/00qIICKK   KKNNN;;==D<<w//DLL# &DMM',B,B &W%%%%%& & & & #ubk!:;; &	H'2;// - *+=qB B B!**,,'3'' 9//88 C!//*kBBooeW55GLL!!!# &G,<,<W,E,E &W%%%%%& & & & Wf%% 	Hw)) ) 56H!M M M!.H ''))==)) -9u,DD]]5)) -9u,D  0DOOH$=$= 0$tABBx/D||E733T"""  # & &9J9J79S9S &W%%%%%& & & & & & 6gFGGGr$   NTr4   F)'__name__
__module____qualname____doc__r#   r,   r2   r5   r9   r=   rA   r?   rC   rP   rN   rF   rW   rZ   r_   rb   rd   rf   rh   rk   rn   rp   rs   ru   r{   r~   r   r   r   r   r   r   classmethodr   __class_getitem__ r$   r"   r   r   "   sH       44       
L L LL L L    L L L   + + +L L LI I IL L LL L LL L L% % %  ! ! !' ' '  & & &L L LL L L  
   5 5 55 5 5 5"L L LL L LL L LL L L2 2 2 O4H 4H 4H 4Hl $L11r$   r   c                       e Zd ZdZdZddZd Zd Zd Zd	 Z	d
 Z
d Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdZd Zd Zd Zd ZdS )r   zA qmail-style Maildir mailbox.:NTc                 r   t                               | |||           t          j                            | j        d          t          j                            | j        d          t          j                            | j        d          d| _        t          j                            | j                  sb|rLt          j        | j        d           | j        	                                D ]}t          j        |d           nt          | j                  i | _        ddd| _        d| _        d| _        d	S )
zInitialize a Maildir instance.tmpnewcur)r   r   r     r   )r   r   g?N)r   r#   r   r   joinr   _pathsexistsmkdirrd   r   _toc_toc_mtimes
_last_read_skewfactor)r   dirnamer    r!   r   s        r"   r#   zMaildir.__init__  s   w8887<<
E227<<
E227<<
E22 
 w~~dj)) 	5 5U+++ K..00 * *DHT5))))* )444	#$Q//r$   c                    |                                  }	 |                     ||           n<# t          $ r/ |                                 t	          j        |j                    w xY wt          |           t          |t                    r>|
                                }| j        |                                z   }|| j        k    rd}nd}d}t          j                            |j                                      | j                  d         }t          j                            | j        |||z             }t          |t                    rPt	          j        |j        t          j                            |j                  |                                f           	 	 t	          j        |j        |           t	          j        |j                   n1# t,          t.          f$ r t	          j        |j        |           Y nw xY wnS# t2          $ rF}t	          j        |j                   |j        t4          j        k    rt9          d|z             d}~ww xY w|S )r&    r   r   z$Name clash with existing message: %sN)_create_tmpr   BaseExceptionr   r   r2   name_sync_closer   r   
get_subdircolonget_infor   basenamesplitr   r   utimegetatimeget_datelinkAttributeErrorPermissionErrorrenameOSErrorerrnoEEXISTr   )r   r+   tmp_filesubdirsuffixuniqdestes           r"   r,   zMaildir.add$  sS   ##%%	w1111 	 	 	NNIhm$$$	 	Hg~.. 	''))FZ'"2"2"4"44F##FFw..44TZ@@Cw||DJv>>g~.. 	LHX]g&&x}55w7G7G7I7IJL L L
	)t,,, 	(-(((( #O4 / / /	(-...../  	 	 	Ihm$$$w%,&&()O+/*0 1 1 1 	 s@   - 9A&!G ;H +H H HH 
IAIIc                     t          j        t           j                            | j        |                     |                               dS r/   N)r   r2   r   r   r   _lookupr0   s     r"   r2   zMaildir.removeN  s6    
	"',,tz4<<+<+<==>>>>>r$   c                 b    	 |                      |           dS # t          t          f$ r Y dS w xY wr7   )r2   r8   FileNotFoundErrorr0   s     r"   r9   zMaildir.discardR  sG    	KK+, 	 	 	DD	s    ..c                    |                      |          }|                     |          }|                      |          }t          |t                    r|}n|}t          j                            |          }| j        |v r)| j        |                    | j                  d         z   }nd}| 	                    |           t          j        
                    | j        |          }	t          j        
                    | j        |||z             }
t          |t                    rFt	          j        |	t          j                            |	          |                                f           t	          j        |	|
           dS )r;   r   r   N)r   r,   r   r   r   r   r   r   r   r9   r   r   r   r   r   r   )r   r1   r+   old_subpathtemp_keytemp_subpathdominant_subpathr   r   tmp_pathnew_paths              r"   r=   zMaildir.__setitem__Z  sS   ll3''88G$$||H--g~.. 	++  +!122:)))Z"2"8"8"D"DR"HHFFFS7<<
L997<<
FC&LAAg~.. 	GHXg&&x00'2B2B2D2DEG G G
 		(H%%%%%r$   c                    |                      |          }t          t          j                            | j        |          d          5 }| j        r|                     |          }nt          |          }ddd           n# 1 swxY w Y   t          j                            |          \  }}|	                    |           | j
        |v r3|                    |                    | j
                  d                    |                    t          j                            t          j                            | j        |                               |S )rI   rbNr   )r   openr   r   r   r   r   r   r   
set_subdirr   set_infoset_dategetmtime)r   r1   subpathfmsgr   r   s          r"   rC   zMaildir.get_messageu  sG   ,,s##"',,tz733T:: 	(a} (mmA&&$Q''		( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(
 w}}W--v:LLDJ//3444RW%%bgll4:w&G&GHHIII
s   	-BB	Bc                    t          t          j                            | j        |                     |                    d          5 }|                                                    t          d          cddd           S # 1 swxY w Y   dS )2Return a bytes representation or raise a KeyError.r   r   N)	r   r   r   r   r   r   r   r   r   r   r1   r  s      r"   rN   zMaildir.get_bytes  s    "',,tz4<<+<+<==tDD 	46688##GU33	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4s   -BBBc                     t          t          j                            | j        |                     |                    d          }t          |          S )rS   r   )r   r   r   r   r   r   
_ProxyFiler  s      r"   rF   zMaildir.get_file  s;    dj$,,s*;*;<<dCC!}}r$   c              #      K   |                                   | j        D ]-}	 |                     |           n# t          $ r Y %w xY w|V  .dS rU   N)_refreshr   r   r8   r0   s     r"   rW   zMaildir.iterkeys  ss      9 	 	CS!!!!   IIII	 	s   7
AAc                 <    |                                   || j        v S rj   )r
  r   r0   s     r"   rk   zMaildir.__contains__  s    dir$   c                 R    |                                   t          | j                  S rm   )r
  lenr   rV   s    r"   rn   zMaildir.__len__  s    49~~r$   c                     dS )"Write any pending changes to disk.Nr   rV   s    r"   r~   zMaildir.flush  s	     	r$   c                     dS )r   Nr   rV   s    r"   r   zMaildir.lock      r$   c                     dS )r   Nr   rV   s    r"   r   zMaildir.unlock  r  r$   c                     dS r   Nr   rV   s    r"   r   zMaildir.close  r  r$   c                 >   g }t          j        | j                  D ]}t          |          dk    rk|d         dk    r_t           j                            t           j                            | j        |                    r|                    |dd                    |S )Return a list of folder names.   r   .N)r   listdirr   r  r   isdirr   appendr   rr   entrys      r"   list_folderszMaildir.list_folders  s    Z
++ 	) 	)E5zzA~~%(c//w}}RW\\$*e<<== #2eABBi(((r$   c                 |    t          t          j                            | j        d|z             | j        d          S )z/Return a Maildir instance for the named folder.r  Fr    r!   )r   r   r   r   r   r   r   folders     r"   
get_folderzMaildir.get_folder  s9    rw||DJf==#}#% % % 	%r$   c                 ~   t           j                            | j        d|z             }t	          || j                  }t           j                            |d          }t           j                            |          s?t          j        t          j        |t           j	        t           j
        z  d                     |S )z>Create a folder and return a Maildir instance representing it.r  r    maildirfolder  )r   r   r   r   r   r   r   r   r   O_CREATO_WRONLY)r   r$  r   rr   maildirfolder_paths        r"   
add_folderzMaildir.add_folder  s    w||DJf55t}555W\\$@@w~~011 	HRW/bk1I    r$   c                    t           j                            | j        d|z             }t          j        t           j                            |d                    t          j        t           j                            |d                    z   D ]3}t          |          dk     s|d         dk    rt          d|z            4t          j        |          D ]f}|dk    r^|dk    rX|dk    rRt           j                            t           j                            ||                    rt          d|d	|          gt          j        |d
          D ]t\  }}}|D ]4}t          j	        t           j                            ||                     5|D ]4}t          j
        t           j                            ||                     5ut          j
        |           dS )-Delete the named folder, which must be empty.r  r   r   r  r   zFolder contains message(s): %sr   zFolder contains subdirectory 'z': F)topdownN)r   r   r   r   r  r  r   r  walkr2   rmdir)r   r$  r   r  rootdirsfiless          r"   remove_folderzMaildir.remove_folder  s   w||DJf55ZT5 9 9::ZT5 9 9::; 	O 	OE5zzA~~qS#$Dv$MNNN "1Z%% 	5 	5E~~%5..Ue^^w}}RW\\$6677 6D#m%+VVUU%4 5 5 5!#u!=!=!= 	4 	4D$ 5 5	"',,tU334444 4 4dE2233334
r$   c                 `   t          j                     }t          j        t          j                            | j        d                    D ]b}t          j                            | j        d|          }|t          j                            |          z
  dk    rt          j        |           cdS )zDelete old files in "tmp".r   i@ N)timer   r  r   r   r   r   r2   )r   nowr  r   s       r"   cleanzMaildir.clean  s    ikkZTZ ? ?@@ 	  	 E7<<
E599DRW%%d+++f44	$	  	 r$   r  c           	      v   t          j                     }t          j                    }d|v r|                    dd          }d|v r|                    dd          }t	          |          dt	          |dz  dz            dt          j                    d	t          j        d
|	}t
          j	        
                    | j        d|          }	 t          j        |           nG# t          $ r: t          xj        dz  c_        	 t          |          cY S # t          $ r Y nw xY wY nw xY wt!          d|z            )z=Create a file in the tmp subdirectory and open and return it./z\057r   z\072z.Mr  g    .APQr  r   z&Name clash prevented file creation: %s)r8  socketgethostnamer   intr   getpidr   _countr   r   r   statr   _create_carefullyFileExistsErrorr   )r   r9  hostnamer   r   s        r"   r   zMaildir._create_tmp  sQ   ikk%''(??''W55H(??''W55H$'HHHHc#'C-.@.@.@.@")++++$+NNNHH>w||DJt44	GDMMMM  	 	 	NNaNN(....."   	 !!I!%"& ' ' 	's6   C" "D&DD&
D D&D  D&%D&c                    t          j                     | j        z
  d| j        z   k    rWd}| j        D ]I}t          j                            | j        |                   }|| j        |         k    rd}|| j        |<   J|sdS i | _        | j        D ]}| j        |         }t	          j	        |          D ]}t          j        
                    ||          }t          j                            |          rB|                    | j                  d         }t          j        
                    ||          | j        |<   t          j                     | _        dS )z!Update table of contents mapping.   FTNr   )r8  r   r   r   r   r   r   r   r   r  r   r  r   r   )r   refreshr   mtimer   r  pr   s           r"   r
  zMaildir._refresh  sE    9;;(1t/?+???G* 1 1((V)<==4+F333"G+0 (( 	& 	> 	>F;v&DD)) > >GLLu--7==## {{4:..q1"$',,vu"="=	$> )++r$   c                 `   	 t           j                            t           j                            | j        | j        |                             r| j        |         S n# t          $ r Y nw xY w|                                  	 | j        |         S # t          $ r t          d|z            dw xY w)z=Use TOC to return subpath for given key, or raise a KeyError.No message with key: %sN)r   r   r   r   r   r   r8   r
  r0   s     r"   r   zMaildir._lookup&  s    	w~~bgll4:ty~FFGG &y~%& 	 	 	D		F9S>! 	F 	F 	F4s:;;E	Fs   AA 
A*)A*B B-c                     t          | d          s|                                 | _        	 	 | t          | j                           S # t          $ r Y dS t
          $ r Y 4w xY w)z0Return the next message in a one-time iteration._onetime_keysTN)rw   rW   rP  nextStopIterationr8   rV   s    r"   rQ  zMaildir.next4  s}    t_-- 	1!%D	D!34455    tt   s   A 
A	AAr   )r   r   r   r   r   r#   r,   r2   r9   r=   rC   rN   rF   rW   rk   rn   r~   r   r   r   r   r%  r-  r6  r:  rC  r   r
  r   rQ  r   r$   r"   r   r     s       ((E   (( ( (T? ? ?  & & &6  4 4 4
  
       
  
          % % %    &      F' ' '0"& "& "&HF F F
 
 
 
 
r$   r   c                   v    e Zd ZdZddZd Zd Zd Zd Zd	 Z	d
 Z
d Zd Zd Zd Zd Zd Zd ZddZd ZdS )_singlefileMailboxzA single-file mailbox.NTc                    t                               | |||           	 t          | j        d          }n# t          $ r}|j        t
          j        k    r,|rt          | j        d          }nJt          | j                  |j        t
          j        t
          j	        fv rt          | j        d          }n Y d}~nd}~ww xY w|| _
        d| _        d| _        d| _        d| _        d| _        d| _        dS )z!Initialize a single-file mailbox.rb+zwb+r   Nr   F)r   r#   r   r   r   r   ENOENTr   EACCESEROFS_filer   	_next_key_pending_pending_sync_locked_file_length)r   r   r    r!   r  r   s         r"   r#   z_singlefileMailbox.__init__D  s    tWf555	TZ''AA 		 		 		w%,&& 9TZ//AA,TZ888U\5;777T**		 
	" s   5 
C A7B;;C c                     |                                   |                     |          | j        | j        <   | xj        dz  c_        d| _        | j        dz
  S )r&   r  T)r   _append_messager   r[  r]  r*   s     r"   r,   z_singlefileMailbox.add[  sR    $($8$8$A$A	$.!! "~!!r$   c                 N    |                      |           | j        |= d| _        dS )r/   TN)r   r   r\  r0   s     r"   r2   z_singlefileMailbox.removee  s(    SIcNr$   c                 x    |                      |           |                     |          | j        |<   d| _        dS )r;   TN)r   ra  r   r\  r<   s      r"   r=   z_singlefileMailbox.__setitem__k  s8    S--g66	#r$   c              #   p   K   |                                   | j                                        E d{V  dS r	  )r   r   rZ   rV   s    r"   rW   z_singlefileMailbox.iterkeysq  s=      9>>###########r$   c                 <    |                                   || j        v S r  )r   r   r0   s     r"   rk   z_singlefileMailbox.__contains__v  s    dir$   c                 R    |                                   t          | j                  S r  )r   r  r   rV   s    r"   rn   z_singlefileMailbox.__len__{  s    49~~r$   c                 N    | j         st          | j                   d| _         dS dS )r   TN)r^  
_lock_filerZ  rV   s    r"   r   z_singlefileMailbox.lock  s1    | 	 tz"""DLLL	  	 r$   c                 N    | j         rt          | j                   d| _         dS dS r   FN)r^  _unlock_filerZ  rV   s    r"   r   z_singlefileMailbox.unlock  s1    < 	!$$$ DLLL	! 	!r$   c           	      J   | j         s$| j        rt          | j                   d| _        dS | j        J | j                            dd           | j                                        }|| j        k    rt          d| j        |fz            t          | j
                  }	 i }|                     |           t          | j                                                  D ]}| j        |         \  }}| j                            |           |                     |           |                                }	 | j                            t!          d|| j                                        z
                      }|sn|                    |           [||                                f||<   |                     |           |                                | _        n3#  |                                 t)          j        |j                    xY wt/          |           | j                                         t)          j        | j
                  j        }	t)          j        |j        |	           	 t)          j        |j        | j
                   nH# t8          $ r; t)          j        | j
                   t)          j        |j        | j
                   Y nw xY wt;          | j
        d          | _        || _        d| _         d| _        | j        rt?          | j        d	           dS dS )
r  FNr   rI  z4Size of mailbox file changed (expected %i, found %i)T   rV  )dotlock) r\  r]  _sync_flushrZ  r   r   tellr_  r   _create_temporaryr   _pre_mailbox_hooksortedrZ   _pre_message_hookr   minr   _post_message_hookr   r   r2   r   r   rD  st_modechmodr   rF  r   r^  rh  )
r   cur_lennew_filenew_tocr1   startstop	new_startr   modes
             r"   r~   z_singlefileMailbox.flush  s   } 	! + DJ'''%*"F
 y$$$ 	
1*//##d'''$ &?&*&7%A&B C C C %TZ00	G""8,,,dinn..// 2 2"int
&&&&&x000$MMOO	+!Z__S15
8I8I1I.K .K L LF! NN6***+ !*8==??;''1111 (D	NNIhm$$$H
wtz""*
%%%	1IhmTZ0000 	1 	1 	1Idj!!!IhmTZ00000	1 $*e,,
	"< 	2tz5111111	2 	2s    "D6G 0H	-J AKKc                     dS ),Called before writing the mailbox to file f.Nr   r   r  s     r"   rr  z$_singlefileMailbox._pre_mailbox_hook  r  r$   c                     dS )-Called before writing each message to file f.Nr   r  s     r"   rt  z$_singlefileMailbox._pre_message_hook  r  r$   c                     dS ,Called after writing each message to file f.Nr   r  s     r"   rv  z%_singlefileMailbox._post_message_hook  r  r$   c                    	 |                                   	 | j        r|                                  | j                                         dS # | j                                         w xY w# 	 | j        r|                                  | j                                         w # | j                                         w xY wxY wr  )r~   r^  r   rZ  r   rV   s    r"   r   z_singlefileMailbox.close  s    	#JJLLL#< "KKMMM
  """""
  """"	#< "KKMMM
  """"
  """"s.   A+ A A(+C -B"C "B==C c                     | j         |                                  |/	 | j         |         S # t          $ r t          d|z            dw xY wdS )z'Return (start, stop) or raise KeyError.NrN  )r   _generate_tocr8   r0   s     r"   r   z_singlefileMailbox._lookup  so    9   ?Jy~% J J J83>??TIJ ?s	   , A
c                 6   | j                             dd           | j                                         }t          | j                  dk    r!| j        s|                     | j                    	 |                     | j                    |                     |          }| 	                    | j                    n)# t          $ r | j                             |            w xY w| j                                          | j                                         | _        |S )z;Append message to mailbox and return (start, stop) offsets.r   rI  )rZ  r   rp  r  r   r\  rr  rt  _install_messagerv  r   truncater~   r_  )r   r+   beforeoffsetss       r"   ra  z"_singlefileMailbox._append_message  s   
1""ty>>Qt}
 ""4:...	""4:...++G44G##DJ//// 	 	 	J'''	 	
 JOO--s   /A	B9 9&Cr   r4   )r   r   r   r   r#   r,   r2   r=   rW   rk   rn   r   r   r~   rr  rt  rv  r   r   ra  r   r$   r"   rT  rT  A  s         ! ! ! !." " "    $ $ $
     
  
     ! ! !>2 >2 >2@      	# 	# 	#J J J J    r$   rT  c                   :    e Zd ZdZdZd Zd
dZd
dZd
dZd Z	d	S )	_mboxMMDFzAn mbox or MMDF mailbox.Tc                    |                      |          \  }}| j                            |           | j                                                            t
          d          }| j                            || j                                        z
            }|                     |                    t
          d                    }|	                    |dd         
                    d                     |S )rI   r$   r   r   Nr   )r   rZ  r   r   r   r   r   rp  _message_factoryset_fromdecode)r   r1   r|  r}  	from_linestringr  s          r"   rC   z_mboxMMDF.get_message	  s    ll3''t
J''))11'3??	
(9(9!9::##FNN7E$B$BCCYqrr]))'22333
r$   Fc                 z    t          j        |                     ||                                        |          S )3Return a string representation or raise a KeyError.)unixfromrK   )r   r1   from_s      r"   rP   z_mboxMMDF.get_string  s8    'NN3&&( ((1	5	(A(A	Br$   c                 :   |                      |          \  }}| j                            |           |s| j                                         | j                            || j                                        z
            }|                    t          d          S )r  r   )r   rZ  r   r   r   rp  r   r   )r   r1   r  r|  r}  r  s         r"   rN   z_mboxMMDF.get_bytes  s    ll3''t
 	"J!!!
(9(9!9::~~gu---r$   c                     |                      |          \  }}| j                            |           |s| j                                         t	          | j        | j                                        |          S )rS   )r   rZ  r   r   _PartialFilerp  )r   r1   r  r|  r}  s        r"   rF   z_mboxMMDF.get_file!  sg    ll3''t
 	"J!!!DJ
(9(94@@@r$   c                    d}t          |t                    r|                     |          }t          |t                    rM|                    d          r8|                    d          }|dk    r|d|         }||dz   d         }n|}d}nt          |t                    r-|                                                    d          }d|z   }nJt          |t          j
        j                  r+|                                }||                    d          }|:dt          j        t          j                                                              z   }| j                                        }| j                            |t&          z              |                     || j        | j                   | j                                        }||fS )	z1Format a message and blindly write to self._file.Nr   r   r   r  r$   r   s   From MAILER-DAEMON )r   r   r   r   r   find_mboxMMDFMessageget_fromr   rL   r+   r
   get_unixfromr8  asctimegmtimerZ  rp  r   r   r   _mangle_from_)r   r+   r  newlineauthorr|  r}  s          r"   r  z_mboxMMDF._install_message)  s   	gs## 	5++G44Ggu%% 	6'*<*<X*F*F 	6ll5))G"}}#HWH-	!'A+,,/#	!122 	6%%''..w77F 6)II!677 	6,,..I$%,,W55	.dkmm1L1L1S1S1U1UUI
!!
W,---7DJ0BCCCz  t}r$   Nr   )
r   r   r   r   r  rC   rP   rN   rF   r  r   r$   r"   r  r    s        ""M  B B B B
. . . .A A A A    r$   r  c                   .    e Zd ZdZdZdZddZd Zd ZdS )r   zA classic mbox mailbox.TNc                 X    t           | _        t                              | |||           dS )zInitialize an mbox mailbox.N)r   r  r  r#   r   s       r"   r#   zmbox.__init__O  *     +4w77777r$   c                 :    |                     t                     dS r  r   r   r  s     r"   rv  zmbox._post_message_hookT  s    	r$   c                 D   g g }}d}| j                             d           	 | j                                         }| j                                         }|                    d          rzt          |          t          |          k     rB|r+|                    |t          t                    z
             n|                    |           |                    |           d}nU|sC|r+|                    |t          t                    z
             n|                    |           n|t          k    rd}nd}t          t          t          ||                              | _        t          | j                  | _        | j                                         | _        dS )0Generate key-to-(start, stop) table of contents.Fr   Tr   N)rZ  r   rp  r   r   r  r  r   dict	enumeratezipr   r[  r_  )r   startsstopslast_was_emptyline_posr   s         r"   r  zmbox._generate_tocX  sx   B
	'z((H:&&((Dx(( 'u::F++% /XG%<====
 X...h'''!& 	'! +LLCLL!89999LL***!%!&/	'0 3vu#5#56677	TY JOO--r$   r   )	r   r   r   r   r  r   r#   rv  r  r   r$   r"   r   r   F  sX        !!M O8 8 8 8
  . . . . .r$   r   c                   ,    e Zd ZdZddZd Zd Zd ZdS )	r	   zAn MMDF mailbox.NTc                 X    t           | _        t                              | |||           dS )zInitialize an MMDF mailbox.N)r   r  r  r#   r   s       r"   r#   zMMDF.__init__}  r  r$   c                 @    |                     dt          z              dS )r     Nr  r  s     r"   rt  zMMDF._pre_message_hook  s     	#g-.....r$   c                 P    |                     t          dz   t          z              dS )r  r  Nr  r  s     r"   rv  zMMDF._post_message_hook  s%    	--788888r$   c                 .   g g }}| j                             d           d}	 |}| j                                         }| j                                         }|                    dt
          z             r|                    |           	 |}| j                                         }| j                                         }|dt
          z   k    r+|                    |t          t
                    z
             n|s|                    |           nn|snt          t          t          ||                              | _        t          | j                  | _        | j                             dd           | j                                         | _        dS )r  r   Tr  rI  N)rZ  r   r   rp  r   r   r  r  r  r  r  r   r[  r_  )r   r  r  next_posr  r   s         r"   r  zMMDF._generate_toc  st   B
	H:&&((Dz((H2W<== h'''	'H:..00D#z00H2W<<<XG%<===! X...	  #	$ 3vu#5#56677	TY
1 JOO--r$   r   )r   r   r   r   r#   rt  rv  r  r   r$   r"   r	   r	   z  s[        8 8 8 8
/ / /9 9 9. . . . .r$   r	   c                       e Zd ZdZddZd Zd Zd Zd Zd	 Z	d
 Z
d Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdS )r   zAn MH mailbox.NTc                    t                               | |||           t          j                            | j                  s|rt          j        | j        d           t          j        t          j        t          j        	                    | j        d          t          j
        t          j        z  t          j        z  d                     nt          | j                  d| _        dS )zInitialize an MH instance.r   .mh_sequencesi  FN)r   r#   r   r   r   r   r   r   r   r   r*  O_EXCLr+  r   r^  r   s       r"   r#   zMH.__init__  s    tWf555w~~dj)) 	5 5U+++dj/!J!J!#bi!7"+!EuN N O O O O )444r$   c                    |                                  }t          |          dk    rd}nt          |          dz   }t          j                            | j        t          |                    }t          |          }d}	 | j	        rt          |           	 	 |                     ||           nJ# t          $ r= | j	        rt          |           t          |           d}t          j        |            w xY wt!          |t"                    r|                     ||           | j	        rt          |           n# | j	        rt          |           w w xY w|st          |           n# |st          |           w w xY w|S )r&   r   r  FT)rZ   r  maxr   r   r   r   r   rE  r^  rh  r   r   rk  r   r2   r   r   _dump_sequences)r   r+   rZ   new_keyr   r  closeds          r"   r,   zMH.add  s   yy{{t99>>GG$ii!mG7<<
CLL99h''	| 1$	&&w2222$   | ($QNNN!FIh''' gy11 ;((':::< $ OOO < $ OOOO$  A  As7   E* B0 /D< 0AC77.D< %E* <EE* *E>c                 P   t           j                            | j        t	          |                    }	 t          |d          }|                                 t          j        |           dS # t          $ r-}|j	        t          j
        k    rt          d|z             d}~ww xY w)r/   rV  rN  N)r   r   r   r   r   r   r   r2   r   r   rW  r8   )r   r1   r   r  r   s        r"   r2   z	MH.remove  s    w||DJC11		T5!!A GGIIIIdOOOOO  	 	 	w%,&&83>???		s   A. .
B%8(B  B%c                    t           j                            | j        t	          |                    }	 t          |d          }n:# t          $ r-}|j        t          j        k    rt          d|z             d}~ww xY w	 | j
        rt          |           	 t          j        t          j        |t           j        t           j        z                       |                     ||           t!          |t"                    r|                     ||           | j
        rt'          |           n# | j
        rt'          |           w w xY wt)          |           dS # t)          |           w xY w)r;   rV  rN  N)r   r   r   r   r   r   r   r   rW  r8   r^  rh  r   r+  O_TRUNCr   r   r   r  rk  r   )r   r1   r+   r   r  r   s         r"   r=   zMH.__setitem__  sU   w||DJC11	T5!!AA 	 	 	w%,&&83>???		
	| 1$r{RZ'?@@AAA""7A...gy11 7((#666< $ OOO < $ OOOO$ NNNNNKNNNNs<   A 
A<(A77A< E A?D- E -EE E+c                    	 | j         rAt          t          j                            | j        t          |                    d          }n@t          t          j                            | j        t          |                    d          }n:# t          $ r-}|j        t          j	        k    rt          d|z             d}~ww xY w|5  | j         rt          |           	 t          |          }| j         rt          |           n# | j         rt          |           w w xY wddd           n# 1 swxY w Y   |                                                                 D ]\  }}||v r|                    |           |S )rI   rV  r   rN  N)r^  r   r   r   r   r   r   r   r   rW  r8   rh  r   rk  get_sequencesrh   add_sequence)r   r1   r  r   r  r   key_lists          r"   rC   zMH.get_message  s   		| Cdj#c((;;UCCdj#c((;;TBB 	 	 	w%,&&83>???		
  	$ 	$| 1$ll< $ OOO < $ OOOO$	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ #002288:: 	' 	'ND(h  &&&
sB   BB 
C(B==CD-D.D-DD--D14D1c                    	 | j         rAt          t          j                            | j        t          |                    d          }n@t          t          j                            | j        t          |                    d          }n:# t          $ r-}|j        t          j	        k    rt          d|z             d}~ww xY w|5  | j         rt          |           	 |                                                    t          d          | j         rt          |           cddd           S # | j         rt          |           w w xY w# 1 swxY w Y   dS )r  rV  r   rN  Nr   )r^  r   r   r   r   r   r   r   r   rW  r8   rh  r   r   r   rk  r   r1   r  r   s       r"   rN   zMH.get_bytes  s   		| Cdj#c((;;UCCdj#c((;;TBB 	 	 	w%,&&83>???		
  	$ 	$| 1$vvxx''77< $ OOO	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ < $ OOOO$	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$sB   BB 
C(B==CE
,D.E
.EE

EEc                    	 t          t          j                            | j        t          |                    d          }n:# t          $ r-}|j        t          j        k    rt          d|z             d}~ww xY wt          |          S )rS   r   rN  N)r   r   r   r   r   r   r   r   rW  r8   r  r  s       r"   rF   zMH.get_file,  s    	RW\\$*c#hh77>>AA 	 	 	w%,&&83>???		
 !}}s   A A 
A:(A55A:c                 |    t          t          d t          j        | j                  D                                 S )rU   c              3   \   K   | ]'}|                                 t          |          V  (d S r4   )isdigitrA  ).0r  s     r"   	<genexpr>zMH.iterkeys.<locals>.<genexpr>9  sH       : :%).:3u:: : : : : : :r$   )iterrs  r   r  r   rV   s    r"   rW   zMH.iterkeys7  sG    F : :2:dj3I3I : : : : : ; ; 	;r$   c                     t           j                            t           j                            | j        t          |                              S r  )r   r   r   r   r   r   r0   s     r"   rk   zMH.__contains__<  s.    w~~bgll4:s3xx@@AAAr$   c                 ^    t          t          |                                                     S r  )r  rY   rW   rV   s    r"   rn   z
MH.__len__@  s     4(()))r$   c                     | j         sUt          t          j                            | j        d          d          | _        t          | j                   d| _         dS dS )r   r  rV  TN)r^  r   r   r   r   r   rZ  rh  rV   s    r"   r   zMH.lockD  sT    | 	 bgll4:GGOODJtz"""DLLL	  	 r$   c                 z    | j         r3t          | j                   t          | j                   | `d| _         dS dS rj  )r^  rk  rZ  r   rV   s    r"   r   z	MH.unlockK  sF    < 	!$$$
###
 DLLL		! 	!r$   c                     dS )r}   Nr   rV   s    r"   r~   zMH.flushS  r  r$   c                 @    | j         r|                                  dS dS r  )r^  r   rV   s    r"   r   zMH.closeW  s'    < 	KKMMMMM	 	r$   c                     g }t          j        | j                  D ]Y}t           j                            t           j                            | j        |                    r|                    |           Z|S )r  )r   r  r   r   r  r   r  r  s      r"   r   zMH.list_folders\  sb    Z
++ 	% 	%Ew}}RW\\$*e<<== %e$$$r$   c                 v    t          t          j                            | j        |          | j        d          S )z+Return an MH instance for the named folder.Fr"  r   r   r   r   r   r   r#  s     r"   r%  zMH.get_folderd  s4    "',,tz622-7 7 7 	7r$   c                 t    t          t          j                            | j        |          | j                  S )z:Create a folder and return an MH instance representing it.r'  r  r#  s     r"   r-  zMH.add_folderi  s2    "',,tz622-) ) ) 	)r$   c                 P   t           j                            | j        |          }t          j        |          }|dgk    r3t          j        t           j                            |d                     n|g k    rnt          d| j        z            t          j        |           dS )r/  r  zFolder not empty: %sN)r   r   r   r   r  r2   r   r2  )r   r$  r   entriess       r"   r6  zMH.remove_foldern  s    w||DJ//*T""'''Ibgll499::::]] 6 CDDD
r$   c           
      H  
 i }t          t          j                            | j        d          dd          5 }t          |                                           
|D ]+}	 |                    d          \  }}t                      }|                                D ]}|                                r#|	                    t          |                     9d |                    d          D             \  }}	|                    t          ||	dz                        
fd	t          |          D             ||<   t          ||                   d
k    r||= # t          $ r% t!          d|                                z            w xY w	 ddd           n# 1 swxY w Y   |S )z=Return a name-to-key-list dictionary to define each sequence.r  rASCIIencodingr   c              3   4   K   | ]}t          |          V  d S r4   )rA  )r  xs     r"   r  z#MH.get_sequences.<locals>.<genexpr>  s(      *K*Ka3q66*K*K*K*K*K*Kr$   -r  c                     g | ]}|v |	S r   r   )r  r1   all_keyss     r"   
<listcomp>z$MH.get_sequences.<locals>.<listcomp>  s)     %= %= %=S,/8OO &),;OOr$   r   z"Invalid sequence specification: %sN)r   r   r   r   r   setrZ   r   r  r,   rA  r{   rangers  r  r   r   rstrip)r   resultsr  r   r   contentsrZ   specr|  r}  r  s             @r"   r  zMH.get_sequencesz  s   "',,tz?;;S7SSS 	5WX499;;''H 5 55%)ZZ__ND(55D ( 0 0 @ @<<>> @ HHSYY////*K*K4::c??*K*K*KKE4 KKeTAX(>(>????%= %= %= %=F4LL %= %= %=GDM74=))Q..#DM! 5 5 5%&J&*kkmm'4 5 5 555	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5& s*   'F!C6EF/FFFFc                 D   t          t          j                            | j        d          dd          }	 t          j        t          j         |j        t          j        t          j        z                       |	                                D ]\  }}t          |          dk    r|                    |dz              d}d}t          t          |                    D ]^}|d	z
  |k    r|sd
}|                    d           n7|rd}|                    |d|           n|                    d|z             |}_|r&|                    t          |          dz              |                    d           	 t          |           dS # t          |           w xY w)z:Set sequences using the given name-to-key-list dictionary.r  zr+r  r  r   r   NFr  Tr   z %s
)r   r   r   r   r   r   r   r+  r  rh   r  r   rs  r  r   r   )r   	sequencesr  r   rZ   prev
completingr1   s           r"   set_sequenceszMH.set_sequences  s   dj/::D7SSS	HRWQVR[2:%=>>???'oo// " "
dt99>>s
###"
!#d)),, 
 
CQw$) ))-JGGCLLL# -%*
444 56666,,,DD "GGCII,----GGDMMMM)", NNNNNKNNNNs   EF Fc                 8   |                                  }d}g }|                                 D ]y}|dz
  |k    rg|                    ||dz   f           	 t          j        t          j                            | j        t          |                    t          j                            | j        t          |dz                                  t          j	        t          j                            | j        t          |                               n# t          t          f$ r{ t          j        t          j                            | j        t          |                    t          j                            | j        t          |dz                                  Y nw xY w|dz  }{|dz   | _        t          |          dk    rdS |                                D ])\  }}|D ]!\  }}||v r|||                    |          <   "*|                     |           dS )z?Re-name messages to eliminate numbering gaps. Invalidates keys.r   r  N)r  rW   r  r   r   r   r   r   r   unlinkr   r   r   r[  r  rh   indexr  )	r   r  r  changesr1   r   r  oldr   s	            r"   packzMH.pack  s   &&((	==?? 	 	CQw$TAX///BGBGLLSXX>>GLLS]]CCE E E Ibgll4:s3xx@@AAAA	 '8 G G GIbgll4:s3xx@@ gll4:s4!8}}EEG G G G GG
 AIDDw<<1F'oo// 	8 	8ND(# 8 8S(??47HX^^C0018 	9%%%%%s   A8DB	FFc                 :   |                                 }|                                  }|                                D ]9\  }}||v r|                    |           ||v r||                    |          = :|D ]}||vr|g||<   |                     |           dS )z;Inspect a new MHMessage and update sequences appropriately.N)r  rh   r  r  r  )r   r+   r1   pending_sequencesall_sequencesr   r  sequences           r"   r  zMH._dump_sequences  s    #1133**,,+1133 	2 	2ND(((($$$$X^^C001) 	0 	0H},,+.%h'=)))))r$   r   )r   r   r   r   r#   r,   r2   r=   rC   rN   rF   rW   rk   rn   r   r   r~   r   r   r%  r-  r6  r  r  r   r  r   r$   r"   r   r     sm       
 
 
 
     D    0  2$ $ $*	 	 	; ; ;
B B B* * *     ! ! !    
  7 7 7
) ) )

 
 
  0  :& & &4* * * * *r$   r   c                   |    e Zd ZdZ eh d          ZddZd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zd Zd Zd ZdS )r   zAn Rmail-style Babyl mailbox.>   filededitedresentunseendeletedanswered	forwardedNTc                 N    t                               | |||           i | _        dS )zInitialize a Babyl mailbox.N)rT  r#   _labelsr   s       r"   r#   zBabyl.__init__  s'    ##D$@@@r$   c                     t                               | |          }t          |t                    r|                                | j        |<   |S )r&   )rT  r,   r   r   
get_labelsr  )r   r+   r1   s      r"   r,   z	Babyl.add  sF     $$T733g|,, 	5 ' 2 2 4 4DL
r$   c                 b    t                               | |           || j        v r
| j        |= dS dS r   )rT  r2   r  r0   s     r"   r2   zBabyl.remove  s=    !!$,,,$,S!!! r$   c                     t                               | ||           t          |t                    r|                                | j        |<   dS dS )r;   N)rT  r=   r   r   r  r  r<   s      r"   r=   zBabyl.__setitem__  sT    &&tS':::g|,, 	5 ' 2 2 4 4DL	5 	5r$   c                    |                      |          \  }}| j                            |           | j                                         t	          j                    }	 | j                                        }|dt          z   k    s|sn/|                    |                    t          d                     Yt	          j                    }	 | j                                        }|t          k    s|sn/|                    |                    t          d                     V|| j        	                                z
  }|dk    sJ | j        
                    |          }|                    t          d          }t          |                                |z             }	|	                    |                                           || j        v r |	                    | j        |                    |	S )rI   T   *** EOOH ***r   r   )r   rZ  r   r   r   r   r   r   r   rp  r   r   r   set_visibler  
set_labels)
r   r1   r|  r}  original_headersr   visible_headersnbodyr  s
             r"   rC   zBabyl.get_message  s   ll3''t

:<<	A:&&((D0000""4<<#?#?@@@		A
 *,,	@:&&((Dwd!!$,,w">">???		@ 4:??$$$Avvvvzq!!||GU+++4466=>>0022333$,NN4<,---
r$   c                    |                      |          \  }}| j                            |           | j                                         t	          j                    }	 | j                                        }|dt          z   k    s|sn/|                    |                    t          d                     Y	 | j                                        }|t          k    s|sn(|	                                }|| j        
                                z
  }|dk    sJ | j                            |          }|                    t          d          }||z   S )r  Tr  r   r   )r   rZ  r   r   r   r   r   r   r   r   rp  r   )	r   r1   r|  r}  r  r   headersr  r   s	            r"   rN   zBabyl.get_bytes  s7   ll3''t

:<<	A:&&((D0000""4<<#?#?@@@		A
	:&&((Dwd	 #++--4:??$$$Avvvvzq!!||GU++~r$   c                     t          j        |                     |                              dt                              S )rS   r   )r   r   rN   r   r   r0   s     r"   rF   zBabyl.get_file(  s.    z$..--55eWEEFFFr$   c                     |                                   t                      }| j                                        D ]}|                    |           |                    | j                   t          |          S )z4Return a list of user-defined labels in the mailbox.)r   r  r  rd   r{   difference_update_special_labelsrY   )r   labels
label_lists      r"   r  zBabyl.get_labels,  sm    ,--// 	& 	&JMM*%%%%  !5666F||r$   c                    g g }}| j                             d           d}g }	 |}| j                                         }| j                                         }|dt          z   k    rt          |          t          |          k     r*|                    |t          t                    z
             |                    |           d | j                                         dd                             d          D             }|                    |           n|dk    s|dt          z   k    rKt          |          t          |          k     r*|                    |t          t                    z
             n-|s+|                    |t          t                    z
             nt          t          t          ||                              | _        t          t          |                    | _        t          | j                  | _        | j                             dd	           | j                                         | _        dS )
r  r   Ts   c                 ^    g | ]*}|                                 |                                 +S r   )stripr  labels     r"   r  z'Babyl._generate_toc.<locals>.<listcomp>C  s<     : : :E+0;;==:%++-- : : :r$   r  N   ,   rI  )rZ  r   r   rp  r   r  r  r   r  r  r  r   r  r[  r_  )r   r  r  r  label_listsr  r   r!  s           r"   r  zBabyl._generate_toc5  s   B
	H:&&((Dz((H{W,,,u::F++LLCLL!8999h''': :+/:+>+>+@+@+D+J+J4+P+P: : : ""6****DGg,=$=$=u::F++LLCLL!8999 XG4555#	$ 3vu#5#56677	Ik2233TY
1 JOO--r$   c                     dt           z   }|dt           z   z  }|                                 }d |D             }|dd                    |          z   t           z   z  }|dz  }|                    |           dS )r  s   BABYL OPTIONS:s
   Version: 5c              3   >   K   | ]}|                                 V  d S r4   )r   r&  s     r"   r  z*Babyl._pre_mailbox_hook.<locals>.<genexpr>X  s*      55U%,,..555555r$   s   Labels:r(  r)  N)r   r  r   r   )r   r  babylr!  s       r"   rr  zBabyl._pre_mailbox_hookS  sz    !G+((""55f555dii///'99	r$   c                 @    |                     dt          z              dS )r     Nr  r  s     r"   rt  zBabyl._pre_message_hook]  s    	'!"""""r$   c                 @    |                     t          dz              dS )r  r)  Nr  r  s     r"   rv  zBabyl._post_message_hooka  s    	'!"""""r$   c                    | j                                         }t          |t                    rg }g }|                                D ]6}|| j        v r|                    |           !|                    |           7| j                             d           |D ]1}| j                             d|                                z              2| j                             d           |D ]4}| j                             d|                                z   dz              5| j                             t                     n"| j                             dt          z              t          |t          j        j                  rKt          j                    }t          j                            |dd          }|                    |           |                    d           	 |                                }| j                             |                    d
t                               |d
k    s|snQ| j                             dt          z              t          |t                    rt          j                    }	t          j                            |	dd          }
|
                    |                                           	 |	                                }| j                             |                    d
t                               |d
k    s|snQng|                    d           	 |                                }| j                             |                    d
t                               |d
k    s|snQ	 |                    d          }|sn4| j                             |                    d
t                               Lnt          |t.          t0          t          j        f          rt          |t          j                  r/t5          j        dt8          d           |                                }t          |t0                    r|                     |          }|                    d          dz   }|dz
  dk    r| j                             |d|                             d
t                               | j                             dt          z              | j                             |d|                             d
t                               | j                             ||d                             d
t                               nU| j                             dt          z   t          z              | j                             |                    d
t                               ntA          |d          rtA          |d          r"t5          j        dt8          d           |j!        }|                                }d	}	 |                                }|"                    d          r|dd         d
z   }n"|"                    d          r|dd         d
z   }| j                             |                    d
t                               |d
k    s|s=|r:d}| j                             dt          z              |                    |           nn	 |                                }|sn|"                    d          r|dd         t          z   }nO|"                    d          r|dd         t          z   }n'|"                    d
          r|dd         t          z   }| j                             |           ntG          dtI          |          z            | j                                         }||fS )z0Write message contents and return (start, stop).   1s   , s   ,,    r(  s   1,,Fr   Tr   r  rm  r   r   s   

rI  r   Nr   r   r   r   r   r   r   )%rZ  rp  r   r   r  r   r  r   r   r   rL   r+   r
   r   r   r   r   r   r   r   r   get_visibler   r   r   r   r   r   r   r   r   r  rw   r   r   r   r   )r   r+   r|  special_labelsr!  r'  orig_bufferorig_generatorr   
vis_buffervis_generatorr   
body_startoriginal_pos
first_passr}  s                   r"   r  zBabyl._install_messagee  sK   
!!g|,, 	/NF ++-- ) )D000"))%0000MM%((((JT"""' 9 9
  !78888JU### ? ?
  !6!=>>>>JW%%%%JVg-...gu}455 S	H*,,K"_;;KPQRRN""7+++Q"++--
  eW!=!=>>>5===	
 J_w6777'<00 Z\\
 % > >z5RS T T%%g&9&9&;&;<<<%..00DJ$$T\\%%A%ABBBu}}D}	   ###&//11DJ$$T\\%%A%ABBBu}}D}	
A$))$// 
  w!?!?@@@	A %bk!:;; 3	H'2;// - *+=qB B B!**,,'3'' 9//88 g..2JA~##
  *!5!=!=eW!M!MNNN
  7!:;;;
  *!5!=!=eW!M!MNNN
  !5!=!=eW!M!MNNNN
  7!:W!DEEE
  !@!@AAAAWj)) #	Hw)) ) 56H!M M M!."<<>>LJ''))==)) -9u,DD]]5)) -9u,D
  eW!=!=>>>5===! %*

((7)BCCC\2222''')) ==)) /9w.DD]]5)) /9w.DD]]5)) /9w.D
  &&&'  6gFGGGz  t}r$   r   )r   r   r   r   	frozensetr   r#   r,   r2   r=   rC   rN   rF   r  r  rr  rt  rv  r  r   r$   r"   r   r     s       ''i !B !B !B C CO   
  " " "5 5 5  8  ,G G G  . . .<  # # ## # #i i i i ir$   r   c                   &    e Zd ZdZddZd Zd ZdS )r
   z0Message with mailbox-format-specific properties.Nc                 h   t          |t          j        j                  rU|                     t          j        |                     t          |t                    r|                    |            dS dS t          |t                    r)|                     t          j	        |                     dS t          |t                    r)|                     t          j        |                     dS t          |t          j                  r)|                     t          j        |                     dS t          |d          r)|                     t          j        |                     dS |&t          j        j                            |            dS t%          dt'          |          z            )zInitialize a Message instance.r   Nr   )r   rL   r+   r
   _become_messagecopydeepcopy_explain_tor   rM   r   message_from_stringr   TextIOWrappermessage_from_filerw   message_from_binary_filer#   r   r   r*   s     r"   r#   zMessage.__init__  s   gu}455 	H  w!7!7888'7++ *##D)))))* *'' 	H  !9'!B!BCCCCC%% 		H  !:7!C!CDDDDD!122 	H  !8!A!ABBBBBWf%% 	H  !?!H!HIIIII_M!**4000006gFGGGr$   c                 n    t          |dg           }|j        D ]}||vr|j        |         | j        |<   dS )z0Assume the non-format-specific state of message._type_specific_attributesN)getattr__dict__)r   r+   type_specificr   s       r"   r@  zMessage._become_message  sP    )DbII$ 	= 	=D=((&-&6t&<d#	= 	=r$   c                 N    t          |t                    rdS t          d          )z:Copy format-specific state to message insofar as possible.Nz Cannot convert to specified type)r   r
   r   r*   s     r"   rC  zMessage._explain_to  s)    gw'' 	@F>???r$   r4   )r   r   r   r   r#   r@  rC  r   r$   r"   r
   r
     sU        ::H H H H&= = =@ @ @ @ @r$   r
   c                   d    e Zd ZdZg dZddZd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zd ZdS )r   z)Message with Maildir-specific properties.)_subdir_info_dateNc                     d| _         d| _        t          j                    | _        t                              | |           dS )z%Initialize a MaildirMessage instance.r   r   N)rO  rP  r8  rQ  r
   r#   r*   s     r"   r#   zMaildirMessage.__init__  s9    
Y[[
w'''''r$   c                     | j         S )zReturn 'new' or 'cur'.)rO  rV   s    r"   r   zMaildirMessage.get_subdir  s
    |r$   c                 P    |dk    s|dk    r	|| _         dS t          d|z            )zSet subdir to 'new' or 'cur'.r   r   z!subdir must be 'new' or 'cur': %sN)rO  r   )r   r   s     r"   r   zMaildirMessage.set_subdir  s2    U??foo!DLLL@6IJJJr$   c                 X    | j                             d          r| j         dd         S dS )*Return as a string the flags that are set.2,rI  Nr   )rP  r   rV   s    r"   	get_flagszMaildirMessage.get_flags  s/    :  && 	:abb>!2r$   c                 Z    dd                     t          |                    z   | _        dS ))Set the given flags and unset all others.rW  r   N)r   rs  rP  )r   flagss     r"   	set_flagszMaildirMessage.set_flags  s$    BGGF5MM222


r$   c                     |                      d                    t          |                                           t          |          z                       dS z.Set the given flag(s) without changing others.r   Nr\  r   r  rX  r   flags     r"   add_flagzMaildirMessage.add_flag  C    rwws4>>#3#344s4yy@AABBBBBr$   c                     |                                  rY|                     d                    t          |                                            t          |          z
                       dS dS )7Unset the given string flag(s) without changing others.r   N)rX  r\  r   r  r`  s     r"   remove_flagzMaildirMessage.remove_flag  sb    >> 	GNN2773t~~'7'7#8#83t99#DEEFFFFF	G 	Gr$   c                     | j         S )z<Return delivery date of message, in seconds since the epoch.)rQ  rV   s    r"   r   zMaildirMessage.get_date!  
    zr$   c                 r    	 t          |          | _        dS # t          $ r t          d|z            dw xY w)z9Set delivery date of message, in seconds since the epoch.zcan't convert to float: %sN)floatrQ  r   r   )r   dates     r"   r   zMaildirMessage.set_date%  sN    	KtDJJJ 	K 	K 	K84?@@dJ	Ks    6c                     | j         S )z%Get the message's "info" as a string.)rP  rV   s    r"   r   zMaildirMessage.get_info,  rh  r$   c                 |    t          |t                    r	|| _        dS t          dt	          |          z            )z Set the message's "info" string.zinfo must be a string: %sN)r   r   rP  r   r   )r   infos     r"   r   zMaildirMessage.set_info0  s:    dC   	FDJJJ7$t**DEEEr$   c                    t          |t                    rw|                    |                                            |                    |                                            |                    |                                            dS t          |t                    rt          |                                           }d|v r|
                    d           |                                 dk    r|
                    d           d|v r|
                    d           d|v r|
                    d           d|v r|
                    d           |                    d	t          j        |                                                      dS t          |t                    rpt          |                                           }d|vr|                    d
           d|v r|                    d           d|v r|                    d           dS dS t          |t                     rt          |                                           }d|vr|                    d
           d|v r|                    d           d|v r|                    d           d|v r|                    d           dS dS t          |t$                    rdS t'          dt)          |          z            )z;Copy Maildir-specific state to message insofar as possible.SRr   OTDFAMAILER-DAEMONr	  repliedflaggedr
  r  r=  r  $Cannot convert to specified type: %sN)r   r   r\  rX  r   r   r   r   r  r  rb  r  r8  r  r   r  r   	add_labelr
   r   r   )r   r+   r[  s      r"   rC  zMaildirMessage._explain_to7  s   g~.. '	+dnn..///t00111T]]__-----!122 #	+(())Ee||  %%%  E))  %%%e||  %%%e||  %%%e||  %%%_dk$--//.J.JKKKKK++ 	+(())E%$$X...e||$$Y///e||$$Y///// |.. 	+(())E%!!(+++e||!!),,,e||!!*---e||!!+..... |)) 	+DB MM* + + +r$   r4   )r   r   r   r   rI  r#   r   r   rX  r\  rb  rf  r   r   r   r   rC  r   r$   r"   r   r     s        33 = = =( ( ( (  K K K  3 3 3C C CG G G
  K K K  F F F)+ )+ )+ )+ )+r$   r   c                   L    e Zd ZdZdgZddZd ZddZd Zd Z	d	 Z
d
 Zd ZdS )r  z/Message with mbox- or MMDF-specific properties._fromNc                 6   |                      dd           t          |t          j        j                  rH|                                }|2|                    d          r|                      |dd                    t                              | |           dS )z'Initialize an mboxMMDFMessage instance.rw  TNzFrom r   )r  r   rL   r+   r
   r  r   r#   )r   r+   r  s      r"   r#   z_mboxMMDFMessage.__init__h  s    ot,,,gu}455 	,++--H#(;(;G(D(D#hqrrl+++w'''''r$   c                     | j         S )z Return contents of "From " line.)r}  rV   s    r"   r  z_mboxMMDFMessage.get_fromq  rh  r$   c                 z    |1|du rt          j                    }|dt          j        |          z   z  }|| _        dS )z>Set "From " line, formatting and appending time_ if specified.NTr  )r8  r  r  r}  )r   r  time_s      r"   r  z_mboxMMDFMessage.set_fromu  s@    }}S4<....E


r$   c                 \    |                      dd          |                      dd          z   S )rV  Statusr   X-Status)rA   rV   s    r"   rX  z_mboxMMDFMessage.get_flags}  s)    xx"%%R(@(@@@r$   c                    t          |          }d\  }}dD ] }||v r||z  }|                    |           !dD ] }||v r||z  }|                    |           !|d                    t          |                    z  }	 |                     d|           n&# t
          $ r |                     d|           Y nw xY w	 |                     d|           dS # t
          $ r |                     d|           Y dS w xY w)rZ  )r   r   )rq  rr  )rt  ru  rv  r   r  r  N)r  r2   r   rs  replace_headerr8   
add_header)r   r[  status_flagsxstatus_flagsra  s        r"   r\  z_mboxMMDFMessage.set_flags  sI   E

&,#m 	# 	#Du}}$T"""# 	# 	#Du}}%T"""///	4,7777 	4 	4 	4OOHl33333	4	7
M::::: 	7 	7 	7OOJ666666	7s$   B  B;:B;?C  C;:C;c                     |                      d                    t          |                                           t          |          z                       dS r^  r_  r`  s     r"   rb  z_mboxMMDFMessage.add_flag  rc  r$   c                     d| v sd| v rY|                      d                    t          |                                           t          |          z
                       dS dS )re  r  r  r   Nr_  r`  s     r"   rf  z_mboxMMDFMessage.remove_flag  s`    tzT11NN2773t~~'7'7#8#83t99#DEEFFFFF  21r$   c                    t          |t                    r:t          |                                           }d|v r|                    d           d|v r|                    d           d|v r|                    d           d|v r|                    d           d|v r|                    d           |d	= |d
= d                    |                                                                 dd                   }	 |	                    t          j        t          j        |d                               dS # t          t          f$ r Y dS w xY wt          |t                     rP|                    |                                            |                    |                                            dS t          |t&                    rtt          |                                           }d|vr|                    d           d|v r|                    d           d|v r|                    d           |d	= |d
= dS t          |t*                    rtt          |                                           }d|vr|                    d           d|v r|                    d           d|v r|                    d           |d	= |d
= dS t          |t.                    rdS t1          dt3          |          z            )zACopy mbox- or MMDF-specific state to message insofar as possible.rr  r   ru  rv  rq  rp  rt  rs  statuszx-statusr  Nz%a %b %d %H:%M:%S %Yr	  rx  ry  r
  r  rz  )r   r   r  rX  r   rb  r   r  r   r   calendartimegmr8  strptimer   OverflowErrorr  r\  r  r   r  r   r{  r
   r   r   )r   r+   r[  
maybe_dates       r"   rC  z_mboxMMDFMessage._explain_to  s/   g~.. /	+(())Ee||""5)))e||  %%%e||  %%%e||  %%%e||  %%%!
#$--//"7"7"9"9"##">??J  z6L2N 2N "O "O P P P P P.   !122 	+dnn..///T]]__-----++ 	+(())E%$$X...e||$$Y///e||$$Y///!
###.. 	+(())E%!!(+++e||!!),,,e||!!*---!
###)) 	+DB MM* + + +s   =:D9 9EEr4   )r   r   r   r   rI  r#   r  r  rX  r\  rb  rf  rC  r   r$   r"   r  r  c  s        99!(	( ( ( (     A A A7 7 7,C C CG G G
1+ 1+ 1+ 1+ 1+r$   r  c                       e Zd ZdZdS )r   z&Message with mbox-specific properties.Nr   r   r   r   r   r$   r"   r   r             0000r$   r   c                   >    e Zd ZdZdgZd
dZd Zd Zd Zd Z	d	 Z
dS )r   z$Message with MH-specific properties.
_sequencesNc                 J    g | _         t                              | |           dS )z!Initialize an MHMessage instance.N)r  r
   r#   r*   s     r"   r#   zMHMessage.__init__  s%    w'''''r$   c                      | j         dd         S )z4Return a list of sequences that include the message.N)r  rV   s    r"   r  zMHMessage.get_sequences  s    qqq!!r$   c                 .    t          |          | _        dS )z3Set the list of sequences that include the message.N)rY   r  )r   r  s     r"   r  zMHMessage.set_sequences  s    y//r$   c                     t          |t                    r'|| j        vr| j                            |           dS dS t	          dt          |          z            )z8Add sequence to list of sequences including the message.zsequence type must be str: %sN)r   r   r  r  r   r   r   r  s     r"   r  zMHMessage.add_sequence  sb    h$$ 	Nt..&&x00000 /. ;d8nnLMMMr$   c                 ^    	 | j                             |           dS # t          $ r Y dS w xY w)zARemove sequence from the list of sequences including the message.N)r  r2   r   r  s     r"   remove_sequencezMHMessage.remove_sequence  sE    	O""8,,,,, 	 	 	DD	    
,,c                 b   t          |t                    rt          |                                           }d|v r|                    d           n*|                    d           |                    d           d|v r|                    d           d|v r|                    d           dS dS t          |t                    rt          |                                           }d|vr|                    d           n|                    d	           d|v r|                    d           d|v r|                    d
           dS dS t          |t                    r.|                                 D ]}|                    |           dS t          |t                    rWt          |                                           }d|v r|
                    d           d|v r|
                    d           dS dS t          |t                    rdS t          dt          |          z            )z6Copy MH-specific state to message insofar as possible.r	  r   rp  ry  ru  rx  rq  ROrr  rv  r  rz  N)r   r   r  r  r   rb  r  r   r  r   r{  r
   r   r   )r   r+   r  r  s       r"   rC  zMHMessage._explain_to  sp   g~.. "	+D..0011I9$$""5))))""5)))  %%%I%%  %%%I%%  %%%%% &%!122 	+D..0011Iy((  &&&&  %%%I%%  %%%I%%  %%%%% &%++ 	+ ..00 / /$$X..../ /.. 
	+D..0011I9$$!!(+++I%%!!*----- &%)) 	+DB MM* + + +r$   r4   )r   r   r   r   rI  r#   r  r  r  r  rC  r   r$   r"   r   r     s        ..!-( ( ( (
" " "* * *N N N  $+ $+ $+ $+ $+r$   r   c                   R    e Zd ZdZddgZddZd Zd Zd Zd	 Z	d
 Z
d Zd Zd ZdS )r   z'Message with Babyl-specific properties.r  _visibleNc                 p    g | _         t                      | _        t                              | |           dS )z#Initialize a BabylMessage instance.N)r  r
   r  r#   r*   s     r"   r#   zBabylMessage.__init__%  s0    		w'''''r$   c                      | j         dd         S )z'Return a list of labels on the message.N)r  rV   s    r"   r  zBabylMessage.get_labels+  s    |AAAr$   c                 .    t          |          | _        dS )z&Set the list of labels on the message.N)rY   r  )r   r!  s     r"   r  zBabylMessage.set_labels/  s    F||r$   c                     t          |t                    r'|| j        vr| j                            |           dS dS t	          dt          |          z            )z+Add label to list of labels on the message.zlabel must be a string: %sN)r   r   r  r  r   r   r   r'  s     r"   r{  zBabylMessage.add_label3  sb    eS!! 	HDL((##E***** )( 84;;FGGGr$   c                 ^    	 | j                             |           dS # t          $ r Y dS w xY w)z4Remove label from the list of labels on the message.N)r  r2   r   r  s     r"   remove_labelzBabylMessage.remove_label;  sE    	L&&&&& 	 	 	DD	r  c                 *    t          | j                  S )z3Return a Message representation of visible headers.r
   r  rV   s    r"   r4  zBabylMessage.get_visibleB  s    t}%%%r$   c                 .    t          |          | _        dS )z2Set the Message representation of visible headers.Nr  )r   visibles     r"   r  zBabylMessage.set_visibleF  s    ((r$   c                     | j                                         D ]0}|| v r"| j                             || |                    (| j         |= 1dD ]}|| v r|| j         vr| |         | j         |<    dS )z9Update and/or sensibly generate a set of visible headers.)DateFromzReply-ToToCCSubjectN)r  rZ   r  )r   headers     r"   update_visiblezBabylMessage.update_visibleJ  s    m((** 	* 	*F~~,,VT&\BBBBM&))I 	5 	5F~~&"="=(,Vf%	5 	5r$   c                    t          |t                    rt          |                                           }d|v r|                    d           n*|                    d           |                    d           d|v sd|v r|                    d           d|v r|                    d           d	|v r|                    d
           dS dS t          |t                    rt          |                                           }d|vr|                    d           n|                    d           d	|v r|                    d           d|v r|                    d           dS dS t          |t                    rWt          |                                           }d|v r|                    d           d|v r|                    d           dS dS t          |t                    rU|
                    |                                            |                                 D ]}|                    |           dS t          |t                    rdS t          dt          |          z            )z9Copy Babyl-specific state to message insofar as possible.r	  r   rp  r  r  r=  r  rq  r
  rs  r  rr  rt  rv  rx  rz  N)r   r   r  r  r   rb  r  r   r  r   r  r4  r{  r
   r   r   )r   r+   r!  r'  s       r"   rC  zBabylMessage._explain_toU  s   g~.. %	+**++F6!!""5))))""5)))  %%%f$$F(:(:  %%%V##  %%%F""  %%%%% #"!122 	+**++Fv%%  &&&&  %%%F""  %%%V##  %%%%% $#++ 	+**++F6!!$$X...V##$$Y///// $#.. 	+ 0 0 2 2333** ) )!!%(((() ))) 	+DB MM* + + +r$   r4   )r   r   r   r   rI  r#   r  r  r{  r  r4  r  r  rC  r   r$   r"   r   r      s        11!*J 7( ( ( (  $ $ $H H H  & & &) ) )	5 	5 	5'+ '+ '+ '+ '+r$   r   c                       e Zd ZdZdS )r   z&Message with MMDF-specific properties.Nr  r   r$   r"   r   r     r  r$   r   c                       e Zd ZdZddZddZddZddZddZd Z	d	 Z
ddZd Zd Zd Zd Zd Zd Zd Zd Zed             Z ee          ZdS )r  zA read-only wrapper of a file.Nc                 \    || _         ||                                | _        dS || _        dS )zInitialize a _ProxyFile.N)rZ  rp  _pos)r   r  poss      r"   r#   z_ProxyFile.__init__  s,    
;DIIIDIIIr$   c                 B    |                      || j        j                  S zRead bytes.)_readrZ  r   r   sizes     r"   r   z_ProxyFile.read  s    zz$
000r$   c                 B    |                      || j        j                  S r  )r  rZ  read1r  s     r"   r  z_ProxyFile.read1  s    zz$
 0111r$   c                 B    |                      || j        j                  S )zRead a line.)r  rZ  r   r  s     r"   r   z_ProxyFile.readline  s    zz$
 3444r$   c                 v    g }| D ]3}|                     |           ||t          |          z  }|dk    r n4|S )zRead multiple lines.Nr   )r  r  )r   sizehintrr   r   s       r"   	readlinesz_ProxyFile.readlines  sR     	 	DMM$#CII%q==Er$   c              #   B   K   	 |                                  }|sdS |V  )zIterate over lines.TN)r   )r   r   s     r"   rb   z_ProxyFile.__iter__  s3      	==??D JJJ		r$   c                     | j         S )zReturn the position.)r  rV   s    r"   rp  z_ProxyFile.tell  s
    yr$   r   c                     |dk    r| j                             | j                   | j                             ||           | j                                         | _        dS )zChange position.r  NrZ  r   r  rp  r   offsetwhences      r"   r   z_ProxyFile.seek  sN    Q;;JOODI&&&
'''JOO%%			r$   c                     t          | d          r:	 t          | j        d          r| j                                         | `dS # | `w xY wdS )zClose the file.rZ  r   N)rw   rZ  r   rV   s    r"   r   z_ProxyFile.close  sa    4!! 	4:w// 'J$$&&&JJJDJ	 	s   .A Ac                     |d}| j                             | j                    ||          }| j                                         | _        |S )z"Read size bytes using read_method.Nr   r  )r   r  read_methodrr   s       r"   r  z_ProxyFile._read  sI    <D
	"""T""JOO%%	r$   c                     | S )z$Context management protocol support.r   rV   s    r"   	__enter__z_ProxyFile.__enter__  s    r$   c                 .    |                                   d S r4   )r   )r   excs     r"   __exit__z_ProxyFile.__exit__  s    

r$   c                 4    | j                                         S r4   )rZ  readablerV   s    r"   r  z_ProxyFile.readable      z""$$$r$   c                 4    | j                                         S r4   )rZ  writablerV   s    r"   r  z_ProxyFile.writable  r  r$   c                 4    | j                                         S r4   )rZ  seekablerV   s    r"   r  z_ProxyFile.seekable  r  r$   c                 4    | j                                         S r4   )rZ  r~   rV   s    r"   r~   z_ProxyFile.flush  s    z!!!r$   c                 l    t          | d          sdS t          | j        d          sdS | j        j        S )NrZ  Tr  F)rw   rZ  r  rV   s    r"   r  z_ProxyFile.closed  s=    tW%% 	4tz8,, 	5z  r$   r4   r   )r   r   r   r   r#   r   r  r   r  rb   rp  r   r   r  r  r  r  r  r  r~   propertyr  r   r   r   r   r$   r"   r  r    sQ       ((   1 1 1 12 2 2 25 5 5 5	 	 	 	    & & & &        % % %% % %% % %" " " ! ! X! $L11r$   r  c                   4    e Zd ZdZd	dZd Zd
dZd Zd ZdS )r  z&A read-only wrapper of part of a file.Nc                 Z    t                               | ||           || _        || _        dS )zInitialize a _PartialFile.N)r  r#   _start_stop)r   r  r|  r}  s       r"   r#   z_PartialFile.__init__  s,    D!U+++


r$   c                 F    t                               |           | j        z
  S )z*Return the position with respect to start.)r  rp  r  rV   s    r"   rp  z_PartialFile.tell  s    t$$t{22r$   r   c                     |dk    r| j         | _        d}n|dk    r| j        | _        d}t                              | ||           dS )z8Change position, possibly with respect to start or stop.r   r  rI  N)r  r  r  r  r   r  s      r"   r   z_PartialFile.seek  sN    Q;;DIFFq[[
DIFff-----r$   c                     | j         | j        z
  }|dk    rdS ||dk     s||k    r|}t                              | ||          S )z;Read size bytes using read_method, honoring start and stop.r   r$   )r  r  r  r  )r   r  r  	remainings       r"   r  z_PartialFile._read  sR    J*	>>3<4!88ti'7'7DdK888r$   c                 .    t          | d          r| `d S d S )NrZ  )rw   rZ  rV   s    r"   r   z_PartialFile.close  s)     4!! 	


	 	r$   )NNr  )	r   r   r   r   r#   rp  r   r  r   r   r$   r"   r  r    so        00   3 3 3. . . .9 9 9    r$   r  Tc                    d}	 t           r	 t          j        | t           j        t           j        z             nT# t          $ rG}|j        t
          j        t
          j        t
          j        fv rt          d| j
        z             d}~ww xY w|r"	 t          | j
        dz             }|                                 n8# t          $ r+}|j        t
          j        t
          j        fv rY d}~dS  d}~ww xY w	 	 t          j        |j
        | j
        dz              d}t          j        |j
                   n;# t           t"          f$ r' t          j        |j
        | j
        dz              d}Y nw xY wdS dS # t&          $ r1 t          j        |j
                   t          d| j
        z            w xY wdS #  t           rt          j        | t           j                   |rt          j        | j
        dz               xY w)z(Lock file f using lockf and dot locking.Fzlockf: lock unavailable: %sN.lockTzdot lock unavailable: %s)fcntllockfLOCK_EXLOCK_NBr   r   EAGAINrX  rY  r   r   rq  r   r   r   r  r   r   r   rF  r2   LOCK_UN)r  rn  dotlock_doner   pre_locks        r"   rh  rh    sD   L% 	Au}u}<====   7u|U\5;GGG,-J-.V.4 5 5 5   	1,QVg-=>>       7u|U[999FFFFF	
1-GHM16G+;<<<#'L
 Ihm,,,,	 '8 ( ( (IhmQVg-=>>>#'LLL( -, !L # 1 1 1	(-(((()C)**0 1 1 11%	1 	1, 	*K5=))) 	(Iafw&'''s   F4 ,9 F4 
B
ABB

F4 +B= <F4 =
C2C-&F4 ,C--C22F4 7$D5 E4 55E-*E4 ,E--E4 4;F//F4 4AG;c                     t           rt          j        | t           j                   t          j                            | j        dz             rt          j        | j        dz              dS dS )z*Unlock file f using lockf and dot locking.r  N)r  r  r  r   r   r   r   r2   r  s    r"   rk  rk  9  sb     &Au}%%%	w~~afw&'' $
	!&7"#####$ $r$   c                     t          j        | t           j        t           j        z  t           j        z  d          }	 t          | d          t          j        |           S # t          j        |           w xY w)zCCreate a file if it doesn't exist and open for reading and writing.r)  rV  )r   r   r*  r  O_RDWRr   )r   fds     r"   rE  rE  @  sX    	rzBI-	95	A	ABD%  
s   A   A6c           
          t          | dt          t          j                              dt          j                    dt          j                              S )zBCreate a temp file based on path and open for reading and writing.r  )rE  rA  r8  r?  r@  r   rB  )r   s    r"   rq  rq  H  sR    dddC	4D4D4D4D.4.@.B.B.B.B.0ikkk; < < <r$   c                     |                                   t          t          d          r(t          j        |                                            dS dS )z0Ensure changes to file f are physically on disk.fsyncN)r~   rw   r   r  filenor  s    r"   ro  ro  N  sI    GGIIIr7 
 r$   c                 L    t          |            |                                  dS )z:Close file f, ensuring all changes are physically on disk.N)ro  r   r  s    r"   r   r   T  s    NNNGGIIIIIr$   c                       e Zd ZdZdS )r   z"Raised for module-specific errors.Nr  r   r$   r"   r   r   Z  s        ,,,,r$   r   c                       e Zd ZdZdS )r   z:The specified mailbox does not exist and won't be created.Nr  r   r$   r"   r   r   ]  s        DDDDr$   r   c                       e Zd ZdZdS )r   z>The specified mailbox is not empty and deletion was requested.Nr  r   r$   r"   r   r   `  s        HHHHr$   r   c                       e Zd ZdZdS )r   z)Another process caused an action to fail.Nr  r   r$   r"   r   r   c          3333r$   r   c                       e Zd ZdZdS )r   z)A file appears to have an invalid format.Nr  r   r$   r"   r   r   f  r  r$   r   )T)2r   r   r8  r  r?  r   rA  r   rL   email.messageemail.generatorr   rD   typesr   r  ImportError__all__r   r   r   r   rT  r  r   r	   r   r   r+   r
   r   r  r   r   r   r   r  r  rh  rk  rE  rq  ro  r   	Exceptionr   r   r   r   r   r   r$   r"   <module>r     su   J J 
			                				          LLLL   EEEA A A
 *

G
$
$f2 f2 f2 f2 f2 f2 f2 f2Rs s s s sg s s sl	       F? ? ? ? ?" ? ? ?D1. 1. 1. 1. 1.9 1. 1. 1.h*. *. *. *. *.9 *. *. *.Zn* n* n* n* n* n* n* n*b	v v v v v v v vr"@ "@ "@ "@ "@em# "@ "@ "@Jj+ j+ j+ j+ j+W j+ j+ j+Zn+ n+ n+ n+ n+w n+ n+ n+b1 1 1 1 1" 1 1 1E+ E+ E+ E+ E+ E+ E+ E+P\+ \+ \+ \+ \+7 \+ \+ \+~1 1 1 1 1" 1 1 1b2 b2 b2 b2 b2 b2 b2 b2J$ $ $ $ $: $ $ $N( ( ( (T$ $ $  < < <    - - - - -I - - -E E E E E E E EI I I I IE I I I4 4 4 4 4 4 4 44 4 4 4 4% 4 4 4 4 4s   ? A	A	