o
    2³c«  ã                   @   sn   d Z ddlZddlZddlZddlZe d¡Zdd„ Ze d¡Z	e d¡Z
e d¡Zdd
d„ZdZdd„ ZdS )zIPv6 helper functions.é    Nz0+([0-9a-f]+)c                 C   s”  t | ƒdkr
tdƒ‚t | ¡}g }d}t |ƒ}||k r@|||d …  ¡ }t |¡}|dur3| d¡}| |¡ |d7 }||k sd}d}d}	d}
t	d	ƒD ]!}|| d
krg|
rf|}||	 }||krd|	}|}d}
qL|
sm|}	d}
qL|
r~d	}||	 }||kr~|	}|}|dkrÃ|dkr«|dks”|dkr«|d dkr«|dkr›d}nd}|t
j | dd… ¡ }|S d |d|… ¡d d ||| d… ¡ }|S d |¡}|S )zÍConvert an IPv6 address in binary form to text form.

    *address*, a ``bytes``, the IPv6 address in binary form.

    Raises ``ValueError`` if the address isn't 16 bytes long.
    Returns a ``str``.
    é   z IPv6 addresses are 16 bytes longr   é   Né   éÿÿÿÿFé   Ú0Té   é   Úffffz::z::ffff:é   ú:)ÚlenÚ
ValueErrorÚbinasciiÚhexlifyÚdecodeÚ_leading_zeroÚmatchÚgroupÚappendÚrangeÚdnsÚipv4Ú	inet_ntoaÚjoin)ÚaddressÚhexÚchunksÚiÚlÚchunkÚmÚ
best_startÚbest_lenÚstartÚlast_was_zeroÚendÚcurrent_lenÚprefix© r)   ú>/var/www/html/gps/gps/lib/python3.10/site-packages/dns/ipv6.pyr      sr   	



÷€€ÿþ
þüÿ
ÿr   s   (.*):(\d+\.\d+\.\d+\.\d+)$s   ::.*s   .*::$Fc              	   C   s$  t | tƒs	|  ¡ } |r%|  d¡}t|ƒ}|dkr|d } n|dkr%tjj‚| dkr-tjj‚|  d¡r;|  d¡s;tjj‚|  	d¡rI|  	d¡sItjj‚| dkrOd} t
 | ¡}|durytj | d¡¡}d	 | d
¡ ¡ |d |d
 |d |d ¡ ¡ } t | ¡}|dur‰| d
d… } nt | ¡}|dur˜| dd… } |  d¡}t|ƒ}|dkr©tjj‚d}g }|D ]=}	|	dkrÏ|r»tjj‚d}tdd| d
 ƒD ]}
| d¡ qÆq¯t|	ƒ}|dkrÛtjj‚|dkrçdd|  |	 }	| |	¡ q¯|dk r÷|s÷tjj‚d |¡} zt | ¡W S  tjtfy   tjj‚w )a  Convert an IPv6 address in text form to binary form.

    *text*, a ``str``, the IPv6 address in textual form.

    *ignore_scope*, a ``bool``.  If ``True``, a scope will be ignored.
    If ``False``, the default, it is an error for a scope to be present.

    Returns a ``bytes``.
    ó   %é   r   ó    ó   :s   ::s   0::Nz{}:{:02x}{:02x}:{:02x}{:02x}r   é   r   r   FTs   0000r   ó   0)Ú
isinstanceÚbytesÚencodeÚsplitr   r   Ú	exceptionÚSyntaxErrorÚendswithÚ
startswithÚ
_v4_endingr   r   Ú	inet_atonr   Úformatr   Ú_colon_colon_startÚ_colon_colon_endr   r   r   r   Ú	unhexlifyÚErrorÚ	TypeError)ÚtextÚignore_scopeÚpartsr   r!   Úbr   Ú
seen_emptyÚ	canonicalÚcÚ_Úlcr)   r)   r*   r:   c   sx   



þþ


ÿ
ÿr:   s             ÿÿc                 C   s
   |   t¡S )zŒIs the specified address a mapped IPv4 address?

    *address*, a ``bytes`` is an IPv6 address in binary form.

    Returns a ``bool``.
    )r8   Ú_mapped_prefix)r   r)   r)   r*   Ú	is_mapped½   s   
rK   )F)Ú__doc__Úrer   Údns.exceptionr   Údns.ipv4Úcompiler   r   r9   r<   r=   r:   rJ   rK   r)   r)   r)   r*   Ú<module>   s   

C


X