Ë
    oj»H  ã                   óê  — d Z ddlZddlZddlZddlmZ ddlmZ ddlm	Z	 e	dk(  r3d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 eeeegZeeeegZeZeZeZeZndd
l
mZmZmZmZmZmZ eeegZegZddlmZmZmZm Z m!Z!m"Z" ddl#m$Z$m%Z%  ee"jL                  e"jN                  e"jP                  «       G d„ dejR                  «      «       Z* G d„ d«      Z+ ee"jX                  «       G d„ de+e*«      «       Z-y)a�  
Various asynchronous UDP classes.

Please do not use this module directly.

@var _sockErrReadIgnore: list of symbolic error constants (from the C{errno}
    module) representing socket errors where the error is temporary and can be
    ignored.

@var _sockErrReadRefuse: list of symbolic error constants (from the C{errno}
    module) representing socket errors that indicate connection refused.
é    N)ÚOptional)Úimplementer)ÚplatformTypeÚwin32)ÚWSAEINPROGRESS)ÚWSAEWOULDBLOCK)ÚWSAECONNREFUSEDÚWSAECONNRESETÚWSAEINTRÚWSAEMSGSIZEÚWSAENETRESETÚWSAENOPROTOOPTÚWSAETIMEDOUT)ÚEAGAINÚECONNREFUSEDÚEINTRÚEMSGSIZEÚENOPROTOOPTÚEWOULDBLOCK)ÚabstractÚaddressÚbaseÚdeferÚerrorÚ
interfaces)ÚfailureÚlogc                   óò   — e Zd ZU dZej
                  Zej                  ZdZ	dZ
ee   ed<   dZdd„Zed„ «       Zdefd„Zd	„ Zd
„ Zd„ Zd„ Zd„ Zdd„Zd„ Zd„ Zd„ Zd„ Zd„ Zdd„Zd„ Z d„ Z!d„ Z"d„ Z#d„ Z$d„ Z%y)ÚPorta©  
    UDP port, listening for packets.

    @ivar maxThroughput: Maximum number of bytes read in one event
        loop iteration.

    @ivar addressFamily: L{socket.AF_INET} or L{socket.AF_INET6}, depending on
        whether this port is listening on an IPv4 address or an IPv6 address.

    @ivar _realPortNumber: Actual port number being listened on. The
        value will be L{None} until this L{Port} is listening.

    @ivar _preexistingSocket: If not L{None}, a L{socket.socket} instance which
        was created and initialized outside of the reactor and will be used to
        listen for connections (instead of a new socket being created by this
        L{Port}).
    i   NÚ_realPortNumberc                 óÊ   — t         j                  j                  | |«       || _        || _        || _        || _        | j                  «        d| _        | j                  «        y)a  
        @param port: A port number on which to listen.
        @type port: L{int}

        @param proto: A C{DatagramProtocol} instance which will be
            connected to the given C{port}.
        @type proto: L{twisted.internet.protocol.DatagramProtocol}

        @param interface: The local IPv4 or IPv6 address to which to bind;
            defaults to '', ie all IPv4 addresses.
        @type interface: L{str}

        @param maxPacketSize: The maximum packet size to accept.
        @type maxPacketSize: L{int}

        @param reactor: A reactor which will notify this C{Port} when
            its socket is ready for reading or writing. Defaults to
            L{None}, ie the default global reactor.
        @type reactor: L{interfaces.IReactorFDSet}
        N)
r   ÚBasePortÚ__init__ÚportÚprotocolÚmaxPacketSizeÚ	interfaceÚ	setLogStrÚ_connectedAddrÚ_setAddressFamily)Úselfr$   Úprotor'   r&   Úreactors         ú6/usr/lib/python3/dist-packages/twisted/internet/udp.pyr#   zPort.__init__[   sS   € ô* 	�‰×Ñ˜t WÔ-ØˆŒ	ØˆŒØ*ˆÔØ"ˆŒØ�‰ÔØ"ˆÔØ×ÑÕ ó    c                 ó–   — t        j                  ||| j                  «      }|j                  «       d   } | d||||¬«      }||_        |S )a�  
        Create a new L{Port} based on an existing listening
        I{SOCK_DGRAM} socket.

        @param reactor: A reactor which will notify this L{Port} when
            its socket is ready for reading or writing. Defaults to
            L{None}, ie the default global reactor.
        @type reactor: L{interfaces.IReactorFDSet}

        @param fd: An integer file descriptor associated with a listening
            socket.  The socket must be in non-blocking mode.  Any additional
            attributes desired, such as I{FD_CLOEXEC}, must also be set already.
        @type fd: L{int}

        @param addressFamily: The address family (sometimes called I{domain}) of
            the existing socket.  For example, L{socket.AF_INET}.
        @type addressFamily: L{int}

        @param protocol: A C{DatagramProtocol} instance which will be
            connected to the C{port}.
        @type protocol: L{twisted.internet.protocol.DatagramProtocol}

        @param maxPacketSize: The maximum packet size to accept.
        @type maxPacketSize: L{int}

        @return: A new instance of C{cls} wrapping the socket given by C{fd}.
        @rtype: L{Port}
        r   N)r'   r-   r&   )ÚsocketÚfromfdÚ
socketTypeÚgetsocknameÚ_preexistingSocket)	Úclsr-   ÚfdÚaddressFamilyr%   r&   r$   r'   r+   s	            r.   Ú_fromListeningDescriptorzPort._fromListeningDescriptory   sV   € ô@ �}‰}˜R °·±Ó?ˆØ×$Ñ$Ó& qÑ)ˆ	ÙØØØØØ'ô
ˆð #'ˆÔØˆr/   Úreturnc                 óœ   — | j                   �'d| j                  j                  › d| j                   › d�S d| j                  j                  › d�S )Nú<z on ú>z not connected>)r    r%   Ú	__class__©r+   s    r.   Ú__repr__zPort.__repr__¥   sO   € Ø×ÑÐ+Ø�t—}‘}×.Ñ.Ð/¨t°D×4HÑ4HÐ3IÈÐKÐKà�t—}‘}×.Ñ.Ð/¨Ð?Ð?r/   c                 ó   — | j                   S )z)
        Return a socket object.
        )r1   r?   s    r.   Ú	getHandlezPort.getHandle«   ó   € ð �{‰{Ðr/   c                 óD   — | j                  «        | j                  «        y)zÐ
        Create and bind my socket, and begin listening on it.

        This is called on unserialization, and must be called after creating a
        server to begin listening on the specified port.
        N)Ú_bindSocketÚ_connectToProtocolr?   s    r.   ÚstartListeningzPort.startListening±   s   € ð 	×ÑÔØ×ÑÕ!r/   c                 ó(  — | j                   €9	 | j                  «       }|j                  | j                  | j                  f«       n| j                   }d| _         |j                  «       d   | _	        t        j                  | j                  | j                  «      ›d| j                  ›�«       d| _        || _        | j                  j                   | _        y# t
        $ r0}t        j                  | j                  | j                  |«      ‚d}~ww xY w)aJ  
        Prepare and assign a L{socket.socket} instance to
        C{self.socket}.

        Either creates a new SOCK_DGRAM L{socket.socket} bound to
        C{self.interface} and C{self.port} or takes an existing
        L{socket.socket} provided via the
        L{interfaces.IReactorSocket.adoptDatagramPort} interface.
        Né   z starting on )r5   ÚcreateInternetSocketÚbindr'   r$   ÚOSErrorr   ÚCannotListenErrorr4   r    r   ÚmsgÚ_getLogPrefixr%   Ú	connectedr1   Úfileno©r+   ÚsktÚles      r.   rE   zPort._bindSocket»   sæ   € ð ×"Ñ"Ð*ðMØ×/Ñ/Ó1�Ø—‘˜$Ÿ.™.¨$¯)©)Ð4Õ5ð
 ×)Ñ)ˆCØ&*ˆDÔ#ð  #Ÿ™Ó0°Ñ3ˆÔä�‰à×!Ñ! $§-¡-Õ0°$×2FÒ2FðHô	
ð
 ˆŒØˆŒØ—k‘k×(Ñ(ˆ�øô% ò MÜ×-Ñ-¨d¯n©n¸d¿i¹iÈÓLÐLûðMús   Ž7C Ã	DÃ!+DÄDc                 óZ   — | j                   j                  | «       | j                  «        y ©N)r%   ÚmakeConnectionÚstartReadingr?   s    r.   rF   zPort._connectToProtocolÞ   s    € Ø�‰×$Ñ$ TÔ*Ø×ÑÕr/   c                 ó<  — d}|| j                   k  r‡	 | j                  j                  | j                  «      \  }}|t	        |«      z  }| j
                  t        j                  k(  r|dd }	 | j                  j                  ||«       || j                   k  rŒ†yy# t        $ r t        j                  «        Y Œ1w xY w# t        $ rU}|j                  d   }|t        v rY d}~y|t        v r+| j                   r| j                  j#                  «        Y d}~y‚ d}~ww xY w)z=
        Called when my socket is ready for reading.
        r   Né   )ÚmaxThroughputr1   Úrecvfromr&   Úlenr8   ÚAF_INET6r%   ÚdatagramReceivedÚBaseExceptionr   ÚerrrL   ÚargsÚ_sockErrReadIgnoreÚ_sockErrReadRefuser)   ÚconnectionRefused)r+   ÚreadÚdataÚaddrÚseÚnos         r.   ÚdoReadzPort.doReadâ   sþ   € ð ˆØ�T×'Ñ'Ò'ðØ!Ÿ[™[×1Ñ1°$×2DÑ2DÓE‘
��dð œ˜D›	Ñ!�Ø×%Ñ%¬¯©Ò8ð    ˜8�DðØ—M‘M×2Ñ2°4¸Ô>ð/ �T×'Ñ'Õ'øô0 %ò Ü—G‘G–Iðûô+ ò Ø—W‘W˜Q‘Z�ØÔ+Ñ+ÜØÔ+Ñ+Ø×*Ò*ØŸ™×7Ñ7Ô9ÜØûðús5   “(B= Á,B ÂB:Â9B:Â=	DÃDÃ".DÄDÄDc                 ó�  — | j                   r.|d| j                   fv sJ ‚	 | j                  j                  |«      S |dk7  sJ ‚t        j                  |d   «      s9t        j                  |d   «      s!|d   dk7  rt        j                   |d   d«      ‚t        j                  |d   «      s|d   dk(  r6| j"                  t        j$                  k(  rt        j                   |d   d«      ‚t        j                  |d   «      r6| j"                  t        j&                  k(  rt        j                   |d   d«      ‚	 | j                  j)                  ||«      S # t        $ r{}|j                  d   }|t
        k(  r| j                  |«      cY d}~S |t        k(  rt        j                  d«      ‚|t        k(  r| j                  j                  «        n‚ Y d}~yd}~ww xY w# t        $ ra}|j                  d   }|t
        k(  r| j                  ||«      cY d}~S |t        k(  rt        j                  d«      ‚|t        k(  rY d}~y‚ d}~ww xY w)az  
        Write a datagram.

        @type datagram: L{bytes}
        @param datagram: The datagram to be sent.

        @type addr: L{tuple} containing L{str} as first element and L{int} as
            second element, or L{None}
        @param addr: A tuple of (I{stringified IPv4 or IPv6 address},
            I{integer port number}); can be L{None} in connected mode.
        Nr   zmessage too longz<broadcast>z0write() only accepts IP addresses, not hostnamesz7IPv6 port write() called with IPv4 or broadcast addressz*IPv4 port write() called with IPv6 address)r)   r1   ÚsendrL   rb   r   Úwriter   r   ÚMessageLengthErrorr   r%   re   r   ÚisIPAddressÚisIPv6AddressÚInvalidAddressErrorr8   r^   ÚAF_INETÚsendto)r+   Údatagramrh   ri   rj   s        r.   rn   z
Port.write  s  € ð ×ÒØ˜D $×"5Ñ"5Ð6Ñ6Ð6Ð6ðØ—{‘{×'Ñ'¨Ó1Ð1ð ˜4’<Ð�<ä×(Ñ(¨¨a©Ô1Ü ×.Ñ.¨t°A©wÔ7Ø˜‘G˜}Ò,ä×/Ñ/Ø˜‘GÐOóð ô ×$Ñ$ T¨!¡WÔ-°°a±¸MÒ1IØ×$Ñ$¬¯©Ò7Ü×/Ñ/Ø˜‘GÐVóð ô ×%Ñ% d¨1¡gÔ.°4×3EÑ3EÌÏÉÒ3WÜ×/Ñ/Ø˜‘GÐIóð ðØ—{‘{×)Ñ)¨(°DÓ9Ð9øô? ò 	Ø—W‘W˜Q‘Z�Øœ’;ØŸ:™: hÓ/Õ/Øœ8’^Ü×2Ñ2Ð3EÓFÐFØœ<Ò'Ø—M‘M×3Ñ3Õ5àô 6ûð	ûô@ ò Ø—W‘W˜Q‘Z�Øœ’;ØŸ:™: h°Ó5Õ5Øœ8’^Ü×2Ñ2Ð3EÓFÐFØœ<Ò'ô àûðúsN    E Ä8G Å	GÅ(GÆGÆAGÇGÇ	IÇ$)I ÈIÈ'I È?I É Ic                 óF   — | j                  dj                  |«      |«       y)aÛ  
        Write a datagram constructed from an iterable of L{bytes}.

        @param seq: The data that will make up the complete datagram to be
            written.
        @type seq: an iterable of L{bytes}

        @type addr: L{tuple} containing L{str} as first element and L{int} as
            second element, or L{None}
        @param addr: A tuple of (I{stringified IPv4 or IPv6 address},
            I{integer port number}); can be L{None} in connected mode.
        r/   N)rn   Újoin)r+   Úseqrh   s      r.   ÚwriteSequencezPort.writeSequence@  s   € ð 	�
‰
�3—8‘8˜C“= $Õ'r/   c                 óþ   — | j                   rt        d«      ‚t        j                  |«      s+t        j                  |«      st        j                  |d«      ‚||f| _         | j                  j                  ||f«       y)z-
        'Connect' to remote server.
        z:already connected, reconnecting is not currently supportedúnot an IPv4 or IPv6 address.N)	r)   ÚRuntimeErrorr   rp   rq   r   rr   r1   Úconnect)r+   Úhostr$   s      r.   r}   zPort.connectO  sp   € ð ×ÒÜØLóð ô ×#Ñ# DÔ)´(×2HÑ2HÈÔ2NÜ×+Ñ+¨DÐ2PÓQÐQØ# T˜lˆÔØ�‰×Ñ˜T 4˜LÕ)r/   c                 óŠ   — | j                  «        | j                  r'| j                  j                  d| j                  «       y y )Nr   )ÚstopReadingrP   r-   Ú	callLaterÚconnectionLostr?   s    r.   Ú_loseConnectionzPort._loseConnection\  s4   € Ø×ÑÔØ�>Š>Ø�L‰L×"Ñ" 1 d×&9Ñ&9Õ:ð r/   c                 óz   — | j                   rt        j                  «       x}| _        nd }| j	                  «        |S rV   )rP   r   ÚDeferredÚdrƒ   )r+   Úresults     r.   ÚstopListeningzPort.stopListeninga  s2   € Ø�>Š>Ü#Ÿn™nÓ.Ð.ˆF�T•VàˆFØ×ÑÔØˆr/   c                 ó\   — t        j                  dt        d¬«       | j                  «        y )Nz-Please use stopListening() to disconnect portrZ   )Ú
stacklevel)ÚwarningsÚwarnÚDeprecationWarningrˆ   r?   s    r.   ÚloseConnectionzPort.loseConnectioni  s%   € Ü�‰Ø;ÜØõ	
ð
 	×ÑÕr/   c                 óh  — t        j                  d| j                  z  «       d| _        d| _        t        j
                  j                  | |«       | j                  j                  «        | j                  j                  «        | `	| `t        | d«      r| j                  j                  d«       | `yy)z&
        Cleans up my socket.
        z(UDP Port %s Closed)Néÿÿÿÿr†   )r   rN   r    r[   r   r"   r‚   r%   ÚdoStopr1   ÚcloserQ   Úhasattrr†   Úcallback)r+   Úreasons     r.   r‚   zPort.connectionLostq  sŽ   € ô 	�‰Ð&¨×)=Ñ)=Ñ=Ô>Ø#ˆÔØˆÔÜ�‰×$Ñ$ T¨6Ô2Ø�‰×ÑÔØ�‰×ÑÔØˆKØˆKÜ�4˜ÔØ�F‰F�O‰O˜DÔ!Ø‘ð r/   c                 óN   — | j                  | j                  «      }d|z  | _        y)zP
        Initialize the C{logstr} attribute to be used by C{logPrefix}.
        z%s (UDP)N)rO   r%   Úlogstr)r+   Ú	logPrefixs     r.   r(   zPort.setLogStr�  s$   € ð ×&Ñ& t§}¡}Ó5ˆ	Ø  9Ñ,ˆ�r/   c                 ó0  — t        j                  | j                  «      rt        j                  | _        yt        j                  | j                  «      rt        j                  | _        y| j                  r t        j                  | j                  d«      ‚y)z8
        Resolve address family for the socket.
        r{   N)
r   rq   r'   r1   r^   r8   rp   rs   r   rr   r?   s    r.   r*   zPort._setAddressFamilyˆ  si   € ô ×!Ñ! $§.¡.Ô1Ü!'§¡ˆDÕÜ×!Ñ! $§.¡.Ô1Ü!'§¡ˆDÕØ�^Š^Ü×+Ñ+Ø—‘Ð >óð ð r/   c                 ó   — | j                   S )z0
        Return the prefix to log with.
        )r—   r?   s    r.   r˜   zPort.logPrefix•  rC   r/   c                 ó
  — | j                   j                  «       }| j                  t         j                  k(  rt	        j
                  dg|¢­Ž S | j                  t         j                  k(  rt	        j                  dg|dd ¢­Ž S y)z¬
        Return the local address of the UDP connection

        @returns: the local address of the UDP connection
        @rtype: L{IPv4Address} or L{IPv6Address}
        ÚUDPNrZ   )r1   r4   r8   rs   r   ÚIPv4Addressr^   ÚIPv6Address©r+   rh   s     r.   ÚgetHostzPort.getHost›  sq   € ð �{‰{×&Ñ&Ó(ˆØ×Ñ¤§¡Ò/Ü×&Ñ& uÐ4¨tÒ4Ð4Ø×Ñ¤6§?¡?Ò2Ü×&Ñ& uÐ:°°R°a°Ò:Ð:ð 3r/   c                 óv   — | j                   j                  t         j                  t         j                  |«       y)z«
        Set whether this port may broadcast. This is disabled by default.

        @param enabled: Whether the port may broadcast.
        @type enabled: L{bool}
        N)r1   Ú
setsockoptÚ
SOL_SOCKETÚSO_BROADCAST)r+   Úenableds     r.   ÚsetBroadcastAllowedzPort.setBroadcastAllowed¨  s&   € ð 	�‰×Ñœv×0Ñ0´&×2EÑ2EÀwÕOr/   c                 ó„   — t        | j                  j                  t        j                  t        j                  «      «      S )z“
        Checks if broadcast is currently allowed on this port.

        @return: Whether this port may broadcast.
        @rtype: L{bool}
        )Úboolr1   Ú
getsockoptr£   r¤   r?   s    r.   ÚgetBroadcastAllowedzPort.getBroadcastAllowed±  s,   € ô �D—K‘K×*Ñ*¬6×+<Ñ+<¼f×>QÑ>QÓRÓSÐSr/   )Ú é    NrV   )&Ú__name__Ú
__module__Ú__qualname__Ú__doc__r1   rs   r8   Ú
SOCK_DGRAMr3   r[   r    r   ÚintÚ__annotations__r5   r#   Úclassmethodr9   Ústrr@   rB   rG   rE   rF   rk   rn   ry   r}   rƒ   rˆ   rŽ   r‚   r(   r*   r˜   r    r¦   rª   © r/   r.   r   r   >   s½   … ñð$ —N‘N€MØ×"Ñ"€JØ€Mà%)€O�X˜c‘]Ó)ØÐó!ð< ñ)ó ð)ðV@˜#ó @òò"ò!)òFòó@<ò|(ò*ò;ò
òóò -òòò;òPóTr/   r   c                   óV   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
dd	„Zd
„ Zd„ Zdd„Zy)ÚMulticastMixinz,
    Implement multicast functionality.
    c                 óÄ   — | j                   j                  t         j                  t         j                  «      }t        j                  t        j                  d|«      «      S )Nz@i)r1   r©   Ú
IPPROTO_IPÚIP_MULTICAST_IFÚ	inet_ntoaÚstructÚpack)r+   Úis     r.   ÚgetOutgoingInterfacez#MulticastMixin.getOutgoingInterfaceÀ  s@   € Ø�K‰K×"Ñ"¤6×#4Ñ#4´f×6LÑ6LÓMˆÜ×Ñ¤§¡¨D°!Ó 4Ó5Ð5r/   c                 ój   — | j                   j                  |«      j                  | j                  «      S )zReturns Deferred of success.)r-   ÚresolveÚaddCallbackÚ_setInterfacerŸ   s     r.   ÚsetOutgoingInterfacez#MulticastMixin.setOutgoingInterfaceÄ  s(   € à�|‰|×#Ñ# DÓ)×5Ñ5°d×6HÑ6HÓIÐIr/   c                 ó    — t        j                  |«      }| j                   j                  t         j                  t         j                  |«       y)NrI   )r1   Ú	inet_atonr¢   rº   r»   )r+   rh   r¿   s      r.   rÄ   zMulticastMixin._setInterfaceÈ  s7   € Ü×Ñ˜TÓ"ˆØ�‰×Ñœv×0Ñ0´&×2HÑ2HÈ!ÔLØr/   c                 ór   — | j                   j                  t         j                  t         j                  «      S rV   )r1   r©   rº   ÚIP_MULTICAST_LOOPr?   s    r.   ÚgetLoopbackModezMulticastMixin.getLoopbackModeÍ  s%   € Ø�{‰{×%Ñ%¤f×&7Ñ&7¼×9QÑ9QÓRÐRr/   c                 ó´   — t        j                  dt        |«      «      }| j                  j	                  t        j
                  t        j                  |«       y )NÚb)r½   r¾   r¨   r1   r¢   rº   rÉ   )r+   Úmodes     r.   ÚsetLoopbackModezMulticastMixin.setLoopbackModeÐ  s8   € Ü�{‰{˜3¤ T£
Ó+ˆØ�‰×Ñœv×0Ñ0´&×2JÑ2JÈDÕQr/   c                 ór   — | j                   j                  t         j                  t         j                  «      S rV   )r1   r©   rº   ÚIP_MULTICAST_TTLr?   s    r.   ÚgetTTLzMulticastMixin.getTTLÔ  s%   € Ø�{‰{×%Ñ%¤f×&7Ñ&7¼×9PÑ9PÓQÐQr/   c                 ó¢   — t        j                  d|«      }| j                  j                  t        j                  t        j
                  |«       y )NÚB)r½   r¾   r1   r¢   rº   rÐ   )r+   Úttls     r.   ÚsetTTLzMulticastMixin.setTTL×  s4   € Ü�k‰k˜#˜sÓ#ˆØ�‰×Ñœv×0Ñ0´&×2IÑ2IÈ3ÕOr/   c                 ón   — | j                   j                  |«      j                  | j                  |d«      S )z4Join a multicast group. Returns Deferred of success.rI   ©r-   rÂ   rÃ   Ú
_joinAddr1©r+   rh   r'   s      r.   Ú	joinGroupzMulticastMixin.joinGroupÛ  ó+   € à�|‰|×#Ñ# DÓ)×5Ñ5°d·o±oÀyÐRSÓTÐTr/   c                 ón   — | j                   j                  |«      j                  | j                  ||«      S rV   )r-   rÂ   rÃ   Ú
_joinAddr2)r+   rh   r'   rw   s       r.   rØ   zMulticastMixin._joinAddr1ß  s+   € Ø�|‰|×#Ñ# IÓ.×:Ñ:¸4¿?¹?ÈDÐRVÓWÐWr/   c                 ó�  — t        j                  |«      }t        j                  |«      }|rt         j                  }nt         j                  }	 | j                   j	                  t         j
                  |||z   «       y # t        $ r>}t        j                  t        j                  ||g|j                  ¢­Ž «      cY d }~S d }~ww xY wrV   )r1   rÇ   ÚIP_ADD_MEMBERSHIPÚIP_DROP_MEMBERSHIPr¢   rº   rL   r   ÚFailurer   ÚMulticastJoinErrorrb   )r+   r'   rh   rw   ÚcmdÚes         r.   rÝ   zMulticastMixin._joinAddr2â  s™   € Ü×Ñ Ó%ˆÜ×$Ñ$ YÓ/ˆ	ÙÜ×*Ñ*‰Cä×+Ñ+ˆCð	WØ�K‰K×"Ñ"¤6×#4Ñ#4°c¸4À)Ñ;KÕLøÜò 	WÜ—?‘?¤5×#;Ñ#;¸DÀ)Ð#UÈaÏfÉfÒ#UÓVÕVûð	Wús   Á.A> Á>	CÂ3C Â:CÃ Cc                 ón   — | j                   j                  |«      j                  | j                  |d«      S )z2Leave multicast group, return Deferred of success.r   r×   rÙ   s      r.   Ú
leaveGroupzMulticastMixin.leaveGroupî  rÛ   r/   N)r«   )r­   r®   r¯   r°   rÀ   rÅ   rÄ   rÊ   rÎ   rÑ   rÕ   rÚ   rØ   rÝ   ræ   r¶   r/   r.   r¸   r¸   »  sG   „ ñò6òJòò
SòRòRòPóUòXò
WôUr/   r¸   c                   ó&   — e Zd ZdZ	 	 	 	 dd„Zd„ Zy)ÚMulticastPortz.
    UDP Port that supports multicasting.
    Nc                 óF   — t         j                  | |||||«       || _        y)zX
        @see: L{twisted.internet.interfaces.IReactorMulticast.listenMulticast}
        N)r   r#   ÚlistenMultiple)r+   r$   r,   r'   r&   r-   rê   s          r.   r#   zMulticastPort.__init__ù  s"   € ô 	�‰�d˜D %¨°MÀ7ÔKØ,ˆÕr/   c                 ó‚  — t         j                  | «      }| j                  rq|j                  t        j
                  t        j                  d«       t        t        d«      r2	 |j                  t        j
                  t        j                  d«       |S |S # t        $ r }|j                  t        k(  rn‚ Y d }~|S d }~ww xY w)NrI   ÚSO_REUSEPORT)r   rJ   rê   r¢   r1   r£   ÚSO_REUSEADDRr“   rì   rL   Úerrnor   rR   s      r.   rJ   z"MulticastPort.createInternetSocket  s�   € Ü×'Ñ'¨Ó-ˆØ×ÒØ�N‰Nœ6×,Ñ,¬f×.AÑ.AÀ1ÔEÜ”v˜~Ô.ðØ—N‘N¤6×#4Ñ#4´f×6IÑ6IÈ1ÔMð ˆ
ˆsˆ
øô ò à—x‘x¤;Ò.Øàó ð ˆ
ûðús   Á"/B Â	B>ÂB9Â9B>)r«   r¬   NF)r­   r®   r¯   r°   r#   rJ   r¶   r/   r.   rè   rè   ó  s   „ ñð ØØØó-ór/   rè   ).r°   r1   r½   r‹   Útypingr   Úzope.interfacer   Útwisted.python.runtimer   rî   r   r   r	   r
   r   r   r   r   r   r   rc   rd   r   r   r   r   r   Útwisted.internetr   r   r   r   r   r   Útwisted.pythonr   r   ÚIListeningPortÚIUDPTransportÚISystemHandler"   r   r¸   ÚIMulticastTransportrè   r¶   r/   r.   ú<module>rø      s  ðñ
ó Û Û Ý å &å /à�7ÒÝ$Ý$÷÷ ñ ð # N°KÀÐPÐØ)¨=¸,ÈÐUÐð €HØ"€LØ€FØ�EçU×Uà  %¨Ð5ÐØ&˜Ð÷ O× Nß 'ñ Ø×Ñ˜z×7Ñ7¸×9QÑ9QóôwTˆ4�=‰=ó wTóðwT÷t5Uñ 5Uñp ˆZ×+Ñ+Ó,ô!�N Dó !ó -ñ!r/   