§
    Ètºfß@  ã                   óº  — d Z ddlZddlZddlmZ ddlmZ ddlmZm	Z	m
Z
mZmZmZmZmZmZmZ ddlmZmZ ddlmZmZmZ ddlmZ dd	lmZmZmZ dd
lm Z m!Z! ddl"m#Z# ddl$m%Z% ddl&m'Z' ddl(m)Z) ddl*m+Z+ ddl,m-Z- ddl.m/Z/m0Z0 ddl1m2Z2 ddl3m4Z4 ddl5m6Z6m7Z7 ddl8m9Z9m:Z: ddl;m<Z< ddl=m>Z>m?Z?m@Z@mAZA ddlBmCZCmDZDmEZE  G d„ de e!¦  «        ZFdeFfd„ZGe G d„ d ¦  «        ¦   «         ZHe G d!„ d"¦  «        ¦   «         ZIe G d#„ d$¦  «        ¦   «         ZJd%eKd&e/deKfd'„ZLd(eId)ee0         d&e<d*e
e<ee0         eDge	d         f         ddf
d+„ZMe G d,„ d-¦  «        ¦   «         ZNdS ).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                   ó   — e Zd ZdZdS )ÚIDistTrialReactorz7
    The reactor interfaces required by disttrial.
    N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© ó    ú\/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/twisted/trial/_dist/disttrial.pyr3   r3   3   s   € € € € € ðð ð ð r9   r3   Úreturnc                  óÆ   — ddl mc m}  t          t	          j        | ¦  «        t          j        | ¦  «        g¦  «        rt          t          | ¦  «        S t          d¦  «        ‚)zR
    Get the default reactor, ensuring it is suitable for use with disttrial.
    r   Nz-Reactor does not provide the right interfaces)
Útwisted.internet.reactorÚinternetÚreactorÚallr   Ú
providedByr   r   r3   Ú	TypeError)ÚdefaultReactors    r:   Ú_defaultReactorrD   9   st   € ð 6Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5å
åÔ# NÑ3Ô3ÝÔ& ~Ñ6Ô6ð	
ñô ð 	7õ Õ% ~Ñ6Ô6Ð6å
ÐCÑ
DÔ
DÐDr9   c                   óT   — e Zd ZU dZeed<   ee         ed<   ee	         ed<   e	ed<   dS )ÚWorkerPoolConfiga’  
    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.
    Ú
numWorkersÚworkingDirectoryÚworkerArgumentsÚlogFileN)
r4   r5   r6   r7   ÚintÚ__annotations__r   r   r   Ústrr8   r9   r:   rF   rF   M   sN   € € € € € € ðð ð €O€O�OØ˜s”mÐ#Ð#Ñ#Ø˜c”]Ð"Ð"Ñ"Ø€L€L�L€L€Lr9   rF   c                   ó¢   — e Zd ZU dZee         ed<   eed<   eed<   e	e
         ed<   e	e         ed<    e¦   «         Zdee         dd	fd
„Zdd„Zd	S )ÚStartedWorkerPoolaE  
    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.
    rH   ÚtestDirLockÚtestLogÚworkersÚ
ampWorkersÚworkerActionr;   Nc              ƒ   óX   ‡K  — t          ˆfd„| j        D ¦   «         ¦  «        ƒ d{V —† dS )zB
        Run an action on all of the workers in the pool.
        c              3   óH   •K  — | ]}t           ‰|¦  «        ¦  «        V — Œd S ©N)r,   )Ú.0ÚworkerrT   s     €r:   ú	<genexpr>z(StartedWorkerPool.run.<locals>.<genexpr>ƒ   sF   øè è € ð 
ð 
Ø4:�M˜,˜, vÑ.Ô.Ñ/Ô/ð
ð 
ð 
ð 
ð 
ð 
r9   N)r   rS   )ÚselfrT   s    `r:   ÚrunzStartedWorkerPool.run   sh   øè è € õ ð 
ð 
ð 
ð 
Ø>B¼oð
ñ 
ô 
ñ 
ô 
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð ˆtr9   c              ƒ   óT  K  — t          d„ | j        D ¦   «         d¬¦  «        ƒ d{V —†}t          |¦  «        D ])\  }\  }}|s| j                             d|› d�|¦  «         Œ*| j        dd…= | j        dd…= | j                             ¦   «          | j         	                    ¦   «          dS )zv
        Shut down all of the workers in the pool.

        The pool is unusable after this method is called.
        c                 óZ   — g | ](}t          j        |                     ¦   «         ¦  «        ‘Œ)S r8   )r   ÚfromCoroutineÚexit)rX   rY   s     r:   ú
<listcomp>z*StartedWorkerPool.join.<locals>.<listcomp>�   s+   € ÐNÐNÐN°v�XÔ# F§K¢K¡M¤MÑ2Ô2ÐNÐNÐNr9   T)ÚconsumeErrorsNzjoining disttrial worker #z failed)
r   rR   Ú	enumerateÚ_loggerÚfailurerS   rQ   ÚcloserP   Úunlock)r[   ÚresultsÚnÚ	succeededre   s        r:   ÚjoinzStartedWorkerPool.joinˆ   sí   è è € õ %ØNÐNÀÄÐNÑNÔNØð
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆõ (1°Ñ'9Ô'9ð 	Wð 	WÑ#ˆAÑ#�	˜7Øð WØ”×$Ò$Ð%LÀ!Ð%LÐ%LÐ%LÈgÑVÔVÐVøàŒL˜˜˜ˆOØŒO˜A˜A˜AÐØŒ×ÒÑÔÐØÔ×ÒÑ!Ô!Ð!Ð!Ð!r9   )r;   N)r4   r5   r6   r7   r   r   rL   r   r   r	   r/   r0   r   rd   r1   r\   rk   r8   r9   r:   rO   rO   c   s¯   € € € € € € ðð ð$ ˜s”mÐ#Ð#Ñ#ØÐÐÑØ€O€O�OØ�+ÔÐÐÑØ�^Ô$Ð$Ð$Ñ$àˆf‰hŒh€Gð l°3Ô&7ð ¸Dð ð ð ð ð"ð "ð "ð "ð "ð "r9   rO   c            	       óp   — e Zd ZU dZeed<   dee         dee	         de
dee         fd„Zd„ Zd	edefd
„ZdS )Ú
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.
    Ú_configÚ	protocolsrH   rJ   r;   c                 ó>   ‡‡— ˆˆfd„t          |¦  «        D ¦   «         S )aŒ  
        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.
        c           
      óx   •— g | ]6\  }}t          |‰                     t          |¦  «        ¦  «        ‰¦  «        ‘Œ7S r8   )r/   ÚchildrM   )rX   ÚxÚprotocolrJ   rH   s      €€r:   ra   z2WorkerPool._createLocalWorkers.<locals>.<listcomp>¹   sN   ø€ ð 
ð 
ð 
á��8õ ˜Ð"2×"8Ò"8½¸Q¹¼Ñ"@Ô"@À'ÑJÔJð
ð 
ð 
r9   )rc   )r[   ro   rH   rJ   s     ``r:   Ú_createLocalWorkerszWorkerPool._createLocalWorkers¦   s<   øø€ ð&
ð 
ð 
ð 
ð 
å(¨Ñ3Ô3ð
ñ 
ô 
ð 	
r9   c           
      óx  — t           d         j        j        }ddddddt          dt          di}t
          j                             ¦   «         }t
          j         	                    t          j        ¦  «        |d<   |D ]?}t          j        |g}|                     |¦  «          ||t          j        |||¬¦  «         Œ@d	S )
a  
        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.workertrialr   Úwr'   Úrr   Ú
PYTHONPATH)ÚargsÚchildFDsÚenvN)r   ÚfilePathÚpathr(   r)   ÚosÚenvironÚcopyÚpathseprk   ÚsysÚ
executableÚextend)	r[   Úspawnerro   Ú	argumentsÚworkertrialPathr{   r€   rY   rz   s	            r:   Ú_launchWorkerProcessesz!WorkerPool._launchWorkerProcesses¾   s¿   € õ (Ð(IÔJÔSÔXˆàˆsØˆsØˆsÝ˜sÝ ð
ˆõ ”*—/’/Ñ#Ô#ˆõ !#¤
§¢µ´Ñ 9Ô 9ˆ�ÑØð 	Wð 	WˆFÝ”N OÐ4ˆDØ�KŠK˜	Ñ"Ô"Ð"ØˆG�F�CœN°ÀÈgÐVÑVÔVÐVÐVð	Wð 	Wr9   r?   c              ƒ   óæ  K  — t          | j        j        ¦  «        \  }}t          | j        j        ¦  «        rt          | j        j        ¦  «        }n|                     | j        j        ¦  «        }t          |¦  «        }d„ t          | j        j	        ¦  «        D ¦   «         }|  
                    |||¦  «        }|                      |j        || j        j        ¦  «         t          |||||¦  «        S )z‡
        Launch all of the workers for this pool.

        @return: A started pool object that can run jobs using the workers.
        c                 ó*   — g | ]}t          ¦   «         ‘ŒS r8   )r0   )rX   rs   s     r:   ra   z$WorkerPool.start.<locals>.<listcomp>í   s   € ÐOÐOÐO¨1•nÑ&Ô&ÐOÐOÐOr9   )r%   rn   rH   r   rJ   r   ÚpreauthChildr&   ÚrangerG   ru   r‰   ÚspawnProcessrI   rO   )r[   r?   ÚtestDirrP   ÚtestLogPathrQ   rS   rR   s           r:   ÚstartzWorkerPool.startÙ   s  è è € õ  4ØŒLÔ)ñ 
ô  
Ñˆ�õ �”Ô%Ñ&Ô&ð 	Eå" 4¤<Ô#7Ñ8Ô8ˆKˆKð
 "×.Ò.¨t¬|Ô/CÑDÔDˆKÝ˜kÑ*Ô*ˆàOÐOµ°d´lÔ6MÑ0NÔ0NÐOÑOÔOˆ
Ø×*Ò*ØØØñ
ô 
ˆð
 	×#Ò#ØÔ ØØŒLÔ(ñ	
ô 	
ð 	
õ !ØØØØØñ
ô 
ð 	
r9   N)r4   r5   r6   r7   rF   rL   r   r0   r   r   r   r	   r/   ru   r‰   r   rO   r‘   r8   r9   r:   rm   rm   œ   s«   € € € € € € ðð ð ÐÐÑð
à˜NÔ+ð
ð # 3œ-ð
ð ð	
ð
 
ˆkÔ	ð
ð 
ð 
ð 
ð0Wð Wð Wð6&
 ?ð &
Ð7Hð &
ð &
ð &
ð &
ð &
ð &
r9   rm   ÚuntilFailureÚresultc                 ó.   — | o|                      ¦   «         S )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˜F×0Ò0Ñ2Ô2Ð2r9   ÚpoolÚ	testCasesÚdriveWorkerc              ƒ   óê   K  — 	 |                       t          |||¦  «        ¦  «        ƒ d {V —† d S # t          $ r8 |j                             t          d¦  «        t          ¦   «         ¦  «         Y d S w xY w)Nz
<runTests>)r\   r   Ú	ExceptionÚoriginalÚaddErrorr$   r   )r—   r˜   r“   r™   s       r:   ÚrunTestsrž     s�   è è € ðFà�hŠh•w˜{¨F°IÑ>Ô>Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?øÝð Fð Fð Fð 	Œ× Ò ¥¨LÑ!9Ô!9½7¹9¼9ÑEÔEÐEÐEÐEÐEð	Føøøs   „*0 °>A2Á1A2c                   ó  — e Zd ZU dZeZ e¦   «         Zede	f         e
d<   ee
d<   ee         e
d<   dZee
d<    ed ee¬	¦  «        ¬
¦  «        Zee
d<    ed eej        ¦  «        ¬
¦  «        Zee
d<   dZee
d<   dZee
d<   dZee
d<   dZee
d<   dZee
d<   eZee gef         e
d<   defd„Z!d„ Z"dede#e$         de%ddfd„Z&	 d$de'e(e)f         dedefd„Z*d e'e(e)f         dede	fd!„Z+d e'e(e)f         de	fd"„Z,d e'e(e)f         de	fd#„Z-dS )%ÚDistTrialRunneraç  
    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.
    .Ú_reporterFactoryÚ_maxWorkersÚ_workerArgumentsFÚ
_exitFirstN)Úfactory)ÚdefaultÚ	converterÚ_reactorÚstreamr¦   Ú_tracebackFormatÚ_realTimeErrorsÚ_uncleanWarningsztest.logÚ_logfileÚ_trial_tempÚ_workingDirectoryÚ_workerPoolFactoryr;   c                 ó¦   — |                       | j        | j        | j        ¬¦  «        }| j        rt          |¦  «        }|                      |¦  «        S )zL
        Make reporter factory, and wrap it with a L{DistReporter}.
        )Úrealtime)r¡   r©   rª   r«   r¬   r#   Ú_distReporterFactory)r[   Úreporters     r:   Ú_makeResultzDistTrialRunner._makeResultJ  s\   € ð ×(Ò(ØŒK˜Ô.¸Ô9Mð )ñ 
ô 
ˆð Ô ð 	@Ý5°hÑ?Ô?ˆHØ×(Ò(¨Ñ2Ô2Ð2r9   c                 ó.   — |                      ¦   «          dS )zŠ
        Write test run final outcome to result.

        @param result: A C{TestResult} which will print errors and the summary.
        N)Údone)r[   r“   s     r:   ÚwriteResultszDistTrialRunner.writeResultsU  s   € ð 	�Š‰Œˆˆˆr9   r“   r˜   rY   c              ƒ   óF   ‡‡K  — ˆˆfd„}|D ]} ||¦  «        ƒ d{V —† ŒdS )a�  
        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              “   ó¶   •K  — 	 ‰                      | ‰¦  «        ƒ d {V —† d S # t          $ r+ ‰j                             | t	          ¦   «         ¦  «         Y d S w xY wrW   )r\   r›   rœ   r�   r   )Úcaser“   rY   s    €€r:   Útaskz*DistTrialRunner._driveWorker.<locals>.taskq  sx   øè è € ð:Ø—j’j  vÑ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.øÝð :ð :ð :Ø”×(Ò(¨­w©y¬yÑ9Ô9Ð9Ð9Ð9Ð9ð:øøøs   …# £1AÁANr8   )r[   r“   r˜   rY   r¼   r»   s    ` `  r:   Ú_driveWorkerzDistTrialRunner._driveWorker]  sd   øøè è € ð(	:ð 	:ð 	:ð 	:ð 	:ð 	:ð ð 	ð 	ˆDØ�$�t‘*”*ÐÐÐÐÐÐÐÐð	ð 	r9   Úsuiter’   c           	   ƒ   ó¼  ‡ ‡‡‡K  — t          t          |¦  «        ¦  «        Š‰                      t          t	          t          ‰¦  «        ‰ j        ¦  «        t          ‰ j        ¦  «        ‰ j	        ‰ j
        ¦  «        ¦  «        }‰ j                             d|                     ¦   «         › d�¦  «         |                     ‰ j        ¦  «        ƒ d{V —†Št!          t"          ‰¦  «        }t$          dt&          dt(          fˆ ˆˆˆfd„¦   «         }	 t+          ||¦  «        ƒ d{V —†	 ‰                     ¦   «         ƒ d{V —† S # ‰                     ¦   «         ƒ d{V —† w xY w)a*  
        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.
Nri   r;   c              “   ó  •‡K  — ‰r!‰j                              d| dz   › d�¦  «         ‰                     ¦   «         Š‰j        rˆfd„}nd„ }t	          ‰t          |‰¦  «        ‰‰j        ¦  «        ƒ d {V —† ‰                     ‰¦  «         ‰S )Nz
Test Pass r'   ú
c                 ó6   •— ‰j                              ¦   «         S rW   )rœ   r•   )Ú_r“   s    €r:   ú<lambda>z@DistTrialRunner.runAsync.<locals>.runAndReport.<locals>.<lambda>°  s   ø€ ¨6¬?×+HÒ+HÑ+JÔ+J€ r9   c                 ó   — dS ©NTr8   )rÃ   s    r:   rÄ   z@DistTrialRunner.runAsync.<locals>.runAndReport.<locals>.<lambda>²  s   € ¨4€ r9   )r©   Úwriterµ   r¤   rž   r.   r½   r¸   )ri   ÚcasesConditionr“   r[   ÚstartedPoolr˜   r’   s     @€€€€r:   ÚrunAndReportz.DistTrialRunner.runAsync.<locals>.runAndReport¤  sÑ   øøè è € àð :ð ”×!Ò!Ð"8¨q°1©uÐ"8Ð"8Ð"8Ñ9Ô9Ð9à×%Ò%Ñ'Ô'ˆFàŒð 0ð "KÐ!JÐ!JÐ!J��à!/ �åØÝ˜.¨)Ñ4Ô4ØØÔ!ñ	ô ð ð ð ð ð ð ð ð ×Ò˜fÑ%Ô%Ð%ØˆMr9   )Úlistr    r°   rF   ÚminÚlenr¢   r   r¯   r£   r­   r©   rÇ   ÚcountTestCasesr‘   r¨   r   r–   r+   rK   r*   r-   rk   )r[   r¾   r’   ÚpoolStarterÚ	conditionrÊ   rÉ   r˜   s   ` `   @@r:   ÚrunAsynczDistTrialRunner.runAsyncz  s¡  øøøøè è € õ" � uÑ-Ô-Ñ.Ô.ˆ	ð ×-Ò-Ýå•C˜	‘N”N DÔ$4Ñ5Ô5Ý˜Ô/Ñ0Ô0ØÔ%Ø”ñô ñ
ô 
ˆð 	Œ×ÒÐF U×%9Ò%9Ñ%;Ô%;ÐFÐFÐFÑGÔGÐGð (×-Ò-¨d¬mÑ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<ˆõ �N¨LÑ9Ô9ˆ	õ 
ð	¥#ð 	­,ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ñ 
Œð	ð0	%õ & i°Ñ>Ô>Ð>Ð>Ð>Ð>Ð>Ð>Ð>ð ×"Ò"Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ð$Ð$Ð$ø�+×"Ò"Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ð$Ð$Ð$øøøs   ÄD? Ä?EÚtestc                 ó˜  ‡ ‡‡‡— d ŠdŠdt           t          t          f         dd fˆfd„}dt          t          t
                            fˆˆˆfd„}dt
          dt
          fˆˆ fd„}‰ j                             dd	|¦  «         t	          j        ‰  	                    ||¦  «        ¦  «         
                    |¦  «         
                    |¦  «        Š‰ j                             ¦   «          t          ‰t          ¦  «        r‰                     ¦   «          t          ‰t          ¦  «        sJ ‰› d
�¦   «         ‚t          t          ‰j        ¦  «        S )NFrx   r;   c                 ó   •— | Šd S rW   r8   )rx   r“   s    €r:   Úcapturez%DistTrialRunner._run.<locals>.captureË  s   ø€ àˆFˆFˆFr9   c                  ó<   •— dŠ ‰€‰                      ¦   «          ‰S d S rÆ   )Úcancel)ÚreactorStoppingr“   ÚtestsInProgresss   €€€r:   ÚmaybeStopTestsz,DistTrialRunner._run.<locals>.maybeStopTestsÏ  s*   ø€ à"ˆOØˆ~Ø×&Ò&Ñ(Ô(Ð(Ø&Ð&Ø�4r9   r“   c                 ó>   •— ‰s‰j                              ¦   «          | S rW   )r¨   Ústop)r“   rØ   r[   s    €€r:   ÚmaybeStopReactorz.DistTrialRunner._run.<locals>.maybeStopReactor×  s$   ø€ Ø"ð %Ø”×"Ò"Ñ$Ô$Ð$ØˆMr9   ÚbeforeÚshutdownz is not DistReporter)r   r   r*   r
   r   Úobjectr¨   ÚaddSystemEventTriggerr_   rÑ   ÚaddBothr\   Ú
isinstanceÚraiseExceptionr   r!   rœ   )	r[   rÒ   r’   rÕ   rÚ   rÝ   rØ   r“   rÙ   s	   `     @@@r:   Ú_runzDistTrialRunner._runÆ  s�  øøøø€ Ø59ˆØ %ˆð	•u�W¥lÐ2Ô3ð 	¸ð 	ð 	ð 	ð 	ð 	ð 	ð	¥­µ&Ô)9Ô :ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð	¥Vð 	µð 	ð 	ð 	ð 	ð 	ð 	ð 	ð
 	Œ×+Ò+¨H°jÀ.ÑQÔQÐQõ Ô" 4§=¢=°°|Ñ#DÔ#DÑEÔEßŠW�WÑÔßŠWÐ%Ñ&Ô&ð 	ð 	Œ×ÒÑÔÐå�f�gÑ&Ô&ð 	$Ø×!Ò!Ñ#Ô#Ð#õ
 ˜&¥,Ñ/Ô/ÐPÐP°FÐ1PÐ1PÐ1PÑPÔPÐPõ •I˜vœÑ/Ô/Ð/r9   c                 ó0   — |                       |d¬¦  «        S )za
        Run a reactor and a test suite.

        @param test: The test or suite to run.
        F©r’   ©rå   ©r[   rÒ   s     r:   r\   zDistTrialRunner.runò  s   € ð �yŠy˜¨EˆyÑ2Ô2Ð2r9   c                 ó0   — |                       |d¬¦  «        S )z|
        Run the tests with local worker processes until they fail.

        @param test: The test or suite to run.
        Trç   rè   ré   s     r:   ÚrunUntilFailurezDistTrialRunner.runUntilFailureú  s   € ð �yŠy˜¨DˆyÑ1Ô1Ð1r9   )F).r4   r5   r6   r7   r*   r³   r   rd   r   r!   rL   rK   r	   rM   r¤   Úboolr   r   rD   r¨   r3   rƒ   Ústdoutr©   r   rª   r«   r¬   r­   r¯   rm   r°   rF   rµ   r¸   r   r"   r0   r½   r   r   r   rÑ   rå   r\   rë   r8   r9   r:   r    r    !  s“  € € € € € € ðð ð (ÐØˆf‰hŒh€Gð ˜s I˜~Ô.Ð.Ð.Ñ.ØÐÐÑØ˜3”iÐÐÑØ€J�ÐÐÑØ"' %àØ!�/¨/Ð:Ñ:Ô:ð#ñ #ô #€HÐð ð ñ ð �U 4°?°?À3Ä:Ñ3NÔ3NÐOÑOÔO€FˆFÐOÐOÑOà%Ð�cÐ%Ð%Ñ%Ø!€O�TÐ!Ð!Ñ!Ø"Ð�dÐ"Ð"Ñ"Ø€HˆcÐÐÑØ*Ð�sÐ*Ð*Ñ*ØCMÐ˜Ð"2Ð!3°ZÐ!?Ô@ÐMÐMÑMð	3˜\ð 	3ð 	3ð 	3ð 	3ðð ð ðàðð ˜IÔ&ðð ð	ð
 
ðð ð ð ð@ #ðJ%ð J%à�X˜yÐ(Ô)ðJ%ð ðJ%ð 
ð	J%ð J%ð J%ð J%ðX*0˜˜x¨Ð2Ô3ð *0À4ð *0ÈIð *0ð *0ð *0ð *0ðX3˜˜h¨	Ð1Ô2ð 3°yð 3ð 3ð 3ð 3ð2 E¨(°IÐ*=Ô$>ð 2À9ð 2ð 2ð 2ð 2ð 2ð 2r9   r    )Or7   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.   rY   r/   r0   r1   r3   rD   rF   rO   rm   rì   r–   rž   r    r8   r9   r:   ú<module>r     s<  ðð
ð ð 
€	€	€	Ø 
€
€
€
Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð )Ð (Ð (Ð (Ð (Ð (Ð (Ð (à 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,à HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HØ EÐ EÐ EÐ EÐ EÐ EÐ EÐ EØ !Ð !Ð !Ð !Ð !Ð !Ø *Ð *Ð *Ð *Ð *Ð *Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø (Ð (Ð (Ð (Ð (Ð (Ø )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø Ð Ð Ð Ð Ð Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø &Ð &Ð &Ð &Ð &Ð &Ø MÐ MÐ MÐ MÐ MÐ MÐ MÐ MÐ MÐ MÐ MÐ MØ =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =ðð ð ð ð ˜ oñ ô ð ðEÐ*ð Eð Eð Eð Eð( ðð ð ð ð ñ ô ñ „ðð* ð5"ð 5"ð 5"ð 5"ð 5"ñ 5"ô 5"ñ „ð5"ðp ðb
ð b
ð b
ð b
ð b
ñ b
ô b
ñ „ðb
ðJ
3 ð 
3¨yð 
3¸Tð 
3ð 
3ð 
3ð 
3ðFØ
ðFà˜	Ô"ðFð ðFð Ø	�x 	Ô*¨NÐ;¸YÀt¼_ÐLôð	Fð 
ðFð Fð Fð Fð$ ð^2ð ^2ð ^2ð ^2ð ^2ñ ^2ô ^2ñ „ð^2ð ^2ð ^2r9   