+
    üÐjä  ã                   ó   € R t ^ RIHt ^ RIHtHt ^ RIHt ^ RIH	t	 ^ RI
Ht  ! R R4      t ! R R	4      t ! R
 R4      t ! R R4      t ! R R]4      t]! ]P"                  4       ! R R]4      4       t ! R R]P&                  4      tR tR# )z
Utility classes for spread.
)Úimplementer)ÚdeferÚ
interfaces)Úbasic)ÚFailure)Úpbc                   ó,   a € ] tR t^t o R tR tRtV tR# )ÚLocalMethodc                ó   € Wn         W n        R # ©N©ÚlocalÚname)Úselfr   r   s   &&&Ú5/usr/lib/python3/dist-packages/twisted/spread/util.pyÚ__init__ÚLocalMethod.__init__   s   € ØŒ
ØŽ	ó    c                óV   € V P                   P                  ! V P                  .VO5/ VB # r   )r   Ú
callRemoter   )r   ÚargsÚkws   &*,r   Ú__call__ÚLocalMethod.__call__   s%   € Ø�z‰z×$Ò$ T§Y¡YÐ<°Ò<¸Ñ<Ð<r   r   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r   r   Ú__static_attributes__Ú__classdictcell__©Ú__classdict__s   @r   r	   r	      s   ø‡ € ò÷=ð =r   r	   c                   ó4   a € ] tR t^t o Rt^tR tR tRtV t	R# )ÚLocalAsRemotezF
A class useful for emulating the effects of remote behavior locally.
c                ól  € \        V RV,           4      '       d   \        V RV,           4      ! V/ VB #  \        V RV,           4      p\        P                  ! V! V/ VB 4      #   \         dF    \        4       pT P                  '       d   TP                  4        \        P                  ! T4      u # i ; i)a@  
Call a specially-designated local method.

self.callRemote('x') will first try to invoke a method named
sync_x and return its result (which should probably be a
Deferred).  Second, it will look for a method called async_x,
which will be called and then have its result (or Failure)
automatically wrapped in a Deferred.
Úsync_Úasync_)	ÚhasattrÚgetattrr   ÚsucceedÚBaseExceptionr   ÚreportAllTracebacksÚprintTracebackÚfail)r   r   r   r   ÚmethodÚfs   &&*,  r   r   ÚLocalAsRemote.callRemote#   sš   € ô �4˜ 4�×(Ò(Ü˜4 ¨4¥Ô0°$Ð=¸"Ñ=Ð=ð	!Ü˜T 8¨d¥?Ó3ˆFÜ—=’=¡¨Ð!4°Ñ!4Ó5Ð5øÜô 	!Ü“	ˆAØ×'×'Ð'Ø× Ñ Ô"Ü—:’:˜a“=Ò ð		!ús   ´.A# Á#AB3Â2B3c                ó   € \        W4      # r   )r	   )r   r   s   &&r   ÚremoteMethodÚLocalAsRemote.remoteMethod8   s   € Ü˜4Ó&Ð&r   © N)
r   r   r   r   Ú__doc__r+   r   r2   r   r   r    s   @r   r#   r#      s!   ø‡ € ñð Ðò!÷*'ð 'r   r#   c                   ó:   a € ] tR t^<t o RtRR ltR tR tRtV t	R# )ÚLocalAsyncForwarderz<
A class useful for forwarding a locally-defined interface.
c                ó\   € VP                  V4      '       g   Q hWn        W n        W0n        R # r   )Ú
providedByÚ	forwardedÚinterfaceClassÚfailWhenNotImplemented)r   r:   r;   r<   s   &&&&r   r   ÚLocalAsyncForwarder.__init__A   s*   € Ø×(Ñ(¨×3Ò3Ð3Ð3Ø"ŒØ,ÔØ&<Ö#r   c                ó:   € \        V P                  V4      ! V/ VB # r   )r(   r:   )r   r.   r   r   s   &&*,r   Ú_callMethodÚLocalAsyncForwarder._callMethodG   s   € Ü�t—~‘~ vÔ.°Ð;¸Ñ;Ð;r   c                ó8  € V P                   P                  V4      '       d(   \        P                  ! V P                  V.VO5/ VB pV# V P
                  '       d,   \        P                  ! \        \        R V,          4      4      # \        P                  ! R4      # )zNo Such Method in Interface: %sN)
r;   ÚqueryDescriptionForr   ÚmaybeDeferredr?   r<   r-   r   ÚNotImplementedErrorr)   )r   r.   r   r   Úresults   &&*, r   r   ÚLocalAsyncForwarder.callRemoteJ   s€   € Ø×Ñ×2Ñ2°6×:Ò:Ü×(Ò(¨×)9Ñ)9¸6ÐOÀDÒOÈBÑOˆFØˆMØ×(×(Ð(Ü—:’:ÜÔ+Ð-NÐQWÕ-WÓXóð ô —=’= Ó&Ð&r   )r<   r:   r;   N)é    )
r   r   r   r   r5   r   r?   r   r   r   r    s   @r   r7   r7   <   s   ø‡ € ñô=ò<÷	'ð 	'r   r7   c                   óF   a € ] tR t^Vt o RtR	R ltR tR tR tR t	Rt
V tR# )
ÚPagerz-
I am an object which pages out information.
Nc                ó¬   € \        V4      '       d   W n        W0n        W@n        MRV n        ^V n        Wn        VP                  P                  V 4       R# )zk
Create a pager with a Reference to a remote collector and
an optional callable to invoke upon completion.
N)ÚcallableÚcallbackÚcallbackArgsÚcallbackKeywordÚ_stillPagingÚ	collectorÚbrokerÚregisterPageProducer)r   rP   rL   r   r   s   &&&*,r   r   ÚPager.__init__[   sH   € ô
 �H×ÒØ$ŒMØ $ÔØ#%Õ à ˆDŒMØˆÔØ"ŒØ×Ñ×-Ñ-¨dÖ3r   c                óà   € V P                   '       gR   V P                  P                  RRR7       V P                  e'   V P                  ! V P                  / V P
                  B  V P                   # )ú%
(internal) Method called by Broker.
ÚendedPagingF©Úpbanswer)rO   rP   r   rL   rM   rN   ©r   s   &r   ÚstillPagingÚPager.stillPagingj   sZ   € ð × × Ð Ø�N‰N×%Ñ% m¸eÐ%ÔDØ�}‰}Ò(Ø—’˜t×0Ñ0ÐI°D×4HÑ4HÒIØ× Ñ Ð r   c                ó^   € V P                   P                  RV P                  4       RR7       R# )rU   ÚgotPageFrW   N)rP   r   ÚnextPagerY   s   &r   ÚsendNextPageÚPager.sendNextPaget   s#   € ð 	�‰×!Ñ! )¨T¯]©]«_ÀuÐ!ÖMr   c                ó   € \        4       h)z?
Override this to return an object to be sent to my collector.
)rD   rY   s   &r   r^   ÚPager.nextPagez   s   € ô "Ó#Ð#r   c                ó   € ^ V n         R# )z$
Call this when you're done paging.
N)rO   rY   s   &r   Ú
stopPagingÚPager.stopPaging€   s   € ð ˆÖr   )rO   rL   rM   rN   rP   r   )r   r   r   r   r5   r   rZ   r_   r^   rd   r   r   r    s   @r   rI   rI   V   s)   ø‡ € ñô4ò!òNò$÷ð r   rI   c                   ó4   a € ] tR t^‡t o RtRR ltR tRtV tR# )ÚStringPagerz2
A simple pager that splits a string into chunks.
Nc                ób   € W n         ^ V n        W0n        \        P                  ! WV.VO5/ VB  R# )rG   N)ÚstringÚpointerÚ	chunkSizerI   r   )r   rP   Ústrk   rL   r   r   s   &&&&&*,r   r   ÚStringPager.__init__Œ   s+   € ØŒØˆŒØ"ŒÜ�Š�t¨Ð>°4Ò>¸2Ô>r   c                ó  € V P                   V P                  V P                  V P                  ,            pV ;P                  V P                  ,          un        V P                  \        V P                   4      8¼  d   V P	                  4        V# r   )ri   rj   rk   Úlenrd   ©r   Úvals   & r   r^   ÚStringPager.nextPage’   sY   € Ø�k‰k˜$Ÿ,™,¨¯©¸¿¹Õ)FÐGˆØ�Š˜Ÿ™Õ&�Ø�<‰<œ3˜tŸ{™{Ó+Ô+Ø�O‰OÔØˆ
r   )rk   rj   ri   )i    N)	r   r   r   r   r5   r   r^   r   r   r    s   @r   rg   rg   ‡   s   ø‡ € ñô?÷ð r   rg   c                   óL   a € ] tR t^št o RtR
R ltR tR tR tR t	R t
R	tV tR# )Ú	FilePagerz;
Reads a file in chunks and sends the chunks as they come.
Nc                ól   € . V n         \        P                  ! WV.VO5/ VB  V P                  V4       R # r   )ÚchunksrI   r   ÚstartProducing)r   rP   ÚfdrL   r   r   s   &&&&*,r   r   ÚFilePager.__init__    s/   € ØˆŒÜ�Š�t¨Ð>°4Ò>¸2Ò>Ø×Ñ˜BÖr   c                óš   a € \         P                  ! 4       P                  VS 4      S n        S P                  P	                  V 3R  l4       R# )c                 ó$   <€ SP                  4       # r   )rd   )Úxr   s   &€r   Ú<lambda>Ú*FilePager.startProducing.<locals>.<lambda>§   s   ø€ ¨¯©Ô(9r   N)r   Ú
FileSenderÚbeginFileTransferÚdeferredÚaddBoth)r   rx   s   f&r   rw   ÚFilePager.startProducing¥   s3   ø€ Ü×(Ò(Ó*×<Ñ<¸RÀÓFˆŒØ�‰×ÑÔ9Ö:r   c                óZ   € Wn         V'       g   V P                   P                  4        R # R # r   )ÚproducerÚresumeProducing)r   r…   Ú	streamings   &&&r   ÚregisterProducerÚFilePager.registerProducer©   s   € Ø ŒßØ�M‰M×)Ñ)Ö+ñ r   c                ó   € R V n         R # r   )r…   rY   s   &r   ÚunregisterProducerÚFilePager.unregisterProducer®   s	   € ØˆŽr   c                ó<   € V P                   P                  V4       R # r   )rv   Úappend)r   Úchunks   &&r   ÚwriteÚFilePager.write±   s   € Ø�‰×Ñ˜5Ö!r   c                óÔ   € V P                   '       g   R# V P                   P                  ^ 4      pV P                  P                  4        V P                  P                  RVRR7       R# )z4
Get the first chunk read and send it to collector.
Nr]   FrW   )rv   Úpopr…   r†   rP   r   rp   s   & r   r_   ÚFilePager.sendNextPage´   sK   € ð �{�{ˆ{ÙØ�k‰k�o‰o˜aÓ ˆØ�‰×%Ñ%Ô'Ø�‰×!Ñ! )¨S¸5Ð!ÖAr   )rv   r�   r…   r   )r   r   r   r   r5   r   rw   rˆ   r‹   r�   r_   r   r   r    s   @r   rt   rt   š   s/   ø‡ € ñô ò
;ò,ò
ò"÷Bð Br   rt   c                   ó6   a € ] tR t^Àt o RtR tR tR tRtV t	R# )ÚCallbackPageCollectorz¥
I receive pages from the peer. You may instantiate a Pager with a
remote reference to me. I will call the callback with a list of pages
once they are all received.
c                ó    € . V n         Wn        R # r   )ÚpagesrL   )r   rL   s   &&r   r   ÚCallbackPageCollector.__init__Ç   s   € ØˆŒ
Ø Žr   c                ó<   € V P                   P                  V4       R # r   )r˜   rŽ   )r   Úpages   &&r   Úremote_gotPageÚ$CallbackPageCollector.remote_gotPageË   s   € Ø�
‰
×Ñ˜$Ör   c                ó<   € V P                  V P                  4       R # r   ©rL   r˜   rY   s   &r   Úremote_endedPagingÚ(CallbackPageCollector.remote_endedPagingÎ   s   € Ø�‰�d—j‘jÖ!r   rŸ   N)
r   r   r   r   r5   r   rœ   r    r   r   r    s   @r   r–   r–   À   s   ø‡ € ñò!ò ÷"ð "r   r–   c                ó„   € \         P                  ! 4       pV P                  ! V\        VP                  4      .VO5/ VB  V# )zf
A utility method that will call a remote method which expects a
PageCollector as the first argument.
)r   ÚDeferredr   r–   rL   )ÚreferenceableÚ
methodNamer   r   Úds   &&*, r   ÚgetAllPagesr§   Ò   s:   € ô
 	�ŠÓ€AØ×Ò˜ZÔ)>¸q¿z¹zÓ)JÐXÈTÒXÐUWÒXØ€Hr   N)r5   Úzope.interfacer   Útwisted.internetr   r   Útwisted.protocolsr   Útwisted.python.failurer   Útwisted.spreadr   r	   r#   r7   rI   rg   Ú	IConsumerrt   ÚReferenceabler–   r§   r4   r   r   Ú<module>r¯      s’   ðñõ 'ç .Ý #Ý *Ý ÷=ñ =÷'ñ '÷@'ñ '÷4.ñ .ôb�%ô ñ& ˆZ×!Ñ!Ó"ô!B�ó !Bó #ð!BôJ"˜B×,Ñ,ô "ô$r   