+
    üÐjÕ( ã                  óæ  € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	H
t
 ^ RIH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
IHt ^ RIHtHtHt ^ RI H!t! ^ RI"H#t#H$t$ ^ RI%H&t&H't'H(t(H)t) ^ RI*H+t+ ^ RI,H-t- ^ RI.H/t/H0t0 ^ RI1H2t2 ^ RI3H4t4 ^ RI5H6t6H7t7H8t8 ^ RI9H:t: ^ RI;H<t<H=t=H>t> ^ RI?H@t@HAtAHBtB ^ RICHDtDHEtE  ^ RIFHGtGHHtH R tJ ! R R]E4      tK ! R R4      tL ! R R ]D4      tM ! R! R"]D4      tN ! R# R$]E4      tO]! ]2P                   ]2P¢                  ]2P¤                  4       ! R% R&4      4       tS]! ]2P                   ]2P¢                  4       ! R' R(4      4       tT ! R) R*]2Pª                  4      tV ! R+ R,]V]2P®                  4      tX ! R- R.]2P²                  4      tZ ! R/ R0]2P¶                  4      t\ ! R1 R24      t] ! R3 R4]]]E4      t^ ! R5 R6]D4      t_ ! R7 R8]]]E4      t`]! ]#4       ! R9 R:4      4       ta ! R; R<4      tb ! R= R>]]]E4      tc ! R? R@]E4      td ! RA RB]]]E4      te ! RC RD]E4      tf ! RE RF]2P¶                  4      tg ! RG RH]]]E4      th ! RI RJ4      ti ! RK RL]i4      tj ! RM RN]j]D4      tk ! RO RP]j]D4      tl ! RQ RR]i]D4      tm ! RS RT]i]D4      tn ! RU RV]i]D4      to ! RW RX]i]E4      tp ! RY RZ]i]D4      tq ! R[ R\]i]D4      tr ! R] R^]2P²                  4      ts]! ]2Pè                  4       ! R_ R`]>Pê                  4      4       tv ! Ra Rb]E]]4      tw ! Rc Rd]E4      tx ! Re Rf]E]]4      ty ! Rg Rh]]]E4      tz]! ]2Pö                  4       ! Ri Rj]E]]4      4       t| ! Rk Rl4      t}]! ]2Pü                  4       ! Rm Rn4      4       t]! ]2EP                   4       ! Ro Rp4      4       t� ! Rq Rr]E4      t‚]! ]G'       * Rs4      ]! ](EP                  ! ])R4      '       * Rt4       ! Ru Rv]]]E4      4       4       t„ ! Rw Rx]S4      t… ! Ry Rz]]]E4      t† ! R{ R|]E4      t‡ ! R} R~4      tˆ ! R R€]E4      t‰ ! R� R‚]E4      tŠ ! Rƒ R„4      t‹ ! R… R†]‹]D4      tŒ ! R‡ Rˆ]‹]E4      t� ! R‰ RŠ]D4      tŽR#   ]I d	    RtGRtH ELŸi ; i)‹z"
Test case for twisted.mail.imap4
)ÚannotationsN)ÚOrderedDict©ÚBytesIO)Úchain)ÚOptionalÚTypeÚAny)ÚskipIf)Úimplementer)ÚverifyClassÚverifyObject)Ú'InMemoryUsernamePasswordDatabaseDontUse)ÚCramMD5CredentialsÚIUsernameHashedPasswordÚIUsernamePassword©ÚUnauthorizedLogin)ÚIRealmÚPortal)ÚdeferÚerrorÚ
interfacesÚreactor)ÚDeferred)ÚClock)ÚStringTransportÚ StringTransportWithDisconnection)Úimap4)Ú
MessageSet)ÚIChallengeResponseÚIClientAuthenticationÚICloseableMailboxIMAP)Úloopback)ÚfailureÚlogÚutil)Ú	iterbytesÚnativeStringÚnetworkString)ÚSynchronousTestCaseÚTestCase)ÚClientTLSContextÚServerTLSContextc                ó   € V 3R  l# )c                ó   € V! 4       # ©N© )ÚresultÚfs   &&Ú=/usr/lib/python3/dist-packages/twisted/mail/test/test_imap.pyÚ<lambda>Ústrip.<locals>.<lambda>;   s   € ™qœsó    r1   )r3   s   &r4   Ústripr8   :   s   € ØÓ"Ð"r7   c                  ón   € ] tR t^>tRR.RR.RR.RR.R	R
..tR tR tR tR tR t	R t
R tR tR tRtR# )ÚIMAP4UTF7TestsúHello worldó   Hello worldzHello & worlds   Hello &- worldõ   HelloÃ¿worldó   Hello&AP8-worldu   Ã¿Ã¾Ã½Ã¼s   &AP8A,gD9APw-u   ~peter/mail/æ—¥æœ¬èªž/å�°åŒ—s   ~peter/mail/&ZeVnLIqe-/&U,BTFw-c                ól   € RpV P                  VP                  RR4      VP                  R4      4       R# )z’
Specifying an error policy to C{unicode.encode} with the
I{imap4-utf-7} codec should produce the same result as not
specifying the error policy.
r;   úimap4-utf-7ÚstrictN©ÚassertEqualÚencode©ÚselfÚtexts   & r4   Útest_encodeWithErrorsÚ$IMAP4UTF7Tests.test_encodeWithErrorsJ   s0   € ð ˆØ×ÑØ�K‰K˜ xÓ0°$·+±+¸mÓ2Lö	
r7   c                ól   € RpV P                  VP                  RR4      VP                  R4      4       R# )z?
Similar to L{test_encodeWithErrors}, but for C{bytes.decode}.
r<   r@   rA   N©rC   Údecode©rF   Úbytess   & r4   Útest_decodeWithErrorsÚ$IMAP4UTF7Tests.test_decodeWithErrorsU   s0   € ð ˆØ×ÑØ�L‰L˜¨Ó1°5·<±<ÀÓ3Nö	
r7   c                óL   € RpV P                  VP                  R4      R4       R# )zi
Unicode strings that contain an ampersand (C{&}) can be
encoded to bytes with the I{imap4-utf-7} codec.
u
   &Hello&Â½&r@   s   &-Hello&-&AL0-&-NrB   rE   s   & r4   Útest_encodeAmpersandÚ#IMAP4UTF7Tests.test_encodeAmpersand^   s&   € ð
 6ˆØ×ÑØ�K‰K˜Ó&Øö	
r7   c                óH   € V P                  RP                  R4      R4       R# )zr
An I{imap4-utf-7} encoded string that does not shift back to
ASCII (i.e., it lacks a final C{-}) can be decoded.
s   &AL0r@   ô   Â½NrK   ©rF   s   &r4   Ú!test_decodeWithoutFinalASCIIShiftÚ0IMAP4UTF7Tests.test_decodeWithoutFinalASCIIShifti   s!   € ð
 	×ÑØ�N‰N˜=Ó)Ø*ö	
r7   c                ó�   € \         P                  ! R4      ! \        R4      4      pV P                  VP	                  4       R4       R# )zT
C{codecs.getreader('imap4-utf-7')} returns the I{imap4-utf-7} stream
reader class.
r@   r>   r=   N)ÚcodecsÚ	getreaderr   rC   Úread)rF   Úreaders   & r4   Útest_getreaderÚIMAP4UTF7Tests.test_getreaders   s6   € ô
 ×!Ò! -Ô0´Ð9KÓ1LÓMˆØ×Ñ˜Ÿ™›Ð(8Ö9r7   c                ó´   € \        4       p\        P                  ! R4      ! V4      pVP                  R4       V P	                  VP                  4       R4       R# )zT
C{codecs.getwriter('imap4-utf-7')} returns the I{imap4-utf-7} stream
writer class.
r@   r=   r>   N)r   rZ   Ú	getwriterÚwriterC   Úgetvalue)rF   ÚoutputÚwriters   &  r4   Útest_getwriterÚIMAP4UTF7Tests.test_getwriter{   sE   € ô
 “ˆÜ×!Ò! -Ô0°Ó8ˆØ�‰Ð%Ô&Ø×Ñ˜Ÿ™Ó*Ð,>Ö?r7   c                ór   € V P                    F&  w  rV P                  VP                  R4      V4       K(  	  R# )z„
The I{imap4-utf-7} can be used to encode a unicode string into a byte
string according to the IMAP4 modified UTF-7 encoding rules.
r@   N)ÚtestsrC   rD   ©rF   Úinputrd   s   &  r4   Útest_encodeÚIMAP4UTF7Tests.test_encode…   s-   € ð
 "ŸZœZ‰MˆEØ×Ñ˜UŸ\™\¨-Ó8¸&ÖAó (r7   c                óp   € V P                    F%  w  rV P                  WP                  R4      4       K'  	  R# )z„
The I{imap4-utf-7} can be used to decode a byte string into a unicode
string according to the IMAP4 modified UTF-7 encoding rules.
r@   N)ri   rC   rL   rj   s   &  r4   Útest_decodeÚIMAP4UTF7Tests.test_decode�   s+   € ð
 "ŸZœZ‰MˆEØ×Ñ˜U§M¡M°-Ó$@ÖAó (r7   c                ó²  € \        \        ^ ^&4      \        ^'^4      4       Fp  p\        V4      P                  4       pV P	                  V\        V4      P                  R4      4       V P	                  \        V4      VP                  R4      4       Kr  	  V P	                  RP                  R4      R4       V P	                  RP                  R4      R4       R# )z�
The IMAP4 modified UTF-7 implementation encodes all printable
characters which are in ASCII using the corresponding ASCII byte.
r@   Ú&s   &-N)r   ÚrangeÚchrrD   rC   rL   )rF   ÚoÚcharbytes   &  r4   Útest_printableSingletonsÚ'IMAP4UTF7Tests.test_printableSingletons•   s    € ô ”u˜T 4Ó(¬%°°dÓ*;Ö<ˆAÜ˜1“v—}‘}“ˆHØ×Ñ˜X¤s¨1£v§}¡}°]Ó'CÔDØ×ÑœS ›V X§_¡_°]Ó%CÖDñ =ð 	×Ñ˜Ÿ™ MÓ2°EÔ:Ø×Ñ˜Ÿ™ mÓ4°cÖ:r7   r1   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__ri   rH   rO   rR   rW   r^   rf   rl   ro   rw   Ú__static_attributes__r1   r7   r4   r:   r:   >   sg   † à	˜Ð'Ø	Ð+Ð,Ø	Ð-Ð.Ø	Ð-Ð.à9Ø.ð	
ð	€Eò	
ò
ò	
ò
ò:ò@òBòBö;r7   r:   c                  ó.   € ] tR t^£tR tR tR tR tRtR# )ÚBufferingConsumerc                	ó   € . V n         R # r0   )ÚbufferrV   s   &r4   Ú__init__ÚBufferingConsumer.__init__¤   s	   € ØˆŽr7   c                	ó˜   € V P                   P                  V4       V P                  '       d   V P                  P                  4        R # R # r0   )r�   ÚappendÚconsumerÚresumeProducingrM   s   &&r4   rb   ÚBufferingConsumer.write§   s2   € Ø�‰×Ñ˜5Ô!Ø�=�=ˆ=Ø�M‰M×)Ñ)Ö+ñ r7   c                	óF   € Wn         V P                   P                  4        R # r0   )r†   r‡   )rF   r†   Ú	streamings   &&&r4   ÚregisterProducerÚ"BufferingConsumer.registerProducer¬   s   € Ø ŒØ�‰×%Ñ%Ö'r7   c                	ó   € R V n         R # r0   )r†   rV   s   &r4   ÚunregisterProducerÚ$BufferingConsumer.unregisterProducer°   s	   € ØˆŽr7   )r�   r†   N)	ry   rz   r{   r|   r‚   rb   r‹   rŽ   r}   r1   r7   r4   r   r   £   s   † òò,ò
(ör7   r   c                  ó4   € ] tR t^´tR tR tR tR tR tRt	R# )ÚMessageProducerTestsc                	ó   a aaa€ R o\        4       pRVR&   RVR&   RVR&   RVR&   \        VRR	S^{R	4      p\        4       o\        P                  ! V4      oSP                  S4      pVVVV 3R
 lpVP                  V4      # )s   This is body text.  Rar.úsender@hostÚfromúrecipient@domainÚtoúbooga booga booÚsubjectú
text/plainúcontent-typeNc                ó�   <€ SP                  V S4       SP                  R P                  SP                  4      RS,           4       R# )r7   sf   {119}
From: sender@host
To: recipient@domain
Subject: booga booga boo
Content-Type: text/plain

N)ÚassertIdenticalrC   Újoinr�   )r2   ÚbodyÚcÚprF   s   &€€€€r4   Ú
cbProducedÚ7MessageProducerTests.testSinglePart.<locals>.cbProducedÃ   s@   ø€ Ø× Ñ  ¨Ô+Ø×ÑØ—‘˜Ÿ™Ó"ðð
 õör7   r1   ©r   ÚFakeyMessager   r   ÚMessageProducerÚbeginProducingÚaddCallback)rF   ÚheadersÚmsgÚdr¡   rž   rŸ   r    s   f    @@@r4   ÚtestSinglePartÚ#MessageProducerTests.testSinglePartµ   sŒ   û€ Ø*ˆÜ“-ˆØ'ˆ�‰Ø*ˆ�‰Ø.ˆ�	ÑØ".ˆ�Ñä˜7 B¨¨d°C¸Ó>ˆäÓˆÜ×!Ò! #Ó&ˆØ×Ñ˜QÓˆ÷
	ð 
	ð �}‰}˜ZÓ(Ð(r7   c                	óJ  a aaa	€ R pRo\        4       pRVR&   RVR&   RVR&   RVR	&   \        4       pR
VR&   RVR	&   \        VRRV^{\        VRRSRR4      .4      p\        4       o\        P                  ! V4      o	S	P                  S4      pVVV	V 3R lpVP                  V4      # )r7   ó&   Contained body message text.  Squarge.r“   r”   r•   r–   r—   r˜   ú%multipart/alternative; boundary="xyz"rš   úthis is subject textr™   Nc                óž   <€ SP                  V S4       SP                  R P                  SP                  4      RS,           R,           4       R# )r7   sÅ   {239}
From: sender@host
To: recipient@domain
Subject: booga booga boo
Content-Type: multipart/alternative; boundary="xyz"


--xyz
Subject: this is subject text
Content-Type: text/plain

ó   
--xyz--
N©ÚfailUnlessIdenticalrC   r�   r�   ©r2   rŸ   Ú	innerBodyr    rF   s   &€€€€r4   r¡   Ú<MessageProducerTests.testSingleMultiPart.<locals>.cbProducedê   sJ   ø€ Ø×$Ñ$ V¨QÔ/à×ÑØ—‘˜Ÿ™Ó"ð
ð $õ
$ð '9õ
9ör7   r1   r£   ©
rF   Ú	outerBodyr¨   ÚinnerHeadersr©   rª   r¡   rŸ   r¶   r    s
   f      @@@r4   ÚtestSingleMultiPartÚ(MessageProducerTests.testSingleMultiPartÑ   sÈ   û€ Øˆ	Ø=ˆ	Ü“-ˆØ'ˆ�‰Ø*ˆ�‰Ø.ˆ�	ÑØ"Iˆ�Ñä"“}ˆØ"8ˆ�YÑØ'3ˆ�^Ñ$ÜØØØØØÜ˜,¨¨D°)¸TÀ4ÓHÐIó
ˆô ÓˆÜ×!Ò! #Ó&ˆØ×Ñ˜QÓˆ÷	ð 	ð$ �}‰}˜ZÓ(Ð(r7   c                	ó˜  a aa	a
a€ R pRo	Ro
\        4       pRVR&   RVR&   RVR&   R	VR
&   \        4       pRVR&   RVR
&   \        4       pRVR&   RVR
&   \        VRRV^{\        VRRS	RR4      \        VRRS
RR4      .4      p\        4       o\        P                  ! V4      oSP                  S4      pVV	V
VV 3R lpVP                  V4      # )r7   r®   ó.   Secondary <i>message</i> text of squarge body.r“   r”   r•   r–   r—   r˜   r¯   rš   r°   r™   ú<b>this is subject</b>ú	text/htmlNc                óº   <€ SP                  V S4       SP                  R P                  SP                  4      RS,           R,           S,           R,           4       R# )r7   sÅ   {354}
From: sender@host
To: recipient@domain
Subject: booga booga boo
Content-Type: multipart/alternative; boundary="xyz"


--xyz
Subject: this is subject text
Content-Type: text/plain

sE   
--xyz
Subject: <b>this is subject</b>
Content-Type: text/html

r²   Nr³   )r2   rŸ   Ú
innerBody1Ú
innerBody2r    rF   s   &€€€€€r4   r¡   Ú>MessageProducerTests.testMultipleMultiPart.<locals>.cbProduced  s^   ø€ Ø×$Ñ$ V¨QÔ/à×ÑØ—‘˜Ÿ™Ó"ð
ð %õ
%ð(õð %õ%ð (:õ:ör7   r1   r£   )rF   r¹   r¨   rº   ÚinnerHeaders2r©   rª   r¡   rŸ   rÂ   rÃ   r    s   f       @@@@r4   ÚtestMultipleMultiPartÚ*MessageProducerTests.testMultipleMultiPartþ   sü   ü€ Øˆ	Ø>ˆ
ØFˆ
Ü“-ˆØ'ˆ�‰Ø*ˆ�‰Ø.ˆ�	ÑØ"Iˆ�ÑÜ"“}ˆØ"8ˆ�YÑØ'3ˆ�^Ñ$Ü#›ˆØ#;ˆ�iÑ Ø(3ˆ�nÑ%ÜØØØØØä˜\¨2¨t°ZÀÀtÓLÜ˜]¨B°°jÀ$ÈÓMðó

ˆô ÓˆÜ×!Ò! #Ó&ˆØ×Ñ˜QÓˆ÷	ñ 	ð* �}‰}˜ZÓ(Ð(r7   c                óZ  a aaa	€ RpRo\        4       pRVR&   RVR&   RVR&   R	VR
&   \        4       pRVR&   RVR
&   \        VRRV^{\        VRRSRR4      .4      p\        4       o\        P                  ! V4      o	R S	n        S	P                  S4      pVVV	V 3R lpVP                  V4      # )z.
A boundary is generated if none is provided.
r7   r®   r“   r”   r•   r–   r—   r˜   úmultipart/alternativerš   r°   r™   Nc                 ó.   € \         P                  ! R 4      # )z$aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa)ÚuuidÚUUIDr1   r7   r4   r5   Ú?MessageProducerTests.test_multiPartNoBoundary.<locals>.<lambda>N  s   € œ4Ÿ9š9Ð%KÔLr7   c                óž   <€ SP                  V S4       SP                  R P                  SP                  4      RS,           R,           4       R# )r7   s	  {341}
From: sender@host
To: recipient@domain
Subject: booga booga boo
Content-Type: multipart/alternative; boundary="----=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"


------=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Subject: this is subject text
Content-Type: text/plain

s-   
------=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa--
Nr³   rµ   s   &€€€€r4   r¡   ÚAMessageProducerTests.test_multiPartNoBoundary.<locals>.cbProducedR  sL   ø€ Ø×$Ñ$ V¨QÔ/Ø×ÑØ—‘˜Ÿ™Ó"ðð õð GõGör7   r1   )r   r¤   r   r   r¥   Ú_uuid4r¦   r§   r¸   s
   f      @@@r4   Útest_multiPartNoBoundaryÚ-MessageProducerTests.test_multiPartNoBoundary4  sÑ   û€ ð ˆ	Ø=ˆ	Ü“-ˆØ'ˆ�‰Ø*ˆ�‰Ø.ˆ�	ÑØ"9ˆ�Ñä"“}ˆØ"8ˆ�YÑØ'3ˆ�^Ñ$ÜØØØØØÜ˜,¨¨D°)¸TÀ4ÓHÐIó
ˆô ÓˆÜ×!Ò! #Ó&ˆÙLˆŒà×Ñ˜QÓˆ÷	ð 	ð* �}‰}˜ZÓ(Ð(r7   c                óJ  a aaa	€ RpRo\        4       pRVR&   RVR&   RVR&   R	VR
&   \        4       pRVR&   RVR
&   \        VRRV^{\        VRRSRR4      .4      p\        4       o\        P                  ! V4      o	S	P                  S4      pVVV	V 3R lpVP                  V4      # )z.
A boundary without does not have them added.
r7   r®   r“   r”   r•   r–   r—   r˜   z#multipart/alternative; boundary=xyzrš   r°   r™   Nc                óž   <€ SP                  V S4       SP                  R P                  SP                  4      RS,           R,           4       R# )r7   sÃ   {237}
From: sender@host
To: recipient@domain
Subject: booga booga boo
Content-Type: multipart/alternative; boundary=xyz


--xyz
Subject: this is subject text
Content-Type: text/plain

r²   Nr³   rµ   s   &€€€€r4   r¡   Ú?MessageProducerTests.test_multiPartNoQuotes.<locals>.cbProduced…  sJ   ø€ Ø×$Ñ$ V¨QÔ/Ø×ÑØ—‘˜Ÿ™Ó"ðð $õ$ð '9õ9ör7   r1   r£   r¸   s
   f      @@@r4   Útest_multiPartNoQuotesÚ+MessageProducerTests.test_multiPartNoQuotesi  sÊ   û€ ð ˆ	Ø=ˆ	Ü“-ˆØ'ˆ�‰Ø*ˆ�‰Ø.ˆ�	ÑØ"Gˆ�Ñä"“}ˆØ"8ˆ�YÑØ'3ˆ�^Ñ$ÜØØØØØÜ˜,¨¨D°)¸TÀ4ÓHÐIó
ˆô ÓˆÜ×!Ò! #Ó&ˆØ×Ñ˜QÓˆ÷	ð 	ð& �}‰}˜ZÓ(Ð(r7   r1   N)
ry   rz   r{   r|   r«   r»   rÆ   rÑ   rÖ   r}   r1   r7   r4   r‘   r‘   ´   s   † ò)ò8+)òZ4)òl3)öj/)r7   r‘   c                  ó†   € ] tR tRtRtR tR tR tR tR t	R t
R	 tR
 tR tR tR tR tR tR tR tR tR tR tRtR# )ÚMessageSetTestsi›  z
Tests for L{MessageSet}.
c                ó8  € \        4       p\        4       pV P                  W4       V P                  VR4       V^,           pV P                  \        V4      ^4       V P                  \	        V4      ^.4       VR,           pV P                  \        V4      ^4       V P                  \	        V4      . RO4       VR,           pV P                  W4       V P                  \	        W,           4      . RO4       VP                  ^4       V P                  \        V4      ^4       V P                  \	        V4      . RO4       V P                  W4       VP                  ^^4       V P                  \        V4      ^4       V P                  \	        V4      . RO4       R# )a¼  
Test the following properties of L{MessageSet} addition and
equality:

    1. Two empty L{MessageSet}s are equal to each other;

    2. A L{MessageSet} is not equal to any other object;

    2. Adding a L{MessageSet} and another L{MessageSet} or an
       L{int} representing a single message or a sequence of
       L{int}s representing a sequence of message numbers
       produces a new L{MessageSet} that:

    3. Has a length equal to the number of messages within
       each sequence of message numbers;

    4. Yields each message number in ascending order when
       iterated over;

    6. L{MessageSet.add} with a single message or a start and
       end message satisfies 3 and 4 above.
Nr1   ©é   é   ©rÜ   é   rÝ   )rÜ   rß   rÝ   é   )rÜ   rß   rÝ   rà   é   é   é   )r   rC   ÚassertNotEqualÚlenÚlistÚadd)rF   Úm1Úm2s   &  r4   Ú!test_equalityIterationAndAdditionÚ1MessageSetTests.test_equalityIterationAndAddition   s8  € ô. ‹\ˆÜ‹\ˆà×Ñ˜Ô Ø×Ñ˜B Ô#à�!�VˆØ×Ñœ˜R› !Ô$Ø×Ñœ˜b› A 3Ô'à�&�[ˆØ×Ñœ˜R› !Ô$Ø×Ñœ˜b›¢9Ô-à�&�[ˆØ×Ñ˜Ô Ø×Ñœ˜b�g›ª	Ô2à
�‰ˆqŒ	Ø×Ñœ˜R› !Ô$Ø×Ñœ˜b›¢<Ô0à×Ñ˜BÔ#à
�‰ˆq�!ŒØ×Ñœ˜R› !Ô$Ø×Ñœ˜b›Ò#8Ö9r7   c                óP   € V P                  \        \        \        ^R4      4       R# )zm
A L{MessageSet} that has a range that ends with L{None} raises
a L{TypeError} when its length is requested.
N)ÚassertRaisesÚ	TypeErrorrå   r   rV   s   &r4   Útest_lengthWithWildcardRangeÚ,MessageSetTests.test_lengthWithWildcardRangeÓ  s   € ð
 	×Ñœ)¤S¬*°Q¸Ó*=Ö>r7   c                ó0   € \        \        ^^4      4       R# )z4
L{MessageSet.__repr__} does not raise an exception
N)Úreprr   rV   s   &r4   Útest_reprSanityÚMessageSetTests.test_reprSanityÚ  s   € ô 	ŒZ˜˜1ÓÖr7   c                ó  € \         P                  ! R4      \         P                  ! R4      \         P                  ! R^4      \         P                  ! R^4      .p. ROp\        W4       F   w  r4V P                  \	        V4      V4       K"  	  R# )zŒ
In a L{MessageSet}, in the presence of wildcards, if the
highest message id is known, the wildcard should get replaced
by that high value.
ó   *ó   1:*s   3:*s   *:2N)Ú*ú1:*z3:6z2:6©r   ÚparseIdListÚziprC   Ústr©rF   ÚinputsÚoutputsÚiru   s   &    r4   Ú&test_stringRepresentationWithWildcardsÚ6MessageSetTests.test_stringRepresentationWithWildcardsà  su   € ô ×Ò˜dÓ#Ü×Ò˜fÓ%Ü×Ò˜f aÓ(Ü×Ò˜f aÓ(ð	
ˆò
ˆô ˜Ö(‰DˆAØ×ÑœS ›V QÖ'ó )r7   c                óÄ   € \         P                  ! R4      \         P                  ! R4      .pRR.p\        W4       F   w  r4V P                  \	        V4      V4       K"  	  R# )zÏ
In a L{MessageSet}, inverting the high and low numbers in a
range doesn't affect the meaning of the range.  For example,
3:2 displays just like 2:3, because according to the RFC they
have the same meaning.
ó   2:3s   3:2ú2:3Nrú   rþ   s   &    r4   Ú&test_stringRepresentationWithInversionÚ6MessageSetTests.test_stringRepresentationWithInversion÷  s]   € ô ×Ò˜fÓ%Ü×Ò˜fÓ%ð
ˆð Øð
ˆô
 ˜Ö(‰DˆAØ×ÑœS ›V QÖ'ó )r7   c                óÀ   € \        ^4      pV P                  \        V4      R4       V P                  \        V4      ^4       V P                  \	        V4      ^.4       R# )zÖ
Creating a L{MessageSet} with a single message number adds
only that message to the L{MessageSet}; its serialized form
includes only that message number, its length is one, and it
yields only that message number.
Ú1N©r   rC   rý   rå   ræ   ©rF   Úms   & r4   Ú"test_createWithSingleMessageNumberÚ2MessageSetTests.test_createWithSingleMessageNumber  sK   € ô �q‹MˆØ×Ñœ˜Q› Ô%Ø×Ñœ˜Q› Ô#Ø×Ñœ˜a› 1 #Ö&r7   c                óÄ   € \        ^^
4      pV P                  \        V4      R4       V P                  \        V4      ^
4       V P                  \	        V4      . RO4       R# )a  
Creating a L{MessageSet} with both a start and end message
number adds the sequence between to the L{MessageSet}; its
serialized form consists that range, its length is the length
of the sequence, and it yields the message numbers inclusively
between the start and end.
z1:10N)
rÜ   rß   rÝ   é   rà   rá   râ   rã   é	   é
   r  r  s   & r4   Útest_createWithSequenceÚ'MessageSetTests.test_createWithSequence  sM   € ô �q˜"ÓˆØ×Ñœ˜Q› Ô(Ø×Ñœ˜Q› Ô$Ø×Ñœ˜a›Ò"AÖBr7   c                ó¾   € \        R4      pV P                  \        V4      R4       V P                  \        V4      ^4       V P	                  \
        \        V4       R# )z×
Creating a L{MessageSet} with a single L{None}, representing
C{*}, adds C{*} to the range; its serialized form includes
only C{*}, its length is one, but it cannot be iterated over
because its endpoint is unknown.
Nrø   )r   rC   rý   rå   rí   rî   ræ   r  s   & r4   Útest_createWithSingleWildcardÚ-MessageSetTests.test_createWithSingleWildcard$  sH   € ô �tÓˆØ×Ñœ˜Q› Ô%Ø×Ñœ˜Q› Ô#Ø×Ñœ)¤T¨1Ö-r7   c                óÂ   € \        R4      p^
Vn        V P                  \        V4      ^
.4       \        ^R4      p^Vn        V P                  \        V4      . RO4       R# )zw
Setting L{MessageSet.last} replaces L{None}, representing
C{*}, with that number, making that L{MessageSet} iterable.
NrÞ   )r   ÚlastrC   ræ   )rF   ÚsingleMessageReplacedÚrangeReplaceds   &  r4   Útest_setLastSingleWildcardÚ*MessageSetTests.test_setLastSingleWildcard0  sY   € ô
 !+¨4Ó 0ÐØ%'ÐÔ"Ø×ÑœÐ3Ó4°r°dÔ;ä" 1 dÓ+ˆØˆÔØ×Ñœ˜mÓ,ªiÖ8r7   c                óŠ   € \        ^R4      pVP                  ^R4       ^Vn        V P                  \	        V4      . RO4       R# )z<
Setting L{MessageSet.last} replaces L{None} in all ranges.
N©rÜ   rß   rÝ   r  rà   )r   rç   r  rC   ræ   r  s   & r4   Útest_setLastWithWildcardRangeÚ-MessageSetTests.test_setLastWithWildcardRange=  s8   € ô �q˜$ÓˆØ	�‰ˆa�ŒØˆŒØ×Ñœ˜a›¢/Ö2r7   c                ó®   € \        ^R4      p^Vn        V P                  \        4      ;_uu_ 4        ^Vn        RRR4       R#   + '       g   i     R# ; i)z)
L{MessageSet.last} cannot be set twice.
N)r   r  rí   Ú
ValueErrorr  s   & r4   Útest_setLastTwiceFailsÚ&MessageSetTests.test_setLastTwiceFailsF  s>   € ô �q˜$ÓˆØˆŒØ×Ñœz×*Õ*ØˆAŒF÷ +×*×*Ò*ús   ±AÁA	c                ó,  € \        ^4      p^Vn        VP                  R4       V P                  \	        V4      ^^.4       V P                  \	        VR,           4      . RO4       VP                  ^R4       V P                  \	        V4      . RO4       R# )zâ
Adding a L{None}, representing C{*}, or a sequence that
includes L{None} to a L{MessageSet} whose
L{last<MessageSet.last>} property has been set replaces all
occurrences of L{None} with the value of
L{last<MessageSet.last>}.
N)Nrà   )rÜ   r  rà   )rÜ   rÝ   r  )r   r  rç   rC   ræ   )rF   ÚhasLasts   & r4   Útest_lastOverridesNoneInAddÚ+MessageSetTests.test_lastOverridesNoneInAddO  st   € ô ˜Q“-ˆØˆŒà�‰�DÔØ×Ñœ˜g›¨¨A¨Ô/à×Ñœ˜g¨	Õ1Ó2²IÔ>à�‰�A�tÔØ×Ñœ˜g›ª	Ö2r7   c                ód   € \        ^R4      p^Vn        V P                  VP                  ^4       R# )z6
Accessing L{MessageSet.last} returns the last value.
N)r   r  rC   r  s   & r4   Útest_getLastÚMessageSetTests.test_getLastb  s+   € ô �q˜$ÓˆØˆŒØ×Ñ˜Ÿ™ Ö#r7   c                ó@  € \        4       pVP                  ^4       V P                  \        V4      ^.4       \        4       pVP                  R4       V P                  \	        V4      R4       \        4       pVP                  R4       V P                  \        V4      . RO4       \        4       pVP                  R4       V P                  \	        V4      R4       \        4       pVP                  \        ^^4      4       V P                  \        V4      . RO4       R# )zË
L{MessageSet.extend} accepts as its arugment an L{int} or
L{None}, or a sequence L{int}s or L{None}s of length two, or
another L{MessageSet}, combining its argument with its
instance's existing ranges.
Nrø   rÛ   rÞ   ©NN)r   ÚextendrC   ræ   rý   )rF   ÚextendWithIntÚextendWithNoneÚextendWithSequenceOfIntsÚextendWithSequenceOfNonesÚextendWithMessageSets   &     r4   Útest_extendÚMessageSetTests.test_extendj  så   € ô #›ˆØ×Ñ˜QÔØ×Ñœ˜mÓ,¨q¨cÔ2ä#›ˆØ×Ñ˜dÔ#Ø×Ñœ˜^Ó,¨cÔ2ä#-£<Ð Ø ×'Ñ'¨Ô/Ø×ÑœÐ6Ó7ºÔCä$.£LÐ!Ø!×(Ñ(¨Ô6Ø×ÑœÐ6Ó7¸Ô=ä)›|ÐØ×#Ñ#¤J¨q°!Ó$4Ô5Ø×ÑœÐ2Ó3²YÖ?r7   c                óâ  € \        ^^4      p\        ^^4      \        ^^4      ,           pV P                  ^V4       V P                  ^V4       VR,           pV P                  \        4      ;_uu_ 4        ^V9    RRR4       VR,           pVP                  ^R4       V P                  \        4      ;_uu_ 4        ^V9    RRR4       R#   + '       g   i     LX; i  + '       g   i     R# ; i)zˆ
A L{MessageSet} contains a number if the number falls within
one of its ranges, and raises L{TypeError} if any range
contains L{None}.
N)r  é   )r   ÚassertInÚassertNotInrí   rî   rç   )rF   ÚhasFiveÚdoesNotHaveFiveÚhasFiveButHasNoneÚhasFiveButHasNoneInSequences   &    r4   Útest_containsÚMessageSetTests.test_contains…  sÃ   € ô ˜Q Ó"ˆÜ$ Q¨Ó*¬Z¸¸1Ó-=Õ=ˆà�‰�a˜Ô!Ø×Ñ˜˜OÔ,à# d�NÐØ×Ñœy×)Õ)ØÐ"Ò"÷ *ð '.°Õ&8Ð#Ø#×'Ñ'¨¨4Ô0Ø×Ñœy×)Õ)ØÐ,Ò,÷ *Ñ)÷ *×)ú÷
 *×)Ð)ús   Á4C
Â:CÃ
C	ÃC.	c                ó.  € \        ^^4      p\        ^^4      pW,           pV\        ^^4      ,           pV P                  \        VR,           4      . RO4       V P                  \        VR,           4      . RO4       V P                  \        VR,           4      . RO4       V P                  \        VR,           4      . R	O4       V P                  \        VR,           4      . R
O4       V P                  \        V\        ^4      ,           4      . RO4       R# )z¶
Adding a sequence of message numbers to a L{MessageSet} that
begins or ends immediately before or after an existing
sequence in that L{MessageSet}, or overlaps one, merges the two.
N)rß   r  )rÜ   rß   rÝ   r  )rÝ   rà   r   )rà   râ   )rà   rá   râ   rã   )r  rá   )r  rà   rá   râ   rã   )rÜ   rß   rÝ   r  rà   rá   râ   rã   )rÜ   rß   rÝ   r  rà   rá   râ   )r   rC   ræ   )rF   Ú
mergeAfterÚmergeBeforeÚmergeBetweenSequenceÚmergeBetweenNumbers   &    r4   Útest_rangesMergedÚ!MessageSetTests.test_rangesMergedš  sÞ   € ô    1Ó%ˆ
Ü   AÓ&ˆà)Õ7ÐØ'¬*°Q¸Ó*:Õ:Ðà×Ñœ˜j¨6Õ1Ó2²LÔAØ×Ñœ˜j¨6Õ1Ó2²OÔDà×Ñœ˜k¨FÕ2Ó3²\ÔBØ×Ñœ˜k¨FÕ2Ó3²_ÔEà×ÑœÐ2°VÕ;Ó<Ò>VÔWØ×ÑÜÐ#¤j°£mÕ3Ó4Ò6Kö	
r7   c                ó   € V P                  \        ^^4      \        ^^4      4       V P                  \        \        ^^4      4      . RO4       \        RR4      pRVn        V P                  \        V4      RR.4       R# )aŒ  
Test the C{seq-range} examples from Section 9, "Formal Syntax"
of RFC 3501::

    Example: 2:4 and 4:2 are equivalent and indicate values
             2, 3, and 4.

    Example: a unique identifier sequence range of
             3291:* includes the UID of the last message in
             the mailbox, even if that value is less than 3291.

@see: U{http://tools.ietf.org/html/rfc3501#section-9}
iÛ  NiÚ  ©rß   rÝ   r  )rC   r   ræ   r  r  s   & r4   Útest_seq_rangeExamplesÚ&MessageSetTests.test_seq_rangeExamples²  si   € ð 	×Ñœ A qÓ)¬:°a¸Ó+;Ô<Ø×Ñœœj¨¨AÓ.Ó/²Ô;ä�t˜TÓ"ˆØˆŒØ×Ñœ˜a› 4¨ ,Ö/r7   c                óv  € \        ^4      \        ^^4      ,           \        ^	4      ,           \        ^R4      ,           p^Vn        V P                  RP                  R V 4       4      R4       \        R^4      \        ^^4      ,           p^
Vn        V P                  RP                  R V 4       4      R4       R# )aI  
Test the C{sequence-set} examples from Section 9, "Formal
Syntax" of RFC 3501.  In particular, L{MessageSet} reorders
and coalesces overlaps::

    Example: a message sequence number set of
             2,4:7,9,12:* for a mailbox with 15 messages is
             equivalent to 2,4,5,6,7,9,12,13,14,15

    Example: a message sequence number set of *:4,5:7
             for a mailbox with 10 messages is equivalent to
             10,9,8,7,6,5,4,5,6,7 and MAY be reordered and
             overlap coalesced to be 4,5,6,7,8,9,10.

@see: U{http://tools.ietf.org/html/rfc3501#section-9}
NÚ,c              3  ó8   "  € T F  p\        V4      x € K  	  R # 5ir0   ©rý   ©Ú.0r  s   & r4   Ú	<genexpr>Ú<MessageSetTests.test_sequence_setExamples.<locals>.<genexpr>Þ  s   é € Ð9Ñ%8 ”S˜—V�VÓ%8ùó   ‚z2,4,5,6,7,9,12,13,14,15c              3  ó8   "  € T F  p\        V4      x € K  	  R # 5ir0   rP  rQ  s   & r4   rS  rT  ã  s   é € Ð!B±/¨Q¤# a§& &³/ùrU  z4,5,6,7,8,9,10)r   r  rC   r�   )rF   ÚfromFifteenMessagesÚfromTenMessagess   &  r4   Útest_sequence_setExamplesÚ)MessageSetTests.test_sequence_setExamplesÈ  s¢   € ô$ �q‹MœJ q¨!Ó,Õ,¬z¸!«}Õ<¼zÈ"ÈdÓ?SÕSð 	ð $&ÐÔ Ø×ÑØ�H‰HÑ9Ñ%8Ó9Ó9Ð;Tô	
ô % T¨1Ó-´
¸1¸aÓ0@Õ@ˆØ!ˆÔØ×Ñ˜Ÿ™Ñ!B±/Ó!BÓBÐDTÖUr7   r1   N)ry   rz   r{   r|   Ú__doc__rê   rï   ró   r  r  r  r  r  r  r!  r%  r)  r,  r6  r@  rG  rK  rY  r}   r1   r7   r4   rÙ   rÙ   ›  se   † ñò1:òf?òò(ò.(ò(
'òCò
.ò9ò3òò3ò&$ò@ò6-ò*
ò00ö,Vr7   rÙ   c                  ó  € ] tR tRtRtR tR tR tR tR t	R t
R	 tR
 tR tR tR tR tR tR tR tR tR tR tR tR tR tR tR tR tR tR tR tR t R t!R  t"R! t#R" t$R# t%R$ t&R% t'R& t(R' t)R( t*R) t+R* t,R+ t-R,t.R-# ).ÚIMAP4HelperTestsiæ  z9
Tests for various helper utilities in the IMAP4 module.
c                óJ   € \        \        P                  ! RR.R4      4       R# )z9
L{imap4.Command}'s C{repr} does not raise an exception.
s   COMMANDs   argó   extraN)rò   r   ÚCommandrV   s   &r4   Útest_commandReprÚ!IMAP4HelperTests.test_commandReprë  s   € ô 	ŒU�]Š]˜:¨ x°(Ó<Ö=r7   c                	ó
  a aaa€ Ro\        4       o\        S4      p\        P                  ! V4      oSP	                  S4      pVVVV 3R lpV3R lpVP                  V4       VP                  V4       VP                  V4      # )ó   xc                ó¦   <€ SP                  V S4       SP                  R \        S4      S3,          RP                  SP                  4      4       V # )s   {%d}
%br7   )r´   rC   rå   r�   r�   )r2   ÚbrŸ   r    rF   s   &€€€€r4   r¡   Ú6IMAP4HelperTests.test_fileProducer.<locals>.cbProducedø  sB   ø€ Ø×$Ñ$ V¨QÔ/Ø×Ñ˜]¬c°!«f°a¨[Õ8¸#¿(¹(À1Ç8Á8Ó:LÔMØˆMr7   c                ó(   <€ SP                  4        V # r0   )r‡   )r2   r    s   &€r4   ÚcbResumeÚ4IMAP4HelperTests.test_fileProducer.<locals>.cbResumeý  s   ø€ ð ×ÑÔØˆMr7   s   xyzxyzxyzxyzxyzxyzxyzxyzxyzxyz)r   r   r   ÚFileProducerr¦   r§   )rF   r3   rª   r¡   ri  rf  rŸ   r    s   f    @@@r4   Útest_fileProducerÚ"IMAP4HelperTests.test_fileProducerñ  ss   û€ Ø7ˆÜÓˆÜ�A‹JˆÜ×Ò˜qÓ!ˆØ×Ñ˜QÓˆ÷	ð 	õ
	ð 	
�‰�jÔ!Ø	�‰�hÔð �}‰}˜ZÓ(Ð(r7   c                	ó$  € R . RORR..R. RO. R	O.R. R
O. RO..pV Fo  w  r#p\         P                  ! VR4      pV F#  pV P                  VP                  V4      4       K%  	  V F#  pV P	                  VP                  V4      4       K%  	  Kq  	  R# )úfoo/%gum/barúfoo/xgum/barúfoo/gum/barúfoo/x%x/barúfoo/xyz*abc/barÚ/N©zfoo/barzoo/lalagum/barzfoo/gumx/barzfoo/gum/baz©ÚfooÚbarzfuz fuz fuzz	foo/*/barúfoo/xyz/barz
foo/xx/baz)úfoo/xyx/barú
foo/xx/barúfoo/xxxxxxxxxxxxxx/bar©ry  zfoo/abc/barzfoo/xyzab/cbarzfoo/xyza/bcbar©zfoo/xyzabc/barzfoo/xyz/abc/barzfoo/xyz/123/abc/bar©r   ÚwildcardToRegexpÚassertFalseÚmatchÚ
assertTrue©rF   ÚcasesÚwildcardÚfailÚsucceedÚxs   &     r4   Útest_wildcardÚIMAP4HelperTests.test_wildcard	  s¡   € ð ÚLØ Ð/ðð ÚWÚGðð "ÚRÚLðð
ˆó$ (-Ñ#ˆH˜GÜ×-Ò-¨h¸Ó<ˆHÛ�Ø× Ñ  §¡°Ó!2Ö3ñ ã�Ø—‘ §¡¨qÓ 1Ö2ó ó	 (-r7   c                	ó(  € R . RO. RO.R. RO. RO.R. RO. R	O..pV Fq  w  r#p\         P                  ! VR4      pV F$  pV P                  VP                  V4      V4       K&  	  V F$  pV P	                  VP                  V4      V4       K&  	  Ks  	  R# )
ro  rr  rs  Nru  )rp  rq  zfoo/x/gum/barrv  )rz  r{  r|  zfoo/x/x/barr}  r~  r  r„  s   &     r4   Útest_wildcardNoDelimÚ%IMAP4HelperTests.test_wildcardNoDelim#  s    € ð ÚLÚ@ðð ÚWÚVðð "ÚRÚLðð
ˆó$ (-Ñ#ˆH˜GÜ×-Ò-¨h¸Ó=ˆHÛ�Ø× Ñ  §¡°Ó!2°AÖ6ñ ã�Ø—‘ §¡¨qÓ 1°1Ö5ó ó	 (-r7   c           	     óÞ   € RRRR/R3.pV F]  w  r#\         P                  ! V4      pV P                  \        VP	                  R4      4      \        VP	                  R4      4      4       K_  	  R# )zª
L{imap4._formatHeaders} accepts a C{dict} of header name/value pairs and
returns a string representing those headers in the standard multiline,
C{":"}-separated format.
ÚHeader1ÚValue1ÚHeader2ÚValue2s"   Header2: Value2
Header1: Value1
TN)r   Ú_formatHeadersrC   ÚsortedÚ
splitlines)rF   r…  rk   Úexpectedrd   s   &    r4   Útest_headerFormatterÚ%IMAP4HelperTests.test_headerFormatter=  sp   € ð ˜H i°Ð:Ø9ðð
ˆó  %‰OˆEÜ×)Ò)¨%Ó0ˆFØ×ÑÜ�v×(Ñ(¨Ó.Ó/´¸×8KÑ8KÈDÓ8QÓ1Röó  %r7   c                	óf  € . R
OpRR.RR.. RO. RO. RO. RO. RO. RO. RO. ROR	.RR.R.. ROR.. ROR.. ROR..p. ROpV F2  pV P                  \        P                  \        P                  V4       K4  	  \	        W4       F+  w  rVV P                  \        P                  ! V4      V4       K-  	  R# )ó   Hello Worldó   oo 	 ooó   oo \t ooó   oo \o ooó   Helloó   Worlds   World!Nó   ooó
   oo "oo" oo)r›  s   Hello "World!"s   World "Hello" "How are you?"s   "Hello world" How "are you?"s   foo bar "baz buz" NILs   foo bar "baz buz" "NIL"s   foo NIL "baz buz" bars   foo "NIL" "baz buz" bars   "NIL" bar "baz buz" foos   oo \"oo\" oos   "oo \"oo\" oo"rœ  s	   "oo 	 oo"r�  s
   "oo \t oo"rž  ó
   "oo \o oo"rž  r£  )r   rŸ  s   How are you?)r<   s   Hows   are you?)ó   fooó   baró   baz buzN)r¤  r¥  r¦  ó   NIL)r¤  Nr¦  r¥  )r¤  r§  r¦  r¥  )r§  r¥  r¦  r¤  )r¡  s   "oo"r¡  )r¡  s   \tr¡  )r¡  ó   \or¡  )s   "mismatched quotes   mismatched quote"s   mismatched"quotes   "oops here is" another")rí   r   ÚMismatchedQuotingÚsplitQuotedrü   rC   )rF   r…  ÚanswersÚerrorsÚsÚcaser—  s   &      r4   Útest_quotedSplitterÚ$IMAP4HelperTests.test_quotedSplitterP  sÂ   € ò
ˆð. �xÐ Ø�yÐ!Ú1Ú1Ú.Ú0Ú.Ú0Ú0Ú#ØˆOØ�EˆNØˆMÚ"ØˆNÚ"ØˆNÚ"ØˆNð'
ˆò,
ˆó ˆAØ×Ñœe×5Ñ5´u×7HÑ7HÈ!ÖLñ ô " %Ö1‰NˆDØ×ÑœU×.Ò.¨tÓ4°hÖ?ó 2r7   c                	ó  € . RO. RO. RORR.R . ROR.R R. RO.RR RR. RORRRR.	R . RORR..pR.. ROR.R.R R	.R.R
R..RR	.R.R R.R..p\        W4       F+  w  r4V P                  \        P                  ! V4      V4       K-  	  R# )ó   aó   bó   dó   eó    ó   "s   abcdeó   des   abcs   bcds   abs   cdes   a s    es    bc  N)r²  r³  ó   cr´  rµ  )
r²  r¶  r·  r³  r¹  r¶  r·  r¶  r´  rµ  )r²  r³  r¹  )r³  r¹  r´  )r¹  r´  rµ  )r·  r¶  r³  r¹  r¶  r¶  r·  )r²  s   bc r¸  )rü   rC   r   ÚcollapseStrings)rF   r…  r«  r®  r—  s   &    r4   Útest_stringCollapserÚ%IMAP4HelperTests.test_stringCollapserŠ  sÊ   € â*ÚHÚ  tÐ,ØÒ% tÐ,Ø�4Ò+Ð,Ø�4˜˜tÒ%7¸¸tÀTÈ4ÐPØÒ=¸tÀTÐJð
ˆð ˆJÚ!ØˆX�uÐØ�F�8˜TÐ"Ø�V�HÐØ�V�H˜eÐ$Ø�H�:˜uÐ%ð
ˆô " %Ö1‰NˆDØ×ÑœU×2Ò2°4Ó8¸(ÖCó 2r7   c                	óŽ  a € R P                  R.^,          4      pV 3R lpV! R\        V4      V3,          RR. R%O.V.4       V! RRR.R	R
RRRRR. R&O.. R&O.. R&O.. R'O.. R(O. R)O.RRR.
RRRRR.RRRRR..
4       V! RR.4       V! RR.4       V! RR.4       V! R R!.4       V! R R!.4       V! R"R#R$.4       V! R"R#R$.4       R# )*ó   
s   xxc                óX   <€ \         P                  ! V 4      pSP                  W!.4       R # r0   )r   ÚparseNestedParensrC   )r®  r—  ÚparsedrF   s   && €r4   ÚcheckÚ0IMAP4HelperTests.test_parenParser.<locals>.check¥  s#   ø€ Ü×,Ò,¨TÓ2ˆFØ×Ñ˜V ZÖ0r7   s8   (BODY.PEEK[HEADER.FIELDS.NOT (subject bcc cc)] {%d}
%b)ó	   BODY.PEEKs   HEADER.FIELDS.NOTs  (FLAGS (\Seen) INTERNALDATE "17-Jul-1996 02:44:25 -0700" RFC822.SIZE 4286 ENVELOPE ("Wed, 17 Jul 1996 02:23:25 -0700 (PDT)" "IMAP4rev1 WG mtg summary and minutes" (("Terry Gray" NIL gray cac.washington.edu)) (("Terry Gray" NIL gray cac.washington.edu)) (("Terry Gray" NIL gray cac.washington.edu)) ((NIL NIL imap cac.washington.edu)) ((NIL NIL minutes CNRI.Reston.VA.US) ("John Klensin" NIL KLENSIN INFOODS.MIT.EDU)) NIL NIL <B27397-0100000@cac.washington.edu>) BODY (TEXT PLAIN (CHARSET US-ASCII) NIL NIL 7BIT 3028 92))ó   FLAGSs   \Seens   INTERNALDATEs   17-Jul-1996 02:44:25 -0700s   RFC822.SIZEs   4286s   ENVELOPEs%   Wed, 17 Jul 1996 02:23:25 -0700 (PDT)s$   IMAP4rev1 WG mtg summary and minutesNs#   <B27397-0100000@cac.washington.edu>ó   BODYs   TEXTó   PLAINó   CHARSETs   US-ASCIIs   7BITs   3028s   92s   ("oo \"oo\" oo")r¢  s   ("oo \\ oo")s   oo \\ oos   ("oo \ oo")s   oo \ oos	   ("oo \o")s   oo \os   (oo \o)r¡  r¨  )s   subjects   bccs   cc)s
   Terry GrayNs   grayó   cac.washington.edu)NNs   imaprÉ  )NNs   minutess   CNRI.Reston.VA.US)s   John KlensinNs   KLENSINs   INFOODS.MIT.EDU)r�   rå   )rF   r­  rÂ  s   f  r4   Útest_parenParserÚ!IMAP4HelperTests.test_parenParser¢  s5  ø€ Ø�L‰L˜%˜ 1�Ó%ˆõ	1ñ 	ØIÌSÐQRËVÐUVÈKÕWØÐ0Ò2MÐNÐPQÐRô	
ñ 	ðJð Ø�ØØ-ØØØà<Ø;ÚJÐKÚJÐKÚJÐKÚAÐBâFÚOðð ØØ:ðð àØØ Ð-ØØØØØð	ð1"ô0	
ñd 	Ð# m _Ô5ÙÐ - Ô1Ùˆo ˜}Ô-áˆm˜i˜[Ô)Ùˆm˜i˜[Ô)Ùˆk˜E 6˜?Ô+Ùˆk˜E 6˜?Ö+r7   c           
     	óÒ  € . RO. RO. RO. RO. RO. RO. R	O. R
O. RO.	pV FÃ  w  r#pVP                  R4      p\        P                  ! 4       pVP                  V4       V P	                  \        VP                  4      ^4       V P                  \        VP                  ^ ,          \        WS4      4      4       V P	                  \        VP                  ^ ,          4      V4       KÅ  	  R# )ÚENVELOPEÚasciiN)rÍ  ÚEnvelopeÚenvelope)ÚFLAGSÚFlagsÚflags)ÚINTERNALDATEÚInternalDateÚinternaldate)úRFC822.HEADERÚRFC822Headerzrfc822.header)úRFC822.SIZEÚ
RFC822Sizezrfc822.size)úRFC822.TEXTÚ
RFC822Textzrfc822.text)ÚRFC822rÝ  Úrfc822)ÚUIDrß  Úuid)ÚBODYSTRUCTUREÚBodyStructureÚbodystructure)rD   r   Ú_FetchParserÚparseStringrC   rå   r2   rƒ  Ú
isinstanceÚgetattrrý   )rF   r…  ÚinpÚoutpÚasStringr    s   &     r4   Útest_fetchParserSimpleÚ'IMAP4HelperTests.test_fetchParserSimpleñ  s²   € â0Ú'Ú<Ú>Ú8Ú8Ú*Ú!Ú?ð

ˆó $)ÑˆC�xØ—*‘*˜WÓ%ˆCÜ×"Ò"Ó$ˆAØ�M‰M˜#ÔØ×ÑœS §¡›]¨AÔ.Ø�O‰OœJ q§x¡x°¥{´G¸AÓ4DÓEÔFØ×ÑœS §¡¨!¥Ó-¨xÖ8ó $)r7   c                	óø  € R ^. RO3.R^. RO3.R^. RO3..pV F×  w  r#\         P                  ! 4       pVP                  V4       V P                  \	        VP
                  4      V^ ,          4       VP
                   Uu. uF+  p\        V4      P                  4       P                  R4      NK-  	  ppVP                  4        V^,          P                  4        V P                  Wc^,          4       KÙ  	  R# u upi )s   ALLs   FULLs   FASTrÎ  N)ó   flagsó   internaldateó   rfc822.sizeó   envelope)rî  rï  rð  rñ  s   body)rî  rï  rð  )
r   rä  rå  rC   rå   r2   rý   ÚlowerrD   Úsort)rF   r…  rè  ré  r    ÚtokenÚexpectedResults   &      r4   Útest_fetchParserMacrosÚ'IMAP4HelperTests.test_fetchParserMacros  sÝ   € à�aÒQÐRÐSàØÒUÐVðð �qÒEÐFÐGð
ˆó ‰IˆCÜ×"Ò"Ó$ˆAØ�M‰M˜#ÔØ×ÑœS §¡›]¨D°­GÔ4ØNOÏhÊhÓWÉhÀUœc %›j×.Ñ.Ó0×7Ñ7¸Ö@ÉhˆNÐWØ×ÑÔ!Ø��G�L‰LŒNØ×Ñ˜^°!­WÖ5ó ùò Xs   Á?1C7c                	óL  € \         P                  pV! 4       pVP                  R 4       V P                  \	        VP
                  4      ^4       V P                  \        VP
                  ^ ,          VP                  4      4       V P                  VP
                  ^ ,          P                  R4       V P                  VP
                  ^ ,          P                  R4       V P                  \        VP
                  ^ ,          4      R4       V! 4       pVP                  R4       V P                  \	        VP
                  4      ^4       V P                  \        VP
                  ^ ,          VP                  4      4       V P                  VP
                  ^ ,          P                  R4       V P                  \        VP
                  ^ ,          4      R4       V! 4       pVP                  R4       V P                  \	        VP
                  4      ^4       V P                  \        VP
                  ^ ,          VP                  4      4       V P                  VP
                  ^ ,          P                  R4       V P                  \        VP
                  ^ ,          4      R4       V! 4       pVP                  R4       V P                  \	        VP
                  4      ^4       V P                  \        VP
                  ^ ,          VP                  4      4       V P                  VP
                  ^ ,          P                  R4       V P                  \        VP
                  ^ ,          P                  VP                  4      4       V P                  VP
                  ^ ,          P                  P                  R4       V P                  VP
                  ^ ,          P                  P                  R4       V P                  VP
                  ^ ,          P                  R4       V P                  \        VP
                  ^ ,          4      R	4       V! 4       pVP                  R
4       V P                  \	        VP
                  4      ^4       V P                  \        VP
                  ^ ,          VP                  4      4       V P                  VP
                  ^ ,          P                  R4       V P                  \        VP
                  ^ ,          P                  VP                  4      4       V P                  VP
                  ^ ,          P                  P                  R4       V P                  VP
                  ^ ,          P                  P                  R4       V P                  VP
                  ^ ,          P                  R4       V P                  \        VP
                  ^ ,          4      R	4       V! 4       pVP                  R4       V P                  \	        VP
                  4      ^4       V P                  \        VP
                  ^ ,          VP                  4      4       V P                  VP
                  ^ ,          P                  R4       V P                  \        VP
                  ^ ,          P                  VP                  4      4       V P                  VP
                  ^ ,          P                  P                  R4       V P                  VP
                  ^ ,          P                  P                  . RO4       V P                  VP
                  ^ ,          P                  R4       V P                  \!        VP
                  ^ ,          4      R4       V! 4       pVP                  R4       V P                  \	        VP
                  4      ^4       V P                  \        VP
                  ^ ,          VP                  4      4       V P                  VP
                  ^ ,          P                  R4       V P                  \        VP
                  ^ ,          P                  VP                  4      4       V P                  VP
                  ^ ,          P                  P                  R4       V P                  VP
                  ^ ,          P                  P                  . RO4       V P                  VP
                  ^ ,          P                  R4       V P                  \!        VP
                  ^ ,          4      R4       V! 4       pVP                  R4       V P                  \	        VP
                  4      ^4       V P                  \        VP
                  ^ ,          VP                  4      4       V P                  VP
                  ^ ,          P                  R4       V P                  \        VP
                  ^ ,          P                  VP                  4      4       V P                  VP
                  ^ ,          P                  P                  R4       V P                  VP
                  ^ ,          P                  P                  . RO4       V P                  VP
                  ^ ,          P                  R4       V P                  \!        VP
                  ^ ,          4      R4       V! 4       pVP                  R4       V P                  \	        VP
                  4      ^4       V P                  \        VP
                  ^ ,          VP                  4      4       V P                  VP
                  ^ ,          P                  R4       V P                  \        VP
                  ^ ,          P"                  VP$                  4      4       V P                  VP
                  ^ ,          P&                  R4       V P                  VP
                  ^ ,          P(                  ^
4       V P                  VP
                  ^ ,          P*                  ^24       V P                  VP
                  ^ ,          P                  R4       V P                  \!        VP
                  ^ ,          4      R4       V! 4       pVP                  R4       V P                  \	        VP
                  4      ^4       V P                  \        VP
                  ^ ,          VP                  4      4       V P                  VP
                  ^ ,          P                  R4       V P                  \        VP
                  ^ ,          P                  VP                  4      4       V P                  VP
                  ^ ,          P&                  R4       V P                  VP
                  ^ ,          P                  P                  RR.4       V P                  VP
                  ^ ,          P(                  ^g4       V P                  VP
                  ^ ,          P*                  ^E4       V P                  VP
                  ^ ,          P                  R4       V P                  \!        VP
                  ^ ,          4      R4       R# )rÆ  FNÚBODYrÄ  Ts   BODY[]zBODY[]s   BODY[HEADER]zBODY[HEADER]s   BODY.PEEK[HEADER]s+   BODY[HEADER.FIELDS (Subject Cc Message-Id)]ó
   MESSAGE-IDs0   BODY.PEEK[HEADER.FIELDS (Subject Cc Message-Id)]s4   BODY.PEEK[HEADER.FIELDS.NOT (Subject Cc Message-Id)]s/   BODY[HEADER.FIELDS.NOT (Subject Cc Message-Id)]s   BODY[1.MIME]<10.50>s?   BODY.PEEK[1.3.9.11.HEADER.FIELDS.NOT (Message-Id Date)]<103.69>s   DATEs:   BODY[1.3.9.11.HEADER.FIELDS.NOT (Message-Id Date)]<103.69>r1   )s   SUBJECTs   CCrú  ©é    )rü  rß   rã   r  )r   rä  rå  rC   rå   r2   rƒ  ræ  ÚBodyÚpeekÚheaderrý   ÚemptyÚHeaderÚnegateÚfieldsrN   ÚmimeÚMIMEÚpartÚpartialBeginÚpartialLength)rF   ÚPr    s   &  r4   Útest_fetchParserBodyÚ%IMAP4HelperTests.test_fetchParserBody  s›	  € Ü×Ñˆá‹CˆØ	�‰�gÔØ×Ñœ˜QŸX™X›¨Ô*Ø�‰œ
 1§8¡8¨A¥;°·±Ó7Ô8Ø×Ñ˜Ÿ™ !�×)Ñ)¨5Ô1Ø×Ñ˜Ÿ™ !�×+Ñ+¨TÔ2Ø×Ñœ˜QŸX™X a�[Ó)¨6Ô2á‹CˆØ	�‰�lÔ#Ø×Ñœ˜QŸX™X›¨Ô*Ø�‰œ
 1§8¡8¨A¥;°·±Ó7Ô8Ø×Ñ˜Ÿ™ !�×)Ñ)¨4Ô0Ø×Ñœ˜QŸX™X a�[Ó)¨6Ô2á‹CˆØ	�‰�iÔ Ø×Ñœ˜QŸX™X›¨Ô*Ø�‰œ
 1§8¡8¨A¥;°·±Ó7Ô8Ø×Ñ˜Ÿ™ !�×*Ñ*¨DÔ1Ø×Ñœ˜QŸX™X a�[Ó)¨8Ô4á‹CˆØ	�‰�oÔ&Ø×Ñœ˜QŸX™X›¨Ô*Ø�‰œ
 1§8¡8¨A¥;°·±Ó7Ô8Ø×Ñ˜Ÿ™ !�×)Ñ)¨5Ô1Ø�‰œ
 1§8¡8¨A¥;×#5Ñ#5°q·x±xÓ@ÔAØ×Ñ˜Ÿ™ !�×+Ñ+×2Ñ2°DÔ9Ø×Ñ˜Ÿ™ !�×+Ñ+×2Ñ2°BÔ7Ø×Ñ˜Ÿ™ !�×*Ñ*¨EÔ2Ø×Ñœ˜QŸX™X a�[Ó)¨>Ô:á‹CˆØ	�‰Ð*Ô+Ø×Ñœ˜QŸX™X›¨Ô*Ø�‰œ
 1§8¡8¨A¥;°·±Ó7Ô8Ø×Ñ˜Ÿ™ !�×)Ñ)¨4Ô0Ø�‰œ
 1§8¡8¨A¥;×#5Ñ#5°q·x±xÓ@ÔAØ×Ñ˜Ÿ™ !�×+Ñ+×2Ñ2°DÔ9Ø×Ñ˜Ÿ™ !�×+Ñ+×2Ñ2°BÔ7Ø×Ñ˜Ÿ™ !�×*Ñ*¨EÔ2Ø×Ñœ˜QŸX™X a�[Ó)¨>Ô:á‹CˆØ	�‰ÐDÔEØ×Ñœ˜QŸX™X›¨Ô*Ø�‰œ
 1§8¡8¨A¥;°·±Ó7Ô8Ø×Ñ˜Ÿ™ !�×)Ñ)¨5Ô1Ø�‰œ
 1§8¡8¨A¥;×#5Ñ#5°q·x±xÓ@ÔAØ×Ñ˜Ÿ™ !�×+Ñ+×2Ñ2°EÔ:Ø×Ñ˜Ÿ™ !�×+Ñ+×2Ñ2Ò4VÔWØ×Ñ˜Ÿ™ !�×*Ñ*¨EÔ2Ø×ÑÜ�!—(‘(˜1•+ÓÐ Nô	
ñ ‹CˆØ	�‰ÐIÔJØ×Ñœ˜QŸX™X›¨Ô*Ø�‰œ
 1§8¡8¨A¥;°·±Ó7Ô8Ø×Ñ˜Ÿ™ !�×)Ñ)¨4Ô0Ø�‰œ
 1§8¡8¨A¥;×#5Ñ#5°q·x±xÓ@ÔAØ×Ñ˜Ÿ™ !�×+Ñ+×2Ñ2°EÔ:Ø×Ñ˜Ÿ™ !�×+Ñ+×2Ñ2Ò4VÔWØ×Ñ˜Ÿ™ !�×*Ñ*¨EÔ2Ø×ÑÜ�!—(‘(˜1•+ÓÐ Nô	
ñ ‹CˆØ	�‰ÐMÔNØ×Ñœ˜QŸX™X›¨Ô*Ø�‰œ
 1§8¡8¨A¥;°·±Ó7Ô8Ø×Ñ˜Ÿ™ !�×)Ñ)¨4Ô0Ø�‰œ
 1§8¡8¨A¥;×#5Ñ#5°q·x±xÓ@ÔAØ×Ñ˜Ÿ™ !�×+Ñ+×2Ñ2°DÔ9Ø×Ñ˜Ÿ™ !�×+Ñ+×2Ñ2Ò4VÔWØ×Ñ˜Ÿ™ !�×*Ñ*¨EÔ2Ø×ÑÜ�!—(‘(˜1•+ÓÐ Rô	
ñ ‹CˆØ	�‰Ð,Ô-Ø×Ñœ˜QŸX™X›¨Ô*Ø�‰œ
 1§8¡8¨A¥;°·±Ó7Ô8Ø×Ñ˜Ÿ™ !�×)Ñ)¨5Ô1Ø�‰œ
 1§8¡8¨A¥;×#3Ñ#3°Q·V±VÓ<Ô=Ø×Ñ˜Ÿ™ !�×)Ñ)¨4Ô0Ø×Ñ˜Ÿ™ !�×1Ñ1°2Ô6Ø×Ñ˜Ÿ™ !�×2Ñ2°BÔ7Ø×Ñ˜Ÿ™ !�×*Ñ*¨EÔ2Ø×Ñœ˜qŸx™x¨�{Ó+Ð-CÔDá‹CˆØ	�‰ØNô	
ð 	×Ñœ˜QŸX™X›¨Ô*Ø�‰œ
 1§8¡8¨A¥;°·±Ó7Ô8Ø×Ñ˜Ÿ™ !�×)Ñ)¨4Ô0Ø�‰œ
 1§8¡8¨A¥;×#5Ñ#5°q·x±xÓ@ÔAØ×Ñ˜Ÿ™ !�×)Ñ)¨=Ô9Ø×Ñ˜Ÿ™ !�×+Ñ+×2Ñ2°]ÀGÐ4LÔMØ×Ñ˜Ÿ™ !�×1Ñ1°3Ô7Ø×Ñ˜Ÿ™ !�×2Ñ2°BÔ7Ø×Ñ˜Ÿ™ !�×*Ñ*¨EÔ2Ø×ÑÜ�!—(‘(˜1•+ÓØIö	
r7   c                óÖ  € \         P                  ! 4       pVP                  R4       V P                  \	        VP
                  4      ^4       V P                  \        VP
                  ^ ,          VP                  4      4       V P                  VP
                  ^ ,          P                  R4       V P                  VP
                  ^ ,          P                  ^ 4       V P                  VP
                  ^ ,          P                  R4       V P                  VP
                  ^ ,          P                  R4       V P                  VP
                  ^ ,          P                  ^dR7      R4       R# )zT
Partial requests starting at 0 and longer than the message
return the entire body.
s   BODY.PEEK[]<0.393216>Ti   )Úlengths	   BODY[]<0>N)r   rä  rå  rC   rå   r2   rƒ  ræ  rý  rþ  r  r  r   ÚgetBytes©rF   r    s   & r4   Ú"test_fetchParserParseStringPartialÚ3IMAP4HelperTests.test_fetchParserParseStringPartial�  sø   € ô
 ×ÒÓ ˆØ	�‰Ð.Ô/Ø×Ñœ˜QŸX™X›¨Ô*Ø�‰œ
 1§8¡8¨A¥;°·±Ó7Ô8Ø×Ñ˜Ÿ™ !�×)Ñ)¨4Ô0Ø×Ñ˜Ÿ™ !�×1Ñ1°1Ô5Ø×Ñ˜Ÿ™ !�×2Ñ2°FÔ;Ø×Ñ˜Ÿ™ !�×*Ñ*¨DÔ1Ø×ÑØ�H‰H�Q�K× Ñ ¨Ð Ó,Øö	
r7   c                ó  € \         P                  ! 4       pVP                  R4       V P                  \	        VP
                  4      ^4       V P                  VP
                  ^ ,          P                  R4       V P                  VP
                  ^ ,          VP                  4       V P                  VP
                  ^ ,          P                  VP                  4       V P                  \        VP
                  ^ ,          4      R4       R# )z{
Parsing a C{BODY} whose C{HEADER} values require quoting
results in a object that perserves that quoting when
serialized.
s   BODY[HEADER.FIELDS ((Quoted)]Fs   BODY[HEADER.FIELDS ("(Quoted")]N)r   rä  rå  rC   rå   r2   rþ  ÚassertIsInstancerý  rÿ  r  rN   r  s   & r4   Útest_fetchParserQuotedHeaderÚ-IMAP4HelperTests.test_fetchParserQuotedHeaderŸ  s±   € ô ×ÒÓ ˆØ	�‰Ð6Ô7Ø×Ñœ˜QŸX™X›¨Ô*Ø×Ñ˜Ÿ™ !�×)Ñ)¨5Ô1Ø×Ñ˜aŸh™h q�k¨1¯6©6Ô2Ø×Ñ˜aŸh™h q�k×0Ñ0°!·(±(Ô;Ø×Ñœ˜qŸx™x¨�{Ó+Ð-OÖPr7   c                óš   € \         P                  ! 4       pVP                  R4       V P                  \	        VP
                  4      4       R# )z-
Parsing an empty string results in no data.
r7   N)r   rä  rå  r�  rå   r2   r  s   & r4   Útest_fetchParserEmptyStringÚ,IMAP4HelperTests.test_fetchParserEmptyString­  s4   € ô ×ÒÓ ˆØ	�‰�cÔØ×Ñœ˜QŸX™X›Ö'r7   c                ór   € \         P                  ! 4       pV P                  \        VP                  R4       R# )zD
Parsing a string with an unknown attribute raises an
L{Exception}.
s   UNKNOWNN©r   rä  rí   Ú	Exceptionrå  r  s   & r4   Ú test_fetchParserUnknownAttributeÚ1IMAP4HelperTests.test_fetchParserUnknownAttributeµ  s(   € ô
 ×ÒÓ ˆØ×Ñœ) Q§]¡]°JÖ?r7   c                ór   € \         P                  ! 4       pV P                  \        VP                  R4       R# )zN
Parsing a string that prematurely ends in whitespace raises an
L{Exception}.
s   BODY[HEADER.FIELDS  Nr  r  s   & r4   Ú0test_fetchParserIncompleteStringEndsInWhitespaceÚAIMAP4HelperTests.test_fetchParserIncompleteStringEndsInWhitespace½  ó)   € ô
 ×ÒÓ ˆØ×Ñœ) Q§]¡]Ð4KÖLr7   c                ór   € \         P                  ! 4       pV P                  \        VP                  R4       R# )zg
Parsing a string that contains an unexpected character rather
than whitespace raises an L{Exception}.
s   BODY[HEADER.FIELDS!]Nr  r  s   & r4   Ú"test_fetchParserExpectedWhitespaceÚ3IMAP4HelperTests.test_fetchParserExpectedWhitespaceÅ  r!  r7   c                ó  € \         P                  ! 4       pVP                  R4       V P                  \	        VP
                  4      ^4       V P                  VP
                  ^ ,          VP                  4       V P                  VP
                  ^ ,          P                  R4       V P                  VP
                  ^ ,          P                  VP                  4       V P                  \        VP
                  ^ ,          4      R4       R# )z*
A C{BODY} can contain a C{TEXT} section.
s
   BODY[TEXT]FN)r   rä  rå  rC   rå   r2   r  rý  rþ  rG   ÚTextrN   r  s   & r4   Útest_fetchParserTextSectionÚ,IMAP4HelperTests.test_fetchParserTextSectionÍ  s¯   € ô ×ÒÓ ˆØ	�‰�mÔ$Ø×Ñœ˜QŸX™X›¨Ô*Ø×Ñ˜aŸh™h q�k¨1¯6©6Ô2Ø×Ñ˜Ÿ™ !�×)Ñ)¨5Ô1Ø×Ñ˜aŸh™h q�k×.Ñ.°·±Ô7Ø×Ñœ˜qŸx™x¨�{Ó+¨]Ö;r7   c                ór   € \         P                  ! 4       pV P                  \        VP                  R4       R# )zC
Parsing a C{BODY} with an unknown section raises an
L{Exception}.
s   BODY[UNKNOWN]Nr  r  s   & r4   Útest_fetchParserUnknownSectionÚ/IMAP4HelperTests.test_fetchParserUnknownSectionÙ  s)   € ô
 ×ÒÓ ˆØ×Ñœ) Q§]¡]Ð4DÖEr7   c                óÞ   € \         P                  ! 4       pV P                  \        VP                  R4       \         P                  ! 4       pV P                  \        VP                  R4       R# )zM
Parsing a C{BODY} with an unterminated section list raises an
L{Exception}.
s   BODY[HEADERs   BODY[HEADER.FIELDS (SUBJECT)Nr  r  s   & r4   Ú#test_fetchParserMissingSectionCloseÚ4IMAP4HelperTests.test_fetchParserMissingSectionCloseá  sM   € ô
 ×ÒÓ ˆØ×Ñœ) Q§]¡]°NÔCÜ×ÒÓ ˆØ×Ñœ) Q§]¡]Ð4SÖTr7   c                óÞ   € \         P                  ! 4       pV P                  \        VP                  R4       \         P                  ! 4       pV P                  \        VP                  R4       R# )z�
Parsing a C{BODY} whose C{HEADER.FIELDS} list does not begin
with an open parenthesis (C{(}) or end with a close
parenthesis (C{)}) raises an L{Exception}.
s   BODY[HEADER.FIELDS Missing)]s   BODY[HEADER.FIELDS (Missing]Nr  r  s   & r4   Ú(test_fetchParserHeaderMissingParenthesesÚ9IMAP4HelperTests.test_fetchParserHeaderMissingParenthesesë  sN   € ô ×ÒÓ ˆØ×Ñœ) Q§]¡]Ð4SÔTÜ×ÒÓ ˆØ×Ñœ) Q§]¡]Ð4SÖTr7   c                ór   € \         P                  ! 4       pV P                  \        VP                  R4       R# )zS
Parsing a C{BODY} with a range that lacks a period (C{.})
raises an L{Exception}.
s   BODY<01>Nr  r  s   & r4   Útest_fetchParserDotlessPartialÚ/IMAP4HelperTests.test_fetchParserDotlessPartialö  s(   € ô
 ×ÒÓ ˆØ×Ñœ) Q§]¡]°KÖ@r7   c                ór   € \         P                  ! 4       pV P                  \        VP                  R4       R# )zt
Parsing a C{BODY} with a partial range that's missing its
closing greater than sign (C{>}) raises an L{EXCEPTION}.
s   BODY<0Nr  r  s   & r4   Útest_fetchParserUnclosedPartialÚ0IMAP4HelperTests.test_fetchParserUnclosedPartialþ  s(   € ô
 ×ÒÓ ˆØ×Ñœ) Q§]¡]°IÖ>r7   c                	óx   € R RR\        R4      RR.pRpV P                  \        P                  ! V4      V4       R# )rw  rx  Úbazó   this is a file
ÚbuzÚbizs4   "foo" "bar" "baz" {16}
this is a file
 "buz" "biz"N)r   rC   r   ÚcollapseNestedLists)rF   ÚinputStructurerd   s   &  r4   Ú
test_filesÚIMAP4HelperTests.test_files  sD   € àØØÜÐ)Ó*ØØð
ˆð Mˆà×Ñœ×2Ò2°>ÓBÀFÖKr7   c                	óÊ   € R \         P                  ! R4      R\        R4      R\         P                  ! R4      R.pRpV P                  \         P                  ! V4      V4       R# )	r¤  r¥  s   bazr:  s   this is
quoteds   buzr7   sC   "foo" bar "baz" {16}
this is a file
 {15}
this is
quoted buz ""N)r   ÚDontQuoteMer   rC   r=  rj   s   &  r4   Útest_quoteAvoiderÚ"IMAP4HelperTests.test_quoteAvoider  sa   € àÜ×Ò˜fÓ%ØÜÐ)Ó*Ø Ü×Ò˜fÓ%Øð
ˆðð 	ð 	×Ñœ×2Ò2°5Ó9¸6ÖBr7   c                	óv   € R R..3.pV F+  w  r#V P                  \        P                  ! V4      V4       K-  	  R# )s   ({10}
0123456789)s
   0123456789N)rC   r   rÀ  )rF   r…  r®  r—  s   &   r4   Útest_literalsÚIMAP4HelperTests.test_literals(  s?   € à$¨ Ð&7Ð8ð
ˆó $‰NˆDØ×ÑœU×4Ò4°TÓ:¸HÖEó $r7   c                	óÂ  € \         P                  ! ^R7      \         P                  ! ^^^R7      \         P                  ! \         P                  ! ^R7      \         P                  ! ^R7      4      \         P                  ! RR7      \         P                  ! \         P                  ! ^R7      \         P                  ! ^R7      \         P                  ! ^R7      4      \         P                  ! \         P                  ! \         P                  ! \         P                  ! ^RR	R
7      \         P                  ! ^RRR7      \         P                  ! ^^^RR7      \         P                  ! \         P                  ! RR7      4      4      4      \         P                  ! \         P                  ! RR7      4      4      .p. ROp\	        W4       F  w  r4V P                  W44       K  	  R# )rÜ   )Úflagged)r•  Ú	unflaggedÚdeleted)rK  Útoday)Úbefore)Úunseen)ÚnewÚ	yesterdayiè  )r•  ÚsinceÚsmallerÚtuesdayi'  )r•  rM  Úlarger)r•  rN  rK  rM  Úspam)r˜   z1:5©rà  N)ÚFLAGGEDz(DELETED UNFLAGGED)z(OR FLAGGED DELETED)z(BEFORE "today")z(OR DELETED (OR UNSEEN NEW))z¡(OR (NOT (OR (SINCE "yesterday" SMALLER 1000) (OR (BEFORE "tuesday" LARGER 10000) (OR (BEFORE "today" DELETED UNSEEN) (NOT (SUBJECT "spam")))))) (NOT (UID 1:5))))r   ÚQueryÚOrÚNotrü   rC   )rF   rÿ   r   Úqueryr—  s   &    r4   Útest_queryBuilderÚ"IMAP4HelperTests.test_queryBuilder0  s'  € ä�KŠK Ô"Ü�KŠK˜q¨A°qÔ9Ü�HŠH”U—[’[¨Ô+¬U¯[ª[ÀÔ-CÓDÜ�KŠK˜wÔ'Ü�HŠH”U—[’[¨Ô+¬U¯[ª[ÀÔ-BÄEÇKÂKÐTUÔDVÓWÜ�HŠHÜ—	’	Ü—H’HÜŸš¨1°KÈÔNÜŸš¨1°YÀuÔMÜŸš¨1°QÀÈ'ÔRÜŸ	š	¤%§+¢+°fÔ"=Ó>ó	óô —	’	œ%Ÿ+š+¨%Ô0Ó1ó
ð
ˆò&

ˆô  # 6Ö3‰OˆEØ×Ñ˜UÖ-ó  4r7   c                óX   € \         P                  ! RR7      pV P                  RV4       R# )zÂ
When passed the C{keyword} argument, L{imap4.Query} returns an unquoted
string.

@see: U{http://tools.ietf.org/html/rfc3501#section-9}
@see: U{http://tools.ietf.org/html/rfc3501#section-6.4.4}
Útwisted)Úkeywordz(KEYWORD twisted)N©r   rX  rC   ©rF   r[  s   & r4   Útest_queryKeywordFlagWithQuotesÚ0IMAP4HelperTests.test_queryKeywordFlagWithQuotesS  s#   € ô —’ IÔ.ˆØ×ÑÐ,¨eÖ4r7   c                óX   € \         P                  ! RR7      pV P                  RV4       R# )zÄ
When passed the C{unkeyword} argument, L{imap4.Query} returns an
unquoted string.

@see: U{http://tools.ietf.org/html/rfc3501#section-9}
@see: U{http://tools.ietf.org/html/rfc3501#section-6.4.4}
r_  )Ú	unkeywordz(UNKEYWORD twisted)Nra  rb  s   & r4   Ú!test_queryUnkeywordFlagWithQuotesÚ2IMAP4HelperTests.test_queryUnkeywordFlagWithQuotes^  s#   € ô —’ iÔ0ˆØ×ÑÐ.°Ö6r7   c                ó‚   € \         P                  ! \         P                  ! ^R4      R7      pV P                  VR4       R# )zv
When passed a L{MessageSet}, L{imap4.Query} returns a query
containing a quoted string representing the ID sequence.
N©Úmessagesz(MESSAGES "1:*"))r   rX  r   rC   rb  s   & r4   Útest_queryWithMesssageSetÚ*IMAP4HelperTests.test_queryWithMesssageSeti  s0   € ô
 —’¤U×%5Ò%5°a¸Ó%>Ô?ˆØ×Ñ˜Ð 2Ö3r7   c                óX   € \         P                  ! ^R7      pV P                  VR4       R# )zT
When passed an L{int}, L{imap4.Query} returns a query
containing a quoted integer.
rj  z(MESSAGES "1")Nra  rb  s   & r4   Útest_queryWithIntegerÚ&IMAP4HelperTests.test_queryWithIntegerq  s#   € ô
 —’ QÔ'ˆØ×Ñ˜Ð 0Ö1r7   c                óŽ   € V P                  \        P                  \        P                  \        P                  ! ^R7      4       R# )zY
An L{imap4.Or} query with less than two arguments raises an
L{imap4.IllegalQueryError}.
rj  N)rí   r   ÚIllegalQueryErrorrY  rX  rV   s   &r4   Útest_queryOrIllegalQueryÚ)IMAP4HelperTests.test_queryOrIllegalQueryy  s*   € ð
 	×Ñœ%×1Ñ1´5·8±8¼U¿[º[ÐRSÔ=TÖUr7   c                ó6  € V P                  RVP                  4        R2\        P                  ! R	/ VR/B 4       V P                  RVP                  4        R2\        P                  ! R	/ VRRP	                  R \        ^!4       4       4      : R2/B 4       R# )
z¶
Helper to implement tests for value filtering of KEYWORD and UNKEYWORD
queries.

@param keyword: A native string giving the name of the L{imap4.Query}
    keyword argument to test.
Ú(z twistedrocks)ztwisted (){%*"\] rocksztwisted Ú c              3  ó8   "  € T F  p\        V4      x € K  	  R # 5ir0   )rt   )rR  Úchs   & r4   rS  Ú9IMAP4HelperTests._keywordFilteringTest.<locals>.<genexpr>”  s   é € Ð;±¨2œs 2Ÿw˜w³ùrU  z rocksNr1   )rC   Úupperr   rX  r�   rs   )rF   r`  s   &&r4   Ú_keywordFilteringTestÚ&IMAP4HelperTests._keywordFilteringTest€  s‘   € ð 	×ÑØ�—‘“Ð  Ð/Ü�KŠKÑ?˜7Ð$=Ð>Ñ?ô	
ð 	×ÑØ�—‘“Ð  Ð/Ü�KŠKñ áØ—w‘wÑ;´°r´Ó;Ö;ð>ðñö	
r7   c                ó(   € V P                  R4       R# )a¢  
When passed the C{keyword} argument, L{imap4.Query} returns an
C{atom} that consists of one or more non-special characters.

List of the invalid characters:

    ( ) { % * " \ ] CTL SP

@see: U{ABNF definition of CTL and SP<https://tools.ietf.org/html/rfc2234>}
@see: U{IMAP4 grammar<http://tools.ietf.org/html/rfc3501#section-9>}
@see: U{IMAP4 SEARCH specification<http://tools.ietf.org/html/rfc3501#section-6.4.4>}
r`  N©r|  rV   s   &r4   Útest_queryKeywordFlagÚ&IMAP4HelperTests.test_queryKeywordFlag™  s   € ð 	×"Ñ" 9Ö-r7   c                ó(   € V P                  R4       R# )a¤  
When passed the C{unkeyword} argument, L{imap4.Query} returns an
C{atom} that consists of one or more non-special characters.

List of the invalid characters:

    ( ) { % * " \ ] CTL SP

@see: U{ABNF definition of CTL and SP<https://tools.ietf.org/html/rfc2234>}
@see: U{IMAP4 grammar<http://tools.ietf.org/html/rfc3501#section-9>}
@see: U{IMAP4 SEARCH specification<http://tools.ietf.org/html/rfc3501#section-6.4.4>}
rf  Nr  rV   s   &r4   Útest_queryUnkeywordFlagÚ(IMAP4HelperTests.test_queryUnkeywordFlag¨  s   € ð 	×"Ñ" ;Ö/r7   c                ó€   € . ROpV F3  pV P                  \        P                  \        P                  VR4       K5  	  R# )zd
Trying to parse an invalid representation of a sequence range raises an
L{IllegalIdentifierError}.
é90  N)s   *:*r¤  s   4:s   bar:5©rí   r   ÚIllegalIdentifierErrorrû   ©rF   rÿ   rk   s   &  r4   Útest_invalidIdListParserÚ)IMAP4HelperTests.test_invalidIdListParser·  s6   € ò
 3ˆãˆEØ×ÑÜ×,Ñ,¬e×.?Ñ.?ÀÈöó r7   c                ó€   € . ROpV F3  pV P                  \        P                  \        P                  VR4       K5  	  R# )zÓ
Zeroes and negative values are not accepted in id range expressions. RFC
3501 states that sequence numbers and sequence ranges consist of
non-negative numbers (RFC 3501 section 9, the seq-number grammar item).
r†  N)s   0:5s   0:0s   *:0ó   0s   -3:5s   1:-2s   -1r‡  r‰  s   &  r4   Ú#test_invalidIdListParserNonPositiveÚ4IMAP4HelperTests.test_invalidIdListParserNonPositiveÃ  s7   € ò IˆãˆEØ×ÑÜ×,Ñ,¬e×.?Ñ.?ÀÈöó r7   c                óò  € . ROp\        ^R4      \        ^R4      \        ^R4      \        ^^4      ,           \        RR4      \        ^4      \        ^^4      \        ^4      \        ^4      ,           \        ^4      ,           \        ^^
4      \        ^^4      \        ^^4      \        ^
^4      ,           \        ^4      \        ^^
4      ,           \        ^4      \        ^^
4      ,           \        ^^4      ,           \        ^^
4      \        ^4      ,           \        ^^4      ,           \        ^^4      .p. ROp\        W4       F+  w  rEV P                  \        P                  ! V4      V4       K-  	  \        W4       Fw  w  rEVf2   V P                  \        \        \        P                  ! V4      4       K:  \        \        P                  ! V4      4      pV P                  WeRV: RV: RV: 24       Ky  	  R# )zQ
The function to parse sequence ranges yields appropriate L{MessageSet}
objects.
Nzlen(z) = z != )r÷   s   5:*s   1:2,5:*rö   ó   1s   1,2s   1,3,5s   1:10s   1:10,11s	   1:5,10:20s   1,5:10s   1,5:10,15:20s   1:10,15,20:25ó   4:2)NNNrÜ   rÜ   rß   rÝ   r  é   é   râ   é   é   rÝ   )r   rü   rC   r   rû   rí   rî   rå   )rF   rÿ   r   Úlengthsrk   r—  ÚLs   &      r4   Útest_parseIdListÚ!IMAP4HelperTests.test_parseIdListÐ  s—  € ò

ˆô$ �q˜$ÓÜ�q˜$ÓÜ�q˜$Ó¤*¨Q°Ó"2Õ2Ü�t˜TÓ"Ü�q‹MÜ�q˜!ÓÜ�q‹MœJ q›MÕ)¬J°q«MÕ9Ü�q˜"ÓÜ�q˜"ÓÜ�q˜!Óœz¨"¨bÓ1Õ1Ü�q‹MœJ q¨"Ó-Õ-Ü�q‹MœJ q¨"Ó-Õ-´
¸2¸rÓ0BÕBÜ�q˜"Ó¤
¨2£Õ.´¸BÀÓ1CÕCÜ�q˜!Óð
ˆò" Kˆä" 6Ö3‰OˆEØ×ÑœU×.Ò.¨uÓ5°xÖ@ñ  4ô  # 6Ö3‰OˆEØÒØ×!Ñ!¤)¬S´%×2CÒ2CÀEÓ2JÖKäœ×)Ò)¨%Ó0Ó1�Ø× Ñ  °°U±I¸TÀ!ÁÀdÈ8É,Ð.WÖXó  4r7   c                óP   € V P                  \        \        P                  R4       R# )z]
L{imap4.parseTime} raises L{ValueError} when given a a time
string whose format is invalid.
ÚinvalidN©rí   r$  r   Ú	parseTimerV   s   &r4   Útest_parseTimeInvalidFormatÚ,IMAP4HelperTests.test_parseTimeInvalidFormat  s   € ð
 	×Ñœ*¤e§o¡o°yÖAr7   c                ój   € . ROpV F(  pV P                  \        \        P                  V4       K*  	  R# )z^
L{imap4.parseTime} raises L{ValueError} when given a time
string composed of invalid values.
N)zinvalid-July-2017z2-invalid-2017z2-July-invalidr�  )rF   ÚinvalidStringsrœ  s   &  r4   Útest_parseTimeInvalidValuesÚ,IMAP4HelperTests.test_parseTimeInvalidValues
  s+   € ò

ˆó
 &ˆGØ×Ñœj¬%¯/©/¸7ÖCó &r7   c                ó(  € \        4       pRVP                  4       RVP                  4       RVP                  4       RVP	                  4       RVP                  4       /p\        P                  ! WP                  4       4      pV P                  W#4       R# )z‹
L{imap4.statusRequestHelper} builds a L{dict} mapping the
requested status names to values extracted from the provided
L{IMailboxIMAP}'s.
ÚMESSAGESÚRECENTÚUIDNEXTÚUIDVALIDITYÚUNSEENN)
ÚSimpleMailboxÚgetMessageCountÚgetRecentCountÚ
getUIDNextÚgetUIDValidityÚgetUnseenCountr   ÚstatusRequestHelperÚkeysrC   )rF   Úmboxr—  r2   s   &   r4   Útest_statusRequestHelperÚ)IMAP4HelperTests.test_statusRequestHelper  s~   € ô ‹ˆð ˜×,Ñ,Ó.Ø�d×)Ñ)Ó+Ø�t—‘Ó(Ø˜4×.Ñ.Ó0Ø�d×)Ñ)Ó+ð
ˆô ×*Ò*¨4·±³ÓAˆà×Ñ˜Ö*r7   r1   N)/ry   rz   r{   r|   r[  ra  rl  rŠ  r�  r˜  r¯  r»  rÊ  rë  rö  r
  r  r  r  r  r  r#  r'  r*  r-  r0  r3  r6  r?  rC  rF  r\  rc  rg  rl  ro  rs  r|  r€  rƒ  rŠ  rŽ  r™  rŸ  r£  r´  r}   r1   r7   r4   r]  r]  æ  sì   † ñò>ò)ò03ò46ò4ò&8@òtDò0M,ò^9ò*6ò&r
òh
ò$Qò(ò@òMòMò
<òFòUò	UòAò?òLòCò(Fò!.òF	5ò	7ò4ò2òVò
ò2.ò0ò
òò1YòfBòDö+r7   r]  c                  ó    € ] tR tRt$ Rt. tR]R&   ^ t^tRt	R t
R tR tR tR	 tR
 tR tR tR tR tR tRR ltR tR tR tR tR tRtR# )r«  i,  ú+list[tuple[bytes, list[bytes], bytes, int]]rk  Fc                	ó€   € . V n         V P                   P                  V n        V P                   P                  V n        R # r0   ©Ú	listenersr…   ÚaddListenerÚremoveÚremoveListenerrV   s   &r4   r‚   ÚSimpleMailbox.__init__4  ó-   € ØˆŒØŸ>™>×0Ñ0ˆÔØ"Ÿn™n×3Ñ3ˆÖr7   c                	ó   € V P                   # r0   ©rÓ  rV   s   &r4   ÚgetFlagsÚSimpleMailbox.getFlags9  ó   € Ø�z‰zÐr7   c                	ó   € ^*# )é*   r1   rV   s   &r4   r¯  ÚSimpleMailbox.getUIDValidity<  s   € Ùr7   c                	ó:   € \        V P                  4      ^,           # ©rÜ   ©rå   rk  rV   s   &r4   r®  ÚSimpleMailbox.getUIDNext?  s   € Ü�4—=‘=Ó! AÕ%Ð%r7   c                	ó   € ^	# )r  r1   rV   s   &r4   r¬  ÚSimpleMailbox.getMessageCountB  ó   € Ùr7   c                	ó   € ^# )rÝ   r1   rV   s   &r4   r­  ÚSimpleMailbox.getRecentCountE  rÎ  r7   c                	ó   € ^# )r  r1   rV   s   &r4   r°  ÚSimpleMailbox.getUnseenCountH  rÎ  r7   c                	ó   € V P                   # r0   ©ÚrwrV   s   &r4   ÚisWriteableÚSimpleMailbox.isWriteableK  s   € Ø�w‰wˆr7   c                	ó   € R # r0   r1   rV   s   &r4   ÚdestroyÚSimpleMailbox.destroyN  ó   € Ùr7   c                	ó   € R # )rt  r1   rV   s   &r4   ÚgetHierarchicalDelimiterÚ&SimpleMailbox.getHierarchicalDelimiterQ  s   € Ùr7   c                	óD  € / pR V9   d   V P                  4       VR &   RV9   d   V P                  4       VR&   RV9   d   V P                  4       ^,           VR&   RV9   d   V P                  4       VR&   RV9   d   V P                  4       VR&   \        P
                  ! V4      # )r¦  r§  r¨  r©  rª  ©r¬  r­  ÚgetUIDr°  r   rˆ  ©rF   ÚnamesÚrs   && r4   ÚrequestStatusÚSimpleMailbox.requestStatusT  s›   € ØˆØ˜ÔØ ×0Ñ0Ó2ˆAˆj‰MØ�uÔØ×-Ñ-Ó/ˆAˆh‰KØ˜ÔØ×/Ñ/Ó1°AÕ5ˆAˆi‰LØ˜EÔ!Ø#Ÿ{™{›}ˆAˆmÑØ�uÔØ×-Ñ-Ó/ˆAˆh‰KÜ�}Š}˜QÓÐr7   Nc                	ó®   € V P                   P                  WW0P                  34       V ;P                  ^,          un        \        P                  ! R4      # ©rÜ   N©rk  r…   ÚmUIDr   rˆ  ©rF   ÚmessagerÓ  Údates   &&&&r4   Ú
addMessageÚSimpleMailbox.addMessageb  s9   € Ø�‰×Ñ˜g¨d·I±IÐ>Ô?Ø�	Š	�Q��	Ü�}Š}˜TÓ"Ð"r7   c                	óð   € . pV P                    F$  pR V^,          9   g   K  VP                  V4       K&  	  V F  pV P                   P                  V4       K   	  V Uu. uF  q"^,          NK  	  up# u upi ©ú\Deleted©rk  r…   r¼  ©rF   Údeleter  s   &  r4   ÚexpungeÚSimpleMailbox.expungeg  sg   € ØˆØ—”ˆAØ˜a �dÖ"Ø—‘˜aÖ ñ ó ˆAØ�M‰M× Ñ  Ö#ñ á$Ó%™f˜�!—�™fÑ%Ð%ùÒ%ó   ÁA3c                	ó   € R V n         R# ©TN)ÚclosedrV   s   &r4   ÚcloseÚSimpleMailbox.closep  s	   € ØˆŽr7   c                	ó   € R # r0   r1   ©rF   rk  rà  s   &&&r4   ÚfetchÚSimpleMailbox.fetchs  ó   € ár7   c                	ó   € R # r0   r1   ©rF   rì  s   &&r4   rá  ÚSimpleMailbox.getUIDw  r  r7   c                	ó   € R # r0   r1   ©rF   rk  rÓ  Úmoderà  s   &&&&&r4   ÚstoreÚSimpleMailbox.store{  r  r7   )r»  rû  rº  r½  ©z\Flag1ÚFlag2z\AnotherSysFlagÚLastFlagr0   )ry   rz   r{   r|   rÓ  rk  Ú__annotations__rê  rÕ  rû  r‚   rÂ  r¯  r®  r¬  r­  r°  rÖ  rÙ  rÝ  rå  rî  rö  rü  r   rá  r	  r}   r1   r7   r4   r«  r«  ,  sv   ‡ à@€EØ<>€HÐ9Ó>Ø€DØ	
€BØ€Fò4ò
òò&òòòòòòò ô#ò
&òòòör7   r«  c                  óž   € ] tR tRt$ RtRt. tR]R&   ^ t^t	Rt
R tR tR tR	 tR
 tR tR tR tR tR tR tRR ltR tR tR tR tRtR# )ÚUncloseableMailboxi€  z"
A mailbox that cannot be closed.
r·  rk  Fc                	ó€   € . V n         V P                   P                  V n        V P                   P                  V n        R # r0   r¹  rV   s   &r4   r‚   ÚUncloseableMailbox.__init__Œ  r¿  r7   c                ó   € V P                   # )z*
The flags

@return: A sequence of flags.
rÁ  rV   s   &r4   rÂ  ÚUncloseableMailbox.getFlags‘  s   € ð �z‰zÐr7   c                ó   € ^*# )z.
The UID validity value.

@return: The value.
r1   rV   s   &r4   r¯  Ú!UncloseableMailbox.getUIDValidity™  s   € ñ r7   c                ó:   € \        V P                  4      ^,           # )z"
The next UID.

@return: The UID.
rÊ  rV   s   &r4   r®  ÚUncloseableMailbox.getUIDNext¡  s   € ô �4—=‘=Ó! AÕ%Ð%r7   c                ó   € ^	# )z/
The number of messages.

@return: The number.
r1   rV   s   &r4   r¬  Ú"UncloseableMailbox.getMessageCount©  ó   € ñ r7   c                ó   € ^# ©z,
The recent messages.

@return: The number.
r1   rV   s   &r4   r­  Ú!UncloseableMailbox.getRecentCount±  r  r7   c                ó   € ^# r  r1   rV   s   &r4   r°  Ú!UncloseableMailbox.getUnseenCount¹  r  r7   c                ó   € V P                   # )zH
The recent messages.

@return: Whether or not the mailbox is writable.
rÔ  rV   s   &r4   rÖ  ÚUncloseableMailbox.isWriteableÁ  s   € ð �w‰wˆr7   c                ó   € R# )z
Destroy this mailbox.
Nr1   rV   s   &r4   rÙ  ÚUncloseableMailbox.destroyÉ  s   € ñ 	r7   c                ó   € R# )z=
Return the hierarchical delimiter.

@return: The delimiter.
rt  r1   rV   s   &r4   rÝ  Ú+UncloseableMailbox.getHierarchicalDelimiterÏ  s   € ñ r7   c                óD  € / pRV9   d   V P                  4       VR&   RV9   d   V P                  4       VR&   RV9   d   V P                  4       ^,           VR&   RV9   d   V P                  4       VR&   RV9   d   V P                  4       VR&   \        P
                  ! V4      # )zn
Return the mailbox's status.

@param names: The status items to include.

@return: A L{dict} of status data.
r¦  r§  r¨  r©  rª  rà  râ  s   && r4   rå  Ú UncloseableMailbox.requestStatus×  s�   € ð ˆØ˜ÔØ ×0Ñ0Ó2ˆAˆj‰MØ�uÔØ×-Ñ-Ó/ˆAˆh‰KØ˜ÔØ×/Ñ/Ó1°AÕ5ˆAˆi‰LØ˜EÔ!Ø#Ÿ{™{›}ˆAˆmÑØ�uÔØ×-Ñ-Ó/ˆAˆh‰KÜ�}Š}˜QÓÐr7   Nc                ó®   € V P                   P                  WW0P                  34       V ;P                  ^,          un        \        P                  ! R4      # )zÌ
Add a message to the mailbox.

@param message: The message body.

@param flags: The message flags.

@param date: The message date.

@return: A L{Deferred} that fires when the message has been
    added.
Nré  rë  s   &&&&r4   rî  ÚUncloseableMailbox.addMessageì  s;   € ð 	�‰×Ñ˜g¨d·I±IÐ>Ô?Ø�	Š	�Q��	Ü�}Š}˜TÓ"Ð"r7   c                óð   € . pV P                    F$  pRV^,          9   g   K  VP                  V4       K&  	  V F  pV P                   P                  V4       K   	  V Uu. uF  q"^,          NK  	  up# u upi )zR
Delete messages marked for deletion.

@return: A L{list} of deleted message IDs.
rò  ró  rô  s   &  r4   rö  ÚUncloseableMailbox.expungeý  si   € ð ˆØ—”ˆAØ˜a �dÖ"Ø—‘˜aÖ ñ ó ˆAØ�M‰M× Ñ  Ö#ñ á$Ó%™f˜�!—�™fÑ%Ð%ùÒ%rø  c                	ó   € R # r0   r1   rÿ  s   &&&r4   r   ÚUncloseableMailbox.fetch  r  r7   c                	ó   € R # r0   r1   r  s   &&r4   rá  ÚUncloseableMailbox.getUID  r  r7   c                	ó   € R # r0   r1   r  s   &&&&&r4   r	  ÚUncloseableMailbox.store  r  r7   )r»  rº  r½  r  r0   )ry   rz   r{   r|   r[  rÓ  rk  r  rê  rÕ  rû  r‚   rÂ  r¯  r®  r¬  r­  r°  rÖ  rÙ  rÝ  rå  rî  rö  r   rá  r	  r}   r1   r7   r4   r  r  €  sy   ‡ ñð A€EØ<>€HÐ9Ó>Ø€DØ	
€BØ€Fò4ò
òò&òòòòòòò ô*#ò"&òòör7   r  c                  ó.   € ] tR tRtRt]tR tRR ltRt	R# )ÚAccountWithoutNamespacesi  zD
An in-memory account that does not provide L{INamespacePresenter}.
c                	ó"   € V P                  4       # r0   )ÚmailboxFactory)rF   ÚnameÚids   &&&r4   Ú_emptyMailboxÚ&AccountWithoutNamespaces._emptyMailbox  s   € Ø×"Ñ"Ó$Ð$r7   c                	óX   € \         P                  P                  W4      pVe   W#n        V# r0   )r   ÚMemoryAccountÚselectrÕ  )rF   r7  rÕ  r³  s   &&& r4   r=  ÚAccountWithoutNamespaces.select"  s(   € Ü×"Ñ"×)Ñ)¨$Ó5ˆØÒØŒGØˆr7   r1   NrÉ  )
ry   rz   r{   r|   r[  r«  r6  r9  r=  r}   r1   r7   r4   r4  r4    s   † ñð #€Nò%÷ð r7   r4  c                  ó   € ] tR tRtRtRtR# )ÚAccounti)  z<
An in-memory account that provides L{INamespacePresenter}.
r1   N©ry   rz   r{   r|   r[  r}   r1   r7   r4   r@  r@  )  s   † õr7   r@  c                  ó2   € ] tR tRt]! R4      tR tR tRtR# )ÚSimpleServeri/  ó   testuserc                	óü   € \         P                  P                  ! V .VO5/ VB  \        V R 7      p\	        V4      p\        4       pVP                  RR4       WPn        W@n        VP                  V4       RV n
        R# )©ÚaccountHolderrD  ó   password-testFN)r   ÚIMAP4Serverr‚   Ú	TestRealmr   r   ÚaddUserÚcheckerÚportalÚregisterCheckerÚtimeoutTest)rF   ÚargsÚkwÚrealmrM  rŸ   s   &*,   r4   r‚   ÚSimpleServer.__init__2  sj   € Ü×Ñ×"Ò" 4Ð5¨$Ò5°"Ò5Ü¨Ô-ˆÜ˜“ˆÜ3Ó5ˆØ	�	‰	�+Ð/Ô0ØŒØŒØ×Ñ˜qÔ!Ø ˆÖr7   c                	ól   € V P                   '       d   R # \        P                  P                  W4       R # r0   )rO  r   rI  ÚlineReceived©rF   Úlines   &&r4   rU  ÚSimpleServer.lineReceived=  s%   € Ø××Ðáä×Ñ×&Ñ& tÖ2r7   )rL  rM  rO  N)	ry   rz   r{   r|   r@  Ú
theAccountr‚   rU  r}   r1   r7   r4   rC  rC  /  s   † Ù˜Ó%€Jò	!ö3r7   rC  c                  ó8   € ] tR tRtR	R ltR tR tR tR tRt	R# )
ÚSimpleClientiE  Nc                	ó^   € \         P                  P                  W4       Wn        . V n        R # r0   )r   ÚIMAP4Clientr‚   ÚdeferredÚevents)rF   r^  ÚcontextFactorys   &&&r4   r‚   ÚSimpleClient.__init__F  s"   € Ü×Ñ×"Ñ" 4Ô8Ø ŒØˆŽr7   c                	ó<   € V P                   P                  R 4       R # r0   )r^  Úcallback)rF   Úcapss   &&r4   ÚserverGreetingÚSimpleClient.serverGreetingK  s   € Ø�‰×Ñ˜tÖ$r7   c                	ót   € V P                   P                  R V.4       V P                  P                  4        R# ©ÚmodeChangedN©r_  r…   Ú	transportÚloseConnection)rF   Ú	writeables   &&r4   ri  ÚSimpleClient.modeChangedN  s)   € Ø�‰×Ñ˜M¨9Ð5Ô6Ø�‰×%Ñ%Ö'r7   c                	ót   € V P                   P                  R V.4       V P                  P                  4        R# )ÚflagsChangedNrj  ©rF   ÚnewFlagss   &&r4   rp  ÚSimpleClient.flagsChangedR  s)   € Ø�‰×Ñ˜N¨HÐ5Ô6Ø�‰×%Ñ%Ö'r7   c                	ót   € V P                   P                  R W.4       V P                  P                  4        R# )ÚnewMessagesNrj  )rF   ÚexistsÚrecents   &&&r4   ru  ÚSimpleClient.newMessagesV  s)   € Ø�‰×Ñ˜M¨6Ð:Ô;Ø�‰×%Ñ%Ö'r7   )r^  r_  r0   )
ry   rz   r{   r|   r‚   re  ri  rp  ru  r}   r1   r7   r4   r[  r[  E  s   † ôò
%ò(ò(ö(r7   r[  c                  óX   € ] tR tRt$ RtR]R&   RtR]R&   R tR tR	 t	R
 t
R tR tRtR# )ÚIMAP4HelperMixini[  NzOptional[ServerTLSContext]Ú	serverCTXzOptional[ClientTLSContext]Ú	clientCTXc                	ó   € \         P                  ! 4       p\        V P                  R 7      V n        \        WP                  R 7      V n        Wn        . \        n
        \        R4      p\        Vn        V\        n        R# )©r`  rD  N)r   r   rC  r{  Úserverr[  r|  ÚclientÚ	connectedr«  rk  r@  ÚmboxTyperY  )rF   rª   rY  s   &  r4   ÚsetUpÚIMAP4HelperMixin.setUp_  sU   € Ü�NŠNÓˆÜ"°$·.±.ÔAˆŒÜ" 1·^±^ÔDˆŒØŒà!#ŒÔÜ˜[Ó)ˆ
Ü+ˆ
ÔØ",ŒÖr7   c                	ó   € V = V =V =R # r0   )r  r€  r�  rV   s   &r4   ÚtearDownÚIMAP4HelperMixin.tearDownj  s   € ØˆKØˆKØŠNr7   c                	óN   € V P                   P                  P                  4        R # r0   )r€  rk  rl  )rF   Úignores   &&r4   Ú_cbStopClientÚIMAP4HelperMixin._cbStopCliento  s   € Ø�‰×Ñ×,Ñ,Ö.r7   c                	óä   € V P                   P                  P                  4        V P                  P                  P                  4        \        P
                  ! VR \        V 4      ,           4       R# )úProblem with N)r€  rk  rl  r  r%   Úerrrý   )rF   r$   s   &&r4   Ú
_ebGeneralÚIMAP4HelperMixin._ebGeneralr  sE   € Ø�‰×Ñ×,Ñ,Ô.Ø�‰×Ñ×,Ñ,Ô.Ü�Š�˜¬3¨t«9Õ4Ö5r7   c                	óX   € \         P                  ! V P                  V P                  4      # r0   )r#   ÚloopbackAsyncr  r€  rV   s   &r4   r#   ÚIMAP4HelperMixin.loopbackw  s   € Ü×%Ò% d§k¡k°4·;±;Ó?Ð?r7   c                ó¨   € VP                   ! \        P                  4       \        VP                  4      p\        V4      pV P                  W24       R# )zö
Assert that the provided failure is an L{IMAP4Exception} with
the given message.

@param failure: A failure whose value L{IMAP4Exception}
@type failure: L{failure.Failure}

@param expected: The expected failure message.
@type expected: L{bytes}
N)Útrapr   ÚIMAP4Exceptionrý   Úvaluerò   rC   )rF   r$   r—  rì  s   &&& r4   ÚassertClientFailureMessageÚ+IMAP4HelperMixin.assertClientFailureMessagez  s;   € ð 	�Š”U×)Ñ)Ô*Ü�g—m‘mÓ$ˆÜ˜“>ˆà×Ñ˜Ö+r7   )r€  r�  r  )ry   rz   r{   r|   r{  r  r|  rƒ  r†  rŠ  r�  r#   r˜  r}   r1   r7   r4   rz  rz  [  s7   ‡ Ø,0€IÐ)Ó0Ø,0€IÐ)Ó0ò	-òò
/ò6ò
@ö,r7   rz  c                  óZ  € ] tR tRtR tR tR tR tR tR t	R t
R	 tR
 tR tR tR tR tR tR tR tR tR tR tR tR tR tR tR tR tR tR tR tR t R t!R  t"R! t#R" t$R# R$ lt%R% t&R& t'R' t(R( R) lt)R* t*R+ t+R, t,R- t-R. t.R/ t/R0 t0R1 t1R2 t2R3 t3R4 t4R5 t5R6 t6R7 t7R8t8R9# ):ÚIMAP4ServerTestsiŒ  c                	ó  a aa€ / oVV 3R  lpS P                   P                  \        V4      4      P                  S P                  4      p\
        P                  ! S P                  4       V.4      pRRRRRR/oVP                  VVV 3R l4      # )c                 ód   <€ VV3R  lp SP                   P                  4       P                  V 4      # )c                ór   <€ SP                  V 4       SP                  P                  P                  4        R # r0   ©Úupdater  rk  rl  ©rŸ   rd  rF   s   &€€r4   ÚgotCapsÚAIMAP4ServerTests.testCapability.<locals>.getCaps.<locals>.gotCaps‘  ó$   ø€ Ø—‘˜A”Ø—‘×%Ñ%×4Ñ4Ö6r7   ©r€  ÚgetCapabilitiesr§   ©r¢  rd  rF   s    €€r4   ÚgetCapsÚ0IMAP4ServerTests.testCapability.<locals>.getCaps�  ó(   ø€ ö7ð —;‘;×.Ñ.Ó0×<Ñ<¸WÓEÐEr7   ó	   IMAP4rev1Nó	   NAMESPACEó   IDLEc                ó(   <€ SP                  SS4      # r0   ©rC   )Ú_rd  r—  rF   s   &€€€r4   r5   Ú1IMAP4ServerTests.testCapability.<locals>.<lambda>š  s   ø€  t×'7Ñ'7¸À$Ô'Gr7   )r�  r§   r8   Ú
addErrbackr�  r   ÚgatherResultsr#   )rF   r¨  Úd1rª   rd  r—  s   f   @@r4   ÚtestCapabilityÚIMAP4ServerTests.testCapability�  st   ú€ Øˆö	Fð �^‰^×'Ñ'¬¨g«Ó7×BÑBÀ4Ç?Á?ÓSˆÜ×Ò §¡£°"Ð 5Ó6ˆØ  $¨°d¸GÀTÐJˆØ�}‰}ÖGÓHÐHr7   c                	ó^  a aa€ / o\         S P                  P                  R &   VV 3R lpS P                  P	                  \        V4      4      P                  S P                  4      p\        P                  ! S P                  4       V.4      pRRRRRRRR ./oVP	                  VVV 3R l4      # )ó   CRAM-MD5c                 ód   <€ VV3R  lp SP                   P                  4       P                  V 4      # )c                ór   <€ SP                  V 4       SP                  P                  P                  4        R # r0   rŸ  r¡  s   &€€r4   r¢  ÚIIMAP4ServerTests.testCapabilityWithAuth.<locals>.getCaps.<locals>.gotCaps¡  r¤  r7   r¥  r§  s    €€r4   r¨  Ú8IMAP4ServerTests.testCapabilityWithAuth.<locals>.getCaps   rª  r7   r«  Nr¬  r­  ó   AUTHc                ó(   <€ SP                  SS4      # r0   r¯  )r°  rd  ÚexpCaprF   s   &€€€r4   r5   Ú9IMAP4ServerTests.testCapabilityWithAuth.<locals>.<lambda>±  s   ø€  t×'7Ñ'7¸ÀÔ'Er7   )r   r  Úchallengersr�  r§   r8   r²  r�  r   r³  r#   )rF   r¨  r´  rª   rd  r¿  s   f   @@r4   ÚtestCapabilityWithAuthÚ'IMAP4ServerTests.testCapabilityWithAuthœ  s—   ú€ ØˆÜ/Aˆ�‰×Ñ Ñ,ö	Fð �^‰^×'Ñ'¬¨g«Ó7×BÑBÀ4Ç?Á?ÓSˆÜ×Ò §¡£°"Ð 5Ó6ˆð ˜$Ø˜$Ø�TØ�k�]ð	
ˆð �}‰}ÖEÓFÐFr7   c                	óâ   a € ^ S n         V 3R lpS P                  P                  \        V4      4      P	                  S P
                  4       S P                  4       pVP                  V 3R l4      # )rü  c                 óx   <€ V3R  lp SP                   P                  4       P                  \        V 4      4       R# )c                 ó   <€ ^S n         R# rè  )Ú	loggedOutrV   s   €r4   ÚsetLoggedOutÚAIMAP4ServerTests.testLogout.<locals>.logout.<locals>.setLoggedOut·  s
   ø€ Ø!"�–r7   N)r€  Úlogoutr§   r8   )rÈ  rF   s    €r4   rÊ  Ú+IMAP4ServerTests.testLogout.<locals>.logout¶  s*   ø€ õ#ð �K‰K×ÑÓ ×,Ñ,¬U°<Ó-@ÖAr7   c                ó<   <€ SP                  SP                  ^4      # rÉ  )rC   rÇ  ©r°  rF   s   &€r4   r5   Ú-IMAP4ServerTests.testLogout.<locals>.<lambda>¾  s   ø€  t×'7Ñ'7¸¿¹ÈÔ'Jr7   )rÇ  r�  r§   r8   r²  r�  r#   )rF   rÊ  rª   s   f  r4   Ú
testLogoutÚIMAP4ServerTests.testLogout³  sR   ø€ ØˆŒõ	Bð 	�‰×"Ñ"¤5¨£=Ó1×<Ñ<¸T¿_¹_ÔMØ�M‰M‹OˆØ�}‰}ÔJÓKÐKr7   c                	óâ   a € R S n         V 3R lpS P                  P                  \        V4      4      P	                  S P
                  4       S P                  4       pVP                  V 3R l4      # )Nc                 óf   <€ V3R  lp SP                   P                  4       P                  V 4       R# )c                ó^   <€ V Sn         SP                  P                  P                  4        R # r0   )Ú	responsesr  rk  rl  )rÔ  rF   s   &€r4   ÚsetResponsesÚ=IMAP4ServerTests.testNoop.<locals>.noop.<locals>.setResponsesÄ  s    ø€ Ø!*�”Ø—‘×%Ñ%×4Ñ4Ö6r7   N)r€  Únoopr§   )rÕ  rF   s    €r4   r×  Ú'IMAP4ServerTests.testNoop.<locals>.noopÃ  s%   ø€ õ7ð �K‰K×ÑÓ×*Ñ*¨<Ö8r7   c                ó<   <€ SP                  SP                  . 4      # r0   )rC   rÔ  rÍ  s   &€r4   r5   Ú+IMAP4ServerTests.testNoop.<locals>.<lambda>Ì  s   ø€  t×'7Ñ'7¸¿¹ÈÔ'Kr7   )rÔ  r�  r§   r8   r²  r�  r#   )rF   r×  rª   s   f  r4   ÚtestNoopÚIMAP4ServerTests.testNoopÀ  sQ   ø€ ØˆŒõ	9ð 	�‰×"Ñ"¤5¨£;Ó/×:Ñ:¸4¿?¹?ÔKØ�M‰M‹OˆØ�}‰}ÔKÓLÐLr7   c                	ó  a € V 3R  lpS P                   P                  \        V4      4      P                  S P                  4      p\
        P                  ! VS P                  4       .4      pVP                  S P                  4      # )c                 óv   <€ SP                   P                  R R4      p V P                  SP                  4       R# ©rD  rH  N)r€  Úloginr§   rŠ  ©rª   rF   s    €r4   rà  Ú)IMAP4ServerTests.testLogin.<locals>.loginÏ  s,   ø€ Ø—‘×!Ñ! +Ð/?Ó@ˆAØ�M‰M˜$×,Ñ,Ö-r7   )	r�  r§   r8   r²  r�  r   r³  r#   Ú_cbTestLogin©rF   rà  r´  rª   s   f   r4   Ú	testLoginÚIMAP4ServerTests.testLoginÎ  sa   ø€ õ	.ð �^‰^×'Ñ'¬¨e«Ó5×@Ñ@ÀÇÁÓQˆÜ×Ò  T§]¡]£_Ð 5Ó6ˆØ�}‰}˜T×.Ñ.Ó/Ð/r7   c                	óº   € V P                  V P                  P                  \        P                  4       V P                  V P                  P
                  R 4       R# ©ÚauthN©rC   r  ÚaccountrC  rY  Ústate©rF   Úignoreds   &&r4   rã  ÚIMAP4ServerTests._cbTestLogin×  ó<   € Ø×Ñ˜Ÿ™×,Ñ,¬l×.EÑ.EÔFØ×Ñ˜Ÿ™×*Ñ*¨FÖ3r7   c                	ó  a € V 3R  lpS P                   P                  \        V4      4      P                  S P                  4      pS P                  4       p\        P                  ! W#.4      pVP                  S P                  4      # )c                 óv   <€ SP                   P                  R R4      p V P                  SP                  4       R# ©rD  s   wrong-passwordN©r€  rà  ÚaddBothrŠ  rá  s    €r4   rà  Ú/IMAP4ServerTests.testFailedLogin.<locals>.loginÜ  ó,   ø€ Ø—‘×!Ñ! +Ð/@ÓAˆAØ�I‰I�d×(Ñ(Ö)r7   )	r�  r§   r8   r²  r�  r#   r   r³  Ú_cbTestFailedLogin©rF   rà  r´  Úd2rª   s   f    r4   ÚtestFailedLoginÚ IMAP4ServerTests.testFailedLoginÛ  sc   ø€ õ	*ð �^‰^×'Ñ'¬¨e«Ó5×@Ñ@ÀÇÁÓQˆØ�]‰]‹_ˆÜ×Ò  Ó)ˆØ�}‰}˜T×4Ñ4Ó5Ð5r7   c                	óž   € V P                  V P                  P                  R 4       V P                  V P                  P                  R4       R # )NÚunauth)rC   r  rë  rì  rí  s   &&r4   rø  Ú#IMAP4ServerTests._cbTestFailedLoginå  s6   € Ø×Ñ˜Ÿ™×,Ñ,¨dÔ3Ø×Ñ˜Ÿ™×*Ñ*¨HÖ5r7   c                ó0  a € RS P                   n        V 3R lpS P                  P                  \	        V4      4      P                  S P                  4      pS P                  4       p\        P                  ! W#.4      pVP                  S P                  4      # )zR
Attempting to log into a server that has no L{Portal} results
in a failed login.
Nc                 óv   <€ SP                   P                  R R4      p V P                  SP                  4       R# ró  rô  rá  s    €r4   rà  Ú7IMAP4ServerTests.test_loginWithoutPortal.<locals>.loginð  r÷  r7   )r  rM  r�  r§   r8   r²  r�  r#   r   r³  rø  rù  s   f    r4   Útest_loginWithoutPortalÚ(IMAP4ServerTests.test_loginWithoutPortalé  sq   ø€ ð
 "ˆ�‰Ôõ	*ð �^‰^×'Ñ'¬¨e«Ó5×@Ñ@ÀÇÁÓQˆØ�]‰]‹_ˆÜ×Ò  Ó)ˆØ�}‰}˜T×4Ñ4Ó5Ð5r7   c                ó^  a € R pVS P                   P                  P                  n        V 3R lpS P                  P                  \        V4      4      P                  S P                  4      pS P                  4       p\        P                  ! W4.4      pVP                  S P                  4      # )zÂ
The server responds with a C{BAD} response when its portal
attempts to log a user in with checker that claims to support
L{IAccount} but returns an an avatar interface that is not
L{IAccount}.
c                 ó   € R RR 3# )zNot IAccountzNot an accountc                 ó   € R # r0   r1   r1   r7   r4   r5   ÚVIMAP4ServerTests.test_nonIAccountAvatar.<locals>.brokenRequestAvatar.<locals>.<lambda>  s   € ¹dr7   r1   )r°  Ú__s   *,r4   ÚbrokenRequestAvatarÚDIMAP4ServerTests.test_nonIAccountAvatar.<locals>.brokenRequestAvatar  s   € Ø"Ð$4±lÐCÐCr7   c                 óv   <€ SP                   P                  R R4      p V P                  SP                  4       R# rß  rô  rá  s    €r4   rà  Ú6IMAP4ServerTests.test_nonIAccountAvatar.<locals>.login  s,   ø€ Ø—‘×!Ñ! +Ð/?Ó@ˆAØ�I‰I�d×(Ñ(Ö)r7   )r  rM  rR  ÚrequestAvatarr�  r§   r8   r²  r�  r#   r   r³  rø  )rF   r
  rà  r´  rú  rª   s   f     r4   Útest_nonIAccountAvatarÚ'IMAP4ServerTests.test_nonIAccountAvatarù  s„   ø€ ò	Dð 2Eˆ�‰×Ñ× Ñ Ô.õ	*ð �^‰^×'Ñ'¬¨e«Ó5×@Ñ@ÀÇÁÓQˆØ�]‰]‹_ˆÜ×Ò  Ó)ˆØ�}‰}˜T×4Ñ4Ó5Ð5r7   c                óú  a a€  ! R R\         4      oV3R lpVS P                  n        V 3R lpS P                  P	                  \        V4      4      pVP                  S P                  R4       VP                  VV 3R l4       pVP                  S P                  4       VP                  S P                  4       S P                  4       p\        P                  ! W5.4      pVP	                  S P                  4      # )zƒ
Any exception raised by L{IMAP4Server.authenticateLogin} that
is not L{UnauthorizedLogin} is logged results in a C{BAD}
response.
c                  ó   € ] tR tRtRtRtR# )ÚAIMAP4ServerTests.test_loginException.<locals>.UnexpectedExceptioni  ú
An unexpected exception.
r1   NrA  r1   r7   r4   ÚUnexpectedExceptionr    ó   † õr7   r  c                ó   <€ S! R 4      h)ÚWhoopsr1   )ÚuserÚpasswdr  s   &&€r4   ÚraisesUnexpectedExceptionÚGIMAP4ServerTests.test_loginException.<locals>.raisesUnexpectedException  s   ø€ Ù% hÓ/Ð/r7   c                 ó<   <€ S P                   P                  R R4      # ©rD  rH  ©r€  rà  rV   s   €r4   rà  Ú3IMAP4ServerTests.test_loginException.<locals>.login   ó   ø€ Ø—;‘;×$Ñ$ [Ð2BÓCÐCr7   s   Server error: Whoopsc                óH   <€ SP                  SP                  S4      4       R # r0   ©rƒ  ÚflushLoggedErrors)r°  r  rF   s   &€€r4   ÚassertErrorLoggedÚ?IMAP4ServerTests.test_loginException.<locals>.assertErrorLogged'  s   ø€ à�O‰O˜D×2Ñ2Ð3FÓGÖHr7   )r  r  ÚauthenticateLoginr�  r§   r8   r²  r˜  r�  rõ  rŠ  r#   r   r³  rø  )rF   r  rà  r´  r%  rú  rª   r  s   f      @r4   Útest_loginExceptionÚ$IMAP4ServerTests.test_loginException  sÆ   ù€ ô	¤)ô 	õ
	0ð )Bˆ�‰Ô%õ	Dð �^‰^×'Ñ'¬¨e«Ó5ˆà
�‰�d×5Ñ5Ð7NÔOà	�‰õ	Ió 
ð	Ið 	�‰�d—o‘oÔ&Ø
�
‰
�4×%Ñ%Ô&à�]‰]‹_ˆÜ×Ò  Ó)ˆØ�}‰}˜T×4Ñ4Ó5Ð5r7   c                	óF  a € R R/S P                   P                  n        V 3R lpS P                  P	                  \        V4      4      P                  S P                  4      p\        P                  ! S P                  4       V.4      pVP	                  S P                  4      # )ó
   {test}useró   {test}passwordc                 óÖ   <€ SP                   P                  R R4      p V P                  \        P                  R\        S4      ,           4       V P                  SP                  4       R# )r+  r,  r�  N)r€  rà  r²  r%   rŽ  rý   r§   rŠ  rá  s    €r4   rà  Ú9IMAP4ServerTests.testLoginRequiringQuoting.<locals>.login5  sG   ø€ Ø—‘×!Ñ! -Ð1BÓCˆAØ�L‰LœŸ™ /´C¸³IÕ"=Ô>Ø�M‰M˜$×,Ñ,Ö-r7   )r  rL  Úusersr�  r§   r8   r²  r�  r   r³  r#   Ú_cbTestLoginRequiringQuotingrä  s   f   r4   ÚtestLoginRequiringQuotingÚ*IMAP4ServerTests.testLoginRequiringQuoting2  sy   ø€ Ø%2Ð4EÐ$Fˆ�‰×ÑÔ!õ	.ð
 �^‰^×'Ñ'¬¨e«Ó5×@Ñ@ÀÇÁÓQˆÜ×Ò §¡£°"Ð 5Ó6ˆØ�}‰}˜T×>Ñ>Ó?Ð?r7   c                	óº   € V P                  V P                  P                  \        P                  4       V P                  V P                  P
                  R 4       R# rè  rê  rí  s   &&r4   r0  Ú-IMAP4ServerTests._cbTestLoginRequiringQuoting>  rð  r7   c                	óœ  a € R S n         V 3R lpV 3R lpS P                  P                  \        V4      4      pVP                  \        V4      4       VP	                  S P
                  4       S P                  4       p\        P                  ! W4.4      pVP                  V 3R l4       pVP                  S P                  RR... . .4       V# )Nc                 ó<   <€ S P                   P                  R R4      # r  r  rV   s   €r4   rà  Ú-IMAP4ServerTests.testNamespace.<locals>.loginE  r!  r7   c                 ób   <€ V3R  lp SP                   P                  4       P                  V 4      # )c                ó8   <€ V Sn         SP                  R 4       R # r0   ©ÚnamespaceArgsrŠ  ©rP  rF   s   &€r4   ÚgotNamespaceÚGIMAP4ServerTests.testNamespace.<locals>.namespace.<locals>.gotNamespaceI  ó   ø€ Ø%)�Ô"Ø×"Ñ" 4Ö(r7   ©r€  Ú	namespacer§   ©r=  rF   s    €r4   rA  Ú1IMAP4ServerTests.testNamespace.<locals>.namespaceH  ó(   ø€ õ)ð —;‘;×(Ñ(Ó*×6Ñ6°|ÓDÐDr7   c                ó’   <€ SP                    F+  pV F"  pV F  pSP                  V\        4       K  	  K$  	  K-  	  SP                   # r0   )r;  r  rý   )rî  Ú
namespacesÚpairr—  rF   s   &   €r4   ÚassertAllPairsNativeStringsÚCIMAP4ServerTests.testNamespace.<locals>.assertAllPairsNativeStringsU  sE   ø€ à"×0Ô0�
Û&�DÛ!%˜Ø×-Ñ-¨e´SÖ9ó "&ó 'ñ 1ð ×%Ñ%Ð%r7   rw  rt  )
r;  r�  r§   r8   r²  r�  r#   r   r³  rC   )rF   rà  rA  r´  rú  rª   rH  s   f      r4   ÚtestNamespaceÚIMAP4ServerTests.testNamespaceB  s­   ø€ Ø!ˆÔõ	Dõ	Eð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰”u˜YÓ'Ô(Ø
�‰�d—o‘oÔ&Ø�]‰]‹_ˆÜ×Ò  Ó)ˆà	
�‰ô	&ó 
ð	&ð 	
�‰�d×&Ñ&¨2¨s¨)¨°b¸"Ð(=Ô>Øˆr7   c                óÊ  a € \        R4      S P                  n        RS n        V 3R lpV 3R lpS P                  P                  \        V4      4      pVP                  \        V4      4       VP                  S P                  4       S P                  4       p\        P                  ! W4.4      pVP                  V 3R l4       VP                  S P                  . . . .4       V# )z~
A mailbox that does not provide L{INamespacePresenter} returns
empty L{list}s for its personal, shared, and user namespaces.
rD  Nc                 ó<   <€ S P                   P                  R R4      # r  r  rV   s   €r4   rà  Ú<IMAP4ServerTests.test_mailboxWithoutNamespace.<locals>.loginh  r!  r7   c                 ób   <€ V3R  lp SP                   P                  4       P                  V 4      # )c                ó8   <€ V Sn         SP                  R 4       R # r0   r:  r<  s   &€r4   r=  ÚVIMAP4ServerTests.test_mailboxWithoutNamespace.<locals>.namespace.<locals>.gotNamespacel  r?  r7   r@  rB  s    €r4   rA  Ú@IMAP4ServerTests.test_mailboxWithoutNamespace.<locals>.namespacek  rD  r7   c                ó   <€ SP                   # r0   )r;  rÍ  s   &€r4   r5   Ú?IMAP4ServerTests.test_mailboxWithoutNamespace.<locals>.<lambda>w  s   ø€  × 2Ò 2r7   )r4  r  rY  r;  r�  r§   r8   r²  r�  r#   r   r³  rC   )rF   rà  rA  r´  rú  rª   s   f     r4   Útest_mailboxWithoutNamespaceÚ-IMAP4ServerTests.test_mailboxWithoutNamespace`  s®   ø€ ô
 ":¸+Ó!Fˆ�‰ÔØ!ˆÔõ	Dõ	Eð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰”u˜YÓ'Ô(Ø
�‰�d—o‘oÔ&Ø�]‰]‹_ˆÜ×Ò  Ó)ˆØ	�‰Ô2Ô3Ø	�‰�d×&Ñ&¨¨R°¨Ô5Øˆr7   c                	óš  a € \         P                  P                  R 4       RS n        V 3R lpV 3R lpS P                  P                  \        V4      4      pVP                  \        V4      4       VP                  S P                  4       S P                  4       p\        P                  ! W4.4      P                  S P                  4      # )útest-mailboxNc                 ó<   <€ S P                   P                  R R4      # r  r  rV   s   €r4   rà  Ú*IMAP4ServerTests.testSelect.<locals>.login  r!  r7   c                 ól   <€ V3R  lp SP                   P                  R4      pVP                  V 4       V# )c                ó8   <€ V Sn         SP                  R 4       R # r0   )ÚselectedArgsrŠ  r<  s   &€r4   ÚselectedÚ=IMAP4ServerTests.testSelect.<locals>.select.<locals>.selectedƒ  ó   ø€ Ø$(�Ô!Ø×"Ñ" 4Ö(r7   rX  )r€  r=  r§   )r^  rª   rF   s     €r4   r=  Ú+IMAP4ServerTests.testSelect.<locals>.select‚  s/   ø€ õ)ð —‘×"Ñ" >Ó2ˆAØ�M‰M˜(Ô#ØˆHr7   )rC  rY  Ú
addMailboxr]  r�  r§   r8   r²  r�  r#   r   r³  Ú_cbTestSelect)rF   rà  r=  r´  rú  s   f    r4   Ú
testSelectÚIMAP4ServerTests.testSelect{  s“   ø€ Ü×Ñ×*Ñ*¨>Ô:Ø ˆÔõ	Dõ	ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰”u˜V“}Ô%Ø
�‰�d—o‘oÔ&Ø�]‰]‹_ˆÜ×"Ò" B 8Ó,×8Ñ8¸×9KÑ9KÓLÐLr7   c                ó  a € V 3R lpV 3R lpS P                   P                  \        V4      4       S P                   P                  \        V4      4       S P                   P                  S P                  R4       S P                   P                  S P
                  4       S P                   P                  S P                  4       \        P                  ! S P                   S P                  4       .4      pVP                  V 3R l4       pV# )zP
A client that selects a mailbox that does not exist receives a
C{NO} response.
c                 ó<   <€ S P                   P                  R R4      # r  r  rV   s   €r4   rà  Ú9IMAP4ServerTests.test_selectWithoutMailbox.<locals>.login—  r!  r7   c                 ó:   <€ S P                   P                  R 4      # )rX  ©r€  r=  rV   s   €r4   r=  Ú:IMAP4ServerTests.test_selectWithoutMailbox.<locals>.selectš  ó   ø€ Ø—;‘;×%Ñ% nÓ5Ð5r7   ó   No such mailboxc                óR   <€ SP                  SP                  P                  4       R # r0   )ÚassertIsNoner  r³  rÍ  s   &€r4   ÚassertNoMailboxSelectedÚKIMAP4ServerTests.test_selectWithoutMailbox.<locals>.assertNoMailboxSelected¥  s   ø€ à×Ñ˜dŸk™k×.Ñ.Ö/r7   )
r�  r§   r8   r²  r˜  rŠ  r�  r   r³  r#   )rF   rà  r=  ÚconnectionCompleterp  s   f    r4   Útest_selectWithoutMailboxÚ*IMAP4ServerTests.test_selectWithoutMailbox‘  sÅ   ø€ õ	Dõ	6ð 	�‰×"Ñ"¤5¨£<Ô0Ø�‰×"Ñ"¤5¨£=Ô1Ø�‰×!Ñ! $×"AÑ"AÐCUÔVØ�‰×"Ñ" 4×#5Ñ#5Ô6Ø�‰×!Ñ! $§/¡/Ô2ä"×0Ò0°$·.±.À$Ç-Á-Ã/Ð1RÓSÐà	×	'Ñ	'ô	0ó 
(ð	0ð "Ð!r7   c                	óà   € \         P                  P                  R ,          pV P                  V P                  P
                  V4       V P                  V P                  R^	R^R^*RRRR/4       R# )	úTEST-MAILBOXÚEXISTSr§  r©  rÑ  ú
READ-WRITETNr  )rC  rY  Ú	mailboxesrC   r  r³  r]  ©rF   rî  r³  s   && r4   rc  ÚIMAP4ServerTests._cbTestSelect«  sh   € Ü×&Ñ&×0Ñ0°Õ@ˆØ×Ñ˜Ÿ™×)Ñ)¨4Ô0Ø×ÑØ×Ñà˜!Ø˜!Ø˜rØÐMØ˜dðö		
r7   c                óž  a € \         P                  P                  R4       RS n        V 3R lpV 3R lpS P                  P                  \        V4      4      pVP                  \        V4      4       VP                  S P                  4       S P                  4       p\        P                  ! W4.4      pVP                  S P                  4      # )a/  
L{IMAP4Client.examine} issues an I{EXAMINE} command to the server and
returns a L{Deferred} which fires with a C{dict} with as many of the
following keys as the server includes in its response: C{'FLAGS'},
C{'EXISTS'}, C{'RECENT'}, C{'UNSEEN'}, C{'READ-WRITE'}, C{'READ-ONLY'},
C{'UIDVALIDITY'}, and C{'PERMANENTFLAGS'}.

Unfortunately the server doesn't generate all of these so it's hard to
test the client's handling of them here.  See
L{IMAP4ClientExamineTests} below.

See U{RFC 3501<http://www.faqs.org/rfcs/rfc3501.html>}, section 6.3.2,
for details.
rX  Nc                 ó<   <€ S P                   P                  R R4      # r  r  rV   s   €r4   rà  Ú,IMAP4ServerTests.test_examine.<locals>.loginË  r!  r7   c                 ól   <€ V3R  lp SP                   P                  R4      pVP                  V 4       V# )c                ó8   <€ V Sn         SP                  R 4       R # r0   )ÚexaminedArgsrŠ  r<  s   &€r4   ÚexaminedÚ@IMAP4ServerTests.test_examine.<locals>.examine.<locals>.examinedÏ  r`  r7   rX  )r€  Úexaminer§   )r‚  rª   rF   s     €r4   r„  Ú.IMAP4ServerTests.test_examine.<locals>.examineÎ  s/   ø€ õ)ð —‘×#Ñ# NÓ3ˆAØ�M‰M˜(Ô#ØˆHr7   )rC  rY  rb  r�  r�  r§   r8   r²  r�  r#   r   r³  Ú_cbTestExamine)rF   rà  r„  r´  rú  rª   s   f     r4   Útest_examineÚIMAP4ServerTests.test_examine¹  s˜   ø€ ô 	×Ñ×*Ñ*¨>Ô:Ø ˆÔõ	Dõ	ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰”u˜W“~Ô&Ø
�‰�d—o‘oÔ&Ø�]‰]‹_ˆÜ×Ò  Ó)ˆØ�}‰}˜T×0Ñ0Ó1Ð1r7   c                	óà   € \         P                  P                  R ,          pV P                  V P                  P
                  V4       V P                  V P                  R^	R^R^*RRRR/4       R# )	rv  rw  r§  r©  rÑ  rx  FNr  )rC  rY  ry  rC   r  r³  r�  rz  s   && r4   r†  ÚIMAP4ServerTests._cbTestExamineÞ  sh   € Ü×&Ñ&×0Ñ0°Õ@ˆØ×Ñ˜Ÿ™×)Ñ)¨4Ô0Ø×ÑØ×Ñà˜!Ø˜!Ø˜rØÐMØ˜eðö		
r7   c                	óZ  a aaaa	€ Ro	RoV 3R loV 3R loV 3R lpVVVV V	3R lp. S n         S P                  P                  \        V4      4      P                  \        V4      4      pS P	                  4       p\
        P                  ! W4.4      pVP                  S P                  S	S4      # )Útestboxc                 ó>   <€ S P                   P                  ^4       R# rè  ©r2   r…   rV   s   €r4   ÚcbÚ'IMAP4ServerTests.testCreate.<locals>.cbð  ó   ø€ Ø�K‰K×Ñ˜qÖ!r7   c                ó>   <€ SP                   P                  ^ 4       R# ©rü  NrŽ  ©r$   rF   s   &€r4   ÚebÚ'IMAP4ServerTests.testCreate.<locals>.ebó  r‘  r7   c                 ó<   <€ S P                   P                  R R4      # r  r  rV   s   €r4   rà  Ú*IMAP4ServerTests.testCreate.<locals>.loginö  r!  r7   c                 óü   <€ SS,            FG  p SP                   P                  V 4      pVP                  \        S4      4      P	                  S4       KI  	  XP                  SP                  SP                  4       R # r0   )r€  Úcreater§   r8   r²  ÚaddCallbacksrŠ  r�  )r7  rª   r�  r•  r‡  rF   rˆ  s     €€€€€r4   rš  Ú+IMAP4ServerTests.testCreate.<locals>.createù  s\   ø€ Ø $Ÿ˜�Ø—K‘K×&Ñ& tÓ,�Ø—‘œe B›iÓ(×3Ñ3°BÖ7ñ 'ð �N‰N˜4×-Ñ-¨t¯©Ö?r7   )rŒ  útest/boxztest/útest/box/boxÚINBOX)rŒ  r�  )r2   r�  r§   r8   r#   r   r³  Ú_cbTestCreate)
rF   rà  rš  r´  rú  rª   r�  r•  r‡  rˆ  s
   f     @@@@r4   Ú
testCreateÚIMAP4ServerTests.testCreateì  s�   ü€ ØKˆØ&ˆõ	"õ	"õ	D÷	@ñ 	@ð ˆŒØ�^‰^×'Ñ'¬¨e«Ó5×AÑAÄ%ÈÃ-ÓPˆØ�]‰]‹_ˆÜ×Ò  Ó)ˆØ�}‰}˜T×/Ñ/°¸$Ó?Ð?r7   c                	óV  € V P                  V P                  ^.\        V4      ,          ^ .\        V4      ,          ,           4       \        \        P
                  P                  4      p\        . RO4      pT P                  YE Uu. uF  qfP                  4       NK  	  up4       R# u upi )rÜ   N)ÚinboxrŒ  r�  Útestrž  )rC   r2   rå   r•  rC  rY  ry  r{  )rF   rî  rˆ  r‡  r³  r«  Úas   &&&&   r4   r   ÚIMAP4ServerTests._cbTestCreate	  sw   € Ø×Ñ˜Ÿ™ q c¬C°«LÕ&8¸A¸3ÄÀTÃ½?Õ&JÔKÜ”l×-Ñ-×7Ñ7Ó8ˆÜÒQÓRˆØ×Ñ˜°7Ó;±7¨a§¡¦	±7Ñ;Ö<ùÒ;s   ÂB&
c                	ó´  a € \         P                  P                  R 4       V 3R lpV 3R lpS P                  P	                  \        V4      4      pVP                  \        V4      S P                  4       VP                  S P                  S P                  4       S P                  4       p\        P                  ! W4.4      pVP	                  V 3R l4       V# )ú	delete/mec                 ó<   <€ S P                   P                  R R4      # r  r  rV   s   €r4   rà  Ú*IMAP4ServerTests.testDelete.<locals>.login	  r!  r7   c                 ó:   <€ S P                   P                  R 4      # ©r©  ©r€  rõ  rV   s   €r4   rõ  Ú+IMAP4ServerTests.testDelete.<locals>.delete	  ó   ø€ Ø—;‘;×%Ñ% kÓ2Ð2r7   c                ój   <€ SP                  \        \        P                  P                  4      . 4      # r0   )rC   ræ   rC  rY  ry  rÍ  s   &€r4   r5   Ú-IMAP4ServerTests.testDelete.<locals>.<lambda>	  s$   ø€ �d×&Ñ&¤t¬L×,CÑ,C×,MÑ,MÓ'NÐPRÔSr7   ©rC  rY  rb  r�  r§   r8   r›  r�  rŠ  r#   r   r³  )rF   rà  rõ  r´  rú  rª   s   f     r4   Ú
testDeleteÚIMAP4ServerTests.testDelete	  s�   ø€ Ü×Ñ×*Ñ*¨;Ô7õ	Dõ	3ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰œ˜f› t§¡Ô7Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆÜ×Ò  Ó)ˆØ	�‰ÜSô	
ð ˆr7   c                ó
  a € \         P                  P                  R4       \         P                  P                  R4       V 3R lpV 3R lpV 3R lpS P                  P	                  \        V4      4      pVP                  \        V4      S P                  4       VP                  V4       VP                  S P                  4       S P                  4       p\        P                  ! WE.4      pVP	                  V 3R l4       V# )zÉ
Attempting to delete a mailbox with hierarchically inferior
names fails with an informative error.

@see: U{https://tools.ietf.org/html/rfc3501#section-6.3.4}

@return: A L{Deferred} with assertions.
rõ  r©  c                 ó<   <€ S P                   P                  R R4      # r  r  rV   s   €r4   rà  ÚGIMAP4ServerTests.testDeleteWithInferiorHierarchicalNames.<locals>.login*	  r!  r7   c                 ó:   <€ S P                   P                  R 4      # ©rõ  r®  rV   s   €r4   rõ  ÚHIMAP4ServerTests.testDeleteWithInferiorHierarchicalNames.<locals>.delete-	  ó   ø€ Ø—;‘;×%Ñ% hÓ/Ð/r7   c                ó¤   <€ V P                   ! \        P                  4       SP                  \	        V P
                  4      \	        R 4      4       R# )s-   Name "DELETE" has inferior hierarchical namesN)r•  r   r–  rC   rý   r—  r”  s   &€r4   ÚassertIMAPExceptionÚUIMAP4ServerTests.testDeleteWithInferiorHierarchicalNames.<locals>.assertIMAPException0	  s8   ø€ Ø�LŠLœ×-Ñ-Ô.Ø×ÑÜ�G—M‘MÓ"ÜÐDÓEör7   c                ón   <€ SP                  \        \        P                  P                  4      R R.4      # )ÚDELETEz	DELETE/ME)rC   r•  rC  rY  ry  rÍ  s   &€r4   r5   ÚJIMAP4ServerTests.testDeleteWithInferiorHierarchicalNames.<locals>.<lambda>?	  s+   ø€ �d×&Ñ&Ü”|×.Ñ.×8Ñ8Ó9¸HÀkÐ;Rôr7   )rC  rY  rb  r�  r§   r8   r›  r�  r²  rŠ  r#   r   r³  )rF   rà  rõ  r¾  ÚloggedInÚ
loopedBackrª   s   f      r4   Ú'testDeleteWithInferiorHierarchicalNamesÚ8IMAP4ServerTests.testDeleteWithInferiorHierarchicalNames	  sÈ   ø€ ô 	×Ñ×*Ñ*¨8Ô4Ü×Ñ×*Ñ*¨;Ô7õ	Dõ	0õ	ð —>‘>×-Ñ-¬e°E«lÓ;ˆØ×Ñœe F›m¨T¯_©_Ô=Ø×ÑÐ/Ô0Ø×Ñ˜d×0Ñ0Ô1à—]‘]“_ˆ
Ü×Ò Ð 6Ó7ˆØ	�‰ôô	
ð
 ˆr7   c                	ó²  a € R S n         V 3R lpV 3R lpV 3R lpS P                  P                  \        V4      4      pVP	                  \        V4      S P
                  4       VP                  V4       VP	                  S P                  S P
                  4       S P                  4       p\        P                  ! WE.4      pVP                  V 3R l4       V# )Nc                 ó<   <€ S P                   P                  R R4      # r  r  rV   s   €r4   rà  Ú6IMAP4ServerTests.testIllegalInboxDelete.<locals>.loginH	  r!  r7   c                 ó:   <€ S P                   P                  R 4      # )r¤  r®  rV   s   €r4   rõ  Ú7IMAP4ServerTests.testIllegalInboxDelete.<locals>.deleteK	  s   ø€ Ø—;‘;×%Ñ% gÓ.Ð.r7   c                ó   <€ V Sn         R # r0   ©Ústashed©r2   rF   s   &€r4   ÚstashÚ6IMAP4ServerTests.testIllegalInboxDelete.<locals>.stashN	  s
   ø€ Ø!ˆDŽLr7   c                ój   <€ SP                  \        SP                  \        P                  4      4      # r0   ©rƒ  ræ  rÎ  r$   ÚFailurerÍ  s   &€r4   r5   Ú9IMAP4ServerTests.testIllegalInboxDelete.<locals>.<lambda>X	  ó   ø€ �d—o‘o¤j°·±¼w¿¹Ó&OÔPr7   ©rÎ  r�  r§   r8   r›  r�  rõ  rŠ  r#   r   r³  )rF   rà  rõ  rÐ  r´  rú  rª   s   f      r4   ÚtestIllegalInboxDeleteÚ'IMAP4ServerTests.testIllegalInboxDeleteE	  s¡   ø€ ØˆŒõ	Dõ	/õ	"ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰œ˜f› t§¡Ô7Ø
�
‰
�5ÔØ
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆÜ×Ò  Ó)ˆØ	�‰ÜPô	
ð ˆr7   c                	ó˜  a € V 3R  lpV 3R lpV 3R lpRS n         S P                  P                  \        V4      4      pVP                  \        V4      4      P	                  V4       VP                  S P                  S P                  4       S P                  4       p\        P                  ! WE.4      pVP                  V 3R l4       V# )c                 ó<   <€ S P                   P                  R R4      # r  r  rV   s   €r4   rà  Ú5IMAP4ServerTests.testNonExistentDelete.<locals>.login]	  r!  r7   c                 ó:   <€ S P                   P                  R 4      # r­  r®  rV   s   €r4   rõ  Ú6IMAP4ServerTests.testNonExistentDelete.<locals>.delete`	  r°  r7   c                ó   <€ V Sn         R # r0   ©r$   r”  s   &€r4   ÚdeleteFailedÚ<IMAP4ServerTests.testNonExistentDelete.<locals>.deleteFailedc	  ó
   ø€ Ø"ˆDŽLr7   Nc                ót   <€ SP                  \        SP                  P                  4      \        R 4      4      # )rm  ©rC   rý   r$   r—  rÍ  s   &€r4   r5   Ú8IMAP4ServerTests.testNonExistentDelete.<locals>.<lambda>m	  s'   ø€ �d×&Ñ&¤s¨4¯<©<×+=Ñ+=Ó'>ÄÐDVÓ@WÔXr7   )r$   r�  r§   r8   r²  r›  rŠ  r�  r#   r   r³  )rF   rà  rõ  rá  r´  rú  rª   s   f      r4   ÚtestNonExistentDeleteÚ&IMAP4ServerTests.testNonExistentDelete\	  sš   ø€ õ	Dõ	3õ	#ð ˆŒØ�^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰”u˜V“}Ó%×0Ñ0°Ô>Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆÜ×Ò  Ó)ˆØ	�‰ÜXô	
ð ˆr7   c                	óR  a a€ \        4       pR	Vn        \        P                  P	                  RV4       \        P                  P	                  R4       V 3R lpV 3R lpV 3R lpRS n        S P                  P                  \        V4      4      pVP                  \        V4      4      P                  V4       VP                  S P                  S P                  4       S P                  4       p\        P                  ! WV.4      p\!        R4      oVP                  VV 3R l4       V# )
ú	\Noselectrõ  r©  c                 ó<   <€ S P                   P                  R R4      # r  r  rV   s   €r4   rà  Ú1IMAP4ServerTests.testIllegalDelete.<locals>.loginw	  r!  r7   c                 ó:   <€ S P                   P                  R 4      # rº  r®  rV   s   €r4   rõ  Ú2IMAP4ServerTests.testIllegalDelete.<locals>.deletez	  r¼  r7   c                ó   <€ V Sn         R # r0   rà  r”  s   &€r4   rá  Ú8IMAP4ServerTests.testIllegalDelete.<locals>.deleteFailed}	  rã  r7   Ns<   Hierarchically inferior mailboxes exist and \Noselect is setc                ób   <€ SP                  \        SP                  P                  4      S4      # r0   rå  )r°  r—  rF   s   &€€r4   r5   Ú4IMAP4ServerTests.testIllegalDelete.<locals>.<lambda>‰	  s!   ø€  × 0Ñ 0´°T·\±\×5GÑ5GÓ1HÈ(Ô Sr7   )rê  )r«  rÓ  rC  rY  rb  r$   r�  r§   r8   r²  r›  rŠ  r�  r#   r   r³  rý   )	rF   r  rà  rõ  rá  r´  rú  rª   r—  s	   f       @r4   ÚtestIllegalDeleteÚ"IMAP4ServerTests.testIllegalDeleteq	  sÝ   ù€ Ü‹OˆØ!ˆŒÜ×Ñ×*Ñ*¨8°QÔ7Ü×Ñ×*Ñ*¨;Ô7õ	Dõ	0õ	#ð ˆŒØ�^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰”u˜V“}Ó%×0Ñ0°Ô>Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆÜ×Ò  Ó)ˆÜØPó
ˆð 	
�‰ÕSÔTØˆr7   c                	ó´  a € \         P                  P                  R 4       V 3R lpV 3R lpS P                  P	                  \        V4      4      pVP                  \        V4      S P                  4       VP                  S P                  S P                  4       S P                  4       p\        P                  ! W4.4      pVP	                  V 3R l4       V# )Úoldmboxc                 ó<   <€ S P                   P                  R R4      # r  r  rV   s   €r4   rà  Ú*IMAP4ServerTests.testRename.<locals>.login�	  r!  r7   c                 ó<   <€ S P                   P                  R R4      # )s   oldmboxs   newname©r€  ÚrenamerV   s   €r4   rû  Ú+IMAP4ServerTests.testRename.<locals>.rename’	  s   ø€ Ø—;‘;×%Ñ% j°*Ó=Ð=r7   c                óˆ   <€ SP                  \        \        P                  P                  P                  4       4      R .4      # )ÚNEWNAME)rC   ræ   rC  rY  ry  r²  rÍ  s   &€r4   r5   Ú-IMAP4ServerTests.testRename.<locals>.<lambda>›	  s1   ø€ �d×&Ñ&Ü”\×,Ñ,×6Ñ6×;Ñ;Ó=Ó>ÀÀôr7   r³  ©rF   rà  rû  r´  rú  rª   s   f     r4   Ú
testRenameÚIMAP4ServerTests.testRenameŒ	  sŸ   ø€ Ü×Ñ×*Ñ*¨9Ô5õ	Dõ	>ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰œ˜f› t§¡Ô7Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆÜ×Ò  Ó)ˆØ	�‰ôô	
ð
 ˆr7   c                	ó²  a € R S n         V 3R lpV 3R lpV 3R lpS P                  P                  \        V4      4      pVP	                  \        V4      S P
                  4       VP                  V4       VP	                  S P                  S P
                  4       S P                  4       p\        P                  ! WE.4      pVP                  V 3R l4       V# )Nc                 ó<   <€ S P                   P                  R R4      # r  r  rV   s   €r4   rà  Ú6IMAP4ServerTests.testIllegalInboxRename.<locals>.login¤	  r!  r7   c                 ó<   <€ S P                   P                  R R4      # )r¤  Úfrotzrú  rV   s   €r4   rû  Ú7IMAP4ServerTests.testIllegalInboxRename.<locals>.rename§	  s   ø€ Ø—;‘;×%Ñ% g¨wÓ7Ð7r7   c                ó   <€ V Sn         R # r0   rÍ  )ÚstuffrF   s   &€r4   rÐ  Ú6IMAP4ServerTests.testIllegalInboxRename.<locals>.stashª	  s
   ø€ Ø ˆDŽLr7   c                ój   <€ SP                  \        SP                  \        P                  4      4      # r0   rÓ  rÍ  s   &€r4   r5   Ú9IMAP4ServerTests.testIllegalInboxRename.<locals>.<lambda>´	  rÖ  r7   r×  )rF   rà  rû  rÐ  r´  rú  rª   s   f      r4   ÚtestIllegalInboxRenameÚ'IMAP4ServerTests.testIllegalInboxRename¡	  s¡   ø€ ØˆŒõ	Dõ	8õ	!ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰œ˜f› t§¡Ô7Ø
�
‰
�5ÔØ
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆÜ×Ò  Ó)ˆØ	�‰ÜPô	
ð ˆr7   c                	óú  a € \         P                  P                  R 4       \         P                  P                  R4       V 3R lpV 3R lpS P                  P	                  \        V4      4      pVP                  \        V4      S P                  4       VP                  S P                  S P                  4       S P                  4       p\        P                  ! W4.4      pVP	                  S P                  4      # )z
oldmbox/m1z
oldmbox/m2c                 ó<   <€ S P                   P                  R R4      # r  r  rV   s   €r4   rà  Ú6IMAP4ServerTests.testHierarchicalRename.<locals>.login¼	  r!  r7   c                 ó<   <€ S P                   P                  R R4      # )rö  Únewnamerú  rV   s   €r4   rû  Ú7IMAP4ServerTests.testHierarchicalRename.<locals>.rename¿	  s   ø€ Ø—;‘;×%Ñ% i°Ó;Ð;r7   )rC  rY  rš  r�  r§   r8   r›  r�  rŠ  r#   r   r³  Ú_cbTestHierarchicalRenamer   s   f     r4   ÚtestHierarchicalRenameÚ'IMAP4ServerTests.testHierarchicalRename¸	  s°   ø€ Ü×Ñ×&Ñ& |Ô4Ü×Ñ×&Ñ& |Ô4õ	Dõ	<ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰œ˜f› t§¡Ô7Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆÜ×Ò  Ó)ˆØ�}‰}˜T×;Ñ;Ó<Ð<r7   c                	óì   € \         P                  P                  P                  4       p. ROp\	        \        V4      4      pT P                  Y# Uu. uF  qDP                  4       NK  	  up4       R# u upi )r  N)r  z
newname/m1z
newname/m2)rC  rY  ry  r²  ræ   r•  rC   r{  )rF   rî  Úmboxesr—  r­  s   &&   r4   r  Ú*IMAP4ServerTests._cbTestHierarchicalRenameÉ	  sU   € Ü×(Ñ(×2Ñ2×7Ñ7Ó9ˆÚ:ˆÜ”f˜V“nÓ%ˆØ×Ñ˜°XÓ!>±X°§'¡'¦)±XÑ!>Ö?ùÒ!>s   ÁA1
c                	óv  a € V 3R  lpV 3R lpS P                   P                  \        V4      4      pVP                  \        V4      S P                  4       VP                  S P
                  S P                  4       S P                  4       p\        P                  ! W4.4      pVP                  V 3R l4       V# )c                 ó<   <€ S P                   P                  R R4      # r  r  rV   s   €r4   rà  Ú-IMAP4ServerTests.testSubscribe.<locals>.loginÐ	  r!  r7   c                 ó:   <€ S P                   P                  R 4      # ©z	this/mbox)r€  Ú	subscriberV   s   €r4   r!  Ú1IMAP4ServerTests.testSubscribe.<locals>.subscribeÓ	  s   ø€ Ø—;‘;×(Ñ(¨Ó5Ð5r7   c                óZ   <€ SP                  \        P                  P                  R .4      # )ú	THIS/MBOX©rC   rC  rY  ÚsubscriptionsrÍ  s   &€r4   r5   Ú0IMAP4ServerTests.testSubscribe.<locals>.<lambda>Ü	  ó#   ø€ �d×&Ñ&Ü×'Ñ'×5Ñ5¸°}ôr7   )	r�  r§   r8   r›  r�  rŠ  r#   r   r³  )rF   rà  r!  r´  rú  rª   s   f     r4   ÚtestSubscribeÚIMAP4ServerTests.testSubscribeÏ	  sŒ   ø€ õ	Dõ	6ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰œ˜iÓ(¨$¯/©/Ô:Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆÜ×Ò  Ó)ˆØ	�‰ôô	
ð
 ˆr7   c                	ó¤  a € R R.\         P                  n        V 3R lpV 3R lpS P                  P	                  \        V4      4      pVP                  \        V4      S P                  4       VP                  S P                  S P                  4       S P                  4       p\        P                  ! W4.4      pVP	                  V 3R l4       V# )r$  ú	THAT/MBOXc                 ó<   <€ S P                   P                  R R4      # r  r  rV   s   €r4   rà  Ú/IMAP4ServerTests.testUnsubscribe.<locals>.loginå	  r!  r7   c                 ó:   <€ S P                   P                  R 4      # r   )r€  ÚunsubscriberV   s   €r4   r0  Ú5IMAP4ServerTests.testUnsubscribe.<locals>.unsubscribeè	  s   ø€ Ø—;‘;×*Ñ*¨;Ó7Ð7r7   c                óZ   <€ SP                  \        P                  P                  R .4      # )r,  r%  rÍ  s   &€r4   r5   Ú2IMAP4ServerTests.testUnsubscribe.<locals>.<lambda>ñ	  r(  r7   )rC  rY  r&  r�  r§   r8   r›  r�  rŠ  r#   r   r³  )rF   rà  r0  r´  rú  rª   s   f     r4   ÚtestUnsubscribeÚ IMAP4ServerTests.testUnsubscribeâ	  sŸ   ø€ Ø1<¸kÐ0JŒ×ÑÔ-õ	Dõ	8ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰œ˜kÓ*¨D¯O©OÔ<Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆÜ×Ò  Ó)ˆØ	�‰ôô	
ð
 ˆr7   c               ó    € V ^8„  d   QhRRRR/# )rß   r3   ÚobjectÚreturnzDeferred[Any]r1   )Úformats   "r4   Ú__annotate__ÚIMAP4ServerTests.__annotate__÷	  s   € ÷ Pñ P˜Fð P }ñ Pr7   c                	ón  a € \         P                  P                  R 4       \         P                  P                  R4       \         P                  P                  R4       V 3R lpV 3R lpRS n        S P                  P                  \        V4      4      pVP                  \        V4      S P                  4       VP                  VS P                  4       VP                  S P                  S P                  4       S P                  4       p\        P                  ! WE.4      P                  V 3R l4      # )úroot/subthingzroot/another-thingznon-root/subthingc                 ó<   <€ S P                   P                  R R4      # r  r  rV   s   €r4   rà  Ú*IMAP4ServerTests._listSetup.<locals>.loginü	  r!  r7   c                ó   <€ V Sn         R # r0   ©Úlisted)r«  rF   s   &€r4   rB  Ú+IMAP4ServerTests._listSetup.<locals>.listedÿ	  s
   ø€ Ø!ˆDŽKr7   Nc                ó   <€ SP                   # r0   rA  rÍ  s   &€r4   r5   Ú-IMAP4ServerTests._listSetup.<locals>.<lambda>
  s	   ø€ À4Ç;Â;r7   )rC  rY  rb  rB  r�  r§   r8   r›  r�  rŠ  r#   r   r³  )rF   r3   rà  rB  r´  rú  s   f&    r4   Ú
_listSetupÚIMAP4ServerTests._listSetup÷	  s×   ø€ Ü×Ñ×*Ñ*¨?Ô;Ü×Ñ×*Ñ*Ð+?Ô@Ü×Ñ×*Ñ*Ð+>Ô?õ	Dõ	"ð ˆŒØ�^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰œ˜a› $§/¡/Ô2Ø
�‰˜ §¡Ô0Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆÜ×"Ò" B 8Ó,×8Ñ8Ô9NÓOÐOr7   c                ó�   € V F?  pV P                  V^,          \        R4       V P                  V^,          \        R4       KA  	  V# )z¨
Assert a C{LIST} response's delimiter and mailbox are native
strings.

@param results: A list of tuples as returned by
    L{IMAP4Client.list} or L{IMAP4Client.lsub}.
zdelimiter %r is not a strzmailbox %r is not a str)r  rý   )rF   Úresultsr2   s   && r4   Ú'assertListDelimiterAndMailboxAreStringsÚ8IMAP4ServerTests.assertListDelimiterAndMailboxAreStrings

  sC   € ó ˆFØ×!Ñ! &¨¥)¬SÐ2MÔNØ×!Ñ! &¨¥)¬SÐ2KÖLñ ð ˆr7   c                	ó`   a € V 3R  lpS P                  V4      pVP                  V 3R l4       pV# )c                 ó<   <€ S P                   P                  R R4      # ©ÚrootÚ%)r€  ræ   rV   s   €r4   ÚmailboxListÚ.IMAP4ServerTests.testList.<locals>.mailboxList
  ó   ø€ Ø—;‘;×#Ñ# F¨CÓ0Ð0r7   c                ó*  <€ \        \        P                  4      R R3\        \        P                  4      R R3.p\        ^4       F4  pV P	                  ^ 4      w  r4pSP                  \        V4      WE3V4       K6  	  SP                  V RV : 24       R# )rt  úROOT/SUBTHINGzROOT/ANOTHER-THINGzMore results than expected: N)r•  r«  rÓ  rs   Úpopr:  r�  )rB  ÚexpectedContentsr°  rÓ  Ú	delimiterÚmailboxrF   s   &     €r4   ÚassertListContentsÚ5IMAP4ServerTests.testList.<locals>.assertListContents
  s�   ø€ ô œ×+Ñ+Ó,¨c°?ÐCÜœ×+Ñ+Ó,¨cÐ3GÐHð Ðô
 ˜1–X�Ø,2¯J©J°q«MÑ)� 'Ø—‘Ü˜E“] IÐ7Ø$öñ ð ×Ñ˜VÐ'CÀFÁ:Ð%NÖOr7   )rF  r§   )rF   rQ  rª   rZ  s   f   r4   ÚtestListÚIMAP4ServerTests.testList
  s7   ø€ õ	1ð �O‰O˜KÓ(ˆà	
�‰ô	Pó 
ð	Pð ˆr7   c                	ó  a € \         P                  P                  R 4       V 3R lpS P                  V4      pVP	                  S P
                  4       VP	                  S P                  \        P                  RR 3.4       V# )rU  c                 ó<   <€ S P                   P                  R R4      # rN  ©r€  ÚlsubrV   s   €r4   ra  Ú'IMAP4ServerTests.testLSub.<locals>.lsub2
  rS  r7   rt  )	rC  rY  r!  rF  r§   rJ  rC   r«  rÓ  )rF   ra  rª   s   f  r4   ÚtestLSubÚIMAP4ServerTests.testLSub/
  sg   ø€ Ü×Ñ×)Ñ)¨/Ô:õ	1ð �O‰O˜DÓ!ˆØ	�‰�d×BÑBÔCØ	�‰�d×&Ñ&¬-×*=Ñ*=¸sÀOÐ)TÐ(UÔVØˆr7   c               ó   € V ^8„  d   QhRR/# )rß   r8  zDeferred[None]r1   )r9  s   "r4   r:  r;  :
  s   € ÷ ñ  .ñ r7   c                ó¸  a € \         P                  P                  R4       R FA  p\         P                  P                  V4       \         P                  P                  V4       KC  	  V 3R lpS P	                  V4      pVP                  S P                  4       VP                  S P                  \        P                  RR3\        P                  RR3.4       V# )zP
LSUB commands should use IMAP wildcards, and not be treated as Python
regexes.
rU  úROOT/.SUBMATCHúROOT/.DEEP/MATCHc                 ó<   <€ S P                   P                  R R4      # )rO  zroot/.*r`  rV   s   €r4   ra  Ú/IMAP4ServerTests.test_LSubNoRegex.<locals>.lsubM
  s   ø€ Ø—;‘;×#Ñ# F¨IÓ6Ð6r7   rt  )rg  rh  zROOT/DEEP/.MATCH)
rC  rY  r!  rb  rF  r§   rJ  rC   r«  rÓ  )rF   Ú
newMailboxra  rª   s   f   r4   Útest_LSubNoRegexÚ!IMAP4ServerTests.test_LSubNoRegex:
  s¹   ø€ ô 	×Ñ×)Ñ)¨/Ô:ó
ˆJô ×#Ñ#×.Ñ.¨zÔ:Ü×#Ñ#×-Ñ-¨jÖ9ñ
õ	7ð �O‰O˜DÓ!ˆØ	�‰�d×BÑBÔCØ	�‰Ø×Ñä×$Ñ$ cÐ+;Ð<Ü×$Ñ$ cÐ+=Ð>ðô	
ð ˆr7   c                	ó  a € \         P                  P                  R 4       V 3R lpV 3R lpV 3R lpRS n        S P                  P                  \        V4      4      pVP                  \        V4      S P                  4       VP                  VS P                  4       VP                  S P                  S P                  4       S P                  4       p\        P                  ! WE.4      pVP                  V 3R l4       V# )r=  c                 ó<   <€ S P                   P                  R R4      # r  r  rV   s   €r4   rà  Ú*IMAP4ServerTests.testStatus.<locals>.login^
  r!  r7   c                 ó@   <€ S P                   P                  R RRR4      # )r=  r¦  r¨  rª  ©r€  ÚstatusrV   s   €r4   rs  Ú+IMAP4ServerTests.testStatus.<locals>.statusa
  s   ø€ Ø—;‘;×%Ñ% o°zÀ9ÈhÓWÐWr7   c                ó   <€ V Sn         R # r0   ©ÚstatusedrÏ  s   &€r4   rw  Ú-IMAP4ServerTests.testStatus.<locals>.statusedd
  ó
   ø€ Ø"ˆDŽMr7   Nc           	     óH   <€ SP                  SP                  R ^	RRR^/4      # )r¦  r¨  s   10rª  )rC   rw  rÍ  s   &€r4   r5   Ú-IMAP4ServerTests.testStatus.<locals>.<lambda>o
  s&   ø€ �d×&Ñ&Ø—‘ 
¨A¨y¸%ÀÈ1ÐMôr7   )rC  rY  rb  rw  r�  r§   r8   r›  r�  rŠ  r#   r   r³  )rF   rà  rs  rw  r´  rú  rª   s   f      r4   Ú
testStatusÚIMAP4ServerTests.testStatus[
  s¾   ø€ Ü×Ñ×*Ñ*¨?Ô;õ	Dõ	Xõ	#ð ˆŒØ�^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰œ˜f› t§¡Ô7Ø
�‰˜ $§/¡/Ô2Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆÜ×Ò  Ó)ˆØ	�‰ôô	
ð
 ˆr7   c                	óÐ  a € V 3R  lpV 3R lpV 3R lpV 3R lpR;S n         S n        S P                  P                  \	        V4      4      pVP                  \	        V4      S P                  4       VP                  W44       VP                  S P                  S P                  4       S P                  4       p\        P                  ! WV.4      P                  S P                  4      # )c                 ó<   <€ S P                   P                  R R4      # r  r  rV   s   €r4   rà  Ú0IMAP4ServerTests.testFailedStatus.<locals>.loginv
  r!  r7   c                 ó@   <€ S P                   P                  R RRR4      # )zroot/nonexistentr¦  r¨  rª  rr  rV   s   €r4   rs  Ú1IMAP4ServerTests.testFailedStatus.<locals>.statusy
  s#   ø€ Ø—;‘;×%Ñ%Ø" J°	¸8óð r7   c                ó   <€ V Sn         R # r0   rv  rÏ  s   &€r4   rw  Ú3IMAP4ServerTests.testFailedStatus.<locals>.statused~
  ry  r7   c                ó   <€ V Sn         R # r0   rà  r”  s   &€r4   ÚfailedÚ1IMAP4ServerTests.testFailedStatus.<locals>.failed�
  rã  r7   N)rw  r$   r�  r§   r8   r›  r�  rŠ  r#   r   r³  Ú_cbTestFailedStatus)rF   rà  rs  rw  r†  r´  rú  s   f      r4   ÚtestFailedStatusÚ!IMAP4ServerTests.testFailedStatusu
  s©   ø€ õ	Dõ	õ
	#õ	#ð (,Ð+ˆŒ˜œØ�^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰œ˜f› t§¡Ô7Ø
�‰˜Ô)Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆÜ×"Ò" B 8Ó,×8Ñ8¸×9QÑ9QÓRÐRr7   c                	óž   € V P                  V P                  R 4       V P                  V P                  P                  P                  R4       R # )N)s   Could not open mailbox)rC   rw  r$   r—  rP  rí  s   &&r4   rˆ  Ú$IMAP4ServerTests._cbTestFailedStatusŒ
  s7   € Ø×Ñ˜Ÿ™¨Ô-Ø×Ñ˜Ÿ™×+Ñ+×0Ñ0Ð2NÖOr7   c                	ó  a a€ \         P                  ! \        R 4      o\        P                  P                  R4       V 3R lp\        P                  VV 3R l4       pS P                  P                  \        V4      4      pVP                  \        V4      S P                  4       VP                  S P                  S P                  4       S P                  4       p\        P                  ! W4.4      pVP                  S P                   S4      # )úrfc822.messager=  c                 ó<   <€ S P                   P                  R R4      # r  r  rV   s   €r4   rà  Ú.IMAP4ServerTests.testFullAppend.<locals>.login”
  r!  r7   c               3  ó¶   <"  € \        SR 4      ;_uu_ 4       p SP                  P                  RV RR4      x €pVuuRRR4       #   + '       g   i     R# ; i5i)Úrbr=  z%Tue, 17 Jun 2003 11:22:16 -0600 (MDT)N)ú\SEENú\DELETED)Úopenr€  r…   ©rì  r2   ÚinfilerF   s     €€r4   r…   Ú/IMAP4ServerTests.testFullAppend.<locals>.append—
  sM   øé € ä�f˜d×#Ô# wØ#Ÿ{™{×1Ñ1Ø#ØØ+Ø;ó	 ñ �ð ÷ $×#×#Ó#üs   ƒA˜"AºAÁA	Á	A)r&   ÚsibpathÚ__file__rC  rY  rb  r   ÚinlineCallbacksr�  r§   r8   r›  r�  rŠ  r#   r³  Ú_cbTestFullAppend©rF   rà  r…   r´  rú  rª   r—  s   f     @r4   ÚtestFullAppendÚIMAP4ServerTests.testFullAppend�
  sÄ   ù€ Ü—’œhÐ(8Ó9ˆÜ×Ñ×*Ñ*¨?Ô;õ	Dô 
×	Ñ	õ	ó 
ð	ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰œ˜f› t§¡Ô7Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆä×Ò  Ó)ˆà�}‰}˜T×3Ñ3°VÓ<Ð<r7   c                	óÞ  € \         P                  P                  R ,          pV P                  ^\	        VP
                  4      4       V P                  RR.R^ 3VP
                  ^ ,          R,          4       \        VR4      ;_uu_ 4       pV P                  VP                  4       VP
                  ^ ,          ^ ,          P                  4       4       RRR4       R#   + '       g   i     R# ; i)rU  r“  r”  s%   Tue, 17 Jun 2003 11:22:16 -0600 (MDT)ºrÜ   NNr’  N©	rC  rY  ry  rC   rå   rk  r•  r\   rc   ©rF   rî  r—  Úmbr3   s   &&&  r4   rœ  Ú"IMAP4ServerTests._cbTestFullAppend«
  s¬   € Ü×$Ñ$×.Ñ.¨Õ?ˆØ×Ñ˜œC §¡Ó,Ô-Ø×ÑØ˜Ð$Ð&NÐPQÐRØ�K‰K˜�N˜2Õô	
ô �&˜$×Ô 1Ø×Ñ˜QŸV™V›X r§{¡{°1¥~°aÕ'8×'AÑ'AÓ'CÔD÷  ××Òús   Â
ACÃC,	c                	ó  a a€ \         P                  ! \        R 4      o\        P                  P                  R4       V 3R lp\        P                  VV 3R l4       pS P                  P                  \        V4      4      pVP                  \        V4      S P                  4       VP                  S P                  S P                  4       S P                  4       p\        P                  ! W4.4      pVP                  S P                   S4      # )rŽ  úPARTIAL/SUBTHINGc                 ó<   <€ S P                   P                  R R4      # r  r  rV   s   €r4   rà  Ú1IMAP4ServerTests.testPartialAppend.<locals>.login¹
  r!  r7   c               3  ód  <"  € \        SR 4      ;_uu_ 4       p SP                  P                  \        P                  ! R\        R\        P                  P                  S4      3,          4      RSP                  P                  V 4      4      x €pVuuRRR4       #   + '       g   i     R# ; i5i)r’  s   APPENDz)PARTIAL/SUBTHING (\SEEN) "Right now" {%d}Nr1   )
r•  r€  ÚsendCommandr   r`  r)   ÚosÚpathÚgetsizeÚ_IMAP4Client__cbContinueAppendr–  s     €€r4   r…   Ú2IMAP4ServerTests.testPartialAppend.<locals>.append¼
  s�   øé € ä�f˜d×#Ô# wØ#Ÿ{™{×6Ñ6Ü—M’MØ!ô
 &ð#ä&(§g¡g§o¡o°fÓ&=Ð%?õ@óð
 ØŸ™×BÑBØóó ñ �ð" ÷% $×#×#Ó#üs   ƒB0˜A9BÂB0ÂB-	Â'	B0)r&   r™  rš  rC  rY  rb  r   r›  r�  r§   r8   r›  r�  rŠ  r#   r³  Ú_cbTestPartialAppendr�  s   f     @r4   ÚtestPartialAppendÚ"IMAP4ServerTests.testPartialAppendµ
  sÅ   ù€ Ü—’œhÐ(8Ó9ˆÜ×Ñ×*Ñ*Ð+=Ô>õ	Dô 
×	Ñ	õ	ó 
ð	ð* �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰œ˜f› t§¡Ô7Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆÜ×Ò  Ó)ˆØ�}‰}˜T×6Ñ6¸Ó?Ð?r7   c                	óÜ  € \         P                  P                  R ,          pV P                  ^\	        VP
                  4      4       V P                  R.R^ 3VP
                  ^ ,          R,          4       \        VR4      ;_uu_ 4       pV P                  VP                  4       VP
                  ^ ,          ^ ,          P                  4       4       RRR4       R#   + '       g   i     R# ; i)r§  r“  s	   Right nowr¡  r’  Nr¢  r£  s   &&&  r4   r±  Ú%IMAP4ServerTests._cbTestPartialAppendÙ
  s¢   € Ü×$Ñ$×.Ñ.Ð/AÕBˆØ×Ñ˜œC §¡Ó,Ô-Ø×Ñ˜8˜* l°AÐ6¸¿¹ÀA½ÀrÕ8JÔKÜ�&˜$×Ô 1Ø×Ñ˜QŸV™V›X r§{¡{°1¥~°aÕ'8×'AÑ'AÓ'CÔD÷  ××Òús   Â	ACÃC+	c                	ó®  a € \         P                  P                  R 4       V 3R lpV 3R lpV 3R lpS P                  P	                  \        V4      4      pVP                  \        V4      S P                  4       VP                  \        V4      S P                  4       VP                  S P                  S P                  4       S P                  4       # )ó   root/subthingc                 ó<   <€ S P                   P                  R R4      # r  r  rV   s   €r4   rà  Ú*IMAP4ServerTests._testCheck.<locals>.loginã
  r!  r7   c                 ó:   <€ S P                   P                  R 4      # )r·  rj  rV   s   €r4   r=  Ú+IMAP4ServerTests._testCheck.<locals>.selectæ
  s   ø€ Ø—;‘;×%Ñ%Ð&6Ó7Ð7r7   c                 ó8   <€ S P                   P                  4       # r0   )r€  rÂ  rV   s   €r4   rÂ  Ú*IMAP4ServerTests._testCheck.<locals>.checké
  ó   ø€ Ø—;‘;×$Ñ$Ó&Ð&r7   )
rC  rY  rb  r�  r§   r8   r›  r�  rŠ  r#   )rF   rà  r=  rÂ  rª   s   f    r4   Ú
_testCheckÚIMAP4ServerTests._testCheckà
  s’   ø€ Ü×Ñ×*Ñ*Ð+;Ô<õ	Dõ	8õ	'ð �N‰N×&Ñ&¤u¨U£|Ó4ˆØ	�‰”u˜V“} d§o¡oÔ6Ø	�‰”u˜U“| T§_¡_Ô5Ø	�‰�t×)Ñ)¨4¯?©?Ô;Ø�}‰}‹Ðr7   c                ó"   € V P                  4       # )zN
Trigger the L{imap.IMAP4Server._cbSelectWork} callback
by selecting an mbox.
)r¿  rV   s   &r4   Ú
test_checkÚIMAP4ServerTests.test_checkò
  s   € ð
 �‰Ó Ð r7   c                óŠ   a € RR lpV 3R lpS P                  \        RV4       S P                  4       pVP                  V4      # )zZ
Trigger the L{imap.IMAP4Server._ebSelectWork} errback
by failing when we select an mbox.
c                ó.   € \         P                  ! R 4      h)Úencoding)r   ÚIllegalMailboxEncoding)rF   r7  rÕ  s   &&&r4   Ú
failSelectÚ3IMAP4ServerTests.test_checkFail.<locals>.failSelectÿ
  s   € Ü×.Ò.¨zÓ:Ð:r7   c                ó�   <€ SP                  4       pSP                  V^,          P                  P                  ^ ,          R4       R# )rÜ   s   SELECT failed: Server errorN)r$  rC   r—  rP  )r‰  ÚfailuresrF   s   & €r4   ÚcheckResponseÚ6IMAP4ServerTests.test_checkFail.<locals>.checkResponse  s7   ø€ Ø×-Ñ-Ó/ˆHØ×Ñ˜X a�[×.Ñ.×3Ñ3°AÕ6Ð8VÖWr7   r=  rÉ  )Úpatchr@  r¿  r§   )rF   rÈ  rÌ  rª   s   f   r4   Útest_checkFailÚIMAP4ServerTests.test_checkFailù
  s;   ø€ ô	;õ	Xð 	�
‰
”7˜H jÔ1Ø�O‰OÓˆØ�}‰}˜]Ó+Ð+r7   c                	ó8  a € \        4       p. ROVn        \        P                  P	                  RV4       V 3R lpV 3R lpV 3R lpS P
                  P                  \        V4      4      pVP                  \        V4      S P                  4       VP                  \        V4      S P                  4       VP                  S P                  S P                  4       S P                  4       p\        P                  ! WV.4      P                  S P                  V4      # )ó	   Message 1rY  c                 ó<   <€ S P                   P                  R R4      # r  r  rV   s   €r4   rà  Ú)IMAP4ServerTests.testClose.<locals>.login  r!  r7   c                 ó:   <€ S P                   P                  R 4      # )s   mailboxrj  rV   s   €r4   r=  Ú*IMAP4ServerTests.testClose.<locals>.select  ó   ø€ Ø—;‘;×%Ñ% jÓ1Ð1r7   c                 ó8   <€ S P                   P                  4       # r0   )r€  rü  rV   s   €r4   rü  Ú)IMAP4ServerTests.testClose.<locals>.close  r¾  r7   ©)rÒ  )rò  ÚAnotherFlagNrü  ©s	   Message 2)rÛ  NrÜ   )s	   Message 3rñ  Nrß   )r«  rk  rC  rY  rb  r�  r§   r8   r›  r�  rŠ  r#   r   r³  Ú_cbTestClose)rF   r  rà  r=  rü  rª   rú  s   f      r4   Ú	testCloseÚIMAP4ServerTests.testClose
  sÊ   ø€ Ü‹Oˆò
ˆŒ
ô
 	×Ñ×*Ñ*¨9°aÔ8õ	Dõ	2õ	'ð �N‰N×&Ñ&¤u¨U£|Ó4ˆØ	�‰”u˜V“} d§o¡oÔ6Ø	�‰”u˜U“| T§_¡_Ô5Ø	�‰�t×)Ñ)¨4¯?©?Ô;Ø�]‰]‹_ˆÜ×"Ò" A 7Ó+×7Ñ7¸×8IÑ8IÈ1ÓMÐMr7   c                	óÌ   € V P                  \        VP                  4      ^4       V P                  VP                  ^ ,          R4       V P                  VP                  4       R# ©rÜ   NrÜ  )rC   rå   rk  rƒ  rû  ©rF   rî  r  s   &&&r4   rÝ  ÚIMAP4ServerTests._cbTestClose#  sC   € Ø×Ñœ˜QŸZ™Z›¨!Ô,Ø×Ñ˜Ÿ™ A�Ð(QÔRØ�‰˜Ÿ™Ö!r7   c                	óŽ  a € \        4       p. ROVn        \        P                  P	                  RV4       V 3R lpV 3R lpV 3R lpV 3R lpRS n        S P                  P                  \        V4      4      pVP                  \        V4      S P                  4       VP                  \        V4      S P                  4       VP                  VS P                  4       VP                  S P                  S P                  4       S P                  4       p\        P                  ! Wg.4      pVP                  S P                  V4      # )rÒ  NrY  c                 ó<   <€ S P                   P                  R R4      # r  r  rV   s   €r4   rà  Ú+IMAP4ServerTests.testExpunge.<locals>.login1  r!  r7   c                 ó:   <€ S P                   P                  R 4      # )rY  rj  rV   s   €r4   r=  Ú,IMAP4ServerTests.testExpunge.<locals>.select4  s   ø€ Ø—;‘;×%Ñ% iÓ0Ð0r7   c                 ó8   <€ S P                   P                  4       # r0   )r€  rö  rV   s   €r4   rö  Ú-IMAP4ServerTests.testExpunge.<locals>.expunge7  s   ø€ Ø—;‘;×&Ñ&Ó(Ð(r7   c                ód   <€ SP                  SP                  P                  R J 4       V Sn        R # r0   )r�  r  r³  rI  )rI  rF   s   &€r4   ÚexpungedÚ.IMAP4ServerTests.testExpunge.<locals>.expunged:  s'   ø€ Ø×Ñ˜TŸ[™[×-Ñ-°Ð5Ô6Ø"ˆDŽLr7   rÚ  )r«  rk  rC  rY  rb  rI  r�  r§   r8   r›  r�  rŠ  r#   r   r³  Ú_cbTestExpunge)	rF   r  rà  r=  rö  rì  r´  rú  rª   s	   f        r4   ÚtestExpungeÚIMAP4ServerTests.testExpunge(  së   ø€ Ü‹Oˆò
ˆŒ
ô
 	×Ñ×*Ñ*¨9°aÔ8õ	Dõ	1õ	)õ	#ð ˆŒØ�^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰œ˜f› t§¡Ô7Ø
�‰œ˜g›¨¯©Ô8Ø
�‰˜ $§/¡/Ô2Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆÜ×Ò  Ó)ˆØ�}‰}˜T×0Ñ0°!Ó4Ð4r7   c                	óÒ   € V P                  \        VP                  4      ^4       V P                  VP                  ^ ,          R4       V P                  V P                  ^ ^.4       R# rá  )rC   rå   rk  rI  râ  s   &&&r4   rî  ÚIMAP4ServerTests._cbTestExpungeH  sK   € Ø×Ñœ˜QŸZ™Z›¨!Ô,Ø×Ñ˜Ÿ™ A�Ð(QÔRà×Ñ˜Ÿ™¨¨1 vÖ.r7   )r�  r$   rB  rÇ  r;  rÔ  r2   rI  r]  rÎ  rw  N)9ry   rz   r{   r|   rµ  rÂ  rÏ  rÛ  rå  rã  rû  rø  r  r  r(  r1  r0  rJ  rU  rd  rs  rc  r‡  r†  r¡  r   r´  rÅ  rØ  rç  ró  r  r  r  r  r)  r4  rF  rJ  r\  rc  rl  r|  r‰  rˆ  rž  rœ  r²  r±  r¿  rÂ  rÏ  rÞ  rÝ  rï  rî  r}   r1   r7   r4   r›  r›  Œ  s  † òIòGò.LòMò0ò4ò6ò6ò6ò 6ò,!6òF
@ò4òò<ò6Mò,"ò4
ò#2òJ
ò@ò2=òò&%òNò.ò*ò6ò*ò.=ò"@òò&õ*Pò&òò0	õòBò4Sò.Pò=ò6Eò"@òHEòò$!ò,ò"Nò2"ò
5ö@/r7   r›  c                  ó  € ] tR tRtRtR tR tR tR tR t	R t
R	 tR
 tR tR tR tR tR tR tR tR tR tR tR tR tR tR tR tR tR tR tR tR t R t!R  t"R! t#R" t$R# t%R$ t&R% t'R& t(R' t)R( t*R) t+R*t,R+# ),ÚIMAP4ServerParsingTestsiO  z.
Test L{imap4.IMAP4Server}'s command parsing.
c                	óÖ   € \        4       V n        \        P                  ! 4       V n        V P                  P                  V P                  4       V P                  P                  4        R # r0   )r   rk  r   rI  r  ÚmakeConnectionÚclearrV   s   &r4   rƒ  ÚIMAP4ServerParsingTests.setUpT  sB   € Ü(Ó*ˆŒÜ×'Ò'Ó)ˆŒØ�‰×"Ñ" 4§>¡>Ô2Ø�‰×ÑÖr7   c                	óŠ   € V P                   P                  \        P                  ! \        P
                  ! 4       4      4       R # r0   ©r  ÚconnectionLostr$   rÔ  r   ÚConnectionDonerV   s   &r4   r†  Ú IMAP4ServerParsingTests.tearDownZ  ó&   € Ø�‰×"Ñ"¤7§?¢?´5×3GÒ3GÓ3IÓ#JÖKr7   c                óê   a€  ! R R\         4      oV3R lpRV P                  n        WP                  n        V P                  P	                  R4       V P                  V P                  S4      4       R# )z?
L{imap4.IMAP4Server} logs exceptions raised by parse methods.
c                  ó   € ] tR tRtRtRtR# )ÚSIMAP4ServerParsingTests.test_parseMethodExceptionLogged.<locals>.UnhandledExceptionib  ú
An unhandled exception.
r1   NrA  r1   r7   r4   ÚUnhandledExceptionr  b  r  r7   r  c                ó   <€ Shr0   r1   )rW  r  s   &€r4   ÚraisesValueErrorÚQIMAP4ServerParsingTests.test_parseMethodExceptionLogged.<locals>.raisesValueErrorg  s	   ø€ Ø$Ð$r7   Úcommandó   invalidN)r  r  Ú
parseStateÚparse_commandrU  rƒ  r$  )rF   r  r  s   & @r4   Útest_parseMethodExceptionLoggedÚ7IMAP4ServerParsingTests.test_parseMethodExceptionLogged]  sV   ø€ ô
	¤ô 	õ
	%ð "+ˆ�‰ÔØ$4�‰Ô!à�‰× Ñ  Ô,à�‰˜×.Ñ.Ð/AÓBÖCr7   c                ó  € V P                   P                  R4       V P                  V P                  P	                  4       R4       V P                   P                  \        P                  ! \        P                  ! R4      4      4       R# )zj
L{imap4.IMAP4Server.parse_command} sends a C{BAD} response to
a line that includes a tag but no command.
ó   001s   001 BAD Missing command
ÚDoneN)
r  r
  rC   rk  r—  rû  r$   rÔ  r   rü  rV   s   &r4   Útest_missingCommandÚ+IMAP4ServerParsingTests.test_missingCommandq  s]   € ð
 	�‰×!Ñ! &Ô)à×Ñ˜Ÿ™×-Ñ-Ó/Ð1OÔPà�‰×"Ñ"Ü�OŠOœE×0Ò0°Ó8Ó9ö	
r7   c                ó�   € V P                   P                  R4       V P                  V P                  P	                  4       R4       R# )zN
L{imap4.IMAP4Server.parse_command} sends a C{BAD} response to
an empty line.
r7   s   * BAD Null command
N)r  r
  rC   rk  r—  rV   s   &r4   Útest_emptyLineÚ&IMAP4ServerParsingTests.test_emptyLine~  s4   € ð
 	�‰×!Ñ! #Ô&à×Ñ˜Ÿ™×-Ñ-Ó/Ð1JÖKr7   c                ó   a€ V3R lpW@P                   n        V P                   P                  RP                  VR.4      4       V P	                  V P
                  P                  4       RP                  W#.4      4       R# )a  
Assert that the given exception results in the expected
response.

@param exception: The exception to raise.
@type exception: L{Exception}

@param tag: The IMAP tag.

@type: L{bytes}

@param expectedResponse: The expected bad response.
@type expectedResponse: L{bytes}
c                ó   <€ Shr0   r1   )ÚtagÚcmdÚrestÚ	exceptions   &&&€r4   ÚraisesÚDIMAP4ServerParsingTests.assertParseExceptionResponse.<locals>.raises—  ó   ø€ ØˆOr7   r¶  r  N)r  ÚdispatchCommandr
  r�   rC   rk  r—  ©rF   r  r  ÚexpectedResponser  s   &f&& r4   ÚassertParseExceptionResponseÚ4IMAP4ServerParsingTests.assertParseExceptionResponse‡  s]   ø€ õ 	ð '-�‰Ô#à�‰×!Ñ! $§)¡)¨S°*Ð,=Ó">Ô?à×Ñ˜Ÿ™×-Ñ-Ó/°·±¸CÐ;RÓ1SÖTr7   c                óT   € V P                  \        P                  ! R4      RR4       R# )z\
When a parsing method raises L{IllegalClientResponse}, the
server sends a C{BAD} response.
úclient responser  ó%   BAD Illegal syntax: client response
N)r!  r   ÚIllegalClientResponserV   s   &r4   Ú'test_parsingRaisesIllegalClientResponseÚ?IMAP4ServerParsingTests.test_parsingRaisesIllegalClientResponse   s'   € ð
 	×)Ñ)Ü×'Ò'Ð(9Ó:ØØ6ö	
r7   c                óT   € V P                  \        P                  ! R4      RR4       R# )zV
When a parsing method raises L{IllegalOperation}, the server
sends a C{NO} response.
Ú	operationr  ó!   NO Illegal operation: operation
N)r!  r   ÚIllegalOperationrV   s   &r4   Ú*test_parsingRaisesIllegalOperationResponseÚBIMAP4ServerParsingTests.test_parsingRaisesIllegalOperationResponse«  s&   € ð
 	×)Ñ)Ü×"Ò" ;Ó/ØØ2ö	
r7   c                óT   € V P                  \        P                  ! R4      RR4       R# )z\
When a parsing method raises L{IllegalMailboxEncoding}, the
server sends a C{NO} response.
rÆ  r  ó#   NO Illegal mailbox name: encoding
N)r!  r   rÇ  rV   s   &r4   Ú(test_parsingRaisesIllegalMailboxEncodingÚ@IMAP4ServerParsingTests.test_parsingRaisesIllegalMailboxEncoding¶  s&   € ð
 	×)Ñ)Ü×(Ò(¨Ó4ØØ4ö	
r7   c                ó�   € V P                   P                  R4       V P                  V P                  P	                  4       R4       R# )zQ
L{imap4.IMAP4Server} responds to an unsupported command with a
C{BAD} response.
s   001 HULLABALOOs   001 BAD Unsupported command
N)r  rU  rC   rk  r—  rV   s   &r4   Útest_unsupportedCommandÚ/IMAP4ServerParsingTests.test_unsupportedCommandÁ  s5   € ð
 	�‰× Ñ Ð!2Ô3Ø×Ñ˜Ÿ™×-Ñ-Ó/Ð1SÖTr7   c                óÜ   € V P                   P                  R4       V P                  V P                  P	                  4       R\        R4      P                  R4      ,           R,           4       R# )zf
L{imap4.IMAP4Server} responds with a C{BAD} response to a
command with more arguments than expected.
s   001 LOGIN A B Có   Czutf-8r¾  Ns8   001 BAD Illegal syntax: Too many arguments for command: )r  rU  rC   rk  r—  rò   rD   rV   s   &r4   Útest_tooManyArgumentsForCommandÚ7IMAP4ServerParsingTests.test_tooManyArgumentsForCommandÉ  s[   € ð
 	�‰× Ñ Ð!3Ô4Ø×ÑØ�N‰N× Ñ Ó"ð7ä�t“*×#Ñ# GÓ,õ-ð õö	
r7   c                óv  a€ V3R lpV P                  V P                  P                  R4       V3V P                  P                  R,          ,           V P                  n        V P                  P	                  VRR4       V P                  V P
                  P                  4       RP                  W#.4      4       R# )a
  
Assert that the given exception results in the expected
response.

@param exception: The exception to raise.
@type exception: L{Exception}

@param: The IMAP tag.

@type: L{bytes}

@param expectedResponse: The expected bad response.
@type expectedResponse: L{bytes}
c                ó   <€ Shr0   r1   )ÚserverInstancer  r  r  r  s   &&&&€r4   r  ÚFIMAP4ServerParsingTests.assertCommandExceptionResponse.<locals>.raisesé  r  r7   rþ  r¡  ó   LOGINs   user passwdr¶  N)rC   r  rì  Úunauth_LOGINr  rk  r—  r�   r  s   &f&& r4   ÚassertCommandExceptionResponseÚ6IMAP4ServerParsingTests.assertCommandExceptionResponseÙ  s…   ø€ õ 	ð 	×Ñ˜Ÿ™×*Ñ*¨HÔ5à$* 9¨t¯{©{×/GÑ/GÈÕ/KÕ#Kˆ�‰Ô à�‰×#Ñ# C¨°>ÔBà×Ñ˜Ÿ™×-Ñ-Ó/°·±¸CÐ;RÓ1SÖTr7   c                óT   € V P                  \        P                  ! R4      RR4       R# )zU
When a command raises L{IllegalClientResponse}, the
server sends a C{BAD} response.
r$  r  r%  N)r@  r   r&  rV   s   &r4   Ú'test_commandRaisesIllegalClientResponseÚ?IMAP4ServerParsingTests.test_commandRaisesIllegalClientResponseô  s'   € ð
 	×+Ñ+Ü×'Ò'Ð(9Ó:ØØ6ö	
r7   c                óT   € V P                  \        P                  ! R4      RR4       R# )zO
When a command raises L{IllegalOperation}, the server sends a
C{NO} response.
r*  r  r+  N)r@  r   r,  rV   s   &r4   Ú*test_commandRaisesIllegalOperationResponseÚBIMAP4ServerParsingTests.test_commandRaisesIllegalOperationResponseÿ  s&   € ð
 	×+Ñ+Ü×"Ò" ;Ó/ØØ2ö	
r7   c                óT   € V P                  \        P                  ! R4      RR4       R# )zU
When a command raises L{IllegalMailboxEncoding}, the server
sends a C{NO} response.
rÆ  r  r0  N)r@  r   rÇ  rV   s   &r4   Ú(test_commandRaisesIllegalMailboxEncodingÚ@IMAP4ServerParsingTests.test_commandRaisesIllegalMailboxEncoding
  s&   € ð
 	×+Ñ+Ü×(Ò(¨Ó4ØØ4ö	
r7   c                ó–   €  ! R R\         4      pV P                  V! R4      RR4       V P                  V P                  V4      4       R# )zj
Wehn a command raises an unhandled exception, the server sends
a C{BAD} response and logs the exception.
c                  ó   € ] tR tRtRtRtR# )ÚXIMAP4ServerParsingTests.test_commandRaisesUnhandledException.<locals>.UnhandledExceptioni  r  r1   NrA  r1   r7   r4   r  rM    r  r7   r  Ú	unhandledr  s   BAD Server error: unhandled
N)r  r@  rƒ  r$  )rF   r  s   & r4   Ú$test_commandRaisesUnhandledExceptionÚ<IMAP4ServerParsingTests.test_commandRaisesUnhandledException  sF   € ô	¤ô 	ð
 	×+Ñ+Ù˜{Ó+ØØ.ô	
ð 	�‰˜×.Ñ.Ð/AÓBÖCr7   c                ó²   € ^V P                   n        V P                   P                  R4       V P                  V P                  P                  4       R4       R# )z`
A string literal whose length exceeds the maximum allowed
length results in a C{BAD} response.
s   001 LOGIN {5}
sE   001 BAD Illegal syntax: Literal too long! I accept at most 4 octets
N)r  Ú_literalStringLimitrU  rC   rk  r—  rV   s   &r4   Útest_stringLiteralTooLongÚ1IMAP4ServerParsingTests.test_stringLiteralTooLong(  sF   € ð
 +,ˆ�‰Ô'Ø�‰× Ñ Ð!5Ô6à×ÑØ�N‰N× Ñ Ó"ð.ö	
r7   c                ó‚   € R F8  pV P                  \        P                  V P                  P                  V4       K:  	  R# )zA
An empty string argument raises L{imap4.IllegalClientResponse}.
N)r7   r¾  r¶  ©rí   r   r&  r  Úarg_astring)rF   r   s   & r4   Útest_arg_astringEmptyLineÚ1IMAP4ServerParsingTests.test_arg_astringEmptyLine6  s3   € ó *ˆEØ×ÑÜ×+Ñ+¨T¯[©[×-DÑ-DÀeöó *r7   c                óp   € V P                  \        P                  V P                  P                  R4       R# )zP
An unmatched quote in a string argument raises
L{imap4.IllegalClientResponse}.
s   "openNrV  rV   s   &r4   Útest_arg_astringUnmatchedQuotesÚ7IMAP4ServerParsingTests.test_arg_astringUnmatchedQuotes?  s)   € ð
 	×ÑÜ×'Ñ'¨¯©×)@Ñ)@À(ö	
r7   c                óp   € V P                  \        P                  V P                  P                  R4       R# )zV
An unmatched brace in a string literal's size raises
L{imap4.IllegalClientResponse}.
s   {0NrV  rV   s   &r4   Ú&test_arg_astringUnmatchedLiteralBracesÚ>IMAP4ServerParsingTests.test_arg_astringUnmatchedLiteralBracesH  s'   € ð
 	×Ñœ%×5Ñ5°t·{±{×7NÑ7NÐPUÖVr7   c                óp   € V P                  \        P                  V P                  P                  R4       R# )zK
A non-integral string literal size raises
L{imap4.IllegalClientResponse}.
ó   {[object Object]}NrV  rV   s   &r4   Ú"test_arg_astringInvalidLiteralSizeÚ:IMAP4ServerParsingTests.test_arg_astringInvalidLiteralSizeO  ó*   € ð
 	×ÑÜ×'Ñ'¨¯©×)@Ñ)@ÐBVö	
r7   c                óp   € V P                  \        P                  V P                  P                  R4       R# )z0
An empty atom raises L{IllegalClientResponse}.
r7   N©rí   r   r&  r  Úarg_atomrV   s   &r4   Útest_arg_atomEmptyLineÚ.IMAP4ServerParsingTests.test_arg_atomEmptyLineX  s&   € ð 	×Ñœ%×5Ñ5°t·{±{×7KÑ7KÈSÖQr7   c                óp   € V P                  \        P                  V P                  P                  R4       R# )z3
A malformed atom raises L{IllegalClientResponse}.
s    not an atom Nrf  rV   s   &r4   Útest_arg_atomMalformedAtomÚ2IMAP4ServerParsingTests.test_arg_atomMalformedAtom^  s*   € ð 	×ÑÜ×'Ñ'¨¯©×)=Ñ)=Ð?Oö	
r7   c                óp   € V P                  \        P                  V P                  P                  R4       R# )z>
An empty parenthesized list raises L{IllegalClientResponse}.
r7   N©rí   r   r&  r  Ú	arg_plistrV   s   &r4   Útest_arg_plistEmptyLineÚ/IMAP4ServerParsingTests.test_arg_plistEmptyLinef  s&   € ð 	×Ñœ%×5Ñ5°t·{±{×7LÑ7LÈcÖRr7   c                óÚ   € V P                  \        P                  V P                  P                  R4       V P                  \        P                  V P                  P                  R4       R# )zM
A parenthesized with unmatched parentheses raises
L{IllegalClientResponse}.
s   (foos   foo)Nrn  rV   s   &r4   Ú"test_arg_plistUnmatchedParenthesesÚ:IMAP4ServerParsingTests.test_arg_plistUnmatchedParenthesesl  sH   € ð
 	×Ñœ%×5Ñ5°t·{±{×7LÑ7LÈgÔVØ×Ñœ%×5Ñ5°t·{±{×7LÑ7LÈgÖVr7   c                óp   € V P                  \        P                  V P                  P                  R4       R# )z8
An empty file literal raises L{IllegalClientResponse}.
r7   N©rí   r   r&  r  Úarg_literalrV   s   &r4   Útest_arg_literalEmptyLineÚ1IMAP4ServerParsingTests.test_arg_literalEmptyLinet  s'   € ð 	×Ñœ%×5Ñ5°t·{±{×7NÑ7NÐPSÖTr7   c                óÚ   € V P                  \        P                  V P                  P                  R4       V P                  \        P                  V P                  P                  R4       R# )zB
A literal with unmatched braces raises
L{IllegalClientResponse}.
s   {10s   10}Nrv  rV   s   &r4   Útest_arg_literalUnmatchedBracesÚ7IMAP4ServerParsingTests.test_arg_literalUnmatchedBracesz  sJ   € ð
 	×Ñœ%×5Ñ5°t·{±{×7NÑ7NÐPVÔWØ×Ñœ%×5Ñ5°t·{±{×7NÑ7NÐPVÖWr7   c                óp   € V P                  \        P                  V P                  P                  R4       R# )zD
A non-integral literal size raises
L{imap4.IllegalClientResponse}.
ra  Nrv  rV   s   &r4   Ú"test_arg_literalInvalidLiteralSizeÚ:IMAP4ServerParsingTests.test_arg_literalInvalidLiteralSize‚  rd  r7   c                óh   € RpV P                   P                  V4      w  r#V P                  VR4       R# )z8
A sequence set returns the unparsed portion of a line.
s   1:* blah blah blahs   blah blah blahN)r  Ú
arg_seqsetrC   )rF   Úsequencer°  r  s   &   r4   Útest_arg_seqsetReturnsRestÚ2IMAP4ServerParsingTests.test_arg_seqsetReturnsRest‹  s0   € ð )ˆØ—+‘+×(Ñ(¨Ó2‰ˆØ×Ñ˜Ð0Ö1r7   c                óp   € V P                  \        P                  V P                  P                  R4       R# )z<
An invalid sequence raises L{imap4.IllegalClientResponse}.
s   x:yN)rí   r   r&  r  r�  rV   s   &r4   Útest_arg_seqsetInvalidSequenceÚ6IMAP4ServerParsingTests.test_arg_seqsetInvalidSequence“  s&   € ð 	×Ñœ%×5Ñ5°t·{±{×7MÑ7MÈvÖVr7   c                óŠ   € RpV P                   P                  V4      w  r#V P                  W!.4       V P                  V4       R# )z:
A single flag that is not contained in a list is parsed.
s   flagN)r  Úarg_flaglistrC   r�  )rF   ÚflagrÁ  r  s   &   r4   Útest_arg_flaglistOneFlagÚ0IMAP4ServerParsingTests.test_arg_flaglistOneFlag™  s=   € ð ˆØ—{‘{×/Ñ/°Ó5‰ˆØ×Ñ˜ Ô(Ø×Ñ˜Ör7   c                óp   € V P                  \        P                  V P                  P                  R4       R# )zS
A list of flags with unmatched parentheses raises
L{imap4.IllegalClientResponse}.
s   (invalidN©rí   r   r&  r  r‰  rV   s   &r4   Ú&test_arg_flaglistMismatchedParentehsesÚ>IMAP4ServerParsingTests.test_arg_flaglistMismatchedParentehses¢  s+   € ð
 	×ÑÜ×'Ñ'Ø�K‰K×$Ñ$Øö	
r7   c                óÚ   € V P                  \        P                  V P                  P                  R4       V P                  \        P                  V P                  P                  R4       R# )zW
A list of flags that contains a malformed flag raises
L{imap4.IllegalClientResponse}.
s	   (first  )s   (first  second)NrŽ  rV   s   &r4   Útest_arg_flaglistMalformedFlagÚ6IMAP4ServerParsingTests.test_arg_flaglistMalformedFlag­  sQ   € ð
 	×ÑÜ×'Ñ'¨¯©×)AÑ)AÀ?ô	
ð 	×ÑÜ×'Ñ'¨¯©×)AÑ)AÐCXö	
r7   c                óˆ   € RpV P                   P                  V4      w  r#V P                  V4       V P                  W14       R# )zw
A line that does not begin with an open parenthesis (C{(}) is
parsed as L{None}, and the remainder is the whole line.
s   not (N)r  Ú	opt_plistro  rC   )rF   rW  ÚplistÚ	remainders   &   r4   Ú$test_opt_plistMissingOpenParenthesisÚ<IMAP4ServerParsingTests.test_opt_plistMissingOpenParenthesis¹  s<   € ð
 ˆØŸ;™;×0Ñ0°Ó6ÑˆØ×Ñ˜%Ô Ø×Ñ˜Ö)r7   c                óˆ   € RpV P                   P                  V4      w  r#V P                  V4       V P                  W14       R# )zr
A line that does not begin with a double quote (C{"}) is
parsed as L{None}, and the remainder is the whole line.
s   not "N)r  Úopt_datetimero  rC   )rF   rW  Údtr—  s   &   r4   Ú!test_opt_datetimeMissingOpenQuoteÚ9IMAP4ServerParsingTests.test_opt_datetimeMissingOpenQuoteÃ  s;   € ð
 ˆØŸ™×0Ñ0°Ó6‰ˆØ×Ñ˜"ÔØ×Ñ˜Ö)r7   c                ót   € RpV P                  \        P                  V P                  P                  V4       R# )z`
A line that does not have a closing double quote (C{"}) raises
L{imap4.IllegalClientResponse}.
s   "21-Jul-2017 19:37:07 -0700N)rí   r   r&  r  r›  rV  s   & r4   Ú"test_opt_datetimeMissingCloseQuoteÚ:IMAP4ServerParsingTests.test_opt_datetimeMissingCloseQuoteÍ  s,   € ð
 .ˆØ×Ñœ%×5Ñ5°t·{±{×7OÑ7OÐQUÖVr7   c                ót   € RpV P                  \        P                  V P                  P                  V4       R# )zh
A line that contains C{CHARSET} but no character set
identifier raises L{imap4.IllegalClientResponse}.
rÈ  N)rí   r   r&  r  Úopt_charsetrV  s   & r4   Ú!test_opt_charsetMissingIdentifierÚ9IMAP4ServerParsingTests.test_opt_charsetMissingIdentifierÕ  s,   € ð
 ˆØ×Ñœ%×5Ñ5°t·{±{×7NÑ7NÐPTÖUr7   c                óŒ   € RpV P                   P                  V4      w  r#V P                  VR4       V P                  VR4       R# )zt
A line that ends with a C{CHARSET} identifier is parsed as
that identifier, and the remainder is the empty string.
s   CHARSET UTF-8ó   UTF-8r7   N©r  r£  rC   ©rF   rW  Ú
identifierr—  s   &   r4   Útest_opt_charsetEndOfLineÚ1IMAP4ServerParsingTests.test_opt_charsetEndOfLineÝ  s@   € ð
  ˆØ $§¡× 7Ñ 7¸Ó =Ñˆ
Ø×Ñ˜ XÔ.Ø×Ñ˜ CÖ(r7   c                óŒ   € RpV P                   P                  V4      w  r#V P                  VR4       V P                  VR4       R# )zˆ
A line that has additional data after a C{CHARSET} identifier
is parsed as that identifier, and the remainder is that
additional data.
s   CHARSET UTF-8 remainderr§  s	   remainderNr¨  r©  s   &   r4   Útest_opt_charsetWithRemainderÚ5IMAP4ServerParsingTests.test_opt_charsetWithRemainderç  s@   € ð *ˆØ $§¡× 7Ñ 7¸Ó =Ñˆ
Ø×Ñ˜ XÔ.Ø×Ñ˜ LÖ1r7   ©r  rk  N)-ry   rz   r{   r|   r[  rƒ  r†  r  r  r  r!  r'  r-  r1  r4  r8  r@  rC  rF  rI  rO  rS  rX  r[  r^  rb  rh  rk  rp  rs  rx  r{  r~  rƒ  r†  r‹  r�  r’  r˜  r�  r   r¤  r«  r®  r}   r1   r7   r4   rô  rô  O  sÚ   † ñòòLòDò(
òLòUò2	
ò	
ò	
òUò
ò Uò6	
ò	
ò	
òDò&
òò
òWò
òRò
òSòWòUòXò
ò2òWòò	
ò

ò*ò*òWòVò)ö	2r7   rô  c                  ób   € ] tR tRtRtR tR tR tR tR t	R t
R	 tR
 tR tR tR tR tRtR# )ÚIMAP4ServerSearchTestsió  zK
Tests for the behavior of the search_* functions in L{imap4.IMAP4Server}.
c                	óœ   € \         P                  V 4       R .V n        R.V n        R.V n        ^ V n        \        RR/. RRRR4      V n        R# )	z10-Dec-2009z13-Dec-2009z16-Dec-2009rí  zMon, 13 Dec 2009 21:25:10 GMTz13 Dec 2009 00:00:00 GMTrw  éÒ  N)rz  rƒ  ÚearlierQueryÚsameDateQueryÚ
laterQueryÚseqr¤   r©   rV   s   &r4   rƒ  ÚIMAP4ServerSearchTests.setUpø  sX   € Ü×Ñ˜tÔ$Ø*˜OˆÔØ+˜_ˆÔØ(˜/ˆŒØˆŒÜØÐ4Ð5ØØ&ØØØó
ˆŽr7   c                ó.  € V P                  V P                  P                  V P                  V P                  V P
                  4      4       V P                  V P                  P                  V P                  V P                  V P
                  4      4       R# )zi
L{imap4.IMAP4Server.search_SENTBEFORE} returns True if the message date
is earlier than the query date.
N)r�  r  Úsearch_SENTBEFORErµ  r¸  r©   rƒ  r·  rV   s   &r4   Útest_searchSentBeforeÚ,IMAP4ServerSearchTests.test_searchSentBefore  sf   € ð
 	×ÑØ�K‰K×)Ñ)¨$×*;Ñ*;¸T¿X¹XÀtÇxÁxÓPô	
ð 	�‰Ø�K‰K×)Ñ)¨$¯/©/¸4¿8¹8ÀTÇXÁXÓNö	
r7   c                ó’  € V P                  V P                  P                  R.V P                  V P                  R4      4       V P                  V P                  P                  R.V P                  V P                  R4      4       V P                  V P                  P                  R.V P                  V P                  R4      4       R# )zY
L{imap4.IMAP4Server.search_UID} returns True if the message UID is in
the search range.
r  s   2:*rö   N)rÜ   r´  )r�  r  Ú
search_UIDr¸  r©   rƒ  rV   s   &r4   Útest_searchWildcardÚ*IMAP4ServerSearchTests.test_searchWildcard  sŒ   € ð
 	×ÑØ�K‰K×"Ñ" F 8¨T¯X©X°t·x±xÀÓKô	
ð 	�‰˜Ÿ™×.Ñ.°¨x¸¿¹À4Ç8Á8ÈYÓWÔXØ�‰˜Ÿ™×.Ñ.°¨v°t·x±xÀÇÁÈ9ÓUÖVr7   c                óŠ   € V P                  V P                  P                  R.V P                  V P                  R4      4       R# )zƒ
L{imap4.IMAP4Server.search_UID} should return True if there is a
wildcard, because a wildcard means "highest UID in the mailbox".
s   1235:*N)r´  rÜ   )rƒ  r  r¿  r¸  r©   rV   s   &r4   Útest_searchWildcardHighÚ.IMAP4ServerSearchTests.test_searchWildcardHigh  s2   € ð
 	�‰Ø�K‰K×"Ñ" I ;°·±¸$¿(¹(ÀIÓNö	
r7   c                ól   € \         P                  ! R4      pV P                  \        V4      . RO4       R# )úd
L{imap4.IMAP4Server.search_SENTON} returns True if the message date is
the same as the query date.
r’  NrJ  )r   rû   rC   ræ   )rF   Úmsgsets   & r4   Útest_reversedSearchTermsÚ/IMAP4ServerSearchTests.test_reversedSearchTerms(  s(   € ô
 ×"Ò" 6Ó*ˆØ×Ñœ˜f›¢yÖ1r7   c                óÂ  € V P                  V P                  P                  V P                  V P                  V P
                  4      4       V P                  V P                  P                  V P                  V P                  V P
                  4      4       V P                  V P                  P                  V P                  V P                  V P
                  4      4       R# )rÆ  N)	r�  r  Úsearch_SENTONrµ  r¸  r©   rƒ  r¶  r·  rV   s   &r4   Útest_searchSentOnÚ(IMAP4ServerSearchTests.test_searchSentOn0  s—   € ð
 	×ÑØ�K‰K×%Ñ% d×&7Ñ&7¸¿¹À4Ç8Á8ÓLô	
ð 	�‰Ø�K‰K×%Ñ% d×&8Ñ&8¸$¿(¹(ÀDÇHÁHÓMô	
ð 	×Ñ˜Ÿ™×2Ñ2°4·?±?ÀDÇHÁHÈdÏhÉhÓWÖXr7   c                ó.  € V P                  V P                  P                  V P                  V P                  V P
                  4      4       V P                  V P                  P                  V P                  V P                  V P
                  4      4       R# )zf
L{imap4.IMAP4Server.search_SENTSINCE} returns True if the message date
is later than the query date.
N)rƒ  r  Úsearch_SENTSINCErµ  r¸  r©   r�  r·  rV   s   &r4   Útest_searchSentSinceÚ+IMAP4ServerSearchTests.test_searchSentSince=  sf   € ð
 	�‰Ø�K‰K×(Ñ(¨×):Ñ):¸D¿H¹HÀdÇhÁhÓOô	
ð 	×ÑØ�K‰K×(Ñ(¨¯©¸$¿(¹(ÀDÇHÁHÓMö	
r7   c                óŽ  € V P                  V P                  P                  R.V P                  ,           R.,           V P                  ,           V P
                  V P                  R4      4       V P                  V P                  P                  R.V P                  ,           R.,           V P                  ,           V P
                  V P                  R4      4       V P                  V P                  P                  R.V P                  ,           R.,           V P                  ,           V P
                  V P                  R4      4       R# )z�
L{imap4.IMAP4Server.search_OR} returns true if either of the two
expressions supplied to it returns true and returns false if neither
does.
Ú	SENTSINCENÚSENTONr/  )rƒ  r  Ú	search_ORrµ  r·  r¸  r©   r�  rV   s   &r4   Útest_searchOrÚ$IMAP4ServerSearchTests.test_searchOrI  sõ   € ð 	�‰Ø�K‰K×!Ñ!Ø� × 1Ñ 1Õ1°[°MÕAÀDÇOÁOÕSØ—‘Ø—‘Øó	ô	
ð 	�‰Ø�K‰K×!Ñ!Ø� §¡Õ/°;°-Õ?À$×BSÑBSÕSØ—‘Ø—‘Øó	ô	
ð 	×ÑØ�K‰K×!Ñ!Ø�
˜TŸ_™_Õ,°¨}Õ<¸t¿¹ÕNØ—‘Ø—‘Øó	ö	
r7   c                óR  € V P                  V P                  P                  R.V P                  ,           V P                  V P
                  R4      4       V P                  V P                  P                  R.V P                  ,           V P                  V P
                  R4      4       R# )zf
L{imap4.IMAP4Server.search_NOT} returns the negation of the result
of the expression supplied to it.
rÓ  NrÔ  r/  )r�  r  Ú
search_NOTrµ  r¸  r©   rƒ  r·  rV   s   &r4   Útest_searchNotÚ%IMAP4ServerSearchTests.test_searchNoth  s~   € ð
 	×ÑØ�K‰K×"Ñ"Ø� × 1Ñ 1Õ1°4·8±8¸T¿X¹XÀ|óô	
ð
 	�‰Ø�K‰K×"Ñ"Ø�
˜TŸ_™_Õ,¨d¯h©h¸¿¹À,óö	
r7   c                óÂ  € V P                  V P                  P                  V P                  V P                  V P
                  4      4       V P                  V P                  P                  V P                  V P                  V P
                  4      4       V P                  V P                  P                  V P                  V P                  V P
                  4      4       R# )zh
L{imap4.IMAP4Server.search_BEFORE} returns True if the
internal message date is before the query date.
N)	r�  r  Úsearch_BEFORErµ  r¸  r©   r¶  rƒ  r·  rV   s   &r4   Útest_searchBeforeÚ(IMAP4ServerSearchTests.test_searchBeforex  s—   € ð
 	×ÑØ�K‰K×%Ñ% d×&7Ñ&7¸¿¹À4Ç8Á8ÓLô	
ð 	×ÑØ�K‰K×%Ñ% d×&8Ñ&8¸$¿(¹(ÀDÇHÁHÓMô	
ð 	�‰˜Ÿ™×1Ñ1°$·/±/À4Ç8Á8ÈTÏXÉXÓVÖWr7   c                óÂ  € V P                  V P                  P                  V P                  V P                  V P
                  4      4       V P                  V P                  P                  V P                  V P                  V P
                  4      4       V P                  V P                  P                  V P                  V P                  V P
                  4      4       R# )zi
L{imap4.IMAP4Server.search_ON} returns True if the
internal message date is the same as the query date.
N)r�  r  Ú	search_ONrµ  r¸  r©   r¶  r·  rV   s   &r4   Útest_searchOnÚ$IMAP4ServerSearchTests.test_searchOn…  s�   € ð
 	×Ñ˜Ÿ™×.Ñ.¨t×/@Ñ/@À$Ç(Á(ÈDÏHÉHÓUÔVØ×Ñ˜Ÿ™×.Ñ.¨t×/AÑ/AÀ4Ç8Á8ÈTÏXÉXÓVÔWØ×Ñ˜Ÿ™×.Ñ.¨t¯©ÀÇÁÈ$Ï(É(ÓSÖTr7   c                óÂ  € V P                  V P                  P                  V P                  V P                  V P
                  4      4       V P                  V P                  P                  V P                  V P                  V P
                  4      4       V P                  V P                  P                  V P                  V P                  V P
                  4      4       R# )zm
L{imap4.IMAP4Server.search_SINCE} returns True if the
internal message date is greater than the query date.
N)	rƒ  r  Úsearch_SINCErµ  r¸  r©   r¶  r�  r·  rV   s   &r4   Útest_searchSinceÚ'IMAP4ServerSearchTests.test_searchSinceŽ  s�   € ð
 	�‰˜Ÿ™×0Ñ0°×1BÑ1BÀDÇHÁHÈdÏhÉhÓWÔXØ�‰Ø�K‰K×$Ñ$ T×%7Ñ%7¸¿¹À4Ç8Á8ÓLô	
ð 	×Ñ˜Ÿ™×1Ñ1°$·/±/À4Ç8Á8ÈTÏXÉXÓVÖWr7   )rµ  r·  r©   r¶  r¸  N)ry   rz   r{   r|   r[  rƒ  r¼  rÀ  rÃ  rÈ  rÌ  rÐ  rÖ  rÚ  rÞ  râ  ræ  r}   r1   r7   r4   r²  r²  ó  sH   † ñò
ò

ò
Wò
ò2òYò

ò
ò>
ò XòUö	Xr7   r²  c                  ó.   € ] tR tRtRtRtRR ltR tRtR# )rJ  iš  z„
A L{IRealm} for tests.

@cvar theAccount: An C{Account} instance.  Tests can set this to
    ensure predictable account retrieval.
Nc                óJ   a a€ S'       d   V3R lS n         R# V 3R lS n         R# )a*  
Create a realm for testing.

@param accountHolder: (optional) An object whose C{theAccount}
    attribute will be returned instead of
    L{TestRealm.theAccount}.  Attribute access occurs on every
    avatar request, so any modifications to
    C{accountHolder.theAccount} will be reflected here.
c                 ó   <€ S P                   # r0   ©rY  rF  s   €r4   r5   Ú$TestRealm.__init__.<locals>.<lambda>°  s   ø€  }×'?Ò'?r7   c                 ó   <€ S P                   # r0   rë  rV   s   €r4   r5   rì  ²  s	   ø€  t§¢r7   N©Ú_getAccount)rF   rG  s   ffr4   r‚   ÚTestRealm.__init__¥  s   ù€ ÷ Ü?ˆDÖä6ˆDÖr7   c                	óF   € \         P                  V P                  4       R  3# )c                 ó   € R # r0   r1   r1   r7   r4   r5   Ú)TestRealm.requestAvatar.<locals>.<lambda>µ  s   € ¹4r7   )r   ÚIAccountrï  )rF   ÚavatarIdÚmindr   s   &&&*r4   r  ÚTestRealm.requestAvatar´  s   € Ü�~‰~˜t×/Ñ/Ó1±<Ð?Ð?r7   rî  r0   )	ry   rz   r{   r|   r[  rY  r‚   r  r}   r1   r7   r4   rJ  rJ  š  s   † ñð €Jô7ö@r7   rJ  c                  ó2   € ] tR tRt]]3tRR/tR tR t	Rt
R# )ÚTestCheckeri¸  rD  ó   secretc                	óü   € VP                   V P                  9   da   \        P                  ! VP                  V P                  VP                   ,          4      P                  V P                  VP                   4      # R # r0   )Úusernamer/  r   ÚmaybeDeferredÚcheckPasswordr§   Ú_cbCheck)rF   Úcredentialss   &&r4   ÚrequestAvatarIdÚTestChecker.requestAvatarId½  s\   € Ø×Ñ 4§:¡:Ô-Ü×&Ò&Ø×)Ñ)¨4¯:©:°k×6JÑ6JÕ+Kóç‰k˜$Ÿ-™-¨×)=Ñ)=Ó>ð?ñ .r7   c                	ó*   € V'       d   V# \        4       hr0   r   )rF   r2   rü  s   &&&r4   rÿ  ÚTestChecker._cbCheckÃ  s   € ßØˆOÜÓ!Ð!r7   r1   N)ry   rz   r{   r|   r   r   ÚcredentialInterfacesr/  r  rÿ  r}   r1   r7   r4   rù  rù  ¸  s"   † Ø3Ð5FÐGÐà˜)Ð$€Eò?ö"r7   rù  c                  óŽ   € ] tR tRtR tR tR tR tR tR t	R t
R	 tR
 tR tR tR tR tR tR tR tR tR tR tR tRtR# )ÚAuthenticatorTestsiÉ  c                	ó0  € \         P                  V 4       \        4       p\        R 4      Vn        \        V4      V n        V P                  P                  \        4       4       V P                  V P                  n        ^ V n
        VP                  V n        R# )rD  N)rz  rƒ  rJ  r@  rY  r   rM  rN  rù  r  Úauthenticatedrë  )rF   rR  s   & r4   rƒ  ÚAuthenticatorTests.setUpÊ  sh   € Ü×Ñ˜tÔ$ä“ˆÜ" ;Ó/ˆÔÜ˜U“mˆŒØ�‰×#Ñ#¤K£MÔ2Ø!Ÿ[™[ˆ�‰ÔàˆÔØ×'Ñ'ˆŽr7   c                ó  € \        \        \        4       ! R R4      4       pV! 4       p\        \        V4       \        P
                  ! RV/4      pV P                  Vn        \        4       pVP                  V4       V P                  VP                  \        P                  ! R4      4       V P                  RVP                  4       4       VP                  4        VP!                  R4       V P                  \"        P$                  ! VP'                  4       4      VP                  4       4       VP                  4        VP!                  \"        P$                  ! R4      R,           4       V P)                  VP                  4       R	4       R
# )z�
L{imap4.IMAP4Server} accepts a L{dict} mapping challenge type
names to L{twisted.mail.interfaces.IChallengeResponse}
providers.
c                  ó.   € ] tR tRtR tR tR tR tRtR# )Ú>AuthenticatorTests.test_customChallengers.<locals>.SPECIALAuthiÝ  c                	ó   € R # )ó   SPECIALr1   rV   s   &r4   ÚgetChallengeÚKAuthenticatorTests.test_customChallengers.<locals>.SPECIALAuth.getChallengeß  ó   € Ù!r7   c                	óD   € VP                  R ^4      w  V n        V n        R # r0   )Úsplitrü  Úpassword©rF   Úresponses   &&r4   ÚsetResponseÚJAuthenticatorTests.test_customChallengers.<locals>.SPECIALAuth.setResponseâ  s   € Ø/7¯~©~¸dÀAÓ/FÑ,�”˜tž}r7   c                	ó   € R # )Fr1   rV   s   &r4   ÚmoreChallengesÚMAuthenticatorTests.test_customChallengers.<locals>.SPECIALAuth.moreChallengeså  s   € Ùr7   c                	ó(   € V P                   V n         R # r0   )r  )rF   r  s   &&r4   rþ  ÚLAuthenticatorTests.test_customChallengers.<locals>.SPECIALAuth.checkPasswordè  s   € Ø $§¡�–r7   )r  rü  N)	ry   rz   r{   r|   r  r  r  rþ  r}   r1   r7   r4   ÚSPECIALAuthr  Ý  s   † ò"òGòö.r7   r  r  úConnection done.s   AUTH=SPECIALs   001 AUTHENTICATE SPECIAL
s   username passwordr¾  s"   001 OK Authentication successful
N)r   r    r   r   r   rI  rM  r   rö  Ú
addCleanuprû  r   rü  r:  r—  r÷  ÚdataReceivedÚbase64Ú	b64encoder  rC   )rF   r  Úspecialr  rk  s   &    r4   Útest_customChallengersÚ)AuthenticatorTests.test_customChallengersÖ  s&  € ô 
Ô'Ô):Ó	;÷	.ð 	.ó 
<ð	.ñ “-ˆÜÔ'¨Ô1ä×"Ò" J°Ð#<Ó=ˆØŸ™ˆŒä#Ó%ˆ	Ø×Ñ˜iÔ(Ø�‰˜×-Ñ-¬u×/CÒ/CÐDVÓ/WÔXà�‰�o y§¡Ó'8Ô9à�‰ÔØ×ÑÐ;Ô<à�‰”f×&Ò& w×';Ñ';Ó'=Ó>À	ÇÁÓ@QÔRà�‰ÔØ×ÑœF×,Ò,Ð-AÓBÀWÕLÔMà×Ñ˜Ÿ™Ó*Ð,SÖTr7   c                ój  € \         P                  ! 4       pV P                  Vn        \        4       pVP	                  V4       V P                  VP                  \        P                  ! R4      4       VP                  4        VP                  R4       V P                  VP                  4       R4       R# )zG
An unsupported C{AUTHENTICATE} method results in a negative
response.
r   s   001 AUTHENTICATE UNKNOWN
s(   001 NO AUTHENTICATE method unsupported
N)r   rI  rM  r   rö  r!  rû  r   rü  r÷  r"  rC   r—  )rF   r  rk  s   &  r4   Útest_unsupportedMethodÚ)AuthenticatorTests.test_unsupportedMethod  s‡   € ô
 ×"Ò"Ó$ˆØŸ™ˆŒä#Ó%ˆ	Ø×Ñ˜iÔ(Ø�‰˜×-Ñ-¬u×/CÒ/CÐDVÓ/WÔXà�‰Ôà×ÑÐ;Ô<Ø×ÑØ�O‰OÓÐLö	
r7   c                óú  a € \         P                  S P                  P                  R&   \         P                  ! R4      pS P
                  P                  V4       RS P                  n        V 3R lpS P                  P                  \        V4      4      pVP                  S P                  R4       VP                  S P                  S P                  4       \         P"                  ! VS P%                  4       .4      # )z^
An L{imap4.IMAP4Server} that is missing a L{Portal} responds
negatively to an authentication
r>  rD  Nc                 ó:   <€ S P                   P                  R 4      # ©rú  ©r€  ÚauthenticaterV   s   €r4   ré  Ú3AuthenticatorTests.test_missingPortal.<locals>.auth   ó   ø€ Ø—;‘;×+Ñ+¨IÓ6Ð6r7   s    Temporary authentication failure)r   ÚLOGINCredentialsr  rÁ  ÚLOGINAuthenticatorr€  ÚregisterAuthenticatorrM  r�  r§   r8   r²  r˜  r›  rŠ  r�  r   r³  r#   )rF   ÚcAuthré  rª   s   f   r4   Útest_missingPortalÚ%AuthenticatorTests.test_missingPortal  sº   ø€ ô
 -2×,BÑ,Bˆ�‰×Ñ Ñ)ä×(Ò(¨Ó5ˆØ�‰×)Ñ)¨%Ô0à!ˆ�‰Ôõ	7ð �N‰N×&Ñ&¤u¨T£{Ó3ˆØ	�‰Ø×+Ñ+Ð-Pô	
ð 	
�‰�t×)Ñ)¨4¯?©?Ô;ä×"Ò" A t§}¡}£Ð#7Ó8Ð8r7   c                óŠ  a € \        \        4       ! R R4      4       p\        \        4       ! R R4      4       pV! 4       p\        \        V4       VS P                  P
                  R&   S P                  P                  V! 4       4       V 3R lpS P                  P                  \        V4      4      pVP                  S P                  R\        VP                  4      ,           P                  R4      4       VP!                  S P"                  S P$                  4       \&        P(                  ! VS P+                  4       .4      # )	z}
When a challenger's
L{getChallenge<IChallengeResponse.getChallenge>} method raises
any exception, a C{NO} response is sent.
c                  ó,   € ] tR tRtRtR tR tR tRtR# )ÚRAuthenticatorTests.test_challengerRaisesException.<locals>.ValueErrorAuthChallengei2  s   A challenge failurec                	ó,   € \        V P                  4      hr0   )r$  rì  rV   s   &r4   r  Ú_AuthenticatorTests.test_challengerRaisesException.<locals>.ValueErrorAuthChallenge.getChallenge6  s   € Ü  §¡Ó.Ð.r7   c                ó   € R# ©zG
Never called.

@param response: See L{IChallengeResponse.setResponse}
Nr1   r  s   &&r4   r  Ú^AuthenticatorTests.test_challengerRaisesException.<locals>.ValueErrorAuthChallenge.setResponse9  ó   ‚ r7   c                ó   € R# ©z
Never called.
Nr1   rV   s   &r4   r  ÚaAuthenticatorTests.test_challengerRaisesException.<locals>.ValueErrorAuthChallenge.moreChallenges@  r@  r7   r1   N©	ry   rz   r{   r|   rì  r  r  r  r}   r1   r7   r4   ÚValueErrorAuthChallenger:  2  s   † à,ˆGò/òör7   rE  c                  ó"   € ] tR tRtR tR tRtR# )ÚRAuthenticatorTests.test_challengerRaisesException.<locals>.ValueErrorAuthenticatoriE  c                	ó   € R # )ó   ERRORr1   rV   s   &r4   ÚgetNameÚZAuthenticatorTests.test_challengerRaisesException.<locals>.ValueErrorAuthenticator.getNameG  s   € Ùr7   c                	ó   € R # )s   IGNOREDr1   )rF   ÚsecretÚchals   &&&r4   ÚchallengeResponseÚdAuthenticatorTests.test_challengerRaisesException.<locals>.ValueErrorAuthenticator.challengeResponseJ  r  r7   r1   N)ry   rz   r{   r|   rJ  rO  r}   r1   r7   r4   ÚValueErrorAuthenticatorrG  E  s   † ò ö"r7   rQ  rI  c                 ó:   <€ S P                   P                  R 4      # r-  r.  rV   s   €r4   ré  Ú?AuthenticatorTests.test_challengerRaisesException.<locals>.authS  r1  r7   zServer error: rÎ  )r   r    r!   r   r  rÁ  r€  r4  r�  r§   r8   r²  r˜  rý   rì  rD   r›  rŠ  r�  r   r³  r#   )rF   rE  rQ  Úbadré  rª   s   f     r4   Útest_challengerRaisesExceptionÚ1AuthenticatorTests.test_challengerRaisesException+  s	  ø€ ô 
Ô'Ó	(÷	ð 	ó 
)ð	ô$ 
Ô*Ó	+÷	"ð 	"ó 
,ð	"ñ &Ó'ˆÜÔ'¨Ô-à,Cˆ�‰×Ñ Ñ)Ø�‰×)Ñ)Ñ*AÓ*CÔDõ	7ð �N‰N×&Ñ&¤u¨T£{Ó3ˆØ	�‰Ø×+Ñ+Ø¤Ð$;×$CÑ$CÓ DÕD×LÑLÈWÓUô	
ð 	
�‰�t×)Ñ)¨4¯?©?Ô;ä×"Ò" A t§}¡}£Ð#7Ó8Ð8r7   c                ó*  € \        \        4       ! R R4      4       pV! 4       p\        \        V4       \        P                  ! 4       pV P
                  Vn        WP                  R&   \        4       pVP                  V4       V P                  VP                  \        P                  ! R4      4       V P                  RVP                  4       4       VP                  4        VP!                  R4       V P                  \"        P$                  ! VP'                  4       4      VP                  4       4       VP                  4        VP!                  R4       V P)                  VP                  4       RP+                  R	VP,                  R
.4      4       R# )zq
A client that responds with a challenge that cannot be decoded
as Base 64 receives an L{IllegalClientResponse}.
c                  ó,   € ] tR tRtRtR tR tR tRtR# )ÚEAuthenticatorTests.test_authNotBase64.<locals>.NotBase64AuthChallengeie  s   Malformed Response - not base64c                	ó   € R # )s   SomeChallenger1   rV   s   &r4   r  ÚRAuthenticatorTests.test_authNotBase64.<locals>.NotBase64AuthChallenge.getChallengei  s   € Ù'r7   c                ó   € R# r>  r1   r  s   &&r4   r  ÚQAuthenticatorTests.test_authNotBase64.<locals>.NotBase64AuthChallenge.setResponsel  r@  r7   c                ó   € R# rB  r1   rV   s   &r4   r  ÚTAuthenticatorTests.test_authNotBase64.<locals>.NotBase64AuthChallenge.moreChallengess  r@  r7   r1   NrD  r1   r7   r4   ÚNotBase64AuthChallengerY  e  s   † à8ˆGò(òör7   r`  s	   NOTBASE64r   s   AUTH=NOTBASE64s   001 AUTHENTICATE NOTBASE64
s     Not base64
r7   s   001 NO Authentication failed: r¾  N)r   r    r   r   rI  rM  rÁ  r   rö  r!  rû  r   rü  r:  r—  r÷  r"  r#  r$  r  rC   r�   rì  )rF   r`  Ú	notBase64r  rk  s   &    r4   Útest_authNotBase64Ú%AuthenticatorTests.test_authNotBase64_  s6  € ô 
Ô'Ó	(÷	ð 	ó 
)ð	ñ$ +Ó,ˆ	ÜÔ'¨Ô3ä×"Ò"Ó$ˆØŸ™ˆŒØ+A×Ñ˜<Ñ(ä#Ó%ˆ	Ø×Ñ˜iÔ(Ø�‰˜×-Ñ-¬u×/CÒ/CÐDVÓ/WÔXà�‰Ð'¨¯©Ó):Ô;à�‰ÔØ×ÑÐ=Ô>à�‰”f×&Ò& y×'=Ñ'=Ó'?Ó@À)Ç/Á/ÓBSÔTà�‰ÔØ×ÑÐ2Ô3à×ÑØ�O‰OÓØ�H‰HÐ7¸×9JÑ9JÈGÐTÓUö	
r7   c                óL  a € \        4       p\        V4      pVS P                  n        \        P
                  ;S P                  P                  R&   p\        \        V4       \        P                  ! R4      pS P                  P                  V4       V 3R lpS P                  P                  \        V4      4      pVP                  S P                   R4       VP#                  S P$                  S P&                  4       \(        P*                  ! S P-                  4       V.4      pV# )z¬
A challenger that causes the login to fail
L{UnhandledCredentials} results in an C{NO} response.

@return: A L{Deferred} that fires when the authorization has
    failed.
r>  rD  c                 ó:   <€ S P                   P                  R 4      # r-  r.  rV   s   €r4   ré  Ú:AuthenticatorTests.test_unhandledCredentials.<locals>.auth§  r1  r7   s+   Authentication failed: server misconfigured)rJ  r   r  rM  r   r2  rÁ  r   r    r3  r€  r4  r�  r§   r8   r²  r˜  r›  rŠ  r�  r   r³  r#   )rF   rR  rM  Ú	loginCredr5  ré  r´  rª   s   f       r4   Útest_unhandledCredentialsÚ,AuthenticatorTests.test_unhandledCredentials’  sà   ø€ ô “ˆÜ˜“ˆð $ˆ�‰Ôä8=×8NÑ8NÐNˆ�‰×Ñ Ñ)¨IäÔ&¨	Ô2ä×(Ò(¨Ó5ˆØ�‰×)Ñ)¨%Ô0õ	7ð �^‰^×'Ñ'¬¨d«Ó4ˆØ
�‰Ø×+Ñ+Ø:ô	
ð 	�‰˜×*Ñ*¨D¯O©OÔ<Ü×Ò §¡£°"Ð 5Ó6ˆØˆr7   c                óô  a a
€  ! R R\         4      o
 ! V
3R lR4      p\        4       p\        V4      pVP                  V! 4       4       VS P                  n        \        P                  ;S P                  P                  R&   p\        \        V4       \        P                  ! R4      pS P                  P                  V4       V 3R lpV
V 3R lpS P                  P                  \!        V4      4      pVP#                  S P$                  R	4       VP                  \!        V4      4       VP'                  S P(                  S P*                  4       \,        P.                  ! S P1                  4       V.4      p	V	# )
z§
If the portal raises an exception other than
L{UnauthorizedLogin} or L{UnhandledCredentials}, the server
responds with a C{BAD} response and the exception is logged.
c                  ó   € ] tR tRtRtRtR# )ÚKAuthenticatorTests.test_unexpectedLoginFailure.<locals>.UnexpectedExceptioniº  r  r1   NrA  r1   r7   r4   r  rl  º  r  r7   r  c                  ó0   <€ ] tR tRtRt]]3tV 3R ltRt	R# )ÚFAuthenticatorTests.test_unexpectedLoginFailure.<locals>.FailingCheckeri¿  zV
A credentials checker whose L{requestAvatarId} method
raises L{UnexpectedException}.
c                	ó   <€ S! R 4      h)zUnexpected error.r1   )rF   r   r  s   &&€r4   r  ÚVAuthenticatorTests.test_unexpectedLoginFailure.<locals>.FailingChecker.requestAvatarIdÇ  s   ø€ Ù)Ð*=Ó>Ð>r7   r1   N)
ry   rz   r{   r|   r[  r   r   r  r  r}   )r  s   €r4   ÚFailingCheckerrn  ¿  s    ø† ñð
 %<Ð=NÐ#OÐ ÷?ñ ?r7   rq  r>  rD  c                 ó:   <€ S P                   P                  R 4      # r-  r.  rV   s   €r4   ré  Ú<AuthenticatorTests.test_unexpectedLoginFailure.<locals>.authÖ  r1  r7   c                 óH   <€ SP                  SP                  S 4      4       R # r0   r#  )r  rF   s   €€r4   ÚassertUnexpectedExceptionLoggedÚWAuthenticatorTests.test_unexpectedLoginFailure.<locals>.assertUnexpectedExceptionLoggedÙ  s   ø€ Ø�O‰O˜D×2Ñ2Ð3FÓGÖHr7   s'   Server error: login failed unexpectedly)r  rJ  r   rN  r  rM  r   r2  rÁ  r   r    r3  r€  r4  r�  r§   r8   r²  r˜  r›  rŠ  r�  r   r³  r#   )rF   rq  rR  rM  rg  r5  ré  ru  r´  rª   r  s   f         @r4   Útest_unexpectedLoginFailureÚ.AuthenticatorTests.test_unexpectedLoginFailure³  s  ù€ ô	¤)ô 	÷
		?ô 		?ô “ˆÜ˜“ˆØ×Ñ™~Ó/Ô0Ø#ˆ�‰Ôä8=×8NÑ8NÐNˆ�‰×Ñ Ñ)¨IäÔ&¨	Ô2ä×(Ò(¨Ó5ˆØ�‰×)Ñ)¨%Ô0õ	7ö	Ið �^‰^×'Ñ'¬¨d«Ó4ˆØ
�‰Ø×+Ñ+Ð-Wô	
ð 	�‰”uÐ<Ó=Ô>Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ü×Ò §¡£°"Ð 5Ó6ˆØˆr7   c                	ó  a € \         S P                  P                  R &   \        P                  ! R4      pS P
                  P                  V4       V 3R lpV 3R lpS P                  P                  \        V4      4      pVP                  \        V4      S P                  4       VP                  S P                  S P                  4       S P                  4       p\        P                  ! WE.4      pVP                  S P                   4      # )r¸  rD  c                 ó:   <€ S P                   P                  R 4      # r-  r.  rV   s   €r4   ré  Ú,AuthenticatorTests.testCramMD5.<locals>.authê  r1  r7   c                 ó   <€ ^S n         R# rè  ©r	  rV   s   €r4   ÚauthedÚ.AuthenticatorTests.testCramMD5.<locals>.authedí  ó   ø€ Ø!"ˆDÖr7   )r   r  rÁ  r   ÚCramMD5ClientAuthenticatorr€  r4  r�  r§   r8   r›  r�  rŠ  r#   r   r³  Ú_cbTestCramMD5)rF   r5  ré  r~  r´  rú  rª   s   f      r4   ÚtestCramMD5ÚAuthenticatorTests.testCramMD5å  s½   ø€ Ü/Aˆ�‰×Ñ Ñ,Ü×0Ò0°Ó=ˆØ�‰×)Ñ)¨%Ô0õ	7õ	#ð �^‰^×'Ñ'¬¨d«Ó4ˆØ
�‰œ˜f› t§¡Ô7Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ø�]‰]‹_ˆÜ×Ò  Ó)ˆØ�}‰}˜T×0Ñ0Ó1Ð1r7   c                	óž   € V P                  V P                  ^4       V P                  V P                  P                  V P                  4       R# rè  ©rC   r	  r  rë  rí  s   &&r4   r‚  Ú!AuthenticatorTests._cbTestCramMD5÷  ó6   € Ø×Ñ˜×+Ñ+¨QÔ/Ø×Ñ˜Ÿ™×,Ñ,¨d¯l©lÖ;r7   c                	ó"  a € \         S P                  P                  R &   \        P                  ! R4      pS P
                  P                  V4       V 3R lpV 3R lpV 3R lpS P                  P                  \        V4      4      pVP                  \        V4      \        V4      4       VP                  S P                  S P                  4       \        P                  ! S P                  4       V.4      pVP                  S P                   4      # )r¸  rD  c                 ó:   <€ S P                   P                  R 4      # ©s   not the secretr.  rV   s   €r4   ÚmisauthÚ5AuthenticatorTests.testFailedCramMD5.<locals>.misauth   ó   ø€ Ø—;‘;×+Ñ+Ð,=Ó>Ð>r7   c                 ó   <€ ^S n         R# rè  r}  rV   s   €r4   r~  Ú4AuthenticatorTests.testFailedCramMD5.<locals>.authed  r€  r7   c                 ó   <€ RS n         R# ©rÜ   Néÿÿÿÿr}  rV   s   €r4   Ú	misauthedÚ7AuthenticatorTests.testFailedCramMD5.<locals>.misauthed  ó   ø€ Ø!#ˆDÖr7   )r   r  rÁ  r   r�  r€  r4  r�  r§   r8   r›  rŠ  r�  r   r³  r#   Ú_cbTestFailedCramMD5©rF   r5  rŒ  r~  r”  r´  rª   s   f      r4   ÚtestFailedCramMD5Ú$AuthenticatorTests.testFailedCramMD5û  sÁ   ø€ Ü/Aˆ�‰×Ñ Ñ,Ü×0Ò0°Ó=ˆØ�‰×)Ñ)¨%Ô0õ	?õ	#õ	$ð �^‰^×'Ñ'¬¨g«Ó7ˆØ
�‰œ˜f›¤u¨YÓ'7Ô8Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ü×Ò §¡£°"Ð 5Ó6ˆØ�}‰}˜T×6Ñ6Ó7Ð7r7   c                	óŠ   € V P                  V P                  R4       V P                  V P                  P                  R4       R# r’  r†  rí  s   &&r4   r—  Ú'AuthenticatorTests._cbTestFailedCramMD5  ó2   € Ø×Ñ˜×+Ñ+¨RÔ0Ø×Ñ˜Ÿ™×,Ñ,¨dÖ3r7   c                	óP  a € \         P                  ;S P                  P                  R &   p\	        \
        V4       \         P                  ! R4      pS P                  P                  V4       V 3R lpV 3R lpS P                  P                  \        V4      4      pVP                  \        V4      S P                  4       VP                  S P                  S P                  4       \        P                   ! S P#                  4       V.4      pVP                  S P$                  4      # )r>  rD  c                 ó:   <€ S P                   P                  R 4      # r-  r.  rV   s   €r4   ré  Ú*AuthenticatorTests.testLOGIN.<locals>.auth  r1  r7   c                 ó   <€ ^S n         R# rè  r}  rV   s   €r4   r~  Ú,AuthenticatorTests.testLOGIN.<locals>.authed  r€  r7   )r   r2  r  rÁ  r   r    r3  r€  r4  r�  r§   r8   r›  r�  rŠ  r   r³  r#   Ú_cbTestLOGIN)rF   rg  r5  ré  r~  r´  rª   s   f      r4   Ú	testLOGINÚAuthenticatorTests.testLOGIN  óÑ   ø€ Ü8=×8NÑ8NÐNˆ�‰×Ñ Ñ)¨IäÔ&¨	Ô2ä×(Ò(¨Ó5ˆØ�‰×)Ñ)¨%Ô0õ	7õ	#ð �^‰^×'Ñ'¬¨d«Ó4ˆØ
�‰œ˜f› t§¡Ô7Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ü×Ò §¡£°"Ð 5Ó6ˆØ�}‰}˜T×.Ñ.Ó/Ð/r7   c                	óž   € V P                  V P                  ^4       V P                  V P                  P                  V P                  4       R# rè  r†  rí  s   &&r4   r£  ÚAuthenticatorTests._cbTestLOGIN'  rˆ  r7   c                	ó6  a € \         P                  S P                  P                  R &   \         P                  ! R4      pS P
                  P                  V4       V 3R lpV 3R lpV 3R lpS P                  P                  \        V4      4      pVP                  \        V4      \        V4      4       VP                  S P                  S P                  4       \        P                  ! S P                  4       V.4      pVP                  S P                   4      # )r>  rD  c                 ó:   <€ S P                   P                  R 4      # r‹  r.  rV   s   €r4   rŒ  Ú3AuthenticatorTests.testFailedLOGIN.<locals>.misauth0  rŽ  r7   c                 ó   <€ ^S n         R# rè  r}  rV   s   €r4   r~  Ú2AuthenticatorTests.testFailedLOGIN.<locals>.authed3  r€  r7   c                 ó   <€ RS n         R# r’  r}  rV   s   €r4   r”  Ú5AuthenticatorTests.testFailedLOGIN.<locals>.misauthed6  r–  r7   )r   r2  r  rÁ  r3  r€  r4  r�  r§   r8   r›  rŠ  r�  r   r³  r#   Ú_cbTestFailedLOGINr˜  s   f      r4   ÚtestFailedLOGINÚ"AuthenticatorTests.testFailedLOGIN+  óÇ   ø€ Ü,1×,BÑ,Bˆ�‰×Ñ Ñ)Ü×(Ò(¨Ó5ˆØ�‰×)Ñ)¨%Ô0õ	?õ	#õ	$ð �^‰^×'Ñ'¬¨g«Ó7ˆØ
�‰œ˜f›¤u¨YÓ'7Ô8Ø
�‰˜×*Ñ*¨D¯O©OÔ<Ü×Ò §¡£°"Ð 5Ó6ˆØ�}‰}˜T×4Ñ4Ó5Ð5r7   c                	óŠ   € V P                  V P                  R4       V P                  V P                  P                  R4       R# r’  r†  rí  s   &&r4   r°  Ú%AuthenticatorTests._cbTestFailedLOGIN?  r�  r7   c                	óP  a € \         P                  ;S P                  P                  R &   p\	        \
        V4       \         P                  ! R4      pS P                  P                  V4       V 3R lpV 3R lpS P                  P                  \        V4      4      pVP                  \        V4      S P                  4       VP                  S P                  S P                  4       \        P                   ! S P#                  4       V.4      pVP                  S P$                  4      # )rÇ  rD  c                 ó:   <€ S P                   P                  R 4      # r-  r.  rV   s   €r4   ré  Ú*AuthenticatorTests.testPLAIN.<locals>.authK  r1  r7   c                 ó   <€ ^S n         R# rè  r}  rV   s   €r4   r~  Ú,AuthenticatorTests.testPLAIN.<locals>.authedN  r€  r7   )r   ÚPLAINCredentialsr  rÁ  r   r    ÚPLAINAuthenticatorr€  r4  r�  r§   r8   r›  r�  rŠ  r   r³  r#   Ú_cbTestPLAIN)rF   Ú	plainCredr5  ré  r~  r´  rª   s   f      r4   Ú	testPLAINÚAuthenticatorTests.testPLAINC  r¦  r7   c                	óž   € V P                  V P                  ^4       V P                  V P                  P                  V P                  4       R# rè  r†  rí  s   &&r4   r½  ÚAuthenticatorTests._cbTestPLAINW  rˆ  r7   c                	ó6  a € \         P                  S P                  P                  R &   \         P                  ! R4      pS P
                  P                  V4       V 3R lpV 3R lpV 3R lpS P                  P                  \        V4      4      pVP                  \        V4      \        V4      4       VP                  S P                  S P                  4       \        P                  ! S P                  4       V.4      pVP                  S P                   4      # )rÇ  rD  c                 ó:   <€ S P                   P                  R 4      # r‹  r.  rV   s   €r4   rŒ  Ú3AuthenticatorTests.testFailedPLAIN.<locals>.misauth`  rŽ  r7   c                 ó   <€ ^S n         R# rè  r}  rV   s   €r4   r~  Ú2AuthenticatorTests.testFailedPLAIN.<locals>.authedc  r€  r7   c                 ó   <€ RS n         R# r’  r}  rV   s   €r4   r”  Ú5AuthenticatorTests.testFailedPLAIN.<locals>.misauthedf  r–  r7   )r   r»  r  rÁ  r¼  r€  r4  r�  r§   r8   r›  rŠ  r�  r   r³  r#   Ú_cbTestFailedPLAINr˜  s   f      r4   ÚtestFailedPLAINÚ"AuthenticatorTests.testFailedPLAIN[  r³  r7   c                	óŠ   € V P                  V P                  R4       V P                  V P                  P                  R4       R# r’  r†  rí  s   &&r4   rÊ  Ú%AuthenticatorTests._cbTestFailedPLAINo  r�  r7   )rë  r	  rM  N)ry   rz   r{   r|   rƒ  r&  r)  r6  rU  rb  rh  rw  rƒ  r‚  r™  r—  r¤  r£  r±  r°  r¿  r½  rË  rÊ  r}   r1   r7   r4   r  r  É  sl   † ò
(ò)UòV
ò&9ò.29òh1
òfòB0òd2ò$<ò8ò(4ò0ò(<ò6ò(4ò0ò(<ò6ö(4r7   r  c                  ó,   € ] tR tRtRtR tR tR tRtR# )ÚSASLPLAINTestsit  zÕ
Tests for I{SASL PLAIN} authentication, as implemented by
L{imap4.PLAINAuthenticator} and L{imap4.PLAINCredentials}.

@see: U{http://www.faqs.org/rfcs/rfc2595.html}
@see: U{http://www.faqs.org/rfcs/rfc4616.html}
c                ó®   € RpRpRp\         P                  ! V4      pVP                  W#4      pV P                  VRV,           R,           V,           4       R# )zo
L{PLAINAuthenticator.challengeResponse} returns challenge strings of
the form::

    NUL<authn-id>NUL<secret>
rD  rú  s	   challengeó    N)r   r¼  rO  rC   )rF   rü  rM  rN  r5  r  s   &     r4   Ú#test_authenticatorChallengeResponseÚ2SASLPLAINTests.test_authenticatorChallengeResponse}  sR   € ð ˆØˆØˆÜ×(Ò(¨Ó2ˆØ×*Ñ*¨6Ó8ˆØ×Ñ˜ 5¨8Õ#3°eÕ#;¸fÕ#DÖEr7   c                óÂ   € \         P                  ! 4       pVP                  R4       V P                  VP                  R4       V P                  VP
                  R4       R# )zf
L{PLAINCredentials.setResponse} parses challenge strings of the
form::

    NUL<authn-id>NUL<secret>
s    testuser secretrD  rú  N)r   r»  r  rC   rü  r  ©rF   Úcreds   & r4   Útest_credentialsSetResponseÚ*SASLPLAINTests.test_credentialsSetResponse‹  sI   € ô ×%Ò%Ó'ˆØ×ÑÐ.Ô/Ø×Ñ˜Ÿ™¨Ô4Ø×Ñ˜Ÿ™¨	Ö2r7   c                ó2  € \         P                  ! 4       pV P                  \         P                  VP                  R4       V P                  \         P                  VP                  R4       V P                  \         P                  VP                  R4       R# )zv
L{PLAINCredentials.setResponse} raises L{imap4.IllegalClientResponse}
when passed a string not of the expected form.
s   hellos   hello worlds   hello world Zoom! N)r   r»  rí   r&  r  rÖ  s   & r4   Útest_credentialsInvalidResponseÚ.SASLPLAINTests.test_credentialsInvalidResponse—  su   € ô
 ×%Ò%Ó'ˆØ×Ñœ%×5Ñ5°t×7GÑ7GÈÔRØ×ÑÜ×'Ñ'¨×)9Ñ)9¸?ô	
ð 	×ÑÜ×'Ñ'¨×)9Ñ)9Ð;Sö	
r7   r1   N)	ry   rz   r{   r|   r[  rÓ  rØ  rÛ  r}   r1   r7   r4   rÐ  rÐ  t  s   † ñòFò
3ö
r7   rÐ  c                  ó^   € ] tR tRtR tR tR tR tR tR t	R t
R	 tR
 tR tR tR tRtR# )ÚUnsolicitedResponseTestsi¦  c                	óL  a € V 3R  lpV 3R lpS P                   P                  \        V4      4      pVP                  \        V4      4      P                  S P                  4       \
        P                  ! S P                  4       V.4      pVP                  S P                  4      # )c                 ó<   <€ S P                   P                  R R4      # r  r  rV   s   €r4   rà  Ú5UnsolicitedResponseTests.testReadWrite.<locals>.login¨  r!  r7   c                 ó>   <€ S P                   P                  ^4       R# rè  ©r  ri  rV   s   €r4   rÃ  Ú8UnsolicitedResponseTests.testReadWrite.<locals>.loggedIn«  ó   ø€ Ø�K‰K×#Ñ# AÖ&r7   )	r�  r§   r8   r²  r�  r   r³  r#   Ú_cbTestReadWrite©rF   rà  rÃ  r´  rª   s   f    r4   ÚtestReadWriteÚ&UnsolicitedResponseTests.testReadWrite§  sw   ø€ õ	Dõ	'ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰”u˜X“Ó'×2Ñ2°4·?±?ÔCÜ×Ò §¡£°"Ð 5Ó6ˆØ�}‰}˜T×2Ñ2Ó3Ð3r7   c                	ó\   € V P                   P                  pV P                  VR ^..4       R# rh  ©r€  r_  rC   ©rF   rî  ÚEs   && r4   ræ  Ú)UnsolicitedResponseTests._cbTestReadWrite³  ó)   € Ø�K‰K×ÑˆØ×Ñ˜˜m¨QÐ/Ð0Ö1r7   c                	óL  a € V 3R  lpV 3R lpS P                   P                  \        V4      4      pVP                  \        V4      4      P                  S P                  4       \
        P                  ! S P                  4       V.4      pVP                  S P                  4      # )c                 ó<   <€ S P                   P                  R R4      # r  r  rV   s   €r4   rà  Ú4UnsolicitedResponseTests.testReadOnly.<locals>.login¸  r!  r7   c                 ó>   <€ S P                   P                  ^ 4       R# r“  rã  rV   s   €r4   rÃ  Ú7UnsolicitedResponseTests.testReadOnly.<locals>.loggedIn»  rå  r7   )	r�  r§   r8   r²  r�  r   r³  r#   Ú_cbTestReadOnlyrç  s   f    r4   ÚtestReadOnlyÚ%UnsolicitedResponseTests.testReadOnly·  sw   ø€ õ	Dõ	'ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰”u˜X“Ó'×2Ñ2°4·?±?ÔCÜ×Ò §¡£°"Ð 5Ó6ˆØ�}‰}˜T×1Ñ1Ó2Ð2r7   c                	ó\   € V P                   P                  pV P                  VR ^ ..4       R# rh  rë  rì  s   && r4   rõ  Ú(UnsolicitedResponseTests._cbTestReadOnlyÃ  rï  r7   c                	óh  a a€ ^RR.^. ^
R./oV 3R lpVV 3R lpS P                   P                  \        V4      4      pVP                  \        V4      4      P                  S P                  4       \
        P                  ! S P                  4       V.4      pVP                  S P                  S4      # )rÜ   ú	\Answeredrò  ú\Recentc                 ó<   <€ S P                   P                  R R4      # r  r  rV   s   €r4   rà  Ú6UnsolicitedResponseTests.testFlagChange.<locals>.loginÊ  r!  r7   c                 ó>   <€ SP                   P                  S 4       R # r0   )r  rp  )rÓ  rF   s   €€r4   rÃ  Ú9UnsolicitedResponseTests.testFlagChange.<locals>.loggedInÍ  s   ø€ Ø�K‰K×$Ñ$ UÖ+r7   )	r�  r§   r8   r²  r�  r   r³  r#   Ú_cbTestFlagChange)rF   rà  rÃ  r´  rª   rÓ  s   f    @r4   ÚtestFlagChangeÚ'UnsolicitedResponseTests.testFlagChangeÇ  s’   ù€ Ø�\ ;Ð/°°B¸¸Z¸LÐIˆõ	Dö	,ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰”u˜X“Ó'×2Ñ2°4·?±?ÔCÜ×Ò §¡£°"Ð 5Ó6ˆØ�}‰}˜T×3Ñ3°UÓ;Ð;r7   c                	ó  € V P                   P                  pVP                  4        Uu. uF  pR V^ ,          V^,          /.NK  	  ppVP                  R R7       VP                  R R7       V P	                  W54       R# u upi )rp  c                ó   € V ^ ,          # rû  r1   ©ru   s   &r4   r5   Ú<UnsolicitedResponseTests._cbTestFlagChange.<locals>.<lambda>Ø  s   € ˜Q˜qžTr7   )Úkeyc                ó   € V ^ ,          # rû  r1   r  s   &r4   r5   r  Ù  s   €  ! A¦$r7   N)r€  r_  Úitemsró  rC   )rF   rî  rÓ  rí  r‰  Úexpects   &&&   r4   r  Ú*UnsolicitedResponseTests._cbTestFlagChangeÕ  sl   € Ø�K‰K×ÑˆØ:?¿+¹+¼-ÓH¹-°Q�> A a¥D¨!¨A­$ <Ó0¹-ˆÐHØ	�‰‘>ˆÔ"Ø�‰™ˆÔ'Ø×Ñ˜Ö#ùò Is   ©Bc                	óL  a € V 3R  lpV 3R lpS P                   P                  \        V4      4      pVP                  \        V4      4      P                  S P                  4       \
        P                  ! S P                  4       V.4      pVP                  S P                  4      # )c                 ó<   <€ S P                   P                  R R4      # r  r  rV   s   €r4   rà  Ú7UnsolicitedResponseTests.testNewMessages.<locals>.loginÝ  r!  r7   c                 ó@   <€ S P                   P                  ^
R4       R# )r  N©r  ru  rV   s   €r4   rÃ  Ú:UnsolicitedResponseTests.testNewMessages.<locals>.loggedInà  s   ø€ Ø�K‰K×#Ñ# B¨Ö-r7   )	r�  r§   r8   r²  r�  r   r³  r#   Ú_cbTestNewMessagesrç  s   f    r4   ÚtestNewMessagesÚ(UnsolicitedResponseTests.testNewMessagesÜ  sw   ø€ õ	Dõ	.ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰”u˜X“Ó'×2Ñ2°4·?±?ÔCÜ×Ò §¡£°"Ð 5Ó6ˆØ�}‰}˜T×4Ñ4Ó5Ð5r7   c                	ó\   € V P                   P                  pV P                  V. RO.4       R# )ru  N)ru  r  Nrë  rì  s   && r4   r  Ú+UnsolicitedResponseTests._cbTestNewMessagesè  ó%   € Ø�K‰K×ÑˆØ×Ñ˜Ò6Ð7Ö8r7   c                	óL  a € V 3R  lpV 3R lpS P                   P                  \        V4      4      pVP                  \        V4      4      P                  S P                  4       \
        P                  ! S P                  4       V.4      pVP                  S P                  4      # )c                 ó<   <€ S P                   P                  R R4      # r  r  rV   s   €r4   rà  Ú=UnsolicitedResponseTests.testNewRecentMessages.<locals>.loginí  r!  r7   c                 ó@   <€ S P                   P                  R ^
4       R # r0   r  rV   s   €r4   rÃ  Ú@UnsolicitedResponseTests.testNewRecentMessages.<locals>.loggedInð  s   ø€ Ø�K‰K×#Ñ# D¨"Ö-r7   )	r�  r§   r8   r²  r�  r   r³  r#   Ú_cbTestNewRecentMessagesrç  s   f    r4   ÚtestNewRecentMessagesÚ.UnsolicitedResponseTests.testNewRecentMessagesì  sw   ø€ õ	Dõ	.ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰”u˜X“Ó'×2Ñ2°4·?±?ÔCÜ×Ò §¡£°"Ð 5Ó6ˆØ�}‰}˜T×:Ñ:Ó;Ð;r7   c                	ó\   € V P                   P                  pV P                  V. RO.4       R# )ru  N©ru  Nr  rë  rì  s   && r4   r  Ú1UnsolicitedResponseTests._cbTestNewRecentMessagesø  r  r7   c                	óL  a € V 3R  lpV 3R lpS P                   P                  \        V4      4      pVP                  \        V4      4      P                  S P                  4       \
        P                  ! S P                  4       V.4      pVP                  S P                  4      # )c                 ó<   <€ S P                   P                  R R4      # r  r  rV   s   €r4   rà  Ú@UnsolicitedResponseTests.testNewMessagesAndRecent.<locals>.loginý  r!  r7   c                 ó@   <€ S P                   P                  ^^
4       R# )é   Nr  rV   s   €r4   rÃ  ÚCUnsolicitedResponseTests.testNewMessagesAndRecent.<locals>.loggedIn   s   ø€ Ø�K‰K×#Ñ# B¨Ö+r7   )	r�  r§   r8   r²  r�  r   r³  r#   Ú_cbTestNewMessagesAndRecentrç  s   f    r4   ÚtestNewMessagesAndRecentÚ1UnsolicitedResponseTests.testNewMessagesAndRecentü  sw   ø€ õ	Dõ	,ð �^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰”u˜X“Ó'×2Ñ2°4·?±?ÔCÜ×Ò §¡£°"Ð 5Ó6ˆØ�}‰}˜T×=Ñ=Ó>Ð>r7   c                	ób   € V P                   P                  pV P                  V. RO. RO.4       R# )ru  N)ru  r(  Nr"  rë  rì  s   && r4   r*  Ú4UnsolicitedResponseTests._cbTestNewMessagesAndRecent  s(   € Ø�K‰K×ÑˆØ×Ñ˜Ò6Ò8QÐRÖSr7   r1   N)ry   rz   r{   r|   rè  ræ  rö  rõ  r  r  r  r  r  r  r+  r*  r}   r1   r7   r4   rÞ  rÞ  ¦  s?   † ò
4ò2ò
3ò2ò<ò$ò
6ò9ò
<ò9ò
?öTr7   rÞ  c                  ó2   € ] tR tRtRtR tR tR tR tRt	R# )	ÚClientCapabilityTestsi  zL
Tests for issuance of the CAPABILITY command and handling of its response.
c                óØ   € \        4       V n        \        P                  ! 4       V n        V P                  P                  V P                  4       V P                  P                  R4       R# )zC
Create an L{imap4.IMAP4Client} connected to a L{StringTransport}.
s   * OK [IMAP4rev1]
N)r   rk  r   r]  Úprotocolrö  r"  rV   s   &r4   rƒ  ÚClientCapabilityTests.setUp  sG   € ô )Ó*ˆŒÜ×)Ò)Ó+ˆŒØ�‰×$Ñ$ T§^¡^Ô4Ø�‰×"Ñ"Ð#:Ö;r7   c                óÚ   a € S P                   P                  RR7      pS P                   P                  R4       S P                   P                  R4       V 3R lpVP                  V4       V# )z
A capability response consisting only of atoms without C{'='} in them
should result in a dict mapping those atoms to L{None}.
F©ÚuseCaches&   * CAPABILITY IMAP4rev1 LOGINDISABLED
ó   0001 OK Capability completed.
c                ó4   <€ SP                  V R RRR/4       R# )r«  Ns   LOGINDISABLEDr¯  ©ÚcapabilitiesrF   s   &€r4   ÚgotCapabilitiesÚ?ClientCapabilityTests.test_simpleAtoms.<locals>.gotCapabilities$  s   ø€ Ø×Ñ˜\¨L¸$Ð@PÐRVÐ+WÖXr7   ©r2  r¦  r"  r§   ©rF   ÚcapabilitiesResultr;  s   f  r4   Útest_simpleAtomsÚ&ClientCapabilityTests.test_simpleAtoms  s_   ø€ ð
 "Ÿ]™]×:Ñ:ÀEÐ:ÓJÐØ�‰×"Ñ"Ð#NÔOØ�‰×"Ñ"Ð#GÔHõ	Yð 	×&Ñ& Ô7Ø!Ð!r7   c                óÚ   a € S P                   P                  RR7      pS P                   P                  R4       S P                   P                  R4       V 3R lpVP                  V4       V# )a‹  
A capability response consisting of atoms including C{'='} should have
those atoms split on that byte and have capabilities in the same
category aggregated into lists in the resulting dictionary.

(n.b. - I made up the word "category atom"; the protocol has no notion
of structure here, but rather allows each capability to define the
semantics of its entry in the capability response in a freeform manner.
If I had realized this earlier, the API for capabilities would look
different.  As it is, we can hope that no one defines any crazy
semantics which are incompatible with this API, or try to figure out a
better API when someone does. -exarkun)
Fr5  s.   * CAPABILITY IMAP4rev1 AUTH=LOGIN AUTH=PLAIN
r7  c                ó8   <€ SP                  V R RRRR./4       R# )r«  Nr½  r>  rÇ  r¯  r9  s   &€r4   r;  ÚAClientCapabilityTests.test_categoryAtoms.<locals>.gotCapabilities<  s$   ø€ Ø×ÑØ˜|¨T°7¸XÀxÐ<PÐQör7   r=  r>  s   f  r4   Útest_categoryAtomsÚ(ClientCapabilityTests.test_categoryAtoms*  s^   ø€ ð "Ÿ]™]×:Ñ:ÀEÐ:ÓJÐØ�‰×"Ñ"Ð#VÔWØ�‰×"Ñ"Ð#GÔHõ	ð
 	×&Ñ& Ô7Ø!Ð!r7   c                óÚ   a € S P                   P                  RR7      pS P                   P                  R4       S P                   P                  R4       V 3R lpVP                  V4       V# )z¨
A capability response consisting of both simple and category atoms of
the same type should result in a list containing L{None} as well as the
values for the category.
Fr5  s0   * CAPABILITY IMAP4rev1 FOO FOO=BAR BAR=FOO BAR
r7  c           
     ó@   <€ SP                  V R RRRR.RRR./4       R# )r«  Nó   FOOs   BARr¯  r9  s   &€r4   r;  Ú>ClientCapabilityTests.test_mixedAtoms.<locals>.gotCapabilitiesR  s,   ø€ Ø×ÑØØ˜t V¨d°F¨^¸VÀfÈdÀ^ÐTör7   r=  r>  s   f  r4   Útest_mixedAtomsÚ%ClientCapabilityTests.test_mixedAtomsD  sd   ø€ ð "Ÿ]™]×:Ñ:ÀEÐ:ÓJÐð 	�‰×"Ñ"ØAô	
ð 	�‰×"Ñ"Ð#GÔHõ	ð 	×&Ñ& Ô7Ø!Ð!r7   )r2  rk  N)
ry   rz   r{   r|   r[  rƒ  r@  rE  rK  r}   r1   r7   r4   r0  r0    s   † ñò<ò"ò"ö4"r7   r0  c                  ó&   € ] tR tRtRtR tR tRtR# )ÚStillSimplerClienti\  z@
An IMAP4 client which keeps track of unsolicited flag changes.
c                	óR   € \         P                  P                  V 4       / V n        R # r0   )r   r]  r‚   rÓ  rV   s   &r4   r‚   ÚStillSimplerClient.__init__a  s   € Ü×Ñ×"Ñ" 4Ô(ØˆŽ
r7   c                	ó<   € V P                   P                  V4       R # r0   )rÓ  r   rq  s   &&r4   rp  ÚStillSimplerClient.flagsChangede  s   € Ø�
‰
×Ñ˜(Ö#r7   rÁ  N)ry   rz   r{   r|   r[  r‚   rp  r}   r1   r7   r4   rN  rN  \  s   † ñòö$r7   rN  c                  óL   € ] tR tRtR tR tR tR tR tR t	R t
R	 tR
 tRtR# )ÚHandCraftedTestsii  c                	ó$  a aaaa€ \        4       o\        P                  ! 4       oSP                  S4       SP	                  R 4       V V3R loVV3R loVV3R lpSP                  RR4      pSP                  R4       VP                  V4       V# )ó   * OK [IMAP4rev1]c                ór   <€ SP                  SP                  4       P                  4       R,          R4       R# )rÜ   s   0003 FETCH 1 (RFC822)Nr“  ©rC   r—  r–  )rî  rF   rk  s   &€€r4   ÚcbCheckTransportÚ>HandCraftedTests.testTrailingLiteral.<locals>.cbCheckTransportp  s,   ø€ Ø×ÑØ—‘Ó!×,Ñ,Ó.¨rÕ2Ø(ör7   c                ó�   <€ SP                  R 4      pSP                  R4       SP                  R4       VP                  S4       V# )r
  s6   * 1 FETCH (RFC822 {10}
0123456789
 RFC822.SIZE 10)
s   0003 OK FETCH
)ÚfetchMessager"  r§   )rî  rª   rŸ   rY  s   & €€r4   ÚcbSelectÚ6HandCraftedTests.testTrailingLiteral.<locals>.cbSelectv  sA   ø€ Ø—‘˜sÓ#ˆAØ�N‰NØOôð �N‰NÐ/Ô0Ø�M‰MÐ*Ô+ØˆHr7   c                ón   <€ SP                  R 4      pSP                  R4       VP                  S4       V# ©r¤  ó   0002 OK SELECT)r=  rU  r§   )rî  rª   rŸ   r]  s   & €€r4   ÚcbLoginÚ5HandCraftedTests.testTrailingLiteral.<locals>.cbLogin  s/   ø€ Ø—‘˜Ó!ˆAØ�N‰NÐ,Ô-Ø�M‰M˜(Ô#ØˆHr7   ó   blahó   0001 OK LOGIN
)r   r   r]  rö  rU  rà  r"  r§   )rF   rb  rª   rŸ   rY  r]  rk  s   f  @@@@r4   ÚtestTrailingLiteralÚ$HandCraftedTests.testTrailingLiteralj  ss   ü€ Ü#Ó%ˆ	Ü×ÒÓˆØ	×Ñ˜Ô#Ø	�‰Ð*Ô+ö	ö	ö	ð �G‰G�G˜WÓ%ˆØ	�‰Ð+Ô,Ø	�‰�gÔØˆr7   c                ó|  € V P                   P                  P                  RR4       \        4       pV P                   P	                  V4       VP                  4        V P                   P                  R4       V P                  VP                  4       R4       VP                  4        V P                   P                  R4       V P                  VP                  4       R4       VP                  4        V P                   P                  R4       V P                  VP                  4       4       V P                   P                  R4       V P                  VP                  4       R	4       V P                  V P                   P                  R
4       V P                   P                  \        P                  ! R4      4       R# )zE
String literals whose data is not immediately available are
parsed.
rD  rH  s   01 LOGIN {8}
s   + Ready for 8 octets of text
s   testuser {13}
s   + Ready for 13 octets of text
s   passwords   -test
ó   01 OK LOGIN succeeded
ré  r   N)r  rL  rK  r   rö  r÷  r"  rC   r—  Ú	assertNotrì  rû  r   rü  ©rF   rk  s   & r4   Útest_fragmentedStringLiteralsÚ.HandCraftedTests.test_fragmentedStringLiteralsŠ  s4  € ð
 	�‰×Ñ×#Ñ# KÐ1AÔBÜ#Ó%ˆ	Ø�‰×"Ñ" 9Ô-à�‰ÔØ�‰× Ñ Ð!4Ô5Ø×Ñ˜Ÿ™Ó*Ð,OÔPà�‰ÔØ�‰× Ñ Ð!5Ô6Ø×Ñ˜Ÿ™Ó*Ð,PÔQà�‰ÔØ�‰× Ñ  Ô-Ø�‰�y—‘Ó(Ô)Ø�‰× Ñ  Ô.Ø×Ñ˜Ÿ™Ó*Ð,HÔIØ×Ñ˜Ÿ™×*Ñ*¨FÔ3à�‰×"Ñ"¤5×#7Ò#7Ð8JÓ#KÖLr7   c                ó`  € RR/V P                   P                  n        \        4       pV P                   P	                  V4       VP                  4        V P                   P                  R4       V P                  VP                  4       R4       VP                  4        V P                   P                  R4       V P                  VP                  4       R4       V P                  V P                   P                  R4       V P                   P                  \        P                  ! R4      4       R# )	z#
Empty string literals are parsed.
r7   s   01 LOGIN {0}
s   + Ready for 0 octets of text
s   {0}
ri  ré  r   N)r  rL  r/  r   rö  r÷  r"  rC   r—  rì  rû  r   rü  rk  s   & r4   Útest_emptyStringLiteralÚ(HandCraftedTests.test_emptyStringLiteral¤  sÕ   € ð &)¨# Jˆ�‰×ÑÔ!Ü#Ó%ˆ	Ø�‰×"Ñ" 9Ô-à�‰ÔØ�‰× Ñ Ð!4Ô5Ø×Ñ˜Ÿ™Ó*Ð,OÔPà�‰ÔØ�‰× Ñ  Ô,Ø×Ñ˜Ÿ™Ó*Ð,HÔIØ×Ñ˜Ÿ™×*Ñ*¨FÔ3à�‰×"Ñ"¤5×#7Ò#7Ð8JÓ#KÖLr7   c                ó4  a aa€ \        4       o\        4       oSP                  S4       SP                  R4       V3R lpV3R lpV3R lpVV V3R lpV! 4       P	                  \        V4      4      P	                  \        V4      4      P	                  V4      # )a.  
If unsolicited data is received along with solicited data in the
response to a I{FETCH} command issued by L{IMAP4Client.fetchSpecific},
the unsolicited data is passed to the appropriate callback and not
included in the result with which the L{Deferred} returned by
L{IMAP4Client.fetchSpecific} fires.
rV  c                 óN   <€ SP                  R R 4      p SP                  R4       V # ©rd  re  ©rà  r"  ©rª   rŸ   s    €r4   rà  ÚRHandCraftedTests.test_unsolicitedResponseMixedWithSolicitedResponse.<locals>.loginÄ  ó%   ø€ Ø—‘˜ Ó)ˆAØ�N‰NÐ/Ô0ØˆHr7   c                 óL   <€ SP                  R 4      p SP                  R4       V # r`  ©r=  rU  ru  s    €r4   r=  ÚSHandCraftedTests.test_unsolicitedResponseMixedWithSolicitedResponse.<locals>.selectÉ  ó#   ø€ Ø—‘˜Ó!ˆAØ�N‰NÐ,Ô-ØˆHr7   c                 ó†  <€ SP                  R RR.R7      p SP                  R4       SP                  R4       SP                  R4       SP                  R4       SP                  R4       SP                  R	4       SP                  R
4       SP                  R4       SP                  R4       SP                  R4       V # )rù   úHEADER.FIELDSÚSUBJECT©Ú
headerTypeÚ
headerArgss1   * 1 FETCH (BODY[HEADER.FIELDS ("SUBJECT")] {38}
s$   Subject: Suprise for your woman...
r¾  ó   )
s   * 1 FETCH (FLAGS (\Seen))
s1   * 2 FETCH (BODY[HEADER.FIELDS ("SUBJECT")] {75}
sI   Subject: What you been doing. Order your meds here . ,. handcuff madsen
ó   0003 OK FETCH completed
©ÚfetchSpecificr"  ru  s    €r4   r   ÚRHandCraftedTests.test_unsolicitedResponseMixedWithSolicitedResponse.<locals>.fetchÎ  s¨   ø€ Ø—‘Ø /¸y¸kð  ó ˆAð �N‰NÐQÔRØ�N‰NÐDÔEØ�N‰N˜7Ô#Ø�N‰N˜8Ô$Ø�N‰NÐ<Ô=Ø�N‰NÐQÔRØ�N‰NØ^ôð �N‰N˜7Ô#Ø�N‰N˜8Ô$Ø�N‰NÐ9Ô:ØˆHr7   c           	     óø   <€ SP                  SP                  4       P                  4       R	,          R4       SP                  V ^RRR..R..^RRR..R../4       SP                  SP                  ^R./4       R# )
rÜ   ó,   0003 FETCH 1:* BODY[HEADER.FIELDS (SUBJECT)]rù  r}  r~  z&Subject: Suprise for your woman...

zKSubject: What you been doing. Order your meds here . ,. handcuff madsen

ú\SeenNr“  ©rC   r—  r–  rÓ  ©ÚresrŸ   rF   rk  s   &€€€r4   r¥  ÚQHandCraftedTests.test_unsolicitedResponseMixedWithSolicitedResponse.<locals>.testà  sœ   ø€ Ø×ÑØ—‘Ó!×,Ñ,Ó.¨rÕ2Ø?ôð
 ×ÑØàà"Ø,¨y¨kÐ:ØHððð à"Ø,¨y¨kÐ:Ømðððôð( ×Ñ˜QŸW™W q¨8¨* oÖ6r7   ©r   rN  rö  rU  r§   r8   ©rF   rà  r=  r   r¥  rŸ   rk  s   f    @@r4   Ú2test_unsolicitedResponseMixedWithSolicitedResponseÚCHandCraftedTests.test_unsolicitedResponseMixedWithSolicitedResponse·  sv   ú€ ô $Ó%ˆ	ÜÓ ˆØ	×Ñ˜Ô#Ø	�‰Ð*Ô+õ	õ
	õ
	÷$	7ñ: ‹Gß‰[œ˜v›Ó'ß‰[œ˜u›Ó&ß‰[˜Óð		
r7   c                óX  a aa€ \        4       o\        P                  ! 4       oSP                  S4       SP	                  R4       V3R lpV3R lpV3R lpV V3R lpV! 4       pVP                  \        V4      4       VP                  \        V4      4       VP                  V4       V# )zN
Literals should be recognized even when they are not preceded by
whitespace.
rV  c                 óN   <€ SP                  R R 4      p SP                  R4       V # rs  rt  ©rª   r2  s    €r4   rà  ÚFHandCraftedTests.test_literalWithoutPrecedingWhitespace.<locals>.login  ó'   ø€ Ø—‘˜w¨Ó0ˆAØ×!Ñ!Ð"6Ô7ØˆHr7   c                 óL   <€ SP                  R 4      p SP                  R4       V # )ó   inboxra  ry  r”  s    €r4   r=  ÚGHandCraftedTests.test_literalWithoutPrecedingWhitespace.<locals>.select  s%   ø€ Ø—‘ Ó)ˆAØ×!Ñ!Ð"3Ô4ØˆHr7   c                 óv   <€ SP                  R RR.R7      p SP                  R4       SP                  R4       V # )rù   r}  r~  r  s8   * 1 FETCH (BODY[HEADER.FIELDS ({7}
SUBJECT)] "Hello")
rƒ  r„  r”  s    €r4   r   ÚFHandCraftedTests.test_literalWithoutPrecedingWhitespace.<locals>.fetch  sJ   ø€ Ø×&Ñ&Ø /¸y¸kð 'ó ˆAð ×!Ñ!ØOôð ×!Ñ!Ð"@ÔAØˆHr7   c                ó¨   <€ SP                  SP                  4       P                  4       R,          R4       SP                  V ^RRR..R../4       R# )rÜ   rˆ  rù  r}  r~  ÚHelloNr“  rX  )r2   rF   rk  s   &€€r4   r¥  ÚEHandCraftedTests.test_literalWithoutPrecedingWhitespace.<locals>.test"  sW   ø€ Ø×ÑØ—‘Ó!×,Ñ,Ó.¨rÕ2Ø?ôð ×ÑØ˜˜f ¸¸Ð&DÀgÐNÐOÐPör7   ©r   r   r]  rö  rU  r§   r8   )rF   rà  r=  r   r¥  rª   r2  rk  s   f     @@r4   Ú&test_literalWithoutPrecedingWhitespaceÚ7HandCraftedTests.test_literalWithoutPrecedingWhitespace  s†   ú€ ô
 $Ó%ˆ	Ü×$Ò$Ó&ˆà×Ñ 	Ô*Ø×ÑÐ1Ô2õ	õ
	õ
	ö	ñ ‹GˆØ	�‰”e˜F“mÔ$Ø	�‰”e˜E“lÔ#Ø	�‰�dÔØˆr7   c                ó,  a aa€ \        4       o\        P                  ! 4       oSP                  S4       SP	                  R4       V3R lpV3R lpVV V3R lpV! 4       pVP                  \        V4      4       VP                  \        V4      4       V# )zÀ
If the server sends a literal length which cannot be parsed as an
integer, L{IMAP4Client.lineReceived} should cause the protocol to be
disconnected by raising L{imap4.IllegalServerResponse}.
rV  c                 óN   <€ SP                  R R 4      p SP                  R4       V # rs  rt  r”  s    €r4   rà  Ú<HandCraftedTests.test_nonIntegerLiteralLength.<locals>.login=  r–  r7   c                 óL   <€ SP                  R 4      p SP                  R4       V # r`  ry  r”  s    €r4   r=  Ú=HandCraftedTests.test_nonIntegerLiteralLength.<locals>.selectB  s%   ø€ Ø—‘ Ó(ˆAØ×!Ñ!Ð"3Ô4ØˆHr7   c                 óò   <€ S P                  R RR.R7       SP                  SP                  4       P                  4       R,          R4       SP	                  \
        P                  S P                  R4       R# )rù   r}  r~  r  rˆ  s   * 1 FETCH {xyz}
...Nr“  )r…  rC   r—  r–  rí   r   ÚIllegalServerResponser"  )r2  rF   rk  s   €€€r4   r   Ú<HandCraftedTests.test_nonIntegerLiteralLength.<locals>.fetchG  so   ø€ Ø×"Ñ"Ø /¸y¸kð #ô ð ×ÑØ—‘Ó!×,Ñ,Ó.¨rÕ2Ø?ôð
 ×ÑÜ×+Ñ+Ø×%Ñ%Ø)ör7   rŸ  )rF   rà  r=  r   rª   r2  rk  s   f    @@r4   Útest_nonIntegerLiteralLengthÚ-HandCraftedTests.test_nonIntegerLiteralLength1  su   ú€ ô $Ó%ˆ	Ü×$Ò$Ó&ˆà×Ñ 	Ô*Ø×ÑÐ1Ô2õ	õ
	÷
	ñ  ‹GˆØ	�‰”e˜F“mÔ$Ø	�‰”e˜E“lÔ#Øˆr7   c                ó0  a a€ \        4       p\        4       oSP                  V4       SP                  R4       V3R lpV3R lpV3R lpVV 3R lpV! 4       P	                  \        V4      4      P	                  \        V4      4      P	                  V4      # )zà
Any unrequested flag information received along with other requested
information in an untagged I{FETCH} received in response to a request
issued with L{IMAP4Client.fetchSpecific} is passed to the
C{flagsChanged} callback.
rV  c                 óN   <€ SP                  R R 4      p SP                  R4       V # rs  rt  ru  s    €r4   rà  ÚLHandCraftedTests.test_flagsChangedInsideFetchSpecificResponse.<locals>.loginh  rw  r7   c                 óL   <€ SP                  R 4      p SP                  R4       V # r`  ry  ru  s    €r4   r=  ÚMHandCraftedTests.test_flagsChangedInsideFetchSpecificResponse.<locals>.selectm  r{  r7   c                 ó   <€ SP                  R RR.R7      p SP                  R4       SP                  R4       SP                  R4       SP                  R4       SP                  R4       SP                  R	4       SP                  R
4       V # )r÷   r}  r~  r  s1   * 1 FETCH (BODY[HEADER.FIELDS ("SUBJECT")] {22}
s   Subject: subject one
s    FLAGS (\Recent))
s?   * 2 FETCH (FLAGS (\Seen) BODY[HEADER.FIELDS ("SUBJECT")] {22}
s   Subject: subject two
r‚  rƒ  r„  ru  s    €r4   r   ÚLHandCraftedTests.test_flagsChangedInsideFetchSpecificResponse.<locals>.fetchr  s„   ø€ Ø—‘Ø ?À	¸{ð  ó ˆAð �N‰NÐQÔRØ�N‰NÐ6Ô7Ø�N‰NÐ4Ô5à�N‰NØUôð �N‰NÐ6Ô7Ø�N‰N˜8Ô$Ø�N‰NÐ9Ô:ØˆHr7   c           	     ó”   <€ SP                  V ^RRR..R..^RRR..R../4       SP                  SP                  ^R.^R./4       R# )	rÜ   rù  r}  r~  zSubject: subject one
zSubject: subject two
rü  r‰  N)rC   rÓ  )rŒ  rŸ   rF   s   &€€r4   r¥  ÚKHandCraftedTests.test_flagsChangedInsideFetchSpecificResponse.<locals>.testƒ  sx   ø€ Ø×ÑØàà"Ø,¨y¨kÐ:Ø6ððð à"Ø,¨y¨kÐ:Ø6ðððôð( ×Ñ˜QŸW™W q¨:¨,¸¸H¸:Ð&FÖGr7   rŽ  )rF   rk  rà  r=  r   r¥  rŸ   s   f     @r4   Ú,test_flagsChangedInsideFetchSpecificResponseÚ=HandCraftedTests.test_flagsChangedInsideFetchSpecificResponse\  sw   ù€ ô $Ó%ˆ	ÜÓ ˆØ	×Ñ˜Ô#Ø	�‰Ð*Ô+õ	õ
	õ
	ö"	Hñ0 ‹Gß‰[œ˜v›Ó'ß‰[œ˜u›Ó&ß‰[˜Óð		
r7   c                ó4  a aa€ \        4       o\        4       oSP                  S4       SP                  R4       V3R lpV3R lpV3R lpVV V3R lpV! 4       P	                  \        V4      4      P	                  \        V4      4      P	                  V4      # )zß
Any unrequested flag information received along with other requested
information in an untagged I{FETCH} received in response to a request
issued with L{IMAP4Client.fetchMessage} is passed to the
C{flagsChanged} callback.
rV  c                 óN   <€ SP                  R R 4      p SP                  R4       V # rs  rt  ru  s    €r4   rà  ÚKHandCraftedTests.test_flagsChangedInsideFetchMessageResponse.<locals>.login­  rw  r7   c                 óL   <€ SP                  R 4      p SP                  R4       V # r`  ry  ru  s    €r4   r=  ÚLHandCraftedTests.test_flagsChangedInsideFetchMessageResponse.<locals>.select²  r{  r7   c                 ó  <€ SP                  R 4      p SP                  R4       SP                  R4       SP                  R4       SP                  R4       SP                  R4       SP                  R4       SP                  R4       V # )rù   s   * 1 FETCH (RFC822 {24}
s   Subject: first subject
s    FLAGS (\Seen))
s.   * 2 FETCH (FLAGS (\Recent \Seen) RFC822 {25}
s   Subject: second subject
r‚  rƒ  )r\  r"  ru  s    €r4   r   ÚKHandCraftedTests.test_flagsChangedInsideFetchMessageResponse.<locals>.fetch·  sp   ø€ Ø—‘˜uÓ%ˆAØ�N‰NÐ8Ô9Ø�N‰NÐ8Ô9Ø�N‰NÐ2Ô3Ø�N‰NÐPÔQØ�N‰NÐ9Ô:Ø�N‰N˜8Ô$Ø�N‰NÐ9Ô:ØˆHr7   c                óì   <€ SP                  SP                  4       P                  4       R,          R4       SP                  V ^RR/^RR//4       SP                  SP                  ^R.^RR./4       R# )	rÜ   s   0003 FETCH 1:* (RFC822)rÝ  zSubject: first subject
zSubject: second subject
r‰  rü  Nr“  rŠ  r‹  s   &€€€r4   r¥  ÚJHandCraftedTests.test_flagsChangedInsideFetchMessageResponse.<locals>.testÂ  s€   ø€ Ø×ÑØ—‘Ó!×,Ñ,Ó.¨rÕ2Ø*ôð
 ×ÑØà˜Ð">Ð?Ø˜Ð"?Ð@ðôð ×Ñ˜QŸW™W q¨8¨*°a¸*ÀhÐ9OÐ&PÖQr7   rŽ  r�  s   f    @@r4   Ú+test_flagsChangedInsideFetchMessageResponseÚ<HandCraftedTests.test_flagsChangedInsideFetchMessageResponse¡  sw   ú€ ô $Ó%ˆ	ÜÓ ˆØ	×Ñ˜Ô#Ø	�‰Ð*Ô+õ	õ
	õ
		÷	Rñ" ‹Gß‰[œ˜v›Ó'ß‰[œ˜u›Ó&ß‰[˜Óð		
r7   c                óB  € \        4       p\        P                  ! 4       pW!n        VP	                  V4       VP                  R4       \        P                  ! R4      pVP                  V4       VP                  R4      pV P                  V\        P                  4       VP                  R4       V P                  \        P                  4      pV P                  \!        V4      ^4       V P                  V^ ,          P"                  P$                  ^ ,          R4       V# )zŽ
When decoding a base64 encoded authentication message from the server,
decoding errors are logged and then the client closes the connection.
sP   * OK [CAPABILITY IMAP4rev1 IDLE NAMESPACE AUTH=CRAM-MD5] Twisted IMAP4rev1 ReadyrD  rM  s   + Something bad! and bad
s   Something bad! and bad)r   r   r]  r2  rö  rU  r�  r4  r/  ÚassertFailurer   rü  r"  r$  r¨  rC   rå   r—  rP  )rF   rk  r2  r5  rª   Úloggeds   &     r4   Ú-test_authenticationChallengeDecodingExceptionÚ>HandCraftedTests.test_authenticationChallengeDecodingExceptionÙ  sí   € ô
 5Ó6ˆ	Ü×$Ò$Ó&ˆØ%Ôà×Ñ 	Ô*Ø×Ñð'ô	
ô ×0Ò0°Ó=ˆØ×&Ñ& uÔ-à×!Ñ! (Ó+ˆð 	×Ñ˜1œe×2Ñ2Ô3à×ÑÐ=Ô>ð ×'Ñ'¬×(CÑ(CÓDˆØ×Ñœ˜V› aÔ(Ø×Ñ˜ �Ÿ™×-Ñ-¨aÕ0Ð2KÔLØˆr7   r1   N)ry   rz   r{   r|   rf  rl  ro  r�  r   rª  rµ  rÀ  rÅ  r}   r1   r7   r4   rT  rT  i  s9   † òò@Mò4Mò&J
òX,ò\)òVC
òJ6
öpr7   rT  c                  óD   € ] tR tRt$ Rt]P                  tR]R&   R t	Rt
R# )ÚPreauthIMAP4ClientMixiniø  aR  
Mixin for L{SynchronousTestCase} subclasses which
provides a C{setUp} method which creates an L{IMAP4Client}
connected to a L{StringTransport} and puts it into the
I{authenticated} state.

@ivar transport: A L{StringTransport} to which C{client} is
    connected.

@ivar client: An L{IMAP4Client} which is connected to
    C{transport}.
zType[imap4.IMAP4Client]ÚclientProtocolc                óÎ   € \        4       V n        V P                  4       V n        V P                  P	                  V P                  4       V P                  P                  R4       R# )zU
Create an IMAP4Client connected to a fake transport and in the
authenticated state.
s   * PREAUTH Hello unittest
N)r   rk  rÉ  r€  rö  r"  rV   s   &r4   rƒ  ÚPreauthIMAP4ClientMixin.setUp  sG   € ô
 )Ó*ˆŒØ×)Ñ)Ó+ˆŒØ�‰×"Ñ" 4§>¡>Ô2Ø�‰× Ñ Ð!@ÖAr7   )r€  rk  N)ry   rz   r{   r|   r[  r   r]  rÉ  r  rƒ  r}   r1   r7   r4   rÈ  rÈ  ø  s    ‡ ñð /4×.?Ñ.?€NÐ+Ó?öBr7   rÈ  c                  óz   € ] tR tRtRtR tR tR tR tR t	R t
R	 tR
 tR tR tR tR tR tR tR tR tRtR# )ÚSelectionTestsMixini  z`
Mixin for test cases which defines tests which apply to both I{EXAMINE} and
I{SELECT} support.
c                óÖ   € \        V P                  V P                  4      ! R4      pV P                  V P                  P                  4       RV P                  ,           R,           4       V# )zÐ
Issue either an I{EXAMINE} or I{SELECT} command (depending on
C{self.method}), assert that the correct bytes are written to the
transport, and return the L{Deferred} returned by whichever method was
called.
Úfooboxs   0001 s	    foobox
)rç  r€  ÚmethodrC   rk  r—  r  ©rF   rª   s   & r4   Ú_examineOrSelectÚ$SelectionTestsMixin._examineOrSelect  sR   € ô �D—K‘K §¡Ô-¨hÓ7ˆØ×ÑØ�N‰N× Ñ Ó" H¨t¯|©|Õ$;¸nÕ$Lô	
ð ˆr7   c                óÂ   € V F%  pV P                   P                  VR,           4       K'  	  V P                   P                  RV P                  ,           R,           4       R# )z©
Deliver the given (unterminated) response lines to C{self.client} and
then deliver a tagged SELECT or EXAMINE completion line to finish the
SELECT or EXAMINE response.
r¾  s   0001 OK [READ-ONLY] s    completed
N)r€  r"  r  )rF   ÚlinesrW  s   &* r4   Ú	_responseÚSelectionTestsMixin._response&  sH   € ó ˆDØ�K‰K×$Ñ$ T¨G¥^Ö4ñ à�‰× Ñ Ø# d§l¡lÕ2Ð5FÕFö	
r7   c                ó’   € V P                  4       pV P                  R4       V P                  V P                  V4      RRR^/4       R# )zõ
If the server response to a I{SELECT} or I{EXAMINE} command includes an
I{EXISTS} response, the L{Deferred} return by L{IMAP4Client.select} or
L{IMAP4Client.examine} fires with a C{dict} including the value
associated with the C{'EXISTS'} key.
s
   * 3 EXISTSrx  Frw  N©rÒ  rÖ  rC   ÚsuccessResultOfrÑ  s   & r4   Útest_existsÚSelectionTestsMixin.test_exists2  óC   € ð ×!Ñ!Ó#ˆØ�‰�}Ô%Ø×Ñ˜×-Ñ-¨aÓ0°<ÀÈÐRSÐ2TÖUr7   c                óˆ   € V P                  4       pV P                  R4       V P                  V\        P                  4       R# )zÙ
If the server returns a non-integer EXISTS value in its response to a
I{SELECT} or I{EXAMINE} command, the L{Deferred} returned by
L{IMAP4Client.select} or L{IMAP4Client.examine} fails with
L{IllegalServerResponse}.
s   * foo EXISTSN©rÒ  rÖ  ÚfailureResultOfr   r¨  rÑ  s   & r4   Útest_nonIntegerExistsÚ)SelectionTestsMixin.test_nonIntegerExists=  ó4   € ð ×!Ñ!Ó#ˆØ�‰�Ô'Ø×Ñ˜Q¤× ;Ñ ;Ö<r7   c                ó’   € V P                  4       pV P                  R4       V P                  V P                  V4      RRR^/4       R# )zõ
If the server response to a I{SELECT} or I{EXAMINE} command includes an
I{RECENT} response, the L{Deferred} return by L{IMAP4Client.select} or
L{IMAP4Client.examine} fires with a C{dict} including the value
associated with the C{'RECENT'} key.
s
   * 5 RECENTrx  Fr§  NrÙ  rÑ  s   & r4   Útest_recentÚSelectionTestsMixin.test_recentH  rÝ  r7   c                óˆ   € V P                  4       pV P                  R4       V P                  V\        P                  4       R# )zÙ
If the server returns a non-integer RECENT value in its response to a
I{SELECT} or I{EXAMINE} command, the L{Deferred} returned by
L{IMAP4Client.select} or L{IMAP4Client.examine} fails with
L{IllegalServerResponse}.
s   * foo RECENTNrß  rÑ  s   & r4   Útest_nonIntegerRecentÚ)SelectionTestsMixin.test_nonIntegerRecentS  rã  r7   c                ó’   € V P                  4       pV P                  R4       V P                  V P                  V4      RRR^/4       R# )z÷
If the server response to a I{SELECT} or I{EXAMINE} command includes an
I{UNSEEN} response, the L{Deferred} returned by L{IMAP4Client.select} or
L{IMAP4Client.examine} fires with a C{dict} including the value
associated with the C{'UNSEEN'} key.
s)   * OK [UNSEEN 8] Message 8 is first unseenrx  Frª  NrÙ  rÑ  s   & r4   Útest_unseenÚSelectionTestsMixin.test_unseen^  sD   € ð ×!Ñ!Ó#ˆØ�‰ÐCÔDØ×Ñ˜×-Ñ-¨aÓ0°<ÀÈÐRSÐ2TÖUr7   c                óˆ   € V P                  4       pV P                  R4       V P                  V\        P                  4       R# )zÙ
If the server returns a non-integer UNSEEN value in its response to a
I{SELECT} or I{EXAMINE} command, the L{Deferred} returned by
L{IMAP4Client.select} or L{IMAP4Client.examine} fails with
L{IllegalServerResponse}.
s-   * OK [UNSEEN foo] Message foo is first unseenNrß  rÑ  s   & r4   Útest_nonIntegerUnseenÚ)SelectionTestsMixin.test_nonIntegerUnseeni  s5   € ð ×!Ñ!Ó#ˆØ�‰ÐGÔHØ×Ñ˜Q¤× ;Ñ ;Ö<r7   c                ó’   € V P                  4       pV P                  R4       V P                  V P                  V4      RRRR/4       R# )a  
If the server response to a I{SELECT} or I{EXAMINE} command includes an
I{UIDVALIDITY} response, the L{Deferred} returned by
L{IMAP4Client.select} or L{IMAP4Client.examine} fires with a C{dict}
including the value associated with the C{'UIDVALIDITY'} key.
s#   * OK [UIDVALIDITY 12345] UIDs validrx  Fr©  r†  NrÙ  rÑ  s   & r4   Útest_uidvalidityÚ$SelectionTestsMixin.test_uidvalidityt  sF   € ð ×!Ñ!Ó#ˆØ�‰Ð=Ô>Ø×ÑØ× Ñ  Ó# l°E¸=È%Ð%Pö	
r7   c                óˆ   € V P                  4       pV P                  R4       V P                  V\        P                  4       R# )zÞ
If the server returns a non-integer UIDVALIDITY value in its response to
a I{SELECT} or I{EXAMINE} command, the L{Deferred} returned by
L{IMAP4Client.select} or L{IMAP4Client.examine} fails with
L{IllegalServerResponse}.
s!   * OK [UIDVALIDITY foo] UIDs validNrß  rÑ  s   & r4   Útest_nonIntegerUIDVALIDITYÚ.SelectionTestsMixin.test_nonIntegerUIDVALIDITY�  s5   € ð ×!Ñ!Ó#ˆØ�‰Ð;Ô<Ø×Ñ˜Q¤× ;Ñ ;Ö<r7   c                ó’   € V P                  4       pV P                  R4       V P                  V P                  V4      RRRR/4       R# )zù
If the server response to a I{SELECT} or I{EXAMINE} command includes an
I{UIDNEXT} response, the L{Deferred} returned by L{IMAP4Client.select}
or L{IMAP4Client.examine} fires with a C{dict} including the value
associated with the C{'UIDNEXT'} key.
s&   * OK [UIDNEXT 4392] Predicted next UIDrx  Fr¨  i(  NrÙ  rÑ  s   & r4   Útest_uidnextÚ SelectionTestsMixin.test_uidnextŒ  sF   € ð ×!Ñ!Ó#ˆØ�‰Ð@ÔAØ×ÑØ× Ñ  Ó# l°E¸9ÀdÐ%Kö	
r7   c                óˆ   € V P                  4       pV P                  R4       V P                  V\        P                  4       R# )zÚ
If the server returns a non-integer UIDNEXT value in its response to a
I{SELECT} or I{EXAMINE} command, the L{Deferred} returned by
L{IMAP4Client.select} or L{IMAP4Client.examine} fails with
L{IllegalServerResponse}.
s%   * OK [UIDNEXT foo] Predicted next UIDNrß  rÑ  s   & r4   Útest_nonIntegerUIDNEXTÚ*SelectionTestsMixin.test_nonIntegerUIDNEXT™  s5   € ð ×!Ñ!Ó#ˆØ�‰Ð?Ô@Ø×Ñ˜Q¤× ;Ñ ;Ö<r7   c                ó’   € V P                  4       pV P                  R4       V P                  V P                  V4      RRRR/4       R# )úõ
If the server response to a I{SELECT} or I{EXAMINE} command includes an
I{FLAGS} response, the L{Deferred} returned by L{IMAP4Client.select} or
L{IMAP4Client.examine} fires with a C{dict} including the value
associated with the C{'FLAGS'} key.
s2   * FLAGS (\Answered \Flagged \Deleted \Seen \Draft)rx  FrÑ  N)rû  z\Flaggedrò  r‰  z\DraftrÙ  rÑ  s   & r4   Ú
test_flagsÚSelectionTestsMixin.test_flags¤  sK   € ð ×!Ñ!Ó#ˆØ�‰ÐQÔRØ×ÑØ× Ñ  Ó#à˜eØÐVðö	
r7   c                ó’   € V P                  4       pV P                  R4       V P                  V P                  V4      RRRR/4       R# )rý  sN   * OK [PERMANENTFLAGS (\Starred)] Just one permanent flag in that list up thererx  FÚPERMANENTFLAGSN)z\StarredrÙ  rÑ  s   & r4   Útest_permanentflagsÚ'SelectionTestsMixin.test_permanentflagsµ  sN   € ð ×!Ñ!Ó#ˆØ�‰ð"ô	
ð 	×ÑØ× Ñ  Ó#Ø˜5Ð"2°NÐCö	
r7   c                óŽ   € V P                  4       pV P                  R4       V P                  V P                  V4      RR/4       R# )zŒ
If the server response to a I{SELECT} or I{EXAMINE} command includes an
I{OK} with unrecognized response code text, parsing does not fail.
s3   * OK [X-MADE-UP] I just made this response text up.rx  FNrÙ  rÑ  s   & r4   Útest_unrecognizedOkÚ'SelectionTestsMixin.test_unrecognizedOkÆ  sA   € ð
 ×!Ñ!Ó#ˆØ�‰ÐMÔNð 	×Ñ˜×-Ñ-¨aÓ0°<ÀÐ2GÖHr7   c                óŽ   € V P                  4       pV P                  R4       V P                  V P                  V4      RR/4       R# )z‚
If the server response to a I{SELECT} or I{EXAMINE} command includes an
I{OK} with no response code text, parsing does not fail.
s   * OKrx  FNrÙ  rÑ  s   & r4   Útest_bareOkÚSelectionTestsMixin.test_bareOkÑ  s>   € ð
 ×!Ñ!Ó#ˆØ�‰�wÔØ×Ñ˜×-Ñ-¨aÓ0°<ÀÐ2GÖHr7   r1   N)ry   rz   r{   r|   r[  rÒ  rÖ  rÛ  rá  rå  rè  rë  rî  rñ  rô  r÷  rú  rþ  r	  r	  r	  r}   r1   r7   r4   rÍ  rÍ    s\   † ñò
ò

ò	Vò	=ò	Vò	=ò	Vò	=ò
ò	=ò
ò	=ò
ò"
ò"	IöIr7   rÍ  c                  ó"   € ] tR tRtRtRtRtRtR# )ÚIMAP4ClientExamineTestsiÛ  aÒ  
Tests for the L{IMAP4Client.examine} method.

An example of usage of the EXAMINE command from RFC 3501, section 6.3.2::

    S: * 17 EXISTS
    S: * 2 RECENT
    S: * OK [UNSEEN 8] Message 8 is first unseen
    S: * OK [UIDVALIDITY 3857529045] UIDs valid
    S: * OK [UIDNEXT 4392] Predicted next UID
    S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
    S: * OK [PERMANENTFLAGS ()] No permanent flags permitted
    S: A932 OK [READ-ONLY] EXAMINE completed
r„  s   EXAMINEr1   N©ry   rz   r{   r|   r[  rÐ  r  r}   r1   r7   r4   r	  r	  Û  s   † ñð €FØ„Gr7   r	  c                  ó"   € ] tR tRtRtRtRtRtR# )ÚIMAP4ClientSelectTestsiï  aè  
Tests for the L{IMAP4Client.select} method.

An example of usage of the SELECT command from RFC 3501, section 6.3.1::

    C: A142 SELECT INBOX
    S: * 172 EXISTS
    S: * 1 RECENT
    S: * OK [UNSEEN 12] Message 12 is first unseen
    S: * OK [UIDVALIDITY 3857529045] UIDs valid
    S: * OK [UIDNEXT 4392] Predicted next UID
    S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
    S: * OK [PERMANENTFLAGS (\Deleted \Seen \*)] Limited
    S: A142 OK [READ-WRITE] SELECT completed
r=  s   SELECTr1   Nr	  r1   r7   r4   r	  r	  ï  s   † ñð  €FØ„Gr7   r	  c                  ó2   € ] tR tRtRtR tR tR tR tRt	R# )	ÚIMAP4ClientExpungeTestsi  zû
Tests for the L{IMAP4Client.expunge} method.

An example of usage of the EXPUNGE command from RFC 3501, section 6.4.3::

    C: A202 EXPUNGE
    S: * 3 EXPUNGE
    S: * 3 EXPUNGE
    S: * 5 EXPUNGE
    S: * 8 EXPUNGE
    S: A202 OK EXPUNGE completed
c                	óÂ   € V P                   P                  4       pV P                  V P                  P	                  4       R 4       V P                  P                  4        V# )s   0001 EXPUNGE
)r€  rö  rC   rk  r—  r÷  rÑ  s   & r4   Ú_expungeÚ IMAP4ClientExpungeTests._expunge  sG   € Ø�K‰K×ÑÓ!ˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1DÔEØ�‰×ÑÔØˆr7   c                	óž   € V F+  pV P                   P                  \        R V R24      4       K-  	  V P                   P                  R4       R# )z* z EXPUNGEs   0001 OK EXPUNGE COMPLETEDN)r€  rU  r)   )rF   ÚsequenceNumbersÚnumbers   && r4   rÖ  Ú!IMAP4ClientExpungeTests._response  s?   € Û%ˆFØ�K‰K×$Ñ$¤]°R¸°x¸xÐ3HÓ%IÖJñ &à�‰× Ñ Ð!=Ö>r7   c                ó’   € V P                  4       pV P                  . RO4       V P                  V P                  V4      . RO4       R# )z¦
L{IMAP4Client.expunge} sends the I{EXPUNGE} command and returns a
L{Deferred} which fires with a C{list} of message sequence numbers
given by the server's response.
N)rÝ   rÝ   rà   rã   )r	  rÖ  rC   rÚ  rÑ  s   & r4   Útest_expungeÚ$IMAP4ClientExpungeTests.test_expunge  s6   € ð �M‰M‹OˆØ�‰’|Ô$Ø×Ñ˜×-Ñ-¨aÓ0²,Ö?r7   c                óŒ   € V P                  4       pV P                  . RO4       V P                  V\        P                  4       R# )z°
If the server responds with a non-integer where a message sequence
number is expected, the L{Deferred} returned by L{IMAP4Client.expunge}
fails with L{IllegalServerResponse}.
N)rÝ   rÝ   rw  rã   )r	  rÖ  rà  r   r¨  rÑ  s   & r4   Útest_nonIntegerExpungedÚ/IMAP4ClientExpungeTests.test_nonIntegerExpunged'  s2   € ð �M‰M‹OˆØ�‰Ò'Ô(Ø×Ñ˜Q¤× ;Ñ ;Ö<r7   r1   N)
ry   rz   r{   r|   r[  r	  rÖ  r	  r	  r}   r1   r7   r4   r	  r	    s   † ñòò?ò
@ö=r7   r	  c                  ó2   € ] tR tRtRtR tR tR tR tRt	R# )	ÚIMAP4ClientSearchTestsi2  a¹  
Tests for the L{IMAP4Client.search} method.

An example of usage of the SEARCH command from RFC 3501, section 6.4.4::

    C: A282 SEARCH FLAGGED SINCE 1-Feb-1994 NOT FROM "Smith"
    S: * SEARCH 2 84 882
    S: A282 OK SEARCH completed
    C: A283 SEARCH TEXT "string not in mailbox"
    S: * SEARCH
    S: A283 OK SEARCH completed
    C: A284 SEARCH CHARSET UTF-8 TEXT {6}
    C: XXXXXX
    S: * SEARCH 43
    S: A284 OK SEARCH completed
c                	óº   € V P                   P                  \        P                  ! R R7      4      pV P	                  V P
                  P                  4       R4       V# )ÚABCDEF)rG   s   0001 SEARCH (TEXT "ABCDEF")
)r€  Úsearchr   rX  rC   rk  r—  rÑ  s   & r4   Ú_searchÚIMAP4ClientSearchTests._searchD  sB   € Ø�K‰K×ÑœuŸ{š{°Ô9Ó:ˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1SÔTØˆr7   c                	óÌ   € V P                   P                  R \        RP                  \	        \
        V4      4      4      ,           4       V P                   P                  R4       R# )s	   * SEARCH Ú s   0001 OK SEARCH completedN)r€  rU  r)   r�   Úmaprý   )rF   ÚmessageNumberss   &&r4   rÖ  Ú IMAP4ClientSearchTests._responseI  sF   € Ø�‰× Ñ Øœ=¨¯©´#´c¸>Ó2JÓ)KÓLÕLô	
ð 	�‰× Ñ Ð!<Ö=r7   c                ó’   € V P                  4       pV P                  . RO4       V P                  V P                  V4      . RO4       R# )z¤
L{IMAP4Client.search} sends the I{SEARCH} command and returns a
L{Deferred} which fires with a C{list} of message sequence numbers
given by the server's response.
N)rß   rà   r  )r#	  rÖ  rC   rÚ  rÑ  s   & r4   Útest_searchÚ"IMAP4ClientSearchTests.test_searchO  s6   € ð �L‰L‹NˆØ�‰’zÔ"Ø×Ñ˜×-Ñ-¨aÓ0²*Ö=r7   c                óŒ   € V P                  4       pV P                  . RO4       V P                  V\        P                  4       R# )z¯
If the server responds with a non-integer where a message sequence
number is expected, the L{Deferred} returned by L{IMAP4Client.search}
fails with L{IllegalServerResponse}.
N)rß   rw  r  )r#	  rÖ  rà  r   r¨  rÑ  s   & r4   Útest_nonIntegerFoundÚ+IMAP4ClientSearchTests.test_nonIntegerFoundY  s1   € ð �L‰L‹NˆØ�‰’~Ô&Ø×Ñ˜Q¤× ;Ñ ;Ö<r7   r1   N)
ry   rz   r{   r|   r[  r#	  rÖ  r+	  r.	  r}   r1   r7   r4   r	  r	  2  s   † ñò"ò
>ò>ö=r7   r	  c                  ó†   € ] tR tRtRtR tR tR tR tR t	R t
R	 tR
 tR tR tR tR tR tR tR tR tR tR tRtR# )ÚIMAP4ClientFetchTestsid  zJ
Tests for the L{IMAP4Client.fetch} method.

See RFC 3501, section 6.4.5.
c                ó   € V P                   P                  R4      pV P                  V P                  P	                  4       R4       V P                   P                  R4       V P                   P                  R4       V P                   P                  R4       V P                   P                  R4       V P                   P                  R4       V P                  V P                  V4      ^RR	/^RR
/^RR/^RR//4       R# )zÞ
L{IMAP4Client.fetchUID} sends the I{FETCH UID} command and returns a
L{Deferred} which fires with a C{dict} mapping message sequence numbers
to C{dict}s mapping C{'UID'} to that message's I{UID} in the server's
response.
ú1:7ó   0001 FETCH 1:7 (UID)
ó   * 2 FETCH (UID 22)s   * 3 FETCH (UID 23)ó   * 4 FETCH (UID 24)s   * 5 FETCH (UID 25)ó   0001 OK FETCH completedrß  Ú22Ú23Ú24Ú25N)r€  ÚfetchUIDrC   rk  r—  rU  rÚ  rÑ  s   & r4   Útest_fetchUIDÚ#IMAP4ClientFetchTests.test_fetchUIDk  sÕ   € ð �K‰K× Ñ  Ó'ˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1LÔMØ�‰× Ñ Ð!6Ô7Ø�‰× Ñ Ð!6Ô7Ø�‰× Ñ Ð!6Ô7Ø�‰× Ñ Ð!6Ô7Ø�‰× Ñ Ð!;Ô<Ø×ÑØ× Ñ  Ó#Ø�˜�˜q 5¨$ -°°U¸D°MÀ1ÀuÈdÀmÐTö	
r7   c                ó<  € V P                   P                  R4      pV P                  V P                  P	                  4       R4       V P                   P                  R4       V P                   P                  R4       V P                  V\        P                  4       R# )z±
If the server responds with a non-integer where a message sequence
number is expected, the L{Deferred} returned by L{IMAP4Client.fetchUID}
fails with L{IllegalServerResponse}.
r
  s   0001 FETCH 1 (UID)
s   * foo FETCH (UID 22)r7	  N©	r€  r<	  rC   rk  r—  rU  rà  r   r¨  rÑ  s   & r4   Útest_fetchUIDNonIntegerFoundÚ2IMAP4ClientFetchTests.test_fetchUIDNonIntegerFound~  sr   € ð �K‰K× Ñ  Ó%ˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1JÔKØ�‰× Ñ Ð!8Ô9Ø�‰× Ñ Ð!;Ô<Ø×Ñ˜Q¤× ;Ñ ;Ö<r7   c                ó¨  € V P                   P                  R4      pV P                  V P                  P	                  4       R4       V P                   P                  R4       V P                   P                  R4       V P                   P                  R4       V P                   P                  R4       V P                  V\        P                  4       R# )zœ
If the server responds with an incomplete I{FETCH} response line, the
L{Deferred} returned by L{IMAP4Client.fetchUID} fails with
L{IllegalServerResponse}.
r3	  r4	  r5	  s   * 3 FETCH (UID)r6	  r7	  Nr@	  rÑ  s   & r4   Útest_incompleteFetchUIDResponseÚ5IMAP4ClientFetchTests.test_incompleteFetchUIDResponseŠ  s˜   € ð �K‰K× Ñ  Ó'ˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1LÔMØ�‰× Ñ Ð!6Ô7Ø�‰× Ñ Ð!3Ô4Ø�‰× Ñ Ð!6Ô7Ø�‰× Ñ Ð!;Ô<Ø×Ñ˜Q¤× ;Ñ ;Ö<r7   c                óF  € V P                   P                  R4      pV P                  V P                  P	                  4       R4       V P                   P                  R4       V P                   P                  R4       V P                  V P                  V4      ^RR//4       R# )zï
L{IMAP4Client.fetchBody} sends the I{FETCH BODY} command and returns a
L{Deferred} which fires with a C{dict} mapping message sequence numbers
to C{dict}s mapping C{'RFC822.TEXT'} to that message's body as given in
the server's response.
Ú3s   0001 FETCH 3 (RFC822.TEXT)
s&   * 3 FETCH (RFC822.TEXT "Message text")r7	  rÛ  zMessage textN)r€  Ú	fetchBodyrC   rk  r—  rU  rÚ  rÑ  s   & r4   Útest_fetchBodyÚ$IMAP4ClientFetchTests.test_fetchBody˜  s�   € ð �K‰K×!Ñ! #Ó&ˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1RÔSØ�‰× Ñ Ð!JÔKØ�‰× Ñ Ð!;Ô<Ø×Ñ˜×-Ñ-¨aÓ0°1°}ÀnÐ6UÐ2VÖWr7   c                óJ  € V P                   P                  R4      pV P                  V P                  P	                  4       R4       V P                   P                  R4       V P                   P                  R4       V P                  V P                  V4      ^R. R../4       R# )a  
L{IMAP4Client.fetchSpecific} sends the I{BODY[]} command if no
parameters beyond the message set to retrieve are given.  It returns a
L{Deferred} which fires with a C{dict} mapping message sequence numbers
to C{list}s of corresponding message data given by the server's
response.
Ú7ó   0001 FETCH 7 BODY[]
s   * 7 FETCH (BODY[] "Some body")r7	  rù  ú	Some bodyN©r€  r…  rC   rk  r—  rU  rÚ  rÑ  s   & r4   Útest_fetchSpecificÚ(IMAP4ClientFetchTests.test_fetchSpecific¥  s†   € ð �K‰K×%Ñ% cÓ*ˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1KÔLØ�‰× Ñ Ð!BÔCØ�‰× Ñ Ð!;Ô<Ø×Ñ˜×-Ñ-¨aÓ0°1¸ÀÀKÐ7PÐ6QÐ2RÖSr7   c                óN  € V P                   P                  RRR7      pV P                  V P                  P	                  4       R4       V P                   P                  R4       V P                   P                  R4       V P                  V P                  V4      ^R. R../4       R	# )
zk
L{IMAP4Client.fetchSpecific} issues a I{BODY.PEEK[]} command if passed
C{True} for the C{peek} parameter.
Ú6T)rþ  s   0001 FETCH 6 BODY.PEEK[]
s   * 6 FETCH (BODY[] "Some body")r7	  rù  rN	  NrO	  rÑ  s   & r4   Útest_fetchSpecificPeekÚ,IMAP4ClientFetchTests.test_fetchSpecificPeek³  s‹   € ð
 �K‰K×%Ñ% c°Ð%Ó5ˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1PÔQà�‰× Ñ Ð!BÔCØ�‰× Ñ Ð!;Ô<Ø×Ñ˜×-Ñ-¨aÓ0°1¸ÀÀKÐ7PÐ6QÐ2RÖSr7   c                óP  € V P                   P                  RR
R7      pV P                  V P                  P	                  4       R4       V P                   P                  R4       V P                   P                  R4       V P                  V P                  V4      ^RR.R../4       R	# )a  
L{IMAP4Client.fetchSpecific}, when passed a sequence for
C{headerNumber}, sends the I{BODY[N.M]} command.  It returns a
L{Deferred} which fires with a C{dict} mapping message sequence numbers
to C{list}s of corresponding message data given by the server's
response.
rL	  ©ÚheaderNumbers   0001 FETCH 7 BODY[1.2.3]
s#   * 7 FETCH (BODY[1.2.3] "Some body")r7	  rù  z1.2.3rN	  NrÞ   rO	  rÑ  s   & r4   Útest_fetchSpecificNumberedÚ0IMAP4ClientFetchTests.test_fetchSpecificNumbered¿  s�   € ð �K‰K×%Ñ% c¸	Ð%ÓBˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1PÔQØ�‰× Ñ Ð!GÔHØ�‰× Ñ Ð!;Ô<Ø×ÑØ× Ñ  Ó# a¨6°G°9¸kÐ*JÐ)KÐ%Lö	
r7   c                óP  € V P                   P                  RRR7      pV P                  V P                  P	                  4       R4       V P                   P                  R4       V P                   P                  R4       V P                  V P                  V4      ^RR.R../4       R	# )
a	  
L{IMAP4Client.fetchSpecific}, when passed C{'TEXT'} for C{headerType},
sends the I{BODY[TEXT]} command.  It returns a L{Deferred} which fires
with a C{dict} mapping message sequence numbers to C{list}s of
corresponding message data given by the server's response.
Ú8ÚTEXT©r€  ó   0001 FETCH 8 BODY[TEXT]
s"   * 8 FETCH (BODY[TEXT] "Some body")r7	  rù  rN	  NrO	  rÑ  s   & r4   Útest_fetchSpecificTextÚ,IMAP4ClientFetchTests.test_fetchSpecificTextÏ  ó�   € ð �K‰K×%Ñ% c°fÐ%Ó=ˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1OÔPØ�‰× Ñ Ð!FÔGØ�‰× Ñ Ð!;Ô<Ø×ÑØ× Ñ  Ó# a¨6°F°8¸[Ð*IÐ)JÐ%Kö	
r7   c                óR  € V P                   P                  RR^R7      pV P                  V P                  P	                  4       R4       V P                   P                  R4       V P                   P                  R4       V P                  V P                  V4      ^RR.R	../4       R
# )a8  
If passed a value for the C{headerNumber} parameter and C{'TEXT'} for
the C{headerType} parameter, L{IMAP4Client.fetchSpecific} sends a
I{BODY[number.TEXT]} request and returns a L{Deferred} which fires with
a C{dict} mapping message sequence numbers to C{list}s of message data
given by the server's response.
Ú4r]	  )r€  rX	  s   0001 FETCH 4 BODY[7.TEXT]
s$   * 4 FETCH (BODY[7.TEXT] "Some body")r7	  rù  z7.TEXTrN	  NrO	  rÑ  s   & r4   Útest_fetchSpecificNumberedTextÚ4IMAP4ClientFetchTests.test_fetchSpecificNumberedTextÞ  s’   € ð �K‰K×%Ñ% c°fÈ1Ð%ÓMˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1QÔRØ�‰× Ñ Ð!HÔIØ�‰× Ñ Ð!;Ô<Ø×ÑØ× Ñ  Ó# a¨6°H°:¸{Ð*KÐ)LÐ%Mö	
r7   c                ó@  € V P                   P                  RRR7      pV P                  V P                  P	                  4       R4       V P                   P                  R4       V P                   P                  R4       V P                  V\        P                  4       R# )zÔ
If the server responds to a I{BODY[TEXT]} request with a I{FETCH} line
which is truncated after the I{BODY[TEXT]} tokens, the L{Deferred}
returned by L{IMAP4Client.fetchUID} fails with
L{IllegalServerResponse}.
r\	  r]	  r^	  r_	  s   * 8 FETCH (BODY[TEXT])r7	  N©	r€  r…  rC   rk  r—  rU  rà  r   r¨  rÑ  s   & r4   Ú(test_incompleteFetchSpecificTextResponseÚ>IMAP4ClientFetchTests.test_incompleteFetchSpecificTextResponseî  sw   € ð �K‰K×%Ñ% c°fÐ%Ó=ˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1OÔPØ�‰× Ñ Ð!:Ô;Ø�‰× Ñ Ð!;Ô<Ø×Ñ˜Q¤× ;Ñ ;Ö<r7   c                óP  € V P                   P                  RRR7      pV P                  V P                  P	                  4       R4       V P                   P                  R4       V P                   P                  R4       V P                  V P                  V4      ^RR.R../4       R	# )
a	  
L{IMAP4Client.fetchSpecific}, when passed C{'MIME'} for C{headerType},
sends the I{BODY[MIME]} command.  It returns a L{Deferred} which fires
with a C{dict} mapping message sequence numbers to C{list}s of
corresponding message data given by the server's response.
r\	  r  r^	  s   0001 FETCH 8 BODY[MIME]
s"   * 8 FETCH (BODY[MIME] "Some body")r7	  rù  rN	  NrO	  rÑ  s   & r4   Útest_fetchSpecificMIMEÚ,IMAP4ClientFetchTests.test_fetchSpecificMIMEû  rb	  r7   c                óV  € V P                   P                  RR^^R7      pV P                  V P                  P	                  4       R4       V P                   P                  R4       V P                   P                  R4       V P                  V P                  V4      ^	RR.RR	../4       R
# )a(  
L{IMAP4Client.fetchSpecific}, when passed C{offset} and C{length},
sends a partial content request (like I{BODY[TEXT]<offset.length>}).
It returns a L{Deferred} which fires with a C{dict} mapping message
sequence numbers to C{list}s of corresponding message data given by the
server's response.
Ú9r]	  )r€  Úoffsetr  s   0001 FETCH 9 BODY[TEXT]<17.3>
s    * 9 FETCH (BODY[TEXT]<17> "foo")r7	  rù  z<17>rw  NrO	  rÑ  s   & r4   Útest_fetchSpecificPartialÚ/IMAP4ClientFetchTests.test_fetchSpecificPartial
  s—   € ð �K‰K×%Ñ% c°fÀRÐPQÐ%ÓRˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1UÔVØ�‰× Ñ Ð!DÔEØ�‰× Ñ Ð!;Ô<Ø×ÑØ× Ñ  Ó# a¨6°F°8¸VÀUÐ*KÐ)LÐ%Mö	
r7   c                ó@  € V P                   P                  RRR7      pV P                  V P                  P	                  4       R4       V P                   P                  R4       V P                   P                  R4       V P                  V\        P                  4       R# )zÜ
If the server responds to a I{BODY[TEXT]} request with a I{FETCH} line
which is truncated after the I{BODY[TEXT]<offset>} tokens, the
L{Deferred} returned by L{IMAP4Client.fetchUID} fails with
L{IllegalServerResponse}.
r\	  r]	  r^	  r_	  s   * 8 FETCH (BODY[TEXT]<17>)r7	  Nrh	  rÑ  s   & r4   Ú+test_incompleteFetchSpecificPartialResponseÚAIMAP4ClientFetchTests.test_incompleteFetchSpecificPartialResponse  sw   € ð �K‰K×%Ñ% c°fÐ%Ó=ˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1OÔPØ�‰× Ñ Ð!>Ô?Ø�‰× Ñ Ð!;Ô<Ø×Ñ˜Q¤× ;Ñ ;Ö<r7   c                óJ  € V P                   P                  R4      pV P                  V P                  P	                  4       R4       V P                   P                  R4       V P                   P                  R4       V P                  V P                  V4      ^R. R../4       R# )a  
If the body of a message begins with I{<} and ends with I{>} (as,
for example, HTML bodies typically will), this is still interpreted
as the body by L{IMAP4Client.fetchSpecific} (and particularly, not
as a length indicator for a response to a request for a partial
body).
rL	  rM	  s&   * 7 FETCH (BODY[] "<html>test</html>")r7	  rù  z<html>test</html>NrO	  rÑ  s   & r4   Útest_fetchSpecificHTMLÚ,IMAP4ClientFetchTests.test_fetchSpecificHTML'  sŠ   € ð �K‰K×%Ñ% cÓ*ˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1KÔLØ�‰× Ñ Ð!JÔKØ�‰× Ñ Ð!;Ô<Ø×ÑØ× Ñ  Ó# a¨6°2Ð7JÐ*KÐ)LÐ%Mö	
r7   c                óÆ  € V P                   P                  RVR7      pV P                  V P                  P	                  4       RVP                  R4      ,           R,           4       V P                   P                  RVP                  R4      ,           R,           4       V P                   P                  R4       V P                  V P                  V4      ^
R	V. .R
../4       R# )a‡  
Assert that the provided C{BODY} section, when invoked with no
arguments, produces an empty list, and that it returns a
L{Deferred} which fires with a C{dict} mapping message
sequence numbers to C{list}s of corresponding message data
given by the server's response.

@param section: The C{BODY} section to test: either
    C{'HEADER.FIELDS'} or C{'HEADER.FIELDS.NOT'}
@type section: L{str}
Ú10r^	  s   0001 FETCH 10 BODY[rÎ  s    ()]
s   * 10 FETCH (BODY[s    ()] "")r7	  rù  rw  N)r€  r…  rC   rk  r—  rD   rU  rÚ  )rF   Úsectionrª   s   && r4   Ú&assertFetchSpecificFieldsWithEmptyListÚ<IMAP4ClientFetchTests.assertFetchSpecificFieldsWithEmptyList7  s¿   € ð �K‰K×%Ñ% d°wÐ%Ó?ˆØ×ÑØ�N‰N× Ñ Ó"Ø" W§^¡^°GÓ%<Õ<¸{ÕJô	
ð 	�‰× Ñ Ø  7§>¡>°'Ó#:Õ:¸[ÕHô	
ð 	�‰× Ñ Ð!;Ô<Ø×Ñ˜×-Ñ-¨aÓ0°2¸À'È2ÀÐPRÐ8SÐ7TÐ2UÖVr7   c                ó(   € V P                  R4       R# )aB  
L{IMAP4Client.fetchSpecific}, when passed C{'HEADER.FIELDS'}
for C{headerType} but no C{headerArgs}, sends the
I{BODY[HEADER.FIELDS]} command with no arguments.  It returns
a L{Deferred} which fires with a C{dict} mapping message
sequence numbers to C{list}s of corresponding message data
given by the server's response.
r}  N©r|	  rV   s   &r4   Ú,test_fetchSpecificHeaderFieldsWithoutHeadersÚBIMAP4ClientFetchTests.test_fetchSpecificHeaderFieldsWithoutHeadersP  s   € ð 	×3Ñ3°OÖDr7   c                ó(   € V P                  R4       R# )aJ  
L{IMAP4Client.fetchSpecific}, when passed
C{'HEADER.FIELDS.NOT'} for C{headerType} but no C{headerArgs},
sends the I{BODY[HEADER.FIELDS.NOT]} command with no
arguments.  It returns a L{Deferred} which fires with a
C{dict} mapping message sequence numbers to C{list}s of
corresponding message data given by the server's response.
zHEADER.FIELDS.NOTNr	  rV   s   &r4   Ú/test_fetchSpecificHeaderFieldsNotWithoutHeadersÚEIMAP4ClientFetchTests.test_fetchSpecificHeaderFieldsNotWithoutHeaders[  s   € ð 	×3Ñ3Ð4GÖHr7   c                óP  € V P                   P                  RRR7      pV P                  V P                  P	                  4       R4       V P                   P                  R4       V P                   P                  R4       V P                  V P                  V4      ^RR.R../4       R	# )
a  
L{IMAP4Client.fetchSpecific}, when passed C{'HEADER'} for
C{headerType}, sends the I{BODY[HEADER]} command.  It returns
a L{Deferred} which fires with a C{dict} mapping message
sequence numbers to C{list}s of corresponding message data
given by the server's response.
Ú11ÚHEADERr^	  s   0001 FETCH 11 BODY[HEADER]
sJ   * 11 FETCH (BODY[HEADER] "From: someone@localhost
Subject: Some subject")r7	  rù  z.From: someone@localhost
Subject: Some subjectNrO	  rÑ  s   & r4   Útest_fetchSpecificHeaderÚ.IMAP4ClientFetchTests.test_fetchSpecificHeaderf  s¡   € ð �K‰K×%Ñ% d°xÐ%Ó@ˆØ×Ñ˜Ÿ™×-Ñ-Ó/Ð1RÔSØ�‰× Ñ ðDô	
ð 	�‰× Ñ Ð!;Ô<Ø×ÑØ× Ñ  Ó#ààØ!˜
ØJðððö	
r7   r1   N)ry   rz   r{   r|   r[  r=	  rA	  rD	  rI	  rP	  rT	  rY	  r`	  re	  ri	  rl	  rq	  rt	  rw	  r|	  r€	  rƒ	  rˆ	  r}   r1   r7   r4   r1	  r1	  d  sg   † ñò
ò&
=ò=òXòTò
Tò
ò 
ò
ò =ò
ò
ò =ò
ò Wò2	Eò	Iö
r7   r1	  c                  óf   € ] tR tRtRt]tR tR tR t	R t
R tR tR	 tR
 tR tR tR tR tRtR# )ÚIMAP4ClientStoreTestsiƒ  a³  
Tests for the L{IMAP4Client.setFlags}, L{IMAP4Client.addFlags}, and
L{IMAP4Client.removeFlags} methods.

An example of usage of the STORE command, in terms of which these three
methods are implemented, from RFC 3501, section 6.4.6::

    C: A003 STORE 2:4 +FLAGS (\Deleted)
    S: * 2 FETCH (FLAGS (\Deleted \Seen))
    S: * 3 FETCH (FLAGS (\Deleted))
    S: * 4 FETCH (FLAGS (\Deleted \Flagged \Seen))
    S: A003 OK STORE completed
c                ól  € \        V P                  V4      ! RRR4      pV P                  V P                  P	                  4       RV,           R,           4       V P                  P                  R4       V P                  P                  R4       V P                  V P                  V4      ^R	RR.//4       R
# )a=  
Test a non-silent flag modifying method.  Call the method, assert that
the correct bytes are sent, deliver a I{FETCH} response, and assert
that the result of the Deferred returned by the method is correct.

@param method: The name of the method to test.
@param item: The data item which is expected to be specified.
rG	  ú\Readr‰  Fó   0001 STORE 3 ó    (\Read \Seen)
s   * 3 FETCH (FLAGS (\Read \Seen))ó   0001 OK STORE completedrÑ  N©r�	  r‰  ©rç  r€  rC   rk  r—  rU  rÚ  ©rF   rÐ  Úitemrª   s   &&& r4   Ú
_flagsTestÚ IMAP4ClientStoreTests._flagsTest”  sœ   € ô �D—K‘K Ô(¨Ð.BÀEÓJˆØ×ÑØ�N‰N× Ñ Ó"Ð$4°tÕ$;Ð>UÕ$Uô	
ð 	�‰× Ñ Ð!EÔFØ�‰× Ñ Ð!;Ô<Ø×Ñ˜×-Ñ-¨aÓ0°1°wÀÈ8Ð@TÐ6UÐ2VÖWr7   c                ó*  € \        V P                  V4      ! RRR4      pV P                  V P                  P	                  4       RV,           R,           4       V P                  P                  R4       V P                  V P                  V4      / 4       R# )a7  
Test a silent flag modifying method.  Call the method, assert that the
correct bytes are sent, deliver an I{OK} response, and assert that the
result of the Deferred returned by the method is correct.

@param method: The name of the method to test.
@param item: The data item which is expected to be specified.
rG	  TrŽ	  r�	  r�	  Nr‘	  r’	  r“	  s   &&& r4   Ú_flagsSilentlyTestÚ(IMAP4ClientStoreTests._flagsSilentlyTest¥  sz   € ô �D—K‘K Ô(¨Ð.BÀDÓIˆØ×ÑØ�N‰N× Ñ Ó"Ð$4°tÕ$;Ð>UÕ$Uô	
ð 	�‰× Ñ Ð!;Ô<Ø×Ñ˜×-Ñ-¨aÓ0°"Ö5r7   c                ó´  € \        V P                  V4      ! RR
R4      pV P                  V P                  P	                  4       RV,           R,           4       V P                  P                  R4       V P                  P                  R4       V P                  V P                  V4      / 4       V P                  V P                  P                  ^RR./4       R	# )ap  
Test unsolicited data received in response to a silent flag modifying
method.  Call the method, assert that the correct bytes are sent,
deliver the unsolicited I{FETCH} response, and assert that the result
of the Deferred returned by the method is correct.

@param method: The name of the method to test.
@param item: The data item which is expected to be specified.
rG	  r�	  r‰  TrŽ	  r�	  s   * 2 FETCH (FLAGS (\Read \Seen))r�	  Nr‘	  )rç  r€  rC   rk  r—  rU  rÚ  rÓ  r“	  s   &&& r4   Ú%_flagsSilentlyWithUnsolicitedDataTestÚ;IMAP4ClientStoreTests._flagsSilentlyWithUnsolicitedDataTestµ  s±   € ô �D—K‘K Ô(¨Ð.BÀDÓIˆØ×ÑØ�N‰N× Ñ Ó"Ð$4°tÕ$;Ð>UÕ$Uô	
ð 	�‰× Ñ Ð!EÔFØ�‰× Ñ Ð!;Ô<Ø×Ñ˜×-Ñ-¨aÓ0°"Ô5Ø×Ñ˜Ÿ™×*Ñ*¨Q°¸8Ð0DÐ,EÖFr7   c                ó*   € V P                  RR4       R# )a!  
When passed a C{False} value for the C{silent} parameter,
L{IMAP4Client.setFlags} sends the I{STORE} command with a I{FLAGS} data
item and returns a L{Deferred} which fires with a C{dict} mapping
message sequence numbers to C{dict}s mapping C{'FLAGS'} to the new
flags of those messages.
ÚsetFlagsrÅ  N©r•	  rV   s   &r4   Útest_setFlagsÚ#IMAP4ClientStoreTests.test_setFlagsÈ  s   € ð 	�‰˜
 HÖ-r7   c                ó*   € V P                  RR4       R# )zÎ
When passed a C{True} value for the C{silent} parameter,
L{IMAP4Client.setFlags} sends the I{STORE} command with a
I{FLAGS.SILENT} data item and returns a L{Deferred} which fires with an
empty dictionary.
rž	  ó   FLAGS.SILENTN©r˜	  rV   s   &r4   Útest_setFlagsSilentlyÚ+IMAP4ClientStoreTests.test_setFlagsSilentlyÒ  s   € ð 	×Ñ 
¨OÖ<r7   c                ó*   € V P                  RR4       R# )zŽ
If unsolicited flag data is received in response to a I{STORE}
I{FLAGS.SILENT} request, that data is passed to the C{flagsChanged}
callback.
rž	  r£	  N©r›	  rV   s   &r4   Ú(test_setFlagsSilentlyWithUnsolicitedDataÚ>IMAP4ClientStoreTests.test_setFlagsSilentlyWithUnsolicitedDataÛ  s   € ð 	×2Ñ2°:¸ÖOr7   c                ó*   € V P                  RR4       R# )zc
L{IMAP4Client.addFlags} is like L{IMAP4Client.setFlags}, but sends
I{+FLAGS} instead of I{FLAGS}.
ÚaddFlagss   +FLAGSNrŸ	  rV   s   &r4   Útest_addFlagsÚ#IMAP4ClientStoreTests.test_addFlagsã  s   € ð
 	�‰˜
 IÖ.r7   c                ó*   € V P                  RR4       R# )z¿
L{IMAP4Client.addFlags} with a C{True} value for C{silent} behaves like
L{IMAP4Client.setFlags} with a C{True} value for C{silent}, but it
sends I{+FLAGS.SILENT} instead of I{FLAGS.SILENT}.
r¬	  ó   +FLAGS.SILENTNr¤	  rV   s   &r4   Útest_addFlagsSilentlyÚ+IMAP4ClientStoreTests.test_addFlagsSilentlyê  s   € ð 	×Ñ 
Ð,<Ö=r7   c                ó*   € V P                  RR4       R# )zy
L{IMAP4Client.addFlags} behaves like L{IMAP4Client.setFlags} when used
in silent mode and unsolicited data is received.
r¬	  r°	  Nr¨	  rV   s   &r4   Ú(test_addFlagsSilentlyWithUnsolicitedDataÚ>IMAP4ClientStoreTests.test_addFlagsSilentlyWithUnsolicitedDataò  s   € ð
 	×2Ñ2°:Ð?OÖPr7   c                ó*   € V P                  RR4       R# )zf
L{IMAP4Client.removeFlags} is like L{IMAP4Client.setFlags}, but sends
I{-FLAGS} instead of I{FLAGS}.
ÚremoveFlagss   -FLAGSNrŸ	  rV   s   &r4   Útest_removeFlagsÚ&IMAP4ClientStoreTests.test_removeFlagsù  s   € ð
 	�‰˜ yÖ1r7   c                ó*   € V P                  RR4       R# )zÂ
L{IMAP4Client.removeFlags} with a C{True} value for C{silent} behaves
like L{IMAP4Client.setFlags} with a C{True} value for C{silent}, but it
sends I{-FLAGS.SILENT} instead of I{FLAGS.SILENT}.
r·	  ó   -FLAGS.SILENTNr¤	  rV   s   &r4   Útest_removeFlagsSilentlyÚ.IMAP4ClientStoreTests.test_removeFlagsSilently   s   € ð 	×Ñ Ð/?Ö@r7   c                ó*   € V P                  RR4       R# )z|
L{IMAP4Client.removeFlags} behaves like L{IMAP4Client.setFlags} when
used in silent mode and unsolicited data is received.
r·	  r»	  Nr¨	  rV   s   &r4   Ú+test_removeFlagsSilentlyWithUnsolicitedDataÚAIMAP4ClientStoreTests.test_removeFlagsSilentlyWithUnsolicitedData  s   € ð
 	×2Ñ2°=ÐBRÖSr7   r1   N)ry   rz   r{   r|   r[  rN  rÉ  r•	  r˜	  r›	  r 	  r¥	  r©	  r­	  r±	  r´	  r¸	  r¼	  r¿	  r}   r1   r7   r4   r‹	  r‹	  ƒ  sP   † ñð (€NòXò"6ò Gò&.ò=òPò/ò>òQò2òAöTr7   r‹	  c                  ó&   € ] tR tRtRtR tR tRtR# )ÚIMAP4ClientStatusTestsi  a?  
Tests for the L{IMAP4Client.status} method.

An example of usage of the STATUS command from RFC 3501, section
5.1.2::

    C: A042 STATUS blurdybloop (UIDNEXT MESSAGES)
    S: * STATUS blurdybloop (MESSAGES 231 UIDNEXT 44292)
    S: A042 OK STATUS completed

@see: U{https://tools.ietf.org/html/rfc3501#section-5.1.2}
c                ó¶   € V P                  \        V P                  P                  RR4      pV P	                  \        V4      R\        R04      ,           4       R# )zy
Only allow sending the C{STATUS} names defined in RFC 3501.

@see: U{https://tools.ietf.org/html/rfc3501#section-5.1.2}
rî  zIMPOSSIBLE?!zUnknown names: N)rí   r$  r€  rs  rC   rý   rò   )rF   Úexcs   & r4   ÚtestUnknownNameÚ&IMAP4ClientStatusTests.testUnknownName  sN   € ð ×ÑÜØ�K‰K×ÑØØó	
ˆð 	×Ñœ˜S›Ð#4´t¸^Ð<LÓ7MÕ#MÖNr7   c                ó>  € V P                   P                  RR4      pV P                  V P                  P	                  4       R4       V P                   P                  R4       V P                   P                  R4       V P                  V\        P                  4       R# )zq
C{STATUS} names that cannot be decoded as ASCII cause the
status Deferred to fail with L{IllegalServerResponse}
Úblurdybloopr¦  s$   0001 STATUS blurdybloop (MESSAGES)
s?   * STATUS blurdybloop (MESSAGES 1 ASCIINAME "OK" NOTÿASCII "NO")s   0001 OK STATUS completedN)	r€  rs  rC   rk  r—  rU  rà  r   r¨  rÑ  s   & r4   ÚtestUndecodableNameÚ*IMAP4ClientStatusTests.testUndecodableName,  s}   € ð �K‰K×Ñ˜}¨jÓ9ˆØ×ÑØ�N‰N× Ñ Ó"Ø5ô	
ð
 	�‰× Ñ ØUô	
ð 	�‰× Ñ Ð!<Ô=Ø×Ñ˜Q¤× ;Ñ ;Ö<r7   r1   N)ry   rz   r{   r|   r[  rÅ	  rÉ	  r}   r1   r7   r4   rÂ	  rÂ	    s   † ñòOö=r7   rÂ	  c                  ó6   € ] tR tRtRt]tR tR tR t	R t
RtR# )	ÚIMAP4ClientCopyTestsi?  zÈ
Tests for the L{IMAP4Client.copy} method.

An example of the C{COPY} command, which this method implements,
from RFC 3501, section 6.4.7::

    C: A003 COPY 2:4 MEETING
    S: A003 OK COPY completed
c                ó  € V P                   P                  RRRR7      pV P                  V P                  P	                  4       R4       V P                   P                  R4       V P                  V P                  V4      . R34       R# )	z—
L{IMAP4Client.copy} copies the messages identified by their
sequence numbers to the mailbox, returning a L{Deferred} that
succeeds with a true value.
r  ÚMEETINGFrV  ó   0001 COPY 2:3 MEETING
ó   0001 OK COPY completedó   OK COPY completedN©r€  ÚcopyrC   rk  r—  rU  rÚ  rÑ  s   & r4   Útest_copySequenceNumbersÚ-IMAP4ClientCopyTests.test_copySequenceNumbersL  sv   € ð �K‰K×Ñ˜U I°5ÐÓ9ˆà×ÑØ�N‰N× Ñ Ó"Ø(ô	
ð
 	�‰× Ñ Ð!:Ô;Ø×Ñ˜×-Ñ-¨aÓ0°2Ð7KÐ2LÖMr7   c                ó>  € V P                   P                  RRRR7      pV P                  V P                  P	                  4       R4       V P                   P                  R4       V P                  V P                  V4      P                  \        P                  4       R# )z®
L{IMAP4Client.copy} returns a L{Deferred} that fails with an
L{IMAP4Exception} when the messages specified by the given
sequence numbers could not be copied to the mailbox.
r  rÎ	  FrV  rÏ	  ó   0001 BAD COPY failedN©
r€  rÓ	  rC   rk  r—  rU  r  rà  r   r–  rÑ  s   & r4   Útest_copySequenceNumbersFailsÚ2IMAP4ClientCopyTests.test_copySequenceNumbersFails\  s|   € ð �K‰K×Ñ˜U I°5ÐÓ9ˆà×ÑØ�N‰N× Ñ Ó"Ø(ô	
ð
 	�‰× Ñ Ð!8Ô9Ø×Ñ˜d×2Ñ2°1Ó5×;Ñ;¼U×=QÑ=QÖRr7   c                ó  € V P                   P                  RRRR7      pV P                  V P                  P	                  4       R4       V P                   P                  R4       V P                  V P                  V4      . R34       R# )	z‹
L{IMAP4Client.copy} copies the messages identified by their
UIDs to the mailbox, returning a L{Deferred} that succeeds
with a true value.
r  rÎ	  TrV  ó   0001 UID COPY 2:3 MEETING
rÐ	  rÑ	  NrÒ	  rÑ  s   & r4   Útest_copyUIDsÚ"IMAP4ClientCopyTests.test_copyUIDsl  sv   € ð �K‰K×Ñ˜U I°4ÐÓ8ˆà×ÑØ�N‰N× Ñ Ó"Ø,ô	
ð
 	�‰× Ñ Ð!:Ô;Ø×Ñ˜×-Ñ-¨aÓ0°2Ð7KÐ2LÖMr7   c                ó>  € V P                   P                  RRRR7      pV P                  V P                  P	                  4       R4       V P                   P                  R4       V P                  V P                  V4      P                  \        P                  4       R# )z¢
L{IMAP4Client.copy} returns a L{Deferred} that fails with an
L{IMAP4Exception} when the messages specified by the given
UIDs could not be copied to the mailbox.
r  rÎ	  TrV  rÜ	  r×	  NrØ	  rÑ  s   & r4   Útest_copyUIDsFailsÚ'IMAP4ClientCopyTests.test_copyUIDsFails|  s|   € ð �K‰K×Ñ˜U I°4ÐÓ8ˆà×ÑØ�N‰N× Ñ Ó"Ø,ô	
ð
 	�‰× Ñ Ð!8Ô9Ø×Ñ˜d×2Ñ2°1Ó5×;Ñ;¼U×=QÑ=QÖRr7   r1   N)ry   rz   r{   r|   r[  rN  rÉ  rÔ	  rÙ	  rÝ	  rà	  r}   r1   r7   r4   rÌ	  rÌ	  ?  s&   † ñð (€NòNò Sò Nö Sr7   rÌ	  c                  ó$   € ] tR tRtRtRtR tRtR# )ÚFakeyServeri�  r=  Nc                	ó   € R # r0   r1   rV   s   &r4   ÚsendServerGreetingÚFakeyServer.sendServerGreeting‘  rÛ  r7   r1   )ry   rz   r{   r|   rì  Útimeoutrå	  r}   r1   r7   r4   rã	  rã	  �  s   † Ø€EØ€Gör7   rã	  c                  óP   € ] tR tRtRtR tR tR tR tR t	R t
R tR	 tR
 tRtR# )r¤   i•  c                	ón   € Wn         W n        W@n        \        V4      V n        W0n        WPn        W`n        R # r0   )r¨   rÓ  Ú_bodyrå   Úsizerí  rà  Úsubpart)rF   r¨   rÓ  rí  rž   rà  rì	  s   &&&&&&&r4   r‚   ÚFakeyMessage.__init__™  s+   € ØŒØŒ
ØŒ
Ü˜“IˆŒ	ØŒ	ØŒØŽr7   c                	ó*   € W3V n         V P                  # r0   )Úgot_headersr¨   )rF   r  rã  s   &&*r4   Ú
getHeadersÚFakeyMessage.getHeaders¢  s   € Ø!˜=ˆÔØ�|‰|Ðr7   c                	ó   € V P                   # r0   rÁ  rV   s   &r4   rÂ  ÚFakeyMessage.getFlags¦  rÄ  r7   c                	ó   € V P                   # r0   )rí  rV   s   &r4   ÚgetInternalDateÚFakeyMessage.getInternalDate©  ó   € Ø�y‰yÐr7   c                	ó,   € \        V P                  4      # r0   )r   rê	  rV   s   &r4   ÚgetBodyFileÚFakeyMessage.getBodyFile¬  s   € Ü�t—z‘zÓ"Ð"r7   c                	ó   € V P                   # r0   )rë	  rV   s   &r4   ÚgetSizeÚFakeyMessage.getSize¯  r÷	  r7   c                	ó   € V P                   # r0   rV  rV   s   &r4   rá  ÚFakeyMessage.getUID²  s   € Ø�x‰xˆr7   c                	ó   € V P                   R J# r0   )rì	  rV   s   &r4   ÚisMultipartÚFakeyMessage.isMultipartµ  s   € Ø�|‰| 4Ð'Ð'r7   c                	ó4   € Wn         V P                  V,          # r0   )Úgot_subpartrì	  )rF   r  s   &&r4   Ú
getSubPartÚFakeyMessage.getSubPart¸  s   € ØÔØ�|‰|˜DÕ!Ð!r7   )	rê	  rí  rÓ  rï	  r
  r¨   rë	  rì	  rà  N)r¨   rÓ  rí  rê	  rà  )ry   rz   r{   r|   ÚshowAttributesr‚   rð	  rÂ  rõ	  rù	  rü	  rá  r
  r
  r}   r1   r7   r4   r¤   r¤   •  s4   † àA€Nòòòòò#òòò(ö"r7   r¤   c                  óF   € ] tR tRtRtRtR tR tR tR t	R t
R
R ltR	tR# )ÚNewStoreTestsi½  Nc                	ó   € R ;V n         V n        \        P                  ! 4       V n        RV P                  n        W P                  n        \        P                  ! 4       V n	        \        V P                  4      V n        R # ©Nr=  )Úreceived_messagesÚreceived_uidr   rI  r  rì  r³  r   r   r�  r[  r€  rV   s   &r4   rƒ  ÚNewStoreTests.setUpÁ  sV   € Ø59Ð9ˆÔ Ô!2ä×'Ò'Ó)ˆŒØ$ˆ�‰ÔØ�‰ÔÜŸšÓ)ˆŒÜ" 4§>¡>Ó2ˆŽr7   c                	ó   € R # r0   r1   ©rF   r‰  s   &&r4   r»  ÚNewStoreTests.addListenerÊ  rÛ  r7   c                	ó   € R # r0   r1   r
  s   &&r4   r½  ÚNewStoreTests.removeListenerÍ  rÛ  r7   c                	ó*   € W3V n         V P                  # r0   )Ú	storeArgsr  )rF   rP  rQ  s   &*,r4   r	  ÚNewStoreTests.storeÐ  s   € Ø˜ˆŒØ�}‰}Ðr7   c                	ór  a € V 3R  lpV 3R lpS P                   P                  \        V4      4      P                  V4      P                  S P                  4      P	                  S P
                  4       V 3R lp\        P                  ! S P                  S P                  RR7      pVP                  V4       V# )c                 ó|   <€ S P                  S P                  S P                  S P                  S P                  4      # r0   )Úfunctionrk  rÓ  Úsilentrà  rV   s   €r4   r�  Ú+NewStoreTests._storeWork.<locals>.connectedÕ  s(   ø€ Ø—=‘= §¡°·
±
¸D¿K¹KÈÏÉÓRÐRr7   c                ó   <€ V Sn         R # r0   ©r2   ©ÚRrF   s   &€r4   r2   Ú(NewStoreTests._storeWork.<locals>.resultØ  ó
   ø€ ØˆDŽKr7   c                ó    <€ SP                  SP                  SP                  4       SP                  SP                  SP                  4       R # r0   )rC   r2   r—  r
  ÚexpectedArgs©rî  rF   s   &€r4   rÂ  Ú'NewStoreTests._storeWork.<locals>.checkß  s5   ø€ Ø×Ñ˜TŸ[™[¨$¯-©-Ô8Ø×Ñ˜TŸ^™^¨T×->Ñ->Ö?r7   F©Únoisy©
r�  r§   r8   rŠ  r²  r�  r#   ÚloopbackTCPr  r€  )rF   r�  r2   rÂ  rª   s   f    r4   Ú
_storeWorkÚNewStoreTests._storeWorkÔ  s‰   ø€ õ	Sõ	ð 	�‰×"Ñ"¤5¨Ó#3Ó4×@Ñ@ÀÓH×TÑTØ×Ñó	
ç
‰*�T—_‘_Ô
%õ	@ô × Ò  §¡¨d¯k©kÀÔGˆØ	�‰�eÔØˆr7   c                	óš  € V P                   P                  V n        R V n        . ROV n        RV n        Wn        ^. RO^. RO^	. RO/V n        ^R. RO/^R. RO/^	R. RO//V n        \        P                  ! 4       pVP                  ^4       VP                  ^4       VP                  ^	4       V. RO^ 3R^ /3V n        V P                  4       # )z1,5,9FrÑ  rà  )z\Az\BÚC)r€  rž	  r
  rk  rÓ  r
  rà  r  r—  r   r   rç   r#
  r*
  )rF   rà  r©   s   && r4   ÚtestSetFlagsÚNewStoreTests.testSetFlagsç  sË   € ØŸ™×,Ñ,ˆŒØˆŒÚ(ˆŒ
ØˆŒØŒàÒ"ØÒ"ØÒ"ð
ˆŒð �Ò,Ð-Ø�Ò,Ð-Ø�Ò,Ð-ð
ˆŒô
 ×ÒÓ ˆØ�‰�Œ
Ø�‰�Œ
Ø�‰�Œ
Ø!Ò#6¸Ð:¸UÀA¸JÐGˆÔØ�‰Ó Ð r7   )r€  r�  r—  r#
  rÓ  r
  rk  r
  r
  r  r2   r  r
  r
  rà  rû  )ry   rz   r{   r|   r2   r
  rƒ  r»  r½  r	  r*
  r.
  r}   r1   r7   r4   r	
  r	
  ½  s/   † Ø€FØ€Iò3òòòò÷&!ð !r7   r	
  c                  óP   € ] tR tRtRtR tR tR tR tR t	R t
R	 tR
 tR tRtR# )ÚGetBodyStructureTestsiÿ  z­
Tests for L{imap4.getBodyStructure}, a helper for constructing a list which
directly corresponds to the wire information needed for a I{BODY} or
I{BODYSTRUCTURE} response.
c                ó  € RpRpRpRpRpRpRp\        RVR	,           V,           R
,           V,           R,           RVRVRV/RRV^{R4      p\        P                  ! V4      p	V P                  VVRVRR.VVV\	        V4      .V	4       R# )z”
L{imap4.getBodyStructure} accepts a L{IMessagePart} provider and returns
a list giving the basic fields for the I{BODY} response for that
message.
ó   hello, worldÚimageÚjpegúus-asciiúsome kind of idúgreat justiceÚmaximumrš   rt  ú
; charset=ú; x=yú
content-idúcontent-descriptionúcontent-transfer-encodingr7   NÚcharsetr‰  Úyr1   ©r¤   r   ÚgetBodyStructurerC   rå   ©
rF   rž   ÚmajorÚminorr?
  rª  ÚdescriptionrÆ  r©   Ú	structures
   &         r4   Útest_singlePartÚ%GetBodyStructureTests.test_singlePart  s¿   € ð ˆØˆØˆØˆØ&ˆ
Ø%ˆØˆÜà ¨¥¨eÕ 3°lÕ BÀWÕ LÈwÕ VØ˜jØ% {Ø+¨Xð	ð ØØØØó
ˆô ×*Ò*¨3Ó/ˆ	Ø×ÑàØØ˜G S¨#Ð.ØØØÜ�D“	ðð ö	
r7   c                ó  € \        / RRR^{R4      p\        P                  ! V4      pVR,          w  r4V P                  RV4       V P                  RV4       \        RR/RRR^{R4      p\        P                  ! V4      pVR,          w  rxV P                  RV4       V P                  RV4       \        RR/RRR^{R4      p	\        P                  ! V	4      p
V
R,          w  r¼V P                  RV4       V P                  RV4       R# )z±
L{imap4.getBodyStructure} returns L{None} for the major and
minor MIME types of a L{IMessagePart} provider whose headers
lack a C{Content-Type}, or have an empty value for it.
r7   NºNrß   Nrš   rw  Ú
r1   )r¤   r   rB
  ÚassertIs)rF   ÚmissingÚmissingContentTypeStructureÚmissingMajorÚmissingMinorr   ÚemptyContentTypeStructureÚ
emptyMajorÚ
emptyMinorÚnewlineÚnewlineContentTypeStructureÚnewlineMajorÚnewlineMinors   &            r4   Útest_emptyContentTypeÚ+GetBodyStructureTests.test_emptyContentType.  sø   € ô ˜r 2 s¨C°°dÓ;ˆÜ&+×&<Ò&<¸WÓ&EÐ#Ø%@ÀÕ%DÑ"ˆØ�‰�d˜LÔ)Ø�‰�d˜LÔ)ä˜n¨bÐ1°2°s¸CÀÀdÓKˆÜ$)×$:Ò$:¸5Ó$AÐ!Ø!:¸2Õ!>Ñˆ
Ø�‰�d˜JÔ'Ø�‰�d˜JÔ'ä °Ð5°r¸3ÀÀSÈ$ÓOˆÜ&+×&<Ò&<¸WÓ&EÐ#Ø%@ÀÕ%DÑ"ˆØ�‰�d˜LÔ)Ø�‰�d˜LÖ)r7   c                ó´   € \        RR/RRR^{R4      p\        P                  ! V4      pVR,          w  r4V P                  VR4       V P	                  VR4       R# )z—
L{imap4.getBodyStructure} returns only a non-L{None} major
MIME type for a L{IMessagePart} provider whose headers only
have a main a C{Content-Type}.
rš   Úmainr7   NrK
  r1   )r¤   r   rB
  rC   rM
  )rF   r\
  ÚmainStructureÚ	mainMajorÚ	mainMinors   &    r4   Útest_onlyMajorContentTypeÚ/GetBodyStructureTests.test_onlyMajorContentTypeF  sX   € ô ˜^¨VÐ4°b¸#¸sÀCÈÓNˆÜ×.Ò.¨tÓ4ˆØ,¨RÕ0Ñˆ	Ø×Ñ˜ FÔ+Ø�‰�i Ö&r7   c                ó8  € RpRpRpRpRpRpRpRp\        R	VR
,           V,           R,           V,           R,           RVRVRVRVRRRRRR/RRV^{R4      p	\        P                  ! V	RR7      p
V P                  VVRVRR.VVV\	        V4      VR. R O.RR.V
4       R# )!z 
L{imap4.getBodyStructure} returns a list giving the basic and extended
fields for a I{BODYSTRUCTURE} response if passed C{True} for the
C{extended} parameter.
r3
  r4
  r5
  r6
  r7
  r8
  r9
  Úabcdefabcdefrš   rt  r:
  r;
  r<
  r=
  r>
  úcontent-md5úcontent-dispositionzattachment; name=foo; size=barúcontent-languageÚfrúcontent-locationÚFrancerw  NT©Úextendedr?
  r‰  r@
  Ú
attachmentr1   )r7  rw  rë	  rx  rA
  )rF   rž   rD
  rE
  r?
  rª  rF
  rÆ  Úmd5r©   rG
  s   &          r4   Útest_singlePartExtendedÚ-GetBodyStructureTests.test_singlePartExtendedR  sí   € ð ˆØˆØˆØˆØ&ˆ
Ø%ˆØˆØˆÜà ¨¥¨eÕ 3°lÕ BÀWÕ LÈwÕ VØ˜jØ% {Ø+¨XØ˜sØ%Ð'GØ" DØ" Hð	ð ØØØØó
ˆô" ×*Ò*¨3¸Ô>ˆ	Ø×ÑàØØ˜G S¨#Ð.ØØØÜ�D“	ØØÒ=Ð>ØØðð ö	
r7   c                óÌ   € RpRpRp\        RVR,           V,           /R
RV^{R4      p\        P                  ! VRR	7      pV P                  WRRRR\	        V4      RRRR.V4       R# )zƒ
For fields with no information contained in the message headers,
L{imap4.getBodyStructure} fills in L{None} values in its result.
r4
  r5
  r3
  rš   rt  r7   NTrj
  r1   rA
  )rF   rD
  rE
  rž   r©   rG
  s   &     r4   Útest_singlePartWithMissingÚ0GetBodyStructureTests.test_singlePartWithMissingƒ  sz   € ð
 ˆØˆØˆÜØ˜U S�[¨5Õ0Ð1°2°s¸DÀ#Àtó
ˆô ×*Ò*¨3¸Ô>ˆ	Ø×ÑØ˜4  t¨T´3°t³9¸dÀDÈ$ÐPTÐUØö	
r7   c                ó@  € RpRpRpRpRpRpRp\        RVR	,           V,           R
,           V,           R,           RVRVRV/RRV^{R4      p\        P                  ! V4      p	V P                  VVRVRR.VVV\	        V4      \	        VP                  4       4      .V	4       R# )zz
For a I{text/*} message, the number of lines in the message body are
included after the common single-part basic fields.
ó"   hello, world
how are you?
goodbye
rG   r5
  r6
  r7
  r8
  r9
  rš   rt  r:
  r;
  r<
  r=
  r>
  r7   Nr?
  r‰  r@
  r1   )r¤   r   rB
  rC   rå   r–  rC
  s
   &         r4   Útest_textPartÚ#GetBodyStructureTests.test_textPart”  sÎ   € ð
 8ˆØˆØˆØˆØ&ˆ
Ø%ˆØˆÜà ¨¥¨eÕ 3°lÕ BÀWÕ LÈwÕ VØ˜jØ% {Ø+¨Xð	ð ØØØØó
ˆô ×*Ò*¨3Ó/ˆ	Ø×ÑàØØ˜G S¨#Ð.ØØØÜ�D“	Ü�D—O‘OÓ%Ó&ð	ð ö	
r7   c                óz  € RpRpRpRpRpRpRp\        RVR	,           V,           R
,           V,           R,           RRRRRVRVRV/RRV^{R4      p\        RR/RRR^{V.4      p	\        P                  ! V	4      p
V P                  RRRRRR^ \        P                  ! V4      \        P                  ! V4      ^.
V
4       R# )zs
For a I{message/rfc822} message, the common basic fields are followed
by information about the contained message.
rt
  rG   r5
  r6
  r7
  r8
  r9
  rš   rt  r:
  r;
  r”   zAlice <alice@example.com>r–   zBob <bob@example.com>r<
  r=
  r>
  rw  Númessage/rfc822r7   rì  rÞ  r1   )r¤   r   rB
  rC   ÚgetEnvelope)rF   rž   rD
  rE
  r?
  rª  rF
  rÆ  r©   Ú	containerrG
  s   &          r4   Útest_rfc822MessageÚ(GetBodyStructureTests.test_rfc822Message¼  s  € ð
 8ˆØˆØˆØˆØ&ˆ
Ø%ˆØˆÜà ¨¥¨eÕ 3°lÕ BÀWÕ LÈwÕ VØÐ3ØÐ-Ø˜jØ% {Ø+¨Xðð ØØØØó
ˆô  !àÐ 0ðð ØØØØˆEó	
ˆ	ô ×*Ò*¨9Ó5ˆ	Ø×ÑàØØØØØØÜ×!Ò! #Ó&Ü×&Ò& sÓ+Øðð ö	
r7   c           
     ó"  € \        RRRRRRRR/RR	R
^{R4      p\        RR/RR	RRR4      p\        RR/RR	R	RW.4      pV P                  \        P                  ! V4      \        P                  ! V4      R.\        P                  ! V4      4       R# )zÎ
For a I{multipart/*} message, L{imap4.getBodyStructure} returns a list
containing the body structure information for each part of the message
followed by an element giving the MIME subtype of the message.
rš   zimage/jpeg; x=yr<
  r7
  r=
  r8
  r>
  r9
  r7   ó   hello worldNztext/plain; charset=us-asciió
   some stufféA  zmultipart/relatedé+  Úrelatedr1   ©r¤   rC   r   rB
  ©rF   Ú
oneSubPartÚanotherSubPartrz
  s   &   r4   Útest_multiPartÚ$GetBodyStructureTests.test_multiPartô  sÑ   € ô "àÐ 1ØÐ/Ø% Ø+¨Yð	ð ØØØØó
ˆ
ô &àÐ >ðð ØØØØó	
ˆô !àÐ 3ðð ØØØØÐ(ó	
ˆ	ð 	×Ñä×&Ò& zÓ2Ü×&Ò& ~Ó6Øðô
 ×"Ò" 9Ó-ö	
r7   c           
     óN  € \        RRRRRRRR/R R	R
^{R4      p\        RR/R R	RRR4      p\        RRRRRRRR/R R	R	RW.4      pV P                  \        P                  ! VRR7      \        P                  ! VRR7      RRR.RRR..RR.\        P                  ! VRR7      4       R# )!a  
When passed a I{multipart/*} message and C{True} for the C{extended}
argument, L{imap4.getBodyStructure} includes extended structure
information from the parts of the multipart message and extended
structure information about the multipart message itself.
s   content-types   image/jpeg; x=ys
   content-ids   some kind of ids   content-descriptions   great justices   content-transfer-encodings   maximumr7   r~
  Ns   text/plain; charset=us-asciir
  r€
  rš   zmultipart/related; foo=barrf
  Úesrh
  ÚSpainre
  zattachment; name=monkeysr�
  Trj
  r‚
  rw  rx  rl
  r7  Úmonkeysr1   rƒ
  r„
  s   &   r4   Útest_multiPartExtendedÚ,GetBodyStructureTests.test_multiPartExtended'  s  € ô "àÐ!3ØÐ1Ø&Ð(8Ø,¨jð	ð ØØØØó
ˆ
ô &àÐ!@ðð ØØØØó	
ˆô !àÐ <Ø" DØ" GØ%Ð'Að	ð ØØØØÐ(ó
ˆ	ð 	×Ñä×&Ò& z¸DÔAÜ×&Ò& ~ÀÔEØØ˜�Ø ¨	Ð2Ð3ØØðô ×"Ò" 9°tÔ<ö	
r7   r1   N)ry   rz   r{   r|   r[  rH
  rY
  r`
  rn
  rq
  ru
  r{
  r‡
  r�
  r}   r1   r7   r4   r1
  r1
  ÿ  s9   † ñò&
òP*ò0
'ò/
òb
ò"&
òP6
òp1
öf9
r7   r1
  c                  ó:  € ] tR tRtR tR tR tR tR tR t	R/R lt
R	 tR/R
 ltR t]P                  ! ]P                   R4      t ]P                  ! ]P                   R4       ]P                  ! ]P                   ]4       Rt]! ]R4      R 4       tR/R ltR tR/R ltR tR/R ltR/R ltR tR/R ltR tR/R ltR t R t!R/R lt"R t#R/R  lt$R! t%R/R" lt&R# t'R$ t(R% t)R/R& lt*R' t+R/R( lt,R) t-R/R* lt.R+ t/R/R, lt0R- t1R.t2R#   ]P&                   d    Rt L–i ; i)0ÚNewFetchTestsic  c                	ó  € R ;V n         V n        R V n        \        P                  ! 4       V n        RV P
                  n        W P
                  n        \        P                  ! 4       V n
        \        V P                  4      V n        R # r
  )r
  r
  r2   r   rI  r  rì  r³  r   r   r�  r[  r€  rV   s   &r4   rƒ  ÚNewFetchTests.setUpd  s]   € Ø59Ð9ˆÔ Ô!2ØˆŒä×'Ò'Ó)ˆŒØ$ˆ�‰ÔØ�‰ÔÜŸšÓ)ˆŒÜ" 4§>¡>Ó2ˆŽr7   c                	ó   € R # r0   r1   r
  s   &&r4   r»  ÚNewFetchTests.addListenern  rÛ  r7   c                	ó   € R # r0   r1   r
  s   &&r4   r½  ÚNewFetchTests.removeListenerq  rÛ  r7   c           	     	ó�   € Wn         W n        \        \        \	        \        V P                  4      4      V P                  4      4      # r0   )r
  r
  Úiterrü   rs   rå   ÚmsgObjsrÿ  s   &&&r4   r   ÚNewFetchTests.fetcht  s2   € Ø!)ÔØÔÜ”Cœœc $§,¡,Ó/Ó0°$·,±,Ó?Ó@Ð@r7   c                	ó<  a a€ S'       di   \        \        \        S P                  4      4      S P                  4       F2  w  r#\	        VP                  4       4      S P                  V,          R &   K4  	  V 3R lpS P                  P                  V V3R l4      P                  V4      P                  S P                  4      P                  S P                  4       \        P                  ! S P                  S P                  RR7      pVP                  V 3R l4       V# )rß  c                ó   <€ V Sn         R # r0   r
  r
  s   &€r4   r2   Ú(NewFetchTests._fetchWork.<locals>.result~  r!
  r7   c                ó<   <€ SP                  SP                  S4      # r0   ©r
  rk  )r°  rF   rà  s   &€€r4   r5   Ú*NewFetchTests._fetchWork.<locals>.<lambda>‚  s   ø€ �d—m‘m D§M¡M°3Ô7r7   Fr&
  c                óP   <€ SP                  SP                  SP                  4      # r0   ©rC   r2   r—  )r‰  rF   s   &€r4   r5   r 
  ˆ  s   ø€  × 0Ñ 0°·±¸d¿m¹mÔ Lr7   )rü   rs   rå   r™
  rý   rá  r—  r�  r§   rŠ  r²  r�  r#   r)
  r  r€  )rF   rà  r  r©   r2   rª   s   ff    r4   Ú
_fetchWorkÚNewFetchTests._fetchWorky  s¿   ù€ ßÜœe¤C¨¯©Ó$5Ó6¸¿¹ÖE‘�Ü*-¨c¯j©j«lÓ*;�—‘˜aÕ  Ó'ñ Fõ	ð 	�‰×"Ñ"Ý7ó	
ç
‰+�fÓ
Ÿk™k¨$×*<Ñ*<Ó=¿j¹jØ�O‰Oô?
ô × Ò  §¡¨d¯k©kÀÔGˆØ	�‰ÔLÔMØˆr7   c           
     	óØ   a € V 3R  lS n         RS n        \        / RRRRR4      \        / RRRRR4      \        / RRRRR4      .S n        ^ RR/^RR	/^RR
//S n        S P                  ^ 4      # )c                ó:   <€ SP                   P                  V 4      # r0   ©r€  r<	  )r  ÚurF   s   &&€r4   r5   Ú,NewFetchTests.testFetchUID.<locals>.<lambda>Œ  s   ø€  T§[¡[×%9Ñ%9¸!Ô%<r7   rL	  r7   r†  Néç  éu'  rß  Ú12345Ú999Ú10101r1   )r
  rk  r¤   r™
  r—  r£
  rV   s   fr4   ÚtestFetchUIDÚNewFetchTests.testFetchUID‹  s‰   ø€ Ü<ˆŒàˆŒä˜˜R  c¨5°$Ó7Ü˜˜R  c¨3°Ó5Ü˜˜R  c¨5°$Ó7ð
ˆŒð ��wÐØ��uˆ~Ø��wÐð
ˆŒð
 �‰˜qÓ!Ð!r7   c           	     	óà   € V P                   P                  V n        R V n        \	        / . RORRRR4      \	        / . RORRRR4      .V n        ^ R. RO/^R. RO//V n        V P                  V4      # )ro	  r7   é1Ô  Nr†  rÑ  )ÚFlagAÚFlagBú\FlagC)rµ
  r³
  r´
  )r€  Ú
fetchFlagsr
  rk  r¤   r™
  r—  r£
  ©rF   rà  s   &&r4   ÚtestFetchFlagsÚNewFetchTests.testFetchFlags›  s{   € ØŸ™×.Ñ.ˆŒØˆŒä˜Ò:¸CÀÀeÈTÓRÜ˜Ò:¸CÀÀeÈTÓRð
ˆŒð
 �Ò6Ð7Ø�Ò6Ð7ð
ˆŒð �‰˜sÓ#Ð#r7   c                	ó$   € V P                  ^4      # rÉ  )r¸
  rV   s   &r4   ÚtestFetchFlagsUIDÚNewFetchTests.testFetchFlagsUID¨  s   € Ø×"Ñ" 1Ó%Ð%r7   c                	ó  € V P                   P                  V n        R V n        \	        / RRRRR4      \	        / RRR^eR4      \	        / RRR^ÊR4      \	        / RRRRR4      .V n        ^ R	R
/^R	R/^R	R/^R	R//V n        V P                  V4      # )Ú13s   Fri, 02 Nov 2003 21:25:10 GMTr7   iÀZ  Ns   Thu, 29 Dec 2013 11:31:52 ESTs   Mon, 10 Mar 1992 02:44:30 CSTs   Sat, 11 Jan 2000 14:40:24 PSTi/  rÔ  z02-Nov-2003 21:25:10 +0000z29-Dec-2013 11:31:52 -0500z10-Mar-1992 02:44:30 -0600z11-Jan-2000 14:40:24 -0800r1   )r€  ÚfetchInternalDater
  rk  r¤   r™
  r—  r£
  r·
  s   &&r4   ÚtestFetchInternalDateÚ#NewFetchTests.testFetchInternalDate«  s·   € ØŸ™×5Ñ5ˆŒØˆŒä˜˜RÐ!AÀ3ÈÈtÓTÜ˜˜RÐ!AÀ3ÈÈTÓRÜ˜˜RÐ!AÀ3ÈÈTÓRÜ˜˜RÐ!AÀ3ÈÈTÓRð	
ˆŒð �Ð <Ð=Ø�Ð <Ð=Ø�Ð <Ð=Ø�Ð <Ð=ð	
ˆŒð �‰˜sÓ#Ð#r7   c                	ó$   € V P                  ^4      # rÉ  )rÀ
  rV   s   &r4   ÚtestFetchInternalDateUIDÚ&NewFetchTests.testFetchInternalDateUID¼  s   € Ø×)Ñ)¨!Ó,Ð,r7   Nú
es_AR.UTF8FTz'The es_AR.UTF8 locale is not installed.c                ó  € \         P                  ! \         P                  R4      p\         P                  ! \         P                  R4       V P                  \         P                  \         P                  V4       V P	                  ^4      # )z3
The month name in the date is locale independent.
NrÅ
  )ÚlocaleÚ	setlocaleÚLC_ALLr!  rÀ
  )rF   ÚcurrentLocales   & r4   Ú'test_fetchInternalDateLocaleIndependentÚ5NewFetchTests.test_fetchInternalDateLocaleIndependentÍ  sY   € ô ×(Ò(¬¯©¸Ó=ˆÜ×ÒœŸ™¨Ô5Ø�‰œ×(Ñ(¬&¯-©-¸ÔGØ×)Ñ)¨!Ó,Ð,r7   c                	óê   € V P                   P                  V n        R V n        \	        RRRRRRRRR	R
/RRRRR4      .V n        ^ RRR. RO.. RO.. RO.. RO.RRRR
.
//V n        V P                  V4      # )Ú15r”   zuser@domainr–   zresu@domainrí  Úthursdayr˜   zit is a messagez
message-idzid-id-id-yayayar7   ix  NrÍ  r1   )NNr  Údomain)NNÚresurÐ
  )r€  ÚfetchEnveloper
  rk  r¤   r™
  r—  r£
  r·
  s   &&r4   ÚtestFetchEnvelopeÚNewFetchTests.testFetchEnvelopeØ  s²   € ØŸ™×1Ñ1ˆŒØˆŒäà˜MØ˜-Ø˜JØÐ0Ø Ð"3ðð ØØØØóð
ˆŒð" ØØØ%Ú3Ð4Ú3Ð4Ú3Ð4Ú3Ð4ØØØØ%ððð
ˆŒð  �‰˜sÓ#Ð#r7   c                	ó$   € V P                  ^4      # rÉ  )rÓ
  rV   s   &r4   ÚtestFetchEnvelopeUIDÚ"NewFetchTests.testFetchEnvelopeUIDý  s   € Ø×%Ñ% aÓ(Ð(r7   c                óî   € V P                   P                  V n        RV n        \	        RRRRRRRR	R
RRRRRRR/RRRRR4      .V n        ^ RRR. RORRR	RRRRRR..RR.//V n        V P                  V4      # ) a+  
L{IMAP4Client.fetchBodyStructure} issues a I{FETCH BODYSTRUCTURE}
command and returns a Deferred which fires with a structure giving the
result of parsing the server's response.  The structure is a list
reflecting the parenthesized data sent by the server, as described by
RFC 3501, section 7.4.2.
ú3:9,10:*rš   ú#text/plain; name=thing; key="value"r<
  úthis-is-the-content-idr=
  ú!describing-the-content-goes-here!r>
  Ú8BITrd
  Úabcdef123456re
  zattachment; filename=monkeysrf
  rŠ
  rh
  zhttp://example.com/monkeysrw  ó   Body
Text
Goes
Here
éý Nrá  rG   ÚplainÚ20rd	  rl
  ÚfilenamerŒ
  r1   ©r  r—  r7  Úthing©r€  ÚfetchBodyStructurer
  rk  r¤   r™
  r—  r£
  r·
  s   &&r4   Útest_fetchBodyStructureÚ%NewFetchTests.test_fetchBodyStructure   sÊ   € ð Ÿ™×6Ñ6ˆŒØ"ˆŒäà"Ð$IØ Ð":Ø)Ð+NØ/°Ø! >Ø)Ð+IØ&¨Ø&Ð(Dð	ð ØØ+ØØóð
ˆŒð( ØØØÚ5Ø,Ø7ØØØØ"Ø! J°	Ð#:Ð;ØØ0ð"ðð
ˆŒð$ �‰˜sÓ#Ð#r7   c                ó$   € V P                  ^4      # )zw
If passed C{True} for the C{uid} argument, C{fetchBodyStructure} can
also issue a I{UID FETCH BODYSTRUCTURE} command.
)rè
  rV   s   &r4   ÚtestFetchBodyStructureUIDÚ'NewFetchTests.testFetchBodyStructureUID1  s   € ð
 ×+Ñ+¨AÓ.Ð.r7   c                ó(  € V P                   P                  V n        RV n        \	        RRRRRRRR	R
RRRRRRR/R!RRRR4      p\	        RRR
RRR/R!RRRV.4      .V n        ^ RRR. R"ORRR	RRRRR.RR.RRR .RRR.//V n        V P                  V4      # )#z|
L{IMAP4Client.fetchBodyStructure} can also parse the response to a
I{FETCH BODYSTRUCTURE} command for a multipart message.
rÙ
  rš   rÚ
  r<
  rÛ
  r=
  rÜ
  r>
  rÝ
  rf
  rg
  rd
  Ú123456abcdefre
  Úinlinerh
  zouter spacer7   rß
  rà
  Nzmultipart/mixed; boundary="xyz"ÚenÚnearbyrá  rG   rá
  râ
  rd	  ÚmixedÚboundaryÚxyzr1   rä
  ræ
  )rF   rà  ÚinnerMessages   && r4   Ú test_fetchBodyStructureMultipartÚ.NewFetchTests.test_fetchBodyStructureMultipart8  s  € ð
 Ÿ™×6Ñ6ˆŒØ"ˆŒÜ#àÐ EØÐ6Ø%Ð'JØ+¨VØ" DØ˜~Ø% xØ" Mð	ð ØØ'ØØó
ˆô$ à"Ð$EØ&¨Ø&¨ðð
 ØØØØ�óð
ˆŒð ØàØÚ9Ø0Ø;ØØØØ&Ø! 4Ð(ØØ%ðð Ø Ð'ØØØð'"ðð
ˆŒð2 �‰˜sÓ#Ð#r7   c                	óÐ   € V P                   P                  V n        R V n        \	        / R	RRR\	        RR/R	RRRR4      .4      .V n        ^ R. R
O//V n        V P                  V4      # )Ú21r7   ó   Yea whateveré±f rš   ú	image/jpgó   Body Body BodyNrù  r1   ©NNNNNNÚ12©r€  ÚfetchSimplifiedBodyr
  rk  r¤   r™
  r—  r£
  r·
  s   &&r4   ÚtestFetchSimplifiedBodyÚ%NewFetchTests.testFetchSimplifiedBodyy  s�   € ØŸ™×7Ñ7ˆŒØˆŒäØØØØØä Ø'¨Ð5ØØØ)ØØóð	óð
ˆŒð& ˜VÒ%OÐPÐQˆŒà�‰˜sÓ#Ð#r7   c                	ó$   € V P                  ^4      # rÉ  )r  rV   s   &r4   ÚtestFetchSimplifiedBodyUIDÚ(NewFetchTests.testFetchSimplifiedBodyUID“  s   € Ø×+Ñ+¨AÓ.Ð.r7   c                	ó²   € V P                   P                  V n        R V n        \	        RR/RRRRR4      .V n        ^ R. R	O//V n        V P                  V4      # )
rù
  rš   r™   r7   rú
  rû
  Nrù  r1   )rG   rá
  NNNNrÿ
  r
  r   r·
  s   &&r4   ÚtestFetchSimplifiedBodyTextÚ)NewFetchTests.testFetchSimplifiedBodyText–  se   € ØŸ™×7Ñ7ˆŒØˆŒäØ Ð.°°C¸È%ÐQUóð
ˆŒð �ÒLÐMð
ˆŒð �‰˜sÓ#Ð#r7   c                	ó$   € V P                  ^4      # rÉ  )r  rV   s   &r4   ÚtestFetchSimplifiedBodyTextUIDÚ,NewFetchTests.testFetchSimplifiedBodyTextUID¤  s   € Ø×/Ñ/°Ó2Ð2r7   c                	ó  € V P                   P                  V n        R V n        \	        RR/RRRR\	        RR/RRRR	R	4      .4      .V n        ^ R
RRR	R	R	R	RR	R	. RO.. RO.R	R	R	R	R	R	.
. ROR.
//V n        V P                  V4      # )rù
  rš   rx
  r7   rú
  rû
  rü
  rw  rý
  Nrù  rì  rÞ  rÿ
  r
  r1   ©NNN)r4
  ÚjpgNNNNÚ14r   r·
  s   &&r4   ÚtestFetchSimplifiedBodyRFC822Ú+NewFetchTests.testFetchSimplifiedBodyRFC822§  s×   € ØŸ™×7Ñ7ˆŒØˆŒäØÐ!1Ð2ØØØØä Ø'¨Ð5ØØØ)ØØóð	óð
ˆŒð( ØØØØØØØØàØÚ+Ð,Ú+Ð,ØØØØØØðò CØð+ðð
ˆŒð8 �‰˜sÓ#Ð#r7   c                	ó$   € V P                  ^4      # rÉ  )r  rV   s   &r4   Ú testFetchSimplifiedBodyRFC822UIDÚ.NewFetchTests.testFetchSimplifiedBodyRFC822UIDÛ  s   € Ø×1Ñ1°!Ó4Ð4r7   c           	     ó2  € V P                   P                  V n        RV n        \	        RR/RRRRR4      \	        RR/RRR	R
R4      .p\	        RR/RRRRV4      p\	        RR/RRRRV.4      pV.V n        ^ R. RO. ROR.R.//V n        V P                  R4      # )a   
L{IMAP4Client.fetchSimplifiedBody} returns a dictionary mapping message
sequence numbers to fetch responses for the corresponding messages.  In
particular, for a multipart message, the value in the dictionary maps
the string C{"BODY"} to a list giving the body structure information for
that message, in the form of a list of subpart body structure
information followed by the subtype of the message (eg C{"alternative"}
for a I{multipart/alternative} message).  This structure is self-similar
in the case where a subpart is itself multipart.
rù
  rš   r™   s   dates   Stuffr²
  NrÀ   s   ThingsiŸ~  rÉ   r7   s
   Irrelevantr†  zmultipart/mixeds   RootOfiÍ� rù  Úalternativerò
  Fr1   )rG   rá
  NNNNÚ5r
  )rG   ÚhtmlNNNNrS	  r
  r   )rF   Úsinglesr  rò
  s   &   r4   Ú!test_fetchSimplifiedBodyMultipartÚ/NewFetchTests.test_fetchSimplifiedBodyMultipartÞ  sï   € ð Ÿ™×7Ñ7ˆŒØˆŒô Ø Ð.°°G¸XÀuÈdóô Ø Ð-¨r°7¸IÀuÈdóð	
ˆô #ØÐ4Ð5ØØØØØó
ˆô àÐ.Ð/ØØØØØˆMó
ˆð �wˆŒð ØâKÚJØ%ðð
 ðð	ð
ˆŒð �‰˜uÓ%Ð%r7   c                	ó®   € V P                   P                  V n        R V n        \	        RR/RRR^[R4      .V n        ^ RR//V n        V P                  V4      # )	z1,3,7,10101r  ÚValuer7   s   BODY TEXT
NrÝ  zHeader: Value

BODY TEXT
r1   )r€  r\  r
  rk  r¤   r™
  r—  r£
  r·
  s   &&r4   ÚtestFetchMessageÚNewFetchTests.testFetchMessage  s^   € ØŸ™×0Ñ0ˆŒØ%ˆŒä˜( GÐ,¨b°#Ð7GÈÈTÓRð
ˆŒð ˜XÐ'KÐLÐMˆŒØ�‰˜sÓ#Ð#r7   c                	ó$   € V P                  ^4      # rÉ  )r  rV   s   &r4   ÚtestFetchMessageUIDÚ!NewFetchTests.testFetchMessageUID'  ó   € Ø×$Ñ$ QÓ'Ð'r7   c                	óø   € V P                   P                  V n        R V n        \	        RRRR/RRR^cR4      .V n        \        \        P                  ! RRRR/4      4      p^ RV//V n	        V P                  V4      # )	z9,6,2ÚH1ÚV1ÚH2ÚV2r7   Nr×  r1   )r€  ÚfetchHeadersr
  rk  r¤   r™
  r(   r   r”  r—  r£
  )rF   rà  r¨   s   && r4   ÚtestFetchHeadersÚNewFetchTests.testFetchHeaders*  s„   € ØŸ™×0Ñ0ˆŒØˆŒä˜$  d¨DÐ1°2°s¸CÀÀTÓJð
ˆŒô œu×3Ò3°T¸4ÀÀtÐ4LÓMÓNˆð � Ð)ð
ˆŒð �‰˜sÓ#Ð#r7   c                	ó$   € V P                  ^4      # rÉ  )r+  rV   s   &r4   ÚtestFetchHeadersUIDÚ!NewFetchTests.testFetchHeadersUID8  r$  r7   c                	ó®   € V P                   P                  V n        R V n        \	        RR/RRR^«R4      .V n        ^ RR//V n        V P                  V4      # )	z1,2,3,4,5,6,7r  r  rw  s   Body goes here
NrÛ  zBody goes here
r1   )r€  rH	  r
  rk  r¤   r™
  r—  r£
  r·
  s   &&r4   ÚtestFetchBodyÚNewFetchTests.testFetchBody;  sc   € ØŸ™×-Ñ-ˆŒØ'ˆŒä˜( GÐ,¨b°"Ð6KÈSÐRVÓWð
ˆŒð �Ð3Ð4ð
ˆŒð �‰˜sÓ#Ð#r7   c                	ó$   € V P                  ^4      # rÉ  )r1  rV   s   &r4   ÚtestFetchBodyUIDÚNewFetchTests.testFetchBodyUIDF  ó   € Ø×!Ñ! !Ó$Ð$r7   c                ó   a € S P                   P                  S n        RS n        RpRpRp\	        4       pRVR&   RVR&   R	VR
&   RVR&   \	        4       pRVR
&   RVR&   \	        4       pRVR
&   RVR&   \        VRRV^{\        VRRVRR4      \        VRRVRR4      .4      .S n        ^ RR.R../S n        V 3R lpS P                  P                  V 3R l4       S P                  P                  V4       S P                  P                  S P                  4       S P                  P                  S P                  4       \        P                  ! S P                  S P                   RR7      pVP                  V 3R l4       V# )zD
Test the server's handling of requests for specific body sections.
r
  rw  r®   r¾   r“   r”   r•   r–   r—   r˜   r¯   rš   r°   r™   r¿   rÀ   Nrù  z&Contained body message text.  Squarge.c                ó   <€ V Sn         R # r0   r
  r
  s   &€r4   r2   Ú0NewFetchTests.testFetchBodyParts.<locals>.resultl  r!
  r7   c                ó>   <€ SP                  SP                  ^R7      # )rÜ   rW	  rŸ
  rÍ  s   &€r4   r5   Ú2NewFetchTests.testFetchBodyParts.<locals>.<lambda>p  s   ø€ �d—m‘m D§M¡MÀ�mÔBr7   Fr&
  c                óP   <€ SP                  SP                  SP                  4      # r0   r¢
  ©ÚignrF   s   &€r4   r5   r;  w  ó   ø€  $×"2Ñ"2°4·;±;ÀÇÁÔ"Nr7   r1   ©r€  r…  r
  rk  r   r¤   r™
  r—  r�  r§   rŠ  r²  r�  r#   r)
  r  )	rF   r¹   rÂ   rÃ   r¨   rº   rÅ   r2   rª   s	   f        r4   ÚtestFetchBodyPartsÚ NewFetchTests.testFetchBodyPartsI  s  ø€ ð Ÿ™×1Ñ1ˆŒØˆŒØˆ	Ø>ˆ
ØFˆ
Ü“-ˆØ'ˆ�‰Ø*ˆ�‰Ø.ˆ�	ÑØ"Iˆ�ÑÜ"“}ˆØ"8ˆ�YÑØ'3ˆ�^Ñ$Ü#›ˆØ#;ˆ�iÑ Ø(3ˆ�nÑ%äØØØØØä  ¨r°4¸ÀTÈ4ÓPÜ  °°D¸*ÀdÈDÓQðó
ð
ˆŒð ˜f s eÐ-UÐVÐWÐXˆŒõ	ð 	�‰×"Ñ"ÜBô	
ð 	�‰×"Ñ" 6Ô*Ø�‰×"Ñ" 4×#5Ñ#5Ô6Ø�‰×!Ñ! $§/¡/Ô2ä× Ò  §¡¨d¯k©kÀÔGˆØ	�‰ÔNÔOØˆr7   c                óv  a a€ S P                   P                  S n        RS n        ^.oRp\	        4       pRVR&   RVR&   RVR&   R	VR
&   \        VRRV^{R4      .S n        ^ RR.R../S n        V 3R lpS P                  P                  VV 3R l4       S P                  P                  V4       S P                  P                  S P                  4       S P                  P                  S P                  4       \        P                  ! S P                  S P                   RR7      pVP                  V 3R l4       V# )zÏ
Single-part messages have an implicit first part which clients
should be able to retrieve explicitly.  Test that a client
requesting part 1 of a text/plain message receives the body of the
text/plain part.
r
  s   DA bodyr“   r”   r•   r–   r—   r˜   r™   rš   Nrù  zDA bodyc                ó   <€ V Sn         R # r0   r
  r
  s   &€r4   r2   Ú>NewFetchTests.test_fetchBodyPartOfNonMultipart.<locals>.resultŽ  r!
  r7   c                ó>   <€ SP                  SP                  SR 7      # )rW	  rŸ
  )r°  ÚpartsrF   s   &€€r4   r5   Ú@NewFetchTests.test_fetchBodyPartOfNonMultipart.<locals>.<lambda>’  s   ø€ �d—m‘m D§M¡MÀ�mÔFr7   Fr&
  c                óP   <€ SP                  SP                  SP                  4      # r0   r¢
  r=  s   &€r4   r5   rH  ™  r?  r7   r1   r@  )rF   r¹   r¨   r2   rª   rG  s   f    @r4   Ú test_fetchBodyPartOfNonMultipartÚ.NewFetchTests.test_fetchBodyPartOfNonMultipartz  s  ù€ ð Ÿ™×1Ñ1ˆŒØˆŒØ�ˆØˆ	Ü“-ˆØ'ˆ�‰Ø*ˆ�‰Ø.ˆ�	ÑØ".ˆ�ÑÜ$ W¨b°$¸	À3ÈÓMÐNˆŒà˜f s e¨YÐ7Ð8Ð9ˆŒõ	ð 	�‰×"Ñ"ÝFô	
ð 	�‰×"Ñ" 6Ô*Ø�‰×"Ñ" 4×#5Ñ#5Ô6Ø�‰×!Ñ! $§/¡/Ô2ä× Ò  §¡¨d¯k©kÀÔGˆØ	�‰ÔNÔOØˆr7   c                	óª   € V P                   P                  V n        R V n        \	        / RRR^{R4      .V n        ^ RR//V n        V P                  V4      # )z	1:100,2:*r7   NrÙ  râ
  r1   s   xxxxxxxxxxxxxxxxxxxx)r€  Ú	fetchSizer
  rk  r¤   r™
  r—  r£
  r·
  s   &&r4   ÚtestFetchSizeÚNewFetchTests.testFetchSizeœ  s[   € ØŸ™×-Ñ-ˆŒØ#ˆŒä˜˜R  i°°dÓ;ð
ˆŒð �˜tÐ$ð
ˆŒð �‰˜sÓ#Ð#r7   c                	ó$   € V P                  ^4      # rÉ  )rN  rV   s   &r4   ÚtestFetchSizeUIDÚNewFetchTests.testFetchSizeUID§  r6  r7   c                	ó@  € V P                   P                  V n        R V n        \	        / RRRRR4      \	        / RRRRR4      .V n        ^ R. RORRR	R
RRR. RO.. RO.RRRRRR.
R. RO/^R. RORRR	RRRR. RO.. RO.RRRRRR.
R. RO//V n        V P                  V4      # )z1,3s%   Sun, 25 Jul 2010 06:20:30 -0400 (EDT)iŽ  Ns   Mon, 14 Apr 2003 19:43:44 -0400r�
  rÑ  rÔ  z25-Jul-2010 06:20:30 -0400rÙ  rS	  rÍ  rù  z14-Apr-2003 19:43:44 -0400rÿ
  )z\XYZz\YZXÚAbcs   xyzxyz)z\Onez\TwoÚThrees   abcabcabcabcr  )NNNNNNrS	  rþ
  )r€  Ú	fetchFullr
  rk  r¤   r™
  r—  r£
  r·
  s   &&r4   ÚtestFetchFullÚNewFetchTests.testFetchFullª  s  € ØŸ™×-Ñ-ˆŒØˆŒäØØ)Ø8ØØØóô ØØ+Ø2ØØØóð
ˆŒð& ØÒ2ØÐ <Ø˜sØØØÚ'Ð(Ú'Ð(ØØØØØØðð ÒAð!ð$ ØÒ4ØÐ <Ø˜tØØØÚ'Ð(Ú'Ð(ØØØØØØðð ÒBð!ð'%
ˆŒðL �‰˜sÓ#Ð#r7   c                	ó$   € V P                  ^4      # rÉ  )rW  rV   s   &r4   ÚtestFetchFullUIDÚNewFetchTests.testFetchFullUIDç  r6  r7   c                	ó(  € V P                   P                  V n        R V n        \	        / RRRRR4      \	        / RRRRR4      .V n        ^ RRR. RO.. RO.RRRRRR.
R	R
RRR. /^RRR. RO.. RO.RRRRRR.
R	R
RRR. //V n        V P                  V4      # )z1,2:3s   Mon, 14 Apr 2003 19:43:44 +0400s   Lalalar«
  Ns   Tue, 15 Apr 2003 19:43:44 +0200s   AlalaliêN  rÍ  rÙ  rS	  rÔ  z14-Apr-2003 19:43:44 +0400rÑ  z15-Apr-2003 19:43:44 +0200r1   r  )r€  ÚfetchAllr
  rk  r¤   r™
  r—  r£
  r·
  s   &&r4   ÚtestFetchAllÚNewFetchTests.testFetchAllê  sü   € ØŸ™×,Ñ,ˆŒØˆŒäØ�BÐ:¸IÀuÈdóô Ø�BÐ:¸IÀuÈdóð	
ˆŒð ØØØÚ'Ð(Ú'Ð(ØØØØØØðð ˜sØÐ <Ø˜ðð" ØØØÚ'Ð(Ú'Ð(ØØØØØØðð ˜sØÐ <Ø˜ðð%#
ˆŒðH �‰˜sÓ#Ð#r7   c                	ó$   € V P                  ^4      # rÉ  )r^  rV   s   &r4   ÚtestFetchAllUIDÚNewFetchTests.testFetchAllUID  s   € Ø× Ñ  Ó#Ð#r7   c                	ó´   € V P                   P                  V n        R V n        \	        / R
RR^	R4      .V n        ^ RR.RRRR	//V n        V P                  V4      # )r
  ú\Xs   19 Mar 2003 19:22:21 -0500r7   NrÑ  rÔ  z19-Mar-2003 19:22:21 -0500rÙ  Ú0)rd  )r€  Ú	fetchFastr
  rk  r¤   r™
  r—  r£
  r·
  s   &&r4   ÚtestFetchFastÚNewFetchTests.testFetchFast  sl   € ØŸ™×-Ñ-ˆŒØˆŒä˜˜XÐ'DÀcÈ1ÈdÓSð
ˆŒð Ø˜%˜ØÐ <Ø˜sðð
ˆŒð �‰˜sÓ#Ð#r7   c                	ó$   € V P                  ^4      # rÉ  )rg  rV   s   &r4   ÚtestFetchFastUIDÚNewFetchTests.testFetchFastUID-  r6  r7   )
r€  r�  r—  r
  rk  r™
  r
  r
  r2   r  rû  )3ry   rz   r{   r|   rƒ  r»  r½  r   r£
  r¯
  r¸
  r»
  rÀ
  rÃ
  rÇ
  rÈ
  rÉ
  rÊ
  ÚnoEsARLocaleÚErrorr
   rË
  rÓ
  rÖ
  rè
  rë
  rö
  r  r  r  r  r  r  r  r  r"  r+  r.  r1  r4  rA  rJ  rN  rQ  rW  rZ  r^  ra  rg  rj  r}   r1   r7   r4   r�
  r�
  c  sL  † ò3òòòAò
ò$"ô $ò&ô$ò"-ð ×$Ò$ V§]¡]°DÓ9€MðØ×Ò˜Ÿ™¨Ô5ð 	×Ò˜Ÿ™¨Ô6ØˆáˆLÐCÓDñ-ó Eð-ô#$òJ)ô/$òb/ô?$ôB$ò4/ô$ò3ô2$òh5ò>&ô@$ò(ô$ò(ô	$ò%ò/òb ôD	$ò%ô;$òz%ô/$òb$ô$ö%øðM �<‰<ô ØŠðús   ÁD ÄDÄDr�
  c                  óz   € ] tR tRtRtR tR tR tR tR t	R t
R	 tR
 tR tR tR tR tR tR tR tR tRtR# )ÚDefaultSearchTestsi1  zn
Test the behavior of the server's SEARCH implementation, particularly in
the face of unhandled search terms.
c                	óˆ  € \         P                  ! 4       V n        R V P                  n        W P                  n        \
        P                  ! 4       V n        \        V P                  4      V n	        \        / RRRRR4      \        / RRRRR4      \        / RRRRR4      \        / RRRRR4      \        / RRRRR4      .V n        R# )	r=  r7   rª
  Nr«
  r†  i!N  i"N  r1   )r   rI  r  rì  r³  r   r   r�  r[  r€  r¤   r™
  rV   s   &r4   rƒ  ÚDefaultSearchTests.setUp7  s©   € Ü×'Ò'Ó)ˆŒØ$ˆ�‰ÔØ�‰ÔÜŸšÓ)ˆŒÜ" 4§>¡>Ó2ˆŒä˜˜R  c¨3°Ó5Ü˜˜R  c¨5°$Ó7Ü˜˜R  c¨5°$Ó7Ü˜˜R  c¨5°$Ó7Ü˜˜R  c¨5°$Ó7ð
ˆŽr7   c           
     óˆ   € \        \        \        ^\        V P                  4      ^,           4      V P                  4      4      # )zG
Pretend to be a mailbox and let C{self.server} lookup messages on me.
)ræ   rü   rs   rå   r™
  rÿ  s   &&&r4   r   ÚDefaultSearchTests.fetchE  s/   € ô ”Cœ˜a¤ T§\¡\Ó!2°QÕ!6Ó7¸¿¹ÓFÓGÐGr7   c                ó  a aa€ VV 3R lpS P                   P                  \        V4      4      pVV 3R lpVP                  V4       VP                  S P                  4       VP	                  S P
                  4       S P                  4        V# )aH  
Issue a search with given query and verify that the returned messages
match the given expected messages.

@param queryTerms: A string giving the search query.
@param expectedMessages: A list of the message sequence numbers
    expected as the result of the search.
@return: A L{Deferred} which fires when the test is complete.
c                 ó:   <€ SP                   P                  S 4      # r0   ©r€  r"	  ©Ú
queryTermsrF   s   €€r4   r"	  Ú8DefaultSearchTests._messageSetSearchTest.<locals>.searchV  r×  r7   c                ó,   <€ SP                  V S4       R # r0   r¯  )rI  ÚexpectedMessagesrF   s   &€€r4   ÚsearchedÚ:DefaultSearchTests._messageSetSearchTest.<locals>.searched[  s   ø€ Ø×Ñ˜WÐ&6Ö7r7   )r�  r§   r8   rŠ  r²  r�  r#   )rF   rx  r{  r"	  rª   r|  s   fff   r4   Ú_messageSetSearchTestÚ(DefaultSearchTests._messageSetSearchTestK  se   ú€ ö	2ð �N‰N×&Ñ&¤u¨V£}Ó5ˆö	8ð 	
�‰�hÔØ	�‰�d×(Ñ(Ô)Ø	�‰�T—_‘_Ô%Ø�‰ŒØˆr7   c                ó(   € V P                  R^.4      # )zp
Test that a search which starts with a message set properly limits
the search results to messages in that set.
r
  ©r~  rV   s   &r4   Útest_searchMessageSetÚ(DefaultSearchTests.test_searchMessageSetd  s   € ð
 ×)Ñ)¨#°¨sÓ3Ð3r7   c                ó*   € V P                  R. RO4      # )z^
If the search filter ends with a star, all the message from the
starting point are returned.
z2:*©rß   rÝ   r  rà   r�  rV   s   &r4   Útest_searchMessageSetWithStarÚ0DefaultSearchTests.test_searchMessageSetWithStark  ó   € ð
 ×)Ñ)¨%²Ó>Ð>r7   c                ó*   € V P                  R. RO4      # )zs
If the search filter starts with a star, the result should be identical
with if the filter would end with a star.
z*:2r…  r�  rV   s   &r4   Ú"test_searchMessageSetWithStarFirstÚ5DefaultSearchTests.test_searchMessageSetWithStarFirstr  rˆ  r7   c                ó*   € V P                  R. RO4      # )z}
If the search filter ends with a star, all the message from the
starting point are returned (also for the SEARCH UID case).
zUID 10000:*r…  r�  rV   s   &r4   Ú test_searchMessageSetUIDWithStarÚ3DefaultSearchTests.test_searchMessageSetUIDWithStary  ó   € ð
 ×)Ñ)¨-ºÓFÐFr7   c                ó*   € V P                  R. RO4      # )z’
If the search filter starts with a star, the result should be identical
with if the filter would end with a star (also for the SEARCH UID case).
zUID *:10000r…  r�  rV   s   &r4   Ú%test_searchMessageSetUIDWithStarFirstÚ8DefaultSearchTests.test_searchMessageSetUIDWithStarFirst€  r�  r7   c                ó(   € V P                  R^.4      # )zy
A search filter of 1234:* should include the UID of the last message in
the mailbox, even if its UID is less than 1234.
zUID 30000:*r�  rV   s   &r4   Ú,test_searchMessageSetUIDWithStarAndHighStartÚ?DefaultSearchTests.test_searchMessageSetUIDWithStarAndHighStart‡  s   € ð ×)Ñ)¨-¸!¸Ó=Ð=r7   c                ó(   € V P                  R^.4      # )z
If the search filter contains nesting terms, one of which includes a
message sequence set with a wildcard, IT ALL WORKS GOOD.
z(6:*)r�  rV   s   &r4   Útest_searchMessageSetWithListÚ0DefaultSearchTests.test_searchMessageSetWithList�  s   € ð ×)Ñ)¨'°A°3Ó7Ð7r7   c                ó*   € V P                  R^^.4      # )zj
If the search filter contains an I{OR} term, all messages
which match either subexpression are returned.
zOR 1 2r�  rV   s   &r4   rÖ  Ú DefaultSearchTests.test_searchOr™  s   € ð
 ×)Ñ)¨(°Q¸°FÓ;Ð;r7   c                ó*   € V P                  R. RO4      # )z¸
If the search filter contains an I{OR} term with a
subexpression which includes a message sequence set wildcard,
all messages in that set are considered for inclusion in the
results.
z
OR 2:* 2:*r…  r�  rV   s   &r4   Útest_searchOrMessageSetÚ*DefaultSearchTests.test_searchOrMessageSet   s   € ð ×)Ñ)¨,ºÓEÐEr7   c                ó*   € V P                  R. RO4      # )zn
If the search filter contains a I{NOT} term, all messages
which do not match the subexpression are returned.
zNOT 3)rÜ   rß   r  rà   r�  rV   s   &r4   rÚ  Ú!DefaultSearchTests.test_searchNot©  s   € ð
 ×)Ñ)¨'²<Ó@Ð@r7   c                ó(   € V P                  R^.4      # )z¶
If the search filter contains a I{NOT} term with a
subexpression which includes a message sequence set wildcard,
no messages in that set are considered for inclusion in the
result.
zNOT 2:*r�  rV   s   &r4   Útest_searchNotMessageSetÚ+DefaultSearchTests.test_searchNotMessageSet°  s   € ð ×)Ñ)¨)°a°SÓ9Ð9r7   c                ó(   € V P                  R^.4      # )z©
If the search filter contains multiple terms implicitly
conjoined with a message sequence set wildcard, only the
intersection of the results of each term are returned.
z2:* 3r�  rV   s   &r4   Útest_searchAndMessageSetÚ+DefaultSearchTests.test_searchAndMessageSet¹  s   € ð ×)Ñ)¨'°A°3Ó7Ð7r7   c                ó(  a a€ RoVV 3R lpS P                   P                  \        V4      4      pS P                  V\        P
                  4      pV 3R lpVP                  V4       VP                  S P                  4       S P                  4        V# )z«
If the search criteria is not a valid key, a NO result is returned to
the client (resulting in an error callback), and an IllegalQueryError is
logged on the server side.
ÚFOOc                 ó:   <€ SP                   P                  S 4      # r0   rv  rw  s   €€r4   r"	  Ú=DefaultSearchTests.test_searchInvalidCriteria.<locals>.searchÉ  r×  r7   c                óT  <€ SP                   P                  P                  4        SP                  P                  P                  4        SP	                  \
        P                  4      pSP                  \        V4      ^4       SP                  \        R4      \        V 4      4       R# )ús
Verify that the server logs an IllegalQueryError and the
client raises an IMAP4Exception with 'Search failed:...'
s)   SEARCH failed: Invalid search command FOON©
r€  rk  rl  r  r$  r   rr  rC   rå   rý   ©rI  r¬  rF   s   & €r4   ÚerrorReceivedÚDDefaultSearchTests.test_searchInvalidCriteria.<locals>.errorReceivedÏ  s}   ø€ ð
 �K‰K×!Ñ!×0Ñ0Ô2Ø�K‰K×!Ñ!×0Ñ0Ô2ð ×+Ñ+¬E×,CÑ,CÓDˆFØ×ÑœS ›[¨!Ô,ð ×ÑÜÐ@ÓAÜ�G“ör7   ©	r�  r§   r8   rÃ  r   r–  r²  r�  r#   )rF   r"	  rª   r®  rx  s   f   @r4   Útest_searchInvalidCriteriaÚ-DefaultSearchTests.test_searchInvalidCriteriaÁ  sr   ù€ ð ˆ
ö	2ð �N‰N×&Ñ&¤u¨V£}Ó5ˆØ×Ñ˜q¤%×"6Ñ"6Ó7ˆõ	ð$ 	
�‰�mÔ$Ø	�‰�T—_‘_Ô%Ø�‰ŒØˆr7   )r€  r�  r™
  r  N)ry   rz   r{   r|   r[  rƒ  r   r~  r‚  r†  rŠ  r�  r‘  r”  r—  rÖ  rœ  rÚ  r¡  r¤  r±  r}   r1   r7   r4   ro  ro  1  s\   † ñò

òHòò24ò?ò?òGòGò>ò8ò<òFòAò:ò8ö#r7   ro  c                  óV   € ] tR tRtR tR tR t]tR tR t	R t
R tR	 tR
 tR tRtR# )ÚFetchSearchStoreTestsiç  c                	ó8  € R ;V n         V n        R V n        R V n        R V n        R V n        \        P                  ! 4       V n        RV P                  n	        W P                  n
        \        P                  ! 4       V n        \        V P                  4      V n        R # r
  )r—  r2   Úserver_received_queryÚserver_received_uidÚserver_received_partsÚserver_received_messagesr   rI  r  rì  r³  r   r   r�  r[  r€  rV   s   &r4   rƒ  ÚFetchSearchStoreTests.setUpé  st   € Ø&*Ð*ˆŒ˜œØ%)ˆÔ"Ø#'ˆÔ Ø%)ˆÔ"Ø(,ˆÔ%ä×'Ò'Ó)ˆŒØ$ˆ�‰ÔØ�‰ÔÜŸšÓ)ˆŒÜ" 4§>¡>Ó2ˆŽr7   c                	ón   € VR .8X  d   \         P                  ! R4      hWn        W n        V P                  # )rI  z"FOO is not a valid search criteria)r   rr  r¶  r·  r—  )rF   r[  rà  s   &&&r4   r"	  ÚFetchSearchStoreTests.searchö  s4   € à�V�HÔÜ×)Ò)Ð*NÓOÐOà%*Ô"Ø#&Ô Ø�}‰}Ðr7   c                	ó   € R # r0   r1   )rF   r¦  rQ  s   &*,r4   r»  Ú!FetchSearchStoreTests.addListenerÿ  rÛ  r7   c                	óv  a a€ V V3R  lpV 3R lpS P                   P                  \        V4      4      P                  V4      P                  S P                  4      P	                  S P
                  4       V 3R lp\        P                  ! S P                  S P                  RR7      pVP                  V4       V# )c                 óR   <€ S P                   P                  S P                  SR 7      # )rV  )r€  r"	  r[  r·
  s   €€r4   r"	  Ú1FetchSearchStoreTests._searchWork.<locals>.search  s!   ø€ Ø—;‘;×%Ñ% d§j¡j°cÐ%Ó:Ð:r7   c                ó   <€ V Sn         R # r0   r
  r
  s   &€r4   r2   Ú1FetchSearchStoreTests._searchWork.<locals>.result  r!
  r7   c                ó€  <€ SP                  SP                  SP                  J 4       SP                  SP                  SP                  4       SP                  SP                  SP
                  4       SP                  \        P                  ! SP                  P                  R 4      4      SP                  4       R# )ÚcharmapN)r�  r2   r—  rC   rà  r·  r   rÀ  r[  rD   r¶  r$
  s   &€r4   rÂ  Ú0FetchSearchStoreTests._searchWork.<locals>.check  s†   ø€ à×Ñ˜TŸ[™[¨D¯M©MÐ9Ô:à×Ñ˜TŸ[™[¨$¯-©-Ô8Ø×Ñ˜TŸX™X t×'?Ñ'?Ô@Ø×Ñô ×'Ò'¨¯
©
×(9Ñ(9¸)Ó(DÓEØ×*Ñ*ö	r7   Fr&
  r(
  )rF   rà  r"	  r2   rÂ  rª   s   ff    r4   Ú_searchWorkÚ!FetchSearchStoreTests._searchWork  s†   ù€ ö	;õ	ð 	�‰×"Ñ"¤5¨£=Ó1×=Ñ=¸fÓE×QÑQØ×Ñó	
ç
‰*�T—_‘_Ô
%õ	ô × Ò  §¡¨d¯k©kÀÔGˆØ	�‰�eÔØˆr7   c                	óÒ   € \         P                  ! \         P                  ! RR7      \         P                  ! RRR7      4      V n        . ROV n        ^ V n        V P                  ^ 4      # )r˜   ©rÿ  é   é   ©rT  rR  ©r˜   Ú	substring)rÜ   r  rà   râ   )r   rY  rX  r[  r—  rà  rÇ  rV   s   &r4   Ú
testSearchÚ FetchSearchStoreTests.testSearch   sN   € Ü—X’XÜ�KŠKÐ7Ô8Ü�KŠK˜t¨TÔ2ó
ˆŒ
ò %ˆŒØˆŒØ×Ñ Ó"Ð"r7   c                	óÒ   € \         P                  ! \         P                  ! RR7      \         P                  ! RRR7      4      V n        ^V n        . ROV n        V P                  ^4      # )r˜   rÊ  rË  rÌ  rÍ  rÎ  rÞ   )r   rY  rX  r[  rà  r—  rÇ  rV   s   &r4   ÚtestUIDSearchÚ#FetchSearchStoreTests.testUIDSearch)  sN   € Ü—X’XÜ�KŠKÐ7Ô8Ü�KŠK˜t¨TÔ2ó
ˆŒ
ð ˆŒÚ!ˆŒØ×Ñ Ó"Ð"r7   c                	ó´   €  V P                   V,          R ,          #   \        \        3 d    T P                   T^,
          ,          u # \         d     ^*# i ; i)rß  )r—  rî   Ú
IndexErrorÚKeyError©rF   r©   s   &&r4   rá  ÚFetchSearchStoreTests.getUID2  sM   € ð	Ø—=‘= Õ% eÕ,Ð,øÜœ:Ð&ô 	*Ø—=‘=  q¥Õ)Ò)Üô 	Úð	ús   ‚ œ+AÁ	AÁAÁAc                	óF   € W n         \        V4      V n        V P                  # r0   )r·  rý   r¹  r—  rÿ  s   &&&r4   r   ÚFetchSearchStoreTests.fetch:  s   € Ø#&Ô Ü(+¨H«ˆÔ%Ø�}‰}Ðr7   c                	óf  a € V 3R  lpS P                   P                  \        V4      4      P                  V4      P                  S P                  4      P	                  S P
                  4       V 3R lp\        P                  ! S P                  S P                  RR7      pVP                  V4       V# )c                ó   <€ V Sn         R # r0   r
  r
  s   &€r4   r2   Ú0FetchSearchStoreTests._fetchWork.<locals>.result@  r!
  r7   c                ó  <€ SP                  SP                  SP                  J 4       SP                  ;'       d    SP                  P	                  4        SP
                  ;'       d    SP
                  P	                  4        SP                  '       d2   SP                  P                  4        F  w  r\        V4      VR &   K  	  SP                  SP                  SP                  4       SP                  SP                  SP                  4       SP                  SP                  SP
                  4       SP                  \        P                  ! SP                  4      \        P                  ! SP                  4      4       R# )rß  N)r�  r2   r—  rG  ró  r¸  rà  r
  rý   rC   r·  r   rû   rk  r¹  )rî  ÚkÚvrF   s   &  €r4   rÂ  Ú/FetchSearchStoreTests._fetchWork.<locals>.checkG  s  ø€ à×Ñ˜TŸ[™[¨D¯M©MÐ9Ô:à�J‰J×,Ð,˜4Ÿ:™:Ÿ?™?Ó,øØ×&Ñ&×LÐL¨4×+EÑ+E×+JÑ+JÓ+Løà�x�xˆxØ ŸM™M×/Ñ/Ö1‘D�AÜ" 1›v�A�e“Hñ 2ð ×Ñ˜TŸ[™[¨$¯-©-Ô8Ø×Ñ˜TŸX™X t×'?Ñ'?Ô@Ø×Ñ˜TŸZ™Z¨×)CÑ)CÔDØ×ÑÜ×!Ò! $§-¡-Ó0Ü×!Ò! $×"?Ñ"?Ó@ör7   Fr&
  r(
  )rF   r   r2   rÂ  rª   s   f&   r4   r£
  Ú FetchSearchStoreTests._fetchWork?  s�   ø€ õ	ð 	�‰×"Ñ"¤5¨£<Ó0×<Ñ<¸VÓD×PÑPØ×Ñó	
ç
‰*�T—_‘_Ô
%õ	ô& × Ò  §¡¨d¯k©kÀÔGˆØ	�‰�eÔØˆr7   c                ó(  a a€ RoVV 3R lpS P                   P                  \        V4      4      pS P                  V\        P
                  4      pV 3R lpVP                  V4       VP                  S P                  4       S P                  4        V# )zÅ
If, as part of a search, an ISearchableMailbox raises an
IllegalQueryError (e.g. due to invalid search criteria), client sees a
failure response, and an IllegalQueryError is logged on the server.
r§  c                 ó:   <€ SP                   P                  S 4      # r0   rv  )r[  rF   s   €€r4   r"	  Ú6FetchSearchStoreTests.test_invalidTerm.<locals>.searchf  s   ø€ Ø—;‘;×%Ñ% eÓ,Ð,r7   c                óT  <€ SP                   P                  P                  4        SP                  P                  P                  4        SP	                  \
        P                  4      pSP                  \        V4      ^4       SP                  \        R4      \        V 4      4       R# )r«  s1   SEARCH failed: FOO is not a valid search criteriaNr¬  r­  s   & €r4   r®  Ú=FetchSearchStoreTests.test_invalidTerm.<locals>.errorReceivedl  s|   ø€ ð
 �K‰K×!Ñ!×0Ñ0Ô2Ø�K‰K×!Ñ!×0Ñ0Ô2ð ×+Ñ+¬E×,CÑ,CÓDˆFØ×ÑœS ›[¨!Ô,ð ×ÑÜÐHÓIÌ3ÈwË<ör7   r°  )rF   r"	  rª   r®  r[  s   f   @r4   Útest_invalidTermÚ&FetchSearchStoreTests.test_invalidTerm^  sr   ù€ ð ˆö	-ð �N‰N×&Ñ&¤u¨V£}Ó5ˆØ×Ñ˜q¤%×"6Ñ"6Ó7ˆõ	ð" 	
�‰�mÔ$Ø	�‰�T—_‘_Ô%Ø�‰ŒØˆr7   )r€  r�  r—  r[  r2   r  r¹  r¸  r¶  r·  rà  N)ry   rz   r{   r|   rƒ  r"	  r»  r½  rÇ  rÐ  rÓ  rá  r   r£
  ré  r}   r1   r7   r4   r´  r´  ç  s;   † ò3òòð !€Nòò8#ò#òòò
ö>"r7   r´  c                  ó"   € ] tR tRtR tR tRtR# )ÚFakeMailboxiƒ  c                	ó   € . V n         R # r0   ©rP  rV   s   &r4   r‚   ÚFakeMailbox.__init__„  ó	   € ØˆŽ	r7   c                	óh   € V P                   P                  WV34       \        P                  ! R 4      # r0   )rP  r…   r   rˆ  )rF   rž   rÓ  rí  s   &&&&r4   rî  ÚFakeMailbox.addMessage‡  s(   € Ø�	‰	×Ñ˜$ tÐ,Ô-Ü�}Š}˜TÓ"Ð"r7   rî  N)ry   rz   r{   r|   r‚   rî  r}   r1   r7   r4   rì  rì  ƒ  s   † òö#r7   rì  c                  ó(   € ] tR tRtR tR tR tRtR# )ÚFeaturefulMessageiŒ  c                	ó   € R # rÁ  r1   rV   s   &r4   rÂ  ÚFeaturefulMessage.getFlagsŽ  s   € Ùr7   c                	ó   € R # )rÖ  r1   rV   s   &r4   rõ	  Ú!FeaturefulMessage.getInternalDate‘  s   € Ùr7   c                	ó   € \        R 4      # )ó   openr   rV   s   &r4   r•  ÚFeaturefulMessage.open”  s   € Ü�wÓÐr7   r1   N)ry   rz   r{   r|   rÂ  rõ	  r•  r}   r1   r7   r4   rô  rô  Œ  s   † òòö r7   rô  c                  ó"   € ] tR tRtR tR tRtR# )ÚMessageCopierMailboxi˜  c                	ó   € . V n         R # r0   ©ÚmsgsrV   s   &r4   r‚   ÚMessageCopierMailbox.__init__š  rð  r7   c                	ób   € V P                   P                  V4       \        V P                   4      # r0   )r   r…   rå   rØ  s   &&r4   rÓ	  ÚMessageCopierMailbox.copy�  s"   € Ø�	‰	×Ñ˜ÔÜ�4—9‘9‹~Ðr7   rÿ  N)ry   rz   r{   r|   r‚   rÓ	  r}   r1   r7   r4   rý  rý  ˜  s   † òör7   rý  c                  ó(   € ] tR tRtR tR tR tRtR# )ÚCopyWorkerTestsi¢  c                	óð   a a€ \         P                  ! 4       pVP                  p\        4       oT! \	        ^^4       Uu. uF  q3\        4       3NK  	  upRS4      pVV 3R lpVP                  V4      # u upi )rÜ   r  c                ó<  <€ SP                    F\  pSP                  V^ ,          P                  4       R4       SP                  V^,          R4       SP                  V^,          R4       K^  	  V  F(  w  r#SP                  V4       SP                  VR4       K*  	  R# )rü  rú  rÓ  rÖ  N)rP  rC   r\   rƒ  )rI  r¦  rs  r2   r  rF   s   &   €€r4   ÚcbCopyÚ5CopyWorkerTests.testFeaturefulMessage.<locals>.cbCopy³  s}   ø€ Ø—V”V�Ø× Ñ   1¥§¡£¨gÔ6Ø× Ñ   1¥ wÔ/Ø× Ñ   1¥ ~Ö6ñ ó
 #*‘�Ø—‘ Ô'Ø× Ñ  ¨Ö.ó #*r7   )r   rI  Ú_IMAP4Server__cbCopyrì  rs   rô  r§   )rF   r­  r3   r  rª   r  r  s   f     @r4   ÚtestFeaturefulMessageÚ%CopyWorkerTests.testFeaturefulMessage£  sj   ù€ Ü×ÒÓˆð ×"Ñ"ˆä‹MˆÙ´°q¸"´Ó>±¨AÔ$Ó&Ó'±Ñ>ÀÀqÓIˆö	/ð �}‰}˜VÓ$Ð$ùò ?s   ¾A3c                	ó€  a a€ \         P                  ! 4       pVP                  p\        4       o\	        ^^4       Uu. uF-  p\        R\        V4      /RRRV3,          V^
,           R4      NK/  	  ppT! \        \	        ^^4      V4       Uu. uF  qUNK  	  upRS4      pVV 3R lpVP                  V4      # u upi u upi )rÜ   zHeader-Counteró   Dates   Body %dNr  c                ó¸  <€ . pSP                    F[  pVP                  V^ ,          P                  4       4       SP                  V^,          R4       SP                  V^,          R4       K]  	  VP	                  4        \        R \        ^^4       4       4      pSP                  W4       V  F(  w  rESP                  V4       SP                  VR4       K*  	  R# )rü  r  c              3  ó6   "  € T F  pR W3,          x € K  	  R# 5i)s   Header-Counter: %d

Body %dNr1   rQ  s   & r4   rS  ÚJCopyWorkerTests.testUnfeaturefulMessage.<locals>.cbCopy.<locals>.<genexpr>Ö  s   é € ð ÙGSÀ!Ð4¸°v×=Ò=Ã|ùs   ‚Nr1   )rP  r…   r\   rC   ró  r•  rs   rƒ  )rI  Úseenr¦  Úexprs  r2   r  rF   s   &     €€r4   r  Ú7CopyWorkerTests.testUnfeaturefulMessage.<locals>.cbCopyÎ  sµ   ø€ ØˆDØ—V”V�Ø—‘˜A˜a�DŸI™I›KÔ(Ø× Ñ   1¥ rÔ*Ø× Ñ   1¥ wÖ/ñ ð
 �I‰IŒKÜñ ÜGLÈQÐPRÄ|óó ˆCð ×Ñ˜TÔ'ã")‘�Ø—‘ Ô'Ø× Ñ  ¨Ö.ó #*r7   r1   )	r   rI  r
  rì  rs   r¤   rý   rü   r§   )	rF   r­  r3   r  r   Úimrª   r  r  s	   f       @r4   ÚtestUnfeaturefulMessageÚ'CopyWorkerTests.testUnfeaturefulMessage¿  sÇ   ù€ Ü×ÒÓˆð ×"Ñ"ˆä‹Mˆô
 ˜1˜b”\ó	
ñ "�ô Ø!¤3 q£6Ð*¨B°¸ÀqÀdÕ9JÈAÐPRÍFÐTXöñ "ð	 	ð 
ñ œC¤ a¨£¨dÔ3Ó4Ñ3�bŠrÑ3Ñ4°e¸QÓ?ˆö	/ð" �}‰}˜VÓ$Ð$ùò3
ùò 5s   ¼3B6Â
B;c                	óF  a aa€ \         P                  ! 4       pVP                  p\        4       o\	        ^^4       Uu. uF  p\        4       NK  	  upoT! \        \	        ^^4      S4       Uu. uF  qDNK  	  upRS4      pVVV 3R lpVP                  V4      # u upi u upi )rÜ   s   tagc                óÖ   <€ SP                  V \        \        ^.^
,          \        ^^4      4      4      4       \        SSP                  4       F  w  rSP                  W4       K  	  R# rè  )rC   ræ   rü   rs   r   rœ   )rI  ÚorigrO  r  r   rF   s   &  €€€r4   r  Ú1CopyWorkerTests.testMessageCopier.<locals>.cbCopyë  sP   ø€ Ø×Ñ˜W¤d¬3°¨s°R­x¼¸qÀ"»Ó+FÓ&GÔHÜ   q§v¡vÖ.‘	�Ø×$Ñ$ TÖ/ó /r7   )r   rI  r
  rý  rs   r7  rü   r§   )	rF   r­  r3   r  r  rª   r  r  r   s	   f      @@r4   ÚtestMessageCopierÚ!CopyWorkerTests.testMessageCopierá  sŒ   ú€ Ü×ÒÓˆð ×"Ñ"ˆä Ó"ˆÜ"'¨¨2¤,Ó/¡,˜Q”–¡,Ñ/ˆÙœC¤ a¨£¨dÔ3Ó4Ñ3�bŠrÑ3Ñ4°f¸aÓ@ˆ÷	0ð
 �}‰}˜VÓ$Ð$ùò 0ùÚ4s   ½BÁ-
Br1   N)ry   rz   r{   r|   r  r  r  r}   r1   r7   r4   r  r  ¢  s   † ò%ò8 %öD%r7   r  zOpenSSL not presentzReactor doesn't support SSLc                  óœ   € ] tR tRtRtRt]'       d   ]! 4       t]'       d   ]! 4       tR tR t	R t
R tR tR R	 ltR
 tR tR tR tRtR# )ÚTLSTestsió  Nc                	ó\   € \         P                  ! V P                  V P                  R R7      # )Fr&
  )r#   r)
  r  r€  rV   s   &r4   r#   ÚTLSTests.loopbacký  s   € Ü×#Ò# D§K¡K°·±ÀEÔJÐJr7   c                	óÌ  a a	a
€ \         P                  P                  R 4       . o	V	V 3R lpV	V 3R lpV	V 3R lpV	V 3R lpV	V 3R lpRS P                  n        WW4V.o
S
 F'  pS P
                  P                  \        V4      4       K)  	  S P
                  P                  S P                  S P                  4       V	V
V 3R lpS P                  4       pVP                  V4       V# )r˜  c                 ó^   <€ S P                  R 4       SP                  P                  RR4      # )NrD  rH  )r…   r€  rà  ©ÚcalledrF   s   €€r4   rà  Ú)TLSTests.testAPileOfThings.<locals>.login  s'   ø€ Ø�M‰M˜$ÔØ—;‘;×$Ñ$ [Ð2BÓCÐCr7   c                 ó^   <€ S P                  R 4       SP                  P                  RR4      # )Nr˜  ó   %)r…   r€  ræ   r$  s   €€r4   ræ   Ú(TLSTests.testAPileOfThings.<locals>.list  s&   ø€ Ø�M‰M˜$ÔØ—;‘;×#Ñ# H¨dÓ3Ð3r7   c                 ó^   <€ S P                  R 4       SP                  P                  RR4      # )Nr˜  r¨  )r…   r€  rs  r$  s   €€r4   rs  Ú*TLSTests.testAPileOfThings.<locals>.status  s&   ø€ Ø�M‰M˜$ÔØ—;‘;×%Ñ% h°	Ó:Ð:r7   c                 ó\   <€ S P                  R 4       SP                  P                  R4      # )Nr˜  )r…   r€  r„  r$  s   €€r4   r„  Ú+TLSTests.testAPileOfThings.<locals>.examine  s$   ø€ Ø�M‰M˜$ÔØ—;‘;×&Ñ& xÓ0Ð0r7   c                 óZ   <€ S P                  R 4       SP                  P                  4       # r0   )r…   r€  rÊ  r$  s   €€r4   rÊ  Ú*TLSTests.testAPileOfThings.<locals>.logout  s"   ø€ Ø�M‰M˜$ÔØ—;‘;×%Ñ%Ó'Ð'r7   Tc                óè   <€ SP                  SP                  P                  R 4       SP                  SP                  P                  R 4       SP                  \	        S4      \	        S4      4       R# rú  )rC   r  Ú
startedTLSr€  rå   )rî  r%  ÚmethodsrF   s   &€€€r4   rÂ  Ú)TLSTests.testAPileOfThings.<locals>.check   sO   ø€ Ø×Ñ˜TŸ[™[×3Ñ3°TÔ:Ø×Ñ˜TŸ[™[×3Ñ3°TÔ:Ø×ÑœS ›[¬#¨g«,Ö7r7   )rC  rY  rb  r€  ÚrequireTransportSecurityr�  r§   r8   r›  rŠ  r�  r#   )rF   rà  ræ   rs  r„  rÊ  rÐ  rÂ  rª   r%  r2  s   f        @@r4   ÚtestAPileOfThingsÚTLSTests.testAPileOfThings   s³   ú€ Ü×Ñ×*Ñ*¨8Ô4Øˆö	Dö	4ö	;ö	1ö	(ð 04ˆ�‰Ô,à °Ð8ˆÛˆFØ�N‰N×&Ñ&¤u¨V£}Ö5ñ ð 	�‰×#Ñ# D×$6Ñ$6¸¿¹ÔH÷	8ð
 �M‰M‹OˆØ	�‰�eÔØˆr7   c                	óþ  a a€ S P                   P                  P                  R R4       . oS P                  P	                  \
        P                  ! R 4      4       S P                  P                  V 3R l4      P                  V 3R l4      P                  SP                  4      P                  S P                  4      P                  S P                  4       S P                  4       pVP                  V V3R l4       V# )rD  rH  c                ó:   <€ SP                   P                  R 4      # )rH  r.  rÍ  s   &€r4   r5   Ú)TLSTests.testLoginLogin.<locals>.<lambda>.  s   ø€ �d—k‘k×.Ñ.Ð/?Ô@r7   c                ó8   <€ SP                   P                  4       # r0   )r€  rÊ  rÍ  s   &€r4   r5   r9  /  s   ø€  §¡× 2Ñ 2Ô 4r7   c                ó:   <€ SP                  \        S4      ^4      # rÉ  )rC   rå   ©r‰  rF   Úsuccesss   &€€r4   r5   r9  8  s   ø€  × 0Ñ 0´°W³¸qÔ Ar7   )r  rL  rK  r€  r4  r   r3  r�  r§   r…   rŠ  r²  r�  r#   )rF   rª   r=  s   f @r4   ÚtestLoginLoginÚTLSTests.testLoginLogin)  s³   ù€ Ø�‰×Ñ×#Ñ# KÐ1AÔBØˆØ�‰×)Ñ)¬%×*BÒ*BÀ;Ó*OÔPØ�‰×"Ñ"Ü@ó	
ç
‰+Ô4Ó
5·k±kØ�N‰Nó7
ç
‰+Ø×Ñó
ç
‰*Ø�O‰Oô
ð �M‰M‹OˆØ	�‰ÕAÔBØˆr7   c                ó–  a a€ . oS P                   P                  \        S P                  P                  4      4       V 3R lpS P                   P                  V4       S P                   P                  SP
                  4       S P                  4       pVP                  V V3R l4       \        P                  ! VS P                   .4      # )zÄ
Begin a C{STARTTLS} sequence and assert that it results in a
TLS session.

@return: A L{Deferred} that fires when the underlying
    connection between the client and server has been terminated.
c                óŒ   <€ SP                  \        P                  P                  SP                  P
                  4      4       R # r0   )rƒ  r   ÚISSLTransportÚ
providedByr€  rk  r$
  s   &€r4   ÚcheckSecureÚ6TLSTests.startTLSAndAssertSession.<locals>.checkSecureF  s*   ø€ Ø�O‰OœJ×4Ñ4×?Ñ?ÀÇÁ×@UÑ@UÓVÖWr7   c                ó&   <€ SP                  S4      # r0   )rƒ  r<  s   &€€r4   r5   Ú3TLSTests.startTLSAndAssertSession.<locals>.<lambda>M  s   ø€  §¡°Ô 8r7   )	r�  r§   r8   r€  ÚstartTLSr…   r#   r   r³  )rF   rD  rª   r=  s   f  @r4   ÚstartTLSAndAssertSessionÚ!TLSTests.startTLSAndAssertSession;  s�   ù€ ð ˆØ�‰×"Ñ"¤5¨¯©×)=Ñ)=Ó#>Ô?õ	Xð 	�‰×"Ñ" ;Ô/Ø�‰×"Ñ" 7§>¡>Ô2à�M‰M‹OˆØ	�‰Õ8Ô9Ü×"Ò" A t§~¡~Ð#6Ó7Ð7r7   c                óº   € V P                  4       pV P                  P                  V P                  4       V P                  P	                  V P
                  4       V# )zŠ
L{IMAP4Client.startTLS} triggers TLS negotiation and returns a
L{Deferred} which fires after the client's transport is using
encryption.
)rI  r�  r§   rŠ  r²  r�  ©rF   Údisconnecteds   & r4   Útest_startTLSÚTLSTests.test_startTLSP  sF   € ð ×4Ñ4Ó6ˆØ�‰×"Ñ" 4×#5Ñ#5Ô6Ø�‰×!Ñ! $§/¡/Ô2ØÐr7   c               ó   € V ^8„  d   QhRR/# )rß   r8  zDeferred[object]r1   )r9  s   "r4   r:  ÚTLSTests.__annotate__[  s   € ÷ 
ñ 
Ð&6ñ 
r7   c                ó&  € V P                  V P                  P                  4       RV P                  n        V P                  4       pV P                  P                  V P                  4       V P                  P                  V P                  4       V# )zL
L{IMAPClient.startTLS} supplies a default TLS context if none is
supplied.
N)	ÚassertIsNotNoner€  ÚcontextrI  r�  r§   rŠ  r²  r�  rL  s   & r4   Útest_startTLSDefaultÚTLSTests.test_startTLSDefault[  sj   € ð
 	×Ñ˜TŸ[™[×0Ñ0Ô1Ø"ˆ�‰ÔØ)-×)FÑ)FÓ)HˆØ�‰×"Ñ" 4×#5Ñ#5Ô6Ø�‰×!Ñ! $§/¡/Ô2ØÐr7   c                óÚ  €  ! R R\         4      pV! V P                  V P                  R7      V n        V P	                  4       pV P                  P                  \        V P                  P                  4      4       V P                  P                  V P                  R4       V P                  P                  V P                  4       V P                  P                  V P                  4       V# )zE
A server that receives a second C{STARTTLS} sends a C{NO}
response.
c                  ó   € ] tR tRtR tRtR# )Ú:TLSTests.test_doubleSTARTTLS.<locals>.DoubleSTARTTLSClientim  c                	óš   € V P                   '       g   \        P                  V 4      # V P                  \        P
                  ! R 4      4      # )s   STARTTLS)r1  r[  rH  r«  r   r`  rV   s   &r4   rH  ÚCTLSTests.test_doubleSTARTTLS.<locals>.DoubleSTARTTLSClient.startTLSn  s6   € Ø——�Ü'×0Ñ0°Ó6Ð6à×'Ñ'¬¯ª°kÓ(BÓCÐCr7   r1   N)ry   rz   r{   r|   rH  r}   r1   r7   r4   ÚDoubleSTARTTLSClientrY  m  s   † öDr7   r\  r~  s   TLS already negotiated)r[  r�  r|  r€  rI  r§   r8   rH  r²  r˜  rŠ  r�  )rF   r\  rM  s   &  r4   Útest_doubleSTARTTLSÚTLSTests.test_doubleSTARTTLSg  s°   € ô	D¤<ô 	Dñ +Ø�N‰N¨4¯>©>ô
ˆŒð ×4Ñ4Ó6ˆà�‰×"Ñ"¤5¨¯©×)=Ñ)=Ó#>Ô?Ø�‰×!Ñ!Ø×+Ñ+Ð-Fô	
ð 	�‰×"Ñ" 4×#5Ñ#5Ô6Ø�‰×!Ñ! $§/¡/Ô2àÐr7   c                óà  a € R\         P                  R\         P                  /S P                  n        \
        P                  V 3R l4       pS P                  P                  \        V4      4       S P                  4       pS P                  P                  \        V4      4       S P                  P                  S P                  4       S P                  P                  S P                  4       V# )z�
Starting a TLS negotiation with an L{IMAP4Server} that already
has C{LOGIN} and C{PLAIN} L{IChallengeResponse} factories uses
those factories.
r>  rÇ  c               3  óÐ   <"  € SP                   P                  4       x €p SP                  R V 4       SP                  RV R ,          4       SP                  RV R ,          4       R# 5i)r½  r>  rÇ  N)r€  r¦  r:  r9  s    €r4   ÚassertLOGINandPLAINÚJTLSTests.test_startTLSWithExistingChallengers.<locals>.assertLOGINandPLAIN�  sO   øé € à!%§¡×!<Ñ!<Ó!>Ñ>ˆLØ�M‰M˜' <Ô0Ø�M‰M˜( L°Õ$9Ô:Ø�M‰M˜( L°Õ$9Ö:ùs   ƒA#A&)r   r2  r»  r  rÁ  r   r›  r�  r§   r8   rI  rŠ  r²  r�  )rF   ra  rM  s   f  r4   Ú$test_startTLSWithExistingChallengersÚ-TLSTests.test_startTLSWithExistingChallengers„  s·   ø€ ð ”e×,Ñ,Ø”e×,Ñ,ð#
ˆ�‰Ôô
 
×	Ñ	ô	;ó 
ð	;ð 	�‰×"Ñ"¤5Ð)<Ó#=Ô>à×4Ñ4Ó6ˆà�‰×"Ñ"¤5Ð)<Ó#=Ô>à�‰×"Ñ" 4×#5Ñ#5Ô6Ø�‰×!Ñ! $§/¡/Ô2àÐr7   c                ó¦  a € R S P                   n        S P                  P                  V 3R l4       S P                  P	                  S P
                  R4       S P                  P                  S P                  4       S P                  P	                  S P                  4       \        P                  ! S P                  4       S P                  .4      # )zd
A client that attempts to log in before issuing the
C{STARTTLS} command receives a C{NO} response.
c                 ó2   € \         P                  ! . R 34      # )zOK Begin TLS negotiation now)r   rˆ  r1   r7   r4   r5   Ú3TLSTests.test_loginBeforeSTARTTLS.<locals>.<lambda>§  s   € ¤u§}¢}ØÐ/Ð0ô(
r7   c                ó<   <€ SP                   P                  R R4      # )s   wrongs   timer  rÍ  s   &€r4   r5   rg  «  s   ø€ �d—k‘k×'Ñ'¨°'Ô:r7   s!   LOGIN is disabled before STARTTLS)r€  rH  r�  r§   r²  r˜  rŠ  r�  r   r³  r#   rV   s   fr4   Útest_loginBeforeSTARTTLSÚ!TLSTests.test_loginBeforeSTARTTLS¡  s˜   ø€ ñ 
ˆ�‰Ôð 	�‰×"Ñ"Ü:ô	
ð 	�‰×!Ñ!Ø×+Ñ+Ø0ô	
ð
 	�‰×"Ñ" 4×#5Ñ#5Ô6Ø�‰×!Ñ! $§/¡/Ô2ä×"Ò" D§M¡M£O°T·^±^Ð#DÓEÐEr7   c                	ó¨  a a€ . oV 3R  lpS P                   P                  V4       S P                   P                  V 3R l4       S P                   P                  V3R l4       S P                   P                  S P                  4       S P                   P                  S P                  4       VV 3R lpS P                  4       P                  V4      # )c                ó*   <€ R SP                   n        R# )FN)r  ÚcanStartTLSr=  s   &€r4   ÚbreakServerTLSÚ3TLSTests.testFailedStartTLS.<locals>.breakServerTLS»  s   ø€ Ø&+ˆD�K‰KÖ#r7   c                ó8   <€ SP                   P                  4       # r0   )r€  rH  r=  s   &€r4   r5   Ú-TLSTests.testFailedStartTLS.<locals>.<lambda>¿  s   ø€ ¨t¯{©{×/CÑ/CÔ/Er7   c                ó`   <€ SP                  V P                  \        P                  4      4      # r0   )r…   r•  r   r–  )rŽ  rË  s   &€r4   r5   rq  Á  s   ø€ ˜Ÿ™¨¯©´×1EÑ1EÓ(FÔGr7   c                óx   <€ SP                  S4       SP                  S^ ,          \        P                  4       R# r“  )rƒ  rœ   r   r–  )rî  rË  rF   s   &€€r4   rÂ  Ú*TLSTests.testFailedStartTLS.<locals>.checkÆ  s)   ø€ Ø�O‰O˜HÔ%Ø× Ñ  ¨!¥¬e×.BÑ.BÖCr7   )r�  r§   r²  rŠ  r�  r#   )rF   rn  rÂ  rË  s   f  @r4   ÚtestFailedStartTLSÚTLSTests.testFailedStartTLS¸  s˜   ù€ Øˆõ	,ð 	�‰×"Ñ" >Ô2Ø�‰×"Ñ"Ô#EÔFØ�‰×!Ñ!ÜGô	
ð 	�‰×"Ñ" 4×#5Ñ#5Ô6Ø�‰×!Ñ! $§/¡/Ô2ö	Dð �}‰}‹×*Ñ*¨5Ó1Ð1r7   )r€  )ry   rz   r{   r|   r{  r|  r-   r,   r#   r5  r>  rI  rN  rU  r]  rc  ri  ru  r}   r1   r7   r4   r  r  ó  sY   † ð €IØ€IßÙ$Ó&ˆ	ßÙ$Ó&ˆ	òKò'òRò$8ò*	õ
òò:ò:Fö.2r7   r  c                  ó(   € ] tR tRt^tRtRtR tRtR# )ÚSlowMailboxiÍ  Nc                	ó´   € \         P                  ! 4       pV P                  V P                  VP                  R4       V P
                  P	                  R 4       V# )Nr1   )r   r   Ú	callLaterÚhowSlowrc  ÚfetchDeferred)rF   rk  rà  rª   s   &&& r4   r   ÚSlowMailbox.fetchÔ  s?   € Ü�NŠNÓˆØ�‰�t—|‘| Q§Z¡Z°Ô4Ø×Ñ×#Ñ# DÔ)Øˆr7   r1   )	ry   rz   r{   r|   r{  rz  r|  r   r}   r1   r7   r4   rx  rx  Í  s   † Ø€GØ€IØ€Mör7   rx  c                  ó:   € ] tR tRtR tR tR tR tR tR t	Rt
R	# )
ÚTimeoutTestsiÛ  c                óŠ  a aa€ \        4       oRS P                  n        ^S P                  n        SP
                  S P                  n        RS n        VV V3R lpV 3R loS P                  P                  \        V4      4      pVP                  S P                  4       \        P                  ! VS P                  4       .4      # )zc
The *client* has a timeout mechanism which will close connections that
are inactive for a period.
TNc                 ó„   <€ SP                   P                  R R4      p SP                  ^4       V P                  S4       V # r  )r€  rà  Úadvancer²  )rª   rŸ   rF   ÚtimedOuts    €€€r4   rà  Ú.TimeoutTests.test_serverTimeout.<locals>.loginç  s6   ø€ Ø—‘×!Ñ! +Ð/?Ó@ˆAØ�I‰I�aŒLØ�L‰L˜Ô"ØˆHr7   c                ój   <€ SP                  R 4       V P                  ! \        P                  4       R # r0   )rŠ  r•  r   ÚTimeoutErrorr”  s   &€r4   rƒ  Ú1TimeoutTests.test_serverTimeout.<locals>.timedOutí  s#   ø€ Ø×Ñ˜tÔ$Ø�LŠLœ×+Ñ+Ö,r7   )r   r  rO  r€  rç	  rz  r]  r�  r§   r8   r²  r�  r   r³  r#   )rF   rà  rª   rŸ   rƒ  s   f  @@r4   Útest_serverTimeoutÚTimeoutTests.test_serverTimeoutÜ  sŒ   ú€ ô
 ‹GˆØ"&ˆ�‰ÔØˆ�‰ÔØ !§¡ˆ�‰ÔØ ˆÔ÷	õ	-ð �N‰N×&Ñ&¤u¨U£|Ó4ˆØ	�‰�T—_‘_Ô%Ü×"Ò" A t§}¡}£Ð#7Ó8Ð8r7   c                ó2  a a€ \        4       oSP                  S P                  n        V 3R lpVV 3R lpS P                  P	                  \        V4      4      pVP	                  \        V4      4       \        P                  ! VS P                  4       .4      # )z$
The server times out a connection.
c                 ó<   <€ S P                   P                  R R4      # r  r  rV   s   €r4   rà  Ú/TimeoutTests.test_serverTimesOut.<locals>.loginü  r!  r7   c                 ó`   <€ S P                  SP                  P                  ^,          4       R# ©rß   N©r‚  r  ÚPOSTAUTH_TIMEOUT©rŸ   rF   s   €€r4   Ú
expireTimeÚ4TimeoutTests.test_serverTimesOut.<locals>.expireTimeÿ  ó   ø€ Ø�I‰I�d—k‘k×2Ñ2°QÕ6Ö7r7   )	r   rz  r  r�  r§   r8   r   r³  r#   )rF   rà  r’  rª   rŸ   s   f   @r4   Útest_serverTimesOutÚ TimeoutTests.test_serverTimesOutõ  sp   ù€ ô ‹GˆØ !§¡ˆ�‰Ôõ	Dö	8ð �N‰N×&Ñ&¤u¨U£|Ó4ˆØ	�‰”e˜JÓ'Ô(ô
 ×"Ò" A t§}¡}£Ð#7Ó8Ð8r7   c                ó
  a aa€ S P                  \        P                  R\        4       \        P                  P	                  R4       \        P                  P
                  R,          oS P                  \        P                  ! S4      4       \        4       oSP                  S P                  n
        V 3R lpV 3R lpVV 3R lpVV 3R lpV 3R lpS P                  P                  \        V4      4      pVP                  \        V4      4       VP                  \        V4      4       VP                  \        V4      4       VP                  \        V4      4       \        P                   ! VS P#                  4       .4      # )	zF
The server unsets the selected mailbox when timing out a
connection.
r6  úmailbox-testúMAILBOX-TESTc                 ó<   <€ S P                   P                  R R4      # r  r  rV   s   €r4   rà  Ú7TimeoutTests.test_serverUnselectsMailbox.<locals>.login  r!  r7   c                 ó:   <€ S P                   P                  R 4      # ©r˜  rj  rV   s   €r4   r=  Ú8TimeoutTests.test_serverUnselectsMailbox.<locals>.select  rl  r7   c                 óT   <€ SP                  S SP                  P                  4       R # r0   )rM
  r  r³  ©r³  rF   s   €€r4   Ú	assertSetÚ;TimeoutTests.test_serverUnselectsMailbox.<locals>.assertSet  s   ø€ Ø�M‰M˜$ §¡× 0Ñ 0Ö1r7   c                 ó`   <€ S P                  SP                  P                  ^,          4       R# rŽ  r�  r‘  s   €€r4   r’  Ú<TimeoutTests.test_serverUnselectsMailbox.<locals>.expireTime   r”  r7   c                 óR   <€ S P                  S P                  P                  4       R # r0   )r�  r  r³  rV   s   €r4   ÚassertUnsetÚ=TimeoutTests.test_serverUnselectsMailbox.<locals>.assertUnset#  s   ø€ Ø×Ñ˜TŸ[™[×-Ñ-Ö.r7   )rÎ  rC  rY  r  rb  ry  r�  r"   rC  r   rz  r  r�  r§   r8   r   r³  r#   )	rF   rà  r=  r¡  r’  r¦  rª   rŸ   r³  s	   f      @@r4   Útest_serverUnselectsMailboxÚ(TimeoutTests.test_serverUnselectsMailbox
  s  ú€ ð
 	�
‰
”<×*Ñ*Ð,<Ô>PÔQÜ×Ñ×*Ñ*¨>Ô:Ü×&Ñ&×0Ñ0°Õ@ˆØ×ÑÔ.×9Ò9¸$Ó?Ô@ä‹GˆØ !§¡ˆ�‰Ôõ	Dõ	6ö	2ö	8õ	/ð �N‰N×&Ñ&¤u¨U£|Ó4ˆØ	�‰”e˜F“mÔ$Ø	�‰”e˜IÓ&Ô'Ø	�‰”e˜JÓ'Ô(Ø	�‰”e˜KÓ(Ô)ô
 ×"Ò" A t§}¡}£Ð#7Ó8Ð8r7   c                ó˜  a aa€ \         P                  P                  R4       \         P                  P                  R,          o\	        \
        S4       \        4       oSP                  S P                  n        V 3R lpV 3R lpVV 3R lpVV 3R lpVV 3R lpS P                  P                  \        V4      4      pVP                  \        V4      4       VP                  \        V4      4       VP                  \        V4      4       VP                  \        V4      4       \        P                  ! VS P                  4       .4      # )zQ
The server closes the selected, closeable mailbox when timing
out a connection.
r˜  r™  c                 ó<   <€ S P                   P                  R R4      # r  r  rV   s   €r4   rà  Ú?TimeoutTests.test_serverTimesOutAndClosesMailbox.<locals>.login=  r!  r7   c                 ó:   <€ S P                   P                  R 4      # r�  rj  rV   s   €r4   r=  Ú@TimeoutTests.test_serverTimesOutAndClosesMailbox.<locals>.select@  rl  r7   c                 ó>   <€ SP                  S P                  4       R # r0   )r�  rû  r   s   €€r4   ÚassertMailboxOpenÚKTimeoutTests.test_serverTimesOutAndClosesMailbox.<locals>.assertMailboxOpenC  s   ø€ Ø×Ñ˜TŸ[™[Ö)r7   c                 ó`   <€ S P                  SP                  P                  ^,          4       R# rŽ  r�  r‘  s   €€r4   r’  ÚDTimeoutTests.test_serverTimesOutAndClosesMailbox.<locals>.expireTimeF  r”  r7   c                 ó>   <€ SP                  S P                  4       R # r0   )rƒ  rû  r   s   €€r4   ÚassertMailboxClosedÚMTimeoutTests.test_serverTimesOutAndClosesMailbox.<locals>.assertMailboxClosedI  s   ø€ Ø�O‰O˜DŸK™KÖ(r7   )rC  rY  rb  ry  r   r"   r   rz  r  r�  r§   r8   r   r³  r#   )	rF   rà  r=  r°  r’  rµ  rª   rŸ   r³  s	   f      @@r4   Ú#test_serverTimesOutAndClosesMailboxÚ0TimeoutTests.test_serverTimesOutAndClosesMailbox1  sè   ú€ ô
 	×Ñ×*Ñ*¨>Ô:Ü×&Ñ&×0Ñ0°Õ@ˆÜÔ*¨DÔ1ä‹GˆØ !§¡ˆ�‰Ôõ	Dõ	6ö	*ö	8ö	)ð �N‰N×&Ñ&¤u¨U£|Ó4ˆØ	�‰”e˜F“mÔ$Ø	�‰”eÐ-Ó.Ô/Ø	�‰”e˜JÓ'Ô(Ø	�‰”eÐ/Ó0Ô1ô
 ×"Ò" A t§}¡}£Ð#7Ó8Ð8r7   c                óv  a a€ \        4       oSP                  \        n        \        P                  ! 4       \        n        SP                  S P                  n        \        \        P                  n	        \        P                  P                  R4       S P                  P                  ^4       V 3R lpV 3R lpV 3R lpV 3R lpV3R lp\        P
                  P                  V4       S P                  P                  \        V4      4      pVP                  \        V4      4       VP                  \        V4      4       VP                  \        V4      4       VP                  S P                  4       VP!                  S P"                  4       \        P$                  ! VS P'                  4       .4      pV# )z=
The connection timeout does not take effect during fetches.
r˜  c                 ó<   <€ S P                   P                  R R4      # r  r  rV   s   €r4   rà  Ú7TimeoutTests.test_longFetchDoesntTimeout.<locals>.logind  r!  r7   c                 óp   <€ S P                   P                  ^4       S P                  P                  R4      # )rÜ   r˜  )r  Ú
setTimeoutr€  r=  rV   s   €r4   r=  Ú8TimeoutTests.test_longFetchDoesntTimeout.<locals>.selectg  s*   ø€ Ø�K‰K×"Ñ" 1Ô%Ø—;‘;×%Ñ% nÓ5Ð5r7   c                 ó:   <€ S P                   P                  R 4      # )rù   r§
  rV   s   €r4   r   Ú7TimeoutTests.test_longFetchDoesntTimeout.<locals>.fetchk  s   ø€ Ø—;‘;×'Ñ'¨Ó.Ð.r7   c                 óT   <€ S P                  S P                  P                  R 4       R# )rç	  N)rä   r  rì  rV   s   €r4   ÚstillConnectedÚ@TimeoutTests.test_longFetchDoesntTimeout.<locals>.stillConnectedn  s   ø€ Ø×Ñ §¡× 1Ñ 1°9Ö=r7   c                óN   <€ \        ^4       F  pSP                  R4       K  	  R# )r  g      à?N)rs   r‚  )rî  r  rŸ   s   & €r4   Ú	cbAdvanceÚ;TimeoutTests.test_longFetchDoesntTimeout.<locals>.cbAdvanceq  s   ø€ Ü˜1–X�Ø—	‘	˜#–ó r7   )r   rz  rx  r   r   r|  r  rC  rY  r6  rb  r½  r§   r�  r8   rŠ  r²  r�  r³  r#   )	rF   rà  r=  r   rÂ  rÅ  r´  rª   rŸ   s	   f       @r4   Útest_longFetchDoesntTimeoutÚ(TimeoutTests.test_longFetchDoesntTimeoutW  s&  ù€ ô ‹GˆØ !§¡ŒÔÜ$)§N¢NÓ$4ŒÔ!Ø !§¡ˆ�‰ÔÜ1<Œ×ÑÔ.Ü×Ñ×*Ñ*¨>Ô:à�‰×Ñ˜qÔ!õ	Dõ	6õ	/õ	>õ	ô 	×!Ñ!×-Ñ-¨iÔ8à�^‰^×'Ñ'¬¨e«Ó5ˆØ
�‰”u˜V“}Ô%Ø
�‰”u˜U“|Ô$Ø
�‰”u˜^Ó,Ô-Ø
�‰�t×)Ñ)Ô*Ø
�‰�d—o‘oÔ&Ü×Ò  T§]¡]£_Ð 5Ó6ˆØˆr7   c                ó6  aa€ \        4       p\        4       pV P                  Vn        VP                  V P                  n        V P                  P                  V4       . oV P                  P                  oVV3R lV P                  n        VP                  R.V P                  P                  R,          .^,          ,           4       V P                  SS4       VP                  RV P                  P                  R,          .4       V P                  S4       R# )zc
The *server* has a timeout mechanism which will close connections that
are inactive for a period.
c                óD   <€ SP                  R 4      S! V 4      3^,          # r0   )r…   )ÚreasonÚconnLostÚlosts   &€€r4   r5   Ú<TimeoutTests.test_idleClientDoesDisconnect.<locals>.<lambda>�  s&   ø€ Ø�K‰K˜ÓÙ�VÓð5
ð ö5r7   g        g      @g       @N)r   r   r  r2  rz  rö  rû  ÚpumpÚtimeOutr�  rƒ  )rF   rŸ   rk  rÌ  rÍ  s   &  @@r4   Útest_idleClientDoesDisconnectÚ*TimeoutTests.test_idleClientDoesDisconnect€  sÐ   ù€ ô
 ‹Gˆä4Ó6ˆ	Ø!Ÿ[™[ˆ	ÔØ !§¡ˆ�‰ÔØ�‰×"Ñ" 9Ô-ð ˆØ—;‘;×-Ñ-ˆõ&ˆ�‰Ô"ð 	
�‰�ˆu˜Ÿ™×+Ñ+¨cÕ1Ð2°QÕ6Õ6Ô7Ø×Ñ˜˜tÔ$ð 	
�‰��T—[‘[×(Ñ(¨3Õ.Ð/Ô0Ø�‰˜Ör7   )r]  N)ry   rz   r{   r|   rˆ  r•  r¨  r·  rÇ  rÑ  r}   r1   r7   r4   r  r  Û  s#   † ò9ò29ò*%9òN$9òL'öRr7   r  c                  ó   € ] tR tRtR tRtR# )ÚDisconnectionTestsi�  c                	ó  € \         P                  ! 4       p\        4       pVP                  V4       V P	                  VP                  R R4      \        P                  4      pVP                  \        P                  ! R4      4       V# )rD  zexample.comúConnection closed)	r   r]  r   rö  rÃ  rà  r   rü  rû  )rF   rŸ   Útrª   s   &   r4   Ú"testClientDisconnectFailsDeferredsÚ5DisconnectionTests.testClientDisconnectFailsDeferredsž  sm   € Ü×ÒÓˆÜ,Ó.ˆØ	×Ñ˜ÔØ×ÑØ�G‰G�K Ó/´×1EÑ1Eó
ˆð 	
×Ñœ×-Ò-Ð.AÓBÔCØˆr7   r1   N)ry   rz   r{   r|   rØ  r}   r1   r7   r4   rÔ  rÔ  �  s   † ör7   rÔ  c                  ó&   € ] tR tRtRtR tR tRtR# )ÚSynchronousMailboxi©  zV
Trivial, in-memory mailbox implementation which can produce a message
synchronously.
c                	ó   € Wn         R # r0   rj  )rF   rk  s   &&r4   r‚   ÚSynchronousMailbox.__init__¯  s   € Ø Žr7   c              #  	óx   "  € V'       d   Q R 4       hV F   pW0P                   V^,
          ,          3x € K"  	  R# 5i)zCannot handle uid requests.Nrj  )rF   rÇ  rà  r©   s   &&& r4   r   ÚSynchronousMailbox.fetch²  s3   é € ßÐ5Ð5Ó5ˆwÛˆCØ—}‘} S¨1¥WÕ-Ð-Ô-ó ùs   ‚8:rj  N)ry   rz   r{   r|   r[  r‚   r   r}   r1   r7   r4   rÛ  rÛ  ©  s   † ñò
!ö.r7   rÛ  c            
      ó’   € ] tR tRtRt]! / . RRRR4      ]! / . RRRR4      ]! / . RRRR4      .tR tR	 tR
 3R lt	R t
R tR tRtR# )ÚPipeliningTestsi¸  zE
Tests for various aspects of the IMAP4 server's pipelining support.
r7   r�  Nr‘  ó   2c                	ój  € . V n         \        4       V n        \        P                  ! R R V P
                  4      V n        V P                  P                  V P                  4       \        V P                  4      pRV P                  n
        WP                  n        V P                  P                  4        R # r
  )Ú	iteratorsr   rk  r   rI  ÚiterateInReactorr  rö  rÛ  rk  rì  r³  r÷  )rF   rY  s   & r4   rƒ  ÚPipeliningTests.setUpÃ  s}   € ØˆŒä(Ó*ˆŒÜ×'Ò'¨¨d°D×4IÑ4IÓJˆŒØ�‰×"Ñ" 4§>¡>Ô2ä$ T§]¡]Ó3ˆð %ˆ�‰ÔØ"�‰Ôð 	�‰×ÑÖr7   c                óh   € \         P                  ! 4       pV P                  P                  W34       V# )z 
A fake L{imap4.iterateInReactor} that records the iterators it
receives.

@param iterator: An iterator.

@return: A L{Deferred} associated with this iterator.
)r   r   rä  r…   )rF   Úiteratorrª   s   && r4   rå  Ú PipeliningTests.iterateInReactorÓ  s)   € ô �NŠNÓˆØ�‰×Ñ˜x˜mÔ,Øˆr7   c                 	ó   € R # )Tr1   r1   r7   r4   r5   ÚPipeliningTests.<lambda>à  s   € ©Dr7   c                ót  € V P                   '       d¦   V! 4       '       d—   V P                   ^ ,          ^ ,           FE  pV P                  P                  '       g   K!  V P                  P                  P                  4        KD  	  V P                   P	                  ^ 4      ^,          P                  R4       Kµ  R# R# )aN  
Advance pending iterators enqueued with L{iterateInReactor} in
a round-robin fashion, resuming the transport's producer until
it has completed.  This ensures bodies are flushed.

@param asLongAs: (optional) An optional predicate function.
    Flushing iterators continues as long as there are
    iterators and this returns L{True}.
N)rä  rk  Úproducerr‡   rV  rc  )rF   ÚasLongAsÚes   && r4   ÚflushPendingÚPipeliningTests.flushPendingà  s   € ð �n�nˆn¡§¢Ø—^‘^ AÕ& q×)Ð)�Ø—n‘n×-×-Ò-Ø—N‘N×+Ñ+×;Ñ;Ö=ñ *ð —‘×"Ñ" 1Ó% aÕ(×1Ñ1°$Ö7ñ ",‰nr7   c                	óŠ   € V P                   P                  \        P                  ! \        P
                  ! 4       4      4       R # r0   rú  rV   s   &r4   r†  ÚPipeliningTests.tearDownñ  rþ  r7   c                ól  € V P                   P                  R4       V P                  4        V P                  V P                  P                  4       RP                  R\        R\        V P                  ^ ,          P                  4       P                  4       4      : 24      R\        R\        V P                  ^,          P                  4       P                  4       4      : 24      R\        R\        V P                  ^,          P                  4       P                  4       4      : 24      .4      4       R	# )
zh
Test that pipelined FETCH commands which can be responded to
synchronously are responded to correctly.
s9   01 FETCH 1 BODY[]
02 FETCH 2 BODY[]
03 FETCH 3 BODY[]
r7   ó   * 1 FETCH (BODY[] )
ú 01 OK FETCH completed
{5}


ó   * 2 FETCH (BODY[] )
z 02 OK FETCH completed
{5}


s   * 3 FETCH (BODY[] )
z 03 OK FETCH completed
{5}


N)r  r"  rð  rC   rk  r—  r�   r)   r(   rk  rù	  r\   rV   s   &r4   Útest_synchronousFetchÚ%PipeliningTests.test_synchronousFetchô  sö   € ð 	�‰× Ñ ØVô	
ð 	×ÑÔà×ÑØ�N‰N× Ñ Ó"Ø�H‰Hà.Ý!ä'¨¯©°aÕ(8×(DÑ(DÓ(F×(KÑ(KÓ(MÕNðQóð /Ý!ä'¨¯©°aÕ(8×(DÑ(DÓ(F×(KÑ(KÓ(MÕNðQóð /Ý!ä'¨¯©°aÕ(8×(DÑ(DÓ(F×(KÑ(KÓ(MÕNðQóðóö	
r7   c                ó„  € V P                   P                  R4       \        P                  ! \        \        . RO4      4      pV P                  VR7       V P                  V P                  P                  4       RP                  R\        R\        V P                  ^ ,          P                  4       P                  4       4      : 24      .4      4       V P                  P!                  4        V P                   P#                  RR7       V P%                  V P                  P                  4       4       V P                  4        V P                  V P                  P                  4       RP                  RR	\        R
\        V P                  ^,          P                  4       P                  4       4      : 24      .4      4       R# )z~
When a server status change occurs during an ongoing FETCH
command, the server status is buffered until the FETCH
completes.
s   01 FETCH 1,2 BODY[]
T)rî  r7   rõ  z	{5}


)rm  r÷  s   * [READ-WRITE]
rö  N)TTF)r  r"  Ú	functoolsÚpartialÚnextr˜
  rð  rC   rk  r—  r�   r)   r(   rk  rù	  r\   r÷  ri  r�  )rF   Útwices   & r4   Útest_bufferedServerStatusÚ)PipeliningTests.test_bufferedServerStatus  sa  € ð 	�‰× Ñ Ð!;Ô<ô ×!Ò!¤$¬Ò-@Ó(AÓBˆØ×Ñ 5ÐÔ)à×ÑØ�N‰N× Ñ Ó"Ø�H‰Hð /å!ä'¨¯©°aÕ(8×(DÑ(DÓ(F×(KÑ(KÓ(MÕNðQóð	ó
ô	
ð 	�‰×ÑÔð 	�‰×Ñ¨$ÐÔ/ð 	×Ñ˜Ÿ™×-Ñ-Ó/Ô0à×ÑÔà×ÑØ�N‰N× Ñ Ó"Ø�H‰Hð /à)å!ä'¨¯©°aÕ(8×(DÑ(DÓ(F×(KÑ(KÓ(MÕNðQóð
óö	
r7   )rä  r  rk  )ry   rz   r{   r|   r[  r¤   rk  rƒ  rå  rð  r†  rø  rÿ  r}   r1   r7   r4   rá  rá  ¸  sk   † ññ
 	�R˜˜S $¨¨dÓ3Ù�R˜˜S $¨¨dÓ3Ù�R˜˜S $¨¨dÓ3ð€Hòò ñ %1ô 8ò"Lò!
öF5
r7   rá  c                  ó&   € ] tR tRtRtR tR tRtR# )ÚIMAP4ServerFetchTestsiO  zJ
This test case is for the FETCH tests that require
a C{StringTransport}.
c                	óÄ   € \        4       V n        \        P                  ! 4       V n        R V P                  n        V P                  P                  V P                  4       R# )r=  N)r   rk  r   rI  r  rì  rö  rV   s   &r4   rƒ  ÚIMAP4ServerFetchTests.setUpU  s>   € Ü(Ó*ˆŒÜ×'Ò'Ó)ˆŒØ$ˆ�‰ÔØ�‰×"Ñ" 4§>¡>Ö2r7   c                óZ  € V P                   P                  4        V P                  P                  R4       RpV P	                  V P                   P                  4       V4       V P                   P                  4        V P                  P                  \        P                  ! R4      4       R# )zà
If by any chance, extra bytes got appended at the end of a valid
FETCH arguments, the client should get a BAD - arguments invalid
response.

See U{RFC 3501<http://tools.ietf.org/html/rfc3501#section-6.4.5>},
section 6.4.5,
s   0001 FETCH 1 FULLL
s+   0001 BAD Illegal syntax: Invalid Argument
rÖ  N)	rk  r÷  r  r"  rC   r—  rû  r   rü  )rF   r—  s   & r4   Ú"test_fetchWithPartialValidArgumentÚ8IMAP4ServerFetchTests.test_fetchWithPartialValidArgument[  sw   € ð 	�‰×ÑÔà�‰× Ñ Ð!:Ô;ØCˆØ×Ñ˜Ÿ™×-Ñ-Ó/°Ô:Ø�‰×ÑÔØ�‰×"Ñ"¤5×#7Ò#7Ð8KÓ#LÖMr7   r°  N)ry   rz   r{   r|   r[  rƒ  r  r}   r1   r7   r4   r  r  O  s   † ñò
3öNr7   r  c                  ó8   € ] tR tRtRtR tR tR tR tR t	Rt
R	# )
ÚLiteralTestsMixinin  z{
Shared tests for literal classes.

@ivar literalFactory: A callable that returns instances of the
    literal under test.
c                ó:   € \         P                  ! 4       V n        R# )z
Shared setup.
N)r   r   r^  rV   s   &r4   rƒ  ÚLiteralTestsMixin.setUpv  s   € ô ŸšÓ(ˆŽr7   c                ó¶   € V P                  RV P                  4      pV P                  RVP                  R4      4       V P	                  V P                  4       R# )zM
The literal returns L{None} when given less data than the
literal requires.
rË  Ns
   incomplete)ÚliteralFactoryr^  rM
  rb   ÚassertNoResult)rF   Úliterals   & r4   Útest_partialWriteÚ#LiteralTestsMixin.test_partialWrite|  sC   € ð
 ×%Ñ% d¨D¯M©MÓ:ˆØ�‰�d˜GŸM™M¨-Ó8Ô9Ø×Ñ˜DŸM™MÖ*r7   c                óú   € RpV P                  \        V4      V P                  4      pVP                  V4      pV P	                  V\
        4       V P                  V4       V P                  V P                  4       R# )zb
The literal returns an empty L{bytes} instance when given
exactly the data the literal requires.
ó   completeN)r  rå   r^  rb   r  rN   r�  r  ©rF   Údatar  Úleftovers   &   r4   Útest_exactWriteÚ!LiteralTestsMixin.test_exactWrite…  sa   € ð
 ˆØ×%Ñ%¤c¨$£i°·±Ó?ˆØ—=‘= Ó&ˆà×Ñ˜h¬Ô.Ø×Ñ˜Ô"Ø×Ñ˜DŸM™MÖ*r7   c                óš   € RpV P                  \        R4      V P                  4      pVP                  V4      pV P	                  VR4       R# )z\
The literal returns any left over L{bytes} when given more
data than the literal requires.
s   completeleftoverr  ó   leftoverN)r  rå   r^  rb   rC   r  s   &   r4   Útest_overlongWriteÚ$LiteralTestsMixin.test_overlongWrite’  sB   € ð
 #ˆØ×%Ñ%¤c¨+Ó&6¸¿¹ÓFˆà—=‘= Ó&ˆà×Ñ˜ ;Ö/r7   c                ó†   € V P                  ^ V P                  4      pRpVP                  V4      pV P                  W24       R# )zW
The literal returns an empty L{bytes} instance
when given an empty L{bytes} instance.
r  N)r  r^  rb   rC   )rF   r  r  r  s   &   r4   Útest_emptyLiteralÚ#LiteralTestsMixin.test_emptyLiteralž  s;   € ð
 ×%Ñ% a¨¯©Ó7ˆØˆà—=‘= Ó&ˆà×Ñ˜Ö(r7   )r^  N)ry   rz   r{   r|   r[  rƒ  r  r  r  r  r}   r1   r7   r4   r	  r	  n  s    † ñò)ò+ò+ò
0ö
)r7   r	  c                  ó8   € ] tR tRtRt]P                  tR tRt	R# )ÚLiteralStringTestsi«  z#
Tests for L{self.literalFactory}.
c                ó&  € RpRp\         P                  ! \        V4      V P                  4      p\	        V4       F  pVP                  V4       K  	  VP                  R4       V P                  V P                  4      pV P                  WQV34       R# )z¹
Calling L{imap4.LiteralString.callback} with a line fires the
instance's L{Deferred} with a 2-L{tuple} whose first element
is the collected data and whose second is the provided line.
ó   datar_  N)	r   ÚLiteralStringrå   r^  r'   rb   rc  rÚ  rC   )rF   r  Úextrar  rŸ   r2   s   &     r4   Útest_callbackÚ LiteralStringTests.test_callback²  sx   € ð ˆØˆä×%Ò%¤c¨$£i°·±Ó?ˆä˜4–ˆAØ�M‰M˜!Öñ !ð 	×Ñ˜Ô"à×%Ñ% d§m¡mÓ4ˆØ×Ñ˜¨ Ö/r7   r1   N)
ry   rz   r{   r|   r[  r   r$  r  r&  r}   r1   r7   r4   r!  r!  «  s   † ñð ×(Ñ(€Nö0r7   r!  c                  ó>   € ] tR tRtRt]P                  tR tR t	Rt
R# )ÚLiteralFileTestsiÆ  z!
Tests for L{imap4.LiteralFile}.
c                ó~  € RpRp\         P                  ! \        V4      V P                  4      p\	        V4       F  pVP                  V4       K  	  VP                  R4       V P                  V P                  4      pV P                  \        V4      ^4       Vw  rbV P                  VP                  4       R4       R# )z­
Calling L{imap4.LiteralFile.callback} with a line fires the
instance's L{Deferred} with a 2-L{tuple} whose first element
is the file and whose second is the provided line.
r#  r_  N)
r   ÚLiteralFilerå   r^  r'   rb   rc  rÚ  rC   r\   ©rF   r  r%  r  rŸ   r2   ÚdataFiles   &      r4   r&  ÚLiteralFileTests.test_callbackÍ  s—   € ð ˆØˆä×#Ò#¤C¨£I¨t¯}©}Ó=ˆä˜4–ˆAØ�M‰M˜!Öñ !ð 	×Ñ˜Ô"à×%Ñ% d§m¡mÓ4ˆØ×Ñœ˜V› aÔ(à ‰ˆØ×Ñ˜Ÿ™›¨'Ö2r7   c                óÀ  € RpRpV P                  \        P                  R^4       \        P                  ! \        V4      V P                  4      p\        V4       F  pVP                  V4       K  	  VP                  R4       V P                  V P                  4      pV P                  \        V4      ^4       Vw  rbV P                  VP                  4       R4       R# )a  
A L{imap4.LiteralFile} whose size exceeds the maximum
in-memory size spools its content to disk, and invoking its
L{callback} with a line fires the instance's L{Deferred} with
a 2-L{tuple} whose first element is the spooled file and whose second
is the provided line.
r#  r_  Ú_memoryFileLimitN)rÎ  r   r+  rå   r^  r'   rb   rc  rÚ  rC   r\   r,  s   &      r4   Útest_callbackSpooledToDiskÚ+LiteralFileTests.test_callbackSpooledToDiskã  s®   € ð ˆØˆà�
‰
”5×$Ñ$Ð&8¸!Ô<ä×#Ò#¤C¨£I¨t¯}©}Ó=ˆä˜4–ˆAØ�M‰M˜!Öñ !ð 	×Ñ˜Ô"à×%Ñ% d§m¡mÓ4ˆØ×Ñœ˜V› aÔ(à ‰ˆØ×Ñ˜Ÿ™›¨'Ö2r7   r1   N)ry   rz   r{   r|   r[  r   r+  r  r&  r1  r}   r1   r7   r4   r)  r)  Æ  s   † ñð ×&Ñ&€Nò3ö,3r7   r)  c                  ó>   € ] tR tRtRtR tR tR tR tR t	R t
R	tR
# )ÚWriteBufferTestsiþ  z!
Tests for L{imap4.WriteBuffer}.
c                	ó$   € \        4       V n        R # r0   )r   rk  rV   s   &r4   rƒ  ÚWriteBufferTests.setUp  s   € Ü(Ó*ˆŽr7   c                óà   € \         P                  ! V P                  4      pRVP                  ,          pVP	                  V4       V P                  V P                  P                  4       4       R# )zL
L{imap4.WriteBuffer} buffers writes that are smaller than its
buffer size.
rd  N)r   ÚWriteBufferrk  Ú
bufferSizerb   r�  r—  ©rF   Úbufr  s   &  r4   r  Ú"WriteBufferTests.test_partialWrite  sL   € ô
 ×Ò §¡Ó/ˆØ�c—n‘nÕ$ˆà�	‰	�$Œà×Ñ˜Ÿ™×-Ñ-Ó/Ö0r7   c                óð   € \         P                  ! V P                  4      pRVP                  ^,           ,          pVP	                  V4       V P                  V P                  P                  4       V4       R# )zq
L{imap4.WriteBuffer} writes data without buffering it when
the size of the data exceeds the size of its buffer.
rd  N)r   r8  rk  r9  rb   rC   r—  r:  s   &  r4   r  Ú#WriteBufferTests.test_overlongWrite  sS   € ô
 ×Ò §¡Ó/ˆØ�s—~‘~¨Õ)Õ*ˆà�	‰	�$Œà×Ñ˜Ÿ™×-Ñ-Ó/°Ö6r7   c                óf  € \         P                  ! V P                  4      pRVP                  ,          pRpVP	                  V4       V P                  V P                  P                  4       4       VP	                  V4       V P                  V P                  P                  4       W#,           4       R# )zX
L{imap4.WriteBuffer} buffers writes until its buffer's size
exceeds its maximum value.
rd  ó   yN)r   r8  rk  r9  rb   r�  r—  rC   )rF   r;  Ú	firstDataÚ
secondDatas   &   r4   Útest_writesImplyFlushÚ&WriteBufferTests.test_writesImplyFlush  s~   € ô
 ×Ò §¡Ó/ˆØ˜3Ÿ>™>Õ)ˆ	Øˆ
à�	‰	�)Ôà×Ñ˜Ÿ™×-Ñ-Ó/Ô0à�	‰	�*Ôà×Ñ˜Ÿ™×-Ñ-Ó/°Õ1GÖHr7   c                óT  € \         P                  ! V P                  4      pRVP                  ,          pVP	                  V4       V P                  V P                  P                  4       4       VP                  4        V P                  V P                  P                  4       V4       R# )zc
L{imap4.WriteBuffer.flush} flushes the buffer even when its
size is smaller than the buffer size.
rd  N)	r   r8  rk  r9  rb   r�  r—  ÚflushrC   r:  s   &  r4   Útest_explicitFlushÚ#WriteBufferTests.test_explicitFlush/  sr   € ô
 ×Ò §¡Ó/ˆØ�s—~‘~Õ&ˆà�	‰	�$Œà×Ñ˜Ÿ™×-Ñ-Ó/Ô0à�	‰	Œà×Ñ˜Ÿ™×-Ñ-Ó/°Ö6r7   c                ó¸   € \         P                  ! V P                  4      pVP                  4        V P	                  V P                  P                  4       4       R# )zG
L{imap4.WriteBuffer.flush} has no effect if when the buffer is
empty.
N)r   r8  rk  rF  r�  r—  )rF   r;  s   & r4   Útest_explicitFlushEmptyBufferÚ.WriteBufferTests.test_explicitFlushEmptyBuffer?  s<   € ô
 ×Ò §¡Ó/ˆà�	‰	Œà×Ñ˜Ÿ™×-Ñ-Ó/Ö0r7   )rk  N)ry   rz   r{   r|   r[  rƒ  r  r  rC  rG  rJ  r}   r1   r7   r4   r4  r4  þ  s&   † ñò+ò
1ò
7òIò"7ö 	1r7   r4  )�r[  Ú
__future__r   r#  rZ   rû  rÇ
  r¬  rË   Úcollectionsr   Úior   Ú	itertoolsr   Útypingr   r   r	   Úunittestr
   Úzope.interfacer   Úzope.interface.verifyr   r   Útwisted.cred.checkersr   Útwisted.cred.credentialsr   r   r   Útwisted.cred.errorr   Útwisted.cred.portalr   r   Útwisted.internetr   r   r   r   Útwisted.internet.deferr   Útwisted.internet.taskr   Útwisted.internet.testingr   r   Útwisted.mailr   Útwisted.mail.imap4r   Útwisted.mail.interfacesr    r!   r"   Útwisted.protocolsr#   Útwisted.pythonr$   r%   r&   Útwisted.python.compatr'   r(   r)   Útwisted.trial.unittestr*   r+   Útwisted.test.ssl_helpersr,   r-   ÚImportErrorr8   r:   r   r‘   rÙ   r]  ÚIMailboxInfoÚIMailboxÚICloseableMailboxr«  r  ÚMemoryAccountWithoutNamespacesr4  r<  r@  rI  rC  r]  r[  rz  r›  rô  r²  rJ  rù  r  rÐ  rÞ  r0  rN  rT  rÈ  rÍ  r	  r	  r	  r	  r1	  r‹	  rÂ	  rÌ	  rã	  ÚIMessageÚFancyStrMixinr¤   r	
  r1
  r�
  ro  ÚISearchableMailboxr´  rì  ÚIMessageFilerô  ÚIMessageCopierrý  r  ÚIReactorSSLr  rx  r  rÔ  rÛ  rá  r  r	  r!  r)  r4  r1   r7   r4   Ú<module>ro     s  ðñõ #ã Û Û Û Û 	Û Ý #Ý Ý ß &Ñ &Ý å &ß ;å I÷ñ õ
 1ß .ß >Ó >Ý +Ý 'ß VÝ Ý )÷ñ õ
 'ß -Ñ -ß HÑ Hß @ðßKò#ôb;�Xô b;÷Jñ ô"d)Ð.ô d)ôNHVÐ)ô HVôV
C+�xô C+ñL ˆU×Ñ §¡°×1HÑ1HÓI÷Pð Pó JðPñf ˆU×Ñ §¡Ó0÷Tð Tó 1ðTôn˜u×CÑCô ô"Ð&¨×(;Ñ(;ô ô3�5×$Ñ$ô 3ô,(�5×$Ñ$ô (÷,.,ñ .,ôb@/Ð'¨ô @/ôFa2Ð1ô a2ôHdXÐ-¨xô dXñN ˆVÓ÷@ð @ó ð@÷:"ñ "ô"h4Ð)¨8ô h4ôV/
�Xô /
ôddTÐ/°ô dTôNL"˜Hô L"ô^
$˜×*Ñ*ô 
$ôLÐ'¨ô L÷^Bñ Bô6EIÐ1ô EIôPÐ1Ð3Fô ô(Ð0Ð2Eô ô*+=Ð5Ð7Jô +=ô\/=Ð4Ð6Iô /=ôd\
Ð3Ð5Hô \
ô~JTÐ3°Xô JTôZ,=Ð4Ð6Iô ,=ô^KSÐ2Ð4Gô KSô\�%×#Ñ#ô ñ ˆU�^‰^Óô$"�4×%Ñ%ó $"ó ð$"ôN?!�HÐ.ô ?!ôDa
˜Hô a
ôHK%�HÐ.ô K%ô\sÐ)¨8ô sñl ˆU×%Ñ%Ó&ôX˜HÐ&6ó Xó 'ðX÷v#ñ #ñ ˆU×ÑÓ ÷ ð  ó !ð ñ ˆU×!Ò!Ó"÷ð ó #ðôN%�hô N%ñb ÐÔÐ3Ó4ÙˆJ×"Ó" 7¨DÓ1Ô1Ð3PÓQôU2Ð ó U2ó Ró 5ðU2ôp�-ô ôÐ# Xô ôD	˜ô 	÷.ñ .ôT
�hô T
ônN˜Hô N÷>:)ñ :)ôz0Ð*Ð,?ô 0ô653Ð(¨(ô 53ôpJ1Ð*ö J1øðSv ô ØÐØÓðús   ÃQ! Ñ!Q0Ñ/Q0