+
    üÐjšc  ã                   óÊ  € R t ^ RIHtHt ^ RIHtHt ^ RIHt ^ RI	H
t
  ^ RIHt ^ RIHt RR	P!                  R
R4      ,           tRP!                  R
R4      tRP!                  R
R4      tRP!                  R
R4      tRP!                  R
R4      tRP!                  R
R4      tRP!                  R
R4      tRP!                  R
R4      t ! R R4      t ! R R]
P4                  4      t ! R R]4      t ! R R]
P4                  4      t ! R R]
P4                  4      t ! R R]
P4                  4      t ! R R ]
P4                  4      t ]! ]PB                  4       ! R! R"4      4       t"]! ]PB                  4       ! R# R$4      4       t# ! R% R&]
P4                  4      t$ ! R' R(]
P4                  4      t% ! R) R*]PL                  4      t' ! R+ R,]
P4                  4      t(R#   ] d    Rt EL»i ; i)-z(
Session Initialization Protocol tests.
)ÚcheckersÚportal)ÚdeferÚreactor)Úsip)Úunittest)ÚAsyncioSelectorReactorN)Úimplementerz


z?INVITE sip:foo SIP/2.0
From: mo
To: joe
Content-Length: 4

abcdÚ
z
z-INVITE sip:foo SIP/2.0
From: mo
To: joe

1234zHINVITE sip:foo SIP/2.0
From: mo
To: joe
Content-Length: 4

1234

lalalalz½INVITE sip:foo SIP/2.0
From: mo
To: joe
Content-Length: 0

INVITE sip:loop SIP/2.0
From: foo
To: bar
Content-Length: 4

abcdINVITE sip:loop SIP/2.0
From: foo
To: bar
Content-Length: 4

1234z4SIP/2.0 200 OK
From:  foo
To:bar
Content-Length: 0

z.INVITE sip:foo SIP/2.0
f: mo
t: joe
l: 4

abcdz=INVITE sip:foo SIP/2.0
Via: SIP/2.0/UDP 10.0.0.1:5060;rport

aý  SIP/2.0 200 OK
Via: SIP/2.0/UDP server10.biloxi.com
    ;branch=z9hG4bKnashds8;received=192.0.2.3
Via: SIP/2.0/UDP bigbox3.site3.atlanta.com
    ;branch=z9hG4bK77ef4c2312983.1;received=192.0.2.2
Via: SIP/2.0/UDP pc33.atlanta.com
    ;branch=z9hG4bK776asdhds ;received=192.0.2.1
To: Bob <sip:bob@biloxi.com>;tag=a6c85cf
From: Alice <sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710@pc33.atlanta.com
CSeq: 314159 INVITE
Contact: <sip:bob@192.0.2.4>
Content-Type: application/sdp
Content-Length: 0

c                   ó&   a € ] tR t^~t o R tRtV tR# )Ú	TestRealmc                ó*   € \         P                  R R 3# )Nc                  ó   € R # ©N© r   ó    Ú7/usr/lib/python3/dist-packages/twisted/test/test_sip.pyÚ<lambda>Ú)TestRealm.requestAvatar.<locals>.<lambda>€   s   € ©4r   )r   ÚIContact)ÚselfÚavatarIdÚmindÚ
interfacess   &&&*r   ÚrequestAvatarÚTestRealm.requestAvatar   s   € Ü�|‰|˜T¡<Ð/Ð/r   r   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r   Ú__static_attributes__Ú__classdictcell__©Ú__classdict__s   @r   r   r   ~   s   ø‡ € ÷0ð 0r   r   c                   ó\   a € ] tR t^ƒt o R tR tR tR tR tR t	R t
R tR	 tR
 tRtV tR# )ÚMessageParsingTestsc                ór   € . V n         \        P                  ! V P                   P                  4      V n        R # r   )Úlr   ÚMessagesParserÚappendÚparser©r   s   &r   ÚsetUpÚMessageParsingTests.setUp„   s#   € ØˆŒÜ×(Ò(¨¯©¯©Ó7ˆŽr   c                óp   € V P                   P                  V4       V P                   P                  4        R # r   ©r*   ÚdataReceivedÚdataDone)r   Úmessages   &&r   ÚfeedMessageÚMessageParsingTests.feedMessageˆ   s$   € Ø�‰× Ñ  Ô)Ø�‰×ÑÖr   c                ó:  € V P                  VP                  V4       V P                  VP                  P                  4       V4       V P                  VP                  V4       V P                  VP
                  V4       V P                  VP                  ^4       R# )z
Validate Requests.
N)ÚassertEqualÚmethodÚuriÚtoStringÚheadersÚbodyÚfinished)r   Úmr7   r8   r:   r;   s   &&&&&&r   ÚvalidateMessageÚ#MessageParsingTests.validateMessageŒ   so   € ð 	×Ñ˜Ÿ™ 6Ô*Ø×Ñ˜Ÿ™Ÿ™Ó)¨3Ô/Ø×Ñ˜Ÿ™ GÔ,Ø×Ñ˜Ÿ™ Ô&Ø×Ñ˜Ÿ™ QÖ'r   c                óÈ   € V P                   pV P                  \        4       V P                  \	        V4      ^4       V P                  V^ ,          RRRR.RR.RR./R	4       R
# ©é   ÚINVITEúsip:fooÚfromÚmoÚtoÚjoeúcontent-lengthÚ4ÚabcdN)r'   r3   Úrequest1r6   Úlenr>   ©r   r'   s   & r   Ú
testSimpleÚMessageParsingTests.testSimple–   ób   € Ø�F‰FˆØ×ÑœÔ"Ø×Ñœ˜Q› Ô#Ø×ÑØˆa�DØØØ�d�V˜T E 7Ð,<¸s¸eÐDØö	
r   c                ó6  € V P                   pV P                  \        4       V P                  \        4       V P	                  \        V4      ^4       V P                  V^ ,          RRRR.RR.RR./R	4       V P                  V^,          RRRR.RR./R
4       R# )é   rC   rD   rE   rF   rG   rH   rI   rJ   rK   Ú1234N)r'   r3   rL   Úrequest2r6   rM   r>   rN   s   & r   ÚtestTwoMessagesÚ#MessageParsingTests.testTwoMessages¢   sœ   € Ø�F‰FˆØ×ÑœÔ"Ø×ÑœÔ"Ø×Ñœ˜Q› Ô#Ø×ÑØˆa�DØØØ�d�V˜T E 7Ð,<¸s¸eÐDØô	
ð 	×ÑØˆa�D�(˜I¨°°¸¸u¸gÐ'FÈö	
r   c                óÈ   € V P                   pV P                  \        4       V P                  \	        V4      ^4       V P                  V^ ,          RRRR.RR.RR./R	4       R
# )rB   rC   rD   rE   rF   rG   rH   rI   rJ   rT   N)r'   r3   Úrequest3r6   rM   r>   rN   s   & r   ÚtestGarbageÚMessageParsingTests.testGarbage²   rQ   r   c                ó\  € V P                   pV P                  \        4       V P                  \	        V4      ^4       V P                  V^ ,          RRRR.RR.RR./R	4       V P                  V^,          RR
RR.RR.RR./R4       V P                  V^,          RR
RR.RR.RR./R4       R# )é   rC   rD   rE   rF   rG   rH   rI   Ú0Ú zsip:loopÚfooÚbarrJ   rK   rT   N)r'   r3   Úrequest4r6   rM   r>   rN   s   & r   ÚtestThreeInOneÚ"MessageParsingTests.testThreeInOne¾   sÐ   € Ø�F‰FˆØ×ÑœÔ"Ø×Ñœ˜Q› Ô#Ø×ÑØˆa�DØØØ�d�V˜T E 7Ð,<¸s¸eÐDØô	
ð 	×ÑØˆa�DØØØ�e�W˜d U GÐ-=À¸uÐEØô	
ð 	×ÑØˆa�DØØØ�e�W˜d U GÐ-=À¸uÐEØö	
r   c                óÈ   € V P                   pV P                  \        4       V P                  \	        V4      ^4       V P                  V^ ,          RRRR.RR.RR./R	4       R
# rA   )r'   r3   Úrequest_shortr6   rM   r>   rN   s   & r   Ú	testShortÚMessageParsingTests.testShortØ   sb   € Ø�F‰FˆØ×ÑœÔ'Ø×Ñœ˜Q› Ô#Ø×ÑØˆa�DØØØ�d�V˜T E 7Ð,<¸s¸eÐDØö	
r   c           	     óº  € V P                   pV P                  \        4       V P                  \	        V4      ^4       V^ ,          pV P                  VP
                  ^È4       V P                  VP                  R4       V P                  VP                  RR.RR.RR./4       V P                  VP                  R4       V P                  VP                  ^4       R	# )
rB   ÚOKrE   r`   rG   ra   rI   r^   r_   N)
r'   r3   Ú	response1r6   rM   ÚcodeÚphraser:   r;   r<   ©r   r'   r=   s   &  r   ÚtestSimpleResponseÚ&MessageParsingTests.testSimpleResponseä   s³   € Ø�F‰FˆØ×ÑœÔ#Ø×Ñœ˜Q› Ô#Øˆa�DˆØ×Ñ˜Ÿ™ Ô%Ø×Ñ˜Ÿ™ 4Ô(Ø×ÑØ�I‰I˜  ¨°¨wÐ8HÈ3È%ÐPô	
ð 	×Ñ˜Ÿ™ Ô$Ø×Ñ˜Ÿ™ QÖ'r   c                óŒ  € V P                   pV P                  \        4       V P                  \	        V4      ^4       V^ ,          pV P                  VP
                  R,          ^ ,          R4       V P                  VP
                  R,          ^,          R4       V P                  VP
                  R,          ^,          R4       R# )z^
A header may be split across multiple lines.  Subsequent lines begin
with C{" "} or C{"\t"}.
ÚviazHSIP/2.0/UDP server10.biloxi.com;branch=z9hG4bKnashds8;received=192.0.2.3zVSIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1;received=192.0.2.2zHSIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bK776asdhds ;received=192.0.2.1N)r'   r3   Úresponse_multiliner6   rM   r:   rn   s   &  r   Útest_multiLineÚ"MessageParsingTests.test_multiLineñ   s©   € ð
 �F‰FˆØ×ÑÔ+Ô,Ø×Ñœ˜Q› Ô#Øˆa�DˆØ×ÑØ�I‰I�eÕ˜QÕð7ô	
ð
 	×ÑØ�I‰I�eÕ˜QÕð?ô	
ð
 	×ÑØ�I‰I�eÕ˜QÕð:ö	
r   )r'   r*   N)r   r   r   r   r,   r3   r>   rO   rV   rZ   rc   rg   ro   rt   r    r!   r"   s   @r   r%   r%   ƒ   s<   ø‡ € ò8òò(ò

ò
ò 

ò
ò4

ò(÷
ð 
r   r%   c                   ó*   a € ] tR tRt o RtR tRtV tR# )Ú%MessageParsingFeedDataCharByCharTestsi  z1
Same as base class, but feed data char by char.
c                ó‚   € V F  pV P                   P                  V4       K   	  V P                   P                  4        R # r   r/   )r   r2   Úcs   && r   r3   Ú1MessageParsingFeedDataCharByCharTests.feedMessage  s.   € ÛˆAØ�K‰K×$Ñ$ QÖ'ñ à�‰×ÑÖr   r   N)r   r   r   r   Ú__doc__r3   r    r!   r"   s   @r   rw   rw     s   ø‡ € ñ÷ð r   rw   c                   ó2   a € ] tR tRt o R tR tR tRtV tR# )ÚMakeMessageTestsi  c                ó˜   € \         P                  ! R R4      pVP                  RR4       V P                  VP	                  4       R4       R# )rC   rD   r`   ra   z$INVITE sip:foo SIP/2.0
Foo: bar

N)r   ÚRequestÚ	addHeaderr6   r9   ©r   Úrs   & r   ÚtestRequestÚMakeMessageTests.testRequest  s7   € Ü�KŠK˜ )Ó,ˆØ	�‰�E˜5Ô!Ø×Ñ˜Ÿ™›Ð'SÖTr   c                óÞ   € \         P                  ! ^ÈR4      pVP                  RR4       VP                  RR4       VP                  R4       V P	                  VP                  4       R4       R# )	éÈ   rj   r`   ra   zContent-LengthrJ   rT   z3SIP/2.0 200 OK
Foo: bar
Content-Length: 4

1234N)r   ÚResponser€   ÚbodyDataReceivedr6   r9   r�   s   & r   ÚtestResponseÚMakeMessageTests.testResponse  sW   € Ü�LŠL˜˜dÓ#ˆØ	�‰�E˜5Ô!Ø	�‰Ð$ cÔ*Ø	×Ñ˜6Ô"Ø×ÑØ�J‰J‹LÐWö	
r   c                ór   € \         P                  ! ^È4      pV P                  VP                  4       R4       R# )r†   zSIP/2.0 200 OK

N)r   r‡   r6   r9   r�   s   & r   ÚtestStatusCodeÚMakeMessageTests.testStatusCode%  s'   € Ü�LŠL˜ÓˆØ×Ñ˜Ÿ™›Ð'?Ö@r   r   N)	r   r   r   r   rƒ   r‰   rŒ   r    r!   r"   s   @r   r}   r}     s   ø‡ € òUò

÷Að Ar   r}   c                   ó\   a € ] tR tRt o R tR tR tR tR tR t	R t
R	 tR
 tR tRtV tR# )ÚViaTestsi*  c                óŽ   € VP                  4       pV P                  V\        P                  ! V4      P                  4       4       R # r   )r9   r6   r   ÚparseViaHeader)r   ÚvÚss   && r   ÚcheckRoundtripÚViaTests.checkRoundtrip+  s1   € Ø�J‰J‹LˆØ×Ñ˜œC×.Ò.¨qÓ1×:Ñ:Ó<Ö=r   c                óB  € \         P                  ! R 4      p\         P                  ! R4      pV P                  VP                  VP                  4       V P                  VP                  VP                  4       V P                  VP
                  VP
                  4       R# )zSIP/2.0/UDP 192.168.1.1:5060z SIP/2.0/UDP     192.168.1.1:5060N)r   r‘   r6   Ú	transportÚhostÚport)r   Úv1Úv2s   &  r   ÚtestExtraWhitespaceÚViaTests.testExtraWhitespace/  sl   € Ü×ÒÐ >Ó?ˆÜ×ÒÐ BÓCˆØ×Ñ˜Ÿ™ r§|¡|Ô4Ø×Ñ˜Ÿ™ "§'¡'Ô*Ø×Ñ˜Ÿ™ "§'¡'Ö*r   c                óÂ  € Rp\         P                  ! V4      pV P                  VP                  R4       V P                  VP                  R4       V P                  VP
                  R4       V P                  VP                  4       V P                  VP                  4       V P                  VP                  4       V P                  VP                  ^4       V P                  VP                  R4       V P                  VP                  R4       V P                  VP                  ^ 4       V P                  VP                  4       R4       V P!                  V4       R# )	z3
Test parsing a Via header with one of everything.
zVSIP/2.0/UDP first.example.com:4000;ttl=16;maddr=224.2.0.1 ;branch=a7c6a8dlze (Example)ÚUDPzfirst.example.comi   z	224.2.0.1Ú
a7c6a8dlzezKSIP/2.0/UDP first.example.com:4000;ttl=16;branch=a7c6a8dlze;maddr=224.2.0.1N)r   r‘   r6   r—   r˜   r™   ÚassertIsNoneÚrportÚ
rportValueÚassertFalseÚrportRequestedÚttlÚmaddrÚbranchÚhiddenr9   r”   ©r   r“   r’   s   &  r   Útest_complexÚViaTests.test_complex6  s  € ð
,ð 	
ô ×Ò˜qÓ!ˆØ×Ñ˜Ÿ™ eÔ,Ø×Ñ˜Ÿ™Ð!4Ô5Ø×Ñ˜Ÿ™ Ô&Ø×Ñ˜!Ÿ'™'Ô"Ø×Ñ˜!Ÿ,™,Ô'Ø×Ñ˜×)Ñ)Ô*Ø×Ñ˜Ÿ™ Ô#Ø×Ñ˜Ÿ™ +Ô.Ø×Ñ˜Ÿ™ <Ô0Ø×Ñ˜Ÿ™ 1Ô%Ø×ÑØ�J‰J‹Lð8ô	
ð
 	×Ñ˜AÖr   c                óº  € Rp\         P                  ! V4      pV P                  VP                  R4       V P                  VP                  R4       V P                  VP
                  R4       V P                  VP                  4       V P                  VP                  4       V P                  VP                  4       V P                  VP                  4       V P                  VP                  4       V P                  VP                  4       V P                  VP                  4       V P                  VP!                  4       R4       V P#                  V4       R# )z#
Test parsing a simple Via header.
zSIP/2.0/UDP example.com;hiddenrŸ   úexample.coméÄ  z#SIP/2.0/UDP example.com:5060;hiddenN)r   r‘   r6   r—   r˜   r™   r¡   r¢   r£   r¤   r¥   r¦   r§   r¨   Ú
assertTruer©   r9   r”   rª   s   &  r   Útest_simpleÚViaTests.test_simpleP  sø   € ð -ˆÜ×Ò˜qÓ!ˆØ×Ñ˜Ÿ™ eÔ,Ø×Ñ˜Ÿ™ Ô/Ø×Ñ˜Ÿ™ Ô&Ø×Ñ˜!Ÿ'™'Ô"Ø×Ñ˜!Ÿ,™,Ô'Ø×Ñ˜×)Ñ)Ô*Ø×Ñ˜!Ÿ%™%Ô Ø×Ñ˜!Ÿ'™'Ô"Ø×Ñ˜!Ÿ(™(Ô#Ø�‰˜Ÿ™Ô!Ø×Ñ˜Ÿ™›Ð'LÔMØ×Ñ˜AÖr   c                óT   € \         P                  ! R 4      pV P                  V4       R# )r®   N)r   ÚViar”   ©r   r’   s   & r   ÚtestSimplerÚViaTests.testSimplerc  s   € Ü�GŠG�MÓ"ˆØ×Ñ˜AÖr   c                ó  € \         P                  ! RRR7      pV P                  V P                  .R7      pV P	                  \        V4      ^4       V P	                  V^ ,          R,          R4       V P	                  V^ ,          R,          \        4       V P	                  VP                  4       R4       V P                  VP                  4       V P                  VP                  4       V P                  VP                  4       R	# )
zd
Setting rport to True is deprecated, but still produces a Via header
with the expected properties.
úfoo.barT©r¢   ©ÚoffendingFunctionsr2   ú+rport=True is deprecated since Twisted 9.0.ÚcategoryúSIP/2.0/UDP foo.bar:5060;rportN)r   r´   ÚflushWarningsÚtest_deprecatedRPortr6   rM   ÚDeprecationWarningr9   r°   r¢   r¥   r¡   r£   )r   r’   Úwarningss   &  r   rÁ   ÚViaTests.test_deprecatedRPortg  sÈ   € ô
 �GŠG�I TÔ*ˆà×%Ñ%¸$×:SÑ:SÐ9TÐ%ÓUˆØ×Ñœ˜X›¨Ô*Ø×ÑØ�Q�K˜	Õ"Ð$Qô	
ð 	×Ñ˜ !� ZÕ0Ô2DÔEà×Ñ˜Ÿ™›Ð'GÔHØ�‰˜Ÿ™Ô Ø�‰˜×(Ñ(Ô)Ø×Ñ˜!Ÿ,™,Ö'r   c                óâ   € \         P                  ! RRR7      pV P                  VP                  4       R4       V P	                  VP
                  4       V P                  VP                  4       R# )zE
An rport setting of None should insert the parameter with no value.
r¹   Nrº   r¿   )r   r´   r6   r9   r°   r¥   r¡   r£   rµ   s   & r   Ú
test_rportÚViaTests.test_rportz  sO   € ô �GŠG�I TÔ*ˆØ×Ñ˜Ÿ™›Ð'GÔHØ�‰˜×(Ñ(Ô)Ø×Ñ˜!Ÿ,™,Ö'r   c                ó  € \         P                  ! R^R7      pV P                  VP                  4       R4       V P	                  VP
                  4       V P                  VP                  ^4       V P                  VP                  ^4       R# )zS
An rport numeric setting should insert the parameter with the number
value given.
r¹   rº   z SIP/2.0/UDP foo.bar:5060;rport=1N)r   r´   r6   r9   r¤   r¥   r£   r¢   rµ   s   & r   Útest_rportValueÚViaTests.test_rportValueƒ  sg   € ô
 �GŠG�I QÔ'ˆØ×Ñ˜Ÿ™›Ð'IÔJØ×Ñ˜×)Ñ)Ô*Ø×Ñ˜Ÿ™ qÔ)Ø×Ñ˜Ÿ™ !Ö$r   c                ó¬  € R p\         P                  ! V4      pV P                  VP                  R4       V P                  VP                  R4       V P                  VP
                  R4       V P                  VP                  R4       V P                  VP                  R4       V P                  VP                  4       P                  R4      R4       R# )	z8SIP/2.0/UDP 10.0.0.1:5060;received=22.13.1.5;rport=12345rŸ   ú10.0.0.1r¯   z	22.13.1.5i90  zrport=12345Néÿÿÿÿ)r   r‘   r6   r—   r˜   r™   Úreceivedr¢   ÚassertNotEqualr9   Úfindrª   s   &  r   ÚtestNATÚViaTests.testNATŽ  sœ   € ØFˆÜ×Ò˜qÓ!ˆØ×Ñ˜Ÿ™ eÔ,Ø×Ñ˜Ÿ™ Ô,Ø×Ñ˜Ÿ™ Ô&Ø×Ñ˜Ÿ™ [Ô1Ø×Ñ˜Ÿ™ %Ô(à×Ñ˜AŸJ™J›L×-Ñ-¨mÓ<¸bÖAr   c                óv   € Rp\         P                  ! V4      pV P                  VP                  4       V4       R# )zJ
Parsing and serializing Via headers with unknown parameters should work.
z?SIP/2.0/UDP example.com:5060;branch=a12345b;bogus;pie=deliciousN)r   r‘   r6   r9   rª   s   &  r   Útest_unknownParamsÚViaTests.test_unknownParams™  s0   € ð NˆÜ×Ò˜qÓ!ˆØ×Ñ˜Ÿ™› qÖ)r   r   N)r   r   r   r   r”   rœ   r«   r±   r¶   rÁ   rÆ   rÉ   rÑ   rÔ   r    r!   r"   s   @r   r�   r�   *  s=   ø‡ € ò>ò+òò4ò&ò(ò&(ò	%ò	B÷*ð *r   r�   c                   ó,   a € ] tR tRt o R tR tRtV tR# )ÚURLTestsi¢  c                ó€   € R F7  pV P                  \        P                  ! V4      P                  4       V4       K9  	  R# )úsip:j.doe@big.comN)rÙ   z&sip:j.doe:secret@big.com;transport=tcpz!sip:j.doe@big.com?subject=projectzsip:example.com)r6   r   ÚparseURLr9   )r   Úurls   & r   ÚtestRoundtripÚURLTests.testRoundtrip£  s2   € ó
ˆCð ×ÑœSŸ\š\¨#Ó.×7Ñ7Ó9¸3Ö?ó
r   c                ó¬   € R p\         P                  ! V4      pR
RRRRRRRRRRR.3RRRRR/33 F   w  r4V P                  \        W#4      V4       K"  	  R	# )zesip:user:pass@hosta:123;transport=udp;user=phone;method=foo;ttl=12;maddr=1.2.3.4;blah;goo=bar?a=b&c=dÚotherÚblahzgoo=barr:   ÚaÚbry   ÚdN)ÚusernameÚuser)ÚpasswordÚpass)r˜   Úhosta)r™   é{   )r—   Úudp)ÚusertypeÚphone)r7   r`   )r¦   é   )r§   ú1.2.3.4)r   rÚ   r6   Úgetattr)r   r“   rÛ   Úkr’   s   &    r   ÚtestComplexÚURLTests.testComplex¬  sx   € ð8ð 	
ô �lŠl˜1‹oˆà Ø ØØØ Ø!ØØØ Ø�v˜yÐ)Ð*Ø˜˜c 3¨Ð,Ð-ó
‰DˆAð ×ÑœW S›_¨aÖ0ó
r   r   N)r   r   r   r   rÜ   rñ   r    r!   r"   s   @r   r×   r×   ¢  s   ø‡ € ò@÷1ð 1r   r×   c                   ó&   a € ] tR tRt o R tRtV tR# )Ú
ParseTestsiÂ  c                ó  € R RR/ 3RRR/ 3RRR/ 3RRR/ 3RRRR	R
RR/33 Fa  w  rr4\         P                  ! V4      w  rVpV P                  W%4       V P                  VP                  4       V4       V P                  Wt4       Kc  	  R# )z""A. G. Bell" <sip:foo@example.com>z
A. G. Bellzsip:foo@example.comzAnon <sip:foo@example.com>ÚAnonr_   z<sip:foo@example.com>z)foo <sip:foo@example.com>;tag=bar;foo=bazr`   Útagra   ÚbazN)r   ÚparseAddressr6   r9   )r   ÚaddressÚnameÚurlsÚparamsÚgnameÚgurlÚgparamss   &       r   ÚtestParseAddressÚParseTests.testParseAddressÃ  s²   € ð 5ØØ%Øð	ð *¨6Ð3HÈ"ÐMØ" BÐ(=¸rÐBØ$ bÐ*?ÀÐDà;ØØ%Ø˜˜u eÐ,ð	ó,
Ñ'ˆG˜4ô" $'×#3Ò#3°GÓ#<Ñ ˆE˜Ø×Ñ˜TÔ)Ø×Ñ˜TŸ]™]›_¨dÔ3Ø×Ñ˜WÖ-ó),
r   r   N)r   r   r   r   r  r    r!   r"   s   @r   rô   rô   Â  s   ø‡ € ÷.ð .r   rô   c                   ó&   a € ] tR tRt o R tRtV tR# )ÚDummyLocatoriÛ  c                óZ   € \         P                  ! \        P                  ! R RR7      4      # )ú
server.comr¯   ©r™   )r   Úsucceedr   ÚURL©r   Ú
logicalURLs   &&r   Ú
getAddressÚDummyLocator.getAddressÝ  s   € Ü�}Š}œSŸWšW \¸Ô=Ó>Ð>r   r   N©r   r   r   r   r  r    r!   r"   s   @r   r  r  Û  s   ø‡ € ÷?ð ?r   r  c                   ó&   a € ] tR tRt o R tRtV tR# )ÚFailingLocatoriá  c                ó>   € \         P                  ! \        4       4      # r   )r   ÚfailÚLookupErrorr
  s   &&r   r  ÚFailingLocator.getAddressã  s   € Ü�zŠzœ+›-Ó(Ð(r   r   Nr  r"   s   @r   r  r  á  s   ø‡ € ÷)ð )r   r  c                   óV   a € ] tR tRt o R tR tR tR tR tR t	R t
R	 tR
 tRtV tR# )Ú
ProxyTestsiç  c                ó¨   a € \         P                  ! R 4      S n        \        4       S P                  n        . S n        V 3R lS P                  n        R# )ú	127.0.0.1c                 ó<   <€ SP                   P                  W34      # r   ©Úsentr)   ©ÚdestÚmsgr   s   &&€r   r   Ú"ProxyTests.setUp.<locals>.<lambda>ì  ó   ø€ °4·9±9×3CÑ3CÀTÀKÔ3Pr   N)r   ÚProxyÚproxyr  Úlocatorr  ÚsendMessager+   s   fr   r,   ÚProxyTests.setUpè  s4   ø€ Ü—Y’Y˜{Ó+ˆŒ
Ü)›^ˆ�
‰
ÔØˆŒ	Ü!Pˆ�
‰
Ör   c                ó~  € \         P                  ! R R4      pVP                  R\         P                  ! R4      P	                  4       4       VP                  R\         P                  ! R4      P	                  4       4       VP                  RR4       VP                  RR4       VP                  R	R
4       V P
                  P                  VP	                  4       R4       V P                  \        V P                  4      ^4       V P                  ^ ,          w  r#V P                  VP                  R4       V P                  VP                  R4       V P                  VP                  P	                  4       R4       V P                  VP                  R 4       V P                  VP                  R,          . RO4       R# )rC   rD   rr   rî   z1.2.3.5r`   ra   rG   ú<sip:joe@server.com>Úcontactz<sip:joe@1.2.3.5>r¯   r  N©rî   r¯   )úSIP/2.0/UDP 127.0.0.1:5060úSIP/2.0/UDP 1.2.3.4:5060zSIP/2.0/UDP 1.2.3.5:5060)r   r   r€   r´   r9   r"  ÚdatagramReceivedr6   rM   r  r™   r˜   r8   r7   r:   ©r   r‚   r  r=   s   &   r   ÚtestRequestForwardÚProxyTests.testRequestForwardî  s6  € Ü�KŠK˜ )Ó,ˆØ	�‰�Eœ3Ÿ7š7 9Ó-×6Ñ6Ó8Ô9Ø	�‰�Eœ3Ÿ7š7 9Ó-×6Ñ6Ó8Ô9Ø	�‰�E˜5Ô!Ø	�‰�DÐ0Ô1Ø	�‰�IÐ2Ô3Ø�
‰
×#Ñ# A§J¡J£LÐ2CÔDØ×Ñœ˜TŸY™Y›¨Ô+Ø—)‘)˜A•,‰ˆØ×Ñ˜Ÿ™ DÔ)Ø×Ñ˜Ÿ™ LÔ1Ø×Ñ˜Ÿ™Ÿ™Ó)¨9Ô5Ø×Ñ˜Ÿ™ 8Ô,Ø×ÑØ�I‰I�eÕòö	
r   c                óÐ  € \         P                  ! R R4      pVP                  R\         P                  ! R4      P	                  4       4       VP                  RR4       VP                  RR4       VP                  RR	4       V P
                  P                  VP	                  4       R4       V P                  ^ ,          w  r#V P                  VP                  R,          R
R.4       R# )rC   rD   rr   rî   r`   ra   rG   r'  r(  z<sip:joe@1.2.3.4>r*  z)SIP/2.0/UDP 1.2.3.4:5060;received=1.1.1.1N©z1.1.1.1r¯   )
r   r   r€   r´   r9   r"  r,  r  r6   r:   r-  s   &   r   ÚtestReceivedRequestForwardÚ%ProxyTests.testReceivedRequestForward  s«   € Ü�KŠK˜ )Ó,ˆØ	�‰�Eœ3Ÿ7š7 9Ó-×6Ñ6Ó8Ô9Ø	�‰�E˜5Ô!Ø	�‰�DÐ0Ô1Ø	�‰�IÐ2Ô3Ø�
‰
×#Ñ# A§J¡J£LÐ2CÔDØ—)‘)˜A•,‰ˆØ×ÑØ�I‰I�eÕØ)Ð+VÐWö	
r   c                ó8  € \         P                  ! ^È4      pVP                  R\         P                  ! R4      P	                  4       4       V P
                  P                  VP	                  4       R4       V P                  \        V P                  4      ^ 4       R# )r†   rr   úfoo.comNr1  )
r   r‡   r€   r´   r9   r"  r,  r6   rM   r  r�   s   & r   ÚtestResponseWrongViaÚProxyTests.testResponseWrongVia  sc   € ä�LŠL˜ÓˆØ	�‰�Eœ3Ÿ7š7 9Ó-×6Ñ6Ó8Ô9Ø�
‰
×#Ñ# A§J¡J£LÐ2CÔDØ×Ñœ˜TŸY™Y›¨Ö+r   c                óž  € \         P                  ! ^È4      pVP                  R\         P                  ! R4      P	                  4       4       VP                  R\         P                  ! RRR7      P	                  4       4       V P
                  P                  VP	                  4       R4       V P                  \        V P                  4      ^4       V P                  ^ ,          w  r#V P                  VP                  VP                  3R	4       V P                  VP                  ^È4       V P                  VP                  R,          R.4       R# )
r†   rr   r  ú
client.coméÒ  r  zSIP/2.0/UDP client.com:1234Nr1  )r9  r:  )r   r‡   r€   r´   r9   r"  r,  r6   rM   r  r˜   r™   rl   r:   r-  s   &   r   ÚtestResponseForwardÚProxyTests.testResponseForward  sã   € Ü�LŠL˜ÓˆØ	�‰�Eœ3Ÿ7š7 ;Ó/×8Ñ8Ó:Ô;Ø	�‰�Eœ3Ÿ7š7 <°dÔ;×DÑDÓFÔGØ�
‰
×#Ñ# A§J¡J£LÐ2CÔDØ×Ñœ˜TŸY™Y›¨Ô+Ø—)‘)˜A•,‰ˆØ×Ñ˜$Ÿ)™) T§Y¡YÐ/Ð1EÔFØ×Ñ˜Ÿ™ Ô%Ø×Ñ˜Ÿ™ 5Õ)Ð,IÐ+JÖKr   c                ó  € \         P                  ! ^È4      pVP                  R\         P                  ! R4      P	                  4       4       VP                  R\         P                  ! RRR7      P	                  4       4       V P
                  P                  VP	                  4       R4       V P                  \        V P                  4      ^4       V P                  ^ ,          w  r#V P                  VP                  VP                  3R4       R# )	r†   rr   r  rÌ   r9  )rÎ   Nr1  ©r9  r¯   )r   r‡   r€   r´   r9   r"  r,  r6   rM   r  r˜   r™   r-  s   &   r   ÚtestReceivedResponseForwardÚ&ProxyTests.testReceivedResponseForward$  s²   € Ü�LŠL˜ÓˆØ	�‰�Eœ3Ÿ7š7 ;Ó/×8Ñ8Ó:Ô;Ø	�‰�Eœ3Ÿ7š7 :¸ÔE×NÑNÓPÔQØ�
‰
×#Ñ# A§J¡J£LÐ2CÔDØ×Ñœ˜TŸY™Y›¨Ô+Ø—)‘)˜A•,‰ˆØ×Ñ˜$Ÿ)™) T§Y¡YÐ/Ð1EÖFr   c                ó  a€ \         P                  ! ^È4      pVP                  R\         P                  ! R4      P	                  4       4       . oV3R lV P
                  n        V P
                  P                  VP	                  4       R4       V P                  \        S4      ^4       S^ ,          w  r#V P                  \        VP                  P                  R. 4      4      ^ 4       V P                  VP                  ^È4       R# )r†   rr   r  c                  ó&   <€ SP                  V 4      # r   )r)   )rá   r'   s   *€r   r   Ú-ProxyTests.testResponseToUs.<locals>.<lambda>1  s   ø€ ¨A¯H©H°Q¬Kr   Nr1  )r   r‡   r€   r´   r9   r"  ÚgotResponser,  r6   rM   r:   Úgetrl   )r   r‚   r=   Úaddrr'   s   &   @r   ÚtestResponseToUsÚProxyTests.testResponseToUs-  s´   ø€ Ü�LŠL˜ÓˆØ	�‰�Eœ3Ÿ7š7 ;Ó/×8Ñ8Ó:Ô;ØˆÜ!7ˆ�
‰
ÔØ�
‰
×#Ñ# A§J¡J£LÐ2CÔDØ×Ñœ˜Q› Ô#Ø�A•$‰ˆØ×Ñœ˜QŸY™YŸ]™]¨5°"Ó5Ó6¸Ô:Ø×Ñ˜Ÿ™ Ö%r   c                ó�  € \         P                  ! R R4      pVP                  R\         P                  ! R4      P	                  4       4       VP                  R\         P                  ! R4      P	                  4       4       V P
                  P                  VP	                  4       R4       V P                  V P                  . 4       R# )rC   rD   rr   rî   r  Nr>  )	r   r   r€   r´   r9   r"  r,  r6   r  r�   s   & r   ÚtestLoopÚProxyTests.testLoop8  s�   € Ü�KŠK˜ )Ó,ˆØ	�‰�Eœ3Ÿ7š7 9Ó-×6Ñ6Ó8Ô9Ø	�‰�Eœ3Ÿ7š7 ;Ó/×8Ñ8Ó:Ô;Ø�
‰
×#Ñ# A§J¡J£LÐ2FÔGØ×Ñ˜Ÿ™ BÖ'r   c                óŠ  € \         P                  ! R R4      pVP                  R\         P                  ! R4      P	                  4       4       VP                  RR4       \        4       V P                  n        V P                  P                  VP	                  4       R	4       V P                  \        V P                  4      ^4       V P                  ^ ,          w  r#V P                  VP                  VP                  3R	4       V P                  VP                  R4       V P                  VP                  R,          R.4       R# )
rC   rD   rr   rî   rG   r'  i”  r+  Nr)  )r   r   r€   r´   r9   r  r"  r#  r,  r6   rM   r  r˜   r™   rl   r:   r-  s   &   r   ÚtestCantForwardRequestÚ!ProxyTests.testCantForwardRequest?  sá   € Ü�KŠK˜ )Ó,ˆØ	�‰�Eœ3Ÿ7š7 9Ó-×6Ñ6Ó8Ô9Ø	�‰�DÐ0Ô1Ü+Ó-ˆ�
‰
ÔØ�
‰
×#Ñ# A§J¡J£LÐ2CÔDØ×Ñœ˜TŸY™Y›¨Ô+Ø—)‘)˜A•,‰ˆØ×Ñ˜$Ÿ)™) T§Y¡YÐ/Ð1BÔCØ×Ñ˜Ÿ™ Ô%Ø×Ñ˜Ÿ™ 5Õ)Ð,FÐ+GÖHr   )r"  r  N)r   r   r   r   r,   r.  r2  r6  r;  r?  rG  rJ  rM  r    r!   r"   s   @r   r  r  ç  s<   ø‡ € òQò
ò.
ò,ò	LòGò	&ò(÷
Ið 
Ir   r  c                   óh   a € ] tR tRt o 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V tR# )ÚRegistrationTestsiL  c                ó  a € \         P                  ! R R7      S n        \         P                  ! R4      S n        S P                  ;S P                  n        S P                  n        . S n        V 3R lS P                  n        R# )r  ©r˜   úbell.example.comc                 ó<   <€ SP                   P                  W34      # r   r  r  s   &&€r   r   Ú)RegistrationTests.setUp.<locals>.<lambda>R  r   r   N)r   ÚRegisterProxyr"  ÚInMemoryRegistryÚregistryr#  r  r$  r+   s   fr   r,   ÚRegistrationTests.setUpM  sW   ø€ Ü×&Ò&¨KÔ8ˆŒ
Ü×,Ò,Ð-?Ó@ˆŒØ37·=±=Ð@ˆ�
‰
Ô˜dŸj™jÔ0ØˆŒ	Ü!Pˆ�
‰
Ör   c                ó„   € V P                   P                  P                  4        F  w  rVP                  4        K  	  V =R # r   )rX  ÚusersÚvaluesÚcancelr"  )r   rã   r8   s   &  r   ÚtearDownÚRegistrationTests.tearDownT  s/   € Ø—m‘m×)Ñ)×0Ñ0Ö2‰FˆAØ�H‰HŽJñ 3àŠJr   c                ó8  € \         P                  ! R R4      pVP                  RR4       VP                  RR4       VP                  R\         P                  ! R4      P	                  4       4       V P
                  P                  VP	                  4       R	4       R# )
ÚREGISTERúsip:bell.example.comrG   úsip:joe@bell.example.comr(  úsip:joe@client.com:1234rr   r9  Nr>  ©r   r   r€   r´   r9   r"  r,  r�   s   & r   ÚregisterÚRegistrationTests.registerY  sl   € Ü�KŠK˜
Ð$:Ó;ˆØ	�‰�DÐ4Ô5Ø	�‰�IÐ8Ô9Ø	�‰�Eœ3Ÿ7š7 <Ó0×9Ñ9Ó;Ô<Ø�
‰
×#Ñ# A§J¡J£LÐ2FÖGr   c                ó\  € \         P                  ! R R4      pVP                  RR4       VP                  RR4       VP                  R\         P                  ! R4      P	                  4       4       VP                  RR	4       V P
                  P                  VP	                  4       R4       R
# )ra  rb  rG   rc  r(  Ú*rr   r9  Úexpiresr^   Nr>  re  r�   s   & r   Ú
unregisterÚRegistrationTests.unregister`  sy   € Ü�KŠK˜
Ð$:Ó;ˆØ	�‰�DÐ4Ô5Ø	�‰�I˜sÔ#Ø	�‰�Eœ3Ÿ7š7 <Ó0×9Ñ9Ó;Ô<Ø	�‰�I˜sÔ#Ø�
‰
×#Ñ# A§J¡J£LÐ2FÖGr   c                óø  € V P                  4        V P                  ^ ,          w  rV P                  VP                  VP                  3R4       V P                  VP
                  ^È4       V P                  VP                  R,          R.4       V P                  VP                  R,          R.4       V P                  VP                  R,          R.4       \        \        4      \        8w  d6   V P                  \        VP                  R,          ^ ,          4      R9   4       V P                  \        V P                  P                  4      ^4       V P                  P                  R,          w  r4V P                  VP                  4       R4       V P                   P"                  P%                  \&        P(                  ! RR	R
7      4      pVP+                  R 4       VP+                  V P                  R4       V# )é    rr   úSIP/2.0/UDP client.com:5060rG   rc  r(  úsip:joe@client.com:5060rj  rH   rS  ©rä   r˜   c                 ó2   € V P                   V P                  3# r   ©r˜   r™   )Údesturls   &r   r   Ú0RegistrationTests.testRegister.<locals>.<lambda>{  s   €  w§|¡|°W·\±\Ñ&Br   r>  )i  i  i  i  )rf  r  r6   r˜   r™   rl   r:   Útyper   r   r°   ÚintrM   rX  r[  r9   r"  r#  r  r   r	  ÚaddCallback)r   r  r=   Údcr8   rã   s   &     r   ÚtestRegisterÚRegistrationTests.testRegisterh  st  € Ø�‰ŒØ—)‘)˜A•,‰ˆØ×Ñ˜$Ÿ)™) T§Y¡YÐ/Ð1EÔFØ×Ñ˜Ÿ™ Ô%Ø×Ñ˜Ÿ™ 5Õ)Ð,IÐ+JÔKØ×Ñ˜Ÿ™ 4�Ð+EÐ*FÔGØ×Ñ˜Ÿ™ 9Õ-Ð0IÐ/JÔKô ”‹=Ô2Ô2Ø�O‰OœC §	¡	¨)Õ 4°QÕ 7Ó8Ð<TÑTÔUØ×Ñœ˜TŸ]™]×0Ñ0Ó1°1Ô5Ø—-‘-×%Ñ% eÕ,‰ˆØ×Ñ˜Ÿ™›Ð)BÔCØ�J‰J×Ñ×)Ñ)Ü�GŠG˜UÐ);Ô<ó
ˆð 	
�‰ÑBÔCØ	�‰�d×&Ñ&Ð(<Ô=Øˆr   c                ód  € V P                  4        V P                  4        V P                  ^,          w  rV P                  VP                  VP
                  3R
4       V P                  VP                  ^È4       V P                  VP                  R,          R.4       V P                  VP                  R,          R.4       V P                  VP                  R,          R.4       V P                  VP                  R,          R.4       V P                  V P                  P                  / 4       R	# )rB   rr   ro  rG   rc  r(  rp  rj  r^   Nr>  )
rf  rk  r  r6   r˜   r™   rl   r:   rX  r[  ©r   r  r=   s   &  r   ÚtestUnregisterÚ RegistrationTests.testUnregister  sá   € Ø�‰ŒØ�‰ÔØ—)‘)˜A•,‰ˆØ×Ñ˜$Ÿ)™) T§Y¡YÐ/Ð1EÔFØ×Ñ˜Ÿ™ Ô%Ø×Ñ˜Ÿ™ 5Õ)Ð,IÐ+JÔKØ×Ñ˜Ÿ™ 4�Ð+EÐ*FÔGØ×Ñ˜Ÿ™ 9Õ-Ð0IÐ/JÔKØ×Ñ˜Ÿ™ 9Õ-°¨uÔ5Ø×Ñ˜Ÿ™×,Ñ,¨bÖ1r   c                óÖ   € \        4       p\        P                  ! V4      p\        P                  ! 4       pVP                  R R4       VP                  V4       W P                  n        R# )zuserXname@127.0.0.1Ú	passXwordN)r   r   ÚPortalr   Ú'InMemoryUsernamePasswordDatabaseDontUseÚaddUserÚregisterCheckerr"  )r   r‚   Úpry   s   &   r   Ú	addPortalÚRegistrationTests.addPortal‹  sL   € Ü‹KˆÜ�MŠM˜!ÓˆÜ×<Ò<Ó>ˆØ	�	‰	Ð'¨Ô5Ø	×Ñ˜!ÔØ�
‰
Ör   c                óP  € V P                  4        V P                  4        V P                  \        V P                  P
                  4      ^ 4       V P                  \        V P                  4      ^4       V P                  ^ ,          w  rV P                  VP                  R4       R# )rn  i‘  N)r‡  rf  r6   rM   rX  r[  r  rl   r}  s   &  r   ÚtestFailedAuthenticationÚ*RegistrationTests.testFailedAuthentication“  so   € Ø�‰ÔØ�‰Œà×Ñœ˜TŸ]™]×0Ñ0Ó1°1Ô5Ø×Ñœ˜TŸY™Y›¨Ô+Ø—)‘)˜A•,‰ˆØ×Ñ˜Ÿ™ Ö%r   c                ó‚  € \         P                  ! R R4      pVP                  RR4       VP                  RR4       VP                  R\         P                  ! R4      P	                  4       4       V P
                  P                  VP	                  4       R	4       V P                  \        V P                  4      ^ 4       R# )
ra  zsip:wrong.comrG   rc  r(  rd  rr   r9  Nr>  ©
r   r   r€   r´   r9   r"  r,  r6   rM   r  r�   s   & r   ÚtestWrongDomainRegisterÚ)RegistrationTests.testWrongDomainRegisterœ  sƒ   € Ü�KŠK˜
 OÓ4ˆØ	�‰�DÐ4Ô5Ø	�‰�IÐ8Ô9Ø	�‰�Eœ3Ÿ7š7 <Ó0×9Ñ9Ó;Ô<Ø�
‰
×#Ñ# A§J¡J£LÐ2FÔGØ×Ñœ˜TŸY™Y›¨Ö+r   c                ó‚  € \         P                  ! R R4      pVP                  RR4       VP                  RR4       VP                  R\         P                  ! R4      P	                  4       4       V P
                  P                  VP	                  4       R	4       V P                  \        V P                  4      ^ 4       R# )
ra  rb  rG   zsip:joe@foo.comr(  rd  rr   r9  Nr>  r�  r�   s   & r   ÚtestWrongToDomainRegisterÚ+RegistrationTests.testWrongToDomainRegister¤  s„   € Ü�KŠK˜
Ð$:Ó;ˆØ	�‰�DÐ+Ô,Ø	�‰�IÐ8Ô9Ø	�‰�Eœ3Ÿ7š7 <Ó0×9Ñ9Ó;Ô<Ø�
‰
×#Ñ# A§J¡J£LÐ2FÔGØ×Ñœ˜TŸY™Y›¨Ö+r   c                óÌ   € V P                  4        \        P                  ! R RR7      pV P                  P                  P                  V4      pV P                  V\        4       V# )rH   r5  rq  ©rf  r   r	  r"  r#  r  ÚassertFailurer  ©r   rÛ   rã   s   &  r   ÚtestWrongDomainLookupÚ'RegistrationTests.testWrongDomainLookup¬  sJ   € Ø�‰ŒÜ�gŠg˜u¨9Ô5ˆØ�J‰J×Ñ×)Ñ)¨#Ó.ˆØ×Ñ˜1œkÔ*Øˆr   c                óÌ   € V P                  4        \        P                  ! R RR7      pV P                  P                  P                  V4      pV P                  V\        4       V# )ÚjanerS  rq  r”  r–  s   &  r   ÚtestNoContactLookupÚ%RegistrationTests.testNoContactLookup³  sK   € Ø�‰ŒÜ�gŠg˜vÐ,>Ô?ˆØ�J‰J×Ñ×)Ñ)¨#Ó.ˆØ×Ñ˜1œkÔ*Øˆr   )r"  rX  r  N)r   r   r   r   r,   r^  rf  rk  rz  r~  r‡  rŠ  rŽ  r‘  r—  r›  r    r!   r"   s   @r   rP  rP  L  sI   ø‡ € òQòò
HòHòò.
2òò&ò,ò,ò÷ð r   rP  c                   ó,   a € ] tR tRt o R tR tRtV tR# )ÚClienti»  c                ó†   € \         P                  P                  V 4       . V n        \        P
                  ! 4       V n        R # r   )r   ÚBaseÚ__init__rÎ   r   ÚDeferredÚdeferredr+   s   &r   r¡  ÚClient.__init__¼  s)   € Ü�‰×Ñ˜$ÔØˆŒÜŸšÓ(ˆŽr   c                ó†   € V P                   P                  V4       V P                  P                  V P                   4       R # r   )rÎ   r)   r£  Úcallback)r   ÚresponserF  s   &&&r   Úhandle_responseÚClient.handle_responseÁ  s*   € Ø�‰×Ñ˜XÔ&Ø�‰×Ñ˜tŸ}™}Ö-r   )r£  rÎ   N)r   r   r   r   r¡  r¨  r    r!   r"   s   @r   rž  rž  »  s   ø‡ € ò)÷
.ð .r   rž  c                   ó8   a € ] tR tRt o R tR tR tR tRtV t	R# )Ú	LiveTestsiÆ  c                ó$  € \         P                  ! R R7      V n        \         P                  ! R4      V n        V P                  ;V P                  n        V P                  n        \        P                  ! ^ V P                  R R7      V n        \        4       V n
        \        P                  ! ^ V P                  R R7      V n        V P                  P                  4       P                  V P                  P                  4       P                  3V n        R# )r  rR  rS  )Ú	interfaceN)r   rV  r"  rW  rX  r#  r   Ú	listenUDPÚ
serverPortrž  ÚclientÚ
clientPortÚgetHostr˜   r™   ÚserverAddressr+   s   &r   r,   ÚLiveTests.setUpÇ  s¶   € Ü×&Ò&¨KÔ8ˆŒ
Ü×,Ò,Ð-?Ó@ˆŒØ37·=±=Ð@ˆ�
‰
Ô˜dŸj™jÔ0Ü!×+Ò+¨A¨t¯z©zÀ[ÔQˆŒÜ“hˆŒÜ!×+Ò+¨A¨t¯{©{ÀkÔRˆŒà�O‰O×#Ñ#Ó%×*Ñ*Ø�O‰O×#Ñ#Ó%×*Ñ*ð
ˆÖr   c                óR  € V P                   P                  P                  4        F  w  rVP                  4        K  	  \        P
                  ! V P                  P                  4      p\        P
                  ! V P                  P                  4      p\        P                  ! W4.4      # r   )
rX  r[  r\  r]  r   ÚmaybeDeferredr±  ÚstopListeningr¯  ÚgatherResults)r   rã   r8   Úd1Úd2s   &    r   r^  ÚLiveTests.tearDownÓ  sq   € Ø—m‘m×)Ñ)×0Ñ0Ö2‰FˆAØ�H‰HŽJñ 3ä× Ò  §¡×!>Ñ!>Ó?ˆÜ× Ò  §¡×!>Ñ!>Ó?ˆÜ×"Ò" B 8Ó,Ð,r   c                ó   a € S P                   P                  4       P                  p\        P                  ! R R4      pVP                  RR4       VP                  RRV,          4       VP                  R\        P                  ! RVR7      P                  4       4       S P                  P                  \        P                  ! RS P                  ^,          R	7      V4       S P                  P                  pV 3R
 lpVP                  V4       V# )ra  rb  rG   rc  r(  úsip:joe@127.0.0.1:%drr   r  r  rs  c                 óˆ   <€ SP                  \        V 4      ^4       V ^ ,          pSP                  VP                  ^È4       R# ©rB   N©r6   rM   rl   ©rÎ   r‚   r   s   & €r   ÚcheckÚ%LiveTests.testRegister.<locals>.checkå  ó4   ø€ Ø×ÑœS ›]¨AÔ.Ø˜•ˆAØ×Ñ˜QŸV™V SÖ)r   )r±  r²  r™   r   r   r€   r´   r9   r°  r$  r	  r³  r£  rx  )r   r†  r‚   rã   rÂ  s   f    r   rz  ÚLiveTests.testRegisterÚ  sÇ   ø€ Ø�O‰O×#Ñ#Ó%×*Ñ*ˆÜ�KŠK˜
Ð$:Ó;ˆØ	�‰�DÐ4Ô5Ø	�‰�IÐ5¸Õ9Ô:Ø	�‰�Eœ3Ÿ7š7 ;°QÔ7×@Ñ@ÓBÔCØ�‰×ÑÜ�GŠG˜¨4×+=Ñ+=¸aÕ+@ÔAÀ1ô	
ð �K‰K× Ñ ˆõ	*ð
 	
�‰�eÔØˆr   c           	     ó  a € S P                   P                  4       P                  p\        P                  ! RR4      pVP                  RR4       VP                  RRV,          4       VP                  R\        P                  ! RVR	R
7      P                  4       4       S P                  S P                  .R7      pS P                  \        V4      ^4       S P                  V^ ,          R,          R4       S P                  V^ ,          R,          \        4       S P                  P                  \        P                  ! RS P                   ^,          R7      V4       S P                  P"                  pV 3R lpVP%                  V4       V# )a8  
rport is allowed without a value, apparently because server
implementors might be too stupid to check the received port
against 5060 and see if they're equal, and because client
implementors might be too stupid to bind to port 5060, or set a
value on the rport parameter they send if they bind to another
port.
ra  rb  rG   rc  r(  r½  rr   r  T)r™   r¢   r»   r2   r½   r¾   rs  c                 óˆ   <€ SP                  \        V 4      ^4       V ^ ,          pSP                  VP                  ^È4       R# r¿  rÀ  rÁ  s   & €r   rÂ  Ú)LiveTests.test_amoralRPort.<locals>.check  rÄ  r   )r±  r²  r™   r   r   r€   r´   r9   rÀ   Útest_amoralRPortr6   rM   rÂ   r°  r$  r	  r³  r£  rx  )r   r†  r‚   rÃ   rã   rÂ  s   f     r   rÉ  ÚLiveTests.test_amoralRPortí  s4  ø€ ð �O‰O×#Ñ#Ó%×*Ñ*ˆÜ�KŠK˜
Ð$:Ó;ˆØ	�‰�DÐ4Ô5Ø	�‰�IÐ5¸Õ9Ô:Ø	�‰�Eœ3Ÿ7š7 ;°Q¸dÔC×LÑLÓNÔOØ×%Ñ%¸$×:OÑ:OÐ9PÐ%ÓQˆØ×Ñœ˜X›¨Ô*Ø×ÑØ�Q�K˜	Õ"Ð$Qô	
ð 	×Ñ˜ !� ZÕ0Ô2DÔEØ�‰×ÑÜ�GŠG˜¨4×+=Ñ+=¸aÕ+@ÔAÀ1ô	
ð �K‰K× Ñ ˆõ	*ð
 	
�‰�eÔØˆr   )r°  r±  r"  rX  r³  r¯  N)
r   r   r   r   r,   r^  rz  rÉ  r    r!   r"   s   @r   r«  r«  Æ  s   ø‡ € ò

ò-ò÷&ð r   r«  ))r{   Útwisted.credr   r   Útwisted.internetr   r   Útwisted.protocolsr   Útwisted.trialr   Útwisted.internet.asyncioreactorr   ÚBaseExceptionÚzope.interfacer	   ÚreplacerL   rU   rY   rb   rk   rf   Úrequest_nattedrs   r   ÚTestCaser%   rw   r}   r�   r×   rô   ÚILocatorr  r  r  rP  r   rž  r«  r   r   r   Ú<module>rÖ     s-  ðñ
÷ *ß +Ý !Ý "ð"ÝFõ 'ð ð÷ 	‰Øˆfó	õ	ð 	ð÷ 	‰Øˆ&ó	ð	 	ð÷ ‰7Øˆ&óð 	ð÷ 	‰Øˆ&ó	ð 	ð(÷
 �GØˆ&óð 
ð÷ 	‰Øˆ&ó	ð ð÷ �GØˆ&óð	 ð÷ �gØˆ&óð ÷(0ñ 0ô
E
˜(×+Ñ+ô E
ôPÐ,?ô ôA�x×(Ñ(ô Aô(u*ˆx× Ñ ô u*ôp1ˆx× Ñ ô 1ô@.�×"Ñ"ô .ñ2 ˆS�\‰\Ó÷?ð ?ó ð?ñ
 ˆS�\‰\Ó÷)ð )ó ð)ô
bI�×"Ñ"ô bIôJl˜×)Ñ)ô lô^.ˆS�X‰Xô .ôF�×!Ñ!ö Føðm ô "Ø!Óð"ús    G Ç	G"Ç!G"