+
    üÐjß@  ã                   ó2  € R t ^ RIt^ RIt^ RIHt ^ RIHt ^ RIHtH	t	H
t
HtHtHtHtHtHtHt ^ RIHtHt ^ RIHtHtHt ^ RIHt ^ RIHt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I*H+t+ ^RI,H-t- ^RI.H/t/H0t0 ^RI1H2t2 ^RI3H4t4 ^RI5H6t6H7t7 ^RI8H9t9H:t: ^RI;H<t< ^RI=H>t>H?t?H@t@HAtA ^RIBHCtCHDtDHEtE  ! R R] ]!4      tFR R ltG] ! R R4      4       tH] ! R R4      4       tI] ! R  R!4      4       tJR" R# ltKR$ R% ltL] ! R& R'4      4       tMR# )(z¢
This module contains the trial distributed runner, the management class
responsible for coordinating all of trial's behavior at the highest level.

@since: 12.3
N)Úpartial)Úisabs)
ÚAnyÚ	AwaitableÚCallableÚIterableÚListÚOptionalÚSequenceÚTextIOÚUnionÚcast)ÚTestCaseÚ	TestSuite)ÚdefineÚfieldÚfrozen)Údefault_if_none)ÚDeferredÚDeferredListÚgatherResults)ÚIReactorCoreÚIReactorProcess)ÚLogger)ÚFailure)ÚFilePath)ÚFilesystemLock)ÚtheSystemPath)Ú_iterateTests)Ú	IReporterÚ	ITestCase)ÚUncleanWarningsReporterWrapper)Ú
TestHolder)Ú_unusedTestDirectoryÚopenTestLog)Ú_WORKER_AMP_STDINÚ_WORKER_AMP_STDOUT©ÚDistReporter)ÚcountingCallsÚdiscardResultÚiterateWhileÚ	takeWhile)ÚLocalWorkerÚLocalWorkerAMPÚWorkerActionc                   ó   € ] tR t^3tRtRtR# )ÚIDistTrialReactorz/
The reactor interfaces required by disttrial.
© N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__static_attributes__r2   ó    Ú?/usr/lib/python3/dist-packages/twisted/trial/_dist/disttrial.pyr1   r1   3   s   † õr9   r1   c                ó$   € V ^8„  d   QhR\         /# ©é   Úreturn)r1   )Úformats   "r:   Ú__annotate__r@   9   s   € ÷ Eñ EÔ*ñ Er9   c                 óÀ   € ^ RI Hu Hp  \        \        P
                  ! V 4      \        P
                  ! V 4      .4      '       d   \        \        V 4      # \        R4      h)zJ
Get the default reactor, ensuring it is suitable for use with disttrial.
Nz-Reactor does not provide the right interfaces)
Útwisted.internet.reactorÚinternetÚreactorÚallr   Ú
providedByr   r   r1   Ú	TypeError)ÚdefaultReactors    r:   Ú_defaultReactorrI   9   sT   € ÷ 6Ð5ä
ä×#Ò# NÓ3Ü×&Ò& ~Ó6ð	
÷ò ô Ô% ~Ó6Ð6ä
ÐCÓ
DÐDr9   c                   ó0   a € ] tR t^Mt o RtV 3R ltRtV tR# )ÚWorkerPoolConfigar  
Configuration parameters for a pool of test-running workers.

@ivar numWorkers: The number of workers in the pool.

@ivar workingDirectory: A directory in which working directories for each
    of the workers will be created.

@ivar workerArguments: Extra arguments to pass the worker process in its
    argv.

@ivar logFile: The basename of the overall test log file.
c                ój   <€ V ^8„  d   Qh/ S[ ;R&   S[S[,          ;R&   S[S[,          ;R&   S[;R&   # )r=   Ú
numWorkersÚworkingDirectoryÚworkerArgumentsÚlogFile)Úintr   r   r
   Ústr)r?   Ú__classdict__s   "€r:   r@   ÚWorkerPoolConfig.__annotate__M   s?   ø‡ ‚ ñ  �Oñ! ñ" ™s•mÑ#ñ# ñ$ ™c•]Ñ"ñ% ñ& �Lò' r9   r2   N)r3   r4   r5   r6   r7   Ú__annotate_func__r8   Ú__classdictcell__©rS   s   @r:   rK   rK   M   s   ø‡ € ñ÷ ƒ r9   rK   c                   ób   a € ] tR t^ct o Rt]! 4       tV 3R lR ltV 3R lR ltV 3R lt	Rt
V tR# )	ÚStartedWorkerPoola  
A pool of workers which have already been started.

@ivar workingDirectory: A directory holding the working directories for
    each of the workers.

@ivar testDirLock: An object representing the cooperative lock this pool
    holds on its working directory.

@ivar testLog: The open overall test log file.

@ivar workers: Objects corresponding to the worker child processes and
    adapting between process-related interfaces and C{IProtocol}.

@ivar ampWorkers: AMP protocol instances corresponding to the worker child
    processes.
c                ó4   <€ V ^8„  d   QhRS[ S[,          RR/# )r=   ÚworkerActionr>   N)r/   r   )r?   rS   s   "€r:   r@   ÚStartedWorkerPool.__annotate__   s    ø€ ÷ ñ ¡l±3Õ&7ð ¸Dñ r9   c              ƒ  ób   a"  € \        V3R lV P                   4       4      G Rj  x€L
  R#  L5i)z2
Run an action on all of the workers in the pool.
c              3   óF   <"  € T F  p\        S! V4      4      x € K  	  R # 5i©N)r*   )Ú.0Úworkerr[   s   & €r:   Ú	<genexpr>Ú(StartedWorkerPool.run.<locals>.<genexpr>ƒ   s!   øé € ð 
Ù>M°FŒM™, vÓ.×/Ð/»oùs   ƒ!N)r   Ú
ampWorkers)Úselfr[   s   &fr:   ÚrunÚStartedWorkerPool.run   s5   øé € ô ô 
Ø>B¿oºoó
ó 
÷ 	
ð 	
ñ ñ	
ùs   ƒ#/¦-§/c                ó   <€ V ^8„  d   QhRR/# )r=   r>   Nr2   )r?   rS   s   "€r:   r@   r\   ˆ   s   ø€ ÷ "ñ "˜Dñ "r9   c           	   ƒ  óÜ  "  € \        V P                   Uu. uF'  p\        P                  ! VP	                  4       4      NK)  	  upRR7      G Rj  x€L
 p\        V4       F2  w  pw  rEV'       d   K  V P                  P                  RV R2V4       K4  	  V P                  R V P                  R V P                  P                  4        V P                  P                  4        R# u upi  Lš5i)z^
Shut down all of the workers in the pool.

The pool is unusable after this method is called.
T)ÚconsumeErrorsNzjoining disttrial worker #z failed:NNN)r   Úworkersr   ÚfromCoroutineÚexitÚ	enumerateÚ_loggerÚfailurerd   ÚtestLogÚcloseÚtestDirLockÚunlock)re   ra   ÚresultsÚnÚ	succeededrp   s   &     r:   ÚjoinÚStartedWorkerPool.joinˆ   sÂ   é € ô %ØAEÇÂÓNÁ°vŒX×#Ò# F§K¡K£MÖ2ÁÑNØô
÷ 
ˆô (1°Ö'9Ñ#ˆAÑ#�	ß‘9Ø—‘×$Ñ$Ð'AÀ!ÀÀGÐ%LÈgÖVñ (:ð �L‰L˜ˆOØ�O‰O˜AÐØ�‰×ÑÔØ×Ñ×ÑÖ!ùò Oñ
ùs#   ‚C,–-C%ÁC,ÁC*ÁC,Á1A:C,c                ó†   <€ V ^8„  d   Qh/ S[ S[,          ;R&   S[;R&   S[;R&   S[S[,          ;R&   S[S[,          ;R&   # )r=   rN   rs   rq   rk   rd   )r   r   r   r   r   r-   r.   )r?   rS   s   "€r:   r@   r\   c   sS   ø‡ ‚ ñ( ™s•mÑ#ñ) ñ*  Ññ+ ñ, �Oñ- ñ. ‘+ÕÑñ/ ñ0 ‘^Õ$Ñ$ò1 r9   r2   N)r3   r4   r5   r6   r7   r   ro   rf   rx   rU   r8   rV   rW   s   @r:   rY   rY   c   s/   ø‡ € ññ0 ‹h€G÷ð ÷"ð "÷K ƒ r9   rY   c                   óZ   a € ] tR t^œt o RtV 3R lR ltR tV 3R lR ltV 3R ltRt	V t
R	# )
Ú
WorkerPoolz”
Manage a fixed-size collection of child processes which can run tests.

@ivar _config: Configuration for the precise way in which the pool is run.
c          	      ób   <€ V ^8„  d   QhRS[ S[,          RS[S[,          RS[RS[S[,          /# )r=   Ú	protocolsrN   rP   r>   )r   r.   r   r   r   r   r-   )r?   rS   s   "€r:   r@   ÚWorkerPool.__annotate__¦   sA   ø€ ÷ 
ñ 
á™NÕ+ð
ñ #¡3�-ð
ñ ð	
ñ
 
‰kÕ	ñ
r9   c                ó�   € \        V4       UUu. uF)  w  rE\        WRP                  \        V4      4      V4      NK+  	  upp# u uppi )aL  
Create local worker protocol instances and return them.

@param protocols: The process/protocol adapters to use for the created
workers.

@param workingDirectory: The base path in which we should run the
    workers.

@param logFile: The test log, for workers to write to.

@return: A list of C{quantity} C{LocalWorker} instances.
)rn   r-   ÚchildrR   )re   r~   rN   rP   ÚxÚprotocols   &&&&  r:   Ú_createLocalWorkersÚWorkerPool._createLocalWorkers¦   sF   € ô*  )¨Ô3ô
á3‘�ô ˜×"8Ñ"8¼¸Q»Ó"@À'ÖJÙ3ò
ð 	
ùó 
s   �/Ac           
     ó˜  € \         R,          P                  P                  p^ R^R^R\        R\        R/p\
        P                  P                  4       p\
        P                  P                  \        P                  4      VR&   V F@  p\        P                  V.pVP                  V4       V! V\        P                  W…VR7       KB  	  R# )zò
Spawn processes from a list of process protocols.

@param spawner: A C{IReactorProcess.spawnProcess} implementation.

@param protocols: An iterable of C{ProcessProtocol} instances.

@param arguments: Extra arguments passed to the processes.
ztwisted.trial._dist.workertrialÚwÚrÚ
PYTHONPATH)ÚargsÚchildFDsÚenvN)r   ÚfilePathÚpathr%   r&   ÚosÚenvironÚcopyÚpathseprx   ÚsysÚ
executableÚextend)	re   Úspawnerr~   Ú	argumentsÚworkertrialPathr‹   r�   ra   rŠ   s	   &&&&     r:   Ú_launchWorkerProcessesÚ!WorkerPool._launchWorkerProcesses¾   s    € ô (Ð(IÕJ×SÑS×XÑXˆàˆsØˆsØˆsÜ˜sÜ ð
ˆô —*‘*—/‘/Ó#ˆô !#§
¡
§¡´·±Ó 9ˆ�ÑÛˆFÜ—N‘N OÐ4ˆDØ�K‰K˜	Ô"Ù�FœCŸN™N°Èg×Vó  r9   c                ó&   <€ V ^8„  d   QhRS[ RS[/# )r=   rD   r>   )r   rY   )r?   rS   s   "€r:   r@   r   Ù   s   ø€ ÷ &
ñ &
¡?ð &
Ñ7Hñ &
r9   c              ƒ  óR  "  € \        V P                  P                  4      w  r#\        V P                  P                  4      '       d!   \        V P                  P                  4      pM%VP                  V P                  P                  4      p\        V4      p\        V P                  P                  4       Uu. uF  p\        4       NK  	  ppV P                  VVV4      pV P                  VP                  VV P                  P                  4       \        VVVVV4      # u upi 5i)zo
Launch all of the workers for this pool.

@return: A started pool object that can run jobs using the workers.
)r#   Ú_configrN   r   rP   r   ÚpreauthChildr$   ÚrangerM   r.   r„   r™   ÚspawnProcessrO   rY   )	re   rD   ÚtestDirrs   ÚtestLogPathrq   r‚   rd   rk   s	   &&       r:   ÚstartÚWorkerPool.startÙ   s   é € ô  4Ø�L‰L×)Ñ)ó 
Ñˆô �—‘×%Ñ%×&Ò&ä" 4§<¡<×#7Ñ#7Ó8‰Kð
 "×.Ñ.¨t¯|©|×/CÑ/CÓDˆKÜ˜kÓ*ˆä05°d·l±l×6MÑ6MÔ0NÓOÑ0N¨1”nÖ&Ñ0Nˆ
ÐOØ×*Ñ*ØØØó
ˆð
 	×#Ñ#Ø× Ñ ØØ�L‰L×(Ñ(ô	
ô !ØØØØØó
ð 	
ùò Pùs   ‚B8D'Â:D"ÃAD'c                ó&   <€ V ^8„  d   Qh/ S[ ;R&   # )r=   r�   )rK   )r?   rS   s   "€r:   r@   r   œ   s   ø‡ ‚ ñ Ñò r9   r2   N)r3   r4   r5   r6   r7   r„   r™   r£   rU   r8   rV   rW   s   @r:   r|   r|   œ   s,   ø‡ € ñ÷
ð 
ò0W÷6&
ð &
÷{ ƒ r9   r|   c                ó<   € V ^8„  d   QhR\         R\        R\         /# )r=   ÚuntilFailureÚresultr>   )Úboolr   )r?   s   "r:   r@   r@     s!   € ÷ 
3ñ 
3¤ð 
3¬yð 
3¼Tñ 
3r9   c                ó6   € T ;'       d    VP                  4       # )zã
Determine whether the test suite should be iterated again.

@param untilFailure: C{True} if the suite is supposed to run until
    failure.

@param result: The test result of the test suite iteration which just
    completed.
)ÚwasSuccessful)r§   r¨   s   &&r:   ÚshouldContinuer¬     s   € ð ×2Ð2˜F×0Ñ0Ó2Ð2r9   c                ó¾   € V ^8„  d   QhR\         R\        \        ,          R\        R\        \        \
        \        ,          \        .\        R,          3,          RR/# )r=   ÚpoolÚ	testCasesr¨   ÚdriveWorkerNr>   )rY   r   r    r(   r   r
   r.   r   )r?   s   "r:   r@   r@     sc   € ÷ Fñ FÜ
ðFäœ	Õ"ðFô ðFô Ü	”x¤	Õ*¬NÐ;¼YÀt½_ÐLõð	Fð 
ñFr9   c              ƒ   óØ   "  €  V P                  \        W2V4      4      G R j  x€L
  R #  L  \         d2    TP                  P	                  \        R4      \        4       4        R # i ; i5i)Nz
<runTests>)rf   r   Ú	ExceptionÚoriginalÚaddErrorr"   r   )r®   r¯   r¨   r°   s   &&&&r:   ÚrunTestsrµ     sQ   é € ðFà�h‰h”w˜{°IÓ>Ó?×?Ô?øÜô Fð 	�‰× Ñ ¤¨LÓ!9¼7»9×Eð	Füs1   ‚A*„+ ¢)£+ §A*©+ «8A'Á#A*Á&A'Á'A*c                   ó*  a € ] tR tRt o Rt]t]! 4       tRt	]
! R]! ]R7      R7      t]
! R]! ]P                  4      R7      tRtRtRtRtR	t]tV 3R
 lR ltR tV 3R lR ltRV 3R lR lltV 3R lR ltV 3R lR ltV 3R lR ltV 3R ltRt V t!R# )ÚDistTrialRunneri!  aÃ  
A specialized runner for distributed trial. The runner launches a number of
local worker processes which will run tests.

@ivar _maxWorkers: the number of workers to be spawned.

@ivar _exitFirst: ``True`` to stop the run as soon as a test case fails.
    ``False`` to run through the whole suite and report all of the results
    at the end.

@ivar stream: stream which the reporter will use.

@ivar _reporterFactory: the reporter class to be used.
FN)Úfactory)ÚdefaultÚ	converterr¹   ztest.logÚ_trial_tempc                ó    <€ V ^8„  d   QhRS[ /# r<   r'   )r?   rS   s   "€r:   r@   ÚDistTrialRunner.__annotate__J  s   ø€ ÷ 	3ñ 	3™\ñ 	3r9   c                óÂ   € V P                  V P                  V P                  V P                  R7      pV P                  '       d   \        V4      pV P                  V4      # )z<
Make reporter factory, and wrap it with a L{DistReporter}.
)Úrealtime)Ú_reporterFactoryÚstreamÚ_tracebackFormatÚ_realTimeErrorsÚ_uncleanWarningsr!   Ú_distReporterFactory)re   Úreporters   & r:   Ú_makeResultÚDistTrialRunner._makeResultJ  sY   € ð ×(Ñ(Ø�K‰K˜×.Ñ.¸×9MÑ9Mð )ó 
ˆð × × Ð Ü5°hÓ?ˆHØ×(Ñ(¨Ó2Ð2r9   c                ó&   € VP                  4        R# )zr
Write test run final outcome to result.

@param result: A C{TestResult} which will print errors and the summary.
N)Údone)re   r¨   s   &&r:   ÚwriteResultsÚDistTrialRunner.writeResultsU  s   € ð 	�‰Žr9   c                ó@   <€ V ^8„  d   QhRS[ RS[S[,          RS[RR/# )r=   r¨   r¯   ra   r>   N)r(   r
   r    r.   )r?   rS   s   "€r:   r@   r½   ]  s8   ø€ ÷ ñ áðñ ™IÕ&ðñ ð	ð
 
ñr9   c              ƒ  óV   aa"  € VV3R lpV F  pV! V4      G Rj  x€L
  K  	  R#  L
5i)aP  
Drive a L{LocalWorkerAMP} instance, iterating the tests and calling
C{run} for every one of them.

@param worker: The L{LocalWorkerAMP} to drive.

@param result: The global L{DistReporter} instance.

@param testCases: The global list of tests to iterate.

@return: A coroutine that completes after all of the tests have
    completed.
c              “   ó¶   <"  €  SP                  V S4      G R j  x€L
  R #  L  \         d)    SP                  P                  T \	        4       4        R # i ; i5ir_   )rf   r²   r³   r´   r   )Úcaser¨   ra   s   &€€r:   ÚtaskÚ*DistTrialRunner._driveWorker.<locals>.taskq  sC   øé € ð:Ø—j‘j  vÓ.×.Ô.øÜô :Ø—‘×(Ñ(¨¬w«y×9ð:üs1   ƒA…# š!›# ŸA¡# £/AÁAÁAÁANr2   )re   r¨   r¯   ra   rÑ   rÐ   s   &f&f  r:   Ú_driveWorkerÚDistTrialRunner._driveWorker]  s'   ùé € ö(	:ó ˆDÙ�t“*×Òó Ùùs   „)œ'�)c                óB   <€ V ^8„  d   QhRS[ S[S[3,          RS[RS[/# )r=   Úsuiter§   r>   )r   r   r   r©   r(   )r?   rS   s   "€r:   r@   r½   z  s8   ø€ ÷ J%ñ J%á‘X™yÐ(Õ)ðJ%ñ ðJ%ñ 
ñ	J%r9   c           	   ƒ  ó†  a aaa"  € \        \        V4      4      oS P                  \        \	        \        S4      S P                  4      \        S P                  4      S P                  S P                  4      4      pS P                  P                  RVP                  4        R24       VP                  S P                  4      G Rj  x€L
 o\!        \"        S4      p\$        R V VVV3R ll4       p \'        WE4      G Rj  x€L
 SP)                  4       G Rj  x€L
  #  LU L L	  SP)                  4       G Rj  x€L 
  i ; i5i)zú
Spawn local worker processes and load tests. After that, run them.

@param suite: A test or suite to be run.

@param untilFailure: If C{True}, continue to run the tests until they
    fail.

@return: A coroutine that completes with the test result.
zRunning z tests.
Nc                ó0   € V ^8„  d   QhR\         R\        /# )r=   rv   r>   )rQ   r(   )r?   s   "r:   r@   Ú.DistTrialRunner.runAsync.<locals>.__annotate__¥  s   € ÷ 	ñ 	¤#ð 	¬,ñ 	r9   c              “   ó@  <a"  € S'       d'   SP                   P                  R V ^,            R24       SP                  4       oSP                  '       d   V3R lpMR p\	        S\        VS4      SSP                  4      G Rj  x€L
  SP                  S4       S#  L5i)z
Test Pass Ú
c                 ó8   <€ SP                   P                  4       # r_   )r³   r«   )Ú_r¨   s   &€r:   Ú<lambda>Ú@DistTrialRunner.runAsync.<locals>.runAndReport.<locals>.<lambda>°  s   ø€ ¨6¯?©?×+HÑ+HÔ+Jr9   c                 ó   € R # )Tr2   )rÝ   s   &r:   rÞ   rß   ²  s   € ©4r9   N)rÁ   ÚwriterÇ   Ú
_exitFirstrµ   r,   rÓ   rË   )rv   ÚcasesConditionr¨   re   ÚstartedPoolr¯   r§   s   & @€€€€r:   ÚrunAndReportÚ.DistTrialRunner.runAsync.<locals>.runAndReport¤  s“   ùé € çð —‘×!Ñ! J¨q°1­u¨g°RÐ"8Ô9à×%Ñ%Ó'ˆFà��ˆô "K‘á!/�äØÜ˜.¨)Ó4ØØ×!Ñ!ó	÷ ð ð ×Ñ˜fÔ%ØˆMñùs   „ABÁ/BÂBÂB)Úlistr   Ú_workerPoolFactoryrK   ÚminÚlenÚ_maxWorkersr   Ú_workingDirectoryÚ_workerArgumentsÚ_logfilerÁ   rá   ÚcountTestCasesr£   Ú_reactorr   r¬   r)   r+   rx   )re   rÖ   r§   ÚpoolStarterÚ	conditionrå   rä   r¯   s   f&f   @@r:   ÚrunAsyncÚDistTrialRunner.runAsyncz  s  ûé € ô" œ uÓ-Ó.ˆ	ð ×-Ñ-Üä”C˜	“N D×$4Ñ$4Ó5Ü˜×/Ñ/Ó0Ø×%Ñ%Ø—‘óó
ˆð 	�‰×Ñ˜H U×%9Ñ%9Ó%;Ð$<¸IÐFÔGð (×-Ñ-¨d¯m©mÓ<×<ˆô œN¨LÓ9ˆ	ô 
÷	ò 	ó 
ð	ð0	%ô & iÓ>×>ð ×"Ñ"Ó$×$Ñ$ñM =ñF ?ñ %ø�+×"Ñ"Ó$×$Ò$üsZ   †CEÃDÃ)EÃ2D# Ä DÄD# ÄEÄD!ÄEÄD# Ä!EÄ#D>Ä7D:Ä8D>Ä>Ec                óB   <€ V ^8„  d   QhRS[ S[S[3,          RS[RS[/# )r=   Útestr§   r>   )r   r   r   r©   r   )r?   rS   s   "€r:   r@   r½   Æ  s,   ø€ ÷ *0ñ *0™™x©Ð2Õ3ð *0Á4ð *0ÉIñ *0r9   c                ó  a aaa€ R oRoR V3R llpR VVV3R llpR VV 3R llpS P                   P                  RR	V4       \        P                  ! S P	                  W4      4      P                  V4      P                  V4      oS P                   P                  4        \        S\        4      '       d   SP                  4        \        S\        4      '       g   Q S R
24       h\        \        SP                  4      # )NFc                óJ   € V ^8„  d   QhR\         \        \        3,          RR/# )r=   rˆ   r>   N)r   r   r(   )r?   s   "r:   r@   Ú*DistTrialRunner._run.<locals>.__annotate__Ë  s$   € ÷ 	ñ 	”uœW¤lÐ2Õ3ð 	¸ñ 	r9   c                 ó   <€ V oR # r_   r2   )rˆ   r¨   s   &€r:   ÚcaptureÚ%DistTrialRunner._run.<locals>.captureË  s   ø€ àŠFr9   c                óP   € V ^8„  d   QhR\         \        \        ,          ,          /# r<   )r	   r   Úobject)r?   s   "r:   r@   rù   Ï  s   € ÷ 	ñ 	¤¬´&Õ)9Õ :ñ 	r9   c                  ó8   <€ R o Sf   SP                  4        S# R# )TN)Úcancel)ÚreactorStoppingr¨   ÚtestsInProgresss   €€€r:   ÚmaybeStopTestsÚ,DistTrialRunner._run.<locals>.maybeStopTestsÏ  s"   ø€ à"ˆOØŠ~Ø×&Ñ&Ô(Ø&Ð&Ùr9   c                ó0   € V ^8„  d   QhR\         R\         /# )r=   r¨   r>   )rþ   )r?   s   "r:   r@   rù   ×  s   € ÷ 	ñ 	¤Vð 	´ñ 	r9   c                 óL   <€ S'       g   SP                   P                  4        V # r_   )rð   Ústop)r¨   r  re   s   &€€r:   ÚmaybeStopReactorÚ.DistTrialRunner._run.<locals>.maybeStopReactor×  s   ø€ ß"Ø—‘×"Ñ"Ô$ØˆMr9   ÚbeforeÚshutdownz is not DistReporter)rð   ÚaddSystemEventTriggerr   rl   ró   ÚaddBothrf   Ú
isinstancer   ÚraiseExceptionr(   r   r   r³   )	re   rö   r§   rû   r  r  r  r¨   r  s	   f&&   @@@r:   Ú_runÚDistTrialRunner._runÆ  sÖ   û€ Ø59ˆØ %ˆ÷	ð 	÷	ò 	÷	ñ 	ð
 	�‰×+Ñ+¨H°jÀ.ÔQô ×"Ò" 4§=¡=°Ó#DÓEß‰W�WÓß‰WÐ%Ó&ð 	ð 	�‰×ÑÔä�fœg×&Ò&Ø×!Ñ!Ô#ô
 ˜&¤,×/Ò/ÐP°F°8Ð;OÐ1PÓPÐ/ô ”I˜vŸ™Ó/Ð/r9   c                ó<   <€ V ^8„  d   QhRS[ S[S[3,          RS[/# ©r=   rö   r>   ©r   r   r   r   )r?   rS   s   "€r:   r@   r½   ò  s%   ø€ ÷ 3ñ 3™™h©	Ð1Õ2ð 3±yñ 3r9   c                ó(   € V P                  VRR7      # )zI
Run a reactor and a test suite.

@param test: The test or suite to run.
F©r§   ©r  ©re   rö   s   &&r:   rf   ÚDistTrialRunner.runò  s   € ð �y‰y˜¨EˆyÓ2Ð2r9   c                ó<   <€ V ^8„  d   QhRS[ S[S[3,          RS[/# r  r  )r?   rS   s   "€r:   r@   r½   ú  s%   ø€ ÷ 2ñ 2¡E©(±IÐ*=Õ$>ð 2Á9ñ 2r9   c                ó(   € V P                  VRR7      # )zd
Run the tests with local worker processes until they fail.

@param test: The test or suite to run.
Tr  r  r  s   &&r:   ÚrunUntilFailureÚDistTrialRunner.runUntilFailureú  s   € ð �y‰y˜¨DˆyÓ1Ð1r9   c                óæ   <€ V ^8„  d   Qh/ S[ RS[3,          ;R&   S[;R&   S[S[,          ;R&   S[;R&   S[;R&   S[;R&   S[;R&   S[;R	&   S[;R
&   S[;R&   S[;R&   S[ S[.S[	3,          ;R&   # )r=   .rÀ   rë   rí   râ   rð   rÁ   rÂ   rÃ   rÄ   rî   rì   rè   )
r   r   rQ   r   rR   r©   r1   r   rK   r|   )r?   rS   s   "€r:   r@   r½   !  sÌ   ø‡ ‚ ñ, ˜s¡I˜~Õ.Ñ.ñ- ñ. Ññ/ ñ0 ™3•iÑñ1 ñ2 Ññ3 ñ4  ñ ñ5 ñ@ ÑOñA ñD Ñ%ñE ñF Ñ!ñG ñH Ñ"ñI ñJ ÑñK ñL Ñ*ñM ñN !Ñ"2Ð!3±ZÐ!?Õ@ÑMòO r9   r2   )F)"r3   r4   r5   r6   r7   r(   rÅ   r   ro   râ   r   r   rI   rð   r“   ÚstdoutrÁ   rÂ   rÃ   rÄ   rî   rì   r|   rè   rÇ   rË   rÓ   ró   r  rf   r  rU   r8   rV   rW   s   @r:   r·   r·   !  s»   ø‡ € ñð (ÐÙ‹h€Gð €JÙ"'àÙ!¨/Ô:ô#€Hñ  4±?À3Ç:Á:Ó3NÔO€Fà%ÐØ!€OØ"ÐØ€HØ*ÐØCMÐ÷	3ð 	3ò÷ð ÷:J%ò J%÷X*0ð *0÷X3ð 3÷2ð 2÷s ƒ r9   r·   )Nr7   r�   r“   Ú	functoolsr   Úos.pathr   Útypingr   r   r   r   r   r	   r
   r   r   r   Úunittestr   r   Úattrsr   r   r   Úattrs.convertersr   Útwisted.internet.deferr   r   r   Útwisted.internet.interfacesr   r   Útwisted.loggerr   Útwisted.python.failurer   Útwisted.python.filepathr   Útwisted.python.lockfiler   Útwisted.python.modulesr   Ú_asyncrunnerr   Úitrialr   r    rÆ   r!   Úrunnerr"   Úutilr#   r$   Ú r%   r&   Údistreporterr(   Ú
functionalr)   r*   r+   r,   ra   r-   r.   r/   r1   rI   rK   rY   r|   r¬   rµ   r·   r2   r9   r:   Ú<module>r4     sù   ðñ
ó 
Û 
Ý Ý ÷÷ ÷ ÷ )ç 'Ñ 'Ý ,ç HÑ Hß EÝ !Ý *Ý ,Ý 2Ý 0Ý (ß )Ý 5Ý ß 4ß 3Ý &ß MÓ Mß =Ñ =ô˜ oô õEð( ÷ð ó ðð* ÷5"ð 5"ó ð5"ðp ÷b
ð b
ó ðb
õJ
3õFð$ ÷^2ð ^2ó ò^2r9   