§
    Ìtºf;  ã                   ó`  — 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 	 dZd d	lmZ d d
lmZmZmZ d dlmZ d dlmZ n# e$ r dZY nw xY wd dl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!m"Z" dZ#d„ Z$d„ Z%d„ Z&d„ Z' G d„ dej(        ¦  «        Z(d dee(         de)de*fd„Z+dS )!é    )Úwraps)ÚList)ÚIStreamClientEndpoint)ÚUNIXClientEndpoint)ÚTCP4ClientEndpoint)ÚFailure)ÚReactorNotRunningT)ÚSSL4ClientEndpoint)ÚoptionsForClientTLSÚCertificateOptionsÚCertificate)ÚIOpenSSLClientConnectionCreator)ÚSSLFN)ÚWampWebSocketClientFactory)ÚWampRawSocketClientFactory)Ú	component)ÚSession)Úcreate_transport_serializersÚcreate_transport_serializer)Ú	ComponentÚrunc                 ó<   ‡— t          ¦   «         Šˆfd„| D ¦   «         S )zM
    Return a list with unique elements from sequence, preserving order.
    c                 óF   •— g | ]}|‰v¯‰                      |¦  «        °|‘ŒS © )Úadd)Ú.0ÚxÚseens     €úY/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/autobahn/twisted/component.pyú
<listcomp>z _unique_list.<locals>.<listcomp>B   s,   ø€ Ð@Ð@Ð@�!˜a t˜m˜m°D·H²H¸Q±K´K˜mˆA˜m˜m˜mó    )Úset)Úseqr   s    @r   Ú_unique_listr$   =   s(   ø€ õ ‰5Œ5€DØ@Ð@Ð@Ð@�sÐ@Ñ@Ô@Ð@r!   c                 óŒ   — |                       d¦  «        }|d         d                     d„ |dd …         D ¦   «         ¦  «        z   S )NÚ_r   Ú c              3   ó>   K  — | ]}|                      ¦   «         V — Œd S ©N)Ú
capitalize)r   Úss     r   ú	<genexpr>z._camel_case_from_snake_case.<locals>.<genexpr>G   s*   è è € Ð@Ð@°˜aŸlšl™nœnÐ@Ð@Ð@Ð@Ð@Ð@r!   é   )ÚsplitÚjoin)ÚsnakeÚpartss     r   Ú_camel_case_from_snake_caser2   E   sE   € Ø�KŠK˜ÑÔ€EØ�Œ8�b—g’gÐ@Ð@°e¸A¸B¸B´iÐ@Ñ@Ô@Ñ@Ô@Ñ@Ð@r!   c           
      ó<  — |j         dk    r-t          |¦  «        }t          ||j        ||j        ¬¦  «        }nA|j         dk    r,t          |j        d         ¦  «        }t          ||¬¦  «        }n
J d¦   «         ‚|j         	                    ¦   «         D ]ˆ\  }}	  |j
        d	i ||i¤Ž Œ# t          t          f$ r_ 	  |j
        d	i t          |¦  «        |i¤Ž n># t          t          f$ r* t          d                     |j         ||¦  «        ¦  «        ‚w xY wY Œ…w xY w|S )
z3
    Create a WAMP-over-XXX transport factory.
    Ú	websocket)ÚurlÚserializersÚproxyÚ	rawsocketr   )Ú
serializerFúshould not arrive herez"Unknown {} transport option: {}={}r   )Útyper   r   r5   r7   r   r6   r   ÚoptionsÚitemsÚsetProtocolOptionsÚ	TypeErrorÚKeyErrorr2   Ú
ValueErrorÚformat)ÚreactorÚ	transportÚsession_factoryr6   Úfactoryr9   ÚkÚvs           r   Ú_create_transport_factoryrI   J   s�  € ð „~˜Ò$Ð$Ý2°9Ñ=Ô=ˆÝ,ØØ”Ø#Ø”/ð	
ñ 
ô 
ˆˆð 
Œ˜;Ò	&Ð	&Ý0°Ô1FÀqÔ1IÑJÔJˆ
Ý,¨_ÈÐTÑTÔTˆˆð 	0Ð/Ñ/Ô/Ð/ð Ô!×'Ò'Ñ)Ô)ð ð ‰ˆˆ1ð	Ø&ˆGÔ&Ð0Ð0¨!¨Q¨Ð0Ð0Ð0Ð0øÝ�8Ð$ð 	ð 	ð 	ðØ*�Ô*ð ð Ý2°1Ñ5Ô5°qÐ9ðð ð ð øõ �xÐ(ð ð ð Ý Ø8×?Ò?À	ÄÐPQÐSTÑUÔUñô ð ðøøøðð ð	øøøð €Ns*   ÂB)Â)DÂ;CÃDÃ;DÄDÄDc                 óØ  — t          j        |¦  «        rt          |¦  «        }�nD|d         dk    �rã|                     dd¦  «        }|dvr"t          d                     |¦  «        ¦  «        ‚|d         }t          |¦  «        t          k    r/t          d                     t          |¦  «        ¦  «        ¦  «        ‚|d	         }t          |¦  «        t          k    r/t          d
                     t          |¦  «        ¦  «        ¦  «        ‚|                     dd¦  «        }t          |¦  «        t          k    r/t          d                     t          |¦  «        ¦  «        ¦  «        ‚|                     dd¦  «        }|�rÓt          st          d¦  «        ‚t          j        |¦  «        rt          |¦  «        }�n]t          |t          ¦  «        rí|                     ¦   «         D ](}	|	dvr"t          d                     |	¦  «        ¦  «        ‚Œ)|                     d|¦  «        }
t          |
¦  «        t          k    r"t          d                     |
¦  «        ¦  «        ‚d}|                     dd¦  «        }|�4t          j        t!          |d¦  «                             ¦   «         ¦  «        }t%          |
|¬¦  «        }n[t          |t&          ¦  «        r|}nC|du rt%          |¦  «        }n/t          d                     t          |¦  «        ¦  «        ¦  «        ‚|dk    rt)          | ||||¬¦  «        }�n3|dk    rt          d¦  «        ‚J d¦   «         ‚|                     d¦  «        rL	 d dl}|                     ||¦  «        }nã# t0          $ r# t          d!                     |¦  «        ¦  «        ‚w xY w|dk    rt3          | |||¬¦  «        }n™|dk    r5	 d d"lm} n# t0          $ r t          d#¦  «        ‚w xY w || |||¬¦  «        }n^J d¦   «         ‚|d         d$k    r>|d%         }t          |                     dd¦  «        ¦  «        }t9          | ||¬¦  «        }n
J d¦   «         ‚|S )&zI
    Create a Twisted client endpoint for a WAMP-over-XXX transport.
    r;   ÚtcpÚversioné   )rM   é   z6invalid IP version {} in client endpoint configurationÚhostz9invalid type {} for host in client endpoint configurationÚportz9invalid type {} for port in client endpoint configurationÚtimeouté
   z<invalid type {} for timeout in client endpoint configurationÚtlsNzKTLS configured in transport, but TLS support is not installed (eg OpenSSL?))ÚhostnameÚ
trust_rootz Invalid key '{}' in 'tls' configrT   zAinvalid type {} for hostname in TLS client endpoint configurationrU   Úr)Ú	trustRootTz4unknown type {} for "tls" configuration in transport)rQ   rN   zTLS on IPv6 not implementedFr:   z.onionr   zC{} appears to be a Tor Onion service, but txtorcon is not installed)ÚTCP6ClientEndpointz.IPv6 is not supported (please upgrade Twisted)ÚunixÚpath)r   Ú
providedByÚgetrA   rB   r;   ÚstrÚintÚ_TLSÚRuntimeErrorr   Ú
isinstanceÚdictÚkeysr   ÚloadPEMÚopenÚreadr   r   r
   ÚendswithÚtxtorconÚTorClientEndpointÚImportErrorr   Útwisted.internet.endpointsrX   r   )rC   Úendpoint_configÚendpointrL   rO   rP   rQ   rS   ÚcontextrG   rT   rU   Ú
cert_fnamerh   rX   rZ   s                   r   Ú_create_transport_endpointrp   q   sÂ  € õ Ô'¨Ñ8Ô8ð `4Ý(¨Ñ9Ô9ˆ‰ð ˜6Ô" eÒ+Ñ+à%×)Ò)¨)°QÑ7Ô7ˆGØ˜fÐ$Ð$Ý Ð!Y×!`Ò!`ÐahÑ!iÔ!iÑjÔjÐjà" 6Ô*ˆDÝ�D‰zŒz�SÒ Ð Ý Ð!\×!cÒ!cÕdhÐimÑdnÔdnÑ!oÔ!oÑpÔpÐpà" 6Ô*ˆDÝ�D‰zŒz�SÒ Ð Ý Ð!\×!cÒ!cÕdhÐimÑdnÔdnÑ!oÔ!oÑpÔpÐpà%×)Ò)¨)°RÑ8Ô8ˆGÝ�G‰}Œ}¥Ò#Ð#Ý Ð!_×!fÒ!fÕgkÐlsÑgtÔgtÑ!uÔ!uÑvÔvÐvà!×%Ò% e¨TÑ2Ô2ˆCð ñ ><Ýð vÝ&Ð'tÑuÔuÐuõ 3Ô=¸cÑBÔBð qå=¸cÑBÔB�G‘Gå ¥TÑ*Ô*ð qØ ŸXšX™ZœZð [ð [˜ØÐ$>Ð>Ð>Ý",Ð-O×-VÒ-VÐWXÑ-YÔ-YÑ"ZÔ"ZÐZð ?à"Ÿwšw z°4Ñ8Ô8�HÝ˜H‘~”~­Ò,Ð,Ý(Ð)l×)sÒ)sÐt|Ñ)}Ô)}Ñ~Ô~Ð~Ø!%�JØ!$§¢¨°tÑ!<Ô!<�JØ!Ð-Ý%0Ô%8½¸jÈ#Ñ9NÔ9N×9SÒ9SÑ9UÔ9UÑ%VÔ%V˜
Ý1°(ÀjÐQÑQÔQ�G�Gå Õ%7Ñ8Ô8ð qØ!�G�Gà˜D�[�[Ý1°$Ñ7Ô7�G�Gõ 'Ð']×'dÒ'dÕeiÐjmÑenÔenÑ'oÔ'oÑpÔpÐpà˜a’<�<Ý1°'¸4ÀÀwÐX_Ð`Ñ`Ô`�H‘HØ ’\�\å&Ð'DÑEÔEÐEà;Ð#;Ñ;Ô;Ð;ð —=’= Ñ*Ô*ð <ðØ'˜˜˜Ø#+×#=Ò#=¸dÀDÑ#IÔ#I˜˜øÝ&ð ð ð Ý*Øa×hÒhØ $ñô ñô ð ðøøøð  ’\�\Ý1°'¸4ÀÈwÐWÑWÔW�H�HØ ’\�\ð]ØQÐQÐQÐQÐQÐQÐQøÝ&ð ]ð ]ð ]Ý*Ð+[Ñ\Ô\Ð\ð]øøøà1Ð1°'¸4ÀÈwÐWÑWÔW�H�Hà;Ð#;Ñ;Ô;Ð;ð ˜VÔ$¨Ò.Ð.Ø" 6Ô*ˆDÝ˜/×-Ò-¨i¸Ñ<Ô<Ñ=Ô=ˆGÝ)¨'°4ÀÐIÑIÔIˆHˆHð 4Ð3Ñ3Ô3Ð3à€Os   Í,N Î-N4ÏO ÏO9c                   óP   — e Zd ZdZ ej        ¦   «         ZeZ	 d„ Z	d„ Z
d„ Zdd„ZdS )r   zæ
    A component establishes a transport and attached a session
    to a realm using the transport for communication.

    The transports a component tries to use can be configured,
    as well as the auto-reconnect strategy.
    c                 óH   — t           rt          |t          j        ¦  «        S dS )zÂ
        Internal helper.

        This is so we can just return False if we didn't import any
        TLS/SSL libraries. Otherwise, returns True if this is an
        OpenSSL.SSL.Error
        F)r_   ra   r   ÚError)ÚselfÚes     r   Ú_is_ssl_errorzComponent._is_ssl_errorê   s#   € õ ð 	,Ý˜a¥¤Ñ+Ô+Ð+Øˆur!   c                 óF  — t          j        |¦  «        rd S t          |t          ¦  «        rhd|v rb|d         }t          |t          t          f¦  «        rd S t          j        |¦  «        rd S t          |t          ¦  «        rd S t          d¦  «        ‚d S t          d¦  «        ‚)NrS   zb'tls' configuration must be a dict, CertificateOptions or IOpenSSLClientConnectionCreator providerzI'endpoint' configuration must be a dict or IStreamClientEndpoint provider)r   r[   ra   rb   Úboolr   r   rA   )rt   rm   rS   s      r   Ú_check_native_endpointz Component._check_native_endpointö   sÄ   € Ý Ô+¨HÑ5Ô5ð 	ØˆDÝ˜¥$Ñ'Ô'ð 	Ø˜Ð Ð Ø˜u”o�Ý˜c¥D­$ <Ñ0Ô0ð 
Ø�DÝ4Ô?ÀÑDÔDð Ø�DÝ Õ%7Ñ8Ô8ð Ø�Då$ðDñô ð ð !Ð õ ðñô ð r!   c                 óR  ‡‡— t          |‰|¦  «        }‰j        r+t          |d‰j        d         ‰j        d         dœ¦  «        }nt          |‰j        ¦  «        }|                     |¦  «        }ˆfd„}ˆˆfd„}	t          j        ||d¦  «         t          j        |d|	¦  «         |S )zö
        Create and connect a WAMP-over-XXX transport.

        :param done: is a Deferred/Future from the parent which we
            should signal upon error if it is not done yet (XXX maybe an
            "on_error" callable instead?)
        rK   rO   rP   )r;   rO   rP   c                 ó\   •‡— | j         Št          ‰¦  «        ˆˆfd„¦   «         }|| _         d S )Nc                 óp   •—  ‰| ¦  «        }t          j        ‰¦  «        st          j        ‰| ¦  «         |S r)   )ÚtxaioÚ	is_calledÚreject)ÚfailÚrtnÚdoneÚorigs     €€r   ÚlostzFComponent._connect_transport.<locals>.on_connect_success.<locals>.lost-  s9   ø€ à�d˜4‘j”j�Ý” tÑ,Ô,ð -Ý”L  tÑ,Ô,Ð,Ø�
r!   )ÚconnectionLostr   )Úprotor„   rƒ   r‚   s     @€r   Úon_connect_successz8Component._connect_transport.<locals>.on_connect_success#  sL   øø€ ð Ô'ˆDå�4‰[Œ[ðð ð ð ð ñ Œ[ðð
 $(ˆEÔ Ð Ð r!   c                 óR   •— ‰xj         dz  c_         t          j        ‰| ¦  «         d S )Nr-   )Úconnect_failuresr}   r   )Úerrr‚   rD   s    €€r   Úon_connect_failurez8Component._connect_transport.<locals>.on_connect_failure5  s/   ø€ ØÐ&Ô&¨!Ñ+Ð&Ô&åŒL˜˜sÑ#Ô#Ð#Ð#Ð#r!   N)rI   r7   rp   rm   Úconnectr}   Úadd_callbacks)
rt   rC   rD   rE   r‚   Útransport_factoryÚtransport_endpointÚdr‡   r‹   s
     ` `     r   Ú_connect_transportzComponent._connect_transport  sí   øø€ õ 6°g¸yÈ/ÑZÔZÐØŒ?ð 
	YÝ!;Øà!Ø%œO¨FÔ3Ø%œO¨FÔ3ðð ñ"ô "ÐÐõ "<¸GÀYÔEWÑ!XÔ!XÐØ×&Ò&Ð'8Ñ9Ô9ˆð	(ð 	(ð 	(ð 	(ð 	(ð$	$ð 	$ð 	$ð 	$ð 	$ð 	$õ
 	Ô˜AÐ1°4Ñ8Ô8Ð8ÝÔ˜A˜tÐ%7Ñ8Ô8Ð8Øˆr!   Nc                 ór   — |€ | j                              d¦  «         ddlm} |                      |¬¦  «        S )a{  
        This starts the Component, which means it will start connecting
        (and re-connecting) to its configured transports. A Component
        runs until it is "done", which means one of:
        - There was a "main" function defined, and it completed successfully;
        - Something called ``.leave()`` on our session, and we left successfully;
        - ``.stop()`` was called, and completed successfully;
        - none of our transports were able to connect successfully (failure);

        :returns: a Deferred that fires (with ``None``) when we are
            "done" or with a Failure if something went wrong.
        NzUsing default reactorr   )rC   )Úloop)ÚlogÚwarnÚtwisted.internetrC   Ú_start)rt   rC   s     r   ÚstartzComponent.start>  sD   € ð ˆ?ØŒH�MŠMÐ1Ñ2Ô2Ð2Ø0Ð0Ð0Ð0Ð0Ð0à�{Š{ ˆ{Ñ(Ô(Ð(r!   r)   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r}   Úmake_loggerr”   r   rE   rv   ry   r‘   r˜   r   r!   r   r   r   Ú   s|   € € € € € ðð ð ˆ%Ô
Ñ
Ô
€Cà€Oðð
ð 
ð 
ðð ð ð./ð /ð /ðb)ð )ð )ð )ð )ð )r!   r   ÚinfoÚ
componentsÚ	log_levelÚstop_at_closec                 ó¬   ‡— ddl m} |�t          j        |¬¦  «         t          j        ¦   «         Š|rˆfd„}nd} |t
          j        | |f¦  «         dS )a¢  
    High-level API to run a series of components.

    This will only return once all the components have stopped
    (including, possibly, after all re-connections have failed if you
    have re-connections enabled). Under the hood, this calls
    :meth:`twisted.internet.reactor.run` -- if you wish to manage the
    reactor loop yourself, use the
    :meth:`autobahn.twisted.component.Component.start` method to start
    each component yourself.

    :param components: the Component(s) you wish to run
    :param log_level: a valid log-level (or None to avoid calling start_logging)
    :param stop_at_close: Flag to control whether to stop the reactor when done.
    r   )ÚreactN)Úlevelc                 óÚ   •— t          |t          ¦  «        rT‰                     d|¬¦  «         	 ‰                     d¦  «         |                      ¦   «          d S # t
          $ r Y d S w xY wd S )Nz#Something went wrong: {log_failure})ÚfailurezStopping reactor ..)ra   r   Úerrorr•   Ústopr	   )rC   Úargr”   s     €r   Údone_callbackzrun.<locals>.done_callbackq  s�   ø€ Ý˜#�wÑ'Ô'ð Ø—	’	Ð?È�	ÑMÔMÐMðØ—H’HÐ2Ñ3Ô3Ð3Ø—L’L‘N”N�N�N�NøÝ(ð ð ð Ø�D�Dðøøøðð s   ¯)A Á
A(Á'A()Útwisted.internet.taskr£   r}   Ústart_loggingr�   r   Ú_run)rŸ   r    r¡   r£   rª   r”   s        @r   r   r   R  s�   ø€ ð( ,Ð+Ð+Ð+Ð+Ð+ð
 ÐÝÔ )Ð,Ñ,Ô,Ð,å
Ô
Ñ
Ô
€Càð 
ð	ð 	ð 	ð 	ð 	ð 	ð ˆà	€E�)Œ.˜: }Ð5Ñ6Ô6Ð6Ð6Ð6r!   )rž   T),Ú	functoolsr   Útypingr   Útwisted.internet.interfacesr   rk   r   r   Útwisted.python.failurer   Útwisted.internet.errorr	   r_   r
   Útwisted.internet.sslr   r   r   r   ÚOpenSSLr   rj   r}   Úautobahn.twisted.websocketr   Úautobahn.twisted.rawsocketr   Úautobahn.wampr   Úautobahn.twisted.wampr   Úautobahn.wamp.serializerr   r   Ú__all__r$   r2   rI   rp   r   r]   rx   r   r   r!   r   ú<module>r»      s3  ðð8 Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à =Ð =Ð =Ð =Ð =Ð =Ø 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø *Ð *Ð *Ð *Ð *Ð *Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4ðØ€DØ=Ð=Ð=Ð=Ð=Ð=ØYÐYÐYÐYÐYÐYÐYÐYÐYÐYØKÐKÐKÐKÐKÐKØÐÐÐÐÐÐøØð ð ð Ø€D€D€Dðøøøð
 €€€à AÐ AÐ AÐ AÐ AÐ AØ AÐ AÐ AÐ AÐ AÐ Aà #Ð #Ð #Ð #Ð #Ð #à )Ð )Ð )Ð )Ð )Ð )Ø ^Ð ^Ð ^Ð ^Ð ^Ð ^Ð ^Ð ^à
€ðAð Að AðAð Að Að
$ð $ð $ðNfð fð fðRu)ð u)ð u)ð u)ð u)�	Ô#ñ u)ô u)ð u)ðp*7ð *7�D˜”Oð *7°ð *7ÈTð *7ð *7ð *7ð *7ð *7ð *7s   ¬A ÁAÁA