§
    Hºiö  ã                   ó\  — d dl Z 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
 ej        dfd„Z G d„ d	e¦  «        Z G d
„ de¦  «        Zej        dddfd„Z G d„ de¦  «        Zd„ Zdd„Zd„ Z	 d dlmZ ej        ZdS # e$ r# 	 d dlmZ 	 	 	 	 dd„ZY dS # e$ r d„ ZY Y dS w xY ww xY w)é    N)Ú	greenpool)Úgreenthread)Úsupport)Úsocket)Ú	greenletsc                 óœ   — t          j         |t           j        ¦  «        }|�|                     |¦  «         |                     | ¦  «         |S )af  Convenience function for opening client sockets.

    :param addr: Address of the server to connect to.  For TCP sockets, this is a (host, port) tuple.
    :param family: Socket family, optional.  See :mod:`socket` documentation for available families.
    :param bind: Local address to bind to, optional.
    :return: The connected green socket object.
    )r   ÚSOCK_STREAMÚbindÚconnect)ÚaddrÚfamilyr
   Úsocks       úY/home/mmwave/public_html/mmwave/venv/lib/python3.11/site-packages/eventlet/convenience.pyr   r      sD   € õ Œ=˜¥Ô!3Ñ4Ô4€DØÐØ�	Š	�$‰ŒˆØ‡L‚L�ÑÔÐØ€Kó    c                   ó   — e Zd ZdS )ÚReuseRandomPortWarningN©Ú__name__Ú
__module__Ú__qualname__© r   r   r   r      ó   € € € € € Ø€Dr   r   c                   ó   — e Zd ZdS )ÚReusePortUnavailableWarningNr   r   r   r   r   r      r   r   r   é2   Tc                 óÎ  — t          j         |t           j        ¦  «        }|rCt          j        dd…         dk    r+|                     t           j        t           j        d¦  «         |t           j        t           j        fv r+| d         dk    r|rt          j
        dt          d¬¦  «         n|€d}|r‹t          t           d	¦  «        rv	 |                     t           j        t           j        d¦  «         nI# t          $ r<}t          j        |¦  «        d
v rt          j
        dt"          d¬¦  «         Y d}~nd}~ww xY w|                     | ¦  «         |                     |¦  «         |S )aB  Convenience function for opening server sockets.  This
    socket can be used in :func:`~eventlet.serve` or a custom ``accept()`` loop.

    Sets SO_REUSEADDR on the socket to save on annoyance.

    :param addr: Address to listen on.  For TCP sockets, this is a (host, port)  tuple.
    :param family: Socket family, optional.  See :mod:`socket` documentation for available families.
    :param backlog:

        The maximum number of queued connections. Should be at least 1; the maximum
        value is system-dependent.

    :return: The listening green socket object.
    Né   Úwiné   r   z´listen on random port (0) with SO_REUSEPORT is dangerous.
                Double check your intent.
                Example problem: https://github.com/eventlet/eventlet/issues/411)Ú
stacklevelTÚSO_REUSEPORT)é   é\   a  socket.SO_REUSEPORT is defined but not supported.
                    On Windows: known bug, wontfix.
                    On other systems: please comment in the issue linked below.
                    More information: https://github.com/eventlet/eventlet/issues/380)r   r	   ÚsysÚplatformÚ
setsockoptÚ
SOL_SOCKETÚSO_REUSEADDRÚAF_INETÚAF_INET6ÚwarningsÚwarnr   Úhasattrr!   ÚOSErrorr   Ú	get_errnor   r
   Úlisten)r   r   ÚbacklogÚ
reuse_addrÚ
reuse_portr   Úexs          r   r0   r0   "   su  € õ Œ=˜¥Ô!3Ñ4Ô4€DØð C•c”l 2 A 2Ô&¨%Ò/Ð/Ø�Š�Ô)­6Ô+>ÀÑBÔBÐBØ•&”.¥&¤/Ð2Ð2Ð2°t¸A´wÀ!²|°|Øð 	6ÝŒMðTõ '°1ð	6ñ 6ô 6ð 6øð
 
Ð	Øˆ
Øð ?•g�f nÑ5Ô5ð ?ð	?Ø�OŠO�FÔ-­vÔ/BÀAÑFÔFÐFÐFøåð 
	?ð 
	?ð 
	?ÝÔ  Ñ$Ô$¨Ð0Ð0õ ”ðYõ 0¸Að?ñ ?ô ?ð ?øøøøøøøøøð
	?øøøð 	‡I‚Iˆd�O„O€OØ‡K‚K�ÑÔÐØ€Ks   Ã+C2 Ã2
D8Ã<2D3Ä3D8c                   ó   — e Zd ZdZdS )Ú	StopServezEException class used for quitting :func:`~eventlet.serve` gracefully.N)r   r   r   Ú__doc__r   r   r   r6   r6   S   s   € € € € € ØOÐOØ€Dr   r6   c                 ó  — 	 	 |                       ¦   «          |                     ¦   «          d S # |                     ¦   «          w xY w# t          j        $ r Y d S t          $ r' t          j        |gt          j        ¦   «         ¢R Ž  Y d S w xY w)N)	ÚwaitÚcloseÚgreenletÚGreenletExitÚ	Exceptionr   Úkillr$   Úexc_info)ÚtÚ	server_gtÚconns      r   Ú_stop_checkerrC   X   s›   € ð5ð	Ø�FŠF‰HŒHˆHà�JŠJ‰LŒLˆLˆLˆLøˆD�JŠJ‰LŒLˆLˆLøøøøÝÔ ð ð ð ØˆˆÝð 5ð 5ð 5ÝÔ˜Ð4¥S¤\¡^¤^Ð4Ð4Ð4Ð4Ð4Ð4Ð4ð5øøøs&   ƒ- —A ­AÁA ÁBÁ,BÂBéè  c                 ó  — t          j        |¦  «        }t          j        ¦   «         }	 	 |                      ¦   «         \  }}|                     |||¦  «        }|                     t          ||¦  «         d\  }}}n# t          $ r Y dS w xY wŒd)a  Runs a server on the supplied socket.  Calls the function *handle* in a
    separate greenthread for every incoming client connection.  *handle* takes
    two arguments: the client socket object, and the client address::

        def myhandle(client_sock, client_addr):
            print("client connected", client_addr)

        eventlet.serve(eventlet.listen(('127.0.0.1', 9999)), myhandle)

    Returning from *handle* closes the client socket.

    :func:`serve` blocks the calling greenthread; it won't return until
    the server completes.  If you desire an immediate return,
    spawn a new greenthread for :func:`serve`.

    Any uncaught exceptions raised in *handle* are raised as exceptions
    from :func:`serve`, terminating the server, so be sure to be aware of the
    exceptions your application can raise.  The return value of *handle* is
    ignored.

    Raise a :class:`~eventlet.StopServe` exception to gracefully terminate the
    server -- that's the only way to get the server() function to return rather
    than raise.

    The value in *concurrency* controls the maximum number of
    greenthreads that will be open at any time handling requests.  When
    the server hits the concurrency limit, it stops accepting new
    connections until the existing ones complete.
    T)NNNN)	r   Ú	GreenPoolr   Ú
getcurrentÚacceptÚspawnÚlinkrC   r6   )r   ÚhandleÚconcurrencyÚpoolrA   rB   r   Úgts           r   ÚserverO   d   sœ   € õ< Ô˜{Ñ+Ô+€DÝÔ&Ñ(Ô(€Iðð	ØŸš™œ‰JˆD�$Ø—’˜F D¨$Ñ/Ô/ˆBØ�GŠG•M 9¨dÑ3Ô3Ð3Ø-‰NˆD�$˜˜øÝð 	ð 	ð 	ØˆFˆFð	øøøðs   ªAA; Á;
B	ÂB	c                 ó"   — t          | g|¢R i |¤ŽS )ax  Convenience function for converting a regular socket into an
    SSL socket.  Has the same interface as :func:`ssl.wrap_socket`,
    but can also use PyOpenSSL. Though, note that it ignores the
    `cert_reqs`, `ssl_version`, `ca_certs`, `do_handshake_on_connect`,
    and `suppress_ragged_eofs` arguments when using PyOpenSSL.

    The preferred idiom is to call wrap_ssl directly on the creation
    method, e.g., ``wrap_ssl(connect(addr))`` or
    ``wrap_ssl(listen(addr), server_side=True)``. This way there is
    no "naked" socket sitting around to accidentally corrupt the SSL
    session.

    :return Green SSL object.
    )Úwrap_ssl_impl)r   ÚaÚkws      r   Úwrap_sslrT   �   s"   € õ ˜Ð( Ð(Ð(Ð( RÐ(Ð(Ð(r   )Ússl)ÚSSLFc
                 ó`  — t          j        t           j        ¦  «        }
|�|
                     |¦  «         |�|
                     |¦  «         |
                     t           j        d„ ¦  «         t          j        |
| ¦  «        }|r|                     ¦   «          n| 	                    ¦   «          |S )Nc                  ó   — dS )NTr   )Úxs    r   ú<lambda>zwrap_ssl_impl.<locals>.<lambda>·   s   € ¸4€ r   )
rV   ÚContextÚSSLv23_METHODÚuse_certificate_fileÚuse_privatekey_fileÚ
set_verifyÚVERIFY_NONEÚ
ConnectionÚset_accept_stateÚset_connect_state)r   ÚkeyfileÚcertfileÚserver_sideÚ	cert_reqsÚssl_versionÚca_certsÚdo_handshake_on_connectÚsuppress_ragged_eofsÚciphersÚcontextÚ
connections               r   rQ   rQ   ­   sª   € õ
 ”k¥#Ô"3Ñ4Ô4ˆGØÐ#Ø×,Ò,¨XÑ6Ô6Ð6ØÐ"Ø×+Ò+¨GÑ4Ô4Ð4Ø×Ò�sœ°°Ñ@Ô@Ð@åœ¨°Ñ6Ô6ˆJØð /Ø×+Ò+Ñ-Ô-Ð-Ð-à×,Ò,Ñ.Ô.Ð.ØÐr   c                  ó    — t          d¦  «        ‚)NzPTo use SSL with Eventlet, you must install PyOpenSSL or use Python 2.7 or later.)ÚImportError)rR   rS   s     r   rQ   rQ   ©   s   € ÝØbñdô dð dr   )rD   )	NNFNNNTTN)r$   r+   Úeventletr   r   r   Úeventlet.greenr   Úeventlet.supportr   r;   r)   r   ÚWarningr   r   r0   r=   r6   rC   rO   rT   rU   Úwrap_socketrQ   rp   Úeventlet.green.OpenSSLrV   r   r   r   ú<module>rw      s4  ðØ 
€
€
€
Ø €€€à Ð Ð Ð Ð Ð Ø  Ð  Ð  Ð  Ð  Ð  Ø Ð Ð Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2ð  œ¨dð ð ð ð ð	ð 	ð 	ð 	ð 	˜Wñ 	ô 	ð 	ð	ð 	ð 	ð 	ð 	 'ñ 	ô 	ð 	ð œ°¸tÐPTð .ð .ð .ð .ðb	ð 	ð 	ð 	ð 	�	ñ 	ô 	ð 	ð
	5ð 	5ð 	5ð(ð (ð (ð (ðV)ð )ð )ð$Ø"Ð"Ð"Ð"Ð"Ð"Ø”O€M€M€MøØð ð ð ðØ.Ð.Ð.Ð.Ð.Ð.ð JOØEIØ26Ø=Að	ð 	ð 	ð 	ð 	ð 	ð 	øð ð dð dð dð	dð 	dð 	dð 	dð 	dð 	dð 	dðdøøøð	øøøs0   Á4B ÂB+Â	BÂB+ÂB'Â"B+Â&B'Â'B+