o ?Og2@s dZddlZdZdZGdddeZGdddeZd d Zd7}|d|j krqdS||ksGdSdS)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 firstrzunknown IP versionr-) isinstance _BaseAddress TypeErrorversionrrr_max_prefixlenr0r7r:r8 _ALL_ONES)r3r4r5Zip_bitsZ first_intZlast_intZnbitsnetr r r summarize_address_ranges<      rDccs t|}i}|r.|}|}||}|dur |||<n ||kr,||=|||s d}t|D]}|durC|j|jkrCq6|V|}q6dSN)listpopsupernetgetappendsortedvaluesbroadcast_address)r1Zto_mergesubnetsrCrHZexistingr4r r r _collapse_addresses_internals,     rOc Cs* g}g}g}|D]l}t|tr*|r$|dj|jkr$td||df||q |j|jkr\|rD|dj|jkrDtd||dfz||jWq ty[||j Yq w|rp|dj|jkrptd||df||q t t |}|rt |D] \}}| t||qt||S)Nr;)r=r>_versionr?rJ _prefixlenrAr5AttributeErrornetwork_addressrKsetr6extendrDrO)r1ZaddrsZipsZnetsr5r3r4r r r collapse_addresses0s>       rWcCs* t|tr |St|tr|StSrE)r= _BaseNetwork_get_networks_keyr>_get_address_keyNotImplemented)objr r r get_mixed_type_keyfs   r]c@seZdZ dZeddZeddZeddZedd Zd d Z d d Z e ddZ e ddZ e ddZe ddZe ddZe ddZddZdS)_IPAddressBaser cC |SrE)_explode_shorthand_ip_stringselfr r r explodedz_IPAddressBase.explodedcCs t|SrEr'rar r r compressedrdz_IPAddressBase.compressedcCr_rE)_reverse_pointerrar r r reverse_pointerz_IPAddressBase.reverse_pointercCdt|f}t|)Nz%200s has no version specifiedtypeNotImplementedErrorrbmsgr r r r@sz_IPAddressBase.versioncCsF|dkrd}t|||jf||jkr!d}t|||j|jfdS)Nrz-%d (< 0) is not permitted as an IPv%d addressz2%d (>= 2**%d) is not permitted as an IPv%d address)rrQrBrA)rbrror r r _check_int_addresss  z!_IPAddressBase._check_int_addresscCs.t|}||krd}t|||||jfdS)Nz6%r (len %d != %d) is not permitted as an IPv%d address)r)rrQ)rbrZ expected_lenZ address_lenror r r _check_packed_addresssz$_IPAddressBase._check_packed_addresscCs |j|j|?ASrE)rB)cls prefixlenr r r _ip_int_from_prefixs z"_IPAddressBase._ip_int_from_prefixc Cs^ t||j}|j|}||?}d|>d}||kr-|jd}||d}d}t|||S)Nr-rz&Netmask pattern %r mixes zeroes & ones)r:rAr r) rrip_intZtrailing_zeroesrsZ leading_onesZall_onesZbyteslenZdetailsror r r _prefix_from_ip_ints      z"_IPAddressBase._prefix_from_ip_intcCsd|}t|d)Nz%r is not a valid netmask)r )rrZ netmask_strror r r _report_invalid_netmasks z&_IPAddressBase._report_invalid_netmaskcCsl |r |s||zt|}Wnty"||Ynwd|kr.|jks4n|||SNr)isasciiisdigitrxintrrA)rrZ prefixlen_strrsr r r _prefix_from_prefix_strings    z)_IPAddressBase._prefix_from_prefix_stringcCs z||}Wnty||Ynwz||WSty&Ynw||jN}z||WStyA||YdSwrE)_ip_int_from_stringrrxrwrrB)rrip_strrvr r r _prefix_from_ip_strings"       z%_IPAddressBase._prefix_from_ip_stringcCsJ t|ttfr ||jfSt|tst|}t|dkr|S|d|jfS)Nr-r)r=bytesr|rAtupler+r))rrrr r r _split_addr_prefixs   z!_IPAddressBase._split_addr_prefixcCs|jt|ffSrE) __class__r'rar r r __reduce__-z_IPAddressBase.__reduce__N)rrr __slots__propertyrcrfrhr@rprq classmethodrtrwrxr}rrrr r r r r^s4          !  r^csreZdZ dZddZddZddZdd Zd d Zd d Z ddZ ddZ ddZ ddZ fddZZS)r>r cC|jSrE)r0rar r r __int__>sz_BaseAddress.__int__cCs2z |j|jko |j|jkWStytYSwrE)r0rQrSr[rbotherr r r __eq__As   z_BaseAddress.__eq__cCsFt|tstS|j|jkrtd||f|j|jkr!|j|jkSdSNr;F)r=r>r[rQr?r0rr r r __lt__Hs    z_BaseAddress.__lt__cCs t|tstS|t||SrEr=r|r[rrr r r __add__T z_BaseAddress.__add__cCs t|tstS|t||SrErrr r r __sub__Yrz_BaseAddress.__sub__cCd|jjt|fSNz%s(%r)rrr'rar r r __repr__^z_BaseAddress.__repr__cCst||jSrE)r'_string_from_ip_intr0rar r r __str__arz_BaseAddress.__str__cCsttt|jSrE)hashhexr|r0rar r r __hash__dsz_BaseAddress.__hash__cCs |j|fSrErQrar r r rZgs z_BaseAddress._get_address_keycCs|j|jffSrE)rr0rar r r rjsz_BaseAddress.__reduce__cs |r |ddkrtt||Stdurddl}|dat|}|s*t|S|\}}}|dkr?|j dkr=d}nd}|dkrG|j }n|j d}|rV||dd 7}|r\|d 7}tt ||d |||S) NrPsrz(#?)(_?)([xbnX])nrbxr-r&0) formatr'_address_fmt_rerecompile fullmatchsuper __format__groupsrQrAr|)rbZfmtrmZ alternateZgroupingZfmt_baseZpadlenrr r rms,       z_BaseAddress.__format__)rrr rrrrrrrrrrZrr __classcell__r r rr r>3s r>c@s^eZdZ ddZddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ e jddZe jddZeddZeddZeddZedd Zed!d"Zed#d$Zd%d&Zd'd(Zd)d*ZdEd-d.ZdEd/d0Zed1d2Zed3d4Zd5d6Z d7d8Z!ed9d:Z"ed;d<Z#ed=d>Z$ed?d@Z%edAdBZ&edCdDZ'd,S)FrXcCrrrrar r r rrz_BaseNetwork.__repr__cCd|j|jfSN%s/%d)rTrsrar r r rrz_BaseNetwork.__str__ccs< t|j}t|j}t|d|D]}||VqdSr,r|rTrMrange_address_classrbnetwork broadcastrr r r hostss  z_BaseNetwork.hostsccs:t|j}t|j}t||dD]}||VqdSr,rrr r r __iter__s   z_BaseNetwork.__iter__cCsht|j}t|j}|dkr|||krtd|||S|d7}|||kr-td|||S)Nrzaddress out of ranger-)r|rTrM IndexErrorr)rbrrrr r r __getitem__s    z_BaseNetwork.__getitem__cCs^t|tstS|j|jkrtd||f|j|jkr!|j|jkS|j|jkr-|j|jkSdSr)r=rXr[rQr?rTnetmaskrr r r rs      z_BaseNetwork.__lt__cCsFz|j|jko|j|jkot|jt|jkWSty"tYSwrE)rQrTr|rrSr[rr r r rs   z_BaseNetwork.__eq__cCstt|jt|jASrE)rr|rTrrar r r rsz_BaseNetwork.__hash__cCs4|j|jkrdSt|trdS|j|jj@|jjkSNF)rQr=rXr0rrTrr r r __contains__s  z_BaseNetwork.__contains__cCs* |j|vp|j|vp|j|vp|j|vSrE)rTrMrr r r overlapss    z_BaseNetwork.overlapscCs|t|jt|jBSrE)rr|rThostmaskrar r r rMs z_BaseNetwork.broadcast_addresscCs|t|j|jASrE)rr|rrBrar r r rsz_BaseNetwork.hostmaskcCrr)rTrRrar r r with_prefixlenz_BaseNetwork.with_prefixlencCrN%s/%s)rTrrar r r with_netmaskrz_BaseNetwork.with_netmaskcCrr)rTrrar r r with_hostmaskrz_BaseNetwork.with_hostmaskcCs t|jt|jdSr,)r|rMrTrar r r num_addresses sz_BaseNetwork.num_addressescCrj)Nz%%200s has no associated address classrkrnr r r rsz_BaseNetwork._address_classcCrrE)rRrar r r rsz_BaseNetwork.prefixlenccs" |j|jkstd||ft|tstd|||s(td||f||kr.dS|d|j|jf}| \}}||krv||krv||rV|V| \}}n||re|V| \}}n t d|||f||krv||ksG||kr|VdS||kr|VdSt d|||f)Nr;z%s is not a network objectz%s not contained in %srz3Error performing exclusion: s1: %s s2: %s other: %s) rQr?r=rX subnet_ofrrrTrsrNAssertionError)rbrs1s2r r r address_excludesD #         z_BaseNetwork.address_excludecCsb |j|jkrtd||f|j|jkrdS|j|jkrdS|j|jkr'dS|j|jkr/dSdS)Nz"%s and %s are not of the same typerPr-r)rQr?rTrrr r r compare_networksgs     z_BaseNetwork.compare_networkscCs |j|j|jfSrE)rQrTrrar r r rYsz_BaseNetwork._get_networks_keyr-Nc cs |j|jkr |VdS|dur'||jkrtd|dkr"td||j}|dkr/td|j|}||jkrAtd||ft|j}t|jd}t|jd|?}t|||D] }|||f}|Vq\dS)Nznew prefix must be longerr-(cannot set prefixlen_diff and new_prefixrzprefix length diff must be > 0z0prefix length diff %d is invalid for netblock %s) rRrArr|rTrMrrr) rbprefixlen_diff new_prefix new_prefixlenstartendstepZnew_addrZcurrentr r r rNs6      z_BaseNetwork.subnetscCs |jdkr|S|dur"||jkrtd|dkrtd|j|}|j|}|dkr4td|j|f|t|jt|j|>@|fS)Nrznew prefix must be shorterr-rz;current prefixlen is %d, cannot have a prefixlen_diff of %d)rRrrsrr|rTr)rbrrrr r r rHs(    z_BaseNetwork.supernetcC |jjo|jjSrE)rT is_multicastrMrar r r rz_BaseNetwork.is_multicastcCs^z|j|jkrt|d|d|j|jko|j|jkWSty.td|d|w)Nz and z are not of the same versionz*Unable to test subnet containment between )rQr?rTrMrS)arr r r _is_subnet_of s    z_BaseNetwork._is_subnet_ofcCs |||SrErrr r r r z_BaseNetwork.subnet_ofcCs |||SrErrr r r supernet_ofrz_BaseNetwork.supernet_ofcCrrE)rT is_reservedrMrar r r rrz_BaseNetwork.is_reservedcCrrE)rT is_link_localrMrar r r r+sz_BaseNetwork.is_link_localcCrrE)rT is_privaterMrar r r r6rz_BaseNetwork.is_privatecCs |j SrE)rrar r r is_globalBriz_BaseNetwork.is_globalcCrrE)rTis_unspecifiedrMrar r r rMrz_BaseNetwork.is_unspecifiedcCrrE)rT is_loopbackrMrar r r rYrz_BaseNetwork.is_loopback)r-N)(rrr rrrrrrrrrr functoolscached_propertyrMrrrrrrrrsrrrYrNrHr staticmethodrrrrrrrrrr r r r rXsf            K0 5)         rXc@seZdZ dZdZdedZeZiZddZ e ddZ e d d Z e d d Z e d dZddZeddZeddZdS)_BaseV4r rr&r-cCst|SrErerar r r r`xsz$_BaseV4._explode_shorthand_ip_stringcCs ||jvrCt|tr|}d|kr|jksn||nz||}Wnty4||}Ynwt| |}||f|j|<|j|Sry) _netmask_cacher=r|rArxr}r rrrtrrargrsrr r r _make_netmask{s     z_BaseV4._make_netmaskc Csr |std|d}t|dkrtd|z tt|j|dWSty8}z td||fdd}~ww)NAddress cannot be empty.rzExpected 4 octets in %rr%s in %r)rr(r)r| from_bytesmap _parse_octetr)rrrZoctetsexcr r r r~s    z_BaseV4._ip_int_from_stringcCs |std|r|sd}t||t|dkr%d}t|||dkr7|ddkr7d}t||t|d}|d krFtd ||S) NzEmpty octet not permittedz#Only decimal digits permitted in %rz$At most 3 characters permitted in %rrrz%Leading zeros are not permitted in %r zOctet %d (> 255) not permitted)rrzr{r)r|)rrZ octet_strroZ octet_intr r r rs        z_BaseV4._parse_octetcCs dtt|ddS)Nrrr)joinrr'r )rrrvr r r rs z_BaseV4._string_from_ip_intcCs( t|dddd}d|dS)NrrPz .in-addr.arpa)r'r(r)rbZreverse_octetsr r r rgz_BaseV4._reverse_pointercCrrErArar r r max_prefixlenrz_BaseV4.max_prefixlencCrrErrar r r r@rz_BaseV4.versionN)rrr rrQ IPV4LENGTHrBrArr`rrr~rrrgrrr@r r r r res*    #   rc@seZdZ dZddZeddZeddZee dd Z ee d d Z ed d Z eddZ eddZeddZdS)r)r0 __weakref__cCsv t|tr||||_dSt|tr$||dt|d|_dSt|}d|vr3td|| ||_dS)Nrrr%Unexpected '/' in ) r=r|rpr0rrqrr'rr~rbrZaddr_strr r r __init__s    zIPv4Address.__init__cC t|jSrE)r"r0rar r r packed zIPv4Address.packedcC ||jjvSrE) _constants_reserved_networkrar r r r  zIPv4Address.is_reservedcs6 tfddjjDotfddjjDS)Nc3|]}|vVqdSrEr .0rCrar r =z)IPv4Address.is_private..c3|]}|vVqdSrEr rrar r r >r )anyr_private_networksall_private_networks_exceptionsrar rar r+szIPv4Address.is_privatecCs ||jjvo |j SrE)r_public_networkrrar r r rAs zIPv4Address.is_globalcCrrE)r_multicast_networkrar r r rSrzIPv4Address.is_multicastcCs ||jjkSrE)r_unspecified_addressrar r r r^rzIPv4Address.is_unspecifiedcCrrE)r_loopback_networkrar r r ri zIPv4Address.is_loopbackcCrrE)r_linklocal_networkrar r r rsrzIPv4Address.is_link_localN)rrr rrrrrr lru_cacherrrrrrr r r r rs,#         rc@sxeZdZddZejddZddZddZd d Z d d Z e j Z e d dZe ddZe ddZe ddZdS)rcCD||\}}t||t||fdd|_|jj|_|jj|_dSNF)r)rrrrrrrRrbrr*maskr r r r   zIPv4Interface.__init__cC|jjSrErrrar r r rzIPv4Interface.hostmaskcCd||j|jfSrrr0rRrar r r rs zIPv4Interface.__str__cC@t||}|tus |s|Sz|j|jkWStyYdSwr)rrr[rrSrbrZ address_equalr r r r   zIPv4Interface.__eq__cCsLt||}|tur tSz|j|jkp|j|jko|WSty%YdSwr)rrr[rrSrbrZ address_lessr r r r   zIPv4Interface.__lt__cCt|j|jt|jjfSrErr0rRr|rrTrar r r rzIPv4Interface.__hash__cC t|jSrE)rr0rar r r r5 zIPv4Interface.ipcCr rr!rar r r r zIPv4Interface.with_prefixlencCr rrr0rrar r r rr,zIPv4Interface.with_netmaskcCr rrr0rrar r r rr,zIPv4Interface.with_hostmaskN)rrr rrrrrrrrr^rrr5rrrr r r r r~s"      rc@s0eZdZ eZdddZeeddZ dS)rTc ||\}t|_||\|_|_t|j}|t|j@|kr6|r,td|t|t|j@|_|j|jdkrD|j |_ dS|j|jkrSfdd|_ dSdS)N%s has host bits setr-c tgSrE)rr r*r r  z&IPv4Network.__init__..) rrrTrrrRr|rrArrrbrrrrr r2r rs "     zIPv4Network.__init__cCs( |jtdvo|jtdv o|j S)N 100.64.0.0/10)rTrrMrrar r r rs  zIPv4Network.is_globalNT) rrr rrrrrrrr r r r rs 4rc@seZdZedZedZedZedZededededededed ed ed ed ed edededgZededgZ edZ e dZ dS)_IPv4Constantsz169.254.0.0/16z 127.0.0.0/8z 224.0.0.0/4r6z 0.0.0.0/8z 10.0.0.0/8z 172.16.0.0/12z 192.0.0.0/24z192.0.0.170/31z 192.0.2.0/24z192.168.0.0/16z 198.18.0.0/15z198.51.100.0/24z203.0.113.0/24z 240.0.0.0/4z255.255.255.255/32z 192.0.0.9/32z 192.0.0.10/32z0.0.0.0N) rrr rrrrrrrrrrr r r r r8s2 r8c@seZdZ dZdZdedZdZedZ eZ iZ e ddZ e d d Ze d d Ze d dZe dddZddZddZeddZeddZeddZdS)_BaseV6r r<r&r-ruZ0123456789ABCDEFabcdefcCsn ||jvr2t|tr|}d|kr|jksn||n||}t||}||f|j|<|j|Sry)rr=r|rArxr}rrtrr r r rPs     z_BaseV6._make_netmaskc Cs |std|d}d}t||krd||f}t|d|dvrWz t|j}WntyB}z td||fdd}~ww|d|d ?d @|d|d @|jd }t||krnd |d |f}t|d}td t|d D]} || s|durd |}t|| }qy|dur|} t||d } |ds| d 8} | rd}t|||ds| d 8} | rd}t|||j| | } | d krd}t||jd |fn3t||jkrd}t||j|f|dsd}t|||dsd}t||t|} d} d} z7d} t| D]} | d K} | | || O} q| d | K} t| dD]} | d K} | | || O} q0| WSt yY}z td||fdd}~ww)Nr:rz At least %d parts expected in %rrrPr%xr#r-z!At most %d colons permitted in %rz At most one '::' permitted in %rrz0Leading ':' 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) rr(r)rrGr0rJ _HEXTET_COUNTr _parse_hextetr)rrrpartsZ _min_partsroZipv4_intrZ _max_partsZ skip_indexiZparts_hiZparts_loZ parts_skippedrvr r r r~ds              z_BaseV6._ip_int_from_stringcCs@ |j|s td|t|dkrd}t||t|dS)NzOnly hex digits permitted in %rrz$At most 4 characters permitted in %rr#) _HEX_DIGITS issupersetrr)r|)rrZ hextet_strror r r r>s     z_BaseV6._parse_hextetc Cs d}d}d}d}t|D]\}}|dkr(|d7}|dkr|}||kr'|}|}q d}d}q |dkrP||}|t|kr@|dg7}dg|||<|dkrPdg|}|S)NrPrrr-) enumerater)) rrhextetsZbest_doublecolon_startZbest_doublecolon_lenZdoublecolon_startZdoublecolon_lenindexZhextetZbest_doublecolon_endr r r _compress_hextetss4   z_BaseV6._compress_hextetsNcs\ |dur t|j}||jkrtdd|fddtdddD}||}d|S) NzIPv6 address is too large%032xcs&g|]}dt||ddqS)r;rr#)r|r rZhex_strr r +s&z/_BaseV6._string_from_ip_int..rrrr:)r|r0rBrrrGr)rrrvrEr rJr rs    z_BaseV6._string_from_ip_intcs t|tr t|j}nt|trt|j}nt|}||}d|fddtdddD}t|ttfrBdd ||j fSd |S) NrHcsg|] }||dqS)rr rIrJr r rK@sz8_BaseV6._explode_shorthand_ip_string..rrrrr:) r=rr'rTrr5r~rrXrrR)rbrrvr?r rJr r`0s      z$_BaseV6._explode_shorthand_ip_stringcCs( |jddddd}d|dS)NrPr:rCrz .ip6.arpa)rcreplacer)rbZ reverse_charsr r r rgErz_BaseV6._reverse_pointercCsB |d\}}}|sd}||fS|rd|vrtd|||fS)N%zInvalid IPv6 address: "%r") partitionr)rr*sepscope_idr r r _split_scope_idNs  z_BaseV6._split_scope_idcCrrErrar r r rbrz_BaseV6.max_prefixlencCrrErrar r r r@frz_BaseV6.versionrE)rrr rrQ IPV6LENGTHrBr= frozensetrArArrrr~r>rGrr`rgrrQrrr@r r r r r9<s6   g  /   r9cseZdZ dZddZfddZddZfdd Zed d Z ed d Z eddZ eddZ eddZ eddZeeddZeddZeddZeddZeddZed d!Zed"d#ZZS)$r)r0 _scope_idrcCs t|tr||||_d|_dSt|tr*||dt|d|_d|_dSt|}d|vr9t d|| |\}|_| ||_dS)Nr#rr%r) r=r|rpr0rTrrqrr'rrQr~rr r r rqs     zIPv6Address.__init__cs"t}|jr|d|jS|S)NrM)rrrT)rbrrr r rs zIPv6Address.__str__cCst|j|jfSrE)rr0rTrar r r rrzIPv6Address.__hash__cs2t|}|tur tS|sdS|jt|ddkS)NFrT)rrr[rTgetattrr#rr r rs zIPv6Address.__eq__cCs |jSrE)rTrar r r rPszIPv6Address.scope_idcCrrE)r$r0rar r r rrzIPv6Address.packedcC" |j}|dur |jS||jjvSrE) ipv4_mappedrrrrbrWr r r rs  zIPv6Address.is_multicastcs0 j}|dur |jStfddjjDS)Nc3rrEr rIrar r r r z*IPv6Address.is_reserved..)rWrr r_reserved_networksrXr rar rs zIPv6Address.is_reservedcCrVrE)rWrrrrXr r r rs  zIPv6Address.is_link_localcCrrE)r_sitelocal_networkrar r r is_site_locals zIPv6Address.is_site_localcsJ j}|dur |jStfddjjDo$tfddjjDS)Nc3rrEr rrar r r r z)IPv6Address.is_private..c3r rEr rrar r r r )rWrr rrrrrXr rar rszIPv6Address.is_privatecCs |j}|dur |jS|j SrE)rWrrrXr r r r s  zIPv6Address.is_globalcC |j}|dur |jS|jdkSry)rWrr0rXr r r r  zIPv6Address.is_unspecifiedcCr\r,)rWrr0rXr r r r+r]zIPv6Address.is_loopbackcCs" |jd?dkr dSt|jd@S)Nrr<r0rrar r r rW9szIPv6Address.ipv4_mappedcCs6 |jd?dkr dSt|jd?d@t|jd@fS)N`i @r^r_rar r r teredoFs zIPv6Address.teredocCs& |jd?dkr dSt|jd?d@S)Npi Pr^r_rar r r sixtofourUszIPv6Address.sixtofour)rrr rrrrrrrPrrrrr[rrrrrrrWrbrerr r rr rksD (              rcseZdZddZejddZfddZddZd d Z d d Z e j Z e d dZe ddZe ddZe ddZe ddZe fddZZS)rcCrr)rrrrrrrRrr r r rerzIPv6Interface.__init__cCrrErrar r r rmrzIPv6Interface.hostmaskcsdt|jfSr)rrrRrarr r rqs zIPv6Interface.__str__cCr"r)rrr[rrSr#r r r rur$zIPv6Interface.__eq__cCsLt||}|tur |Sz|j|jkp|j|jko|WSty%YdSwr)rrr[rrSr%r r r rr&zIPv6Interface.__lt__cCr'rEr(rar r r rr)zIPv6Interface.__hash__cCr*rE)rr0rar r r r5r+zIPv6Interface.ipcCr rr!rar r r rr,zIPv6Interface.with_prefixlencCr rr-rar r r rr,zIPv6Interface.with_netmaskcCr rr.rar r r rr,zIPv6Interface.with_hostmaskcCs|jdko|jjSry)r0rrrar r r rszIPv6Interface.is_unspecifiedcstjo|jjSrE)rrrrarr r rrzIPv6Interface.is_loopback)rrr rrrrrrrrr^rrr5rrrrrrr r rr rcs*         rc@s0eZdZ eZd ddZddZeddZdS) rTcr/)Nr0r-cr1rE)rr r2r r r3r4z&IPv6Network.__init__..) rrrTrrrRr|rrArrr5r r2r rs      zIPv6Network.__init__ccs@ t|j}t|j}t|d|dD]}||VqdSr,rrr r r rs  zIPv6Network.hostscCrrE)rTr[rMrar r r r[s zIPv6Network.is_site_localNr7) rrr rrrrrr[r r r r rs 0 rc@seZdZedZedZededededededed ed ed ed edg Zed edededededgZedededededededededededededed ed!gZed"Z d#S)$_IPv6Constantsz fe80::/10zff00::/8z::1/128z::/128z ::ffff:0:0/96z64:ff9b:1::/48z100::/64z 2001::/23z 2001:db8::/32z 2002::/16z 3fff::/20zfc00::/7z 2001:1::1/128z 2001:1::2/128z 2001:3::/32z2001:4:112::/48z 2001:20::/28z 2001:30::/28z::/8z100::/8z200::/7z400::/6z800::/5z1000::/4z4000::/3z6000::/3z8000::/3zA000::/3zC000::/3zE000::/4zF000::/5zF800::/6zFE00::/9z fec0::/10N) rrr rrrrrrYrZr r r r rf s@       rfr7)# __version__rrrRrrr rrrr"r$r+r6r:rDrOrWr]r^rtotal_orderingr>rXrrrrr8rr9rrrrfr r r r s\ "7163kH CR&1yK\ /