+
    üÐjº]  ã                   ó0  € R t ^ RIt^ RIt^ RIHt ^ RIHtHtHt ^ RI	H
t
 ^ RIHt ^ RIHtHt R tRR lt ! R	 R
4      t]! ]4       ! R R]4      4       t]! ]
P(                  4       ! R R4      4       t]! ]4       ! R R]4      4       t ! R R]4      t]! ]
P(                  4       ! R R4      4       t ! R R]P4                  4      t]! ]4       ! R R]4      4       t]! ]
P(                  4       ! R R4      4       t]! ]4       ! R R]4      4       tR# )zD
Support for aliases(5) configuration files.

@author: Jp Calderone
N)Úimplementer)ÚdeferÚprotocolÚreactor)Úsmtp)ÚIAlias)ÚfailureÚlogc                ó†  € VP                  R^4       Uu. uF  qDP                  4       NK  	  pp\        V4      ^8w  d$   RpW23p\        P                  ! Wg,          4       R# Vw  r‰V P                  VP                  4       . 4      P                  \        \        P                  V	P                  R4      4      4       R# u upi )aÄ  
Parse a line from an aliases file.

@type result: L{dict} mapping L{bytes} to L{list} of L{bytes}
@param result: A dictionary mapping username to aliases to which
    the results of parsing the line are added.

@type line: L{bytes}
@param line: A line from an aliases file.

@type filename: L{bytes}
@param filename: The full or relative path to the aliases file.

@type lineNo: L{int}
@param lineNo: The position of the line within the aliases file.
Ú:z+Invalid format on line %d of alias file %s.Ú,N)	ÚsplitÚstripÚlenr	   ÚerrÚ
setdefaultÚextendÚmapÚstr)
ÚresultÚlineÚfilenameÚlineNoÚpÚpartsÚfmtÚargÚuserÚaliass
   &&&&      Ú4/usr/lib/python3/dist-packages/twisted/mail/alias.pyÚhandler       s�   € ð" !%§
¡
¨3°Ô 2Ó3Ñ 2˜1�W‰WŽYÑ 2€EÐ3Ü
ˆ5ƒz�Q„Ø;ˆØÐ ˆÜ�Š�•	Öà‰ˆØ×Ñ˜$Ÿ*™*›,¨Ó+×2Ñ2´3´s·y±yÀ%Ç+Á+ÈcÓBRÓ3SÖTùò 4s   •B>c                óf  € / pRpVf   \        V4      pRpM\        VRR4      p^ pRp V F‘  pV^,          pVP                  4       pVP                  4       P	                  R4      '       d   KC  VP	                  R4      '       g   VP	                  R4      '       d   Wg,           pK{  V'       d   \        W6W4       TpK“  	  V'       d   VP                  4        T'       d   \        Y6Y4       TP                  4        F  w  r‰\        Y�T4      Y8&   K  	  T#   T'       d   TP                  4        i i ; i)	a:  
Load a file containing email aliases.

Lines in the file should be formatted like so::

     username: alias1, alias2, ..., aliasN

Aliases beginning with a C{|} will be treated as programs, will be run, and
the message will be written to their stdin.

Aliases beginning with a C{:} will be treated as a file containing
additional aliases for the username.

Aliases beginning with a C{/} will be treated as the full pathname to a file
to which the message will be appended.

Aliases without a host part will be assumed to be addresses on localhost.

If a username is specified multiple times, the aliases for each are joined
together as if they had all been on one line.

Lines beginning with a space or a tab are continuations of the previous
line.

Lines beginning with a C{#} are comments.

@type domains: L{dict} mapping L{bytes} to L{IDomain} provider
@param domains: A mapping of domain name to domain object.

@type filename: L{bytes} or L{None}
@param filename: The full or relative path to a file from which to load
    aliases. If omitted, the C{fp} parameter must be specified.

@type fp: file-like object or L{None}
@param fp: The file from which to load aliases. If specified,
    the C{filename} parameter is ignored.

@rtype: L{dict} mapping L{bytes} to L{AliasGroup}
@return: A mapping from username to group of aliases.
FTÚnamez	<unknown>Ú Ú#Ú Ú	)	ÚopenÚgetattrÚrstripÚlstripÚ
startswithr    ÚcloseÚitemsÚ
AliasGroup)
Údomainsr   Úfpr   r,   ÚiÚprevr   ÚuÚas
   &&&       r   ÚloadAliasFiler5   3   s  € ðR €FØ€EØ	‚zÜ�(‹^ˆØ‰ä˜2˜v {Ó3ˆØ	€AØ€DðÛˆDØ��FˆAØ—;‘;“=ˆDØ�{‰{‹}×'Ñ'¨×,Ò,ÙØ—‘ ×%Ò%¨¯©¸×)>Ò)>Ø•{’çÜ˜6¨Ô5Ø’ñ ÷ Ø�H‰HŒJßÜˆv˜XÔ)Ø—‘–‰ˆÜ˜q¨1Ó-ˆ‹	ñ à€Mø÷ Ø�H‰H�Jð ús   ©AD ÂD ÂD Â.D ÄD0c                   ó:   a € ] tR t^{t o RtR tR tRR ltRtV t	R# )Ú	AliasBasez–
The default base class for aliases.

@ivar domains: See L{__init__}.

@type original: L{Address}
@ivar original: The original address being aliased.
c                óH   € Wn         \        P                  ! V4      V n        R# )zÊ
@type domains: L{dict} mapping L{bytes} to L{IDomain} provider
@param domains: A mapping of domain name to domain object.

@type original: L{bytes}
@param original: The original address being aliased.
N)r/   r   ÚAddressÚoriginal)Úselfr/   r:   s   &&&r   Ú__init__ÚAliasBase.__init__…   s   € ð ŒÜŸš XÓ.ˆŽó    c                óP   € V P                   V P                  P                  ,          # )z€
Return the domain associated with original address.

@rtype: L{IDomain} provider
@return: The domain for the original address.
)r/   r:   Údomain©r;   s   &r   r@   ÚAliasBase.domain�   s   € ð �|‰|˜DŸM™M×0Ñ0Õ1Ð1r>   Nc                ón   € Vf   / p\        V 4      V9   d   R# RV\        V 4      &   V P                  4       # ©a  
Map this alias to its ultimate destination.

@type aliasmap: L{dict} mapping L{bytes} to L{AliasBase}
@param aliasmap: A mapping of username to alias or group of aliases.

@type memo: L{None} or L{dict} of L{AliasBase}
@param memo: A record of the aliases already considered in the
    resolution process.  If provided, C{memo} is modified to include
    this alias.

@rtype: L{IMessage <smtp.IMessage>} or L{None}
@return: A message receiver for the ultimate destination or None for
    an invalid destination.
N)r   ÚcreateMessageReceiver©r;   ÚaliasmapÚmemos   &&&r   ÚresolveÚAliasBase.resolve™   s9   € ð  Š<ØˆDÜˆt‹9˜ÔÙØˆŒS�‹Y‰Ø×)Ñ)Ó+Ð+r>   )r/   r:   ©N)
Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r<   r@   rI   Ú__static_attributes__Ú__classdictcell__©Ú__classdict__s   @r   r7   r7   {   s   ø‡ € ñò	/ò2÷,ò ,r>   r7   c                   óL   a € ] tR t^±t o RtR tV 3R lR ltR tR	R ltRt	V t
R# )
ÚAddressAliasz{
An alias which translates one email address into another.

@type alias : L{Address}
@ivar alias: The destination address.
c                ól   € \         P                  ! V .VO5!   \        P                  ! V4      V n        R# )a  
@type alias: L{Address}, L{User}, L{bytes} or object which can be
    converted into L{bytes}
@param alias: The destination address.

@type args: 2-L{tuple} of (0) L{dict} mapping L{bytes} to L{IDomain}
    provider, (1) L{bytes}
@param args: Arguments for L{AliasBase.__init__}.
N)r7   r<   r   r9   r   )r;   r   Úargss   &&*r   r<   ÚAddressAlias.__init__º   s'   € ô 	×Ò˜4Ð' $Ô'Ü—\’\ %Ó(ˆŽ
r>   c                ó    <€ V ^8„  d   QhRS[ /# ©é   Úreturn©r   )ÚformatrT   s   "€r   Ú__annotate__ÚAddressAlias.__annotate__Ç   ó   ø€ ÷ )ñ )™ñ )r>   c                ó"   € RV P                    R2# )z‰
Build a string representation of this L{AddressAlias} instance.

@rtype: L{bytes}
@return: A string containing the destination address.
z	<Address Ú>©r   rA   s   &r   Ú__str__ÚAddressAlias.__str__Ç   s   € ð ˜4Ÿ:™:˜, aÐ(Ð(r>   c                óf   € V P                  4       P                  \        V P                  4      4      # )z›
Create a message receiver which delivers a message to
the destination address.

@rtype: L{IMessage <smtp.IMessage>} provider
@return: A message receiver.
)r@   Úexistsr   r   rA   s   &r   rE   Ú"AddressAlias.createMessageReceiverÐ   s#   € ð �{‰{‹}×#Ñ#¤C¨¯
©
£OÓ4Ð4r>   Nc                ó¢  € Vf   / p\        V 4      V9   d   R# RV\        V 4      &    V P                  4       P                  \        P                  ! V P
                  RRR4      V4      ! 4       #   \        P                   d     Mi ; iT P
                  P                  T9   d,   YP
                  P                  ,          P                  Y4      # R# rD   )	r   r@   ri   r   ÚUserr   ÚSMTPBadRcptÚlocalrI   rF   s   &&&r   rI   ÚAddressAlias.resolveÚ   sª   € ð  Š<ØˆDÜˆt‹9˜ÔÙØˆŒS�‹Y‰ð	Ø—;‘;“=×'Ñ'¬¯	ª	°$·*±*¸dÀDÈ$Ó(OÐQUÔVÓXÐXøÜ×Ñô 	Ùð	úà�:‰:×Ñ˜xÔ'ØŸJ™J×,Ñ,Õ-×5Ñ5°hÓEÐEÙs   ¨AA. Á.BÂBre   rK   )rL   rM   rN   rO   rP   r<   rf   rE   rI   rQ   rR   rS   s   @r   rV   rV   ±   s(   ø‡ € ñò)÷)ð )ò5÷ò r>   rV   c                   óN   a € ] tR t^øt o RtR tR tR tR tV 3R lR lt	Rt
V tR	# )
ÚFileWrapperzü
A message receiver which delivers a message to a file.

@type fp: file-like object
@ivar fp: A file used for temporary storage of the message.

@type finalname: L{bytes}
@ivar finalname: The name of the file in which the message should be
    stored.
c                óF   € \         P                  ! 4       V n        Wn        R# )zk
@type filename: L{bytes}
@param filename: The name of the file in which the message should be
    stored.
N)ÚtempfileÚTemporaryFiler0   Ú	finalname)r;   r   s   &&r   r<   ÚFileWrapper.__init__  s   € ô ×(Ò(Ó*ˆŒØ!Žr>   c                óJ   € V P                   P                  VR,           4       R# )zq
Write a received line to the temporary file.

@type line: L{bytes}
@param line: A received line of the message.
Ú
N)r0   Úwrite©r;   r   s   &&r   ÚlineReceivedÚFileWrapper.lineReceived  s   € ð 	�‰�‰�d˜T•kÖ"r>   c                óî  € V P                   P                  ^ ^ 4        \        V P                  R4      pT;_uu_ 4        TP                  T P                   P                  4       4       T P                   P                  4        RRR4       \
        P                  ! T P                  4      #   \         d-    \
        P                  ! \        P                  ! 4       4      u # i ; i  + '       g   i     Lj; i)a+  
Handle end of message by writing the message to the file.

@rtype: L{Deferred <defer.Deferred>} which successfully results in
    L{bytes}
@return: A deferred which succeeds with the name of the file to which
    the message has been stored or fails if the message cannot be
    saved to the file.
r4   N)r0   Úseekr'   ru   ÚBaseExceptionr   Úfailr   ÚFailurery   Úreadr,   Úsucceed)r;   Úfs   & r   ÚeomReceivedÚFileWrapper.eomReceived  sž   € ð 	�‰�‰�Q˜Ôð	1Ü�T—^‘^ SÓ)ˆA÷ ŠQØ�G‰G�D—G‘G—L‘L“NÔ#Ø�G‰G�M‰MŒO÷ ô �}Š}˜TŸ^™^Ó,Ð,øô ô 	1Ü—:’:œgŸošoÓ/Ó0Ò0ð	1ú÷ �Qús   žB* ¾AC$Â*4C!Ã C!Ã$C4	c                óH   € V P                   P                  4        RV n         R# )z7
Close the temporary file when the connection is lost.
N)r0   r,   rA   s   &r   ÚconnectionLostÚFileWrapper.connectionLost-  s   € ð 	�‰�‰ŒØˆŽr>   c                ó    <€ V ^8„  d   QhRS[ /# r[   r^   )r_   rT   s   "€r   r`   ÚFileWrapper.__annotate__4  s   ø€ ÷ 1ñ 1™ñ 1r>   c                ó"   € RV P                    R2# )z�
Build a string representation of this L{FileWrapper} instance.

@rtype: L{bytes}
@return: A string containing the file name of the message.
z<FileWrapper rd   )ru   rA   s   &r   rf   ÚFileWrapper.__str__4  s   € ð ˜tŸ~™~Ð.¨aÐ0Ð0r>   )ru   r0   N©rL   rM   rN   rO   rP   r<   r{   r…   rˆ   rf   rQ   rR   rS   s   @r   rq   rq   ø   s(   ø‡ € ñ	ò"ò#ò-ò,÷1ö 1r>   rq   c                   óB   a € ] tR tRt o RtR tV 3R lR ltR tRtV t	R# )	Ú	FileAliasi>  zS
An alias which translates an address to a file.

@ivar filename: See L{__init__}.
c                óB   € \         P                  ! V .VO5!   Wn        R# )zò
@type filename: L{bytes}
@param filename: The name of the file in which to store the message.

@type args: 2-L{tuple} of (0) L{dict} mapping L{bytes} to L{IDomain}
    provider, (1) L{bytes}
@param args: Arguments for L{AliasBase.__init__}.
N)r7   r<   r   )r;   r   rX   s   &&*r   r<   ÚFileAlias.__init__F  s   € ô 	×Ò˜4Ð' $Ô'Ø Žr>   c                ó    <€ V ^8„  d   QhRS[ /# r[   r^   )r_   rT   s   "€r   r`   ÚFileAlias.__annotate__R  rb   r>   c                ó"   € RV P                    R2# )zƒ
Build a string representation of this L{FileAlias} instance.

@rtype: L{bytes}
@return: A string containing the name of the file.
z<File rd   ©r   rA   s   &r   rf   ÚFileAlias.__str__R  s   € ð ˜Ÿ™� aÐ(Ð(r>   c                ó,   € \        V P                  4      # )z™
Create a message receiver which delivers a message to the file.

@rtype: L{FileWrapper}
@return: A message receiver which writes a message to the file.
)rq   r   rA   s   &r   rE   ÚFileAlias.createMessageReceiver[  s   € ô ˜4Ÿ=™=Ó)Ð)r>   r–   N)
rL   rM   rN   rO   rP   r<   rf   rE   rQ   rR   rS   s   @r   r�   r�   >  s#   ø‡ € ñò
!÷)ð )÷*ð *r>   r�   c                   ó   € ] tR tRtRtRtR# )ÚProcessAliasTimeoutie  zV
An error indicating that a timeout occurred while waiting for a process
to complete.
© N)rL   rM   rN   rO   rP   rQ   rœ   r>   r   r›   r›   e  s   † õr>   r›   c                   ón   a € ] tR tRt o RtRt^<tRt]tRR lt	R t
R tR tR	 tR
 tV 3R lR ltRtV tR# )ÚMessageWrapperil  aò  
A message receiver which delivers a message to a child process.

@type completionTimeout: L{int} or L{float}
@ivar completionTimeout: The number of seconds to wait for the child
    process to exit before reporting the delivery as a failure.

@type _timeoutCallID: L{None} or
    L{IDelayedCall <twisted.internet.interfaces.IDelayedCall>} provider
@ivar _timeoutCallID: The call used to time out delivery, started when the
    connection to the child process is closed.

@type done: L{bool}
@ivar done: A flag indicating whether the child process has exited
    (C{True}) or not (C{False}).

@type reactor: L{IReactorTime <twisted.internet.interfaces.IReactorTime>}
    provider
@ivar reactor: A reactor which will be used to schedule timeouts.

@ivar protocol: See L{__init__}.

@type processName: L{bytes} or L{None}
@ivar processName: The process name.

@type completion: L{Deferred <defer.Deferred>}
@ivar completion: The deferred which will be triggered by the protocol
    when the child process exits.
FNc                óê   € W n         Wn        \        P                  ! 4       V n        V P                  V P                  n        V P                  P                  V P                  4       Ve	   W0n        R# R# )aV  
@type protocol: L{ProcessAliasProtocol}
@param protocol: The protocol associated with the child process.

@type process: L{bytes} or L{None}
@param process: The process name.

@type reactor: L{None} or L{IReactorTime
    <twisted.internet.interfaces.IReactorTime>} provider
@param reactor: A reactor which will be used to schedule timeouts.
N)	ÚprocessNamer   r   ÚDeferredÚ
completionÚonEndÚaddBothÚ_processEndedr   )r;   r   Úprocessr   s   &&&&r   r<   ÚMessageWrapper.__init__“  sU   € ð #ÔØ ŒÜŸ.š.Ó*ˆŒØ"Ÿo™oˆ�‰ÔØ�‰×Ñ × 2Ñ 2Ô3àÒØ"ŽLñ r>   c                óv   € RV n         V P                  e$   V P                  P                  4        RV n        R# V# )a_  
Record process termination and cancel the timeout call if it is active.

@type result: L{Failure <failure.Failure>}
@param result: The reason the child process terminated.

@rtype: L{None} or L{Failure <failure.Failure>}
@return: None, if the process end is expected, or the reason the child
    process terminated, if the process end is unexpected.
TN)ÚdoneÚ_timeoutCallIDÚcancel)r;   r   s   &&r   r¥   ÚMessageWrapper._processEnded¨  s:   € ð ˆŒ	Ø×ÑÒ*ð ×Ñ×&Ñ&Ô(Ø"&ˆDÖð ˆMr>   c                ó†   € V P                   '       d   R# V P                  P                  P                  VR,           4       R# )zp
Write a received line to the child process.

@type line: L{bytes}
@param line: A received line of the message.
Nrx   )r©   r   Ú	transportry   rz   s   &&r   r{   ÚMessageWrapper.lineReceived¾  s,   € ð �9�9ˆ9ÙØ�‰×Ñ×%Ñ% d¨T¥kÖ2r>   c                óð   € V P                   '       gZ   V P                  P                  P                  4        V P                  P                  V P                  V P                  4      V n        V P                  # )zÆ
Disconnect from the child process and set up a timeout to wait for it
to exit.

@rtype: L{Deferred <defer.Deferred>}
@return: A deferred which will be called back when the child process
    exits.
)
r©   r   r®   ÚloseConnectionr   Ú	callLaterÚcompletionTimeoutÚ_completionCancelrª   r¢   rA   s   &r   r…   ÚMessageWrapper.eomReceivedÉ  sW   € ð �y�yˆyØ�M‰M×#Ñ#×2Ñ2Ô4Ø"&§,¡,×"8Ñ"8Ø×&Ñ&¨×(>Ñ(>ó#ˆDÔð �‰Ðr>   c                ó  € RV n         V P                  P                  P                  R4       \	        RV P
                   R24      pRV P                  n        V P                  P                  \        P                  ! V4      4       R# )z¥
Handle the expiration of the timeout for the child process to exit by
terminating the child process forcefully and issuing a failure to the
L{completion} deferred.
NÚKILLzNo answer after z seconds)rª   r   r®   ÚsignalProcessr›   r³   r£   r¢   Úerrbackr   r�   )r;   Úexcs   & r   r´   Ú MessageWrapper._completionCancelÙ  sf   € ð #ˆÔØ�‰×Ñ×-Ñ-¨fÔ5Ü!Ð$4°T×5KÑ5KÐ4LÈHÐ"UÓVˆØ"ˆ�‰ÔØ�‰×Ñ¤§¢°Ó 4Ö5r>   c                ó   € R# )z)
Ignore notification of lost connection.
Nrœ   rA   s   &r   rˆ   ÚMessageWrapper.connectionLostå  s   ‚ r>   c                ó    <€ V ^8„  d   QhRS[ /# r[   r^   )r_   rT   s   "€r   r`   ÚMessageWrapper.__annotate__ê  s   ø€ ÷ 6ñ 6™ñ 6r>   c                ó"   € RV P                    R2# )z‹
Build a string representation of this L{MessageWrapper} instance.

@rtype: L{bytes}
@return: A string containing the name of the process.
z<ProcessWrapper rd   )r    rA   s   &r   rf   ÚMessageWrapper.__str__ê  s   € ð " $×"2Ñ"2Ð!3°1Ð5Ð5r>   )rª   r¢   r©   r    r   r   ©NN)rL   rM   rN   rO   rP   r©   r³   rª   r   r<   r¥   r{   r…   r´   rˆ   rf   rQ   rR   rS   s   @r   rž   rž   l  sI   ø‡ € ñð< €DàÐØ€Nà€Gô#ò*ò,	3òò 
6ò÷
6ö 6r>   rž   c                   ó.   a € ] tR tRt o RtRtR tRtV tR# )ÚProcessAliasProtocoliô  zÑ
A process protocol which errbacks a deferred when the associated
process ends.

@type onEnd: L{None} or L{Deferred <defer.Deferred>}
@ivar onEnd: If set, a deferred on which to errback when the process ends.
Nc                ó\   € V P                   e   V P                   P                  V4       R# R# )zv
Call an errback.

@type reason: L{Failure <failure.Failure>}
@param reason: The reason the child process terminated.
N)r£   r¹   )r;   Úreasons   &&r   ÚprocessEndedÚ!ProcessAliasProtocol.processEndedÿ  s%   € ð �:‰:Ò!Ø�J‰J×Ñ˜vÖ&ñ "r>   rœ   )	rL   rM   rN   rO   rP   r£   rÇ   rQ   rR   rS   s   @r   rÄ   rÄ   ô  s   ø‡ € ñð €E÷'ð 'r>   rÄ   c                   óL   a € ] tR tRt o Rt]tR tV 3R lR ltR tR t	Rt
V tR	# )
ÚProcessAliasi
  a  
An alias which is handled by the execution of a program.

@type path: L{list} of L{bytes}
@ivar path: The arguments to pass to the process. The first string is
    the executable's name.

@type program: L{bytes}
@ivar program: The path of the program to be executed.

@type reactor: L{IReactorTime <twisted.internet.interfaces.IReactorTime>}
    and L{IReactorProcess <twisted.internet.interfaces.IReactorProcess>}
    provider
@ivar reactor: A reactor which will be used to create and timeout the
    child process.
c                ó�   € \         P                  ! V .VO5!   VP                  4       V n        V P                  ^ ,          V n        R# )a   
@type path: L{bytes}
@param path: The command to invoke the program consisting of the path
    to the executable followed by any arguments.

@type args: 2-L{tuple} of (0) L{dict} mapping L{bytes} to L{IDomain}
    provider, (1) L{bytes}
@param args: Arguments for L{AliasBase.__init__}.
N)r7   r<   r   ÚpathÚprogram)r;   rÌ   rX   s   &&*r   r<   ÚProcessAlias.__init__  s3   € ô 	×Ò˜4Ð' $Ô'Ø—J‘J“LˆŒ	Ø—y‘y •|ˆŽr>   c                ó    <€ V ^8„  d   QhRS[ /# r[   r^   )r_   rT   s   "€r   r`   ÚProcessAlias.__annotate__.  s   ø€ ÷ (ñ (™ñ (r>   c                ó"   € RV P                    R2# )z˜
Build a string representation of this L{ProcessAlias} instance.

@rtype: L{bytes}
@return: A string containing the command used to invoke the process.
z	<Process rd   )rÌ   rA   s   &r   rf   ÚProcessAlias.__str__.  s   € ð ˜4Ÿ9™9˜+ QÐ'Ð'r>   c                ó:   € V P                   P                  WV4      # )aÈ  
Spawn a process.

This wraps the L{spawnProcess
<twisted.internet.interfaces.IReactorProcess.spawnProcess>} method on
L{reactor} so that it can be customized for test purposes.

@type proto: L{IProcessProtocol
    <twisted.internet.interfaces.IProcessProtocol>} provider
@param proto: An object which will be notified of all events related to
    the created process.

@type program: L{bytes}
@param program: The full path name of the file to execute.

@type path: L{list} of L{bytes}
@param path: The arguments to pass to the process. The first string
    should be the executable's name.

@rtype: L{IProcessTransport
    <twisted.internet.interfaces.IProcessTransport>} provider
@return: A process transport.
)r   ÚspawnProcess)r;   ÚprotorÍ   rÌ   s   &&&&r   rÔ   ÚProcessAlias.spawnProcess7  s   € ð0 �|‰|×(Ñ(¨¸Ó>Ð>r>   c                ó¦   € \        4       p\        WP                  V P                  4      pV P	                  WP                  V P
                  4       V# )z²
Launch a process and create a message receiver to pass a message
to the process.

@rtype: L{MessageWrapper}
@return: A message receiver which delivers a message to the process.
)rÄ   rž   rÍ   r   rÔ   rÌ   )r;   r   Úms   &  r   rE   Ú"ProcessAlias.createMessageReceiverQ  s=   € ô !Ó"ˆÜ˜1Ÿl™l¨D¯L©LÓ9ˆØ×Ñ˜!Ÿ\™\¨4¯9©9Ô5Øˆr>   )rÌ   rÍ   N)rL   rM   rN   rO   rP   r   r<   rf   rÔ   rE   rQ   rR   rS   s   @r   rÊ   rÊ   
  s/   ø‡ € ñð" €Gò$÷(ð (ò?÷4ð r>   rÊ   c                   óN   a € ] tR tRt o RtR tR tR tR tV 3R lR lt	R	t
V tR
# )ÚMultiWrapperi_  zw
A message receiver which delivers a single message to multiple other
message receivers.

@ivar objs: See L{__init__}.
c                ó   € Wn         R# )z’
@type objs: L{list} of L{IMessage <smtp.IMessage>} provider
@param objs: Message receivers to which the incoming message should be
    directed.
N©Úobjs)r;   rÞ   s   &&r   r<   ÚMultiWrapper.__init__h  s	   € ð Ž	r>   c                óN   € V P                    F  pVP                  V4       K  	  R# )zj
Pass a received line to the message receivers.

@type line: L{bytes}
@param line: A line of the message.
N)rÞ   r{   )r;   r   Úos   && r   r{   ÚMultiWrapper.lineReceivedp  s   € ð —”ˆAØ�N‰N˜4Ö ó r>   c                ó†   € \         P                  ! V P                   Uu. uF  qP                  4       NK  	  up4      # u upi )a  
Pass the end of message along to the message receivers.

@rtype: L{DeferredList <defer.DeferredList>} whose successful results
    are L{bytes} or L{None}
@return: A deferred list which triggers when all of the message
    receivers have finished handling their end of message.
)r   ÚDeferredListrÞ   r…   ©r;   rá   s   & r   r…   ÚMultiWrapper.eomReceivedz  s/   € ô ×!Ò!¸D¿IºIÓ"F¹I°q§=¡=¦?¹IÑ"FÓGÐGùÒ"Fs   Ÿ>c                óL   € V P                    F  pVP                  4        K  	  R# )zA
Inform the message receivers that the connection has been lost.
N)rÞ   rˆ   rå   s   & r   rˆ   ÚMultiWrapper.connectionLost…  s   € ð —”ˆAØ×ÑÖó r>   c                ó    <€ V ^8„  d   QhRS[ /# r[   r^   )r_   rT   s   "€r   r`   ÚMultiWrapper.__annotate__Œ  s   ø€ ÷ 9ñ 9™ñ 9r>   c                ó@   € R\        \        V P                  4      : R2# )z‘
Build a string representation of this L{MultiWrapper} instance.

@rtype: L{bytes}
@return: A string containing a list of the message receivers.
z<GroupWrapper rd   )r   r   rÞ   rA   s   &r   rf   ÚMultiWrapper.__str__Œ  s   € ð  ¤¤C¨¯©Ó 3Ñ6°aÐ8Ð8r>   rÝ   NrŽ   rS   s   @r   rÛ   rÛ   _  s)   ø‡ € ñòò!ò	Hò÷9ö 9r>   rÛ   c                   óV   a € ] tR tRt o Rt]tR tR tV 3R lR lt	R t
RR	 ltR
tV tR# )r.   i–  a0  
An alias which points to multiple destination aliases.

@type processAliasFactory: no-argument callable which returns
    L{ProcessAlias}
@ivar processAliasFactory: A factory for process aliases.

@type aliases: L{list} of L{AliasBase} which implements L{IAlias}
@ivar aliases: The destination aliases.
c           	     ó0  € \         P                  ! V .VO5!   . V n        V'       Ed¡   VP                  4       P	                  4       pVP                  R4      '       dw    \        VR,          4      pT;_uu_ 4        RP                  V Uu. uF  qUP	                  4       NK  	  up4      pRRR4       VP                  VP                  R4      4       K´  VP                  R4      '       d8   V P                  P                  V P                  ! VR,          .VO5!  4       EK  VP                  R4      '       dh   \        P                   P#                  V4      '       d   \        P                  ! R	4       EKW  V P                  P                  \%        V.VO5!  4       EK€  V P                  P                  \'        V.VO5!  4       EK©  R# u upi   + '       g   i     EL/; i  \         d'    \        P                  ! RTR,          : 24        EKô  i ; i)
a:  
Create a group of aliases.

Parse a list of alias strings and, for each, create an appropriate
alias object.

@type items: L{list} of L{bytes}
@param items: Aliases.

@type args: n-L{tuple} of (0) L{dict} mapping L{bytes} to L{IDomain}
    provider, (1) L{bytes}
@param args: Arguments for L{AliasBase.__init__}.
r   :é   NNr%   Nr   zInvalid filename in alias file Ú|Ú/z Directory delivery not supported)r7   r<   ÚaliasesÚpopr   r+   r'   Újoinr   r   r   r	   r   ÚappendÚprocessAliasFactoryÚosrÌ   Úisdirr�   rV   )r;   r-   rX   Úaddrr„   Úls   &&*   r   r<   ÚAliasGroup.__init__¥  sv  € ô 	×Ò˜4Ð' $Ô'ØˆŒßˆeØ—9‘9“;×$Ñ$Ó&ˆDØ�‰˜s×#Ò#ð2Ü˜T "�X›�A÷ šØ"Ÿx™x¹AÓ(>¹A°q¯©®¹AÑ(>Ó?˜÷ à—L‘L §¡¨C£Ö1Ø—‘ ×%Ò%Ø—‘×#Ñ# D×$<Ò$<¸TÀ"½XÐ$MÈÓ$M×NØ—‘ ×%Ò%Ü—7‘7—=‘= ×&Ò&Ü—G’GÐ>×?à—L‘L×'Ñ'¬	°$Ð(>¸Ó(>×?à—‘×#Ñ#¤L°Ð$=¸Ó$=×>ñ' ùò )?÷ Ÿ˜ûô %ô LÜ—G’GÐ=¸dÀ2½h¹\ÐJ×KÐKðLús0   ÁG$ Á;GÂGÂ#GÇGÇG!	Ç$,HÈHc                ó,   € \        V P                  4      # )zi
Return the number of aliases in the group.

@rtype: L{int}
@return: The number of aliases in the group.
)r   rò   rA   s   &r   Ú__len__ÚAliasGroup.__len__Ë  s   € ô �4—<‘<Ó Ð r>   c                ó    <€ V ^8„  d   QhRS[ /# r[   r^   )r_   rT   s   "€r   r`   ÚAliasGroup.__annotate__Ô  s   ø€ ÷ Iñ I™ñ Ir>   c                ób   € RRP                  \        \        V P                  4      4      ,          # )zˆ
Build a string representation of this L{AliasGroup} instance.

@rtype: L{bytes}
@return: A string containing the aliases in the group.
z<AliasGroup [%s]>z, )rô   r   r   rò   rA   s   &r   rf   ÚAliasGroup.__str__Ô  s#   € ð # d§i¡i´´C¸¿¹Ó0FÓ&GÕHÐHr>   c                óp   € \        V P                   Uu. uF  qP                  4       NK  	  up4      # u upi )zü
Create a message receiver for each alias and return a message receiver
which will pass on a message to each of those.

@rtype: L{MultiWrapper}
@return: A message receiver which passes a message on to message
    receivers for each alias in the group.
)rÛ   rò   rE   )r;   r4   s   & r   rE   Ú AliasGroup.createMessageReceiverÝ  s,   € ô ÀÇÂÓMÁ¸1×4Ñ4Ö6ÁÑMÓNÐNùÒMs   ”3Nc                ó¢   € Vf   / p. pV P                    F#  pVP                  VP                  W4      4       K%  	  \        \	        RV4      4      # )a)  
Map each of the aliases in the group to its ultimate destination.

@type aliasmap: L{dict} mapping L{bytes} to L{AliasBase}
@param aliasmap: A mapping of username to alias or group of aliases.

@type memo: L{None} or L{dict} of L{AliasBase}
@param memo: A record of the aliases already considered in the
    resolution process.  If provided, C{memo} is modified to include
    this alias.

@rtype: L{MultiWrapper}
@return: A message receiver which passes the message on to message
    receivers for the ultimate destination of each alias in the group.
N)rò   rõ   rI   rÛ   Úfilter)r;   rG   rH   Úrr4   s   &&&  r   rI   ÚAliasGroup.resolveè  sG   € ð  Š<ØˆDØˆØ—”ˆAØ�H‰H�Q—Y‘Y˜xÓ.Ö/ñ äœF 4¨›OÓ,Ð,r>   )rò   rK   )rL   rM   rN   rO   rP   rÊ   rö   r<   rý   rf   rE   rI   rQ   rR   rS   s   @r   r.   r.   –  s9   ø‡ € ñ	ð 'Ðò$?òL!÷Ið Iò	O÷-ò -r>   r.   rÂ   )rP   r÷   rs   Úzope.interfacer   Útwisted.internetr   r   r   Útwisted.mailr   Útwisted.mail.interfacesr   Útwisted.pythonr   r	   r    r5   r7   rV   ÚIMessagerq   r�   Ú	Exceptionr›   rž   ÚProcessProtocolrÄ   rÊ   rÛ   r.   rœ   r>   r   Ú<module>r     sU  ðñó 
Û å &ç 5Ñ 5Ý Ý *ß 'òUô6E÷P3,ñ 3,ñl ˆVÓôC�9ó Có ðCñL ˆT�]‰]Ó÷B1ð B1ó ðB1ñJ ˆVÓô#*�	ó #*ó ð#*ôL˜)ô ñ ˆT�]‰]Ó÷D6ð D6ó ðD6ôN'˜8×3Ñ3ô 'ñ, ˆVÓôQ�9ó Qó ðQñh ˆT�]‰]Ó÷39ð 39ó ð39ñl ˆVÓôf-�ó f-ó òf-r>   