o
    g"$                    @   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
   ?/Users/admin/.pyenv/versions/3.10.0/lib/python3.10/ipaddress.pyr          r   c                   @   r   )NetmaskValueErrorNr   r
   r
   r
   r   r      r   r   c              	   C   R   	 zt | W S  ttfy   Y nw zt| W S  ttfy"   Y nw td|  )Nz0%r does not appear to be an IPv4 or IPv6 address)IPv4Addressr   r   IPv6Address
ValueErroraddressr
   r
   r   
ip_address   s   

r   Tc              	   C   sV   	 zt | |W S  ttfy   Y nw zt| |W S  ttfy$   Y nw td|  )Nz0%r does not appear to be an IPv4 or IPv6 network)IPv4Networkr   r   IPv6Networkr   )r   strictr
   r
   r   
ip_network:   s   r   c              	   C   r   )Nz2%r does not appear to be an IPv4 or IPv6 interface)IPv4Interfacer   r   IPv6Interfacer   r   r
   r
   r   ip_interfaceX   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_packed{   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 %r)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)Z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   Zip_bitsZ	first_intZlast_intZnbitsnetr
   r
   r   summarize_address_range   s<   



rD   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   Zto_mergesubnetsrC   rH   existingr4   r
   r
   r   _collapse_addresses_internal  s,   


rP   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?   rJ   
_prefixlenrA   r5   AttributeErrornetwork_addressrK   setr6   extendrD   rP   )r1   ZaddrsZipsZnetsr5   r3   r4   r
   r
   r   collapse_addresses3  s>   
rX   c                 C   s*   	 t | tr
|  S t | tr|  S tS rE   )r=   _BaseNetwork_get_networks_keyr>   _get_address_keyNotImplemented)objr
   r
   r   get_mixed_type_keyi  s   

r^   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 rE   )_explode_shorthand_ip_stringselfr
   r
   r   exploded     z_IPAddressBase.explodedc                 C   s
   	 t | S rE   r'   rb   r
   r
   r   
compressed  re   z_IPAddressBase.compressedc                 C   r`   rE   )_reverse_pointerrb   r
   r
   r   reverse_pointer     z_IPAddressBase.reverse_pointerc                 C      dt | f }t|)Nz%200s has no version specifiedtypeNotImplementedErrorrc   msgr
   r
   r   r@     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   rR   rB   rA   )rc   r   rp   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   rR   )rc   r   Zexpected_lenZaddress_lenrp   r
   r
   r   _check_packed_address  s   z$_IPAddressBase._check_packed_addressc                 C   s   	 | j | j |? A S rE   )rB   )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:   rA   r    r   )	rs   ip_intZtrailing_zeroesrt   Zleading_onesZall_onesZbyteslenZdetailsrp   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   )rs   Znetmask_strrp   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isdigitry   intr   rA   )rs   Zprefixlen_strrt   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 rE   )_ip_int_from_stringr   ry   rx   r   rB   )rs   ip_strrw   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}   rA   tupler+   r)   )rs   r   r
   r
   r   _split_addr_prefix  s   	

z!_IPAddressBase._split_addr_prefixc                 C   s   | j t| ffS rE   )	__class__r'   rb   r
   r
   r   
__reduce__0     z_IPAddressBase.__reduce__N)r   r   r	   	__slots__propertyrd   rg   ri   r@   rq   rr   classmethodru   rx   ry   r~   r   r   r   r
   r
   r
   r   r_     s4    




	




!
r_   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 rE   r0   rb   r
   r
   r   __int__A  s   z_BaseAddress.__int__c                 C   s2   z| j |j ko| j|jkW S  ty   t Y S w rE   )r0   rR   rT   r\   rc   otherr
   r
   r   __eq__D  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>   r\   rR   r?   r0   r   r
   r
   r   __lt__K  s   
z_BaseAddress.__lt__c                 C   s    t |tstS | t| | S rE   r=   r}   r\   r   r   r
   r
   r   __add__W     
z_BaseAddress.__add__c                 C   s    t |tstS | t| | S rE   r   r   r
   r
   r   __sub__\  r   z_BaseAddress.__sub__c                 C      d| j jt| f S Nz%s(%r)r   r   r'   rb   r
   r
   r   __repr__a     z_BaseAddress.__repr__c                 C   s   t | | jS rE   )r'   _string_from_ip_intr0   rb   r
   r
   r   __str__d  r   z_BaseAddress.__str__c                 C   s   t tt| jS rE   )hashhexr}   r0   rb   r
   r
   r   __hash__g  s   z_BaseAddress.__hash__c                 C   s
   | j | fS rE   rR   rb   r
   r
   r   r[   j  s   
z_BaseAddress._get_address_keyc                 C   s   | j | jffS rE   )r   r0   rb   r
   r
   r   r   m  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 )NrQ   sr   z(#?)(_?)([xbnX])nr   bxr-   r&   0)formatr'   _address_fmt_rerecompile	fullmatchsuper
__format__groupsrR   rA   r}   )rc   fmtr   mZ	alternateZgroupingZfmt_baseZpadlenr   r
   r   r   p  s,   



 z_BaseAddress.__format__)r   r   r	   r   r   r   r   r   r   r   r   r   r[   r   r   __classcell__r
   r
   r   r   r>   6  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 )FrY   c                 C   r   r   r   rb   r
   r
   r   r     r   z_BaseNetwork.__repr__c                 C      d| j | jf S N%s/%d)rU   rt   rb   r
   r
   r   r     r   z_BaseNetwork.__str__c                 c   s<    	 t | j}t | j}t|d |D ]}| |V  qd S r,   r}   rU   rM   range_address_classrc   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}   rU   rM   
IndexErrorr   )rc   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=   rY   r\   rR   r?   rU   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 rE   )rR   rU   r}   r   rT   r\   r   r
   r
   r   r     s   
z_BaseNetwork.__eq__c                 C   s   t t| jt| jA S rE   )r   r}   rU   r   rb   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)rR   r=   rY   r0   r   rU   r   r
   r
   r   __contains__  s
   
z_BaseNetwork.__contains__c                 C   s*   	 | j |v p| j|v p|j | v p|j| v S rE   )rU   rM   r   r
   r
   r   overlaps  s   


z_BaseNetwork.overlapsc                 C   s   |  t| jt| jB S rE   )r   r}   rU   hostmaskrb   r
   r
   r   rM     s   z_BaseNetwork.broadcast_addressc                 C   s   |  t| j| jA S rE   )r   r}   r   rB   rb   r
   r
   r   r     s   z_BaseNetwork.hostmaskc                 C   r   r   )rU   rS   rb   r
   r
   r   with_prefixlen     z_BaseNetwork.with_prefixlenc                 C   r   N%s/%s)rU   r   rb   r
   r
   r   with_netmask  r   z_BaseNetwork.with_netmaskc                 C   r   r   )rU   r   rb   r
   r
   r   with_hostmask
  r   z_BaseNetwork.with_hostmaskc                 C   s   	 t | jt | j d S r,   )r}   rM   rU   rb   r
   r
   r   num_addresses  s   z_BaseNetwork.num_addressesc                 C   rk   )Nz%%200s has no associated address classrl   ro   r
   r
   r   r     s   z_BaseNetwork._address_classc                 C   r   rE   )rS   rb   r
   r
   r   rt        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)rR   r?   r=   rY   	subnet_ofr   r   rU   rt   rN   AssertionError)rc   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 typerQ   r-   r   )rR   r?   rU   r   r   r
   r
   r   compare_networksj  s    z_BaseNetwork.compare_networksc                 C   s   	 | j | j| jfS rE   )rR   rU   r   rb   r
   r
   r   rZ     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)	rS   rA   r   r}   rU   rM   r   r   r   )	rc   prefixlen_diff
new_prefixnew_prefixlenstartendstepZnew_addrcurrentr
   r
   r   rN     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)rS   r   rt   r   r}   rU   r   )rc   r   r   r   r
   r
   r   rH     s(   



z_BaseNetwork.supernetc                 C      	 | j jo| jjS rE   )rU   is_multicastrM   rb   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 )rR   r?   rU   rM   rT   )ar   r
   r
   r   _is_subnet_of  s   
z_BaseNetwork._is_subnet_ofc                 C   s   	 |  | |S rE   r   r   r
   r
   r   r        z_BaseNetwork.subnet_ofc                 C   s   	 |  || S rE   r   r   r
   r
   r   supernet_of  r   z_BaseNetwork.supernet_ofc                 C   r   rE   )rU   is_reservedrM   rb   r
   r
   r   r   "  r   z_BaseNetwork.is_reservedc                 C   r   rE   )rU   is_link_localrM   rb   r
   r
   r   r   .  s   z_BaseNetwork.is_link_localc                 C   r   rE   )rU   
is_privaterM   rb   r
   r
   r   r   9  r   z_BaseNetwork.is_privatec                 C   
   	 | j  S rE   r   rb   r
   r
   r   	is_globalE  rj   z_BaseNetwork.is_globalc                 C   r   rE   )rU   is_unspecifiedrM   rb   r
   r
   r   r   P  r   z_BaseNetwork.is_unspecifiedc                 C   r   rE   )rU   is_loopbackrM   rb   r
   r
   r   r   \  r   z_BaseNetwork.is_loopback)r-   N)(r   r   r	   r   r   r   r   r   r   r   r   r   r   	functoolscached_propertyrM   r   r   r   r   r   r   r   rt   r   r   rZ   rN   rH   r   staticmethodr   r   r   r   r   r   r   r   r   r
   r
   r
   r   rY     sf    







K0


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




rY   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 rE   rf   rb   r
   r
   r   ra   {  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 rz   )
_netmask_cacher=   r}   rA   ry   r~   r   r   r   ru   rs   argrt   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   )rs   r   Z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}   )rs   Z	octet_strrp   Z	octet_intr
   r
   r   r     s    
z_BaseV4._parse_octetc                 C   s   	 d tt|ddS )Nr   r   r   )joinr   r'   r    )rs   rw   r
   r
   r   r     s   	z_BaseV4._string_from_ip_intc                 C   s(   	 t | dd d d }d|d S )Nr   rQ   z.in-addr.arpa)r'   r(   r   )rc   Zreverse_octetsr
   r
   r   rh        z_BaseV4._reverse_pointerc                 C   r   rE   rA   rb   r
   r
   r   max_prefixlen  r   z_BaseV4.max_prefixlenc                 C   r   rE   r   rb   r
   r
   r   r@     r   z_BaseV4.versionN)r   r   r	   r   rR   
IPV4LENGTHrB   rA   r   ra   r   r   r   r   r   rh   r   r   r@   r
   r
   r
   r   r   h  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   st   	 t |tr| | || _d S t |tr$| |d t|d| _d S t|}d|v r2td| | 	|| _d S )Nr   r   r%   Unexpected '/' in %r)
r=   r}   rq   r0   r   rr   r   r'   r   r   rc   r   Zaddr_strr
   r
   r   __init__  s   


zIPv4Address.__init__c                 C      	 t | jS rE   )r"   r0   rb   r
   r
   r   packed     
zIPv4Address.packedc                 C      	 | | j jv S rE   )
_constants_reserved_networkrb   r
   r
   r   r   #     zIPv4Address.is_reservedc                       	 t  fdd jjD S )Nc                 3       | ]} |v V  qd S rE   r
   .0rC   rb   r
   r   	<genexpr>8      z)IPv4Address.is_private.<locals>.<genexpr>)anyr
  _private_networksrb   r
   rb   r   r   .  s   zIPv4Address.is_privatec                 C   s   | | j jvo	| j S rE   )r
  _public_networkr   rb   r
   r
   r   r   :  s   zIPv4Address.is_globalc                 C   r	  rE   r
  _multicast_networkrb   r
   r
   r   r   ?  r  zIPv4Address.is_multicastc                 C   s   	 | | j jkS rE   )r
  _unspecified_addressrb   r
   r
   r   r   J  r  zIPv4Address.is_unspecifiedc                 C   r	  rE   )r
  _loopback_networkrb   r
   r
   r   r   U     zIPv4Address.is_loopbackc                 C   r	  rE   r
  _linklocal_networkrb   r
   r
   r   r   _  r  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   rS   rc   r   r*   maskr
   r
   r   r  l  
   
zIPv4Interface.__init__c                 C      | j jS rE   r   r   rb   r
   r
   r   r   t     zIPv4Interface.hostmaskc                 C      d|  | j| jf S r   r   r0   rS   rb   r
   r
   r   r   x  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   r\   r   rT   rc   r   Z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   r\   r   rT   rc   r   Zaddress_lessr
   r
   r   r        zIPv4Interface.__lt__c                 C      t | j| jt| jjfS rE   r   r0   rS   r}   r   rU   rb   r
   r
   r   r        zIPv4Interface.__hash__c                 C   
   t | jS rE   )r   r0   rb   r
   r
   r   r5        
zIPv4Interface.ipc                 C   r&  r   r'  rb   r
   r
   r   r        zIPv4Interface.with_prefixlenc                 C   r&  r   r   r0   r   rb   r
   r
   r   r     r2  zIPv4Interface.with_netmaskc                 C   r&  r   r   r0   r   rb   r
   r
   r   r     r2  zIPv4Interface.with_hostmaskN)r   r   r	   r  r   r   r   r   r   r   r   r_   r   r   r5   r   r   r   r
   r
   r
   r   r   j  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 rE   )r   r
   r*   r
   r   <lambda>     
 z&IPv4Network.__init__.<locals>.<lambda>)r   r   rU   r   r   rS   r}   r   rA   r   r   rc   r   r   r!  r  r
   r8  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)rU   r   rM   r   rb   r
   r
   r   r     s   zIPv4Network.is_globalNT)
r   r   r	   r   r   r  r   r   r  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Z	e
dZdS )_IPv4Constantsz169.254.0.0/16z127.0.0.0/8z224.0.0.0/4r<  z	0.0.0.0/8z
10.0.0.0/8z172.16.0.0/12z192.0.0.0/29z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0.0.0.0N)r   r   r	   r   r  r  r  r  r  r  r   r  r
   r
   r
   r   r>    s,    r>  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-   rv   0123456789ABCDEFabcdefc                 C   sn   	 || j vr2t|tr|}d|  kr| jksn | | n| |}t| |}||f| j |< | j | S rz   )r   r=   r}   rA   ry   r~   r   ru   r   r
   r
   r   r   5  s   




z_BaseV6._make_netmaskc              
   C   s  	 |st d|d}d}t||k rd||f }t |d|d v rWz	t| j}W n t yB } z	t d||f d d }~ww |d|d	? d
@   |d|d
@   | jd }t||krnd|d |f }t |d }tdt|d D ]}	||	 s|d urd| }t ||	}qy|d ur|}
t|| d }|d s|
d8 }
|
rd}t || |d s|d8 }|rd}t || | j|
|  }|dk rd}t || jd |f n3t|| jkrd}t || j|f |d sd}t || |d sd}t || t|}
d}d}z7d}t|
D ]}	|d	K }|| 	||	 O }q|d	| K }t| dD ]}	|d	K }|| 	||	 O }q0|W S  t
yY } z	t d||f d d }~ww )Nr   :r   z At least %d parts expected in %rr   rQ   r   %xr#     r-   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(   r)   r   rG   r0   rJ   _HEXTET_COUNTr   _parse_hextetr   )rs   r   partsZ
_min_partsrp   Zipv4_intr   Z
_max_partsZ
skip_indexiZparts_hiZparts_loZparts_skippedrw   r
   r
   r   r   I  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}   )rs   Z
hextet_strrp   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 )NrQ   r   r   r-    )	enumerater)   )	rs   hextetsZbest_doublecolon_startZbest_doublecolon_lenZdoublecolon_startZdoublecolon_lenindexZhextetZ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   Zhex_strr
   r   
<listcomp>  s   & z/_BaseV6._string_from_ip_int.<locals>.<listcomp>r   r   r   rA  )r}   r0   rB   r   r   rN  r   )rs   rw   rL  r
   rQ  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 )	NrO  c                    s   g | ]
} ||d   qS )r   r
   rP  rQ  r
   r   rR  (  s    z8_BaseV6._explode_shorthand_ip_string.<locals>.<listcomp>r   r   r   r   rA  )r=   r   r'   rU   r   r5   r   r   rY   r   rS   )rc   r   rw   rF  r
   rQ  r   ra     s   
	


z$_BaseV6._explode_shorthand_ip_stringc                 C   s(   	 | j d d d dd}d|d S )NrQ   rA  rJ  r   z	.ip6.arpa)rd   replacer   )rc   Zreverse_charsr
   r
   r   rh   -  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_id6  s   z_BaseV6._split_scope_idc                 C   r   rE   r   rb   r
   r
   r   r   J  r   z_BaseV6.max_prefixlenc                 C   r   rE   r   rb   r
   r
   r   r@   N  r   z_BaseV6.versionrE   )r   r   r	   r   rR   
IPV6LENGTHrB   rD  	frozensetrH  rA   r   r   r   r   rE  rN  r   ra   rh   r   rX  r   r   r@   r
   r
   r
   r   r?  !  s6    

g

/	

r?  c                       s   e Zd Z	 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 r8t	d| | 
|\}| _| || _d S )Nr#   r   r%   r  )r=   r}   rq   r0   r[  r   rr   r   r'   r   rX  r   r  r
   r
   r   r  Y  s    


zIPv6Address.__init__c                    s"   t   }| jr|d | j S |S )NrT  )r   r   r[  )rc   r   r   r
   r   r     s   
zIPv6Address.__str__c                 C   s   t | j| jfS rE   )r   r0   r[  rb   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   r\   r[  getattrr)  r   r
   r   r     s   zIPv6Address.__eq__c                 C   s   	 | j S rE   )r[  rb   r
   r
   r   rW    s   zIPv6Address.scope_idc                 C   r  rE   )r$   r0   rb   r
   r
   r   r    r  zIPv6Address.packedc                 C   r	  rE   r  rb   r
   r
   r   r     r  zIPv6Address.is_multicastc                    r  )Nc                 3   r  rE   r
   rP  rb   r
   r   r    r  z*IPv6Address.is_reserved.<locals>.<genexpr>)r  r
  _reserved_networksrb   r
   rb   r   r     s   zIPv6Address.is_reservedc                 C   r	  rE   r  rb   r
   r
   r   r     r  zIPv6Address.is_link_localc                 C   r	  rE   )r
  _sitelocal_networkrb   r
   r
   r   is_site_local  s   
zIPv6Address.is_site_localc                    s0   	  j }|d ur|jS t fdd jjD S )Nc                 3   r  rE   r
   r  rb   r
   r   r    r  z)IPv6Address.is_private.<locals>.<genexpr>)ipv4_mappedr   r  r
  r  )rc   r`  r
   rb   r   r     s
   zIPv6Address.is_privatec                 C   r   rE   r   rb   r
   r
   r   r     rj   zIPv6Address.is_globalc                 C      	 | j dkS rz   r   rb   r
   r
   r   r        
zIPv6Address.is_unspecifiedc                 C   ra  r,   r   rb   r
   r
   r   r     rb  zIPv6Address.is_loopbackc                 C   s"   	 | j d? dkr
d S t| j d@ S )Nr   rC      r0   r   rb   r
   r
   r   r`     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   @   rc  rd  rb   r
   r
   r   teredo  s   zIPv6Address.teredoc                 C   s&   	 | j d? dkr
d S t| j d? d@ S )Np   i   P   rc  rd  rb   r
   r
   r   	sixtofour  s   zIPv6Address.sixtofour)r   r   r	   r   r  r   r   r   r   rW  r  r   r   r   r_  r   r  r   r   r   r   r`  rg  rj  r   r
   r
   r   r   r   S  sD    (






	








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dd Z  ZS )r   c                 C   r  r  )r   r   r  r   r   r   rS   r   r
   r
   r   r  ,  r"  zIPv6Interface.__init__c                 C   r#  rE   r$  rb   r
   r
   r   r   4  r%  zIPv6Interface.hostmaskc                    s   dt   | jf S r   )r   r   rS   rb   r   r
   r   r   8  s   
zIPv6Interface.__str__c                 C   r(  r   )r   r   r\   r   rT   r)  r
   r
   r   r   <  r*  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   r\   r   rT   r+  r
   r
   r   r   H  r,  zIPv6Interface.__lt__c                 C   r-  rE   r.  rb   r
   r
   r   r   T  r/  zIPv6Interface.__hash__c                 C   r0  rE   )r   r0   rb   r
   r
   r   r5   Y  r1  zIPv6Interface.ipc                 C   r&  r   r'  rb   r
   r
   r   r   ]  r2  zIPv6Interface.with_prefixlenc                 C   r&  r   r3  rb   r
   r
   r   r   b  r2  zIPv6Interface.with_netmaskc                 C   r&  r   r4  rb   r
   r
   r   r   g  r2  zIPv6Interface.with_hostmaskc                 C      | j dko| jjS rz   )r0   r   r   rb   r
   r
   r   r   l     zIPv6Interface.is_unspecifiedc                 C   rk  r,   )r0   r   r   rb   r
   r
   r   r   p  rl  zIPv6Interface.is_loopback)r   r   r	   r  r   r   r   r   r   r   r   r_   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                    r5  )Nr6  r-   c                      r7  rE   )r   r
   r8  r
   r   r9    r:  z&IPv6Network.__init__.<locals>.<lambda>)r   r   rU   r   r   rS   r}   r   rA   r   r   r;  r
   r8  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   rE   )rU   r_  rM   rb   r
   r
   r   r_    s   
zIPv6Network.is_site_localNr=  )	r   r   r	   r   r   r  r   r   r_  r
   r
   r
   r   r   u  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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100::/64z	2001::/23z2001:2::/48z2001:db8::/32z2001:10::/28zfc00::/7z::/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   r  r  r  r]  r^  r
   r
   r
   r   rm    s0    rm  r=  )#__version__r   r  rY  r   r   r   r   r   r   r"   r$   r+   r6   r:   rD   rP   rX   r^   r_   r   total_orderingr>   rY   r   r   r   r   r>  r
  r?  r   r   r   rm  r
   r
   r
   r   <module>   sZ   
#716 3k   H uCR  4 XK\
!