Your IP : 216.73.216.213


Current Path : /opt/alt/python37/lib64/python3.7/site-packages/twisted/test/__pycache__/
Upload File :
Current File : //opt/alt/python37/lib64/python3.7/site-packages/twisted/test/__pycache__/test_ssl.cpython-37.pyc

B

;��]�Y�@sVdZddlmZmZddlmZddlmZddlm	Z	m
Z
mZmZddl
mZddlmZddlmZdd	lmZdd
lmZddlZddlZy0ddlmamZdd
lmaddlmZmZWn"e k
r�dd�Z!e!�YnXddl"m#Z#Gdd�dej$�Z%Gdd�dej$�Z&Gdd�de	j'�Z(Gdd�de	j'�Z)e#ej*�Gdd�de	j'��Z+dd�Z,dd�Z-Gd d!�d!�Z.tdk	�r�Gd"d#�d#tj/�Z0Gd$d%�d%eej1�Z2Gd&d'�d'ej1�Z3Gd(d)�d)e3�Z4Gd*d+�d+ej1�Z5Gd,d-�d-ej1e.�Z6Gd.d/�d/�Z7Gd0d1�d1ej1�Z8Gd2d3�d3ej1�Z9e�:e
d�dk�rRx"e2e3e4e5e6e8e9gD]Z;d4e;_<�qBWdS)5z 
Tests for twisted SSL support.
�)�division�absolute_import)�FilePath)�unittest)�protocol�reactor�
interfaces�defer)�ConnectionDone)�basic)�platform)�ProperlyCloseFilesMixin)�waitUntilAllDisconnectedN)�SSL�crypto)�ssl)�ClientTLSContext�certPathcCsdaadS)N)rr�rr�H/opt/alt/python37/lib64/python3.7/site-packages/twisted/test/test_ssl.py�_noSSLsr)�implementerc@sBeZdZdZdddgZddgZdd�Zd	d
�Zdd�Zd
d�Z	dS)�UnintelligentProtocola
    @ivar deferred: a deferred that will fire at connection lost.
    @type deferred: L{defer.Deferred}

    @cvar pretext: text sent before TLS is set up.
    @type pretext: C{bytes}

    @cvar posttext: text sent after TLS is set up.
    @type posttext: C{bytes}
    s
first lineslast thing before tls startssSTARTTLSsfirst thing after tls startedslast thing evercCst��|_dS)N)r	�Deferred�deferred)�selfrrr�__init__9szUnintelligentProtocol.__init__cCsx|jD]}|�|�qWdS)N)�pretext�sendLine)r�lrrr�connectionMade=sz$UnintelligentProtocol.connectionMadecCsD|dkr@|j�t�|jj�x|jD]}|�|�q$W|j��dS)NsREADY)�	transport�startTLSr�factory�client�posttextr�loseConnection)r�linerrrr�lineReceivedBs
z"UnintelligentProtocol.lineReceivedcCs|j�d�dS)N)r�callback)r�reasonrrr�connectionLostJsz$UnintelligentProtocol.connectionLostN)
�__name__�
__module__�__qualname__�__doc__rr%rr r(r+rrrrr%s
rc@s:eZdZdZddd�Zdd�Zdd�Zd	d
�Zdd�Zd
S)�
LineCollectoraJ
    @ivar deferred: a deferred that will fire at connection lost.
    @type deferred: L{defer.Deferred}

    @ivar doTLS: whether the protocol is initiate TLS or not.
    @type doTLS: C{bool}

    @ivar fillBuffer: if set to True, it will send lots of data once
        C{STARTTLS} is received.
    @type fillBuffer: C{bool}
    FcCs||_||_t��|_dS)N)�doTLS�
fillBufferr	rr)rr1r2rrrr\szLineCollector.__init__cCsd|j_g|j_dS)N�)r#�rawdata�lines)rrrrr bszLineCollector.connectionMadecCst|jj�|�|dkrp|jr8xtd�D]}|�d�q&W|�d�|jrhtttd�}|j	�
||jj�n|��dS)NsSTARTTLSi�s�XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXsREADY)ZprivateKeyFileNameZcertificateFileName)
r#r5�appendr2�rangerr1�ServerTLSContextrr!r"�serverZ
setRawMode)rr'�x�ctxrrrr(gs
zLineCollector.lineReceivedcCs|jj|7_|j��dS)N)r#r4r!r&)r�datarrr�rawDataReceivedxszLineCollector.rawDataReceivedcCs|j�d�dS)N)rr))rr*rrrr+}szLineCollector.connectionLostN)F)	r,r-r.r/rr r(r=r+rrrrr0Os
r0c@seZdZdZdd�ZdS)�SingleLineServerProtocolzK
    A protocol that sends a single line of data at C{connectionMade}.
    cCs|j�d�|j��dS)Ns+OK <some crap>
)r!�write�getPeerCertificate)rrrrr �sz'SingleLineServerProtocol.connectionMadeN)r,r-r.r/r rrrrr>�sr>c@s(eZdZdZdd�Zdd�Zdd�ZdS)	�RecordingClientProtocolzv
    @ivar deferred: a deferred that will fire with first received content.
    @type deferred: L{defer.Deferred}
    cCst��|_dS)N)r	rr)rrrrr�sz RecordingClientProtocol.__init__cCs|j��dS)N)r!r@)rrrrr �sz&RecordingClientProtocol.connectionMadecCs|j�|�dS)N)rr))rr<rrr�dataReceived�sz$RecordingClientProtocol.dataReceivedN)r,r-r.r/rr rBrrrrrA�srAc@s eZdZdZdd�Zdd�ZdS)� ImmediatelyDisconnectingProtocolz�
    A protocol that disconnect immediately on connection. It fires the
    C{connectionDisconnected} deferred of its factory on connetion lost.
    cCs|j��dS)N)r!r&)rrrr�handshakeCompleted�sz3ImmediatelyDisconnectingProtocol.handshakeCompletedcCs|jj�d�dS)N)r#�connectionDisconnectedr))rr*rrrr+�sz/ImmediatelyDisconnectingProtocol.connectionLostN)r,r-r.r/rDr+rrrrrC�srCcCs�t��}|�tjd�t��}|��}||_||_|�|�|�	|d�t�
�}|�d�|�d�|�
d�|�|���|�|���|�|���|�	|d�|||fS)z�
    Create a certificate for given C{organization} and C{organizationalUnit}.

    @return: a tuple of (key, request, certificate) objects.
    i�md5�r�<)rZPKeyZgenerate_keyZTYPE_RSAZX509ReqZget_subject�OZOUZ
set_pubkey�signZX509Zset_serial_numberZgmtime_adj_notBeforeZgmtime_adj_notAfterZ
set_issuerZset_subjectZ
get_pubkey)�organization�organizationalUnit�pkey�reqZsubject�certrrr�generateCertificateObjects�s"



rPc
Csrt||�\}}}x\d|tjfd|tjfd|tjfgD]6\}}}tj�||f��d�}	t	|	��
|tj|��q4WdS)z�
    Create certificate files key, req and cert prefixed by C{basename} for
    given C{organization} and C{organizationalUnit}.
    �keyrNrOzutf-8N)rPrZdump_privatekeyZdump_certificate_requestZdump_certificate�os�extsep�join�encoderZ
setContentZFILETYPE_PEM)
�basenamerKrLrMrNrO�ext�objZdumpFuncZfNamerrr�generateCertificateFiles�s

rYc@s eZdZdZdd�Zdd�ZdS)�ContextGeneratingMixinah
    Offer methods to create L{ssl.DefaultOpenSSLContextFactory} for both client
    and server.

    @ivar clientBase: prefix of client certificate files.
    @type clientBase: C{str}

    @ivar serverBase: prefix of server certificate files.
    @type serverBase: C{str}

    @ivar clientCtxFactory: a generated context factory to be used in
        L{IReactorSSL.connectSSL}.
    @type clientCtxFactory: L{ssl.DefaultOpenSSLContextFactory}

    @ivar serverCtxFactory: a generated context factory to be used in
        L{IReactorSSL.listenSSL}.
    @type serverCtxFactory: L{ssl.DefaultOpenSSLContextFactory}
    cOsH|��}t|||�tjtj�|df�tj�|df�f|�|�}||fS)NrQrO)�mktemprYr�DefaultOpenSSLContextFactoryrRrSrT)r�orgZorgUnit�argsZkwArgs�base�serverCtxFactoryrrr�makeContextFactory�s
z)ContextGeneratingMixin.makeContextFactorycCs,|j||�\|_|_|j||�\|_|_dS)N)raZ
clientBase�clientCtxFactoryZ
serverBaser`)rZ
clientArgsZclientKwArgsZ
serverArgsZserverKwArgsrrr�setupServerAndClient�sz+ContextGeneratingMixin.setupServerAndClientN)r,r-r.r/rarcrrrrrZ�srZc@seZdZdZdZdd�ZdS)r8ze
        A context factory with a default method set to
        L{OpenSSL.SSL.TLSv1_METHOD}.
        FcOs"tj|d<tjj|f|�|�dS)NZ	sslmethod)rZTLSv1_METHODrr\r)rr^�kwrrrr
s
zServerTLSContext.__init__N)r,r-r.r/ZisClientrrrrrr8sr8c@s0eZdZdZdd�Zdd�Zdd�Zdd	�Zd
S)�StolenTCPTestszc
    For SSL transports, test many of the same things which are tested for
    TCP transports.
    cCs.tj�tt����}|��}tj||||d�S)zY
        Create an SSL server with a certificate using L{IReactorSSL.listenSSL}.
        )�	interface)	rZPrivateCertificateZloadPEMrrZ
getContent�optionsr�	listenSSL)r�address�
portNumberr#rO�contextFactoryrrr�createServerszStolenTCPTests.createServercCst��}|�|||�S)zG
        Create an SSL client using L{IReactorSSL.connectSSL}.
        )rZCertificateOptions�
connectSSL)rrirjZ
clientCreatorrkrrr�
connectClient#szStolenTCPTests.connectClientcCstjS)z�
        Return L{OpenSSL.SSL.Error} as the expected error type which will be
        raised by a write to the L{OpenSSL.SSL.Connection} object after it has
        been closed.
        )r�Error)rrrr�getHandleExceptionType+sz%StolenTCPTests.getHandleExceptionTypecCs4t�t�t�d�t�t�d�t�d��t�d���S)a4
        Return a L{hamcrest.core.matcher.Matcher} for the argument
        L{OpenSSL.SSL.Error} will be constructed with for this case.
        This is basically just a random OpenSSL implementation detail.
        It would be better if this test worked in a way which did not
        require this.
        zSSL routinesZ	SSL_writeZssl_write_internalzprotocol is shutdown)�hamcrest�containsZequal_toZany_of)rrrr�getHandleErrorCodeMatcher4s

z(StolenTCPTests.getHandleErrorCodeMatcherN)r,r-r.r/rlrnrprsrrrrres

	rec@sFeZdZdZdZdZdZdd�Zddd�Zdd	�Z	d
d�Z
dd
�ZdS)�TLSTestsz�
    Tests for startTLS support.

    @ivar fillBuffer: forwarded to L{LineCollector.fillBuffer}
    @type fillBuffer: C{bool}
    FNcCs4|jjdk	r|jj��|jjdk	r0|jj��dS)N)�clientProtor!r&�serverProto)rrrr�tearDownXszTLSTests.tearDowncs��|_t��}|_�fdd�|_|r.d|_nd|_�|_t��}|_�fdd�|_|rbd|_nd|_t	j
d|dd�}|�|j�t	�
d|��j|�t��j�jg�S)	a�
        Helper method to run TLS tests.

        @param clientProto: protocol instance attached to the client
            connection.
        @param serverProto: protocol instance attached to the server
            connection.
        @param clientIsServer: flag indicated if client should initiate
            startTLS instead of server.

        @return: a L{defer.Deferred} that will fire when both connections are
            lost.
        cs�S)Nrr)rurr�<lambda>or3z#TLSTests._runTest.<locals>.<lambda>FTcs�S)Nrr)rvrrrxwr3rz	127.0.0.1)rf)rur�
ClientFactory�
clientFactoryr9r$rv�
ServerFactory�
serverFactoryrZ	listenTCP�
addCleanup�
stopListeningZ
connectTCP�getHost�portr	�
gatherResultsr)rrurvZclientIsServerZcfZsfr�r)rurvr�_runTest_s zTLSTests._runTestcs,�fdd�}��t�td�j��}|�|�S)z~
        Test for server and client startTLS: client should received data both
        before and after the startTLS.
        cs���jjtjtj�dS)N)�assertEqualr|r5rrr%)�ignore)rrr�check�sz TLSTests.test_TLS.<locals>.checkT)r�rr0r2�addCallback)rr��dr)rr�test_TLS�szTLSTests.test_TLScs,�fdd�}��t�td�j��}|�|�S)z�
        Test for server startTLS not followed by a startTLS in client: the data
        received after server startTLS should be received as raw.
        cs&���jjtj����jjd�dS)NzNo encrypted bytes received)r�r|r5rrZ
assertTruer4)�ignored)rrrr��s

z"TLSTests.test_unTLS.<locals>.checkF)r�rr0r2r�)rr�r�r)rr�
test_unTLS�szTLSTests.test_unTLScs.�fdd�}��td�j�t�d�}|�|�S)z:
        Test startTLS first initiated by client.
        cs���jjtjtj�dS)N)r�rzr5rrr%)r�)rrrr��sz)TLSTests.test_backwardsTLS.<locals>.checkT)r�r0r2rr�)rr�r�r)rr�test_backwardsTLS�s
zTLSTests.test_backwardsTLS)F)r,r-r.r/r2rurvrwr�r�r�r�rrrrrtKs
&rtc@seZdZdZdZdS)�SpammyTLSTestszA
    Test TLS features with bytes sitting in the out buffer.
    TN)r,r-r.r/r2rrrrr��sr�c@s$eZdZdZdZdd�Zdd�ZdS)�BufferingTestsNcCsB|jjdk	r|jj��|jjdk	r0|jj��tt|j|jg�S)N)rvr!r&rurr)rrrrrw�szBufferingTests.tearDowncs�t��|_t��|_t��}t��}|_�fdd�|_�fdd�|_t�	t
t
�}t��}tj
d||dd�}|�|j�t�d|��j||�}|�|j��j�|jd�S)Ncs�S)Nrr)rvrrrx�r3z6BufferingTests.test_openSSLBuffering.<locals>.<lambda>cs�S)Nrr)rurrrx�r3rz	127.0.0.1)rfs+OK <some crap>
)r>rvrArurr{ryr$rr\r�ClientContextFactoryrrhr}r~rmrr�Z
disconnectrr�r�)rr9r$ZsCTXZcCTXr�ZclientConnectorr)rurvr�test_openSSLBuffering�sz$BufferingTests.test_openSSLBuffering)r,r-r.rvrurwr�rrrrr��s
r�c@s0eZdZdZdd�Zdd�Zdd�Zdd	�Zd
S)�ConnectionLostTestsz'
    SSL connection closing tests.
    cs�d}��||dfi||dfi�t��}tj|_t�d|�j��_}t��}t	|_t
��|_t�
d|��j|�j�|j��fdd��S)Nztwisted.test.test_sslz, clientz, serverrz	127.0.0.1cs
�j��S)N)�
serverPortr~)Z
ignoredResult)rrrrx�r3z=ConnectionLostTests.testImmediateDisconnect.<locals>.<lambda>)rcrr{�Protocolrrhr`r�ryrCr	rrErmrr�rbr�)rr]�serverProtocolFactoryr��clientProtocolFactoryr)rr�testImmediateDisconnect�s
z+ConnectionLostTests.testImmediateDisconnectcs�ttj�Gdd�dtj��}d}|�||dfi||dfi�|��t��}�fdd�|_t�d||j	�}|�
|j�|��t��}�fd	d�|_t�
d
|��j||j�dd�}t��j�|��j�|�g�S)
z�
        Both sides of SSL connection close connection; the connections should
        close cleanly, and only after the underlying TCP connection has
        disconnected.
        c@s(eZdZdZdd�Zdd�Zdd�ZdS)	zMConnectionLostTests.test_bothSidesLoseConnection.<locals>.CloseAfterHandshakeFcSst��|_dS)N)r	r�done)rrrrr
szVConnectionLostTests.test_bothSidesLoseConnection.<locals>.CloseAfterHandshake.__init__cSs|j��dS)N)r!r&)rrrrrD
sz`ConnectionLostTests.test_bothSidesLoseConnection.<locals>.CloseAfterHandshake.handshakeCompletedcSs|j�|�|`dS)N)r�Zerrback)rr*rrrr+sz\ConnectionLostTests.test_bothSidesLoseConnection.<locals>.CloseAfterHandshake.connectionLostN)r,r-r.ZgotDatarrDr+rrrr�CloseAfterHandshakesr�ztwisted.test.test_sslz, clientz, servercs�S)Nrr)�serverProtocolrrrxr3zBConnectionLostTests.test_bothSidesLoseConnection.<locals>.<lambda>rcs�S)Nrr)�clientProtocolrrrx"r3z	127.0.0.1cSs|�t�dS)N)�trapr
)Zfailurerrr�checkResult&szEConnectionLostTests.test_bothSidesLoseConnection.<locals>.checkResult)rr�IHandshakeListenerrr�rcr{rrhr`r}r~ryrmrr�rbr	r�r�Z
addErrback)rr�r]r�r�r�r�r)r�r�r�test_bothSidesLoseConnections*



z0ConnectionLostTests.test_bothSidesLoseConnectionc	s�d}|�||dfi||dfi�dd�}|j���tj|�t��}t�	��|j
�_t��}�fdd�|_t
�d||j�|_}t��}t�	��|j
�_t��}�fd	d�|_t
�d
|��j||j�tj||gdd�}|�|j�S)
Nztwisted.test.test_sslz, clientz, servercWsdS)NFr)�arrr�verify3sz4ConnectionLostTests.testFailedVerify.<locals>.verifycs�S)Nrr)r�rrrx;r3z6ConnectionLostTests.testFailedVerify.<locals>.<lambda>rcs�S)Nrr)r�rrrxCr3z	127.0.0.1T)Z
consumeErrors)rcrb�
getContextZ
set_verifyrZVERIFY_PEERr	rrr�r)r+r{rrhr`r�ryrmrr�ZDeferredListr��_cbLostConns)	rr]r�ZserverConnLostr�r�ZclientConnLostr�Zdlr)r�r�r�testFailedVerify-s,z$ConnectionLostTests.testFailedVerifycCsh|\\}}\}}|�|�|�|�tjg}t��rJddlm}|�|�|j|�|j|�|j	�
�S)Nr)�ConnectionLost)�assertFalserrorZ	isWindows�twisted.internet.errorr�r6r�r�r~)r�resultsZsSuccessZsResultZcSuccessZcResultZacceptableErrorsr�rrrr�Ks





z ConnectionLostTests._cbLostConnsN)r,r-r.r/r�r�r�r�rrrrr��s
-r�c@s0eZdZdZdd�Zdd�Zdd�Zdd	�Zd
S)�FakeContextzK
    L{OpenSSL.SSL.Context} double which can more easily be inspected.
    cCs||_d|_dS)Nr)�_method�_options)r�methodrrrrjszFakeContext.__init__cCs|j|O_dS)N)r�)rrgrrr�set_optionsoszFakeContext.set_optionscCsdS)Nr)r�fileNamerrr�use_certificate_filessz FakeContext.use_certificate_filecCsdS)Nr)rr�rrr�use_privatekey_filewszFakeContext.use_privatekey_fileN)r,r-r.r/rr�r�r�rrrrr�fs
r�c@s0eZdZdZdd�Zdd�Zdd�Zdd	�Zd
S)�!DefaultOpenSSLContextFactoryTestsz8
    Tests for L{ssl.DefaultOpenSSLContextFactory}.
    cCs"tjtttd�|_|j��|_dS)N)�_contextFactory)rr\rr�rkr��context)rrrr�setUp�sz'DefaultOpenSSLContextFactoryTests.setUpcCsV|�|jjtj�|�|jjtj@tj�|�|jjtj@�|�|jjtj	@�dS)z�
        L{ssl.DefaultOpenSSLContextFactory.getContext} returns an SSL context
        which can use SSLv3 or TLSv1 but not SSLv2.
        N)
r�r�r�r�
SSLv23_METHODr��OP_NO_SSLv2r��OP_NO_SSLv3�OP_NO_TLSv1)rrrr�test_method�s
z-DefaultOpenSSLContextFactoryTests.test_methodcCs|�tjtjt|���dS)z�
        Instantiating L{ssl.DefaultOpenSSLContextFactory} with a certificate
        filename which does not identify an existing file results in the
        initializer raising L{OpenSSL.SSL.Error}.
        N)�assertRaisesrrorr\rr[)rrrr�test_missingCertificateFile�sz=DefaultOpenSSLContextFactoryTests.test_missingCertificateFilecCs|�tjtj|��t�dS)z�
        Instantiating L{ssl.DefaultOpenSSLContextFactory} with a private key
        filename which does not identify an existing file results in the
        initializer raising L{OpenSSL.SSL.Error}.
        N)r�rrorr\r[r)rrrr�test_missingPrivateKeyFile�sz<DefaultOpenSSLContextFactoryTests.test_missingPrivateKeyFileN)r,r-r.r/r�r�r�r�rrrrr�|s
r�c@s eZdZdZdd�Zdd�ZdS)�ClientContextFactoryTestsz0
    Tests for L{ssl.ClientContextFactory}.
    cCs"t��|_t|j_|j��|_dS)N)rr�rkr�r�r�r�)rrrrr��s
zClientContextFactoryTests.setUpcCsV|�|jjtj�|�|jjtj@tj�|�|jjtj@�|�|jjtj	@�dS)z~
        L{ssl.ClientContextFactory.getContext} returns a context which can use
        SSLv3 or TLSv1 but not SSLv2.
        N)
r�r�r�rr�r�r�r�r�r�)rrrrr��s
z%ClientContextFactoryTests.test_methodN)r,r-r.r/r�r�rrrrr��sr�z2Reactor does not support SSL, cannot run SSL tests)=r/�
__future__rrZtwisted.python.filepathrZ
twisted.trialrZtwisted.internetrrrr	r�r
Ztwisted.protocolsrZtwisted.python.runtimerZtwisted.test.test_tcpr
Ztwisted.test.proto_helpersrrRrqZOpenSSLrrrZtwisted.test.ssl_helpersrr�ImportErrorrZzope.interfacerZLineReceiverrr0r�r>rAr�rCrPrYrZr\r8ZTestCaserertr�r�r�r�r�r�ZIReactorSSLZtCase�skiprrrr�<module>sZ*3
(

8i(4