o
    DXh;                    @   s  	 d Z ddlZdZdZG dd deZG dd deZd	d
 Zd<ddZdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! ZG d"d# d#ZdaejG d$d% d%eZejG d&d' d'eZG d(d) d)ZG d*d+ d+eeZG d,d- d-eZG d.d/ d/eeZG d0d1 d1Zee_G d2d3 d3ZG d4d5 d5eeZG d6d7 d7eZ G d8d9 d9eeZ!G d:d; d;Z"e"e_dS )=z1.0    N       c                   @      e Zd ZdS )AddressValueErrorN__name__
__module____qualname__ r
   r
   3/opt/python-3.10.19/usr/lib/python3.10/ipaddress.pyr          r   c                   @   r   )NetmaskValueErrorNr   r
   r
   r
   r   r      r   r   c              	   C   T   	 zt | W S  ttfy   Y nw zt| W S  ttfy"   Y nw t| d)Nz. does not appear to be an IPv4 or IPv6 address)IPv4Addressr   r   IPv6Address
ValueErroraddressr
   r
   r   
ip_address   s   

r   Tc              	   C   sX   	 zt | |W S  ttfy   Y nw zt| |W S  ttfy$   Y nw t| d)Nz. does not appear to be an IPv4 or IPv6 network)IPv4Networkr   r   IPv6Networkr   )r   strictr
   r
   r   
ip_network9   s   r   c              	   C   r   )Nz0 does not appear to be an IPv4 or IPv6 interface)IPv4Interfacer   r   IPv6Interfacer   r   r
   r
   r   ip_interfaceV   s   

r   c                 C   (   	 z|  ddW S  ty   tdw )N   bigz&Address negative or too large for IPv4to_bytesOverflowErrorr   r   r
   r
   r   v4_int_to_packedx   s   r"   c                 C   r   )N   r   z&Address negative or too large for IPv6r   r   r
   r
   r   v6_int_to_packed   s   	r$   c                 C   s.   	 t | d}t|dkrtd| |S )N/   zOnly one '/' permitted in )strsplitlenr   )r   addrr
   r
   r   _split_optional_netmask   s
   r+   c                 c   sR    	 t | }t| }}|D ]}|j|jd kr||fV  |}|}q||fV  d S N   )iternext_ip)	addressesitfirstlastipr
   r
   r   _find_address_range   s   	
r6   c                 C   s&   	 | dkr|S t ||  | d @  S )Nr   r-   )min
bit_length)numberbitsr
   r
   r   _count_righthand_zero_bits   s   
r;   c                 c   s    	 t | trt |tstd| j|jkrtd| |f | |kr&td| jdkr.t}n| jdkr6t}ntd| j}| j}|j}||krwt	t
|||| d  d }|||| f}|V  |d|> 7 }|d |jkrqd S ||ksGd S d S )Nz1first and last must be IP addresses, not networks%%s and %s are not of the same versionz*last IP address must be greater than firstr      zunknown IP versionr-   )
isinstance_BaseAddress	TypeErrorversionr   r   r   _max_prefixlenr0   r7   r;   r8   	_ALL_ONES)r3   r4   r5   ip_bits	first_intlast_intnbitsnetr
   r
   r   summarize_address_range   s<   



rI   c                 c   s    	 t | }i }|r.| }| }||}|d u r |||< n||kr,||= || |s
d }t| D ]}|d urC|j|jkrCq6|V  |}q6d S N)listpopsupernetgetappendsortedvaluesbroadcast_address)r1   to_mergesubnetsrH   rM   existingr4   r
   r
   r   _collapse_addresses_internal   s,   


rV   c              	   C   s*  	 g }g }g }| D ]l}t |tr*|r$|d j|jkr$td||d f || q	|j|jkr\|rD|d j|jkrDtd||d f z||j W q	 ty[   ||j	 Y q	w |rp|d j|jkrptd||d f || q	t
t|}|rt|D ]\}}|t|| qt|| S )Nr<   )r>   r?   _versionr@   rO   
_prefixlenrB   r5   AttributeErrornetwork_addressrP   setr6   extendrI   rV   )r1   addrsipsnetsr5   r3   r4   r
   r
   r   collapse_addresses0  s>   
ra   c                 C   s*   	 t | tr
|  S t | tr|  S tS rJ   )r>   _BaseNetwork_get_networks_keyr?   _get_address_keyNotImplemented)objr
   r
   r   get_mixed_type_keyf  s   

rg   c                   @   s   e Zd Z	 dZedd Zedd Zedd Zedd	 Zd
d Z	dd Z
edd Zedd Zedd Zedd Zedd Zedd Zdd ZdS )_IPAddressBaser
   c                 C   
   	 |   S rJ   )_explode_shorthand_ip_stringselfr
   r
   r   exploded     z_IPAddressBase.explodedc                 C   s
   	 t | S rJ   r'   rk   r
   r
   r   
compressed  rn   z_IPAddressBase.compressedc                 C   ri   rJ   )_reverse_pointerrk   r
   r
   r   reverse_pointer     z_IPAddressBase.reverse_pointerc                 C      dt | f }t|)Nz%200s has no version specifiedtypeNotImplementedErrorrl   msgr
   r
   r   rA     s   z_IPAddressBase.versionc                 C   sF   |dk rd}t ||| jf || jkr!d}t ||| j| jf d S )Nr   z-%d (< 0) is not permitted as an IPv%d addressz2%d (>= 2**%d) is not permitted as an IPv%d address)r   rX   rC   rB   )rl   r   ry   r
   r
   r   _check_int_address  s   

z!_IPAddressBase._check_int_addressc                 C   s.   t |}||krd}t||||| jf d S )Nz6%r (len %d != %d) is not permitted as an IPv%d address)r)   r   rX   )rl   r   expected_lenaddress_lenry   r
   r
   r   _check_packed_address  s   z$_IPAddressBase._check_packed_addressc                 C   s   	 | j | j |? A S rJ   )rC   )cls	prefixlenr
   r
   r   _ip_int_from_prefix  s   	z"_IPAddressBase._ip_int_from_prefixc           	      C   s^   	 t || j}| j| }||? }d|> d }||kr-| jd }||d}d}t|| |S )Nr-      r   z&Netmask pattern %r mixes zeroes & ones)r;   rB   r    r   )	r~   ip_inttrailing_zeroesr   leading_onesall_onesbyteslendetailsry   r
   r
   r   _prefix_from_ip_int  s   

z"_IPAddressBase._prefix_from_ip_intc                 C   s   d| }t |d )Nz%r is not a valid netmask)r   )r~   netmask_strry   r
   r
   r   _report_invalid_netmask  s   
z&_IPAddressBase._report_invalid_netmaskc                 C   sl   	 |  r	| s| | zt|}W n ty"   | | Y nw d|  kr.| jks4n | | |S Nr   )isasciiisdigitr   intr   rB   )r~   prefixlen_strr   r
   r
   r   _prefix_from_prefix_string  s   

z)_IPAddressBase._prefix_from_prefix_stringc                 C   s   	 z|  |}W n ty   | | Y nw z| |W S  ty&   Y nw || jN }z| |W S  tyA   | | Y d S w rJ   )_ip_int_from_stringr   r   r   r   rC   )r~   ip_strr   r
   r
   r   _prefix_from_ip_string  s"   
z%_IPAddressBase._prefix_from_ip_stringc                 C   sJ   	 t |ttfr|| jfS t |tst|}t|dkr|S |d | jfS )Nr-   r   )r>   bytesr   rB   tupler+   r)   )r~   r   r
   r
   r   _split_addr_prefix  s   	

z!_IPAddressBase._split_addr_prefixc                 C   s   | j t| ffS rJ   )	__class__r'   rk   r
   r
   r   
__reduce__-     z_IPAddressBase.__reduce__N)r   r   r	   	__slots__propertyrm   rp   rr   rA   rz   r}   classmethodr   r   r   r   r   r   r   r
   r
   r
   r   rh     s4    




	




!
rh   c                       sr   e Zd Z	 dZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd Z fddZ  ZS )r?   r
   c                 C      | j S rJ   )r0   rk   r
   r
   r   __int__>  s   z_BaseAddress.__int__c                 C   s2   z| j |j ko| j|jkW S  ty   t Y S w rJ   )r0   rX   rZ   re   rl   otherr
   r
   r   __eq__A  s   
z_BaseAddress.__eq__c                 C   sF   t |tstS | j|jkrtd| |f | j|jkr!| j|jk S dS Nr<   F)r>   r?   re   rX   r@   r0   r   r
   r
   r   __lt__H  s   
z_BaseAddress.__lt__c                 C   s    t |tstS | t| | S rJ   r>   r   re   r   r   r
   r
   r   __add__T     
z_BaseAddress.__add__c                 C   s    t |tstS | t| | S rJ   r   r   r
   r
   r   __sub__Y  r   z_BaseAddress.__sub__c                 C      d| j jt| f S Nz%s(%r)r   r   r'   rk   r
   r
   r   __repr__^     z_BaseAddress.__repr__c                 C   s   t | | jS rJ   )r'   _string_from_ip_intr0   rk   r
   r
   r   __str__a  r   z_BaseAddress.__str__c                 C   s   t tt| jS rJ   )hashhexr   r0   rk   r
   r
   r   __hash__d  s   z_BaseAddress.__hash__c                 C   s
   | j | fS rJ   rX   rk   r
   r
   r   rd   g  s   
z_BaseAddress._get_address_keyc                 C   s   | j | jffS rJ   )r   r0   rk   r
   r
   r   r   j  s   z_BaseAddress.__reduce__c                    s   	 |r	|d dkrt t| |S td u rdd l}|dat|}|s*t |S | \}}}|dkr?| j	dkr=d}nd}|dkrG| j
}n| j
d }|rV||d d	 7 }|r\|d
7 }t t| | d| | | S )NrW   sr   z(#?)(_?)([xbnX])nr   bxr-   r&   0)formatr'   _address_fmt_rerecompile	fullmatchsuper
__format__groupsrX   rB   r   )rl   fmtr   m	alternategroupingfmt_basepadlenr   r
   r   r   m  s,   



 z_BaseAddress.__format__)r   r   r	   r   r   r   r   r   r   r   r   r   rd   r   r   __classcell__r
   r
   r   r   r?   3  s    r?   c                   @   s^  e Zd Z	 dd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zejdd Zejdd Zedd Zedd Zedd Zedd  Zed!d" Zed#d$ Zd%d& Zd'd( Zd)d* ZdEd-d.ZdEd/d0Zed1d2 Zed3d4 Zd5d6 Z d7d8 Z!ed9d: Z"ed;d< Z#ed=d> Z$ed?d@ Z%edAdB Z&edCdD Z'd,S )Frb   c                 C   r   r   r   rk   r
   r
   r   r     r   z_BaseNetwork.__repr__c                 C      d| j | jf S N%s/%d)r[   r   rk   r
   r
   r   r     r   z_BaseNetwork.__str__c                 c   s<    	 t | j}t | j}t|d |D ]}| |V  qd S r,   r   r[   rR   range_address_classrl   network	broadcastr   r
   r
   r   hosts  s   

z_BaseNetwork.hostsc                 c   s:    t | j}t | j}t||d D ]}| |V  qd S r,   r   r   r
   r
   r   __iter__  s   

z_BaseNetwork.__iter__c                 C   sh   t | j}t | j}|dkr|| |krtd| || S |d7 }|| |k r-td| || S )Nr   zaddress out of ranger-   )r   r[   rR   
IndexErrorr   )rl   r   r   r   r
   r
   r   __getitem__  s   

z_BaseNetwork.__getitem__c                 C   s^   t |tstS | j|jkrtd| |f | j|jkr!| j|jk S | j|jkr-| j|jk S dS r   )r>   rb   re   rX   r@   r[   netmaskr   r
   r
   r   r     s   
z_BaseNetwork.__lt__c                 C   sF   z| j |j ko| j|jkot| jt|jkW S  ty"   t Y S w rJ   )rX   r[   r   r   rZ   re   r   r
   r
   r   r     s   
z_BaseNetwork.__eq__c                 C   s   t t| jt| jfS rJ   )r   r   r[   r   rk   r
   r
   r   r     s   z_BaseNetwork.__hash__c                 C   s4   | j |j krdS t|trdS |j| jj@ | jjkS NF)rX   r>   rb   r0   r   r[   r   r
   r
   r   __contains__  s
   
z_BaseNetwork.__contains__c                 C   s*   	 | j |v p| j|v p|j | v p|j| v S rJ   )r[   rR   r   r
   r
   r   overlaps  s   


z_BaseNetwork.overlapsc                 C   s   |  t| jt| jB S rJ   )r   r   r[   hostmaskrk   r
   r
   r   rR     s   z_BaseNetwork.broadcast_addressc                 C   s   |  t| j| jA S rJ   )r   r   r   rC   rk   r
   r
   r   r     s   z_BaseNetwork.hostmaskc                 C   r   r   )r[   rY   rk   r
   r
   r   with_prefixlen     z_BaseNetwork.with_prefixlenc                 C   r   N%s/%s)r[   r   rk   r
   r
   r   with_netmask  r   z_BaseNetwork.with_netmaskc                 C   r   r   )r[   r   rk   r
   r
   r   with_hostmask  r   z_BaseNetwork.with_hostmaskc                 C   s   	 t | jt | j d S r,   )r   rR   r[   rk   r
   r
   r   num_addresses  s   z_BaseNetwork.num_addressesc                 C   rt   )Nz%%200s has no associated address classru   rx   r
   r
   r   r     s   z_BaseNetwork._address_classc                 C   r   rJ   )rY   rk   r
   r
   r   r        z_BaseNetwork.prefixlenc                 c   s"   	 | j |j kstd| |f t|tstd| || s(td|| f || kr.d S |d|j|jf }| 	 \}}||krv||krv||rV|V  |	 \}}n||re|V  |	 \}}n	t
d|||f ||krv||ksG||kr|V  d S ||kr|V  d S t
d|||f )Nr<   z%s is not a network objectz%s not contained in %sr   z3Error performing exclusion: s1: %s s2: %s other: %s)rX   r@   r>   rb   	subnet_ofr   r   r[   r   rT   AssertionError)rl   r   s1s2r
   r
   r   address_exclude  sD   #






z_BaseNetwork.address_excludec                 C   sb   	 | j |j krtd| |f | j|jk rdS | j|jkrdS | j|jk r'dS | j|jkr/dS dS )Nz"%s and %s are not of the same typerW   r-   r   )rX   r@   r[   r   r   r
   r
   r   compare_networksg  s    z_BaseNetwork.compare_networksc                 C   s   	 | j | j| jfS rJ   )rX   r[   r   rk   r
   r
   r   rc     s   z_BaseNetwork._get_networks_keyr-   Nc           	      c   s    	 | j | jkr| V  d S |d ur'|| j k rtd|dkr"td|| j  }|dk r/td| j | }|| jkrAtd|| f t| j}t| jd }t| jd |? }t|||D ]}| ||f}|V  q\d S )Nznew prefix must be longerr-   (cannot set prefixlen_diff and new_prefixr   zprefix length diff must be > 0z0prefix length diff %d is invalid for netblock %s)	rY   rB   r   r   r[   rR   r   r   r   )	rl   prefixlen_diff
new_prefixnew_prefixlenstartendstepnew_addrcurrentr
   r
   r   rT     s6   




z_BaseNetwork.subnetsc                 C   s   	 | j dkr| S |d ur"|| j krtd|dkrtd| j | }| j| }|dk r4td| j|f | t| jt| j|> @ |fS )Nr   znew prefix must be shorterr-   r   z;current prefixlen is %d, cannot have a prefixlen_diff of %d)rY   r   r   r   r   r[   r   )rl   r   r   r   r
   r
   r   rM     s(   



z_BaseNetwork.supernetc                 C      	 | j jo| jjS rJ   )r[   is_multicastrR   rk   r
   r
   r   r        z_BaseNetwork.is_multicastc                 C   s^   z| j |j krt|  d| d|j| jko|j| jkW S  ty.   td|  d| w )Nz and z are not of the same versionz*Unable to test subnet containment between )rX   r@   r[   rR   rZ   )ar   r
   r
   r   _is_subnet_of  s   
z_BaseNetwork._is_subnet_ofc                 C   s   	 |  | |S rJ   r   r   r
   r
   r   r        z_BaseNetwork.subnet_ofc                 C   s   	 |  || S rJ   r   r   r
   r
   r   supernet_of  r   z_BaseNetwork.supernet_ofc                 C   r   rJ   )r[   is_reservedrR   rk   r
   r
   r   r     r   z_BaseNetwork.is_reservedc                 C   r   rJ   )r[   is_link_localrR   rk   r
   r
   r   r   +  s   z_BaseNetwork.is_link_localc                 C   r   rJ   )r[   
is_privaterR   rk   r
   r
   r   r   6  r   z_BaseNetwork.is_privatec                 C   s
   	 | j  S rJ   )r   rk   r
   r
   r   	is_globalB  rs   z_BaseNetwork.is_globalc                 C   r   rJ   )r[   is_unspecifiedrR   rk   r
   r
   r   r   M  r   z_BaseNetwork.is_unspecifiedc                 C   r   rJ   )r[   is_loopbackrR   rk   r
   r
   r   r   Y  r   z_BaseNetwork.is_loopback)r-   N)(r   r   r	   r   r   r   r   r   r   r   r   r   r   	functoolscached_propertyrR   r   r   r   r   r   r   r   r   r   r   rc   rT   rM   r   staticmethodr   r   r   r   r   r   r   r   r   r
   r
   r
   r   rb     sf    







K0


5)








rb   c                   @   s   e Zd Z	 dZdZde d ZeZi Zdd Z	e
dd Ze
d	d
 Ze
dd Ze
dd Zdd Zedd Zedd ZdS )_BaseV4r
   r   r&   r-   c                 C   s   t | S rJ   ro   rk   r
   r
   r   rj   x  s   z$_BaseV4._explode_shorthand_ip_stringc                 C   s   	 || j vrCt|tr|}d|  kr| jksn | | nz| |}W n ty4   | |}Y nw t| 	|}||f| j |< | j | S r   )
_netmask_cacher>   r   rB   r   r   r   r   r   r   r~   argr   r   r
   r
   r   _make_netmask{  s   



z_BaseV4._make_netmaskc              
   C   sr   	 |st d|d}t|dkrt d| ztt| j|dW S  ty8 } z	t d||f d d }~ww )NAddress cannot be empty.r   zExpected 4 octets in %rr   %s in %r)r   r(   r)   r   
from_bytesmap_parse_octetr   )r~   r   octetsexcr
   r
   r   r     s   
z_BaseV4._ip_int_from_stringc                 C   s   	 |st d| r| sd}t || t|dkr%d}t || |dkr7|d dkr7d}t || t|d}|d	krFt d
| |S )NzEmpty octet not permittedz#Only decimal digits permitted in %r   z$At most 3 characters permitted in %rr   r   z%Leading zeros are not permitted in %r
      zOctet %d (> 255) not permitted)r   r   r   r)   r   )r~   	octet_strry   	octet_intr
   r
   r   r    s    
z_BaseV4._parse_octetc                 C   s   	 d tt|ddS )Nr  r   r   )joinr  r'   r    )r~   r   r
   r
   r   r     s   	z_BaseV4._string_from_ip_intc                 C   s(   	 t | dd d d }d|d S )Nr  rW   z.in-addr.arpa)r'   r(   r  )rl   reverse_octetsr
   r
   r   rq        z_BaseV4._reverse_pointerc                 C   r   rJ   rB   rk   r
   r
   r   max_prefixlen  r   z_BaseV4.max_prefixlenc                 C   r   rJ   r   rk   r
   r
   r   rA     r   z_BaseV4.versionN)r   r   r	   r   rX   
IPV4LENGTHrC   rB   r  rj   r   r  r   r  r   rq   r   r  rA   r
   r
   r
   r   r  e  s*    


#
	
r  c                   @   s   e Zd Z	 dZdd Zedd Zedd Zee	 dd	 Z
ee	 d
d Zedd Zedd Zedd Zedd ZdS )r   )r0   __weakref__c                 C   sv   	 t |tr| | || _d S t |tr$| |d t|d| _d S t|}d|v r3td|| 	|| _d S )Nr   r   r%   Unexpected '/' in )
r>   r   rz   r0   r   r}   r
  r'   r   r   rl   r   addr_strr
   r
   r   __init__  s   


zIPv4Address.__init__c                 C      	 t | jS rJ   )r"   r0   rk   r
   r
   r   packed     
zIPv4Address.packedc                 C      	 | | j jv S rJ   )
_constants_reserved_networkrk   r
   r
   r   r         zIPv4Address.is_reservedc                    s6   	 t  fdd jjD ot fdd jjD S )Nc                 3       | ]} |v V  qd S rJ   r
   .0rH   rk   r
   r   	<genexpr>=      z)IPv4Address.is_private.<locals>.<genexpr>c                 3       | ]} |vV  qd S rJ   r
   r'  rk   r
   r   r)  >  r*  )anyr#  _private_networksall_private_networks_exceptionsrk   r
   rk   r   r   +  s   zIPv4Address.is_privatec                 C   s   	 | | j jvo
| j S rJ   )r#  _public_networkr   rk   r
   r
   r   r   A  s   zIPv4Address.is_globalc                 C   r"  rJ   )r#  _multicast_networkrk   r
   r
   r   r   S  r%  zIPv4Address.is_multicastc                 C   s   	 | | j jkS rJ   )r#  _unspecified_addressrk   r
   r
   r   r   ^  r%  zIPv4Address.is_unspecifiedc                 C   r"  rJ   )r#  _loopback_networkrk   r
   r
   r   r   i     zIPv4Address.is_loopbackc                 C   r"  rJ   )r#  _linklocal_networkrk   r
   r
   r   r   s  r4  zIPv4Address.is_link_localN)r   r   r	   r   r  r   r   r   r   	lru_cacher   r   r   r   r   r   r
   r
   r
   r   r     s,    #







	r   c                   @   sx   e Zd Zdd Zejdd Zdd Zdd Zd	d
 Z	dd Z
ejZedd Zedd Zedd Zedd ZdS )r   c                 C   D   |  |\}}t| | t||fdd| _| jj| _| jj| _d S NF)r   )r   r   r  r   r   r   rY   rl   r   r*   maskr
   r
   r   r    
   
zIPv4Interface.__init__c                 C      | j jS rJ   r   r   rk   r
   r
   r   r        zIPv4Interface.hostmaskc                 C      d|  | j| jf S r   r   r0   rY   rk   r
   r
   r   r     s   zIPv4Interface.__str__c                 C   @   t | |}|tu s|s|S z| j|jkW S  ty   Y dS w r   )r   r   re   r   rZ   rl   r   address_equalr
   r
   r   r        zIPv4Interface.__eq__c                 C   sL   t | |}|tu rtS z| j|jk p| j|jko|W S  ty%   Y dS w r   )r   r   re   r   rZ   rl   r   address_lessr
   r
   r   r        zIPv4Interface.__lt__c                 C      t | j| jt| jjfS rJ   r   r0   rY   r   r   r[   rk   r
   r
   r   r        zIPv4Interface.__hash__c                 C   
   t | jS rJ   )r   r0   rk   r
   r
   r   r5        
zIPv4Interface.ipc                 C   r?  r   r@  rk   r
   r
   r   r        zIPv4Interface.with_prefixlenc                 C   r?  r   r   r0   r   rk   r
   r
   r   r     rM  zIPv4Interface.with_netmaskc                 C   r?  r   r   r0   r   rk   r
   r
   r   r     rM  zIPv4Interface.with_hostmaskN)r   r   r	   r  r   r   r   r   r   r   r   rh   r   r   r5   r   r   r   r
   r
   r
   r   r   ~  s"    



r   c                   @   s0   e Zd Z	 eZdddZee dd Z	dS )r   Tc                       	 |  |\ }t | _| |\| _| _t| j}|t| j@ |kr6|r,td|  t|t| j@ | _| j| jd krD| j	| _
d S | j| jkrS fdd| _
d S d S )N%s has host bits setr-   c                      
   t  gS rJ   )r   r
   r*   r
   r   <lambda>     
 z&IPv4Network.__init__.<locals>.<lambda>)r   r   r[   r  r   rY   r   r   rB   r   r   rl   r   r   r:  r   r
   rS  r   r    s    "

zIPv4Network.__init__c                 C   s(   	 | j tdv o| jtdv  o| j S )N100.64.0.0/10)r[   r   rR   r   rk   r
   r
   r   r     s   zIPv4Network.is_globalNT)
r   r   r	   r   r   r  r   r   r6  r   r
   r
   r
   r   r     s    
4r   c                   @   s   e Zd ZedZedZedZedZededededededed	ed
ededededededgZededgZ	edZ
edZdS )_IPv4Constantsz169.254.0.0/16z127.0.0.0/8z224.0.0.0/4rW  z	0.0.0.0/8z
10.0.0.0/8z172.16.0.0/12z192.0.0.0/24z192.0.0.170/31z192.0.2.0/24z192.168.0.0/16z198.18.0.0/15z198.51.100.0/24z203.0.113.0/24z240.0.0.0/4z255.255.255.255/32z192.0.0.9/32z192.0.0.10/32z0.0.0.0N)r   r   r	   r   r5  r3  r1  r0  r-  r/  r$  r   r2  r
   r
   r
   r   rY    s2    rY  c                   @   s   e Zd Z	 dZdZde d ZdZedZ	eZ
i Zedd Zed	d
 Zedd Zedd ZedddZdd Zdd Zedd Zedd Zedd ZdS )_BaseV6r
   r=   r&   r-   r   0123456789ABCDEFabcdefc                 C   sn   	 || j vr2t|tr|}d|  kr| jksn | | n| |}t| |}||f| j |< | j | S r   )r  r>   r   rB   r   r   r   r   r  r
   r
   r   r  P  s   




z_BaseV6._make_netmaskc              
   C   s  	 |st dt|dkr2|}t|dkr+|d d  dt|d  d|dd   }t d|| jd	 }|jd
|d}d}t||k rPd||f }t |d|d v rz	t| j}W n t yt } z	t d||f d d }~ww |d|d? d@   |d|d@   t||krd|d	 |f }t |d }	td	t|d	 D ]}
||
 s|	d urd| }t ||
}	q|	d ur|	}t||	 d	 }|d s|d	8 }|rd}t || |d s|d	8 }|rd}t || | j||  }|d	k rd}t || jd	 |f n5t|| jkrd}t || j|f |d s(d}t || |d s5d}t || t|}d}d}z7d}t|D ]}
|dK }|| 	||
 O }qD|d| K }t| dD ]}
|dK }|| 	||
 O }qa|W S  t
y } z	t d||f d d }~ww )Nr  -   d   (Z   z chars elided)iz"At most 45 characters expected in r-   :)maxsplitr  z At least %d parts expected in %rr  rW   r	  %xr#     z!At most %d colons permitted in %rz At most one '::' permitted in %rr   z0Leading ':' only permitted as part of '::' in %rz1Trailing ':' only permitted as part of '::' in %rz/Expected at most %d other parts with '::' in %rz,Exactly %d parts expected without '::' in %r)r   r)   _HEXTET_COUNTr(   r   rL   r0   rO   r   _parse_hextetr   )r~   r   shorten
_max_partsparts
_min_partsry   ipv4_intr  
skip_indexiparts_hiparts_loparts_skippedr   r
   r
   r   r   d  s   ,




z_BaseV6._ip_int_from_stringc                 C   s@   	 | j |std| t|dkrd}t|| t|dS )NzOnly hex digits permitted in %rr   z$At most 4 characters permitted in %rr#   )_HEX_DIGITS
issupersetr   r)   r   )r~   
hextet_strry   r
   r
   r   re    s   
z_BaseV6._parse_hextetc           	      C   s   	 d}d}d}d}t |D ]\}}|dkr(|d7 }|dkr|}||kr'|}|}qd}d}q|dkrP|| }|t|kr@|dg7 }dg|||< |dkrPdg| }|S )NrW   r   r   r-    )	enumerater)   )	r~   hextetsbest_doublecolon_startbest_doublecolon_lendoublecolon_startdoublecolon_lenindexhextetbest_doublecolon_endr
   r
   r   _compress_hextets  s4   

z_BaseV6._compress_hextetsNc                    s\   	 |d u r
t | j}|| jkrtdd|   fddtdddD }| |}d|S )	NzIPv6 address is too large%032xc                    s&   g | ]}d t  ||d  d qS )rb  r   r#   )r   r(  r   hex_strr
   r   
<listcomp>4  s   & z/_BaseV6._string_from_ip_int.<locals>.<listcomp>r   r   r   r`  )r   r0   rC   r   r   r}  r  )r~   r   ru  r
   r  r   r     s   



z_BaseV6._string_from_ip_intc                    s   	 t | trt| j}nt | trt| j}nt| }| |}d|   fddtdddD }t | ttfrBdd	|| j
f S d	|S )	Nr~  c                    s   g | ]
} ||d   qS )r   r
   r  r  r
   r   r  I  s    z8_BaseV6._explode_shorthand_ip_string.<locals>.<listcomp>r   r   r   r   r`  )r>   r   r'   r[   r   r5   r   r   rb   r  rY   )rl   r   r   rh  r
   r  r   rj   9  s   



z$_BaseV6._explode_shorthand_ip_stringc                 C   s(   	 | j d d d dd}d|d S )NrW   r`  rs  r  	.ip6.arpa)rm   replacer  )rl   reverse_charsr
   r
   r   rq   N  r  z_BaseV6._reverse_pointerc                 C   sB   	 |  d\}}}|sd }||fS |rd|v rtd|  ||fS )N%zInvalid IPv6 address: "%r")	partitionr   )r   r*   sepscope_idr
   r
   r   _split_scope_idW  s   z_BaseV6._split_scope_idc                 C   r   rJ   r  rk   r
   r
   r   r  k  r   z_BaseV6.max_prefixlenc                 C   r   rJ   r   rk   r
   r
   r   rA   o  r   z_BaseV6.versionrJ   )r   r   r	   r   rX   
IPV6LENGTHrC   rd  	frozensetrp  rB   r  r   r  r   re  r}  r   rj   rq   r  r  r   r  rA   r
   r
   r
   r   rZ  <  s6    

p

/	

rZ  c                       s  e Zd Z	 dZdd Z fddZ fddZdd	 Z fd
dZdd Z	 fddZ
edd Zedd Zedd Zedd Zedd Zedd Zee dd Zedd Zed d! Zed"d# Zed$d% Zed&d' Zed(d) Z  ZS )*r   )r0   	_scope_idr  c                 C   s   	 t |tr| | || _d | _d S t |tr*| |d t|d| _d | _d S t|}d|v r9t	d|| 
|\}| _| || _d S )Nr#   r   r%   r  )r>   r   rz   r0   r  r   r}   r
  r'   r   r  r   r  r
   r
   r   r  z  s    


zIPv6Address.__init__c                    s:   | j }|d u rt  S d}t  }|d |  |S )N   )ipv4_mappedr   rj   )rl   r  
prefix_lenraw_exploded_strr   r
   r   rj     s   

z(IPv6Address._explode_shorthand_ip_stringc                    sb   | j }|d u rt  S d}t  d | }|j}| |dd d d dd}d|d S )Nr  008xrW   r`  rs  r  r  )r  r   rq   rj   r0   r  r  )rl   r  r  r  rj  r  r   r
   r   rq     s   
 zIPv6Address._reverse_pointerc                 C   s@   	 | j }|d u rtdt|  | jd? }d| |t|f S )Nz0Can not apply to non-IPv4-mapped IPv6 address %sr   z%s:%s)r  r   r'   r0   r   )rl   r  high_order_bitsr
   r
   r   _ipv4_mapped_ipv6_to_str  s   
z$IPv6Address._ipv4_mapped_ipv6_to_strc                    s:   | j }|d u rt  }n|  }| jr|d | j S |S )Nr  )r  r   r   r  r  )rl   r  r   r   r
   r   r     s
   zIPv6Address.__str__c                 C   s   t | j| jfS rJ   )r   r0   r  rk   r
   r
   r   r     r   zIPv6Address.__hash__c                    s2   t  |}|tu rtS |sdS | jt|dd kS )NFr  )r   r   re   r  getattrrB  r   r
   r   r     s   zIPv6Address.__eq__c                 C   s   	 | j S rJ   )r  rk   r
   r
   r   r    s   zIPv6Address.scope_idc                 C   r  rJ   )r$   r0   rk   r
   r
   r   r     r!  zIPv6Address.packedc                 C   "   	 | j }|d ur|jS | | jjv S rJ   )r  r   r#  r1  rl   r  r
   r
   r   r     s
   zIPv6Address.is_multicastc                    s0   	  j }|d ur|jS t fdd jjD S )Nc                 3   r&  rJ   r
   r  rk   r
   r   r)    r*  z*IPv6Address.is_reserved.<locals>.<genexpr>)r  r   r,  r#  _reserved_networksr  r
   rk   r   r     s
   zIPv6Address.is_reservedc                 C   r  rJ   )r  r   r#  r5  r  r
   r
   r   r     s
   zIPv6Address.is_link_localc                 C   r"  rJ   )r#  _sitelocal_networkrk   r
   r
   r   is_site_local  s   
zIPv6Address.is_site_localc                    sJ   	  j }|d ur|jS t fdd jjD o$t fdd jjD S )Nc                 3   r&  rJ   r
   r'  rk   r
   r   r)  7  r*  z)IPv6Address.is_private.<locals>.<genexpr>c                 3   r+  rJ   r
   r'  rk   r
   r   r)  8  r*  )r  r   r,  r#  r-  r.  r/  r  r
   rk   r   r   "  s   zIPv6Address.is_privatec                 C   s   	 | j }|d ur|jS | j S rJ   )r  r   r   r  r
   r
   r   r   ;  s
   zIPv6Address.is_globalc                 C       	 | j }|d ur|jS | jdkS r   )r  r   r0   r  r
   r
   r   r   O  
   
zIPv6Address.is_unspecifiedc                 C   r  r,   )r  r   r0   r  r
   r
   r   r   ]  r  zIPv6Address.is_loopbackc                 C   s"   	 | j d? dkr
d S t| j d@ S )Nr   rc      r0   r   rk   r
   r
   r   r  k  s   zIPv6Address.ipv4_mappedc                 C   s6   	 | j d? dkr
d S t| j d? d@ t| j  d@ fS )N`   i   @   r  r  rk   r
   r
   r   teredox  s   zIPv6Address.teredoc                 C   s&   	 | j d? dkr
d S t| j d? d@ S )Np   i   P   r  r  rk   r
   r
   r   	sixtofour  s   zIPv6Address.sixtofour)r   r   r	   r   r  rj   rq   r  r   r   r   r   r  r   r   r   r   r  r   r6  r   r   r   r   r  r  r  r   r
   r
   r   r   r   t  sJ    (










r   c                       s   e Zd Zdd Zejdd Z fddZdd Zd	d
 Z	dd Z
ejZedd Zedd Zedd Zedd Zedd Ze fddZ  ZS )r   c                 C   r7  r8  )r   r   r  r   r   r   rY   r9  r
   r
   r   r    r;  zIPv6Interface.__init__c                 C   r<  rJ   r=  rk   r
   r
   r   r     r>  zIPv6Interface.hostmaskc                    s   dt   | jf S r   )r   r   rY   rk   r   r
   r   r     s   
zIPv6Interface.__str__c                 C   rA  r   )r   r   re   r   rZ   rB  r
   r
   r   r     rD  zIPv6Interface.__eq__c                 C   sL   t | |}|tu r|S z| j|jk p| j|jko|W S  ty%   Y dS w r   )r   r   re   r   rZ   rE  r
   r
   r   r     rG  zIPv6Interface.__lt__c                 C   rH  rJ   rI  rk   r
   r
   r   r     rJ  zIPv6Interface.__hash__c                 C   rK  rJ   )r   r0   rk   r
   r
   r   r5     rL  zIPv6Interface.ipc                 C   r?  r   r@  rk   r
   r
   r   r     rM  zIPv6Interface.with_prefixlenc                 C   r?  r   rN  rk   r
   r
   r   r     rM  zIPv6Interface.with_netmaskc                 C   r?  r   rO  rk   r
   r
   r   r     rM  zIPv6Interface.with_hostmaskc                 C   s   | j dko| jjS r   )r0   r   r   rk   r
   r
   r   r     s   zIPv6Interface.is_unspecifiedc                    s   t  jo| jjS rJ   )r   r   r   rk   r   r
   r   r     r   zIPv6Interface.is_loopback)r   r   r	   r  r   r   r   r   r   r   r   rh   r   r   r5   r   r   r   r   r   r   r
   r
   r   r   r     s*    





r   c                   @   s0   e Zd Z	 eZd	ddZdd Zedd ZdS )
r   Tc                    rP  )NrQ  r-   c                      rR  rJ   )r   r
   rS  r
   r   rT  	  rU  z&IPv6Network.__init__.<locals>.<lambda>)r   r   r[   r  r   rY   r   r   rB   r   r   rV  r
   rS  r   r    s    

zIPv6Network.__init__c                 c   s@    	 t | j}t | j}t|d |d D ]}| |V  qd S r,   r   r   r
   r
   r   r    	  s   

zIPv6Network.hostsc                 C   r   rJ   )r[   r  rR   rk   r
   r
   r   r  ,	  s   
zIPv6Network.is_site_localNrX  )	r   r   r	   r   r   r  r   r   r  r
   r
   r
   r   r     s    
0r   c                   @   s   e Zd ZedZedZededededededed	ed
edededgZededededededgZedededededededededededededed ed!gZed"Z	d#S )$_IPv6Constantsz	fe80::/10zff00::/8z::1/128z::/128z::ffff:0:0/96z64:ff9b:1::/48z100::/64z	2001::/23z2001:db8::/32z	2002::/16z	3fff::/20zfc00::/7z2001:1::1/128z2001:1::2/128z2001:3::/32z2001:4:112::/48z2001:20::/28z2001:30::/28z::/8z100::/8z200::/7z400::/6z800::/5z1000::/4z4000::/3z6000::/3z8000::/3zA000::/3zC000::/3zE000::/4zF000::/5zF800::/6zFE00::/9z	fec0::/10N)
r   r   r	   r   r5  r1  r-  r/  r  r  r
   r
   r
   r   r  <	  s@    
r  rX  )#__version__r   r  r  r   r   r   r   r   r   r"   r$   r+   r6   r;   rI   rV   ra   rg   rh   r   total_orderingr?   rb   r  r   r   r   rY  r#  rZ  r   r   r   r  r
   r
   r
   r   <module>   s^   
"716 3k   H  CR&  :  #K\
/