Ë
    øÕñ^Xd  ã                   ó¼   — d 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mZmZ  G d„ d	e«      Z G d
„ de«      Z G d„ de«      Z G d„ de«      Zy)z]
Classes and functions for dealing with MAC addresses, EUI-48, EUI-64, OUI, IAB
identifiers.
é    )ÚNotRegisteredErrorÚAddrFormatErrorÚDictDotLookup)Úeui48Úeui64)Ú	mac_eui48)Ú
eui64_base)Ú	IPAddress)Ú_importlib_resourcesÚ_is_intÚ_is_strc                   ó8   — e Zd ZdZdZd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
y	)
ÚBaseIdentifierz$Base class for all IEEE identifiers.)Ú_valueÚ__weakref__c                 ó   — d | _         y ©N©r   ©Úselfs    ú6/usr/lib/python3/dist-packages/netaddr/eui/__init__.pyÚ__init__zBaseIdentifier.__init__   s	   € Øˆ�ó    c                 ó   — | j                   S ©z):return: integer value of this identifierr   r   s    r   Ú__int__zBaseIdentifier.__int__   ó   € à�{‰{Ðr   c                 ó   — | j                   S r   r   r   s    r   Ú__long__zBaseIdentifier.__long__   r   r   c                 ó@   — | j                   dk(  ryd| j                   z  S )z8:return: octal string representation of this identifier.r   Ú0z0%or   r   s    r   Ú__oct__zBaseIdentifier.__oct__"   s"   € ð �;‰;˜!ÒØØ�t—{‘{Ñ"Ð"r   c                 ó    — d| j                   z  S )z>:return: hexadecimal string representation of this identifier.z0x%xr   r   s    r   Ú__hex__zBaseIdentifier.__hex__)   s   € ð ˜Ÿ™Ñ#Ð#r   c                 ó   — | j                   S )zx
        :return: return the integer value of this identifier when passed to
            hex(), oct() or bin().
        r   r   s    r   Ú	__index__zBaseIdentifier.__index__.   s   € ð �{‰{Ðr   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__r   r   r   r"   r$   r&   © r   r   r   r      s(   „ Ù.Ø)€Iòòòò#ò$ó
r   r   c                   óh   ‡ — e Zd ZdZdZˆ fd„Zd„ Zd„ Zd„ Zd„ Z	d„ Z
ed	„ «       Zdd
„Zd„ Zd„ Zˆ xZS )ÚOUIzŒ
    An individual IEEE OUI (Organisationally Unique Identifier).

    For online details see - http://standards.ieee.org/regauth/oui/

    )Úrecordsc                 óŽ  •— t         t        | �  «        ddlm} g | _        t        |t        «      r"t        |j                  dd«      d«      | _
        n=t        |«      r$d|cxk  rdk  rn n|| _
        nt        d|›�«      ‚t        d|›�«      ‚| j                  |j                  v r�t        j                   t"        d	«      }|j                  | j                     D ]I  \  }}|j%                  |«       |j'                  |«      j)                  d
«      }| j+                  |||«       ŒK |j-                  «        yt/        d|›d�«      ‚)zÔ
        Constructor

        :param oui: an OUI string ``XX-XX-XX`` or an unsigned integer.             Also accepts and parses full MAC/EUI-48 address strings (but not             MAC/EUI-48 integers)!
        r   ©Úieeeú-Ú é   éÿÿÿ z OUI int outside expected range: zunexpected OUI format: zoui.txtúUTF-8zOUI z not registered!N)Úsuperr.   r   Únetaddr.euir2   r/   Ú
isinstanceÚstrÚintÚreplacer   r   Ú
ValueErrorÚ	TypeErrorÚ	OUI_INDEXr   Úopen_binaryÚ__package__ÚseekÚreadÚdecodeÚ_parse_dataÚcloser   )r   Úouir2   ÚfhÚoffsetÚsizeÚdataÚ	__class__s          €r   r   zOUI.__init__@   s  ø€ ô 	Œc�4Ñ!Ô#õ 	%àˆŒä�cœ3Ôô ˜cŸk™k¨#¨rÓ2°BÓ7ˆD�KÜ�SŒ\Ø�CÔ#˜8Õ#Ø!�•å ÉÐ!NÓOÐOå¹3Ð@ÓAÐAð �;‰;˜$Ÿ.™.Ñ(Ü%×1Ñ1´+¸yÓIˆBØ"&§.¡.°·±Ñ"=ò 5‘�˜Ø—‘˜”Ø—w‘w˜t“}×+Ñ+¨GÓ4�Ø× Ñ   v¨tÕ4ð5ð �H‰H�Jå$ÂÐ%FÓGÐGr   c                 ó¢   — t        |t        «      s	 | j                  |«      }| j
                  |j
                  k(  S # t        $ r	 t        cY S w xY wr   ©r:   r.   rM   Ú	ExceptionÚNotImplementedr   ©r   Úothers     r   Ú__eq__z
OUI.__eq__g   óK   € Ü˜%¤Ô%ð&ØŸ™ uÓ-�ð �{‰{˜eŸl™lÑ*Ð*øô ò &Ü%Ò%ð&úó   ’< ¼AÁAc                 ó¢   — t        |t        «      s	 | j                  |«      }| j
                  |j
                  k7  S # t        $ r	 t        cY S w xY wr   rO   rR   s     r   Ú__ne__z
OUI.__ne__o   rU   rV   c                 ó2   — | j                   | j                  fS )z+:returns: Pickled state of an `OUI` object.©r   r/   r   s    r   Ú__getstate__zOUI.__getstate__w   s   € à�{‰{˜DŸL™LÐ(Ð(r   c                 ó"   — |\  | _         | _        y)z;:param state: data used to unpickle a pickled `OUI` object.NrZ   ©r   Ústates     r   Ú__setstate__zOUI.__setstate__{   s   € à$)Ñ!ˆŒ�T•\r   c                 óD  — dddg ||dœ}|j                  d«      D ]h  }|j                  «       }|sŒd|v r6| j                  |d<   |j                  dd«      d   |d	<   t        | «      |d
<   ŒPd|v rŒU|d   j	                  |«       Œj | j
                  j	                  |«       y)z.Returns a dict record from raw OUI record datar   r4   )ÚidxrH   ÚorgÚaddressrJ   rK   ú
ú(hex)ra   Né   rb   rH   ú	(base 16)rc   )ÚsplitÚstripr   r;   Úappendr/   )r   rL   rJ   rK   ÚrecordÚlines         r   rF   zOUI._parse_data   s´   € ð ØØØØØñ
ˆð —J‘J˜tÓ$ò 	/ˆDØ—:‘:“<ˆDÙØà˜$‰Ø $§¡��u‘Ø $§
¡
¨4°Ó 3°AÑ 6��u‘Ü # D£	��u’Ø Ñ$Øà�yÑ!×(Ñ(¨Õ.ð	/ð 	�‰×Ñ˜FÕ#r   c                 ó,   — t        | j                  «      S )z0Number of registered organisations with this OUI)Úlenr/   r   s    r   Ú	reg_countzOUI.reg_countš   s   € ô �4—<‘<Ó Ð r   c                 ó2   — t        | j                  |   «      S )a  
        The IEEE registration details for this OUI.

        :param index: the index of record (may contain multiple registrations)
            (Default: 0 - first registration)

        :return: Objectified Python data structure containing registration
            details.
        )r   r/   )r   Úindexs     r   ÚregistrationzOUI.registrationŸ   s   € ô ˜TŸ\™\¨%Ñ0Ó1Ð1r   c                 óH   — | j                   }d|dz	  dz  |dz	  dz  |dz  fz  S )z*:return: string representation of this OUIú%02X-%02X-%02Xr5   éÿ   é   r   ©r   Úint_vals     r   Ú__str__zOUI.__str__«   s<   € à—+‘+ˆØØ˜B‘ $Ñ&Ø˜A‘ Ñ%Ø˜$‘ð# ñ  ð 	 r   c                 ó   — d| z  S )ú@:return: executable Python string to recreate equivalent object.z	OUI('%s')r,   r   s    r   Ú__repr__zOUI.__repr__³   ó   € à˜TÑ!Ð!r   )r   )r'   r(   r)   r*   r+   r   rT   rX   r[   r_   rF   Úpropertyro   rr   ry   r|   Ú__classcell__©rM   s   @r   r.   r.   7   sR   ø„ ñð €Iô%HòN+ò+ò)ò*ò$ð6 ñ!ó ð!ó
2ò ö"r   r.   c                   ól   ‡ — e Zd ZdZ	 dZedd„«       Zdˆ fd„	Zd„ Zd„ Z	d„ Z
d„ Zd	„ Zd
„ Zd„ Zd„ Zˆ xZS )ÚIAB)iÂP  iUØ@ )rk   c                 óè   — |dz	  | j                   v r|dfS d}d|z  }|dz	  }||z  |z
  }|dz	  | j                   v r"|r|dk7  rt        dt        |«      z  «      ‚||fS t        dt        |«      z  «      ‚)zõ
        :param eui_int: a MAC IAB as an unsigned integer.

        :param strict: If True, raises a ValueError if the last 12 bits of
            IAB MAC/EUI-48 address are non-zero, ignores them otherwise.
            (Default: False)
        é   r   iÿ  ì   ÿÿÿ z%r is not a strict IAB!z%r is not an IAB address!)ÚIAB_EUI_VALUESr>   Úhex)ÚclsÚeui_intÚstrictÚ	user_maskÚiab_maskÚiab_bitsÚ	user_bitss          r   Úsplit_iab_maczIAB.split_iab_macÃ   s›   € ð �r‰M˜c×0Ñ0Ñ0Ø˜A�:Ðàˆ	Ø 9Ñ,ˆØ˜b‘=ˆØ˜xÑ'¨8Ñ3ˆ	à˜‰N˜s×1Ñ1Ñ1Ù˜) qš.Ü Ð!:¼SÀ»^Ñ!KÓLÐLð ˜Ð"Ð"ô Ð8¼3¸w»<ÑGÓHÐHr   c                 óú  •— t         t        | �  «        ddlm} dddg dddœ| _        t        |t        «      r:t        |j                  dd«      d«      }| j                  ||¬«      \  }}|| _        n8t        |«      r| j                  ||¬«      \  }}|| _        nt        d|›d	�«      ‚| j                  |j                  v r¬t        j                   t"        d
«      }|j                  | j                     d   \  }}	|| j
                  d<   |	| j
                  d<   |j%                  |«       |j'                  |	«      j)                  d«      }
| j+                  |
||	«       |j-                  «        yt/        d|›d�«      ‚)a˜  
        Constructor

        :param iab: an IAB string ``00-50-C2-XX-X0-00`` or an unsigned             integer. This address looks like an EUI-48 but it should not             have any non-zero bits in the last 3 bytes.

        :param strict: If True, raises a ValueError if the last 12 bits             of IAB MAC/EUI-48 address are non-zero, ignores them otherwise.             (Default: False)
        r   r1   r4   )ra   Úiabrb   rc   rJ   rK   r3   r5   )rŠ   zunexpected IAB format: ú!ziab.txtrJ   rK   r7   zIAB z not unregistered!N)r8   r‚   r   r9   r2   rk   r:   r;   r<   r=   r�   r   r   r?   Ú	IAB_INDEXr   rA   rB   rC   rD   rE   rF   rG   r   )r   r‘   rŠ   r2   rx   Úiab_intÚuser_intrI   rJ   rK   rL   rM   s              €r   r   zIAB.__init__Ü   sW  ø€ ô 	Œc�4Ñ!Ô#õ 	%ð ØØØØØñ
ˆŒô �cœ3Ôô ˜#Ÿ+™+ c¨2Ó.°Ó3ˆGØ $× 2Ñ 2°7À6Ð 2Ó JÑˆG�XØ!ˆD�KÜ�SŒ\Ø $× 2Ñ 2°3¸vÐ 2Ó FÑˆG�XØ!ˆD�KåºCÐAÓBÐBð �;‰;˜$Ÿ.™.Ñ(Ü%×1Ñ1´+¸yÓIˆBØ!Ÿ^™^¨D¯K©KÑ8¸Ñ;‰NˆV�TØ$*ˆD�K‰K˜Ñ!Ø"&ˆD�K‰K˜ÑØ�G‰G�FŒOØ—7‘7˜4“=×'Ñ'¨Ó0ˆDØ×Ñ˜T 6¨4Ô0Ø�H‰H�Jå$Â3Ð%HÓIÐIr   c                 ó¢   — t        |t        «      s	 | j                  |«      }| j
                  |j
                  k(  S # t        $ r	 t        cY S w xY wr   ©r:   r‚   rM   rP   rQ   r   rR   s     r   rT   z
IAB.__eq__  rU   rV   c                 ó¢   — t        |t        «      s	 | j                  |«      }| j
                  |j
                  k7  S # t        $ r	 t        cY S w xY wr   r—   rR   s     r   rX   z
IAB.__ne__  rU   rV   c                 ó2   — | j                   | j                  fS )z+:returns: Pickled state of an `IAB` object.©r   rk   r   s    r   r[   zIAB.__getstate__   s   € à�{‰{˜DŸK™KÐ'Ð'r   c                 ó"   — |\  | _         | _        y)z;:param state: data used to unpickle a pickled `IAB` object.Nrš   r]   s     r   r_   zIAB.__setstate__$  s   € à#(Ñ ˆŒ�T•[r   c                 óL  — |j                  d«      D ]�  }|j                  «       }|sŒd|v rT| j                  | j                  d<   |j                  dd«      d   | j                  d<   t	        | «      | j                  d<   Œnd|v rŒs| j                  d	   j                  |«       Œ’ y)
z.Returns a dict record from raw IAB record datard   re   ra   Nrf   rb   r‘   rg   rc   )rh   ri   r   rk   r;   rj   )r   rL   rJ   rK   rl   s        r   rF   zIAB._parse_data(  s–   € à—J‘J˜tÓ$ò 	4ˆDØ—:‘:“<ˆDÙØà˜$‰Ø%)§[¡[�—‘˜EÑ"Ø%)§Z¡Z°°aÓ%8¸Ñ%;�—‘˜EÑ"Ü%(¨£Y�—‘˜EÒ"Ø Ñ$Øà—‘˜IÑ&×-Ñ-¨dÕ3ñ	4r   c                 ó,   — t        | j                  «      S )z*The IEEE registration details for this IAB)r   rk   r   s    r   rr   zIAB.registration8  s   € ä˜TŸ[™[Ó)Ð)r   c                 ój   — | j                   dz  }d|dz	  dz  |dz	  dz  |dz	  dz  |dz	  dz  |dz  fz  S )z*:return: string representation of this IABé   z%02X-%02X-%02X-%02X-%02X-00é    ru   é   r5   rv   r   rw   s     r   ry   zIAB.__str__<  sY   € à—+‘+ Ñ"ˆà,Ø˜B‘ $Ñ&Ø˜B‘ $Ñ&Ø˜B‘ $Ñ&Ø˜A‘ Ñ%Ø˜$‘ð0 ñ  ð 	 r   c                 ó   — d| z  S )r{   z	IAB('%s')r,   r   s    r   r|   zIAB.__repr__G  r}   r   )F)r'   r(   r)   r†   r+   Úclassmethodr�   r   rT   rX   r[   r_   rF   rr   ry   r|   r   r€   s   @r   r‚   r‚   ¸   sU   ø„ Ø)€Nðð €Iàò#ó ð#õ02Jòh+ò+ò(ò)ò4ò *ò	 ö"r   r‚   c                   ón  ‡ — e Zd ZdZdZd(ˆ fd„	Zd„ Zd„ Zd„ Zd„ Z	 e
ee	dd	«      Zd
„ Zd„ Zd„ Z e
eedd«      Ze
d„ «       Ze
d„ «       Zd„ Ze
d„ «       Ze
d„ «       Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd)d„Ze
d„ «       Ze
d„ «       Z e
d„ «       Z!d „ Z"d!„ Z#d"„ Z$d#„ Z%e
d$„ «       Z&d)d%„Z'd&„ Z(d'„ Z)ˆ xZ*S )*ÚEUIz×
    An IEEE EUI (Extended Unique Identifier).

    Both EUI-48 (used for layer 2 MAC addresses) and EUI-64 are supported.

    Input parsing for EUI-48 addresses is flexible, supporting many MAC
    variants.

    )Ú_moduleÚ_dialectNc                 ó  •— t         t        | �  «        d| _        t	        |t        «      rZ|�$||j                  j
                  k7  rt        d«      ‚|j                  | _        |j                  | _        |j                  | _        y|�0|dk(  rt        | _        n]|dk(  rt        | _        nLt        d|z  «      ‚t        |«      r3d|cxk  rdk  rn nt        | _        nd|cxk  rdk  rn nt        | _        || _        || _        y)	a2  
        Constructor.

        :param addr: an EUI-48 (MAC) or EUI-64 address in string format or             an unsigned integer. May also be another EUI object (copy             construction).

        :param version: (optional) the explicit EUI address version, either             48 or 64. Mainly used to distinguish EUI-48 and EUI-64 identifiers             specified as integers which may be numerically equivalent.

        :param dialect: (optional) the mac_* dialect to be used to configure             the formatting of EUI-48 (MAC) addresses.
        Nz2cannot switch EUI versions using copy constructor!é0   é@   zunsupported EUI version %rr   r…   l   ÿÿÿÿ )r8   r¥   r   r¦   r:   Úversionr>   r   ÚdialectÚ_eui48Ú_eui64r   Úvalue)r   Úaddrr«   r¬   rM   s       €r   r   zEUI.__init__X  så   ø€ ô 	Œc�4Ñ!Ô#àˆŒä�dœCÔ àÐ" w°$·,±,×2FÑ2FÒ'FÜ ð "(ó )ð )àŸ<™<ˆDŒLØŸ+™+ˆDŒKØŸ<™<ˆDŒLØàÐØ˜"Š}Ü%�•Ø˜B’Ü%�•ä Ð!=ÀÑ!GÓHÐHô �tŒ}Ø˜Ô. Õ.Ü#)�D•LØ# dÔ@Ð.@Õ@Ü#)�D”LàˆŒ
ð ˆ�r   c                 ó\   — | j                   | j                  j                  | j                  fS )z+:returns: Pickled state of an `EUI` object.)r   r¦   r«   r¬   r   s    r   r[   zEUI.__getstate__Š  s!   € à�{‰{˜DŸL™L×0Ñ0°$·,±,Ð>Ð>r   c                 ó˜   — |\  }}}|| _         |dk(  rt        | _        || _        y|dk(  rt        | _        || _        yt	        d|›�«      ‚)zN
        :param state: data used to unpickle a pickled `EUI` object.

        r©   rª   z$unpickling failed for object state: N)r   r­   r¦   r®   r>   r¬   )r   r^   r¯   r«   r¬   s        r   r_   zEUI.__setstate__Ž  s^   € ð
 #(Ñˆˆw˜àˆŒà�bŠ=Ü!ˆDŒLð ˆ�ð ˜Š]Ü!ˆDŒLð
 ˆ�õ Ùðó ð r   c                 ó   — | j                   S r   r   r   s    r   Ú
_get_valuezEUI._get_value¡  s   € Ø�{‰{Ðr   c                 ó¸  — | j                   €Kt        t        fD ]!  }	 |j                  |«      | _        || _          n | j                   €t        d|›�«      ‚y t        |«      r"	 | j                   j                  |«      | _        y dt        |«      cxk  r| j                   j                  k  rn nt        |«      | _        y t        d|›�«      ‚# t
        $ rP 	 dt        |«      cxk  r|j                  k  rn nt        |«      | _        || _         Y  Œ×n# t        $ r Y nw xY wY �Œw xY w# t
        $ r% t        d|| j                   j                  fz  «      ‚w xY w)Nr   zfailed to detect EUI version: zaddress %r is not an EUIv%dzbad address format: )r¦   r­   r®   Ú
str_to_intr   r   r<   Úmax_intr>   r   r«   )r   r¯   Úmodules      r   Ú
_set_valuezEUI._set_value¤  sJ  € Ø�<‰<Ðä!¤6Ð*ò �ðØ"(×"3Ñ"3°EÓ":�D”KØ#)�D”LÙð	ð �|‰|Ð#Ý%Ùð'ó  ð  ð $ô
 �uŒ~ð9Ø"&§,¡,×"9Ñ"9¸%Ó"@�D•Kð
 œ˜E›
Ô: d§l¡l×&:Ñ&:Õ:Ü"% e£*�D•Kå)ÁeÐ*MÓNÐNøô1 'ò ðØ¤ E£
Ô<¨f¯n©nÕ<Ü*-¨e«*˜DœKØ+1˜DœLÚ!ùÜ%ò Ùðýðûô" 'ò 9Ü)Ð*GØ  $§,¡,×"6Ñ"6Ð7ñ+8ó 9ð 9ð9úsA   �CÁ$ D+ Ã	D(Ã8DÄD(Ä	D!ÄD(Ä D!Ä!D(Ä'D(Ä+.EzBa positive integer representing the value of this EUI indentifier.c                 ó   — | j                   S r   )r§   r   s    r   Ú_get_dialectzEUI._get_dialectÉ  s   € Ø�}‰}Ðr   c                 óŒ   — |€| j                   t        u rt        S t        S t	        |d«      rt	        |d«      r|S t        d«      ‚)NÚ	word_sizeÚword_fmtz*custom dialects should subclass mac_eui48!)r¦   r®   r	   r   Úhasattrr?   ©r   r¯   s     r   Ú_validate_dialectzEUI._validate_dialectÌ  sC   € Øˆ=Ø�|‰|œvÑ%Ü Ð ä Ð ä�u˜kÔ*¬w°u¸jÔ/IØ�äÐ LÓMÐMr   c                 ó0   — | j                  |«      | _        y r   )rÁ   r§   rÀ   s     r   Ú_set_dialectzEUI._set_dialectØ  s   € Ø×.Ñ.¨uÓ5ˆ�r   zXa Python class providing support for the interpretation of various MAC
 address formats.c                 ó°   — | j                   t        k(  rt        | j                  dz	  «      S | j                   t        k(  rt        | j                  dz	  «      S y)z:The OUI (Organisationally Unique Identifier) for this EUI.r¡   é(   N)r¦   r­   r.   r¯   r®   r   s    r   rH   zEUI.ouiß  sI   € ð �<‰<œ6Ò!Ü�t—z‘z RÑ'Ó(Ð(Ø�\‰\œVÒ#Ü�t—z‘z RÑ'Ó(Ð(ð $r   c                 ó”   — | j                   t        k(  rdt        | dd «      z  S | j                   t        k(  rdt        | dd «      z  S y)z*The EI (Extension Identifier) for this EUIrt   é   é   z%02X-%02X-%02X-%02X-%02Xrv   N)r¦   r­   Útupler®   r   s    r   ÚeizEUI.eiç  sM   € ð �<‰<œ6Ò!Ø#¤e¨D°°1¨IÓ&6Ñ6Ð6Ø�\‰\œVÒ#Ø-´°d¸1¸Q°iÓ0@Ñ@Ð@ð $r   c                 ó@   — | j                   dz	  t        j                  v S )z<:return: True if this EUI is an IAB address, False otherwiser¡   )r   r‚   r†   r   s    r   Úis_iabz
EUI.is_iabï  s   € à—‘˜rÑ!¤c×&8Ñ&8Ð8Ð8r   c                 óT   — | j                  «       rt        | j                  dz	  «      S y)zr
        If is_iab() is True, the IAB (Individual Address Block) is returned,
        ``None`` otherwise.
        r„   N)rÌ   r‚   r   r   s    r   r‘   zEUI.iabó  s&   € ð �;‰;Œ=Ü�t—{‘{ bÑ(Ó)Ð)ð r   c                 ó.   — | j                   j                  S )z/The EUI version represented by this EUI object.)r¦   r«   r   s    r   r«   zEUI.versionü  s   € ð �|‰|×#Ñ#Ð#r   c                 ó   — t        |«      ro| j                  j                  }| |cxk  r|dz
  k  st        d«      ‚ t        d«      ‚| j                  j                  | j                  | j                  «      |   S t        |t        «      ra| j                  j                  | j                  | j                  «      }t        |j                  t        |«      «      Ž D �cg c]  }||   ‘Œ	 c}S t        d|›d�«      ‚c c}w )zû
        :return: The integer value of the word referenced by index (both             positive and negative). Raises ``IndexError`` if index is out             of bounds. Also supports Python list slices for accessing             word groups.
        é   z!index out range for address type!zunsupported type r’   )r   r§   Ú	num_wordsÚ
IndexErrorr¦   Úint_to_wordsr   r:   ÚsliceÚrangeÚindicesrn   r?   )r   ra   rÑ   ÚwordsÚis        r   Ú__getitem__zEUI.__getitem__  sÑ   € ô �3Œ<àŸ™×/Ñ/ˆIØ�J 3Ô9¨9°q©=Ò9Ü Ð!DÓEÐEð :Ü Ð!DÓEÐEØ—<‘<×,Ñ,¨T¯[©[¸$¿-¹-ÓHÈÑMÐMÜ˜œUÔ#Ø—L‘L×-Ñ-¨d¯k©k¸4¿=¹=ÓIˆEÜ&+¨S¯[©[¼¸U»Ó-DÐ&EÖF �E˜!“HÒFÐFå²cÐ;Ó<Ð<ùò Gs   ÃC;c                 ó>  — t        |t        «      rt        d«      ‚t        |«      st	        d«      ‚d|cxk  r| j
                  j                  dz
  k  sn t        d|fz  «      ‚t        |«      st	        d«      ‚d|cxk  r| j
                  j                  k  s&n t        d|| j
                  j                  fz  «      ‚t        | j                  j                  | j                  | j
                  «      «      }|||<   | j                  j                  |«      | _        y)	z=Set the value of the word referenced by index in this addressz"settable slices are not supported!zindex not an integer!r   rÐ   z'index %d outside address type boundary!zvalue not an integer!z.value %d outside word size maximum of %d bits!N)r:   rÔ   ÚNotImplementedErrorr   r?   r§   rÑ   rÒ   Úmax_wordr½   Úlistr¦   rÓ   r   Úwords_to_int)r   ra   r¯   r×   s       r   Ú__setitem__zEUI.__setitem__  sï   € ä�cœ5Ô!ä%Ð&JÓKÐKä�sŒ|ÜÐ3Ó4Ð4à�CÔ8˜DŸM™M×3Ñ3°aÑ7Ô8ÜÐFÈ#ÈÑOÓPÐPä�uŒ~ÜÐ3Ó4Ð4à�EÔ3˜TŸ]™]×3Ñ3Ô3ÜÐMØ˜$Ÿ-™-×1Ñ1Ð2ñ3ó 4ð 4ô �T—\‘\×.Ñ.¨t¯{©{¸D¿M¹MÓJÓKˆØˆˆc‰
Ø—l‘l×/Ñ/°Ó6ˆ�r   c                 óD   — t        | j                  | j                  f«      S )zA:return: hash of this EUI object suitable for dict keys, sets etc)Úhashr«   r   r   s    r   Ú__hash__zEUI.__hash__+  s   € ä�T—\‘\ 4§;¡;Ð/Ó0Ð0r   c                 óÒ   — t        |t        «      s	 | j                  |«      }| j
                  | j                  f|j
                  |j                  fk(  S # t        $ r	 t        cY S w xY w©zy
        :return: ``True`` if this EUI object is numerically the same as other,             ``False`` otherwise.
        ©r:   r¥   rM   rP   rQ   r«   r   rR   s     r   rT   z
EUI.__eq__/  ó_   € ô
 ˜%¤Ô%ð&ØŸ™ uÓ-�ð —‘˜dŸk™kÐ*¨u¯}©}¸e¿l¹lÐ.KÑKÐKøô ò &Ü%Ò%ð&úó   ’A ÁA&Á%A&c                 óÒ   — t        |t        «      s	 | j                  |«      }| j
                  | j                  f|j
                  |j                  fk7  S # t        $ r	 t        cY S w xY wrä   rå   rR   s     r   rX   z
EUI.__ne__;  ræ   rç   c                 óÒ   — t        |t        «      s	 | j                  |«      }| j
                  | j                  f|j
                  |j                  fk  S # t        $ r	 t        cY S w xY w)z�
        :return: ``True`` if this EUI object is numerically lower in value than             other, ``False`` otherwise.
        rå   rR   s     r   Ú__lt__z
EUI.__lt__G  ó_   € ô
 ˜%¤Ô%ð&ØŸ™ uÓ-�ð —‘˜dŸk™kÐ*¨e¯m©m¸U¿\¹\Ð-JÑJÐJøô ò &Ü%Ò%ð&úrç   c                 óÒ   — t        |t        «      s	 | j                  |«      }| j
                  | j                  f|j
                  |j                  fk  S # t        $ r	 t        cY S w xY w)zˆ
        :return: ``True`` if this EUI object is numerically lower or equal in             value to other, ``False`` otherwise.
        rå   rR   s     r   Ú__le__z
EUI.__le__S  ræ   rç   c                 óÒ   — t        |t        «      s	 | j                  |«      }| j
                  | j                  f|j
                  |j                  fkD  S # t        $ r	 t        cY S w xY w)zƒ
        :return: ``True`` if this EUI object is numerically greater in value             than other, ``False`` otherwise.
        rå   rR   s     r   Ú__gt__z
EUI.__gt___  rë   rç   c                 óÒ   — t        |t        «      s	 | j                  |«      }| j
                  | j                  f|j
                  |j                  fk\  S # t        $ r	 t        cY S w xY w)zŠ
        :return: ``True`` if this EUI object is numerically greater or equal             in value to other, ``False`` otherwise.
        rå   rR   s     r   Ú__ge__z
EUI.__ge__k  ræ   rç   c                 óN   — | j                   j                  | j                  |«      S )zÞ
        :param word_sep: (optional) the separator to insert between words.             Default: None - use default separator for address type.

        :return: human-readable binary digit string of this address.
        )r¦   Úint_to_bitsr   )r   Úword_seps     r   ÚbitszEUI.bitsw  s   € ð �|‰|×'Ñ'¨¯©°XÓ>Ð>r   c                 óL   — | j                   j                  | j                  «      S )z8The value of this EUI address as a packed binary string.)r¦   Úint_to_packedr   r   s    r   Úpackedz
EUI.packed€  s   € ð �|‰|×)Ñ)¨$¯+©+Ó6Ð6r   c                 óL   — | j                   j                  | j                  «      S )z<A list of unsigned integer octets found in this EUI address.)r¦   rÓ   r   r   s    r   r×   z	EUI.words…  s   € ð �|‰|×(Ñ(¨¯©Ó5Ð5r   c                 óL   — | j                   j                  | j                  «      S )zÜ
        The value of this EUI adddress in standard Python binary
        representational form (0bxxx). A back port of the format provided by
        the builtin bin() function found in Python 2.6.x and higher.
        )r¦   Ú
int_to_binr   r   s    r   ÚbinzEUI.binŠ  s   € ð �|‰|×&Ñ& t§{¡{Ó3Ð3r   c                 ó²   — | j                   dk(  r*| j                  dz	  }| j                  dz  }|dz  dz  |z  }n| j                  }| j                  |d¬«      S )a2  
        - If this object represents an EUI-48 it is converted to EUI-64             as per the standard.
        - If this object is already an EUI-64, a new, numerically             equivalent object is returned instead.

        :return: The value of this EUI object as a new 64-bit EUI object.
        r©   r¡   r6   rÅ   l      |ÿrª   ©r«   )r«   r   rM   )r   Úfirst_threeÚ
last_threeÚ	new_values       r   r   z	EUI.eui64“  s^   € ð �<‰<˜2ÒàŸ+™+¨Ñ+ˆKØŸ™ xÑ/ˆJØ$¨Ñ*¨lÑ:¸ZÑG‰Ið Ÿ™ˆIØ�~‰~˜i°ˆ~Ó4Ð4r   c                 óP   — | j                  «       }|xj                  dz  c_        |S )z¡
        - create a new EUI object with a modified EUI-64 as described in RFC 4291 section 2.5.1

        :return: a new and modified 64-bit EUI object.
        l          )r   r   )r   r   s     r   Úmodified_eui64zEUI.modified_eui64¦  s#   € ð —
‘
“ˆØ�ŠÐ:Ñ:�Øˆr   c                 óf   — t        |«      t        | j                  «       «      z   }t        |d¬«      S )a5  
        .. note:: This poses security risks in certain scenarios.             Please read RFC 4941 for details. Reference: RFCs 4291 and 4941.

        :param prefix: ipv6 prefix

        :return: new IPv6 `IPAddress` object based on this `EUI`             using the technique described in RFC 4291.
        rÈ   rþ   )r<   r  r
   )r   Úprefixrx   s      r   Úipv6zEUI.ipv6¶  s-   € ô �f“+¤ D×$7Ñ$7Ó$9Ó :Ñ:ˆÜ˜¨!Ô,Ð,r   c                 ó$   — | j                  d«      S )a  
        .. note:: This poses security risks in certain scenarios.             Please read RFC 4941 for details. Reference: RFCs 4291 and 4941.

        :return: new link local IPv6 `IPAddress` object based on this `EUI`             using the technique described in RFC 4291.
        l	                  @þ )r  r   s    r   Úipv6_link_localzEUI.ipv6_link_localÃ  s   € ð �y‰yÐ;Ó<Ð<r   c                 óª   — d| j                   j                  «       i}| j                  «       r| j                  j                  «       |d<   t	        |«      S )z€
        A record dict containing IEEE registration details for this EUI
        (MAC-48) if available, None otherwise.
        r.   r‚   )rH   rr   rÌ   r‘   r   )r   rL   s     r   ÚinfozEUI.infoÍ  sE   € ð �t—x‘x×,Ñ,Ó.Ð/ˆØ�;‰;Œ=ØŸ(™(×/Ñ/Ó1ˆD�‰Kä˜TÓ"Ð"r   c                 óp   — | j                  |«      }| j                  j                  | j                  |«      S )a"  
        Format the EUI into the representational format according to the given
        dialect

        :param dialect: the mac_* dialect defining the formatting of EUI-48             (MAC) addresses.

        :return: EUI in representational format according to the given dialect
        )rÁ   r¦   Ú
int_to_strr   )r   r¬   Úvalidated_dialects      r   Úformatz
EUI.formatÙ  s1   € ð !×2Ñ2°7Ó;ÐØ�|‰|×&Ñ& t§{¡{Ð4EÓFÐFr   c                 ób   — | j                   j                  | j                  | j                  «      S )z':return: EUI in representational format)r¦   r  r   r§   r   s    r   ry   zEUI.__str__æ  s!   € à�|‰|×&Ñ& t§{¡{°D·M±MÓBÐBr   c                 ó   — d| z  S )r{   z	EUI('%s')r,   r   s    r   r|   zEUI.__repr__ê  r}   r   )NNr   )+r'   r(   r)   r*   r+   r   r[   r_   r´   r¹   r~   r¯   r»   rÁ   rÃ   r¬   rH   rÊ   rÌ   r‘   r«   rÙ   rß   râ   rT   rX   rê   rí   rï   rñ   rõ   rø   r×   rü   r   r  r  r  r
  r  ry   r|   r   r€   s   @r   r¥   r¥   L  sl  ø„ ñð (€Iõ0òd?òò&ò OñD �Z ¨TØLóN€Eòò
Nò6ñ �| \°4ð	)ó*€Gð ñ)ó ð)ð ñAó ðAò9ð ñ*ó ð*ð ñ$ó ð$ò=ò&7ò.1ò
Lò
Lò
Kò
Lò
Kò
Ló?ð ñ7ó ð7ð ñ6ó ð6ð ñ4ó ð4ò5ò&ò -ò=ð ñ	#ó ð	#óGòCö"r   r¥   N)r*   Únetaddr.corer   r   r   Únetaddr.strategyr   r­   r   r®   Únetaddr.strategy.eui48r   Únetaddr.strategy.eui64r	   Ú
netaddr.ipr
   Únetaddr.compatr   r   r   Úobjectr   r.   r‚   r¥   r,   r   r   ú<module>r     s^   ðñ÷
 LÑ Kß =Ý ,Ý -Ý  ß AÑ Aô!�Vô !ôH~"ˆ.ô ~"ôBQ"ˆ.ô Q"ôh`"ˆ.õ `"r   