
    ӊ^7                      N    d Z ddlmZmZ ddlmZmZ dZ	dZ
d Zd Zd Zd	 Zd
 Zy)z=Fallback routines for Python's standard library socket module    )unpackpack)_bytes_join_is_str   
   c                     t        |       st        dt        |       z        t        |       dk7  rt	        d      dt        d|       z  S )zR
    Convert an IP address from 32-bit packed binary format to string format.
    zstring type expected, not %s   *invalid length of packed IP address stringz%d.%d.%d.%d4B)r   	TypeErrortypelen
ValueError_unpack)	packed_ips    2/usr/lib/python3/dist-packages/netaddr/fbsocket.py	inet_ntoar      sK     96iHII
9~EFF74333    c                    g }g }d }d}t        |       D ]A  \  }}|dk(  r
||}|dz  }n|dkD  r|j                  ||f       d }d}|j                  |       C |dkD  r|j                  ||f       t        |      dk7  rw|j                  d        |d   }|D ]  }|d   |d   kD  s|} |\  }	}
|d|
 dgz   ||
|	z   d  z   }|d   dk(  r|j	                  dd       |d   dk(  r|j                  d       |S )Nr   0   c                     | d   S )Nr    )xs    r   <lambda>z&_compact_ipv6_tokens.<locals>.<lambda>9   s
    QqT r   )key )	enumerateappendr   sortinsert)tokens
new_tokens	positionsstart_index
num_tokensidxtokenbest_positionpositionlength	start_idxs              r   _compact_ipv6_tokensr/      sR   JIKJ  ' !
UC<"!!OJA~  *k!:;KJ% ! A~*k23 9~>*!!! 	)H{]1-- (	) ,),t3jVASAT6UU
 a=Ba$b>Rb!r   c           
      D   | t         k(  rt        |      S | t        k(  rt        |      dk7  st	        |      st        d      t        d|      D cg c]  }d|z  	 }}t        t        d|            }d}t        t        |            D ]  \  }}|}|d|z  z  }||z  } d|cxk  rdk  s
n |dz	  dk(  r;t        d	g|d
d D cg c]  }t        |d       c} }t        |      }	|dd
 |	gz   }dj                  t        |            S t        d| z        c c}w c c}w )zBConvert an packed IP address of the given family to string format.   r   z>8H%xr     l        z>2HN:zunknown address family %d)AF_INETr   AF_INET6r   r   r   r   listr    reversed_packintjoinr/   )
afr   ir$   wordsint_valnumwordpacked_ipv4ipv4_strs
             r   	inet_ntoprF   L   s4   	W}##	xy>Rwy'9IJJ$+E9$=>q$(>> WUI./0 	%FAsD26>DnG	%
 G)z)W]f-DJVBC[(IQ(IJK -HAb\XJ.Fxx,V4554r9::% ? )Js   DD
c                    t        |       rt        d| z        }| j                  d      }t        |      dk(  rwg }|D ]e  }|j	                  d      s|j	                  d      rt        |      dkD  r|	 t        |      }|dz	  dk7  r||j                  t        d	|             g t        |      S |t        d
t        |       z        # t        $ r |w xY w)a  
    Convert an IP address in string format (123.45.67.89) to the 32-bit packed
    binary format used in low-level network functions. Differs from inet_aton
    by only support decimal octets. Using octal or hexadecimal values will
    raise a ValueError exception.
    illegal IP address string %r.r
   0xr   r      r   Bz#argument should be a string, not %s)
r   r   splitr   
startswithr<   r!   r;   r   r   )	ip_stringinvalid_addrr$   r@   r*   octets         r   _inet_pton_af_inetrR   k   s     y!"@9"LM% v;!E 
0##D)e.>.>s.CE
UV&&'JE QJ1$&&U3./
0 u%%
:T)_L
MM " '&&'s   3C		Cc                 (   | t         k(  rt        |      S | t        k(  rt        d|z        }g }t	        |      s|d|v r|d|v r|dk(  rdj                         dz  S 	 |j                  d      \  }}g }g }|dk7  r|j                  d      }|dk7  r|j                  d      }t        |      rhd|d	   v rat        |j                               }|j                  d
t        d|dd       d   z         |j                  d
t        d|dd       d   z         t        |      t        |      z   }	d|	cxk  rdk  s| |dt        |      t        |      z   z
  }
|D cg c]  }t        dt        |d             c}t        |
      D cg c]  }dj                          c}z   |D cg c]  }t        dt        |d             c}z   }	 ||z   D ]  }t        |d      }d|cxk  rdk  r| | 	 t        |      S d|v r8|j                  d      }d|v r|dd	 }|dd	 g dk7  r||d	   j                         dvr|t        |      dk7  r|t        |j                               }|j                  d
t        d|dd       d   z         |j                  d
t        d|dd       d   z         |D cg c]  }t        dt        |d             }}nt        |      dk7  r|	 |D cg c]  }t        |d       }}|D ]  }d|cxk  rdk  r| | 	 |D cg c]  }t        d|       }}t        |      S |t        d| z        # t        $ r |w xY wc c}w c c}w c c}w # t        $ r |w xY wc c}w c c}w # t        $ r |w xY wc c}w )z|
    Convert an IP address from string format to a packed string suitable for
    use with low-level network functions.
    rH   r   z:: r1   r   r6   rI   r   r2   z>Hr   r   r
      rK   z  r3   N)r   r   r   r   r   )r   ffffzUnknown address family %d)r7   rR   r8   r   r   encoderM   r   popr!   r   r;   r<   rangelowerr   )r>   rO   rP   valuesprefixsuffixl_prefixl_suffixrE   token_countgap_sizer?   r*   rC   r$   ipv6_prefixs                   r   	inet_ptonrc      s   
 
W}!),,	x!"@9"LMy!)9D }}++#!*!6 HH|!<<,|!<<, 8}!4-hlln=wtXa]'CA'F FGwtXa]'CA'F FGh-#h-7K,u,"" -""S]S]:<H 3;;QtSBZ(;.3Ho>""$>?2:;QtSBZ(;< 
#%0 +Eub>D..** /**+Z 6""K i"-)#"("+K"3B'+DD**"2,,.mC** 6{a'**1&**,?HMM$x!})Ea)H"HIMM$x!})Ea)H"HI?EF!eD#a*5FFF 6{a'**':@Ac%nAFA!' / E3V3"..  4"../ 399Q%a.99 6"" #" 4r9::]  #""#4 <>;  #""#. G B
 " '&&' :s`    M	 MM'M"
M' *M' 3M6$N  (M;;N  N  N	M'M3;N   NN)__doc__structr   r   r   r;   netaddr.compatr   r   r7   r8   r   r/   rF   rR   rc   r   r   r   <module>rg      s8    D 3 /

4,^;>NDi;r   