From ab7526c542a55fa0e9002560d5669185c4fddb8e Mon Sep 17 00:00:00 2001 From: benjamyn Date: Sun, 30 Jun 2019 22:59:07 +1000 Subject: [PATCH] removing env folder --- .../__pycache__/ipwhois_cli.cpython-37.pyc | Bin 29555 -> 0 bytes .../ipwhois_utils_cli.cpython-37.pyc | Bin 4445 -> 0 bytes env/bin/activate | 78 - env/bin/activate.csh | 42 - env/bin/activate.fish | 76 - env/bin/activate_this.py | 36 - env/bin/easy_install | 11 - env/bin/easy_install-3.7 | 11 - env/bin/ipwhois_cli.py | 1515 --- env/bin/ipwhois_utils_cli.py | 269 - env/bin/pip | 11 - env/bin/pip3 | 11 - env/bin/pip3.7 | 11 - env/bin/python | Bin 14088 -> 0 bytes env/bin/python-config | 78 - env/bin/python3 | 1 - env/bin/python3.7 | 1 - env/bin/wheel | 11 - env/include/python3.7m | 1 - env/lib/python3.7/__future__.py | 1 - .../__pycache__/__future__.cpython-37.pyc | Bin 4157 -> 0 bytes .../__pycache__/_bootlocale.cpython-37.pyc | Bin 1274 -> 0 bytes .../_collections_abc.cpython-37.pyc | Bin 28967 -> 0 bytes .../__pycache__/_weakrefset.cpython-37.pyc | Bin 7487 -> 0 bytes .../python3.7/__pycache__/abc.cpython-37.pyc | Bin 6476 -> 0 bytes .../__pycache__/base64.cpython-37.pyc | Bin 17013 -> 0 bytes .../__pycache__/bisect.cpython-37.pyc | Bin 2723 -> 0 bytes .../__pycache__/codecs.cpython-37.pyc | Bin 33923 -> 0 bytes .../python3.7/__pycache__/copy.cpython-37.pyc | Bin 7126 -> 0 bytes .../__pycache__/copyreg.cpython-37.pyc | Bin 4269 -> 0 bytes .../python3.7/__pycache__/enum.cpython-37.pyc | Bin 24296 -> 0 bytes .../__pycache__/fnmatch.cpython-37.pyc | Bin 3362 -> 0 bytes .../__pycache__/functools.cpython-37.pyc | Bin 23980 -> 0 bytes .../__pycache__/genericpath.cpython-37.pyc | Bin 3773 -> 0 bytes .../__pycache__/hashlib.cpython-37.pyc | Bin 6616 -> 0 bytes .../__pycache__/heapq.cpython-37.pyc | Bin 14387 -> 0 bytes .../python3.7/__pycache__/hmac.cpython-37.pyc | Bin 6138 -> 0 bytes .../python3.7/__pycache__/imp.cpython-37.pyc | Bin 9778 -> 0 bytes .../python3.7/__pycache__/io.cpython-37.pyc | Bin 3434 -> 0 bytes .../__pycache__/keyword.cpython-37.pyc | Bin 1834 -> 0 bytes .../__pycache__/linecache.cpython-37.pyc | Bin 3814 -> 0 bytes .../__pycache__/locale.cpython-37.pyc | Bin 34580 -> 0 bytes .../__pycache__/operator.cpython-37.pyc | Bin 13925 -> 0 bytes .../python3.7/__pycache__/os.cpython-37.pyc | Bin 29718 -> 0 bytes .../__pycache__/posixpath.cpython-37.pyc | Bin 10455 -> 0 bytes .../__pycache__/random.cpython-37.pyc | Bin 19433 -> 0 bytes .../python3.7/__pycache__/re.cpython-37.pyc | Bin 13829 -> 0 bytes .../__pycache__/reprlib.cpython-37.pyc | Bin 5375 -> 0 bytes .../__pycache__/shutil.cpython-37.pyc | Bin 30889 -> 0 bytes .../python3.7/__pycache__/site.cpython-37.pyc | Bin 22114 -> 0 bytes .../__pycache__/sre_compile.cpython-37.pyc | Bin 15228 -> 0 bytes .../__pycache__/sre_constants.cpython-37.pyc | Bin 6316 -> 0 bytes .../__pycache__/sre_parse.cpython-37.pyc | Bin 21382 -> 0 bytes .../python3.7/__pycache__/stat.cpython-37.pyc | Bin 3898 -> 0 bytes .../__pycache__/struct.cpython-37.pyc | Bin 359 -> 0 bytes .../__pycache__/tarfile.cpython-37.pyc | Bin 61866 -> 0 bytes .../__pycache__/tempfile.cpython-37.pyc | Bin 22170 -> 0 bytes .../__pycache__/token.cpython-37.pyc | Bin 3624 -> 0 bytes .../__pycache__/tokenize.cpython-37.pyc | Bin 17856 -> 0 bytes .../__pycache__/types.cpython-37.pyc | Bin 9001 -> 0 bytes .../__pycache__/warnings.cpython-37.pyc | Bin 13965 -> 0 bytes .../__pycache__/weakref.cpython-37.pyc | Bin 19243 -> 0 bytes env/lib/python3.7/_bootlocale.py | 1 - env/lib/python3.7/_collections_abc.py | 1 - env/lib/python3.7/_dummy_thread.py | 1 - env/lib/python3.7/_weakrefset.py | 1 - env/lib/python3.7/abc.py | 1 - env/lib/python3.7/base64.py | 1 - env/lib/python3.7/bisect.py | 1 - env/lib/python3.7/codecs.py | 1 - env/lib/python3.7/collections | 1 - .../python3.7/config-3.7m-x86_64-linux-gnu | 1 - env/lib/python3.7/copy.py | 1 - env/lib/python3.7/copyreg.py | 1 - env/lib/python3.7/distutils/__init__.py | 116 - .../__pycache__/__init__.cpython-37.pyc | Bin 2800 -> 0 bytes env/lib/python3.7/distutils/distutils.cfg | 6 - env/lib/python3.7/encodings | 1 - env/lib/python3.7/enum.py | 1 - env/lib/python3.7/fnmatch.py | 1 - env/lib/python3.7/functools.py | 1 - env/lib/python3.7/genericpath.py | 1 - env/lib/python3.7/hashlib.py | 1 - env/lib/python3.7/heapq.py | 1 - env/lib/python3.7/hmac.py | 1 - env/lib/python3.7/imp.py | 1 - env/lib/python3.7/importlib | 1 - env/lib/python3.7/io.py | 1 - env/lib/python3.7/keyword.py | 1 - env/lib/python3.7/lib-dynload | 1 - env/lib/python3.7/linecache.py | 1 - env/lib/python3.7/locale.py | 1 - env/lib/python3.7/no-global-site-packages.txt | 0 env/lib/python3.7/ntpath.py | 1 - env/lib/python3.7/operator.py | 1 - env/lib/python3.7/orig-prefix.txt | 1 - env/lib/python3.7/os.py | 1 - env/lib/python3.7/posixpath.py | 1 - env/lib/python3.7/random.py | 1 - env/lib/python3.7/re.py | 1 - env/lib/python3.7/reprlib.py | 1 - env/lib/python3.7/rlcompleter.py | 1 - env/lib/python3.7/shutil.py | 1 - .../__pycache__/easy_install.cpython-37.pyc | Bin 281 -> 0 bytes .../python3.7/site-packages/dns/__init__.py | 56 - .../dns/__pycache__/__init__.cpython-37.pyc | Bin 610 -> 0 bytes .../dns/__pycache__/_compat.cpython-37.pyc | Bin 1733 -> 0 bytes .../dns/__pycache__/dnssec.cpython-37.pyc | Bin 12003 -> 0 bytes .../dns/__pycache__/e164.cpython-37.pyc | Bin 3208 -> 0 bytes .../dns/__pycache__/edns.cpython-37.pyc | Bin 7212 -> 0 bytes .../dns/__pycache__/entropy.cpython-37.pyc | Bin 3306 -> 0 bytes .../dns/__pycache__/exception.cpython-37.pyc | Bin 4119 -> 0 bytes .../dns/__pycache__/flags.cpython-37.pyc | Bin 2226 -> 0 bytes .../dns/__pycache__/grange.cpython-37.pyc | Bin 999 -> 0 bytes .../dns/__pycache__/hash.cpython-37.pyc | Bin 645 -> 0 bytes .../dns/__pycache__/inet.cpython-37.pyc | Bin 2410 -> 0 bytes .../dns/__pycache__/ipv4.cpython-37.pyc | Bin 1382 -> 0 bytes .../dns/__pycache__/ipv6.cpython-37.pyc | Bin 3057 -> 0 bytes .../dns/__pycache__/message.cpython-37.pyc | Bin 30487 -> 0 bytes .../dns/__pycache__/name.cpython-37.pyc | Bin 28440 -> 0 bytes .../dns/__pycache__/namedict.cpython-37.pyc | Bin 3002 -> 0 bytes .../dns/__pycache__/node.cpython-37.pyc | Bin 5757 -> 0 bytes .../dns/__pycache__/opcode.cpython-37.pyc | Bin 2174 -> 0 bytes .../dns/__pycache__/query.cpython-37.pyc | Bin 17205 -> 0 bytes .../dns/__pycache__/rcode.cpython-37.pyc | Bin 2675 -> 0 bytes .../dns/__pycache__/rdata.cpython-37.pyc | Bin 13710 -> 0 bytes .../dns/__pycache__/rdataclass.cpython-37.pyc | Bin 2427 -> 0 bytes .../dns/__pycache__/rdataset.cpython-37.pyc | Bin 9418 -> 0 bytes .../dns/__pycache__/rdatatype.cpython-37.pyc | Bin 5027 -> 0 bytes .../dns/__pycache__/renderer.cpython-37.pyc | Bin 7968 -> 0 bytes .../dns/__pycache__/resolver.cpython-37.pyc | Bin 33613 -> 0 bytes .../__pycache__/reversename.cpython-37.pyc | Bin 2526 -> 0 bytes .../dns/__pycache__/rrset.cpython-37.pyc | Bin 5376 -> 0 bytes .../dns/__pycache__/set.cpython-37.pyc | Bin 7444 -> 0 bytes .../dns/__pycache__/tokenizer.cpython-37.pyc | Bin 14095 -> 0 bytes .../dns/__pycache__/tsig.cpython-37.pyc | Bin 6223 -> 0 bytes .../__pycache__/tsigkeyring.cpython-37.pyc | Bin 1080 -> 0 bytes .../dns/__pycache__/ttl.cpython-37.pyc | Bin 1346 -> 0 bytes .../dns/__pycache__/update.cpython-37.pyc | Bin 7374 -> 0 bytes .../dns/__pycache__/version.cpython-37.pyc | Bin 475 -> 0 bytes .../dns/__pycache__/wiredata.cpython-37.pyc | Bin 2267 -> 0 bytes .../dns/__pycache__/zone.cpython-37.pyc | Bin 31027 -> 0 bytes .../python3.7/site-packages/dns/_compat.py | 59 - env/lib/python3.7/site-packages/dns/dnssec.py | 519 -- env/lib/python3.7/site-packages/dns/e164.py | 105 - env/lib/python3.7/site-packages/dns/edns.py | 269 - .../python3.7/site-packages/dns/entropy.py | 148 - .../python3.7/site-packages/dns/exception.py | 128 - env/lib/python3.7/site-packages/dns/flags.py | 130 - env/lib/python3.7/site-packages/dns/grange.py | 69 - env/lib/python3.7/site-packages/dns/hash.py | 37 - env/lib/python3.7/site-packages/dns/inet.py | 124 - env/lib/python3.7/site-packages/dns/ipv4.py | 63 - env/lib/python3.7/site-packages/dns/ipv6.py | 181 - .../python3.7/site-packages/dns/message.py | 1175 --- env/lib/python3.7/site-packages/dns/name.py | 994 -- .../python3.7/site-packages/dns/namedict.py | 108 - env/lib/python3.7/site-packages/dns/node.py | 182 - env/lib/python3.7/site-packages/dns/opcode.py | 119 - env/lib/python3.7/site-packages/dns/py.typed | 0 env/lib/python3.7/site-packages/dns/query.py | 683 -- env/lib/python3.7/site-packages/dns/rcode.py | 144 - env/lib/python3.7/site-packages/dns/rdata.py | 456 - .../python3.7/site-packages/dns/rdataclass.py | 122 - .../python3.7/site-packages/dns/rdataset.py | 347 - .../python3.7/site-packages/dns/rdatatype.py | 287 - .../site-packages/dns/rdtypes/ANY/AFSDB.py | 55 - .../site-packages/dns/rdtypes/ANY/AVC.py | 25 - .../site-packages/dns/rdtypes/ANY/CAA.py | 75 - .../site-packages/dns/rdtypes/ANY/CDNSKEY.py | 27 - .../site-packages/dns/rdtypes/ANY/CDS.py | 23 - .../site-packages/dns/rdtypes/ANY/CERT.py | 123 - .../site-packages/dns/rdtypes/ANY/CNAME.py | 27 - .../site-packages/dns/rdtypes/ANY/CSYNC.py | 126 - .../site-packages/dns/rdtypes/ANY/DLV.py | 23 - .../site-packages/dns/rdtypes/ANY/DNAME.py | 26 - .../site-packages/dns/rdtypes/ANY/DNSKEY.py | 27 - .../site-packages/dns/rdtypes/ANY/DS.py | 23 - .../site-packages/dns/rdtypes/ANY/EUI48.py | 29 - .../site-packages/dns/rdtypes/ANY/EUI64.py | 29 - .../site-packages/dns/rdtypes/ANY/GPOS.py | 162 - .../site-packages/dns/rdtypes/ANY/HINFO.py | 86 - .../site-packages/dns/rdtypes/ANY/HIP.py | 115 - .../site-packages/dns/rdtypes/ANY/ISDN.py | 99 - .../site-packages/dns/rdtypes/ANY/LOC.py | 327 - .../site-packages/dns/rdtypes/ANY/MX.py | 23 - .../site-packages/dns/rdtypes/ANY/NS.py | 23 - .../site-packages/dns/rdtypes/ANY/NSEC.py | 128 - .../site-packages/dns/rdtypes/ANY/NSEC3.py | 196 - .../dns/rdtypes/ANY/NSEC3PARAM.py | 90 - .../dns/rdtypes/ANY/OPENPGPKEY.py | 60 - .../site-packages/dns/rdtypes/ANY/PTR.py | 23 - .../site-packages/dns/rdtypes/ANY/RP.py | 82 - .../site-packages/dns/rdtypes/ANY/RRSIG.py | 158 - .../site-packages/dns/rdtypes/ANY/RT.py | 23 - .../site-packages/dns/rdtypes/ANY/SOA.py | 116 - .../site-packages/dns/rdtypes/ANY/SPF.py | 25 - .../site-packages/dns/rdtypes/ANY/SSHFP.py | 79 - .../site-packages/dns/rdtypes/ANY/TLSA.py | 84 - .../site-packages/dns/rdtypes/ANY/TXT.py | 23 - .../site-packages/dns/rdtypes/ANY/URI.py | 82 - .../site-packages/dns/rdtypes/ANY/X25.py | 66 - .../site-packages/dns/rdtypes/ANY/__init__.py | 57 - .../ANY/__pycache__/AFSDB.cpython-37.pyc | Bin 1124 -> 0 bytes .../ANY/__pycache__/AVC.cpython-37.pyc | Bin 475 -> 0 bytes .../ANY/__pycache__/CAA.cpython-37.pyc | Bin 2125 -> 0 bytes .../ANY/__pycache__/CDNSKEY.cpython-37.pyc | Bin 507 -> 0 bytes .../ANY/__pycache__/CDS.cpython-37.pyc | Bin 384 -> 0 bytes .../ANY/__pycache__/CERT.cpython-37.pyc | Bin 3075 -> 0 bytes .../ANY/__pycache__/CNAME.cpython-37.pyc | Bin 595 -> 0 bytes .../ANY/__pycache__/CSYNC.cpython-37.pyc | Bin 3239 -> 0 bytes .../ANY/__pycache__/DLV.cpython-37.pyc | Bin 384 -> 0 bytes .../ANY/__pycache__/DNAME.cpython-37.pyc | Bin 552 -> 0 bytes .../ANY/__pycache__/DNSKEY.cpython-37.pyc | Bin 504 -> 0 bytes .../rdtypes/ANY/__pycache__/DS.cpython-37.pyc | Bin 381 -> 0 bytes .../ANY/__pycache__/EUI48.cpython-37.pyc | Bin 567 -> 0 bytes .../ANY/__pycache__/EUI64.cpython-37.pyc | Bin 567 -> 0 bytes .../ANY/__pycache__/GPOS.cpython-37.pyc | Bin 4181 -> 0 bytes .../ANY/__pycache__/HINFO.cpython-37.pyc | Bin 2087 -> 0 bytes .../ANY/__pycache__/HIP.cpython-37.pyc | Bin 3265 -> 0 bytes .../ANY/__pycache__/ISDN.cpython-37.pyc | Bin 2315 -> 0 bytes .../ANY/__pycache__/LOC.cpython-37.pyc | Bin 8286 -> 0 bytes .../rdtypes/ANY/__pycache__/MX.cpython-37.pyc | Bin 381 -> 0 bytes .../rdtypes/ANY/__pycache__/NS.cpython-37.pyc | Bin 381 -> 0 bytes .../ANY/__pycache__/NSEC.cpython-37.pyc | Bin 3304 -> 0 bytes .../ANY/__pycache__/NSEC3.cpython-37.pyc | Bin 4581 -> 0 bytes .../ANY/__pycache__/NSEC3PARAM.cpython-37.pyc | Bin 2382 -> 0 bytes .../ANY/__pycache__/OPENPGPKEY.cpython-37.pyc | Bin 1711 -> 0 bytes .../ANY/__pycache__/PTR.cpython-37.pyc | Bin 384 -> 0 bytes .../rdtypes/ANY/__pycache__/RP.cpython-37.pyc | Bin 2348 -> 0 bytes .../ANY/__pycache__/RRSIG.cpython-37.pyc | Bin 4484 -> 0 bytes .../rdtypes/ANY/__pycache__/RT.cpython-37.pyc | Bin 399 -> 0 bytes .../ANY/__pycache__/SOA.cpython-37.pyc | Bin 3333 -> 0 bytes .../ANY/__pycache__/SPF.cpython-37.pyc | Bin 407 -> 0 bytes .../ANY/__pycache__/SSHFP.cpython-37.pyc | Bin 2176 -> 0 bytes .../ANY/__pycache__/TLSA.cpython-37.pyc | Bin 2307 -> 0 bytes .../ANY/__pycache__/TXT.cpython-37.pyc | Bin 387 -> 0 bytes .../ANY/__pycache__/URI.cpython-37.pyc | Bin 2296 -> 0 bytes .../ANY/__pycache__/X25.cpython-37.pyc | Bin 1775 -> 0 bytes .../ANY/__pycache__/__init__.cpython-37.pyc | Bin 579 -> 0 bytes .../site-packages/dns/rdtypes/CH/A.py | 70 - .../site-packages/dns/rdtypes/CH/__init__.py | 22 - .../rdtypes/CH/__pycache__/A.cpython-37.pyc | Bin 2211 -> 0 bytes .../CH/__pycache__/__init__.cpython-37.pyc | Bin 209 -> 0 bytes .../site-packages/dns/rdtypes/IN/A.py | 54 - .../site-packages/dns/rdtypes/IN/AAAA.py | 55 - .../site-packages/dns/rdtypes/IN/APL.py | 165 - .../site-packages/dns/rdtypes/IN/DHCID.py | 61 - .../site-packages/dns/rdtypes/IN/IPSECKEY.py | 150 - .../site-packages/dns/rdtypes/IN/KX.py | 23 - .../site-packages/dns/rdtypes/IN/NAPTR.py | 127 - .../site-packages/dns/rdtypes/IN/NSAP.py | 60 - .../site-packages/dns/rdtypes/IN/NSAP_PTR.py | 23 - .../site-packages/dns/rdtypes/IN/PX.py | 89 - .../site-packages/dns/rdtypes/IN/SRV.py | 83 - .../site-packages/dns/rdtypes/IN/WKS.py | 107 - .../site-packages/dns/rdtypes/IN/__init__.py | 33 - .../rdtypes/IN/__pycache__/A.cpython-37.pyc | Bin 1548 -> 0 bytes .../IN/__pycache__/AAAA.cpython-37.pyc | Bin 1603 -> 0 bytes .../rdtypes/IN/__pycache__/APL.cpython-37.pyc | Bin 3880 -> 0 bytes .../IN/__pycache__/DHCID.cpython-37.pyc | Bin 1717 -> 0 bytes .../IN/__pycache__/IPSECKEY.cpython-37.pyc | Bin 3646 -> 0 bytes .../rdtypes/IN/__pycache__/KX.cpython-37.pyc | Bin 388 -> 0 bytes .../IN/__pycache__/NAPTR.cpython-37.pyc | Bin 3344 -> 0 bytes .../IN/__pycache__/NSAP.cpython-37.pyc | Bin 1750 -> 0 bytes .../IN/__pycache__/NSAP_PTR.cpython-37.pyc | Bin 406 -> 0 bytes .../rdtypes/IN/__pycache__/PX.cpython-37.pyc | Bin 2373 -> 0 bytes .../rdtypes/IN/__pycache__/SRV.cpython-37.pyc | Bin 2327 -> 0 bytes .../rdtypes/IN/__pycache__/WKS.cpython-37.pyc | Bin 2786 -> 0 bytes .../IN/__pycache__/__init__.cpython-37.pyc | Bin 322 -> 0 bytes .../site-packages/dns/rdtypes/__init__.py | 27 - .../__pycache__/__init__.cpython-37.pyc | Bin 255 -> 0 bytes .../__pycache__/dnskeybase.cpython-37.pyc | Bin 3659 -> 0 bytes .../rdtypes/__pycache__/dsbase.cpython-37.pyc | Bin 2369 -> 0 bytes .../__pycache__/euibase.cpython-37.pyc | Bin 2180 -> 0 bytes .../rdtypes/__pycache__/mxbase.cpython-37.pyc | Bin 3512 -> 0 bytes .../rdtypes/__pycache__/nsbase.cpython-37.pyc | Bin 2710 -> 0 bytes .../__pycache__/txtbase.cpython-37.pyc | Bin 2470 -> 0 bytes .../site-packages/dns/rdtypes/dnskeybase.py | 138 - .../site-packages/dns/rdtypes/dsbase.py | 85 - .../site-packages/dns/rdtypes/euibase.py | 71 - .../site-packages/dns/rdtypes/mxbase.py | 103 - .../site-packages/dns/rdtypes/nsbase.py | 83 - .../site-packages/dns/rdtypes/txtbase.py | 97 - .../python3.7/site-packages/dns/renderer.py | 291 - .../python3.7/site-packages/dns/resolver.py | 1383 --- .../site-packages/dns/reversename.py | 96 - env/lib/python3.7/site-packages/dns/rrset.py | 189 - env/lib/python3.7/site-packages/dns/set.py | 261 - .../python3.7/site-packages/dns/tokenizer.py | 571 -- env/lib/python3.7/site-packages/dns/tsig.py | 236 - .../site-packages/dns/tsigkeyring.py | 50 - env/lib/python3.7/site-packages/dns/ttl.py | 70 - env/lib/python3.7/site-packages/dns/update.py | 279 - .../python3.7/site-packages/dns/version.py | 43 - .../python3.7/site-packages/dns/wiredata.py | 103 - env/lib/python3.7/site-packages/dns/zone.py | 1127 --- .../DESCRIPTION.rst | 9 - .../dnspython-1.16.0.dist-info/INSTALLER | 1 - .../dnspython-1.16.0.dist-info/LICENSE.txt | 35 - .../dnspython-1.16.0.dist-info/METADATA | 44 - .../dnspython-1.16.0.dist-info/RECORD | 201 - .../dnspython-1.16.0.dist-info/WHEEL | 6 - .../dnspython-1.16.0.dist-info/metadata.json | 1 - .../dnspython-1.16.0.dist-info/top_level.txt | 1 - .../python3.7/site-packages/easy_install.py | 5 - .../site-packages/ipwhois/__init__.py | 29 - .../__pycache__/__init__.cpython-37.pyc | Bin 263 -> 0 bytes .../ipwhois/__pycache__/asn.cpython-37.pyc | Bin 22485 -> 0 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 3993 -> 0 bytes .../__pycache__/experimental.cpython-37.pyc | Bin 8730 -> 0 bytes .../ipwhois/__pycache__/hr.cpython-37.pyc | Bin 7387 -> 0 bytes .../__pycache__/ipwhois.cpython-37.pyc | Bin 12476 -> 0 bytes .../ipwhois/__pycache__/net.cpython-37.pyc | Bin 19747 -> 0 bytes .../ipwhois/__pycache__/nir.cpython-37.pyc | Bin 14963 -> 0 bytes .../ipwhois/__pycache__/rdap.cpython-37.pyc | Bin 17420 -> 0 bytes .../ipwhois/__pycache__/utils.cpython-37.pyc | Bin 12535 -> 0 bytes .../ipwhois/__pycache__/whois.cpython-37.pyc | Bin 16922 -> 0 bytes .../python3.7/site-packages/ipwhois/asn.py | 956 -- .../site-packages/ipwhois/data/iso_3166-1.csv | 252 - .../ipwhois/data/iso_3166-1_list_en.xml | 1003 -- .../site-packages/ipwhois/exceptions.py | 127 - .../site-packages/ipwhois/experimental.py | 457 - env/lib/python3.7/site-packages/ipwhois/hr.py | 509 - .../site-packages/ipwhois/ipwhois.py | 346 - .../python3.7/site-packages/ipwhois/net.py | 954 -- .../python3.7/site-packages/ipwhois/nir.py | 682 -- .../python3.7/site-packages/ipwhois/rdap.py | 898 -- .../python3.7/site-packages/ipwhois/utils.py | 631 -- .../python3.7/site-packages/ipwhois/whois.py | 809 -- .../python3.7/site-packages/pip/__init__.py | 1 - .../python3.7/site-packages/pip/__main__.py | 19 - .../pip/__pycache__/__init__.cpython-37.pyc | Bin 154 -> 0 bytes .../pip/__pycache__/__main__.cpython-37.pyc | Bin 406 -> 0 bytes .../site-packages/pip/_internal/__init__.py | 78 - .../__pycache__/__init__.cpython-37.pyc | Bin 1798 -> 0 bytes .../__pycache__/build_env.cpython-37.pyc | Bin 7395 -> 0 bytes .../__pycache__/cache.cpython-37.pyc | Bin 7006 -> 0 bytes .../__pycache__/configuration.cpython-37.pyc | Bin 9700 -> 0 bytes .../__pycache__/download.cpython-37.pyc | Bin 20868 -> 0 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 11698 -> 0 bytes .../__pycache__/index.cpython-37.pyc | Bin 28728 -> 0 bytes .../__pycache__/locations.cpython-37.pyc | Bin 4387 -> 0 bytes .../__pycache__/pep425tags.cpython-37.pyc | Bin 8117 -> 0 bytes .../__pycache__/pyproject.cpython-37.pyc | Bin 3134 -> 0 bytes .../__pycache__/resolve.cpython-37.pyc | Bin 9052 -> 0 bytes .../__pycache__/wheel.cpython-37.pyc | Bin 26028 -> 0 bytes .../site-packages/pip/_internal/build_env.py | 215 - .../site-packages/pip/_internal/cache.py | 224 - .../pip/_internal/cli/__init__.py | 4 - .../cli/__pycache__/__init__.cpython-37.pyc | Bin 229 -> 0 bytes .../__pycache__/autocompletion.cpython-37.pyc | Bin 5042 -> 0 bytes .../__pycache__/base_command.cpython-37.pyc | Bin 7749 -> 0 bytes .../cli/__pycache__/cmdoptions.cpython-37.pyc | Bin 16813 -> 0 bytes .../__pycache__/main_parser.cpython-37.pyc | Bin 2315 -> 0 bytes .../cli/__pycache__/parser.cpython-37.pyc | Bin 8893 -> 0 bytes .../__pycache__/status_codes.cpython-37.pyc | Bin 358 -> 0 bytes .../pip/_internal/cli/autocompletion.py | 152 - .../pip/_internal/cli/base_command.py | 340 - .../pip/_internal/cli/cmdoptions.py | 809 -- .../pip/_internal/cli/main_parser.py | 104 - .../site-packages/pip/_internal/cli/parser.py | 261 - .../pip/_internal/cli/status_codes.py | 8 - .../pip/_internal/commands/__init__.py | 79 - .../__pycache__/__init__.cpython-37.pyc | Bin 2457 -> 0 bytes .../commands/__pycache__/check.cpython-37.pyc | Bin 1282 -> 0 bytes .../__pycache__/completion.cpython-37.pyc | Bin 3031 -> 0 bytes .../__pycache__/configuration.cpython-37.pyc | Bin 6859 -> 0 bytes .../__pycache__/download.cpython-37.pyc | Bin 4670 -> 0 bytes .../__pycache__/freeze.cpython-37.pyc | Bin 2827 -> 0 bytes .../commands/__pycache__/hash.cpython-37.pyc | Bin 2021 -> 0 bytes .../commands/__pycache__/help.cpython-37.pyc | Bin 1197 -> 0 bytes .../__pycache__/install.cpython-37.pyc | Bin 12844 -> 0 bytes .../commands/__pycache__/list.cpython-37.pyc | Bin 8688 -> 0 bytes .../__pycache__/search.cpython-37.pyc | Bin 4263 -> 0 bytes .../commands/__pycache__/show.cpython-37.pyc | Bin 5844 -> 0 bytes .../__pycache__/uninstall.cpython-37.pyc | Bin 2653 -> 0 bytes .../commands/__pycache__/wheel.cpython-37.pyc | Bin 4956 -> 0 bytes .../pip/_internal/commands/check.py | 41 - .../pip/_internal/commands/completion.py | 94 - .../pip/_internal/commands/configuration.py | 253 - .../pip/_internal/commands/download.py | 176 - .../pip/_internal/commands/freeze.py | 96 - .../pip/_internal/commands/hash.py | 57 - .../pip/_internal/commands/help.py | 37 - .../pip/_internal/commands/install.py | 587 -- .../pip/_internal/commands/list.py | 302 - .../pip/_internal/commands/search.py | 135 - .../pip/_internal/commands/show.py | 168 - .../pip/_internal/commands/uninstall.py | 78 - .../pip/_internal/commands/wheel.py | 186 - .../pip/_internal/configuration.py | 384 - .../site-packages/pip/_internal/download.py | 979 -- .../site-packages/pip/_internal/exceptions.py | 274 - .../site-packages/pip/_internal/index.py | 1108 --- .../site-packages/pip/_internal/locations.py | 211 - .../pip/_internal/models/__init__.py | 2 - .../__pycache__/__init__.cpython-37.pyc | Bin 217 -> 0 bytes .../__pycache__/candidate.cpython-37.pyc | Bin 1250 -> 0 bytes .../__pycache__/format_control.cpython-37.pyc | Bin 2220 -> 0 bytes .../models/__pycache__/index.cpython-37.pyc | Bin 1121 -> 0 bytes .../models/__pycache__/link.cpython-37.pyc | Bin 4940 -> 0 bytes .../pip/_internal/models/candidate.py | 31 - .../pip/_internal/models/format_control.py | 73 - .../pip/_internal/models/index.py | 31 - .../pip/_internal/models/link.py | 163 - .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 153 -> 0 bytes .../__pycache__/check.cpython-37.pyc | Bin 3583 -> 0 bytes .../__pycache__/freeze.cpython-37.pyc | Bin 5568 -> 0 bytes .../__pycache__/prepare.cpython-37.pyc | Bin 10497 -> 0 bytes .../pip/_internal/operations/check.py | 155 - .../pip/_internal/operations/freeze.py | 247 - .../pip/_internal/operations/prepare.py | 426 - .../site-packages/pip/_internal/pep425tags.py | 381 - .../site-packages/pip/_internal/pyproject.py | 171 - .../pip/_internal/req/__init__.py | 78 - .../req/__pycache__/__init__.cpython-37.pyc | Bin 1664 -> 0 bytes .../__pycache__/constructors.cpython-37.pyc | Bin 7567 -> 0 bytes .../req/__pycache__/req_file.cpython-37.pyc | Bin 9180 -> 0 bytes .../__pycache__/req_install.cpython-37.pyc | Bin 24942 -> 0 bytes .../req/__pycache__/req_set.cpython-37.pyc | Bin 5625 -> 0 bytes .../__pycache__/req_tracker.cpython-37.pyc | Bin 3176 -> 0 bytes .../__pycache__/req_uninstall.cpython-37.pyc | Bin 17239 -> 0 bytes .../pip/_internal/req/constructors.py | 340 - .../pip/_internal/req/req_file.py | 383 - .../pip/_internal/req/req_install.py | 1028 --- .../pip/_internal/req/req_set.py | 193 - .../pip/_internal/req/req_tracker.py | 96 - .../pip/_internal/req/req_uninstall.py | 633 -- .../site-packages/pip/_internal/resolve.py | 393 - .../pip/_internal/utils/__init__.py | 0 .../utils/__pycache__/__init__.cpython-37.pyc | Bin 148 -> 0 bytes .../utils/__pycache__/appdirs.cpython-37.pyc | Bin 7979 -> 0 bytes .../utils/__pycache__/compat.cpython-37.pyc | Bin 6096 -> 0 bytes .../__pycache__/deprecation.cpython-37.pyc | Bin 2557 -> 0 bytes .../utils/__pycache__/encoding.cpython-37.pyc | Bin 1232 -> 0 bytes .../__pycache__/filesystem.cpython-37.pyc | Bin 617 -> 0 bytes .../utils/__pycache__/glibc.cpython-37.pyc | Bin 1636 -> 0 bytes .../utils/__pycache__/hashes.cpython-37.pyc | Bin 3555 -> 0 bytes .../utils/__pycache__/logging.cpython-37.pyc | Bin 8979 -> 0 bytes .../utils/__pycache__/misc.cpython-37.pyc | Bin 24975 -> 0 bytes .../utils/__pycache__/models.cpython-37.pyc | Bin 1897 -> 0 bytes .../utils/__pycache__/outdated.cpython-37.pyc | Bin 3898 -> 0 bytes .../__pycache__/packaging.cpython-37.pyc | Bin 2569 -> 0 bytes .../setuptools_build.cpython-37.pyc | Bin 343 -> 0 bytes .../utils/__pycache__/temp_dir.cpython-37.pyc | Bin 4870 -> 0 bytes .../utils/__pycache__/typing.cpython-37.pyc | Bin 1278 -> 0 bytes .../utils/__pycache__/ui.cpython-37.pyc | Bin 11708 -> 0 bytes .../pip/_internal/utils/appdirs.py | 268 - .../pip/_internal/utils/compat.py | 264 - .../pip/_internal/utils/deprecation.py | 93 - .../pip/_internal/utils/encoding.py | 39 - .../pip/_internal/utils/filesystem.py | 30 - .../pip/_internal/utils/glibc.py | 93 - .../pip/_internal/utils/hashes.py | 115 - .../pip/_internal/utils/logging.py | 371 - .../site-packages/pip/_internal/utils/misc.py | 1011 -- .../pip/_internal/utils/models.py | 40 - .../pip/_internal/utils/outdated.py | 162 - .../pip/_internal/utils/packaging.py | 85 - .../pip/_internal/utils/setuptools_build.py | 8 - .../pip/_internal/utils/temp_dir.py | 155 - .../pip/_internal/utils/typing.py | 29 - .../site-packages/pip/_internal/utils/ui.py | 424 - .../pip/_internal/vcs/__init__.py | 604 -- .../vcs/__pycache__/__init__.cpython-37.pyc | Bin 16988 -> 0 bytes .../vcs/__pycache__/bazaar.cpython-37.pyc | Bin 3389 -> 0 bytes .../vcs/__pycache__/git.cpython-37.pyc | Bin 9033 -> 0 bytes .../vcs/__pycache__/mercurial.cpython-37.pyc | Bin 3651 -> 0 bytes .../vcs/__pycache__/subversion.cpython-37.pyc | Bin 6680 -> 0 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 103 - .../site-packages/pip/_internal/vcs/git.py | 362 - .../pip/_internal/vcs/mercurial.py | 105 - .../pip/_internal/vcs/subversion.py | 234 - .../site-packages/pip/_internal/wheel.py | 1098 --- .../site-packages/pip/_vendor/__init__.py | 109 - .../__pycache__/__init__.cpython-37.pyc | Bin 2815 -> 0 bytes .../__pycache__/appdirs.cpython-37.pyc | Bin 20565 -> 0 bytes .../_vendor/__pycache__/distro.cpython-37.pyc | Bin 36278 -> 0 bytes .../__pycache__/ipaddress.cpython-37.pyc | Bin 66408 -> 0 bytes .../__pycache__/pyparsing.cpython-37.pyc | Bin 221766 -> 0 bytes .../__pycache__/retrying.cpython-37.pyc | Bin 8046 -> 0 bytes .../_vendor/__pycache__/six.cpython-37.pyc | Bin 26370 -> 0 bytes .../site-packages/pip/_vendor/appdirs.py | 604 -- .../pip/_vendor/cachecontrol/__init__.py | 11 - .../__pycache__/__init__.cpython-37.pyc | Bin 506 -> 0 bytes .../__pycache__/_cmd.cpython-37.pyc | Bin 1509 -> 0 bytes .../__pycache__/adapter.cpython-37.pyc | Bin 2992 -> 0 bytes .../__pycache__/cache.cpython-37.pyc | Bin 1722 -> 0 bytes .../__pycache__/compat.cpython-37.pyc | Bin 713 -> 0 bytes .../__pycache__/controller.cpython-37.pyc | Bin 7592 -> 0 bytes .../__pycache__/filewrapper.cpython-37.pyc | Bin 2110 -> 0 bytes .../__pycache__/heuristics.cpython-37.pyc | Bin 4630 -> 0 bytes .../__pycache__/serialize.cpython-37.pyc | Bin 4194 -> 0 bytes .../__pycache__/wrapper.cpython-37.pyc | Bin 614 -> 0 bytes .../pip/_vendor/cachecontrol/_cmd.py | 57 - .../pip/_vendor/cachecontrol/adapter.py | 133 - .../pip/_vendor/cachecontrol/cache.py | 39 - .../_vendor/cachecontrol/caches/__init__.py | 2 - .../__pycache__/__init__.cpython-37.pyc | Bin 250 -> 0 bytes .../__pycache__/file_cache.cpython-37.pyc | Bin 3184 -> 0 bytes .../__pycache__/redis_cache.cpython-37.pyc | Bin 1506 -> 0 bytes .../_vendor/cachecontrol/caches/file_cache.py | 146 - .../cachecontrol/caches/redis_cache.py | 33 - .../pip/_vendor/cachecontrol/compat.py | 29 - .../pip/_vendor/cachecontrol/controller.py | 367 - .../pip/_vendor/cachecontrol/filewrapper.py | 80 - .../pip/_vendor/cachecontrol/heuristics.py | 135 - .../pip/_vendor/cachecontrol/serialize.py | 186 - .../pip/_vendor/cachecontrol/wrapper.py | 29 - .../pip/_vendor/certifi/__init__.py | 3 - .../pip/_vendor/certifi/__main__.py | 2 - .../__pycache__/__init__.cpython-37.pyc | Bin 213 -> 0 bytes .../__pycache__/__main__.cpython-37.pyc | Bin 216 -> 0 bytes .../certifi/__pycache__/core.cpython-37.pyc | Bin 425 -> 0 bytes .../pip/_vendor/certifi/cacert.pem | 4658 ---------- .../site-packages/pip/_vendor/certifi/core.py | 15 - .../pip/_vendor/chardet/__init__.py | 39 - .../__pycache__/__init__.cpython-37.pyc | Bin 800 -> 0 bytes .../__pycache__/big5freq.cpython-37.pyc | Bin 27135 -> 0 bytes .../__pycache__/big5prober.cpython-37.pyc | Bin 1076 -> 0 bytes .../chardistribution.cpython-37.pyc | Bin 6262 -> 0 bytes .../charsetgroupprober.cpython-37.pyc | Bin 2183 -> 0 bytes .../__pycache__/charsetprober.cpython-37.pyc | Bin 3393 -> 0 bytes .../codingstatemachine.cpython-37.pyc | Bin 2840 -> 0 bytes .../chardet/__pycache__/compat.cpython-37.pyc | Bin 311 -> 0 bytes .../__pycache__/cp949prober.cpython-37.pyc | Bin 1083 -> 0 bytes .../chardet/__pycache__/enums.cpython-37.pyc | Bin 2574 -> 0 bytes .../__pycache__/escprober.cpython-37.pyc | Bin 2561 -> 0 bytes .../chardet/__pycache__/escsm.cpython-37.pyc | Bin 7022 -> 0 bytes .../__pycache__/eucjpprober.cpython-37.pyc | Bin 2369 -> 0 bytes .../__pycache__/euckrfreq.cpython-37.pyc | Bin 12019 -> 0 bytes .../__pycache__/euckrprober.cpython-37.pyc | Bin 1084 -> 0 bytes .../__pycache__/euctwfreq.cpython-37.pyc | Bin 27139 -> 0 bytes .../__pycache__/euctwprober.cpython-37.pyc | Bin 1084 -> 0 bytes .../__pycache__/gb2312freq.cpython-37.pyc | Bin 19063 -> 0 bytes .../__pycache__/gb2312prober.cpython-37.pyc | Bin 1092 -> 0 bytes .../__pycache__/hebrewprober.cpython-37.pyc | Bin 2926 -> 0 bytes .../__pycache__/jisfreq.cpython-37.pyc | Bin 22091 -> 0 bytes .../chardet/__pycache__/jpcntx.cpython-37.pyc | Bin 37970 -> 0 bytes .../langbulgarianmodel.cpython-37.pyc | Bin 23584 -> 0 bytes .../langcyrillicmodel.cpython-37.pyc | Bin 29040 -> 0 bytes .../__pycache__/langgreekmodel.cpython-37.pyc | Bin 23542 -> 0 bytes .../langhebrewmodel.cpython-37.pyc | Bin 22171 -> 0 bytes .../langhungarianmodel.cpython-37.pyc | Bin 23573 -> 0 bytes .../__pycache__/langthaimodel.cpython-37.pyc | Bin 22150 -> 0 bytes .../langturkishmodel.cpython-37.pyc | Bin 22173 -> 0 bytes .../__pycache__/latin1prober.cpython-37.pyc | Bin 2883 -> 0 bytes .../mbcharsetprober.cpython-37.pyc | Bin 2188 -> 0 bytes .../mbcsgroupprober.cpython-37.pyc | Bin 1079 -> 0 bytes .../chardet/__pycache__/mbcssm.cpython-37.pyc | Bin 15634 -> 0 bytes .../sbcharsetprober.cpython-37.pyc | Bin 2941 -> 0 bytes .../sbcsgroupprober.cpython-37.pyc | Bin 1569 -> 0 bytes .../__pycache__/sjisprober.cpython-37.pyc | Bin 2395 -> 0 bytes .../universaldetector.cpython-37.pyc | Bin 5785 -> 0 bytes .../__pycache__/utf8prober.cpython-37.pyc | Bin 1926 -> 0 bytes .../__pycache__/version.cpython-37.pyc | Bin 395 -> 0 bytes .../pip/_vendor/chardet/big5freq.py | 386 - .../pip/_vendor/chardet/big5prober.py | 47 - .../pip/_vendor/chardet/chardistribution.py | 233 - .../pip/_vendor/chardet/charsetgroupprober.py | 106 - .../pip/_vendor/chardet/charsetprober.py | 145 - .../pip/_vendor/chardet/cli/__init__.py | 1 - .../cli/__pycache__/__init__.cpython-37.pyc | Bin 152 -> 0 bytes .../cli/__pycache__/chardetect.cpython-37.pyc | Bin 2641 -> 0 bytes .../pip/_vendor/chardet/cli/chardetect.py | 85 - .../pip/_vendor/chardet/codingstatemachine.py | 88 - .../pip/_vendor/chardet/compat.py | 34 - .../pip/_vendor/chardet/cp949prober.py | 49 - .../pip/_vendor/chardet/enums.py | 76 - .../pip/_vendor/chardet/escprober.py | 101 - .../pip/_vendor/chardet/escsm.py | 246 - .../pip/_vendor/chardet/eucjpprober.py | 92 - .../pip/_vendor/chardet/euckrfreq.py | 195 - .../pip/_vendor/chardet/euckrprober.py | 47 - .../pip/_vendor/chardet/euctwfreq.py | 387 - .../pip/_vendor/chardet/euctwprober.py | 46 - .../pip/_vendor/chardet/gb2312freq.py | 283 - .../pip/_vendor/chardet/gb2312prober.py | 46 - .../pip/_vendor/chardet/hebrewprober.py | 292 - .../pip/_vendor/chardet/jisfreq.py | 325 - .../pip/_vendor/chardet/jpcntx.py | 233 - .../pip/_vendor/chardet/langbulgarianmodel.py | 228 - .../pip/_vendor/chardet/langcyrillicmodel.py | 333 - .../pip/_vendor/chardet/langgreekmodel.py | 225 - .../pip/_vendor/chardet/langhebrewmodel.py | 200 - .../pip/_vendor/chardet/langhungarianmodel.py | 225 - .../pip/_vendor/chardet/langthaimodel.py | 199 - .../pip/_vendor/chardet/langturkishmodel.py | 193 - .../pip/_vendor/chardet/latin1prober.py | 145 - .../pip/_vendor/chardet/mbcharsetprober.py | 91 - .../pip/_vendor/chardet/mbcsgroupprober.py | 54 - .../pip/_vendor/chardet/mbcssm.py | 572 -- .../pip/_vendor/chardet/sbcharsetprober.py | 132 - .../pip/_vendor/chardet/sbcsgroupprober.py | 73 - .../pip/_vendor/chardet/sjisprober.py | 92 - .../pip/_vendor/chardet/universaldetector.py | 286 - .../pip/_vendor/chardet/utf8prober.py | 82 - .../pip/_vendor/chardet/version.py | 9 - .../pip/_vendor/colorama/__init__.py | 6 - .../__pycache__/__init__.cpython-37.pyc | Bin 400 -> 0 bytes .../colorama/__pycache__/ansi.cpython-37.pyc | Bin 3298 -> 0 bytes .../__pycache__/ansitowin32.cpython-37.pyc | Bin 7554 -> 0 bytes .../__pycache__/initialise.cpython-37.pyc | Bin 1619 -> 0 bytes .../colorama/__pycache__/win32.cpython-37.pyc | Bin 3813 -> 0 bytes .../__pycache__/winterm.cpython-37.pyc | Bin 4561 -> 0 bytes .../pip/_vendor/colorama/ansi.py | 102 - .../pip/_vendor/colorama/ansitowin32.py | 257 - .../pip/_vendor/colorama/initialise.py | 80 - .../pip/_vendor/colorama/win32.py | 152 - .../pip/_vendor/colorama/winterm.py | 169 - .../pip/_vendor/distlib/__init__.py | 23 - .../__pycache__/__init__.cpython-37.pyc | Bin 998 -> 0 bytes .../distlib/__pycache__/compat.cpython-37.pyc | Bin 32008 -> 0 bytes .../__pycache__/database.cpython-37.pyc | Bin 42529 -> 0 bytes .../distlib/__pycache__/index.cpython-37.pyc | Bin 17294 -> 0 bytes .../__pycache__/locators.cpython-37.pyc | Bin 38680 -> 0 bytes .../__pycache__/manifest.cpython-37.pyc | Bin 10246 -> 0 bytes .../__pycache__/markers.cpython-37.pyc | Bin 4432 -> 0 bytes .../__pycache__/metadata.cpython-37.pyc | Bin 27642 -> 0 bytes .../__pycache__/resources.cpython-37.pyc | Bin 10842 -> 0 bytes .../__pycache__/scripts.cpython-37.pyc | Bin 11032 -> 0 bytes .../distlib/__pycache__/util.cpython-37.pyc | Bin 47910 -> 0 bytes .../__pycache__/version.cpython-37.pyc | Bin 20382 -> 0 bytes .../distlib/__pycache__/wheel.cpython-37.pyc | Bin 25318 -> 0 bytes .../pip/_vendor/distlib/_backport/__init__.py | 6 - .../__pycache__/__init__.cpython-37.pyc | Bin 440 -> 0 bytes .../_backport/__pycache__/misc.cpython-37.pyc | Bin 1037 -> 0 bytes .../__pycache__/shutil.cpython-37.pyc | Bin 21353 -> 0 bytes .../__pycache__/sysconfig.cpython-37.pyc | Bin 15818 -> 0 bytes .../__pycache__/tarfile.cpython-37.pyc | Bin 62683 -> 0 bytes .../pip/_vendor/distlib/_backport/misc.py | 41 - .../pip/_vendor/distlib/_backport/shutil.py | 761 -- .../_vendor/distlib/_backport/sysconfig.cfg | 84 - .../_vendor/distlib/_backport/sysconfig.py | 788 -- .../pip/_vendor/distlib/_backport/tarfile.py | 2607 ------ .../pip/_vendor/distlib/compat.py | 1120 --- .../pip/_vendor/distlib/database.py | 1339 --- .../pip/_vendor/distlib/index.py | 516 -- .../pip/_vendor/distlib/locators.py | 1295 --- .../pip/_vendor/distlib/manifest.py | 393 - .../pip/_vendor/distlib/markers.py | 131 - .../pip/_vendor/distlib/metadata.py | 1094 --- .../pip/_vendor/distlib/resources.py | 355 - .../pip/_vendor/distlib/scripts.py | 417 - .../site-packages/pip/_vendor/distlib/t32.exe | Bin 92672 -> 0 bytes .../site-packages/pip/_vendor/distlib/t64.exe | Bin 102400 -> 0 bytes .../site-packages/pip/_vendor/distlib/util.py | 1756 ---- .../pip/_vendor/distlib/version.py | 736 -- .../site-packages/pip/_vendor/distlib/w32.exe | Bin 89088 -> 0 bytes .../site-packages/pip/_vendor/distlib/w64.exe | Bin 99328 -> 0 bytes .../pip/_vendor/distlib/wheel.py | 988 -- .../site-packages/pip/_vendor/distro.py | 1216 --- .../pip/_vendor/html5lib/__init__.py | 35 - .../__pycache__/__init__.cpython-37.pyc | Bin 1269 -> 0 bytes .../__pycache__/_ihatexml.cpython-37.pyc | Bin 13716 -> 0 bytes .../__pycache__/_inputstream.cpython-37.pyc | Bin 22607 -> 0 bytes .../__pycache__/_tokenizer.cpython-37.pyc | Bin 41508 -> 0 bytes .../__pycache__/_utils.cpython-37.pyc | Bin 3261 -> 0 bytes .../__pycache__/constants.cpython-37.pyc | Bin 66173 -> 0 bytes .../__pycache__/html5parser.cpython-37.pyc | Bin 97770 -> 0 bytes .../__pycache__/serializer.cpython-37.pyc | Bin 10786 -> 0 bytes .../pip/_vendor/html5lib/_ihatexml.py | 288 - .../pip/_vendor/html5lib/_inputstream.py | 923 -- .../pip/_vendor/html5lib/_tokenizer.py | 1721 ---- .../pip/_vendor/html5lib/_trie/__init__.py | 14 - .../_trie/__pycache__/__init__.cpython-37.pyc | Bin 382 -> 0 bytes .../_trie/__pycache__/_base.cpython-37.pyc | Bin 1465 -> 0 bytes .../_trie/__pycache__/datrie.cpython-37.pyc | Bin 1984 -> 0 bytes .../_trie/__pycache__/py.cpython-37.pyc | Bin 2187 -> 0 bytes .../pip/_vendor/html5lib/_trie/_base.py | 37 - .../pip/_vendor/html5lib/_trie/datrie.py | 44 - .../pip/_vendor/html5lib/_trie/py.py | 67 - .../pip/_vendor/html5lib/_utils.py | 124 - .../pip/_vendor/html5lib/constants.py | 2947 ------ .../pip/_vendor/html5lib/filters/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 157 -> 0 bytes .../alphabeticalattributes.cpython-37.pyc | Bin 1273 -> 0 bytes .../filters/__pycache__/base.cpython-37.pyc | Bin 807 -> 0 bytes .../inject_meta_charset.cpython-37.pyc | Bin 1827 -> 0 bytes .../filters/__pycache__/lint.cpython-37.pyc | Bin 2591 -> 0 bytes .../__pycache__/optionaltags.cpython-37.pyc | Bin 2718 -> 0 bytes .../__pycache__/sanitizer.cpython-37.pyc | Bin 16393 -> 0 bytes .../__pycache__/whitespace.cpython-37.pyc | Bin 1311 -> 0 bytes .../filters/alphabeticalattributes.py | 29 - .../pip/_vendor/html5lib/filters/base.py | 12 - .../html5lib/filters/inject_meta_charset.py | 73 - .../pip/_vendor/html5lib/filters/lint.py | 93 - .../_vendor/html5lib/filters/optionaltags.py | 207 - .../pip/_vendor/html5lib/filters/sanitizer.py | 896 -- .../_vendor/html5lib/filters/whitespace.py | 38 - .../pip/_vendor/html5lib/html5parser.py | 2791 ------ .../pip/_vendor/html5lib/serializer.py | 409 - .../_vendor/html5lib/treeadapters/__init__.py | 30 - .../__pycache__/__init__.cpython-37.pyc | Bin 896 -> 0 bytes .../__pycache__/genshi.cpython-37.pyc | Bin 1493 -> 0 bytes .../__pycache__/sax.cpython-37.pyc | Bin 1443 -> 0 bytes .../_vendor/html5lib/treeadapters/genshi.py | 54 - .../pip/_vendor/html5lib/treeadapters/sax.py | 50 - .../_vendor/html5lib/treebuilders/__init__.py | 88 - .../__pycache__/__init__.cpython-37.pyc | Bin 3277 -> 0 bytes .../__pycache__/base.cpython-37.pyc | Bin 11200 -> 0 bytes .../__pycache__/dom.cpython-37.pyc | Bin 9230 -> 0 bytes .../__pycache__/etree.cpython-37.pyc | Bin 11809 -> 0 bytes .../__pycache__/etree_lxml.cpython-37.pyc | Bin 11749 -> 0 bytes .../pip/_vendor/html5lib/treebuilders/base.py | 417 - .../pip/_vendor/html5lib/treebuilders/dom.py | 236 - .../_vendor/html5lib/treebuilders/etree.py | 340 - .../html5lib/treebuilders/etree_lxml.py | 366 - .../_vendor/html5lib/treewalkers/__init__.py | 154 - .../__pycache__/__init__.cpython-37.pyc | Bin 3954 -> 0 bytes .../__pycache__/base.cpython-37.pyc | Bin 6950 -> 0 bytes .../__pycache__/dom.cpython-37.pyc | Bin 1679 -> 0 bytes .../__pycache__/etree.cpython-37.pyc | Bin 3486 -> 0 bytes .../__pycache__/etree_lxml.cpython-37.pyc | Bin 6595 -> 0 bytes .../__pycache__/genshi.cpython-37.pyc | Bin 1853 -> 0 bytes .../pip/_vendor/html5lib/treewalkers/base.py | 252 - .../pip/_vendor/html5lib/treewalkers/dom.py | 43 - .../pip/_vendor/html5lib/treewalkers/etree.py | 130 - .../html5lib/treewalkers/etree_lxml.py | 213 - .../_vendor/html5lib/treewalkers/genshi.py | 69 - .../pip/_vendor/idna/__init__.py | 2 - .../idna/__pycache__/__init__.cpython-37.pyc | Bin 214 -> 0 bytes .../idna/__pycache__/codec.cpython-37.pyc | Bin 3021 -> 0 bytes .../idna/__pycache__/compat.cpython-37.pyc | Bin 574 -> 0 bytes .../idna/__pycache__/core.cpython-37.pyc | Bin 9017 -> 0 bytes .../idna/__pycache__/idnadata.cpython-37.pyc | Bin 21388 -> 0 bytes .../idna/__pycache__/intranges.cpython-37.pyc | Bin 1754 -> 0 bytes .../__pycache__/package_data.cpython-37.pyc | Bin 168 -> 0 bytes .../idna/__pycache__/uts46data.cpython-37.pyc | Bin 176048 -> 0 bytes .../site-packages/pip/_vendor/idna/codec.py | 118 - .../site-packages/pip/_vendor/idna/compat.py | 12 - .../site-packages/pip/_vendor/idna/core.py | 396 - .../pip/_vendor/idna/idnadata.py | 1979 ---- .../pip/_vendor/idna/intranges.py | 53 - .../pip/_vendor/idna/package_data.py | 2 - .../pip/_vendor/idna/uts46data.py | 8205 ----------------- .../site-packages/pip/_vendor/ipaddress.py | 2419 ----- .../pip/_vendor/lockfile/__init__.py | 347 - .../__pycache__/__init__.cpython-37.pyc | Bin 9864 -> 0 bytes .../__pycache__/linklockfile.cpython-37.pyc | Bin 2245 -> 0 bytes .../__pycache__/mkdirlockfile.cpython-37.pyc | Bin 2607 -> 0 bytes .../__pycache__/pidlockfile.cpython-37.pyc | Bin 4807 -> 0 bytes .../__pycache__/sqlitelockfile.cpython-37.pyc | Bin 3706 -> 0 bytes .../symlinklockfile.cpython-37.pyc | Bin 2130 -> 0 bytes .../pip/_vendor/lockfile/linklockfile.py | 73 - .../pip/_vendor/lockfile/mkdirlockfile.py | 84 - .../pip/_vendor/lockfile/pidlockfile.py | 190 - .../pip/_vendor/lockfile/sqlitelockfile.py | 156 - .../pip/_vendor/lockfile/symlinklockfile.py | 70 - .../pip/_vendor/msgpack/__init__.py | 66 - .../__pycache__/__init__.cpython-37.pyc | Bin 2026 -> 0 bytes .../__pycache__/_version.cpython-37.pyc | Bin 175 -> 0 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 2131 -> 0 bytes .../__pycache__/fallback.cpython-37.pyc | Bin 24503 -> 0 bytes .../pip/_vendor/msgpack/_version.py | 1 - .../pip/_vendor/msgpack/exceptions.py | 41 - .../pip/_vendor/msgpack/fallback.py | 977 -- .../pip/_vendor/packaging/__about__.py | 27 - .../pip/_vendor/packaging/__init__.py | 26 - .../__pycache__/__about__.cpython-37.pyc | Bin 688 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 526 -> 0 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 966 -> 0 bytes .../__pycache__/_structures.cpython-37.pyc | Bin 2818 -> 0 bytes .../__pycache__/markers.cpython-37.pyc | Bin 8821 -> 0 bytes .../__pycache__/requirements.cpython-37.pyc | Bin 3939 -> 0 bytes .../__pycache__/specifiers.cpython-37.pyc | Bin 19716 -> 0 bytes .../__pycache__/utils.cpython-37.pyc | Bin 1404 -> 0 bytes .../__pycache__/version.cpython-37.pyc | Bin 11908 -> 0 bytes .../pip/_vendor/packaging/_compat.py | 31 - .../pip/_vendor/packaging/_structures.py | 68 - .../pip/_vendor/packaging/markers.py | 296 - .../pip/_vendor/packaging/requirements.py | 138 - .../pip/_vendor/packaging/specifiers.py | 749 -- .../pip/_vendor/packaging/utils.py | 57 - .../pip/_vendor/packaging/version.py | 420 - .../pip/_vendor/pep517/__init__.py | 4 - .../__pycache__/__init__.cpython-37.pyc | Bin 239 -> 0 bytes .../__pycache__/_in_process.cpython-37.pyc | Bin 5582 -> 0 bytes .../pep517/__pycache__/check.cpython-37.pyc | Bin 4765 -> 0 bytes .../__pycache__/colorlog.cpython-37.pyc | Bin 2871 -> 0 bytes .../pep517/__pycache__/compat.cpython-37.pyc | Bin 975 -> 0 bytes .../__pycache__/envbuild.cpython-37.pyc | Bin 4159 -> 0 bytes .../__pycache__/wrappers.cpython-37.pyc | Bin 5440 -> 0 bytes .../pip/_vendor/pep517/_in_process.py | 207 - .../site-packages/pip/_vendor/pep517/check.py | 202 - .../pip/_vendor/pep517/colorlog.py | 115 - .../pip/_vendor/pep517/compat.py | 23 - .../pip/_vendor/pep517/envbuild.py | 158 - .../pip/_vendor/pep517/wrappers.py | 163 - .../pip/_vendor/pkg_resources/__init__.py | 3286 ------- .../__pycache__/__init__.cpython-37.pyc | Bin 99535 -> 0 bytes .../__pycache__/py31compat.cpython-37.pyc | Bin 599 -> 0 bytes .../pip/_vendor/pkg_resources/py31compat.py | 23 - .../pip/_vendor/progress/__init__.py | 177 - .../__pycache__/__init__.cpython-37.pyc | Bin 5515 -> 0 bytes .../progress/__pycache__/bar.cpython-37.pyc | Bin 2607 -> 0 bytes .../__pycache__/counter.cpython-37.pyc | Bin 1419 -> 0 bytes .../__pycache__/spinner.cpython-37.pyc | Bin 1384 -> 0 bytes .../site-packages/pip/_vendor/progress/bar.py | 91 - .../pip/_vendor/progress/counter.py | 41 - .../pip/_vendor/progress/spinner.py | 43 - .../site-packages/pip/_vendor/pyparsing.py | 6493 ------------- .../pip/_vendor/pytoml/__init__.py | 4 - .../__pycache__/__init__.cpython-37.pyc | Bin 333 -> 0 bytes .../pytoml/__pycache__/core.cpython-37.pyc | Bin 896 -> 0 bytes .../pytoml/__pycache__/parser.cpython-37.pyc | Bin 10013 -> 0 bytes .../pytoml/__pycache__/writer.cpython-37.pyc | Bin 3530 -> 0 bytes .../site-packages/pip/_vendor/pytoml/core.py | 13 - .../pip/_vendor/pytoml/parser.py | 341 - .../pip/_vendor/pytoml/writer.py | 106 - .../pip/_vendor/requests/__init__.py | 133 - .../__pycache__/__init__.cpython-37.pyc | Bin 3444 -> 0 bytes .../__pycache__/__version__.cpython-37.pyc | Bin 507 -> 0 bytes .../_internal_utils.cpython-37.pyc | Bin 1265 -> 0 bytes .../__pycache__/adapters.cpython-37.pyc | Bin 16842 -> 0 bytes .../requests/__pycache__/api.cpython-37.pyc | Bin 6448 -> 0 bytes .../requests/__pycache__/auth.cpython-37.pyc | Bin 8299 -> 0 bytes .../requests/__pycache__/certs.cpython-37.pyc | Bin 590 -> 0 bytes .../__pycache__/compat.cpython-37.pyc | Bin 1569 -> 0 bytes .../__pycache__/cookies.cpython-37.pyc | Bin 18744 -> 0 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 5462 -> 0 bytes .../requests/__pycache__/help.cpython-37.pyc | Bin 2643 -> 0 bytes .../requests/__pycache__/hooks.cpython-37.pyc | Bin 937 -> 0 bytes .../__pycache__/models.cpython-37.pyc | Bin 24065 -> 0 bytes .../__pycache__/packages.cpython-37.pyc | Bin 467 -> 0 bytes .../__pycache__/sessions.cpython-37.pyc | Bin 19385 -> 0 bytes .../__pycache__/status_codes.cpython-37.pyc | Bin 4123 -> 0 bytes .../__pycache__/structures.cpython-37.pyc | Bin 4336 -> 0 bytes .../requests/__pycache__/utils.cpython-37.pyc | Bin 21996 -> 0 bytes .../pip/_vendor/requests/__version__.py | 14 - .../pip/_vendor/requests/_internal_utils.py | 42 - .../pip/_vendor/requests/adapters.py | 533 -- .../site-packages/pip/_vendor/requests/api.py | 158 - .../pip/_vendor/requests/auth.py | 305 - .../pip/_vendor/requests/certs.py | 18 - .../pip/_vendor/requests/compat.py | 74 - .../pip/_vendor/requests/cookies.py | 549 -- .../pip/_vendor/requests/exceptions.py | 126 - .../pip/_vendor/requests/help.py | 119 - .../pip/_vendor/requests/hooks.py | 34 - .../pip/_vendor/requests/models.py | 953 -- .../pip/_vendor/requests/packages.py | 16 - .../pip/_vendor/requests/sessions.py | 770 -- .../pip/_vendor/requests/status_codes.py | 120 - .../pip/_vendor/requests/structures.py | 103 - .../pip/_vendor/requests/utils.py | 977 -- .../site-packages/pip/_vendor/retrying.py | 267 - .../site-packages/pip/_vendor/six.py | 952 -- .../pip/_vendor/urllib3/__init__.py | 92 - .../__pycache__/__init__.cpython-37.pyc | Bin 2072 -> 0 bytes .../__pycache__/_collections.cpython-37.pyc | Bin 10636 -> 0 bytes .../__pycache__/connection.cpython-37.pyc | Bin 10105 -> 0 bytes .../__pycache__/connectionpool.cpython-37.pyc | Bin 23610 -> 0 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 10357 -> 0 bytes .../urllib3/__pycache__/fields.cpython-37.pyc | Bin 5825 -> 0 bytes .../__pycache__/filepost.cpython-37.pyc | Bin 2717 -> 0 bytes .../__pycache__/poolmanager.cpython-37.pyc | Bin 12677 -> 0 bytes .../__pycache__/request.cpython-37.pyc | Bin 5539 -> 0 bytes .../__pycache__/response.cpython-37.pyc | Bin 18704 -> 0 bytes .../pip/_vendor/urllib3/_collections.py | 329 - .../pip/_vendor/urllib3/connection.py | 391 - .../pip/_vendor/urllib3/connectionpool.py | 896 -- .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 156 -> 0 bytes .../__pycache__/appengine.cpython-37.pyc | Bin 8271 -> 0 bytes .../__pycache__/ntlmpool.cpython-37.pyc | Bin 3198 -> 0 bytes .../__pycache__/pyopenssl.cpython-37.pyc | Bin 14434 -> 0 bytes .../securetransport.cpython-37.pyc | Bin 17853 -> 0 bytes .../contrib/__pycache__/socks.cpython-37.pyc | Bin 4862 -> 0 bytes .../contrib/_securetransport/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 173 -> 0 bytes .../__pycache__/bindings.cpython-37.pyc | Bin 10268 -> 0 bytes .../__pycache__/low_level.cpython-37.pyc | Bin 7449 -> 0 bytes .../contrib/_securetransport/bindings.py | 593 -- .../contrib/_securetransport/low_level.py | 346 - .../pip/_vendor/urllib3/contrib/appengine.py | 289 - .../pip/_vendor/urllib3/contrib/ntlmpool.py | 111 - .../pip/_vendor/urllib3/contrib/pyopenssl.py | 466 - .../urllib3/contrib/securetransport.py | 804 -- .../pip/_vendor/urllib3/contrib/socks.py | 192 - .../pip/_vendor/urllib3/exceptions.py | 246 - .../pip/_vendor/urllib3/fields.py | 178 - .../pip/_vendor/urllib3/filepost.py | 98 - .../pip/_vendor/urllib3/packages/__init__.py | 5 - .../__pycache__/__init__.cpython-37.pyc | Bin 270 -> 0 bytes .../packages/__pycache__/six.cpython-37.pyc | Bin 24358 -> 0 bytes .../urllib3/packages/backports/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 167 -> 0 bytes .../__pycache__/makefile.cpython-37.pyc | Bin 1261 -> 0 bytes .../urllib3/packages/backports/makefile.py | 53 - .../pip/_vendor/urllib3/packages/six.py | 868 -- .../packages/ssl_match_hostname/__init__.py | 19 - .../__pycache__/__init__.cpython-37.pyc | Bin 511 -> 0 bytes .../_implementation.cpython-37.pyc | Bin 3270 -> 0 bytes .../ssl_match_hostname/_implementation.py | 156 - .../pip/_vendor/urllib3/poolmanager.py | 450 - .../pip/_vendor/urllib3/request.py | 150 - .../pip/_vendor/urllib3/response.py | 705 -- .../pip/_vendor/urllib3/util/__init__.py | 54 - .../util/__pycache__/__init__.cpython-37.pyc | Bin 948 -> 0 bytes .../__pycache__/connection.cpython-37.pyc | Bin 3123 -> 0 bytes .../util/__pycache__/queue.cpython-37.pyc | Bin 997 -> 0 bytes .../util/__pycache__/request.cpython-37.pyc | Bin 3178 -> 0 bytes .../util/__pycache__/response.cpython-37.pyc | Bin 1926 -> 0 bytes .../util/__pycache__/retry.cpython-37.pyc | Bin 12612 -> 0 bytes .../util/__pycache__/ssl_.cpython-37.pyc | Bin 9504 -> 0 bytes .../util/__pycache__/timeout.cpython-37.pyc | Bin 8727 -> 0 bytes .../util/__pycache__/url.cpython-37.pyc | Bin 5137 -> 0 bytes .../util/__pycache__/wait.cpython-37.pyc | Bin 3089 -> 0 bytes .../pip/_vendor/urllib3/util/connection.py | 134 - .../pip/_vendor/urllib3/util/queue.py | 21 - .../pip/_vendor/urllib3/util/request.py | 118 - .../pip/_vendor/urllib3/util/response.py | 87 - .../pip/_vendor/urllib3/util/retry.py | 411 - .../pip/_vendor/urllib3/util/ssl_.py | 381 - .../pip/_vendor/urllib3/util/timeout.py | 242 - .../pip/_vendor/urllib3/util/url.py | 230 - .../pip/_vendor/urllib3/util/wait.py | 150 - .../pip/_vendor/webencodings/__init__.py | 342 - .../__pycache__/__init__.cpython-37.pyc | Bin 9632 -> 0 bytes .../__pycache__/labels.cpython-37.pyc | Bin 4046 -> 0 bytes .../__pycache__/mklabels.cpython-37.pyc | Bin 1868 -> 0 bytes .../__pycache__/tests.cpython-37.pyc | Bin 5009 -> 0 bytes .../__pycache__/x_user_defined.cpython-37.pyc | Bin 2621 -> 0 bytes .../pip/_vendor/webencodings/labels.py | 231 - .../pip/_vendor/webencodings/mklabels.py | 59 - .../pip/_vendor/webencodings/tests.py | 153 - .../_vendor/webencodings/x_user_defined.py | 325 - .../site-packages/pkg_resources/__init__.py | 3286 ------- .../__pycache__/__init__.cpython-37.pyc | Bin 99584 -> 0 bytes .../__pycache__/py31compat.cpython-37.pyc | Bin 594 -> 0 bytes .../pkg_resources/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 157 -> 0 bytes .../__pycache__/appdirs.cpython-37.pyc | Bin 20645 -> 0 bytes .../__pycache__/pyparsing.cpython-37.pyc | Bin 203000 -> 0 bytes .../_vendor/__pycache__/six.cpython-37.pyc | Bin 24358 -> 0 bytes .../pkg_resources/_vendor/appdirs.py | 608 -- .../_vendor/packaging/__about__.py | 21 - .../_vendor/packaging/__init__.py | 14 - .../__pycache__/__about__.cpython-37.pyc | Bin 693 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 531 -> 0 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 983 -> 0 bytes .../__pycache__/_structures.cpython-37.pyc | Bin 2835 -> 0 bytes .../__pycache__/markers.cpython-37.pyc | Bin 8843 -> 0 bytes .../__pycache__/requirements.cpython-37.pyc | Bin 3848 -> 0 bytes .../__pycache__/specifiers.cpython-37.pyc | Bin 19761 -> 0 bytes .../__pycache__/utils.cpython-37.pyc | Bin 462 -> 0 bytes .../__pycache__/version.cpython-37.pyc | Bin 10528 -> 0 bytes .../_vendor/packaging/_compat.py | 30 - .../_vendor/packaging/_structures.py | 68 - .../_vendor/packaging/markers.py | 301 - .../_vendor/packaging/requirements.py | 127 - .../_vendor/packaging/specifiers.py | 774 -- .../pkg_resources/_vendor/packaging/utils.py | 14 - .../_vendor/packaging/version.py | 393 - .../pkg_resources/_vendor/pyparsing.py | 5742 ------------ .../pkg_resources/_vendor/six.py | 868 -- .../pkg_resources/extern/__init__.py | 73 - .../__pycache__/__init__.cpython-37.pyc | Bin 2376 -> 0 bytes .../site-packages/pkg_resources/py31compat.py | 23 - .../site-packages/setuptools/__init__.py | 228 - .../__pycache__/__init__.cpython-37.pyc | Bin 7658 -> 0 bytes .../_deprecation_warning.cpython-37.pyc | Bin 512 -> 0 bytes .../__pycache__/archive_util.cpython-37.pyc | Bin 5093 -> 0 bytes .../__pycache__/build_meta.cpython-37.pyc | Bin 8251 -> 0 bytes .../__pycache__/config.cpython-37.pyc | Bin 17655 -> 0 bytes .../__pycache__/dep_util.cpython-37.pyc | Bin 819 -> 0 bytes .../__pycache__/depends.cpython-37.pyc | Bin 5228 -> 0 bytes .../__pycache__/dist.cpython-37.pyc | Bin 42051 -> 0 bytes .../__pycache__/extension.cpython-37.pyc | Bin 1939 -> 0 bytes .../__pycache__/glibc.cpython-37.pyc | Bin 1504 -> 0 bytes .../__pycache__/glob.cpython-37.pyc | Bin 3714 -> 0 bytes .../__pycache__/launch.cpython-37.pyc | Bin 818 -> 0 bytes .../__pycache__/lib2to3_ex.cpython-37.pyc | Bin 2397 -> 0 bytes .../__pycache__/monkey.cpython-37.pyc | Bin 4598 -> 0 bytes .../__pycache__/msvc.cpython-37.pyc | Bin 34395 -> 0 bytes .../__pycache__/namespaces.cpython-37.pyc | Bin 3576 -> 0 bytes .../__pycache__/package_index.cpython-37.pyc | Bin 32662 -> 0 bytes .../__pycache__/pep425tags.cpython-37.pyc | Bin 7166 -> 0 bytes .../__pycache__/py27compat.cpython-37.pyc | Bin 775 -> 0 bytes .../__pycache__/py31compat.cpython-37.pyc | Bin 1173 -> 0 bytes .../__pycache__/py33compat.cpython-37.pyc | Bin 1384 -> 0 bytes .../__pycache__/sandbox.cpython-37.pyc | Bin 15500 -> 0 bytes .../__pycache__/site-patch.cpython-37.pyc | Bin 1466 -> 0 bytes .../__pycache__/ssl_support.cpython-37.pyc | Bin 6756 -> 0 bytes .../__pycache__/unicode_utils.cpython-37.pyc | Bin 1133 -> 0 bytes .../__pycache__/version.cpython-37.pyc | Bin 292 -> 0 bytes .../__pycache__/wheel.cpython-37.pyc | Bin 6945 -> 0 bytes .../windows_support.cpython-37.pyc | Bin 975 -> 0 bytes .../setuptools/_deprecation_warning.py | 7 - .../setuptools/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 154 -> 0 bytes .../__pycache__/pyparsing.cpython-37.pyc | Bin 202997 -> 0 bytes .../_vendor/__pycache__/six.cpython-37.pyc | Bin 24355 -> 0 bytes .../setuptools/_vendor/packaging/__about__.py | 21 - .../setuptools/_vendor/packaging/__init__.py | 14 - .../__pycache__/__about__.cpython-37.pyc | Bin 690 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 528 -> 0 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 980 -> 0 bytes .../__pycache__/_structures.cpython-37.pyc | Bin 2832 -> 0 bytes .../__pycache__/markers.cpython-37.pyc | Bin 8837 -> 0 bytes .../__pycache__/requirements.cpython-37.pyc | Bin 3839 -> 0 bytes .../__pycache__/specifiers.cpython-37.pyc | Bin 19758 -> 0 bytes .../__pycache__/utils.cpython-37.pyc | Bin 459 -> 0 bytes .../__pycache__/version.cpython-37.pyc | Bin 10525 -> 0 bytes .../setuptools/_vendor/packaging/_compat.py | 30 - .../_vendor/packaging/_structures.py | 68 - .../setuptools/_vendor/packaging/markers.py | 301 - .../_vendor/packaging/requirements.py | 127 - .../_vendor/packaging/specifiers.py | 774 -- .../setuptools/_vendor/packaging/utils.py | 14 - .../setuptools/_vendor/packaging/version.py | 393 - .../setuptools/_vendor/pyparsing.py | 5742 ------------ .../site-packages/setuptools/_vendor/six.py | 868 -- .../site-packages/setuptools/archive_util.py | 173 - .../site-packages/setuptools/build_meta.py | 254 - .../site-packages/setuptools/cli-32.exe | Bin 65536 -> 0 bytes .../site-packages/setuptools/cli-64.exe | Bin 74752 -> 0 bytes .../site-packages/setuptools/cli.exe | Bin 65536 -> 0 bytes .../setuptools/command/__init__.py | 18 - .../__pycache__/__init__.cpython-37.pyc | Bin 700 -> 0 bytes .../command/__pycache__/alias.cpython-37.pyc | Bin 2368 -> 0 bytes .../__pycache__/bdist_egg.cpython-37.pyc | Bin 14156 -> 0 bytes .../__pycache__/bdist_rpm.cpython-37.pyc | Bin 1747 -> 0 bytes .../__pycache__/bdist_wininst.cpython-37.pyc | Bin 938 -> 0 bytes .../__pycache__/build_clib.cpython-37.pyc | Bin 2417 -> 0 bytes .../__pycache__/build_ext.cpython-37.pyc | Bin 9671 -> 0 bytes .../__pycache__/build_py.cpython-37.pyc | Bin 8547 -> 0 bytes .../__pycache__/develop.cpython-37.pyc | Bin 6428 -> 0 bytes .../__pycache__/dist_info.cpython-37.pyc | Bin 1343 -> 0 bytes .../__pycache__/easy_install.cpython-37.pyc | Bin 64799 -> 0 bytes .../__pycache__/egg_info.cpython-37.pyc | Bin 21645 -> 0 bytes .../__pycache__/install.cpython-37.pyc | Bin 3975 -> 0 bytes .../install_egg_info.cpython-37.pyc | Bin 2376 -> 0 bytes .../__pycache__/install_lib.cpython-37.pyc | Bin 4052 -> 0 bytes .../install_scripts.cpython-37.pyc | Bin 2255 -> 0 bytes .../__pycache__/py36compat.cpython-37.pyc | Bin 4588 -> 0 bytes .../__pycache__/register.cpython-37.pyc | Bin 745 -> 0 bytes .../command/__pycache__/rotate.cpython-37.pyc | Bin 2494 -> 0 bytes .../__pycache__/saveopts.cpython-37.pyc | Bin 889 -> 0 bytes .../command/__pycache__/sdist.cpython-37.pyc | Bin 6747 -> 0 bytes .../command/__pycache__/setopt.cpython-37.pyc | Bin 4487 -> 0 bytes .../command/__pycache__/test.cpython-37.pyc | Bin 8140 -> 0 bytes .../command/__pycache__/upload.cpython-37.pyc | Bin 5153 -> 0 bytes .../__pycache__/upload_docs.cpython-37.pyc | Bin 6098 -> 0 bytes .../site-packages/setuptools/command/alias.py | 80 - .../setuptools/command/bdist_egg.py | 502 - .../setuptools/command/bdist_rpm.py | 43 - .../setuptools/command/bdist_wininst.py | 21 - .../setuptools/command/build_clib.py | 98 - .../setuptools/command/build_ext.py | 321 - .../setuptools/command/build_py.py | 270 - .../setuptools/command/develop.py | 221 - .../setuptools/command/dist_info.py | 36 - .../setuptools/command/easy_install.py | 2342 ----- .../setuptools/command/egg_info.py | 717 -- .../setuptools/command/install.py | 125 - .../setuptools/command/install_egg_info.py | 62 - .../setuptools/command/install_lib.py | 121 - .../setuptools/command/install_scripts.py | 65 - .../setuptools/command/launcher manifest.xml | 15 - .../setuptools/command/py36compat.py | 136 - .../setuptools/command/register.py | 18 - .../setuptools/command/rotate.py | 66 - .../setuptools/command/saveopts.py | 22 - .../site-packages/setuptools/command/sdist.py | 221 - .../setuptools/command/setopt.py | 149 - .../site-packages/setuptools/command/test.py | 271 - .../setuptools/command/upload.py | 196 - .../setuptools/command/upload_docs.py | 206 - .../site-packages/setuptools/config.py | 656 -- .../site-packages/setuptools/dep_util.py | 23 - .../site-packages/setuptools/depends.py | 186 - .../site-packages/setuptools/dist.py | 1278 --- .../site-packages/setuptools/extension.py | 57 - .../setuptools/extern/__init__.py | 73 - .../__pycache__/__init__.cpython-37.pyc | Bin 2377 -> 0 bytes .../site-packages/setuptools/glibc.py | 86 - .../site-packages/setuptools/glob.py | 174 - .../site-packages/setuptools/gui-32.exe | Bin 65536 -> 0 bytes .../site-packages/setuptools/gui-64.exe | Bin 75264 -> 0 bytes .../site-packages/setuptools/gui.exe | Bin 65536 -> 0 bytes .../site-packages/setuptools/launch.py | 35 - .../site-packages/setuptools/lib2to3_ex.py | 62 - .../site-packages/setuptools/monkey.py | 179 - .../site-packages/setuptools/msvc.py | 1301 --- .../site-packages/setuptools/namespaces.py | 107 - .../site-packages/setuptools/package_index.py | 1136 --- .../site-packages/setuptools/pep425tags.py | 319 - .../site-packages/setuptools/py27compat.py | 28 - .../site-packages/setuptools/py31compat.py | 32 - .../site-packages/setuptools/py33compat.py | 55 - .../site-packages/setuptools/sandbox.py | 491 - .../setuptools/script (dev).tmpl | 6 - .../site-packages/setuptools/script.tmpl | 3 - .../site-packages/setuptools/site-patch.py | 74 - .../site-packages/setuptools/ssl_support.py | 260 - .../site-packages/setuptools/unicode_utils.py | 44 - .../site-packages/setuptools/version.py | 6 - .../site-packages/setuptools/wheel.py | 211 - .../setuptools/windows_support.py | 29 - .../python3.7/site-packages/wheel/__init__.py | 2 - .../python3.7/site-packages/wheel/__main__.py | 19 - .../wheel/__pycache__/__init__.cpython-37.pyc | Bin 158 -> 0 bytes .../wheel/__pycache__/__main__.cpython-37.pyc | Bin 551 -> 0 bytes .../__pycache__/bdist_wheel.cpython-37.pyc | Bin 10043 -> 0 bytes .../wheel/__pycache__/metadata.cpython-37.pyc | Bin 3734 -> 0 bytes .../__pycache__/pep425tags.cpython-37.pyc | Bin 4669 -> 0 bytes .../wheel/__pycache__/pkginfo.cpython-37.pyc | Bin 1529 -> 0 bytes .../wheel/__pycache__/util.cpython-37.pyc | Bin 1274 -> 0 bytes .../__pycache__/wheelfile.cpython-37.pyc | Bin 5429 -> 0 bytes .../site-packages/wheel/bdist_wheel.py | 372 - .../site-packages/wheel/cli/__init__.py | 88 - .../cli/__pycache__/__init__.cpython-37.pyc | Bin 3000 -> 0 bytes .../cli/__pycache__/convert.cpython-37.pyc | Bin 6169 -> 0 bytes .../wheel/cli/__pycache__/pack.cpython-37.pyc | Bin 2458 -> 0 bytes .../cli/__pycache__/unpack.cpython-37.pyc | Bin 903 -> 0 bytes .../site-packages/wheel/cli/convert.py | 269 - .../python3.7/site-packages/wheel/cli/pack.py | 58 - .../site-packages/wheel/cli/unpack.py | 25 - .../python3.7/site-packages/wheel/metadata.py | 141 - .../site-packages/wheel/pep425tags.py | 185 - .../python3.7/site-packages/wheel/pkginfo.py | 43 - env/lib/python3.7/site-packages/wheel/util.py | 46 - .../site-packages/wheel/wheelfile.py | 169 - env/lib/python3.7/site.py | 833 -- env/lib/python3.7/sre_compile.py | 1 - env/lib/python3.7/sre_constants.py | 1 - env/lib/python3.7/sre_parse.py | 1 - env/lib/python3.7/stat.py | 1 - env/lib/python3.7/struct.py | 1 - env/lib/python3.7/tarfile.py | 1 - env/lib/python3.7/tempfile.py | 1 - env/lib/python3.7/token.py | 1 - env/lib/python3.7/tokenize.py | 1 - env/lib/python3.7/types.py | 1 - env/lib/python3.7/warnings.py | 1 - env/lib/python3.7/weakref.py | 1 - 1140 files changed, 168934 deletions(-) delete mode 100644 env/bin/__pycache__/ipwhois_cli.cpython-37.pyc delete mode 100644 env/bin/__pycache__/ipwhois_utils_cli.cpython-37.pyc delete mode 100644 env/bin/activate delete mode 100644 env/bin/activate.csh delete mode 100644 env/bin/activate.fish delete mode 100644 env/bin/activate_this.py delete mode 100755 env/bin/easy_install delete mode 100755 env/bin/easy_install-3.7 delete mode 100644 env/bin/ipwhois_cli.py delete mode 100644 env/bin/ipwhois_utils_cli.py delete mode 100755 env/bin/pip delete mode 100755 env/bin/pip3 delete mode 100755 env/bin/pip3.7 delete mode 100755 env/bin/python delete mode 100755 env/bin/python-config delete mode 120000 env/bin/python3 delete mode 120000 env/bin/python3.7 delete mode 100755 env/bin/wheel delete mode 120000 env/include/python3.7m delete mode 120000 env/lib/python3.7/__future__.py delete mode 100644 env/lib/python3.7/__pycache__/__future__.cpython-37.pyc delete mode 100644 env/lib/python3.7/__pycache__/_bootlocale.cpython-37.pyc delete mode 100644 env/lib/python3.7/__pycache__/_collections_abc.cpython-37.pyc delete mode 100644 env/lib/python3.7/__pycache__/_weakrefset.cpython-37.pyc delete mode 100644 env/lib/python3.7/__pycache__/abc.cpython-37.pyc delete mode 100644 env/lib/python3.7/__pycache__/base64.cpython-37.pyc delete mode 100644 env/lib/python3.7/__pycache__/bisect.cpython-37.pyc delete mode 100644 env/lib/python3.7/__pycache__/codecs.cpython-37.pyc delete mode 100644 env/lib/python3.7/__pycache__/copy.cpython-37.pyc delete mode 100644 env/lib/python3.7/__pycache__/copyreg.cpython-37.pyc delete mode 100644 env/lib/python3.7/__pycache__/enum.cpython-37.pyc delete mode 100644 env/lib/python3.7/__pycache__/fnmatch.cpython-37.pyc delete mode 100644 env/lib/python3.7/__pycache__/functools.cpython-37.pyc delete mode 100644 env/lib/python3.7/__pycache__/genericpath.cpython-37.pyc delete mode 100644 env/lib/python3.7/__pycache__/hashlib.cpython-37.pyc delete mode 100644 env/lib/python3.7/__pycache__/heapq.cpython-37.pyc delete mode 100644 env/lib/python3.7/__pycache__/hmac.cpython-37.pyc delete mode 100644 env/lib/python3.7/__pycache__/imp.cpython-37.pyc delete mode 100644 env/lib/python3.7/__pycache__/io.cpython-37.pyc delete mode 100644 env/lib/python3.7/__pycache__/keyword.cpython-37.pyc delete mode 100644 env/lib/python3.7/__pycache__/linecache.cpython-37.pyc delete mode 100644 env/lib/python3.7/__pycache__/locale.cpython-37.pyc delete mode 100644 env/lib/python3.7/__pycache__/operator.cpython-37.pyc delete mode 100644 env/lib/python3.7/__pycache__/os.cpython-37.pyc delete mode 100644 env/lib/python3.7/__pycache__/posixpath.cpython-37.pyc delete mode 100644 env/lib/python3.7/__pycache__/random.cpython-37.pyc delete mode 100644 env/lib/python3.7/__pycache__/re.cpython-37.pyc delete mode 100644 env/lib/python3.7/__pycache__/reprlib.cpython-37.pyc delete mode 100644 env/lib/python3.7/__pycache__/shutil.cpython-37.pyc delete mode 100644 env/lib/python3.7/__pycache__/site.cpython-37.pyc delete mode 100644 env/lib/python3.7/__pycache__/sre_compile.cpython-37.pyc delete mode 100644 env/lib/python3.7/__pycache__/sre_constants.cpython-37.pyc delete mode 100644 env/lib/python3.7/__pycache__/sre_parse.cpython-37.pyc delete mode 100644 env/lib/python3.7/__pycache__/stat.cpython-37.pyc delete mode 100644 env/lib/python3.7/__pycache__/struct.cpython-37.pyc delete mode 100644 env/lib/python3.7/__pycache__/tarfile.cpython-37.pyc delete mode 100644 env/lib/python3.7/__pycache__/tempfile.cpython-37.pyc delete mode 100644 env/lib/python3.7/__pycache__/token.cpython-37.pyc delete mode 100644 env/lib/python3.7/__pycache__/tokenize.cpython-37.pyc delete mode 100644 env/lib/python3.7/__pycache__/types.cpython-37.pyc delete mode 100644 env/lib/python3.7/__pycache__/warnings.cpython-37.pyc delete mode 100644 env/lib/python3.7/__pycache__/weakref.cpython-37.pyc delete mode 120000 env/lib/python3.7/_bootlocale.py delete mode 120000 env/lib/python3.7/_collections_abc.py delete mode 120000 env/lib/python3.7/_dummy_thread.py delete mode 120000 env/lib/python3.7/_weakrefset.py delete mode 120000 env/lib/python3.7/abc.py delete mode 120000 env/lib/python3.7/base64.py delete mode 120000 env/lib/python3.7/bisect.py delete mode 120000 env/lib/python3.7/codecs.py delete mode 120000 env/lib/python3.7/collections delete mode 120000 env/lib/python3.7/config-3.7m-x86_64-linux-gnu delete mode 120000 env/lib/python3.7/copy.py delete mode 120000 env/lib/python3.7/copyreg.py delete mode 100644 env/lib/python3.7/distutils/__init__.py delete mode 100644 env/lib/python3.7/distutils/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/distutils/distutils.cfg delete mode 120000 env/lib/python3.7/encodings delete mode 120000 env/lib/python3.7/enum.py delete mode 120000 env/lib/python3.7/fnmatch.py delete mode 120000 env/lib/python3.7/functools.py delete mode 120000 env/lib/python3.7/genericpath.py delete mode 120000 env/lib/python3.7/hashlib.py delete mode 120000 env/lib/python3.7/heapq.py delete mode 120000 env/lib/python3.7/hmac.py delete mode 120000 env/lib/python3.7/imp.py delete mode 120000 env/lib/python3.7/importlib delete mode 120000 env/lib/python3.7/io.py delete mode 120000 env/lib/python3.7/keyword.py delete mode 120000 env/lib/python3.7/lib-dynload delete mode 120000 env/lib/python3.7/linecache.py delete mode 120000 env/lib/python3.7/locale.py delete mode 100644 env/lib/python3.7/no-global-site-packages.txt delete mode 120000 env/lib/python3.7/ntpath.py delete mode 120000 env/lib/python3.7/operator.py delete mode 100644 env/lib/python3.7/orig-prefix.txt delete mode 120000 env/lib/python3.7/os.py delete mode 120000 env/lib/python3.7/posixpath.py delete mode 120000 env/lib/python3.7/random.py delete mode 120000 env/lib/python3.7/re.py delete mode 120000 env/lib/python3.7/reprlib.py delete mode 120000 env/lib/python3.7/rlcompleter.py delete mode 120000 env/lib/python3.7/shutil.py delete mode 100644 env/lib/python3.7/site-packages/__pycache__/easy_install.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/__init__.py delete mode 100644 env/lib/python3.7/site-packages/dns/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/__pycache__/_compat.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/__pycache__/dnssec.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/__pycache__/e164.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/__pycache__/edns.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/__pycache__/entropy.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/__pycache__/exception.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/__pycache__/flags.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/__pycache__/grange.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/__pycache__/hash.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/__pycache__/inet.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/__pycache__/ipv4.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/__pycache__/ipv6.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/__pycache__/message.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/__pycache__/name.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/__pycache__/namedict.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/__pycache__/node.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/__pycache__/opcode.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/__pycache__/query.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/__pycache__/rcode.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/__pycache__/rdata.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/__pycache__/rdataclass.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/__pycache__/rdataset.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/__pycache__/rdatatype.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/__pycache__/renderer.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/__pycache__/resolver.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/__pycache__/reversename.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/__pycache__/rrset.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/__pycache__/set.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/__pycache__/tokenizer.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/__pycache__/tsig.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/__pycache__/tsigkeyring.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/__pycache__/ttl.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/__pycache__/update.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/__pycache__/version.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/__pycache__/wiredata.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/__pycache__/zone.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/_compat.py delete mode 100644 env/lib/python3.7/site-packages/dns/dnssec.py delete mode 100644 env/lib/python3.7/site-packages/dns/e164.py delete mode 100644 env/lib/python3.7/site-packages/dns/edns.py delete mode 100644 env/lib/python3.7/site-packages/dns/entropy.py delete mode 100644 env/lib/python3.7/site-packages/dns/exception.py delete mode 100644 env/lib/python3.7/site-packages/dns/flags.py delete mode 100644 env/lib/python3.7/site-packages/dns/grange.py delete mode 100644 env/lib/python3.7/site-packages/dns/hash.py delete mode 100644 env/lib/python3.7/site-packages/dns/inet.py delete mode 100644 env/lib/python3.7/site-packages/dns/ipv4.py delete mode 100644 env/lib/python3.7/site-packages/dns/ipv6.py delete mode 100644 env/lib/python3.7/site-packages/dns/message.py delete mode 100644 env/lib/python3.7/site-packages/dns/name.py delete mode 100644 env/lib/python3.7/site-packages/dns/namedict.py delete mode 100644 env/lib/python3.7/site-packages/dns/node.py delete mode 100644 env/lib/python3.7/site-packages/dns/opcode.py delete mode 100644 env/lib/python3.7/site-packages/dns/py.typed delete mode 100644 env/lib/python3.7/site-packages/dns/query.py delete mode 100644 env/lib/python3.7/site-packages/dns/rcode.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdata.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdataclass.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdataset.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdatatype.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/AFSDB.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/AVC.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/CAA.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/CDNSKEY.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/CDS.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/CERT.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/CNAME.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/CSYNC.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/DLV.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/DNAME.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/DNSKEY.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/DS.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/EUI48.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/EUI64.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/GPOS.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/HINFO.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/HIP.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/ISDN.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/LOC.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/MX.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/NS.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/NSEC.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/NSEC3.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/NSEC3PARAM.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/OPENPGPKEY.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/PTR.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/RP.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/RRSIG.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/RT.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/SOA.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/SPF.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/SSHFP.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/TLSA.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/TXT.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/URI.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/X25.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/__init__.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/AFSDB.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/AVC.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/CAA.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/CDNSKEY.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/CDS.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/CERT.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/CNAME.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/CSYNC.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/DLV.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/DNAME.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/DNSKEY.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/DS.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/EUI48.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/EUI64.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/GPOS.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/HINFO.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/HIP.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/ISDN.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/LOC.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/MX.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/NS.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/NSEC.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/NSEC3.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/NSEC3PARAM.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/OPENPGPKEY.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/PTR.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/RP.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/RRSIG.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/RT.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/SOA.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/SPF.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/SSHFP.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/TLSA.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/TXT.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/URI.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/X25.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/CH/A.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/CH/__init__.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/CH/__pycache__/A.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/CH/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/IN/A.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/IN/AAAA.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/IN/APL.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/IN/DHCID.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/IN/IPSECKEY.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/IN/KX.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/IN/NAPTR.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/IN/NSAP.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/IN/NSAP_PTR.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/IN/PX.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/IN/SRV.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/IN/WKS.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/IN/__init__.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/IN/__pycache__/A.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/IN/__pycache__/AAAA.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/IN/__pycache__/APL.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/IN/__pycache__/DHCID.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/IN/__pycache__/IPSECKEY.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/IN/__pycache__/KX.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/IN/__pycache__/NAPTR.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/IN/__pycache__/NSAP.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/IN/__pycache__/NSAP_PTR.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/IN/__pycache__/PX.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/IN/__pycache__/SRV.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/IN/__pycache__/WKS.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/IN/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/__init__.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/__pycache__/dnskeybase.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/__pycache__/dsbase.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/__pycache__/euibase.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/__pycache__/mxbase.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/__pycache__/nsbase.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/__pycache__/txtbase.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/dnskeybase.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/dsbase.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/euibase.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/mxbase.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/nsbase.py delete mode 100644 env/lib/python3.7/site-packages/dns/rdtypes/txtbase.py delete mode 100644 env/lib/python3.7/site-packages/dns/renderer.py delete mode 100644 env/lib/python3.7/site-packages/dns/resolver.py delete mode 100644 env/lib/python3.7/site-packages/dns/reversename.py delete mode 100644 env/lib/python3.7/site-packages/dns/rrset.py delete mode 100644 env/lib/python3.7/site-packages/dns/set.py delete mode 100644 env/lib/python3.7/site-packages/dns/tokenizer.py delete mode 100644 env/lib/python3.7/site-packages/dns/tsig.py delete mode 100644 env/lib/python3.7/site-packages/dns/tsigkeyring.py delete mode 100644 env/lib/python3.7/site-packages/dns/ttl.py delete mode 100644 env/lib/python3.7/site-packages/dns/update.py delete mode 100644 env/lib/python3.7/site-packages/dns/version.py delete mode 100644 env/lib/python3.7/site-packages/dns/wiredata.py delete mode 100644 env/lib/python3.7/site-packages/dns/zone.py delete mode 100644 env/lib/python3.7/site-packages/dnspython-1.16.0.dist-info/DESCRIPTION.rst delete mode 100644 env/lib/python3.7/site-packages/dnspython-1.16.0.dist-info/INSTALLER delete mode 100644 env/lib/python3.7/site-packages/dnspython-1.16.0.dist-info/LICENSE.txt delete mode 100644 env/lib/python3.7/site-packages/dnspython-1.16.0.dist-info/METADATA delete mode 100644 env/lib/python3.7/site-packages/dnspython-1.16.0.dist-info/RECORD delete mode 100644 env/lib/python3.7/site-packages/dnspython-1.16.0.dist-info/WHEEL delete mode 100644 env/lib/python3.7/site-packages/dnspython-1.16.0.dist-info/metadata.json delete mode 100644 env/lib/python3.7/site-packages/dnspython-1.16.0.dist-info/top_level.txt delete mode 100644 env/lib/python3.7/site-packages/easy_install.py delete mode 100644 env/lib/python3.7/site-packages/ipwhois/__init__.py delete mode 100644 env/lib/python3.7/site-packages/ipwhois/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/ipwhois/__pycache__/asn.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/ipwhois/__pycache__/exceptions.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/ipwhois/__pycache__/experimental.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/ipwhois/__pycache__/hr.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/ipwhois/__pycache__/ipwhois.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/ipwhois/__pycache__/net.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/ipwhois/__pycache__/nir.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/ipwhois/__pycache__/rdap.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/ipwhois/__pycache__/utils.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/ipwhois/__pycache__/whois.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/ipwhois/asn.py delete mode 100644 env/lib/python3.7/site-packages/ipwhois/data/iso_3166-1.csv delete mode 100644 env/lib/python3.7/site-packages/ipwhois/data/iso_3166-1_list_en.xml delete mode 100644 env/lib/python3.7/site-packages/ipwhois/exceptions.py delete mode 100644 env/lib/python3.7/site-packages/ipwhois/experimental.py delete mode 100644 env/lib/python3.7/site-packages/ipwhois/hr.py delete mode 100644 env/lib/python3.7/site-packages/ipwhois/ipwhois.py delete mode 100644 env/lib/python3.7/site-packages/ipwhois/net.py delete mode 100644 env/lib/python3.7/site-packages/ipwhois/nir.py delete mode 100644 env/lib/python3.7/site-packages/ipwhois/rdap.py delete mode 100644 env/lib/python3.7/site-packages/ipwhois/utils.py delete mode 100644 env/lib/python3.7/site-packages/ipwhois/whois.py delete mode 100644 env/lib/python3.7/site-packages/pip/__init__.py delete mode 100644 env/lib/python3.7/site-packages/pip/__main__.py delete mode 100644 env/lib/python3.7/site-packages/pip/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/__pycache__/__main__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/__init__.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/__pycache__/build_env.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/__pycache__/cache.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/__pycache__/configuration.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/__pycache__/download.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/__pycache__/exceptions.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/__pycache__/index.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/__pycache__/locations.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/__pycache__/pep425tags.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/__pycache__/pyproject.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/__pycache__/resolve.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/__pycache__/wheel.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/build_env.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/cache.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/cli/__init__.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/parser.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/cli/autocompletion.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/cli/base_command.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/cli/cmdoptions.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/cli/main_parser.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/cli/parser.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/cli/status_codes.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/commands/__init__.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/check.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/completion.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/download.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/hash.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/help.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/install.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/list.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/search.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/show.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/commands/check.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/commands/completion.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/commands/configuration.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/commands/download.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/commands/freeze.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/commands/hash.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/commands/help.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/commands/install.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/commands/list.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/commands/search.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/commands/show.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/commands/uninstall.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/commands/wheel.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/configuration.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/download.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/exceptions.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/index.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/locations.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/models/__init__.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/models/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/models/__pycache__/candidate.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/models/__pycache__/format_control.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/models/__pycache__/index.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/models/__pycache__/link.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/models/candidate.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/models/format_control.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/models/index.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/models/link.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/operations/__init__.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/check.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/operations/check.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/operations/freeze.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/operations/prepare.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/pep425tags.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/pyproject.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/req/__init__.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/req/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/req/__pycache__/constructors.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_file.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_install.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_set.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_tracker.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/req/constructors.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/req/req_file.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/req/req_install.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/req/req_set.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/req/req_tracker.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/req/req_uninstall.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/resolve.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/utils/__init__.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/compat.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/logging.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/misc.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/models.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/outdated.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/typing.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/ui.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/utils/appdirs.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/utils/compat.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/utils/deprecation.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/utils/encoding.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/utils/filesystem.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/utils/glibc.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/utils/hashes.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/utils/logging.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/utils/misc.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/utils/models.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/utils/outdated.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/utils/packaging.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/utils/setuptools_build.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/utils/temp_dir.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/utils/typing.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/utils/ui.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/vcs/__init__.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/git.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/vcs/bazaar.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/vcs/git.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/vcs/mercurial.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/vcs/subversion.py delete mode 100644 env/lib/python3.7/site-packages/pip/_internal/wheel.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/__init__.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/__pycache__/appdirs.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/__pycache__/distro.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/__pycache__/ipaddress.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/__pycache__/pyparsing.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/__pycache__/retrying.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/__pycache__/six.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/appdirs.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__init__.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/_cmd.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/adapter.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/cache.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__init__.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/compat.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/controller.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/filewrapper.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/heuristics.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/serialize.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/wrapper.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/certifi/__init__.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/certifi/__main__.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/certifi/cacert.pem delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/certifi/core.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/__init__.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/compat.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langcyrillicmodel.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/big5freq.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/big5prober.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/chardistribution.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/charsetgroupprober.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/charsetprober.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__init__.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/cli/chardetect.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/codingstatemachine.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/compat.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/cp949prober.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/enums.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/escprober.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/escsm.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/eucjpprober.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/euckrfreq.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/euckrprober.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/euctwfreq.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/euctwprober.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/gb2312freq.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/gb2312prober.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/hebrewprober.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/jisfreq.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/jpcntx.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/langbulgarianmodel.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/langcyrillicmodel.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/langgreekmodel.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/langhebrewmodel.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/langhungarianmodel.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/langthaimodel.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/langturkishmodel.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/latin1prober.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/mbcharsetprober.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/mbcsgroupprober.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/mbcssm.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/sbcharsetprober.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/sbcsgroupprober.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/sjisprober.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/universaldetector.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/utf8prober.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/chardet/version.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/colorama/__init__.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/colorama/ansi.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/colorama/ansitowin32.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/colorama/initialise.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/colorama/win32.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/colorama/winterm.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/distlib/__init__.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__init__.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/misc.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/misc.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/shutil.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/tarfile.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/distlib/compat.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/distlib/database.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/distlib/index.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/distlib/locators.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/distlib/manifest.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/distlib/markers.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/distlib/metadata.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/distlib/resources.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/distlib/scripts.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/distlib/t32.exe delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/distlib/t64.exe delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/distlib/util.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/distlib/version.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/distlib/w32.exe delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/distlib/w64.exe delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/distlib/wheel.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/distro.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/__init__.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_inputstream.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_utils.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/constants.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/html5parser.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/serializer.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/_ihatexml.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/_inputstream.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/_tokenizer.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__init__.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/datrie.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/py.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/_base.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/datrie.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/py.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/_utils.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/constants.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__init__.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/base.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/lint.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/base.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/lint.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/optionaltags.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/sanitizer.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/whitespace.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/html5parser.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/serializer.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/genshi.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/sax.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/base.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/dom.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/etree.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree_lxml.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/genshi.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/base.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/dom.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/etree.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/idna/__init__.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/core.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/idna/codec.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/idna/compat.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/idna/core.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/idna/idnadata.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/idna/intranges.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/idna/package_data.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/idna/uts46data.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/ipaddress.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/lockfile/__init__.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/linklockfile.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/mkdirlockfile.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/pidlockfile.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/sqlitelockfile.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/symlinklockfile.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/lockfile/linklockfile.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/lockfile/mkdirlockfile.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/lockfile/pidlockfile.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/lockfile/sqlitelockfile.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/lockfile/symlinklockfile.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/msgpack/__init__.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/_version.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/msgpack/_version.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/msgpack/exceptions.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/msgpack/fallback.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/packaging/__about__.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/packaging/__init__.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/_compat.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/packaging/_compat.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/packaging/_structures.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/packaging/markers.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/packaging/requirements.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/packaging/specifiers.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/packaging/utils.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/packaging/version.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/pep517/__init__.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/_in_process.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/check.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/colorlog.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/compat.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/envbuild.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/wrappers.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/pep517/_in_process.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/pep517/check.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/pep517/colorlog.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/pep517/compat.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/pep517/envbuild.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/pep517/wrappers.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__init__.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/pkg_resources/py31compat.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/progress/__init__.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/bar.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/counter.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/spinner.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/progress/bar.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/progress/counter.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/progress/spinner.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/pyparsing.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/pytoml/__init__.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/core.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/parser.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/writer.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/pytoml/core.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/pytoml/parser.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/pytoml/writer.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/requests/__init__.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/api.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/help.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/models.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/requests/__version__.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/requests/_internal_utils.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/requests/adapters.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/requests/api.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/requests/auth.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/requests/certs.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/requests/compat.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/requests/cookies.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/requests/exceptions.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/requests/help.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/requests/hooks.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/requests/models.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/requests/packages.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/requests/sessions.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/requests/status_codes.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/requests/structures.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/requests/utils.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/retrying.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/six.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/__init__.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/_collections.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/connection.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/connectionpool.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__init__.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/appengine.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/securetransport.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/socks.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/exceptions.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/fields.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/filepost.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__init__.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/six.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/poolmanager.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/request.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/response.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__init__.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/connection.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/queue.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/request.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/response.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/retry.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/ssl_.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/timeout.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/url.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/wait.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/webencodings/__init__.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/webencodings/labels.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/webencodings/mklabels.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/webencodings/tests.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/webencodings/x_user_defined.py delete mode 100644 env/lib/python3.7/site-packages/pkg_resources/__init__.py delete mode 100644 env/lib/python3.7/site-packages/pkg_resources/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pkg_resources/__pycache__/py31compat.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pkg_resources/_vendor/__init__.py delete mode 100644 env/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/pyparsing.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/six.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pkg_resources/_vendor/appdirs.py delete mode 100644 env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__about__.py delete mode 100644 env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__init__.py delete mode 100644 env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/_compat.py delete mode 100644 env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/_structures.py delete mode 100644 env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/markers.py delete mode 100644 env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/requirements.py delete mode 100644 env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/specifiers.py delete mode 100644 env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/utils.py delete mode 100644 env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/version.py delete mode 100644 env/lib/python3.7/site-packages/pkg_resources/_vendor/pyparsing.py delete mode 100644 env/lib/python3.7/site-packages/pkg_resources/_vendor/six.py delete mode 100644 env/lib/python3.7/site-packages/pkg_resources/extern/__init__.py delete mode 100644 env/lib/python3.7/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pkg_resources/py31compat.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/__init__.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/__pycache__/archive_util.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/__pycache__/build_meta.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/__pycache__/config.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/__pycache__/dep_util.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/__pycache__/depends.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/__pycache__/dist.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/__pycache__/extension.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/__pycache__/glibc.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/__pycache__/glob.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/__pycache__/launch.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/__pycache__/lib2to3_ex.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/__pycache__/monkey.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/__pycache__/msvc.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/__pycache__/namespaces.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/__pycache__/package_index.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/__pycache__/pep425tags.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/__pycache__/py27compat.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/__pycache__/py31compat.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/__pycache__/py33compat.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/__pycache__/sandbox.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/__pycache__/site-patch.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/__pycache__/ssl_support.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/__pycache__/unicode_utils.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/__pycache__/version.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/__pycache__/wheel.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/__pycache__/windows_support.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/_deprecation_warning.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/_vendor/__init__.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/pyparsing.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/six.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/_vendor/packaging/__about__.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/_vendor/packaging/__init__.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/_compat.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/_vendor/packaging/_compat.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/_vendor/packaging/_structures.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/_vendor/packaging/markers.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/_vendor/packaging/requirements.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/_vendor/packaging/specifiers.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/_vendor/packaging/utils.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/_vendor/packaging/version.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/_vendor/pyparsing.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/_vendor/six.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/archive_util.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/build_meta.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/cli-32.exe delete mode 100644 env/lib/python3.7/site-packages/setuptools/cli-64.exe delete mode 100644 env/lib/python3.7/site-packages/setuptools/cli.exe delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/__init__.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/__pycache__/alias.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_wininst.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/__pycache__/build_clib.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/__pycache__/build_ext.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/__pycache__/build_py.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/__pycache__/develop.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/__pycache__/dist_info.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/__pycache__/easy_install.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/__pycache__/egg_info.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/__pycache__/install.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/__pycache__/install_lib.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/__pycache__/install_scripts.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/__pycache__/py36compat.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/__pycache__/register.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/__pycache__/rotate.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/__pycache__/saveopts.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/__pycache__/sdist.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/__pycache__/setopt.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/__pycache__/test.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/__pycache__/upload.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/__pycache__/upload_docs.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/alias.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/bdist_egg.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/bdist_rpm.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/bdist_wininst.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/build_clib.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/build_ext.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/build_py.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/develop.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/dist_info.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/easy_install.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/egg_info.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/install.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/install_egg_info.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/install_lib.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/install_scripts.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/launcher manifest.xml delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/py36compat.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/register.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/rotate.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/saveopts.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/sdist.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/setopt.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/test.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/upload.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/command/upload_docs.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/config.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/dep_util.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/depends.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/dist.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/extension.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/extern/__init__.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/extern/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/glibc.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/glob.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/gui-32.exe delete mode 100644 env/lib/python3.7/site-packages/setuptools/gui-64.exe delete mode 100644 env/lib/python3.7/site-packages/setuptools/gui.exe delete mode 100644 env/lib/python3.7/site-packages/setuptools/launch.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/lib2to3_ex.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/monkey.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/msvc.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/namespaces.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/package_index.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/pep425tags.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/py27compat.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/py31compat.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/py33compat.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/sandbox.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/script (dev).tmpl delete mode 100644 env/lib/python3.7/site-packages/setuptools/script.tmpl delete mode 100644 env/lib/python3.7/site-packages/setuptools/site-patch.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/ssl_support.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/unicode_utils.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/version.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/wheel.py delete mode 100644 env/lib/python3.7/site-packages/setuptools/windows_support.py delete mode 100644 env/lib/python3.7/site-packages/wheel/__init__.py delete mode 100644 env/lib/python3.7/site-packages/wheel/__main__.py delete mode 100644 env/lib/python3.7/site-packages/wheel/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/wheel/__pycache__/__main__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/wheel/__pycache__/bdist_wheel.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/wheel/__pycache__/metadata.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/wheel/__pycache__/pep425tags.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/wheel/__pycache__/pkginfo.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/wheel/__pycache__/util.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/wheel/__pycache__/wheelfile.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/wheel/bdist_wheel.py delete mode 100644 env/lib/python3.7/site-packages/wheel/cli/__init__.py delete mode 100644 env/lib/python3.7/site-packages/wheel/cli/__pycache__/__init__.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/wheel/cli/__pycache__/convert.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/wheel/cli/__pycache__/pack.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/wheel/cli/__pycache__/unpack.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/wheel/cli/convert.py delete mode 100644 env/lib/python3.7/site-packages/wheel/cli/pack.py delete mode 100644 env/lib/python3.7/site-packages/wheel/cli/unpack.py delete mode 100644 env/lib/python3.7/site-packages/wheel/metadata.py delete mode 100644 env/lib/python3.7/site-packages/wheel/pep425tags.py delete mode 100644 env/lib/python3.7/site-packages/wheel/pkginfo.py delete mode 100644 env/lib/python3.7/site-packages/wheel/util.py delete mode 100644 env/lib/python3.7/site-packages/wheel/wheelfile.py delete mode 100644 env/lib/python3.7/site.py delete mode 120000 env/lib/python3.7/sre_compile.py delete mode 120000 env/lib/python3.7/sre_constants.py delete mode 120000 env/lib/python3.7/sre_parse.py delete mode 120000 env/lib/python3.7/stat.py delete mode 120000 env/lib/python3.7/struct.py delete mode 120000 env/lib/python3.7/tarfile.py delete mode 120000 env/lib/python3.7/tempfile.py delete mode 120000 env/lib/python3.7/token.py delete mode 120000 env/lib/python3.7/tokenize.py delete mode 120000 env/lib/python3.7/types.py delete mode 120000 env/lib/python3.7/warnings.py delete mode 120000 env/lib/python3.7/weakref.py diff --git a/env/bin/__pycache__/ipwhois_cli.cpython-37.pyc b/env/bin/__pycache__/ipwhois_cli.cpython-37.pyc deleted file mode 100644 index 791b2c65c7bda92e518bf4680e1912b6af9ece61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29555 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 diff --git a/env/bin/__pycache__/ipwhois_utils_cli.cpython-37.pyc b/env/bin/__pycache__/ipwhois_utils_cli.cpython-37.pyc deleted file mode 100644 index c64fd7be3f67941b50474ba8404cebdc28a80721..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4445 zcmbtX%~Kr56`!6jmR-JtJ^+2T)D5RhYQWYyMayMclEQqL^X z4%*}(AAB%X}*FYwVPA5&AQ91>r2O>)v9mDfG99|#>Bd8z5?dHwpm z-+S-ZZ$j+rQ z+#x$pmCYmIHBa8@kX{g)qvT>!wm(QNHIQ+X9tE6Z;J?uHzkjSD8OQ1IO>GacTl56g z_?$>15_xwQy+BCX)7;NNro;NH+9uWcoUe;}Kj?jLS2l*|337RV7-S=$_l)+C;)vwR zq(o2Bp%>`&J*nP4=#3|OWMcmm9crM4&V7C$xwln`p5DrWwf`W=ID@1p4?ZTrM-RCI z-o;KjK+n8D4JFw_5JAS7hi5*N9)Rx;r9IXC20V4`$?VUy$F%E(BydipIAw<4fO7=2 zuN}lirpeWhB`VXibZGxvLwW&u*~blO9%g`8eGRe9zW5G^uK?ondkR~r{X!tl(>#~( zjPJkGfKkLS(~9Anju=uskzJYnw;cs!_H~pByZhEC757u{k=aw(eC_u%!{<%L0JtAhKO;)s+q_UfD9kJ~G4m@=4X>0}}?&kAD5v%Mk9TBVSmj@yi`U0iOe$z(zts++0 zR|g{Qw8iV6o}oh#Yi#1JBS!8Y0c{o{{<`*4dVyy7lZg3;ye|kA-bgE=vCRXqj=-+x zZCt><^n|u*p|P*N1F}BAlH1eS-)mpe9G?qZKY~s?v@RK=&o-MUmE0uneJqh%WOi4X zmmV#DBpVlvOLTO9jNDGK>+B*RolDtt5v+}XqMrQXGM=5EUs+gP%|};Pd3vx-O=7w0SfmN8Vro`4 zuvZCbh`lvzx_EJUdm5)vmI`XDhBcqYnrpK4AntN#Xl|P55x##P1 z&Fo_n&n?ccU}n1ObSx;~HRd@W3__EI;EiBN3b<@JjQWekgSE;Ap~q-BWK|l?E>%On z3L7zj(nI(rtKo|0hNk86s1{e3%2SgwGsQ`e@?!H<$QBMg?3xY@N(DLAO|g|7=TLh) z-PNML{M^#}_wKJez;jFU3;C#&It({xr*UozuXzlBbowbpN78DvnH1fg+n|*#Y#mB2 zh9al@!(&hh69cg*+oq(MjU;V_rrAz{9x^-A+Vp>!eU0W(Hotg(VP*FAT?qcYyH*h5 zL<3WsI@Aq=q=J^q%U}T~&Br#qjQs>UuK`b$$IoXe8Y~tMotj+!&f?t#ygYmVC;8~X zDm5AK4``QIT(h_}`YdF;NbdUOB)?+D*%DM8$7EI{iVZ{^2e!5%r@^>O!>1nG3QAF5 zS~*V~lOW0hRXy8-y);@{T*Cnkx$#5-1mUO?a#aIvefHk!VhOKqcvYKVZj&Dt$Ag6U z&{m-K4(xUV&*r2;aaVd`3bN5F$X!kaMh+O>e2B((ChB*9nFQ}l){~?0*!C)0kXB&R z*v^&uWxO+0FYHX$uV;6z)>$8rG?p0u3W!lQ8i4%^jCl;UU&o-%_*X!5_JG+|pM!O< zGF7kee!zbUT=20V&A}C%hGAWLEO5vMEGV&DnuyU>jJE$IF$_jt{d_!h{Bhs%iehJL&6@Y(WNETA zQ6gq&jwd}VXfBm`!wbq4+ba3BSJ@jjkgwu7{>|TVu)MG663fFaDgvsXnIZ6IO{9{i zuJaf|9szMP_-F*wdA8f)qE(VBy_31Mdajgm+||gVSVF z(OUz?>lLe;f#({%DF;fTz>LSwR6b~Y;B;hNe8}*j8-`frhcE7%W$RVmbC$Vz7VE+d zi+cb@8N7z6^#Ibu-{C+8Cy2W_C&bjqwO?N~qq}t$W3B4@ z5QWNl9V>8P*jXO%IUcZX!W#T{ppmNM2OWjRTqUix/dev/null 2>&1 - - # reset old environment variables - # ! [ -z ${VAR+_} ] returns true if VAR is declared at all - if ! [ -z "${_OLD_VIRTUAL_PATH+_}" ] ; then - PATH="$_OLD_VIRTUAL_PATH" - export PATH - unset _OLD_VIRTUAL_PATH - fi - if ! [ -z "${_OLD_VIRTUAL_PYTHONHOME+_}" ] ; then - PYTHONHOME="$_OLD_VIRTUAL_PYTHONHOME" - export PYTHONHOME - unset _OLD_VIRTUAL_PYTHONHOME - fi - - # This should detect bash and zsh, which have a hash command that must - # be called to get it to forget past commands. Without forgetting - # past commands the $PATH changes we made may not be respected - if [ -n "${BASH-}" ] || [ -n "${ZSH_VERSION-}" ] ; then - hash -r 2>/dev/null - fi - - if ! [ -z "${_OLD_VIRTUAL_PS1+_}" ] ; then - PS1="$_OLD_VIRTUAL_PS1" - export PS1 - unset _OLD_VIRTUAL_PS1 - fi - - unset VIRTUAL_ENV - if [ ! "${1-}" = "nondestructive" ] ; then - # Self destruct! - unset -f deactivate - fi -} - -# unset irrelevant variables -deactivate nondestructive - -VIRTUAL_ENV="/home/ben/Documents/Projects/Python/PyGeoIP/env" -export VIRTUAL_ENV - -_OLD_VIRTUAL_PATH="$PATH" -PATH="$VIRTUAL_ENV/bin:$PATH" -export PATH - -# unset PYTHONHOME if set -if ! [ -z "${PYTHONHOME+_}" ] ; then - _OLD_VIRTUAL_PYTHONHOME="$PYTHONHOME" - unset PYTHONHOME -fi - -if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT-}" ] ; then - _OLD_VIRTUAL_PS1="$PS1" - if [ "x" != x ] ; then - PS1="$PS1" - else - PS1="(`basename \"$VIRTUAL_ENV\"`) $PS1" - fi - export PS1 -fi - -# Make sure to unalias pydoc if it's already there -alias pydoc 2>/dev/null >/dev/null && unalias pydoc - -pydoc () { - python -m pydoc "$@" -} - -# This should detect bash and zsh, which have a hash command that must -# be called to get it to forget past commands. Without forgetting -# past commands the $PATH changes we made may not be respected -if [ -n "${BASH-}" ] || [ -n "${ZSH_VERSION-}" ] ; then - hash -r 2>/dev/null -fi diff --git a/env/bin/activate.csh b/env/bin/activate.csh deleted file mode 100644 index fd87dd3..0000000 --- a/env/bin/activate.csh +++ /dev/null @@ -1,42 +0,0 @@ -# This file must be used with "source bin/activate.csh" *from csh*. -# You cannot run it directly. -# Created by Davide Di Blasi . - -set newline='\ -' - -alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH:q" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT:q" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; test "\!:*" != "nondestructive" && unalias deactivate && unalias pydoc' - -# Unset irrelevant variables. -deactivate nondestructive - -setenv VIRTUAL_ENV "/home/ben/Documents/Projects/Python/PyGeoIP/env" - -set _OLD_VIRTUAL_PATH="$PATH:q" -setenv PATH "$VIRTUAL_ENV:q/bin:$PATH:q" - - - -if ("" != "") then - set env_name = "" -else - set env_name = "$VIRTUAL_ENV:t:q" -endif - -# Could be in a non-interactive environment, -# in which case, $prompt is undefined and we wouldn't -# care about the prompt anyway. -if ( $?prompt ) then - set _OLD_VIRTUAL_PROMPT="$prompt:q" -if ( "$prompt:q" =~ *"$newline:q"* ) then - : -else - set prompt = "[$env_name:q] $prompt:q" -endif -endif - -unset env_name - -alias pydoc python -m pydoc - -rehash diff --git a/env/bin/activate.fish b/env/bin/activate.fish deleted file mode 100644 index 1a9b2b7..0000000 --- a/env/bin/activate.fish +++ /dev/null @@ -1,76 +0,0 @@ -# This file must be used using `source bin/activate.fish` *within a running fish ( http://fishshell.com ) session*. -# Do not run it directly. - -function deactivate -d 'Exit virtualenv mode and return to the normal environment.' - # reset old environment variables - if test -n "$_OLD_VIRTUAL_PATH" - set -gx PATH $_OLD_VIRTUAL_PATH - set -e _OLD_VIRTUAL_PATH - end - - if test -n "$_OLD_VIRTUAL_PYTHONHOME" - set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME - set -e _OLD_VIRTUAL_PYTHONHOME - end - - if test -n "$_OLD_FISH_PROMPT_OVERRIDE" - # Set an empty local `$fish_function_path` to allow the removal of `fish_prompt` using `functions -e`. - set -l fish_function_path - - # Erase virtualenv's `fish_prompt` and restore the original. - functions -e fish_prompt - functions -c _old_fish_prompt fish_prompt - functions -e _old_fish_prompt - set -e _OLD_FISH_PROMPT_OVERRIDE - end - - set -e VIRTUAL_ENV - - if test "$argv[1]" != 'nondestructive' - # Self-destruct! - functions -e pydoc - functions -e deactivate - end -end - -# Unset irrelevant variables. -deactivate nondestructive - -set -gx VIRTUAL_ENV "/home/ben/Documents/Projects/Python/PyGeoIP/env" - -set -gx _OLD_VIRTUAL_PATH $PATH -set -gx PATH "$VIRTUAL_ENV/bin" $PATH - -# Unset `$PYTHONHOME` if set. -if set -q PYTHONHOME - set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME - set -e PYTHONHOME -end - -function pydoc - python -m pydoc $argv -end - -if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" - # Copy the current `fish_prompt` function as `_old_fish_prompt`. - functions -c fish_prompt _old_fish_prompt - - function fish_prompt - # Save the current $status, for fish_prompts that display it. - set -l old_status $status - - # Prompt override provided? - # If not, just prepend the environment name. - if test -n "" - printf '%s%s' "" (set_color normal) - else - printf '%s(%s) ' (set_color normal) (basename "$VIRTUAL_ENV") - end - - # Restore the original $status - echo "exit $old_status" | source - _old_fish_prompt - end - - set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" -end diff --git a/env/bin/activate_this.py b/env/bin/activate_this.py deleted file mode 100644 index 444d3fd..0000000 --- a/env/bin/activate_this.py +++ /dev/null @@ -1,36 +0,0 @@ -"""By using execfile(this_file, dict(__file__=this_file)) you will -activate this virtualenv environment. - -This can be used when you must use an existing Python interpreter, not -the virtualenv bin/python -""" - -try: - __file__ -except NameError: - raise AssertionError( - "You must run this like execfile('path/to/activate_this.py', dict(__file__='path/to/activate_this.py'))" - ) -import os -import site -import sys - -old_os_path = os.environ.get("PATH", "") -os.environ["PATH"] = os.path.dirname(os.path.abspath(__file__)) + os.pathsep + old_os_path -base = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) -if sys.platform == "win32": - site_packages = os.path.join(base, "Lib", "site-packages") -else: - site_packages = os.path.join(base, "lib", "python%s" % sys.version[:3], "site-packages") -prev_sys_path = list(sys.path) - -site.addsitedir(site_packages) -sys.real_prefix = sys.prefix -sys.prefix = base -# Move the added items to the front of the path: -new_sys_path = [] -for item in list(sys.path): - if item not in prev_sys_path: - new_sys_path.append(item) - sys.path.remove(item) -sys.path[:0] = new_sys_path diff --git a/env/bin/easy_install b/env/bin/easy_install deleted file mode 100755 index b3bbf71..0000000 --- a/env/bin/easy_install +++ /dev/null @@ -1,11 +0,0 @@ -#!/home/ben/Documents/Projects/Python/PyGeoIP/env/bin/python - -# -*- coding: utf-8 -*- -import re -import sys - -from setuptools.command.easy_install import main - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/env/bin/easy_install-3.7 b/env/bin/easy_install-3.7 deleted file mode 100755 index b3bbf71..0000000 --- a/env/bin/easy_install-3.7 +++ /dev/null @@ -1,11 +0,0 @@ -#!/home/ben/Documents/Projects/Python/PyGeoIP/env/bin/python - -# -*- coding: utf-8 -*- -import re -import sys - -from setuptools.command.easy_install import main - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/env/bin/ipwhois_cli.py b/env/bin/ipwhois_cli.py deleted file mode 100644 index 7acd95e..0000000 --- a/env/bin/ipwhois_cli.py +++ /dev/null @@ -1,1515 +0,0 @@ -# Copyright (c) 2013-2019 Philip Hane -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. - -# CLI python script interface for ipwhois.IPWhois lookups. - -import argparse -import json -from os import path -from ipwhois import IPWhois -from ipwhois.hr import (HR_ASN, HR_RDAP, HR_RDAP_COMMON, HR_WHOIS, - HR_WHOIS_NIR) - -try: # pragma: no cover - from urllib.request import (ProxyHandler, - build_opener) -except ImportError: # pragma: no cover - from urllib2 import (ProxyHandler, - build_opener) - -# CLI ANSI rendering -ANSI = { - 'end': '\033[0m', - 'b': '\033[1m', - 'ul': '\033[4m', - 'red': '\033[31m', - 'green': '\033[32m', - 'yellow': '\033[33m', - 'cyan': '\033[36m' -} - -# Color definitions for sub lines -COLOR_DEPTH = { - '0': ANSI['green'], - '1': ANSI['yellow'], - '2': ANSI['red'], - '3': ANSI['cyan'] -} - -# Line formatting, keys ending in C are colorized versions. -LINES = { - '1': '>> ', - '2': '>> >>> ', - '3': '>> >>> >>>> ', - '4': '>> >>> >>>> >>>>> ', - '1C': '{0}>>{1} '.format(COLOR_DEPTH['0'], ANSI['end']), - '2C': '{0}>>{1} >>>{2} '.format( - COLOR_DEPTH['0'], COLOR_DEPTH['1'], ANSI['end'] - ), - '3C': '{0}>>{1} >>>{2} >>>>{3} '.format( - COLOR_DEPTH['0'], COLOR_DEPTH['1'], COLOR_DEPTH['2'], ANSI['end'] - ), - '4C': '{0}>>{1} >>>{2} >>>>{3} >>>>>{4} '.format( - COLOR_DEPTH['0'], COLOR_DEPTH['1'], COLOR_DEPTH['2'], COLOR_DEPTH['3'], - ANSI['end'] - ), -} - -# Setup the arg parser. -parser = argparse.ArgumentParser( - description='ipwhois CLI interface' -) -parser.add_argument( - '--whois', - action='store_true', - help='Retrieve whois data via legacy Whois (port 43) instead of RDAP ' - '(default).' -) -parser.add_argument( - '--exclude_nir', - action='store_true', - help='Disable NIR whois lookups (JPNIC, KRNIC). This is the opposite of ' - 'the ipwhois inc_nir, in order to enable inc_nir by default in the ' - 'CLI.', - default=False -) -parser.add_argument( - '--json', - action='store_true', - help='Output results in JSON format.', - default=False -) - -# Output options -group = parser.add_argument_group('Output options') -group.add_argument( - '--hr', - action='store_true', - help='If set, returns results with human readable key translations.' -) -group.add_argument( - '--show_name', - action='store_true', - help='If this and --hr are set, the key name is shown in parentheses after' - 'its short value' -) -group.add_argument( - '--colorize', - action='store_true', - help='If set, colorizes the output using ANSI. Should work in most ' - 'platform consoles.' -) - -# IPWhois settings (common) -group = parser.add_argument_group('IPWhois settings') -group.add_argument( - '--timeout', - type=int, - default=5, - metavar='TIMEOUT', - help='The default timeout for socket connections in seconds.' -) -group.add_argument( - '--proxy_http', - type=str, - nargs=1, - default='', - metavar='"PROXY_HTTP"', - help='The proxy HTTP address passed to request.ProxyHandler. User auth ' - 'can be passed like "http://user:pass@192.168.0.1:80"', - required=False -) -group.add_argument( - '--proxy_https', - type=str, - nargs=1, - default='', - metavar='"PROXY_HTTPS"', - help='The proxy HTTPS address passed to request.ProxyHandler. User auth' - 'can be passed like "https://user:pass@192.168.0.1:443"', - required=False -) -group.add_argument( - '--disallow_permutations', - action='store_true', - help='Disable additional methods if DNS lookups to Cymru fail. This is the' - ' opposite of the ipwhois allow_permutations, in order to enable ' - 'allow_permutations by default in the CLI. *WARNING* deprecated in ' - 'favor of new argument asn_methods.', - default=False -) - -# Common (RDAP & Legacy Whois) -group = parser.add_argument_group('Common settings (RDAP & Legacy Whois)') -group.add_argument( - '--inc_raw', - action='store_true', - help='Include the raw whois results in the output.' -) -group.add_argument( - '--retry_count', - type=int, - default=3, - metavar='RETRY_COUNT', - help='The number of times to retry in case socket errors, timeouts, ' - 'connection resets, etc. are encountered.' -) -group.add_argument( - '--asn_alts', - type=str, - nargs=1, - default='whois,http', - metavar='"ASN_ALTS"', - help='A comma delimited list of additional lookup types to attempt if the ' - 'ASN dns lookup fails. Allow permutations must be enabled. ' - 'Defaults to all: "whois,http" *WARNING* deprecated in ' - 'favor of new argument asn_methods.' -) -group.add_argument( - '--asn_methods', - type=str, - nargs=1, - default='dns,whois,http', - metavar='"ASN_METHODS"', - help='List of ASN lookup types to attempt, in order. ' - 'Defaults to all [\'dns\', \'whois\', \'http\'].' -) -group.add_argument( - '--extra_org_map', - type=json.loads, - nargs=1, - default='{"DNIC": "arin"}', - metavar='"EXTRA_ORG_MAP"', - help='Dictionary mapping org handles to RIRs. This is for limited cases ' - 'where ARIN REST (ASN fallback HTTP lookup) does not show an RIR as ' - 'the org handle e.g., DNIC (which is now the built in ORG_MAP) e.g., ' - '{\\"DNIC\\": \\"arin\\"}. Valid RIR values are (note the ' - 'case-sensitive - this is meant to match the REST result): ' - '\'ARIN\', \'RIPE\', \'apnic\', \'lacnic\', \'afrinic\'' -) -group.add_argument( - '--skip_asn_description', - action='store_true', - help='Don\'t run an additional query when pulling ASN information via dns ' - '(to get the ASN description). This is the opposite of the ipwhois ' - 'get_asn_description argument, in order to enable ' - 'get_asn_description by default in the CLI.', - default=False -) - -# RDAP -group = parser.add_argument_group('RDAP settings') -group.add_argument( - '--depth', - type=int, - default=0, - metavar='COLOR_DEPTH', - help='If not --whois, how many levels deep to run RDAP queries when ' - 'additional referenced objects are found.' -) -group.add_argument( - '--excluded_entities', - type=str, - nargs=1, - default=None, - metavar='"EXCLUDED_ENTITIES"', - help='If not --whois, a comma delimited list of entity handles to not ' - 'perform lookups.' -) -group.add_argument( - '--bootstrap', - action='store_true', - help='If not --whois, performs lookups via ARIN bootstrap rather than ' - 'lookups based on ASN data. ASN lookups are not performed and no ' - 'output for any of the asn* fields is provided.' -) -group.add_argument( - '--rate_limit_timeout', - type=int, - default=120, - metavar='RATE_LIMIT_TIMEOUT', - help='If not --whois, the number of seconds to wait before retrying when ' - 'a rate limit notice is returned via rdap+json.' -) - -# Legacy Whois -group = parser.add_argument_group('Legacy Whois settings') -group.add_argument( - '--get_referral', - action='store_true', - help='If --whois, retrieve referral whois information, if available.' -) -group.add_argument( - '--extra_blacklist', - type=str, - nargs=1, - default='', - metavar='"EXTRA_BLACKLIST"', - help='If --whois, A list of blacklisted whois servers in addition to the ' - 'global BLACKLIST.' -) -group.add_argument( - '--ignore_referral_errors', - action='store_true', - help='If --whois, ignore and continue when an exception is encountered on ' - 'referral whois lookups.' -) -group.add_argument( - '--field_list', - type=str, - nargs=1, - default='', - metavar='"FIELD_LIST"', - help='If --whois, a list of fields to parse: ' - '[\'name\', \'handle\', \'description\', \'country\', \'state\', ' - '\'city\', \'address\', \'postal_code\', \'emails\', \'created\', ' - '\'updated\']' -) - -# NIR (National Internet Registry -- JPNIC, KRNIC) -group = parser.add_argument_group('NIR (National Internet Registry) settings') -group.add_argument( - '--nir_field_list', - type=str, - nargs=1, - default='', - metavar='"NIR_FIELD_LIST"', - help='If not --exclude_nir, a list of fields to parse: ' - '[\'name\', \'handle\', \'country\', \'address\', \'postal_code\', ' - '\'nameservers\', \'created\', \'updated\', \'contact_admin\', ' - '\'contact_tech\']' -) - -# Input (required) -group = parser.add_argument_group('Input (Required)') -group.add_argument( - '--addr', - type=str, - nargs=1, - metavar='"IP"', - help='An IPv4 or IPv6 address as a string.', - required=True -) - -# Get the args -script_args = parser.parse_args() - -# Get the current working directory. -CUR_DIR = path.dirname(__file__) - - -def generate_output(line='0', short=None, name=None, value=None, - is_parent=False, colorize=True): - """ - The function for formatting CLI output results. - - Args: - line (:obj:`str`): The line number (0-4). Determines indentation. - Defaults to '0'. - short (:obj:`str`): The optional abbreviated name for a field. - See hr.py for values. - name (:obj:`str`): The optional name for a field. See hr.py for values. - value (:obj:`str`): The field data (required). - is_parent (:obj:`bool`): Set to True if the field value has sub-items - (dicts/lists). Defaults to False. - colorize (:obj:`bool`): Colorize the console output with ANSI colors. - Defaults to True. - - Returns: - str: The generated output. - """ - - # TODO: so ugly - output = '{0}{1}{2}{3}{4}{5}{6}{7}\n'.format( - LINES['{0}{1}'.format(line, 'C' if colorize else '')] if ( - line in LINES.keys()) else '', - COLOR_DEPTH[line] if (colorize and line in COLOR_DEPTH) else '', - ANSI['b'], - short if short is not None else ( - name if (name is not None) else '' - ), - '' if (name is None or short is None) else ' ({0})'.format( - name), - '' if (name is None and short is None) else ': ', - ANSI['end'] if colorize else '', - '' if is_parent else value - ) - - return output - - -class IPWhoisCLI: - """ - The CLI wrapper class for outputting formatted IPWhois results. - - Args: - addr (:obj:`str`/:obj:`int`/:obj:`IPv4Address`/:obj:`IPv6Address`): - An IPv4 or IPv6 address - timeout (:obj:`int`): The default timeout for socket connections in - seconds. Defaults to 5. - proxy_http (:obj:`urllib.request.OpenerDirector`): The request for - proxy HTTP support or None. - proxy_https (:obj:`urllib.request.OpenerDirector`): The request for - proxy HTTPS support or None. - allow_permutations (:obj:`bool`): Allow net.Net() to use additional - methods if DNS lookups to Cymru fail. *WARNING* deprecated in - favor of new argument asn_methods. Defaults to True. - """ - - def __init__( - self, - addr, - timeout, - proxy_http, - proxy_https, - allow_permutations - ): - - self.addr = addr - self.timeout = timeout - - handler_dict = None - if proxy_http is not None: - - handler_dict = {'http': proxy_http} - - if proxy_https is not None: - - if handler_dict is None: - - handler_dict = {'https': proxy_https} - - else: - - handler_dict['https'] = proxy_https - - if handler_dict is None: - - self.opener = None - else: - - handler = ProxyHandler(handler_dict) - self.opener = build_opener(handler) - - self.allow_permutations = allow_permutations - - self.obj = IPWhois(address=self.addr, - timeout=self.timeout, - proxy_opener=self.opener, - allow_permutations=self.allow_permutations) - - def generate_output_header(self, query_type='RDAP'): - """ - The function for generating the CLI output header. - - Args: - query_type (:obj:`str`): The IPWhois query type. Defaults to - 'RDAP'. - - Returns: - str: The generated output. - """ - - output = '\n{0}{1}{2} query for {3}:{4}\n\n'.format( - ANSI['ul'], - ANSI['b'], - query_type, - self.obj.address_str, - ANSI['end'] - ) - - return output - - def generate_output_newline(self, line='0', colorize=True): - """ - The function for generating a CLI output new line. - - Args: - line (:obj:`str`): The line number (0-4). Determines indentation. - Defaults to '0'. - colorize (:obj:`bool`): Colorize the console output with ANSI - colors. Defaults to True. - - Returns: - str: The generated output. - """ - - return generate_output( - line=line, - is_parent=True, - colorize=colorize - ) - - def generate_output_asn(self, json_data=None, hr=True, show_name=False, - colorize=True): - """ - The function for generating CLI output ASN results. - - Args: - json_data (:obj:`dict`): The data to process. Defaults to None. - hr (:obj:`bool`): Enable human readable key translations. Defaults - to True. - show_name (:obj:`bool`): Show human readable name (default is to - only show short). Defaults to False. - colorize (:obj:`bool`): Colorize the console output with ANSI - colors. Defaults to True. - - Returns: - str: The generated output. - """ - - if json_data is None: - json_data = {} - - keys = {'asn', 'asn_cidr', 'asn_country_code', 'asn_date', - 'asn_registry', 'asn_description'}.intersection(json_data) - - output = '' - - for key in keys: - - output += generate_output( - line='0', - short=HR_ASN[key]['_short'] if hr else key, - name=HR_ASN[key]['_name'] if (hr and show_name) else None, - value=(json_data[key] if ( - json_data[key] is not None and - len(json_data[key]) > 0 and - json_data[key] != 'NA') else 'None'), - colorize=colorize - ) - - return output - - def generate_output_entities(self, json_data=None, hr=True, - show_name=False, colorize=True): - """ - The function for generating CLI output RDAP entity results. - - Args: - json_data (:obj:`dict`): The data to process. Defaults to None. - hr (:obj:`bool`): Enable human readable key translations. Defaults - to True. - show_name (:obj:`bool`): Show human readable name (default is to - only show short). Defaults to False. - colorize (:obj:`bool`): Colorize the console output with ANSI - colors. Defaults to True. - - Returns: - str: The generated output. - """ - - output = '' - short = HR_RDAP['entities']['_short'] if hr else 'entities' - name = HR_RDAP['entities']['_name'] if (hr and show_name) else None - - output += generate_output( - line='0', - short=short, - name=name, - is_parent=False if (json_data is None or - json_data['entities'] is None) else True, - value='None' if (json_data is None or - json_data['entities'] is None) else None, - colorize=colorize - ) - - if json_data is not None: - - for ent in json_data['entities']: - - output += generate_output( - line='1', - value=ent, - colorize=colorize - ) - - return output - - def generate_output_events(self, source, key, val, line='2', hr=True, - show_name=False, colorize=True): - """ - The function for generating CLI output RDAP events results. - - Args: - source (:obj:`str`): The parent key 'network' or 'objects' - (required). - key (:obj:`str`): The event key 'events' or 'events_actor' - (required). - val (:obj:`dict`): The event dictionary (required). - line (:obj:`str`): The line number (0-4). Determines indentation. - Defaults to '0'. - hr (:obj:`bool`): Enable human readable key translations. Defaults - to True. - show_name (:obj:`bool`): Show human readable name (default is to - only show short). Defaults to False. - colorize (:obj:`bool`): Colorize the console output with ANSI - colors. Defaults to True. - - Returns: - str: The generated output. - """ - - output = generate_output( - line=line, - short=HR_RDAP[source][key]['_short'] if hr else key, - name=HR_RDAP[source][key]['_name'] if (hr and show_name) else None, - is_parent=False if (val is None or - len(val) == 0) else True, - value='None' if (val is None or - len(val) == 0) else None, - colorize=colorize - ) - - if val is not None: - - count = 0 - for item in val: - - try: - action = item['action'] - except KeyError: - action = None - - try: - timestamp = item['timestamp'] - except KeyError: - timestamp = None - - try: - actor = item['actor'] - except KeyError: - actor = None - - if count > 0: - output += generate_output( - line=str(int(line)+1), - is_parent=True, - colorize=colorize - ) - - output += generate_output( - line=str(int(line)+1), - short=HR_RDAP_COMMON[key]['action'][ - '_short'] if hr else 'action', - name=HR_RDAP_COMMON[key]['action'][ - '_name'] if (hr and show_name) else None, - value=action, - colorize=colorize - ) - - output += generate_output( - line=str(int(line)+1), - short=HR_RDAP_COMMON[key]['timestamp'][ - '_short'] if hr else 'timestamp', - name=HR_RDAP_COMMON[key]['timestamp'][ - '_name'] if (hr and show_name) else None, - value=timestamp, - colorize=colorize - ) - - output += generate_output( - line=str(int(line)+1), - short=HR_RDAP_COMMON[key]['actor'][ - '_short'] if hr else 'actor', - name=HR_RDAP_COMMON[key]['actor'][ - '_name'] if (hr and show_name) else None, - value=actor, - colorize=colorize - ) - - count += 1 - - return output - - def generate_output_list(self, source, key, val, line='2', hr=True, - show_name=False, colorize=True): - """ - The function for generating CLI output RDAP list results. - - Args: - source (:obj:`str`): The parent key 'network' or 'objects' - (required). - key (:obj:`str`): The event key 'events' or 'events_actor' - (required). - val (:obj:`dict`): The event dictionary (required). - line (:obj:`str`): The line number (0-4). Determines indentation. - Defaults to '0'. - hr (:obj:`bool`): Enable human readable key translations. Defaults - to True. - show_name (:obj:`bool`): Show human readable name (default is to - only show short). Defaults to False. - colorize (:obj:`bool`): Colorize the console output with ANSI - colors. Defaults to True. - - Returns: - str: The generated output. - """ - - output = generate_output( - line=line, - short=HR_RDAP[source][key]['_short'] if hr else key, - name=HR_RDAP[source][key]['_name'] if (hr and show_name) else None, - is_parent=False if (val is None or - len(val) == 0) else True, - value='None' if (val is None or - len(val) == 0) else None, - colorize=colorize - ) - - if val is not None: - for item in val: - output += generate_output( - line=str(int(line)+1), - value=item, - colorize=colorize - ) - - return output - - def generate_output_notices(self, source, key, val, line='1', hr=True, - show_name=False, colorize=True): - """ - The function for generating CLI output RDAP notices results. - - Args: - source (:obj:`str`): The parent key 'network' or 'objects' - (required). - key (:obj:`str`): The event key 'events' or 'events_actor' - (required). - val (:obj:`dict`): The event dictionary (required). - line (:obj:`str`): The line number (0-4). Determines indentation. - Defaults to '0'. - hr (:obj:`bool`): Enable human readable key translations. Defaults - to True. - show_name (:obj:`bool`): Show human readable name (default is to - only show short). Defaults to False. - colorize (:obj:`bool`): Colorize the console output with ANSI - colors. Defaults to True. - - Returns: - str: The generated output. - """ - - output = generate_output( - line=line, - short=HR_RDAP[source][key]['_short'] if hr else key, - name=HR_RDAP[source][key]['_name'] if (hr and show_name) else None, - is_parent=False if (val is None or - len(val) == 0) else True, - value='None' if (val is None or - len(val) == 0) else None, - colorize=colorize - ) - - if val is not None: - - count = 0 - for item in val: - - title = item['title'] - description = item['description'] - links = item['links'] - - if count > 0: - output += generate_output( - line=str(int(line)+1), - is_parent=True, - colorize=colorize - ) - - output += generate_output( - line=str(int(line)+1), - short=HR_RDAP_COMMON[key]['title']['_short'] if hr else ( - 'title'), - name=HR_RDAP_COMMON[key]['title']['_name'] if ( - hr and show_name) else None, - value=title, - colorize=colorize - ) - - output += generate_output( - line=str(int(line)+1), - short=HR_RDAP_COMMON[key]['description'][ - '_short'] if hr else 'description', - name=HR_RDAP_COMMON[key]['description'][ - '_name'] if (hr and show_name) else None, - value=description.replace( - '\n', - '\n{0}'.format(generate_output(line='3')) - ), - colorize=colorize - ) - output += self.generate_output_list( - source=source, - key='links', - val=links, - line=str(int(line)+1), - hr=hr, - show_name=show_name, - colorize=colorize - ) - - count += 1 - - return output - - def generate_output_network(self, json_data=None, hr=True, show_name=False, - colorize=True): - """ - The function for generating CLI output RDAP network results. - - Args: - json_data (:obj:`dict`): The data to process. Defaults to None. - hr (:obj:`bool`): Enable human readable key translations. Defaults - to True. - show_name (:obj:`bool`): Show human readable name (default is to - only show short). Defaults to False. - colorize (:obj:`bool`): Colorize the console output with ANSI - colors. Defaults to True. - - Returns: - str: The generated output. - """ - - if json_data is None: - json_data = {} - - output = generate_output( - line='0', - short=HR_RDAP['network']['_short'] if hr else 'network', - name=HR_RDAP['network']['_name'] if (hr and show_name) else None, - is_parent=True, - colorize=colorize - ) - - for key, val in json_data['network'].items(): - - if key in ['links', 'status']: - - output += self.generate_output_list( - source='network', - key=key, - val=val, - line='1', - hr=hr, - show_name=show_name, - colorize=colorize - ) - - elif key in ['notices', 'remarks']: - - output += self.generate_output_notices( - source='network', - key=key, - val=val, - line='1', - hr=hr, - show_name=show_name, - colorize=colorize - ) - - elif key == 'events': - - output += self.generate_output_events( - source='network', - key=key, - val=val, - line='1', - hr=hr, - show_name=show_name, - colorize=colorize - ) - - elif key not in ['raw']: - - output += generate_output( - line='1', - short=HR_RDAP['network'][key]['_short'] if hr else key, - name=HR_RDAP['network'][key]['_name'] if ( - hr and show_name) else None, - value=val, - colorize=colorize - ) - - return output - - def generate_output_objects(self, json_data=None, hr=True, show_name=False, - colorize=True): - """ - The function for generating CLI output RDAP object results. - - Args: - json_data (:obj:`dict`): The data to process. Defaults to None. - hr (:obj:`bool`): Enable human readable key translations. Defaults - to True. - show_name (:obj:`bool`): Show human readable name (default is to - only show short). Defaults to False. - colorize (:obj:`bool`): Colorize the console output with ANSI - colors. Defaults to True. - - Returns: - str: The generated output. - """ - - if json_data is None: - json_data = {} - - output = generate_output( - line='0', - short=HR_RDAP['objects']['_short'] if hr else 'objects', - name=HR_RDAP['objects']['_name'] if (hr and show_name) else None, - is_parent=True, - colorize=colorize - ) - - count = 0 - for obj_name, obj in json_data['objects'].items(): - if count > 0: - output += self.generate_output_newline( - line='1', - colorize=colorize - ) - count += 1 - - output += generate_output( - line='1', - short=obj_name, - is_parent=True, - colorize=colorize - ) - - for key, val in obj.items(): - - if key in ['links', 'entities', 'roles', 'status']: - - output += self.generate_output_list( - source='objects', - key=key, - val=val, - line='2', - hr=hr, - show_name=show_name, - colorize=colorize - ) - - elif key in ['notices', 'remarks']: - - output += self.generate_output_notices( - source='objects', - key=key, - val=val, - line='2', - hr=hr, - show_name=show_name, - colorize=colorize - ) - - elif key == 'events': - - output += self.generate_output_events( - source='objects', - key=key, - val=val, - line='2', - hr=hr, - show_name=show_name, - colorize=colorize - ) - - elif key == 'contact': - - output += generate_output( - line='2', - short=HR_RDAP['objects']['contact'][ - '_short'] if hr else 'contact', - name=HR_RDAP['objects']['contact']['_name'] if ( - hr and show_name) else None, - is_parent=False if (val is None or - len(val) == 0) else True, - value='None' if (val is None or - len(val) == 0) else None, - colorize=colorize - ) - - if val is not None: - - for k, v in val.items(): - - if k in ['phone', 'address', 'email']: - - output += generate_output( - line='3', - short=HR_RDAP['objects']['contact'][k][ - '_short'] if hr else k, - name=HR_RDAP['objects']['contact'][k][ - '_name'] if ( - hr and show_name) else None, - is_parent=False if ( - val is None or - len(val) == 0 - ) else True, - value='None' if (val is None or - len(val) == 0) else None, - colorize=colorize - ) - - if v is not None: - for item in v: - i_type = ', '.join(item['type']) if ( - isinstance(item['type'], list) - ) else item['type'] - - i_type = i_type if ( - i_type is not None and - len(i_type) > 0) else '' - - i_value = item['value'].replace( - '\n', - '\n{0}'.format( - generate_output( - line='4', - is_parent=True, - colorize=colorize - ).replace('\n', '')) - ) - - tmp_out = '{0}{1}{2}'.format( - i_type, - ': ' if i_type != '' else '', - i_value - ) - - output += generate_output( - line='4', - value=tmp_out, - colorize=colorize - ) - - else: - - output += generate_output( - line='3', - short=HR_RDAP['objects']['contact'][k][ - '_short'] if hr else k, - name=HR_RDAP['objects']['contact'][k][ - '_name'] if ( - hr and show_name) else None, - value=v, - colorize=colorize - ) - - elif key not in ['raw']: - - output += generate_output( - line='2', - short=HR_RDAP['objects'][key]['_short'] if hr else key, - name=HR_RDAP['objects'][key]['_name'] if ( - hr and show_name) else None, - value=val, - colorize=colorize - ) - - return output - - def lookup_rdap(self, hr=True, show_name=False, colorize=True, **kwargs): - """ - The function for wrapping IPWhois.lookup_rdap() and generating - formatted CLI output. - - Args: - hr (:obj:`bool`): Enable human readable key translations. Defaults - to True. - show_name (:obj:`bool`): Show human readable name (default is to - only show short). Defaults to False. - colorize (:obj:`bool`): Colorize the console output with ANSI - colors. Defaults to True. - kwargs: Arguments to pass to IPWhois.lookup_rdap(). - - Returns: - str: The generated output. - """ - - # Perform the RDAP lookup - ret = self.obj.lookup_rdap(**kwargs) - - if script_args.json: - - output = json.dumps(ret) - - else: - - # Header - output = self.generate_output_header(query_type='RDAP') - - # ASN - output += self.generate_output_asn( - json_data=ret, hr=hr, show_name=show_name, colorize=colorize - ) - output += self.generate_output_newline(colorize=colorize) - - # Entities - output += self.generate_output_entities( - json_data=ret, hr=hr, show_name=show_name, colorize=colorize - ) - output += self.generate_output_newline(colorize=colorize) - - # Network - output += self.generate_output_network( - json_data=ret, hr=hr, show_name=show_name, colorize=colorize - ) - output += self.generate_output_newline(colorize=colorize) - - # Objects - output += self.generate_output_objects( - json_data=ret, hr=hr, show_name=show_name, colorize=colorize - ) - output += self.generate_output_newline(colorize=colorize) - - if 'nir' in ret: - - # NIR - output += self.generate_output_nir( - json_data=ret, hr=hr, show_name=show_name, - colorize=colorize - ) - output += self.generate_output_newline(colorize=colorize) - - return output - - def generate_output_whois_nets(self, json_data=None, hr=True, - show_name=False, colorize=True): - """ - The function for generating CLI output Legacy Whois networks results. - - Args: - json_data (:obj:`dict`): The data to process. Defaults to None. - hr (:obj:`bool`): Enable human readable key translations. Defaults - to True. - show_name (:obj:`bool`): Show human readable name (default is to - only show short). Defaults to False. - colorize (:obj:`bool`): Colorize the console output with ANSI - colors. Defaults to True. - - Returns: - str: The generated output. - """ - - if json_data is None: - json_data = {} - - output = generate_output( - line='0', - short=HR_WHOIS['nets']['_short'] if hr else 'nets', - name=HR_WHOIS['nets']['_name'] if (hr and show_name) else None, - is_parent=True, - colorize=colorize - ) - - count = 0 - for net in json_data['nets']: - if count > 0: - output += self.generate_output_newline( - line='1', - colorize=colorize - ) - count += 1 - - output += generate_output( - line='1', - short=net['handle'], - is_parent=True, - colorize=colorize - ) - - for key, val in net.items(): - - if val and '\n' in val: - - output += generate_output( - line='2', - short=HR_WHOIS['nets'][key]['_short'] if hr else key, - name=HR_WHOIS['nets'][key]['_name'] if ( - hr and show_name) else None, - is_parent=False if (val is None or - len(val) == 0) else True, - value='None' if (val is None or - len(val) == 0) else None, - colorize=colorize - ) - - for v in val.split('\n'): - output += generate_output( - line='3', - value=v, - colorize=colorize - ) - - else: - - output += generate_output( - line='2', - short=HR_WHOIS['nets'][key]['_short'] if hr else key, - name=HR_WHOIS['nets'][key]['_name'] if ( - hr and show_name) else None, - value=val, - colorize=colorize - ) - - return output - - def generate_output_whois_referral(self, json_data=None, hr=True, - show_name=False, colorize=True): - """ - The function for generating CLI output Legacy Whois referral results. - - Args: - json_data (:obj:`dict`): The data to process. Defaults to None. - hr (:obj:`bool`): Enable human readable key translations. Defaults - to True. - show_name (:obj:`bool`): Show human readable name (default is to - only show short). Defaults to False. - colorize (:obj:`bool`): Colorize the console output with ANSI - colors. Defaults to True. - - Returns: - str: The generated output. - """ - - if json_data is None: - json_data = {} - - output = generate_output( - line='0', - short=HR_WHOIS['referral']['_short'] if hr else 'referral', - name=HR_WHOIS['referral']['_name'] if (hr and show_name) else None, - is_parent=False if json_data['referral'] is None else True, - value='None' if json_data['referral'] is None else None, - colorize=colorize - ) - - if json_data['referral']: - - for key, val in json_data['referral'].items(): - - if val and '\n' in val: - - output += generate_output( - line='1', - short=HR_WHOIS['nets'][key]['_short'] if hr else key, - name=HR_WHOIS['nets'][key]['_name'] if ( - hr and show_name) else None, - is_parent=False if (val is None or - len(val) == 0) else True, - value='None' if (val is None or - len(val) == 0) else None, - colorize=colorize - ) - - for v in val.split('\n'): - output += generate_output( - line='2', - value=v, - colorize=colorize - ) - - else: - - output += generate_output( - line='1', - short=HR_WHOIS['nets'][key]['_short'] if hr else key, - name=HR_WHOIS['nets'][key]['_name'] if ( - hr and show_name) else None, - value=val, - colorize=colorize - ) - - return output - - def generate_output_nir(self, json_data=None, hr=True, show_name=False, - colorize=True): - """ - The function for generating CLI output NIR network results. - - Args: - json_data (:obj:`dict`): The data to process. Defaults to None. - hr (:obj:`bool`): Enable human readable key translations. Defaults - to True. - show_name (:obj:`bool`): Show human readable name (default is to - only show short). Defaults to False. - colorize (:obj:`bool`): Colorize the console output with ANSI - colors. Defaults to True. - - Returns: - str: The generated output. - """ - - if json_data is None: - json_data = {} - - output = generate_output( - line='0', - short=HR_WHOIS_NIR['nets']['_short'] if hr else 'nir_nets', - name=HR_WHOIS_NIR['nets']['_name'] if (hr and show_name) else None, - is_parent=True, - colorize=colorize - ) - - count = 0 - if json_data['nir']: - - for net in json_data['nir']['nets']: - - if count > 0: - - output += self.generate_output_newline( - line='1', - colorize=colorize - ) - - count += 1 - - output += generate_output( - line='1', - short=net['handle'], - is_parent=True, - colorize=colorize - ) - - for key, val in net.items(): - - if val and (isinstance(val, dict) or '\n' in val or - key == 'nameservers'): - - output += generate_output( - line='2', - short=( - HR_WHOIS_NIR['nets'][key]['_short'] if ( - hr) else key - ), - name=HR_WHOIS_NIR['nets'][key]['_name'] if ( - hr and show_name) else None, - is_parent=False if (val is None or - len(val) == 0) else True, - value='None' if (val is None or - len(val) == 0) else None, - colorize=colorize - ) - - if key == 'contacts': - - for k, v in val.items(): - - if v: - - output += generate_output( - line='3', - is_parent=False if ( - len(v) == 0) else True, - name=k, - colorize=colorize - ) - - for contact_key, contact_val in v.items(): - - if v is not None: - - tmp_out = '{0}{1}{2}'.format( - contact_key, - ': ', - contact_val - ) - - output += generate_output( - line='4', - value=tmp_out, - colorize=colorize - ) - elif key == 'nameservers': - - for v in val: - output += generate_output( - line='3', - value=v, - colorize=colorize - ) - else: - - for v in val.split('\n'): - output += generate_output( - line='3', - value=v, - colorize=colorize - ) - - else: - - output += generate_output( - line='2', - short=( - HR_WHOIS_NIR['nets'][key]['_short'] if ( - hr) else key - ), - name=HR_WHOIS_NIR['nets'][key]['_name'] if ( - hr and show_name) else None, - value=val, - colorize=colorize - ) - - else: - - output += 'None' - - return output - - def lookup_whois(self, hr=True, show_name=False, colorize=True, **kwargs): - """ - The function for wrapping IPWhois.lookup_whois() and generating - formatted CLI output. - - Args: - hr (:obj:`bool`): Enable human readable key translations. Defaults - to True. - show_name (:obj:`bool`): Show human readable name (default is to - only show short). Defaults to False. - colorize (:obj:`bool`): Colorize the console output with ANSI - colors. Defaults to True. - kwargs: Arguments to pass to IPWhois.lookup_whois(). - - Returns: - str: The generated output. - """ - - # Perform the RDAP lookup - ret = self.obj.lookup_whois(**kwargs) - - if script_args.json: - - output = json.dumps(ret) - - else: - - # Header - output = self.generate_output_header(query_type='Legacy Whois') - - # ASN - output += self.generate_output_asn( - json_data=ret, hr=hr, show_name=show_name, colorize=colorize - ) - output += self.generate_output_newline(colorize=colorize) - - # Network - output += self.generate_output_whois_nets( - json_data=ret, hr=hr, show_name=show_name, colorize=colorize - ) - output += self.generate_output_newline(colorize=colorize) - - # Referral - output += self.generate_output_whois_referral( - json_data=ret, hr=hr, show_name=show_name, colorize=colorize - ) - output += self.generate_output_newline(colorize=colorize) - - if 'nir' in ret: - - # NIR - output += self.generate_output_nir( - json_data=ret, hr=hr, show_name=show_name, - colorize=colorize - ) - output += self.generate_output_newline(colorize=colorize) - - return output - -if script_args.addr: - - results = IPWhoisCLI( - addr=script_args.addr[0], - timeout=script_args.timeout, - proxy_http=script_args.proxy_http if ( - script_args.proxy_http and len(script_args.proxy_http) > 0 - ) else None, - proxy_https=script_args.proxy_https if ( - script_args.proxy_https and len(script_args.proxy_https) > 0 - ) else None, - allow_permutations=(not script_args.disallow_permutations) - ) - - if script_args.whois: - - print(results.lookup_whois( - hr=script_args.hr, - show_name=script_args.show_name, - colorize=script_args.colorize, - inc_raw=script_args.inc_raw, - retry_count=script_args.retry_count, - get_referral=script_args.get_referral, - extra_blacklist=script_args.extra_blacklist.split(',') if ( - script_args.extra_blacklist and - len(script_args.extra_blacklist) > 0) else None, - ignore_referral_errors=script_args.ignore_referral_errors, - field_list=script_args.field_list.split(',') if ( - script_args.field_list and - len(script_args.field_list) > 0) else None, - asn_alts=script_args.asn_alts.split(',') if ( - script_args.asn_alts and not script_args.asn_methods and - len(script_args.asn_alts) > 0) else None, - extra_org_map=script_args.extra_org_map, - inc_nir=(not script_args.exclude_nir), - nir_field_list=script_args.nir_field_list.split(',') if ( - script_args.nir_field_list and - len(script_args.nir_field_list) > 0) else None, - asn_methods=script_args.asn_methods.split(',') if ( - script_args.asn_methods and - len(script_args.asn_methods) > 0) else None, - get_asn_description=(not script_args.skip_asn_description) - )) - - else: - - print(results.lookup_rdap( - hr=script_args.hr, - show_name=script_args.show_name, - colorize=script_args.colorize, - inc_raw=script_args.inc_raw, - retry_count=script_args.retry_count, - depth=script_args.depth, - excluded_entities=script_args.excluded_entities.split(',') if ( - script_args.excluded_entities and - len(script_args.excluded_entities) > 0) else None, - bootstrap=script_args.bootstrap, - rate_limit_timeout=script_args.rate_limit_timeout, - asn_alts=script_args.asn_alts.split(',') if ( - script_args.asn_alts and not script_args.asn_methods and - len(script_args.asn_alts) > 0) else None, - extra_org_map=script_args.extra_org_map, - inc_nir=(not script_args.exclude_nir), - nir_field_list=script_args.nir_field_list.split(',') if ( - script_args.nir_field_list and - len(script_args.nir_field_list) > 0) else None, - asn_methods=script_args.asn_methods.split(',') if ( - script_args.asn_methods and - len(script_args.asn_methods) > 0) else None, - get_asn_description=(not script_args.skip_asn_description) - )) diff --git a/env/bin/ipwhois_utils_cli.py b/env/bin/ipwhois_utils_cli.py deleted file mode 100644 index c8dec77..0000000 --- a/env/bin/ipwhois_utils_cli.py +++ /dev/null @@ -1,269 +0,0 @@ -# Copyright (c) 2013-2019 Philip Hane -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. - -# CLI python script interface for ipwhois.utils lookups. - -import argparse -from collections import OrderedDict -import json -from ipwhois.utils import (ipv4_lstrip_zeros, calculate_cidr, get_countries, - ipv4_is_defined, ipv6_is_defined, unique_everseen, - unique_addresses) - -# CLI ANSI rendering -ANSI = { - 'end': '\033[0m', - 'b': '\033[1m', - 'ul': '\033[4m', - 'red': '\033[31m', - 'green': '\033[32m', - 'yellow': '\033[33m', - 'cyan': '\033[36m' -} - -# Setup the arg parser. -parser = argparse.ArgumentParser( - description='ipwhois utilities CLI interface' -) -parser.add_argument( - '--ipv4_lstrip_zeros', - type=str, - nargs=1, - metavar='"IP ADDRESS"', - help='Strip leading zeros in each octet of an IPv4 address.' -) -parser.add_argument( - '--calculate_cidr', - type=str, - nargs=2, - metavar='"IP ADDRESS"', - help='Calculate a CIDR range(s) from a start and end IP address.' -) -parser.add_argument( - '--get_countries', - action='store_true', - help='Output a dictionary containing ISO_3166-1 country codes to names.' -) -parser.add_argument( - '--get_country', - type=str, - nargs=1, - metavar='"COUNTRY CODE"', - help='Output the ISO_3166-1 name for a country code.' -) -parser.add_argument( - '--ipv4_is_defined', - type=str, - nargs=1, - metavar='"IP ADDRESS"', - help='Check if an IPv4 address is defined (in a reserved address range).' -) -parser.add_argument( - '--ipv6_is_defined', - type=str, - nargs=1, - metavar='"IP ADDRESS"', - help='Check if an IPv6 address is defined (in a reserved address range).' -) -parser.add_argument( - '--unique_everseen', - type=json.loads, - nargs=1, - metavar='"ITERABLE"', - help='List unique elements from input iterable, preserving the order.' -) -parser.add_argument( - '--unique_addresses', - type=str, - nargs=1, - metavar='"FILE PATH"', - help='Search an input file, extracting, counting, and summarizing ' - 'IPv4/IPv6 addresses/networks.' -) - -# Output options -group = parser.add_argument_group('Output options') -group.add_argument( - '--colorize', - action='store_true', - help='If set, colorizes the output using ANSI. Should work in most ' - 'platform consoles.' -) - -# Get the args -script_args = parser.parse_args() - -if script_args.ipv4_lstrip_zeros: - - print(ipv4_lstrip_zeros(address=script_args.ipv4_lstrip_zeros[0])) - -elif script_args.calculate_cidr: - - try: - - result = calculate_cidr( - start_address=script_args.calculate_cidr[0], - end_address=script_args.calculate_cidr[1] - ) - - print('{0}Found {1} CIDR blocks for ({2}, {3}){4}:\n{5}'.format( - ANSI['green'] if script_args.colorize else '', - len(result), - script_args.calculate_cidr[0], - script_args.calculate_cidr[1], - ANSI['end'] if script_args.colorize else '', - '\n'.join(result) - )) - - except Exception as e: - - print('{0}Error{1}: {2}'.format(ANSI['red'], ANSI['end'], str(e))) - -elif script_args.get_countries: - - try: - - result = get_countries() - - print('{0}Found {1} countries{2}:\n{3}'.format( - ANSI['green'] if script_args.colorize else '', - len(result), - ANSI['end'] if script_args.colorize else '', - '\n'.join(['{0}: {1}'.format(k, v) for k, v in ( - OrderedDict(sorted(result.items())).iteritems())]) - )) - - except Exception as e: - - print('{0}Error{1}: {2}'.format(ANSI['red'], ANSI['end'], str(e))) - -elif script_args.get_country: - - try: - - countries = get_countries() - result = countries[script_args.get_country[0].upper()] - - print('{0}Match found for country code ({1}){2}:\n{3}'.format( - ANSI['green'] if script_args.colorize else '', - script_args.get_country[0], - ANSI['end'] if script_args.colorize else '', - result - )) - - except Exception as e: - - print('{0}Error{1}: {2}'.format(ANSI['red'], ANSI['end'], str(e))) - -elif script_args.ipv4_is_defined: - - try: - - result = ipv4_is_defined(address=script_args.ipv4_is_defined[0]) - - if result[0]: - print('{0}{1} is defined{2}:\n{3}'.format( - ANSI['green'] if script_args.colorize else '', - script_args.ipv4_is_defined[0], - ANSI['end'] if script_args.colorize else '', - 'Name: {0}\nRFC: {1}'.format(result[1], result[2]) - )) - else: - print('{0}{1} is not defined{2}'.format( - ANSI['yellow'] if script_args.colorize else '', - script_args.ipv4_is_defined[0], - ANSI['end'] if script_args.colorize else '' - )) - - except Exception as e: - - print('{0}Error{1}: {2}'.format(ANSI['red'], ANSI['end'], str(e))) - -elif script_args.ipv6_is_defined: - - try: - - result = ipv6_is_defined(address=script_args.ipv6_is_defined[0]) - - if result[0]: - print('{0}{1} is defined{2}:\n{3}'.format( - ANSI['green'] if script_args.colorize else '', - script_args.ipv6_is_defined[0], - ANSI['end'] if script_args.colorize else '', - 'Name: {0}\nRFC: {1}'.format(result[1], result[2]) - )) - else: - print('{0}{1} is not defined{2}'.format( - ANSI['yellow'] if script_args.colorize else '', - script_args.ipv6_is_defined[0], - ANSI['end'] if script_args.colorize else '' - )) - - except Exception as e: - - print('{0}Error{1}: {2}'.format(ANSI['red'], ANSI['end'], str(e))) - -elif script_args.unique_everseen: - - try: - - result = list(unique_everseen(iterable=script_args.unique_everseen[0])) - - print('{0}Unique everseen{1}:\n{2}'.format( - ANSI['green'] if script_args.colorize else '', - ANSI['end'] if script_args.colorize else '', - result - )) - - except Exception as e: - - print('{0}Error{1}: {2}'.format(ANSI['red'], ANSI['end'], str(e))) - -elif script_args.unique_addresses: - - try: - - result = unique_addresses(file_path=script_args.unique_addresses[0]) - - tmp = [] - for k, v in sorted(result.items(), key=lambda kv: int(kv[1]['count']), - reverse=True): - tmp.append('{0}{1}{2}: Count: {3}, Ports: {4}'.format( - ANSI['b'] if script_args.colorize else '', - k, - ANSI['end'] if script_args.colorize else '', - v['count'], - json.dumps(v['ports']) - )) - - print('{0}Found {1} unique addresses{2}:\n{3}'.format( - ANSI['green'] if script_args.colorize else '', - len(result), - ANSI['end'] if script_args.colorize else '', - '\n'.join(tmp) - )) - - except Exception as e: - - print('{0}Error{1}: {2}'.format(ANSI['red'], ANSI['end'], str(e))) diff --git a/env/bin/pip b/env/bin/pip deleted file mode 100755 index 5d67e84..0000000 --- a/env/bin/pip +++ /dev/null @@ -1,11 +0,0 @@ -#!/home/ben/Documents/Projects/Python/PyGeoIP/env/bin/python - -# -*- coding: utf-8 -*- -import re -import sys - -from pip._internal import main - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/env/bin/pip3 b/env/bin/pip3 deleted file mode 100755 index 5d67e84..0000000 --- a/env/bin/pip3 +++ /dev/null @@ -1,11 +0,0 @@ -#!/home/ben/Documents/Projects/Python/PyGeoIP/env/bin/python - -# -*- coding: utf-8 -*- -import re -import sys - -from pip._internal import main - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/env/bin/pip3.7 b/env/bin/pip3.7 deleted file mode 100755 index 5d67e84..0000000 --- a/env/bin/pip3.7 +++ /dev/null @@ -1,11 +0,0 @@ -#!/home/ben/Documents/Projects/Python/PyGeoIP/env/bin/python - -# -*- coding: utf-8 -*- -import re -import sys - -from pip._internal import main - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/env/bin/python b/env/bin/python deleted file mode 100755 index 14b75f36a34e1ca8f801bd3c6d7aaeb7e2bc08b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14088 zcmeHOYiu0V6~1f7WJBV$No{aRS`Ua;jucNe&n8gAuI(ga;iO4wrw9n6wRdeVtas_| zxUwT8A{nBtz<>aWs)_(nsRU>x6sc;YB9zoo+8-b#NDZkXghfCYM8H6)%q!D#X3n>s zOdN?H`BQO^HT#|Sy>sT?vBz`v{>|N6sv;2us#Z5Emg4okCLxCCYGDWxYNJ|ApH1o- zbp^=_Je_Y(_&`>lhN>>asOYN+Iqsm?!?;}hfS4g8$6bmN3w;Yv$$4;G4Vy#`<6mR| zAncX#3=SqTyw3`r77-YX0(^zs}&G&J1LIm`CSQR-zDQ+sxD13f1sSMT9wQ8ZCJM| zmu}5v^CP3JqZ>E0ZdhlQ3g#N`yc=jDyr#Bp?^U;VHJ)4d+RTdw-+cbibMfpl>kWl}7qO5lFM^I-Zb9anKx43_5h z>>r4)R}HE@!P+@`kyzHN#GH<~Gj!Ce#*6$ETg&7TeP`de+r6)F3f-=J)}e>7zeWb>(9c5jA6 zHrXX7Rdnp(R5q{duAXgnI#bLHW=l?{*t4x8SIB32Qhho09vm*@#oP8>=XcyOX7}c^ zquacU{uuqG5gs?I>`Xf4q$nAKpNvxdg1B@xZ;zBRX-tblD8iwTJS+Q3CGp?d-PPV< zuQAt{>!}b#*e6vgGS3h1n~1ua{G?oJt_S{%35H9CS3tt0bK!I z0bK!I0bPOrvkH7(_v5du@sFa`Lp3MqZ+Gj#BTkij!Wusoo%GJc{mI`+Jz&-~Kj6vi zzxrHP`Q%+z`5kNg-I*Od-4ivt=}$3hqV{cau_oI7=@K>WrMUk*M&b*cccSJwhE20h zBMr5ic^YbwJ5|@bj}uP{lK+_JzrM(@;=EO!v5tOxi*vPM&ufD8YJ35Ot>p z>Y6*};(31i+Ssf{*7jQCZA+Q8%I`U~)#B+K9QS`)1YNd3$172k4Ar=L0R zy4KNetDWZ6XC%J6{8@MT7Vt>>6rS&b@_=~buRSY zC@|JHH!tWsnyI3*#pJYaK;`=Qv@VG z!cG;7sWCqSJf%wwXZvZa0_E~^P@AhV`wPRvnY?qk>c_p{ycW=Vda3U-U_7iF$ml;u ze7JxA1~>}x|7wEtQxbU1BYs*Kpb>N?J{-^gqxmnbS;R+W;Q}9)cz@H`am46<3A{tT@Zg*`qdAwA|;XKL**0kz}LtUj8_S9jr)jkM0?Tsyg>%eh4JzI tj(Um5IEa_ifvDajj&= (3, 2): - valid_opts.insert(-1, 'extension-suffix') - valid_opts.append('abiflags') -if sys.version_info >= (3, 3): - valid_opts.append('configdir') - - -def exit_with_usage(code=1): - sys.stderr.write("Usage: {0} [{1}]\n".format( - sys.argv[0], '|'.join('--'+opt for opt in valid_opts))) - sys.exit(code) - -try: - opts, args = getopt.getopt(sys.argv[1:], '', valid_opts) -except getopt.error: - exit_with_usage() - -if not opts: - exit_with_usage() - -pyver = sysconfig.get_config_var('VERSION') -getvar = sysconfig.get_config_var - -opt_flags = [flag for (flag, val) in opts] - -if '--help' in opt_flags: - exit_with_usage(code=0) - -for opt in opt_flags: - if opt == '--prefix': - print(sysconfig.get_config_var('prefix')) - - elif opt == '--exec-prefix': - print(sysconfig.get_config_var('exec_prefix')) - - elif opt in ('--includes', '--cflags'): - flags = ['-I' + sysconfig.get_path('include'), - '-I' + sysconfig.get_path('platinclude')] - if opt == '--cflags': - flags.extend(getvar('CFLAGS').split()) - print(' '.join(flags)) - - elif opt in ('--libs', '--ldflags'): - abiflags = getattr(sys, 'abiflags', '') - libs = ['-lpython' + pyver + abiflags] - libs += getvar('LIBS').split() - libs += getvar('SYSLIBS').split() - # add the prefix/lib/pythonX.Y/config dir, but only if there is no - # shared library in prefix/lib/. - if opt == '--ldflags': - if not getvar('Py_ENABLE_SHARED'): - libs.insert(0, '-L' + getvar('LIBPL')) - if not getvar('PYTHONFRAMEWORK'): - libs.extend(getvar('LINKFORSHARED').split()) - print(' '.join(libs)) - - elif opt == '--extension-suffix': - ext_suffix = sysconfig.get_config_var('EXT_SUFFIX') - if ext_suffix is None: - ext_suffix = sysconfig.get_config_var('SO') - print(ext_suffix) - - elif opt == '--abiflags': - if not getattr(sys, 'abiflags', None): - exit_with_usage() - print(sys.abiflags) - - elif opt == '--configdir': - print(sysconfig.get_config_var('LIBPL')) diff --git a/env/bin/python3 b/env/bin/python3 deleted file mode 120000 index d8654aa..0000000 --- a/env/bin/python3 +++ /dev/null @@ -1 +0,0 @@ -python \ No newline at end of file diff --git a/env/bin/python3.7 b/env/bin/python3.7 deleted file mode 120000 index d8654aa..0000000 --- a/env/bin/python3.7 +++ /dev/null @@ -1 +0,0 @@ -python \ No newline at end of file diff --git a/env/bin/wheel b/env/bin/wheel deleted file mode 100755 index 9ed2741..0000000 --- a/env/bin/wheel +++ /dev/null @@ -1,11 +0,0 @@ -#!/home/ben/Documents/Projects/Python/PyGeoIP/env/bin/python - -# -*- coding: utf-8 -*- -import re -import sys - -from wheel.cli import main - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/env/include/python3.7m b/env/include/python3.7m deleted file mode 120000 index 4fe7f6c..0000000 --- a/env/include/python3.7m +++ /dev/null @@ -1 +0,0 @@ -/usr/include/python3.7m \ No newline at end of file diff --git a/env/lib/python3.7/__future__.py b/env/lib/python3.7/__future__.py deleted file mode 120000 index f8b4fc8..0000000 --- a/env/lib/python3.7/__future__.py +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/__future__.py \ No newline at end of file diff --git a/env/lib/python3.7/__pycache__/__future__.cpython-37.pyc b/env/lib/python3.7/__pycache__/__future__.cpython-37.pyc deleted file mode 100644 index c8981822d11ab6b8228b27a33ead18e2964ddc8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4157 zcmbtXTW{mW6{aqhWqN(xi+7VvGSQ}~1t`)cK~bQa7OVBjTeVurk>p*3Kub`Zkwk+c zl_6!X4L=mv^vCoU^sf|p?UNt+2l~|S3`tp%ogio^@XXe00soX2gbw^Z@F)B;u@3wJ z@L%!I#U0>#{MQ|=xNr4yn${M!FFEu3Y&^6A!M|`k=6JS08e5^$a|LrPZ!ob2g4si0 zA}H&6&9aBgbv(hGfOdvM!TP=&{Z7{zop9&d3dDHRwer)Le(Rb$S>YrL|^G&VY zskfRX_Cz`3E4Yw-RsOR4)cX1vhV-CAb+^v1Gwtx>CXYG$MM zrq&?&1p%Wytb5JY&|vTZRA1xJ?E zJ;l|gL_tuN^MqttAsbq!0&x%7xd@qW+Y>1TFX_vx*%;G~9Y&fi>lmpYr7b&iT$lA= z7ZPA>$uP-?q!6e8TZEgy28lr=ia#&{b7vtPKQyKM?^{Vu|%8Asboe%=W#|@g`UqZ3reP z@hC`C@i%OxJ(e5za1?9$9%^qSED!k;>PE2!}ooN_u%9!lg9aFREfD%Ce^WMX0~fFwnEe9s4~e z>^s8cMb@W2qOvI%`V$vjfr1sF8&Vxd-EAVnp>D~+WF)+hyhPKziQ~d;tUvK=@+VYQ zoeBD2h43tDpo_lO`MGC}9GluyvYZ3qqRd!#2<4PE7y~rLYYoaVYiSZ)w?b4ef``)Z z;5t=SP&W3eVkHpwQ_DrD*=T~o99bb^O4?ZCF(M%yv;_SL7ib7kAP!pQyLa!D0s&cG z_iT5SGPe-_f@1Q2MAWG}qNQT(W0rpi53)}T?B_2~vgfM5o;KNi7M9|%uK zYWu-7&z)0;TI+Pn>IJ?Fqs%DtrkiI@I5c5YD9G*8O(^Y!=pvE3r`r?HA=jC%gOWi$ zPB(j&l;@@un1_wy!^U)TCJ1c&@pK(o>4P7{1=Ae_!Hg5sL{vm@wT%=13a{p9jKFgO ze@*t)w{L7EYvUu=*q&{PXXFmV{X>(u8EOChb7hELSm_C`^3u0e0R)vJ>7NMn)5_5~ z>e9pTO8E7oittV=uG6cG)%4fp-&U@>etCQjGjW1Cp=o|gR^b8y$L8?6*h%a!CoAj} zQSs17uW|%!xztXS;TL~z3mhmYz*~UXT&V_11$>l;-9Tr;2C7_ga z>7Tp=lxMe;VoGj7D-63Bl+z+`51-TBoBiqy<^u|?mb>_HX7|l?Kf?q6j6HD6kv4Dp z+?h6uHLCd+x&V%nCFb;JeCB%{9p`b!$C^ML6AM10TKf^7-Myug|8?fH)r-gTPFrsI z3tn5nE|oVAf$&sFxq~t~K@pu~`kD8*y`zNEO}R+;E&lXAZvWUant~t`x+9D}t zs5E>sBYi?xtOk*;R%axZV2NFyClhjR*A=zxNCT2^ZE~~taJp)m+_#Z8>mbn=oj|6s zhLg8h>vU@`je9^})ta?-wTpiV)kdTB7PGsUJv{Cnw`=Ch`kOla*DxMk&sAS^T8-mw z&8)vZYPGw@!)wypdiRfJr(5mTUe}rnl%saN*#+0;L6_KlaJ}caSwCpK#D9u<7kV^0 z#@;pUMYY}j&a8IK7cUPR^MbCG?sQv6#{KIp)n>B=1t6rOQdFwkq%4&xqm;u`BB+on zhf`il6)^fUK9~Ng8dP7+e-jnaAD&`GFa*eE(y8TNE~DqND9WW@dh>A>Yjf%U2mTKY CSZ2)t diff --git a/env/lib/python3.7/__pycache__/_bootlocale.cpython-37.pyc b/env/lib/python3.7/__pycache__/_bootlocale.cpython-37.pyc deleted file mode 100644 index 7ca336670af2bea3f0715ad10dfe6c423077266b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1274 zcmZ`(QE%Kt5Z<+YcRt6trd5UL3v!>pQk#?7s;vY&0cO@d-pWE zZgo+30e(pG$iLy)uRQfH@WkvoDWQVB+u51%?#wsej{W)ecEV^>&v$+rj~M&Y8J8m_ z;E#|(e6c@)Z5a3Z4@{-sGnhcq+YlVG{MyMMds!ouY|1(_?c4~P>1AeD zBCGYHtVPynXlZGUfULBcR94^`11+gsK+V-xTcPZ$Cxa{rU8ICE| zU*Akux)Ia4P}6`E(Iz7+baXH%hGO=~%yuD$#I?xSfj*ZLyj z?t0VRq_lJqOM%3yP{fW@$6KzxAqmD~9&vQ`>;~;D6`+<-u4OG=iTYo}xI#TK5h;$4 zJh&vm1J60Se)W1UTx0v#?~!60v5dbB>CBL(5BUKpSGk4&SRMY%Px)DN%FbP~w~S-Y zI64?OaKcs64SN=SzC7rmr0%IB^&LF7$YmT@Uw;_?52}Z>;gn%)*)QBuA5QWs` zwbb3{$+!ClhX+Spysk^T)Yx1U)(ue@YNY?F?KXum6B4dAce^Q{j3S=%qksNm>dON3 zq9}S0E;a6u=o0_7n%B~jAm9m~@FYybo%nA^Lo8eX diff --git a/env/lib/python3.7/__pycache__/_collections_abc.cpython-37.pyc b/env/lib/python3.7/__pycache__/_collections_abc.cpython-37.pyc deleted file mode 100644 index 19a2f9187089b598d7324d16253dd82679d3350f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28967 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%0AYwYehKS2~}mCrWwaT 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 diff --git a/env/lib/python3.7/__pycache__/_weakrefset.cpython-37.pyc b/env/lib/python3.7/__pycache__/_weakrefset.cpython-37.pyc deleted file mode 100644 index 57741ac91e2529618dc5952a4873bb391060c9b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7487 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 diff --git a/env/lib/python3.7/__pycache__/base64.cpython-37.pyc b/env/lib/python3.7/__pycache__/base64.cpython-37.pyc deleted file mode 100644 index ef274489ac9a277c68de0e9388311a47d7ce3326..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17013 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 diff --git a/env/lib/python3.7/__pycache__/codecs.cpython-37.pyc b/env/lib/python3.7/__pycache__/codecs.cpython-37.pyc deleted file mode 100644 index fa3906ecf6470601478245a90e2313c4add6e779..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33923 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 Z6F6-*m~q|UyMYt7q#P$WbsBSDS9bT4*x zXJ>X#_X4})9!Vi63$jCnvU4j%Q7!CBIj*=Wa;&O2aVl{V*>UWbBu~y%-khYuJfteg zOTtvFeBXb%dwLcNMv+tAt?uc|>C@-(U%&r9{nFG_#lYXnwVCU~Zy3fO^CbN%N!ji+;&3`xAcUR;f|;C;jTXMq|RC@@x35_|yIjekc8XejUHnVCt^XsJ&wN z`~8V`4S(XU)tJWFtUrgdxnSn5-Pq@wjXJI!@Eu%pg8jHQi}Qni0q2Ea)<5)~EhP^7 zMO-Ncb3y&C(>UNC@gKoE4x;R%ehGIMfY&Gq$m_tq8F+uFXmy&eqbE^T+4Ywgy> zPBRQ&j3U*(xfuoX=5X?J$`4fFUuw6aVfk`*bM1{FY7QM94NI?eBROzh?lf=7sT?@X z&8RmlZg$%nn?VaRB!B$1v0cO#9>p#)V$9rKYyD9wa^ z;I^0C-pv)a9lA}|55kseuSY#~+I_j%2?MtmEeGmOI}8?vCC|GRM4rckP!1}d=Lel2 z3Oo;eDlIp|Ci;j&8#Vr#q4uFQA6`DQ+*=FI+zh&BF7;ZQYe6>(&tQmFf))?9qvc)~ zKd%J6*RGriy0_1C+BeUv%jM@5eg;=I*A~{dhc&Mq;%#aB>g;V1JHxJ+6;tiU(b$kU zxFAFFIu1AxcTL}1b$Xw{;8?!>b?Y#P$?+{7IT*oJtGD16R;{jMfrzD?eHdi3YRhp+ zA7cQ^{pWTMVAI7&Y<4lFp66o5g9nH212$;!0}J~P{^UnL`ccEeNSfXU{~N~~u};v% zkHd#$-1Ls!99E?3QvDH}hvZVjs+uRws;M5q@mR+*TG*@O(rI)n>F|@jGuGjPZ*n+r zRd>3m2a4zDc&Y#KJvtuhem|t!Y7XsFq|p!1(I2UUJmRT3fZe>Q4(lIwY|nn{>W|@e z)^FFGF%>C2>o-T0n@sp29QdYhy=x52*o+Mi(h7UichHAI|JWPN)xZT=ySLi6gRa{m zZ@Qb^r`Ox9)lTzfCs=5)F8=YCoL z16OJZe9YwpMZjgHdJ3|^34_kku&}OrU@r1SZhq&yn<{9odcCgKYIZsv~bIz2oRo?qCrivGm8&F*Tqcc*)v@@dLTs`i2{5FfaAt>Y(-Vnzfy7W_gXiMn%!0aIivzt1?!z=EAZVr?P%F;c3p^8)mvBXW)!%$n;iJ2h=s_G8z5)Jg6fpqB;e^LN zP!05d^{Q&NR$U4_cP&`E87Q|$ErH(qxEgL^Sd#1Ph8`zUoeDO?z+b3H-&q}X2?nmy zadAUPT|cnY1Fv%2NQ?`fu1tmrm4z%QRj>ttYDVo|ckG498#1or1g9Jlx;Tl9yT*=r zAL8>CgsW%C-j=;1++r@y7lws!b3IU;pmw)SeKIxH5=<31GV)|LLQGZrR=201G!QvG{H0Mjg`t>^MWz3V;j$#emS<6Of6HozZFeNE53{RCs6-){K~-W{xap*N@caE zeh^iClt@bdyj(Bi`tNkV5>2uG_s#G;uj1N&MA<5jWAm`FWa($5y|ug6`{3BvTA7Y! zR(b5k#?C&xb1JIq_F=!@ulY6VgZt>UH_g)M3)-AIBDtqdCm|0ldw+ zZ@~tvfx4&r|KZ|tvwMrA+J!=gY2=b#wWb7b_mrIH?T&=TL?A4Y@AK?HDyE@Aa(AOU zZ3syzLK(~JstH5I|0G_p-f6cWDTJI^mnJ5WENnq*IcTk-j-{T;z3?qGuoFNPfa$^( zXwE&Uwa>gLw^T5Nfx4Zs8!HD*mpoxrZ+O6KL6*ZJS`ULwzn4<>a1ORpmrNCS-C!%B zZV$A))(%6w*8@LjLihS7HA{MlAk^<;TivBi7;b?Udl&@u3DE9vcCV_{&*0XF=IIYj zxBqlnbE>Ao^`O;W+IE{AwAJ5+IEZu)&$=g61N@~sh)d?Be`EQPjiA+Z5TN42LDWj&|a((nim<&>z|%E|e0f z4-tV0jD}99jmsZrCv7~W&frK49`!hnX!D6^RzJlfDkSv+ceE+gGuRD_P#ZzlS5Na~ zQtVc!i8W|EN5sj{Mo;ANMk(nB1Pw)fPPSaa>C4!{^Vk^^Wz#Z?cG)bOHEb2LZj~Wx z>ZSv;gjb7Z#j4@Dg{^GO!bq!{$8eRu{kgnELZ6b>l+;tGT2z%f$)kDhDAW|+PSq{S zzZJkfNaP;XQ`%T+YDM+)=dg)ZE*BlMT9j)oT+9AMW8*9wVwYD|0c>HYDwsA@P*7Z2 zSrzHH!PzPK^Kjqz4;SvcjyP~O969a4O~?~;;>vL5v=cW8=WP~GR{c5u0Dh<7njOM# z%|GlP!S8f1<3Hj*DsS8e*Xt;*)&0kP7r*3Ug>x!{0*!hcepJ&5C{ z{F8EgNL1@#2%l4`fDZQS)P>r_BLh)8W*UG)K`n3*TS#)D{(@A74x>!_k~MG!g}C4w zs}t%pq(7`<-?$5@?VIO}m=>|MC@cs=hGP%SMF(lEy#=y{n}iebhl<0}nzSNRCs?d- zvl#|qV}hd1^XUOjCaO51(^y$*E9gJo%^4${VN&oqcmxKL=M8Wn6j$CZg5JuYzWyxx z#~wr7Wd&R8Bmc-26WB!K9mD>fu>*VdmH~|gokuBt59f!CfwOfeb}kv$X9fk7Vb4*< zG&bC8koh~%cpRN?nu8+FoO{MSGcMk@zhn=HGjFrMA5Y(WuHLH)WR|b>! zjCk@>#)i7a_gf${)IF$1#TZ(VIKi?7-8dCbLD!Z1(hf*&XCj`ukM@bxJ#o)~cK)GX zL0c!z8Bqm#XOcQDw(dbw4QjAAYF;%0f`H!|+E(+XHQo@{c4qDy(xT}$@9y)bSR3@; z*?VSGU!CBQUmMIs`@dm=1%#mE89pJJ^=vd7*Y0AR-Z!_N*FAdQynbr1FRsMGFSX0M=c8y{kxYb#ao!9LOR`{HSglBLc^kD*r7 zP8%r3SghdeoUx5J;dozMKSw<1fMY~QS1Tyr(TI>nfl%+IYsS_UzmE66I+%6)#w;T8E!{h-FX6HWj`qYIBd0QTxEY(ZQMH=9rb6$?yG^r z=N3hiwrK0}kM=J4iMl7G3ky0juGa=8s2ZFTo4;gjIB(@#S-4i#!ZSm2m6odrB69pl zyL?zV#|y3A+WPsw&Pw@)qR~H|W94pe$MY64UvKn)DCnWRrg}r8|JZ9?m^p3w3L_7K zCevB>XP+4;Y6ej&{plCAS(VuM3t8vbF$%@Eu!U4U%k12fbfZ_qu*bw50O42z8{*K8 z04S+?Z2h9WQO`O(@6fVmmtff!sNO>LDO9B>b)a<@@iR1A>T~jYdzXa!aN-=4q724w zpnzzyqG3V1_MiBO0ZE@xPsmFe`vj`Our<}KPbJp38&>MgnCdFuXeHfRgFgN&F65?n;v5aXt#x(&_gJB(pO5TJS{_EF zn60o?IHZvKK$qyc!X^^e)q_S`Yhs+GGwLkr?>{l-Ir=@=-ZXeothMYWcHR7mVFe=w zd#$D%K84UTx)X!<-0o#Rd{#aDSm%0@G#y~*o5MUzf_n!5|w%^y~;@tA5_eTKU$*bR%? zGFO**<#q0sc)1)lZ_}K=Gc3ax_eg6%uBp^@^`R0}i-gpeYHQ}yrv0!Y#iYrwc{E7u z(O3|G7+x<7hUK0gW|jf@SnSlHBk!5ay{9n)_^H>0$J0sP+^Fi&(6uxw7#`eVjg9m{ zo+Q>I$d}#Jlq;4byNB3-5mF);#wQ5RkQ75VT<&dl;JI|}G`B;dctplE zmIVI}XNj%tqP|@ci>!IG*Mn7l0B_WQozvf!Ynr~hC=L-=xu`+6VL8R4hK`th1$aU# z662J-Q^H1|SGqvgCbj@el+`RuE{G&J;6TvefD__`ERLPH5Ep&xJ;F+M^DwHo4CD;x zkxIaR`qEqQr|5-i`aDesT)V6AZCwzuRvj`nIluVoGJI=IKAHD@6M+Hu&NA@R)JK=6 zcwfV+%><=`%P7Jp8+lwv9@&L4oop`z3+}~Ur>9OnH$RV3;-CwDwY1r75szwi+!wFB zmerMe#Ql^Q_a~o{3Z6Qx9okPl_2%VE?kjIzzP#wZ^!n#7KQ%v}>)186U%&+V284vi z-*Z+&Y9xUhB8qQlR1E~e!U9M1mh>?OZ}+&}V1e*PN?mv=&{NWMA;LKic=*mTbmY_F zI>62|(0gkHLptp>T=aDpMxB)=gt`erEN(M$Z^+S&d6`TMEFJ{P&{Jn1av6-`JJ^oX z$$YFg;a%j$;D#p0d@G?F=;^bI`X&xBuh|6O3|Oxw9Kwm8%$kT;Qad6IQ0Jf;foCAr z2p_OYY8F(6W+xR3NQr@2Yx-y*f@26rjcSYBrDnS$z-01vDbLFB%m@X~O;gHL59v>{ z6#)fyiJA+%nd=y2C~FmrG;0D{3b?c#f&K+5|D=0!8xtgoGwEt>v~G2JH&HvVqjgZS z`x;3DgV7GN`UHIHDFyX*8bFhDfrBaiVrK=NMZC;ywH1P88XXy%FA9qrrx~`B0nSFS zy#OVAp@tLb($jo^E*D{jZ9}4{K6gLMU5p*nfL3cMgf(B%ije5aupq>|*K>Oa zLl%k4`K>Xbs7qvl78`{M*hJbrj{}0S5rUYZOQ*X7n-lP=?E`A{?fW+1 zM%+hC&+7d&Y|{edU~!d_&smgMQ~%XXf@&bc?$eaSm;(fQdflkm?lJ(W0l$c)z^4~%0%zPsfYQJG%fVJvmCQ33K-Op(25q&rT$z_os7z6qer8XBgid0i5Q?49nIDFqHgiRd_g)gti708Co)PJuS#JxJV)b& zfh65uho>nxCH)n<;^)w|i|ipa8zZ+CH2D~6k<~P&%c&5BG*}B`d%o>Ew;XozAfs@F zMUB}JH6uup*k7=WkK+p3aZCTW_}M-Dj0LsP^v|+gd=W=}%(jr*V}qS3W}1&l++Zex zDyHAKUEzS!8+;3{Vq_yT;sxyo>k_{Cj+Nv^Fn_>megbdSfmM;YLC$>>)k#VgU2yItgf+# zQF;wgtJ@6mWhE%c82?sZ=Z^d~EPpoG76MHuQJdhqI1Ut&U~``Lxs2fe>=N3oz!)7P z$*kxY36ST6BniQh5cP!5BgAED*4M1?5e=Yo?0Fs=z}k!lUaJd?aYDxC45|u9%1C#a zz9~^E8h?w~1F2lt<;t=!Tf5tp|p6UM&Hu#f5P$ED@VPc3yo|G z&kJ(z%li^?^T&H#|L><65lz@InZc#ykJw#LpBJ+&N446VP6{)^0plB?+B~^Ky?0xk zO`n_(NQZFog1gv5=v#~@S``@+z`$t2$Zz^j_qv^J_jVhWXkwIt+XF?LIcZw15f~;? zho;p0JdcF+J=|Z;hNwKo6PbX0_%Jb1Vg;!Z6mg5lM3DZSQ0FoCPod_N1jboYeVL8Q zUOG+(8UY!5W5x~yYDVl30a_+S{28&t?XglB8h>&H(OZ4a#|qO zPZ_nQqmvp4X+h81Oy312$(seE5?OqM%8VNaN#Yxv5F-6;BJMVf1REy8(a6$qZoqkB z93&B3#y6b)|9lCy@+uq+vEgBgGXjW&86YBgGa)aPUv$Iv8ju=TqAVu%R-$#Z3n7*y z9UfOGww1()dtF=*Zz`khkOK(%UGJePWahZypQAF!WO|Vt>oi4SN%hu5smMin)9I`t z6@-Ag$WG8a^pd(TqeAc=jX^$;Vxc4DBCOFrbWvMIS*H`qUqB{D;3?3i&Gv@n@vF2H00=7K7X= zMdc;r5vm`?*m%Wv4jYp7fGf8kjR(~Meg{)qmyq93CF5Ox0YGtWFdbKRD)BTh{aQQ) z%T4mj5T%)krx3N7k?4Yjqv?2NN%9Cb?jc6-d~BhHg~2|&YoEO5KOyR1F~)*-A)eAL z$NNw}j^h3CB;yVne}I@pX{QSGAAO1^@s3$W>Llv&_V#QvwNvv8_sx}QzlcbUjX1?A zSZ6cQzNo$g8x8T4tEMrSGmXA;jW(t^nET4y7YuEwWi_ot`w{&xkpWT!=rZfg#tz=W zxY5@D!OVJd@hteJ)ch-$ii^E263p5GlA2QZ1f;9|X2@*fEhAdZ$!0ONfE#F!GzUVQ za=}{~IY_(!Qglw)gs0&YB0PvR1B3xI*dPg1f-le(%s9e@KLoS^dc}R4v3Z@{0KQNG zITp{u)BU(BT$Nx9BR~udNstCIC73qfhW|e`p3GI5U>Eal0$vc1;UC9iZ>{S-ef}YM z$D$5|5G)s0Q70&hMmnGw@)h2CgFA8h#t~w*#v3nUHl9PO*Ntk?JOGQC(Cv)r!g_WPtT}|=IQ&q+ z$Q_)sj`?E$d#UY4SA?*N_$<;A@>MWWF5oMoku0Zim39}52XLn;2q1pw-eBE};JlMxlw=HP%4v6DVd1*_#jI_o zuget6&G{SsBZ;O*b`~;*zdawkzGaWNbnC)(jv2@QRgN4u+va3j`2t zz3tl|iB|^&g#1AWOH`((2SvaSFa==jAyFeP0Ym|bL^d{O#aecdRPjt)8rWBijc1@r zrA~DWXU7m?M=7Q&@)vJ-*LMcxF7kt5QZVvRUZSyBY)+wzd7es0nnoigC5y~`aTKlM%Seu2Bc$lZI~eG9u` zIRT8e)jeJl@9%vck;X;S46DGvqjoEKk0@vMPQA=s*6q}quJbB|C1GvpJ!MX{QvIqi zQ!XAjTArwu%T9TwZ1cZbk^R){C#o(h&Hkue@jDgN^nxZlJB{N5{=s*lv>G$0 z^AX9Bg9nRcPKUr-kBS8DzxfK2NZYMEK_*Od3D*IvC0_Mnu&od39bo@Gr=`2;F=3re$Vp>(g_TQ|64Bn5ND?#xkh#Brj=rB zBA@wH(Lt|XOYG|Hy00_tV71>j2e7=wDlen%9a!U7U)Hb2g@KJyw94^6D14=mTIKLH zfC0lV`F@O?o2UYEGfzX7@;P_TOL;Fq?TYc9QZo#G~z1 zV>?;fVe7RWNjOUan#is>5%w|Gl5yO{3DW434BoRzs1>F&vSM>+?4o$KNR*{XiW;<; zH9w_8FDn>#Z48Q1S;pzGC?;4aX%33vkm1DTtyZv3>8GtyF(IGg9e|m12AEXrn~t1Yvq0~Bnc-9|#}*_MQlVzeKvC5!N)3kP9oTye@Yiun z`9XP7gGJY`QhFfqP{eDC9K=8JBDL2=Y~c&oZ9NOZvc*L_HgLAfbf5_0gMds-`>B+q zHY#5*HY(6WAidOBc?{1(n*JsHhzf=*72lfSE5%#|_1CZ)Rz?=@NJ1zP4a}H+o*mUO zmKqw*Jl=}cKcbsY)N*&4cE%%k5baDlL)Tl@1Ci!nmp-^E=mE+>+p~$o@d?x*Ngcae z$yxX`Tgew1R==j(mQq?~8G=j4+oM4@Bn2=6VXW9ob_&2vo&&8i)I$i)(VhJg(%zR0%7jAFd{Q^`a>1do%M=3wU=!{LD(0}@z}cEFf?mM_bi@Q}BA zDD+A;5+fp$9H?v@I81i3g-_yO1O*c8=9&~jfdj1Mpy0j*>`UTC#SvD{$4RUEv4w0J zm#x68hDZ?u`zVE&j~rUK`?jhv*>r`=L~!(Nd!xquH_Rv}MEo%vGc!!%tG33}WxBtJ zt7CoTNFfQ3K(OS!z0Teiaj}T8MkGow0G-VBzTx7!FmbBfbO@cp8oKa;-LKnhOH$@qCZ{6#9rSl}6)fXv9bWyBg0rR5?S z47A;?@;b&0L`WA5QAZ3qb5>|j6jYmU6{A}GYto;(fgMQG#ZO~0$!+6O1>uvS4Vk!` zHu=O`Y_@Q7ki6Y5VVG@4X1ax6JRBp0Dl>bqUhgQ0_Etjod`=?IN81QUK(1Zh8f zGwT8roAQLdGbS*yx7ARRqk;{|#o~lYyh5f+I8aZQ`WOoC?&=e`7UW)7&zO*l1trHZ zV+Zz;oAi;S#J6(f`;T6Q$xZw<4H2-GL?JDpzYJXO-E9%Hy{rLte?l6-x_*rJKF0To zQhUgYKSBWg6xtN!UR;qEOJ$2KvMm2-y_B($jl=I@N2~xc5UZC!j)i-s!fNPyFsQz1 zA|t!-P4gQDGQ2H863X|?9XpW_#qHU+xPl}DSyf(m&y*GJ$Dy1GP)_SwIZ27)s6>Jh zGVET2kSM)p4-Dk98y;}j9iXl&6M}OZz+t&^fKyTKe=+kkE&^OeXeWmVrhd1E2_R>= z7LswER0~sD31u@v+RLPxixZJ*hjh9!7P}!A0IAn7>6WZ- zKajYbiv(K8{cLxDbPbDPZ&S4r$6sW}ucO*;aegQkD75+?)3k|p!8eNbl37^;Nv52$ zx3CFNz_shLN*OaJEMn`-IW1bX;2N4q0<~}^8!;@O>onJH`pxsdgqHkwTrv8OKeQFP zBXy`O1pqfsBGM&!xYH_Qk9=m|eD4Sy{Vozbs zL;}usqQv*q3jYB2e>ttxFcr_odTryv1#ICucH_O)j%-lSt}I;5B93LT7moj*omuV5 zVsV$av5jeQTMsMpQGefCNfHTjLYDANi!gH!sGTzRz{g2!g;-t6n2Po~xlnxTrOah` z9xg)-Ko(HmLE#Ekn`|6~Y^E>zrk2g{>Hta67T0+;8%NZKslS8!jdE6eMEIf_C=32J$&+Ws1XoCEj|+L@ z2nO_zun`M;tzY#r{-9PN6<@?Ai&A2)s3wINSbSnm^D7U=4sPvA$qu3V%VD34LJ z?;$YAd_@U%@ojVpt491lzabd8xZ1#9!u^q#shT*21CY(aaB6I+w0KX$N${a+dLk=! z&jP3McR35QI4}wblVkZKqE322fsO2~NAz6ih`_Fu*cn}srZ_n=F$5-vcVRG@bowOh z!ab5s`2~?A-L!B)j#lZ=Ap4L4JfC#R2K*_LPG6ocYN+Q~)UCe8-CyAD9qzj?g zgj6p&Uwqbo!pZ~e63123^>5?CZ~|)<7#s-v-EaRgZvQdgK7#`TR#pYE(HU6IjGgwU z#@dpN$k?QO4bSbG6n8W!8f-!2kAsbGQzT3F3j96M#NdtNBCu`n?y_%bzR;%xO-V{5hv390@a4jD){-+aaNJ}lw z&+O?(?eZn5`E^v05>%1-bhz+5ai2(fkCNJ3CdW0 zIe`G64h-Vc8Q`~RMgOP&c-}{1;_j_LJc!L-+Q>{^9Y)9LNx$%{u zrEPqelTDA02r{R;zwfnfr04np!EI%dd^zmjrt&#HC4m;!kyaYf#uY4J59#h*;vr zX=WQng(M&axIZfHpdLciFtg!}!oa4P&962Y$Ye~+?2UK8I2=)+Q}mof`OQy`3}Vee z|CqNfawj3HKjhI~=5Tp5#_D%as8Q<%!0Yj4GHt`^6t92EJ2t$sMr8^1rCvF`dmcDv zF6ZG%92oLp5PTlQD#GZ~2`9|IDI)EpCaEVyEZyxN&1UKUZZcD*vq#AXQ-s{i2stJ& zn`a|9T!~6SV3uAE5-uTWG6EFrpQNTWunfpZglmIVtCe44p%D)YjgigIXEX*q>(Gg; zWvv&@lQ9bTd}PI*#!0IDKDxCdJ)@ao&z3%1*@zgr#71(Y3~6M4dep=Rbxk&+KYklW zTIVNgBc*BrUkh1wrzM3-301VKt zj|OL?4{CergI~cT8dfBkt8uZ6lX0v}1&^6+)M*@u`>>P`5mU1I7gVy;8mnA`Edun!MFQf5Z7lZ$AoKLcxo%U( zK_G}13d(bd%B^S_um$5EyE%b^63ANzT!#f&JEL){U83aIIbi7k!T~&@+q9Rv&>wwI zPEQ@zwk01@JfQ%dh42mUp+5C_?gXH}$fJO}PhvM;(4SpMMgkc@=?ChPPej~Bp~jT7 z7B~v97<`L!SA!=}F&L5YijW-bc z-FO{DR0zMLbp(=8zayn+wIal$)iOeD0G;^}X21L%J~0JV45f}wA3Ew^aS;QYRGm14 zvz?OuNEMVfW*;n9!FN=M6Sc4y1S_Z#;4005N&=1xqMOGki=!iybqogrEF4KJXlum~ zgaaQuj1eA8=_`ZclSuwGJhzwSt4LNMXNj+nPf#8m0b_d+*WT@-Stsoxql)pS+Z7(w zOGpv7+tofx=nmhBTkqY$I=tSJ7v1T>c3WgiKeD;~d~>trP}XsiVWNhj^w5IdOdZob zOn>#8DEf8OC~>g1 z@H!5@J2G3u_x*6j^d}}!^0#gtfsrd_-q@gJoJY`#5k$bzRR%F|Y?HI@n)_jhVkogz zogIEzFEKYohCf8y|7(={1-47u6vXcougxFTvBd&&twX({55@T5ol&GX)ZgNngcpyH zqb!a^?q(K9<|kG?es8K6~x5Uvhmo+sVO;sSir4ryqN8Ppx-X(8OF|4N7- glx9Bd*fU=>_&-zss&TN6VBpL~{Y8|TDnIdm027MahoiCRt~*Ef&n8Nu?l`vse_}E`p>?`YtwS9hpJCN4+9Iv3R^NZX=J;Uv%R&zf5 zGqbGE<3yz4o(T3r9d+Y$CwLL-ZlJm%NrHZ;wUDW5)$5(q02-e!|MKz5gI_(q9jrcB zTYLQFO0yg(R1ii{CON6lS)jWjNU|tQf+$O$i&V#1+L~yILM7g%DNJ63Llx+-2XzDr z;?$@eq#8D?L1$->Mx;vxSzpLdi(q>gXc?v|3ALFUpt0Q;4NJm6ik(3c%DOn{OQ955 z5(H2-#2gXeWNVb|_2CLW0S9luD(GY~P<^}$3OGgvlO3P#^Tg(QJ;1X% z=134q5&R~N560Y4dYFjMO3W<+;xQD$62)^Nhnm=CRNOD6Q*oFM0|jA%ZRv(GjIeA2 zTvuX$^PC<6P7%Zv$V=e$5;>W00yNGY;|%aYiea&i!BfyF&NykAt~f4t16v;f(J~_* zW(bcdB24)t5R3ylv4rbrM;6me?uAJ_65Nc7JBDW^Yl*08sI=Gv-}VPFNI`pTfXkg= zm<_;%^hel)Fx40rtJ}c<;c#xp-w{9M_@-OfnJQcaLAUV93NlAhnrYgFOTk_^5dOuI zGw3_}VyT<$iKT6kEb*{MZz!o1bJ@Ib*CMMV$$f=B2!51BP3>0NwiE4MVrC>t77 z2T70guFQWVv3;1?Ccm8L5xQ@5*d&=!F0Dz=6ig@cB1SXs=Hg88lS z=qM|sW;jN}8X`&)iIURP9lUA*g=M>7jnC@vpU>t|&a*i-bsjN=@Wy#p&;VNu zGjed{2q$K*Ml2Zp@&C$Tw-M}7GBCNAVg%WpGSM2sEx^Vu{|$aPcRe24Jij6&sz z+14RKgCi(jvx9%;2$7!kn#uoAPQPY>5sW)mfyrI&_H6kucX$Qg&i(>=JoK!gr#kKN zdp1UYo3q18ULjrbB{Ws8S-b}9%e-Q=O=Mq>Wp&8Dp2!Y@@yKtcQb&F>k?#KqJS5E( z`47xILo>f-`~N0;^UCjR*zEDy-0M~4ce!`WaEX~au@AlU_lT4#p-Nj|qrID}2Z8 zWlCy+^Vu9|I8<$ zXKZt1Z>*2(#la!cF zxzTR=g@gODY(QMNojB$4nrZH4aVqKT!|^iMES320;B6X@w$U?ZUt-PKqPn%kvuJCp%Yx)kMX7lxRhjnnb+LfxPD>;DDHGG^DbME4 zgv^V$g5R_Z!!yc;XL^=rdybd!vR=;1dj+rP4b2Ue&9yOa*c)kDOLo~djcZ2hfMfX1 zVo|+p8vOsV(X!q$P-nE6S<05PCiDB6xutwLFZr=%VX0UyO8$Z7(9&>u82Rz?h_}By z>W}!Nb;~>8neUn9eevCco`t(H|AD&c9rO+%KQ8&h-b2Xmm;4d$VdM`;{;2l}9l`D%BKB?rN&XDPy3&c zvS)t7DL>+!@-pukwQqK_jgS7;gtsW~swxiWw?P&G9S469#e{91pKknzfU+`Y={)TtjJ2U5?r{n1NtoK>e_^kg) z)OZ5*jJoMR=}*jCe#xKoKUL3oFM2OwMNW8^y;r;(awom>-UW<)O2+Xj#xYf%8W@MA z)b??BpYtxF{{Ua*a!Xa0mwgpwmC*Yjm6xtux%leL8|P=PUWxW4g>PPZ<)y3VuSBC^ zJFGS{~`?b&amm&1`^l+{j)tR*!dWv_87-pe>$kSX;L4rD1H?ADXE3$~E?CRGhAX zjW?@VP^dR$)7+{XZ(F*}ZrFC4?e?PEY%Kb2IPb?bytGEK=<2_uX(Nz&381itS>M%Q z;SE;y+_-XEHRc+vYO~*K+-Wrk8gngQDpp|fYi zOI}r1?WJ8u&XM(Jq|$f06P{nMt~5hTq@DJXVn+hB+aS4=)QV@xY2ACY?fSs0!})5M z^ifsmYH5_?7;9~%{9w7=@;LQ$+V0NDC7qvY}D8E67r=n z<(B13`q}*jC0iZEMyXFQc?3zxQly-+>vud9;L^!stOO#bH(LnrP}WRAfdvEy0fpnp zbd4cVqP8W+EgTOHntB~IMWU zh3`d$_A+=<0NS);e$h~6F07Cmpr5~qNd)9}hE+84remrnk>7p72k~V4gqIJ<6fK$J z`E-h>G0;8DF`gg51k*bcPfs1gTS|_496yRntca!R2_|luaGx*_FxPkF*Xc=)Pt!m(F00GZ@&3(p_h9Z_r!Tpr`lc^FQ}& zxFPP~<_PRTjM?k{q_guWt_;rZQ+J&mA>eL%)ONR_)rE9!K$N|LoJ?y6PN_+}a<7vD z@@b&+SMHe9iMvkf{s3=}(~03OL7n@VMM?tv?j5r@dDmIo8}RNz^Y*$qdN!btyV5)i zc+YT`Y|&h}amVDQ?>f0X(ziWR1)=skQAkbU{d)zq1b^njZ*U$deS7MzbGR=s+cTx^ z?+oeN{mdYt&~xFpIfDWE_Vit6ac?lY3w^ua+1!P`Va@jrXEF7j^S^h;>`vWvc0UJw z+pE|BklU5MJ%hpQ8R%mAHs^nE$E2RU>!j`v@a~Jg$&?6q_cM!>1o%I^V-}xAi9oT? zed#t~+T0smN+_2{HL42y%fy$B-=K`-HjFVe*1eYxjaQ5fbKUHk!6TvR*&F7&CiHC+ zW!CBxv})@i)VO}^E7rQb?m$*F7jx<<{5lmobb62&p?^~^f9jgiqpt0Ao;%lsR+I?z z;KQN;)EiBhS{f~PsR1PxLUCdMakW7sNJnd7fH_?IIa&%t^I)pi-E}j>8@i?k9bXg~ z$t@O?(>1?q-Jm*S&Olr~gcea&+iFTyWKBI)w%W@OKkZsG(2^L1u#XF;q3zWm&z}8b zzKCzl8lA@mh1#jp%{J^m!P%*_cIUaJl_13Q>WvnabGPYNao@&GI;A$OLShkl0g~`p z7YKg#3>43NMRW!gM#V2tJ=9vKy;NOQ<9NM#2uUfUp2tr)quT8-h#dZuv+ZRXUieG3 zNM-@BVnrpAKX>?#a0Tqgu*V?}=kY&|D{GFK18YlSERb**nOC>Lf@g(TTfzd?((ar% zM+HYwoQH|(Okc-ow5T7tFj(~qYkY6=$KLrTu;v?O>{J;l=bTx#X&{C{&JhTNq4>Rg zIU{)(jFHbu9)@G&bCQPv8Tq{AVM0c};Ek4x-YCYnuk&Evc-G&l*CHF+U*nGQkH5UG z;0kEX7RwL})*50=brxj+oX7Dac?~2kZ$(^(K?}+wxcI+AkpPNeb{^UF%~MI$fwyx# z_OmT_2QX|bUL-b{;?rMfi*gl}gYA*{M|2XIV&4)BNTo z<|w8MXQ7REz8cJFLSfwwi{Vh$g1vpXYr%Gu0r$^T3Q%k_l?mWBO=)o%;3ob0c);Gi53@B=`~w>07FJTtg|T&8@^k|a!5zZ5=Sz&al4HR1{t&CXbV9dxx+#37mxUC!YO-bF$u z(T2GIA(xJ%1t7y57NcuzIU)j+9cL&6>%~ARNXL6D6;w!`#J%J_XVFqk58(cNgI?~f z0#O0^{09L2T}sJV3p45P2<04Nz>5eE*>;q&EoJU6!4-bPN+lCWfAq~+>NBVpnX7tv zT-*oE#&b zs7CRSmg8abpm_xDlfwfbr7Nb3ga&<(A`{fW01z?jpuG#c1hkfqV!@0BXZg5i)SbH6 z&}SggUq>66PJbFg?7`4D@*QhO53Kh7Rw_q1SZLuec0%CQyShO;wgF!)yquCfYcQxlqyt}$t;rwl4vC6Sv8-O zzdu%h>}6KskcAcg6*7WOdE2oZYxtpjezcf(P>+tQ8m{!uM(#yi!D%FevYOTk89D?h zOu~oon`Htz3#^pXe}s7Tv~hN;Bhp@qRz7a-8`5(eHvhWHD? z&4tev#v0(43;aT;1KGA+C6Os&()N&9Is3A$A1*iDui>I2b1%`hS7kFxNb zE>%P2v4k7chyEQ>L1NOQu(XXPy1bP{z>7M_1tJ2`%mC;^lW>X-(P7ve6~ONtjKN-8 zk^1^Kn#muRl-8tkxB?EOdk3|7Wu~^(KL)#@tySFkQ8k*^^gPc)P;^Hpk7PySL z1xULKMRB2L-j8KnFtC(W5X3Wl6)!q)!A}ore(D)p*ilFe)^={%$-T3FhRZzzjA^1l z%vIG}$g3|iannRrg`D*(TovK>W~a1s1@6lAJCpC|$e#77cVG-#pLmCyc>RR?4iypp zCeqk?2}(*}2E9>g5p)G?f5R zF0HwpldYmnnUkgIgdk9aImx7OQWWke(?#LOc?Ik&?AoM(ga(K196=tPR>!2KQuYmdMnwO=fo> zfnHAGFtRk;REhG4NVUm!l!vfg2pI!|fZrTaVGx!JQiB^eAVm;FfXEsh>RdS@BDo0p z2xN#;JHTZL8dhbcHQQckd2zG8z!(?6j(Px=t)M!KT|$hA?!8hek5&eHORQ+ic%$rO zGBg?0fyyrL@;OBDu9(AFvbD~!fi9Yvwv<>okltwnlF(UyP z3{lQg;UmKC#1Xb#<}y-MH6YB=_>29v4*)|zC`mT$F|+gFj)m34J|$h~p)WvEK2F!t z+MpzB&!`(Hy?{-oja{ae?61oLNx0KeZ-XNu`We<8Te=G<&6J9}iYj7x=6@dD97JR~%zAw=jF93>1UBzi-5ZMEH{HsX>{r3EKL%})Y| zT&#fW>!=xo5F~L)2tI<`f_~9Qt-2EEfW|bgGPiEpggR=`gRTz_t?JmZBlaBpI!sA)yc`0o~CvzHXg{21z*va>zE5`#Y$UsBJb3 zFxU!ox@{+A6S?=l#!Y1320*#9zrUDwvU=2n{v3~jlmRH68u{goyQ*7?qy9c$Bhb3@ zB^(%yrTJaK^JTPET_ysk>}uOAT;4v$q=V#Jd7!G3Z;|l!|Mf<7Fc@Y2x47flEA(8qzH5CiVU-1vIhG2PWqI_ z4U~|NQOeOZTF1M&ZXT*3jT_&Aha&G~9>UYEvzTRD-d&+35p@96+3K%gDsO;sxCwv| zd?Ze@z062pz%HT)q0U3QY6lHnB+_!s(o&0EprPt&41$n3;Ufc=SrOF@DjVW;tLRIj z2oamtge?%lGx&YsimDhvyM@tL5y-~~>vW_td=Ly5vENmh9P2K&+P7MaJQPHcA+Qdi#uX$vfw93T zEE7mISTs};D~VB3V`;C@%@&6^#@H-<1=X9tM9~-Z`{4>|vxou9E6aESJ8C?Il#(Yx z&nZF@WoK<;qW5%%jY(iNHZX~>34$)h3Ky+3 z2$^iIodlWZIR#ScH1M_$*OM`0nzLmnPNR8XxB+D)DxvEz1f&}1!Q+0G)ulouk7UY3yopL%19N6kZ zK7q-k36x}H`~~Qn{%Vzxp(ot>#Hp#Lba)lAeJ&X)44q>IT8e&N(+Vql4>gBN%e5Q@ zCyaFeQW6Qw)@N3&LE~ep3)WHf5COBLlx*4!V>9Dfjry*Q?aM?cC1EQ#`9{LtlP9gLb+N>Z4SGKi1(?q&n7x{TMbbDp|ubup>~i zSL;kJBKe5xA!Qe8$jM(qb05W>@Ig}B&lsBkDF)+0+tV}^I-B(4q8_#?Wgm)hve>0n z{HR}I;xdt~A{_lsZWRSh!=}R3dHha@?88aS+|$8vKY7XEK8H*XHt(+4%R+IrFhHvZ zn>x);JzC5sdzK6xF1jm551uPb!|CPXX|NWAz|*kSV|50m6Fc3=4b|6}$ei*~Mu<)X zD*_Q4dZxOCr%_&1bg)91bd(Q3t`X|V*?7z7?c*2#1G!$|+uwtq+v-u;{Xy%O zdO7viy%9**R=3bI&~FaEHhv2|^C4q%1aC9&{vv*D{0@28N0!MrP_O57i)UCHPL$I| z>p6~2#+&brpwHZ#SQV48OIyxLYGeD2-q2!ZGuIy}$3M8K!`oo=Yuq-c*=Q}|_#o2C zvhr`nSvUv7vcsc=vhAn_v7wx6H@!Hltm)xdxxfN3GL*(5`?d35j+~kEZ(WU?OP9}o zDau|xf91{Buc~k0Me3LNwisyWM@Jw-v#CMHL8#oK`X*}$u@kI0!&{-VyTHyUB$?o4 z)Gz=$n$T&dMjl2!IyVSQH2L9K#)7LuqS|u$30&e%5qLLj9)_VKg*Em@SQ94VBGa?K z4UZq#2oS0VINC5aKtePOc+_UB&Y{abmF8H2>a$wy<`krd@$T#BOnr|DF-1{B+cr^` zx1&?zWIcK#|SD1;lv>dq7QA`ksWyHABK6HEo?VS5IZK%z`914EYy+AY7N-9quL zP57`kO#qO&ZJJK!_-=xQymy-vqeH+hFz`%di)8k)`@hCX_GjPUVV4hN_CtCi()M*u zpK7gPb9WEm>OA?g7eU&Va_TvD`Yw|Y3B415I9Scd{nX!M@_i(zD4^A6u(DC4&;3ez z7USx>EdAR|ewE4JVItL2;MP05W1_nO_4{nwhipz>y@%w#g1!Zl$Qamj#~c=*bpXQr zcgzD;-Wtp0t)u%Uf8k)}V1cF54w@I6r_vDl3a@jxf?r26XRMp6-@%ScbOM!k1aug| zQHE=-zCeZl`ZHu`9*L5TL$WM6LIWramQW$S4k82s_pFy$w=Wqtp1o!uJqF_e!hpcn z=Mf;3)qdbD_-|?4UVTLRI7pKzd+pkg3s#vwW87H1CWmo7Ize)sZ@%HHIVccsT>gSY z`A!D@jTIh^3nnS}RTE_z&)pS?|D}|A?v$H~l!;jGRhKEyi!mVIotj=!?diCWbPWN2A}3wp8q)JQhZTeI1h#&L4gZRS4GU~& z07)V(;y7U!Ed;7RE}m{e`j%+nMFKTDMzruJDz#HEkz?k4KHsm|mr!Op2QRj0*FY!K zf94yA4_3ALH5k^1FRy^bF2%t~S)M3wd8KT*kglMn-B$24ZT>hM%d_W^6+9E!sL~(3 z#=k;3B&wgmaSYVR(p5sUFdZl4&2*t;0iL9!MTvq?KSaHmRAVL5W^mcKg5!Yb)#vr$ z(FJhn4HJOHh;WFSAvi6alWGip4@5!0W@H@(_yM%WK!6~?^x)tN;S1R?TNXr41FnD6 z^B}SiAQ=Pzz(xQ8O96^WX?FGb9s&3%yaWC>&~1QTn1enHD-}gZ*4GxS03f*qIe;Kb zuv|UZML^H>(M@<{w!pKc{CBVENN0&N?mB`#I>I>bA@Z0lFcuwWT#%BiloUe9Dsu=K z>gM2B&EqQIa^~RS>1HI&G8Ma6vATf;i_b`EJxqH_VC)In%@ryjI!HXm0Ug@{Xa^#I zcSDtHbR?iK24oneVE>)0&eniN)XgQpQ0wg};>foP0;)X2>b7j-xj|g#)B$)XRLeOO*}#FED+EYgEp{Vj9dY%S+KJ~*Mr9! zR{HozuSAU#>9wRm%@o97%6+p1G!`BHrI*iX3j|KX!{n_E5MI0WWat7Va3q%z9Oyx2 zqkEZx-P`Zekob*(D_z}!VNlH9jsCfJ1bl>Rw1ZGJ!&eS!zIQ_UYfSl5C=XUr zQEP;HwA_oT-eBFkbT#2a-G;8L{5jGNt_tcwwm={vH!wN(51|jDdJSg~us5^{*6_`U zWN!%)(p$_yVMoEjB)bz2jwa7K-XP`!%848nph}NX085Oj+xCFO9PbON2%?b%!JJ@5 zz14Q*2y{BNc=srck{S4rk6bzXi!toj&=@QP#IbGZi3-mrSrnfHmtV^HZZYMt8x5o} z>_+?XS&9K)C1WqCh71PcIVd?r5_cF0IK!9@!~?NPeDsO`fI&eCY{d4`$ee|gX=O?hsvVTa(&|ach;9(y%HCp~ zWuLj{!uMtMzsku@pvZXOFt|KF3gLj)^E42(D8xECqf*W=vT@V0rB%xGX<6b09%cmp z3kl5Bh@0JjJt;Osi)(4qx^2bYPFR)5BsXEVK?wuw^PBc<8~Gf3q3KiflR+&qdTaI9 z+2;Cp*KOQ6_z;ZEfMhayN|`+a$IF@&D)6}%I<=fF=eC3X5O+%^y#Uc;Lo@W|HL&5} zcNoX3rPUkduCtH{v;6AR`xd0v6J+z(kFRGS$MT&AVM#*V6W;JsX_Xbh;HQvd{}rzC zH6zT??&1x-PaETK=RcjRHft;7P50*IcTjG365L}l;iIiua|KaTAmL5_CLOcM1`n_U zcS7vCAZ{RgAm)r+#AyPl6O@F|3kfInlOTCW1aMX;u}r%#zmhv6V5d=UfG_NnC;BWh z9#x8aknLo{h4vi94P-5BLi-4fuaxYNGqEh%@M=kr7~m8~O)ZTs#1T*<8z0z*M;EyPtG?}DzCrGbH;Eb<6Z z_RLl2)#`WA28;JkIiTarL)F$EDVIg$BGD*T0Q85SQR0IB5l5QG1IF?2P+#ZxT^DX! zvw<<+WATE!>q6@H@KOx=5Ad^N`Tj+J`F{3`VA$k>+~Y+b$cv&pmx6(?JKpwZ{kL7k z>U|Bhqg+hGF+Ng51Y1BO3T1(#Q3Tn_YF~@b>Nb#~iv?1ad`d)E>8oGvhE^ zQ5kbUq{q!iByU+H&Q#D2n(8O$DkaR+#3&z}!xh{_Lfq6oe3*zW4-sgqZ*`#!UB4vp zPK<5(3aq6jRvbi;ni7a!nZceqhrn;1+qHsn=pdw&=XjhCp}W0nUZRzi?GEGIkA34X zh^)DlC4nUXSAP-YLVvqLlf+p#+Tq;72goS6QR~})MYpufweFW(o)U?p4=sFNQabg!rg?9c^2m^lY z7;{V=XWAh=VvV}HZS-CnBv#^K+pQ2^6B19>jtOIYq|ZcI8O)?Uh71!3rcId^gGt?S zO9*SwK>*?gOJ3bM`qI*DV{WCrA}&q&y4wrxJL{DD-&u#X>n8vJ1e5z~fk3(lDeCW| zPzPOx$i;_QeO-!)N;O_(X=QivZm#fYPRaGWlqpn*c$&Cp*38R}rBVfWI%1yQZ~7m4&VrgHTd_ z!o4-$fNBFH4dOq*yHkg^0K=@0!bTfk-Gh^!+6+-<1)n<;m?4Bvp`o@oc&1J3xbeth zWjcAK3!NWB)5wS;>HMPG4v>ZxOQ`p}I0{F`GKg4+xxtX3uy4~c`$oE?5TRo{ASa)q z6V)r$#CI-(_C@c|w#YGua0%D!A|rth1$B(xOGe@f=RDSvz$EM$WX`o=iXE_JTKF*F z=NyC|ArSMX4#dPW1Z>979*LjL>t}?P9s@ls{Z&yocF@mhBe?@1vpRnsk6IkPQwcy& z>o2({abiDR;K7wTt9{%IPk`AjUiSDCjC~o4N^XqVLJmkIt2e6+{Ta!@9%Vb&AEijv z)@MjXg516z0F%k>V@||NHl;Uo1Z%2jCXVv2`D=30QScQ0OtLBj6eIEgwnzOv$g;yx zz=*XVn(P**``qPo>PuQo+M1+!j@|Xf+Kv~hq#|~;x3LR>y(=o8MPHgf`8ug{S zq~s3%CcyDyblU~-fJwTS#>u!K5hMt(8@`vn0#E?>IQ-fp4c@_vAxzjksNG)n1BsjI zk^F#oG@T_FyG zV?@869?y?LJoSd5nEWUl+Av^W#7S7XVrYUdjdV7)Z_reVH)2X6KnZ9uvki)3yAJ6K z;(K@C?yf)qNT}We7E;0tde@iiY0&Kv&9oeE#wYm9$gD$}B7`K&0){0QxAB&rZdR9O zz3N#PTmC;#Y;>N{VR6YO_O~^eZ@(mItR7^;iHq@ht3mQcWO+MjJ5hT31-EkrRzVoh zV$;{#FQ!ied__?or7gWpez@EuBkor~q44GSlcY3|VYO*?of3KkQG1jpTtvo%$Pxyf zL&>Q6pD~qH?^siAXH1JEjLp;bE%gsD6PykA@S_9e4l(z6B;_o61xZ&w#ZBbU*d^g) zN{6V8zJwrSe95)l(zq$6h7@UIhAlDGWf&Y<(n~pq_$fve0l)t>-}7fo{w))tCd6Km zLW!JGdI*~o9K)RfA1U>JhNi*t?>O+U9>yJZ5~%D-YIu8Ve|y%83UXNA^I$Zmhue3Ghxnl=AdIL}(m@rFX~DC+#ld z9RSJ;_$gb9w~+le$VPeYC0C;lpAyaU9A{1Om8WI$D4fj))}gpo%_z(0p~>h0hF%VTfAc>@T*hdo! zhC;wdt(dS9HL<7X*g{H)de8rYxpdpT>E<^Ssj_`}AiYjI_bWuXc1x#W5 znym?M0jFpqAYB$9P>fHa`n9a^rBXRRhz`Sf1mk(yJ&Qdt6h%V`!;&vk>hB>w$ug?V zs>I||OinO4$z+!@1!MuH-+-=ea?8o3^K;c78m+pZ$%Q+5G5CoU_Mf#;vgj X*kc9U;K|@z diff --git a/env/lib/python3.7/__pycache__/genericpath.cpython-37.pyc b/env/lib/python3.7/__pycache__/genericpath.cpython-37.pyc deleted file mode 100644 index 47913b6360056f8f37141ae5376cab5f8ee6c460..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3773 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 diff --git a/env/lib/python3.7/__pycache__/heapq.cpython-37.pyc b/env/lib/python3.7/__pycache__/heapq.cpython-37.pyc deleted file mode 100644 index 16946ad23a69916aed41f9ad86317880dfc4a064..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14387 zcmeHOTWlQXb)MN9m%|m!$g(UswlboVkgKdHl9DW0k(Kx+n{G@CkP_LH33|9QyBu?O zX8F&o$R&1LpmLg^fC~l4V;*9lK-<^$xj=ySp)Yyq<36T90iyv5^r0w%0`2#me`a=h zQQYRzr&8Xz{+Dykf6jL<|M;~NCoBVhAK#x@|NH~P_$S_^e`Q>J8^37HGz`~RGhB1c zbaQUrEx1Lu66^r zQ*PBg@0LF?*Jj)c?yNh3t1tB`?u+hMTPN=s_l@9G!SJ5mw$#r|ga1A-g53K?Zw4*C z);igqT$?n`s`=MBhxh87w#I>Z#e&2FpRf7r(^GQy{>0Ft!AkFc&lyCI}6(j&Vt=h zKA-e-gX)51v3X=W3ayoLdXe1-mA$*=*SBov!S=d+^A((zFKmBfY29`L_t3-Tb+)&h zR?FV5+4Zm+#D37Uy_VPZf*6CTux&3c*!FFV8gF@a&$}9i_S#kZMVpV<)(*T~d1!}$@GqU%%6>%#=!6~VDxE^Cga|1mP8x~~`S@^O za;5)X9PuMv#wN3Op#WhwwlPzOYvad4wBP8>?^O?Q7%L};u$=A4ZecYj-7pa)I14Uz zT29^L6ts ze;;ZP+1;SN^hGYq%2Vq}H^!l?1BR=68s=`Y&% zJ-Zuu_Tt4&CxX`bfeXzHnxb!*rVaJgYoxrE6Z_E5Ex!ZJjCVaxRv27JC$S@}f9S%p zz&saFUZ6isj7nJF@>{M#zo_Lmx8hdMhDuTn;pRg>>_#Wig>lBMP3KACFiiXLI zUM4lmSM6oCTfSy5v)%H`_GNHxt!VcVD-UqO)v4K@10P-Y;CdlV@pTEpen1994%P)B(xBW)oMM` zbBwkHe0CDlHTLS@Rd~Q!(cyDV;1umewy3ud2ef)19#I_@j0>8GRYz!%-|k49 zmAPEMZX*fx8?6~`P238XjSwGfU&1WAMzhcWC?<0F+)mN8)k zHspB=)@waJRnT})AnQmW>-DyKVb^YY6rlayJmRvz4yw>UMeqHp9r)162Ex`Z!Uv2l zO!6(M5`ANTnrjB^h(Vw*h@&YCiR~h01N8V{H|^UDg&2qu*6@uywr3F|fsI)<)IiX35MwUR#an3%F5F=40UhX{hFpGRc~Qr!`(V4raHr7)`v5Ax zjaY*VDn@~RwEZpQ144!%-xmYG_V8JSR|pF)RHK?6rqcZU`P%ULl_dUv;z$9)x;jI|{0!N?jX+jQ!f9dULC?5$Z~9G;9c_!rMWFBlSgLRh zi`x{@P_4HE1XN;r4!k-RTZ|ja<0C6TOSfC64$P`9y}*2u*MoY5Z5P=XN}Vpcm=E** zET>|yfHja*hbFF()M+!#C!V~1=etQDSglz)i$XJaKnIUilQVamhzW{bXJ!+mgm%h_ z(neUTumOd!LZ=90c&Q6dq~Mc8V0g+(GfdBjtz6-D3}gJ02blFb@d5qkMUj?qmq|9 zs3Uk5kPD$55c<3%7l?4N{IzrpAVlJ66ZvEg1~wJigdG|O8<8n08M2E8;-~TWTm$n8 zTKK^>mkfq3u+JepuLBA{BGGd|Hab|~Dxd|PAKnKQjAQ;RK!GftDBh-nJYN7Vi!Kv{ z76eahiHYW})azlC+IpR^911n|=$B z1CU89k0epI-h)|q4`G`rEs3Hc;X#eG<)Z)!sJ3FKg8*J(1wa>9T4yG^aD=i#Bd?|D zLXyPfh~kHu5(X_zHlM)RGRB*4p!fn?b6hA$-K&y2Xde?rnT}yJ;{pWNh#~2ZppfEK zGIhuhlF(>Eurp{S_Y#;5>vsJ>2Y&1TjRG#S|ueo#EBLJD^otaDOGfi9J?5`uDF zI)WX#)}~Y6-bFoz%L1L1*o54RI~3akW6s0S=R25;he%CqO`@dh&zjMqvu zi&CWzNT$`IWc(OAb*W8Z&|L@Sa^AYl;xs&*q&1*|-KY{Trrrl7w(r6nPBGK~hv3P6laMsT*<-6zJ-?WV3|lB7U!P zzhoANzVTC|Z+>Q)Mr`)6a}wwJ#v|;WoG~8dQTNZI?qAryatFgmzzt9agCwDbqMa_B zX*JjNV`xWG`a3O|OJqf5FniPKwNxN_%`7d*Vw@;5Jaq+oe@;TqC> zr?a!r=_yYB$M{9qw=j&HW!CwGfBEDma#+9(Y!h}0xzh6wUlqTz%{rrW9J)ifRtC+L>|*hBbv z7PcuM5syB632hXY^9T4v>|x}}X2C4upM`U_4mrhj#K5+BOd-%=wwDYUWmyALD79m+i5=?#8PQvyUgv+nk;HbX z)MJ%N1VWtKz9q(m>h%qofkNb;ywh7cN&oR(5Y3h-lc}D@5+^#Op2D?yh6mc!nBveN zeuQ7d%~NAaD@~>{R4b~DSjQqRU==m3Hhpt@>^dhF%BB6!h*Jjgn^tGfo9+k?Iig#{50*k8S^9*{(xnZyNq^H_Q)KVd$Tdo&2-J@ zaR11B!&sjlKd0nYs|9re z=V4hf(?EhTEJ_7DS(>4_H#CEx=^tJciu^C}i%K}anoFk-vXw2#Zv&HVK#)wIp2u`47f&*X;f!#R*cLhYTXG`S0azuZDpLA8RkLp%uV$E>5=9a+z9)J} z)6{8DlWLlJ7B}h)4+*npdHoy@U*_SU1tm*{Xo8IXJsPAMXP!3IS8!kF^6-zEm@U;R zZfGs=jrqOneb~}=L4CWQbImjGnBOu61-vcbZLy#47l9Ku`$e|DiKm0yj&;Y_vF;mq zC(m4iesopw!ww;^TGEcMEa?Txsq~A{Z~{Js@HdgV`HR93?* z=Pk1$4v~&AXO>K9k?G+C8f8%NC%8$V0*nnvB!hs0Yxd1k0ETD5*4}r(P!5c>`bBwC z>X+nx6|IYBDV)+-W7~*U`y~h=eFk{!7Y6{I(MUV95Cp}AcMQBB6jK5&3MIcPt1FVJ z<^)TG@alvH#q%I_Sn>iFqEI$&)GVKrWxto=DJvF)`1at!3jhJ?jEJfM0Wn_4RZI&i ze#R`|s$kCK%Nl}zYaM_Ve4!3#ynQ}1Z@ukGcag=3B8Js*4bePP3c|R0kyl^k;UK%i z6WJhC^wVTqG$VJ6X3V4i?@2SD6IvI3E6vcM_;XJZRkt%zn$=Wm$ke#jsIO5rTRcsM9IfswCeilPI{;}nH(vwE8$?6%h%P9zSmj;97)A>o!`NfW>53Z66p9sT^r zgbEWOmpLfLxj`w;4<=l5P!49|0-hA{q=YBAK^Z|ue!Gm%l4kc-w|i- z&7K=qc;)5*X8+!MX>YNQ568{|7(UDoDwttvaH3!N9zM^K@lUt~Sn~wz^@Icse}12{ z{5YBA-}Ed%1sVGTyuoZgCg_2Ob9&@-+;r5BPrL~(-^L6~xAs0f#OFH+pYsWy;BrtA z?5I346Mie;xS%->@F5sE#(aAz&-|?HvAMH6#`PbLxPF{drQSPxZ)AKI2GiiXa*%V( zY4kaxmOusP;2_Zr_$DPjfgCcB#c-WhEu(ey0P}>brc3^R^(`9;(?80?oM-!3OZ}9>-M2Ip; zk|9MA5?Pjv@mNYGSrWm0K9)aG1oIqx9mVQU3zshUdS$O`KFhg4ev<2R1BI!0W@nUm&Fv!zzkL;F4SC;Lt(wt%s^_fchUo ze^4y!CLe|H-bIyBVY^J{b@II&_|ygBCvY|AhE06aF}H;+7;ldB&taFIPa3FH^1O|Y zOi|aa@b4soEDOhJUgf57 zhnOO#Tb9h{%^3;EW~A*Yyyg3{c?!>YH-ldmcCe&D;ZwlTKY|=4pxZh19YkqJ-v;^E z1QHg0h}dkqtZGQ@^8JFF|1>u!2GjZu?+Tyh5s4N11+=-{M0C|JHj$wADoFe|N(qQ{ z28dONi;W!oL?^?{bMH$$w_Q|!7MJ=a#wvcAb5S1qJ_6vohMpHFdm*KVpBjH+5WSgj z!UN>qVB(3{qo4JQcMbTiA~71VWBIJX-(aF|49c-JnB04*pGQKvFtGYoe*$6CFM#Yt zT$dY?oa#RC1QYOdW!JohemlP)p8s^}GkT6m&fPC^M$D8*=m$o_#7EB)pOlZI>aiKU z|Alnj7P@W?tREVE3*1!t719U3_l3erzudPP;5Fq7-VHRuXC_p_FYJ%eIW~SzBc5B;*YF8iJ2-c;CHsq=~ zoN&E{1OI{O=w&FC*jm+;(~-RHF13ysRTEmUJ_E^{CHcHw3#tfMY{3m0iisfHX+7Gqc;tCEmq z9wkZLKqK`{9{_s&Vi^|r4laR-)UcdF zwTADj@{FG?!o{_QCG6)x>(B)s6A$yie@*sfG?Nt?mNo>Y)hp~++{kn&m7$1_+3L?J zzBODJ6D&%Uh`T`9lldHQl!yx~MbcZ&Bb&p&GSL_RG(J}ZYp0RlJ&&FT-&(-lY5Xfc z0e^pqiT{uB*Us?waf-ig>C^l%2z))oJN~a88iC!(zAws@bO5P{9RDkz)~J|a)N!adKLU;Y=hJ<)Cjzwk21tOJGGaTP zwBHd}UmcNkV4mM6SigMCoWChp3%31wxPEIiT>{tY7R1UpdQTU@zKvV;Di5#m@H!7t z^<<1F@wa*dR|zbuH~CaFhls3h^Y9iAZ}YIigZRb_h}AoMMif?mzyp2C0Ssn2v_dj} zJqDj92Ak&udx^nB+Yts=Ok(hChQaCE6oV^fvJ)~iFJN}M8=UBRaAF~y=>#`lkuaF6 z{O=4l4>#PfzOk`3xv_!ox4TR=@C>`p8ym6>I!aL#i`qJE;b1z85y!^zsgwv6>qb%o zQq(U+*Q3ZgJQYjRJHx3J`9wIAb-fC&6gOh_}ZMHj?t6THF47h{Gdewq$# zSiY%0%eX}{qVM2P_^5!q0@cW3*(%SJC(2VePn0LiSIei$PnDmU`6J_$^)2fby&ZFl RoOmsLX70dyob#+_{x=wY0wMqa diff --git a/env/lib/python3.7/__pycache__/hmac.cpython-37.pyc b/env/lib/python3.7/__pycache__/hmac.cpython-37.pyc deleted file mode 100644 index ef2a3d40d94ed77ef852de9eccdc85b8e4326a43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6138 zcmb_gOLN=S6$U`?O;NJ!*iM?Zw+}aBYEy~rBpzFJBing+lBgQjO&U%!7>KweA%OsM z0a_-9&Z6>6-A$%HpbKi(ZaV!fU1Hg;Jkwofy2z^EITxfT#Z9Jd$N}#A-gD3S&I`Ae zmMR8*yC1E5GJM`J{y~k|uY}5*c;Y|d zZ9|s!D(X$spucCeig?N&8)5C&hOEfqZuP)ym3c+2Rgg=b?d2aEvhEcQ%sa+`iP2^B z7QfQFf_+ZCV|XR6{Mhiy2Ucs(`Ba}^#`t!j^}q} zoU~0E!Oy~z!_&qSpT%opd{Td8PE60(G(H5&J_U1e3G3-^Fu3(+)KaVYN@_k-HahtA z&u{cM@DzI*Jb!%J@9wd2YkmX%{SJ2eYf2l zjJ_;ybY&fdvfaJTtK;P>$XFS={-z<`byaUP)~vg=x{tB_+>3%$Y_~ z-mU!JNUBdTN4@_9*m7#&#l(1GBufXD>Us6w86A^3SLU%5Z<%{a;3fA=jA`wV*45{= z<%zMoyt{(FmE;uFN%_>@xOerDJ+ZyYo}vE9lvF1+`cHSPvqo}8(?sn@cK8C1*Qj-J zjMg}-$#ZnSiM?n4!Bl+u#5^>oXAce1j_Em^vvg>oZtT{l=h5?g^1>lzn4ordIqUgO z)?UqsXcn7>755fUep^X5k-`_*WpaXcm{EK@pGk#{LX5}W+1T6=4!#GjHb^>dsWHMAC?Vzu^NcT5vB|^6^L4%*T zJAvdo&}y8}1k=_s6rZ5tj_kO@fV3i-(bMdEuN~cUVLn+{zwIZmq`c_F8UZEq-=zL+OIUPEr@q3O5}BxEUkj*M1L43 zw9A5~nX+)*a$_~;_ziwqFhPQZqpz{xci#SUcOjS_J|ZH;?mbJiMcP$KlZ zp}^XV0qh_keBr7t+w!luyueK_{->+rj!(&me}U)7dXwiNJ98ROT*E6drm!Cq^ZSN zmQQKf`1(F>FYKg1PYqw{$E3Y^5sU6Fpljfi-AU5u5k*?uH9V28i*1(zp=m!{%Z{cMu z*UeR{WEOIGP?pRJ+ACHCWyPwYjegWoS_Rb5vI|z-tYd5y|B5+YItI;SKqN)EO-GSR zc;r@$UGtnlq1VdQo`OV}87rtu2u zCkdtTHXcoAZd_$TwIJt=IY#Pr%+5#!!G|XMUTb1H7J73ib13a;9`SWT zdOW(v4oJ9AMa077bKB7X=Ct#ydoGyg%}{8<$SW{Qc-?*!z69IZ>A>i6T#k6W>xb~P zC!KMl2sLszsDnlop<8m_anuiqFF&D|mMiV5evEd;I4BJGtWL7-8fNtHFjR~}osm~F zYi1^G+U6Jw$=tHEzlVxuVHU

!$W0*onYJvuS_MCK7yhmwDLG9x8=I1i}aZ7I<_Y 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 VR2|QjMhX*!mr8G;wF3DV`EPK)l+FME diff --git a/env/lib/python3.7/__pycache__/io.cpython-37.pyc b/env/lib/python3.7/__pycache__/io.cpython-37.pyc deleted file mode 100644 index 13b74e838733a2d8fa6e961ec318a77f379af298..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3434 zcmbtX&2AgX5uV|{Mt_todoBOAwE@-w6zY&efJ9hGvLr{?tfZCfD4Aq2+njESBh5^6 zyN9CbYjO>+kB}Vm5IN*E=9-g{H^?bp^$bZFun$H!V6(fryZWoDuWFimi;JFv&(%fy z`+qJv&cA6e`P@Ng2VWDrjw2l35w7owil~a3sEdYZik6rYo|qR4Vo@xKWziNZ;*Pj` zdB?AaRdFw_`c?Z|^K1CMA6JvQUr!o-BWe20q~*7gIe#wkd@q^z=aU70AzAbnlO=yC zS@xHcw%<-x{1w-c)vK0&M|>fh!CkTHuZjo$J+bEBf8~gWqV^X@)Ue_US-W~59{siE zuR;D;)FH1!{!p&{x#mBD?1`9zY!0%=R`vw4r(y}RCCHvy*)#d*Z%oep-F2O}>(Y}8 za#1eJrCxpC`M&KxmrpSJoMwM=f2>?MZy(EfxzekYv(IkLvJ2;r&&O@p{S0=m`|GZA z;iUI#j{Nf4`^nXRavgg9;G_$`ckHR_q*vTKcQzRRSKV=5_a%!IOOzPKk`1)FiG(yP zgZOlu^;OEEG?Ti=Ly{_HGA((+`aBhJlwNii6nNcX6lYP&)Ig@JH%!AUqK$?L*^5#s zpaU8)E{^GV-fm`($kc$Tp6woOov?l+HP>N(OnV6e@8UcjW~|GNWMRyWVMix>7jP_0>q;NWBTw+@7ytyJ4yFj2v*yE$Xh!MiOSgOaTKK z3}qu7!Mw|v{pQy!N(Qk^WSZG+hH))D9>+LB&^pZ{Am%AMIX}=^X%<;C$4n?3m@zXP z43y4*@iMx>ad2G$0M0pho5|E3Uf4@SRS1KO4oW8)3Z}xLP-V>Moc+Crk$L#9(Eca-5d6LQcF=nD?nK^ zT{}Zg0~7cZ!Gu3ArYCJsB#k!%vB@S{FW`0x*JON#kkFVyGL>DN@<_AdIImzQ5dr~5 zL~Im!H%9Qu9Yv3}cNILQr5Q+Y^+v|y&eWDO%&TN#Jpx-Qw=^zOp@^_u$3tWW@Y}pF z9kxe)hF1|Yc-pdLVl*NVr9V$(qV%|k2W0}-(3iTT^)wip?6rKG6@J|;qdg6?OhYv# zr;x?KgZhd6h?im+6d*sXnhVVbU>MwB*#j9EW>}PM7C;OC5p^-;eGu+j_7jhaBiM@{ zCJ`tw{(v|hMkz92yvfcpjmRIJc;p0P&&23*a}W7o(ZPIuIixINDNjH^iW#K`(lMJ< z1`1Nti$a@dMf6n)*4qM6ZZ~8-m7f==Yn0X~TB#^fu`Aiopvw)rmgAAq=uWmF0D@=y zSDv?jaJc*Cx37b}H;0D@XTkZAf8cqHv0cl47AjA@kORmHE<#)SZos0y7&I1!y)tv&H7t*p`aiD{_opOZnml z`IfJ~Ny|zv#mS_^1Iod{H^KSA>$3Oq%~{zyINpCxSEJ*N#r*C^D5-Hva`ZAa6>9JX zcXWfACN*=^&}B={Q?r03Upq=eUA(E{V>!ZGTkccIkXkQc-mgUJJ!ySU3PXISACm6i zYgW-n2lq0p#x16Hg&US|afhhrDyEJ%8hI-SD1(C__ky5cKl%$n@Z*rjOj%74{UP*Oyx+T+_tvKp# z6-56<=a*ZN>I}vf({BhjS=4ejT-^U;#%=0-wt=<6K>dI)u2J)lnn!40>XdK#2}!4h z6uoC8BL&~!TcY`F04?l=hd&BnIrxyupGIM|{2wTAZ~r8U`Cyg+pGH6$zMCP~aPyVm zBEma#WL~Ni6$E#Yji1^5J~+gOxP5AH2t2`CB?zp`{VMNX>NrY`bVN4qw$-&doRBQaV()UBRK_AKc|Kqs@JI@!}6Avmytp3^6S@hP1RqL zbp9xzTb?adA0tQJ+AebCYtm%4(bTH7rsp>7vruiht;%-2QEgOfE}r^>>Z*ObisyQ6 RyRziA-Abi`w(T}5{{w~)*NgxF diff --git a/env/lib/python3.7/__pycache__/keyword.cpython-37.pyc b/env/lib/python3.7/__pycache__/keyword.cpython-37.pyc deleted file mode 100644 index 73eac2c469facc0c7c7adf3187d0aada705688c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1834 zcmbtUTXP#V6qd9X+ndC3S|F6`HYs&nk{E`WGC-%pK)DS}CzK8?%M{OMkL+x`mKI5F zVzYiKo#CZZeuDEz{|A3UuRQfHzzb*Bfre+aqa*3)-1eOB=%baDfZ#a1)4KP2osd7u z!#`saHy`5EQzSql0u(j7OcTJI1kUk^Y8+!!;5eM zUV@k56?he1gV!O1i?9Kka0%WRY(|VboIRk2ZsfsbX#Y$ipVwe($kcuAKOmGq=NrPuV!r9yMSLp>So%S?xQ${QXsvp#yoP+TEt=<`LWhqnaGRv zL?pNz#VMZl6_1CJmt=Sy)e|X9DoQor{gPyn%d@m!Qq8dn#|h6(RO_drOk?EqrHb4# z_mMxyU|f$DWE)4BW>AjFpHS zqb8AebbzIc+@sVSMBXIj86*g}YBZ5HaDI$a7ZhPgfn;R1Sm}%wlWkbE1QnPZ#+;RS5ysvF2JWnAHcJ9CX&R1ki|9ye!R;my4hGV|{s%)chL$X!zS z>X*VVEuoESo%<&QZB?EGgW9ZyHk=3a@om(nb8LkZI;#)JtZ{t3@NSTMS7!k>BEeZI_spVel(ewxc6pfW9t3%_I9{2ZG@+zJ!S3f>G{o_9c^M|!c)ZSot^0#GC8)& z8CDx*2HapTa~&eW!V=FhHY~yvdp{h-YRHuiEIsO+vyPr<%M^ABYTdU^#)Wldj*v;A{6oY<7S%AQT*-m; z7D2k@5_$NG7#T*4nX(Q>_Zv}dwEO4h-2*w|-F+^)H)Jv%aba|KPsu}ks&KO?*xuwb zF2C68a&f<#;ajtKcHY^2_spwf-4UkqJ+!H>A|bTJnzTiiNkCn)q_sZLQY>ne=+)1|ODQPq9*_fiKIH3(bvP?)6TK wsqwZ%+P`K*JmSbJ|MU#ms+?RKNf>AR`VyY>9uk+;T}J=^=eq%`U#`=?0fJry3;+NC diff --git a/env/lib/python3.7/__pycache__/linecache.cpython-37.pyc b/env/lib/python3.7/__pycache__/linecache.cpython-37.pyc deleted file mode 100644 index 7a7c3d924b35ee81a8dc047dde61238e6786f65f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3814 zcmZWs&u<(_6|U+ZGd=C`#G8a{yvk;KS7MWq65D`aQRGA{30Y+YCTzSoSQ`!PsT#XI zJ>BD~n)Qy=gM^$zgb)P5funs{i3>;0Nc;;NP+#E^Df|Pu!1tQ&YI z@x9MKoSzRFuHB7=Cx5@l*uUvvcDWFKfTlBaf^9Ovg_H74Ztu>fWAE;!YwzBsCtTqP zf7{*k#W_(E?o+;5OITbNb>Tf_n}JvmfoR}uL%bnE;X?|=c`+xNkmkg^Xkk=SIFDHS z!off8#@!tmrAa1r)KmE&dN?*ac^2t>q`ETdC8^X)VYt4N=!pI@BQqgIWb#PKSe%_X z$i)bwqhv75mBE;sH=`YyK}*t$Vyh~P2Qq}3EH_avA7$c3l$dBgNz*9J^L`}q{VX!r zP^Bx2>+!Z~y%uyMgXeC%`ep5cXi$RT|@^Ek_zg1F|0Nv8>U?vb=0n=jv>y`Bt3j(zk~H3sdt@^6KN|oqQmd zw`8__FYk^9GBbMlp~`n>y&z*8peNtcFWP@$QEjBl^ePEG=+tX%Uy<<@9lM+xS@m|k za_%Q`kgM^Jl**O0Sld+%8ahWqeXIXQ6MUO`#4ZP^Cs@ZoA{Gjff>;H%e|Fx%XmkAQ9I_7`UcCcz*9AN>NitQLDOxvzw!%~ zIgc4~sJ>h8yZWf`AO-OF3axdU?X7H70q7oldN0x4Sc%F**5nCb#b$i0WR#Cgl=mWX zS>?X#Gjt+Yu?Y|G84ZDA5+DFIY5Hz^&AO-ED7`e%#=58U`f{u*Cpoz;J#AuB)_?lQ zdZ(;w)6vO+ECUDwlMG}#u)ZoAv&7cw0xXP)G|abSRFmEWy-}J{>Z>>L__{+0fxe5T z-$zFdZ8>nN<2fO@7LIM=?%>z54i5N5ev(ZTCxjN(zyE^Qr`dGX@G76CnRJz&ZlkI1 z73|0n&M{ZFAi2UNiE^hv?u{3$_waS%Zm{P(t5yDc&eeM5L5%WDy~;!N&+++c72z$i zLpJf@@ynPIm|D+)*Z*A2fwx!TZD06^kuPa2c-hC!d{nIZQ+zpU9J70f#lq=%q;b`v z@FEidWxnxt!=t%^VW0QgU|y_Y8^yg%FR-pj{$zhMz&I_o{NaP&q2yZpX2sTcL5^T%uwAV&S4u}^?H zSoPA0p5Ik^Dm*Fz?BQ<(YVaaiJ3Qvkxwg+f&`yLO01#J^3A-22E;?+|n1n^62#es< z7DWI|n>+Z^6qw>OsW1i%3DjOQQW-!>qXKK24;J^Tgm}EZRWSF8ufF1U6oJm#3G@*3QD{Fx z)8IKUXThE{Cn&0dy~+OI?0GmAFL`Ja0wvQ~TA_T*8I=Qtv`)f8z`chsbVa^nPM?$^azBO6n4ZRXKVYQrSr3 zgYgupA6On!VL_;eX=3RGV1npK=_fkgLaEndyxGl@tZb~0hq4;p`p_7aY>mwHIWT!& zW&{#mK9m?r6~j7AEz$1CsxE?_0EvM-cA)mp;QBBaE)KM#B&c(j|vAPJoU`fj_Rl@4p6}_{GP?b z)rzYTM+oEpB3>U!Vz0CMZ%g?M%|S%LGrvmFz?T;6=~f<_1AqUByvhh zr?ffG(s8s8@*B-KA;_~;M8!yg_EM=z1_LP)lreCtY8fOhw4la;Tb!^BFptyyPRWMl z%~K*Brv_8RRK=|d8g51FYBXiu6w~0>VC$Hnx$gn}AZ%77%6@!KbB5m+y_rzAZ%d1q=4f}&hRgAtGlCYv&UI@F2jXWuHQ zi?>pFqG&eehDE-w&mvQjBPtqJK_#p~d$2Ws{l0n!v8W<+W!ULd4(xQwpwppDf)t)^ zb`3@Tgu5v!(CQjZbTP#Kj}ara!2m{C*W@`ke0>O5N#e9!JI&wHo6>$8D~kTf*lf@m zRnEVbr`PfMk7$~*p3PI9QjSulHj#Zq35fB9+~bPIwmF#i>~FrTcRC{Pb~@@dzNwqk zSycNLB>ISm!$(5U>R>KO#2FRks?A`l_6&U34HAZw!D{8?JCxg+Fp^-x{v1F;({qD* KxDdV_e)xYoU%>+a diff --git a/env/lib/python3.7/__pycache__/locale.cpython-37.pyc b/env/lib/python3.7/__pycache__/locale.cpython-37.pyc deleted file mode 100644 index ddddeaf56e19bada0d03982e03b27a130e0e8a5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34580 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 F{~s1tlpX*8 diff --git a/env/lib/python3.7/__pycache__/operator.cpython-37.pyc b/env/lib/python3.7/__pycache__/operator.cpython-37.pyc deleted file mode 100644 index 5293c4508b197b7779d58d8db3a13ec71f232fc5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13925 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 diff --git a/env/lib/python3.7/__pycache__/posixpath.cpython-37.pyc b/env/lib/python3.7/__pycache__/posixpath.cpython-37.pyc deleted file mode 100644 index 3ecb8cc6b99ccad301f550274e9052070d2157a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10455 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 diff --git a/env/lib/python3.7/__pycache__/random.cpython-37.pyc b/env/lib/python3.7/__pycache__/random.cpython-37.pyc deleted file mode 100644 index 8d40dd816f62bf79287de080d89b85fd960f5fad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19433 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 U9W2dO=CrNkPnlw@$y~+!zhls68~^|S diff --git a/env/lib/python3.7/__pycache__/re.cpython-37.pyc b/env/lib/python3.7/__pycache__/re.cpython-37.pyc deleted file mode 100644 index 5b1c79e5300d54e3680b1e87d9f9bb7569f05998..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13829 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 diff --git a/env/lib/python3.7/__pycache__/reprlib.cpython-37.pyc b/env/lib/python3.7/__pycache__/reprlib.cpython-37.pyc deleted file mode 100644 index fefc9971967c29410a0f43afceeb6080e9211561..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5375 zcmbtYTXP&o74DwRA!bEL0Y%CfV?-PZ5XKI%*7BUL-|8fZdwYJ$*g>oomna`S~WpZ~e~6 zdw)93*gxoH@-tDnhNt)yh+thNxG;qI!0d8i2|G2q21+M2H?6M48R~9oZ#rEE^?A_{ z<}==PZ!pmm{2Au%7+p`yiPkgLZN%OV>o()&`doKT*tc2G9^SYWi`-Xhv44M%q$5O(sN( zN%o+c9~7|+Cy4%??SHVmmT$((_v37NCGQP3A-iJvrp(vl9#yv0TArb}5$8X=xg2MY zmeb_^@|JFXxAU!KS{yB%t?kNvETgThSe^ivTF8vIxyLQuPVYr!#K^li)<%Xfid#HF}m_?h^)C$9ggD4%poe0Ay%ko;w zi!cn_$}D14xzNx^DJfx}Ouk0s43V=$&VdAmBn6eEH366Hx{1zIx4(*7b?O*~Tj&@c z+c8eITD<duDPBR@6t9X?DCfj! z@fymOI3v!YoEPWB>nPh|L7Yc9gasX4?pcnE4-^WwD4k>S*c;3+6tJVfS=}Sc*t3ZcD0^=bSpo^>DsMA-lE#nX zRM*sCD~&6c+LA))rbx;N+KVQU^i<`bLYmS-*_Zh+&ghL+5%I%8Ts5d)NirtAOpXfm z=J2)>8Z(D&wa{v!^#xj*WQhvHi|8y!;TU(0`48uB!Jayk(LF+oepJ%IG;*XGCEH~s z5L@Rj#~#9{Y_i37bPobCQ!-n3FX7)&P=tnS4H~R=L3R~^) zbv}a6EKRtt3#GYhyksLw7;shAOY|s+24XYMvK>RduOOny8`v~(qWEYwol@E-(EWfxm%qAF`WPqNBgiwbSD3)D4F+yc)+MH!-wT_fJnv&Mp^ zb;uD^_EscSaTJ8FV(d5Z6a*!MfAa8e!dsm-hRrD;?^LYk(g6G@t`jDNQSlp)8k3P* z!nQWJTqs?+AdHch-9?Le4snKr^9k3nh9bND%u{gpB_hfSx%x)wmiC4vKP(%&rZC9e z3uo6V8$i=5U14q*QkD)qrFE9Dc1yGLN~>?4A*J_LB{4LlIJ(ep ze@<1Nm}u&;zi|bC2=pVWexrR4yM)1YYS{2=I@ucF5{)-MH^m&uQSqGxOZI}!NKpMwKPiY?AHy=ptU-j z)82UL(qeHb7|zdLF8d!3je9|0c0DrgUM}Jq&kNWju#Vu_b=KktBaX*auX-Ev3X&ny z8A_8651^|@9FH#TheLS+S?kydzz^4lp@bgNpB~0Waqux?5Jn-^#XpA5L`BQLEbAIXb zaE@C8-1T(LkoecvB;Zc`BQLCN?eMtc&+%_`d+6%;yj1JS*xGas@cFDw&+Zd<<4V*Jh`q6g)D!E zVmK}wE9_ne!Nf*Tz#9U94dZZMXZo#CI=eQq9@lbaJ#fz!Kcj;*sCLuC15Su0PUSpJ2#1-#Ja0 z4*nPUg~Q%M&5}UEkDR&I@ikQHlWXMQv^8=jkP~B+kivWhIo&ov?lYLwtNcq$x(g+xd!}gs{Idu%Wq)fCwL0V#27vXw9Phbd5ZX}x8M~z+Wk*B$7dz^Z43@xskzX% zb$v&tq@vaWot>`G>jy-BMC8XrC{d9=BXWxfMS9sK@-Y$O=736QKSYe_yDCNZ;tdeb z@a8?!Yc`3Ro`b)O@`Ts$yh9h-sZLzPtZfgW0NMR**pA}R2EWz@Wd6GKZhiB?2OYC= z#yP+*F|V>Hi^7@d7IT0(%@@Vnzu>8(zGc7}wz+o7m_W%^(9$0==%Wa}e?f3$DOH0~ zWR>S>A$5Z7hH6bBE7D()^hX4JV!cq;jz|VIt~1X(#isJE)Sq6i(oI9l(K4Dyn(>Xp MXr6BuUc=%41RG+5V*mgE diff --git a/env/lib/python3.7/__pycache__/shutil.cpython-37.pyc b/env/lib/python3.7/__pycache__/shutil.cpython-37.pyc deleted file mode 100644 index 47dd91e636db8af8ad0ca2f77f58cd923ffc3e88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30889 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 diff --git a/env/lib/python3.7/__pycache__/site.cpython-37.pyc b/env/lib/python3.7/__pycache__/site.cpython-37.pyc deleted file mode 100644 index f394b66f0a3ef50c5e3533fd4f172e4bb99916f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22114 zcmbt+ZE#%IdEUKu@9thK79RvDen=F3MTrDg1{M+}%L>KF;-^T50vVDn>9ytcV$TJz zz+!iC?gas?0M{|(NKR{4?znE7W;{URI87#*>0~mg+fIKZle&qU&bUoFP4AD6XWH>Z z9slY~J5zP0>GQnj?!^M6Tz5in&z^hk`FziN-tV&)hlUCk{xyH?=$mgYTh@Q!L+_u5 z%xn0BKd>!JSrtp!%4ymaTfUu&vtE>3rsCeSTE|^0$SxN2dE4Tjym2e;r>&NA-&*&A zoNb|&k6L-unoVnEn%>et1#eBwz*#8ZGdSl|ipr@C;WLcSNH7{W%2m!*rt=NSXSW=c zTXZW2f-$_wZ#k8NXm?0C%KNf&%u)l3PUW%SG5v?Z;lSRqD@Rm84Zdwvj;f*>!uK&X ztVZztxEfUl@co1uQwQ;VTpd!6;rmH-K^;~{-nJ_zdUKj})KPT|B_C0bt0z#$SI5

J-XPqx`fQNBOvvkE=7Pgz_`$ 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 z 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 A!2kdN diff --git a/env/lib/python3.7/__pycache__/sre_compile.cpython-37.pyc b/env/lib/python3.7/__pycache__/sre_compile.cpython-37.pyc deleted file mode 100644 index ed3082a265bf2f9cc1dbe1df9e6433f8d88f540f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15228 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 diff --git a/env/lib/python3.7/__pycache__/sre_constants.cpython-37.pyc b/env/lib/python3.7/__pycache__/sre_constants.cpython-37.pyc deleted file mode 100644 index ecd0a454c5b9064a74d1287705e9b64347c9fe2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6316 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 diff --git a/env/lib/python3.7/__pycache__/tarfile.cpython-37.pyc b/env/lib/python3.7/__pycache__/tarfile.cpython-37.pyc deleted file mode 100644 index bb97e4522c64adec4dd6de88ddc68514bf2ccc71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61866 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

PJ>mFU(H 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 Z54~>QE9aFyRf@_{Iq1Vj3C?NKe*wlWfvf-k diff --git a/env/lib/python3.7/__pycache__/tokenize.cpython-37.pyc b/env/lib/python3.7/__pycache__/tokenize.cpython-37.pyc deleted file mode 100644 index 560174d6f4e56b22fabd7087fb9c5fa1b42cfba0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17856 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 M0U@j~vD>EecgM_9VgLXD diff --git a/env/lib/python3.7/__pycache__/weakref.cpython-37.pyc b/env/lib/python3.7/__pycache__/weakref.cpython-37.pyc deleted file mode 100644 index 859fed225032bbfd4dbd5b5a876561ee4a751329..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19243 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 diff --git a/env/lib/python3.7/_bootlocale.py b/env/lib/python3.7/_bootlocale.py deleted file mode 120000 index e04cb13..0000000 --- a/env/lib/python3.7/_bootlocale.py +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/_bootlocale.py \ No newline at end of file diff --git a/env/lib/python3.7/_collections_abc.py b/env/lib/python3.7/_collections_abc.py deleted file mode 120000 index e72b399..0000000 --- a/env/lib/python3.7/_collections_abc.py +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/_collections_abc.py \ No newline at end of file diff --git a/env/lib/python3.7/_dummy_thread.py b/env/lib/python3.7/_dummy_thread.py deleted file mode 120000 index ef6d8b0..0000000 --- a/env/lib/python3.7/_dummy_thread.py +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/_dummy_thread.py \ No newline at end of file diff --git a/env/lib/python3.7/_weakrefset.py b/env/lib/python3.7/_weakrefset.py deleted file mode 120000 index 922c8c5..0000000 --- a/env/lib/python3.7/_weakrefset.py +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/_weakrefset.py \ No newline at end of file diff --git a/env/lib/python3.7/abc.py b/env/lib/python3.7/abc.py deleted file mode 120000 index f95e00f..0000000 --- a/env/lib/python3.7/abc.py +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/abc.py \ No newline at end of file diff --git a/env/lib/python3.7/base64.py b/env/lib/python3.7/base64.py deleted file mode 120000 index 5a53c06..0000000 --- a/env/lib/python3.7/base64.py +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/base64.py \ No newline at end of file diff --git a/env/lib/python3.7/bisect.py b/env/lib/python3.7/bisect.py deleted file mode 120000 index 06caa65..0000000 --- a/env/lib/python3.7/bisect.py +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/bisect.py \ No newline at end of file diff --git a/env/lib/python3.7/codecs.py b/env/lib/python3.7/codecs.py deleted file mode 120000 index 06b4520..0000000 --- a/env/lib/python3.7/codecs.py +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/codecs.py \ No newline at end of file diff --git a/env/lib/python3.7/collections b/env/lib/python3.7/collections deleted file mode 120000 index 9b59f26..0000000 --- a/env/lib/python3.7/collections +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/collections \ No newline at end of file diff --git a/env/lib/python3.7/config-3.7m-x86_64-linux-gnu b/env/lib/python3.7/config-3.7m-x86_64-linux-gnu deleted file mode 120000 index 9e6ede4..0000000 --- a/env/lib/python3.7/config-3.7m-x86_64-linux-gnu +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/config-3.7m-x86_64-linux-gnu \ No newline at end of file diff --git a/env/lib/python3.7/copy.py b/env/lib/python3.7/copy.py deleted file mode 120000 index 3c1771f..0000000 --- a/env/lib/python3.7/copy.py +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/copy.py \ No newline at end of file diff --git a/env/lib/python3.7/copyreg.py b/env/lib/python3.7/copyreg.py deleted file mode 120000 index f1c47ed..0000000 --- a/env/lib/python3.7/copyreg.py +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/copyreg.py \ No newline at end of file diff --git a/env/lib/python3.7/distutils/__init__.py b/env/lib/python3.7/distutils/__init__.py deleted file mode 100644 index 59f55f1..0000000 --- a/env/lib/python3.7/distutils/__init__.py +++ /dev/null @@ -1,116 +0,0 @@ -import imp -import os -import sys -import warnings - -# opcode is not a virtualenv module, so we can use it to find the stdlib -# Important! To work on pypy, this must be a module that resides in the -# lib-python/modified-x.y.z directory -import opcode - -dirname = os.path.dirname - -distutils_path = os.path.join(os.path.dirname(opcode.__file__), "distutils") -if os.path.normpath(distutils_path) == os.path.dirname(os.path.normpath(__file__)): - warnings.warn("The virtualenv distutils package at %s appears to be in the same location as the system distutils?") -else: - __path__.insert(0, distutils_path) # noqa: F821 - real_distutils = imp.load_module("_virtualenv_distutils", None, distutils_path, ("", "", imp.PKG_DIRECTORY)) - # Copy the relevant attributes - try: - __revision__ = real_distutils.__revision__ - except AttributeError: - pass - __version__ = real_distutils.__version__ - -from distutils import dist, sysconfig # isort:skip - -try: - basestring -except NameError: - basestring = str - -# patch build_ext (distutils doesn't know how to get the libs directory -# path on windows - it hardcodes the paths around the patched sys.prefix) - -if sys.platform == "win32": - from distutils.command.build_ext import build_ext as old_build_ext - - class build_ext(old_build_ext): - def finalize_options(self): - if self.library_dirs is None: - self.library_dirs = [] - elif isinstance(self.library_dirs, basestring): - self.library_dirs = self.library_dirs.split(os.pathsep) - - self.library_dirs.insert(0, os.path.join(sys.real_prefix, "Libs")) - old_build_ext.finalize_options(self) - - from distutils.command import build_ext as build_ext_module - - build_ext_module.build_ext = build_ext - -# distutils.dist patches: - -old_find_config_files = dist.Distribution.find_config_files - - -def find_config_files(self): - found = old_find_config_files(self) - if os.name == "posix": - user_filename = ".pydistutils.cfg" - else: - user_filename = "pydistutils.cfg" - user_filename = os.path.join(sys.prefix, user_filename) - if os.path.isfile(user_filename): - for item in list(found): - if item.endswith("pydistutils.cfg"): - found.remove(item) - found.append(user_filename) - return found - - -dist.Distribution.find_config_files = find_config_files - -# distutils.sysconfig patches: - -old_get_python_inc = sysconfig.get_python_inc - - -def sysconfig_get_python_inc(plat_specific=0, prefix=None): - if prefix is None: - prefix = sys.real_prefix - return old_get_python_inc(plat_specific, prefix) - - -sysconfig_get_python_inc.__doc__ = old_get_python_inc.__doc__ -sysconfig.get_python_inc = sysconfig_get_python_inc - -old_get_python_lib = sysconfig.get_python_lib - - -def sysconfig_get_python_lib(plat_specific=0, standard_lib=0, prefix=None): - if standard_lib and prefix is None: - prefix = sys.real_prefix - return old_get_python_lib(plat_specific, standard_lib, prefix) - - -sysconfig_get_python_lib.__doc__ = old_get_python_lib.__doc__ -sysconfig.get_python_lib = sysconfig_get_python_lib - -old_get_config_vars = sysconfig.get_config_vars - - -def sysconfig_get_config_vars(*args): - real_vars = old_get_config_vars(*args) - if sys.platform == "win32": - lib_dir = os.path.join(sys.real_prefix, "libs") - if isinstance(real_vars, dict) and "LIBDIR" not in real_vars: - real_vars["LIBDIR"] = lib_dir # asked for all - elif isinstance(real_vars, list) and "LIBDIR" in args: - real_vars = real_vars + [lib_dir] # asked for list - return real_vars - - -sysconfig_get_config_vars.__doc__ = old_get_config_vars.__doc__ -sysconfig.get_config_vars = sysconfig_get_config_vars diff --git a/env/lib/python3.7/distutils/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/distutils/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 46b436f4975b36f3c84c88bf165b705e1fe77f9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2800 zcma)8&u<&Y6`t8$E|)(=NtVpma!faNY}&2}G=~C3;HHiP!)>4%NzgQdri10qP+Dra z%gnB1OQ28kx#(X|Q0S@G9{R`3wWnVC2lUkMEh$=74($^2>%BKKZ{~gP8$NBd>I`4< z*Y5X!Z!`8!8eDtk7AQJ>h9Su8e)*Q#-GgwXeN# zaL$!;?uc3`sq5M~U+T!NuAx8YhmI+Y?*zZXRNGkldW?h+CXJXR4;^Z<(s=TW7A=DRm!0 zcN;$L=-YBfZ;gB7JK`s*p_*@*xTEioMBdTcm+CH>>XzxS&P&`uWY6B}i){mfj4Bcbs9xDDd>u>#wqPAyiD$a|e zB2Mzt;Wr1mcO0AIC`@#E+*@gS(=a*=_jNBUdiU~PIGyUy&64RtS0dj;m@;Y9b6 zEDDP_OM4--Bs|FrJ$bj#FU6L8w}D)3U|HX>9t~{`bD}IA#rwAMDo#K7S)be5@F-4{ z)US((oWA%RbUs7Luc6Y6AO?5=HaN1YTpZFfRj4AMvHYkd!RILX?@-Oy82CI4%*HJ!- z9_Ia)XeRN{gysYXHo2|Gd7S1&m`2*xhheVs!o(?#n@^LtuuhiS>NG44ay_*^EVU`D zM*{1OvpBUbZpb!_4ih;wdKAC5tqixbx+B{e#c7ztr&?xHibjqr^m3hy{>ID}{QA$= zgM)0M2Sc3>o@LR|M5jeQcxke+j;M1|9Aqh)=Q?}wasVU@;QwG+ia*)?`Ct{cfs}C? z7gFv{Ps}D(et?oUQ88ZU0dMk-bAzAWSh==))w8|6X9FoyfJaJOmvWM+qlEfRDSrSC z7n*YM()UZ%Hnu6_d!KeCFa-SlczcjhDdU}>Qy_+C{0%So7(fAgbd~eQNj>GhaUgT& zUI8weA*Rc56@6|FUf(T(89(FC*!SHx?#!Lnh;hu*8K2i@CHMUB^jn5egX}qa1in36 znPz$X`m}@lSzX$0G}=F1yCUc}?G^t43sCfGRlrpC0a)SR=EeQZM_(YdgXHM`j6cC z1y;!E;u*qQ=f30d4#M09tCd0d(P62`fYiv0GuA)rR& z8-3KSVDcdbGj29!c&LaNN?)CYuQTV2Sml3si)6uR2$Z5pX|6(}Br(AM?=h_ZfcZ<0 zo8<9Bj3botyYToqM)@C65wQQnE&*EXUIc0h*<(Bl3vdP$ ztWjnrC4etMmjZ0)j{@<1RG8c7_Fe0RWoomsdml!TTY;wDAE}$|*Az z*zE8PAd-q1&>l|7$pkdw=H=k0){Q6Ag^y)Y1+PMrf{k&?Y#L>1k#)8TPs$vm^drWi zjFVEdS7|Lvh7M93dBN4R5LwblO4Fi=jU)@zlH+Xa*9eik0BH{ zSIh54*<=E2?yk7Gq)xLzX6rvP6P=aah5OBCpqtVqcvvRBxk;1T?yir*z1&>LomglzEX;=Oo6A|J9KI diff --git a/env/lib/python3.7/distutils/distutils.cfg b/env/lib/python3.7/distutils/distutils.cfg deleted file mode 100644 index 1af230e..0000000 --- a/env/lib/python3.7/distutils/distutils.cfg +++ /dev/null @@ -1,6 +0,0 @@ -# This is a config file local to this virtualenv installation -# You may include options that will be used by all distutils commands, -# and by easy_install. For instance: -# -# [easy_install] -# find_links = http://mylocalsite diff --git a/env/lib/python3.7/encodings b/env/lib/python3.7/encodings deleted file mode 120000 index bc6d310..0000000 --- a/env/lib/python3.7/encodings +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/encodings \ No newline at end of file diff --git a/env/lib/python3.7/enum.py b/env/lib/python3.7/enum.py deleted file mode 120000 index 77ccb8a..0000000 --- a/env/lib/python3.7/enum.py +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/enum.py \ No newline at end of file diff --git a/env/lib/python3.7/fnmatch.py b/env/lib/python3.7/fnmatch.py deleted file mode 120000 index 2063ce7..0000000 --- a/env/lib/python3.7/fnmatch.py +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/fnmatch.py \ No newline at end of file diff --git a/env/lib/python3.7/functools.py b/env/lib/python3.7/functools.py deleted file mode 120000 index 516834e..0000000 --- a/env/lib/python3.7/functools.py +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/functools.py \ No newline at end of file diff --git a/env/lib/python3.7/genericpath.py b/env/lib/python3.7/genericpath.py deleted file mode 120000 index 56b9556..0000000 --- a/env/lib/python3.7/genericpath.py +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/genericpath.py \ No newline at end of file diff --git a/env/lib/python3.7/hashlib.py b/env/lib/python3.7/hashlib.py deleted file mode 120000 index 90e4ceb..0000000 --- a/env/lib/python3.7/hashlib.py +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/hashlib.py \ No newline at end of file diff --git a/env/lib/python3.7/heapq.py b/env/lib/python3.7/heapq.py deleted file mode 120000 index 3c076dc..0000000 --- a/env/lib/python3.7/heapq.py +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/heapq.py \ No newline at end of file diff --git a/env/lib/python3.7/hmac.py b/env/lib/python3.7/hmac.py deleted file mode 120000 index 57e88c3..0000000 --- a/env/lib/python3.7/hmac.py +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/hmac.py \ No newline at end of file diff --git a/env/lib/python3.7/imp.py b/env/lib/python3.7/imp.py deleted file mode 120000 index 56ec73e..0000000 --- a/env/lib/python3.7/imp.py +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/imp.py \ No newline at end of file diff --git a/env/lib/python3.7/importlib b/env/lib/python3.7/importlib deleted file mode 120000 index 4c5f4ca..0000000 --- a/env/lib/python3.7/importlib +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/importlib \ No newline at end of file diff --git a/env/lib/python3.7/io.py b/env/lib/python3.7/io.py deleted file mode 120000 index 339c817..0000000 --- a/env/lib/python3.7/io.py +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/io.py \ No newline at end of file diff --git a/env/lib/python3.7/keyword.py b/env/lib/python3.7/keyword.py deleted file mode 120000 index af7e802..0000000 --- a/env/lib/python3.7/keyword.py +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/keyword.py \ No newline at end of file diff --git a/env/lib/python3.7/lib-dynload b/env/lib/python3.7/lib-dynload deleted file mode 120000 index 12d11db..0000000 --- a/env/lib/python3.7/lib-dynload +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/lib-dynload \ No newline at end of file diff --git a/env/lib/python3.7/linecache.py b/env/lib/python3.7/linecache.py deleted file mode 120000 index fa0de00..0000000 --- a/env/lib/python3.7/linecache.py +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/linecache.py \ No newline at end of file diff --git a/env/lib/python3.7/locale.py b/env/lib/python3.7/locale.py deleted file mode 120000 index 1742884..0000000 --- a/env/lib/python3.7/locale.py +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/locale.py \ No newline at end of file diff --git a/env/lib/python3.7/no-global-site-packages.txt b/env/lib/python3.7/no-global-site-packages.txt deleted file mode 100644 index e69de29..0000000 diff --git a/env/lib/python3.7/ntpath.py b/env/lib/python3.7/ntpath.py deleted file mode 120000 index ac3e599..0000000 --- a/env/lib/python3.7/ntpath.py +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/ntpath.py \ No newline at end of file diff --git a/env/lib/python3.7/operator.py b/env/lib/python3.7/operator.py deleted file mode 120000 index 20aa91f..0000000 --- a/env/lib/python3.7/operator.py +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/operator.py \ No newline at end of file diff --git a/env/lib/python3.7/orig-prefix.txt b/env/lib/python3.7/orig-prefix.txt deleted file mode 100644 index e25db58..0000000 --- a/env/lib/python3.7/orig-prefix.txt +++ /dev/null @@ -1 +0,0 @@ -/usr \ No newline at end of file diff --git a/env/lib/python3.7/os.py b/env/lib/python3.7/os.py deleted file mode 120000 index 3f4e638..0000000 --- a/env/lib/python3.7/os.py +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/os.py \ No newline at end of file diff --git a/env/lib/python3.7/posixpath.py b/env/lib/python3.7/posixpath.py deleted file mode 120000 index fae2a64..0000000 --- a/env/lib/python3.7/posixpath.py +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/posixpath.py \ No newline at end of file diff --git a/env/lib/python3.7/random.py b/env/lib/python3.7/random.py deleted file mode 120000 index 904f9fa..0000000 --- a/env/lib/python3.7/random.py +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/random.py \ No newline at end of file diff --git a/env/lib/python3.7/re.py b/env/lib/python3.7/re.py deleted file mode 120000 index f92bf34..0000000 --- a/env/lib/python3.7/re.py +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/re.py \ No newline at end of file diff --git a/env/lib/python3.7/reprlib.py b/env/lib/python3.7/reprlib.py deleted file mode 120000 index 26e0a41..0000000 --- a/env/lib/python3.7/reprlib.py +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/reprlib.py \ No newline at end of file diff --git a/env/lib/python3.7/rlcompleter.py b/env/lib/python3.7/rlcompleter.py deleted file mode 120000 index a823cd0..0000000 --- a/env/lib/python3.7/rlcompleter.py +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/rlcompleter.py \ No newline at end of file diff --git a/env/lib/python3.7/shutil.py b/env/lib/python3.7/shutil.py deleted file mode 120000 index c2f4a48..0000000 --- a/env/lib/python3.7/shutil.py +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/shutil.py \ No newline at end of file diff --git a/env/lib/python3.7/site-packages/__pycache__/easy_install.cpython-37.pyc b/env/lib/python3.7/site-packages/__pycache__/easy_install.cpython-37.pyc deleted file mode 100644 index ecbd99ac0a8e55a333bcd251a3d18864a2f266d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 281 zcmYk!y-LJD5C`zt-RK4JdO^@&m*NrxOA!$)Y%H`3$gte5TyVe4ZopXB_$XGsQd%ot z!ODr=p#wAj85n*S^Z5=?xwpN$7s`+6*c7MboH`!SP|$#8iaqe|Kyf7ux1tdYw0H#u zD!YYp>v{jCcSTz1;!?)p%Ecs&DVE+^>C~7bTG=|pPvW3tV>X@FWj4+bm0u!GFHTyG z*c?Wk`jEUgv04L_CKTIWwG(8#L$^)wGrmshWJ4X=uvot=)Z^fuj_+6XpH=@isxXZC Ssr9Ni`iv12CoSVS+hyNIu1*gC diff --git a/env/lib/python3.7/site-packages/dns/__init__.py b/env/lib/python3.7/site-packages/dns/__init__.py deleted file mode 100644 index c1ce8e6..0000000 --- a/env/lib/python3.7/site-packages/dns/__init__.py +++ /dev/null @@ -1,56 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009, 2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""dnspython DNS toolkit""" - -__all__ = [ - 'dnssec', - 'e164', - 'edns', - 'entropy', - 'exception', - 'flags', - 'hash', - 'inet', - 'ipv4', - 'ipv6', - 'message', - 'name', - 'namedict', - 'node', - 'opcode', - 'query', - 'rcode', - 'rdata', - 'rdataclass', - 'rdataset', - 'rdatatype', - 'renderer', - 'resolver', - 'reversename', - 'rrset', - 'set', - 'tokenizer', - 'tsig', - 'tsigkeyring', - 'ttl', - 'rdtypes', - 'update', - 'version', - 'wiredata', - 'zone', -] diff --git a/env/lib/python3.7/site-packages/dns/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 9b3cfa2f6db847c631e39457e1ec00ebf6ddd54c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 610 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 diff --git a/env/lib/python3.7/site-packages/dns/__pycache__/e164.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/__pycache__/e164.cpython-37.pyc deleted file mode 100644 index ebfcbe4be544a00273fd86d4e65957446d6c37e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3208 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 diff --git a/env/lib/python3.7/site-packages/dns/__pycache__/entropy.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/__pycache__/entropy.cpython-37.pyc deleted file mode 100644 index e5900f8876db07ef23348aa9abe0865ed5c0d66b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3306 zcmb7G&2JmW6`z@%T`rdtCCiE}J8sH0El?UsRNKu*i!^YP+DQR}2x_BF38b49XChHr zerR@-h{6&EBA<$)$f;+lIrY**{*s>ORG=rHd&|ZBy;+J?g#bZ!F>l^{zj^QX-kWz< zRuYEq$yb{nf3?oozo>Ec#bEBD6n_O#O!1ucs+#w>Z;PH#LIrs+ls!2Ndm(4jrXPuV zwa099LoyxjC+0)W==US_UhVg6BtByAGbL5{l&MfBCqb{F8z-#SoHjL|ubi@83+p$r zeiiHgv{=u3t!k}`RP8D2t*KbmQD0L0A?qa1ASdfSxQ0=2F}6@ingred5Cs=7*0N2;NksB3CPwNS@uRjr|} zdl@df#=Vg>DuU-cXPxk7lA2 z^P2CAmB2_HI{AZSHi1t5Qt4zdw=oOKVBWki_m#!mFVFOcT~}tZl*^d`?ON%yqPC@E z$@c0S?1Us-Eg{K%-Tb3u^EKNl`3XPeuw;m_OLl#J*`K&EYO08O{7p6#gEeYhLxy;^ zL1Yc&-_&G}?sr~r$pp$t2P37AT%-m&y0ET3(nmJko?7ja)b1LcsR8UKAB_9^WJ}Q6 zZdUB(gKZ~^-Rzc=)O0b?G}j~7_|0%KHujz|W8(r$aluG`?t-Cu-PLL1%$RKIBpr?| z?7+CF&{}Eb#JF(Lj<%D5axwL#;5s2@>HJfoTA5WyZ|FAW3drA>X`}k)_Ldz^wkCtg ztAkNtvpj$G&h(&|Ob++A)To$D?e2I)+?K9j@!DkS;uLou*ff0^I}|?!VLbAG!Ud0c zg1>c+qn>rXhLIL#HATdaH_oB#wX^N+_X*VW5!}dqJ=_eKQWPzimCgAn9Pzk&^g+pg z%|5;h*swi7YcJRr=9LPFWuU}e2AHrtDk5apSShA|yXvJFhhYK;L5$ z^GR__|NI&ax{lcZrGf{{I6UzacvlEd{9@sWH*G}GL&=k1CXQR= zyJvGrMf12)4pz1oE6Zx7t=nXtoWkQ~{JbxEFJsmD@Gf{FXu~$i3uo}o`3k%Ul$*+hJ)h!qXDqe@4T@uL8G$W(4UPeF36ZT-*dlP!0j| zPf$nmnvGG{t7v8u-v=xEmSxB}?l9h-rgqJhvs7<`j0HQ)qN19(@ znR%Cpk0hin#E+j-$1jMqmxQ$DY6}Z}iN;c{HDO4E&brSQE~+kSw)}#$KORmp>oMm; zma8uxZKjDS<}yfcRUHn8czrM5bJ2KvPxr02MV0oO54|3L>(f;w_)S{x6-WY{6ShrF jFLC^Kg`0Qi{ZLT!AuPstB~eO2ItkWxB2n>)h@<}ib#1^O diff --git a/env/lib/python3.7/site-packages/dns/__pycache__/exception.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/__pycache__/exception.cpython-37.pyc deleted file mode 100644 index f8ddaa45393f49d8f32b351fc2ca050db0b85f65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4119 zcmbVP&u<&Y72erhkt>Q)9K{KoG-wB{gNjN_9h{Sq7O`WuXbUi{?VttGbh+FeiYx6e z%?wSErBEPhk(*rR)BKyx)WD9obbZyv9fXxESApy&W}RH_Uhq_D zb-fCT?sf%1w^4=O-7#}0Y_Hq=)^e>b1-)A~*Uu0Bg##b=m6k!Mc|TBs8(+B^22w=4 zPf;g4TH>*a7BF#qexVUyQRGr9uE#m;5r+g@6>eS#84#?Gs_8+Cf0;x_VV)NFx}OL$ zmB)&Y6wZqYAm5L(So?mj$H#%JIk8}HCkYg?884On2nSBZwXSzaYV?S~qa2oI9 zv`9oMGHnomr(X~c_^Uw10YW$X^m?f}Mx+P1HKX0a1+rn_jPzXQJ0@5l~X- zk<4)PK;|iiu;QTA>zUnv-`r13G(gSM)Nk>Q7#|gZ3{rt3rdUr&x)t(So;`R2eRC=j zKp13VTqLg^BCFOfQdo`!~AL?DuzEscIVqr zc9lk+z@1FR(E?N@l0kd1!kk_4E8~Ij^Sjf;!H^I#pyepkCcJ=y2ym6soeHIbV_`}q z;t&W5yw@9~8adqb`x6{xvV(k5ov%Zs3^f2xNF^5|YNRX6N5?}tK7S>oL@e{oH=?gR z0w-@i6h)ZxW5AfjA@P1a-IeRmH>%rC$mUW*l0(m1cvOLAW}R3wHnXo7vu3tDgv|!% zU9p+v+uE5~m(+7JPeYLCJIrt+>(rA^(W}wejLEL9YY%hnlkFM1vY3_aFTQ!bO)IXk ze`GL1R<^ZJqG3fZA}H zg^=?xu_lerd5+yl@TipgVi>%NbJ?E$$e(1S;#b0m zG%s=$ljH}9@u$X%k^8}Bop|M<# z?X&3zo4BrXW(h8>BS!xUk2*jDHr^*-U$bk&-4pxNR`<0NfyXEId-(1fHe&$T?o1yH zazcbenB)jo_FD9+65z8@48?iGKT<8XbTF-SF-es>Yo#jR#=$MS3h}1s$irWfhvvly zthvi<*7%MHEBY@Z+`>9~Ooa5-6k8Ye`5zFWb!|PhzJC6D`@*?!HJiB_6+5smZTUO& zT)j1OFF~!DJ##*@bdCPMkN6{YYRg__y{=z_el&izH**)g-{Lz$X!=*s2x_=c;Q2La z?n43%f|#yx?zvE-MAHD(E3raO_z>4C7zcg{LRW!rA*mCFAhmP{wkydsm%q^~;xFVD zLi>iyR&qwe|D@t?dF58DMXJh1tV~H~p(x!X#-{rihj;{qBHI7og@8MCD zSnplec3F+NcJnRI^XlHdiJ1aferUnxcudAN->ykr%Wa~z(WdG92zPng<91Gigy0lW zyVG*zkFbd(*_IzsW8zz}WCi7qF`D90lxvSkvTx|43C`&A~+3lZXV=vfv`zrW^`$RgZCqvd!qxfNP1xH4LEjqF>wR(qM} zPvYb0_g>4v~GcLmyydlTbs}btC*1ja*P`tE|6_Q<0DK z^uvX3%b!MEV+a@cNVm&6^=aC}|1pgR11%)~<9zM~E-JjSMyk`Q-N?*Uz1_sokKy_S z1xW=;Z!a|_>AOzLGsG^pmp_h7MHv!HqK%{kNdmRtQJ JS9jd%?>`jNFv|b{ diff --git a/env/lib/python3.7/site-packages/dns/__pycache__/flags.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/__pycache__/flags.cpython-37.pyc deleted file mode 100644 index 49096846d0d25986403d76ac041109e561734bac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2226 zcmb7FOLOBy5S|%HwyfAr;?3r%GM>_6bj!7fhR_&sywl)sP@-Qz@dT!g@=rn{$Sr1`$?p3zpN;t^;+|Gs?Cn<3;c z9NaV)jOWnRpCC9138x|DEM(jYEpCT4cS463!U8XbMVNC16--#d7LF*0B6oi)h9zDS zZbU$7lH*_~-dNuYs=d z2Ydna1OAXNf?nWDd>QmZzQP}YUgYoWli=~2+RpC2|3WC$JQDub?dFkMi^wm8M8rnH z2)QH_1h~khk75o)P}J<(JZHT!N`v%MYYU~hunhQ9Mn3tlqK0tufY+tAe_h=^q5 zp!x&r(>}{+#(rg8d!PJ4WCbPzOS82NP0utvHx47NHrCUVWIc(J)u^M=X1l%m*?Ctb zN$+@_cT{qozK%O+tsfc&$@!J{lt-`fwPcu4TLkKcxYosAFbT_cI-HueMohTJ2 zO4}-ysV+)!Dx?wt(@xra)fU=`B^PoEi7wZTyKVxq1v@INR6@(tg-5P{-9l8@oa=7T zt-*j}YRG^LN#8nqoLM{MV4-hkm@XSpuaGU$XWiOMk}<%_b}#WW2uUUF2oU#@M99F= zb}G(NxdfBiF-UYFjgLh~X_`(W_UeZ+KB?myFW?1b&K$J?tw$HAd=Gprj3KrH^t`A( zhrtmdeLrJ>^a+%f-FGsQ+0TK=u_e9C8j#ExQcAksOTyWJX4a4ba%)#Ug14`z58w+; zK;7Zm{xOa^K|wx&8G~IegB5y+Y!pvTk2O7=Cg9f7*ueiDmgn%R5b`ROAAm0}2Rs{j zIUr9ghm>AmFzK74?YILuPW`5@l4eV+Dv>m0GZoy&dhp{zA7kkw9{;r2?g`~boiv8^ zCdQr*&G^?mWABNyCp*e-cKk*IRyG>O9WWDA?bctN8{7ev?*f=H@C4 zdlFbRYw|31CrILHzeV!jvZ!*J9Y5!z{#!2d^@is}=}z;!Bcaut=qRi6qw)QzEgSOJ z`Tc2v`ln#;21~kFuk*N7uS>iJCEhHuhyw3RSwev)RKky+NGxsnA&ONL3n)H9v5o>S zRrxWB4HS4|nQAm=MPfZkjJL#{Ck~mZMN@|E)03F@+Tt1hM-<*`wqvu2$FVI&$B%2f RZjIF}x8O3@aahR- diff --git a/env/lib/python3.7/site-packages/dns/__pycache__/grange.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/__pycache__/grange.cpython-37.pyc deleted file mode 100644 index 6b1912627522c8f3c50edb3e166f2b1b362500c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 999 zcmY*Y&1%~~5Z+x$wyY#2gp#J0vV|7nkl2($dnu)9VtUIV4io~xQoL(hvAmLZSHU(i zEomPlp-|`x^bz_1J&MvxPwu&=oI0!6{aG=yGx}z~`53KUuB>KL~wE>QyW5h5c5kAJuV)lDS2bDvU*K z2B*}iF+2s{DPh*s%8=a55VP(gX7`EQ)aVRf66Rdt3p_f@&^|gj zo!XgQphua-ET}rtRz}|8sZ+3&rq-|q6=gug94QrudxKosS4h6iNM=7pQ!=d0dsH%e z9hpAE+G_;NUcV$i-e6bg0>hgUFn(SzLheHTWuD^i z;tY2znA+0h+g>puO?8h`%}1JcVmY93hX(T*h5|z0f3O&>?^C4%%?Dh-sh9@Bqp(7u zd6&zYS7cj;YHPbVskHR{?LQ6DAo|PvKd)&$CphFfl|li5PLqfmLAob72PM!6G@J)f z$`z!WphoI#5EUoJ^Q7wgwL-5D0t_Mjy z36q^rKw%W^JRT2KlBE4Qs7S`T7Yh^ByT#?NCF8u(k@28q+874)1RU~g43E8vmx+g0 zu?txV{9^aWZQ^1N%q?sg!(&PF^Hr_9+-kA7-D=4SfjN5Vf6TH~V$ziE{D*soFy~>Xt=4tPq7BdZ8fofD{R>ys_DsI*GB9uC_wr z!VhW1iNEA4C;kE_#$FIiH19ntp3J<-%gJPjAijKi^!_M8=!ZZ2jTpoWNUH!i$`Qw$ zD4gTKBqxI0M?4bo1Hnk5JQ4U~Pb55EB2ax$Nl+=MUQh#2{h)@R(x67521~?;eDoFN zV@|HobbNPo$!sa>4PCS1X3Gq>v}h{LTDg`=wmZ5tOlx6&!f5E~?hUW)tb`I;HM~=T zZlzLmEvOMyb1OKNHT}@Foe}g_7%LmNPTwlQte_pFFI934*K8{opSkGu#lpqcm**$0 z2RNTU-SgsE;M24Hd2uo?upa@!a|HPc(vAUI^cmgb2Xu(Q626)e*YkaZbxG%EpJF#) zYSS3mmeqG;Mo{xB%i2n3TIypz3sdU&boa?>-Q8s1QSaKaslCelr)GNRqK#;u_?83! zVKV`oPF#Pr;!Uwyx&9w-E`>GLuu|({uiU|f&_)!n(x!g5e`QiAc2UK_yDb@b2Mpdl qd+)%(J1}?;&BEOOfw%6`<^D%JKY){c3=oqPrzFM%_W+0gp6E9$t*SWy diff --git a/env/lib/python3.7/site-packages/dns/__pycache__/inet.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/__pycache__/inet.cpython-37.pyc deleted file mode 100644 index 33039de9a2274d0bf018177f7cdaa92bb060e1a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2410 zcmd5-&u<(x6t-t)XJ;q7+lr>BAPzoMf{mJ8ekmtZC?!RaP=r_nbS1Pq8G99HXFP+) z8@f>tQsED2#fg7u4hRWx$cZ}_c+c}AX^4uD5W=JJo3WqmXMf-O{C>Y55GddNaO=xA z`h@&~KXvip<2`uuW2iWp5>B}j(TO zgjT|^kaI2aoE?fd6PhhnDl#%v`REMdB>QI+>LD$kyO^GFan&s*Z&=%p3}4#3Qo` zW41_j!qNo`83g)us+Uc$Qkj%Vld}VGrx%XhUx4-*o(c&sET$vreU34X!%`7yj zD*UQ@$9C-$H?9b9=oDVL`@+TT{YW$rmHa*)nP%5yX#d)nJd;}ls>xLZBC(bE(N+~g|32{*o0{x(rG27p6`n`!2 zH}LE{rlq`9B4_pDRR}}p^XZkrg5$B8k6SiXRLn1>JO+u^K}dC zWg6VTHk-Jc@CAvBco*%3)Va9~dr#)G=1e5`HK1?O>lXA)kn91~FXL2$qBEQEG@8u{ zFHfVTFjF5?e}q?!jiUM80naE+ve1+vTA8s_9NaTT%Y&6Ev&7y78kuH!W!Je7q-CiU k82_Cl<*QiSMc*95aUI|Bsqge$&vR%1Q3fslCOj|x2|nU^a{vGU diff --git a/env/lib/python3.7/site-packages/dns/__pycache__/ipv4.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/__pycache__/ipv4.cpython-37.pyc deleted file mode 100644 index 5f8fe82ed71e0dbdc6d3e07728cd83db34b8f1d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1382 zcmaKs&2QT_6u?R9!?Nt8L(z5(_5ocs%tb2)XpoZ;4DB{xI~2om*k&NGRZ(eV%alUW zL1Z`>(Db~a|GuK-NmJtj?Y4efK@A3KZy`S`KYbzu$e);3!(QZJ< z->5W$!RAYtY7Yb_L&7O%1szhmvZ2Er?iTLM8+w#*kNa=P(B~~4z}n*Mko4M%2j6~w zwilgbMU~0ucrH?%mqNui5RtsNp&)zIbYA8nk@ZN|RhHs!IB@l0K8LBk0inr~T*7}( z9eGdF37a^tsdkq{dzVaou06C~5YCo_J3HXZT`N5+{T*`bJ|K`&Yw`AZDb6yfqeMhD zy@Yd_DHY`+T4fR)mvR>AGSb<(wn`j^5sXJ`*GG?|BpQ!b-sAD(NS|cyi?u%fL#F3a zD0>z|kH@hMd*j0W7M;)Lar2dUeTf~ovBH5}&o@qy3FB~~OglSIvkI$eI)}B;$@$k( zmePc|%7xO2NHf!ZS?es3GO3}+t##^u5xEV)-u3%>R`sjAdSd;H;>pwcR8`e{+K2d6 ztxrmUyMA7s?Zs7X+PTQ|Na!-zf%B>hf&^U}&=BS}l^=k<=^kEa)4e}I!R~1aow~au zSL~WxfPUq0dQC5|ixfJ`ptHN$oA{H~YkEFd(yz$T-UVB-tKgcb?-~nuGw^n%uH0WT z>@xSJOzt=K)BPVw{V@j;-w=!eR5-dl33<45erLY|1Jr&R|DTCqKM~#rHad&n-owTQ z1|;JaC=DBEUxTq~?*C(fws}(A#_Bc~4O1&J{y`36iRH93SS}3R-4q(>KaO+<~L-!atsAkQ_1`2>LJeRKRK_l#N@sJC-o@^5+ITxZQu;( zL)N7XAl;@ul@WOK0@E6ec$tny@*~iPTY!4Jd8TZZ;DMz`w7rbw+n&9Z0X|6*OJ{i4Y6@a_ve?~u69LGNk1W~m>{3J`Z_Tr*8DFR}HJXVkFv89pR z)ACB%o`PCKZa_}3CrU0(9Jq1b69-OkwevD`saJP zUn&Izo?rZF{plZW5b|%VEFKe-??Xv{34)O(VU!tN+NAnzG!6YWo0fjt@HUy%b$V{o z?RibF=Qn*yB03G2eNLMN<}mkHq*>G!4=g3E`Jk1x7J##97^krr| zBDKn7_1zzx-m4x)-9f~wong`zaX(4xGl-7t&M3&5shklHlY>YV_TwbvTR+>r`|a><=jrWQ8y)c}Lvf%yfRg?Ztb#~#1|NHD@)ZG}envl{ z!kC(poYRaRkj!9aWIvBm!`{mhj`7y-ObK9)iHG4%3T0c%ePc)ei$|9HJvcu9{r z$JTSopG%12*Z^%GY(>=49nea1o54yDN%?9I{x)06N{PiPSxJ^ea8#HUC1KZ?jVp3a z*GNW_J8XGck_NM-n_Jn^8p&GSXeEX}NKJQgUzbc}U(3N@+RN>j2cip^G4Xb;5dGEcwJ5_NQy>6_z`+H%WMkzS{ zIP4CiA9CL3dwbQmquno}NRzLN>NoCH_s0S{cl*gfT~GdAB!)am^~@O9-d=8>Rp97N zu1pVpA&;&O!tun;ED*cgK=ma&4`&{zif%ui;US*cAevSOo{76zw&G z{U{Z!RD@hKJ*{J$c5WzjLumXUO!H7on7LVK4>^w#0Z}H(8StnRkN!;fSMfu)wnT5R zHHZgy;{-wR|n z{rVMAdo#sdZZztfDegplv(b3-f>#J`AByJH-{!m$^vpvDconDp9)(zM=r33PJL#b({tn)+{S63Ex@K};hezzbT?2sT3T9qaEI-D4pDq% z+~32j4m0saXC%2PO0Ts471~Ya=j{+_nF08Lqf636j!KIafL{NC*eXZYKBBCc*}z(7 z^jm2H`R?zFpf;L7eK#nzSR1$6q;7f_Ym7t<#+r z+;|`nU%>_+!5VTNj`vwm8nvSV{@GB4N8?05|be|(=_?JO6gEWegR@57avGUtt(of=c*j2R6Z(?7g+txhG#n;en8w7)rJ_bPw z044(fqye=`D|DHbZG=@BK;r?fP+rCn!pWlRbQ!#`EdZY~6wqt~YO7SwkYc*{{CWBE zf!PpukQEz-9=ul87j~loqiCDLsf3&A++*bQKS3|5dSL+3<)fq_xlU9>PtX8 zejoJOb>+5Ntlw_6l))pt@y!xsk^03!(dV)0p-pE)7YR diff --git a/env/lib/python3.7/site-packages/dns/__pycache__/message.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/__pycache__/message.cpython-37.pyc deleted file mode 100644 index e9d61e6946e471008d54118133b29e5e8abde932..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30487 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

1_|vpVP+=DPf?Az!S56y&H1_} zUSrnl?uF@=)=}xU1;PSi;o1mJ{n;cBLN{~Y)^r~xi%6Bt>B=maQX}g$GrVV<*;BMB88@LND-nf{lzl2UAj(L76*cV%kQOOCzuR zuQQK_t4kdb6%HBLLA*TWbC!!c-i%Ex(KeC0r@Dl4c|`Zu zIX!fWNf2bex&=!5e~erIghPFFF^W~7&XQRzILrjCARk$!(yZgkL70z>DbB>@%j~*Y z#b22%A(uM%!~e&wP4tQQ(S(T5)5(p>x=KeH+bWfEP(>Rk2gN)E8V;)H8S__qXh^9Ykmh-4g?umgdih3 zT^!nJ4Jo`B7<7TK1m`-C0x=emBZUR=Q=KjaVydv>=a00HP%JfZyGUVcI-AqhQ$Fjr z@nr|01-|^mX{f&JOb;#^i(mOy1PZ|u9$|E{h z4H~p^mqV%F2e?BlLi`mK97Ud^2Nx4UKT&7va~u?ZO&!lth^$Tz$~)xC{x@_}NMl$< zI7Jg`SYtQf4k>aXRYdCc<_wj4b*706Bw|7@`hcc(Q9vCO<0U78I-DT*9K#nM`cSR2 zjspuBR%CkS6$ABDLRfS#HY>^$JVu<#Z=AgNHtwE#LGc1@|AiyZmVtC$ow0Uh!t0Il z`FKyIDTtyeJW#Nu_DTE=wb9&D&r_mRmQCq7x~abWImpmDb4Yw$b>4O^3%WN+bQ0Xz zIHm-H&lp8^(Awu9TD%GQ?PC$*0L38r$=wlAxj3QFU14v|?~wX(fAaPypJmy_cQX1aubg80 zfR=+#?Ew-Y7z8>Pg)qy5K;DUyWtW`Y9p&X*%<}e~yUHl>@ufNV;qU*zxZe##2>hOY zT@vC?<)eXHJy?~Dj%pau`0_Z zHmQx$6-rgr`%lSgqU4#grZdO)KxwsA<9meqN={$O5gsEz#&S5P-8u+Jw?l4}yIJd#J&?sBIcCST~Y16&7Tu-4p|xACnE(ck$-QSK6zm zyn-ipTRY2qJ2QODva`XUr^(2_MlYZ8{!z^_bXnZWtj{H=MiJ98L=ciS(Wy=hY7mo} zq(eKTOS{CPR-}#XR@&MaiQ)RSE?C18NVBr2c#Gt`RZCk#!BjYtz++qV0JaTpssx}? zim;;Cb-gGO9WM-nPz+-HfP-fYhxT;khs$`n@bC(7u!OrH#&a=x3cZyd#1YJ5e=&!- zAO8C%IDp6L(!KYhgZr&jL;21gzc&ugN~cWANt)Mu&Dey#@A8k!?VB3z6VjX~Rla7< ihNX^_cvHisph``, ```` or ```` - if completion_type: - options = auto_complete_paths(current, completion_type) - options = ((opt, 0) for opt in options) - for option in options: - opt_label = option[0] - # append '=' to options which require args - if option[1] and option[0][:2] == "--": - opt_label += '=' - print(opt_label) - else: - # show main parser options only when necessary - - opts = [i.option_list for i in parser.option_groups] - opts.append(parser.option_list) - opts = (o for it in opts for o in it) - if current.startswith('-'): - for opt in opts: - if opt.help != optparse.SUPPRESS_HELP: - subcommands += opt._long_opts + opt._short_opts - else: - # get completion type given cwords and all available options - completion_type = get_path_completion_type(cwords, cword, opts) - if completion_type: - subcommands = auto_complete_paths(current, completion_type) - - print(' '.join([x for x in subcommands if x.startswith(current)])) - sys.exit(1) - - -def get_path_completion_type(cwords, cword, opts): - """Get the type of path completion (``file``, ``dir``, ``path`` or None) - - :param cwords: same as the environmental variable ``COMP_WORDS`` - :param cword: same as the environmental variable ``COMP_CWORD`` - :param opts: The available options to check - :return: path completion type (``file``, ``dir``, ``path`` or None) - """ - if cword < 2 or not cwords[cword - 2].startswith('-'): - return - for opt in opts: - if opt.help == optparse.SUPPRESS_HELP: - continue - for o in str(opt).split('/'): - if cwords[cword - 2].split('=')[0] == o: - if not opt.metavar or any( - x in ('path', 'file', 'dir') - for x in opt.metavar.split('/')): - return opt.metavar - - -def auto_complete_paths(current, completion_type): - """If ``completion_type`` is ``file`` or ``path``, list all regular files - and directories starting with ``current``; otherwise only list directories - starting with ``current``. - - :param current: The word to be completed - :param completion_type: path completion type(`file`, `path` or `dir`)i - :return: A generator of regular files and/or directories - """ - directory, filename = os.path.split(current) - current_path = os.path.abspath(directory) - # Don't complete paths if they can't be accessed - if not os.access(current_path, os.R_OK): - return - filename = os.path.normcase(filename) - # list all files that start with ``filename`` - file_list = (x for x in os.listdir(current_path) - if os.path.normcase(x).startswith(filename)) - for f in file_list: - opt = os.path.join(current_path, f) - comp_file = os.path.normcase(os.path.join(directory, f)) - # complete regular files when there is not ```` after option - # complete directories when there is ````, ```` or - # ````after option - if completion_type != 'dir' and os.path.isfile(opt): - yield comp_file - elif os.path.isdir(opt): - yield os.path.join(comp_file, '') diff --git a/env/lib/python3.7/site-packages/pip/_internal/cli/base_command.py b/env/lib/python3.7/site-packages/pip/_internal/cli/base_command.py deleted file mode 100644 index f6108c9..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/cli/base_command.py +++ /dev/null @@ -1,340 +0,0 @@ -"""Base Command class, and related routines""" -from __future__ import absolute_import, print_function - -import logging -import logging.config -import optparse -import os -import platform -import sys -import traceback - -from pip._internal.cli import cmdoptions -from pip._internal.cli.parser import ( - ConfigOptionParser, UpdatingDefaultsHelpFormatter, -) -from pip._internal.cli.status_codes import ( - ERROR, PREVIOUS_BUILD_DIR_ERROR, SUCCESS, UNKNOWN_ERROR, - VIRTUALENV_NOT_FOUND, -) -from pip._internal.download import PipSession -from pip._internal.exceptions import ( - BadCommand, CommandError, InstallationError, PreviousBuildDirError, - UninstallationError, -) -from pip._internal.index import PackageFinder -from pip._internal.locations import running_under_virtualenv -from pip._internal.req.constructors import ( - install_req_from_editable, install_req_from_line, -) -from pip._internal.req.req_file import parse_requirements -from pip._internal.utils.deprecation import deprecated -from pip._internal.utils.logging import BrokenStdoutLoggingError, setup_logging -from pip._internal.utils.misc import ( - get_prog, normalize_path, redact_password_from_url, -) -from pip._internal.utils.outdated import pip_version_check -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Optional, List, Tuple, Any - from optparse import Values - from pip._internal.cache import WheelCache - from pip._internal.req.req_set import RequirementSet - -__all__ = ['Command'] - -logger = logging.getLogger(__name__) - - -class Command(object): - name = None # type: Optional[str] - usage = None # type: Optional[str] - ignore_require_venv = False # type: bool - - def __init__(self, isolated=False): - # type: (bool) -> None - parser_kw = { - 'usage': self.usage, - 'prog': '%s %s' % (get_prog(), self.name), - 'formatter': UpdatingDefaultsHelpFormatter(), - 'add_help_option': False, - 'name': self.name, - 'description': self.__doc__, - 'isolated': isolated, - } - - self.parser = ConfigOptionParser(**parser_kw) - - # Commands should add options to this option group - optgroup_name = '%s Options' % self.name.capitalize() - self.cmd_opts = optparse.OptionGroup(self.parser, optgroup_name) - - # Add the general options - gen_opts = cmdoptions.make_option_group( - cmdoptions.general_group, - self.parser, - ) - self.parser.add_option_group(gen_opts) - - def run(self, options, args): - # type: (Values, List[Any]) -> Any - raise NotImplementedError - - def _build_session(self, options, retries=None, timeout=None): - # type: (Values, Optional[int], Optional[int]) -> PipSession - session = PipSession( - cache=( - normalize_path(os.path.join(options.cache_dir, "http")) - if options.cache_dir else None - ), - retries=retries if retries is not None else options.retries, - insecure_hosts=options.trusted_hosts, - ) - - # Handle custom ca-bundles from the user - if options.cert: - session.verify = options.cert - - # Handle SSL client certificate - if options.client_cert: - session.cert = options.client_cert - - # Handle timeouts - if options.timeout or timeout: - session.timeout = ( - timeout if timeout is not None else options.timeout - ) - - # Handle configured proxies - if options.proxy: - session.proxies = { - "http": options.proxy, - "https": options.proxy, - } - - # Determine if we can prompt the user for authentication or not - session.auth.prompting = not options.no_input - - return session - - def parse_args(self, args): - # type: (List[str]) -> Tuple - # factored out for testability - return self.parser.parse_args(args) - - def main(self, args): - # type: (List[str]) -> int - options, args = self.parse_args(args) - - # Set verbosity so that it can be used elsewhere. - self.verbosity = options.verbose - options.quiet - - level_number = setup_logging( - verbosity=self.verbosity, - no_color=options.no_color, - user_log_file=options.log, - ) - - if sys.version_info[:2] == (3, 4): - deprecated( - "Python 3.4 support has been deprecated. pip 19.1 will be the " - "last one supporting it. Please upgrade your Python as Python " - "3.4 won't be maintained after March 2019 (cf PEP 429).", - replacement=None, - gone_in='19.2', - ) - elif sys.version_info[:2] == (2, 7): - message = ( - "A future version of pip will drop support for Python 2.7." - ) - if platform.python_implementation() == "CPython": - message = ( - "Python 2.7 will reach the end of its life on January " - "1st, 2020. Please upgrade your Python as Python 2.7 " - "won't be maintained after that date. " - ) + message - deprecated(message, replacement=None, gone_in=None) - - # TODO: Try to get these passing down from the command? - # without resorting to os.environ to hold these. - # This also affects isolated builds and it should. - - if options.no_input: - os.environ['PIP_NO_INPUT'] = '1' - - if options.exists_action: - os.environ['PIP_EXISTS_ACTION'] = ' '.join(options.exists_action) - - if options.require_venv and not self.ignore_require_venv: - # If a venv is required check if it can really be found - if not running_under_virtualenv(): - logger.critical( - 'Could not find an activated virtualenv (required).' - ) - sys.exit(VIRTUALENV_NOT_FOUND) - - try: - status = self.run(options, args) - # FIXME: all commands should return an exit status - # and when it is done, isinstance is not needed anymore - if isinstance(status, int): - return status - except PreviousBuildDirError as exc: - logger.critical(str(exc)) - logger.debug('Exception information:', exc_info=True) - - return PREVIOUS_BUILD_DIR_ERROR - except (InstallationError, UninstallationError, BadCommand) as exc: - logger.critical(str(exc)) - logger.debug('Exception information:', exc_info=True) - - return ERROR - except CommandError as exc: - logger.critical('%s', exc) - logger.debug('Exception information:', exc_info=True) - - return ERROR - except BrokenStdoutLoggingError: - # Bypass our logger and write any remaining messages to stderr - # because stdout no longer works. - print('ERROR: Pipe to stdout was broken', file=sys.stderr) - if level_number <= logging.DEBUG: - traceback.print_exc(file=sys.stderr) - - return ERROR - except KeyboardInterrupt: - logger.critical('Operation cancelled by user') - logger.debug('Exception information:', exc_info=True) - - return ERROR - except BaseException: - logger.critical('Exception:', exc_info=True) - - return UNKNOWN_ERROR - finally: - allow_version_check = ( - # Does this command have the index_group options? - hasattr(options, "no_index") and - # Is this command allowed to perform this check? - not (options.disable_pip_version_check or options.no_index) - ) - # Check if we're using the latest version of pip available - if allow_version_check: - session = self._build_session( - options, - retries=0, - timeout=min(5, options.timeout) - ) - with session: - pip_version_check(session, options) - - # Shutdown the logging module - logging.shutdown() - - return SUCCESS - - -class RequirementCommand(Command): - - @staticmethod - def populate_requirement_set(requirement_set, # type: RequirementSet - args, # type: List[str] - options, # type: Values - finder, # type: PackageFinder - session, # type: PipSession - name, # type: str - wheel_cache # type: Optional[WheelCache] - ): - # type: (...) -> None - """ - Marshal cmd line args into a requirement set. - """ - # NOTE: As a side-effect, options.require_hashes and - # requirement_set.require_hashes may be updated - - for filename in options.constraints: - for req_to_add in parse_requirements( - filename, - constraint=True, finder=finder, options=options, - session=session, wheel_cache=wheel_cache): - req_to_add.is_direct = True - requirement_set.add_requirement(req_to_add) - - for req in args: - req_to_add = install_req_from_line( - req, None, isolated=options.isolated_mode, - use_pep517=options.use_pep517, - wheel_cache=wheel_cache - ) - req_to_add.is_direct = True - requirement_set.add_requirement(req_to_add) - - for req in options.editables: - req_to_add = install_req_from_editable( - req, - isolated=options.isolated_mode, - use_pep517=options.use_pep517, - wheel_cache=wheel_cache - ) - req_to_add.is_direct = True - requirement_set.add_requirement(req_to_add) - - for filename in options.requirements: - for req_to_add in parse_requirements( - filename, - finder=finder, options=options, session=session, - wheel_cache=wheel_cache, - use_pep517=options.use_pep517): - req_to_add.is_direct = True - requirement_set.add_requirement(req_to_add) - # If --require-hashes was a line in a requirements file, tell - # RequirementSet about it: - requirement_set.require_hashes = options.require_hashes - - if not (args or options.editables or options.requirements): - opts = {'name': name} - if options.find_links: - raise CommandError( - 'You must give at least one requirement to %(name)s ' - '(maybe you meant "pip %(name)s %(links)s"?)' % - dict(opts, links=' '.join(options.find_links))) - else: - raise CommandError( - 'You must give at least one requirement to %(name)s ' - '(see "pip help %(name)s")' % opts) - - def _build_package_finder( - self, - options, # type: Values - session, # type: PipSession - platform=None, # type: Optional[str] - python_versions=None, # type: Optional[List[str]] - abi=None, # type: Optional[str] - implementation=None # type: Optional[str] - ): - # type: (...) -> PackageFinder - """ - Create a package finder appropriate to this requirement command. - """ - index_urls = [options.index_url] + options.extra_index_urls - if options.no_index: - logger.debug( - 'Ignoring indexes: %s', - ','.join(redact_password_from_url(url) for url in index_urls), - ) - index_urls = [] - - return PackageFinder( - find_links=options.find_links, - format_control=options.format_control, - index_urls=index_urls, - trusted_hosts=options.trusted_hosts, - allow_all_prereleases=options.pre, - session=session, - platform=platform, - versions=python_versions, - abi=abi, - implementation=implementation, - prefer_binary=options.prefer_binary, - ) diff --git a/env/lib/python3.7/site-packages/pip/_internal/cli/cmdoptions.py b/env/lib/python3.7/site-packages/pip/_internal/cli/cmdoptions.py deleted file mode 100644 index a09e38f..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/cli/cmdoptions.py +++ /dev/null @@ -1,809 +0,0 @@ -""" -shared options and groups - -The principle here is to define options once, but *not* instantiate them -globally. One reason being that options with action='append' can carry state -between parses. pip parses general options twice internally, and shouldn't -pass on state. To be consistent, all options will follow this design. - -""" -from __future__ import absolute_import - -import textwrap -import warnings -from distutils.util import strtobool -from functools import partial -from optparse import SUPPRESS_HELP, Option, OptionGroup - -from pip._internal.exceptions import CommandError -from pip._internal.locations import USER_CACHE_DIR, src_prefix -from pip._internal.models.format_control import FormatControl -from pip._internal.models.index import PyPI -from pip._internal.utils.hashes import STRONG_HASHES -from pip._internal.utils.typing import MYPY_CHECK_RUNNING -from pip._internal.utils.ui import BAR_TYPES - -if MYPY_CHECK_RUNNING: - from typing import Any, Callable, Dict, Optional - from optparse import OptionParser, Values - from pip._internal.cli.parser import ConfigOptionParser - - -def raise_option_error(parser, option, msg): - """ - Raise an option parsing error using parser.error(). - - Args: - parser: an OptionParser instance. - option: an Option instance. - msg: the error text. - """ - msg = '{} error: {}'.format(option, msg) - msg = textwrap.fill(' '.join(msg.split())) - parser.error(msg) - - -def make_option_group(group, parser): - # type: (Dict[str, Any], ConfigOptionParser) -> OptionGroup - """ - Return an OptionGroup object - group -- assumed to be dict with 'name' and 'options' keys - parser -- an optparse Parser - """ - option_group = OptionGroup(parser, group['name']) - for option in group['options']: - option_group.add_option(option()) - return option_group - - -def check_install_build_global(options, check_options=None): - # type: (Values, Optional[Values]) -> None - """Disable wheels if per-setup.py call options are set. - - :param options: The OptionParser options to update. - :param check_options: The options to check, if not supplied defaults to - options. - """ - if check_options is None: - check_options = options - - def getname(n): - return getattr(check_options, n, None) - names = ["build_options", "global_options", "install_options"] - if any(map(getname, names)): - control = options.format_control - control.disallow_binaries() - warnings.warn( - 'Disabling all use of wheels due to the use of --build-options ' - '/ --global-options / --install-options.', stacklevel=2, - ) - - -def check_dist_restriction(options, check_target=False): - # type: (Values, bool) -> None - """Function for determining if custom platform options are allowed. - - :param options: The OptionParser options. - :param check_target: Whether or not to check if --target is being used. - """ - dist_restriction_set = any([ - options.python_version, - options.platform, - options.abi, - options.implementation, - ]) - - binary_only = FormatControl(set(), {':all:'}) - sdist_dependencies_allowed = ( - options.format_control != binary_only and - not options.ignore_dependencies - ) - - # Installations or downloads using dist restrictions must not combine - # source distributions and dist-specific wheels, as they are not - # guaranteed to be locally compatible. - if dist_restriction_set and sdist_dependencies_allowed: - raise CommandError( - "When restricting platform and interpreter constraints using " - "--python-version, --platform, --abi, or --implementation, " - "either --no-deps must be set, or --only-binary=:all: must be " - "set and --no-binary must not be set (or must be set to " - ":none:)." - ) - - if check_target: - if dist_restriction_set and not options.target_dir: - raise CommandError( - "Can not use any platform or abi specific options unless " - "installing via '--target'" - ) - - -########### -# options # -########### - -help_ = partial( - Option, - '-h', '--help', - dest='help', - action='help', - help='Show help.', -) # type: Callable[..., Option] - -isolated_mode = partial( - Option, - "--isolated", - dest="isolated_mode", - action="store_true", - default=False, - help=( - "Run pip in an isolated mode, ignoring environment variables and user " - "configuration." - ), -) # type: Callable[..., Option] - -require_virtualenv = partial( - Option, - # Run only if inside a virtualenv, bail if not. - '--require-virtualenv', '--require-venv', - dest='require_venv', - action='store_true', - default=False, - help=SUPPRESS_HELP -) # type: Callable[..., Option] - -verbose = partial( - Option, - '-v', '--verbose', - dest='verbose', - action='count', - default=0, - help='Give more output. Option is additive, and can be used up to 3 times.' -) # type: Callable[..., Option] - -no_color = partial( - Option, - '--no-color', - dest='no_color', - action='store_true', - default=False, - help="Suppress colored output", -) # type: Callable[..., Option] - -version = partial( - Option, - '-V', '--version', - dest='version', - action='store_true', - help='Show version and exit.', -) # type: Callable[..., Option] - -quiet = partial( - Option, - '-q', '--quiet', - dest='quiet', - action='count', - default=0, - help=( - 'Give less output. Option is additive, and can be used up to 3' - ' times (corresponding to WARNING, ERROR, and CRITICAL logging' - ' levels).' - ), -) # type: Callable[..., Option] - -progress_bar = partial( - Option, - '--progress-bar', - dest='progress_bar', - type='choice', - choices=list(BAR_TYPES.keys()), - default='on', - help=( - 'Specify type of progress to be displayed [' + - '|'.join(BAR_TYPES.keys()) + '] (default: %default)' - ), -) # type: Callable[..., Option] - -log = partial( - Option, - "--log", "--log-file", "--local-log", - dest="log", - metavar="path", - help="Path to a verbose appending log." -) # type: Callable[..., Option] - -no_input = partial( - Option, - # Don't ask for input - '--no-input', - dest='no_input', - action='store_true', - default=False, - help=SUPPRESS_HELP -) # type: Callable[..., Option] - -proxy = partial( - Option, - '--proxy', - dest='proxy', - type='str', - default='', - help="Specify a proxy in the form [user:passwd@]proxy.server:port." -) # type: Callable[..., Option] - -retries = partial( - Option, - '--retries', - dest='retries', - type='int', - default=5, - help="Maximum number of retries each connection should attempt " - "(default %default times).", -) # type: Callable[..., Option] - -timeout = partial( - Option, - '--timeout', '--default-timeout', - metavar='sec', - dest='timeout', - type='float', - default=15, - help='Set the socket timeout (default %default seconds).', -) # type: Callable[..., Option] - -skip_requirements_regex = partial( - Option, - # A regex to be used to skip requirements - '--skip-requirements-regex', - dest='skip_requirements_regex', - type='str', - default='', - help=SUPPRESS_HELP, -) # type: Callable[..., Option] - - -def exists_action(): - # type: () -> Option - return Option( - # Option when path already exist - '--exists-action', - dest='exists_action', - type='choice', - choices=['s', 'i', 'w', 'b', 'a'], - default=[], - action='append', - metavar='action', - help="Default action when a path already exists: " - "(s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort.", - ) - - -cert = partial( - Option, - '--cert', - dest='cert', - type='str', - metavar='path', - help="Path to alternate CA bundle.", -) # type: Callable[..., Option] - -client_cert = partial( - Option, - '--client-cert', - dest='client_cert', - type='str', - default=None, - metavar='path', - help="Path to SSL client certificate, a single file containing the " - "private key and the certificate in PEM format.", -) # type: Callable[..., Option] - -index_url = partial( - Option, - '-i', '--index-url', '--pypi-url', - dest='index_url', - metavar='URL', - default=PyPI.simple_url, - help="Base URL of Python Package Index (default %default). " - "This should point to a repository compliant with PEP 503 " - "(the simple repository API) or a local directory laid out " - "in the same format.", -) # type: Callable[..., Option] - - -def extra_index_url(): - return Option( - '--extra-index-url', - dest='extra_index_urls', - metavar='URL', - action='append', - default=[], - help="Extra URLs of package indexes to use in addition to " - "--index-url. Should follow the same rules as " - "--index-url.", - ) - - -no_index = partial( - Option, - '--no-index', - dest='no_index', - action='store_true', - default=False, - help='Ignore package index (only looking at --find-links URLs instead).', -) # type: Callable[..., Option] - - -def find_links(): - # type: () -> Option - return Option( - '-f', '--find-links', - dest='find_links', - action='append', - default=[], - metavar='url', - help="If a url or path to an html file, then parse for links to " - "archives. If a local path or file:// url that's a directory, " - "then look for archives in the directory listing.", - ) - - -def trusted_host(): - # type: () -> Option - return Option( - "--trusted-host", - dest="trusted_hosts", - action="append", - metavar="HOSTNAME", - default=[], - help="Mark this host as trusted, even though it does not have valid " - "or any HTTPS.", - ) - - -def constraints(): - # type: () -> Option - return Option( - '-c', '--constraint', - dest='constraints', - action='append', - default=[], - metavar='file', - help='Constrain versions using the given constraints file. ' - 'This option can be used multiple times.' - ) - - -def requirements(): - # type: () -> Option - return Option( - '-r', '--requirement', - dest='requirements', - action='append', - default=[], - metavar='file', - help='Install from the given requirements file. ' - 'This option can be used multiple times.' - ) - - -def editable(): - # type: () -> Option - return Option( - '-e', '--editable', - dest='editables', - action='append', - default=[], - metavar='path/url', - help=('Install a project in editable mode (i.e. setuptools ' - '"develop mode") from a local project path or a VCS url.'), - ) - - -src = partial( - Option, - '--src', '--source', '--source-dir', '--source-directory', - dest='src_dir', - metavar='dir', - default=src_prefix, - help='Directory to check out editable projects into. ' - 'The default in a virtualenv is "/src". ' - 'The default for global installs is "/src".' -) # type: Callable[..., Option] - - -def _get_format_control(values, option): - # type: (Values, Option) -> Any - """Get a format_control object.""" - return getattr(values, option.dest) - - -def _handle_no_binary(option, opt_str, value, parser): - # type: (Option, str, str, OptionParser) -> None - existing = _get_format_control(parser.values, option) - FormatControl.handle_mutual_excludes( - value, existing.no_binary, existing.only_binary, - ) - - -def _handle_only_binary(option, opt_str, value, parser): - # type: (Option, str, str, OptionParser) -> None - existing = _get_format_control(parser.values, option) - FormatControl.handle_mutual_excludes( - value, existing.only_binary, existing.no_binary, - ) - - -def no_binary(): - # type: () -> Option - format_control = FormatControl(set(), set()) - return Option( - "--no-binary", dest="format_control", action="callback", - callback=_handle_no_binary, type="str", - default=format_control, - help="Do not use binary packages. Can be supplied multiple times, and " - "each time adds to the existing value. Accepts either :all: to " - "disable all binary packages, :none: to empty the set, or one or " - "more package names with commas between them. Note that some " - "packages are tricky to compile and may fail to install when " - "this option is used on them.", - ) - - -def only_binary(): - # type: () -> Option - format_control = FormatControl(set(), set()) - return Option( - "--only-binary", dest="format_control", action="callback", - callback=_handle_only_binary, type="str", - default=format_control, - help="Do not use source packages. Can be supplied multiple times, and " - "each time adds to the existing value. Accepts either :all: to " - "disable all source packages, :none: to empty the set, or one or " - "more package names with commas between them. Packages without " - "binary distributions will fail to install when this option is " - "used on them.", - ) - - -platform = partial( - Option, - '--platform', - dest='platform', - metavar='platform', - default=None, - help=("Only use wheels compatible with . " - "Defaults to the platform of the running system."), -) # type: Callable[..., Option] - - -python_version = partial( - Option, - '--python-version', - dest='python_version', - metavar='python_version', - default=None, - help=("Only use wheels compatible with Python " - "interpreter version . If not specified, then the " - "current system interpreter minor version is used. A major " - "version (e.g. '2') can be specified to match all " - "minor revs of that major version. A minor version " - "(e.g. '34') can also be specified."), -) # type: Callable[..., Option] - - -implementation = partial( - Option, - '--implementation', - dest='implementation', - metavar='implementation', - default=None, - help=("Only use wheels compatible with Python " - "implementation , e.g. 'pp', 'jy', 'cp', " - " or 'ip'. If not specified, then the current " - "interpreter implementation is used. Use 'py' to force " - "implementation-agnostic wheels."), -) # type: Callable[..., Option] - - -abi = partial( - Option, - '--abi', - dest='abi', - metavar='abi', - default=None, - help=("Only use wheels compatible with Python " - "abi , e.g. 'pypy_41'. If not specified, then the " - "current interpreter abi tag is used. Generally " - "you will need to specify --implementation, " - "--platform, and --python-version when using " - "this option."), -) # type: Callable[..., Option] - - -def prefer_binary(): - # type: () -> Option - return Option( - "--prefer-binary", - dest="prefer_binary", - action="store_true", - default=False, - help="Prefer older binary packages over newer source packages." - ) - - -cache_dir = partial( - Option, - "--cache-dir", - dest="cache_dir", - default=USER_CACHE_DIR, - metavar="dir", - help="Store the cache data in ." -) # type: Callable[..., Option] - - -def no_cache_dir_callback(option, opt, value, parser): - """ - Process a value provided for the --no-cache-dir option. - - This is an optparse.Option callback for the --no-cache-dir option. - """ - # The value argument will be None if --no-cache-dir is passed via the - # command-line, since the option doesn't accept arguments. However, - # the value can be non-None if the option is triggered e.g. by an - # environment variable, like PIP_NO_CACHE_DIR=true. - if value is not None: - # Then parse the string value to get argument error-checking. - try: - strtobool(value) - except ValueError as exc: - raise_option_error(parser, option=option, msg=str(exc)) - - # Originally, setting PIP_NO_CACHE_DIR to a value that strtobool() - # converted to 0 (like "false" or "no") caused cache_dir to be disabled - # rather than enabled (logic would say the latter). Thus, we disable - # the cache directory not just on values that parse to True, but (for - # backwards compatibility reasons) also on values that parse to False. - # In other words, always set it to False if the option is provided in - # some (valid) form. - parser.values.cache_dir = False - - -no_cache = partial( - Option, - "--no-cache-dir", - dest="cache_dir", - action="callback", - callback=no_cache_dir_callback, - help="Disable the cache.", -) # type: Callable[..., Option] - -no_deps = partial( - Option, - '--no-deps', '--no-dependencies', - dest='ignore_dependencies', - action='store_true', - default=False, - help="Don't install package dependencies.", -) # type: Callable[..., Option] - -build_dir = partial( - Option, - '-b', '--build', '--build-dir', '--build-directory', - dest='build_dir', - metavar='dir', - help='Directory to unpack packages into and build in. Note that ' - 'an initial build still takes place in a temporary directory. ' - 'The location of temporary directories can be controlled by setting ' - 'the TMPDIR environment variable (TEMP on Windows) appropriately. ' - 'When passed, build directories are not cleaned in case of failures.' -) # type: Callable[..., Option] - -ignore_requires_python = partial( - Option, - '--ignore-requires-python', - dest='ignore_requires_python', - action='store_true', - help='Ignore the Requires-Python information.' -) # type: Callable[..., Option] - -no_build_isolation = partial( - Option, - '--no-build-isolation', - dest='build_isolation', - action='store_false', - default=True, - help='Disable isolation when building a modern source distribution. ' - 'Build dependencies specified by PEP 518 must be already installed ' - 'if this option is used.' -) # type: Callable[..., Option] - - -def no_use_pep517_callback(option, opt, value, parser): - """ - Process a value provided for the --no-use-pep517 option. - - This is an optparse.Option callback for the no_use_pep517 option. - """ - # Since --no-use-pep517 doesn't accept arguments, the value argument - # will be None if --no-use-pep517 is passed via the command-line. - # However, the value can be non-None if the option is triggered e.g. - # by an environment variable, for example "PIP_NO_USE_PEP517=true". - if value is not None: - msg = """A value was passed for --no-use-pep517, - probably using either the PIP_NO_USE_PEP517 environment variable - or the "no-use-pep517" config file option. Use an appropriate value - of the PIP_USE_PEP517 environment variable or the "use-pep517" - config file option instead. - """ - raise_option_error(parser, option=option, msg=msg) - - # Otherwise, --no-use-pep517 was passed via the command-line. - parser.values.use_pep517 = False - - -use_pep517 = partial( - Option, - '--use-pep517', - dest='use_pep517', - action='store_true', - default=None, - help='Use PEP 517 for building source distributions ' - '(use --no-use-pep517 to force legacy behaviour).' -) # type: Any - -no_use_pep517 = partial( - Option, - '--no-use-pep517', - dest='use_pep517', - action='callback', - callback=no_use_pep517_callback, - default=None, - help=SUPPRESS_HELP -) # type: Any - -install_options = partial( - Option, - '--install-option', - dest='install_options', - action='append', - metavar='options', - help="Extra arguments to be supplied to the setup.py install " - "command (use like --install-option=\"--install-scripts=/usr/local/" - "bin\"). Use multiple --install-option options to pass multiple " - "options to setup.py install. If you are using an option with a " - "directory path, be sure to use absolute path.", -) # type: Callable[..., Option] - -global_options = partial( - Option, - '--global-option', - dest='global_options', - action='append', - metavar='options', - help="Extra global options to be supplied to the setup.py " - "call before the install command.", -) # type: Callable[..., Option] - -no_clean = partial( - Option, - '--no-clean', - action='store_true', - default=False, - help="Don't clean up build directories." -) # type: Callable[..., Option] - -pre = partial( - Option, - '--pre', - action='store_true', - default=False, - help="Include pre-release and development versions. By default, " - "pip only finds stable versions.", -) # type: Callable[..., Option] - -disable_pip_version_check = partial( - Option, - "--disable-pip-version-check", - dest="disable_pip_version_check", - action="store_true", - default=False, - help="Don't periodically check PyPI to determine whether a new version " - "of pip is available for download. Implied with --no-index.", -) # type: Callable[..., Option] - - -# Deprecated, Remove later -always_unzip = partial( - Option, - '-Z', '--always-unzip', - dest='always_unzip', - action='store_true', - help=SUPPRESS_HELP, -) # type: Callable[..., Option] - - -def _merge_hash(option, opt_str, value, parser): - # type: (Option, str, str, OptionParser) -> None - """Given a value spelled "algo:digest", append the digest to a list - pointed to in a dict by the algo name.""" - if not parser.values.hashes: - parser.values.hashes = {} - try: - algo, digest = value.split(':', 1) - except ValueError: - parser.error('Arguments to %s must be a hash name ' - 'followed by a value, like --hash=sha256:abcde...' % - opt_str) - if algo not in STRONG_HASHES: - parser.error('Allowed hash algorithms for %s are %s.' % - (opt_str, ', '.join(STRONG_HASHES))) - parser.values.hashes.setdefault(algo, []).append(digest) - - -hash = partial( - Option, - '--hash', - # Hash values eventually end up in InstallRequirement.hashes due to - # __dict__ copying in process_line(). - dest='hashes', - action='callback', - callback=_merge_hash, - type='string', - help="Verify that the package's archive matches this " - 'hash before installing. Example: --hash=sha256:abcdef...', -) # type: Callable[..., Option] - - -require_hashes = partial( - Option, - '--require-hashes', - dest='require_hashes', - action='store_true', - default=False, - help='Require a hash to check each requirement against, for ' - 'repeatable installs. This option is implied when any package in a ' - 'requirements file has a --hash option.', -) # type: Callable[..., Option] - - -########## -# groups # -########## - -general_group = { - 'name': 'General Options', - 'options': [ - help_, - isolated_mode, - require_virtualenv, - verbose, - version, - quiet, - log, - no_input, - proxy, - retries, - timeout, - skip_requirements_regex, - exists_action, - trusted_host, - cert, - client_cert, - cache_dir, - no_cache, - disable_pip_version_check, - no_color, - ] -} # type: Dict[str, Any] - -index_group = { - 'name': 'Package Index Options', - 'options': [ - index_url, - extra_index_url, - no_index, - find_links, - ] -} # type: Dict[str, Any] diff --git a/env/lib/python3.7/site-packages/pip/_internal/cli/main_parser.py b/env/lib/python3.7/site-packages/pip/_internal/cli/main_parser.py deleted file mode 100644 index 767f35d..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/cli/main_parser.py +++ /dev/null @@ -1,104 +0,0 @@ -"""A single place for constructing and exposing the main parser -""" - -import os -import sys - -from pip import __version__ -from pip._internal.cli import cmdoptions -from pip._internal.cli.parser import ( - ConfigOptionParser, UpdatingDefaultsHelpFormatter, -) -from pip._internal.commands import ( - commands_dict, get_similar_commands, get_summaries, -) -from pip._internal.exceptions import CommandError -from pip._internal.utils.misc import get_prog -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Tuple, List - - -__all__ = ["create_main_parser", "parse_command"] - - -def create_main_parser(): - # type: () -> ConfigOptionParser - """Creates and returns the main parser for pip's CLI - """ - - parser_kw = { - 'usage': '\n%prog [options]', - 'add_help_option': False, - 'formatter': UpdatingDefaultsHelpFormatter(), - 'name': 'global', - 'prog': get_prog(), - } - - parser = ConfigOptionParser(**parser_kw) - parser.disable_interspersed_args() - - pip_pkg_dir = os.path.abspath(os.path.join( - os.path.dirname(__file__), "..", "..", - )) - parser.version = 'pip %s from %s (python %s)' % ( - __version__, pip_pkg_dir, sys.version[:3], - ) - - # add the general options - gen_opts = cmdoptions.make_option_group(cmdoptions.general_group, parser) - parser.add_option_group(gen_opts) - - # so the help formatter knows - parser.main = True # type: ignore - - # create command listing for description - command_summaries = get_summaries() - description = [''] + ['%-27s %s' % (i, j) for i, j in command_summaries] - parser.description = '\n'.join(description) - - return parser - - -def parse_command(args): - # type: (List[str]) -> Tuple[str, List[str]] - parser = create_main_parser() - - # Note: parser calls disable_interspersed_args(), so the result of this - # call is to split the initial args into the general options before the - # subcommand and everything else. - # For example: - # args: ['--timeout=5', 'install', '--user', 'INITools'] - # general_options: ['--timeout==5'] - # args_else: ['install', '--user', 'INITools'] - general_options, args_else = parser.parse_args(args) - - # --version - if general_options.version: - sys.stdout.write(parser.version) # type: ignore - sys.stdout.write(os.linesep) - sys.exit() - - # pip || pip help -> print_help() - if not args_else or (args_else[0] == 'help' and len(args_else) == 1): - parser.print_help() - sys.exit() - - # the subcommand name - cmd_name = args_else[0] - - if cmd_name not in commands_dict: - guess = get_similar_commands(cmd_name) - - msg = ['unknown command "%s"' % cmd_name] - if guess: - msg.append('maybe you meant "%s"' % guess) - - raise CommandError(' - '.join(msg)) - - # all the args without the subcommand - cmd_args = args[:] - cmd_args.remove(cmd_name) - - return cmd_name, cmd_args diff --git a/env/lib/python3.7/site-packages/pip/_internal/cli/parser.py b/env/lib/python3.7/site-packages/pip/_internal/cli/parser.py deleted file mode 100644 index e1eaac4..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/cli/parser.py +++ /dev/null @@ -1,261 +0,0 @@ -"""Base option parser setup""" -from __future__ import absolute_import - -import logging -import optparse -import sys -import textwrap -from distutils.util import strtobool - -from pip._vendor.six import string_types - -from pip._internal.cli.status_codes import UNKNOWN_ERROR -from pip._internal.configuration import Configuration, ConfigurationError -from pip._internal.utils.compat import get_terminal_size - -logger = logging.getLogger(__name__) - - -class PrettyHelpFormatter(optparse.IndentedHelpFormatter): - """A prettier/less verbose help formatter for optparse.""" - - def __init__(self, *args, **kwargs): - # help position must be aligned with __init__.parseopts.description - kwargs['max_help_position'] = 30 - kwargs['indent_increment'] = 1 - kwargs['width'] = get_terminal_size()[0] - 2 - optparse.IndentedHelpFormatter.__init__(self, *args, **kwargs) - - def format_option_strings(self, option): - return self._format_option_strings(option, ' <%s>', ', ') - - def _format_option_strings(self, option, mvarfmt=' <%s>', optsep=', '): - """ - Return a comma-separated list of option strings and metavars. - - :param option: tuple of (short opt, long opt), e.g: ('-f', '--format') - :param mvarfmt: metavar format string - evaluated as mvarfmt % metavar - :param optsep: separator - """ - opts = [] - - if option._short_opts: - opts.append(option._short_opts[0]) - if option._long_opts: - opts.append(option._long_opts[0]) - if len(opts) > 1: - opts.insert(1, optsep) - - if option.takes_value(): - metavar = option.metavar or option.dest.lower() - opts.append(mvarfmt % metavar.lower()) - - return ''.join(opts) - - def format_heading(self, heading): - if heading == 'Options': - return '' - return heading + ':\n' - - def format_usage(self, usage): - """ - Ensure there is only one newline between usage and the first heading - if there is no description. - """ - msg = '\nUsage: %s\n' % self.indent_lines(textwrap.dedent(usage), " ") - return msg - - def format_description(self, description): - # leave full control over description to us - if description: - if hasattr(self.parser, 'main'): - label = 'Commands' - else: - label = 'Description' - # some doc strings have initial newlines, some don't - description = description.lstrip('\n') - # some doc strings have final newlines and spaces, some don't - description = description.rstrip() - # dedent, then reindent - description = self.indent_lines(textwrap.dedent(description), " ") - description = '%s:\n%s\n' % (label, description) - return description - else: - return '' - - def format_epilog(self, epilog): - # leave full control over epilog to us - if epilog: - return epilog - else: - return '' - - def indent_lines(self, text, indent): - new_lines = [indent + line for line in text.split('\n')] - return "\n".join(new_lines) - - -class UpdatingDefaultsHelpFormatter(PrettyHelpFormatter): - """Custom help formatter for use in ConfigOptionParser. - - This is updates the defaults before expanding them, allowing - them to show up correctly in the help listing. - """ - - def expand_default(self, option): - if self.parser is not None: - self.parser._update_defaults(self.parser.defaults) - return optparse.IndentedHelpFormatter.expand_default(self, option) - - -class CustomOptionParser(optparse.OptionParser): - - def insert_option_group(self, idx, *args, **kwargs): - """Insert an OptionGroup at a given position.""" - group = self.add_option_group(*args, **kwargs) - - self.option_groups.pop() - self.option_groups.insert(idx, group) - - return group - - @property - def option_list_all(self): - """Get a list of all options, including those in option groups.""" - res = self.option_list[:] - for i in self.option_groups: - res.extend(i.option_list) - - return res - - -class ConfigOptionParser(CustomOptionParser): - """Custom option parser which updates its defaults by checking the - configuration files and environmental variables""" - - def __init__(self, *args, **kwargs): - self.name = kwargs.pop('name') - - isolated = kwargs.pop("isolated", False) - self.config = Configuration(isolated) - - assert self.name - optparse.OptionParser.__init__(self, *args, **kwargs) - - def check_default(self, option, key, val): - try: - return option.check_value(key, val) - except optparse.OptionValueError as exc: - print("An error occurred during configuration: %s" % exc) - sys.exit(3) - - def _get_ordered_configuration_items(self): - # Configuration gives keys in an unordered manner. Order them. - override_order = ["global", self.name, ":env:"] - - # Pool the options into different groups - section_items = {name: [] for name in override_order} - for section_key, val in self.config.items(): - # ignore empty values - if not val: - logger.debug( - "Ignoring configuration key '%s' as it's value is empty.", - section_key - ) - continue - - section, key = section_key.split(".", 1) - if section in override_order: - section_items[section].append((key, val)) - - # Yield each group in their override order - for section in override_order: - for key, val in section_items[section]: - yield key, val - - def _update_defaults(self, defaults): - """Updates the given defaults with values from the config files and - the environ. Does a little special handling for certain types of - options (lists).""" - - # Accumulate complex default state. - self.values = optparse.Values(self.defaults) - late_eval = set() - # Then set the options with those values - for key, val in self._get_ordered_configuration_items(): - # '--' because configuration supports only long names - option = self.get_option('--' + key) - - # Ignore options not present in this parser. E.g. non-globals put - # in [global] by users that want them to apply to all applicable - # commands. - if option is None: - continue - - if option.action in ('store_true', 'store_false', 'count'): - try: - val = strtobool(val) - except ValueError: - error_msg = invalid_config_error_message( - option.action, key, val - ) - self.error(error_msg) - - elif option.action == 'append': - val = val.split() - val = [self.check_default(option, key, v) for v in val] - elif option.action == 'callback': - late_eval.add(option.dest) - opt_str = option.get_opt_string() - val = option.convert_value(opt_str, val) - # From take_action - args = option.callback_args or () - kwargs = option.callback_kwargs or {} - option.callback(option, opt_str, val, self, *args, **kwargs) - else: - val = self.check_default(option, key, val) - - defaults[option.dest] = val - - for key in late_eval: - defaults[key] = getattr(self.values, key) - self.values = None - return defaults - - def get_default_values(self): - """Overriding to make updating the defaults after instantiation of - the option parser possible, _update_defaults() does the dirty work.""" - if not self.process_default_values: - # Old, pre-Optik 1.5 behaviour. - return optparse.Values(self.defaults) - - # Load the configuration, or error out in case of an error - try: - self.config.load() - except ConfigurationError as err: - self.exit(UNKNOWN_ERROR, str(err)) - - defaults = self._update_defaults(self.defaults.copy()) # ours - for option in self._get_all_options(): - default = defaults.get(option.dest) - if isinstance(default, string_types): - opt_str = option.get_opt_string() - defaults[option.dest] = option.check_value(opt_str, default) - return optparse.Values(defaults) - - def error(self, msg): - self.print_usage(sys.stderr) - self.exit(UNKNOWN_ERROR, "%s\n" % msg) - - -def invalid_config_error_message(action, key, val): - """Returns a better error message when invalid configuration option - is provided.""" - if action in ('store_true', 'store_false'): - return ("{0} is not a valid value for {1} option, " - "please specify a boolean value like yes/no, " - "true/false or 1/0 instead.").format(val, key) - - return ("{0} is not a valid value for {1} option, " - "please specify a numerical value like 1/0 " - "instead.").format(val, key) diff --git a/env/lib/python3.7/site-packages/pip/_internal/cli/status_codes.py b/env/lib/python3.7/site-packages/pip/_internal/cli/status_codes.py deleted file mode 100644 index 275360a..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/cli/status_codes.py +++ /dev/null @@ -1,8 +0,0 @@ -from __future__ import absolute_import - -SUCCESS = 0 -ERROR = 1 -UNKNOWN_ERROR = 2 -VIRTUALENV_NOT_FOUND = 3 -PREVIOUS_BUILD_DIR_ERROR = 4 -NO_MATCHES_FOUND = 23 diff --git a/env/lib/python3.7/site-packages/pip/_internal/commands/__init__.py b/env/lib/python3.7/site-packages/pip/_internal/commands/__init__.py deleted file mode 100644 index 2e90db3..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/commands/__init__.py +++ /dev/null @@ -1,79 +0,0 @@ -""" -Package containing all pip commands -""" -from __future__ import absolute_import - -from pip._internal.commands.completion import CompletionCommand -from pip._internal.commands.configuration import ConfigurationCommand -from pip._internal.commands.download import DownloadCommand -from pip._internal.commands.freeze import FreezeCommand -from pip._internal.commands.hash import HashCommand -from pip._internal.commands.help import HelpCommand -from pip._internal.commands.list import ListCommand -from pip._internal.commands.check import CheckCommand -from pip._internal.commands.search import SearchCommand -from pip._internal.commands.show import ShowCommand -from pip._internal.commands.install import InstallCommand -from pip._internal.commands.uninstall import UninstallCommand -from pip._internal.commands.wheel import WheelCommand - -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import List, Type - from pip._internal.cli.base_command import Command - -commands_order = [ - InstallCommand, - DownloadCommand, - UninstallCommand, - FreezeCommand, - ListCommand, - ShowCommand, - CheckCommand, - ConfigurationCommand, - SearchCommand, - WheelCommand, - HashCommand, - CompletionCommand, - HelpCommand, -] # type: List[Type[Command]] - -commands_dict = {c.name: c for c in commands_order} - - -def get_summaries(ordered=True): - """Yields sorted (command name, command summary) tuples.""" - - if ordered: - cmditems = _sort_commands(commands_dict, commands_order) - else: - cmditems = commands_dict.items() - - for name, command_class in cmditems: - yield (name, command_class.summary) - - -def get_similar_commands(name): - """Command name auto-correct.""" - from difflib import get_close_matches - - name = name.lower() - - close_commands = get_close_matches(name, commands_dict.keys()) - - if close_commands: - return close_commands[0] - else: - return False - - -def _sort_commands(cmddict, order): - def keyfn(key): - try: - return order.index(key[1]) - except ValueError: - # unordered items should come last - return 0xff - - return sorted(cmddict.items(), key=keyfn) diff --git a/env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 6b2425ee78ee221aeb0fd1fc8d071549a3180954..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2457 zcmaJ@OK;mo5Z)!JM`VeX9mTO_*->6?RMc{NXn__%5L9`htq|0CG(-b};jS#kyQH$D z;K-0pG0L0MtQ&0Un1+P8jFXYnBto3k$C?s|{GdsIG^X<$mzblmr1fKBE)n|X_ z3HcY9$x{O2CbakxC4>=&Fv<);rQsM9X;YZeax6_-A|ta-R?``glX)kv>8v;-3r<1P zIk6y%PEpf&QIfV}Yx;~>lx3%^>4I32%g(Z<7sOdvaVnZFigR+sSJ`Ior`*WSzMBroy#!3%JaO+3%tx% z_%hG(3a{}Zx46Aqa;~tmta3>Bm0RRBb*{1vw!+RIQs)!4%GM5v^C_#cb@*OmwH?yf zJh)nT;Q4#rF0cDhn0P@Lgu8W5hIQdiqW`+MkWv_ro{=_hypvBXIdWS@B7i^HVy@KR$i%)NS3n-TL1B z=~26VzkRo1q!yZzS`P<34ld`$OZpIb`Z1ulptYdI73cyoB+rT?I)wKH`NMc=?U26^ zRV(x)hXsx17b*1>>gw+8&Fw_?w&5hU#wKpDmxJ)tmz^#Ob#sF-;VSgRwm&|sZ5L!g z;=0Y=;BDbL3;YCzdN)2pJJ6^sQETvdIJFe5G@<#>;%}iF5>-w}LKEY)F`{8Up-1L1 z8PQj@A-zSORemu>#>gBRL-U2zF&-02UT!{t{DO!w4!(LCaKYkw4DrEP{o2^BIy(9J zB&6zbA7Vuf8ug?P(Gxe@jZA90ILDnhl9ncvi%z8Wl#LYQD$N85mvNe#EM=uRJ-}I- z_a)P#>KwQ;UC8x?7soSz)v6xd<%xT;NWkMQ1VL9A)1pNqZ`f2_0@)NTL~44jUjw6S z43Tt1DIj-b08#|bm?Y+rbxZ(3V`!-6&|q|p>=0%`gOhJ$4yvt_Bh%2-y?zpH`H@oG zPnrs&2(t@q^F`0^Cwnp}Pw$#%Lk5nA4JW zgFb9D(wytE$amee;JTfD(pTJd6=IuSgw$?M)4Dl1HzdY&Rw3r;mAQJSO0UAb(+hJ{ z*|-|33~Fu6(dy^|t+J@IK1ZhuHCyFAssUwOA@pKn{zfAms^GZ6DeMWA3Bi!D&p)v0kCM97EJ?E=0k7Rw9P^>Z~qTXJD1)7 diff --git a/env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/check.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/check.cpython-37.pyc deleted file mode 100644 index 04957727bb28285fb26a929c867df7812466bc5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1282 zcmZ8h&2HO95Z)!1Kcb`}Eds{|+JG&RgMykyfdB!DBna#Ry#&4lr~x(xL2*|SWBzHE zOf7*tInR)DjO38KKptkVJ>?a0>I^NrY8RT(x1*ieZ+=#Xc&Y~(#&f>XG&l`SZiI}Rp#|8!q7ypY1|p6g9pSAT7VAfU2${}S{!M&;Lr3|G z__gqpGOyw~oo2%4q7nrcMUn~?Xsai`-tqi?-LGUh_x~)bIxP!znwUTc*BAuLd<3FC zgR02|d1-WJ$7o;=xuyb0ob@s?BqjS&iwH9Kq?{}Fs7~u(N zE%l+bL74o=*$dL2wJs^P8XI`LesEv;@R4HKq*5UM+5c;iCJR4Reo@x{)-aG1GF|Uq zIV|EEr(6_u?>B8~e^oYDHSUiEUwWS(j!S(&Xpc+jafLZVsI_y5p->;w3DX_w|bbA#Vkvc z8aE^O@s&vGsEBhRUA)q}nSqsd0rx-YA);$CCe-H>kvnkw>yv{zuMVoT+TV=VK3}ei z^Iv8QH1-06T?<*n*#S%%z6*8G4^~jEv?-h7JBXux0!64tM}`Ob8_K9bcTB{$H+V#u zvA(rE*#S5oPh9OrJ;^B2UKHgeZ!!UR6h+G>&M-6BIZ?#R1OP*Wwi*TRQ9G&uMsg*0 z;r2eEEp-QN@UKCJAPOhk1uD!y>FpCwJJ=Vj!&zh3ft%!BYKN@=0B|B BV;2Ab diff --git a/env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/completion.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/completion.cpython-37.pyc deleted file mode 100644 index b3bf8acafd2d49a6c1f5771f8038bffe9ec8c997..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3031 zcmai0&2Jnv6u0MVH=9jM3xrZWWI`(KAkCHt!~r!GZ5mMdXriQuc1tvxuD!{mvojOh z+ceAOluDdH;@(3lPW(&0a^hd$#CzV|Y|%Erz# zA%A0Me0d;z1&?|F4JVvtq)S_rqU>Z&%du~_<-*&|ysqE!?URE!nk(+7ek7D%LK#WhQi59 z3|`}juSR$@^2?EgQcmD(9?%6QLom6d& zX(kZWW0)|e1e{Rz>=>(915OdMAWL&R$dJv=oo`~<#2RPpxSQxL^p)!*%@vDM7Dcc4 z)*&16(9$^s>`u~mLNO%pIMh=pvW1iJX_@AmOqE%x+0V=_E1m*jj;-}*VPoPPQ*)dt z69#t@HrI$x!xzr6sC|;cp=-RyiP|!59~uu4Z)2GmU+zdypMxMsi*f?xj6x}MS{`>> zKKEL|ucSk{&x7aHRt1aLbJD8*N<7k{>4H5L ztfvHLonoRMZ3+rj)6^!Ness#g>rC&rfnoN-QeB1TB0MUCMiWg326W*3PAM6X zZFk=txZ575+~F?waBsZwTL5FIg(3~w8fd4FY3qCjv==~oaik^N{$ar17`QJTEcbxL zrF;D#iV*L<6FoN5N*7W9!*ivj55XAU7V7>7%UvMAWV;}8VR1p*&@(||OO5fZt?{@} z+IR?Q-;W|VO7P#80l4hHf37c_2I1hD!}N}<;PmsC#(5HP3@Z?44-QWvlBOERX`bph zHq~~Q$3>}?sU_S>aBe0j6RCtWZ$d5!sc{0R<4sxgO4y30MAk80A~%(Bp6trYxB@j( zaoo-lrQ-N6^6%~Ix?5g{0uX@@on%?WclPpU3!N=g+6Q9LLgqJw-Pz3c>zM?LD;y9&~oveUo1bmRskBiz%K1Cr8N@{;cRx~iuJz8&*lIJ00& zNj|G<+tY`2WaHt?zgus)trgZ;4afDLPiYnLZWp>Bql;qm*zUUQCO1 z4E`->HX#Kz>idxD1Nsj6!`bn`Jq3zH@+u66j&YiwO85yPwm)p%gYLhz8(FF};(pV5 zL)QW6ho>Qwy}WtDehk%35XM%97|(uS9TN=yOzb-SE6ZzZD{Eh}heeNddrGqssKKtO zTHj+(E$)RE%;nKn{_e`XcztQ@?&|$@<2@033OvD2lHk^pscP{|@5-b!0T*24+PLt) zBoP4Pmk6M_c>C7+^7y9#+!>Pz326WAGm#5xm~?s46_9kbIPMm_m!Vvb zH&S_9wg#sj&(!3|9iCJZ?oSf9tX{MUp6i9(bB^%g$gbmi9NstpVn(B=qE;q4eS%B*RaMh{Py5~(h Ia96$m0PFE1O8@`> diff --git a/env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-37.pyc deleted file mode 100644 index e23fb7a1518689be9a7a0e6352f26c69a900cc36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6859 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 diff --git a/env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/download.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/download.cpython-37.pyc deleted file mode 100644 index b7c92f17427c4199de7d1c81dd8c3075c806b602..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4670 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 diff --git a/env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/hash.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/hash.cpython-37.pyc deleted file mode 100644 index da9ccad10d0f402120bb9775db6dbb6ca1328317..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2021 zcmZuyTW=gS6t+Fry(OWoq7ZJ=OMsQS8v!q<%7nKdcuIcEGSD zc*JNtuJS_}o43!0wNT{epl}poh9FW5Q4)yI3LR#LE^|Wf1sY=JGVeLW$b8lSUmGuw zjlw4Q+tjVCNRAhdOz9&Tswhq6 z;$dx@7bfc)r6@+hPerMcBA0u?ZS%sNpx^ILuAe(=EV(q!{>Mq#-;MDCECX5#<}ytA zEeM4ao}yE7K&E&~UP97L(SdbfGt3CH6o9AzMCQ&s<(%PFp#B%Hw((~T<{R5HViEhEMXC1Vj8VW%>Sn}h4PFpX zK}a~p(mp7XT)Sl?Bp3QJ;Ln9J7r=~;L{XJpOWTsCLv2T5BsDpF3R&5pG)^NaDg6We zeS1@74vZpQNxkei0Det9e|fgA6_lvh9?dY{*;9c@BR8>W1t##45b6Tcv<-XeFT% zv?Y&$8L1dxFH9#Arcr4(Ek+|i)K2nYp*z$>ON${jiQ9F=nz8W~`7GYPxMr7;8Vdu* zT)b!OEK%hjgCdteAV6mc+r-69Kx(r5IyPX}Z5i_ODC0nWlhUkURciD$rAJkiE>1j3 zSrNmwZ8o$skHwP}^e1r)c`(W$S?Qu`=@XtmsfiLF8izUy_G6x=l)iGei^V%|E{xZ8 zBGzSQy!JgC{H}kb-LB7K0{dqCk3a=A$nYuo_2vmtcm|buhJm_uWlhN`2KtsxfUuc8 zwGFvP!D9rZk?+v}{fJ=SIWyI0O|A~Osze^B^MYf^2;Es( z2HKYJ8Wv{1d)ZJltiVm6NEkrGry#UvvM0$$;sdjKAF8N-Q9=DUP5S$hG5i3JHeSJP(zI4?`~%k{8)N_g diff --git a/env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/help.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/help.cpython-37.pyc deleted file mode 100644 index 9ea058aa2ce9542972bdb5fc87f03c4cd7fc6a58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1197 zcmZvbPfy!06u|BLCo6xXRRyGJija`j1MPN42+^Uj3zu%%6lt?U?Uq2|1Ums*rI(ct z0@`U`$=99s6?WQl+D>f3(R+D*wqJhlJ?Ch3)kiS+_pL8S7D7MuWI14t4ngEwP!v&| zpcID~YuiYS)C|qqHWMqgL%X)E#7W)I#poTPHg)b0b(lFbLyx+B)b@TsB-F-gJvx(F zQWlKFX`YD!Ty8H*(}+`T_CNM|$NfH-jfMAEh)fLh>E$rMI0TWeKrs|zib8|p(4X)Xi3C|LO`0XY$nWE$y z5JtWLh46-97!ACJ9mB((;bRN08Ef$Njmi269O=!kQwL6+LINJC`3O-yA!$a-gn`{4 zsx5zho8f?bs{yssI*7Tds5XZJ{LX`cg1 zS6()>0eF@H0=iz&NB}Y{ixMIcp?@g#^1lWqapx?OY1{(Ufmp_p_R8kFU^6zs#4=Opvdr;e*mnALQntz diff --git a/env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/install.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/install.cpython-37.pyc deleted file mode 100644 index 847ddb330b5cf12ed31c530dbc0b5bce4f607acb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12844 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 K3jNhH$^QX6Ql5hV diff --git a/env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/list.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/list.cpython-37.pyc deleted file mode 100644 index f01f7b9238b021d4f20aa7129c087566f6ad6476..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8688 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 diff --git a/env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/search.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/search.cpython-37.pyc deleted file mode 100644 index aa68e4574e177eb106c52be3560d456c67f78c23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4263 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 diff --git a/env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-37.pyc deleted file mode 100644 index 4b0b0028b32111060fdbe42e68b5c8389db2c3d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2653 zcmZuzOK%)S5bk;G%+ae7}`y}%nyA-chVs1hFwE@X)jv| zR}Af^{cI2pEb;+i0qZ^>tjjz1op6=)?vmlkUvL^3TFtq5OBHFQc_gy3kQ!L$lQ=JO zk;JK(@hFco4ov@6k!5ktQ2tS_beyKK7DfKPl!XN5g))|kN0RSVLh_8~S^@VNF;_)? zG?7IXr6NajS4&xFp6I9)zOibWVG#bJGfyh~Lpc3?R@i{G_-Ufn`&|)OCnH4(B z4qfJi9p;AKLo%^ghj|Zz&}Tji9*{72NL&(j;ojZmsW0=^srE+kdln%*3g1#f%Q)GM zx49bki~yXZLeY3Dc|kL- zV;1WeePvv8nL*HDN37{Yq+HPh4h}5c9vd?wdN+}x)bv2cWyz&FRiIl(|Kkkf`#dem z&CU7#rn?Nw?90}%mm$mB^xI+{gM0Kw8`qn3Jf82O^huqOq&Lo@$hd4a%r5>)nv!nahb(z<}i1gAWE2j0(I0%piWqit*|~D zoIs@kxAVwjt0;YJV^sly&fS^WBRLz4MrXWi`ezoZ@i2lpYg`QXZ0FQ%s2ZxL{50h$ zpa6g)a>L#h`#h&-O_|$|Dg9y!_?yR(LU}^6X{BIeR;5~$2uqOxT!)>;Wn5|SAVJ(U zKI4-ZbQ&K)u^-FEo$|DVD;&)_qtOvpje}E9=|b{I%Zksg-7fN1HI3CSofMKLMLrQS zGlfZu$rkG~%~f*iYt^n ziGA$V-i{;JYOi*+i}Zc#2H9KNAcxmMrvp3QIQ9=;(_ZZZuA%dtIKaEq?)&bEecx@6 zy$?4??W&)(&m0{fmYI8Et&#iI_m=LmPVMe`%sYYlIJ{Q7k9v=Z@e2J|ffM_%W5E1f zmj&QmPzUn2I(W4Dm{?@*w+*rZRq+}5oP0g6j_w`EOCaD$i2>I`yYbuNZ+yj-f_%kADh?9SIz6A=vBozy@G8R(Yxed8Nz8U>NE}rVKFez z$dSmm@nxB#&~Ey1rHiNqa^vrFxm74WJlCv7Ta`#z)cPiU$Wt>|xF3NrE?)wk#H>nq zx{35~>c9k*CK4?JB)$DOt+CO)k`l#^`Z9)&b@;MY=!3hy2Uqr?8aAy^P zdrK&q6B`HkO@Ix=-0%ES9F?)2!jm9hKpSSFXvmROz7B-C1{1ORfZZNow{LrZWLzPV z`+(`SmVU~CwX+JV3$|;`p8gM}!QilmWs4p_+4drgNR=YpkD|RQPFsl|MXX4oXzqHa zQt)^}#w+;AAm?=@-$EY;ZN(-$O+kBkgP|oagIrRauxk1+6iz|cwOj{=-M?rgcOY%x z$fVNnih>Orl$z%t+2aVBCoAN5{>T6X#^!xBxoa*PjYR_(C#e{3#qfir?F15khBcS| zt#tZ)n}mnw|1E|D88kd;8~9_unu2DUKvz|BR6SwaxHis&N(_R`)lTDaCauAZdCYHO QM^)Hm`!@VRCe5Go4>XnrIRF3v diff --git a/env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-37.pyc deleted file mode 100644 index 4d86357b8f6799e1aa562b1fb7f829bd8f598db4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4956 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 D*Il}y diff --git a/env/lib/python3.7/site-packages/pip/_internal/commands/check.py b/env/lib/python3.7/site-packages/pip/_internal/commands/check.py deleted file mode 100644 index 801cecc..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/commands/check.py +++ /dev/null @@ -1,41 +0,0 @@ -import logging - -from pip._internal.cli.base_command import Command -from pip._internal.operations.check import ( - check_package_set, create_package_set_from_installed, -) - -logger = logging.getLogger(__name__) - - -class CheckCommand(Command): - """Verify installed packages have compatible dependencies.""" - name = 'check' - usage = """ - %prog [options]""" - summary = 'Verify installed packages have compatible dependencies.' - - def run(self, options, args): - package_set, parsing_probs = create_package_set_from_installed() - missing, conflicting = check_package_set(package_set) - - for project_name in missing: - version = package_set[project_name].version - for dependency in missing[project_name]: - logger.info( - "%s %s requires %s, which is not installed.", - project_name, version, dependency[0], - ) - - for project_name in conflicting: - version = package_set[project_name].version - for dep_name, dep_version, req in conflicting[project_name]: - logger.info( - "%s %s has requirement %s, but you have %s %s.", - project_name, version, req, dep_name, dep_version, - ) - - if missing or conflicting or parsing_probs: - return 1 - else: - logger.info("No broken requirements found.") diff --git a/env/lib/python3.7/site-packages/pip/_internal/commands/completion.py b/env/lib/python3.7/site-packages/pip/_internal/commands/completion.py deleted file mode 100644 index 2fcdd39..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/commands/completion.py +++ /dev/null @@ -1,94 +0,0 @@ -from __future__ import absolute_import - -import sys -import textwrap - -from pip._internal.cli.base_command import Command -from pip._internal.utils.misc import get_prog - -BASE_COMPLETION = """ -# pip %(shell)s completion start%(script)s# pip %(shell)s completion end -""" - -COMPLETION_SCRIPTS = { - 'bash': """ - _pip_completion() - { - COMPREPLY=( $( COMP_WORDS="${COMP_WORDS[*]}" \\ - COMP_CWORD=$COMP_CWORD \\ - PIP_AUTO_COMPLETE=1 $1 ) ) - } - complete -o default -F _pip_completion %(prog)s - """, - 'zsh': """ - function _pip_completion { - local words cword - read -Ac words - read -cn cword - reply=( $( COMP_WORDS="$words[*]" \\ - COMP_CWORD=$(( cword-1 )) \\ - PIP_AUTO_COMPLETE=1 $words[1] ) ) - } - compctl -K _pip_completion %(prog)s - """, - 'fish': """ - function __fish_complete_pip - set -lx COMP_WORDS (commandline -o) "" - set -lx COMP_CWORD ( \\ - math (contains -i -- (commandline -t) $COMP_WORDS)-1 \\ - ) - set -lx PIP_AUTO_COMPLETE 1 - string split \\ -- (eval $COMP_WORDS[1]) - end - complete -fa "(__fish_complete_pip)" -c %(prog)s - """, -} - - -class CompletionCommand(Command): - """A helper command to be used for command completion.""" - name = 'completion' - summary = 'A helper command used for command completion.' - ignore_require_venv = True - - def __init__(self, *args, **kw): - super(CompletionCommand, self).__init__(*args, **kw) - - cmd_opts = self.cmd_opts - - cmd_opts.add_option( - '--bash', '-b', - action='store_const', - const='bash', - dest='shell', - help='Emit completion code for bash') - cmd_opts.add_option( - '--zsh', '-z', - action='store_const', - const='zsh', - dest='shell', - help='Emit completion code for zsh') - cmd_opts.add_option( - '--fish', '-f', - action='store_const', - const='fish', - dest='shell', - help='Emit completion code for fish') - - self.parser.insert_option_group(0, cmd_opts) - - def run(self, options, args): - """Prints the completion code of the given shell""" - shells = COMPLETION_SCRIPTS.keys() - shell_options = ['--' + shell for shell in sorted(shells)] - if options.shell in shells: - script = textwrap.dedent( - COMPLETION_SCRIPTS.get(options.shell, '') % { - 'prog': get_prog(), - } - ) - print(BASE_COMPLETION % {'script': script, 'shell': options.shell}) - else: - sys.stderr.write( - 'ERROR: You must pass %s\n' % ' or '.join(shell_options) - ) diff --git a/env/lib/python3.7/site-packages/pip/_internal/commands/configuration.py b/env/lib/python3.7/site-packages/pip/_internal/commands/configuration.py deleted file mode 100644 index 950e205..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/commands/configuration.py +++ /dev/null @@ -1,253 +0,0 @@ -import logging -import os -import subprocess - -from pip._internal.cli.base_command import Command -from pip._internal.cli.status_codes import ERROR, SUCCESS -from pip._internal.configuration import Configuration, kinds -from pip._internal.exceptions import PipError -from pip._internal.locations import running_under_virtualenv, site_config_file -from pip._internal.utils.deprecation import deprecated -from pip._internal.utils.misc import get_prog - -logger = logging.getLogger(__name__) - - -class ConfigurationCommand(Command): - """Manage local and global configuration. - - Subcommands: - - list: List the active configuration (or from the file specified) - edit: Edit the configuration file in an editor - get: Get the value associated with name - set: Set the name=value - unset: Unset the value associated with name - - If none of --user, --global and --site are passed, a virtual - environment configuration file is used if one is active and the file - exists. Otherwise, all modifications happen on the to the user file by - default. - """ - - name = 'config' - usage = """ - %prog [] list - %prog [] [--editor ] edit - - %prog [] get name - %prog [] set name value - %prog [] unset name - """ - - summary = "Manage local and global configuration." - - def __init__(self, *args, **kwargs): - super(ConfigurationCommand, self).__init__(*args, **kwargs) - - self.configuration = None - - self.cmd_opts.add_option( - '--editor', - dest='editor', - action='store', - default=None, - help=( - 'Editor to use to edit the file. Uses VISUAL or EDITOR ' - 'environment variables if not provided.' - ) - ) - - self.cmd_opts.add_option( - '--global', - dest='global_file', - action='store_true', - default=False, - help='Use the system-wide configuration file only' - ) - - self.cmd_opts.add_option( - '--user', - dest='user_file', - action='store_true', - default=False, - help='Use the user configuration file only' - ) - - self.cmd_opts.add_option( - '--site', - dest='site_file', - action='store_true', - default=False, - help='Use the current environment configuration file only' - ) - - self.cmd_opts.add_option( - '--venv', - dest='venv_file', - action='store_true', - default=False, - help=( - '[Deprecated] Use the current environment configuration ' - 'file in a virtual environment only' - ) - ) - - self.parser.insert_option_group(0, self.cmd_opts) - - def run(self, options, args): - handlers = { - "list": self.list_values, - "edit": self.open_in_editor, - "get": self.get_name, - "set": self.set_name_value, - "unset": self.unset_name - } - - # Determine action - if not args or args[0] not in handlers: - logger.error("Need an action ({}) to perform.".format( - ", ".join(sorted(handlers))) - ) - return ERROR - - action = args[0] - - # Determine which configuration files are to be loaded - # Depends on whether the command is modifying. - try: - load_only = self._determine_file( - options, need_value=(action in ["get", "set", "unset", "edit"]) - ) - except PipError as e: - logger.error(e.args[0]) - return ERROR - - # Load a new configuration - self.configuration = Configuration( - isolated=options.isolated_mode, load_only=load_only - ) - self.configuration.load() - - # Error handling happens here, not in the action-handlers. - try: - handlers[action](options, args[1:]) - except PipError as e: - logger.error(e.args[0]) - return ERROR - - return SUCCESS - - def _determine_file(self, options, need_value): - # Convert legacy venv_file option to site_file or error - if options.venv_file and not options.site_file: - if running_under_virtualenv(): - options.site_file = True - deprecated( - "The --venv option has been deprecated.", - replacement="--site", - gone_in="19.3", - ) - else: - raise PipError( - "Legacy --venv option requires a virtual environment. " - "Use --site instead." - ) - - file_options = [key for key, value in ( - (kinds.USER, options.user_file), - (kinds.GLOBAL, options.global_file), - (kinds.SITE, options.site_file), - ) if value] - - if not file_options: - if not need_value: - return None - # Default to user, unless there's a site file. - elif os.path.exists(site_config_file): - return kinds.SITE - else: - return kinds.USER - elif len(file_options) == 1: - return file_options[0] - - raise PipError( - "Need exactly one file to operate upon " - "(--user, --site, --global) to perform." - ) - - def list_values(self, options, args): - self._get_n_args(args, "list", n=0) - - for key, value in sorted(self.configuration.items()): - logger.info("%s=%r", key, value) - - def get_name(self, options, args): - key = self._get_n_args(args, "get [name]", n=1) - value = self.configuration.get_value(key) - - logger.info("%s", value) - - def set_name_value(self, options, args): - key, value = self._get_n_args(args, "set [name] [value]", n=2) - self.configuration.set_value(key, value) - - self._save_configuration() - - def unset_name(self, options, args): - key = self._get_n_args(args, "unset [name]", n=1) - self.configuration.unset_value(key) - - self._save_configuration() - - def open_in_editor(self, options, args): - editor = self._determine_editor(options) - - fname = self.configuration.get_file_to_edit() - if fname is None: - raise PipError("Could not determine appropriate file.") - - try: - subprocess.check_call([editor, fname]) - except subprocess.CalledProcessError as e: - raise PipError( - "Editor Subprocess exited with exit code {}" - .format(e.returncode) - ) - - def _get_n_args(self, args, example, n): - """Helper to make sure the command got the right number of arguments - """ - if len(args) != n: - msg = ( - 'Got unexpected number of arguments, expected {}. ' - '(example: "{} config {}")' - ).format(n, get_prog(), example) - raise PipError(msg) - - if n == 1: - return args[0] - else: - return args - - def _save_configuration(self): - # We successfully ran a modifying command. Need to save the - # configuration. - try: - self.configuration.save() - except Exception: - logger.error( - "Unable to save configuration. Please report this as a bug.", - exc_info=1 - ) - raise PipError("Internal Error.") - - def _determine_editor(self, options): - if options.editor is not None: - return options.editor - elif "VISUAL" in os.environ: - return os.environ["VISUAL"] - elif "EDITOR" in os.environ: - return os.environ["EDITOR"] - else: - raise PipError("Could not determine editor to use.") diff --git a/env/lib/python3.7/site-packages/pip/_internal/commands/download.py b/env/lib/python3.7/site-packages/pip/_internal/commands/download.py deleted file mode 100644 index a57e4bc..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/commands/download.py +++ /dev/null @@ -1,176 +0,0 @@ -from __future__ import absolute_import - -import logging -import os - -from pip._internal.cli import cmdoptions -from pip._internal.cli.base_command import RequirementCommand -from pip._internal.operations.prepare import RequirementPreparer -from pip._internal.req import RequirementSet -from pip._internal.req.req_tracker import RequirementTracker -from pip._internal.resolve import Resolver -from pip._internal.utils.filesystem import check_path_owner -from pip._internal.utils.misc import ensure_dir, normalize_path -from pip._internal.utils.temp_dir import TempDirectory - -logger = logging.getLogger(__name__) - - -class DownloadCommand(RequirementCommand): - """ - Download packages from: - - - PyPI (and other indexes) using requirement specifiers. - - VCS project urls. - - Local project directories. - - Local or remote source archives. - - pip also supports downloading from "requirements files", which provide - an easy way to specify a whole environment to be downloaded. - """ - name = 'download' - - usage = """ - %prog [options] [package-index-options] ... - %prog [options] -r [package-index-options] ... - %prog [options] ... - %prog [options] ... - %prog [options] ...""" - - summary = 'Download packages.' - - def __init__(self, *args, **kw): - super(DownloadCommand, self).__init__(*args, **kw) - - cmd_opts = self.cmd_opts - - cmd_opts.add_option(cmdoptions.constraints()) - cmd_opts.add_option(cmdoptions.requirements()) - cmd_opts.add_option(cmdoptions.build_dir()) - cmd_opts.add_option(cmdoptions.no_deps()) - cmd_opts.add_option(cmdoptions.global_options()) - cmd_opts.add_option(cmdoptions.no_binary()) - cmd_opts.add_option(cmdoptions.only_binary()) - cmd_opts.add_option(cmdoptions.prefer_binary()) - cmd_opts.add_option(cmdoptions.src()) - cmd_opts.add_option(cmdoptions.pre()) - cmd_opts.add_option(cmdoptions.no_clean()) - cmd_opts.add_option(cmdoptions.require_hashes()) - cmd_opts.add_option(cmdoptions.progress_bar()) - cmd_opts.add_option(cmdoptions.no_build_isolation()) - cmd_opts.add_option(cmdoptions.use_pep517()) - cmd_opts.add_option(cmdoptions.no_use_pep517()) - - cmd_opts.add_option( - '-d', '--dest', '--destination-dir', '--destination-directory', - dest='download_dir', - metavar='dir', - default=os.curdir, - help=("Download packages into ."), - ) - - cmd_opts.add_option(cmdoptions.platform()) - cmd_opts.add_option(cmdoptions.python_version()) - cmd_opts.add_option(cmdoptions.implementation()) - cmd_opts.add_option(cmdoptions.abi()) - - index_opts = cmdoptions.make_option_group( - cmdoptions.index_group, - self.parser, - ) - - self.parser.insert_option_group(0, index_opts) - self.parser.insert_option_group(0, cmd_opts) - - def run(self, options, args): - options.ignore_installed = True - # editable doesn't really make sense for `pip download`, but the bowels - # of the RequirementSet code require that property. - options.editables = [] - - if options.python_version: - python_versions = [options.python_version] - else: - python_versions = None - - cmdoptions.check_dist_restriction(options) - - options.src_dir = os.path.abspath(options.src_dir) - options.download_dir = normalize_path(options.download_dir) - - ensure_dir(options.download_dir) - - with self._build_session(options) as session: - finder = self._build_package_finder( - options=options, - session=session, - platform=options.platform, - python_versions=python_versions, - abi=options.abi, - implementation=options.implementation, - ) - build_delete = (not (options.no_clean or options.build_dir)) - if options.cache_dir and not check_path_owner(options.cache_dir): - logger.warning( - "The directory '%s' or its parent directory is not owned " - "by the current user and caching wheels has been " - "disabled. check the permissions and owner of that " - "directory. If executing pip with sudo, you may want " - "sudo's -H flag.", - options.cache_dir, - ) - options.cache_dir = None - - with RequirementTracker() as req_tracker, TempDirectory( - options.build_dir, delete=build_delete, kind="download" - ) as directory: - - requirement_set = RequirementSet( - require_hashes=options.require_hashes, - ) - self.populate_requirement_set( - requirement_set, - args, - options, - finder, - session, - self.name, - None - ) - - preparer = RequirementPreparer( - build_dir=directory.path, - src_dir=options.src_dir, - download_dir=options.download_dir, - wheel_download_dir=None, - progress_bar=options.progress_bar, - build_isolation=options.build_isolation, - req_tracker=req_tracker, - ) - - resolver = Resolver( - preparer=preparer, - finder=finder, - session=session, - wheel_cache=None, - use_user_site=False, - upgrade_strategy="to-satisfy-only", - force_reinstall=False, - ignore_dependencies=options.ignore_dependencies, - ignore_requires_python=False, - ignore_installed=True, - isolated=options.isolated_mode, - ) - resolver.resolve(requirement_set) - - downloaded = ' '.join([ - req.name for req in requirement_set.successfully_downloaded - ]) - if downloaded: - logger.info('Successfully downloaded %s', downloaded) - - # Clean up - if not options.no_clean: - requirement_set.cleanup_files() - - return requirement_set diff --git a/env/lib/python3.7/site-packages/pip/_internal/commands/freeze.py b/env/lib/python3.7/site-packages/pip/_internal/commands/freeze.py deleted file mode 100644 index dc9c53a..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/commands/freeze.py +++ /dev/null @@ -1,96 +0,0 @@ -from __future__ import absolute_import - -import sys - -from pip._internal.cache import WheelCache -from pip._internal.cli.base_command import Command -from pip._internal.models.format_control import FormatControl -from pip._internal.operations.freeze import freeze -from pip._internal.utils.compat import stdlib_pkgs - -DEV_PKGS = {'pip', 'setuptools', 'distribute', 'wheel'} - - -class FreezeCommand(Command): - """ - Output installed packages in requirements format. - - packages are listed in a case-insensitive sorted order. - """ - name = 'freeze' - usage = """ - %prog [options]""" - summary = 'Output installed packages in requirements format.' - log_streams = ("ext://sys.stderr", "ext://sys.stderr") - - def __init__(self, *args, **kw): - super(FreezeCommand, self).__init__(*args, **kw) - - self.cmd_opts.add_option( - '-r', '--requirement', - dest='requirements', - action='append', - default=[], - metavar='file', - help="Use the order in the given requirements file and its " - "comments when generating output. This option can be " - "used multiple times.") - self.cmd_opts.add_option( - '-f', '--find-links', - dest='find_links', - action='append', - default=[], - metavar='URL', - help='URL for finding packages, which will be added to the ' - 'output.') - self.cmd_opts.add_option( - '-l', '--local', - dest='local', - action='store_true', - default=False, - help='If in a virtualenv that has global access, do not output ' - 'globally-installed packages.') - self.cmd_opts.add_option( - '--user', - dest='user', - action='store_true', - default=False, - help='Only output packages installed in user-site.') - self.cmd_opts.add_option( - '--all', - dest='freeze_all', - action='store_true', - help='Do not skip these packages in the output:' - ' %s' % ', '.join(DEV_PKGS)) - self.cmd_opts.add_option( - '--exclude-editable', - dest='exclude_editable', - action='store_true', - help='Exclude editable package from output.') - - self.parser.insert_option_group(0, self.cmd_opts) - - def run(self, options, args): - format_control = FormatControl(set(), set()) - wheel_cache = WheelCache(options.cache_dir, format_control) - skip = set(stdlib_pkgs) - if not options.freeze_all: - skip.update(DEV_PKGS) - - freeze_kwargs = dict( - requirement=options.requirements, - find_links=options.find_links, - local_only=options.local, - user_only=options.user, - skip_regex=options.skip_requirements_regex, - isolated=options.isolated_mode, - wheel_cache=wheel_cache, - skip=skip, - exclude_editable=options.exclude_editable, - ) - - try: - for line in freeze(**freeze_kwargs): - sys.stdout.write(line + '\n') - finally: - wheel_cache.cleanup() diff --git a/env/lib/python3.7/site-packages/pip/_internal/commands/hash.py b/env/lib/python3.7/site-packages/pip/_internal/commands/hash.py deleted file mode 100644 index 423440e..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/commands/hash.py +++ /dev/null @@ -1,57 +0,0 @@ -from __future__ import absolute_import - -import hashlib -import logging -import sys - -from pip._internal.cli.base_command import Command -from pip._internal.cli.status_codes import ERROR -from pip._internal.utils.hashes import FAVORITE_HASH, STRONG_HASHES -from pip._internal.utils.misc import read_chunks - -logger = logging.getLogger(__name__) - - -class HashCommand(Command): - """ - Compute a hash of a local package archive. - - These can be used with --hash in a requirements file to do repeatable - installs. - - """ - name = 'hash' - usage = '%prog [options] ...' - summary = 'Compute hashes of package archives.' - ignore_require_venv = True - - def __init__(self, *args, **kw): - super(HashCommand, self).__init__(*args, **kw) - self.cmd_opts.add_option( - '-a', '--algorithm', - dest='algorithm', - choices=STRONG_HASHES, - action='store', - default=FAVORITE_HASH, - help='The hash algorithm to use: one of %s' % - ', '.join(STRONG_HASHES)) - self.parser.insert_option_group(0, self.cmd_opts) - - def run(self, options, args): - if not args: - self.parser.print_usage(sys.stderr) - return ERROR - - algorithm = options.algorithm - for path in args: - logger.info('%s:\n--hash=%s:%s', - path, algorithm, _hash_of_file(path, algorithm)) - - -def _hash_of_file(path, algorithm): - """Return the hash digest of a file.""" - with open(path, 'rb') as archive: - hash = hashlib.new(algorithm) - for chunk in read_chunks(archive): - hash.update(chunk) - return hash.hexdigest() diff --git a/env/lib/python3.7/site-packages/pip/_internal/commands/help.py b/env/lib/python3.7/site-packages/pip/_internal/commands/help.py deleted file mode 100644 index 49a81cb..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/commands/help.py +++ /dev/null @@ -1,37 +0,0 @@ -from __future__ import absolute_import - -from pip._internal.cli.base_command import Command -from pip._internal.cli.status_codes import SUCCESS -from pip._internal.exceptions import CommandError - - -class HelpCommand(Command): - """Show help for commands""" - name = 'help' - usage = """ - %prog """ - summary = 'Show help for commands.' - ignore_require_venv = True - - def run(self, options, args): - from pip._internal.commands import commands_dict, get_similar_commands - - try: - # 'pip help' with no args is handled by pip.__init__.parseopt() - cmd_name = args[0] # the command we need help for - except IndexError: - return SUCCESS - - if cmd_name not in commands_dict: - guess = get_similar_commands(cmd_name) - - msg = ['unknown command "%s"' % cmd_name] - if guess: - msg.append('maybe you meant "%s"' % guess) - - raise CommandError(' - '.join(msg)) - - command = commands_dict[cmd_name]() - command.parser.print_help() - - return SUCCESS diff --git a/env/lib/python3.7/site-packages/pip/_internal/commands/install.py b/env/lib/python3.7/site-packages/pip/_internal/commands/install.py deleted file mode 100644 index c13da44..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/commands/install.py +++ /dev/null @@ -1,587 +0,0 @@ -from __future__ import absolute_import - -import errno -import logging -import operator -import os -import shutil -from optparse import SUPPRESS_HELP - -from pip._vendor import pkg_resources - -from pip._internal.cache import WheelCache -from pip._internal.cli import cmdoptions -from pip._internal.cli.base_command import RequirementCommand -from pip._internal.cli.status_codes import ERROR -from pip._internal.exceptions import ( - CommandError, InstallationError, PreviousBuildDirError, -) -from pip._internal.locations import distutils_scheme, virtualenv_no_global -from pip._internal.operations.check import check_install_conflicts -from pip._internal.operations.prepare import RequirementPreparer -from pip._internal.req import RequirementSet, install_given_reqs -from pip._internal.req.req_tracker import RequirementTracker -from pip._internal.resolve import Resolver -from pip._internal.utils.filesystem import check_path_owner -from pip._internal.utils.misc import ( - ensure_dir, get_installed_version, - protect_pip_from_modification_on_windows, -) -from pip._internal.utils.temp_dir import TempDirectory -from pip._internal.wheel import WheelBuilder - -logger = logging.getLogger(__name__) - - -def is_wheel_installed(): - """ - Return whether the wheel package is installed. - """ - try: - import wheel # noqa: F401 - except ImportError: - return False - - return True - - -def build_wheels(builder, pep517_requirements, legacy_requirements, session): - """ - Build wheels for requirements, depending on whether wheel is installed. - """ - # We don't build wheels for legacy requirements if wheel is not installed. - should_build_legacy = is_wheel_installed() - - # Always build PEP 517 requirements - build_failures = builder.build( - pep517_requirements, - session=session, autobuilding=True - ) - - if should_build_legacy: - # We don't care about failures building legacy - # requirements, as we'll fall through to a direct - # install for those. - builder.build( - legacy_requirements, - session=session, autobuilding=True - ) - - return build_failures - - -class InstallCommand(RequirementCommand): - """ - Install packages from: - - - PyPI (and other indexes) using requirement specifiers. - - VCS project urls. - - Local project directories. - - Local or remote source archives. - - pip also supports installing from "requirements files", which provide - an easy way to specify a whole environment to be installed. - """ - name = 'install' - - usage = """ - %prog [options] [package-index-options] ... - %prog [options] -r [package-index-options] ... - %prog [options] [-e] ... - %prog [options] [-e] ... - %prog [options] ...""" - - summary = 'Install packages.' - - def __init__(self, *args, **kw): - super(InstallCommand, self).__init__(*args, **kw) - - cmd_opts = self.cmd_opts - - cmd_opts.add_option(cmdoptions.requirements()) - cmd_opts.add_option(cmdoptions.constraints()) - cmd_opts.add_option(cmdoptions.no_deps()) - cmd_opts.add_option(cmdoptions.pre()) - - cmd_opts.add_option(cmdoptions.editable()) - cmd_opts.add_option( - '-t', '--target', - dest='target_dir', - metavar='dir', - default=None, - help='Install packages into . ' - 'By default this will not replace existing files/folders in ' - '. Use --upgrade to replace existing packages in ' - 'with new versions.' - ) - cmd_opts.add_option(cmdoptions.platform()) - cmd_opts.add_option(cmdoptions.python_version()) - cmd_opts.add_option(cmdoptions.implementation()) - cmd_opts.add_option(cmdoptions.abi()) - - cmd_opts.add_option( - '--user', - dest='use_user_site', - action='store_true', - help="Install to the Python user install directory for your " - "platform. Typically ~/.local/, or %APPDATA%\\Python on " - "Windows. (See the Python documentation for site.USER_BASE " - "for full details.)") - cmd_opts.add_option( - '--no-user', - dest='use_user_site', - action='store_false', - help=SUPPRESS_HELP) - cmd_opts.add_option( - '--root', - dest='root_path', - metavar='dir', - default=None, - help="Install everything relative to this alternate root " - "directory.") - cmd_opts.add_option( - '--prefix', - dest='prefix_path', - metavar='dir', - default=None, - help="Installation prefix where lib, bin and other top-level " - "folders are placed") - - cmd_opts.add_option(cmdoptions.build_dir()) - - cmd_opts.add_option(cmdoptions.src()) - - cmd_opts.add_option( - '-U', '--upgrade', - dest='upgrade', - action='store_true', - help='Upgrade all specified packages to the newest available ' - 'version. The handling of dependencies depends on the ' - 'upgrade-strategy used.' - ) - - cmd_opts.add_option( - '--upgrade-strategy', - dest='upgrade_strategy', - default='only-if-needed', - choices=['only-if-needed', 'eager'], - help='Determines how dependency upgrading should be handled ' - '[default: %default]. ' - '"eager" - dependencies are upgraded regardless of ' - 'whether the currently installed version satisfies the ' - 'requirements of the upgraded package(s). ' - '"only-if-needed" - are upgraded only when they do not ' - 'satisfy the requirements of the upgraded package(s).' - ) - - cmd_opts.add_option( - '--force-reinstall', - dest='force_reinstall', - action='store_true', - help='Reinstall all packages even if they are already ' - 'up-to-date.') - - cmd_opts.add_option( - '-I', '--ignore-installed', - dest='ignore_installed', - action='store_true', - help='Ignore the installed packages (reinstalling instead).') - - cmd_opts.add_option(cmdoptions.ignore_requires_python()) - cmd_opts.add_option(cmdoptions.no_build_isolation()) - cmd_opts.add_option(cmdoptions.use_pep517()) - cmd_opts.add_option(cmdoptions.no_use_pep517()) - - cmd_opts.add_option(cmdoptions.install_options()) - cmd_opts.add_option(cmdoptions.global_options()) - - cmd_opts.add_option( - "--compile", - action="store_true", - dest="compile", - default=True, - help="Compile Python source files to bytecode", - ) - - cmd_opts.add_option( - "--no-compile", - action="store_false", - dest="compile", - help="Do not compile Python source files to bytecode", - ) - - cmd_opts.add_option( - "--no-warn-script-location", - action="store_false", - dest="warn_script_location", - default=True, - help="Do not warn when installing scripts outside PATH", - ) - cmd_opts.add_option( - "--no-warn-conflicts", - action="store_false", - dest="warn_about_conflicts", - default=True, - help="Do not warn about broken dependencies", - ) - - cmd_opts.add_option(cmdoptions.no_binary()) - cmd_opts.add_option(cmdoptions.only_binary()) - cmd_opts.add_option(cmdoptions.prefer_binary()) - cmd_opts.add_option(cmdoptions.no_clean()) - cmd_opts.add_option(cmdoptions.require_hashes()) - cmd_opts.add_option(cmdoptions.progress_bar()) - - index_opts = cmdoptions.make_option_group( - cmdoptions.index_group, - self.parser, - ) - - self.parser.insert_option_group(0, index_opts) - self.parser.insert_option_group(0, cmd_opts) - - def run(self, options, args): - cmdoptions.check_install_build_global(options) - upgrade_strategy = "to-satisfy-only" - if options.upgrade: - upgrade_strategy = options.upgrade_strategy - - if options.build_dir: - options.build_dir = os.path.abspath(options.build_dir) - - cmdoptions.check_dist_restriction(options, check_target=True) - - if options.python_version: - python_versions = [options.python_version] - else: - python_versions = None - - options.src_dir = os.path.abspath(options.src_dir) - install_options = options.install_options or [] - if options.use_user_site: - if options.prefix_path: - raise CommandError( - "Can not combine '--user' and '--prefix' as they imply " - "different installation locations" - ) - if virtualenv_no_global(): - raise InstallationError( - "Can not perform a '--user' install. User site-packages " - "are not visible in this virtualenv." - ) - install_options.append('--user') - install_options.append('--prefix=') - - target_temp_dir = TempDirectory(kind="target") - if options.target_dir: - options.ignore_installed = True - options.target_dir = os.path.abspath(options.target_dir) - if (os.path.exists(options.target_dir) and not - os.path.isdir(options.target_dir)): - raise CommandError( - "Target path exists but is not a directory, will not " - "continue." - ) - - # Create a target directory for using with the target option - target_temp_dir.create() - install_options.append('--home=' + target_temp_dir.path) - - global_options = options.global_options or [] - - with self._build_session(options) as session: - finder = self._build_package_finder( - options=options, - session=session, - platform=options.platform, - python_versions=python_versions, - abi=options.abi, - implementation=options.implementation, - ) - build_delete = (not (options.no_clean or options.build_dir)) - wheel_cache = WheelCache(options.cache_dir, options.format_control) - - if options.cache_dir and not check_path_owner(options.cache_dir): - logger.warning( - "The directory '%s' or its parent directory is not owned " - "by the current user and caching wheels has been " - "disabled. check the permissions and owner of that " - "directory. If executing pip with sudo, you may want " - "sudo's -H flag.", - options.cache_dir, - ) - options.cache_dir = None - - with RequirementTracker() as req_tracker, TempDirectory( - options.build_dir, delete=build_delete, kind="install" - ) as directory: - requirement_set = RequirementSet( - require_hashes=options.require_hashes, - check_supported_wheels=not options.target_dir, - ) - - try: - self.populate_requirement_set( - requirement_set, args, options, finder, session, - self.name, wheel_cache - ) - preparer = RequirementPreparer( - build_dir=directory.path, - src_dir=options.src_dir, - download_dir=None, - wheel_download_dir=None, - progress_bar=options.progress_bar, - build_isolation=options.build_isolation, - req_tracker=req_tracker, - ) - - resolver = Resolver( - preparer=preparer, - finder=finder, - session=session, - wheel_cache=wheel_cache, - use_user_site=options.use_user_site, - upgrade_strategy=upgrade_strategy, - force_reinstall=options.force_reinstall, - ignore_dependencies=options.ignore_dependencies, - ignore_requires_python=options.ignore_requires_python, - ignore_installed=options.ignore_installed, - isolated=options.isolated_mode, - use_pep517=options.use_pep517 - ) - resolver.resolve(requirement_set) - - protect_pip_from_modification_on_windows( - modifying_pip=requirement_set.has_requirement("pip") - ) - - # Consider legacy and PEP517-using requirements separately - legacy_requirements = [] - pep517_requirements = [] - for req in requirement_set.requirements.values(): - if req.use_pep517: - pep517_requirements.append(req) - else: - legacy_requirements.append(req) - - wheel_builder = WheelBuilder( - finder, preparer, wheel_cache, - build_options=[], global_options=[], - ) - - build_failures = build_wheels( - builder=wheel_builder, - pep517_requirements=pep517_requirements, - legacy_requirements=legacy_requirements, - session=session, - ) - - # If we're using PEP 517, we cannot do a direct install - # so we fail here. - if build_failures: - raise InstallationError( - "Could not build wheels for {} which use" - " PEP 517 and cannot be installed directly".format( - ", ".join(r.name for r in build_failures))) - - to_install = resolver.get_installation_order( - requirement_set - ) - - # Consistency Checking of the package set we're installing. - should_warn_about_conflicts = ( - not options.ignore_dependencies and - options.warn_about_conflicts - ) - if should_warn_about_conflicts: - self._warn_about_conflicts(to_install) - - # Don't warn about script install locations if - # --target has been specified - warn_script_location = options.warn_script_location - if options.target_dir: - warn_script_location = False - - installed = install_given_reqs( - to_install, - install_options, - global_options, - root=options.root_path, - home=target_temp_dir.path, - prefix=options.prefix_path, - pycompile=options.compile, - warn_script_location=warn_script_location, - use_user_site=options.use_user_site, - ) - - lib_locations = get_lib_location_guesses( - user=options.use_user_site, - home=target_temp_dir.path, - root=options.root_path, - prefix=options.prefix_path, - isolated=options.isolated_mode, - ) - working_set = pkg_resources.WorkingSet(lib_locations) - - reqs = sorted(installed, key=operator.attrgetter('name')) - items = [] - for req in reqs: - item = req.name - try: - installed_version = get_installed_version( - req.name, working_set=working_set - ) - if installed_version: - item += '-' + installed_version - except Exception: - pass - items.append(item) - installed = ' '.join(items) - if installed: - logger.info('Successfully installed %s', installed) - except EnvironmentError as error: - show_traceback = (self.verbosity >= 1) - - message = create_env_error_message( - error, show_traceback, options.use_user_site, - ) - logger.error(message, exc_info=show_traceback) - - return ERROR - except PreviousBuildDirError: - options.no_clean = True - raise - finally: - # Clean up - if not options.no_clean: - requirement_set.cleanup_files() - wheel_cache.cleanup() - - if options.target_dir: - self._handle_target_dir( - options.target_dir, target_temp_dir, options.upgrade - ) - return requirement_set - - def _handle_target_dir(self, target_dir, target_temp_dir, upgrade): - ensure_dir(target_dir) - - # Checking both purelib and platlib directories for installed - # packages to be moved to target directory - lib_dir_list = [] - - with target_temp_dir: - # Checking both purelib and platlib directories for installed - # packages to be moved to target directory - scheme = distutils_scheme('', home=target_temp_dir.path) - purelib_dir = scheme['purelib'] - platlib_dir = scheme['platlib'] - data_dir = scheme['data'] - - if os.path.exists(purelib_dir): - lib_dir_list.append(purelib_dir) - if os.path.exists(platlib_dir) and platlib_dir != purelib_dir: - lib_dir_list.append(platlib_dir) - if os.path.exists(data_dir): - lib_dir_list.append(data_dir) - - for lib_dir in lib_dir_list: - for item in os.listdir(lib_dir): - if lib_dir == data_dir: - ddir = os.path.join(data_dir, item) - if any(s.startswith(ddir) for s in lib_dir_list[:-1]): - continue - target_item_dir = os.path.join(target_dir, item) - if os.path.exists(target_item_dir): - if not upgrade: - logger.warning( - 'Target directory %s already exists. Specify ' - '--upgrade to force replacement.', - target_item_dir - ) - continue - if os.path.islink(target_item_dir): - logger.warning( - 'Target directory %s already exists and is ' - 'a link. Pip will not automatically replace ' - 'links, please remove if replacement is ' - 'desired.', - target_item_dir - ) - continue - if os.path.isdir(target_item_dir): - shutil.rmtree(target_item_dir) - else: - os.remove(target_item_dir) - - shutil.move( - os.path.join(lib_dir, item), - target_item_dir - ) - - def _warn_about_conflicts(self, to_install): - try: - package_set, _dep_info = check_install_conflicts(to_install) - except Exception: - logger.error("Error checking for conflicts.", exc_info=True) - return - missing, conflicting = _dep_info - - # NOTE: There is some duplication here from pip check - for project_name in missing: - version = package_set[project_name][0] - for dependency in missing[project_name]: - logger.critical( - "%s %s requires %s, which is not installed.", - project_name, version, dependency[1], - ) - - for project_name in conflicting: - version = package_set[project_name][0] - for dep_name, dep_version, req in conflicting[project_name]: - logger.critical( - "%s %s has requirement %s, but you'll have %s %s which is " - "incompatible.", - project_name, version, req, dep_name, dep_version, - ) - - -def get_lib_location_guesses(*args, **kwargs): - scheme = distutils_scheme('', *args, **kwargs) - return [scheme['purelib'], scheme['platlib']] - - -def create_env_error_message(error, show_traceback, using_user_site): - """Format an error message for an EnvironmentError - - It may occur anytime during the execution of the install command. - """ - parts = [] - - # Mention the error if we are not going to show a traceback - parts.append("Could not install packages due to an EnvironmentError") - if not show_traceback: - parts.append(": ") - parts.append(str(error)) - else: - parts.append(".") - - # Spilt the error indication from a helper message (if any) - parts[-1] += "\n" - - # Suggest useful actions to the user: - # (1) using user site-packages or (2) verifying the permissions - if error.errno == errno.EACCES: - user_option_part = "Consider using the `--user` option" - permissions_part = "Check the permissions" - - if not using_user_site: - parts.extend([ - user_option_part, " or ", - permissions_part.lower(), - ]) - else: - parts.append(permissions_part) - parts.append(".\n") - - return "".join(parts).strip() + "\n" diff --git a/env/lib/python3.7/site-packages/pip/_internal/commands/list.py b/env/lib/python3.7/site-packages/pip/_internal/commands/list.py deleted file mode 100644 index d70782d..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/commands/list.py +++ /dev/null @@ -1,302 +0,0 @@ -from __future__ import absolute_import - -import json -import logging - -from pip._vendor import six -from pip._vendor.six.moves import zip_longest - -from pip._internal.cli import cmdoptions -from pip._internal.cli.base_command import Command -from pip._internal.exceptions import CommandError -from pip._internal.index import PackageFinder -from pip._internal.utils.misc import ( - dist_is_editable, get_installed_distributions, -) -from pip._internal.utils.packaging import get_installer - -logger = logging.getLogger(__name__) - - -class ListCommand(Command): - """ - List installed packages, including editables. - - Packages are listed in a case-insensitive sorted order. - """ - name = 'list' - usage = """ - %prog [options]""" - summary = 'List installed packages.' - - def __init__(self, *args, **kw): - super(ListCommand, self).__init__(*args, **kw) - - cmd_opts = self.cmd_opts - - cmd_opts.add_option( - '-o', '--outdated', - action='store_true', - default=False, - help='List outdated packages') - cmd_opts.add_option( - '-u', '--uptodate', - action='store_true', - default=False, - help='List uptodate packages') - cmd_opts.add_option( - '-e', '--editable', - action='store_true', - default=False, - help='List editable projects.') - cmd_opts.add_option( - '-l', '--local', - action='store_true', - default=False, - help=('If in a virtualenv that has global access, do not list ' - 'globally-installed packages.'), - ) - self.cmd_opts.add_option( - '--user', - dest='user', - action='store_true', - default=False, - help='Only output packages installed in user-site.') - - cmd_opts.add_option( - '--pre', - action='store_true', - default=False, - help=("Include pre-release and development versions. By default, " - "pip only finds stable versions."), - ) - - cmd_opts.add_option( - '--format', - action='store', - dest='list_format', - default="columns", - choices=('columns', 'freeze', 'json'), - help="Select the output format among: columns (default), freeze, " - "or json", - ) - - cmd_opts.add_option( - '--not-required', - action='store_true', - dest='not_required', - help="List packages that are not dependencies of " - "installed packages.", - ) - - cmd_opts.add_option( - '--exclude-editable', - action='store_false', - dest='include_editable', - help='Exclude editable package from output.', - ) - cmd_opts.add_option( - '--include-editable', - action='store_true', - dest='include_editable', - help='Include editable package from output.', - default=True, - ) - index_opts = cmdoptions.make_option_group( - cmdoptions.index_group, self.parser - ) - - self.parser.insert_option_group(0, index_opts) - self.parser.insert_option_group(0, cmd_opts) - - def _build_package_finder(self, options, index_urls, session): - """ - Create a package finder appropriate to this list command. - """ - return PackageFinder( - find_links=options.find_links, - index_urls=index_urls, - allow_all_prereleases=options.pre, - trusted_hosts=options.trusted_hosts, - session=session, - ) - - def run(self, options, args): - if options.outdated and options.uptodate: - raise CommandError( - "Options --outdated and --uptodate cannot be combined.") - - packages = get_installed_distributions( - local_only=options.local, - user_only=options.user, - editables_only=options.editable, - include_editables=options.include_editable, - ) - - # get_not_required must be called firstly in order to find and - # filter out all dependencies correctly. Otherwise a package - # can't be identified as requirement because some parent packages - # could be filtered out before. - if options.not_required: - packages = self.get_not_required(packages, options) - - if options.outdated: - packages = self.get_outdated(packages, options) - elif options.uptodate: - packages = self.get_uptodate(packages, options) - - self.output_package_listing(packages, options) - - def get_outdated(self, packages, options): - return [ - dist for dist in self.iter_packages_latest_infos(packages, options) - if dist.latest_version > dist.parsed_version - ] - - def get_uptodate(self, packages, options): - return [ - dist for dist in self.iter_packages_latest_infos(packages, options) - if dist.latest_version == dist.parsed_version - ] - - def get_not_required(self, packages, options): - dep_keys = set() - for dist in packages: - dep_keys.update(requirement.key for requirement in dist.requires()) - return {pkg for pkg in packages if pkg.key not in dep_keys} - - def iter_packages_latest_infos(self, packages, options): - index_urls = [options.index_url] + options.extra_index_urls - if options.no_index: - logger.debug('Ignoring indexes: %s', ','.join(index_urls)) - index_urls = [] - - with self._build_session(options) as session: - finder = self._build_package_finder(options, index_urls, session) - - for dist in packages: - typ = 'unknown' - all_candidates = finder.find_all_candidates(dist.key) - if not options.pre: - # Remove prereleases - all_candidates = [candidate for candidate in all_candidates - if not candidate.version.is_prerelease] - - evaluator = finder.candidate_evaluator - best_candidate = evaluator.get_best_candidate(all_candidates) - if best_candidate is None: - continue - - remote_version = best_candidate.version - if best_candidate.location.is_wheel: - typ = 'wheel' - else: - typ = 'sdist' - # This is dirty but makes the rest of the code much cleaner - dist.latest_version = remote_version - dist.latest_filetype = typ - yield dist - - def output_package_listing(self, packages, options): - packages = sorted( - packages, - key=lambda dist: dist.project_name.lower(), - ) - if options.list_format == 'columns' and packages: - data, header = format_for_columns(packages, options) - self.output_package_listing_columns(data, header) - elif options.list_format == 'freeze': - for dist in packages: - if options.verbose >= 1: - logger.info("%s==%s (%s)", dist.project_name, - dist.version, dist.location) - else: - logger.info("%s==%s", dist.project_name, dist.version) - elif options.list_format == 'json': - logger.info(format_for_json(packages, options)) - - def output_package_listing_columns(self, data, header): - # insert the header first: we need to know the size of column names - if len(data) > 0: - data.insert(0, header) - - pkg_strings, sizes = tabulate(data) - - # Create and add a separator. - if len(data) > 0: - pkg_strings.insert(1, " ".join(map(lambda x: '-' * x, sizes))) - - for val in pkg_strings: - logger.info(val) - - -def tabulate(vals): - # From pfmoore on GitHub: - # https://github.com/pypa/pip/issues/3651#issuecomment-216932564 - assert len(vals) > 0 - - sizes = [0] * max(len(x) for x in vals) - for row in vals: - sizes = [max(s, len(str(c))) for s, c in zip_longest(sizes, row)] - - result = [] - for row in vals: - display = " ".join([str(c).ljust(s) if c is not None else '' - for s, c in zip_longest(sizes, row)]) - result.append(display) - - return result, sizes - - -def format_for_columns(pkgs, options): - """ - Convert the package data into something usable - by output_package_listing_columns. - """ - running_outdated = options.outdated - # Adjust the header for the `pip list --outdated` case. - if running_outdated: - header = ["Package", "Version", "Latest", "Type"] - else: - header = ["Package", "Version"] - - data = [] - if options.verbose >= 1 or any(dist_is_editable(x) for x in pkgs): - header.append("Location") - if options.verbose >= 1: - header.append("Installer") - - for proj in pkgs: - # if we're working on the 'outdated' list, separate out the - # latest_version and type - row = [proj.project_name, proj.version] - - if running_outdated: - row.append(proj.latest_version) - row.append(proj.latest_filetype) - - if options.verbose >= 1 or dist_is_editable(proj): - row.append(proj.location) - if options.verbose >= 1: - row.append(get_installer(proj)) - - data.append(row) - - return data, header - - -def format_for_json(packages, options): - data = [] - for dist in packages: - info = { - 'name': dist.project_name, - 'version': six.text_type(dist.version), - } - if options.verbose >= 1: - info['location'] = dist.location - info['installer'] = get_installer(dist) - if options.outdated: - info['latest_version'] = six.text_type(dist.latest_version) - info['latest_filetype'] = dist.latest_filetype - data.append(info) - return json.dumps(data) diff --git a/env/lib/python3.7/site-packages/pip/_internal/commands/search.py b/env/lib/python3.7/site-packages/pip/_internal/commands/search.py deleted file mode 100644 index c157a31..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/commands/search.py +++ /dev/null @@ -1,135 +0,0 @@ -from __future__ import absolute_import - -import logging -import sys -import textwrap -from collections import OrderedDict - -from pip._vendor import pkg_resources -from pip._vendor.packaging.version import parse as parse_version -# NOTE: XMLRPC Client is not annotated in typeshed as on 2017-07-17, which is -# why we ignore the type on this import -from pip._vendor.six.moves import xmlrpc_client # type: ignore - -from pip._internal.cli.base_command import Command -from pip._internal.cli.status_codes import NO_MATCHES_FOUND, SUCCESS -from pip._internal.download import PipXmlrpcTransport -from pip._internal.exceptions import CommandError -from pip._internal.models.index import PyPI -from pip._internal.utils.compat import get_terminal_size -from pip._internal.utils.logging import indent_log - -logger = logging.getLogger(__name__) - - -class SearchCommand(Command): - """Search for PyPI packages whose name or summary contains .""" - name = 'search' - usage = """ - %prog [options] """ - summary = 'Search PyPI for packages.' - ignore_require_venv = True - - def __init__(self, *args, **kw): - super(SearchCommand, self).__init__(*args, **kw) - self.cmd_opts.add_option( - '-i', '--index', - dest='index', - metavar='URL', - default=PyPI.pypi_url, - help='Base URL of Python Package Index (default %default)') - - self.parser.insert_option_group(0, self.cmd_opts) - - def run(self, options, args): - if not args: - raise CommandError('Missing required argument (search query).') - query = args - pypi_hits = self.search(query, options) - hits = transform_hits(pypi_hits) - - terminal_width = None - if sys.stdout.isatty(): - terminal_width = get_terminal_size()[0] - - print_results(hits, terminal_width=terminal_width) - if pypi_hits: - return SUCCESS - return NO_MATCHES_FOUND - - def search(self, query, options): - index_url = options.index - with self._build_session(options) as session: - transport = PipXmlrpcTransport(index_url, session) - pypi = xmlrpc_client.ServerProxy(index_url, transport) - hits = pypi.search({'name': query, 'summary': query}, 'or') - return hits - - -def transform_hits(hits): - """ - The list from pypi is really a list of versions. We want a list of - packages with the list of versions stored inline. This converts the - list from pypi into one we can use. - """ - packages = OrderedDict() - for hit in hits: - name = hit['name'] - summary = hit['summary'] - version = hit['version'] - - if name not in packages.keys(): - packages[name] = { - 'name': name, - 'summary': summary, - 'versions': [version], - } - else: - packages[name]['versions'].append(version) - - # if this is the highest version, replace summary and score - if version == highest_version(packages[name]['versions']): - packages[name]['summary'] = summary - - return list(packages.values()) - - -def print_results(hits, name_column_width=None, terminal_width=None): - if not hits: - return - if name_column_width is None: - name_column_width = max([ - len(hit['name']) + len(highest_version(hit.get('versions', ['-']))) - for hit in hits - ]) + 4 - - installed_packages = [p.project_name for p in pkg_resources.working_set] - for hit in hits: - name = hit['name'] - summary = hit['summary'] or '' - latest = highest_version(hit.get('versions', ['-'])) - if terminal_width is not None: - target_width = terminal_width - name_column_width - 5 - if target_width > 10: - # wrap and indent summary to fit terminal - summary = textwrap.wrap(summary, target_width) - summary = ('\n' + ' ' * (name_column_width + 3)).join(summary) - - line = '%-*s - %s' % (name_column_width, - '%s (%s)' % (name, latest), summary) - try: - logger.info(line) - if name in installed_packages: - dist = pkg_resources.get_distribution(name) - with indent_log(): - if dist.version == latest: - logger.info('INSTALLED: %s (latest)', dist.version) - else: - logger.info('INSTALLED: %s', dist.version) - logger.info('LATEST: %s', latest) - except UnicodeEncodeError: - pass - - -def highest_version(versions): - return max(versions, key=parse_version) diff --git a/env/lib/python3.7/site-packages/pip/_internal/commands/show.py b/env/lib/python3.7/site-packages/pip/_internal/commands/show.py deleted file mode 100644 index a18a902..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/commands/show.py +++ /dev/null @@ -1,168 +0,0 @@ -from __future__ import absolute_import - -import logging -import os -from email.parser import FeedParser - -from pip._vendor import pkg_resources -from pip._vendor.packaging.utils import canonicalize_name - -from pip._internal.cli.base_command import Command -from pip._internal.cli.status_codes import ERROR, SUCCESS - -logger = logging.getLogger(__name__) - - -class ShowCommand(Command): - """ - Show information about one or more installed packages. - - The output is in RFC-compliant mail header format. - """ - name = 'show' - usage = """ - %prog [options] ...""" - summary = 'Show information about installed packages.' - ignore_require_venv = True - - def __init__(self, *args, **kw): - super(ShowCommand, self).__init__(*args, **kw) - self.cmd_opts.add_option( - '-f', '--files', - dest='files', - action='store_true', - default=False, - help='Show the full list of installed files for each package.') - - self.parser.insert_option_group(0, self.cmd_opts) - - def run(self, options, args): - if not args: - logger.warning('ERROR: Please provide a package name or names.') - return ERROR - query = args - - results = search_packages_info(query) - if not print_results( - results, list_files=options.files, verbose=options.verbose): - return ERROR - return SUCCESS - - -def search_packages_info(query): - """ - Gather details from installed distributions. Print distribution name, - version, location, and installed files. Installed files requires a - pip generated 'installed-files.txt' in the distributions '.egg-info' - directory. - """ - installed = {} - for p in pkg_resources.working_set: - installed[canonicalize_name(p.project_name)] = p - - query_names = [canonicalize_name(name) for name in query] - - for dist in [installed[pkg] for pkg in query_names if pkg in installed]: - package = { - 'name': dist.project_name, - 'version': dist.version, - 'location': dist.location, - 'requires': [dep.project_name for dep in dist.requires()], - } - file_list = None - metadata = None - if isinstance(dist, pkg_resources.DistInfoDistribution): - # RECORDs should be part of .dist-info metadatas - if dist.has_metadata('RECORD'): - lines = dist.get_metadata_lines('RECORD') - paths = [l.split(',')[0] for l in lines] - paths = [os.path.join(dist.location, p) for p in paths] - file_list = [os.path.relpath(p, dist.location) for p in paths] - - if dist.has_metadata('METADATA'): - metadata = dist.get_metadata('METADATA') - else: - # Otherwise use pip's log for .egg-info's - if dist.has_metadata('installed-files.txt'): - paths = dist.get_metadata_lines('installed-files.txt') - paths = [os.path.join(dist.egg_info, p) for p in paths] - file_list = [os.path.relpath(p, dist.location) for p in paths] - - if dist.has_metadata('PKG-INFO'): - metadata = dist.get_metadata('PKG-INFO') - - if dist.has_metadata('entry_points.txt'): - entry_points = dist.get_metadata_lines('entry_points.txt') - package['entry_points'] = entry_points - - if dist.has_metadata('INSTALLER'): - for line in dist.get_metadata_lines('INSTALLER'): - if line.strip(): - package['installer'] = line.strip() - break - - # @todo: Should pkg_resources.Distribution have a - # `get_pkg_info` method? - feed_parser = FeedParser() - feed_parser.feed(metadata) - pkg_info_dict = feed_parser.close() - for key in ('metadata-version', 'summary', - 'home-page', 'author', 'author-email', 'license'): - package[key] = pkg_info_dict.get(key) - - # It looks like FeedParser cannot deal with repeated headers - classifiers = [] - for line in metadata.splitlines(): - if line.startswith('Classifier: '): - classifiers.append(line[len('Classifier: '):]) - package['classifiers'] = classifiers - - if file_list: - package['files'] = sorted(file_list) - yield package - - -def print_results(distributions, list_files=False, verbose=False): - """ - Print the informations from installed distributions found. - """ - results_printed = False - for i, dist in enumerate(distributions): - results_printed = True - if i > 0: - logger.info("---") - - name = dist.get('name', '') - required_by = [ - pkg.project_name for pkg in pkg_resources.working_set - if name in [required.name for required in pkg.requires()] - ] - - logger.info("Name: %s", name) - logger.info("Version: %s", dist.get('version', '')) - logger.info("Summary: %s", dist.get('summary', '')) - logger.info("Home-page: %s", dist.get('home-page', '')) - logger.info("Author: %s", dist.get('author', '')) - logger.info("Author-email: %s", dist.get('author-email', '')) - logger.info("License: %s", dist.get('license', '')) - logger.info("Location: %s", dist.get('location', '')) - logger.info("Requires: %s", ', '.join(dist.get('requires', []))) - logger.info("Required-by: %s", ', '.join(required_by)) - - if verbose: - logger.info("Metadata-Version: %s", - dist.get('metadata-version', '')) - logger.info("Installer: %s", dist.get('installer', '')) - logger.info("Classifiers:") - for classifier in dist.get('classifiers', []): - logger.info(" %s", classifier) - logger.info("Entry-points:") - for entry in dist.get('entry_points', []): - logger.info(" %s", entry.strip()) - if list_files: - logger.info("Files:") - for line in dist.get('files', []): - logger.info(" %s", line.strip()) - if "files" not in dist: - logger.info("Cannot locate installed-files.txt") - return results_printed diff --git a/env/lib/python3.7/site-packages/pip/_internal/commands/uninstall.py b/env/lib/python3.7/site-packages/pip/_internal/commands/uninstall.py deleted file mode 100644 index 0cd6f54..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/commands/uninstall.py +++ /dev/null @@ -1,78 +0,0 @@ -from __future__ import absolute_import - -from pip._vendor.packaging.utils import canonicalize_name - -from pip._internal.cli.base_command import Command -from pip._internal.exceptions import InstallationError -from pip._internal.req import parse_requirements -from pip._internal.req.constructors import install_req_from_line -from pip._internal.utils.misc import protect_pip_from_modification_on_windows - - -class UninstallCommand(Command): - """ - Uninstall packages. - - pip is able to uninstall most installed packages. Known exceptions are: - - - Pure distutils packages installed with ``python setup.py install``, which - leave behind no metadata to determine what files were installed. - - Script wrappers installed by ``python setup.py develop``. - """ - name = 'uninstall' - usage = """ - %prog [options] ... - %prog [options] -r ...""" - summary = 'Uninstall packages.' - - def __init__(self, *args, **kw): - super(UninstallCommand, self).__init__(*args, **kw) - self.cmd_opts.add_option( - '-r', '--requirement', - dest='requirements', - action='append', - default=[], - metavar='file', - help='Uninstall all the packages listed in the given requirements ' - 'file. This option can be used multiple times.', - ) - self.cmd_opts.add_option( - '-y', '--yes', - dest='yes', - action='store_true', - help="Don't ask for confirmation of uninstall deletions.") - - self.parser.insert_option_group(0, self.cmd_opts) - - def run(self, options, args): - with self._build_session(options) as session: - reqs_to_uninstall = {} - for name in args: - req = install_req_from_line( - name, isolated=options.isolated_mode, - ) - if req.name: - reqs_to_uninstall[canonicalize_name(req.name)] = req - for filename in options.requirements: - for req in parse_requirements( - filename, - options=options, - session=session): - if req.name: - reqs_to_uninstall[canonicalize_name(req.name)] = req - if not reqs_to_uninstall: - raise InstallationError( - 'You must give at least one requirement to %(name)s (see ' - '"pip help %(name)s")' % dict(name=self.name) - ) - - protect_pip_from_modification_on_windows( - modifying_pip="pip" in reqs_to_uninstall - ) - - for req in reqs_to_uninstall.values(): - uninstall_pathset = req.uninstall( - auto_confirm=options.yes, verbose=self.verbosity > 0, - ) - if uninstall_pathset: - uninstall_pathset.commit() diff --git a/env/lib/python3.7/site-packages/pip/_internal/commands/wheel.py b/env/lib/python3.7/site-packages/pip/_internal/commands/wheel.py deleted file mode 100644 index cd72a3d..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/commands/wheel.py +++ /dev/null @@ -1,186 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import absolute_import - -import logging -import os - -from pip._internal.cache import WheelCache -from pip._internal.cli import cmdoptions -from pip._internal.cli.base_command import RequirementCommand -from pip._internal.exceptions import CommandError, PreviousBuildDirError -from pip._internal.operations.prepare import RequirementPreparer -from pip._internal.req import RequirementSet -from pip._internal.req.req_tracker import RequirementTracker -from pip._internal.resolve import Resolver -from pip._internal.utils.temp_dir import TempDirectory -from pip._internal.wheel import WheelBuilder - -logger = logging.getLogger(__name__) - - -class WheelCommand(RequirementCommand): - """ - Build Wheel archives for your requirements and dependencies. - - Wheel is a built-package format, and offers the advantage of not - recompiling your software during every install. For more details, see the - wheel docs: https://wheel.readthedocs.io/en/latest/ - - Requirements: setuptools>=0.8, and wheel. - - 'pip wheel' uses the bdist_wheel setuptools extension from the wheel - package to build individual wheels. - - """ - - name = 'wheel' - usage = """ - %prog [options] ... - %prog [options] -r ... - %prog [options] [-e] ... - %prog [options] [-e] ... - %prog [options] ...""" - - summary = 'Build wheels from your requirements.' - - def __init__(self, *args, **kw): - super(WheelCommand, self).__init__(*args, **kw) - - cmd_opts = self.cmd_opts - - cmd_opts.add_option( - '-w', '--wheel-dir', - dest='wheel_dir', - metavar='dir', - default=os.curdir, - help=("Build wheels into , where the default is the " - "current working directory."), - ) - cmd_opts.add_option(cmdoptions.no_binary()) - cmd_opts.add_option(cmdoptions.only_binary()) - cmd_opts.add_option(cmdoptions.prefer_binary()) - cmd_opts.add_option( - '--build-option', - dest='build_options', - metavar='options', - action='append', - help="Extra arguments to be supplied to 'setup.py bdist_wheel'.", - ) - cmd_opts.add_option(cmdoptions.no_build_isolation()) - cmd_opts.add_option(cmdoptions.use_pep517()) - cmd_opts.add_option(cmdoptions.no_use_pep517()) - cmd_opts.add_option(cmdoptions.constraints()) - cmd_opts.add_option(cmdoptions.editable()) - cmd_opts.add_option(cmdoptions.requirements()) - cmd_opts.add_option(cmdoptions.src()) - cmd_opts.add_option(cmdoptions.ignore_requires_python()) - cmd_opts.add_option(cmdoptions.no_deps()) - cmd_opts.add_option(cmdoptions.build_dir()) - cmd_opts.add_option(cmdoptions.progress_bar()) - - cmd_opts.add_option( - '--global-option', - dest='global_options', - action='append', - metavar='options', - help="Extra global options to be supplied to the setup.py " - "call before the 'bdist_wheel' command.") - - cmd_opts.add_option( - '--pre', - action='store_true', - default=False, - help=("Include pre-release and development versions. By default, " - "pip only finds stable versions."), - ) - - cmd_opts.add_option(cmdoptions.no_clean()) - cmd_opts.add_option(cmdoptions.require_hashes()) - - index_opts = cmdoptions.make_option_group( - cmdoptions.index_group, - self.parser, - ) - - self.parser.insert_option_group(0, index_opts) - self.parser.insert_option_group(0, cmd_opts) - - def run(self, options, args): - cmdoptions.check_install_build_global(options) - - index_urls = [options.index_url] + options.extra_index_urls - if options.no_index: - logger.debug('Ignoring indexes: %s', ','.join(index_urls)) - index_urls = [] - - if options.build_dir: - options.build_dir = os.path.abspath(options.build_dir) - - options.src_dir = os.path.abspath(options.src_dir) - - with self._build_session(options) as session: - finder = self._build_package_finder(options, session) - build_delete = (not (options.no_clean or options.build_dir)) - wheel_cache = WheelCache(options.cache_dir, options.format_control) - - with RequirementTracker() as req_tracker, TempDirectory( - options.build_dir, delete=build_delete, kind="wheel" - ) as directory: - - requirement_set = RequirementSet( - require_hashes=options.require_hashes, - ) - - try: - self.populate_requirement_set( - requirement_set, args, options, finder, session, - self.name, wheel_cache - ) - - preparer = RequirementPreparer( - build_dir=directory.path, - src_dir=options.src_dir, - download_dir=None, - wheel_download_dir=options.wheel_dir, - progress_bar=options.progress_bar, - build_isolation=options.build_isolation, - req_tracker=req_tracker, - ) - - resolver = Resolver( - preparer=preparer, - finder=finder, - session=session, - wheel_cache=wheel_cache, - use_user_site=False, - upgrade_strategy="to-satisfy-only", - force_reinstall=False, - ignore_dependencies=options.ignore_dependencies, - ignore_requires_python=options.ignore_requires_python, - ignore_installed=True, - isolated=options.isolated_mode, - use_pep517=options.use_pep517 - ) - resolver.resolve(requirement_set) - - # build wheels - wb = WheelBuilder( - finder, preparer, wheel_cache, - build_options=options.build_options or [], - global_options=options.global_options or [], - no_clean=options.no_clean, - ) - build_failures = wb.build( - requirement_set.requirements.values(), session=session, - ) - if len(build_failures) != 0: - raise CommandError( - "Failed to build one or more wheels" - ) - except PreviousBuildDirError: - options.no_clean = True - raise - finally: - if not options.no_clean: - requirement_set.cleanup_files() - wheel_cache.cleanup() diff --git a/env/lib/python3.7/site-packages/pip/_internal/configuration.py b/env/lib/python3.7/site-packages/pip/_internal/configuration.py deleted file mode 100644 index b199fa7..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/configuration.py +++ /dev/null @@ -1,384 +0,0 @@ -"""Configuration management setup - -Some terminology: -- name - As written in config files. -- value - Value associated with a name -- key - Name combined with it's section (section.name) -- variant - A single word describing where the configuration key-value pair came from -""" - -import locale -import logging -import os - -from pip._vendor.six.moves import configparser - -from pip._internal.exceptions import ( - ConfigurationError, ConfigurationFileCouldNotBeLoaded, -) -from pip._internal.locations import ( - global_config_files, legacy_config_file, new_config_file, site_config_file, -) -from pip._internal.utils.misc import ensure_dir, enum -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import ( - Any, Dict, Iterable, List, NewType, Optional, Tuple - ) - - RawConfigParser = configparser.RawConfigParser # Shorthand - Kind = NewType("Kind", str) - -logger = logging.getLogger(__name__) - - -# NOTE: Maybe use the optionx attribute to normalize keynames. -def _normalize_name(name): - # type: (str) -> str - """Make a name consistent regardless of source (environment or file) - """ - name = name.lower().replace('_', '-') - if name.startswith('--'): - name = name[2:] # only prefer long opts - return name - - -def _disassemble_key(name): - # type: (str) -> List[str] - return name.split(".", 1) - - -# The kinds of configurations there are. -kinds = enum( - USER="user", # User Specific - GLOBAL="global", # System Wide - SITE="site", # [Virtual] Environment Specific - ENV="env", # from PIP_CONFIG_FILE - ENV_VAR="env-var", # from Environment Variables -) - - -class Configuration(object): - """Handles management of configuration. - - Provides an interface to accessing and managing configuration files. - - This class converts provides an API that takes "section.key-name" style - keys and stores the value associated with it as "key-name" under the - section "section". - - This allows for a clean interface wherein the both the section and the - key-name are preserved in an easy to manage form in the configuration files - and the data stored is also nice. - """ - - def __init__(self, isolated, load_only=None): - # type: (bool, Kind) -> None - super(Configuration, self).__init__() - - _valid_load_only = [kinds.USER, kinds.GLOBAL, kinds.SITE, None] - if load_only not in _valid_load_only: - raise ConfigurationError( - "Got invalid value for load_only - should be one of {}".format( - ", ".join(map(repr, _valid_load_only[:-1])) - ) - ) - self.isolated = isolated # type: bool - self.load_only = load_only # type: Optional[Kind] - - # The order here determines the override order. - self._override_order = [ - kinds.GLOBAL, kinds.USER, kinds.SITE, kinds.ENV, kinds.ENV_VAR - ] - - self._ignore_env_names = ["version", "help"] - - # Because we keep track of where we got the data from - self._parsers = { - variant: [] for variant in self._override_order - } # type: Dict[Kind, List[Tuple[str, RawConfigParser]]] - self._config = { - variant: {} for variant in self._override_order - } # type: Dict[Kind, Dict[str, Any]] - self._modified_parsers = [] # type: List[Tuple[str, RawConfigParser]] - - def load(self): - # type: () -> None - """Loads configuration from configuration files and environment - """ - self._load_config_files() - if not self.isolated: - self._load_environment_vars() - - def get_file_to_edit(self): - # type: () -> Optional[str] - """Returns the file with highest priority in configuration - """ - assert self.load_only is not None, \ - "Need to be specified a file to be editing" - - try: - return self._get_parser_to_modify()[0] - except IndexError: - return None - - def items(self): - # type: () -> Iterable[Tuple[str, Any]] - """Returns key-value pairs like dict.items() representing the loaded - configuration - """ - return self._dictionary.items() - - def get_value(self, key): - # type: (str) -> Any - """Get a value from the configuration. - """ - try: - return self._dictionary[key] - except KeyError: - raise ConfigurationError("No such key - {}".format(key)) - - def set_value(self, key, value): - # type: (str, Any) -> None - """Modify a value in the configuration. - """ - self._ensure_have_load_only() - - fname, parser = self._get_parser_to_modify() - - if parser is not None: - section, name = _disassemble_key(key) - - # Modify the parser and the configuration - if not parser.has_section(section): - parser.add_section(section) - parser.set(section, name, value) - - self._config[self.load_only][key] = value - self._mark_as_modified(fname, parser) - - def unset_value(self, key): - # type: (str) -> None - """Unset a value in the configuration. - """ - self._ensure_have_load_only() - - if key not in self._config[self.load_only]: - raise ConfigurationError("No such key - {}".format(key)) - - fname, parser = self._get_parser_to_modify() - - if parser is not None: - section, name = _disassemble_key(key) - - # Remove the key in the parser - modified_something = False - if parser.has_section(section): - # Returns whether the option was removed or not - modified_something = parser.remove_option(section, name) - - if modified_something: - # name removed from parser, section may now be empty - section_iter = iter(parser.items(section)) - try: - val = next(section_iter) - except StopIteration: - val = None - - if val is None: - parser.remove_section(section) - - self._mark_as_modified(fname, parser) - else: - raise ConfigurationError( - "Fatal Internal error [id=1]. Please report as a bug." - ) - - del self._config[self.load_only][key] - - def save(self): - # type: () -> None - """Save the current in-memory state. - """ - self._ensure_have_load_only() - - for fname, parser in self._modified_parsers: - logger.info("Writing to %s", fname) - - # Ensure directory exists. - ensure_dir(os.path.dirname(fname)) - - with open(fname, "w") as f: - parser.write(f) - - # - # Private routines - # - - def _ensure_have_load_only(self): - # type: () -> None - if self.load_only is None: - raise ConfigurationError("Needed a specific file to be modifying.") - logger.debug("Will be working with %s variant only", self.load_only) - - @property - def _dictionary(self): - # type: () -> Dict[str, Any] - """A dictionary representing the loaded configuration. - """ - # NOTE: Dictionaries are not populated if not loaded. So, conditionals - # are not needed here. - retval = {} - - for variant in self._override_order: - retval.update(self._config[variant]) - - return retval - - def _load_config_files(self): - # type: () -> None - """Loads configuration from configuration files - """ - config_files = dict(self._iter_config_files()) - if config_files[kinds.ENV][0:1] == [os.devnull]: - logger.debug( - "Skipping loading configuration files due to " - "environment's PIP_CONFIG_FILE being os.devnull" - ) - return - - for variant, files in config_files.items(): - for fname in files: - # If there's specific variant set in `load_only`, load only - # that variant, not the others. - if self.load_only is not None and variant != self.load_only: - logger.debug( - "Skipping file '%s' (variant: %s)", fname, variant - ) - continue - - parser = self._load_file(variant, fname) - - # Keeping track of the parsers used - self._parsers[variant].append((fname, parser)) - - def _load_file(self, variant, fname): - # type: (Kind, str) -> RawConfigParser - logger.debug("For variant '%s', will try loading '%s'", variant, fname) - parser = self._construct_parser(fname) - - for section in parser.sections(): - items = parser.items(section) - self._config[variant].update(self._normalized_keys(section, items)) - - return parser - - def _construct_parser(self, fname): - # type: (str) -> RawConfigParser - parser = configparser.RawConfigParser() - # If there is no such file, don't bother reading it but create the - # parser anyway, to hold the data. - # Doing this is useful when modifying and saving files, where we don't - # need to construct a parser. - if os.path.exists(fname): - try: - parser.read(fname) - except UnicodeDecodeError: - # See https://github.com/pypa/pip/issues/4963 - raise ConfigurationFileCouldNotBeLoaded( - reason="contains invalid {} characters".format( - locale.getpreferredencoding(False) - ), - fname=fname, - ) - except configparser.Error as error: - # See https://github.com/pypa/pip/issues/4893 - raise ConfigurationFileCouldNotBeLoaded(error=error) - return parser - - def _load_environment_vars(self): - # type: () -> None - """Loads configuration from environment variables - """ - self._config[kinds.ENV_VAR].update( - self._normalized_keys(":env:", self._get_environ_vars()) - ) - - def _normalized_keys(self, section, items): - # type: (str, Iterable[Tuple[str, Any]]) -> Dict[str, Any] - """Normalizes items to construct a dictionary with normalized keys. - - This routine is where the names become keys and are made the same - regardless of source - configuration files or environment. - """ - normalized = {} - for name, val in items: - key = section + "." + _normalize_name(name) - normalized[key] = val - return normalized - - def _get_environ_vars(self): - # type: () -> Iterable[Tuple[str, str]] - """Returns a generator with all environmental vars with prefix PIP_""" - for key, val in os.environ.items(): - should_be_yielded = ( - key.startswith("PIP_") and - key[4:].lower() not in self._ignore_env_names - ) - if should_be_yielded: - yield key[4:].lower(), val - - # XXX: This is patched in the tests. - def _iter_config_files(self): - # type: () -> Iterable[Tuple[Kind, List[str]]] - """Yields variant and configuration files associated with it. - - This should be treated like items of a dictionary. - """ - # SMELL: Move the conditions out of this function - - # environment variables have the lowest priority - config_file = os.environ.get('PIP_CONFIG_FILE', None) - if config_file is not None: - yield kinds.ENV, [config_file] - else: - yield kinds.ENV, [] - - # at the base we have any global configuration - yield kinds.GLOBAL, list(global_config_files) - - # per-user configuration next - should_load_user_config = not self.isolated and not ( - config_file and os.path.exists(config_file) - ) - if should_load_user_config: - # The legacy config file is overridden by the new config file - yield kinds.USER, [legacy_config_file, new_config_file] - - # finally virtualenv configuration first trumping others - yield kinds.SITE, [site_config_file] - - def _get_parser_to_modify(self): - # type: () -> Tuple[str, RawConfigParser] - # Determine which parser to modify - parsers = self._parsers[self.load_only] - if not parsers: - # This should not happen if everything works correctly. - raise ConfigurationError( - "Fatal Internal error [id=2]. Please report as a bug." - ) - - # Use the highest priority parser. - return parsers[-1] - - # XXX: This is patched in the tests. - def _mark_as_modified(self, fname, parser): - # type: (str, RawConfigParser) -> None - file_parser_tuple = (fname, parser) - if file_parser_tuple not in self._modified_parsers: - self._modified_parsers.append(file_parser_tuple) diff --git a/env/lib/python3.7/site-packages/pip/_internal/download.py b/env/lib/python3.7/site-packages/pip/_internal/download.py deleted file mode 100644 index 2683cf0..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/download.py +++ /dev/null @@ -1,979 +0,0 @@ -from __future__ import absolute_import - -import cgi -import email.utils -import getpass -import json -import logging -import mimetypes -import os -import platform -import re -import shutil -import sys - -from pip._vendor import requests, six, urllib3 -from pip._vendor.cachecontrol import CacheControlAdapter -from pip._vendor.cachecontrol.caches import FileCache -from pip._vendor.lockfile import LockError -from pip._vendor.requests.adapters import BaseAdapter, HTTPAdapter -from pip._vendor.requests.auth import AuthBase, HTTPBasicAuth -from pip._vendor.requests.models import CONTENT_CHUNK_SIZE, Response -from pip._vendor.requests.structures import CaseInsensitiveDict -from pip._vendor.requests.utils import get_netrc_auth -# NOTE: XMLRPC Client is not annotated in typeshed as on 2017-07-17, which is -# why we ignore the type on this import -from pip._vendor.six.moves import xmlrpc_client # type: ignore -from pip._vendor.six.moves.urllib import parse as urllib_parse -from pip._vendor.six.moves.urllib import request as urllib_request -from pip._vendor.urllib3.util import IS_PYOPENSSL - -import pip -from pip._internal.exceptions import HashMismatch, InstallationError -from pip._internal.locations import write_delete_marker_file -from pip._internal.models.index import PyPI -from pip._internal.utils.encoding import auto_decode -from pip._internal.utils.filesystem import check_path_owner -from pip._internal.utils.glibc import libc_ver -from pip._internal.utils.misc import ( - ARCHIVE_EXTENSIONS, ask_path_exists, backup_dir, consume, display_path, - format_size, get_installed_version, rmtree, split_auth_from_netloc, - splitext, unpack_file, -) -from pip._internal.utils.temp_dir import TempDirectory -from pip._internal.utils.typing import MYPY_CHECK_RUNNING -from pip._internal.utils.ui import DownloadProgressProvider -from pip._internal.vcs import vcs - -if MYPY_CHECK_RUNNING: - from typing import ( - Optional, Tuple, Dict, IO, Text, Union - ) - from pip._internal.models.link import Link - from pip._internal.utils.hashes import Hashes - from pip._internal.vcs import AuthInfo - -try: - import ssl # noqa -except ImportError: - ssl = None - -HAS_TLS = (ssl is not None) or IS_PYOPENSSL - -__all__ = ['get_file_content', - 'is_url', 'url_to_path', 'path_to_url', - 'is_archive_file', 'unpack_vcs_link', - 'unpack_file_url', 'is_vcs_url', 'is_file_url', - 'unpack_http_url', 'unpack_url'] - - -logger = logging.getLogger(__name__) - - -# These are environment variables present when running under various -# CI systems. For each variable, some CI systems that use the variable -# are indicated. The collection was chosen so that for each of a number -# of popular systems, at least one of the environment variables is used. -# This list is used to provide some indication of and lower bound for -# CI traffic to PyPI. Thus, it is okay if the list is not comprehensive. -# For more background, see: https://github.com/pypa/pip/issues/5499 -CI_ENVIRONMENT_VARIABLES = ( - # Azure Pipelines - 'BUILD_BUILDID', - # Jenkins - 'BUILD_ID', - # AppVeyor, CircleCI, Codeship, Gitlab CI, Shippable, Travis CI - 'CI', -) - - -def looks_like_ci(): - # type: () -> bool - """ - Return whether it looks like pip is running under CI. - """ - # We don't use the method of checking for a tty (e.g. using isatty()) - # because some CI systems mimic a tty (e.g. Travis CI). Thus that - # method doesn't provide definitive information in either direction. - return any(name in os.environ for name in CI_ENVIRONMENT_VARIABLES) - - -def user_agent(): - """ - Return a string representing the user agent. - """ - data = { - "installer": {"name": "pip", "version": pip.__version__}, - "python": platform.python_version(), - "implementation": { - "name": platform.python_implementation(), - }, - } - - if data["implementation"]["name"] == 'CPython': - data["implementation"]["version"] = platform.python_version() - elif data["implementation"]["name"] == 'PyPy': - if sys.pypy_version_info.releaselevel == 'final': - pypy_version_info = sys.pypy_version_info[:3] - else: - pypy_version_info = sys.pypy_version_info - data["implementation"]["version"] = ".".join( - [str(x) for x in pypy_version_info] - ) - elif data["implementation"]["name"] == 'Jython': - # Complete Guess - data["implementation"]["version"] = platform.python_version() - elif data["implementation"]["name"] == 'IronPython': - # Complete Guess - data["implementation"]["version"] = platform.python_version() - - if sys.platform.startswith("linux"): - from pip._vendor import distro - distro_infos = dict(filter( - lambda x: x[1], - zip(["name", "version", "id"], distro.linux_distribution()), - )) - libc = dict(filter( - lambda x: x[1], - zip(["lib", "version"], libc_ver()), - )) - if libc: - distro_infos["libc"] = libc - if distro_infos: - data["distro"] = distro_infos - - if sys.platform.startswith("darwin") and platform.mac_ver()[0]: - data["distro"] = {"name": "macOS", "version": platform.mac_ver()[0]} - - if platform.system(): - data.setdefault("system", {})["name"] = platform.system() - - if platform.release(): - data.setdefault("system", {})["release"] = platform.release() - - if platform.machine(): - data["cpu"] = platform.machine() - - if HAS_TLS: - data["openssl_version"] = ssl.OPENSSL_VERSION - - setuptools_version = get_installed_version("setuptools") - if setuptools_version is not None: - data["setuptools_version"] = setuptools_version - - # Use None rather than False so as not to give the impression that - # pip knows it is not being run under CI. Rather, it is a null or - # inconclusive result. Also, we include some value rather than no - # value to make it easier to know that the check has been run. - data["ci"] = True if looks_like_ci() else None - - user_data = os.environ.get("PIP_USER_AGENT_USER_DATA") - if user_data is not None: - data["user_data"] = user_data - - return "{data[installer][name]}/{data[installer][version]} {json}".format( - data=data, - json=json.dumps(data, separators=(",", ":"), sort_keys=True), - ) - - -class MultiDomainBasicAuth(AuthBase): - - def __init__(self, prompting=True): - # type: (bool) -> None - self.prompting = prompting - self.passwords = {} # type: Dict[str, AuthInfo] - - def __call__(self, req): - parsed = urllib_parse.urlparse(req.url) - - # Split the credentials from the netloc. - netloc, url_user_password = split_auth_from_netloc(parsed.netloc) - - # Set the url of the request to the url without any credentials - req.url = urllib_parse.urlunparse(parsed[:1] + (netloc,) + parsed[2:]) - - # Use any stored credentials that we have for this netloc - username, password = self.passwords.get(netloc, (None, None)) - - # Use the credentials embedded in the url if we have none stored - if username is None: - username, password = url_user_password - - # Get creds from netrc if we still don't have them - if username is None and password is None: - netrc_auth = get_netrc_auth(req.url) - username, password = netrc_auth if netrc_auth else (None, None) - - if username or password: - # Store the username and password - self.passwords[netloc] = (username, password) - - # Send the basic auth with this request - req = HTTPBasicAuth(username or "", password or "")(req) - - # Attach a hook to handle 401 responses - req.register_hook("response", self.handle_401) - - return req - - def handle_401(self, resp, **kwargs): - # We only care about 401 responses, anything else we want to just - # pass through the actual response - if resp.status_code != 401: - return resp - - # We are not able to prompt the user so simply return the response - if not self.prompting: - return resp - - parsed = urllib_parse.urlparse(resp.url) - - # Prompt the user for a new username and password - username = six.moves.input("User for %s: " % parsed.netloc) - password = getpass.getpass("Password: ") - - # Store the new username and password to use for future requests - if username or password: - self.passwords[parsed.netloc] = (username, password) - - # Consume content and release the original connection to allow our new - # request to reuse the same one. - resp.content - resp.raw.release_conn() - - # Add our new username and password to the request - req = HTTPBasicAuth(username or "", password or "")(resp.request) - req.register_hook("response", self.warn_on_401) - - # Send our new request - new_resp = resp.connection.send(req, **kwargs) - new_resp.history.append(resp) - - return new_resp - - def warn_on_401(self, resp, **kwargs): - # warn user that they provided incorrect credentials - if resp.status_code == 401: - logger.warning('401 Error, Credentials not correct for %s', - resp.request.url) - - -class LocalFSAdapter(BaseAdapter): - - def send(self, request, stream=None, timeout=None, verify=None, cert=None, - proxies=None): - pathname = url_to_path(request.url) - - resp = Response() - resp.status_code = 200 - resp.url = request.url - - try: - stats = os.stat(pathname) - except OSError as exc: - resp.status_code = 404 - resp.raw = exc - else: - modified = email.utils.formatdate(stats.st_mtime, usegmt=True) - content_type = mimetypes.guess_type(pathname)[0] or "text/plain" - resp.headers = CaseInsensitiveDict({ - "Content-Type": content_type, - "Content-Length": stats.st_size, - "Last-Modified": modified, - }) - - resp.raw = open(pathname, "rb") - resp.close = resp.raw.close - - return resp - - def close(self): - pass - - -class SafeFileCache(FileCache): - """ - A file based cache which is safe to use even when the target directory may - not be accessible or writable. - """ - - def __init__(self, *args, **kwargs): - super(SafeFileCache, self).__init__(*args, **kwargs) - - # Check to ensure that the directory containing our cache directory - # is owned by the user current executing pip. If it does not exist - # we will check the parent directory until we find one that does exist. - # If it is not owned by the user executing pip then we will disable - # the cache and log a warning. - if not check_path_owner(self.directory): - logger.warning( - "The directory '%s' or its parent directory is not owned by " - "the current user and the cache has been disabled. Please " - "check the permissions and owner of that directory. If " - "executing pip with sudo, you may want sudo's -H flag.", - self.directory, - ) - - # Set our directory to None to disable the Cache - self.directory = None - - def get(self, *args, **kwargs): - # If we don't have a directory, then the cache should be a no-op. - if self.directory is None: - return - - try: - return super(SafeFileCache, self).get(*args, **kwargs) - except (LockError, OSError, IOError): - # We intentionally silence this error, if we can't access the cache - # then we can just skip caching and process the request as if - # caching wasn't enabled. - pass - - def set(self, *args, **kwargs): - # If we don't have a directory, then the cache should be a no-op. - if self.directory is None: - return - - try: - return super(SafeFileCache, self).set(*args, **kwargs) - except (LockError, OSError, IOError): - # We intentionally silence this error, if we can't access the cache - # then we can just skip caching and process the request as if - # caching wasn't enabled. - pass - - def delete(self, *args, **kwargs): - # If we don't have a directory, then the cache should be a no-op. - if self.directory is None: - return - - try: - return super(SafeFileCache, self).delete(*args, **kwargs) - except (LockError, OSError, IOError): - # We intentionally silence this error, if we can't access the cache - # then we can just skip caching and process the request as if - # caching wasn't enabled. - pass - - -class InsecureHTTPAdapter(HTTPAdapter): - - def cert_verify(self, conn, url, verify, cert): - conn.cert_reqs = 'CERT_NONE' - conn.ca_certs = None - - -class PipSession(requests.Session): - - timeout = None # type: Optional[int] - - def __init__(self, *args, **kwargs): - retries = kwargs.pop("retries", 0) - cache = kwargs.pop("cache", None) - insecure_hosts = kwargs.pop("insecure_hosts", []) - - super(PipSession, self).__init__(*args, **kwargs) - - # Attach our User Agent to the request - self.headers["User-Agent"] = user_agent() - - # Attach our Authentication handler to the session - self.auth = MultiDomainBasicAuth() - - # Create our urllib3.Retry instance which will allow us to customize - # how we handle retries. - retries = urllib3.Retry( - # Set the total number of retries that a particular request can - # have. - total=retries, - - # A 503 error from PyPI typically means that the Fastly -> Origin - # connection got interrupted in some way. A 503 error in general - # is typically considered a transient error so we'll go ahead and - # retry it. - # A 500 may indicate transient error in Amazon S3 - # A 520 or 527 - may indicate transient error in CloudFlare - status_forcelist=[500, 503, 520, 527], - - # Add a small amount of back off between failed requests in - # order to prevent hammering the service. - backoff_factor=0.25, - ) - - # We want to _only_ cache responses on securely fetched origins. We do - # this because we can't validate the response of an insecurely fetched - # origin, and we don't want someone to be able to poison the cache and - # require manual eviction from the cache to fix it. - if cache: - secure_adapter = CacheControlAdapter( - cache=SafeFileCache(cache, use_dir_lock=True), - max_retries=retries, - ) - else: - secure_adapter = HTTPAdapter(max_retries=retries) - - # Our Insecure HTTPAdapter disables HTTPS validation. It does not - # support caching (see above) so we'll use it for all http:// URLs as - # well as any https:// host that we've marked as ignoring TLS errors - # for. - insecure_adapter = InsecureHTTPAdapter(max_retries=retries) - - self.mount("https://", secure_adapter) - self.mount("http://", insecure_adapter) - - # Enable file:// urls - self.mount("file://", LocalFSAdapter()) - - # We want to use a non-validating adapter for any requests which are - # deemed insecure. - for host in insecure_hosts: - self.mount("https://{}/".format(host), insecure_adapter) - - def request(self, method, url, *args, **kwargs): - # Allow setting a default timeout on a session - kwargs.setdefault("timeout", self.timeout) - - # Dispatch the actual request - return super(PipSession, self).request(method, url, *args, **kwargs) - - -def get_file_content(url, comes_from=None, session=None): - # type: (str, Optional[str], Optional[PipSession]) -> Tuple[str, Text] - """Gets the content of a file; it may be a filename, file: URL, or - http: URL. Returns (location, content). Content is unicode. - - :param url: File path or url. - :param comes_from: Origin description of requirements. - :param session: Instance of pip.download.PipSession. - """ - if session is None: - raise TypeError( - "get_file_content() missing 1 required keyword argument: 'session'" - ) - - match = _scheme_re.search(url) - if match: - scheme = match.group(1).lower() - if (scheme == 'file' and comes_from and - comes_from.startswith('http')): - raise InstallationError( - 'Requirements file %s references URL %s, which is local' - % (comes_from, url)) - if scheme == 'file': - path = url.split(':', 1)[1] - path = path.replace('\\', '/') - match = _url_slash_drive_re.match(path) - if match: - path = match.group(1) + ':' + path.split('|', 1)[1] - path = urllib_parse.unquote(path) - if path.startswith('/'): - path = '/' + path.lstrip('/') - url = path - else: - # FIXME: catch some errors - resp = session.get(url) - resp.raise_for_status() - return resp.url, resp.text - try: - with open(url, 'rb') as f: - content = auto_decode(f.read()) - except IOError as exc: - raise InstallationError( - 'Could not open requirements file: %s' % str(exc) - ) - return url, content - - -_scheme_re = re.compile(r'^(http|https|file):', re.I) -_url_slash_drive_re = re.compile(r'/*([a-z])\|', re.I) - - -def is_url(name): - # type: (Union[str, Text]) -> bool - """Returns true if the name looks like a URL""" - if ':' not in name: - return False - scheme = name.split(':', 1)[0].lower() - return scheme in ['http', 'https', 'file', 'ftp'] + vcs.all_schemes - - -def url_to_path(url): - # type: (str) -> str - """ - Convert a file: URL to a path. - """ - assert url.startswith('file:'), ( - "You can only turn file: urls into filenames (not %r)" % url) - - _, netloc, path, _, _ = urllib_parse.urlsplit(url) - - if not netloc or netloc == 'localhost': - # According to RFC 8089, same as empty authority. - netloc = '' - elif sys.platform == 'win32': - # If we have a UNC path, prepend UNC share notation. - netloc = '\\\\' + netloc - else: - raise ValueError( - 'non-local file URIs are not supported on this platform: %r' - % url - ) - - path = urllib_request.url2pathname(netloc + path) - return path - - -def path_to_url(path): - # type: (Union[str, Text]) -> str - """ - Convert a path to a file: URL. The path will be made absolute and have - quoted path parts. - """ - path = os.path.normpath(os.path.abspath(path)) - url = urllib_parse.urljoin('file:', urllib_request.pathname2url(path)) - return url - - -def is_archive_file(name): - # type: (str) -> bool - """Return True if `name` is a considered as an archive file.""" - ext = splitext(name)[1].lower() - if ext in ARCHIVE_EXTENSIONS: - return True - return False - - -def unpack_vcs_link(link, location): - vcs_backend = _get_used_vcs_backend(link) - vcs_backend.unpack(location) - - -def _get_used_vcs_backend(link): - for backend in vcs.backends: - if link.scheme in backend.schemes: - vcs_backend = backend(link.url) - return vcs_backend - - -def is_vcs_url(link): - # type: (Link) -> bool - return bool(_get_used_vcs_backend(link)) - - -def is_file_url(link): - # type: (Link) -> bool - return link.url.lower().startswith('file:') - - -def is_dir_url(link): - # type: (Link) -> bool - """Return whether a file:// Link points to a directory. - - ``link`` must not have any other scheme but file://. Call is_file_url() - first. - - """ - link_path = url_to_path(link.url_without_fragment) - return os.path.isdir(link_path) - - -def _progress_indicator(iterable, *args, **kwargs): - return iterable - - -def _download_url( - resp, # type: Response - link, # type: Link - content_file, # type: IO - hashes, # type: Hashes - progress_bar # type: str -): - # type: (...) -> None - try: - total_length = int(resp.headers['content-length']) - except (ValueError, KeyError, TypeError): - total_length = 0 - - cached_resp = getattr(resp, "from_cache", False) - if logger.getEffectiveLevel() > logging.INFO: - show_progress = False - elif cached_resp: - show_progress = False - elif total_length > (40 * 1000): - show_progress = True - elif not total_length: - show_progress = True - else: - show_progress = False - - show_url = link.show_url - - def resp_read(chunk_size): - try: - # Special case for urllib3. - for chunk in resp.raw.stream( - chunk_size, - # We use decode_content=False here because we don't - # want urllib3 to mess with the raw bytes we get - # from the server. If we decompress inside of - # urllib3 then we cannot verify the checksum - # because the checksum will be of the compressed - # file. This breakage will only occur if the - # server adds a Content-Encoding header, which - # depends on how the server was configured: - # - Some servers will notice that the file isn't a - # compressible file and will leave the file alone - # and with an empty Content-Encoding - # - Some servers will notice that the file is - # already compressed and will leave the file - # alone and will add a Content-Encoding: gzip - # header - # - Some servers won't notice anything at all and - # will take a file that's already been compressed - # and compress it again and set the - # Content-Encoding: gzip header - # - # By setting this not to decode automatically we - # hope to eliminate problems with the second case. - decode_content=False): - yield chunk - except AttributeError: - # Standard file-like object. - while True: - chunk = resp.raw.read(chunk_size) - if not chunk: - break - yield chunk - - def written_chunks(chunks): - for chunk in chunks: - content_file.write(chunk) - yield chunk - - progress_indicator = _progress_indicator - - if link.netloc == PyPI.netloc: - url = show_url - else: - url = link.url_without_fragment - - if show_progress: # We don't show progress on cached responses - progress_indicator = DownloadProgressProvider(progress_bar, - max=total_length) - if total_length: - logger.info("Downloading %s (%s)", url, format_size(total_length)) - else: - logger.info("Downloading %s", url) - elif cached_resp: - logger.info("Using cached %s", url) - else: - logger.info("Downloading %s", url) - - logger.debug('Downloading from URL %s', link) - - downloaded_chunks = written_chunks( - progress_indicator( - resp_read(CONTENT_CHUNK_SIZE), - CONTENT_CHUNK_SIZE - ) - ) - if hashes: - hashes.check_against_chunks(downloaded_chunks) - else: - consume(downloaded_chunks) - - -def _copy_file(filename, location, link): - copy = True - download_location = os.path.join(location, link.filename) - if os.path.exists(download_location): - response = ask_path_exists( - 'The file %s exists. (i)gnore, (w)ipe, (b)ackup, (a)abort' % - display_path(download_location), ('i', 'w', 'b', 'a')) - if response == 'i': - copy = False - elif response == 'w': - logger.warning('Deleting %s', display_path(download_location)) - os.remove(download_location) - elif response == 'b': - dest_file = backup_dir(download_location) - logger.warning( - 'Backing up %s to %s', - display_path(download_location), - display_path(dest_file), - ) - shutil.move(download_location, dest_file) - elif response == 'a': - sys.exit(-1) - if copy: - shutil.copy(filename, download_location) - logger.info('Saved %s', display_path(download_location)) - - -def unpack_http_url( - link, # type: Link - location, # type: str - download_dir=None, # type: Optional[str] - session=None, # type: Optional[PipSession] - hashes=None, # type: Optional[Hashes] - progress_bar="on" # type: str -): - # type: (...) -> None - if session is None: - raise TypeError( - "unpack_http_url() missing 1 required keyword argument: 'session'" - ) - - with TempDirectory(kind="unpack") as temp_dir: - # If a download dir is specified, is the file already downloaded there? - already_downloaded_path = None - if download_dir: - already_downloaded_path = _check_download_dir(link, - download_dir, - hashes) - - if already_downloaded_path: - from_path = already_downloaded_path - content_type = mimetypes.guess_type(from_path)[0] - else: - # let's download to a tmp dir - from_path, content_type = _download_http_url(link, - session, - temp_dir.path, - hashes, - progress_bar) - - # unpack the archive to the build dir location. even when only - # downloading archives, they have to be unpacked to parse dependencies - unpack_file(from_path, location, content_type, link) - - # a download dir is specified; let's copy the archive there - if download_dir and not already_downloaded_path: - _copy_file(from_path, download_dir, link) - - if not already_downloaded_path: - os.unlink(from_path) - - -def unpack_file_url( - link, # type: Link - location, # type: str - download_dir=None, # type: Optional[str] - hashes=None # type: Optional[Hashes] -): - # type: (...) -> None - """Unpack link into location. - - If download_dir is provided and link points to a file, make a copy - of the link file inside download_dir. - """ - link_path = url_to_path(link.url_without_fragment) - - # If it's a url to a local directory - if is_dir_url(link): - if os.path.isdir(location): - rmtree(location) - shutil.copytree(link_path, location, symlinks=True) - if download_dir: - logger.info('Link is a directory, ignoring download_dir') - return - - # If --require-hashes is off, `hashes` is either empty, the - # link's embedded hash, or MissingHashes; it is required to - # match. If --require-hashes is on, we are satisfied by any - # hash in `hashes` matching: a URL-based or an option-based - # one; no internet-sourced hash will be in `hashes`. - if hashes: - hashes.check_against_path(link_path) - - # If a download dir is specified, is the file already there and valid? - already_downloaded_path = None - if download_dir: - already_downloaded_path = _check_download_dir(link, - download_dir, - hashes) - - if already_downloaded_path: - from_path = already_downloaded_path - else: - from_path = link_path - - content_type = mimetypes.guess_type(from_path)[0] - - # unpack the archive to the build dir location. even when only downloading - # archives, they have to be unpacked to parse dependencies - unpack_file(from_path, location, content_type, link) - - # a download dir is specified and not already downloaded - if download_dir and not already_downloaded_path: - _copy_file(from_path, download_dir, link) - - -class PipXmlrpcTransport(xmlrpc_client.Transport): - """Provide a `xmlrpclib.Transport` implementation via a `PipSession` - object. - """ - - def __init__(self, index_url, session, use_datetime=False): - xmlrpc_client.Transport.__init__(self, use_datetime) - index_parts = urllib_parse.urlparse(index_url) - self._scheme = index_parts.scheme - self._session = session - - def request(self, host, handler, request_body, verbose=False): - parts = (self._scheme, host, handler, None, None, None) - url = urllib_parse.urlunparse(parts) - try: - headers = {'Content-Type': 'text/xml'} - response = self._session.post(url, data=request_body, - headers=headers, stream=True) - response.raise_for_status() - self.verbose = verbose - return self.parse_response(response.raw) - except requests.HTTPError as exc: - logger.critical( - "HTTP error %s while getting %s", - exc.response.status_code, url, - ) - raise - - -def unpack_url( - link, # type: Optional[Link] - location, # type: Optional[str] - download_dir=None, # type: Optional[str] - only_download=False, # type: bool - session=None, # type: Optional[PipSession] - hashes=None, # type: Optional[Hashes] - progress_bar="on" # type: str -): - # type: (...) -> None - """Unpack link. - If link is a VCS link: - if only_download, export into download_dir and ignore location - else unpack into location - for other types of link: - - unpack into location - - if download_dir, copy the file into download_dir - - if only_download, mark location for deletion - - :param hashes: A Hashes object, one of whose embedded hashes must match, - or HashMismatch will be raised. If the Hashes is empty, no matches are - required, and unhashable types of requirements (like VCS ones, which - would ordinarily raise HashUnsupported) are allowed. - """ - # non-editable vcs urls - if is_vcs_url(link): - unpack_vcs_link(link, location) - - # file urls - elif is_file_url(link): - unpack_file_url(link, location, download_dir, hashes=hashes) - - # http urls - else: - if session is None: - session = PipSession() - - unpack_http_url( - link, - location, - download_dir, - session, - hashes=hashes, - progress_bar=progress_bar - ) - if only_download: - write_delete_marker_file(location) - - -def _download_http_url( - link, # type: Link - session, # type: PipSession - temp_dir, # type: str - hashes, # type: Hashes - progress_bar # type: str -): - # type: (...) -> Tuple[str, str] - """Download link url into temp_dir using provided session""" - target_url = link.url.split('#', 1)[0] - try: - resp = session.get( - target_url, - # We use Accept-Encoding: identity here because requests - # defaults to accepting compressed responses. This breaks in - # a variety of ways depending on how the server is configured. - # - Some servers will notice that the file isn't a compressible - # file and will leave the file alone and with an empty - # Content-Encoding - # - Some servers will notice that the file is already - # compressed and will leave the file alone and will add a - # Content-Encoding: gzip header - # - Some servers won't notice anything at all and will take - # a file that's already been compressed and compress it again - # and set the Content-Encoding: gzip header - # By setting this to request only the identity encoding We're - # hoping to eliminate the third case. Hopefully there does not - # exist a server which when given a file will notice it is - # already compressed and that you're not asking for a - # compressed file and will then decompress it before sending - # because if that's the case I don't think it'll ever be - # possible to make this work. - headers={"Accept-Encoding": "identity"}, - stream=True, - ) - resp.raise_for_status() - except requests.HTTPError as exc: - logger.critical( - "HTTP error %s while getting %s", exc.response.status_code, link, - ) - raise - - content_type = resp.headers.get('content-type', '') - filename = link.filename # fallback - # Have a look at the Content-Disposition header for a better guess - content_disposition = resp.headers.get('content-disposition') - if content_disposition: - type, params = cgi.parse_header(content_disposition) - # We use ``or`` here because we don't want to use an "empty" value - # from the filename param. - filename = params.get('filename') or filename - ext = splitext(filename)[1] - if not ext: - ext = mimetypes.guess_extension(content_type) - if ext: - filename += ext - if not ext and link.url != resp.url: - ext = os.path.splitext(resp.url)[1] - if ext: - filename += ext - file_path = os.path.join(temp_dir, filename) - with open(file_path, 'wb') as content_file: - _download_url(resp, link, content_file, hashes, progress_bar) - return file_path, content_type - - -def _check_download_dir(link, download_dir, hashes): - # type: (Link, str, Hashes) -> Optional[str] - """ Check download_dir for previously downloaded file with correct hash - If a correct file is found return its path else None - """ - download_path = os.path.join(download_dir, link.filename) - if os.path.exists(download_path): - # If already downloaded, does its hash match? - logger.info('File was already downloaded %s', download_path) - if hashes: - try: - hashes.check_against_path(download_path) - except HashMismatch: - logger.warning( - 'Previously-downloaded file %s has bad hash. ' - 'Re-downloading.', - download_path - ) - os.unlink(download_path) - return None - return download_path - return None diff --git a/env/lib/python3.7/site-packages/pip/_internal/exceptions.py b/env/lib/python3.7/site-packages/pip/_internal/exceptions.py deleted file mode 100644 index 7b291a1..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/exceptions.py +++ /dev/null @@ -1,274 +0,0 @@ -"""Exceptions used throughout package""" -from __future__ import absolute_import - -from itertools import chain, groupby, repeat - -from pip._vendor.six import iteritems - -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Optional - from pip._internal.req.req_install import InstallRequirement - - -class PipError(Exception): - """Base pip exception""" - - -class ConfigurationError(PipError): - """General exception in configuration""" - - -class InstallationError(PipError): - """General exception during installation""" - - -class UninstallationError(PipError): - """General exception during uninstallation""" - - -class DistributionNotFound(InstallationError): - """Raised when a distribution cannot be found to satisfy a requirement""" - - -class RequirementsFileParseError(InstallationError): - """Raised when a general error occurs parsing a requirements file line.""" - - -class BestVersionAlreadyInstalled(PipError): - """Raised when the most up-to-date version of a package is already - installed.""" - - -class BadCommand(PipError): - """Raised when virtualenv or a command is not found""" - - -class CommandError(PipError): - """Raised when there is an error in command-line arguments""" - - -class PreviousBuildDirError(PipError): - """Raised when there's a previous conflicting build directory""" - - -class InvalidWheelFilename(InstallationError): - """Invalid wheel filename.""" - - -class UnsupportedWheel(InstallationError): - """Unsupported wheel.""" - - -class HashErrors(InstallationError): - """Multiple HashError instances rolled into one for reporting""" - - def __init__(self): - self.errors = [] - - def append(self, error): - self.errors.append(error) - - def __str__(self): - lines = [] - self.errors.sort(key=lambda e: e.order) - for cls, errors_of_cls in groupby(self.errors, lambda e: e.__class__): - lines.append(cls.head) - lines.extend(e.body() for e in errors_of_cls) - if lines: - return '\n'.join(lines) - - def __nonzero__(self): - return bool(self.errors) - - def __bool__(self): - return self.__nonzero__() - - -class HashError(InstallationError): - """ - A failure to verify a package against known-good hashes - - :cvar order: An int sorting hash exception classes by difficulty of - recovery (lower being harder), so the user doesn't bother fretting - about unpinned packages when he has deeper issues, like VCS - dependencies, to deal with. Also keeps error reports in a - deterministic order. - :cvar head: A section heading for display above potentially many - exceptions of this kind - :ivar req: The InstallRequirement that triggered this error. This is - pasted on after the exception is instantiated, because it's not - typically available earlier. - - """ - req = None # type: Optional[InstallRequirement] - head = '' - - def body(self): - """Return a summary of me for display under the heading. - - This default implementation simply prints a description of the - triggering requirement. - - :param req: The InstallRequirement that provoked this error, with - populate_link() having already been called - - """ - return ' %s' % self._requirement_name() - - def __str__(self): - return '%s\n%s' % (self.head, self.body()) - - def _requirement_name(self): - """Return a description of the requirement that triggered me. - - This default implementation returns long description of the req, with - line numbers - - """ - return str(self.req) if self.req else 'unknown package' - - -class VcsHashUnsupported(HashError): - """A hash was provided for a version-control-system-based requirement, but - we don't have a method for hashing those.""" - - order = 0 - head = ("Can't verify hashes for these requirements because we don't " - "have a way to hash version control repositories:") - - -class DirectoryUrlHashUnsupported(HashError): - """A hash was provided for a version-control-system-based requirement, but - we don't have a method for hashing those.""" - - order = 1 - head = ("Can't verify hashes for these file:// requirements because they " - "point to directories:") - - -class HashMissing(HashError): - """A hash was needed for a requirement but is absent.""" - - order = 2 - head = ('Hashes are required in --require-hashes mode, but they are ' - 'missing from some requirements. Here is a list of those ' - 'requirements along with the hashes their downloaded archives ' - 'actually had. Add lines like these to your requirements files to ' - 'prevent tampering. (If you did not enable --require-hashes ' - 'manually, note that it turns on automatically when any package ' - 'has a hash.)') - - def __init__(self, gotten_hash): - """ - :param gotten_hash: The hash of the (possibly malicious) archive we - just downloaded - """ - self.gotten_hash = gotten_hash - - def body(self): - # Dodge circular import. - from pip._internal.utils.hashes import FAVORITE_HASH - - package = None - if self.req: - # In the case of URL-based requirements, display the original URL - # seen in the requirements file rather than the package name, - # so the output can be directly copied into the requirements file. - package = (self.req.original_link if self.req.original_link - # In case someone feeds something downright stupid - # to InstallRequirement's constructor. - else getattr(self.req, 'req', None)) - return ' %s --hash=%s:%s' % (package or 'unknown package', - FAVORITE_HASH, - self.gotten_hash) - - -class HashUnpinned(HashError): - """A requirement had a hash specified but was not pinned to a specific - version.""" - - order = 3 - head = ('In --require-hashes mode, all requirements must have their ' - 'versions pinned with ==. These do not:') - - -class HashMismatch(HashError): - """ - Distribution file hash values don't match. - - :ivar package_name: The name of the package that triggered the hash - mismatch. Feel free to write to this after the exception is raise to - improve its error message. - - """ - order = 4 - head = ('THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS ' - 'FILE. If you have updated the package versions, please update ' - 'the hashes. Otherwise, examine the package contents carefully; ' - 'someone may have tampered with them.') - - def __init__(self, allowed, gots): - """ - :param allowed: A dict of algorithm names pointing to lists of allowed - hex digests - :param gots: A dict of algorithm names pointing to hashes we - actually got from the files under suspicion - """ - self.allowed = allowed - self.gots = gots - - def body(self): - return ' %s:\n%s' % (self._requirement_name(), - self._hash_comparison()) - - def _hash_comparison(self): - """ - Return a comparison of actual and expected hash values. - - Example:: - - Expected sha256 abcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcde - or 123451234512345123451234512345123451234512345 - Got bcdefbcdefbcdefbcdefbcdefbcdefbcdefbcdefbcdef - - """ - def hash_then_or(hash_name): - # For now, all the decent hashes have 6-char names, so we can get - # away with hard-coding space literals. - return chain([hash_name], repeat(' or')) - - lines = [] - for hash_name, expecteds in iteritems(self.allowed): - prefix = hash_then_or(hash_name) - lines.extend((' Expected %s %s' % (next(prefix), e)) - for e in expecteds) - lines.append(' Got %s\n' % - self.gots[hash_name].hexdigest()) - prefix = ' or' - return '\n'.join(lines) - - -class UnsupportedPythonVersion(InstallationError): - """Unsupported python version according to Requires-Python package - metadata.""" - - -class ConfigurationFileCouldNotBeLoaded(ConfigurationError): - """When there are errors while loading a configuration file - """ - - def __init__(self, reason="could not be loaded", fname=None, error=None): - super(ConfigurationFileCouldNotBeLoaded, self).__init__(error) - self.reason = reason - self.fname = fname - self.error = error - - def __str__(self): - if self.fname is not None: - message_part = " in {}.".format(self.fname) - else: - assert self.error is not None - message_part = ".\n{}\n".format(self.error.message) - return "Configuration file {}{}".format(self.reason, message_part) diff --git a/env/lib/python3.7/site-packages/pip/_internal/index.py b/env/lib/python3.7/site-packages/pip/_internal/index.py deleted file mode 100644 index ff614b3..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/index.py +++ /dev/null @@ -1,1108 +0,0 @@ -"""Routines related to PyPI, indexes""" -from __future__ import absolute_import - -import cgi -import itertools -import logging -import mimetypes -import os -import posixpath -import re -import sys -from collections import namedtuple - -from pip._vendor import html5lib, requests, six -from pip._vendor.distlib.compat import unescape -from pip._vendor.packaging import specifiers -from pip._vendor.packaging.utils import canonicalize_name -from pip._vendor.packaging.version import parse as parse_version -from pip._vendor.requests.exceptions import HTTPError, RetryError, SSLError -from pip._vendor.six.moves.urllib import parse as urllib_parse -from pip._vendor.six.moves.urllib import request as urllib_request - -from pip._internal.download import HAS_TLS, is_url, path_to_url, url_to_path -from pip._internal.exceptions import ( - BestVersionAlreadyInstalled, DistributionNotFound, InvalidWheelFilename, - UnsupportedWheel, -) -from pip._internal.models.candidate import InstallationCandidate -from pip._internal.models.format_control import FormatControl -from pip._internal.models.index import PyPI -from pip._internal.models.link import Link -from pip._internal.pep425tags import get_supported -from pip._internal.utils.compat import ipaddress -from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import ( - ARCHIVE_EXTENSIONS, SUPPORTED_EXTENSIONS, WHEEL_EXTENSION, normalize_path, - redact_password_from_url, -) -from pip._internal.utils.packaging import check_requires_python -from pip._internal.utils.typing import MYPY_CHECK_RUNNING -from pip._internal.wheel import Wheel - -if MYPY_CHECK_RUNNING: - from logging import Logger - from typing import ( - Tuple, Optional, Any, List, Union, Callable, Set, Sequence, - Iterable, MutableMapping - ) - from pip._vendor.packaging.version import _BaseVersion - from pip._vendor.requests import Response - from pip._internal.pep425tags import Pep425Tag - from pip._internal.req import InstallRequirement - from pip._internal.download import PipSession - - SecureOrigin = Tuple[str, str, Optional[str]] - BuildTag = Tuple[Any, ...] # either empty tuple or Tuple[int, str] - CandidateSortingKey = Tuple[int, _BaseVersion, BuildTag, Optional[int]] - - -__all__ = ['FormatControl', 'FoundCandidates', 'PackageFinder'] - - -SECURE_ORIGINS = [ - # protocol, hostname, port - # Taken from Chrome's list of secure origins (See: http://bit.ly/1qrySKC) - ("https", "*", "*"), - ("*", "localhost", "*"), - ("*", "127.0.0.0/8", "*"), - ("*", "::1/128", "*"), - ("file", "*", None), - # ssh is always secure. - ("ssh", "*", "*"), -] # type: List[SecureOrigin] - - -logger = logging.getLogger(__name__) - - -def _match_vcs_scheme(url): - # type: (str) -> Optional[str] - """Look for VCS schemes in the URL. - - Returns the matched VCS scheme, or None if there's no match. - """ - from pip._internal.vcs import VcsSupport - for scheme in VcsSupport.schemes: - if url.lower().startswith(scheme) and url[len(scheme)] in '+:': - return scheme - return None - - -def _is_url_like_archive(url): - # type: (str) -> bool - """Return whether the URL looks like an archive. - """ - filename = Link(url).filename - for bad_ext in ARCHIVE_EXTENSIONS: - if filename.endswith(bad_ext): - return True - return False - - -class _NotHTML(Exception): - def __init__(self, content_type, request_desc): - # type: (str, str) -> None - super(_NotHTML, self).__init__(content_type, request_desc) - self.content_type = content_type - self.request_desc = request_desc - - -def _ensure_html_header(response): - # type: (Response) -> None - """Check the Content-Type header to ensure the response contains HTML. - - Raises `_NotHTML` if the content type is not text/html. - """ - content_type = response.headers.get("Content-Type", "") - if not content_type.lower().startswith("text/html"): - raise _NotHTML(content_type, response.request.method) - - -class _NotHTTP(Exception): - pass - - -def _ensure_html_response(url, session): - # type: (str, PipSession) -> None - """Send a HEAD request to the URL, and ensure the response contains HTML. - - Raises `_NotHTTP` if the URL is not available for a HEAD request, or - `_NotHTML` if the content type is not text/html. - """ - scheme, netloc, path, query, fragment = urllib_parse.urlsplit(url) - if scheme not in {'http', 'https'}: - raise _NotHTTP() - - resp = session.head(url, allow_redirects=True) - resp.raise_for_status() - - _ensure_html_header(resp) - - -def _get_html_response(url, session): - # type: (str, PipSession) -> Response - """Access an HTML page with GET, and return the response. - - This consists of three parts: - - 1. If the URL looks suspiciously like an archive, send a HEAD first to - check the Content-Type is HTML, to avoid downloading a large file. - Raise `_NotHTTP` if the content type cannot be determined, or - `_NotHTML` if it is not HTML. - 2. Actually perform the request. Raise HTTP exceptions on network failures. - 3. Check the Content-Type header to make sure we got HTML, and raise - `_NotHTML` otherwise. - """ - if _is_url_like_archive(url): - _ensure_html_response(url, session=session) - - logger.debug('Getting page %s', redact_password_from_url(url)) - - resp = session.get( - url, - headers={ - "Accept": "text/html", - # We don't want to blindly returned cached data for - # /simple/, because authors generally expecting that - # twine upload && pip install will function, but if - # they've done a pip install in the last ~10 minutes - # it won't. Thus by setting this to zero we will not - # blindly use any cached data, however the benefit of - # using max-age=0 instead of no-cache, is that we will - # still support conditional requests, so we will still - # minimize traffic sent in cases where the page hasn't - # changed at all, we will just always incur the round - # trip for the conditional GET now instead of only - # once per 10 minutes. - # For more information, please see pypa/pip#5670. - "Cache-Control": "max-age=0", - }, - ) - resp.raise_for_status() - - # The check for archives above only works if the url ends with - # something that looks like an archive. However that is not a - # requirement of an url. Unless we issue a HEAD request on every - # url we cannot know ahead of time for sure if something is HTML - # or not. However we can check after we've downloaded it. - _ensure_html_header(resp) - - return resp - - -def _handle_get_page_fail( - link, # type: Link - reason, # type: Union[str, Exception] - meth=None # type: Optional[Callable[..., None]] -): - # type: (...) -> None - if meth is None: - meth = logger.debug - meth("Could not fetch URL %s: %s - skipping", link, reason) - - -def _get_html_page(link, session=None): - # type: (Link, Optional[PipSession]) -> Optional[HTMLPage] - if session is None: - raise TypeError( - "_get_html_page() missing 1 required keyword argument: 'session'" - ) - - url = link.url.split('#', 1)[0] - - # Check for VCS schemes that do not support lookup as web pages. - vcs_scheme = _match_vcs_scheme(url) - if vcs_scheme: - logger.debug('Cannot look at %s URL %s', vcs_scheme, link) - return None - - # Tack index.html onto file:// URLs that point to directories - scheme, _, path, _, _, _ = urllib_parse.urlparse(url) - if (scheme == 'file' and os.path.isdir(urllib_request.url2pathname(path))): - # add trailing slash if not present so urljoin doesn't trim - # final segment - if not url.endswith('/'): - url += '/' - url = urllib_parse.urljoin(url, 'index.html') - logger.debug(' file: URL is directory, getting %s', url) - - try: - resp = _get_html_response(url, session=session) - except _NotHTTP: - logger.debug( - 'Skipping page %s because it looks like an archive, and cannot ' - 'be checked by HEAD.', link, - ) - except _NotHTML as exc: - logger.debug( - 'Skipping page %s because the %s request got Content-Type: %s', - link, exc.request_desc, exc.content_type, - ) - except HTTPError as exc: - _handle_get_page_fail(link, exc) - except RetryError as exc: - _handle_get_page_fail(link, exc) - except SSLError as exc: - reason = "There was a problem confirming the ssl certificate: " - reason += str(exc) - _handle_get_page_fail(link, reason, meth=logger.info) - except requests.ConnectionError as exc: - _handle_get_page_fail(link, "connection error: %s" % exc) - except requests.Timeout: - _handle_get_page_fail(link, "timed out") - else: - return HTMLPage(resp.content, resp.url, resp.headers) - return None - - -class CandidateEvaluator(object): - - def __init__( - self, - valid_tags, # type: List[Pep425Tag] - prefer_binary=False # type: bool - - ): - # type: (...) -> None - self._prefer_binary = prefer_binary - self._valid_tags = valid_tags - - def is_wheel_supported(self, wheel): - # type: (Wheel) -> bool - return wheel.supported(self._valid_tags) - - def _sort_key(self, candidate): - # type: (InstallationCandidate) -> CandidateSortingKey - """ - Function used to generate link sort key for link tuples. - The greater the return value, the more preferred it is. - If not finding wheels, then sorted by version only. - If finding wheels, then the sort order is by version, then: - 1. existing installs - 2. wheels ordered via Wheel.support_index_min(self._valid_tags) - 3. source archives - If prefer_binary was set, then all wheels are sorted above sources. - Note: it was considered to embed this logic into the Link - comparison operators, but then different sdist links - with the same version, would have to be considered equal - """ - support_num = len(self._valid_tags) - build_tag = tuple() # type: BuildTag - binary_preference = 0 - if candidate.location.is_wheel: - # can raise InvalidWheelFilename - wheel = Wheel(candidate.location.filename) - if not wheel.supported(self._valid_tags): - raise UnsupportedWheel( - "%s is not a supported wheel for this platform. It " - "can't be sorted." % wheel.filename - ) - if self._prefer_binary: - binary_preference = 1 - pri = -(wheel.support_index_min(self._valid_tags)) - if wheel.build_tag is not None: - match = re.match(r'^(\d+)(.*)$', wheel.build_tag) - build_tag_groups = match.groups() - build_tag = (int(build_tag_groups[0]), build_tag_groups[1]) - else: # sdist - pri = -(support_num) - return (binary_preference, candidate.version, build_tag, pri) - - def get_best_candidate(self, candidates): - # type: (List[InstallationCandidate]) -> InstallationCandidate - """ - Return the best candidate per the instance's sort order, or None if - no candidates are given. - """ - if not candidates: - return None - - return max(candidates, key=self._sort_key) - - -class FoundCandidates(object): - """A collection of candidates, returned by `PackageFinder.find_candidates`. - - This class is only intended to be instantiated by PackageFinder through - the `from_specifier()` constructor. - - Arguments: - - * `candidates`: A sequence of all available candidates found. - * `specifier`: Specifier to filter applicable versions. - * `prereleases`: Whether prereleases should be accounted. Pass None to - infer from the specifier. - * `evaluator`: A CandidateEvaluator object to sort applicable candidates - by order of preference. - """ - - def __init__( - self, - candidates, # type: List[InstallationCandidate] - versions, # type: Set[str] - evaluator, # type: CandidateEvaluator - ): - # type: (...) -> None - self._candidates = candidates - self._evaluator = evaluator - self._versions = versions - - @classmethod - def from_specifier( - cls, - candidates, # type: List[InstallationCandidate] - specifier, # type: specifiers.BaseSpecifier - prereleases, # type: Optional[bool] - evaluator, # type: CandidateEvaluator - ): - # type: (...) -> FoundCandidates - versions = { - str(v) for v in specifier.filter( - # We turn the version object into a str here because otherwise - # when we're debundled but setuptools isn't, Python will see - # packaging.version.Version and - # pkg_resources._vendor.packaging.version.Version as different - # types. This way we'll use a str as a common data interchange - # format. If we stop using the pkg_resources provided specifier - # and start using our own, we can drop the cast to str(). - (str(c.version) for c in candidates), - prereleases=prereleases, - ) - } - return cls(candidates, versions, evaluator) - - def iter_all(self): - # type: () -> Iterable[InstallationCandidate] - """Iterate through all candidates. - """ - return iter(self._candidates) - - def iter_applicable(self): - # type: () -> Iterable[InstallationCandidate] - """Iterate through candidates matching the versions associated with - this instance. - """ - # Again, converting version to str to deal with debundling. - return (c for c in self.iter_all() if str(c.version) in self._versions) - - def get_best(self): - # type: () -> Optional[InstallationCandidate] - """Return the best candidate available, or None if no applicable - candidates are found. - """ - candidates = list(self.iter_applicable()) - return self._evaluator.get_best_candidate(candidates) - - -class PackageFinder(object): - """This finds packages. - - This is meant to match easy_install's technique for looking for - packages, by reading pages and looking for appropriate links. - """ - - def __init__( - self, - find_links, # type: List[str] - index_urls, # type: List[str] - allow_all_prereleases=False, # type: bool - trusted_hosts=None, # type: Optional[Iterable[str]] - session=None, # type: Optional[PipSession] - format_control=None, # type: Optional[FormatControl] - platform=None, # type: Optional[str] - versions=None, # type: Optional[List[str]] - abi=None, # type: Optional[str] - implementation=None, # type: Optional[str] - prefer_binary=False # type: bool - ): - # type: (...) -> None - """Create a PackageFinder. - - :param format_control: A FormatControl object or None. Used to control - the selection of source packages / binary packages when consulting - the index and links. - :param platform: A string or None. If None, searches for packages - that are supported by the current system. Otherwise, will find - packages that can be built on the platform passed in. These - packages will only be downloaded for distribution: they will - not be built locally. - :param versions: A list of strings or None. This is passed directly - to pep425tags.py in the get_supported() method. - :param abi: A string or None. This is passed directly - to pep425tags.py in the get_supported() method. - :param implementation: A string or None. This is passed directly - to pep425tags.py in the get_supported() method. - :param prefer_binary: Whether to prefer an old, but valid, binary - dist over a new source dist. - """ - if session is None: - raise TypeError( - "PackageFinder() missing 1 required keyword argument: " - "'session'" - ) - - # Build find_links. If an argument starts with ~, it may be - # a local file relative to a home directory. So try normalizing - # it and if it exists, use the normalized version. - # This is deliberately conservative - it might be fine just to - # blindly normalize anything starting with a ~... - self.find_links = [] # type: List[str] - for link in find_links: - if link.startswith('~'): - new_link = normalize_path(link) - if os.path.exists(new_link): - link = new_link - self.find_links.append(link) - - self.index_urls = index_urls - - # These are boring links that have already been logged somehow: - self.logged_links = set() # type: Set[Link] - - self.format_control = format_control or FormatControl(set(), set()) - - # Domains that we won't emit warnings for when not using HTTPS - self.secure_origins = [ - ("*", host, "*") - for host in (trusted_hosts if trusted_hosts else []) - ] # type: List[SecureOrigin] - - # Do we want to allow _all_ pre-releases? - self.allow_all_prereleases = allow_all_prereleases - - # The Session we'll use to make requests - self.session = session - - # The valid tags to check potential found wheel candidates against - valid_tags = get_supported( - versions=versions, - platform=platform, - abi=abi, - impl=implementation, - ) - self.candidate_evaluator = CandidateEvaluator( - valid_tags=valid_tags, prefer_binary=prefer_binary, - ) - - # If we don't have TLS enabled, then WARN if anyplace we're looking - # relies on TLS. - if not HAS_TLS: - for link in itertools.chain(self.index_urls, self.find_links): - parsed = urllib_parse.urlparse(link) - if parsed.scheme == "https": - logger.warning( - "pip is configured with locations that require " - "TLS/SSL, however the ssl module in Python is not " - "available." - ) - break - - def get_formatted_locations(self): - # type: () -> str - lines = [] - if self.index_urls and self.index_urls != [PyPI.simple_url]: - lines.append( - "Looking in indexes: {}".format(", ".join( - redact_password_from_url(url) for url in self.index_urls)) - ) - if self.find_links: - lines.append( - "Looking in links: {}".format(", ".join(self.find_links)) - ) - return "\n".join(lines) - - @staticmethod - def _sort_locations(locations, expand_dir=False): - # type: (Sequence[str], bool) -> Tuple[List[str], List[str]] - """ - Sort locations into "files" (archives) and "urls", and return - a pair of lists (files,urls) - """ - files = [] - urls = [] - - # puts the url for the given file path into the appropriate list - def sort_path(path): - url = path_to_url(path) - if mimetypes.guess_type(url, strict=False)[0] == 'text/html': - urls.append(url) - else: - files.append(url) - - for url in locations: - - is_local_path = os.path.exists(url) - is_file_url = url.startswith('file:') - - if is_local_path or is_file_url: - if is_local_path: - path = url - else: - path = url_to_path(url) - if os.path.isdir(path): - if expand_dir: - path = os.path.realpath(path) - for item in os.listdir(path): - sort_path(os.path.join(path, item)) - elif is_file_url: - urls.append(url) - else: - logger.warning( - "Path '{0}' is ignored: " - "it is a directory.".format(path), - ) - elif os.path.isfile(path): - sort_path(path) - else: - logger.warning( - "Url '%s' is ignored: it is neither a file " - "nor a directory.", url, - ) - elif is_url(url): - # Only add url with clear scheme - urls.append(url) - else: - logger.warning( - "Url '%s' is ignored. It is either a non-existing " - "path or lacks a specific scheme.", url, - ) - - return files, urls - - def _validate_secure_origin(self, logger, location): - # type: (Logger, Link) -> bool - # Determine if this url used a secure transport mechanism - parsed = urllib_parse.urlparse(str(location)) - origin = (parsed.scheme, parsed.hostname, parsed.port) - - # The protocol to use to see if the protocol matches. - # Don't count the repository type as part of the protocol: in - # cases such as "git+ssh", only use "ssh". (I.e., Only verify against - # the last scheme.) - protocol = origin[0].rsplit('+', 1)[-1] - - # Determine if our origin is a secure origin by looking through our - # hardcoded list of secure origins, as well as any additional ones - # configured on this PackageFinder instance. - for secure_origin in (SECURE_ORIGINS + self.secure_origins): - if protocol != secure_origin[0] and secure_origin[0] != "*": - continue - - try: - # We need to do this decode dance to ensure that we have a - # unicode object, even on Python 2.x. - addr = ipaddress.ip_address( - origin[1] - if ( - isinstance(origin[1], six.text_type) or - origin[1] is None - ) - else origin[1].decode("utf8") - ) - network = ipaddress.ip_network( - secure_origin[1] - if isinstance(secure_origin[1], six.text_type) - # setting secure_origin[1] to proper Union[bytes, str] - # creates problems in other places - else secure_origin[1].decode("utf8") # type: ignore - ) - except ValueError: - # We don't have both a valid address or a valid network, so - # we'll check this origin against hostnames. - if (origin[1] and - origin[1].lower() != secure_origin[1].lower() and - secure_origin[1] != "*"): - continue - else: - # We have a valid address and network, so see if the address - # is contained within the network. - if addr not in network: - continue - - # Check to see if the port patches - if (origin[2] != secure_origin[2] and - secure_origin[2] != "*" and - secure_origin[2] is not None): - continue - - # If we've gotten here, then this origin matches the current - # secure origin and we should return True - return True - - # If we've gotten to this point, then the origin isn't secure and we - # will not accept it as a valid location to search. We will however - # log a warning that we are ignoring it. - logger.warning( - "The repository located at %s is not a trusted or secure host and " - "is being ignored. If this repository is available via HTTPS we " - "recommend you use HTTPS instead, otherwise you may silence " - "this warning and allow it anyway with '--trusted-host %s'.", - parsed.hostname, - parsed.hostname, - ) - - return False - - def _get_index_urls_locations(self, project_name): - # type: (str) -> List[str] - """Returns the locations found via self.index_urls - - Checks the url_name on the main (first in the list) index and - use this url_name to produce all locations - """ - - def mkurl_pypi_url(url): - loc = posixpath.join( - url, - urllib_parse.quote(canonicalize_name(project_name))) - # For maximum compatibility with easy_install, ensure the path - # ends in a trailing slash. Although this isn't in the spec - # (and PyPI can handle it without the slash) some other index - # implementations might break if they relied on easy_install's - # behavior. - if not loc.endswith('/'): - loc = loc + '/' - return loc - - return [mkurl_pypi_url(url) for url in self.index_urls] - - def find_all_candidates(self, project_name): - # type: (str) -> List[Optional[InstallationCandidate]] - """Find all available InstallationCandidate for project_name - - This checks index_urls and find_links. - All versions found are returned as an InstallationCandidate list. - - See _link_package_versions for details on which files are accepted - """ - index_locations = self._get_index_urls_locations(project_name) - index_file_loc, index_url_loc = self._sort_locations(index_locations) - fl_file_loc, fl_url_loc = self._sort_locations( - self.find_links, expand_dir=True, - ) - - file_locations = (Link(url) for url in itertools.chain( - index_file_loc, fl_file_loc, - )) - - # We trust every url that the user has given us whether it was given - # via --index-url or --find-links. - # We want to filter out any thing which does not have a secure origin. - url_locations = [ - link for link in itertools.chain( - (Link(url) for url in index_url_loc), - (Link(url) for url in fl_url_loc), - ) - if self._validate_secure_origin(logger, link) - ] - - logger.debug('%d location(s) to search for versions of %s:', - len(url_locations), project_name) - - for location in url_locations: - logger.debug('* %s', location) - - canonical_name = canonicalize_name(project_name) - formats = self.format_control.get_allowed_formats(canonical_name) - search = Search(project_name, canonical_name, formats) - find_links_versions = self._package_versions( - # We trust every directly linked archive in find_links - (Link(url, '-f') for url in self.find_links), - search - ) - - page_versions = [] - for page in self._get_pages(url_locations, project_name): - logger.debug('Analyzing links from page %s', page.url) - with indent_log(): - page_versions.extend( - self._package_versions(page.iter_links(), search) - ) - - file_versions = self._package_versions(file_locations, search) - if file_versions: - file_versions.sort(reverse=True) - logger.debug( - 'Local files found: %s', - ', '.join([ - url_to_path(candidate.location.url) - for candidate in file_versions - ]) - ) - - # This is an intentional priority ordering - return file_versions + find_links_versions + page_versions - - def find_candidates( - self, - project_name, # type: str - specifier=None, # type: Optional[specifiers.BaseSpecifier] - ): - """Find matches for the given project and specifier. - - If given, `specifier` should implement `filter` to allow version - filtering (e.g. ``packaging.specifiers.SpecifierSet``). - - Returns a `FoundCandidates` instance. - """ - if specifier is None: - specifier = specifiers.SpecifierSet() - return FoundCandidates.from_specifier( - self.find_all_candidates(project_name), - specifier=specifier, - prereleases=(self.allow_all_prereleases or None), - evaluator=self.candidate_evaluator, - ) - - def find_requirement(self, req, upgrade): - # type: (InstallRequirement, bool) -> Optional[Link] - """Try to find a Link matching req - - Expects req, an InstallRequirement and upgrade, a boolean - Returns a Link if found, - Raises DistributionNotFound or BestVersionAlreadyInstalled otherwise - """ - candidates = self.find_candidates(req.name, req.specifier) - best_candidate = candidates.get_best() - - installed_version = None # type: Optional[_BaseVersion] - if req.satisfied_by is not None: - installed_version = parse_version(req.satisfied_by.version) - - def _format_versions(cand_iter): - # This repeated parse_version and str() conversion is needed to - # handle different vendoring sources from pip and pkg_resources. - # If we stop using the pkg_resources provided specifier and start - # using our own, we can drop the cast to str(). - return ", ".join(sorted( - {str(c.version) for c in cand_iter}, - key=parse_version, - )) or "none" - - if installed_version is None and best_candidate is None: - logger.critical( - 'Could not find a version that satisfies the requirement %s ' - '(from versions: %s)', - req, - _format_versions(candidates.iter_all()), - ) - - raise DistributionNotFound( - 'No matching distribution found for %s' % req - ) - - best_installed = False - if installed_version and ( - best_candidate is None or - best_candidate.version <= installed_version): - best_installed = True - - if not upgrade and installed_version is not None: - if best_installed: - logger.debug( - 'Existing installed version (%s) is most up-to-date and ' - 'satisfies requirement', - installed_version, - ) - else: - logger.debug( - 'Existing installed version (%s) satisfies requirement ' - '(most up-to-date version is %s)', - installed_version, - best_candidate.version, - ) - return None - - if best_installed: - # We have an existing version, and its the best version - logger.debug( - 'Installed version (%s) is most up-to-date (past versions: ' - '%s)', - installed_version, - _format_versions(candidates.iter_applicable()), - ) - raise BestVersionAlreadyInstalled - - logger.debug( - 'Using version %s (newest of versions: %s)', - best_candidate.version, - _format_versions(candidates.iter_applicable()), - ) - return best_candidate.location - - def _get_pages(self, locations, project_name): - # type: (Iterable[Link], str) -> Iterable[HTMLPage] - """ - Yields (page, page_url) from the given locations, skipping - locations that have errors. - """ - seen = set() # type: Set[Link] - for location in locations: - if location in seen: - continue - seen.add(location) - - page = _get_html_page(location, session=self.session) - if page is None: - continue - - yield page - - _py_version_re = re.compile(r'-py([123]\.?[0-9]?)$') - - def _sort_links(self, links): - # type: (Iterable[Link]) -> List[Link] - """ - Returns elements of links in order, non-egg links first, egg links - second, while eliminating duplicates - """ - eggs, no_eggs = [], [] - seen = set() # type: Set[Link] - for link in links: - if link not in seen: - seen.add(link) - if link.egg_fragment: - eggs.append(link) - else: - no_eggs.append(link) - return no_eggs + eggs - - def _package_versions( - self, - links, # type: Iterable[Link] - search # type: Search - ): - # type: (...) -> List[Optional[InstallationCandidate]] - result = [] - for link in self._sort_links(links): - v = self._link_package_versions(link, search) - if v is not None: - result.append(v) - return result - - def _log_skipped_link(self, link, reason): - # type: (Link, str) -> None - if link not in self.logged_links: - logger.debug('Skipping link %s; %s', link, reason) - self.logged_links.add(link) - - def _link_package_versions(self, link, search): - # type: (Link, Search) -> Optional[InstallationCandidate] - """Return an InstallationCandidate or None""" - version = None - if link.egg_fragment: - egg_info = link.egg_fragment - ext = link.ext - else: - egg_info, ext = link.splitext() - if not ext: - self._log_skipped_link(link, 'not a file') - return None - if ext not in SUPPORTED_EXTENSIONS: - self._log_skipped_link( - link, 'unsupported archive format: %s' % ext, - ) - return None - if "binary" not in search.formats and ext == WHEEL_EXTENSION: - self._log_skipped_link( - link, 'No binaries permitted for %s' % search.supplied, - ) - return None - if "macosx10" in link.path and ext == '.zip': - self._log_skipped_link(link, 'macosx10 one') - return None - if ext == WHEEL_EXTENSION: - try: - wheel = Wheel(link.filename) - except InvalidWheelFilename: - self._log_skipped_link(link, 'invalid wheel filename') - return None - if canonicalize_name(wheel.name) != search.canonical: - self._log_skipped_link( - link, 'wrong project name (not %s)' % search.supplied) - return None - - if not self.candidate_evaluator.is_wheel_supported(wheel): - self._log_skipped_link( - link, 'it is not compatible with this Python') - return None - - version = wheel.version - - # This should be up by the search.ok_binary check, but see issue 2700. - if "source" not in search.formats and ext != WHEEL_EXTENSION: - self._log_skipped_link( - link, 'No sources permitted for %s' % search.supplied, - ) - return None - - if not version: - version = _egg_info_matches(egg_info, search.canonical) - if not version: - self._log_skipped_link( - link, 'Missing project version for %s' % search.supplied) - return None - - match = self._py_version_re.search(version) - if match: - version = version[:match.start()] - py_version = match.group(1) - if py_version != sys.version[:3]: - self._log_skipped_link( - link, 'Python version is incorrect') - return None - try: - support_this_python = check_requires_python(link.requires_python) - except specifiers.InvalidSpecifier: - logger.debug("Package %s has an invalid Requires-Python entry: %s", - link.filename, link.requires_python) - support_this_python = True - - if not support_this_python: - logger.debug("The package %s is incompatible with the python " - "version in use. Acceptable python versions are: %s", - link, link.requires_python) - return None - logger.debug('Found link %s, version: %s', link, version) - - return InstallationCandidate(search.supplied, version, link) - - -def _find_name_version_sep(egg_info, canonical_name): - # type: (str, str) -> int - """Find the separator's index based on the package's canonical name. - - `egg_info` must be an egg info string for the given package, and - `canonical_name` must be the package's canonical name. - - This function is needed since the canonicalized name does not necessarily - have the same length as the egg info's name part. An example:: - - >>> egg_info = 'foo__bar-1.0' - >>> canonical_name = 'foo-bar' - >>> _find_name_version_sep(egg_info, canonical_name) - 8 - """ - # Project name and version must be separated by one single dash. Find all - # occurrences of dashes; if the string in front of it matches the canonical - # name, this is the one separating the name and version parts. - for i, c in enumerate(egg_info): - if c != "-": - continue - if canonicalize_name(egg_info[:i]) == canonical_name: - return i - raise ValueError("{} does not match {}".format(egg_info, canonical_name)) - - -def _egg_info_matches(egg_info, canonical_name): - # type: (str, str) -> Optional[str] - """Pull the version part out of a string. - - :param egg_info: The string to parse. E.g. foo-2.1 - :param canonical_name: The canonicalized name of the package this - belongs to. - """ - try: - version_start = _find_name_version_sep(egg_info, canonical_name) + 1 - except ValueError: - return None - version = egg_info[version_start:] - if not version: - return None - return version - - -def _determine_base_url(document, page_url): - """Determine the HTML document's base URL. - - This looks for a ```` tag in the HTML document. If present, its href - attribute denotes the base URL of anchor tags in the document. If there is - no such tag (or if it does not have a valid href attribute), the HTML - file's URL is used as the base URL. - - :param document: An HTML document representation. The current - implementation expects the result of ``html5lib.parse()``. - :param page_url: The URL of the HTML document. - """ - for base in document.findall(".//base"): - href = base.get("href") - if href is not None: - return href - return page_url - - -def _get_encoding_from_headers(headers): - """Determine if we have any encoding information in our headers. - """ - if headers and "Content-Type" in headers: - content_type, params = cgi.parse_header(headers["Content-Type"]) - if "charset" in params: - return params['charset'] - return None - - -def _clean_link(url): - # type: (str) -> str - """Makes sure a link is fully encoded. That is, if a ' ' shows up in - the link, it will be rewritten to %20 (while not over-quoting - % or other characters).""" - # Split the URL into parts according to the general structure - # `scheme://netloc/path;parameters?query#fragment`. Note that the - # `netloc` can be empty and the URI will then refer to a local - # filesystem path. - result = urllib_parse.urlparse(url) - # In both cases below we unquote prior to quoting to make sure - # nothing is double quoted. - if result.netloc == "": - # On Windows the path part might contain a drive letter which - # should not be quoted. On Linux where drive letters do not - # exist, the colon should be quoted. We rely on urllib.request - # to do the right thing here. - path = urllib_request.pathname2url( - urllib_request.url2pathname(result.path)) - else: - # In addition to the `/` character we protect `@` so that - # revision strings in VCS URLs are properly parsed. - path = urllib_parse.quote(urllib_parse.unquote(result.path), safe="/@") - return urllib_parse.urlunparse(result._replace(path=path)) - - -class HTMLPage(object): - """Represents one page, along with its URL""" - - def __init__(self, content, url, headers=None): - # type: (bytes, str, MutableMapping[str, str]) -> None - self.content = content - self.url = url - self.headers = headers - - def __str__(self): - return redact_password_from_url(self.url) - - def iter_links(self): - # type: () -> Iterable[Link] - """Yields all links in the page""" - document = html5lib.parse( - self.content, - transport_encoding=_get_encoding_from_headers(self.headers), - namespaceHTMLElements=False, - ) - base_url = _determine_base_url(document, self.url) - for anchor in document.findall(".//a"): - if anchor.get("href"): - href = anchor.get("href") - url = _clean_link(urllib_parse.urljoin(base_url, href)) - pyrequire = anchor.get('data-requires-python') - pyrequire = unescape(pyrequire) if pyrequire else None - yield Link(url, self.url, requires_python=pyrequire) - - -Search = namedtuple('Search', 'supplied canonical formats') -"""Capture key aspects of a search. - -:attribute supplied: The user supplied package. -:attribute canonical: The canonical package name. -:attribute formats: The formats allowed for this package. Should be a set - with 'binary' or 'source' or both in it. -""" diff --git a/env/lib/python3.7/site-packages/pip/_internal/locations.py b/env/lib/python3.7/site-packages/pip/_internal/locations.py deleted file mode 100644 index 10860f7..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/locations.py +++ /dev/null @@ -1,211 +0,0 @@ -"""Locations where we look for configs, install stuff, etc""" -from __future__ import absolute_import - -import os -import os.path -import platform -import site -import sys -import sysconfig -from distutils import sysconfig as distutils_sysconfig -from distutils.command.install import SCHEME_KEYS # type: ignore - -from pip._internal.utils import appdirs -from pip._internal.utils.compat import WINDOWS, expanduser -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Any, Union, Dict, List, Optional - - -# Application Directories -USER_CACHE_DIR = appdirs.user_cache_dir("pip") - - -DELETE_MARKER_MESSAGE = '''\ -This file is placed here by pip to indicate the source was put -here by pip. - -Once this package is successfully installed this source code will be -deleted (unless you remove this file). -''' -PIP_DELETE_MARKER_FILENAME = 'pip-delete-this-directory.txt' - - -def write_delete_marker_file(directory): - # type: (str) -> None - """ - Write the pip delete marker file into this directory. - """ - filepath = os.path.join(directory, PIP_DELETE_MARKER_FILENAME) - with open(filepath, 'w') as marker_fp: - marker_fp.write(DELETE_MARKER_MESSAGE) - - -def running_under_virtualenv(): - # type: () -> bool - """ - Return True if we're running inside a virtualenv, False otherwise. - - """ - if hasattr(sys, 'real_prefix'): - return True - elif sys.prefix != getattr(sys, "base_prefix", sys.prefix): - return True - - return False - - -def virtualenv_no_global(): - # type: () -> bool - """ - Return True if in a venv and no system site packages. - """ - # this mirrors the logic in virtualenv.py for locating the - # no-global-site-packages.txt file - site_mod_dir = os.path.dirname(os.path.abspath(site.__file__)) - no_global_file = os.path.join(site_mod_dir, 'no-global-site-packages.txt') - if running_under_virtualenv() and os.path.isfile(no_global_file): - return True - else: - return False - - -if running_under_virtualenv(): - src_prefix = os.path.join(sys.prefix, 'src') -else: - # FIXME: keep src in cwd for now (it is not a temporary folder) - try: - src_prefix = os.path.join(os.getcwd(), 'src') - except OSError: - # In case the current working directory has been renamed or deleted - sys.exit( - "The folder you are executing pip from can no longer be found." - ) - -# under macOS + virtualenv sys.prefix is not properly resolved -# it is something like /path/to/python/bin/.. -# Note: using realpath due to tmp dirs on OSX being symlinks -src_prefix = os.path.abspath(src_prefix) - -# FIXME doesn't account for venv linked to global site-packages - -site_packages = sysconfig.get_path("purelib") # type: Optional[str] - -# This is because of a bug in PyPy's sysconfig module, see -# https://bitbucket.org/pypy/pypy/issues/2506/sysconfig-returns-incorrect-paths -# for more information. -if platform.python_implementation().lower() == "pypy": - site_packages = distutils_sysconfig.get_python_lib() -try: - # Use getusersitepackages if this is present, as it ensures that the - # value is initialised properly. - user_site = site.getusersitepackages() -except AttributeError: - user_site = site.USER_SITE -user_dir = expanduser('~') -if WINDOWS: - bin_py = os.path.join(sys.prefix, 'Scripts') - bin_user = os.path.join(user_site, 'Scripts') - # buildout uses 'bin' on Windows too? - if not os.path.exists(bin_py): - bin_py = os.path.join(sys.prefix, 'bin') - bin_user = os.path.join(user_site, 'bin') - - config_basename = 'pip.ini' - - legacy_storage_dir = os.path.join(user_dir, 'pip') - legacy_config_file = os.path.join( - legacy_storage_dir, - config_basename, - ) -else: - bin_py = os.path.join(sys.prefix, 'bin') - bin_user = os.path.join(user_site, 'bin') - - config_basename = 'pip.conf' - - legacy_storage_dir = os.path.join(user_dir, '.pip') - legacy_config_file = os.path.join( - legacy_storage_dir, - config_basename, - ) - # Forcing to use /usr/local/bin for standard macOS framework installs - # Also log to ~/Library/Logs/ for use with the Console.app log viewer - if sys.platform[:6] == 'darwin' and sys.prefix[:16] == '/System/Library/': - bin_py = '/usr/local/bin' - -global_config_files = [ - os.path.join(path, config_basename) - for path in appdirs.site_config_dirs('pip') -] - -site_config_file = os.path.join(sys.prefix, config_basename) -new_config_file = os.path.join(appdirs.user_config_dir("pip"), config_basename) - - -def distutils_scheme(dist_name, user=False, home=None, root=None, - isolated=False, prefix=None): - # type:(str, bool, str, str, bool, str) -> dict - """ - Return a distutils install scheme - """ - from distutils.dist import Distribution - - scheme = {} - - if isolated: - extra_dist_args = {"script_args": ["--no-user-cfg"]} - else: - extra_dist_args = {} - dist_args = {'name': dist_name} # type: Dict[str, Union[str, List[str]]] - dist_args.update(extra_dist_args) - - d = Distribution(dist_args) - # Ignoring, typeshed issue reported python/typeshed/issues/2567 - d.parse_config_files() - # NOTE: Ignoring type since mypy can't find attributes on 'Command' - i = d.get_command_obj('install', create=True) # type: Any - assert i is not None - # NOTE: setting user or home has the side-effect of creating the home dir - # or user base for installations during finalize_options() - # ideally, we'd prefer a scheme class that has no side-effects. - assert not (user and prefix), "user={} prefix={}".format(user, prefix) - i.user = user or i.user - if user: - i.prefix = "" - i.prefix = prefix or i.prefix - i.home = home or i.home - i.root = root or i.root - i.finalize_options() - for key in SCHEME_KEYS: - scheme[key] = getattr(i, 'install_' + key) - - # install_lib specified in setup.cfg should install *everything* - # into there (i.e. it takes precedence over both purelib and - # platlib). Note, i.install_lib is *always* set after - # finalize_options(); we only want to override here if the user - # has explicitly requested it hence going back to the config - - # Ignoring, typeshed issue reported python/typeshed/issues/2567 - if 'install_lib' in d.get_option_dict('install'): # type: ignore - scheme.update(dict(purelib=i.install_lib, platlib=i.install_lib)) - - if running_under_virtualenv(): - scheme['headers'] = os.path.join( - sys.prefix, - 'include', - 'site', - 'python' + sys.version[:3], - dist_name, - ) - - if root is not None: - path_no_drive = os.path.splitdrive( - os.path.abspath(scheme["headers"]))[1] - scheme["headers"] = os.path.join( - root, - path_no_drive[1:], - ) - - return scheme diff --git a/env/lib/python3.7/site-packages/pip/_internal/models/__init__.py b/env/lib/python3.7/site-packages/pip/_internal/models/__init__.py deleted file mode 100644 index 7855226..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/models/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -"""A package that contains models that represent entities. -""" diff --git a/env/lib/python3.7/site-packages/pip/_internal/models/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/models/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 4957e2050c73ba55217427d04baa6f1ce6351f6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 217 zcmZ?b<>g`kg1p5NvGzdvF^B^Lj6jA15EpX*i4=w?h7`tN22G|a3rB^5#N_P6^i+kC zjKmU!6h1~p<)SP07U{Pv8QEG8&UWoz_XO?897VB~OX)@kokB?8uPmYgY z$xy@uG!{(!vePfgEzmE>EYJlSQ<9jIqnlD#nO9+$mH`q3d66}#iJ6UW)T(5B8q|o(hk$TI!VvN?pevk^^`zP z{s+aAe`&6s{0p9}n%PYhg9TMx(_PQ6YBqYkE&K;76jkqF0gq6LJ&a} z$!NqV>P%Ug9oda;DJOFymlEmfC-7#2ofmn{o1;3}Qnb|QuIgsX(K00ui10*bpNNjM z_pHblOV3Hr{Rvq}Kx?OrwUMBlc`TOzLeUe1zOop(tI0E>s~%hF!X|~xniz?B1uFAiI|{~bwI{cFk$U?B3szP z*(Z^6Kx`7ZP@Y?_KFUoMD-~CeU>N5j6>%kZZ#|QxmPY24>Bs%Ds6b0&)xVl7Os@9F zh3=<+c!%9SP=Wv>;faiuncE;{bVfL-=#1^5#%2~stFkL+M)ug2J0n{Jm;qa3t8xVW z+>8b4WTSx9*0!A1D?*ObJk8(oM8(DgUhS2-*pf+A_Zo=#hZd~bTPPh>Bu#s@VL2(otxu# zc-b%ntfbCkHOLAfl^Gm@6_!(d0)iqN9|U18?NXO@=?dMweC!OuMS%%L2OvBh;32R% z147U*h!~*RqW0Blu-XmQj*WQj;}!ksdjCiU>(IOlbIjuEpZ4`h$e>Rj3QUNoY1j(QwueA`Z ScV-heNmIs}Ge3KL&Y5q{`R4nDg$6@Q{(Aq(KXu0b zrNwb`F}aDJ-GWd|@t6&Hk8_%fSPY$>!=U6+jJM?+?K9=+ z`kvF9Q~m?iuDygM*5>6>7$j*Dg+Uxmv`m7b#^&-TQ2|0I9?t=s*fd$;YB z^T6&ZkMd zd$ho3H`DQknS*IVH~u#>O$@JYt>(kg>L?oBIEw9t+TKlezS!u~rtLCHa&2${tHV_3 zI9shwD#Hqm&S|1Q`72n^U3 z!H?5%@}Qy+9@@gpL!KgVaHrM&!qK1m_u(4a=6hi-jd#6)rUWCK3Hl@1(q_t3$?MR(G8 zF}?O;dcE~x+HQNLUm;)4!B`w*nUsVJRgaXfueQxCLTAH-rqLrKaxSqy z#J3;^{Htb~l)u}}hiqr9aBi_DUryb^RqmEB$+4a7M>+QPIKGGjuW+qJejuvZ_M?ZO zBY@>~U-9b`Zw=+O_L2~u_-mjTz1H?iFB`>CUV34y15-MIQl%FqO79rTk+PP8oYrb zs6(!xAZR2h>}+!NbY`A!Y?i5%rL#=kz(R2)`eJJ70HxxaD|7`F{7{k3lH6k?A9ShrjHN0j1c>DYw&2<5hGnZ!^&+3YLlz4xqStWV)HOyu!5JV*n-aOG8eDcX@?9TcB z+sm!WUI1YsI>aMpGYI8Yr4NGt^!QBnh;ON=CFG3_x?-j%pQAg6QmoAc8bC2zmrEVzRn$MWa!7@T)af>I?R3x7{c|0QYy~Go7f^bgDNDPh4l5 zM{!ow%w?-_{4!KuI{EGhYKF2DB~&d44MXH%e7l`K9q2H(o=(JOL$wTE|E9v>JE~zz LQ%%tXnk&wKP9qUN diff --git a/env/lib/python3.7/site-packages/pip/_internal/models/__pycache__/index.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/models/__pycache__/index.cpython-37.pyc deleted file mode 100644 index 3c6a7d06535970c9fe88253b5e3530c7c784aaaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1121 zcmZux&u`N(6tsiiE5zc2^fS$!vF8tKK$g zC;o>{ocNb~<;1_hiD!3ZL&DN~`JR6~zxRDs-t~H21f%-?@XON>p`R{T4~WrQF#Q4? zLkvqa!8yTbA2Gs$OT+>mTm*T@Ll&|Yi@uS(1-Q*(k0aLkgtG20IE^xFTTP)fFI}`A z!41&Q0C1FJhH}Di9$cXz_IJd&&wYvV))fj-9zn*)CPzj2wK(Ai731gg{g1p+T=UB4 zv`BB3QooiK6-ygcp9#iw$_p*HN{h1OTBoK?dBvJqz`1S;qg1o52 za(CI7Qc(#*sSTz|+60^w$JCQ%V~BJkg|Sh^jjT)CqcBB>wSpaHWV@@(ZqmjsyGPqY zAvx8iRzMbI^`sD07T8d8IaD#+s_ugWZ90^eve25+AL#e1ftfUeMl^e((x#AdkDbn{ z^XJ2noAd^y8m_8B4kk6@QV)bvqTkF^8xp$AIsu2s29EFsPH@ti@7xuwzwWjqZXXQy zbuaEcnBD+q&=Tkz6CjxYefTg7R0rm58=4%0Y`%kxs7*H+IvUgifGfA{kgH(_O#4g7 z{L#N9++{FpI|Zs@!a;#9rO?+DxT7|q^mJOto0T>N8cRxjpFTe*vEr`eQo_RD5;Cl| zToJw!C$Z~JN8n--lBDNlpKpzfY4pp%z=_tc)yZJK>r~S~rWw`MsMdxvw*dK^TJzoY z3B$F4UF&0yUA*`Ivxm^$6A-UY&*071s;|X)e^Q^pH9!KqGvyds(HqsrV_uros|=53 jM+Y|k45=Nu?e3Ok8^2zW^#;2J-Tx#BHg^f`5`zB#G<7L8 diff --git a/env/lib/python3.7/site-packages/pip/_internal/models/__pycache__/link.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/models/__pycache__/link.cpython-37.pyc deleted file mode 100644 index 65b18cb88ddfb2b50e4d6ca5559acbea59dfcda1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4940 zcmb_g%X<{Z5uewtMyu88fg~ir_82UzwUGn@IX1y|3>J@AtQ8(kyoQWN+r8S6=CSIY z1+?Gl67c6se90wODLLho|7Wf_anFfUe$}I0u^_&L@5_p*sj056>Z-1)uIB3Sa6!W_ z`up_5e~xR~zv!d;vw-{tkNh(L)0iG;)$FZTb$lCv5t>y?Cz=`L!hAKaa4Q%H?W!FP zRtLjEwV-IZU??nBiwe&N!(pjf(luTZPcU~N7zszKqv2R}EF7bmaFpS5{Wtl|S5D zsocHwZ6%!+oO!jxZF*8ZjsbvYcMV$ifu=f>y9QbK=M&Z-IKVY*8p8sgKWmm&J&BDg zr`D<;ZMDC=!<&Lj9wpN89JPnc2{7W&wt%$e)wbY1=T^k{lMkgM{SXdz?%!E0IQUg+ zU0>3h9+Uif9iXG{AyoHuF`noh{i(hS*wI|0V*r{RQ=ILXk-_N8N^(iQqdhe?2RhoO zk>r{Ai-GVnuu{wWo33d}87V}dT<(1w5S+N~Bn|Gskhmpk+-b&slyK%Gu`|~YyxwIX z!^*wcwK(KbgD1#^#LhXfaAYFTW zcpK*&*vq)Afd_s)P`Z5n;-SrL9@LHOattJ;@n7D1%g}lUd%T{Vh9@NDc$O4s86UP9M>Vs~k%ys{v zy|}!Xgw4gK-<(&w83glednbBwq23^(dLS_20!3pnj2RE)B5mwKb4N@<-V`1=3ZRt= zx^3k3yk0U2x}~>=SBb5=oElU*8m7)tdAk&Hz93Tk1S>&1+-0FEHN`d z*l(Io)ptj)n^W3dEin=+qdrA#WuTO;N_*0o>pJFO-!9L}a;mjUv(lMUS&DD`%PB`> zF3Dj5%0sD%*en}@>`4vL6w@@KzzmTFTo(+kdmbOM1fapvqG16R@NO3mtW``sW65YT zSQ%>rAv4K@vQcRdUZFY8to%ahDeFr4tBSFq0;R`we~syqglUJq%|?3a$QpW-y59mx zv_0~iv9CYK?drS6t_i3o=AP9t_i|Kp_Vwmm$Jn*NneSNp`mWWnDA;O~=X&3Ow3ps+fh*%B$b(~o^<5C-6>Zr;*JlKq- z|AbDx)LzGtMRU@;fXDo1I?#%?TXDkE(pOS)L8sJ;5V62+sV&jnG#~LKh-;~(L|8Qa zHD`6#@&$~Ss!=ef^a*Uyc-LuNj-JzKk0{ZU(7jl`PEnagr(@C{XZx!>Y^9?vBp$9s zpe9J}iCQD88o3P-x0>C`oD01KBd-+a;>!{?pk7j~)yxvkA)G{G*~Yx2r9DlS$ksYT z_fbn?vGad5X~un7^vkx1WvojXCO!dnV3zn5QC~4?@<Z&Kz<7o9#2{_>i#?nqA=De5V6 z@IhV(v=E($PKu3=zG-gd#VKZ@o1G*VeLFcY+Es`!RUgY44 z-0}hkJ+og2?#%IpjRnVZ&_%C%K~Sb^hhOiB^OOGRr@eJFAeeZXWaEwz_*)#)>CmF7 zp7Y(cyAIk8k6Mz$EP9l}c7?D&`6oL8f- z^px6?M?7M&SU~H!5XO(VTtJGTM->#3s<%m} z`nQh7kE0;=Sa$uI?jLL=ejpb@A2&Qo4?(Sza#MQZNJe#I64V47&5-Og5p{yjt2BS` zF-S5gE5#6zkM#@o=|31mk%or}9EOm>)NRGSl7+z+REy*UfQ`!;h0%mrRM(aXy=eXi D-y(WE diff --git a/env/lib/python3.7/site-packages/pip/_internal/models/candidate.py b/env/lib/python3.7/site-packages/pip/_internal/models/candidate.py deleted file mode 100644 index b66c365..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/models/candidate.py +++ /dev/null @@ -1,31 +0,0 @@ -from pip._vendor.packaging.version import parse as parse_version - -from pip._internal.utils.models import KeyBasedCompareMixin -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from pip._vendor.packaging.version import _BaseVersion - from pip._internal.models.link import Link - from typing import Any - - -class InstallationCandidate(KeyBasedCompareMixin): - """Represents a potential "candidate" for installation. - """ - - def __init__(self, project, version, location): - # type: (Any, str, Link) -> None - self.project = project - self.version = parse_version(version) # type: _BaseVersion - self.location = location - - super(InstallationCandidate, self).__init__( - key=(self.project, self.version, self.location), - defining_class=InstallationCandidate - ) - - def __repr__(self): - # type: () -> str - return "".format( - self.project, self.version, self.location, - ) diff --git a/env/lib/python3.7/site-packages/pip/_internal/models/format_control.py b/env/lib/python3.7/site-packages/pip/_internal/models/format_control.py deleted file mode 100644 index 53138e4..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/models/format_control.py +++ /dev/null @@ -1,73 +0,0 @@ -from pip._vendor.packaging.utils import canonicalize_name - -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Optional, Set, FrozenSet - - -class FormatControl(object): - """Helper for managing formats from which a package can be installed. - """ - - def __init__(self, no_binary=None, only_binary=None): - # type: (Optional[Set], Optional[Set]) -> None - if no_binary is None: - no_binary = set() - if only_binary is None: - only_binary = set() - - self.no_binary = no_binary - self.only_binary = only_binary - - def __eq__(self, other): - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - return not self.__eq__(other) - - def __repr__(self): - return "{}({}, {})".format( - self.__class__.__name__, - self.no_binary, - self.only_binary - ) - - @staticmethod - def handle_mutual_excludes(value, target, other): - # type: (str, Optional[Set], Optional[Set]) -> None - new = value.split(',') - while ':all:' in new: - other.clear() - target.clear() - target.add(':all:') - del new[:new.index(':all:') + 1] - # Without a none, we want to discard everything as :all: covers it - if ':none:' not in new: - return - for name in new: - if name == ':none:': - target.clear() - continue - name = canonicalize_name(name) - other.discard(name) - target.add(name) - - def get_allowed_formats(self, canonical_name): - # type: (str) -> FrozenSet - result = {"binary", "source"} - if canonical_name in self.only_binary: - result.discard('source') - elif canonical_name in self.no_binary: - result.discard('binary') - elif ':all:' in self.only_binary: - result.discard('source') - elif ':all:' in self.no_binary: - result.discard('binary') - return frozenset(result) - - def disallow_binaries(self): - # type: () -> None - self.handle_mutual_excludes( - ':all:', self.no_binary, self.only_binary, - ) diff --git a/env/lib/python3.7/site-packages/pip/_internal/models/index.py b/env/lib/python3.7/site-packages/pip/_internal/models/index.py deleted file mode 100644 index ead1efb..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/models/index.py +++ /dev/null @@ -1,31 +0,0 @@ -from pip._vendor.six.moves.urllib import parse as urllib_parse - - -class PackageIndex(object): - """Represents a Package Index and provides easier access to endpoints - """ - - def __init__(self, url, file_storage_domain): - # type: (str, str) -> None - super(PackageIndex, self).__init__() - self.url = url - self.netloc = urllib_parse.urlsplit(url).netloc - self.simple_url = self._url_for_path('simple') - self.pypi_url = self._url_for_path('pypi') - - # This is part of a temporary hack used to block installs of PyPI - # packages which depend on external urls only necessary until PyPI can - # block such packages themselves - self.file_storage_domain = file_storage_domain - - def _url_for_path(self, path): - # type: (str) -> str - return urllib_parse.urljoin(self.url, path) - - -PyPI = PackageIndex( - 'https://pypi.org/', file_storage_domain='files.pythonhosted.org' -) -TestPyPI = PackageIndex( - 'https://test.pypi.org/', file_storage_domain='test-files.pythonhosted.org' -) diff --git a/env/lib/python3.7/site-packages/pip/_internal/models/link.py b/env/lib/python3.7/site-packages/pip/_internal/models/link.py deleted file mode 100644 index 2f42076..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/models/link.py +++ /dev/null @@ -1,163 +0,0 @@ -import posixpath -import re - -from pip._vendor.six.moves.urllib import parse as urllib_parse - -from pip._internal.download import path_to_url -from pip._internal.utils.misc import ( - WHEEL_EXTENSION, redact_password_from_url, splitext, -) -from pip._internal.utils.models import KeyBasedCompareMixin -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Optional, Tuple, Union - from pip._internal.index import HTMLPage - - -class Link(KeyBasedCompareMixin): - """Represents a parsed link from a Package Index's simple URL - """ - - def __init__(self, url, comes_from=None, requires_python=None): - # type: (str, Optional[Union[str, HTMLPage]], Optional[str]) -> None - """ - url: - url of the resource pointed to (href of the link) - comes_from: - instance of HTMLPage where the link was found, or string. - requires_python: - String containing the `Requires-Python` metadata field, specified - in PEP 345. This may be specified by a data-requires-python - attribute in the HTML link tag, as described in PEP 503. - """ - - # url can be a UNC windows share - if url.startswith('\\\\'): - url = path_to_url(url) - - self.url = url - self.comes_from = comes_from - self.requires_python = requires_python if requires_python else None - - super(Link, self).__init__( - key=(self.url), - defining_class=Link - ) - - def __str__(self): - if self.requires_python: - rp = ' (requires-python:%s)' % self.requires_python - else: - rp = '' - if self.comes_from: - return '%s (from %s)%s' % (redact_password_from_url(self.url), - self.comes_from, rp) - else: - return redact_password_from_url(str(self.url)) - - def __repr__(self): - return '' % self - - @property - def filename(self): - # type: () -> str - _, netloc, path, _, _ = urllib_parse.urlsplit(self.url) - name = posixpath.basename(path.rstrip('/')) or netloc - name = urllib_parse.unquote(name) - assert name, ('URL %r produced no filename' % self.url) - return name - - @property - def scheme(self): - # type: () -> str - return urllib_parse.urlsplit(self.url)[0] - - @property - def netloc(self): - # type: () -> str - return urllib_parse.urlsplit(self.url)[1] - - @property - def path(self): - # type: () -> str - return urllib_parse.unquote(urllib_parse.urlsplit(self.url)[2]) - - def splitext(self): - # type: () -> Tuple[str, str] - return splitext(posixpath.basename(self.path.rstrip('/'))) - - @property - def ext(self): - # type: () -> str - return self.splitext()[1] - - @property - def url_without_fragment(self): - # type: () -> str - scheme, netloc, path, query, fragment = urllib_parse.urlsplit(self.url) - return urllib_parse.urlunsplit((scheme, netloc, path, query, None)) - - _egg_fragment_re = re.compile(r'[#&]egg=([^&]*)') - - @property - def egg_fragment(self): - # type: () -> Optional[str] - match = self._egg_fragment_re.search(self.url) - if not match: - return None - return match.group(1) - - _subdirectory_fragment_re = re.compile(r'[#&]subdirectory=([^&]*)') - - @property - def subdirectory_fragment(self): - # type: () -> Optional[str] - match = self._subdirectory_fragment_re.search(self.url) - if not match: - return None - return match.group(1) - - _hash_re = re.compile( - r'(sha1|sha224|sha384|sha256|sha512|md5)=([a-f0-9]+)' - ) - - @property - def hash(self): - # type: () -> Optional[str] - match = self._hash_re.search(self.url) - if match: - return match.group(2) - return None - - @property - def hash_name(self): - # type: () -> Optional[str] - match = self._hash_re.search(self.url) - if match: - return match.group(1) - return None - - @property - def show_url(self): - # type: () -> Optional[str] - return posixpath.basename(self.url.split('#', 1)[0].split('?', 1)[0]) - - @property - def is_wheel(self): - # type: () -> bool - return self.ext == WHEEL_EXTENSION - - @property - def is_artifact(self): - # type: () -> bool - """ - Determines if this points to an actual artifact (e.g. a tarball) or if - it points to an "abstract" thing like a path or a VCS location. - """ - from pip._internal.vcs import vcs - - if self.scheme in vcs.all_schemes: - return False - - return True diff --git a/env/lib/python3.7/site-packages/pip/_internal/operations/__init__.py b/env/lib/python3.7/site-packages/pip/_internal/operations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/env/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 9eae1946721ec32a108ed04c16807e6b41bf089b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153 zcmZ?b<>g`kg1p5Nu^{>}h=2h`Aj1KOi&=m~3PUi1CZpd2A!{dk~gW=VX!UP0w8 T4x8Nkl+v73JCNC*ftUdR`_m>1 diff --git a/env/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/check.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/check.cpython-37.pyc deleted file mode 100644 index 9f419c6578df86b2fa173302fd6e43f40e8c9bc4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3583 zcmZ`+&2QYs6(@&WE|!N7xHjUbhV9ldk$|9fW+iIL z47x3C%3iMX=(o=tLxcW*{3iEd6&CKKQz2E!I z)5lX&o`Glh$Hg!IecmwsMuVfrM&~0m<(r1Vjlke0XNeh@__Y$2T7hMf&Q9#K7SwdV zmN;oWsO!FyxM?G3=zcx%(q_=qeK%>PQ^AyJ2=lNl&b>8*X)z`L4oi(>CY=pt^(rqp zpUwqy>3lGsE(8ndh2TQE7%Zks!BV;$EMxbAxX7D*wqyjC#FDru=5+tE?$gM^%oSQC zmc`{IL(g8FjIT__K2~29zMgwWSiH$wd}@Oou;3bR^K-9_;9Go=PxG1AW^kR)^7GK# z;B$N)zwhz|egVHXIeTh!miBM{JW667<#9Ijv%b&8NDR3c_F|!EJc@dQXhSIPALQV* zj#+xcC>1>486^UvnO-!^hH(!@_C-ijP|iOQ+dHuosTk&uBdNqEQf3kpvuQLCVYIGt z8TImz$0~>R;)ck>c&PFyNd(tg8L#iqkrZwE?8W03;p&4=RzD4&{A_LQ;o46~`>@(@ z>Q$Y3Y5jP(SGub(6s;$swC}~eymWs$B3n^XT2Dn@)}GPXOZyStUbY`sA9zpXQJko< z{!&PV#ic8&Z%{q@aC#iHCfcWH>MMxCh>Zc0vxG2i{eg`!9s_4%w!4)ZeawGl-ZQ@Z zVr=DRVQsMkb8PP|<`(*PVI9`q8V9T}3wytfh_y1&cSm`Ah;uvPbWUsWDQn zVG40fRcRAeN}EiUrjW>bLyP}>csox=w@2~l{Rx8J=i7V3-4FVkq|^=A%7sMyZ)YPR zHPqGZ-lpgcx}&}Fot_j?F2Ymq4f`@nPY`(xFH?&UM$I)nW}CJ-ZF(j%7tLwbHkVC# z6>~jCEAS9T>S(KI>Yoq=FfnlDG@;}*5Rw}Q#+Yeo?f#`OfRR6s?c9X6rlmuuI56eP z_O;#p!YJ$|V~b%`GOhzX^)1Ye-NG%5L0$fi+v5gwHN2xCUsCVTd22w|kPnL5VIAx0 zefHKgjqL}p<-(Rb_OPz85T4+=-GguZW8Yk{nq{A=DUYI%!0Z&<+ysf8o2 zLFY_#7U{OHVJ$1H2?~F|O0Md+Q`v62pfJhsgkFXjp-K zt%n;yKlDrODVicgaufN(*6wRabxe5)x)Y4aD;SnjXHNPdZPgJs_it$|od!^MMW>Rw z+dZ@C8F;HXl0picN(mx2YasSIQv`1il?69dX=2d<7U;E38p(l>r7K=W$qs;8S`p_u zqsoRFiC)}~X&SBtgAG;bs7&U9!&ojmO}R{#e6mzeV?}9PHnFy!;Dt139pPT5R%@~* z#66(O=~D|UjRgwO-od$GO;iW@x~pdX$06Ux0n~RPjJj*OmSZ~1VV)ErwaYoCzm{cyb2v zf5$GpJUd#gVO5%8Ijh|ht{>Y0Bi0Iv4)WG5c7dS`dcgG0*ZW22zzP7$1`< zMY@Kzil!bxROGq)k*3W%)zx}n9x_m#jY!*?9BX+EJ*Th_>yt~i2I^vmE-q6d!WI!0 zIe!1+)hr$DDKuA?ROKpjw63S zQQXnP{L(hQfr2Du(J#j&kg^Cm7@a8!ipD zd#|99WMzyZq+kO_UfOQ&zK81uW#<;nT!9xs^jp>e$_mWig4a;2kk=j?+qY1tw2yqZ z)~Qt=t}k}|&HB*#BWv4hLMzIu7my2hY=@)dtjy+uymCN5Wo$rls z7)fP9*+BXG2n7+bc&Lk}Ff1J^k%SB`pWO|3bkUB}kZ7cICe|7lNczu6QVAj{vE&p9 zf{Q#y;@c2`_qeKgQT_$>&#FryXs(`I3PE$CrSdsAcWOo}nyYldKM`st$t#3Y{i9i0 zC$Gk$j?}5>>Nrn$EY0{%BJNU{6d}RJHPB+MszFkX)iSTwpfTIH9;TsdTkgDf+nsmM F{}+M8t@{7~ diff --git a/env/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-37.pyc deleted file mode 100644 index 3d9ffee4ff3dfda07afead18d4b22e1842f1b11a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5568 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 diff --git a/env/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-37.pyc deleted file mode 100644 index 5bbd7a328cf09fc624bb90466d9b388bfbb0bc79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10497 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 Rqfx4zm^(i=J-0eH^*;`wCdB{% diff --git a/env/lib/python3.7/site-packages/pip/_internal/operations/check.py b/env/lib/python3.7/site-packages/pip/_internal/operations/check.py deleted file mode 100644 index 920df5d..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/operations/check.py +++ /dev/null @@ -1,155 +0,0 @@ -"""Validation of dependencies of packages -""" - -import logging -from collections import namedtuple - -from pip._vendor.packaging.utils import canonicalize_name -from pip._vendor.pkg_resources import RequirementParseError - -from pip._internal.operations.prepare import make_abstract_dist -from pip._internal.utils.misc import get_installed_distributions -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -logger = logging.getLogger(__name__) - -if MYPY_CHECK_RUNNING: - from pip._internal.req.req_install import InstallRequirement - from typing import ( - Any, Callable, Dict, Optional, Set, Tuple, List - ) - - # Shorthands - PackageSet = Dict[str, 'PackageDetails'] - Missing = Tuple[str, Any] - Conflicting = Tuple[str, str, Any] - - MissingDict = Dict[str, List[Missing]] - ConflictingDict = Dict[str, List[Conflicting]] - CheckResult = Tuple[MissingDict, ConflictingDict] - -PackageDetails = namedtuple('PackageDetails', ['version', 'requires']) - - -def create_package_set_from_installed(**kwargs): - # type: (**Any) -> Tuple[PackageSet, bool] - """Converts a list of distributions into a PackageSet. - """ - # Default to using all packages installed on the system - if kwargs == {}: - kwargs = {"local_only": False, "skip": ()} - - package_set = {} - problems = False - for dist in get_installed_distributions(**kwargs): - name = canonicalize_name(dist.project_name) - try: - package_set[name] = PackageDetails(dist.version, dist.requires()) - except RequirementParseError as e: - # Don't crash on broken metadata - logging.warning("Error parsing requirements for %s: %s", name, e) - problems = True - return package_set, problems - - -def check_package_set(package_set, should_ignore=None): - # type: (PackageSet, Optional[Callable[[str], bool]]) -> CheckResult - """Check if a package set is consistent - - If should_ignore is passed, it should be a callable that takes a - package name and returns a boolean. - """ - if should_ignore is None: - def should_ignore(name): - return False - - missing = dict() - conflicting = dict() - - for package_name in package_set: - # Info about dependencies of package_name - missing_deps = set() # type: Set[Missing] - conflicting_deps = set() # type: Set[Conflicting] - - if should_ignore(package_name): - continue - - for req in package_set[package_name].requires: - name = canonicalize_name(req.project_name) # type: str - - # Check if it's missing - if name not in package_set: - missed = True - if req.marker is not None: - missed = req.marker.evaluate() - if missed: - missing_deps.add((name, req)) - continue - - # Check if there's a conflict - version = package_set[name].version # type: str - if not req.specifier.contains(version, prereleases=True): - conflicting_deps.add((name, version, req)) - - if missing_deps: - missing[package_name] = sorted(missing_deps, key=str) - if conflicting_deps: - conflicting[package_name] = sorted(conflicting_deps, key=str) - - return missing, conflicting - - -def check_install_conflicts(to_install): - # type: (List[InstallRequirement]) -> Tuple[PackageSet, CheckResult] - """For checking if the dependency graph would be consistent after \ - installing given requirements - """ - # Start from the current state - package_set, _ = create_package_set_from_installed() - # Install packages - would_be_installed = _simulate_installation_of(to_install, package_set) - - # Only warn about directly-dependent packages; create a whitelist of them - whitelist = _create_whitelist(would_be_installed, package_set) - - return ( - package_set, - check_package_set( - package_set, should_ignore=lambda name: name not in whitelist - ) - ) - - -def _simulate_installation_of(to_install, package_set): - # type: (List[InstallRequirement], PackageSet) -> Set[str] - """Computes the version of packages after installing to_install. - """ - - # Keep track of packages that were installed - installed = set() - - # Modify it as installing requirement_set would (assuming no errors) - for inst_req in to_install: - dist = make_abstract_dist(inst_req).dist() - name = canonicalize_name(dist.key) - package_set[name] = PackageDetails(dist.version, dist.requires()) - - installed.add(name) - - return installed - - -def _create_whitelist(would_be_installed, package_set): - # type: (Set[str], PackageSet) -> Set[str] - packages_affected = set(would_be_installed) - - for package_name in package_set: - if package_name in packages_affected: - continue - - for req in package_set[package_name].requires: - if canonicalize_name(req.name) in packages_affected: - packages_affected.add(package_name) - break - - return packages_affected diff --git a/env/lib/python3.7/site-packages/pip/_internal/operations/freeze.py b/env/lib/python3.7/site-packages/pip/_internal/operations/freeze.py deleted file mode 100644 index 0c4c761..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/operations/freeze.py +++ /dev/null @@ -1,247 +0,0 @@ -from __future__ import absolute_import - -import collections -import logging -import os -import re - -from pip._vendor import six -from pip._vendor.packaging.utils import canonicalize_name -from pip._vendor.pkg_resources import RequirementParseError - -from pip._internal.exceptions import BadCommand, InstallationError -from pip._internal.req.constructors import ( - install_req_from_editable, install_req_from_line, -) -from pip._internal.req.req_file import COMMENT_RE -from pip._internal.utils.misc import ( - dist_is_editable, get_installed_distributions, -) -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import ( - Iterator, Optional, List, Container, Set, Dict, Tuple, Iterable, Union - ) - from pip._internal.cache import WheelCache - from pip._vendor.pkg_resources import ( - Distribution, Requirement - ) - - RequirementInfo = Tuple[Optional[Union[str, Requirement]], bool, List[str]] - - -logger = logging.getLogger(__name__) - - -def freeze( - requirement=None, # type: Optional[List[str]] - find_links=None, # type: Optional[List[str]] - local_only=None, # type: Optional[bool] - user_only=None, # type: Optional[bool] - skip_regex=None, # type: Optional[str] - isolated=False, # type: bool - wheel_cache=None, # type: Optional[WheelCache] - exclude_editable=False, # type: bool - skip=() # type: Container[str] -): - # type: (...) -> Iterator[str] - find_links = find_links or [] - skip_match = None - - if skip_regex: - skip_match = re.compile(skip_regex).search - - for link in find_links: - yield '-f %s' % link - installations = {} # type: Dict[str, FrozenRequirement] - for dist in get_installed_distributions(local_only=local_only, - skip=(), - user_only=user_only): - try: - req = FrozenRequirement.from_dist(dist) - except RequirementParseError: - logger.warning( - "Could not parse requirement: %s", - dist.project_name - ) - continue - if exclude_editable and req.editable: - continue - installations[req.name] = req - - if requirement: - # the options that don't get turned into an InstallRequirement - # should only be emitted once, even if the same option is in multiple - # requirements files, so we need to keep track of what has been emitted - # so that we don't emit it again if it's seen again - emitted_options = set() # type: Set[str] - # keep track of which files a requirement is in so that we can - # give an accurate warning if a requirement appears multiple times. - req_files = collections.defaultdict(list) # type: Dict[str, List[str]] - for req_file_path in requirement: - with open(req_file_path) as req_file: - for line in req_file: - if (not line.strip() or - line.strip().startswith('#') or - (skip_match and skip_match(line)) or - line.startswith(( - '-r', '--requirement', - '-Z', '--always-unzip', - '-f', '--find-links', - '-i', '--index-url', - '--pre', - '--trusted-host', - '--process-dependency-links', - '--extra-index-url'))): - line = line.rstrip() - if line not in emitted_options: - emitted_options.add(line) - yield line - continue - - if line.startswith('-e') or line.startswith('--editable'): - if line.startswith('-e'): - line = line[2:].strip() - else: - line = line[len('--editable'):].strip().lstrip('=') - line_req = install_req_from_editable( - line, - isolated=isolated, - wheel_cache=wheel_cache, - ) - else: - line_req = install_req_from_line( - COMMENT_RE.sub('', line).strip(), - isolated=isolated, - wheel_cache=wheel_cache, - ) - - if not line_req.name: - logger.info( - "Skipping line in requirement file [%s] because " - "it's not clear what it would install: %s", - req_file_path, line.strip(), - ) - logger.info( - " (add #egg=PackageName to the URL to avoid" - " this warning)" - ) - elif line_req.name not in installations: - # either it's not installed, or it is installed - # but has been processed already - if not req_files[line_req.name]: - logger.warning( - "Requirement file [%s] contains %s, but " - "package %r is not installed", - req_file_path, - COMMENT_RE.sub('', line).strip(), line_req.name - ) - else: - req_files[line_req.name].append(req_file_path) - else: - yield str(installations[line_req.name]).rstrip() - del installations[line_req.name] - req_files[line_req.name].append(req_file_path) - - # Warn about requirements that were included multiple times (in a - # single requirements file or in different requirements files). - for name, files in six.iteritems(req_files): - if len(files) > 1: - logger.warning("Requirement %s included multiple times [%s]", - name, ', '.join(sorted(set(files)))) - - yield( - '## The following requirements were added by ' - 'pip freeze:' - ) - for installation in sorted( - installations.values(), key=lambda x: x.name.lower()): - if canonicalize_name(installation.name) not in skip: - yield str(installation).rstrip() - - -def get_requirement_info(dist): - # type: (Distribution) -> RequirementInfo - """ - Compute and return values (req, editable, comments) for use in - FrozenRequirement.from_dist(). - """ - if not dist_is_editable(dist): - return (None, False, []) - - location = os.path.normcase(os.path.abspath(dist.location)) - - from pip._internal.vcs import vcs, RemoteNotFoundError - vc_type = vcs.get_backend_type(location) - - if not vc_type: - req = dist.as_requirement() - logger.debug( - 'No VCS found for editable requirement {!r} in: {!r}', req, - location, - ) - comments = [ - '# Editable install with no version control ({})'.format(req) - ] - return (location, True, comments) - - try: - req = vc_type.get_src_requirement(location, dist.project_name) - except RemoteNotFoundError: - req = dist.as_requirement() - comments = [ - '# Editable {} install with no remote ({})'.format( - vc_type.__name__, req, - ) - ] - return (location, True, comments) - - except BadCommand: - logger.warning( - 'cannot determine version of editable source in %s ' - '(%s command not found in path)', - location, - vc_type.name, - ) - return (None, True, []) - - except InstallationError as exc: - logger.warning( - "Error when trying to get requirement for VCS system %s, " - "falling back to uneditable format", exc - ) - else: - if req is not None: - return (req, True, []) - - logger.warning( - 'Could not determine repository location of %s', location - ) - comments = ['## !! Could not determine repository location'] - - return (None, False, comments) - - -class FrozenRequirement(object): - def __init__(self, name, req, editable, comments=()): - # type: (str, Union[str, Requirement], bool, Iterable[str]) -> None - self.name = name - self.req = req - self.editable = editable - self.comments = comments - - @classmethod - def from_dist(cls, dist): - # type: (Distribution) -> FrozenRequirement - req, editable, comments = get_requirement_info(dist) - if req is None: - req = dist.as_requirement() - - return cls(dist.project_name, req, editable, comments=comments) - - def __str__(self): - req = self.req - if self.editable: - req = '-e %s' % req - return '\n'.join(list(self.comments) + [str(req)]) + '\n' diff --git a/env/lib/python3.7/site-packages/pip/_internal/operations/prepare.py b/env/lib/python3.7/site-packages/pip/_internal/operations/prepare.py deleted file mode 100644 index 077a985..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/operations/prepare.py +++ /dev/null @@ -1,426 +0,0 @@ -"""Prepares a distribution for installation -""" - -import logging -import os - -from pip._vendor import pkg_resources, requests - -from pip._internal.build_env import BuildEnvironment -from pip._internal.download import ( - is_dir_url, is_file_url, is_vcs_url, unpack_url, url_to_path, -) -from pip._internal.exceptions import ( - DirectoryUrlHashUnsupported, HashUnpinned, InstallationError, - PreviousBuildDirError, VcsHashUnsupported, -) -from pip._internal.utils.compat import expanduser -from pip._internal.utils.hashes import MissingHashes -from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import display_path, normalize_path -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Any, Optional - from pip._internal.req.req_install import InstallRequirement - from pip._internal.index import PackageFinder - from pip._internal.download import PipSession - from pip._internal.req.req_tracker import RequirementTracker - -logger = logging.getLogger(__name__) - - -def make_abstract_dist(req): - # type: (InstallRequirement) -> DistAbstraction - """Factory to make an abstract dist object. - - Preconditions: Either an editable req with a source_dir, or satisfied_by or - a wheel link, or a non-editable req with a source_dir. - - :return: A concrete DistAbstraction. - """ - if req.editable: - return IsSDist(req) - elif req.link and req.link.is_wheel: - return IsWheel(req) - else: - return IsSDist(req) - - -class DistAbstraction(object): - """Abstracts out the wheel vs non-wheel Resolver.resolve() logic. - - The requirements for anything installable are as follows: - - we must be able to determine the requirement name - (or we can't correctly handle the non-upgrade case). - - we must be able to generate a list of run-time dependencies - without installing any additional packages (or we would - have to either burn time by doing temporary isolated installs - or alternatively violate pips 'don't start installing unless - all requirements are available' rule - neither of which are - desirable). - - for packages with setup requirements, we must also be able - to determine their requirements without installing additional - packages (for the same reason as run-time dependencies) - - we must be able to create a Distribution object exposing the - above metadata. - """ - - def __init__(self, req): - # type: (InstallRequirement) -> None - self.req = req # type: InstallRequirement - - def dist(self): - # type: () -> Any - """Return a setuptools Dist object.""" - raise NotImplementedError - - def prep_for_dist(self, finder, build_isolation): - # type: (PackageFinder, bool) -> Any - """Ensure that we can get a Dist for this requirement.""" - raise NotImplementedError - - -class IsWheel(DistAbstraction): - - def dist(self): - # type: () -> pkg_resources.Distribution - return list(pkg_resources.find_distributions( - self.req.source_dir))[0] - - def prep_for_dist(self, finder, build_isolation): - # type: (PackageFinder, bool) -> Any - # FIXME:https://github.com/pypa/pip/issues/1112 - pass - - -class IsSDist(DistAbstraction): - - def dist(self): - return self.req.get_dist() - - def _raise_conflicts(self, conflicting_with, conflicting_reqs): - conflict_messages = [ - '%s is incompatible with %s' % (installed, wanted) - for installed, wanted in sorted(conflicting_reqs) - ] - raise InstallationError( - "Some build dependencies for %s conflict with %s: %s." % ( - self.req, conflicting_with, ', '.join(conflict_messages)) - ) - - def install_backend_dependencies(self, finder): - # type: (PackageFinder) -> None - """ - Install any extra build dependencies that the backend requests. - - :param finder: a PackageFinder object. - """ - req = self.req - with req.build_env: - # We need to have the env active when calling the hook. - req.spin_message = "Getting requirements to build wheel" - reqs = req.pep517_backend.get_requires_for_build_wheel() - conflicting, missing = req.build_env.check_requirements(reqs) - if conflicting: - self._raise_conflicts("the backend dependencies", conflicting) - req.build_env.install_requirements( - finder, missing, 'normal', - "Installing backend dependencies" - ) - - def prep_for_dist(self, finder, build_isolation): - # type: (PackageFinder, bool) -> None - # Prepare for building. We need to: - # 1. Load pyproject.toml (if it exists) - # 2. Set up the build environment - - self.req.load_pyproject_toml() - should_isolate = self.req.use_pep517 and build_isolation - - if should_isolate: - # Isolate in a BuildEnvironment and install the build-time - # requirements. - self.req.build_env = BuildEnvironment() - self.req.build_env.install_requirements( - finder, self.req.pyproject_requires, 'overlay', - "Installing build dependencies" - ) - conflicting, missing = self.req.build_env.check_requirements( - self.req.requirements_to_check - ) - if conflicting: - self._raise_conflicts("PEP 517/518 supported requirements", - conflicting) - if missing: - logger.warning( - "Missing build requirements in pyproject.toml for %s.", - self.req, - ) - logger.warning( - "The project does not specify a build backend, and " - "pip cannot fall back to setuptools without %s.", - " and ".join(map(repr, sorted(missing))) - ) - - # Install any extra build dependencies that the backend requests. - # This must be done in a second pass, as the pyproject.toml - # dependencies must be installed before we can call the backend. - self.install_backend_dependencies(finder=finder) - - self.req.prepare_metadata() - self.req.assert_source_matches_version() - - -class Installed(DistAbstraction): - - def dist(self): - # type: () -> pkg_resources.Distribution - return self.req.satisfied_by - - def prep_for_dist(self, finder, build_isolation): - # type: (PackageFinder, bool) -> Any - pass - - -class RequirementPreparer(object): - """Prepares a Requirement - """ - - def __init__( - self, - build_dir, # type: str - download_dir, # type: Optional[str] - src_dir, # type: str - wheel_download_dir, # type: Optional[str] - progress_bar, # type: str - build_isolation, # type: bool - req_tracker # type: RequirementTracker - ): - # type: (...) -> None - super(RequirementPreparer, self).__init__() - - self.src_dir = src_dir - self.build_dir = build_dir - self.req_tracker = req_tracker - - # Where still packed archives should be written to. If None, they are - # not saved, and are deleted immediately after unpacking. - self.download_dir = download_dir - - # Where still-packed .whl files should be written to. If None, they are - # written to the download_dir parameter. Separate to download_dir to - # permit only keeping wheel archives for pip wheel. - if wheel_download_dir: - wheel_download_dir = normalize_path(wheel_download_dir) - self.wheel_download_dir = wheel_download_dir - - # NOTE - # download_dir and wheel_download_dir overlap semantically and may - # be combined if we're willing to have non-wheel archives present in - # the wheelhouse output by 'pip wheel'. - - self.progress_bar = progress_bar - - # Is build isolation allowed? - self.build_isolation = build_isolation - - @property - def _download_should_save(self): - # type: () -> bool - # TODO: Modify to reduce indentation needed - if self.download_dir: - self.download_dir = expanduser(self.download_dir) - if os.path.exists(self.download_dir): - return True - else: - logger.critical('Could not find download directory') - raise InstallationError( - "Could not find or access download directory '%s'" - % display_path(self.download_dir)) - return False - - def prepare_linked_requirement( - self, - req, # type: InstallRequirement - session, # type: PipSession - finder, # type: PackageFinder - upgrade_allowed, # type: bool - require_hashes # type: bool - ): - # type: (...) -> DistAbstraction - """Prepare a requirement that would be obtained from req.link - """ - # TODO: Breakup into smaller functions - if req.link and req.link.scheme == 'file': - path = url_to_path(req.link.url) - logger.info('Processing %s', display_path(path)) - else: - logger.info('Collecting %s', req) - - with indent_log(): - # @@ if filesystem packages are not marked - # editable in a req, a non deterministic error - # occurs when the script attempts to unpack the - # build directory - req.ensure_has_source_dir(self.build_dir) - # If a checkout exists, it's unwise to keep going. version - # inconsistencies are logged later, but do not fail the - # installation. - # FIXME: this won't upgrade when there's an existing - # package unpacked in `req.source_dir` - # package unpacked in `req.source_dir` - if os.path.exists(os.path.join(req.source_dir, 'setup.py')): - raise PreviousBuildDirError( - "pip can't proceed with requirements '%s' due to a" - " pre-existing build directory (%s). This is " - "likely due to a previous installation that failed" - ". pip is being responsible and not assuming it " - "can delete this. Please delete it and try again." - % (req, req.source_dir) - ) - req.populate_link(finder, upgrade_allowed, require_hashes) - - # We can't hit this spot and have populate_link return None. - # req.satisfied_by is None here (because we're - # guarded) and upgrade has no impact except when satisfied_by - # is not None. - # Then inside find_requirement existing_applicable -> False - # If no new versions are found, DistributionNotFound is raised, - # otherwise a result is guaranteed. - assert req.link - link = req.link - - # Now that we have the real link, we can tell what kind of - # requirements we have and raise some more informative errors - # than otherwise. (For example, we can raise VcsHashUnsupported - # for a VCS URL rather than HashMissing.) - if require_hashes: - # We could check these first 2 conditions inside - # unpack_url and save repetition of conditions, but then - # we would report less-useful error messages for - # unhashable requirements, complaining that there's no - # hash provided. - if is_vcs_url(link): - raise VcsHashUnsupported() - elif is_file_url(link) and is_dir_url(link): - raise DirectoryUrlHashUnsupported() - if not req.original_link and not req.is_pinned: - # Unpinned packages are asking for trouble when a new - # version is uploaded. This isn't a security check, but - # it saves users a surprising hash mismatch in the - # future. - # - # file:/// URLs aren't pinnable, so don't complain - # about them not being pinned. - raise HashUnpinned() - - hashes = req.hashes(trust_internet=not require_hashes) - if require_hashes and not hashes: - # Known-good hashes are missing for this requirement, so - # shim it with a facade object that will provoke hash - # computation and then raise a HashMissing exception - # showing the user what the hash should be. - hashes = MissingHashes() - - try: - download_dir = self.download_dir - # We always delete unpacked sdists after pip ran. - autodelete_unpacked = True - if req.link.is_wheel and self.wheel_download_dir: - # when doing 'pip wheel` we download wheels to a - # dedicated dir. - download_dir = self.wheel_download_dir - if req.link.is_wheel: - if download_dir: - # When downloading, we only unpack wheels to get - # metadata. - autodelete_unpacked = True - else: - # When installing a wheel, we use the unpacked - # wheel. - autodelete_unpacked = False - unpack_url( - req.link, req.source_dir, - download_dir, autodelete_unpacked, - session=session, hashes=hashes, - progress_bar=self.progress_bar - ) - except requests.HTTPError as exc: - logger.critical( - 'Could not install requirement %s because of error %s', - req, - exc, - ) - raise InstallationError( - 'Could not install requirement %s because of HTTP ' - 'error %s for URL %s' % - (req, exc, req.link) - ) - abstract_dist = make_abstract_dist(req) - with self.req_tracker.track(req): - abstract_dist.prep_for_dist(finder, self.build_isolation) - if self._download_should_save: - # Make a .zip of the source_dir we already created. - if not req.link.is_artifact: - req.archive(self.download_dir) - return abstract_dist - - def prepare_editable_requirement( - self, - req, # type: InstallRequirement - require_hashes, # type: bool - use_user_site, # type: bool - finder # type: PackageFinder - ): - # type: (...) -> DistAbstraction - """Prepare an editable requirement - """ - assert req.editable, "cannot prepare a non-editable req as editable" - - logger.info('Obtaining %s', req) - - with indent_log(): - if require_hashes: - raise InstallationError( - 'The editable requirement %s cannot be installed when ' - 'requiring hashes, because there is no single file to ' - 'hash.' % req - ) - req.ensure_has_source_dir(self.src_dir) - req.update_editable(not self._download_should_save) - - abstract_dist = make_abstract_dist(req) - with self.req_tracker.track(req): - abstract_dist.prep_for_dist(finder, self.build_isolation) - - if self._download_should_save: - req.archive(self.download_dir) - req.check_if_exists(use_user_site) - - return abstract_dist - - def prepare_installed_requirement(self, req, require_hashes, skip_reason): - # type: (InstallRequirement, bool, Optional[str]) -> DistAbstraction - """Prepare an already-installed requirement - """ - assert req.satisfied_by, "req should have been satisfied but isn't" - assert skip_reason is not None, ( - "did not get skip reason skipped but req.satisfied_by " - "is set to %r" % (req.satisfied_by,) - ) - logger.info( - 'Requirement %s: %s (%s)', - skip_reason, req, req.satisfied_by.version - ) - with indent_log(): - if require_hashes: - logger.debug( - 'Since it is already installed, we are trusting this ' - 'package without checking its hash. To ensure a ' - 'completely repeatable environment, install into an ' - 'empty virtualenv.' - ) - abstract_dist = Installed(req) - - return abstract_dist diff --git a/env/lib/python3.7/site-packages/pip/_internal/pep425tags.py b/env/lib/python3.7/site-packages/pip/_internal/pep425tags.py deleted file mode 100644 index 3b68f28..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/pep425tags.py +++ /dev/null @@ -1,381 +0,0 @@ -"""Generate and work with PEP 425 Compatibility Tags.""" -from __future__ import absolute_import - -import distutils.util -import logging -import platform -import re -import sys -import sysconfig -import warnings -from collections import OrderedDict - -import pip._internal.utils.glibc -from pip._internal.utils.compat import get_extension_suffixes -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import ( - Tuple, Callable, List, Optional, Union, Dict - ) - - Pep425Tag = Tuple[str, str, str] - -logger = logging.getLogger(__name__) - -_osx_arch_pat = re.compile(r'(.+)_(\d+)_(\d+)_(.+)') - - -def get_config_var(var): - # type: (str) -> Optional[str] - try: - return sysconfig.get_config_var(var) - except IOError as e: # Issue #1074 - warnings.warn("{}".format(e), RuntimeWarning) - return None - - -def get_abbr_impl(): - # type: () -> str - """Return abbreviated implementation name.""" - if hasattr(sys, 'pypy_version_info'): - pyimpl = 'pp' - elif sys.platform.startswith('java'): - pyimpl = 'jy' - elif sys.platform == 'cli': - pyimpl = 'ip' - else: - pyimpl = 'cp' - return pyimpl - - -def get_impl_ver(): - # type: () -> str - """Return implementation version.""" - impl_ver = get_config_var("py_version_nodot") - if not impl_ver or get_abbr_impl() == 'pp': - impl_ver = ''.join(map(str, get_impl_version_info())) - return impl_ver - - -def get_impl_version_info(): - # type: () -> Tuple[int, ...] - """Return sys.version_info-like tuple for use in decrementing the minor - version.""" - if get_abbr_impl() == 'pp': - # as per https://github.com/pypa/pip/issues/2882 - # attrs exist only on pypy - return (sys.version_info[0], - sys.pypy_version_info.major, # type: ignore - sys.pypy_version_info.minor) # type: ignore - else: - return sys.version_info[0], sys.version_info[1] - - -def get_impl_tag(): - # type: () -> str - """ - Returns the Tag for this specific implementation. - """ - return "{}{}".format(get_abbr_impl(), get_impl_ver()) - - -def get_flag(var, fallback, expected=True, warn=True): - # type: (str, Callable[..., bool], Union[bool, int], bool) -> bool - """Use a fallback method for determining SOABI flags if the needed config - var is unset or unavailable.""" - val = get_config_var(var) - if val is None: - if warn: - logger.debug("Config variable '%s' is unset, Python ABI tag may " - "be incorrect", var) - return fallback() - return val == expected - - -def get_abi_tag(): - # type: () -> Optional[str] - """Return the ABI tag based on SOABI (if available) or emulate SOABI - (CPython 2, PyPy).""" - soabi = get_config_var('SOABI') - impl = get_abbr_impl() - if not soabi and impl in {'cp', 'pp'} and hasattr(sys, 'maxunicode'): - d = '' - m = '' - u = '' - if get_flag('Py_DEBUG', - lambda: hasattr(sys, 'gettotalrefcount'), - warn=(impl == 'cp')): - d = 'd' - if get_flag('WITH_PYMALLOC', - lambda: impl == 'cp', - warn=(impl == 'cp')): - m = 'm' - if get_flag('Py_UNICODE_SIZE', - lambda: sys.maxunicode == 0x10ffff, - expected=4, - warn=(impl == 'cp' and - sys.version_info < (3, 3))) \ - and sys.version_info < (3, 3): - u = 'u' - abi = '%s%s%s%s%s' % (impl, get_impl_ver(), d, m, u) - elif soabi and soabi.startswith('cpython-'): - abi = 'cp' + soabi.split('-')[1] - elif soabi: - abi = soabi.replace('.', '_').replace('-', '_') - else: - abi = None - return abi - - -def _is_running_32bit(): - # type: () -> bool - return sys.maxsize == 2147483647 - - -def get_platform(): - # type: () -> str - """Return our platform name 'win32', 'linux_x86_64'""" - if sys.platform == 'darwin': - # distutils.util.get_platform() returns the release based on the value - # of MACOSX_DEPLOYMENT_TARGET on which Python was built, which may - # be significantly older than the user's current machine. - release, _, machine = platform.mac_ver() - split_ver = release.split('.') - - if machine == "x86_64" and _is_running_32bit(): - machine = "i386" - elif machine == "ppc64" and _is_running_32bit(): - machine = "ppc" - - return 'macosx_{}_{}_{}'.format(split_ver[0], split_ver[1], machine) - - # XXX remove distutils dependency - result = distutils.util.get_platform().replace('.', '_').replace('-', '_') - if result == "linux_x86_64" and _is_running_32bit(): - # 32 bit Python program (running on a 64 bit Linux): pip should only - # install and run 32 bit compiled extensions in that case. - result = "linux_i686" - - return result - - -def is_manylinux1_compatible(): - # type: () -> bool - # Only Linux, and only x86-64 / i686 - if get_platform() not in {"linux_x86_64", "linux_i686"}: - return False - - # Check for presence of _manylinux module - try: - import _manylinux - return bool(_manylinux.manylinux1_compatible) - except (ImportError, AttributeError): - # Fall through to heuristic check below - pass - - # Check glibc version. CentOS 5 uses glibc 2.5. - return pip._internal.utils.glibc.have_compatible_glibc(2, 5) - - -def is_manylinux2010_compatible(): - # type: () -> bool - # Only Linux, and only x86-64 / i686 - if get_platform() not in {"linux_x86_64", "linux_i686"}: - return False - - # Check for presence of _manylinux module - try: - import _manylinux - return bool(_manylinux.manylinux2010_compatible) - except (ImportError, AttributeError): - # Fall through to heuristic check below - pass - - # Check glibc version. CentOS 6 uses glibc 2.12. - return pip._internal.utils.glibc.have_compatible_glibc(2, 12) - - -def get_darwin_arches(major, minor, machine): - # type: (int, int, str) -> List[str] - """Return a list of supported arches (including group arches) for - the given major, minor and machine architecture of an macOS machine. - """ - arches = [] - - def _supports_arch(major, minor, arch): - # type: (int, int, str) -> bool - # Looking at the application support for macOS versions in the chart - # provided by https://en.wikipedia.org/wiki/OS_X#Versions it appears - # our timeline looks roughly like: - # - # 10.0 - Introduces ppc support. - # 10.4 - Introduces ppc64, i386, and x86_64 support, however the ppc64 - # and x86_64 support is CLI only, and cannot be used for GUI - # applications. - # 10.5 - Extends ppc64 and x86_64 support to cover GUI applications. - # 10.6 - Drops support for ppc64 - # 10.7 - Drops support for ppc - # - # Given that we do not know if we're installing a CLI or a GUI - # application, we must be conservative and assume it might be a GUI - # application and behave as if ppc64 and x86_64 support did not occur - # until 10.5. - # - # Note: The above information is taken from the "Application support" - # column in the chart not the "Processor support" since I believe - # that we care about what instruction sets an application can use - # not which processors the OS supports. - if arch == 'ppc': - return (major, minor) <= (10, 5) - if arch == 'ppc64': - return (major, minor) == (10, 5) - if arch == 'i386': - return (major, minor) >= (10, 4) - if arch == 'x86_64': - return (major, minor) >= (10, 5) - if arch in groups: - for garch in groups[arch]: - if _supports_arch(major, minor, garch): - return True - return False - - groups = OrderedDict([ - ("fat", ("i386", "ppc")), - ("intel", ("x86_64", "i386")), - ("fat64", ("x86_64", "ppc64")), - ("fat32", ("x86_64", "i386", "ppc")), - ]) # type: Dict[str, Tuple[str, ...]] - - if _supports_arch(major, minor, machine): - arches.append(machine) - - for garch in groups: - if machine in groups[garch] and _supports_arch(major, minor, garch): - arches.append(garch) - - arches.append('universal') - - return arches - - -def get_all_minor_versions_as_strings(version_info): - # type: (Tuple[int, ...]) -> List[str] - versions = [] - major = version_info[:-1] - # Support all previous minor Python versions. - for minor in range(version_info[-1], -1, -1): - versions.append(''.join(map(str, major + (minor,)))) - return versions - - -def get_supported( - versions=None, # type: Optional[List[str]] - noarch=False, # type: bool - platform=None, # type: Optional[str] - impl=None, # type: Optional[str] - abi=None # type: Optional[str] -): - # type: (...) -> List[Pep425Tag] - """Return a list of supported tags for each version specified in - `versions`. - - :param versions: a list of string versions, of the form ["33", "32"], - or None. The first version will be assumed to support our ABI. - :param platform: specify the exact platform you want valid - tags for, or None. If None, use the local system platform. - :param impl: specify the exact implementation you want valid - tags for, or None. If None, use the local interpreter impl. - :param abi: specify the exact abi you want valid - tags for, or None. If None, use the local interpreter abi. - """ - supported = [] - - # Versions must be given with respect to the preference - if versions is None: - version_info = get_impl_version_info() - versions = get_all_minor_versions_as_strings(version_info) - - impl = impl or get_abbr_impl() - - abis = [] # type: List[str] - - abi = abi or get_abi_tag() - if abi: - abis[0:0] = [abi] - - abi3s = set() - for suffix in get_extension_suffixes(): - if suffix.startswith('.abi'): - abi3s.add(suffix.split('.', 2)[1]) - - abis.extend(sorted(list(abi3s))) - - abis.append('none') - - if not noarch: - arch = platform or get_platform() - arch_prefix, arch_sep, arch_suffix = arch.partition('_') - if arch.startswith('macosx'): - # support macosx-10.6-intel on macosx-10.9-x86_64 - match = _osx_arch_pat.match(arch) - if match: - name, major, minor, actual_arch = match.groups() - tpl = '{}_{}_%i_%s'.format(name, major) - arches = [] - for m in reversed(range(int(minor) + 1)): - for a in get_darwin_arches(int(major), m, actual_arch): - arches.append(tpl % (m, a)) - else: - # arch pattern didn't match (?!) - arches = [arch] - elif arch_prefix == 'manylinux2010': - # manylinux1 wheels run on most manylinux2010 systems with the - # exception of wheels depending on ncurses. PEP 571 states - # manylinux1 wheels should be considered manylinux2010 wheels: - # https://www.python.org/dev/peps/pep-0571/#backwards-compatibility-with-manylinux1-wheels - arches = [arch, 'manylinux1' + arch_sep + arch_suffix] - elif platform is None: - arches = [] - if is_manylinux2010_compatible(): - arches.append('manylinux2010' + arch_sep + arch_suffix) - if is_manylinux1_compatible(): - arches.append('manylinux1' + arch_sep + arch_suffix) - arches.append(arch) - else: - arches = [arch] - - # Current version, current API (built specifically for our Python): - for abi in abis: - for arch in arches: - supported.append(('%s%s' % (impl, versions[0]), abi, arch)) - - # abi3 modules compatible with older version of Python - for version in versions[1:]: - # abi3 was introduced in Python 3.2 - if version in {'31', '30'}: - break - for abi in abi3s: # empty set if not Python 3 - for arch in arches: - supported.append(("%s%s" % (impl, version), abi, arch)) - - # Has binaries, does not use the Python API: - for arch in arches: - supported.append(('py%s' % (versions[0][0]), 'none', arch)) - - # No abi / arch, but requires our implementation: - supported.append(('%s%s' % (impl, versions[0]), 'none', 'any')) - # Tagged specifically as being cross-version compatible - # (with just the major version specified) - supported.append(('%s%s' % (impl, versions[0][0]), 'none', 'any')) - - # No abi / arch, generic Python - for i, version in enumerate(versions): - supported.append(('py%s' % (version,), 'none', 'any')) - if i == 0: - supported.append(('py%s' % (version[0]), 'none', 'any')) - - return supported - - -implementation_tag = get_impl_tag() diff --git a/env/lib/python3.7/site-packages/pip/_internal/pyproject.py b/env/lib/python3.7/site-packages/pip/_internal/pyproject.py deleted file mode 100644 index 43efbed..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/pyproject.py +++ /dev/null @@ -1,171 +0,0 @@ -from __future__ import absolute_import - -import io -import os -import sys - -from pip._vendor import pytoml, six - -from pip._internal.exceptions import InstallationError -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Any, Tuple, Optional, List - - -def _is_list_of_str(obj): - # type: (Any) -> bool - return ( - isinstance(obj, list) and - all(isinstance(item, six.string_types) for item in obj) - ) - - -def make_pyproject_path(setup_py_dir): - # type: (str) -> str - path = os.path.join(setup_py_dir, 'pyproject.toml') - - # Python2 __file__ should not be unicode - if six.PY2 and isinstance(path, six.text_type): - path = path.encode(sys.getfilesystemencoding()) - - return path - - -def load_pyproject_toml( - use_pep517, # type: Optional[bool] - pyproject_toml, # type: str - setup_py, # type: str - req_name # type: str -): - # type: (...) -> Optional[Tuple[List[str], str, List[str]]] - """Load the pyproject.toml file. - - Parameters: - use_pep517 - Has the user requested PEP 517 processing? None - means the user hasn't explicitly specified. - pyproject_toml - Location of the project's pyproject.toml file - setup_py - Location of the project's setup.py file - req_name - The name of the requirement we're processing (for - error reporting) - - Returns: - None if we should use the legacy code path, otherwise a tuple - ( - requirements from pyproject.toml, - name of PEP 517 backend, - requirements we should check are installed after setting - up the build environment - ) - """ - has_pyproject = os.path.isfile(pyproject_toml) - has_setup = os.path.isfile(setup_py) - - if has_pyproject: - with io.open(pyproject_toml, encoding="utf-8") as f: - pp_toml = pytoml.load(f) - build_system = pp_toml.get("build-system") - else: - build_system = None - - # The following cases must use PEP 517 - # We check for use_pep517 being non-None and falsey because that means - # the user explicitly requested --no-use-pep517. The value 0 as - # opposed to False can occur when the value is provided via an - # environment variable or config file option (due to the quirk of - # strtobool() returning an integer in pip's configuration code). - if has_pyproject and not has_setup: - if use_pep517 is not None and not use_pep517: - raise InstallationError( - "Disabling PEP 517 processing is invalid: " - "project does not have a setup.py" - ) - use_pep517 = True - elif build_system and "build-backend" in build_system: - if use_pep517 is not None and not use_pep517: - raise InstallationError( - "Disabling PEP 517 processing is invalid: " - "project specifies a build backend of {} " - "in pyproject.toml".format( - build_system["build-backend"] - ) - ) - use_pep517 = True - - # If we haven't worked out whether to use PEP 517 yet, - # and the user hasn't explicitly stated a preference, - # we do so if the project has a pyproject.toml file. - elif use_pep517 is None: - use_pep517 = has_pyproject - - # At this point, we know whether we're going to use PEP 517. - assert use_pep517 is not None - - # If we're using the legacy code path, there is nothing further - # for us to do here. - if not use_pep517: - return None - - if build_system is None: - # Either the user has a pyproject.toml with no build-system - # section, or the user has no pyproject.toml, but has opted in - # explicitly via --use-pep517. - # In the absence of any explicit backend specification, we - # assume the setuptools backend that most closely emulates the - # traditional direct setup.py execution, and require wheel and - # a version of setuptools that supports that backend. - - build_system = { - "requires": ["setuptools>=40.8.0", "wheel"], - "build-backend": "setuptools.build_meta:__legacy__", - } - - # If we're using PEP 517, we have build system information (either - # from pyproject.toml, or defaulted by the code above). - # Note that at this point, we do not know if the user has actually - # specified a backend, though. - assert build_system is not None - - # Ensure that the build-system section in pyproject.toml conforms - # to PEP 518. - error_template = ( - "{package} has a pyproject.toml file that does not comply " - "with PEP 518: {reason}" - ) - - # Specifying the build-system table but not the requires key is invalid - if "requires" not in build_system: - raise InstallationError( - error_template.format(package=req_name, reason=( - "it has a 'build-system' table but not " - "'build-system.requires' which is mandatory in the table" - )) - ) - - # Error out if requires is not a list of strings - requires = build_system["requires"] - if not _is_list_of_str(requires): - raise InstallationError(error_template.format( - package=req_name, - reason="'build-system.requires' is not a list of strings.", - )) - - backend = build_system.get("build-backend") - check = [] # type: List[str] - if backend is None: - # If the user didn't specify a backend, we assume they want to use - # the setuptools backend. But we can't be sure they have included - # a version of setuptools which supplies the backend, or wheel - # (which is needed by the backend) in their requirements. So we - # make a note to check that those requirements are present once - # we have set up the environment. - # This is quite a lot of work to check for a very specific case. But - # the problem is, that case is potentially quite common - projects that - # adopted PEP 518 early for the ability to specify requirements to - # execute setup.py, but never considered needing to mention the build - # tools themselves. The original PEP 518 code had a similar check (but - # implemented in a different way). - backend = "setuptools.build_meta:__legacy__" - check = ["setuptools>=40.8.0", "wheel"] - - return (requires, backend, check) diff --git a/env/lib/python3.7/site-packages/pip/_internal/req/__init__.py b/env/lib/python3.7/site-packages/pip/_internal/req/__init__.py deleted file mode 100644 index c39f63f..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/req/__init__.py +++ /dev/null @@ -1,78 +0,0 @@ -from __future__ import absolute_import - -import logging - -from .req_install import InstallRequirement -from .req_set import RequirementSet -from .req_file import parse_requirements -from pip._internal.utils.logging import indent_log -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Any, List, Sequence - -__all__ = [ - "RequirementSet", "InstallRequirement", - "parse_requirements", "install_given_reqs", -] - -logger = logging.getLogger(__name__) - - -def install_given_reqs( - to_install, # type: List[InstallRequirement] - install_options, # type: List[str] - global_options=(), # type: Sequence[str] - *args, # type: Any - **kwargs # type: Any -): - # type: (...) -> List[InstallRequirement] - """ - Install everything in the given list. - - (to be called after having downloaded and unpacked the packages) - """ - - if to_install: - logger.info( - 'Installing collected packages: %s', - ', '.join([req.name for req in to_install]), - ) - - with indent_log(): - for requirement in to_install: - if requirement.conflicts_with: - logger.info( - 'Found existing installation: %s', - requirement.conflicts_with, - ) - with indent_log(): - uninstalled_pathset = requirement.uninstall( - auto_confirm=True - ) - try: - requirement.install( - install_options, - global_options, - *args, - **kwargs - ) - except Exception: - should_rollback = ( - requirement.conflicts_with and - not requirement.install_succeeded - ) - # if install did not succeed, rollback previous uninstall - if should_rollback: - uninstalled_pathset.rollback() - raise - else: - should_commit = ( - requirement.conflicts_with and - requirement.install_succeeded - ) - if should_commit: - uninstalled_pathset.commit() - requirement.remove_temporary_source() - - return to_install diff --git a/env/lib/python3.7/site-packages/pip/_internal/req/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/req/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index d0f41693ce0b5e59293c62831cbc1adf6e3c530e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1664 zcmZuyOK&7K5VqYtJw2UyB(otz%Yo*=V>hcD8z(do5(0?>M}7f6!Y3q7`xo{^xo0LD2|RLjRk>U)e^upqzt!>(jP&RA zgUtp){}^F0Y+&AnnSTR>A%+D?aDcJli68-C7PEzw*ntf?i`7IeaRR5}9Z^r*z^!cS zqLFxkSMjb`N}53vBi@uF@Y4{jq#d-APS8n~gJrPs*b-~9*3b@CIGJ|&tt%X?vSrp` zttU8mfstL*TX_l*p&r(q@G#Frp*W3`aVFLFQ#@PfK1g#F3bDgaidgc5rwYv5H^g0T zG~ID1b57-RvmCTuoHE!!MK&}xpYDIYPw#zv|K2Bb=d11Q2iqU@EN#7)PPF|n&Xsm| zVLMMFE^BbQG`L9zi0;O-DCjUg<*7L({|!YJESUj#qa~Q1!OZ^#QX=UqG{p=vGOf^k z0=f^-V|<0L2u8|!jK2Q^qw`;l_F#HhD{Du#WYwOEzqaaP1Zy?su==<7(%D1I{Q~Wv zM`*GRdZ)xC8IaQYiInztkkLJq-nEgcAA9n5jLgq?&VB^yHqm9htjk|YXWF=em9No0 zN^d`!S^Q}%F5S|Vf5EzE*2~&-$$U@xd*F9*Ziygojf=wbVa$``^HVM-Y80nKKTdr$ z;(i5`F96lPSDC({GXIeK5#*9HKO877{ZV*owy^9h6G5}1mnlB;gILO z%E`qm^ApXsC<9lK0>g#T+y1Nh1$ontO!1gOV45uL!pyrshLDE??-G~z2>n1#>|G>V zpoZeG(=g#ZqDlX*wjjZkz9P@w*-*)NV;qm~%*)^oJDH^CZw*F9Sxp+JaG^958?beQ zf*31G`{T(oZ_|JfWyyH!brXdN$w3#d{kNj}n<4{v@-1K%TP|MyFe?BPeh!)$yj44d zD$Y`K-7g{ZW>~0PJiIX#QjNH>af z9*3?kn8y9{h>wkby|M^0FQSNZNRW0VpneER(GJ`xiIsj4x-vWERB_X}p`6e>D`dob z4edc#3%8wxudMQ&>-JD&hoPVg*$(9}*Us@-^y4Xo)yiS_9z_`s*s#gX%egJ26@PnHt{d+UOgnbZZr^h^|knE@=4fXwnAb>}KLcsrBweQzT8>iP7;^P+Ru?X%rrIIs pRbywMxdE4Hhzc|9ZYCKk1m80Kl&=G65|=db{0DHX8gMMn`4_c()KUNd diff --git a/env/lib/python3.7/site-packages/pip/_internal/req/__pycache__/constructors.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/req/__pycache__/constructors.cpython-37.pyc deleted file mode 100644 index 2a10603b04bdec7de0386e6f6333b266928cff10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7567 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 diff --git a/env/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_file.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_file.cpython-37.pyc deleted file mode 100644 index ef7364ca5db0018f48339a9c14d8199e102f3979..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9180 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 a+xshCC>%eiDQdA@7%of{&J;?8^8Wxr5-c+S diff --git a/env/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_install.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_install.cpython-37.pyc deleted file mode 100644 index 7e8f41c8df45e851cdd05d11a419b07707667462..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24942 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

-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 A*8l(j diff --git a/env/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_tracker.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_tracker.cpython-37.pyc deleted file mode 100644 index f78f36103f38af57aaaf7ba9db1739e45f64eb38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3176 zcmZ`*TW=h<6(;At7hNpLjx5X0KGZ-KsbnMwf+PrxII@xoao3Kb#`dJaV6~*AS(S7`Y^K?D;#VLcvlPGc*vLd*1aXq(;%9n-s^YkDvA(A$aM3&Ozc zags`}8df=zRrOb_xk;^859?;lOQw3$;dE~%oaxPmv%MSP4Kwd2bG`X+-i(7}p?5R9 ziT&>QmV9r*!^LlzsEF!YCaUuGi5)Hp>j&1X{TK4GCf76V?L12cg^c1}KT|~ub5mQg z*MA%<*(ox0go(L7zI^sFTKmKL+IP|BpIWVr*0+XDwL5aV-Pzwd>dU61gN;I}HumV? zX}^fGw4G@C2U%#xFyNexG%wmovMCP+IKC&-0_QkS;&i`5@|^u_48B6kH$fx|xnQs) z7uH(_OWMLg?+90T=w0E90KHdg8Tz6o>i7=Cl$b_ek=1TZ%!t{y?1YDPaRb`V>A81A z*n%4SQgt{kqaXF;*EO`f04Z3Pk8%Hmk62`nSQp;h57buS2#cion}vB7^X}N2U^|Vv zzJorpX|Ld4vLYB)1o7Ati?eh=(5h=@y|dY(dP1``!62jG(lgICo<*DM-$z@UkJi3h z-~47+Q}SS?DCKQh+7mL7h1AY|oQmQ5Yf82YDH>opGjHBFIEA4g6ZQAL#i#_cn+3v1X+7)tpu&eDH z8-ob`Rk6&;$GJ>){=w8TPWj)%2Su;{pda^F;t~%l;@~Jf{Ag#7CQXat6j%a)9zYpt z(WxG*{UaQV<+zBV_sBzYAk3QPRZeYz&srWv!#kT7Ryg(W>e;?at|oUISCh|2WP08* zayGfTgDEpE$z6QH2Beo%QS>`}<`xLEhRfGpcgonIqv=OIZ7}yCm*BoJBghz+a|%Ac zlgM^D=ry3S2H5geF${`T9qW!&gzL&(?+ROLaAAkIbUKpq( zdL0*g*`SDaRC|}A93rQkOh{eXlZPVSm3g6NagVwMqMdFQr)nOL?=MeS}T9v97hihxe{?0)en(KG)aBF0#JS_um*mSJDtVpYUTu_}GGu{Mb4A zePNHB6aLH6v5RQuBWvW2-3i;VZXuhz;m_f?@7X4M!Je~p=&-`uud07>cIClF zOze_N;Eum|FW5_#S}#iYIIZE``*|bI8|?(KDUKT3l7fAE5GTbKjr+OguZPQzgg}Y_ zUy+#=@lJ+l&Z-Y#4TNu@)C!H9tS?htdy-}QgZ{cw$n6fDt^JLs<)5GyBAd1pQ;h`Q2D@9Snihphv0COIIBOJbqHtnCNZ3$wlONH1^R3dxq_Q_4MNIag$M0A zJ{|YkX&a?meNC(vl9~|}JVlxECYmv2Um=FA*W>%YbNUWVfF;Eaok>%7k zL_Q&MA4L1~KtMJsp}vedzj|KdR|iF$LEQbax!S$3XrGF->UOEa#fu#qSdXc{VUp~5#ay; diff --git a/env/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-37.pyc deleted file mode 100644 index 2c164931b8299f660e47c7b2d280fc8da7cc779a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17239 zcmb_^TZ|mnnO@zxySk@mI2;a#!;7dEC5jx1Y)ZCQ>(E?T5-*n4)QC$_rqs6F?CGkR z>6yOGscOzlyW8G~Tw6kHOLnrCB)gj#Z;-@rvJisJ!!7~`ae^So?I8&AP%jA(1c~wx z1VOM50s`mz{!>-mGo%~`$Pj({RMk1B&iT)O{{QDHjOBKWTPrOL} z98_M!Cm5K9;TfLUG+JiGG+DQrR>hKUyJE|?Q*q=wQ_0A8wvv_aTqTEZyXm&_mAv$I znuXRxWkTwiX0bI{nQTo}rsO)?JkXl1Ot%hJ4z^}0GjcE2Jk*-4%u3yD9&XK5=2}N8 zM_Tih`PR|O(blobvDWd*@z#mTiPmG4$66;VC#7w^`FN{TDYc%cJR#SG=Bd_`l_yQZ zfAT|96)>xb=2NZHmD8=KD^Iu1RL-={R?fB-DhsW1m2<6UD$lgeSI)OCR4z#GVzb=3 zSh%wmr>E+EfE$P2Y&Y6LSZg+GVWZQ&rc_5QSW$MV z(XMv4BbVR3z*h@)l)Lll;?>vhyb&F&*XpZ&by;;y4%#*|lIjn)Vt&Sd9k`8lfLe>N^42*K5sa(qCDrHXH5rYPS}yMs6c{ zFxBp;R;}6S`}#>v`R!WE52CDUh06Ca^TRKBYqdJwecNw!uQrrl4?Ai*n%r}V8P2@+ z_RY7eS6;bx<;&GuZ!Rvry7(o`)PAXrMPDH~mM~rCYNH-T?yI4%Y%rC$xrk zXs^$r7H0qTiK9(Z;KVgVJ(GNtczzJ-=PLdzbro_ikBw-15VoY6tSXiTfOW8AHpv0%_8B%Knz$ zpJZ8X)!L0^KM4C17xeJu?)GNCFuGW9)g-87;??@m0S**Y!wwEet8>r)v7w&9c%Qs@F>G}& zb{pLb@kzPhZEUxwQ zbIQz`ET>RTTT`aGfM<2cQTek_l55CC!7&t}v17gmKKPEYYX9SJFQiNGJ19uK&>9#!wrB2|_wgB;TY~|~5e}`;SX@|2lUQHF869Q@8PD-DzlGMrY~0@&WW6lTUfO%? zes28!#xaoD0h!&}A#AuDinkkn(N#t`$cvOxZdAqb!3vhTl?b5AlS6;t$ z^}=Q&Tp09lM0*Ln^+`=1o-bkZWiSd4 zJg=8(ZI6`>N8rtX5(Fno3*54P^_$5txQVj`5n0ACXBSE#^Z_JHO{FrYnkbKIm7{X< zT8czjy)?!1(6{ky@#Fvf^Pm45q64##va?W#?0RqyTEMS)zETrt8qKWuVYTIlHLn)d zs7?GpJ%I=66pJU>#3ch#L_-R+y@14vGC{Z52p4kdG+US|vQ=kO`b3u37Uqi_l3g=9 zc~W!y?B1Oc1r=Pu<6sVjF)<6?pT$Wp;2adq8PsM>bq!BaUbS&SvBvLU5k+XMnQPYj zW@zK+np>AbXJCXG&-|VRZaw$D5oW(*e8*e{r+W4SmpptQ96huKR&Ziq?&K&XaFkEn z!GQ;lIsJcrrPJ!x>S3uSj8ww0E`cK;+QVABjjcwz0To+n_gYK7qRbY?k-cyG01ZJ+ zZI5>%qiWtt7y;W{dUd&Uv38O7FOpNFdvYV}phoU1hg+Bmm|&?BuBLqChv!R8zjhD2 z(T0u!Z%OZ96&MCH;+SQ~8++Z~PDw{0$z%RmlI{|Uf$`2~h7glGSo)6Xfe^c9=h^oR z9R2tjLR196QR6*x-4dB+c_fn+ndcUPcM5<-D%4z&Rn+I*$Zq;=G_cCgMtPYKX9FQc zo}!fOjzr)m`O7PQ+u!P{7nV6Ik>ghXSY2x)_VS*VUJMK2I~zymw0kY#?w+Wp21f!N-%@M$UzT*8!fYF6+|DY zH*hy4Zk|o>5x#^d1Ye5Y0g+>lGehVfa$abKre{MZk?i(v{5*6#=X*pqCiob#(#t+D z-Z!`Y=D-FY|Ni?{nE8$cU6!LR8#sDQwYqUb+GnK9Zru#C;Am@?lKSPZ+3y>}+|V6l zcU+zU^tU}%`sdg`MoFV*d3ok0&o+J&XCgDO=8fP6R9}9Oksi)Y;XNzNu1#p%v~lB( z5t?CfV6IILtozn|bKty8rC8|yBtbVdIYjXZYP45G7Rtt;RtrmQ9|9U@Y{@Tauod3(u&@+x2<7ZXW0#55_n(9ToKc1m_ z6ZL(9TIRTw&d~&-xQ?qjKJrIBLo9IzpI{b+CXdKsdtiJYq68cOSmcbo^ETRvPJv)D zYx~|9|I5$b@0k~W6*f1yp<3TSCJPGZ z$l0tl*8y+4fE9jp&}%F&`{3)kU)8rnIE%E6>{hKCO;oD@BE-nm>Ox-q2F9qkJVaGK z&BN4y=7rp-9m zz0ic(XpVq8=f+2I=hA8|z))w-ozY!IGIqx)1h(j|Se}l?gBFVf4yY2?Lj4W|jzOx|n(lGHXk)&}A~qohC4UpjBOL z72wd}P=(bhY=nNHOj8NQ`*J5`Uy5MjMdBPWs#jximgqttM(c;x22C?leF?4hsF){t zBUXZ0JpnDuQi%rihn?ohd*Pq(9r8l6U*2;TVX1X{aFStqkN{(PG3mNc)B=e{ycR5! zLFyC>5p7GXiSpq}RFwrMM?VLNxiBdbCz^mnX~upH5igJ=AZV0}si#)hljBCy)kMvE zTJWd_Z&Q4eTO+d?xv0xlMVV#ss)!J(?ju2T{1+_tcQI!0EDECt@CoMt4Wj}e=nO@U zJtM+sPTzw|qzK2zoCQH-s~-B)*)jREQF#%c;06lcr~vK5-E6|uOtZ*0!JG09JiuYDOnB4S`Ge7sH^N%5>U;a`*#4cDgmZCN zNQfBPl{#HG3TaTn>xE;%zVe)44$XvLc_z>Xhi4RA#0$$}HKO1Blgy70_2m-lann;eRN%^}5I;$-c9=~I?iPMX&_ z4gQhPEiWVU=g<9?|C#U`OUyDk$T?6dZ$Z=C_H*HjEG}MGbr#br&ErgsAESU zDZLI)Hw-rd#VD(Nrcv(oH^h;y4&$!cWHCCoBpigvHt))TbCVt1zhSdP4%}Kzf~qX^ z-=m-KgORhKxr^``7Vw#|`sY7&BOftLx~Y_c>8AcuTqF{ZjxnhVs`N|?YJG^!96DP~ zY@WSttL5!!ZsLHhFXtvVe-@jc!RFu8o3FPz9tFyNVChjdo}xO3)gfa8E@XLD!6a~b z@8rlx1GqXk@@3r)&W(WuH4O-%emcmo?^+%+_^FIi7&vPtfC5x6YhWU$|L%y1ctT^N ziyIHuM7vWW>J{ZC+NG;H_ZrZQV1~9|qOhb=Ouwo3lsZzKnrj(N92Cl-yUO_A@3oy(G+=`t@jjOtgVae7~eRn@OD*PsJ|*}>Rafh z-enQ3Wd|I9CBtI?<_ zM^Q{rx`>!qLPhpS>`OII$19Kf&}tV@cXSrl;kdY51eHoV9p_Hi~z&y0EqC(9W&?vsXH;7D+%trJ@XB9*xnciR7h_ zfuvkerll)vnxPc~)1waWT)Wp5dL+x=z+^NB?qj|zKmcAh&!tn&81^iLR@UsF{In(O z4(Xa{b57tRYyKH3TPL_?tQXd22>+-D#`#0*`&_Ym$JqLv_~~~+4G665S6~r19(AYpUjec+818c$9nc}W^8L(@v|Cu-2UIz;7p-q4idT0ya z=C7}pKRNuGeg?&KIw+JFe?_G~d&`IEP-m~xh{z>(uh+19;(CJr1tCkHZ6~j7)qROs zUcx0J!s>gV=)wWn%P5C%Ej&#ti0J?O~(Bkr)SCZ z`cHi-6OVORTqs5WUqs5)Di9lBn%9Fcu13Xbl_A*pNv>M;I`wK*^)dLE+@WJcXsLc1 zwaA6C0?rJ#6+!eE6=l*i`4wGo{{kNoHZEMcZr(lUKIYE4t~)DF>v)>}QKYBU&0NvN2)XuvlUl&m?b1CX za3Ca=J)^i7K>;n#<=RFh3=&%E$d-V&2%1l>pbOwry2M?C#1+dz-NI>i;S~~}QoD$& zLUJX2CiuiNk0MiP-BJ(2qI!V7`EZi94Z()+guVDN1&M?p7pBIf;fuH{=u91Cjrcyw z`dcvS1GURLy7EV<}rxO%OP2pasU3|=V`B8Co-XW^=N8lX1N zW_#bNqZ}4dMVlqAyoioGKtxSq^~^tN&1`->T{tOBQp>`Bh6?wWaA&*9CnIi_HR%qvd%c$qG_l*y>06NX!rtlZ>!k?h6J9NT4zUc$aY@G`Wzz!Kk zV}VnS4YM$7ii4~GR}-iqgE~grXalbtL$9fw1A^d+!`vXZGcD-t_ZWM^o3r}OKo!<+ z7`KeKWS&3}U%e$+DzP^ZhREH!wED{;J@4Ly5rdNt7aJUiEiEn2LSrKolb-pzcWXUl zyTonK1#*HCWTD*u)ho63nQ#mqo;e+yDVG*Ii8}*6Z)73#=tqRdGBJqDi=UVm`Xd3a zG0CO=V=`A>2^a?`A0c$0lH+gm>WnPwq@;8-NT}1n!a;q0KE%GM4_HvZMnx#WHP~4? zbti|&R{*z*qI``GRpEo|Z2BH^dC;zo5S-d!*Hsp;vk-TgDAphFlI*Ie{g^{Qp$?Ot zCo(FIlPKbQmO4-b@cSc$P4ssB>L??+pi&qGx&-Oyq4(km^~V^xNp`0AG%`&8fdytc z_N-L|bHffpAeQd;X`r8?)j#qOlj~WgVv`^_wYl23&;eSc0+_*x1nxk9+C!&3&GZ+- zAF#H?fGkp7kmRCmDT3IzmO(3h*Hm}W2FWeDAD<%)A?LaGEib=L`>W7@^=jHhN%ZPp|Bapdex2J27W5of;M*-QOr^d+74`c~;|tFf|*oF90qV1I$fx3y1x;Zpzf z!;Rrw4&c&|3=Y7T#ul0#xl+JEnY%hGV1VC(VM`m071CRwm zy+`VZ4r4lkh;Dt5D2o$#{}CVk35zC+7K?pM|Mzh3yQJ70Dn`aFAlnTQC$KsgoqBBA z>Ob|%&@Kh`7RE`r{wufue}c2Y@zxGJRk%VrS0dVRFAF|T@3F1+HHioYK!`;!bfLb# z@iK)jxZCMJcPp_?Xt32+YwZ;nZ-{K)Yjk=6Hll^Zqtu4>&q9Qr(IS*qgV=A7WnU<5 zBAUV-9g}g3{SzFV!cmN$^bvOs@~@ypmtcKi*}sg1Y7qJp)$sN< z51}@TScP%l1}w-T4gJsfZ0E3--!(^943K_k27iX|>74FMc(QZED@dzTTmJ@E^Ss(Q zDjfdw(3LkGlkzzG4BTCa${~^(F$P8lH2HIQbN`BrGl6j|^*^MJASm8^T}DLxeWUHH z81EZfYm$sg8xVduybXQy+e94y`mm6`%N!H{*2mtY-{~EQQRdP2`h z%9HW^!wdzZ*W-htH#cA!5OiJppMm<8`a0T>`bT8!uWx-6mbjmEyp6BtLu=y|(C&u= z2Yvoy_yoel^Y^U}jtwW}O{WHvJ5TN!J5TLGfeoidifJ&#IjmbBTER!*Y4509%e`fL z4jlF_@^i5};5=wwa?0^|=D6dH&0AK&SxpZ1Oc({s(_M{>n+%-&WW>SvPrRs~mQ zd4;vy7#;{0xGuCh8=f0ZBQgD%;WXc^-#VBc93Zz~7U$7scK;LaM7&$}#w;C>!-IJL z1^!S0{{5M)rv@`SW#Pm5;i197or~eKnBgJs@%xf}{Gq+^O*qTgqa;0M(PQ?JJ)TH= zd;}OhKR75maagEynDfI}{}yA}kl?2l`_CN(})bv#3b4xX6IN0_f0j;*q+8@cJ?uJu>-d4G;b$rIt2yEvtXwA(baTtRTP~ zfrK=ejBLQrYc`gm0(^dG(sZ#I8*`OZrej@NeP2cGMD=k-x!whg9{0e z3uNu*)9e1BIMn5P7qmARDVzOC`00{&9RfeP-K$32Sd&tM-9>Pcb zdJJN|Gnp~)b`?>m~LEQs2qvlY;mMoFAs(L>l5U_lR4t0Rts zlp$aR51ATp!7$JyNgx_4FZoo2G^em%`hm`YfVW+&EXjstR)-23NCr%CLK)M>{;3~< z9{p**7HnfHWkzL~!F{WIaXbY=y~Ji;xP}d<`xb0o5=S(b3OljRJlteCNq|HnkWg?F&WossoR~DT zJSy^)NuD{9hM7Jt+2%T5QYP~x`|=2=7gpL zh2AK$aPOT& z4OuZ3!8v|HV@rQH``AB=(fE^sleo)7fO)iMNxwn=*ry9X!0YSR;lunrF7~go_-icw zItz(C?6P)|g>dN~vqtkx0uU04h$iaIS`dKoRy&^h&wMt*=Tf71R)2s3i6Ab=J$%38DTL zx}@%dL~CE+V9%luXRpMegL$T<49pl;!BQL#0N@HgL&bpBV!s?~f!GA+@nPPHMA_PK zs?*I&v_QcEfww1xe;x0XQy)2eth4!Z@el|e&?fTqFH;hW?QgToh>$`1#+C+5XH%cbL6OByW%J%uDE<}olj>8tUCHu5ECZ{L%eI(@wVfzoSC$k2nD0=q#22^9?XuP{)q5i)0pNAXPIX0FERS z;jV!gboWhl15sT3F4N26H(-|fCJewFT;MqXOxJU1xCQaOXlJb~Eq&rC#!O-7Bsji~Xr;Q^+@!tx53`84qo zyvPE*N3#}2omd=mu|g&yHFJzlPY0JGOD(0;N)AQ zGvY!ZOy^p*1x;9+OGs!GCy01$naHC46$<82YrPq$k9qSZ3u3A*q2Y3KCD&e_)%8+=_5mMH{O}@hS&QDJTFa1d3&A9{JNe zsYP=hBAKFoTp;hK$)2rA8Tl55#rDH>x$deHqj1G8tULOpaK{mkmJUsbzt)5I_5&nF zfK~W2MsbpkF$sO*!`|0xxkW zE#l?-G@2+g(PP{!t-VGPM`|KssW)EcTPb!Boh`T%?h(-@3%|yI{c;aKWk$eWp^c%w zz~Xrp-)Hdzi+{x8AESsS@T1^z6+egekO5)y&b-`7ej<$DI>#v(fmRMj_C8KPcc7sg zL0oifZxb;)B$XK0Hpe$}-V#oXjz6ktoY$elBm1VK2WvHenI Tuple[str, Optional[str]] - m = re.match(r'^(.+)(\[[^\]]+\])$', path) - extras = None - if m: - path_no_extras = m.group(1) - extras = m.group(2) - else: - path_no_extras = path - - return path_no_extras, extras - - -def parse_editable(editable_req): - # type: (str) -> Tuple[Optional[str], str, Optional[Set[str]]] - """Parses an editable requirement into: - - a requirement name - - an URL - - extras - - editable options - Accepted requirements: - svn+http://blahblah@rev#egg=Foobar[baz]&subdirectory=version_subdir - .[some_extra] - """ - - url = editable_req - - # If a file path is specified with extras, strip off the extras. - url_no_extras, extras = _strip_extras(url) - - if os.path.isdir(url_no_extras): - if not os.path.exists(os.path.join(url_no_extras, 'setup.py')): - msg = ( - 'File "setup.py" not found. Directory cannot be installed ' - 'in editable mode: {}'.format(os.path.abspath(url_no_extras)) - ) - pyproject_path = make_pyproject_path(url_no_extras) - if os.path.isfile(pyproject_path): - msg += ( - '\n(A "pyproject.toml" file was found, but editable ' - 'mode currently requires a setup.py based build.)' - ) - raise InstallationError(msg) - - # Treating it as code that has already been checked out - url_no_extras = path_to_url(url_no_extras) - - if url_no_extras.lower().startswith('file:'): - package_name = Link(url_no_extras).egg_fragment - if extras: - return ( - package_name, - url_no_extras, - Requirement("placeholder" + extras.lower()).extras, - ) - else: - return package_name, url_no_extras, None - - for version_control in vcs: - if url.lower().startswith('%s:' % version_control): - url = '%s+%s' % (version_control, url) - break - - if '+' not in url: - raise InstallationError( - '%s should either be a path to a local project or a VCS url ' - 'beginning with svn+, git+, hg+, or bzr+' % - editable_req - ) - - vc_type = url.split('+', 1)[0].lower() - - if not vcs.get_backend(vc_type): - error_message = 'For --editable=%s only ' % editable_req + \ - ', '.join([backend.name + '+URL' for backend in vcs.backends]) + \ - ' is currently supported' - raise InstallationError(error_message) - - package_name = Link(url).egg_fragment - if not package_name: - raise InstallationError( - "Could not detect requirement name for '%s', please specify one " - "with #egg=your_package_name" % editable_req - ) - return package_name, url, None - - -def deduce_helpful_msg(req): - # type: (str) -> str - """Returns helpful msg in case requirements file does not exist, - or cannot be parsed. - - :params req: Requirements file path - """ - msg = "" - if os.path.exists(req): - msg = " It does exist." - # Try to parse and check if it is a requirements file. - try: - with open(req, 'r') as fp: - # parse first line only - next(parse_requirements(fp.read())) - msg += " The argument you provided " + \ - "(%s) appears to be a" % (req) + \ - " requirements file. If that is the" + \ - " case, use the '-r' flag to install" + \ - " the packages specified within it." - except RequirementParseError: - logger.debug("Cannot parse '%s' as requirements \ - file" % (req), exc_info=True) - else: - msg += " File '%s' does not exist." % (req) - return msg - - -# ---- The actual constructors follow ---- - - -def install_req_from_editable( - editable_req, # type: str - comes_from=None, # type: Optional[str] - use_pep517=None, # type: Optional[bool] - isolated=False, # type: bool - options=None, # type: Optional[Dict[str, Any]] - wheel_cache=None, # type: Optional[WheelCache] - constraint=False # type: bool -): - # type: (...) -> InstallRequirement - name, url, extras_override = parse_editable(editable_req) - if url.startswith('file:'): - source_dir = url_to_path(url) - else: - source_dir = None - - if name is not None: - try: - req = Requirement(name) - except InvalidRequirement: - raise InstallationError("Invalid requirement: '%s'" % name) - else: - req = None - return InstallRequirement( - req, comes_from, source_dir=source_dir, - editable=True, - link=Link(url), - constraint=constraint, - use_pep517=use_pep517, - isolated=isolated, - options=options if options else {}, - wheel_cache=wheel_cache, - extras=extras_override or (), - ) - - -def install_req_from_line( - name, # type: str - comes_from=None, # type: Optional[Union[str, InstallRequirement]] - use_pep517=None, # type: Optional[bool] - isolated=False, # type: bool - options=None, # type: Optional[Dict[str, Any]] - wheel_cache=None, # type: Optional[WheelCache] - constraint=False # type: bool -): - # type: (...) -> InstallRequirement - """Creates an InstallRequirement from a name, which might be a - requirement, directory containing 'setup.py', filename, or URL. - """ - if is_url(name): - marker_sep = '; ' - else: - marker_sep = ';' - if marker_sep in name: - name, markers_as_string = name.split(marker_sep, 1) - markers_as_string = markers_as_string.strip() - if not markers_as_string: - markers = None - else: - markers = Marker(markers_as_string) - else: - markers = None - name = name.strip() - req_as_string = None - path = os.path.normpath(os.path.abspath(name)) - link = None - extras_as_string = None - - if is_url(name): - link = Link(name) - else: - p, extras_as_string = _strip_extras(path) - looks_like_dir = os.path.isdir(p) and ( - os.path.sep in name or - (os.path.altsep is not None and os.path.altsep in name) or - name.startswith('.') - ) - if looks_like_dir: - if not is_installable_dir(p): - raise InstallationError( - "Directory %r is not installable. Neither 'setup.py' " - "nor 'pyproject.toml' found." % name - ) - link = Link(path_to_url(p)) - elif is_archive_file(p): - if not os.path.isfile(p): - logger.warning( - 'Requirement %r looks like a filename, but the ' - 'file does not exist', - name - ) - link = Link(path_to_url(p)) - - # it's a local file, dir, or url - if link: - # Handle relative file URLs - if link.scheme == 'file' and re.search(r'\.\./', link.url): - link = Link( - path_to_url(os.path.normpath(os.path.abspath(link.path)))) - # wheel file - if link.is_wheel: - wheel = Wheel(link.filename) # can raise InvalidWheelFilename - req_as_string = "%s==%s" % (wheel.name, wheel.version) - else: - # set the req to the egg fragment. when it's not there, this - # will become an 'unnamed' requirement - req_as_string = link.egg_fragment - - # a requirement specifier - else: - req_as_string = name - - if extras_as_string: - extras = Requirement("placeholder" + extras_as_string.lower()).extras - else: - extras = () - if req_as_string is not None: - try: - req = Requirement(req_as_string) - except InvalidRequirement: - if os.path.sep in req_as_string: - add_msg = "It looks like a path." - add_msg += deduce_helpful_msg(req_as_string) - elif ('=' in req_as_string and - not any(op in req_as_string for op in operators)): - add_msg = "= is not a valid operator. Did you mean == ?" - else: - add_msg = "" - raise InstallationError( - "Invalid requirement: '%s'\n%s" % (req_as_string, add_msg) - ) - else: - req = None - - return InstallRequirement( - req, comes_from, link=link, markers=markers, - use_pep517=use_pep517, isolated=isolated, - options=options if options else {}, - wheel_cache=wheel_cache, - constraint=constraint, - extras=extras, - ) - - -def install_req_from_req_string( - req_string, # type: str - comes_from=None, # type: Optional[InstallRequirement] - isolated=False, # type: bool - wheel_cache=None, # type: Optional[WheelCache] - use_pep517=None # type: Optional[bool] -): - # type: (...) -> InstallRequirement - try: - req = Requirement(req_string) - except InvalidRequirement: - raise InstallationError("Invalid requirement: '%s'" % req_string) - - domains_not_allowed = [ - PyPI.file_storage_domain, - TestPyPI.file_storage_domain, - ] - if (req.url and comes_from and comes_from.link and - comes_from.link.netloc in domains_not_allowed): - # Explicitly disallow pypi packages that depend on external urls - raise InstallationError( - "Packages installed from PyPI cannot depend on packages " - "which are not also hosted on PyPI.\n" - "%s depends on %s " % (comes_from.name, req) - ) - - return InstallRequirement( - req, comes_from, isolated=isolated, wheel_cache=wheel_cache, - use_pep517=use_pep517 - ) diff --git a/env/lib/python3.7/site-packages/pip/_internal/req/req_file.py b/env/lib/python3.7/site-packages/pip/_internal/req/req_file.py deleted file mode 100644 index 270b75c..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/req/req_file.py +++ /dev/null @@ -1,383 +0,0 @@ -""" -Requirements file parsing -""" - -from __future__ import absolute_import - -import optparse -import os -import re -import shlex -import sys - -from pip._vendor.six.moves import filterfalse -from pip._vendor.six.moves.urllib import parse as urllib_parse - -from pip._internal.cli import cmdoptions -from pip._internal.download import get_file_content -from pip._internal.exceptions import RequirementsFileParseError -from pip._internal.req.constructors import ( - install_req_from_editable, install_req_from_line, -) -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import ( - Any, Callable, Iterator, List, NoReturn, Optional, Text, Tuple, - ) - from pip._internal.req import InstallRequirement - from pip._internal.cache import WheelCache - from pip._internal.index import PackageFinder - from pip._internal.download import PipSession - - ReqFileLines = Iterator[Tuple[int, Text]] - -__all__ = ['parse_requirements'] - -SCHEME_RE = re.compile(r'^(http|https|file):', re.I) -COMMENT_RE = re.compile(r'(^|\s)+#.*$') - -# Matches environment variable-style values in '${MY_VARIABLE_1}' with the -# variable name consisting of only uppercase letters, digits or the '_' -# (underscore). This follows the POSIX standard defined in IEEE Std 1003.1, -# 2013 Edition. -ENV_VAR_RE = re.compile(r'(?P\$\{(?P[A-Z0-9_]+)\})') - -SUPPORTED_OPTIONS = [ - cmdoptions.constraints, - cmdoptions.editable, - cmdoptions.requirements, - cmdoptions.no_index, - cmdoptions.index_url, - cmdoptions.find_links, - cmdoptions.extra_index_url, - cmdoptions.always_unzip, - cmdoptions.no_binary, - cmdoptions.only_binary, - cmdoptions.pre, - cmdoptions.trusted_host, - cmdoptions.require_hashes, -] # type: List[Callable[..., optparse.Option]] - -# options to be passed to requirements -SUPPORTED_OPTIONS_REQ = [ - cmdoptions.install_options, - cmdoptions.global_options, - cmdoptions.hash, -] # type: List[Callable[..., optparse.Option]] - -# the 'dest' string values -SUPPORTED_OPTIONS_REQ_DEST = [str(o().dest) for o in SUPPORTED_OPTIONS_REQ] - - -def parse_requirements( - filename, # type: str - finder=None, # type: Optional[PackageFinder] - comes_from=None, # type: Optional[str] - options=None, # type: Optional[optparse.Values] - session=None, # type: Optional[PipSession] - constraint=False, # type: bool - wheel_cache=None, # type: Optional[WheelCache] - use_pep517=None # type: Optional[bool] -): - # type: (...) -> Iterator[InstallRequirement] - """Parse a requirements file and yield InstallRequirement instances. - - :param filename: Path or url of requirements file. - :param finder: Instance of pip.index.PackageFinder. - :param comes_from: Origin description of requirements. - :param options: cli options. - :param session: Instance of pip.download.PipSession. - :param constraint: If true, parsing a constraint file rather than - requirements file. - :param wheel_cache: Instance of pip.wheel.WheelCache - :param use_pep517: Value of the --use-pep517 option. - """ - if session is None: - raise TypeError( - "parse_requirements() missing 1 required keyword argument: " - "'session'" - ) - - _, content = get_file_content( - filename, comes_from=comes_from, session=session - ) - - lines_enum = preprocess(content, options) - - for line_number, line in lines_enum: - req_iter = process_line(line, filename, line_number, finder, - comes_from, options, session, wheel_cache, - use_pep517=use_pep517, constraint=constraint) - for req in req_iter: - yield req - - -def preprocess(content, options): - # type: (Text, Optional[optparse.Values]) -> ReqFileLines - """Split, filter, and join lines, and return a line iterator - - :param content: the content of the requirements file - :param options: cli options - """ - lines_enum = enumerate(content.splitlines(), start=1) # type: ReqFileLines - lines_enum = join_lines(lines_enum) - lines_enum = ignore_comments(lines_enum) - lines_enum = skip_regex(lines_enum, options) - lines_enum = expand_env_variables(lines_enum) - return lines_enum - - -def process_line( - line, # type: Text - filename, # type: str - line_number, # type: int - finder=None, # type: Optional[PackageFinder] - comes_from=None, # type: Optional[str] - options=None, # type: Optional[optparse.Values] - session=None, # type: Optional[PipSession] - wheel_cache=None, # type: Optional[WheelCache] - use_pep517=None, # type: Optional[bool] - constraint=False # type: bool -): - # type: (...) -> Iterator[InstallRequirement] - """Process a single requirements line; This can result in creating/yielding - requirements, or updating the finder. - - For lines that contain requirements, the only options that have an effect - are from SUPPORTED_OPTIONS_REQ, and they are scoped to the - requirement. Other options from SUPPORTED_OPTIONS may be present, but are - ignored. - - For lines that do not contain requirements, the only options that have an - effect are from SUPPORTED_OPTIONS. Options from SUPPORTED_OPTIONS_REQ may - be present, but are ignored. These lines may contain multiple options - (although our docs imply only one is supported), and all our parsed and - affect the finder. - - :param constraint: If True, parsing a constraints file. - :param options: OptionParser options that we may update - """ - parser = build_parser(line) - defaults = parser.get_default_values() - defaults.index_url = None - if finder: - defaults.format_control = finder.format_control - args_str, options_str = break_args_options(line) - # Prior to 2.7.3, shlex cannot deal with unicode entries - if sys.version_info < (2, 7, 3): - # https://github.com/python/mypy/issues/1174 - options_str = options_str.encode('utf8') # type: ignore - # https://github.com/python/mypy/issues/1174 - opts, _ = parser.parse_args( - shlex.split(options_str), defaults) # type: ignore - - # preserve for the nested code path - line_comes_from = '%s %s (line %s)' % ( - '-c' if constraint else '-r', filename, line_number, - ) - - # yield a line requirement - if args_str: - isolated = options.isolated_mode if options else False - if options: - cmdoptions.check_install_build_global(options, opts) - # get the options that apply to requirements - req_options = {} - for dest in SUPPORTED_OPTIONS_REQ_DEST: - if dest in opts.__dict__ and opts.__dict__[dest]: - req_options[dest] = opts.__dict__[dest] - yield install_req_from_line( - args_str, line_comes_from, constraint=constraint, - use_pep517=use_pep517, - isolated=isolated, options=req_options, wheel_cache=wheel_cache - ) - - # yield an editable requirement - elif opts.editables: - isolated = options.isolated_mode if options else False - yield install_req_from_editable( - opts.editables[0], comes_from=line_comes_from, - use_pep517=use_pep517, - constraint=constraint, isolated=isolated, wheel_cache=wheel_cache - ) - - # parse a nested requirements file - elif opts.requirements or opts.constraints: - if opts.requirements: - req_path = opts.requirements[0] - nested_constraint = False - else: - req_path = opts.constraints[0] - nested_constraint = True - # original file is over http - if SCHEME_RE.search(filename): - # do a url join so relative paths work - req_path = urllib_parse.urljoin(filename, req_path) - # original file and nested file are paths - elif not SCHEME_RE.search(req_path): - # do a join so relative paths work - req_path = os.path.join(os.path.dirname(filename), req_path) - # TODO: Why not use `comes_from='-r {} (line {})'` here as well? - parsed_reqs = parse_requirements( - req_path, finder, comes_from, options, session, - constraint=nested_constraint, wheel_cache=wheel_cache - ) - for req in parsed_reqs: - yield req - - # percolate hash-checking option upward - elif opts.require_hashes: - options.require_hashes = opts.require_hashes - - # set finder options - elif finder: - if opts.index_url: - finder.index_urls = [opts.index_url] - if opts.no_index is True: - finder.index_urls = [] - if opts.extra_index_urls: - finder.index_urls.extend(opts.extra_index_urls) - if opts.find_links: - # FIXME: it would be nice to keep track of the source - # of the find_links: support a find-links local path - # relative to a requirements file. - value = opts.find_links[0] - req_dir = os.path.dirname(os.path.abspath(filename)) - relative_to_reqs_file = os.path.join(req_dir, value) - if os.path.exists(relative_to_reqs_file): - value = relative_to_reqs_file - finder.find_links.append(value) - if opts.pre: - finder.allow_all_prereleases = True - if opts.trusted_hosts: - finder.secure_origins.extend( - ("*", host, "*") for host in opts.trusted_hosts) - - -def break_args_options(line): - # type: (Text) -> Tuple[str, Text] - """Break up the line into an args and options string. We only want to shlex - (and then optparse) the options, not the args. args can contain markers - which are corrupted by shlex. - """ - tokens = line.split(' ') - args = [] - options = tokens[:] - for token in tokens: - if token.startswith('-') or token.startswith('--'): - break - else: - args.append(token) - options.pop(0) - return ' '.join(args), ' '.join(options) # type: ignore - - -def build_parser(line): - # type: (Text) -> optparse.OptionParser - """ - Return a parser for parsing requirement lines - """ - parser = optparse.OptionParser(add_help_option=False) - - option_factories = SUPPORTED_OPTIONS + SUPPORTED_OPTIONS_REQ - for option_factory in option_factories: - option = option_factory() - parser.add_option(option) - - # By default optparse sys.exits on parsing errors. We want to wrap - # that in our own exception. - def parser_exit(self, msg): - # type: (Any, str) -> NoReturn - # add offending line - msg = 'Invalid requirement: %s\n%s' % (line, msg) - raise RequirementsFileParseError(msg) - # NOTE: mypy disallows assigning to a method - # https://github.com/python/mypy/issues/2427 - parser.exit = parser_exit # type: ignore - - return parser - - -def join_lines(lines_enum): - # type: (ReqFileLines) -> ReqFileLines - """Joins a line ending in '\' with the previous line (except when following - comments). The joined line takes on the index of the first line. - """ - primary_line_number = None - new_line = [] # type: List[Text] - for line_number, line in lines_enum: - if not line.endswith('\\') or COMMENT_RE.match(line): - if COMMENT_RE.match(line): - # this ensures comments are always matched later - line = ' ' + line - if new_line: - new_line.append(line) - yield primary_line_number, ''.join(new_line) - new_line = [] - else: - yield line_number, line - else: - if not new_line: - primary_line_number = line_number - new_line.append(line.strip('\\')) - - # last line contains \ - if new_line: - yield primary_line_number, ''.join(new_line) - - # TODO: handle space after '\'. - - -def ignore_comments(lines_enum): - # type: (ReqFileLines) -> ReqFileLines - """ - Strips comments and filter empty lines. - """ - for line_number, line in lines_enum: - line = COMMENT_RE.sub('', line) - line = line.strip() - if line: - yield line_number, line - - -def skip_regex(lines_enum, options): - # type: (ReqFileLines, Optional[optparse.Values]) -> ReqFileLines - """ - Skip lines that match '--skip-requirements-regex' pattern - - Note: the regex pattern is only built once - """ - skip_regex = options.skip_requirements_regex if options else None - if skip_regex: - pattern = re.compile(skip_regex) - lines_enum = filterfalse(lambda e: pattern.search(e[1]), lines_enum) - return lines_enum - - -def expand_env_variables(lines_enum): - # type: (ReqFileLines) -> ReqFileLines - """Replace all environment variables that can be retrieved via `os.getenv`. - - The only allowed format for environment variables defined in the - requirement file is `${MY_VARIABLE_1}` to ensure two things: - - 1. Strings that contain a `$` aren't accidentally (partially) expanded. - 2. Ensure consistency across platforms for requirement files. - - These points are the result of a discussion on the `github pull - request #3514 `_. - - Valid characters in variable names follow the `POSIX standard - `_ and are limited - to uppercase letter, digits and the `_` (underscore). - """ - for line_number, line in lines_enum: - for env_var, var_name in ENV_VAR_RE.findall(line): - value = os.getenv(var_name) - if not value: - continue - - line = line.replace(env_var, value) - - yield line_number, line diff --git a/env/lib/python3.7/site-packages/pip/_internal/req/req_install.py b/env/lib/python3.7/site-packages/pip/_internal/req/req_install.py deleted file mode 100644 index 25a692e..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/req/req_install.py +++ /dev/null @@ -1,1028 +0,0 @@ -from __future__ import absolute_import - -import logging -import os -import shutil -import sys -import sysconfig -import zipfile -from distutils.util import change_root - -from pip._vendor import pkg_resources, six -from pip._vendor.packaging.requirements import Requirement -from pip._vendor.packaging.utils import canonicalize_name -from pip._vendor.packaging.version import Version -from pip._vendor.packaging.version import parse as parse_version -from pip._vendor.pep517.wrappers import Pep517HookCaller - -from pip._internal import wheel -from pip._internal.build_env import NoOpBuildEnvironment -from pip._internal.exceptions import InstallationError -from pip._internal.locations import ( - PIP_DELETE_MARKER_FILENAME, running_under_virtualenv, -) -from pip._internal.models.link import Link -from pip._internal.pyproject import load_pyproject_toml, make_pyproject_path -from pip._internal.req.req_uninstall import UninstallPathSet -from pip._internal.utils.compat import native_str -from pip._internal.utils.hashes import Hashes -from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import ( - _make_build_dir, ask_path_exists, backup_dir, call_subprocess, - display_path, dist_in_site_packages, dist_in_usersite, ensure_dir, - get_installed_version, redact_password_from_url, rmtree, -) -from pip._internal.utils.packaging import get_metadata -from pip._internal.utils.setuptools_build import SETUPTOOLS_SHIM -from pip._internal.utils.temp_dir import TempDirectory -from pip._internal.utils.typing import MYPY_CHECK_RUNNING -from pip._internal.utils.ui import open_spinner -from pip._internal.vcs import vcs -from pip._internal.wheel import move_wheel_files - -if MYPY_CHECK_RUNNING: - from typing import ( - Any, Dict, Iterable, List, Mapping, Optional, Sequence, Union, - ) - from pip._internal.build_env import BuildEnvironment - from pip._internal.cache import WheelCache - from pip._internal.index import PackageFinder - from pip._vendor.pkg_resources import Distribution - from pip._vendor.packaging.specifiers import SpecifierSet - from pip._vendor.packaging.markers import Marker - - -logger = logging.getLogger(__name__) - - -class InstallRequirement(object): - """ - Represents something that may be installed later on, may have information - about where to fetch the relevant requirement and also contains logic for - installing the said requirement. - """ - - def __init__( - self, - req, # type: Optional[Requirement] - comes_from, # type: Optional[Union[str, InstallRequirement]] - source_dir=None, # type: Optional[str] - editable=False, # type: bool - link=None, # type: Optional[Link] - update=True, # type: bool - markers=None, # type: Optional[Marker] - use_pep517=None, # type: Optional[bool] - isolated=False, # type: bool - options=None, # type: Optional[Dict[str, Any]] - wheel_cache=None, # type: Optional[WheelCache] - constraint=False, # type: bool - extras=() # type: Iterable[str] - ): - # type: (...) -> None - assert req is None or isinstance(req, Requirement), req - self.req = req - self.comes_from = comes_from - self.constraint = constraint - if source_dir is not None: - self.source_dir = os.path.normpath(os.path.abspath(source_dir)) - else: - self.source_dir = None - self.editable = editable - - self._wheel_cache = wheel_cache - if link is None and req and req.url: - # PEP 508 URL requirement - link = Link(req.url) - self.link = self.original_link = link - - if extras: - self.extras = extras - elif req: - self.extras = { - pkg_resources.safe_extra(extra) for extra in req.extras - } - else: - self.extras = set() - if markers is None and req: - markers = req.marker - self.markers = markers - - self._egg_info_path = None # type: Optional[str] - # This holds the pkg_resources.Distribution object if this requirement - # is already available: - self.satisfied_by = None - # This hold the pkg_resources.Distribution object if this requirement - # conflicts with another installed distribution: - self.conflicts_with = None - # Temporary build location - self._temp_build_dir = TempDirectory(kind="req-build") - # Used to store the global directory where the _temp_build_dir should - # have been created. Cf _correct_build_location method. - self._ideal_build_dir = None # type: Optional[str] - # True if the editable should be updated: - self.update = update - # Set to True after successful installation - self.install_succeeded = None # type: Optional[bool] - # UninstallPathSet of uninstalled distribution (for possible rollback) - self.uninstalled_pathset = None - self.options = options if options else {} - # Set to True after successful preparation of this requirement - self.prepared = False - self.is_direct = False - - self.isolated = isolated - self.build_env = NoOpBuildEnvironment() # type: BuildEnvironment - - # For PEP 517, the directory where we request the project metadata - # gets stored. We need this to pass to build_wheel, so the backend - # can ensure that the wheel matches the metadata (see the PEP for - # details). - self.metadata_directory = None # type: Optional[str] - - # The static build requirements (from pyproject.toml) - self.pyproject_requires = None # type: Optional[List[str]] - - # Build requirements that we will check are available - self.requirements_to_check = [] # type: List[str] - - # The PEP 517 backend we should use to build the project - self.pep517_backend = None # type: Optional[Pep517HookCaller] - - # Are we using PEP 517 for this requirement? - # After pyproject.toml has been loaded, the only valid values are True - # and False. Before loading, None is valid (meaning "use the default"). - # Setting an explicit value before loading pyproject.toml is supported, - # but after loading this flag should be treated as read only. - self.use_pep517 = use_pep517 - - def __str__(self): - # type: () -> str - if self.req: - s = str(self.req) - if self.link: - s += ' from %s' % redact_password_from_url(self.link.url) - elif self.link: - s = redact_password_from_url(self.link.url) - else: - s = '' - if self.satisfied_by is not None: - s += ' in %s' % display_path(self.satisfied_by.location) - if self.comes_from: - if isinstance(self.comes_from, six.string_types): - comes_from = self.comes_from - else: - comes_from = self.comes_from.from_path() - if comes_from: - s += ' (from %s)' % comes_from - return s - - def __repr__(self): - # type: () -> str - return '<%s object: %s editable=%r>' % ( - self.__class__.__name__, str(self), self.editable) - - def populate_link(self, finder, upgrade, require_hashes): - # type: (PackageFinder, bool, bool) -> None - """Ensure that if a link can be found for this, that it is found. - - Note that self.link may still be None - if Upgrade is False and the - requirement is already installed. - - If require_hashes is True, don't use the wheel cache, because cached - wheels, always built locally, have different hashes than the files - downloaded from the index server and thus throw false hash mismatches. - Furthermore, cached wheels at present have undeterministic contents due - to file modification times. - """ - if self.link is None: - self.link = finder.find_requirement(self, upgrade) - if self._wheel_cache is not None and not require_hashes: - old_link = self.link - self.link = self._wheel_cache.get(self.link, self.name) - if old_link != self.link: - logger.debug('Using cached wheel link: %s', self.link) - - # Things that are valid for all kinds of requirements? - @property - def name(self): - # type: () -> Optional[str] - if self.req is None: - return None - return native_str(pkg_resources.safe_name(self.req.name)) - - @property - def specifier(self): - # type: () -> SpecifierSet - return self.req.specifier - - @property - def is_pinned(self): - # type: () -> bool - """Return whether I am pinned to an exact version. - - For example, some-package==1.2 is pinned; some-package>1.2 is not. - """ - specifiers = self.specifier - return (len(specifiers) == 1 and - next(iter(specifiers)).operator in {'==', '==='}) - - @property - def installed_version(self): - # type: () -> Optional[str] - return get_installed_version(self.name) - - def match_markers(self, extras_requested=None): - # type: (Optional[Iterable[str]]) -> bool - if not extras_requested: - # Provide an extra to safely evaluate the markers - # without matching any extra - extras_requested = ('',) - if self.markers is not None: - return any( - self.markers.evaluate({'extra': extra}) - for extra in extras_requested) - else: - return True - - @property - def has_hash_options(self): - # type: () -> bool - """Return whether any known-good hashes are specified as options. - - These activate --require-hashes mode; hashes specified as part of a - URL do not. - - """ - return bool(self.options.get('hashes', {})) - - def hashes(self, trust_internet=True): - # type: (bool) -> Hashes - """Return a hash-comparer that considers my option- and URL-based - hashes to be known-good. - - Hashes in URLs--ones embedded in the requirements file, not ones - downloaded from an index server--are almost peers with ones from - flags. They satisfy --require-hashes (whether it was implicitly or - explicitly activated) but do not activate it. md5 and sha224 are not - allowed in flags, which should nudge people toward good algos. We - always OR all hashes together, even ones from URLs. - - :param trust_internet: Whether to trust URL-based (#md5=...) hashes - downloaded from the internet, as by populate_link() - - """ - good_hashes = self.options.get('hashes', {}).copy() - link = self.link if trust_internet else self.original_link - if link and link.hash: - good_hashes.setdefault(link.hash_name, []).append(link.hash) - return Hashes(good_hashes) - - def from_path(self): - # type: () -> Optional[str] - """Format a nice indicator to show where this "comes from" - """ - if self.req is None: - return None - s = str(self.req) - if self.comes_from: - if isinstance(self.comes_from, six.string_types): - comes_from = self.comes_from - else: - comes_from = self.comes_from.from_path() - if comes_from: - s += '->' + comes_from - return s - - def build_location(self, build_dir): - # type: (str) -> Optional[str] - assert build_dir is not None - if self._temp_build_dir.path is not None: - return self._temp_build_dir.path - if self.req is None: - # for requirement via a path to a directory: the name of the - # package is not available yet so we create a temp directory - # Once run_egg_info will have run, we'll be able - # to fix it via _correct_build_location - # Some systems have /tmp as a symlink which confuses custom - # builds (such as numpy). Thus, we ensure that the real path - # is returned. - self._temp_build_dir.create() - self._ideal_build_dir = build_dir - - return self._temp_build_dir.path - if self.editable: - name = self.name.lower() - else: - name = self.name - # FIXME: Is there a better place to create the build_dir? (hg and bzr - # need this) - if not os.path.exists(build_dir): - logger.debug('Creating directory %s', build_dir) - _make_build_dir(build_dir) - return os.path.join(build_dir, name) - - def _correct_build_location(self): - # type: () -> None - """Move self._temp_build_dir to self._ideal_build_dir/self.req.name - - For some requirements (e.g. a path to a directory), the name of the - package is not available until we run egg_info, so the build_location - will return a temporary directory and store the _ideal_build_dir. - - This is only called by self.run_egg_info to fix the temporary build - directory. - """ - if self.source_dir is not None: - return - assert self.req is not None - assert self._temp_build_dir.path - assert (self._ideal_build_dir is not None and - self._ideal_build_dir.path) # type: ignore - old_location = self._temp_build_dir.path - self._temp_build_dir.path = None - - new_location = self.build_location(self._ideal_build_dir) - if os.path.exists(new_location): - raise InstallationError( - 'A package already exists in %s; please remove it to continue' - % display_path(new_location)) - logger.debug( - 'Moving package %s from %s to new location %s', - self, display_path(old_location), display_path(new_location), - ) - shutil.move(old_location, new_location) - self._temp_build_dir.path = new_location - self._ideal_build_dir = None - self.source_dir = os.path.normpath(os.path.abspath(new_location)) - self._egg_info_path = None - - # Correct the metadata directory, if it exists - if self.metadata_directory: - old_meta = self.metadata_directory - rel = os.path.relpath(old_meta, start=old_location) - new_meta = os.path.join(new_location, rel) - new_meta = os.path.normpath(os.path.abspath(new_meta)) - self.metadata_directory = new_meta - - def remove_temporary_source(self): - # type: () -> None - """Remove the source files from this requirement, if they are marked - for deletion""" - if self.source_dir and os.path.exists( - os.path.join(self.source_dir, PIP_DELETE_MARKER_FILENAME)): - logger.debug('Removing source in %s', self.source_dir) - rmtree(self.source_dir) - self.source_dir = None - self._temp_build_dir.cleanup() - self.build_env.cleanup() - - def check_if_exists(self, use_user_site): - # type: (bool) -> bool - """Find an installed distribution that satisfies or conflicts - with this requirement, and set self.satisfied_by or - self.conflicts_with appropriately. - """ - if self.req is None: - return False - try: - # get_distribution() will resolve the entire list of requirements - # anyway, and we've already determined that we need the requirement - # in question, so strip the marker so that we don't try to - # evaluate it. - no_marker = Requirement(str(self.req)) - no_marker.marker = None - self.satisfied_by = pkg_resources.get_distribution(str(no_marker)) - if self.editable and self.satisfied_by: - self.conflicts_with = self.satisfied_by - # when installing editables, nothing pre-existing should ever - # satisfy - self.satisfied_by = None - return True - except pkg_resources.DistributionNotFound: - return False - except pkg_resources.VersionConflict: - existing_dist = pkg_resources.get_distribution( - self.req.name - ) - if use_user_site: - if dist_in_usersite(existing_dist): - self.conflicts_with = existing_dist - elif (running_under_virtualenv() and - dist_in_site_packages(existing_dist)): - raise InstallationError( - "Will not install to the user site because it will " - "lack sys.path precedence to %s in %s" % - (existing_dist.project_name, existing_dist.location) - ) - else: - self.conflicts_with = existing_dist - return True - - # Things valid for wheels - @property - def is_wheel(self): - # type: () -> bool - if not self.link: - return False - return self.link.is_wheel - - def move_wheel_files( - self, - wheeldir, # type: str - root=None, # type: Optional[str] - home=None, # type: Optional[str] - prefix=None, # type: Optional[str] - warn_script_location=True, # type: bool - use_user_site=False, # type: bool - pycompile=True # type: bool - ): - # type: (...) -> None - move_wheel_files( - self.name, self.req, wheeldir, - user=use_user_site, - home=home, - root=root, - prefix=prefix, - pycompile=pycompile, - isolated=self.isolated, - warn_script_location=warn_script_location, - ) - - # Things valid for sdists - @property - def setup_py_dir(self): - # type: () -> str - return os.path.join( - self.source_dir, - self.link and self.link.subdirectory_fragment or '') - - @property - def setup_py(self): - # type: () -> str - assert self.source_dir, "No source dir for %s" % self - - setup_py = os.path.join(self.setup_py_dir, 'setup.py') - - # Python2 __file__ should not be unicode - if six.PY2 and isinstance(setup_py, six.text_type): - setup_py = setup_py.encode(sys.getfilesystemencoding()) - - return setup_py - - @property - def pyproject_toml(self): - # type: () -> str - assert self.source_dir, "No source dir for %s" % self - - return make_pyproject_path(self.setup_py_dir) - - def load_pyproject_toml(self): - # type: () -> None - """Load the pyproject.toml file. - - After calling this routine, all of the attributes related to PEP 517 - processing for this requirement have been set. In particular, the - use_pep517 attribute can be used to determine whether we should - follow the PEP 517 or legacy (setup.py) code path. - """ - pep517_data = load_pyproject_toml( - self.use_pep517, - self.pyproject_toml, - self.setup_py, - str(self) - ) - - if pep517_data is None: - self.use_pep517 = False - else: - self.use_pep517 = True - requires, backend, check = pep517_data - self.requirements_to_check = check - self.pyproject_requires = requires - self.pep517_backend = Pep517HookCaller(self.setup_py_dir, backend) - - # Use a custom function to call subprocesses - self.spin_message = "" - - def runner( - cmd, # type: List[str] - cwd=None, # type: Optional[str] - extra_environ=None # type: Optional[Mapping[str, Any]] - ): - # type: (...) -> None - with open_spinner(self.spin_message) as spinner: - call_subprocess( - cmd, - cwd=cwd, - extra_environ=extra_environ, - spinner=spinner - ) - self.spin_message = "" - - self.pep517_backend._subprocess_runner = runner - - def prepare_metadata(self): - # type: () -> None - """Ensure that project metadata is available. - - Under PEP 517, call the backend hook to prepare the metadata. - Under legacy processing, call setup.py egg-info. - """ - assert self.source_dir - - with indent_log(): - if self.use_pep517: - self.prepare_pep517_metadata() - else: - self.run_egg_info() - - if not self.req: - if isinstance(parse_version(self.metadata["Version"]), Version): - op = "==" - else: - op = "===" - self.req = Requirement( - "".join([ - self.metadata["Name"], - op, - self.metadata["Version"], - ]) - ) - self._correct_build_location() - else: - metadata_name = canonicalize_name(self.metadata["Name"]) - if canonicalize_name(self.req.name) != metadata_name: - logger.warning( - 'Generating metadata for package %s ' - 'produced metadata for project name %s. Fix your ' - '#egg=%s fragments.', - self.name, metadata_name, self.name - ) - self.req = Requirement(metadata_name) - - def prepare_pep517_metadata(self): - # type: () -> None - assert self.pep517_backend is not None - - metadata_dir = os.path.join( - self.setup_py_dir, - 'pip-wheel-metadata' - ) - ensure_dir(metadata_dir) - - with self.build_env: - # Note that Pep517HookCaller implements a fallback for - # prepare_metadata_for_build_wheel, so we don't have to - # consider the possibility that this hook doesn't exist. - backend = self.pep517_backend - self.spin_message = "Preparing wheel metadata" - distinfo_dir = backend.prepare_metadata_for_build_wheel( - metadata_dir - ) - - self.metadata_directory = os.path.join(metadata_dir, distinfo_dir) - - def run_egg_info(self): - # type: () -> None - if self.name: - logger.debug( - 'Running setup.py (path:%s) egg_info for package %s', - self.setup_py, self.name, - ) - else: - logger.debug( - 'Running setup.py (path:%s) egg_info for package from %s', - self.setup_py, self.link, - ) - script = SETUPTOOLS_SHIM % self.setup_py - base_cmd = [sys.executable, '-c', script] - if self.isolated: - base_cmd += ["--no-user-cfg"] - egg_info_cmd = base_cmd + ['egg_info'] - # We can't put the .egg-info files at the root, because then the - # source code will be mistaken for an installed egg, causing - # problems - if self.editable: - egg_base_option = [] # type: List[str] - else: - egg_info_dir = os.path.join(self.setup_py_dir, 'pip-egg-info') - ensure_dir(egg_info_dir) - egg_base_option = ['--egg-base', 'pip-egg-info'] - with self.build_env: - call_subprocess( - egg_info_cmd + egg_base_option, - cwd=self.setup_py_dir, - command_desc='python setup.py egg_info') - - @property - def egg_info_path(self): - # type: () -> str - if self._egg_info_path is None: - if self.editable: - base = self.source_dir - else: - base = os.path.join(self.setup_py_dir, 'pip-egg-info') - filenames = os.listdir(base) - if self.editable: - filenames = [] - for root, dirs, files in os.walk(base): - for dir in vcs.dirnames: - if dir in dirs: - dirs.remove(dir) - # Iterate over a copy of ``dirs``, since mutating - # a list while iterating over it can cause trouble. - # (See https://github.com/pypa/pip/pull/462.) - for dir in list(dirs): - # Don't search in anything that looks like a virtualenv - # environment - if ( - os.path.lexists( - os.path.join(root, dir, 'bin', 'python') - ) or - os.path.exists( - os.path.join( - root, dir, 'Scripts', 'Python.exe' - ) - )): - dirs.remove(dir) - # Also don't search through tests - elif dir == 'test' or dir == 'tests': - dirs.remove(dir) - filenames.extend([os.path.join(root, dir) - for dir in dirs]) - filenames = [f for f in filenames if f.endswith('.egg-info')] - - if not filenames: - raise InstallationError( - "Files/directories not found in %s" % base - ) - # if we have more than one match, we pick the toplevel one. This - # can easily be the case if there is a dist folder which contains - # an extracted tarball for testing purposes. - if len(filenames) > 1: - filenames.sort( - key=lambda x: x.count(os.path.sep) + - (os.path.altsep and x.count(os.path.altsep) or 0) - ) - self._egg_info_path = os.path.join(base, filenames[0]) - return self._egg_info_path - - @property - def metadata(self): - # type: () -> Any - if not hasattr(self, '_metadata'): - self._metadata = get_metadata(self.get_dist()) - - return self._metadata - - def get_dist(self): - # type: () -> Distribution - """Return a pkg_resources.Distribution for this requirement""" - if self.metadata_directory: - base_dir, distinfo = os.path.split(self.metadata_directory) - metadata = pkg_resources.PathMetadata( - base_dir, self.metadata_directory - ) - dist_name = os.path.splitext(distinfo)[0] - typ = pkg_resources.DistInfoDistribution - else: - egg_info = self.egg_info_path.rstrip(os.path.sep) - base_dir = os.path.dirname(egg_info) - metadata = pkg_resources.PathMetadata(base_dir, egg_info) - dist_name = os.path.splitext(os.path.basename(egg_info))[0] - # https://github.com/python/mypy/issues/1174 - typ = pkg_resources.Distribution # type: ignore - - return typ( - base_dir, - project_name=dist_name, - metadata=metadata, - ) - - def assert_source_matches_version(self): - # type: () -> None - assert self.source_dir - version = self.metadata['version'] - if self.req.specifier and version not in self.req.specifier: - logger.warning( - 'Requested %s, but installing version %s', - self, - version, - ) - else: - logger.debug( - 'Source in %s has version %s, which satisfies requirement %s', - display_path(self.source_dir), - version, - self, - ) - - # For both source distributions and editables - def ensure_has_source_dir(self, parent_dir): - # type: (str) -> str - """Ensure that a source_dir is set. - - This will create a temporary build dir if the name of the requirement - isn't known yet. - - :param parent_dir: The ideal pip parent_dir for the source_dir. - Generally src_dir for editables and build_dir for sdists. - :return: self.source_dir - """ - if self.source_dir is None: - self.source_dir = self.build_location(parent_dir) - return self.source_dir - - # For editable installations - def install_editable( - self, - install_options, # type: List[str] - global_options=(), # type: Sequence[str] - prefix=None # type: Optional[str] - ): - # type: (...) -> None - logger.info('Running setup.py develop for %s', self.name) - - if self.isolated: - global_options = list(global_options) + ["--no-user-cfg"] - - if prefix: - prefix_param = ['--prefix={}'.format(prefix)] - install_options = list(install_options) + prefix_param - - with indent_log(): - # FIXME: should we do --install-headers here too? - with self.build_env: - call_subprocess( - [ - sys.executable, - '-c', - SETUPTOOLS_SHIM % self.setup_py - ] + - list(global_options) + - ['develop', '--no-deps'] + - list(install_options), - - cwd=self.setup_py_dir, - ) - - self.install_succeeded = True - - def update_editable(self, obtain=True): - # type: (bool) -> None - if not self.link: - logger.debug( - "Cannot update repository at %s; repository location is " - "unknown", - self.source_dir, - ) - return - assert self.editable - assert self.source_dir - if self.link.scheme == 'file': - # Static paths don't get updated - return - assert '+' in self.link.url, "bad url: %r" % self.link.url - if not self.update: - return - vc_type, url = self.link.url.split('+', 1) - backend = vcs.get_backend(vc_type) - if backend: - vcs_backend = backend(self.link.url) - if obtain: - vcs_backend.obtain(self.source_dir) - else: - vcs_backend.export(self.source_dir) - else: - assert 0, ( - 'Unexpected version control type (in %s): %s' - % (self.link, vc_type)) - - # Top-level Actions - def uninstall(self, auto_confirm=False, verbose=False, - use_user_site=False): - # type: (bool, bool, bool) -> Optional[UninstallPathSet] - """ - Uninstall the distribution currently satisfying this requirement. - - Prompts before removing or modifying files unless - ``auto_confirm`` is True. - - Refuses to delete or modify files outside of ``sys.prefix`` - - thus uninstallation within a virtual environment can only - modify that virtual environment, even if the virtualenv is - linked to global site-packages. - - """ - if not self.check_if_exists(use_user_site): - logger.warning("Skipping %s as it is not installed.", self.name) - return None - dist = self.satisfied_by or self.conflicts_with - - uninstalled_pathset = UninstallPathSet.from_dist(dist) - uninstalled_pathset.remove(auto_confirm, verbose) - return uninstalled_pathset - - def _clean_zip_name(self, name, prefix): # only used by archive. - # type: (str, str) -> str - assert name.startswith(prefix + os.path.sep), ( - "name %r doesn't start with prefix %r" % (name, prefix) - ) - name = name[len(prefix) + 1:] - name = name.replace(os.path.sep, '/') - return name - - def _get_archive_name(self, path, parentdir, rootdir): - # type: (str, str, str) -> str - path = os.path.join(parentdir, path) - name = self._clean_zip_name(path, rootdir) - return self.name + '/' + name - - # TODO: Investigate if this should be kept in InstallRequirement - # Seems to be used only when VCS + downloads - def archive(self, build_dir): - # type: (str) -> None - assert self.source_dir - create_archive = True - archive_name = '%s-%s.zip' % (self.name, self.metadata["version"]) - archive_path = os.path.join(build_dir, archive_name) - if os.path.exists(archive_path): - response = ask_path_exists( - 'The file %s exists. (i)gnore, (w)ipe, (b)ackup, (a)bort ' % - display_path(archive_path), ('i', 'w', 'b', 'a')) - if response == 'i': - create_archive = False - elif response == 'w': - logger.warning('Deleting %s', display_path(archive_path)) - os.remove(archive_path) - elif response == 'b': - dest_file = backup_dir(archive_path) - logger.warning( - 'Backing up %s to %s', - display_path(archive_path), - display_path(dest_file), - ) - shutil.move(archive_path, dest_file) - elif response == 'a': - sys.exit(-1) - if create_archive: - zip = zipfile.ZipFile( - archive_path, 'w', zipfile.ZIP_DEFLATED, - allowZip64=True - ) - dir = os.path.normcase(os.path.abspath(self.setup_py_dir)) - for dirpath, dirnames, filenames in os.walk(dir): - if 'pip-egg-info' in dirnames: - dirnames.remove('pip-egg-info') - for dirname in dirnames: - dir_arcname = self._get_archive_name(dirname, - parentdir=dirpath, - rootdir=dir) - zipdir = zipfile.ZipInfo(dir_arcname + '/') - zipdir.external_attr = 0x1ED << 16 # 0o755 - zip.writestr(zipdir, '') - for filename in filenames: - if filename == PIP_DELETE_MARKER_FILENAME: - continue - file_arcname = self._get_archive_name(filename, - parentdir=dirpath, - rootdir=dir) - filename = os.path.join(dirpath, filename) - zip.write(filename, file_arcname) - zip.close() - logger.info('Saved %s', display_path(archive_path)) - - def install( - self, - install_options, # type: List[str] - global_options=None, # type: Optional[Sequence[str]] - root=None, # type: Optional[str] - home=None, # type: Optional[str] - prefix=None, # type: Optional[str] - warn_script_location=True, # type: bool - use_user_site=False, # type: bool - pycompile=True # type: bool - ): - # type: (...) -> None - global_options = global_options if global_options is not None else [] - if self.editable: - self.install_editable( - install_options, global_options, prefix=prefix, - ) - return - if self.is_wheel: - version = wheel.wheel_version(self.source_dir) - wheel.check_compatibility(version, self.name) - - self.move_wheel_files( - self.source_dir, root=root, prefix=prefix, home=home, - warn_script_location=warn_script_location, - use_user_site=use_user_site, pycompile=pycompile, - ) - self.install_succeeded = True - return - - # Extend the list of global and install options passed on to - # the setup.py call with the ones from the requirements file. - # Options specified in requirements file override those - # specified on the command line, since the last option given - # to setup.py is the one that is used. - global_options = list(global_options) + \ - self.options.get('global_options', []) - install_options = list(install_options) + \ - self.options.get('install_options', []) - - if self.isolated: - # https://github.com/python/mypy/issues/1174 - global_options = global_options + ["--no-user-cfg"] # type: ignore - - with TempDirectory(kind="record") as temp_dir: - record_filename = os.path.join(temp_dir.path, 'install-record.txt') - install_args = self.get_install_args( - global_options, record_filename, root, prefix, pycompile, - ) - msg = 'Running setup.py install for %s' % (self.name,) - with open_spinner(msg) as spinner: - with indent_log(): - with self.build_env: - call_subprocess( - install_args + install_options, - cwd=self.setup_py_dir, - spinner=spinner, - ) - - if not os.path.exists(record_filename): - logger.debug('Record file %s not found', record_filename) - return - self.install_succeeded = True - - def prepend_root(path): - # type: (str) -> str - if root is None or not os.path.isabs(path): - return path - else: - return change_root(root, path) - - with open(record_filename) as f: - for line in f: - directory = os.path.dirname(line) - if directory.endswith('.egg-info'): - egg_info_dir = prepend_root(directory) - break - else: - logger.warning( - 'Could not find .egg-info directory in install record' - ' for %s', - self, - ) - # FIXME: put the record somewhere - # FIXME: should this be an error? - return - new_lines = [] - with open(record_filename) as f: - for line in f: - filename = line.strip() - if os.path.isdir(filename): - filename += os.path.sep - new_lines.append( - os.path.relpath(prepend_root(filename), egg_info_dir) - ) - new_lines.sort() - ensure_dir(egg_info_dir) - inst_files_path = os.path.join(egg_info_dir, 'installed-files.txt') - with open(inst_files_path, 'w') as f: - f.write('\n'.join(new_lines) + '\n') - - def get_install_args( - self, - global_options, # type: Sequence[str] - record_filename, # type: str - root, # type: Optional[str] - prefix, # type: Optional[str] - pycompile # type: bool - ): - # type: (...) -> List[str] - install_args = [sys.executable, "-u"] - install_args.append('-c') - install_args.append(SETUPTOOLS_SHIM % self.setup_py) - install_args += list(global_options) + \ - ['install', '--record', record_filename] - install_args += ['--single-version-externally-managed'] - - if root is not None: - install_args += ['--root', root] - if prefix is not None: - install_args += ['--prefix', prefix] - - if pycompile: - install_args += ["--compile"] - else: - install_args += ["--no-compile"] - - if running_under_virtualenv(): - py_ver_str = 'python' + sysconfig.get_python_version() - install_args += ['--install-headers', - os.path.join(sys.prefix, 'include', 'site', - py_ver_str, self.name)] - - return install_args diff --git a/env/lib/python3.7/site-packages/pip/_internal/req/req_set.py b/env/lib/python3.7/site-packages/pip/_internal/req/req_set.py deleted file mode 100644 index d1966a4..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/req/req_set.py +++ /dev/null @@ -1,193 +0,0 @@ -from __future__ import absolute_import - -import logging -from collections import OrderedDict - -from pip._internal.exceptions import InstallationError -from pip._internal.utils.logging import indent_log -from pip._internal.utils.typing import MYPY_CHECK_RUNNING -from pip._internal.wheel import Wheel - -if MYPY_CHECK_RUNNING: - from typing import Dict, Iterable, List, Optional, Tuple - from pip._internal.req.req_install import InstallRequirement - - -logger = logging.getLogger(__name__) - - -class RequirementSet(object): - - def __init__(self, require_hashes=False, check_supported_wheels=True): - # type: (bool, bool) -> None - """Create a RequirementSet. - """ - - self.requirements = OrderedDict() # type: Dict[str, InstallRequirement] # noqa: E501 - self.require_hashes = require_hashes - self.check_supported_wheels = check_supported_wheels - - # Mapping of alias: real_name - self.requirement_aliases = {} # type: Dict[str, str] - self.unnamed_requirements = [] # type: List[InstallRequirement] - self.successfully_downloaded = [] # type: List[InstallRequirement] - self.reqs_to_cleanup = [] # type: List[InstallRequirement] - - def __str__(self): - # type: () -> str - reqs = [req for req in self.requirements.values() - if not req.comes_from] - reqs.sort(key=lambda req: req.name.lower()) - return ' '.join([str(req.req) for req in reqs]) - - def __repr__(self): - # type: () -> str - reqs = [req for req in self.requirements.values()] - reqs.sort(key=lambda req: req.name.lower()) - reqs_str = ', '.join([str(req.req) for req in reqs]) - return ('<%s object; %d requirement(s): %s>' - % (self.__class__.__name__, len(reqs), reqs_str)) - - def add_requirement( - self, - install_req, # type: InstallRequirement - parent_req_name=None, # type: Optional[str] - extras_requested=None # type: Optional[Iterable[str]] - ): - # type: (...) -> Tuple[List[InstallRequirement], Optional[InstallRequirement]] # noqa: E501 - """Add install_req as a requirement to install. - - :param parent_req_name: The name of the requirement that needed this - added. The name is used because when multiple unnamed requirements - resolve to the same name, we could otherwise end up with dependency - links that point outside the Requirements set. parent_req must - already be added. Note that None implies that this is a user - supplied requirement, vs an inferred one. - :param extras_requested: an iterable of extras used to evaluate the - environment markers. - :return: Additional requirements to scan. That is either [] if - the requirement is not applicable, or [install_req] if the - requirement is applicable and has just been added. - """ - name = install_req.name - - # If the markers do not match, ignore this requirement. - if not install_req.match_markers(extras_requested): - logger.info( - "Ignoring %s: markers '%s' don't match your environment", - name, install_req.markers, - ) - return [], None - - # If the wheel is not supported, raise an error. - # Should check this after filtering out based on environment markers to - # allow specifying different wheels based on the environment/OS, in a - # single requirements file. - if install_req.link and install_req.link.is_wheel: - wheel = Wheel(install_req.link.filename) - if self.check_supported_wheels and not wheel.supported(): - raise InstallationError( - "%s is not a supported wheel on this platform." % - wheel.filename - ) - - # This next bit is really a sanity check. - assert install_req.is_direct == (parent_req_name is None), ( - "a direct req shouldn't have a parent and also, " - "a non direct req should have a parent" - ) - - # Unnamed requirements are scanned again and the requirement won't be - # added as a dependency until after scanning. - if not name: - # url or path requirement w/o an egg fragment - self.unnamed_requirements.append(install_req) - return [install_req], None - - try: - existing_req = self.get_requirement(name) - except KeyError: - existing_req = None - - has_conflicting_requirement = ( - parent_req_name is None and - existing_req and - not existing_req.constraint and - existing_req.extras == install_req.extras and - existing_req.req.specifier != install_req.req.specifier - ) - if has_conflicting_requirement: - raise InstallationError( - "Double requirement given: %s (already in %s, name=%r)" - % (install_req, existing_req, name) - ) - - # When no existing requirement exists, add the requirement as a - # dependency and it will be scanned again after. - if not existing_req: - self.requirements[name] = install_req - # FIXME: what about other normalizations? E.g., _ vs. -? - if name.lower() != name: - self.requirement_aliases[name.lower()] = name - # We'd want to rescan this requirements later - return [install_req], install_req - - # Assume there's no need to scan, and that we've already - # encountered this for scanning. - if install_req.constraint or not existing_req.constraint: - return [], existing_req - - does_not_satisfy_constraint = ( - install_req.link and - not ( - existing_req.link and - install_req.link.path == existing_req.link.path - ) - ) - if does_not_satisfy_constraint: - self.reqs_to_cleanup.append(install_req) - raise InstallationError( - "Could not satisfy constraints for '%s': " - "installation from path or url cannot be " - "constrained to a version" % name, - ) - # If we're now installing a constraint, mark the existing - # object for real installation. - existing_req.constraint = False - existing_req.extras = tuple(sorted( - set(existing_req.extras) | set(install_req.extras) - )) - logger.debug( - "Setting %s extras to: %s", - existing_req, existing_req.extras, - ) - # Return the existing requirement for addition to the parent and - # scanning again. - return [existing_req], existing_req - - def has_requirement(self, project_name): - # type: (str) -> bool - name = project_name.lower() - if (name in self.requirements and - not self.requirements[name].constraint or - name in self.requirement_aliases and - not self.requirements[self.requirement_aliases[name]].constraint): - return True - return False - - def get_requirement(self, project_name): - # type: (str) -> InstallRequirement - for name in project_name, project_name.lower(): - if name in self.requirements: - return self.requirements[name] - if name in self.requirement_aliases: - return self.requirements[self.requirement_aliases[name]] - raise KeyError("No project with the name %r" % project_name) - - def cleanup_files(self): - # type: () -> None - """Clean up files, remove builds.""" - logger.debug('Cleaning up...') - with indent_log(): - for req in self.reqs_to_cleanup: - req.remove_temporary_source() diff --git a/env/lib/python3.7/site-packages/pip/_internal/req/req_tracker.py b/env/lib/python3.7/site-packages/pip/_internal/req/req_tracker.py deleted file mode 100644 index e36a3f6..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/req/req_tracker.py +++ /dev/null @@ -1,96 +0,0 @@ -from __future__ import absolute_import - -import contextlib -import errno -import hashlib -import logging -import os - -from pip._internal.utils.temp_dir import TempDirectory -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from types import TracebackType - from typing import Iterator, Optional, Set, Type - from pip._internal.req.req_install import InstallRequirement - from pip._internal.models.link import Link - -logger = logging.getLogger(__name__) - - -class RequirementTracker(object): - - def __init__(self): - # type: () -> None - self._root = os.environ.get('PIP_REQ_TRACKER') - if self._root is None: - self._temp_dir = TempDirectory(delete=False, kind='req-tracker') - self._temp_dir.create() - self._root = os.environ['PIP_REQ_TRACKER'] = self._temp_dir.path - logger.debug('Created requirements tracker %r', self._root) - else: - self._temp_dir = None - logger.debug('Re-using requirements tracker %r', self._root) - self._entries = set() # type: Set[InstallRequirement] - - def __enter__(self): - # type: () -> RequirementTracker - return self - - def __exit__( - self, - exc_type, # type: Optional[Type[BaseException]] - exc_val, # type: Optional[BaseException] - exc_tb # type: Optional[TracebackType] - ): - # type: (...) -> None - self.cleanup() - - def _entry_path(self, link): - # type: (Link) -> str - hashed = hashlib.sha224(link.url_without_fragment.encode()).hexdigest() - return os.path.join(self._root, hashed) - - def add(self, req): - # type: (InstallRequirement) -> None - link = req.link - info = str(req) - entry_path = self._entry_path(link) - try: - with open(entry_path) as fp: - # Error, these's already a build in progress. - raise LookupError('%s is already being built: %s' - % (link, fp.read())) - except IOError as e: - if e.errno != errno.ENOENT: - raise - assert req not in self._entries - with open(entry_path, 'w') as fp: - fp.write(info) - self._entries.add(req) - logger.debug('Added %s to build tracker %r', req, self._root) - - def remove(self, req): - # type: (InstallRequirement) -> None - link = req.link - self._entries.remove(req) - os.unlink(self._entry_path(link)) - logger.debug('Removed %s from build tracker %r', req, self._root) - - def cleanup(self): - # type: () -> None - for req in set(self._entries): - self.remove(req) - remove = self._temp_dir is not None - if remove: - self._temp_dir.cleanup() - logger.debug('%s build tracker %r', - 'Removed' if remove else 'Cleaned', - self._root) - - @contextlib.contextmanager - def track(self, req): - # type: (InstallRequirement) -> Iterator[None] - self.add(req) - yield - self.remove(req) diff --git a/env/lib/python3.7/site-packages/pip/_internal/req/req_uninstall.py b/env/lib/python3.7/site-packages/pip/_internal/req/req_uninstall.py deleted file mode 100644 index 733301c..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/req/req_uninstall.py +++ /dev/null @@ -1,633 +0,0 @@ -from __future__ import absolute_import - -import csv -import functools -import logging -import os -import sys -import sysconfig - -from pip._vendor import pkg_resources - -from pip._internal.exceptions import UninstallationError -from pip._internal.locations import bin_py, bin_user -from pip._internal.utils.compat import WINDOWS, cache_from_source, uses_pycache -from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import ( - FakeFile, ask, dist_in_usersite, dist_is_local, egg_link_path, is_local, - normalize_path, renames, rmtree, -) -from pip._internal.utils.temp_dir import AdjacentTempDirectory, TempDirectory -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import ( - Any, Callable, Dict, Iterable, Iterator, List, Optional, Set, Tuple, - ) - from pip._vendor.pkg_resources import Distribution - -logger = logging.getLogger(__name__) - - -def _script_names(dist, script_name, is_gui): - # type: (Distribution, str, bool) -> List[str] - """Create the fully qualified name of the files created by - {console,gui}_scripts for the given ``dist``. - Returns the list of file names - """ - if dist_in_usersite(dist): - bin_dir = bin_user - else: - bin_dir = bin_py - exe_name = os.path.join(bin_dir, script_name) - paths_to_remove = [exe_name] - if WINDOWS: - paths_to_remove.append(exe_name + '.exe') - paths_to_remove.append(exe_name + '.exe.manifest') - if is_gui: - paths_to_remove.append(exe_name + '-script.pyw') - else: - paths_to_remove.append(exe_name + '-script.py') - return paths_to_remove - - -def _unique(fn): - # type: (Callable) -> Callable[..., Iterator[Any]] - @functools.wraps(fn) - def unique(*args, **kw): - # type: (Any, Any) -> Iterator[Any] - seen = set() # type: Set[Any] - for item in fn(*args, **kw): - if item not in seen: - seen.add(item) - yield item - return unique - - -@_unique -def uninstallation_paths(dist): - # type: (Distribution) -> Iterator[str] - """ - Yield all the uninstallation paths for dist based on RECORD-without-.py[co] - - Yield paths to all the files in RECORD. For each .py file in RECORD, add - the .pyc and .pyo in the same directory. - - UninstallPathSet.add() takes care of the __pycache__ .py[co]. - """ - r = csv.reader(FakeFile(dist.get_metadata_lines('RECORD'))) - for row in r: - path = os.path.join(dist.location, row[0]) - yield path - if path.endswith('.py'): - dn, fn = os.path.split(path) - base = fn[:-3] - path = os.path.join(dn, base + '.pyc') - yield path - path = os.path.join(dn, base + '.pyo') - yield path - - -def compact(paths): - # type: (Iterable[str]) -> Set[str] - """Compact a path set to contain the minimal number of paths - necessary to contain all paths in the set. If /a/path/ and - /a/path/to/a/file.txt are both in the set, leave only the - shorter path.""" - - sep = os.path.sep - short_paths = set() # type: Set[str] - for path in sorted(paths, key=len): - should_skip = any( - path.startswith(shortpath.rstrip("*")) and - path[len(shortpath.rstrip("*").rstrip(sep))] == sep - for shortpath in short_paths - ) - if not should_skip: - short_paths.add(path) - return short_paths - - -def compress_for_rename(paths): - # type: (Iterable[str]) -> Set[str] - """Returns a set containing the paths that need to be renamed. - - This set may include directories when the original sequence of paths - included every file on disk. - """ - case_map = dict((os.path.normcase(p), p) for p in paths) - remaining = set(case_map) - unchecked = sorted(set(os.path.split(p)[0] - for p in case_map.values()), key=len) - wildcards = set() # type: Set[str] - - def norm_join(*a): - # type: (str) -> str - return os.path.normcase(os.path.join(*a)) - - for root in unchecked: - if any(os.path.normcase(root).startswith(w) - for w in wildcards): - # This directory has already been handled. - continue - - all_files = set() # type: Set[str] - all_subdirs = set() # type: Set[str] - for dirname, subdirs, files in os.walk(root): - all_subdirs.update(norm_join(root, dirname, d) - for d in subdirs) - all_files.update(norm_join(root, dirname, f) - for f in files) - # If all the files we found are in our remaining set of files to - # remove, then remove them from the latter set and add a wildcard - # for the directory. - if not (all_files - remaining): - remaining.difference_update(all_files) - wildcards.add(root + os.sep) - - return set(map(case_map.__getitem__, remaining)) | wildcards - - -def compress_for_output_listing(paths): - # type: (Iterable[str]) -> Tuple[Set[str], Set[str]] - """Returns a tuple of 2 sets of which paths to display to user - - The first set contains paths that would be deleted. Files of a package - are not added and the top-level directory of the package has a '*' added - at the end - to signify that all it's contents are removed. - - The second set contains files that would have been skipped in the above - folders. - """ - - will_remove = set(paths) - will_skip = set() - - # Determine folders and files - folders = set() - files = set() - for path in will_remove: - if path.endswith(".pyc"): - continue - if path.endswith("__init__.py") or ".dist-info" in path: - folders.add(os.path.dirname(path)) - files.add(path) - - # probably this one https://github.com/python/mypy/issues/390 - _normcased_files = set(map(os.path.normcase, files)) # type: ignore - - folders = compact(folders) - - # This walks the tree using os.walk to not miss extra folders - # that might get added. - for folder in folders: - for dirpath, _, dirfiles in os.walk(folder): - for fname in dirfiles: - if fname.endswith(".pyc"): - continue - - file_ = os.path.join(dirpath, fname) - if (os.path.isfile(file_) and - os.path.normcase(file_) not in _normcased_files): - # We are skipping this file. Add it to the set. - will_skip.add(file_) - - will_remove = files | { - os.path.join(folder, "*") for folder in folders - } - - return will_remove, will_skip - - -class StashedUninstallPathSet(object): - """A set of file rename operations to stash files while - tentatively uninstalling them.""" - def __init__(self): - # type: () -> None - # Mapping from source file root to [Adjacent]TempDirectory - # for files under that directory. - self._save_dirs = {} # type: Dict[str, TempDirectory] - # (old path, new path) tuples for each move that may need - # to be undone. - self._moves = [] # type: List[Tuple[str, str]] - - def _get_directory_stash(self, path): - # type: (str) -> str - """Stashes a directory. - - Directories are stashed adjacent to their original location if - possible, or else moved/copied into the user's temp dir.""" - - try: - save_dir = AdjacentTempDirectory(path) # type: TempDirectory - save_dir.create() - except OSError: - save_dir = TempDirectory(kind="uninstall") - save_dir.create() - self._save_dirs[os.path.normcase(path)] = save_dir - - return save_dir.path - - def _get_file_stash(self, path): - # type: (str) -> str - """Stashes a file. - - If no root has been provided, one will be created for the directory - in the user's temp directory.""" - path = os.path.normcase(path) - head, old_head = os.path.dirname(path), None - save_dir = None - - while head != old_head: - try: - save_dir = self._save_dirs[head] - break - except KeyError: - pass - head, old_head = os.path.dirname(head), head - else: - # Did not find any suitable root - head = os.path.dirname(path) - save_dir = TempDirectory(kind='uninstall') - save_dir.create() - self._save_dirs[head] = save_dir - - relpath = os.path.relpath(path, head) - if relpath and relpath != os.path.curdir: - return os.path.join(save_dir.path, relpath) - return save_dir.path - - def stash(self, path): - # type: (str) -> str - """Stashes the directory or file and returns its new location. - """ - if os.path.isdir(path): - new_path = self._get_directory_stash(path) - else: - new_path = self._get_file_stash(path) - - self._moves.append((path, new_path)) - if os.path.isdir(path) and os.path.isdir(new_path): - # If we're moving a directory, we need to - # remove the destination first or else it will be - # moved to inside the existing directory. - # We just created new_path ourselves, so it will - # be removable. - os.rmdir(new_path) - renames(path, new_path) - return new_path - - def commit(self): - # type: () -> None - """Commits the uninstall by removing stashed files.""" - for _, save_dir in self._save_dirs.items(): - save_dir.cleanup() - self._moves = [] - self._save_dirs = {} - - def rollback(self): - # type: () -> None - """Undoes the uninstall by moving stashed files back.""" - for p in self._moves: - logging.info("Moving to %s\n from %s", *p) - - for new_path, path in self._moves: - try: - logger.debug('Replacing %s from %s', new_path, path) - if os.path.isfile(new_path): - os.unlink(new_path) - elif os.path.isdir(new_path): - rmtree(new_path) - renames(path, new_path) - except OSError as ex: - logger.error("Failed to restore %s", new_path) - logger.debug("Exception: %s", ex) - - self.commit() - - @property - def can_rollback(self): - # type: () -> bool - return bool(self._moves) - - -class UninstallPathSet(object): - """A set of file paths to be removed in the uninstallation of a - requirement.""" - def __init__(self, dist): - # type: (Distribution) -> None - self.paths = set() # type: Set[str] - self._refuse = set() # type: Set[str] - self.pth = {} # type: Dict[str, UninstallPthEntries] - self.dist = dist - self._moved_paths = StashedUninstallPathSet() - - def _permitted(self, path): - # type: (str) -> bool - """ - Return True if the given path is one we are permitted to - remove/modify, False otherwise. - - """ - return is_local(path) - - def add(self, path): - # type: (str) -> None - head, tail = os.path.split(path) - - # we normalize the head to resolve parent directory symlinks, but not - # the tail, since we only want to uninstall symlinks, not their targets - path = os.path.join(normalize_path(head), os.path.normcase(tail)) - - if not os.path.exists(path): - return - if self._permitted(path): - self.paths.add(path) - else: - self._refuse.add(path) - - # __pycache__ files can show up after 'installed-files.txt' is created, - # due to imports - if os.path.splitext(path)[1] == '.py' and uses_pycache: - self.add(cache_from_source(path)) - - def add_pth(self, pth_file, entry): - # type: (str, str) -> None - pth_file = normalize_path(pth_file) - if self._permitted(pth_file): - if pth_file not in self.pth: - self.pth[pth_file] = UninstallPthEntries(pth_file) - self.pth[pth_file].add(entry) - else: - self._refuse.add(pth_file) - - def remove(self, auto_confirm=False, verbose=False): - # type: (bool, bool) -> None - """Remove paths in ``self.paths`` with confirmation (unless - ``auto_confirm`` is True).""" - - if not self.paths: - logger.info( - "Can't uninstall '%s'. No files were found to uninstall.", - self.dist.project_name, - ) - return - - dist_name_version = ( - self.dist.project_name + "-" + self.dist.version - ) - logger.info('Uninstalling %s:', dist_name_version) - - with indent_log(): - if auto_confirm or self._allowed_to_proceed(verbose): - moved = self._moved_paths - - for_rename = compress_for_rename(self.paths) - - for path in sorted(compact(for_rename)): - moved.stash(path) - logger.debug('Removing file or directory %s', path) - - for pth in self.pth.values(): - pth.remove() - - logger.info('Successfully uninstalled %s', dist_name_version) - - def _allowed_to_proceed(self, verbose): - # type: (bool) -> bool - """Display which files would be deleted and prompt for confirmation - """ - - def _display(msg, paths): - # type: (str, Iterable[str]) -> None - if not paths: - return - - logger.info(msg) - with indent_log(): - for path in sorted(compact(paths)): - logger.info(path) - - if not verbose: - will_remove, will_skip = compress_for_output_listing(self.paths) - else: - # In verbose mode, display all the files that are going to be - # deleted. - will_remove = set(self.paths) - will_skip = set() - - _display('Would remove:', will_remove) - _display('Would not remove (might be manually added):', will_skip) - _display('Would not remove (outside of prefix):', self._refuse) - if verbose: - _display('Will actually move:', compress_for_rename(self.paths)) - - return ask('Proceed (y/n)? ', ('y', 'n')) == 'y' - - def rollback(self): - # type: () -> None - """Rollback the changes previously made by remove().""" - if not self._moved_paths.can_rollback: - logger.error( - "Can't roll back %s; was not uninstalled", - self.dist.project_name, - ) - return - logger.info('Rolling back uninstall of %s', self.dist.project_name) - self._moved_paths.rollback() - for pth in self.pth.values(): - pth.rollback() - - def commit(self): - # type: () -> None - """Remove temporary save dir: rollback will no longer be possible.""" - self._moved_paths.commit() - - @classmethod - def from_dist(cls, dist): - # type: (Distribution) -> UninstallPathSet - dist_path = normalize_path(dist.location) - if not dist_is_local(dist): - logger.info( - "Not uninstalling %s at %s, outside environment %s", - dist.key, - dist_path, - sys.prefix, - ) - return cls(dist) - - if dist_path in {p for p in {sysconfig.get_path("stdlib"), - sysconfig.get_path("platstdlib")} - if p}: - logger.info( - "Not uninstalling %s at %s, as it is in the standard library.", - dist.key, - dist_path, - ) - return cls(dist) - - paths_to_remove = cls(dist) - develop_egg_link = egg_link_path(dist) - develop_egg_link_egg_info = '{}.egg-info'.format( - pkg_resources.to_filename(dist.project_name)) - egg_info_exists = dist.egg_info and os.path.exists(dist.egg_info) - # Special case for distutils installed package - distutils_egg_info = getattr(dist._provider, 'path', None) - - # Uninstall cases order do matter as in the case of 2 installs of the - # same package, pip needs to uninstall the currently detected version - if (egg_info_exists and dist.egg_info.endswith('.egg-info') and - not dist.egg_info.endswith(develop_egg_link_egg_info)): - # if dist.egg_info.endswith(develop_egg_link_egg_info), we - # are in fact in the develop_egg_link case - paths_to_remove.add(dist.egg_info) - if dist.has_metadata('installed-files.txt'): - for installed_file in dist.get_metadata( - 'installed-files.txt').splitlines(): - path = os.path.normpath( - os.path.join(dist.egg_info, installed_file) - ) - paths_to_remove.add(path) - # FIXME: need a test for this elif block - # occurs with --single-version-externally-managed/--record outside - # of pip - elif dist.has_metadata('top_level.txt'): - if dist.has_metadata('namespace_packages.txt'): - namespaces = dist.get_metadata('namespace_packages.txt') - else: - namespaces = [] - for top_level_pkg in [ - p for p - in dist.get_metadata('top_level.txt').splitlines() - if p and p not in namespaces]: - path = os.path.join(dist.location, top_level_pkg) - paths_to_remove.add(path) - paths_to_remove.add(path + '.py') - paths_to_remove.add(path + '.pyc') - paths_to_remove.add(path + '.pyo') - - elif distutils_egg_info: - raise UninstallationError( - "Cannot uninstall {!r}. It is a distutils installed project " - "and thus we cannot accurately determine which files belong " - "to it which would lead to only a partial uninstall.".format( - dist.project_name, - ) - ) - - elif dist.location.endswith('.egg'): - # package installed by easy_install - # We cannot match on dist.egg_name because it can slightly vary - # i.e. setuptools-0.6c11-py2.6.egg vs setuptools-0.6rc11-py2.6.egg - paths_to_remove.add(dist.location) - easy_install_egg = os.path.split(dist.location)[1] - easy_install_pth = os.path.join(os.path.dirname(dist.location), - 'easy-install.pth') - paths_to_remove.add_pth(easy_install_pth, './' + easy_install_egg) - - elif egg_info_exists and dist.egg_info.endswith('.dist-info'): - for path in uninstallation_paths(dist): - paths_to_remove.add(path) - - elif develop_egg_link: - # develop egg - with open(develop_egg_link, 'r') as fh: - link_pointer = os.path.normcase(fh.readline().strip()) - assert (link_pointer == dist.location), ( - 'Egg-link %s does not match installed location of %s ' - '(at %s)' % (link_pointer, dist.project_name, dist.location) - ) - paths_to_remove.add(develop_egg_link) - easy_install_pth = os.path.join(os.path.dirname(develop_egg_link), - 'easy-install.pth') - paths_to_remove.add_pth(easy_install_pth, dist.location) - - else: - logger.debug( - 'Not sure how to uninstall: %s - Check: %s', - dist, dist.location, - ) - - # find distutils scripts= scripts - if dist.has_metadata('scripts') and dist.metadata_isdir('scripts'): - for script in dist.metadata_listdir('scripts'): - if dist_in_usersite(dist): - bin_dir = bin_user - else: - bin_dir = bin_py - paths_to_remove.add(os.path.join(bin_dir, script)) - if WINDOWS: - paths_to_remove.add(os.path.join(bin_dir, script) + '.bat') - - # find console_scripts - _scripts_to_remove = [] - console_scripts = dist.get_entry_map(group='console_scripts') - for name in console_scripts.keys(): - _scripts_to_remove.extend(_script_names(dist, name, False)) - # find gui_scripts - gui_scripts = dist.get_entry_map(group='gui_scripts') - for name in gui_scripts.keys(): - _scripts_to_remove.extend(_script_names(dist, name, True)) - - for s in _scripts_to_remove: - paths_to_remove.add(s) - - return paths_to_remove - - -class UninstallPthEntries(object): - def __init__(self, pth_file): - # type: (str) -> None - if not os.path.isfile(pth_file): - raise UninstallationError( - "Cannot remove entries from nonexistent file %s" % pth_file - ) - self.file = pth_file - self.entries = set() # type: Set[str] - self._saved_lines = None # type: Optional[List[bytes]] - - def add(self, entry): - # type: (str) -> None - entry = os.path.normcase(entry) - # On Windows, os.path.normcase converts the entry to use - # backslashes. This is correct for entries that describe absolute - # paths outside of site-packages, but all the others use forward - # slashes. - if WINDOWS and not os.path.splitdrive(entry)[0]: - entry = entry.replace('\\', '/') - self.entries.add(entry) - - def remove(self): - # type: () -> None - logger.debug('Removing pth entries from %s:', self.file) - with open(self.file, 'rb') as fh: - # windows uses '\r\n' with py3k, but uses '\n' with py2.x - lines = fh.readlines() - self._saved_lines = lines - if any(b'\r\n' in line for line in lines): - endline = '\r\n' - else: - endline = '\n' - # handle missing trailing newline - if lines and not lines[-1].endswith(endline.encode("utf-8")): - lines[-1] = lines[-1] + endline.encode("utf-8") - for entry in self.entries: - try: - logger.debug('Removing entry: %s', entry) - lines.remove((entry + endline).encode("utf-8")) - except ValueError: - pass - with open(self.file, 'wb') as fh: - fh.writelines(lines) - - def rollback(self): - # type: () -> bool - if self._saved_lines is None: - logger.error( - 'Cannot roll back changes to %s, none were made', self.file - ) - return False - logger.debug('Rolling %s back to previous state', self.file) - with open(self.file, 'wb') as fh: - fh.writelines(self._saved_lines) - return True diff --git a/env/lib/python3.7/site-packages/pip/_internal/resolve.py b/env/lib/python3.7/site-packages/pip/_internal/resolve.py deleted file mode 100644 index f49667b..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/resolve.py +++ /dev/null @@ -1,393 +0,0 @@ -"""Dependency Resolution - -The dependency resolution in pip is performed as follows: - -for top-level requirements: - a. only one spec allowed per project, regardless of conflicts or not. - otherwise a "double requirement" exception is raised - b. they override sub-dependency requirements. -for sub-dependencies - a. "first found, wins" (where the order is breadth first) -""" - -import logging -from collections import defaultdict -from itertools import chain - -from pip._internal.exceptions import ( - BestVersionAlreadyInstalled, DistributionNotFound, HashError, HashErrors, - UnsupportedPythonVersion, -) -from pip._internal.req.constructors import install_req_from_req_string -from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import dist_in_usersite, ensure_dir -from pip._internal.utils.packaging import check_dist_requires_python -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Optional, DefaultDict, List, Set - from pip._internal.download import PipSession - from pip._internal.req.req_install import InstallRequirement - from pip._internal.index import PackageFinder - from pip._internal.req.req_set import RequirementSet - from pip._internal.operations.prepare import ( - DistAbstraction, RequirementPreparer - ) - from pip._internal.cache import WheelCache - -logger = logging.getLogger(__name__) - - -class Resolver(object): - """Resolves which packages need to be installed/uninstalled to perform \ - the requested operation without breaking the requirements of any package. - """ - - _allowed_strategies = {"eager", "only-if-needed", "to-satisfy-only"} - - def __init__( - self, - preparer, # type: RequirementPreparer - session, # type: PipSession - finder, # type: PackageFinder - wheel_cache, # type: Optional[WheelCache] - use_user_site, # type: bool - ignore_dependencies, # type: bool - ignore_installed, # type: bool - ignore_requires_python, # type: bool - force_reinstall, # type: bool - isolated, # type: bool - upgrade_strategy, # type: str - use_pep517=None # type: Optional[bool] - ): - # type: (...) -> None - super(Resolver, self).__init__() - assert upgrade_strategy in self._allowed_strategies - - self.preparer = preparer - self.finder = finder - self.session = session - - # NOTE: This would eventually be replaced with a cache that can give - # information about both sdist and wheels transparently. - self.wheel_cache = wheel_cache - - # This is set in resolve - self.require_hashes = None # type: Optional[bool] - - self.upgrade_strategy = upgrade_strategy - self.force_reinstall = force_reinstall - self.isolated = isolated - self.ignore_dependencies = ignore_dependencies - self.ignore_installed = ignore_installed - self.ignore_requires_python = ignore_requires_python - self.use_user_site = use_user_site - self.use_pep517 = use_pep517 - - self._discovered_dependencies = \ - defaultdict(list) # type: DefaultDict[str, List] - - def resolve(self, requirement_set): - # type: (RequirementSet) -> None - """Resolve what operations need to be done - - As a side-effect of this method, the packages (and their dependencies) - are downloaded, unpacked and prepared for installation. This - preparation is done by ``pip.operations.prepare``. - - Once PyPI has static dependency metadata available, it would be - possible to move the preparation to become a step separated from - dependency resolution. - """ - # make the wheelhouse - if self.preparer.wheel_download_dir: - ensure_dir(self.preparer.wheel_download_dir) - - # If any top-level requirement has a hash specified, enter - # hash-checking mode, which requires hashes from all. - root_reqs = ( - requirement_set.unnamed_requirements + - list(requirement_set.requirements.values()) - ) - self.require_hashes = ( - requirement_set.require_hashes or - any(req.has_hash_options for req in root_reqs) - ) - - # Display where finder is looking for packages - locations = self.finder.get_formatted_locations() - if locations: - logger.info(locations) - - # Actually prepare the files, and collect any exceptions. Most hash - # exceptions cannot be checked ahead of time, because - # req.populate_link() needs to be called before we can make decisions - # based on link type. - discovered_reqs = [] # type: List[InstallRequirement] - hash_errors = HashErrors() - for req in chain(root_reqs, discovered_reqs): - try: - discovered_reqs.extend( - self._resolve_one(requirement_set, req) - ) - except HashError as exc: - exc.req = req - hash_errors.append(exc) - - if hash_errors: - raise hash_errors - - def _is_upgrade_allowed(self, req): - # type: (InstallRequirement) -> bool - if self.upgrade_strategy == "to-satisfy-only": - return False - elif self.upgrade_strategy == "eager": - return True - else: - assert self.upgrade_strategy == "only-if-needed" - return req.is_direct - - def _set_req_to_reinstall(self, req): - # type: (InstallRequirement) -> None - """ - Set a requirement to be installed. - """ - # Don't uninstall the conflict if doing a user install and the - # conflict is not a user install. - if not self.use_user_site or dist_in_usersite(req.satisfied_by): - req.conflicts_with = req.satisfied_by - req.satisfied_by = None - - # XXX: Stop passing requirement_set for options - def _check_skip_installed(self, req_to_install): - # type: (InstallRequirement) -> Optional[str] - """Check if req_to_install should be skipped. - - This will check if the req is installed, and whether we should upgrade - or reinstall it, taking into account all the relevant user options. - - After calling this req_to_install will only have satisfied_by set to - None if the req_to_install is to be upgraded/reinstalled etc. Any - other value will be a dist recording the current thing installed that - satisfies the requirement. - - Note that for vcs urls and the like we can't assess skipping in this - routine - we simply identify that we need to pull the thing down, - then later on it is pulled down and introspected to assess upgrade/ - reinstalls etc. - - :return: A text reason for why it was skipped, or None. - """ - if self.ignore_installed: - return None - - req_to_install.check_if_exists(self.use_user_site) - if not req_to_install.satisfied_by: - return None - - if self.force_reinstall: - self._set_req_to_reinstall(req_to_install) - return None - - if not self._is_upgrade_allowed(req_to_install): - if self.upgrade_strategy == "only-if-needed": - return 'already satisfied, skipping upgrade' - return 'already satisfied' - - # Check for the possibility of an upgrade. For link-based - # requirements we have to pull the tree down and inspect to assess - # the version #, so it's handled way down. - if not req_to_install.link: - try: - self.finder.find_requirement(req_to_install, upgrade=True) - except BestVersionAlreadyInstalled: - # Then the best version is installed. - return 'already up-to-date' - except DistributionNotFound: - # No distribution found, so we squash the error. It will - # be raised later when we re-try later to do the install. - # Why don't we just raise here? - pass - - self._set_req_to_reinstall(req_to_install) - return None - - def _get_abstract_dist_for(self, req): - # type: (InstallRequirement) -> DistAbstraction - """Takes a InstallRequirement and returns a single AbstractDist \ - representing a prepared variant of the same. - """ - assert self.require_hashes is not None, ( - "require_hashes should have been set in Resolver.resolve()" - ) - - if req.editable: - return self.preparer.prepare_editable_requirement( - req, self.require_hashes, self.use_user_site, self.finder, - ) - - # satisfied_by is only evaluated by calling _check_skip_installed, - # so it must be None here. - assert req.satisfied_by is None - skip_reason = self._check_skip_installed(req) - - if req.satisfied_by: - return self.preparer.prepare_installed_requirement( - req, self.require_hashes, skip_reason - ) - - upgrade_allowed = self._is_upgrade_allowed(req) - abstract_dist = self.preparer.prepare_linked_requirement( - req, self.session, self.finder, upgrade_allowed, - self.require_hashes - ) - - # NOTE - # The following portion is for determining if a certain package is - # going to be re-installed/upgraded or not and reporting to the user. - # This should probably get cleaned up in a future refactor. - - # req.req is only avail after unpack for URL - # pkgs repeat check_if_exists to uninstall-on-upgrade - # (#14) - if not self.ignore_installed: - req.check_if_exists(self.use_user_site) - - if req.satisfied_by: - should_modify = ( - self.upgrade_strategy != "to-satisfy-only" or - self.force_reinstall or - self.ignore_installed or - req.link.scheme == 'file' - ) - if should_modify: - self._set_req_to_reinstall(req) - else: - logger.info( - 'Requirement already satisfied (use --upgrade to upgrade):' - ' %s', req, - ) - - return abstract_dist - - def _resolve_one( - self, - requirement_set, # type: RequirementSet - req_to_install # type: InstallRequirement - ): - # type: (...) -> List[InstallRequirement] - """Prepare a single requirements file. - - :return: A list of additional InstallRequirements to also install. - """ - # Tell user what we are doing for this requirement: - # obtain (editable), skipping, processing (local url), collecting - # (remote url or package name) - if req_to_install.constraint or req_to_install.prepared: - return [] - - req_to_install.prepared = True - - # register tmp src for cleanup in case something goes wrong - requirement_set.reqs_to_cleanup.append(req_to_install) - - abstract_dist = self._get_abstract_dist_for(req_to_install) - - # Parse and return dependencies - dist = abstract_dist.dist() - try: - check_dist_requires_python(dist) - except UnsupportedPythonVersion as err: - if self.ignore_requires_python: - logger.warning(err.args[0]) - else: - raise - - more_reqs = [] # type: List[InstallRequirement] - - def add_req(subreq, extras_requested): - sub_install_req = install_req_from_req_string( - str(subreq), - req_to_install, - isolated=self.isolated, - wheel_cache=self.wheel_cache, - use_pep517=self.use_pep517 - ) - parent_req_name = req_to_install.name - to_scan_again, add_to_parent = requirement_set.add_requirement( - sub_install_req, - parent_req_name=parent_req_name, - extras_requested=extras_requested, - ) - if parent_req_name and add_to_parent: - self._discovered_dependencies[parent_req_name].append( - add_to_parent - ) - more_reqs.extend(to_scan_again) - - with indent_log(): - # We add req_to_install before its dependencies, so that we - # can refer to it when adding dependencies. - if not requirement_set.has_requirement(req_to_install.name): - # 'unnamed' requirements will get added here - req_to_install.is_direct = True - requirement_set.add_requirement( - req_to_install, parent_req_name=None, - ) - - if not self.ignore_dependencies: - if req_to_install.extras: - logger.debug( - "Installing extra requirements: %r", - ','.join(req_to_install.extras), - ) - missing_requested = sorted( - set(req_to_install.extras) - set(dist.extras) - ) - for missing in missing_requested: - logger.warning( - '%s does not provide the extra \'%s\'', - dist, missing - ) - - available_requested = sorted( - set(dist.extras) & set(req_to_install.extras) - ) - for subreq in dist.requires(available_requested): - add_req(subreq, extras_requested=available_requested) - - if not req_to_install.editable and not req_to_install.satisfied_by: - # XXX: --no-install leads this to report 'Successfully - # downloaded' for only non-editable reqs, even though we took - # action on them. - requirement_set.successfully_downloaded.append(req_to_install) - - return more_reqs - - def get_installation_order(self, req_set): - # type: (RequirementSet) -> List[InstallRequirement] - """Create the installation order. - - The installation order is topological - requirements are installed - before the requiring thing. We break cycles at an arbitrary point, - and make no other guarantees. - """ - # The current implementation, which we may change at any point - # installs the user specified things in the order given, except when - # dependencies must come earlier to achieve topological order. - order = [] - ordered_reqs = set() # type: Set[InstallRequirement] - - def schedule(req): - if req.satisfied_by or req in ordered_reqs: - return - if req.constraint: - return - ordered_reqs.add(req) - for dep in self._discovered_dependencies[req.name]: - schedule(dep) - order.append(req) - - for install_req in req_set.requirements.values(): - schedule(install_req) - return order diff --git a/env/lib/python3.7/site-packages/pip/_internal/utils/__init__.py b/env/lib/python3.7/site-packages/pip/_internal/utils/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 4c1a0bb2703754e8ff8a95b27e9614fc24058650..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148 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 diff --git a/env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/compat.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/compat.cpython-37.pyc deleted file mode 100644 index b3f374de77a2a48b67f373af999732395dd7368b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6096 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 diff --git a/env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-37.pyc deleted file mode 100644 index 605a26c3b9f1a2b3e2af2bf2321b6026082f163a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2557 zcmaJ@-EJF26y86t9mn};+LTh!YNR5-614?4ND)E_X=y8{soFx@mC!QwjO}gquQRhr z9o!qzTO=N#6<0h6FR`~=^%c0{o7s)yQi-*8{&wcfcfL9E9e=&H*0%7Ze_Z;h)v>I< zb?5Z)(AdQ*e@DTrz+yIYVmomH$JT8(b_3VcUf`kj;zr^JzWLUOn@KBJF>OC?C#%7# zZShs{81tHOCs_;DlJ#I6-&?`PEsL$N_DhSk`R0imoMSHCV&~W@>%6ps^K6Z+zqEo2 zY>REMO^j?a_kq`aKktAb9%!!&(MWQ5+dBRgAiORA#N++lZPw5adIF&PUL`8~W zN$4;u6k$9Ud_+~0rLxz4123(vU2f2!%;G}v5C$`$1{iDPR7j4-Y8W1JA+aJ1(cQZH z8Z|?6syz~8Fhm7<#r;m-s zE?x=lEp7!iXm*$l_ndP3UXtIEEs1P-%e^l1on%i?{?#{h=;{*|sey;4ft(+4_+)(Z- zM9*vcg+KRSHRjf98{fCyUBfI*%i#DjF!vUCdrL@V*DtrjOhl6io`iCm9n~jZwj(Kv z;V7n38t`Q^&L)^PDOV<3eTOy|WwV~$ZI;c1OGziZY#~1QBojE$aTFt%5?=aY-Y~L0H?U9xc{pe6xIHb_g z$NQf3!kfb_gveEdjPnX1@!I}Ek3v>3y31UJpgFNIvw;~NW;E&v< zoY)5q^fB+m{?%6g)8^b$4c1`3Cd}NaCjATXdz;5O7g`!lLkH^cJd#Qa#<)mF)wPY( ztk-T6JObL0r8}mr`w#hZg^N~?6HQyH&8aCTg@ox!U5=(R3`O#7n`BDm!qSlQ^b7^- z)!XGU9T_2ecTZU$QUNtf|7TxlA=QVQLfQ`bVz;+^(`aX8L{km9+IW(s(7a_w;ZUu1 zBpValJHj#!b$!<>kWj>o;4XodBs=7cL}_JKQ+A(55(^P;nUEwhwmz0*R0sjRUTgxg zCSV)Tu?L`Kf^e;AV0Yn#-n=rbuQWfS=#K7^v`B_n4u14;C_zUDl{H0<3`88zAtw|$ zKzlweVq)kf<4i2}(5I-A2pLBygF`VOF~TA_Dx}taLNT0+>@Z@Sj5%jRY*R!PQO2i)U+7(Mp@F&XE`-;Z}yk{;~sgE6($Odr%N6R zKB0n{9I8(nC}8xBmjA9JE}$ygNF}3#m>=@E+bSW+T3p9BO#W{u9(bo2tmz6 zFNgC~XOLcfMJn%H%n@4l#78K~|0FAuTzhJkW1Y}~So(EGE2PkwR9w@;%|}(bKhx(* ul8K(7kuN!YCeE!dtA7JuX`3R@o&ugD+b^Zl657HL^ diff --git a/env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-37.pyc deleted file mode 100644 index 9f13569239eb94baf44eb2c7a1e11592de13b21d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1232 zcmZuvO>f&q5Z&dMC`xuy#|d0FEeP~twvb#~KoAs35m=UzAdV6wPJ=Ku1e&|DSg%NC zcZFDnd}@2?56Cf)np6Kqf5u*O@;SGjI!jrC4_#vC&6^$0yd839X~{#d(vNG0|5ylp z(qz6|aPGqv@4*m6Fhk)Cafl0Ughqj8XaX9{8rY$Y5w-a)aFaQMQdkLzXZBF`YIn{Y4O_R* z$}_AT(S^(C?6k2x3pKVEr{FRwZbHvEBT0Jv=BImy2jcsUH?@Oz^}`>67;8PSV3^2; z-GnXv0(1JKM7!v4WBeN?_z&YNG%?4<6fXAGd4*1Yfh>yv zCzzP}6yCpoZjMc25nFTOoEW?XWiy?+piE*HKjW#6L*U9 z57L`drbzb;%4dHz`!qiBBmZb5sqls5a7VwFaR}`^ed5c^k2B6`EZN8>RD$EnKJ{rj z8;9rlu-Xx0M-kM4be6>tqxEAdb545{-X-(o4agHT@L6&~{Vb>HM&M_u|7;}tS=#7) z)}!<;46t0g7upoT@01;hI7!+;RaqeGh4O@qxD@Xa*;gi`sd5MfMO4`$XNgpmR;T%N z7k-KE^OkZ1jdd@B_FtO;uSbC&H`ernXzZa-#0U-M@KP`G+*z({q6z$aF4&j=<=LYKO)0{qlEdb z$H6nnYH#i#aF6?+VeWIxAq{>~HJqhrllQ_by230M>x!4?!X(535$Ow3{e_GHgB)*| z9&?rx{th=?4?V6t^~vBB+j~76P&Eek{(-nwOugGCCg|Y?cWegDu@7dniq!>zJKWFV z4fM=a=7hZud$L#2fnL|g!=3H#I7~)dJBrPQKWT7gLuy%2w-?H_`znoXxGZ#GjIylN z)_2p`P>M~ZjaF_H<+fzQ^Zcb!t+Jz{EQO}Z+2Z`Q4SA)Sq86#AMy@RCl=x7!YfZO5 zd-(=xOsQYbrl#(uUDcgbjW&gpC;WQbY#v`OU2xDv)fho|a=JE^)YHpK3cb}v)LFN+ zlX5A_)$P99kBv|v!Rm)(z>m>qKE{}^#ABG?7)Kbf3A=}CLisdM0XZACIvXZ@K$O`( mx@@4!%C@HDFz@hd==(o&*Fi*2>XxsicB% zH{)D|H{b=5;fmMcQny_33S4odO`wT9I!8X1J|CS=pT6#P0|c%3{mrL;b`bi@yj(Q` zgD;`W2^fYL&QOkr7@IN4$dFj?3?1v;p$p#0TDdp$Fyfwg0Pk+r&i$dEFANu8U5k0Y zqG7<=%m=^77FYnj!xmWwe3y{}6n6iHzo8K8SK>oiX0_r`npdSz1Bfku|77n;wDoX% z>$_rq{0JTVBSInaIRThQem7=_L;!x#7z&4LCUkyHE_ z6)P@M&NL9K7@3FR1N0NjJaQWxwHkbePKojwqS|Lf?l$DyX9N&PW3qKlHut%zMIq@p zOAizJoC^uLP^m;(jMr!>=%6e(O-HmS6|E&i=TrLw-HK(Brs0D25;d#1)b7@U-Ceyh zF6wB^Rb&vOOGMrKN&)5}6l7b7QfNPkl1VJ0O1A}D+s zrG?@GO1@F6G?N>4^ZjZDxxbvWL4^%>P5oEEAV0ta2e{{Wj*mSO;D8A8Au&{$=3aJ7 z*+Y1lQ`Vpha_TgWyramu!$^Z(N6Nh*K$mlXRI72$J?38EGu+@QDR(X-EgK=z7Et94 zPVTIJv3D=TFu*pMD(v(zl_s_&;>=`Sy#7CyKKhlpd#QLO-KP3CFSEg_6`l z^>ed&jgCuomwqUBbjyapnRwXNL~s*R$wd3du_&M*z_c0Z-hN%EH0O`!VeLR!b!#lj zx(Z#f1l!j=!JpNs;4GTMb^$ic>pZgX8t0a?xw&N)+)5@qnMT)mScMO=2L|~a>|zfn zaPcx0??EInIycQwV9IYx{|*ckGH1U5olkwSY;>V;1EmK|K+!`o*a_$CS)9-jW|4T; z7?b+V#9o`k&v|6Z7pwFzmabg0dVdy5o>q(&oWNMQF5i+Mi zBjX{#&^`I>k(g0cQpVwgLXkLC6Mmh_AfV8$gd0<3ZVg(FE>$b(DjedqD=mlgc#b{CZNbulCb69VD=W)sUC~ht%IMp#1GuG-_yG0+>>7cD*dBYh(z@4( zx>+;-N=^H)c3!5oEfWzRK_u+yAc{sc+(0~vgejD08}o)Sx54PQK(hV+;gzn7P+&iH*plGS&I_`so0I>g1VI{w@K Hl7IVOtiGx$ diff --git a/env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-37.pyc deleted file mode 100644 index 2e5868af8ef729a2015d832164f9f7a24dab2f98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3555 zcmbVPUvC@75#PN#9*-2Me~}f*c7kn#z+oCojUA_fV-!(j*Ot@JsqEO%q3QX=U5aPk zA8Pj)Nd)y`3CL4XpdX-+kf*-)1N5!0ecsnT^(*wLGkYW@xefyKh@G9iotvGV{msns z^Lo8X;7Na2`t~1nLjHw=@#6sV88r1zAe?X-lZ5(|B5%c(Z$WRzcH;O>Qu0fQ>$_&o ziOY%Sdr8HwBvrp^-j(91q~_NQ@5c3H+MlLGOv}H3j&eMc%=)v*oIjV$`}4^g{u{}H zzhGoN(0|Fl1hSXppFy?~TgjroNJ(0QQ58mS;)qZAOMHsgczwtAm+uok&1a4YpAnaj zZ2t<3XZakA=fo8lU**A7WZ=zL`g4`d9z{bN|Xx;Em7J-wkr;l zt|Iqc825z&k=lb$b-s*L66URro*Io*l$Lo9=`U;=nv(Q%ypK2G45o!>wu{{~~ zdP1_i6XtBYAH`g;q#x%|FBS|<6^g-3mbL^7Q_fl)(dsG?7YPe@!U%j=W$<*NjztwhakeM;L>p@Ch<#A9BS2*Gz6r86Hk>v2;<#&>TkeAlH@f#@Q&@`0{AIp`Iv^iaHn;%>hO1__DbsVe}e0#DivBpTKz%OxXL>_a;{ zS*}11)(8-+x@0D_gKxAAvj$)Vxq@FVm>3I2(KSj&t1zPwiNtg0EVbx7{1&Y$ou=~^ z@*W*rL7xb<^1AOQ=tA_N=>}c1z!bO|(j)67WEhA*+H6?Tg&E@>;Bi0lT_kA0nWgd_ z7~Y3gK-wDAM+Ow0xUeL;+blT^3_ykC6qcl?81i%w{y0=Z){bIvJ&wA7j_ntsmH%Hz zfNi`FE6WOy(U!D>nqS$Ip1 zTCjD9SlssS$R_y)sx;=jrnclZrk<=PQuzUV)36H|IlVCN$X~#lpD+~Vo`9G_PZO&~ zf5cRjYf+Se2m47<#+)-wGUil1DC!y8>j=pAl5LnQ4`txse7Z**1L)BD?JSE6(9i-j z7xAK}f&jvFAY>KrKQcMDU!Ba7yJ3c++_OYLIo&pdk3eWGU-h z)-C1`?NgYbF*buhSA!tQct1wI76iNfFdog6gMeqPAdpu&Pb&-cKeYOiAYC5w~@0}mh|8nX08A%Y~|pf;uA>SfRgjym%Uoh`e<|G$-Usg+T#Z! ze8DxL5(KR{R0>dVcCd(t7ibhl5-AN9FPy;t)^`-cO{_yx3qUYGyWxeS?I1kF{GAArr6#Vhj?_h^gV;og$0;8Z)eV8%WLa atOaYquF;z1(5uipblR$woKn@EUHdN-5OH(> diff --git a/env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/logging.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/logging.cpython-37.pyc deleted file mode 100644 index 109652650cbc56a3c092e9b1ac0230cd62b0c16a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8979 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 diff --git a/env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/misc.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/misc.cpython-37.pyc deleted file mode 100644 index fdf24757597cdb46df68b24c3c47e0e7561b2c72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24975 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 diff --git a/env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/models.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/models.cpython-37.pyc deleted file mode 100644 index ce91eb18c1dfeb702090b124c9ecd54861854f20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1897 zcmbtUOKaOe5Z;w!TXAgX4S}>lghAuI1{L-A##uZ^;j7 z>8XE7*Pi+pdg_d1r-?}#7q6KaNjskX=G&P$Y&Po*SMq)P!->C*$p}yXXqTV`D`@Mm z3TtSWVI4NmHeeHxZRMM<<>=7Y5{}Y1^ObxPo`uQz^S3Jf5(2^viqD}A)5Ht>%s-yy zVFteOLhT*XpFQ05z0Yz~_izO^Vx~ow5;;QAtEk3&%mf=-s4*b~z`JcLZ;0{~DKJ95 zBBu0+Ao8_t+qt7<)X#0&ZQb1b!IX<}e?RS*IO}9#wihPa_))Y6C!^%-Nq;~e3lU*r zq)Pm#bBdRtJ0&i{zu?pK zoPn zB-q9SCIshhnn~rGROMA6B22k$6_D~uY6eoxAX5Zr9c2n?=MG9J(tklxO^m7tZvjMJ z0Z~*YvoO~1+ZM{bFfh&nFh2d|<5n2N#P%F8D9$1b&7~9+mI&c zEJm6uH55(0uH{&+=*RcV$Nb%`wt61 Blb-+p diff --git a/env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/outdated.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/outdated.cpython-37.pyc deleted file mode 100644 index e1cade59ca68ab3c6ef0d1c8b2dc25400493c431..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3898 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 k&Qd=`Q?pUnO#fiLnq7mXYemthM(Q zl1gJkE{eMCxj#WhPyGeG^@s4pvdJMQo0pSCk?MbG}>T4gTHEgA(`=J)SMm9CUf4L(rfX2()60J zP9I&QmyU_I5ISM~2hCdyr^0FIFNclr0`ynHnQ#{RtD(NBwdVeWJ7_H;r-Ro#iwA=G zQIcm&biiicr!-s-7^e(I^?Yx~XOw3H)}_3qOPlAk8}%Z}xU9Sd8D%N%qVKvi7ck&3 za>9t`aj@^_f#}0{=E=+Tm;UO*d#jK9jc1+CTIT^+t*2^35QAQMLOBn1C~m$RalxY3 z1N7D)9#)d^<2@XZoV)2S?Z2&=0>SI;M7e5(e11GZARY= zB8Z4ztlV}_0@AjXyA3J^EamR@78}s*iQkFCtT*|@Y1fo1=VRXqO-1{xulqsF|A(_M z15artiUSv3m7_DB3)ex!VL_0(Yw6n{j>64JV)4lTzGgpoOL28ntaf`DgQyh8>}*NW z{u5Kwsh+#6FkKI6Quo_Og~Cr_V)ME}S#? zCsCJEMI!vMi(fUi0H6Eo&az1I@MU z)Bv4;L#3Ih9g_5>vI0KYEzrymG_W>BX;cmkQ5kBx))6_@q2f)zclAg^6p!p7>?Rs$ zwPOwO+>zFkds{1aSGHCTto26^mexA=pB`N7WNt!55C$TElnv4lA$^@ot>s8N;wm<2 zmogKMD(A5D)*uC^OHexffcq0C(%GTnpHVr^c6KO}m2U!;Lgbi*eylj_23WofF(J(! zP>L*dlQ!m3vtvHE3 z-ok;VqW=>p82uxN=a7tuinqRhOF;aN2!AMmCqf)X8Ne6964hNB825xTdPWm? z<$Lm6OFuU?QQLL)Z1x?|4h^CmG(~+h6_yGQL*v*)R^EhmXnbqD&|Ye({z6$=<<7zM z#u!OU>xyCyKE2M}3A)_E=H9r@Z@9pG1se=f4C!Pp;*d91hfA?35C>nZE4Wgyx{#sM zwR!GSF7OH4$8}2}TGJ|K(tt!N?6L~Dlb4>Qe30WS0Q9d;_;tbV(#cu2OS{5PgM_jR zcz_ucvnVhxY#xQG`^I@PVb^f(0}w5f-GHumQn1ebFzO1{L>r;!5-%5v@6`w(#fy`!^_VEzObIt&ns3KyS%0+j~u2h?2q9ag2n#$D~zoI;9z ztg$8_2Kr6yP4hXt@K9k!M^@K5n_DZ7AK%+xSHVfkU@mlW=5$H;agE7Ev8+Of9v2K_`3ip!0);3fU4>(nXcehb s@x>Q_A%RHic9MmInBKvEBsgw$bPJ;kT+)CBf579aH*CY2w;I;$-;+SZ{r~^~ diff --git a/env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-37.pyc deleted file mode 100644 index b0686c94c39ef2da7ac8679485cdd32a79c7f252..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 343 zcmYLE!AiqG5Z%;E5sEkQn2RI}X@ch%5uu=eWy1 z=E+GRIPl(MW*%>ttI6b$V5yIjr{jQ-@4guddvb|zVGA!n=+5*RB^ZQc|w;4ANKJgk#2(gswNguT#saMQfj9Ev8jQ1O_e7+KX2 zM=QJP-4Qa)o3xhNK}>U4Lmk(;HFyh^LlO>AXzsTWrE?nWj>_5c;eNST+?K4ozPbA% zc7)&T>35d-)?`MQsZh>WQcn5%My=19*M7JM6Uu{CmCQOXq|5$)X3w3FJT;r$_`KD; MlW=i>$v+742V31}Q2+n{ diff --git a/env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-37.pyc deleted file mode 100644 index 0378b314fe2301ea97bd71743c794f3f78b7a85e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4870 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


0*S{mzZ}$Qve4aV=TPty2Hv`%vicY| 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 str - r""" - Return full path to the user-specific cache dir for this application. - - "appname" is the name of application. - - Typical user cache directories are: - macOS: ~/Library/Caches/ - Unix: ~/.cache/ (XDG default) - Windows: C:\Users\\AppData\Local\\Cache - - On Windows the only suggestion in the MSDN docs is that local settings go - in the `CSIDL_LOCAL_APPDATA` directory. This is identical to the - non-roaming app data dir (the default returned by `user_data_dir`). Apps - typically put cache data somewhere *under* the given dir here. Some - examples: - ...\Mozilla\Firefox\Profiles\\Cache - ...\Acme\SuperApp\Cache\1.0 - - OPINION: This function appends "Cache" to the `CSIDL_LOCAL_APPDATA` value. - """ - if WINDOWS: - # Get the base path - path = os.path.normpath(_get_win_folder("CSIDL_LOCAL_APPDATA")) - - # When using Python 2, return paths as bytes on Windows like we do on - # other operating systems. See helper function docs for more details. - if PY2 and isinstance(path, text_type): - path = _win_path_to_bytes(path) - - # Add our app name and Cache directory to it - path = os.path.join(path, appname, "Cache") - elif sys.platform == "darwin": - # Get the base path - path = expanduser("~/Library/Caches") - - # Add our app name to it - path = os.path.join(path, appname) - else: - # Get the base path - path = os.getenv("XDG_CACHE_HOME", expanduser("~/.cache")) - - # Add our app name to it - path = os.path.join(path, appname) - - return path - - -def user_data_dir(appname, roaming=False): - # type: (str, bool) -> str - r""" - Return full path to the user-specific data dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "roaming" (boolean, default False) can be set True to use the Windows - roaming appdata directory. That means that for users on a Windows - network setup for roaming profiles, this user data will be - sync'd on login. See - - for a discussion of issues. - - Typical user data directories are: - macOS: ~/Library/Application Support/ - if it exists, else ~/.config/ - Unix: ~/.local/share/ # or in - $XDG_DATA_HOME, if defined - Win XP (not roaming): C:\Documents and Settings\\ ... - ...Application Data\ - Win XP (roaming): C:\Documents and Settings\\Local ... - ...Settings\Application Data\ - Win 7 (not roaming): C:\\Users\\AppData\Local\ - Win 7 (roaming): C:\\Users\\AppData\Roaming\ - - For Unix, we follow the XDG spec and support $XDG_DATA_HOME. - That means, by default "~/.local/share/". - """ - if WINDOWS: - const = roaming and "CSIDL_APPDATA" or "CSIDL_LOCAL_APPDATA" - path = os.path.join(os.path.normpath(_get_win_folder(const)), appname) - elif sys.platform == "darwin": - path = os.path.join( - expanduser('~/Library/Application Support/'), - appname, - ) if os.path.isdir(os.path.join( - expanduser('~/Library/Application Support/'), - appname, - ) - ) else os.path.join( - expanduser('~/.config/'), - appname, - ) - else: - path = os.path.join( - os.getenv('XDG_DATA_HOME', expanduser("~/.local/share")), - appname, - ) - - return path - - -def user_config_dir(appname, roaming=True): - # type: (str, bool) -> str - """Return full path to the user-specific config dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "roaming" (boolean, default True) can be set False to not use the - Windows roaming appdata directory. That means that for users on a - Windows network setup for roaming profiles, this user data will be - sync'd on login. See - - for a discussion of issues. - - Typical user data directories are: - macOS: same as user_data_dir - Unix: ~/.config/ - Win *: same as user_data_dir - - For Unix, we follow the XDG spec and support $XDG_CONFIG_HOME. - That means, by default "~/.config/". - """ - if WINDOWS: - path = user_data_dir(appname, roaming=roaming) - elif sys.platform == "darwin": - path = user_data_dir(appname) - else: - path = os.getenv('XDG_CONFIG_HOME', expanduser("~/.config")) - path = os.path.join(path, appname) - - return path - - -# for the discussion regarding site_config_dirs locations -# see -def site_config_dirs(appname): - # type: (str) -> List[str] - r"""Return a list of potential user-shared config dirs for this application. - - "appname" is the name of application. - - Typical user config directories are: - macOS: /Library/Application Support// - Unix: /etc or $XDG_CONFIG_DIRS[i]// for each value in - $XDG_CONFIG_DIRS - Win XP: C:\Documents and Settings\All Users\Application ... - ...Data\\ - Vista: (Fail! "C:\ProgramData" is a hidden *system* directory - on Vista.) - Win 7: Hidden, but writeable on Win 7: - C:\ProgramData\\ - """ - if WINDOWS: - path = os.path.normpath(_get_win_folder("CSIDL_COMMON_APPDATA")) - pathlist = [os.path.join(path, appname)] - elif sys.platform == 'darwin': - pathlist = [os.path.join('/Library/Application Support', appname)] - else: - # try looking in $XDG_CONFIG_DIRS - xdg_config_dirs = os.getenv('XDG_CONFIG_DIRS', '/etc/xdg') - if xdg_config_dirs: - pathlist = [ - os.path.join(expanduser(x), appname) - for x in xdg_config_dirs.split(os.pathsep) - ] - else: - pathlist = [] - - # always look in /etc directly as well - pathlist.append('/etc') - - return pathlist - - -# -- Windows support functions -- - -def _get_win_folder_from_registry(csidl_name): - # type: (str) -> str - """ - This is a fallback technique at best. I'm not sure if using the - registry for this guarantees us the correct answer for all CSIDL_* - names. - """ - import _winreg - - shell_folder_name = { - "CSIDL_APPDATA": "AppData", - "CSIDL_COMMON_APPDATA": "Common AppData", - "CSIDL_LOCAL_APPDATA": "Local AppData", - }[csidl_name] - - key = _winreg.OpenKey( - _winreg.HKEY_CURRENT_USER, - r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" - ) - directory, _type = _winreg.QueryValueEx(key, shell_folder_name) - return directory - - -def _get_win_folder_with_ctypes(csidl_name): - # type: (str) -> str - csidl_const = { - "CSIDL_APPDATA": 26, - "CSIDL_COMMON_APPDATA": 35, - "CSIDL_LOCAL_APPDATA": 28, - }[csidl_name] - - buf = ctypes.create_unicode_buffer(1024) - ctypes.windll.shell32.SHGetFolderPathW(None, csidl_const, None, 0, buf) - - # Downgrade to short path name if have highbit chars. See - # . - has_high_char = False - for c in buf: - if ord(c) > 255: - has_high_char = True - break - if has_high_char: - buf2 = ctypes.create_unicode_buffer(1024) - if ctypes.windll.kernel32.GetShortPathNameW(buf.value, buf2, 1024): - buf = buf2 - - return buf.value - - -if WINDOWS: - try: - import ctypes - _get_win_folder = _get_win_folder_with_ctypes - except ImportError: - _get_win_folder = _get_win_folder_from_registry - - -def _win_path_to_bytes(path): - """Encode Windows paths to bytes. Only used on Python 2. - - Motivation is to be consistent with other operating systems where paths - are also returned as bytes. This avoids problems mixing bytes and Unicode - elsewhere in the codebase. For more details and discussion see - . - - If encoding using ASCII and MBCS fails, return the original Unicode path. - """ - for encoding in ('ASCII', 'MBCS'): - try: - return path.encode(encoding) - except (UnicodeEncodeError, LookupError): - pass - return path diff --git a/env/lib/python3.7/site-packages/pip/_internal/utils/compat.py b/env/lib/python3.7/site-packages/pip/_internal/utils/compat.py deleted file mode 100644 index 845436e..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/utils/compat.py +++ /dev/null @@ -1,264 +0,0 @@ -"""Stuff that differs in different Python versions and platform -distributions.""" -from __future__ import absolute_import, division - -import codecs -import locale -import logging -import os -import shutil -import sys - -from pip._vendor.six import text_type - -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Tuple, Text - -try: - import ipaddress -except ImportError: - try: - from pip._vendor import ipaddress # type: ignore - except ImportError: - import ipaddr as ipaddress # type: ignore - ipaddress.ip_address = ipaddress.IPAddress # type: ignore - ipaddress.ip_network = ipaddress.IPNetwork # type: ignore - - -__all__ = [ - "ipaddress", "uses_pycache", "console_to_str", "native_str", - "get_path_uid", "stdlib_pkgs", "WINDOWS", "samefile", "get_terminal_size", - "get_extension_suffixes", -] - - -logger = logging.getLogger(__name__) - -if sys.version_info >= (3, 4): - uses_pycache = True - from importlib.util import cache_from_source -else: - import imp - - try: - cache_from_source = imp.cache_from_source # type: ignore - except AttributeError: - # does not use __pycache__ - cache_from_source = None - - uses_pycache = cache_from_source is not None - - -if sys.version_info >= (3, 5): - backslashreplace_decode = "backslashreplace" -else: - # In version 3.4 and older, backslashreplace exists - # but does not support use for decoding. - # We implement our own replace handler for this - # situation, so that we can consistently use - # backslash replacement for all versions. - def backslashreplace_decode_fn(err): - raw_bytes = (err.object[i] for i in range(err.start, err.end)) - if sys.version_info[0] == 2: - # Python 2 gave us characters - convert to numeric bytes - raw_bytes = (ord(b) for b in raw_bytes) - return u"".join(u"\\x%x" % c for c in raw_bytes), err.end - codecs.register_error( - "backslashreplace_decode", - backslashreplace_decode_fn, - ) - backslashreplace_decode = "backslashreplace_decode" - - -def console_to_str(data): - # type: (bytes) -> Text - """Return a string, safe for output, of subprocess output. - - We assume the data is in the locale preferred encoding. - If it won't decode properly, we warn the user but decode as - best we can. - - We also ensure that the output can be safely written to - standard output without encoding errors. - """ - - # First, get the encoding we assume. This is the preferred - # encoding for the locale, unless that is not found, or - # it is ASCII, in which case assume UTF-8 - encoding = locale.getpreferredencoding() - if (not encoding) or codecs.lookup(encoding).name == "ascii": - encoding = "utf-8" - - # Now try to decode the data - if we fail, warn the user and - # decode with replacement. - try: - decoded_data = data.decode(encoding) - except UnicodeDecodeError: - logger.warning( - "Subprocess output does not appear to be encoded as %s", - encoding, - ) - decoded_data = data.decode(encoding, errors=backslashreplace_decode) - - # Make sure we can print the output, by encoding it to the output - # encoding with replacement of unencodable characters, and then - # decoding again. - # We use stderr's encoding because it's less likely to be - # redirected and if we don't find an encoding we skip this - # step (on the assumption that output is wrapped by something - # that won't fail). - # The double getattr is to deal with the possibility that we're - # being called in a situation where sys.__stderr__ doesn't exist, - # or doesn't have an encoding attribute. Neither of these cases - # should occur in normal pip use, but there's no harm in checking - # in case people use pip in (unsupported) unusual situations. - output_encoding = getattr(getattr(sys, "__stderr__", None), - "encoding", None) - - if output_encoding: - output_encoded = decoded_data.encode( - output_encoding, - errors="backslashreplace" - ) - decoded_data = output_encoded.decode(output_encoding) - - return decoded_data - - -if sys.version_info >= (3,): - def native_str(s, replace=False): - # type: (str, bool) -> str - if isinstance(s, bytes): - return s.decode('utf-8', 'replace' if replace else 'strict') - return s - -else: - def native_str(s, replace=False): - # type: (str, bool) -> str - # Replace is ignored -- unicode to UTF-8 can't fail - if isinstance(s, text_type): - return s.encode('utf-8') - return s - - -def get_path_uid(path): - # type: (str) -> int - """ - Return path's uid. - - Does not follow symlinks: - https://github.com/pypa/pip/pull/935#discussion_r5307003 - - Placed this function in compat due to differences on AIX and - Jython, that should eventually go away. - - :raises OSError: When path is a symlink or can't be read. - """ - if hasattr(os, 'O_NOFOLLOW'): - fd = os.open(path, os.O_RDONLY | os.O_NOFOLLOW) - file_uid = os.fstat(fd).st_uid - os.close(fd) - else: # AIX and Jython - # WARNING: time of check vulnerability, but best we can do w/o NOFOLLOW - if not os.path.islink(path): - # older versions of Jython don't have `os.fstat` - file_uid = os.stat(path).st_uid - else: - # raise OSError for parity with os.O_NOFOLLOW above - raise OSError( - "%s is a symlink; Will not return uid for symlinks" % path - ) - return file_uid - - -if sys.version_info >= (3, 4): - from importlib.machinery import EXTENSION_SUFFIXES - - def get_extension_suffixes(): - return EXTENSION_SUFFIXES -else: - from imp import get_suffixes - - def get_extension_suffixes(): - return [suffix[0] for suffix in get_suffixes()] - - -def expanduser(path): - # type: (str) -> str - """ - Expand ~ and ~user constructions. - - Includes a workaround for https://bugs.python.org/issue14768 - """ - expanded = os.path.expanduser(path) - if path.startswith('~/') and expanded.startswith('//'): - expanded = expanded[1:] - return expanded - - -# packages in the stdlib that may have installation metadata, but should not be -# considered 'installed'. this theoretically could be determined based on -# dist.location (py27:`sysconfig.get_paths()['stdlib']`, -# py26:sysconfig.get_config_vars('LIBDEST')), but fear platform variation may -# make this ineffective, so hard-coding -stdlib_pkgs = {"python", "wsgiref", "argparse"} - - -# windows detection, covers cpython and ironpython -WINDOWS = (sys.platform.startswith("win") or - (sys.platform == 'cli' and os.name == 'nt')) - - -def samefile(file1, file2): - # type: (str, str) -> bool - """Provide an alternative for os.path.samefile on Windows/Python2""" - if hasattr(os.path, 'samefile'): - return os.path.samefile(file1, file2) - else: - path1 = os.path.normcase(os.path.abspath(file1)) - path2 = os.path.normcase(os.path.abspath(file2)) - return path1 == path2 - - -if hasattr(shutil, 'get_terminal_size'): - def get_terminal_size(): - # type: () -> Tuple[int, int] - """ - Returns a tuple (x, y) representing the width(x) and the height(y) - in characters of the terminal window. - """ - return tuple(shutil.get_terminal_size()) # type: ignore -else: - def get_terminal_size(): - # type: () -> Tuple[int, int] - """ - Returns a tuple (x, y) representing the width(x) and the height(y) - in characters of the terminal window. - """ - def ioctl_GWINSZ(fd): - try: - import fcntl - import termios - import struct - cr = struct.unpack_from( - 'hh', - fcntl.ioctl(fd, termios.TIOCGWINSZ, '12345678') - ) - except Exception: - return None - if cr == (0, 0): - return None - return cr - cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2) - if not cr: - try: - fd = os.open(os.ctermid(), os.O_RDONLY) - cr = ioctl_GWINSZ(fd) - os.close(fd) - except Exception: - pass - if not cr: - cr = (os.environ.get('LINES', 25), os.environ.get('COLUMNS', 80)) - return int(cr[1]), int(cr[0]) diff --git a/env/lib/python3.7/site-packages/pip/_internal/utils/deprecation.py b/env/lib/python3.7/site-packages/pip/_internal/utils/deprecation.py deleted file mode 100644 index 8c896f8..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/utils/deprecation.py +++ /dev/null @@ -1,93 +0,0 @@ -""" -A module that implements tooling to enable easy warnings about deprecations. -""" -from __future__ import absolute_import - -import logging -import warnings - -from pip._vendor.packaging.version import parse - -from pip import __version__ as current_version -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Any, Optional - - -DEPRECATION_MSG_PREFIX = "DEPRECATION: " - - -class PipDeprecationWarning(Warning): - pass - - -_original_showwarning = None # type: Any - - -# Warnings <-> Logging Integration -def _showwarning(message, category, filename, lineno, file=None, line=None): - if file is not None: - if _original_showwarning is not None: - _original_showwarning( - message, category, filename, lineno, file, line, - ) - elif issubclass(category, PipDeprecationWarning): - # We use a specially named logger which will handle all of the - # deprecation messages for pip. - logger = logging.getLogger("pip._internal.deprecations") - logger.warning(message) - else: - _original_showwarning( - message, category, filename, lineno, file, line, - ) - - -def install_warning_logger(): - # type: () -> None - # Enable our Deprecation Warnings - warnings.simplefilter("default", PipDeprecationWarning, append=True) - - global _original_showwarning - - if _original_showwarning is None: - _original_showwarning = warnings.showwarning - warnings.showwarning = _showwarning - - -def deprecated(reason, replacement, gone_in, issue=None): - # type: (str, Optional[str], Optional[str], Optional[int]) -> None - """Helper to deprecate existing functionality. - - reason: - Textual reason shown to the user about why this functionality has - been deprecated. - replacement: - Textual suggestion shown to the user about what alternative - functionality they can use. - gone_in: - The version of pip does this functionality should get removed in. - Raises errors if pip's current version is greater than or equal to - this. - issue: - Issue number on the tracker that would serve as a useful place for - users to find related discussion and provide feedback. - - Always pass replacement, gone_in and issue as keyword arguments for clarity - at the call site. - """ - - # Construct a nice message. - # This is purposely eagerly formatted as we want it to appear as if someone - # typed this entire message out. - message = DEPRECATION_MSG_PREFIX + reason - if replacement is not None: - message += " A possible replacement is {}.".format(replacement) - if issue is not None: - url = "https://github.com/pypa/pip/issues/" + str(issue) - message += " You can find discussion regarding this at {}.".format(url) - - # Raise as an error if it has to be removed. - if gone_in is not None and parse(current_version) >= parse(gone_in): - raise PipDeprecationWarning(message) - warnings.warn(message, category=PipDeprecationWarning, stacklevel=2) diff --git a/env/lib/python3.7/site-packages/pip/_internal/utils/encoding.py b/env/lib/python3.7/site-packages/pip/_internal/utils/encoding.py deleted file mode 100644 index 30139f2..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/utils/encoding.py +++ /dev/null @@ -1,39 +0,0 @@ -import codecs -import locale -import re -import sys - -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import List, Tuple, Text - -BOMS = [ - (codecs.BOM_UTF8, 'utf-8'), - (codecs.BOM_UTF16, 'utf-16'), - (codecs.BOM_UTF16_BE, 'utf-16-be'), - (codecs.BOM_UTF16_LE, 'utf-16-le'), - (codecs.BOM_UTF32, 'utf-32'), - (codecs.BOM_UTF32_BE, 'utf-32-be'), - (codecs.BOM_UTF32_LE, 'utf-32-le'), -] # type: List[Tuple[bytes, Text]] - -ENCODING_RE = re.compile(br'coding[:=]\s*([-\w.]+)') - - -def auto_decode(data): - # type: (bytes) -> Text - """Check a bytes string for a BOM to correctly detect the encoding - - Fallback to locale.getpreferredencoding(False) like open() on Python3""" - for bom, encoding in BOMS: - if data.startswith(bom): - return data[len(bom):].decode(encoding) - # Lets check the first two lines as in PEP263 - for line in data.split(b'\n')[:2]: - if line[0:1] == b'#' and ENCODING_RE.search(line): - encoding = ENCODING_RE.search(line).groups()[0].decode('ascii') - return data.decode(encoding) - return data.decode( - locale.getpreferredencoding(False) or sys.getdefaultencoding(), - ) diff --git a/env/lib/python3.7/site-packages/pip/_internal/utils/filesystem.py b/env/lib/python3.7/site-packages/pip/_internal/utils/filesystem.py deleted file mode 100644 index 1e6b033..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/utils/filesystem.py +++ /dev/null @@ -1,30 +0,0 @@ -import os -import os.path - -from pip._internal.utils.compat import get_path_uid - - -def check_path_owner(path): - # type: (str) -> bool - # If we don't have a way to check the effective uid of this process, then - # we'll just assume that we own the directory. - if not hasattr(os, "geteuid"): - return True - - previous = None - while path != previous: - if os.path.lexists(path): - # Check if path is writable by current user. - if os.geteuid() == 0: - # Special handling for root user in order to handle properly - # cases where users use sudo without -H flag. - try: - path_uid = get_path_uid(path) - except OSError: - return False - return path_uid == 0 - else: - return os.access(path, os.W_OK) - else: - previous, path = path, os.path.dirname(path) - return False # assume we don't own the path diff --git a/env/lib/python3.7/site-packages/pip/_internal/utils/glibc.py b/env/lib/python3.7/site-packages/pip/_internal/utils/glibc.py deleted file mode 100644 index 5bea655..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/utils/glibc.py +++ /dev/null @@ -1,93 +0,0 @@ -from __future__ import absolute_import - -import ctypes -import re -import warnings - -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Optional, Tuple - - -def glibc_version_string(): - # type: () -> Optional[str] - "Returns glibc version string, or None if not using glibc." - - # ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen - # manpage says, "If filename is NULL, then the returned handle is for the - # main program". This way we can let the linker do the work to figure out - # which libc our process is actually using. - process_namespace = ctypes.CDLL(None) - try: - gnu_get_libc_version = process_namespace.gnu_get_libc_version - except AttributeError: - # Symbol doesn't exist -> therefore, we are not linked to - # glibc. - return None - - # Call gnu_get_libc_version, which returns a string like "2.5" - gnu_get_libc_version.restype = ctypes.c_char_p - version_str = gnu_get_libc_version() - # py2 / py3 compatibility: - if not isinstance(version_str, str): - version_str = version_str.decode("ascii") - - return version_str - - -# Separated out from have_compatible_glibc for easier unit testing -def check_glibc_version(version_str, required_major, minimum_minor): - # type: (str, int, int) -> bool - # Parse string and check against requested version. - # - # We use a regexp instead of str.split because we want to discard any - # random junk that might come after the minor version -- this might happen - # in patched/forked versions of glibc (e.g. Linaro's version of glibc - # uses version strings like "2.20-2014.11"). See gh-3588. - m = re.match(r"(?P[0-9]+)\.(?P[0-9]+)", version_str) - if not m: - warnings.warn("Expected glibc version with 2 components major.minor," - " got: %s" % version_str, RuntimeWarning) - return False - return (int(m.group("major")) == required_major and - int(m.group("minor")) >= minimum_minor) - - -def have_compatible_glibc(required_major, minimum_minor): - # type: (int, int) -> bool - version_str = glibc_version_string() # type: Optional[str] - if version_str is None: - return False - return check_glibc_version(version_str, required_major, minimum_minor) - - -# platform.libc_ver regularly returns completely nonsensical glibc -# versions. E.g. on my computer, platform says: -# -# ~$ python2.7 -c 'import platform; print(platform.libc_ver())' -# ('glibc', '2.7') -# ~$ python3.5 -c 'import platform; print(platform.libc_ver())' -# ('glibc', '2.9') -# -# But the truth is: -# -# ~$ ldd --version -# ldd (Debian GLIBC 2.22-11) 2.22 -# -# This is unfortunate, because it means that the linehaul data on libc -# versions that was generated by pip 8.1.2 and earlier is useless and -# misleading. Solution: instead of using platform, use our code that actually -# works. -def libc_ver(): - # type: () -> Tuple[str, str] - """Try to determine the glibc version - - Returns a tuple of strings (lib, version) which default to empty strings - in case the lookup fails. - """ - glibc_version = glibc_version_string() - if glibc_version is None: - return ("", "") - else: - return ("glibc", glibc_version) diff --git a/env/lib/python3.7/site-packages/pip/_internal/utils/hashes.py b/env/lib/python3.7/site-packages/pip/_internal/utils/hashes.py deleted file mode 100644 index a714206..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/utils/hashes.py +++ /dev/null @@ -1,115 +0,0 @@ -from __future__ import absolute_import - -import hashlib - -from pip._vendor.six import iteritems, iterkeys, itervalues - -from pip._internal.exceptions import ( - HashMismatch, HashMissing, InstallationError, -) -from pip._internal.utils.misc import read_chunks -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import ( - Dict, List, BinaryIO, NoReturn, Iterator - ) - from pip._vendor.six import PY3 - if PY3: - from hashlib import _Hash - else: - from hashlib import _hash as _Hash - - -# The recommended hash algo of the moment. Change this whenever the state of -# the art changes; it won't hurt backward compatibility. -FAVORITE_HASH = 'sha256' - - -# Names of hashlib algorithms allowed by the --hash option and ``pip hash`` -# Currently, those are the ones at least as collision-resistant as sha256. -STRONG_HASHES = ['sha256', 'sha384', 'sha512'] - - -class Hashes(object): - """A wrapper that builds multiple hashes at once and checks them against - known-good values - - """ - def __init__(self, hashes=None): - # type: (Dict[str, List[str]]) -> None - """ - :param hashes: A dict of algorithm names pointing to lists of allowed - hex digests - """ - self._allowed = {} if hashes is None else hashes - - def check_against_chunks(self, chunks): - # type: (Iterator[bytes]) -> None - """Check good hashes against ones built from iterable of chunks of - data. - - Raise HashMismatch if none match. - - """ - gots = {} - for hash_name in iterkeys(self._allowed): - try: - gots[hash_name] = hashlib.new(hash_name) - except (ValueError, TypeError): - raise InstallationError('Unknown hash name: %s' % hash_name) - - for chunk in chunks: - for hash in itervalues(gots): - hash.update(chunk) - - for hash_name, got in iteritems(gots): - if got.hexdigest() in self._allowed[hash_name]: - return - self._raise(gots) - - def _raise(self, gots): - # type: (Dict[str, _Hash]) -> NoReturn - raise HashMismatch(self._allowed, gots) - - def check_against_file(self, file): - # type: (BinaryIO) -> None - """Check good hashes against a file-like object - - Raise HashMismatch if none match. - - """ - return self.check_against_chunks(read_chunks(file)) - - def check_against_path(self, path): - # type: (str) -> None - with open(path, 'rb') as file: - return self.check_against_file(file) - - def __nonzero__(self): - # type: () -> bool - """Return whether I know any known-good hashes.""" - return bool(self._allowed) - - def __bool__(self): - # type: () -> bool - return self.__nonzero__() - - -class MissingHashes(Hashes): - """A workalike for Hashes used when we're missing a hash for a requirement - - It computes the actual hash of the requirement and raises a HashMissing - exception showing it to the user. - - """ - def __init__(self): - # type: () -> None - """Don't offer the ``hashes`` kwarg.""" - # Pass our favorite hash in to generate a "gotten hash". With the - # empty list, it will never match, so an error will always raise. - super(MissingHashes, self).__init__(hashes={FAVORITE_HASH: []}) - - def _raise(self, gots): - # type: (Dict[str, _Hash]) -> NoReturn - raise HashMissing(gots[FAVORITE_HASH].hexdigest()) diff --git a/env/lib/python3.7/site-packages/pip/_internal/utils/logging.py b/env/lib/python3.7/site-packages/pip/_internal/utils/logging.py deleted file mode 100644 index a28e88c..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/utils/logging.py +++ /dev/null @@ -1,371 +0,0 @@ -from __future__ import absolute_import - -import contextlib -import errno -import logging -import logging.handlers -import os -import sys -from logging import Filter - -from pip._vendor.six import PY2 - -from pip._internal.utils.compat import WINDOWS -from pip._internal.utils.deprecation import DEPRECATION_MSG_PREFIX -from pip._internal.utils.misc import ensure_dir, subprocess_logger - -try: - import threading -except ImportError: - import dummy_threading as threading # type: ignore - - -try: - from pip._vendor import colorama -# Lots of different errors can come from this, including SystemError and -# ImportError. -except Exception: - colorama = None - - -_log_state = threading.local() -_log_state.indentation = 0 - - -class BrokenStdoutLoggingError(Exception): - """ - Raised if BrokenPipeError occurs for the stdout stream while logging. - """ - pass - - -# BrokenPipeError does not exist in Python 2 and, in addition, manifests -# differently in Windows and non-Windows. -if WINDOWS: - # In Windows, a broken pipe can show up as EINVAL rather than EPIPE: - # https://bugs.python.org/issue19612 - # https://bugs.python.org/issue30418 - if PY2: - def _is_broken_pipe_error(exc_class, exc): - """See the docstring for non-Windows Python 3 below.""" - return (exc_class is IOError and - exc.errno in (errno.EINVAL, errno.EPIPE)) - else: - # In Windows, a broken pipe IOError became OSError in Python 3. - def _is_broken_pipe_error(exc_class, exc): - """See the docstring for non-Windows Python 3 below.""" - return ((exc_class is BrokenPipeError) or # noqa: F821 - (exc_class is OSError and - exc.errno in (errno.EINVAL, errno.EPIPE))) -elif PY2: - def _is_broken_pipe_error(exc_class, exc): - """See the docstring for non-Windows Python 3 below.""" - return (exc_class is IOError and exc.errno == errno.EPIPE) -else: - # Then we are in the non-Windows Python 3 case. - def _is_broken_pipe_error(exc_class, exc): - """ - Return whether an exception is a broken pipe error. - - Args: - exc_class: an exception class. - exc: an exception instance. - """ - return (exc_class is BrokenPipeError) # noqa: F821 - - -@contextlib.contextmanager -def indent_log(num=2): - """ - A context manager which will cause the log output to be indented for any - log messages emitted inside it. - """ - _log_state.indentation += num - try: - yield - finally: - _log_state.indentation -= num - - -def get_indentation(): - return getattr(_log_state, 'indentation', 0) - - -class IndentingFormatter(logging.Formatter): - def __init__(self, *args, **kwargs): - """ - A logging.Formatter that obeys the indent_log() context manager. - - :param add_timestamp: A bool indicating output lines should be prefixed - with their record's timestamp. - """ - self.add_timestamp = kwargs.pop("add_timestamp", False) - super(IndentingFormatter, self).__init__(*args, **kwargs) - - def get_message_start(self, formatted, levelno): - """ - Return the start of the formatted log message (not counting the - prefix to add to each line). - """ - if levelno < logging.WARNING: - return '' - if formatted.startswith(DEPRECATION_MSG_PREFIX): - # Then the message already has a prefix. We don't want it to - # look like "WARNING: DEPRECATION: ...." - return '' - if levelno < logging.ERROR: - return 'WARNING: ' - - return 'ERROR: ' - - def format(self, record): - """ - Calls the standard formatter, but will indent all of the log messages - by our current indentation level. - """ - formatted = super(IndentingFormatter, self).format(record) - message_start = self.get_message_start(formatted, record.levelno) - formatted = message_start + formatted - - prefix = '' - if self.add_timestamp: - prefix = self.formatTime(record, "%Y-%m-%dT%H:%M:%S ") - prefix += " " * get_indentation() - formatted = "".join([ - prefix + line - for line in formatted.splitlines(True) - ]) - return formatted - - -def _color_wrap(*colors): - def wrapped(inp): - return "".join(list(colors) + [inp, colorama.Style.RESET_ALL]) - return wrapped - - -class ColorizedStreamHandler(logging.StreamHandler): - - # Don't build up a list of colors if we don't have colorama - if colorama: - COLORS = [ - # This needs to be in order from highest logging level to lowest. - (logging.ERROR, _color_wrap(colorama.Fore.RED)), - (logging.WARNING, _color_wrap(colorama.Fore.YELLOW)), - ] - else: - COLORS = [] - - def __init__(self, stream=None, no_color=None): - logging.StreamHandler.__init__(self, stream) - self._no_color = no_color - - if WINDOWS and colorama: - self.stream = colorama.AnsiToWin32(self.stream) - - def _using_stdout(self): - """ - Return whether the handler is using sys.stdout. - """ - if WINDOWS and colorama: - # Then self.stream is an AnsiToWin32 object. - return self.stream.wrapped is sys.stdout - - return self.stream is sys.stdout - - def should_color(self): - # Don't colorize things if we do not have colorama or if told not to - if not colorama or self._no_color: - return False - - real_stream = ( - self.stream if not isinstance(self.stream, colorama.AnsiToWin32) - else self.stream.wrapped - ) - - # If the stream is a tty we should color it - if hasattr(real_stream, "isatty") and real_stream.isatty(): - return True - - # If we have an ANSI term we should color it - if os.environ.get("TERM") == "ANSI": - return True - - # If anything else we should not color it - return False - - def format(self, record): - msg = logging.StreamHandler.format(self, record) - - if self.should_color(): - for level, color in self.COLORS: - if record.levelno >= level: - msg = color(msg) - break - - return msg - - # The logging module says handleError() can be customized. - def handleError(self, record): - exc_class, exc = sys.exc_info()[:2] - # If a broken pipe occurred while calling write() or flush() on the - # stdout stream in logging's Handler.emit(), then raise our special - # exception so we can handle it in main() instead of logging the - # broken pipe error and continuing. - if (exc_class and self._using_stdout() and - _is_broken_pipe_error(exc_class, exc)): - raise BrokenStdoutLoggingError() - - return super(ColorizedStreamHandler, self).handleError(record) - - -class BetterRotatingFileHandler(logging.handlers.RotatingFileHandler): - - def _open(self): - ensure_dir(os.path.dirname(self.baseFilename)) - return logging.handlers.RotatingFileHandler._open(self) - - -class MaxLevelFilter(Filter): - - def __init__(self, level): - self.level = level - - def filter(self, record): - return record.levelno < self.level - - -class ExcludeLoggerFilter(Filter): - - """ - A logging Filter that excludes records from a logger (or its children). - """ - - def filter(self, record): - # The base Filter class allows only records from a logger (or its - # children). - return not super(ExcludeLoggerFilter, self).filter(record) - - -def setup_logging(verbosity, no_color, user_log_file): - """Configures and sets up all of the logging - - Returns the requested logging level, as its integer value. - """ - - # Determine the level to be logging at. - if verbosity >= 1: - level = "DEBUG" - elif verbosity == -1: - level = "WARNING" - elif verbosity == -2: - level = "ERROR" - elif verbosity <= -3: - level = "CRITICAL" - else: - level = "INFO" - - level_number = getattr(logging, level) - - # The "root" logger should match the "console" level *unless* we also need - # to log to a user log file. - include_user_log = user_log_file is not None - if include_user_log: - additional_log_file = user_log_file - root_level = "DEBUG" - else: - additional_log_file = "/dev/null" - root_level = level - - # Disable any logging besides WARNING unless we have DEBUG level logging - # enabled for vendored libraries. - vendored_log_level = "WARNING" if level in ["INFO", "ERROR"] else "DEBUG" - - # Shorthands for clarity - log_streams = { - "stdout": "ext://sys.stdout", - "stderr": "ext://sys.stderr", - } - handler_classes = { - "stream": "pip._internal.utils.logging.ColorizedStreamHandler", - "file": "pip._internal.utils.logging.BetterRotatingFileHandler", - } - handlers = ["console", "console_errors", "console_subprocess"] + ( - ["user_log"] if include_user_log else [] - ) - - logging.config.dictConfig({ - "version": 1, - "disable_existing_loggers": False, - "filters": { - "exclude_warnings": { - "()": "pip._internal.utils.logging.MaxLevelFilter", - "level": logging.WARNING, - }, - "restrict_to_subprocess": { - "()": "logging.Filter", - "name": subprocess_logger.name, - }, - "exclude_subprocess": { - "()": "pip._internal.utils.logging.ExcludeLoggerFilter", - "name": subprocess_logger.name, - }, - }, - "formatters": { - "indent": { - "()": IndentingFormatter, - "format": "%(message)s", - }, - "indent_with_timestamp": { - "()": IndentingFormatter, - "format": "%(message)s", - "add_timestamp": True, - }, - }, - "handlers": { - "console": { - "level": level, - "class": handler_classes["stream"], - "no_color": no_color, - "stream": log_streams["stdout"], - "filters": ["exclude_subprocess", "exclude_warnings"], - "formatter": "indent", - }, - "console_errors": { - "level": "WARNING", - "class": handler_classes["stream"], - "no_color": no_color, - "stream": log_streams["stderr"], - "filters": ["exclude_subprocess"], - "formatter": "indent", - }, - # A handler responsible for logging to the console messages - # from the "subprocessor" logger. - "console_subprocess": { - "level": level, - "class": handler_classes["stream"], - "no_color": no_color, - "stream": log_streams["stderr"], - "filters": ["restrict_to_subprocess"], - "formatter": "indent", - }, - "user_log": { - "level": "DEBUG", - "class": handler_classes["file"], - "filename": additional_log_file, - "delay": True, - "formatter": "indent_with_timestamp", - }, - }, - "root": { - "level": root_level, - "handlers": handlers, - }, - "loggers": { - "pip._vendor": { - "level": vendored_log_level - } - }, - }) - - return level_number diff --git a/env/lib/python3.7/site-packages/pip/_internal/utils/misc.py b/env/lib/python3.7/site-packages/pip/_internal/utils/misc.py deleted file mode 100644 index ca7a529..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/utils/misc.py +++ /dev/null @@ -1,1011 +0,0 @@ -from __future__ import absolute_import - -import contextlib -import errno -import io -# we have a submodule named 'logging' which would shadow this if we used the -# regular name: -import logging as std_logging -import os -import posixpath -import re -import shutil -import stat -import subprocess -import sys -import tarfile -import zipfile -from collections import deque - -from pip._vendor import pkg_resources -# NOTE: retrying is not annotated in typeshed as on 2017-07-17, which is -# why we ignore the type on this import. -from pip._vendor.retrying import retry # type: ignore -from pip._vendor.six import PY2 -from pip._vendor.six.moves import input, shlex_quote -from pip._vendor.six.moves.urllib import parse as urllib_parse -from pip._vendor.six.moves.urllib.parse import unquote as urllib_unquote - -from pip._internal.exceptions import CommandError, InstallationError -from pip._internal.locations import ( - running_under_virtualenv, site_packages, user_site, virtualenv_no_global, - write_delete_marker_file, -) -from pip._internal.utils.compat import ( - WINDOWS, console_to_str, expanduser, stdlib_pkgs, -) -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if PY2: - from io import BytesIO as StringIO -else: - from io import StringIO - -if MYPY_CHECK_RUNNING: - from typing import ( - Optional, Tuple, Iterable, List, Match, Union, Any, Mapping, Text, - AnyStr, Container - ) - from pip._vendor.pkg_resources import Distribution - from pip._internal.models.link import Link - from pip._internal.utils.ui import SpinnerInterface - - -__all__ = ['rmtree', 'display_path', 'backup_dir', - 'ask', 'splitext', - 'format_size', 'is_installable_dir', - 'is_svn_page', 'file_contents', - 'split_leading_dir', 'has_leading_dir', - 'normalize_path', - 'renames', 'get_prog', - 'unzip_file', 'untar_file', 'unpack_file', 'call_subprocess', - 'captured_stdout', 'ensure_dir', - 'ARCHIVE_EXTENSIONS', 'SUPPORTED_EXTENSIONS', 'WHEEL_EXTENSION', - 'get_installed_version', 'remove_auth_from_url'] - - -logger = std_logging.getLogger(__name__) -subprocess_logger = std_logging.getLogger('pip.subprocessor') - -LOG_DIVIDER = '----------------------------------------' - -WHEEL_EXTENSION = '.whl' -BZ2_EXTENSIONS = ('.tar.bz2', '.tbz') -XZ_EXTENSIONS = ('.tar.xz', '.txz', '.tlz', '.tar.lz', '.tar.lzma') -ZIP_EXTENSIONS = ('.zip', WHEEL_EXTENSION) -TAR_EXTENSIONS = ('.tar.gz', '.tgz', '.tar') -ARCHIVE_EXTENSIONS = ( - ZIP_EXTENSIONS + BZ2_EXTENSIONS + TAR_EXTENSIONS + XZ_EXTENSIONS) -SUPPORTED_EXTENSIONS = ZIP_EXTENSIONS + TAR_EXTENSIONS - -try: - import bz2 # noqa - SUPPORTED_EXTENSIONS += BZ2_EXTENSIONS -except ImportError: - logger.debug('bz2 module is not available') - -try: - # Only for Python 3.3+ - import lzma # noqa - SUPPORTED_EXTENSIONS += XZ_EXTENSIONS -except ImportError: - logger.debug('lzma module is not available') - - -def ensure_dir(path): - # type: (AnyStr) -> None - """os.path.makedirs without EEXIST.""" - try: - os.makedirs(path) - except OSError as e: - if e.errno != errno.EEXIST: - raise - - -def get_prog(): - # type: () -> str - try: - prog = os.path.basename(sys.argv[0]) - if prog in ('__main__.py', '-c'): - return "%s -m pip" % sys.executable - else: - return prog - except (AttributeError, TypeError, IndexError): - pass - return 'pip' - - -# Retry every half second for up to 3 seconds -@retry(stop_max_delay=3000, wait_fixed=500) -def rmtree(dir, ignore_errors=False): - # type: (str, bool) -> None - shutil.rmtree(dir, ignore_errors=ignore_errors, - onerror=rmtree_errorhandler) - - -def rmtree_errorhandler(func, path, exc_info): - """On Windows, the files in .svn are read-only, so when rmtree() tries to - remove them, an exception is thrown. We catch that here, remove the - read-only attribute, and hopefully continue without problems.""" - # if file type currently read only - if os.stat(path).st_mode & stat.S_IREAD: - # convert to read/write - os.chmod(path, stat.S_IWRITE) - # use the original function to repeat the operation - func(path) - return - else: - raise - - -def display_path(path): - # type: (Union[str, Text]) -> str - """Gives the display value for a given path, making it relative to cwd - if possible.""" - path = os.path.normcase(os.path.abspath(path)) - if sys.version_info[0] == 2: - path = path.decode(sys.getfilesystemencoding(), 'replace') - path = path.encode(sys.getdefaultencoding(), 'replace') - if path.startswith(os.getcwd() + os.path.sep): - path = '.' + path[len(os.getcwd()):] - return path - - -def backup_dir(dir, ext='.bak'): - # type: (str, str) -> str - """Figure out the name of a directory to back up the given dir to - (adding .bak, .bak2, etc)""" - n = 1 - extension = ext - while os.path.exists(dir + extension): - n += 1 - extension = ext + str(n) - return dir + extension - - -def ask_path_exists(message, options): - # type: (str, Iterable[str]) -> str - for action in os.environ.get('PIP_EXISTS_ACTION', '').split(): - if action in options: - return action - return ask(message, options) - - -def ask(message, options): - # type: (str, Iterable[str]) -> str - """Ask the message interactively, with the given possible responses""" - while 1: - if os.environ.get('PIP_NO_INPUT'): - raise Exception( - 'No input was expected ($PIP_NO_INPUT set); question: %s' % - message - ) - response = input(message) - response = response.strip().lower() - if response not in options: - print( - 'Your response (%r) was not one of the expected responses: ' - '%s' % (response, ', '.join(options)) - ) - else: - return response - - -def format_size(bytes): - # type: (float) -> str - if bytes > 1000 * 1000: - return '%.1fMB' % (bytes / 1000.0 / 1000) - elif bytes > 10 * 1000: - return '%ikB' % (bytes / 1000) - elif bytes > 1000: - return '%.1fkB' % (bytes / 1000.0) - else: - return '%ibytes' % bytes - - -def is_installable_dir(path): - # type: (str) -> bool - """Is path is a directory containing setup.py or pyproject.toml? - """ - if not os.path.isdir(path): - return False - setup_py = os.path.join(path, 'setup.py') - if os.path.isfile(setup_py): - return True - pyproject_toml = os.path.join(path, 'pyproject.toml') - if os.path.isfile(pyproject_toml): - return True - return False - - -def is_svn_page(html): - # type: (Union[str, Text]) -> Optional[Match[Union[str, Text]]] - """ - Returns true if the page appears to be the index page of an svn repository - """ - return (re.search(r'[^<]*Revision \d+:', html) and - re.search(r'Powered by (?:<a[^>]*?>)?Subversion', html, re.I)) - - -def file_contents(filename): - # type: (str) -> Text - with open(filename, 'rb') as fp: - return fp.read().decode('utf-8') - - -def read_chunks(file, size=io.DEFAULT_BUFFER_SIZE): - """Yield pieces of data from a file-like object until EOF.""" - while True: - chunk = file.read(size) - if not chunk: - break - yield chunk - - -def split_leading_dir(path): - # type: (Union[str, Text]) -> List[Union[str, Text]] - path = path.lstrip('/').lstrip('\\') - if '/' in path and (('\\' in path and path.find('/') < path.find('\\')) or - '\\' not in path): - return path.split('/', 1) - elif '\\' in path: - return path.split('\\', 1) - else: - return [path, ''] - - -def has_leading_dir(paths): - # type: (Iterable[Union[str, Text]]) -> bool - """Returns true if all the paths have the same leading path name - (i.e., everything is in one subdirectory in an archive)""" - common_prefix = None - for path in paths: - prefix, rest = split_leading_dir(path) - if not prefix: - return False - elif common_prefix is None: - common_prefix = prefix - elif prefix != common_prefix: - return False - return True - - -def normalize_path(path, resolve_symlinks=True): - # type: (str, bool) -> str - """ - Convert a path to its canonical, case-normalized, absolute version. - - """ - path = expanduser(path) - if resolve_symlinks: - path = os.path.realpath(path) - else: - path = os.path.abspath(path) - return os.path.normcase(path) - - -def splitext(path): - # type: (str) -> Tuple[str, str] - """Like os.path.splitext, but take off .tar too""" - base, ext = posixpath.splitext(path) - if base.lower().endswith('.tar'): - ext = base[-4:] + ext - base = base[:-4] - return base, ext - - -def renames(old, new): - # type: (str, str) -> None - """Like os.renames(), but handles renaming across devices.""" - # Implementation borrowed from os.renames(). - head, tail = os.path.split(new) - if head and tail and not os.path.exists(head): - os.makedirs(head) - - shutil.move(old, new) - - head, tail = os.path.split(old) - if head and tail: - try: - os.removedirs(head) - except OSError: - pass - - -def is_local(path): - # type: (str) -> bool - """ - Return True if path is within sys.prefix, if we're running in a virtualenv. - - If we're not in a virtualenv, all paths are considered "local." - - """ - if not running_under_virtualenv(): - return True - return normalize_path(path).startswith(normalize_path(sys.prefix)) - - -def dist_is_local(dist): - # type: (Distribution) -> bool - """ - Return True if given Distribution object is installed locally - (i.e. within current virtualenv). - - Always True if we're not in a virtualenv. - - """ - return is_local(dist_location(dist)) - - -def dist_in_usersite(dist): - # type: (Distribution) -> bool - """ - Return True if given Distribution is installed in user site. - """ - norm_path = normalize_path(dist_location(dist)) - return norm_path.startswith(normalize_path(user_site)) - - -def dist_in_site_packages(dist): - # type: (Distribution) -> bool - """ - Return True if given Distribution is installed in - sysconfig.get_python_lib(). - """ - return normalize_path( - dist_location(dist) - ).startswith(normalize_path(site_packages)) - - -def dist_is_editable(dist): - # type: (Distribution) -> bool - """ - Return True if given Distribution is an editable install. - """ - for path_item in sys.path: - egg_link = os.path.join(path_item, dist.project_name + '.egg-link') - if os.path.isfile(egg_link): - return True - return False - - -def get_installed_distributions(local_only=True, - skip=stdlib_pkgs, - include_editables=True, - editables_only=False, - user_only=False): - # type: (bool, Container[str], bool, bool, bool) -> List[Distribution] - """ - Return a list of installed Distribution objects. - - If ``local_only`` is True (default), only return installations - local to the current virtualenv, if in a virtualenv. - - ``skip`` argument is an iterable of lower-case project names to - ignore; defaults to stdlib_pkgs - - If ``include_editables`` is False, don't report editables. - - If ``editables_only`` is True , only report editables. - - If ``user_only`` is True , only report installations in the user - site directory. - - """ - if local_only: - local_test = dist_is_local - else: - def local_test(d): - return True - - if include_editables: - def editable_test(d): - return True - else: - def editable_test(d): - return not dist_is_editable(d) - - if editables_only: - def editables_only_test(d): - return dist_is_editable(d) - else: - def editables_only_test(d): - return True - - if user_only: - user_test = dist_in_usersite - else: - def user_test(d): - return True - - # because of pkg_resources vendoring, mypy cannot find stub in typeshed - return [d for d in pkg_resources.working_set # type: ignore - if local_test(d) and - d.key not in skip and - editable_test(d) and - editables_only_test(d) and - user_test(d) - ] - - -def egg_link_path(dist): - # type: (Distribution) -> Optional[str] - """ - Return the path for the .egg-link file if it exists, otherwise, None. - - There's 3 scenarios: - 1) not in a virtualenv - try to find in site.USER_SITE, then site_packages - 2) in a no-global virtualenv - try to find in site_packages - 3) in a yes-global virtualenv - try to find in site_packages, then site.USER_SITE - (don't look in global location) - - For #1 and #3, there could be odd cases, where there's an egg-link in 2 - locations. - - This method will just return the first one found. - """ - sites = [] - if running_under_virtualenv(): - if virtualenv_no_global(): - sites.append(site_packages) - else: - sites.append(site_packages) - if user_site: - sites.append(user_site) - else: - if user_site: - sites.append(user_site) - sites.append(site_packages) - - for site in sites: - egglink = os.path.join(site, dist.project_name) + '.egg-link' - if os.path.isfile(egglink): - return egglink - return None - - -def dist_location(dist): - # type: (Distribution) -> str - """ - Get the site-packages location of this distribution. Generally - this is dist.location, except in the case of develop-installed - packages, where dist.location is the source code location, and we - want to know where the egg-link file is. - - """ - egg_link = egg_link_path(dist) - if egg_link: - return egg_link - return dist.location - - -def current_umask(): - """Get the current umask which involves having to set it temporarily.""" - mask = os.umask(0) - os.umask(mask) - return mask - - -def unzip_file(filename, location, flatten=True): - # type: (str, str, bool) -> None - """ - Unzip the file (with path `filename`) to the destination `location`. All - files are written based on system defaults and umask (i.e. permissions are - not preserved), except that regular file members with any execute - permissions (user, group, or world) have "chmod +x" applied after being - written. Note that for windows, any execute changes using os.chmod are - no-ops per the python docs. - """ - ensure_dir(location) - zipfp = open(filename, 'rb') - try: - zip = zipfile.ZipFile(zipfp, allowZip64=True) - leading = has_leading_dir(zip.namelist()) and flatten - for info in zip.infolist(): - name = info.filename - fn = name - if leading: - fn = split_leading_dir(name)[1] - fn = os.path.join(location, fn) - dir = os.path.dirname(fn) - if fn.endswith('/') or fn.endswith('\\'): - # A directory - ensure_dir(fn) - else: - ensure_dir(dir) - # Don't use read() to avoid allocating an arbitrarily large - # chunk of memory for the file's content - fp = zip.open(name) - try: - with open(fn, 'wb') as destfp: - shutil.copyfileobj(fp, destfp) - finally: - fp.close() - mode = info.external_attr >> 16 - # if mode and regular file and any execute permissions for - # user/group/world? - if mode and stat.S_ISREG(mode) and mode & 0o111: - # make dest file have execute for user/group/world - # (chmod +x) no-op on windows per python docs - os.chmod(fn, (0o777 - current_umask() | 0o111)) - finally: - zipfp.close() - - -def untar_file(filename, location): - # type: (str, str) -> None - """ - Untar the file (with path `filename`) to the destination `location`. - All files are written based on system defaults and umask (i.e. permissions - are not preserved), except that regular file members with any execute - permissions (user, group, or world) have "chmod +x" applied after being - written. Note that for windows, any execute changes using os.chmod are - no-ops per the python docs. - """ - ensure_dir(location) - if filename.lower().endswith('.gz') or filename.lower().endswith('.tgz'): - mode = 'r:gz' - elif filename.lower().endswith(BZ2_EXTENSIONS): - mode = 'r:bz2' - elif filename.lower().endswith(XZ_EXTENSIONS): - mode = 'r:xz' - elif filename.lower().endswith('.tar'): - mode = 'r' - else: - logger.warning( - 'Cannot determine compression type for file %s', filename, - ) - mode = 'r:*' - tar = tarfile.open(filename, mode) - try: - leading = has_leading_dir([ - member.name for member in tar.getmembers() - ]) - for member in tar.getmembers(): - fn = member.name - if leading: - # https://github.com/python/mypy/issues/1174 - fn = split_leading_dir(fn)[1] # type: ignore - path = os.path.join(location, fn) - if member.isdir(): - ensure_dir(path) - elif member.issym(): - try: - # https://github.com/python/typeshed/issues/2673 - tar._extract_member(member, path) # type: ignore - except Exception as exc: - # Some corrupt tar files seem to produce this - # (specifically bad symlinks) - logger.warning( - 'In the tar file %s the member %s is invalid: %s', - filename, member.name, exc, - ) - continue - else: - try: - fp = tar.extractfile(member) - except (KeyError, AttributeError) as exc: - # Some corrupt tar files seem to produce this - # (specifically bad symlinks) - logger.warning( - 'In the tar file %s the member %s is invalid: %s', - filename, member.name, exc, - ) - continue - ensure_dir(os.path.dirname(path)) - with open(path, 'wb') as destfp: - shutil.copyfileobj(fp, destfp) - fp.close() - # Update the timestamp (useful for cython compiled files) - # https://github.com/python/typeshed/issues/2673 - tar.utime(member, path) # type: ignore - # member have any execute permissions for user/group/world? - if member.mode & 0o111: - # make dest file have execute for user/group/world - # no-op on windows per python docs - os.chmod(path, (0o777 - current_umask() | 0o111)) - finally: - tar.close() - - -def unpack_file( - filename, # type: str - location, # type: str - content_type, # type: Optional[str] - link # type: Optional[Link] -): - # type: (...) -> None - filename = os.path.realpath(filename) - if (content_type == 'application/zip' or - filename.lower().endswith(ZIP_EXTENSIONS) or - zipfile.is_zipfile(filename)): - unzip_file( - filename, - location, - flatten=not filename.endswith('.whl') - ) - elif (content_type == 'application/x-gzip' or - tarfile.is_tarfile(filename) or - filename.lower().endswith( - TAR_EXTENSIONS + BZ2_EXTENSIONS + XZ_EXTENSIONS)): - untar_file(filename, location) - elif (content_type and content_type.startswith('text/html') and - is_svn_page(file_contents(filename))): - # We don't really care about this - from pip._internal.vcs.subversion import Subversion - Subversion('svn+' + link.url).unpack(location) - else: - # FIXME: handle? - # FIXME: magic signatures? - logger.critical( - 'Cannot unpack file %s (downloaded from %s, content-type: %s); ' - 'cannot detect archive format', - filename, location, content_type, - ) - raise InstallationError( - 'Cannot determine archive format of %s' % location - ) - - -def format_command_args(args): - # type: (List[str]) -> str - """ - Format command arguments for display. - """ - return ' '.join(shlex_quote(arg) for arg in args) - - -def call_subprocess( - cmd, # type: List[str] - show_stdout=False, # type: bool - cwd=None, # type: Optional[str] - on_returncode='raise', # type: str - extra_ok_returncodes=None, # type: Optional[Iterable[int]] - command_desc=None, # type: Optional[str] - extra_environ=None, # type: Optional[Mapping[str, Any]] - unset_environ=None, # type: Optional[Iterable[str]] - spinner=None # type: Optional[SpinnerInterface] -): - # type: (...) -> Optional[Text] - """ - Args: - show_stdout: if true, use INFO to log the subprocess's stderr and - stdout streams. Otherwise, use DEBUG. Defaults to False. - extra_ok_returncodes: an iterable of integer return codes that are - acceptable, in addition to 0. Defaults to None, which means []. - unset_environ: an iterable of environment variable names to unset - prior to calling subprocess.Popen(). - """ - if extra_ok_returncodes is None: - extra_ok_returncodes = [] - if unset_environ is None: - unset_environ = [] - # Most places in pip use show_stdout=False. What this means is-- - # - # - We connect the child's output (combined stderr and stdout) to a - # single pipe, which we read. - # - We log this output to stderr at DEBUG level as it is received. - # - If DEBUG logging isn't enabled (e.g. if --verbose logging wasn't - # requested), then we show a spinner so the user can still see the - # subprocess is in progress. - # - If the subprocess exits with an error, we log the output to stderr - # at ERROR level if it hasn't already been displayed to the console - # (e.g. if --verbose logging wasn't enabled). This way we don't log - # the output to the console twice. - # - # If show_stdout=True, then the above is still done, but with DEBUG - # replaced by INFO. - if show_stdout: - # Then log the subprocess output at INFO level. - log_subprocess = subprocess_logger.info - used_level = std_logging.INFO - else: - # Then log the subprocess output using DEBUG. This also ensures - # it will be logged to the log file (aka user_log), if enabled. - log_subprocess = subprocess_logger.debug - used_level = std_logging.DEBUG - - # Whether the subprocess will be visible in the console. - showing_subprocess = subprocess_logger.getEffectiveLevel() <= used_level - - # Only use the spinner if we're not showing the subprocess output - # and we have a spinner. - use_spinner = not showing_subprocess and spinner is not None - - if command_desc is None: - command_desc = format_command_args(cmd) - - log_subprocess("Running command %s", command_desc) - env = os.environ.copy() - if extra_environ: - env.update(extra_environ) - for name in unset_environ: - env.pop(name, None) - try: - proc = subprocess.Popen( - cmd, stderr=subprocess.STDOUT, stdin=subprocess.PIPE, - stdout=subprocess.PIPE, cwd=cwd, env=env, - ) - proc.stdin.close() - except Exception as exc: - subprocess_logger.critical( - "Error %s while executing command %s", exc, command_desc, - ) - raise - all_output = [] - while True: - line = console_to_str(proc.stdout.readline()) - if not line: - break - line = line.rstrip() - all_output.append(line + '\n') - - # Show the line immediately. - log_subprocess(line) - # Update the spinner. - if use_spinner: - spinner.spin() - try: - proc.wait() - finally: - if proc.stdout: - proc.stdout.close() - proc_had_error = ( - proc.returncode and proc.returncode not in extra_ok_returncodes - ) - if use_spinner: - if proc_had_error: - spinner.finish("error") - else: - spinner.finish("done") - if proc_had_error: - if on_returncode == 'raise': - if not showing_subprocess: - # Then the subprocess streams haven't been logged to the - # console yet. - subprocess_logger.error( - 'Complete output from command %s:', command_desc, - ) - # The all_output value already ends in a newline. - subprocess_logger.error(''.join(all_output) + LOG_DIVIDER) - raise InstallationError( - 'Command "%s" failed with error code %s in %s' - % (command_desc, proc.returncode, cwd)) - elif on_returncode == 'warn': - subprocess_logger.warning( - 'Command "%s" had error code %s in %s', - command_desc, proc.returncode, cwd, - ) - elif on_returncode == 'ignore': - pass - else: - raise ValueError('Invalid value: on_returncode=%s' % - repr(on_returncode)) - return ''.join(all_output) - - -def _make_build_dir(build_dir): - os.makedirs(build_dir) - write_delete_marker_file(build_dir) - - -class FakeFile(object): - """Wrap a list of lines in an object with readline() to make - ConfigParser happy.""" - def __init__(self, lines): - self._gen = (l for l in lines) - - def readline(self): - try: - try: - return next(self._gen) - except NameError: - return self._gen.next() - except StopIteration: - return '' - - def __iter__(self): - return self._gen - - -class StreamWrapper(StringIO): - - @classmethod - def from_stream(cls, orig_stream): - cls.orig_stream = orig_stream - return cls() - - # compileall.compile_dir() needs stdout.encoding to print to stdout - @property - def encoding(self): - return self.orig_stream.encoding - - -@contextlib.contextmanager -def captured_output(stream_name): - """Return a context manager used by captured_stdout/stdin/stderr - that temporarily replaces the sys stream *stream_name* with a StringIO. - - Taken from Lib/support/__init__.py in the CPython repo. - """ - orig_stdout = getattr(sys, stream_name) - setattr(sys, stream_name, StreamWrapper.from_stream(orig_stdout)) - try: - yield getattr(sys, stream_name) - finally: - setattr(sys, stream_name, orig_stdout) - - -def captured_stdout(): - """Capture the output of sys.stdout: - - with captured_stdout() as stdout: - print('hello') - self.assertEqual(stdout.getvalue(), 'hello\n') - - Taken from Lib/support/__init__.py in the CPython repo. - """ - return captured_output('stdout') - - -def captured_stderr(): - """ - See captured_stdout(). - """ - return captured_output('stderr') - - -class cached_property(object): - """A property that is only computed once per instance and then replaces - itself with an ordinary attribute. Deleting the attribute resets the - property. - - Source: https://github.com/bottlepy/bottle/blob/0.11.5/bottle.py#L175 - """ - - def __init__(self, func): - self.__doc__ = getattr(func, '__doc__') - self.func = func - - def __get__(self, obj, cls): - if obj is None: - # We're being accessed from the class itself, not from an object - return self - value = obj.__dict__[self.func.__name__] = self.func(obj) - return value - - -def get_installed_version(dist_name, working_set=None): - """Get the installed version of dist_name avoiding pkg_resources cache""" - # Create a requirement that we'll look for inside of setuptools. - req = pkg_resources.Requirement.parse(dist_name) - - if working_set is None: - # We want to avoid having this cached, so we need to construct a new - # working set each time. - working_set = pkg_resources.WorkingSet() - - # Get the installed distribution from our working set - dist = working_set.find(req) - - # Check to see if we got an installed distribution or not, if we did - # we want to return it's version. - return dist.version if dist else None - - -def consume(iterator): - """Consume an iterable at C speed.""" - deque(iterator, maxlen=0) - - -# Simulates an enum -def enum(*sequential, **named): - enums = dict(zip(sequential, range(len(sequential))), **named) - reverse = {value: key for key, value in enums.items()} - enums['reverse_mapping'] = reverse - return type('Enum', (), enums) - - -def split_auth_from_netloc(netloc): - """ - Parse out and remove the auth information from a netloc. - - Returns: (netloc, (username, password)). - """ - if '@' not in netloc: - return netloc, (None, None) - - # Split from the right because that's how urllib.parse.urlsplit() - # behaves if more than one @ is present (which can be checked using - # the password attribute of urlsplit()'s return value). - auth, netloc = netloc.rsplit('@', 1) - if ':' in auth: - # Split from the left because that's how urllib.parse.urlsplit() - # behaves if more than one : is present (which again can be checked - # using the password attribute of the return value) - user_pass = auth.split(':', 1) - else: - user_pass = auth, None - - user_pass = tuple( - None if x is None else urllib_unquote(x) for x in user_pass - ) - - return netloc, user_pass - - -def redact_netloc(netloc): - # type: (str) -> str - """ - Replace the password in a netloc with "****", if it exists. - - For example, "user:pass@example.com" returns "user:****@example.com". - """ - netloc, (user, password) = split_auth_from_netloc(netloc) - if user is None: - return netloc - password = '' if password is None else ':****' - return '{user}{password}@{netloc}'.format(user=urllib_parse.quote(user), - password=password, - netloc=netloc) - - -def _transform_url(url, transform_netloc): - purl = urllib_parse.urlsplit(url) - netloc = transform_netloc(purl.netloc) - # stripped url - url_pieces = ( - purl.scheme, netloc, purl.path, purl.query, purl.fragment - ) - surl = urllib_parse.urlunsplit(url_pieces) - return surl - - -def _get_netloc(netloc): - return split_auth_from_netloc(netloc)[0] - - -def remove_auth_from_url(url): - # type: (str) -> str - # Return a copy of url with 'username:password@' removed. - # username/pass params are passed to subversion through flags - # and are not recognized in the url. - return _transform_url(url, _get_netloc) - - -def redact_password_from_url(url): - # type: (str) -> str - """Replace the password in a given url with ****.""" - return _transform_url(url, redact_netloc) - - -def protect_pip_from_modification_on_windows(modifying_pip): - """Protection of pip.exe from modification on Windows - - On Windows, any operation modifying pip should be run as: - python -m pip ... - """ - pip_names = [ - "pip.exe", - "pip{}.exe".format(sys.version_info[0]), - "pip{}.{}.exe".format(*sys.version_info[:2]) - ] - - # See https://github.com/pypa/pip/issues/1299 for more discussion - should_show_use_python_msg = ( - modifying_pip and - WINDOWS and - os.path.basename(sys.argv[0]) in pip_names - ) - - if should_show_use_python_msg: - new_command = [ - sys.executable, "-m", "pip" - ] + sys.argv[1:] - raise CommandError( - 'To modify pip, please run the following command:\n{}' - .format(" ".join(new_command)) - ) diff --git a/env/lib/python3.7/site-packages/pip/_internal/utils/models.py b/env/lib/python3.7/site-packages/pip/_internal/utils/models.py deleted file mode 100644 index d5cb80a..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/utils/models.py +++ /dev/null @@ -1,40 +0,0 @@ -"""Utilities for defining models -""" - -import operator - - -class KeyBasedCompareMixin(object): - """Provides comparision capabilities that is based on a key - """ - - def __init__(self, key, defining_class): - self._compare_key = key - self._defining_class = defining_class - - def __hash__(self): - return hash(self._compare_key) - - def __lt__(self, other): - return self._compare(other, operator.__lt__) - - def __le__(self, other): - return self._compare(other, operator.__le__) - - def __gt__(self, other): - return self._compare(other, operator.__gt__) - - def __ge__(self, other): - return self._compare(other, operator.__ge__) - - def __eq__(self, other): - return self._compare(other, operator.__eq__) - - def __ne__(self, other): - return self._compare(other, operator.__ne__) - - def _compare(self, other, method): - if not isinstance(other, self._defining_class): - return NotImplemented - - return method(self._compare_key, other._compare_key) diff --git a/env/lib/python3.7/site-packages/pip/_internal/utils/outdated.py b/env/lib/python3.7/site-packages/pip/_internal/utils/outdated.py deleted file mode 100644 index 3b58cd5..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/utils/outdated.py +++ /dev/null @@ -1,162 +0,0 @@ -from __future__ import absolute_import - -import datetime -import json -import logging -import os.path -import sys - -from pip._vendor import lockfile, pkg_resources -from pip._vendor.packaging import version as packaging_version - -from pip._internal.index import PackageFinder -from pip._internal.utils.compat import WINDOWS -from pip._internal.utils.filesystem import check_path_owner -from pip._internal.utils.misc import ensure_dir, get_installed_version -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - import optparse - from typing import Any, Dict - from pip._internal.download import PipSession - - -SELFCHECK_DATE_FMT = "%Y-%m-%dT%H:%M:%SZ" - - -logger = logging.getLogger(__name__) - - -class SelfCheckState(object): - def __init__(self, cache_dir): - # type: (str) -> None - self.state = {} # type: Dict[str, Any] - self.statefile_path = None - - # Try to load the existing state - if cache_dir: - self.statefile_path = os.path.join(cache_dir, "selfcheck.json") - try: - with open(self.statefile_path) as statefile: - self.state = json.load(statefile)[sys.prefix] - except (IOError, ValueError, KeyError): - # Explicitly suppressing exceptions, since we don't want to - # error out if the cache file is invalid. - pass - - def save(self, pypi_version, current_time): - # type: (str, datetime.datetime) -> None - # If we do not have a path to cache in, don't bother saving. - if not self.statefile_path: - return - - # Check to make sure that we own the directory - if not check_path_owner(os.path.dirname(self.statefile_path)): - return - - # Now that we've ensured the directory is owned by this user, we'll go - # ahead and make sure that all our directories are created. - ensure_dir(os.path.dirname(self.statefile_path)) - - # Attempt to write out our version check file - with lockfile.LockFile(self.statefile_path): - if os.path.exists(self.statefile_path): - with open(self.statefile_path) as statefile: - state = json.load(statefile) - else: - state = {} - - state[sys.prefix] = { - "last_check": current_time.strftime(SELFCHECK_DATE_FMT), - "pypi_version": pypi_version, - } - - with open(self.statefile_path, "w") as statefile: - json.dump(state, statefile, sort_keys=True, - separators=(",", ":")) - - -def was_installed_by_pip(pkg): - # type: (str) -> bool - """Checks whether pkg was installed by pip - - This is used not to display the upgrade message when pip is in fact - installed by system package manager, such as dnf on Fedora. - """ - try: - dist = pkg_resources.get_distribution(pkg) - return (dist.has_metadata('INSTALLER') and - 'pip' in dist.get_metadata_lines('INSTALLER')) - except pkg_resources.DistributionNotFound: - return False - - -def pip_version_check(session, options): - # type: (PipSession, optparse.Values) -> None - """Check for an update for pip. - - Limit the frequency of checks to once per week. State is stored either in - the active virtualenv or in the user's USER_CACHE_DIR keyed off the prefix - of the pip script path. - """ - installed_version = get_installed_version("pip") - if not installed_version: - return - - pip_version = packaging_version.parse(installed_version) - pypi_version = None - - try: - state = SelfCheckState(cache_dir=options.cache_dir) - - current_time = datetime.datetime.utcnow() - # Determine if we need to refresh the state - if "last_check" in state.state and "pypi_version" in state.state: - last_check = datetime.datetime.strptime( - state.state["last_check"], - SELFCHECK_DATE_FMT - ) - if (current_time - last_check).total_seconds() < 7 * 24 * 60 * 60: - pypi_version = state.state["pypi_version"] - - # Refresh the version if we need to or just see if we need to warn - if pypi_version is None: - # Lets use PackageFinder to see what the latest pip version is - finder = PackageFinder( - find_links=options.find_links, - index_urls=[options.index_url] + options.extra_index_urls, - allow_all_prereleases=False, # Explicitly set to False - trusted_hosts=options.trusted_hosts, - session=session, - ) - candidate = finder.find_candidates("pip").get_best() - if candidate is None: - return - pypi_version = str(candidate.version) - - # save that we've performed a check - state.save(pypi_version, current_time) - - remote_version = packaging_version.parse(pypi_version) - - # Determine if our pypi_version is older - if (pip_version < remote_version and - pip_version.base_version != remote_version.base_version and - was_installed_by_pip('pip')): - # Advise "python -m pip" on Windows to avoid issues - # with overwriting pip.exe. - if WINDOWS: - pip_cmd = "python -m pip" - else: - pip_cmd = "pip" - logger.warning( - "You are using pip version %s, however version %s is " - "available.\nYou should consider upgrading via the " - "'%s install --upgrade pip' command.", - pip_version, pypi_version, pip_cmd - ) - except Exception: - logger.debug( - "There was an error checking the latest version of pip", - exc_info=True, - ) diff --git a/env/lib/python3.7/site-packages/pip/_internal/utils/packaging.py b/env/lib/python3.7/site-packages/pip/_internal/utils/packaging.py deleted file mode 100644 index 449f3fd..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/utils/packaging.py +++ /dev/null @@ -1,85 +0,0 @@ -from __future__ import absolute_import - -import logging -import sys -from email.parser import FeedParser - -from pip._vendor import pkg_resources -from pip._vendor.packaging import specifiers, version - -from pip._internal import exceptions -from pip._internal.utils.misc import display_path -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Optional - from email.message import Message - from pip._vendor.pkg_resources import Distribution - - -logger = logging.getLogger(__name__) - - -def check_requires_python(requires_python): - # type: (Optional[str]) -> bool - """ - Check if the python version in use match the `requires_python` specifier. - - Returns `True` if the version of python in use matches the requirement. - Returns `False` if the version of python in use does not matches the - requirement. - - Raises an InvalidSpecifier if `requires_python` have an invalid format. - """ - if requires_python is None: - # The package provides no information - return True - requires_python_specifier = specifiers.SpecifierSet(requires_python) - - # We only use major.minor.micro - python_version = version.parse('.'.join(map(str, sys.version_info[:3]))) - return python_version in requires_python_specifier - - -def get_metadata(dist): - # type: (Distribution) -> Message - if (isinstance(dist, pkg_resources.DistInfoDistribution) and - dist.has_metadata('METADATA')): - metadata = dist.get_metadata('METADATA') - elif dist.has_metadata('PKG-INFO'): - metadata = dist.get_metadata('PKG-INFO') - else: - logger.warning("No metadata found in %s", display_path(dist.location)) - metadata = '' - - feed_parser = FeedParser() - feed_parser.feed(metadata) - return feed_parser.close() - - -def check_dist_requires_python(dist): - pkg_info_dict = get_metadata(dist) - requires_python = pkg_info_dict.get('Requires-Python') - try: - if not check_requires_python(requires_python): - raise exceptions.UnsupportedPythonVersion( - "%s requires Python '%s' but the running Python is %s" % ( - dist.project_name, - requires_python, - '.'.join(map(str, sys.version_info[:3])),) - ) - except specifiers.InvalidSpecifier as e: - logger.warning( - "Package %s has an invalid Requires-Python entry %s - %s", - dist.project_name, requires_python, e, - ) - return - - -def get_installer(dist): - # type: (Distribution) -> str - if dist.has_metadata('INSTALLER'): - for line in dist.get_metadata_lines('INSTALLER'): - if line.strip(): - return line.strip() - return '' diff --git a/env/lib/python3.7/site-packages/pip/_internal/utils/setuptools_build.py b/env/lib/python3.7/site-packages/pip/_internal/utils/setuptools_build.py deleted file mode 100644 index 03973e9..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/utils/setuptools_build.py +++ /dev/null @@ -1,8 +0,0 @@ -# Shim to wrap setup.py invocation with setuptools -SETUPTOOLS_SHIM = ( - "import setuptools, tokenize;__file__=%r;" - "f=getattr(tokenize, 'open', open)(__file__);" - "code=f.read().replace('\\r\\n', '\\n');" - "f.close();" - "exec(compile(code, __file__, 'exec'))" -) diff --git a/env/lib/python3.7/site-packages/pip/_internal/utils/temp_dir.py b/env/lib/python3.7/site-packages/pip/_internal/utils/temp_dir.py deleted file mode 100644 index 2c81ad5..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/utils/temp_dir.py +++ /dev/null @@ -1,155 +0,0 @@ -from __future__ import absolute_import - -import errno -import itertools -import logging -import os.path -import tempfile - -from pip._internal.utils.misc import rmtree - -logger = logging.getLogger(__name__) - - -class TempDirectory(object): - """Helper class that owns and cleans up a temporary directory. - - This class can be used as a context manager or as an OO representation of a - temporary directory. - - Attributes: - path - Location to the created temporary directory or None - delete - Whether the directory should be deleted when exiting - (when used as a contextmanager) - - Methods: - create() - Creates a temporary directory and stores its path in the path - attribute. - cleanup() - Deletes the temporary directory and sets path attribute to None - - When used as a context manager, a temporary directory is created on - entering the context and, if the delete attribute is True, on exiting the - context the created directory is deleted. - """ - - def __init__(self, path=None, delete=None, kind="temp"): - super(TempDirectory, self).__init__() - - if path is None and delete is None: - # If we were not given an explicit directory, and we were not given - # an explicit delete option, then we'll default to deleting. - delete = True - - self.path = path - self.delete = delete - self.kind = kind - - def __repr__(self): - return "<{} {!r}>".format(self.__class__.__name__, self.path) - - def __enter__(self): - self.create() - return self - - def __exit__(self, exc, value, tb): - if self.delete: - self.cleanup() - - def create(self): - """Create a temporary directory and store its path in self.path - """ - if self.path is not None: - logger.debug( - "Skipped creation of temporary directory: {}".format(self.path) - ) - return - # We realpath here because some systems have their default tmpdir - # symlinked to another directory. This tends to confuse build - # scripts, so we canonicalize the path by traversing potential - # symlinks here. - self.path = os.path.realpath( - tempfile.mkdtemp(prefix="pip-{}-".format(self.kind)) - ) - logger.debug("Created temporary directory: {}".format(self.path)) - - def cleanup(self): - """Remove the temporary directory created and reset state - """ - if self.path is not None and os.path.exists(self.path): - rmtree(self.path) - self.path = None - - -class AdjacentTempDirectory(TempDirectory): - """Helper class that creates a temporary directory adjacent to a real one. - - Attributes: - original - The original directory to create a temp directory for. - path - After calling create() or entering, contains the full - path to the temporary directory. - delete - Whether the directory should be deleted when exiting - (when used as a contextmanager) - - """ - # The characters that may be used to name the temp directory - # We always prepend a ~ and then rotate through these until - # a usable name is found. - # pkg_resources raises a different error for .dist-info folder - # with leading '-' and invalid metadata - LEADING_CHARS = "-~.=%0123456789" - - def __init__(self, original, delete=None): - super(AdjacentTempDirectory, self).__init__(delete=delete) - self.original = original.rstrip('/\\') - - @classmethod - def _generate_names(cls, name): - """Generates a series of temporary names. - - The algorithm replaces the leading characters in the name - with ones that are valid filesystem characters, but are not - valid package names (for both Python and pip definitions of - package). - """ - for i in range(1, len(name)): - for candidate in itertools.combinations_with_replacement( - cls.LEADING_CHARS, i - 1): - new_name = '~' + ''.join(candidate) + name[i:] - if new_name != name: - yield new_name - - # If we make it this far, we will have to make a longer name - for i in range(len(cls.LEADING_CHARS)): - for candidate in itertools.combinations_with_replacement( - cls.LEADING_CHARS, i): - new_name = '~' + ''.join(candidate) + name - if new_name != name: - yield new_name - - def create(self): - root, name = os.path.split(self.original) - for candidate in self._generate_names(name): - path = os.path.join(root, candidate) - try: - os.mkdir(path) - except OSError as ex: - # Continue if the name exists already - if ex.errno != errno.EEXIST: - raise - else: - self.path = os.path.realpath(path) - break - - if not self.path: - # Final fallback on the default behavior. - self.path = os.path.realpath( - tempfile.mkdtemp(prefix="pip-{}-".format(self.kind)) - ) - logger.debug("Created temporary directory: {}".format(self.path)) diff --git a/env/lib/python3.7/site-packages/pip/_internal/utils/typing.py b/env/lib/python3.7/site-packages/pip/_internal/utils/typing.py deleted file mode 100644 index 10170ce..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/utils/typing.py +++ /dev/null @@ -1,29 +0,0 @@ -"""For neatly implementing static typing in pip. - -`mypy` - the static type analysis tool we use - uses the `typing` module, which -provides core functionality fundamental to mypy's functioning. - -Generally, `typing` would be imported at runtime and used in that fashion - -it acts as a no-op at runtime and does not have any run-time overhead by -design. - -As it turns out, `typing` is not vendorable - it uses separate sources for -Python 2/Python 3. Thus, this codebase can not expect it to be present. -To work around this, mypy allows the typing import to be behind a False-y -optional to prevent it from running at runtime and type-comments can be used -to remove the need for the types to be accessible directly during runtime. - -This module provides the False-y guard in a nicely named fashion so that a -curious maintainer can reach here to read this. - -In pip, all static-typing related imports should be guarded as follows: - - from pip._internal.utils.typing import MYPY_CHECK_RUNNING - - if MYPY_CHECK_RUNNING: - from typing import ... - -Ref: https://github.com/python/mypy/issues/3216 -""" - -MYPY_CHECK_RUNNING = False diff --git a/env/lib/python3.7/site-packages/pip/_internal/utils/ui.py b/env/lib/python3.7/site-packages/pip/_internal/utils/ui.py deleted file mode 100644 index 0902ce7..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/utils/ui.py +++ /dev/null @@ -1,424 +0,0 @@ -from __future__ import absolute_import, division - -import contextlib -import itertools -import logging -import sys -import time -from signal import SIGINT, default_int_handler, signal - -from pip._vendor import six -from pip._vendor.progress import HIDE_CURSOR, SHOW_CURSOR -from pip._vendor.progress.bar import Bar, FillingCirclesBar, IncrementalBar -from pip._vendor.progress.spinner import Spinner - -from pip._internal.utils.compat import WINDOWS -from pip._internal.utils.logging import get_indentation -from pip._internal.utils.misc import format_size -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Any, Iterator, IO - -try: - from pip._vendor import colorama -# Lots of different errors can come from this, including SystemError and -# ImportError. -except Exception: - colorama = None - -logger = logging.getLogger(__name__) - - -def _select_progress_class(preferred, fallback): - encoding = getattr(preferred.file, "encoding", None) - - # If we don't know what encoding this file is in, then we'll just assume - # that it doesn't support unicode and use the ASCII bar. - if not encoding: - return fallback - - # Collect all of the possible characters we want to use with the preferred - # bar. - characters = [ - getattr(preferred, "empty_fill", six.text_type()), - getattr(preferred, "fill", six.text_type()), - ] - characters += list(getattr(preferred, "phases", [])) - - # Try to decode the characters we're using for the bar using the encoding - # of the given file, if this works then we'll assume that we can use the - # fancier bar and if not we'll fall back to the plaintext bar. - try: - six.text_type().join(characters).encode(encoding) - except UnicodeEncodeError: - return fallback - else: - return preferred - - -_BaseBar = _select_progress_class(IncrementalBar, Bar) # type: Any - - -class InterruptibleMixin(object): - """ - Helper to ensure that self.finish() gets called on keyboard interrupt. - - This allows downloads to be interrupted without leaving temporary state - (like hidden cursors) behind. - - This class is similar to the progress library's existing SigIntMixin - helper, but as of version 1.2, that helper has the following problems: - - 1. It calls sys.exit(). - 2. It discards the existing SIGINT handler completely. - 3. It leaves its own handler in place even after an uninterrupted finish, - which will have unexpected delayed effects if the user triggers an - unrelated keyboard interrupt some time after a progress-displaying - download has already completed, for example. - """ - - def __init__(self, *args, **kwargs): - """ - Save the original SIGINT handler for later. - """ - super(InterruptibleMixin, self).__init__(*args, **kwargs) - - self.original_handler = signal(SIGINT, self.handle_sigint) - - # If signal() returns None, the previous handler was not installed from - # Python, and we cannot restore it. This probably should not happen, - # but if it does, we must restore something sensible instead, at least. - # The least bad option should be Python's default SIGINT handler, which - # just raises KeyboardInterrupt. - if self.original_handler is None: - self.original_handler = default_int_handler - - def finish(self): - """ - Restore the original SIGINT handler after finishing. - - This should happen regardless of whether the progress display finishes - normally, or gets interrupted. - """ - super(InterruptibleMixin, self).finish() - signal(SIGINT, self.original_handler) - - def handle_sigint(self, signum, frame): - """ - Call self.finish() before delegating to the original SIGINT handler. - - This handler should only be in place while the progress display is - active. - """ - self.finish() - self.original_handler(signum, frame) - - -class SilentBar(Bar): - - def update(self): - pass - - -class BlueEmojiBar(IncrementalBar): - - suffix = "%(percent)d%%" - bar_prefix = " " - bar_suffix = " " - phases = (u"\U0001F539", u"\U0001F537", u"\U0001F535") # type: Any - - -class DownloadProgressMixin(object): - - def __init__(self, *args, **kwargs): - super(DownloadProgressMixin, self).__init__(*args, **kwargs) - self.message = (" " * (get_indentation() + 2)) + self.message - - @property - def downloaded(self): - return format_size(self.index) - - @property - def download_speed(self): - # Avoid zero division errors... - if self.avg == 0.0: - return "..." - return format_size(1 / self.avg) + "/s" - - @property - def pretty_eta(self): - if self.eta: - return "eta %s" % self.eta_td - return "" - - def iter(self, it, n=1): - for x in it: - yield x - self.next(n) - self.finish() - - -class WindowsMixin(object): - - def __init__(self, *args, **kwargs): - # The Windows terminal does not support the hide/show cursor ANSI codes - # even with colorama. So we'll ensure that hide_cursor is False on - # Windows. - # This call needs to go before the super() call, so that hide_cursor - # is set in time. The base progress bar class writes the "hide cursor" - # code to the terminal in its init, so if we don't set this soon - # enough, we get a "hide" with no corresponding "show"... - if WINDOWS and self.hide_cursor: - self.hide_cursor = False - - super(WindowsMixin, self).__init__(*args, **kwargs) - - # Check if we are running on Windows and we have the colorama module, - # if we do then wrap our file with it. - if WINDOWS and colorama: - self.file = colorama.AnsiToWin32(self.file) - # The progress code expects to be able to call self.file.isatty() - # but the colorama.AnsiToWin32() object doesn't have that, so we'll - # add it. - self.file.isatty = lambda: self.file.wrapped.isatty() - # The progress code expects to be able to call self.file.flush() - # but the colorama.AnsiToWin32() object doesn't have that, so we'll - # add it. - self.file.flush = lambda: self.file.wrapped.flush() - - -class BaseDownloadProgressBar(WindowsMixin, InterruptibleMixin, - DownloadProgressMixin): - - file = sys.stdout - message = "%(percent)d%%" - suffix = "%(downloaded)s %(download_speed)s %(pretty_eta)s" - -# NOTE: The "type: ignore" comments on the following classes are there to -# work around https://github.com/python/typing/issues/241 - - -class DefaultDownloadProgressBar(BaseDownloadProgressBar, - _BaseBar): - pass - - -class DownloadSilentBar(BaseDownloadProgressBar, SilentBar): # type: ignore - pass - - -class DownloadIncrementalBar(BaseDownloadProgressBar, # type: ignore - IncrementalBar): - pass - - -class DownloadFillingCirclesBar(BaseDownloadProgressBar, # type: ignore - FillingCirclesBar): - pass - - -class DownloadBlueEmojiProgressBar(BaseDownloadProgressBar, # type: ignore - BlueEmojiBar): - pass - - -class DownloadProgressSpinner(WindowsMixin, InterruptibleMixin, - DownloadProgressMixin, Spinner): - - file = sys.stdout - suffix = "%(downloaded)s %(download_speed)s" - - def next_phase(self): - if not hasattr(self, "_phaser"): - self._phaser = itertools.cycle(self.phases) - return next(self._phaser) - - def update(self): - message = self.message % self - phase = self.next_phase() - suffix = self.suffix % self - line = ''.join([ - message, - " " if message else "", - phase, - " " if suffix else "", - suffix, - ]) - - self.writeln(line) - - -BAR_TYPES = { - "off": (DownloadSilentBar, DownloadSilentBar), - "on": (DefaultDownloadProgressBar, DownloadProgressSpinner), - "ascii": (DownloadIncrementalBar, DownloadProgressSpinner), - "pretty": (DownloadFillingCirclesBar, DownloadProgressSpinner), - "emoji": (DownloadBlueEmojiProgressBar, DownloadProgressSpinner) -} - - -def DownloadProgressProvider(progress_bar, max=None): - if max is None or max == 0: - return BAR_TYPES[progress_bar][1]().iter - else: - return BAR_TYPES[progress_bar][0](max=max).iter - - -################################################################ -# Generic "something is happening" spinners -# -# We don't even try using progress.spinner.Spinner here because it's actually -# simpler to reimplement from scratch than to coerce their code into doing -# what we need. -################################################################ - -@contextlib.contextmanager -def hidden_cursor(file): - # type: (IO) -> Iterator[None] - # The Windows terminal does not support the hide/show cursor ANSI codes, - # even via colorama. So don't even try. - if WINDOWS: - yield - # We don't want to clutter the output with control characters if we're - # writing to a file, or if the user is running with --quiet. - # See https://github.com/pypa/pip/issues/3418 - elif not file.isatty() or logger.getEffectiveLevel() > logging.INFO: - yield - else: - file.write(HIDE_CURSOR) - try: - yield - finally: - file.write(SHOW_CURSOR) - - -class RateLimiter(object): - def __init__(self, min_update_interval_seconds): - # type: (float) -> None - self._min_update_interval_seconds = min_update_interval_seconds - self._last_update = 0 # type: float - - def ready(self): - # type: () -> bool - now = time.time() - delta = now - self._last_update - return delta >= self._min_update_interval_seconds - - def reset(self): - # type: () -> None - self._last_update = time.time() - - -class SpinnerInterface(object): - def spin(self): - # type: () -> None - raise NotImplementedError() - - def finish(self, final_status): - # type: (str) -> None - raise NotImplementedError() - - -class InteractiveSpinner(SpinnerInterface): - def __init__(self, message, file=None, spin_chars="-\\|/", - # Empirically, 8 updates/second looks nice - min_update_interval_seconds=0.125): - self._message = message - if file is None: - file = sys.stdout - self._file = file - self._rate_limiter = RateLimiter(min_update_interval_seconds) - self._finished = False - - self._spin_cycle = itertools.cycle(spin_chars) - - self._file.write(" " * get_indentation() + self._message + " ... ") - self._width = 0 - - def _write(self, status): - assert not self._finished - # Erase what we wrote before by backspacing to the beginning, writing - # spaces to overwrite the old text, and then backspacing again - backup = "\b" * self._width - self._file.write(backup + " " * self._width + backup) - # Now we have a blank slate to add our status - self._file.write(status) - self._width = len(status) - self._file.flush() - self._rate_limiter.reset() - - def spin(self): - # type: () -> None - if self._finished: - return - if not self._rate_limiter.ready(): - return - self._write(next(self._spin_cycle)) - - def finish(self, final_status): - # type: (str) -> None - if self._finished: - return - self._write(final_status) - self._file.write("\n") - self._file.flush() - self._finished = True - - -# Used for dumb terminals, non-interactive installs (no tty), etc. -# We still print updates occasionally (once every 60 seconds by default) to -# act as a keep-alive for systems like Travis-CI that take lack-of-output as -# an indication that a task has frozen. -class NonInteractiveSpinner(SpinnerInterface): - def __init__(self, message, min_update_interval_seconds=60): - # type: (str, float) -> None - self._message = message - self._finished = False - self._rate_limiter = RateLimiter(min_update_interval_seconds) - self._update("started") - - def _update(self, status): - assert not self._finished - self._rate_limiter.reset() - logger.info("%s: %s", self._message, status) - - def spin(self): - # type: () -> None - if self._finished: - return - if not self._rate_limiter.ready(): - return - self._update("still running...") - - def finish(self, final_status): - # type: (str) -> None - if self._finished: - return - self._update("finished with status '%s'" % (final_status,)) - self._finished = True - - -@contextlib.contextmanager -def open_spinner(message): - # type: (str) -> Iterator[SpinnerInterface] - # Interactive spinner goes directly to sys.stdout rather than being routed - # through the logging system, but it acts like it has level INFO, - # i.e. it's only displayed if we're at level INFO or better. - # Non-interactive spinner goes through the logging system, so it is always - # in sync with logging configuration. - if sys.stdout.isatty() and logger.getEffectiveLevel() <= logging.INFO: - spinner = InteractiveSpinner(message) # type: SpinnerInterface - else: - spinner = NonInteractiveSpinner(message) - try: - with hidden_cursor(sys.stdout): - yield spinner - except KeyboardInterrupt: - spinner.finish("canceled") - raise - except Exception: - spinner.finish("error") - raise - else: - spinner.finish("done") diff --git a/env/lib/python3.7/site-packages/pip/_internal/vcs/__init__.py b/env/lib/python3.7/site-packages/pip/_internal/vcs/__init__.py deleted file mode 100644 index 6fca079..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/vcs/__init__.py +++ /dev/null @@ -1,604 +0,0 @@ -"""Handles all VCS (version control) support""" -from __future__ import absolute_import - -import errno -import logging -import os -import shutil -import sys - -from pip._vendor import pkg_resources -from pip._vendor.six.moves.urllib import parse as urllib_parse - -from pip._internal.exceptions import BadCommand -from pip._internal.utils.misc import ( - ask_path_exists, backup_dir, call_subprocess, display_path, rmtree, -) -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import ( - Any, Dict, Iterable, List, Mapping, Optional, Text, Tuple, Type - ) - from pip._internal.utils.ui import SpinnerInterface - - AuthInfo = Tuple[Optional[str], Optional[str]] - -__all__ = ['vcs'] - - -logger = logging.getLogger(__name__) - - -def make_vcs_requirement_url(repo_url, rev, project_name, subdir=None): - """ - Return the URL for a VCS requirement. - - Args: - repo_url: the remote VCS url, with any needed VCS prefix (e.g. "git+"). - project_name: the (unescaped) project name. - """ - egg_project_name = pkg_resources.to_filename(project_name) - req = '{}@{}#egg={}'.format(repo_url, rev, egg_project_name) - if subdir: - req += '&subdirectory={}'.format(subdir) - - return req - - -class RemoteNotFoundError(Exception): - pass - - -class RevOptions(object): - - """ - Encapsulates a VCS-specific revision to install, along with any VCS - install options. - - Instances of this class should be treated as if immutable. - """ - - def __init__( - self, - vc_class, # type: Type[VersionControl] - rev=None, # type: Optional[str] - extra_args=None, # type: Optional[List[str]] - ): - # type: (...) -> None - """ - Args: - vc_class: a VersionControl subclass. - rev: the name of the revision to install. - extra_args: a list of extra options. - """ - if extra_args is None: - extra_args = [] - - self.extra_args = extra_args - self.rev = rev - self.vc_class = vc_class - - def __repr__(self): - return '<RevOptions {}: rev={!r}>'.format(self.vc_class.name, self.rev) - - @property - def arg_rev(self): - # type: () -> Optional[str] - if self.rev is None: - return self.vc_class.default_arg_rev - - return self.rev - - def to_args(self): - # type: () -> List[str] - """ - Return the VCS-specific command arguments. - """ - args = [] # type: List[str] - rev = self.arg_rev - if rev is not None: - args += self.vc_class.get_base_rev_args(rev) - args += self.extra_args - - return args - - def to_display(self): - # type: () -> str - if not self.rev: - return '' - - return ' (to revision {})'.format(self.rev) - - def make_new(self, rev): - # type: (str) -> RevOptions - """ - Make a copy of the current instance, but with a new rev. - - Args: - rev: the name of the revision for the new object. - """ - return self.vc_class.make_rev_options(rev, extra_args=self.extra_args) - - -class VcsSupport(object): - _registry = {} # type: Dict[str, Type[VersionControl]] - schemes = ['ssh', 'git', 'hg', 'bzr', 'sftp', 'svn'] - - def __init__(self): - # type: () -> None - # Register more schemes with urlparse for various version control - # systems - urllib_parse.uses_netloc.extend(self.schemes) - # Python >= 2.7.4, 3.3 doesn't have uses_fragment - if getattr(urllib_parse, 'uses_fragment', None): - urllib_parse.uses_fragment.extend(self.schemes) - super(VcsSupport, self).__init__() - - def __iter__(self): - return self._registry.__iter__() - - @property - def backends(self): - # type: () -> List[Type[VersionControl]] - return list(self._registry.values()) - - @property - def dirnames(self): - # type: () -> List[str] - return [backend.dirname for backend in self.backends] - - @property - def all_schemes(self): - # type: () -> List[str] - schemes = [] # type: List[str] - for backend in self.backends: - schemes.extend(backend.schemes) - return schemes - - def register(self, cls): - # type: (Type[VersionControl]) -> None - if not hasattr(cls, 'name'): - logger.warning('Cannot register VCS %s', cls.__name__) - return - if cls.name not in self._registry: - self._registry[cls.name] = cls - logger.debug('Registered VCS backend: %s', cls.name) - - def unregister(self, cls=None, name=None): - # type: (Optional[Type[VersionControl]], Optional[str]) -> None - if name in self._registry: - del self._registry[name] - elif cls in self._registry.values(): - del self._registry[cls.name] - else: - logger.warning('Cannot unregister because no class or name given') - - def get_backend_type(self, location): - # type: (str) -> Optional[Type[VersionControl]] - """ - Return the type of the version control backend if found at given - location, e.g. vcs.get_backend_type('/path/to/vcs/checkout') - """ - for vc_type in self._registry.values(): - if vc_type.controls_location(location): - logger.debug('Determine that %s uses VCS: %s', - location, vc_type.name) - return vc_type - return None - - def get_backend(self, name): - # type: (str) -> Optional[Type[VersionControl]] - name = name.lower() - if name in self._registry: - return self._registry[name] - return None - - -vcs = VcsSupport() - - -class VersionControl(object): - name = '' - dirname = '' - repo_name = '' - # List of supported schemes for this Version Control - schemes = () # type: Tuple[str, ...] - # Iterable of environment variable names to pass to call_subprocess(). - unset_environ = () # type: Tuple[str, ...] - default_arg_rev = None # type: Optional[str] - - @classmethod - def should_add_vcs_url_prefix(cls, remote_url): - """ - Return whether the vcs prefix (e.g. "git+") should be added to a - repository's remote url when used in a requirement. - """ - return not remote_url.lower().startswith('{}:'.format(cls.name)) - - @classmethod - def get_subdirectory(cls, repo_dir): - """ - Return the path to setup.py, relative to the repo root. - """ - return None - - @classmethod - def get_requirement_revision(cls, repo_dir): - """ - Return the revision string that should be used in a requirement. - """ - return cls.get_revision(repo_dir) - - @classmethod - def get_src_requirement(cls, repo_dir, project_name): - """ - Return the requirement string to use to redownload the files - currently at the given repository directory. - - Args: - project_name: the (unescaped) project name. - - The return value has a form similar to the following: - - {repository_url}@{revision}#egg={project_name} - """ - repo_url = cls.get_remote_url(repo_dir) - if repo_url is None: - return None - - if cls.should_add_vcs_url_prefix(repo_url): - repo_url = '{}+{}'.format(cls.name, repo_url) - - revision = cls.get_requirement_revision(repo_dir) - subdir = cls.get_subdirectory(repo_dir) - req = make_vcs_requirement_url(repo_url, revision, project_name, - subdir=subdir) - - return req - - def __init__(self, url=None, *args, **kwargs): - self.url = url - super(VersionControl, self).__init__(*args, **kwargs) - - @staticmethod - def get_base_rev_args(rev): - """ - Return the base revision arguments for a vcs command. - - Args: - rev: the name of a revision to install. Cannot be None. - """ - raise NotImplementedError - - @classmethod - def make_rev_options(cls, rev=None, extra_args=None): - # type: (Optional[str], Optional[List[str]]) -> RevOptions - """ - Return a RevOptions object. - - Args: - rev: the name of a revision to install. - extra_args: a list of extra options. - """ - return RevOptions(cls, rev, extra_args=extra_args) - - @classmethod - def _is_local_repository(cls, repo): - # type: (str) -> bool - """ - posix absolute paths start with os.path.sep, - win32 ones start with drive (like c:\\folder) - """ - drive, tail = os.path.splitdrive(repo) - return repo.startswith(os.path.sep) or bool(drive) - - def export(self, location): - """ - Export the repository at the url to the destination location - i.e. only download the files, without vcs informations - """ - raise NotImplementedError - - @classmethod - def get_netloc_and_auth(cls, netloc, scheme): - """ - Parse the repository URL's netloc, and return the new netloc to use - along with auth information. - - Args: - netloc: the original repository URL netloc. - scheme: the repository URL's scheme without the vcs prefix. - - This is mainly for the Subversion class to override, so that auth - information can be provided via the --username and --password options - instead of through the URL. For other subclasses like Git without - such an option, auth information must stay in the URL. - - Returns: (netloc, (username, password)). - """ - return netloc, (None, None) - - @classmethod - def get_url_rev_and_auth(cls, url): - # type: (str) -> Tuple[str, Optional[str], AuthInfo] - """ - Parse the repository URL to use, and return the URL, revision, - and auth info to use. - - Returns: (url, rev, (username, password)). - """ - scheme, netloc, path, query, frag = urllib_parse.urlsplit(url) - if '+' not in scheme: - raise ValueError( - "Sorry, {!r} is a malformed VCS url. " - "The format is <vcs>+<protocol>://<url>, " - "e.g. svn+http://myrepo/svn/MyApp#egg=MyApp".format(url) - ) - # Remove the vcs prefix. - scheme = scheme.split('+', 1)[1] - netloc, user_pass = cls.get_netloc_and_auth(netloc, scheme) - rev = None - if '@' in path: - path, rev = path.rsplit('@', 1) - url = urllib_parse.urlunsplit((scheme, netloc, path, query, '')) - return url, rev, user_pass - - @staticmethod - def make_rev_args(username, password): - """ - Return the RevOptions "extra arguments" to use in obtain(). - """ - return [] - - def get_url_rev_options(self, url): - # type: (str) -> Tuple[str, RevOptions] - """ - Return the URL and RevOptions object to use in obtain() and in - some cases export(), as a tuple (url, rev_options). - """ - url, rev, user_pass = self.get_url_rev_and_auth(url) - username, password = user_pass - extra_args = self.make_rev_args(username, password) - rev_options = self.make_rev_options(rev, extra_args=extra_args) - - return url, rev_options - - @staticmethod - def normalize_url(url): - # type: (str) -> str - """ - Normalize a URL for comparison by unquoting it and removing any - trailing slash. - """ - return urllib_parse.unquote(url).rstrip('/') - - @classmethod - def compare_urls(cls, url1, url2): - # type: (str, str) -> bool - """ - Compare two repo URLs for identity, ignoring incidental differences. - """ - return (cls.normalize_url(url1) == cls.normalize_url(url2)) - - @classmethod - def fetch_new(cls, dest, url, rev_options): - """ - Fetch a revision from a repository, in the case that this is the - first fetch from the repository. - - Args: - dest: the directory to fetch the repository to. - rev_options: a RevOptions object. - """ - raise NotImplementedError - - def switch(self, dest, url, rev_options): - """ - Switch the repo at ``dest`` to point to ``URL``. - - Args: - rev_options: a RevOptions object. - """ - raise NotImplementedError - - def update(self, dest, url, rev_options): - """ - Update an already-existing repo to the given ``rev_options``. - - Args: - rev_options: a RevOptions object. - """ - raise NotImplementedError - - @classmethod - def is_commit_id_equal(cls, dest, name): - """ - Return whether the id of the current commit equals the given name. - - Args: - dest: the repository directory. - name: a string name. - """ - raise NotImplementedError - - def obtain(self, dest): - # type: (str) -> None - """ - Install or update in editable mode the package represented by this - VersionControl object. - - Args: - dest: the repository directory in which to install or update. - """ - url, rev_options = self.get_url_rev_options(self.url) - - if not os.path.exists(dest): - self.fetch_new(dest, url, rev_options) - return - - rev_display = rev_options.to_display() - if self.is_repository_directory(dest): - existing_url = self.get_remote_url(dest) - if self.compare_urls(existing_url, url): - logger.debug( - '%s in %s exists, and has correct URL (%s)', - self.repo_name.title(), - display_path(dest), - url, - ) - if not self.is_commit_id_equal(dest, rev_options.rev): - logger.info( - 'Updating %s %s%s', - display_path(dest), - self.repo_name, - rev_display, - ) - self.update(dest, url, rev_options) - else: - logger.info('Skipping because already up-to-date.') - return - - logger.warning( - '%s %s in %s exists with URL %s', - self.name, - self.repo_name, - display_path(dest), - existing_url, - ) - prompt = ('(s)witch, (i)gnore, (w)ipe, (b)ackup ', - ('s', 'i', 'w', 'b')) - else: - logger.warning( - 'Directory %s already exists, and is not a %s %s.', - dest, - self.name, - self.repo_name, - ) - # https://github.com/python/mypy/issues/1174 - prompt = ('(i)gnore, (w)ipe, (b)ackup ', # type: ignore - ('i', 'w', 'b')) - - logger.warning( - 'The plan is to install the %s repository %s', - self.name, - url, - ) - response = ask_path_exists('What to do? %s' % prompt[0], prompt[1]) - - if response == 'a': - sys.exit(-1) - - if response == 'w': - logger.warning('Deleting %s', display_path(dest)) - rmtree(dest) - self.fetch_new(dest, url, rev_options) - return - - if response == 'b': - dest_dir = backup_dir(dest) - logger.warning( - 'Backing up %s to %s', display_path(dest), dest_dir, - ) - shutil.move(dest, dest_dir) - self.fetch_new(dest, url, rev_options) - return - - # Do nothing if the response is "i". - if response == 's': - logger.info( - 'Switching %s %s to %s%s', - self.repo_name, - display_path(dest), - url, - rev_display, - ) - self.switch(dest, url, rev_options) - - def unpack(self, location): - # type: (str) -> None - """ - Clean up current location and download the url repository - (and vcs infos) into location - """ - if os.path.exists(location): - rmtree(location) - self.obtain(location) - - @classmethod - def get_remote_url(cls, location): - """ - Return the url used at location - - Raises RemoteNotFoundError if the repository does not have a remote - url configured. - """ - raise NotImplementedError - - @classmethod - def get_revision(cls, location): - """ - Return the current commit id of the files at the given location. - """ - raise NotImplementedError - - @classmethod - def run_command( - cls, - cmd, # type: List[str] - show_stdout=True, # type: bool - cwd=None, # type: Optional[str] - on_returncode='raise', # type: str - extra_ok_returncodes=None, # type: Optional[Iterable[int]] - command_desc=None, # type: Optional[str] - extra_environ=None, # type: Optional[Mapping[str, Any]] - spinner=None # type: Optional[SpinnerInterface] - ): - # type: (...) -> Optional[Text] - """ - Run a VCS subcommand - This is simply a wrapper around call_subprocess that adds the VCS - command name, and checks that the VCS is available - """ - cmd = [cls.name] + cmd - try: - return call_subprocess(cmd, show_stdout, cwd, - on_returncode=on_returncode, - extra_ok_returncodes=extra_ok_returncodes, - command_desc=command_desc, - extra_environ=extra_environ, - unset_environ=cls.unset_environ, - spinner=spinner) - except OSError as e: - # errno.ENOENT = no such file or directory - # In other words, the VCS executable isn't available - if e.errno == errno.ENOENT: - raise BadCommand( - 'Cannot find command %r - do you have ' - '%r installed and in your ' - 'PATH?' % (cls.name, cls.name)) - else: - raise # re-raise exception if a different error occurred - - @classmethod - def is_repository_directory(cls, path): - # type: (str) -> bool - """ - Return whether a directory path is a repository directory. - """ - logger.debug('Checking in %s for %s (%s)...', - path, cls.dirname, cls.name) - return os.path.exists(os.path.join(path, cls.dirname)) - - @classmethod - def controls_location(cls, location): - # type: (str) -> bool - """ - Check if a location is controlled by the vcs. - It is meant to be overridden to implement smarter detection - mechanisms for specific vcs. - - This can do more than is_repository_directory() alone. For example, - the Git override checks that Git is actually available. - """ - return cls.is_repository_directory(location) diff --git a/env/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 69b5b4fc9dda7959f344db0d64ca789a082c11bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16988 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 Df)F2T diff --git a/env/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-37.pyc deleted file mode 100644 index 80c537a20ef1a06f706947c5e3b372ce5bae7b30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3389 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 M48F<R{^no)4?`?Od;kCd diff --git a/env/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/git.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/git.cpython-37.pyc deleted file mode 100644 index 913fdc9a285ca9adc51b0fc0f1b795971ade3879..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9033 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 diff --git a/env/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-37.pyc deleted file mode 100644 index f396d44271ebf253e463116aa25fac451ab75ac7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3651 zcmbVOOLN@D5ys%XPcA8nVj`siJ0&L@dzW^~m4i!;70Z%yh-pVkMe<gqP!MKz0Sb@R z%q$-Wm<x4`%70;5Ipvn$GuNE*7jjDXfLuPrlYzpZG1D`c{`%{l{<7C=8*ml>-2Us` zo?-k4Kh7^3gop5mH_%XnlFZ1-gb<X?%$%6|ZA~nATbZ3Z6GxBPnVWkPPs>i`=dDRg z%Wl@rJClx<y{wz}CcV5r=@WyQ%QZGQC6o294eHa@8-uo3@5GvHu>SHE+c?F4n$L`3 z`@gUgV@T9m^iq`BLb5Q;=OvfB(ASO2Vw%q85f_ZZcV`~SB$Q>i;293nRLryJD8z2~ z?){nN^RH6QVp;N|p{e?RVO*qT@u(~$FEeHB$0El6onICR58)9tG|ZR~Y5)cV>^CPi zwI&X=Coc1-L)|yV37PoRqy8IX(qe7eqHW#Rp&i<VzAo+2KD>J{wnhhftPk=!-O%zH z$hYXGmIol;rdwKGr*{B{ZPogQ@p!@0C{t!KtE_P{Q%;<f1sggXU0Qj`?88LLdF7u8 zqH;kJBB}cLmXS>35o*K)^zp(sK9ArLE;O|<Bk()2`!59D;%uLHp<6fqd$1$(`OZ9@ zkJ18G%d!!DeN-HNGEJ~kKVe!(#)~N10W5d&^DU3(M{0e>WcV@?EQD3Vh|k0p{?&xW zFsr*O^TzM!#aai{&>t;$^mZSBAc3RQd`o`#)v;L{OH!MACUU1X_AF}EWM)zu`>6BQ zBF1xrx_>gB8ZY1tMtap3j}MVcflOHNhgrbcyc8*tBZ!(#AW|SpJx-aBX#o(HMUa)T z7L?2M0sxi$DlMq;A|5B{K6?V}>WHK~2!*8OLMkghpu0nxBgV>I6!R#4rEDao>hMJo z#$}#I1sz(-7A%`8fAtGr0&7E>@(V}sKCHqA(EJo0;X`AXUD7peQVlL}Z1xsoP~(Na z_TbUrJq4k*md2@ZY)i5PQrBi}OMvWzoZ1NB(xxW05I%s>(E$l`pP4YrIW_JW#}0sO z*G^5S`_{w|M@V<8+mC>gX)z0uS#V$67l_||!8`E7sy!MN<zh}F$trX78i3I9knl|y z9=fUx!Fv|9%FW8zjB#bB#kAxODDXSbC=YayJ)myInNT)*Mp@u0fD)Kh&e2Dr`8Z$9 zk8`SLT|-f|rcB03Sg?a%z~W*98pHI7O-y~a%}p{O)vXIuSNbbpk&zgH8rXk>AdNkM zv?iK`<kSL)Z3OMuIeJh#OSiT)N1dgI5ZC4@a8vrVP3;r&hrzK6I<4A89bl}{F!s4o z{MI&PTiSb_srjnS|3Qpn$hg&p>@IuM0XKQL4$h!3@^|lr@x4(5$aU&zxAnE#eAv}m z?StF=mD^go%1&lHRt_>!D37vfw8*3)2i4A_a*@%XC}kiHQot%$VR1QNw3k0aPu~Ru z(7Wee9VoLD9AjPCdu3X{>M3N1oN){L2G61?gA5Fb{5ze<mCad1l_i)|b~$H-at?SZ znex7U_L%dMtNw2J43ao_S%34N;X2+y#F2OW=kTSOGHmf}l;6YVeQeOh$cuRi0f&E7 z?%BK3yu)dlF=esCnBT_<tK6qUPPq*NAH$Hqr46z{eBeo&^huX&lP%!QJq!49DGHk@ zE3zPuF(NftJ_P~Xp_3T6h)_$r1R_s6jA)11s8QRiQH(PO95!EM*(IDc?n6^st}%dP z;Rf?>vP(~W2z${-02+1GgeFR_WMMQzoA8?}CScB`_FHQSTh|%c1a=etYe+2S34tCH zM;Zg#m>(P1tDffF_>6XtJ^3wIx5)~26ZVdfJe{k}Fcl#t#|(~<^K{J-(V@iyob(fH zw7ai)ua5@{XL$)l1Z0cHpeInpfV}B~2ixGwYJ0_QeGXly-)#Opn112GYvyAC<5bVv z!P)hc$ptU;X>zgmkv1lXlc<<6;5-D?eu`B|P%QG7jDHkFB8Z9r4^~Kr<JD@)gTjXu zQdEP{2oH%2((31bgXzat0X*Zx=djhw7^wl26Sx4L$NG=g>E3MsYX)~=dUMn`4P4dM zb*LJ}9}QHpGVKyj7r3Mp_L@%9=I9NQNF)t5!KWXOK#fN+lpd=!5_T9-7N>cX1xTG@ zwi@CO!Io<MGHOLh*^huN#9ds6ZM%W(^#V%G{4%~TRuH;p5WasM!gnXdm?iPT_o`My z!c(l&%<6;RX9v*{a72hj&NRFBo4Qs6v@CupgFJ$?{X}o`oB)^;m94YzwJ6zu_`+%= zm0?Ol_IeRzF(@~6npNGq*zvoHyTc9ThaoN-hN>Ngc}W);%H1%;m6{Qbp~pwKg_cgn z*sVMfCxDkw-KJ8_nM_K`*H9O09o305u<@+>1ML0`8$56L7ubA>%~#kw!REp+E$N~O z&uUyuVC96zyuQt@?YFu;f8aaaR=3^laMT-aq6yOl1TC1ru?STj7A1Jfd<b8Y+feq7 z!+loJl8;4tIL^y`CYp0?OOKtG!(&<=6j>QjovPIK)xm{KGcnFn5$iff-MeXcRR>}r zr`E5kK()=WxZ_w1sunQtkGgu|Ut=d8klG~Wb2du_#K}$QDE~p@u-_ri1lD9-sD*s9 Oi`6CE1G8-nzW+aD?xutQ diff --git a/env/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-37.pyc deleted file mode 100644 index 816b0fd5f2ac204a1889fd15fd2426a3b717ab70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6680 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 diff --git a/env/lib/python3.7/site-packages/pip/_internal/vcs/bazaar.py b/env/lib/python3.7/site-packages/pip/_internal/vcs/bazaar.py deleted file mode 100644 index 3587b3d..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/vcs/bazaar.py +++ /dev/null @@ -1,103 +0,0 @@ -from __future__ import absolute_import - -import logging -import os - -from pip._vendor.six.moves.urllib import parse as urllib_parse - -from pip._internal.download import path_to_url -from pip._internal.utils.misc import display_path, rmtree -from pip._internal.vcs import VersionControl, vcs - -logger = logging.getLogger(__name__) - - -class Bazaar(VersionControl): - name = 'bzr' - dirname = '.bzr' - repo_name = 'branch' - schemes = ( - 'bzr', 'bzr+http', 'bzr+https', 'bzr+ssh', 'bzr+sftp', 'bzr+ftp', - 'bzr+lp', - ) - - def __init__(self, url=None, *args, **kwargs): - super(Bazaar, self).__init__(url, *args, **kwargs) - # This is only needed for python <2.7.5 - # Register lp but do not expose as a scheme to support bzr+lp. - if getattr(urllib_parse, 'uses_fragment', None): - urllib_parse.uses_fragment.extend(['lp']) - - @staticmethod - def get_base_rev_args(rev): - return ['-r', rev] - - def export(self, location): - """ - Export the Bazaar repository at the url to the destination location - """ - # Remove the location to make sure Bazaar can export it correctly - if os.path.exists(location): - rmtree(location) - - url, rev_options = self.get_url_rev_options(self.url) - self.run_command( - ['export', location, url] + rev_options.to_args(), - show_stdout=False, - ) - - @classmethod - def fetch_new(cls, dest, url, rev_options): - rev_display = rev_options.to_display() - logger.info( - 'Checking out %s%s to %s', - url, - rev_display, - display_path(dest), - ) - cmd_args = ['branch', '-q'] + rev_options.to_args() + [url, dest] - cls.run_command(cmd_args) - - def switch(self, dest, url, rev_options): - self.run_command(['switch', url], cwd=dest) - - def update(self, dest, url, rev_options): - cmd_args = ['pull', '-q'] + rev_options.to_args() - self.run_command(cmd_args, cwd=dest) - - @classmethod - def get_url_rev_and_auth(cls, url): - # hotfix the URL scheme after removing bzr+ from bzr+ssh:// readd it - url, rev, user_pass = super(Bazaar, cls).get_url_rev_and_auth(url) - if url.startswith('ssh://'): - url = 'bzr+' + url - return url, rev, user_pass - - @classmethod - def get_remote_url(cls, location): - urls = cls.run_command(['info'], show_stdout=False, cwd=location) - for line in urls.splitlines(): - line = line.strip() - for x in ('checkout of branch: ', - 'parent branch: '): - if line.startswith(x): - repo = line.split(x)[1] - if cls._is_local_repository(repo): - return path_to_url(repo) - return repo - return None - - @classmethod - def get_revision(cls, location): - revision = cls.run_command( - ['revno'], show_stdout=False, cwd=location, - ) - return revision.splitlines()[-1] - - @classmethod - def is_commit_id_equal(cls, dest, name): - """Always assume the versions don't match""" - return False - - -vcs.register(Bazaar) diff --git a/env/lib/python3.7/site-packages/pip/_internal/vcs/git.py b/env/lib/python3.7/site-packages/pip/_internal/vcs/git.py deleted file mode 100644 index 35ea930..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/vcs/git.py +++ /dev/null @@ -1,362 +0,0 @@ -from __future__ import absolute_import - -import logging -import os.path -import re - -from pip._vendor.packaging.version import parse as parse_version -from pip._vendor.six.moves.urllib import parse as urllib_parse -from pip._vendor.six.moves.urllib import request as urllib_request - -from pip._internal.exceptions import BadCommand -from pip._internal.utils.compat import samefile -from pip._internal.utils.misc import display_path, redact_password_from_url -from pip._internal.utils.temp_dir import TempDirectory -from pip._internal.vcs import RemoteNotFoundError, VersionControl, vcs - -urlsplit = urllib_parse.urlsplit -urlunsplit = urllib_parse.urlunsplit - - -logger = logging.getLogger(__name__) - - -HASH_REGEX = re.compile('[a-fA-F0-9]{40}') - - -def looks_like_hash(sha): - return bool(HASH_REGEX.match(sha)) - - -class Git(VersionControl): - name = 'git' - dirname = '.git' - repo_name = 'clone' - schemes = ( - 'git', 'git+http', 'git+https', 'git+ssh', 'git+git', 'git+file', - ) - # Prevent the user's environment variables from interfering with pip: - # https://github.com/pypa/pip/issues/1130 - unset_environ = ('GIT_DIR', 'GIT_WORK_TREE') - default_arg_rev = 'HEAD' - - def __init__(self, url=None, *args, **kwargs): - - # Works around an apparent Git bug - # (see https://article.gmane.org/gmane.comp.version-control.git/146500) - if url: - scheme, netloc, path, query, fragment = urlsplit(url) - if scheme.endswith('file'): - initial_slashes = path[:-len(path.lstrip('/'))] - newpath = ( - initial_slashes + - urllib_request.url2pathname(path) - .replace('\\', '/').lstrip('/') - ) - url = urlunsplit((scheme, netloc, newpath, query, fragment)) - after_plus = scheme.find('+') + 1 - url = scheme[:after_plus] + urlunsplit( - (scheme[after_plus:], netloc, newpath, query, fragment), - ) - - super(Git, self).__init__(url, *args, **kwargs) - - @staticmethod - def get_base_rev_args(rev): - return [rev] - - def get_git_version(self): - VERSION_PFX = 'git version ' - version = self.run_command(['version'], show_stdout=False) - if version.startswith(VERSION_PFX): - version = version[len(VERSION_PFX):].split()[0] - else: - version = '' - # get first 3 positions of the git version because - # on windows it is x.y.z.windows.t, and this parses as - # LegacyVersion which always smaller than a Version. - version = '.'.join(version.split('.')[:3]) - return parse_version(version) - - @classmethod - def get_current_branch(cls, location): - """ - Return the current branch, or None if HEAD isn't at a branch - (e.g. detached HEAD). - """ - # git-symbolic-ref exits with empty stdout if "HEAD" is a detached - # HEAD rather than a symbolic ref. In addition, the -q causes the - # command to exit with status code 1 instead of 128 in this case - # and to suppress the message to stderr. - args = ['symbolic-ref', '-q', 'HEAD'] - output = cls.run_command( - args, extra_ok_returncodes=(1, ), show_stdout=False, cwd=location, - ) - ref = output.strip() - - if ref.startswith('refs/heads/'): - return ref[len('refs/heads/'):] - - return None - - def export(self, location): - """Export the Git repository at the url to the destination location""" - if not location.endswith('/'): - location = location + '/' - - with TempDirectory(kind="export") as temp_dir: - self.unpack(temp_dir.path) - self.run_command( - ['checkout-index', '-a', '-f', '--prefix', location], - show_stdout=False, cwd=temp_dir.path - ) - - @classmethod - def get_revision_sha(cls, dest, rev): - """ - Return (sha_or_none, is_branch), where sha_or_none is a commit hash - if the revision names a remote branch or tag, otherwise None. - - Args: - dest: the repository directory. - rev: the revision name. - """ - # Pass rev to pre-filter the list. - output = cls.run_command(['show-ref', rev], cwd=dest, - show_stdout=False, on_returncode='ignore') - refs = {} - for line in output.strip().splitlines(): - try: - sha, ref = line.split() - except ValueError: - # Include the offending line to simplify troubleshooting if - # this error ever occurs. - raise ValueError('unexpected show-ref line: {!r}'.format(line)) - - refs[ref] = sha - - branch_ref = 'refs/remotes/origin/{}'.format(rev) - tag_ref = 'refs/tags/{}'.format(rev) - - sha = refs.get(branch_ref) - if sha is not None: - return (sha, True) - - sha = refs.get(tag_ref) - - return (sha, False) - - @classmethod - def resolve_revision(cls, dest, url, rev_options): - """ - Resolve a revision to a new RevOptions object with the SHA1 of the - branch, tag, or ref if found. - - Args: - rev_options: a RevOptions object. - """ - rev = rev_options.arg_rev - sha, is_branch = cls.get_revision_sha(dest, rev) - - if sha is not None: - rev_options = rev_options.make_new(sha) - rev_options.branch_name = rev if is_branch else None - - return rev_options - - # Do not show a warning for the common case of something that has - # the form of a Git commit hash. - if not looks_like_hash(rev): - logger.warning( - "Did not find branch or tag '%s', assuming revision or ref.", - rev, - ) - - if not rev.startswith('refs/'): - return rev_options - - # If it looks like a ref, we have to fetch it explicitly. - cls.run_command( - ['fetch', '-q', url] + rev_options.to_args(), - cwd=dest, - ) - # Change the revision to the SHA of the ref we fetched - sha = cls.get_revision(dest, rev='FETCH_HEAD') - rev_options = rev_options.make_new(sha) - - return rev_options - - @classmethod - def is_commit_id_equal(cls, dest, name): - """ - Return whether the current commit hash equals the given name. - - Args: - dest: the repository directory. - name: a string name. - """ - if not name: - # Then avoid an unnecessary subprocess call. - return False - - return cls.get_revision(dest) == name - - @classmethod - def fetch_new(cls, dest, url, rev_options): - rev_display = rev_options.to_display() - logger.info( - 'Cloning %s%s to %s', redact_password_from_url(url), - rev_display, display_path(dest), - ) - cls.run_command(['clone', '-q', url, dest]) - - if rev_options.rev: - # Then a specific revision was requested. - rev_options = cls.resolve_revision(dest, url, rev_options) - branch_name = getattr(rev_options, 'branch_name', None) - if branch_name is None: - # Only do a checkout if the current commit id doesn't match - # the requested revision. - if not cls.is_commit_id_equal(dest, rev_options.rev): - cmd_args = ['checkout', '-q'] + rev_options.to_args() - cls.run_command(cmd_args, cwd=dest) - elif cls.get_current_branch(dest) != branch_name: - # Then a specific branch was requested, and that branch - # is not yet checked out. - track_branch = 'origin/{}'.format(branch_name) - cmd_args = [ - 'checkout', '-b', branch_name, '--track', track_branch, - ] - cls.run_command(cmd_args, cwd=dest) - - #: repo may contain submodules - cls.update_submodules(dest) - - def switch(self, dest, url, rev_options): - self.run_command(['config', 'remote.origin.url', url], cwd=dest) - cmd_args = ['checkout', '-q'] + rev_options.to_args() - self.run_command(cmd_args, cwd=dest) - - self.update_submodules(dest) - - def update(self, dest, url, rev_options): - # First fetch changes from the default remote - if self.get_git_version() >= parse_version('1.9.0'): - # fetch tags in addition to everything else - self.run_command(['fetch', '-q', '--tags'], cwd=dest) - else: - self.run_command(['fetch', '-q'], cwd=dest) - # Then reset to wanted revision (maybe even origin/master) - rev_options = self.resolve_revision(dest, url, rev_options) - cmd_args = ['reset', '--hard', '-q'] + rev_options.to_args() - self.run_command(cmd_args, cwd=dest) - #: update submodules - self.update_submodules(dest) - - @classmethod - def get_remote_url(cls, location): - """ - Return URL of the first remote encountered. - - Raises RemoteNotFoundError if the repository does not have a remote - url configured. - """ - # We need to pass 1 for extra_ok_returncodes since the command - # exits with return code 1 if there are no matching lines. - stdout = cls.run_command( - ['config', '--get-regexp', r'remote\..*\.url'], - extra_ok_returncodes=(1, ), show_stdout=False, cwd=location, - ) - remotes = stdout.splitlines() - try: - found_remote = remotes[0] - except IndexError: - raise RemoteNotFoundError - - for remote in remotes: - if remote.startswith('remote.origin.url '): - found_remote = remote - break - url = found_remote.split(' ')[1] - return url.strip() - - @classmethod - def get_revision(cls, location, rev=None): - if rev is None: - rev = 'HEAD' - current_rev = cls.run_command( - ['rev-parse', rev], show_stdout=False, cwd=location, - ) - return current_rev.strip() - - @classmethod - def get_subdirectory(cls, location): - # find the repo root - git_dir = cls.run_command(['rev-parse', '--git-dir'], - show_stdout=False, cwd=location).strip() - if not os.path.isabs(git_dir): - git_dir = os.path.join(location, git_dir) - root_dir = os.path.join(git_dir, '..') - # find setup.py - orig_location = location - while not os.path.exists(os.path.join(location, 'setup.py')): - last_location = location - location = os.path.dirname(location) - if location == last_location: - # We've traversed up to the root of the filesystem without - # finding setup.py - logger.warning( - "Could not find setup.py for directory %s (tried all " - "parent directories)", - orig_location, - ) - return None - # relative path of setup.py to repo root - if samefile(root_dir, location): - return None - return os.path.relpath(location, root_dir) - - @classmethod - def get_url_rev_and_auth(cls, url): - """ - Prefixes stub URLs like 'user@hostname:user/repo.git' with 'ssh://'. - That's required because although they use SSH they sometimes don't - work with a ssh:// scheme (e.g. GitHub). But we need a scheme for - parsing. Hence we remove it again afterwards and return it as a stub. - """ - if '://' not in url: - assert 'file:' not in url - url = url.replace('git+', 'git+ssh://') - url, rev, user_pass = super(Git, cls).get_url_rev_and_auth(url) - url = url.replace('ssh://', '') - else: - url, rev, user_pass = super(Git, cls).get_url_rev_and_auth(url) - - return url, rev, user_pass - - @classmethod - def update_submodules(cls, location): - if not os.path.exists(os.path.join(location, '.gitmodules')): - return - cls.run_command( - ['submodule', 'update', '--init', '--recursive', '-q'], - cwd=location, - ) - - @classmethod - def controls_location(cls, location): - if super(Git, cls).controls_location(location): - return True - try: - r = cls.run_command(['rev-parse'], - cwd=location, - show_stdout=False, - on_returncode='ignore') - return not r - except BadCommand: - logger.debug("could not determine if %s is under git control " - "because git is not available", location) - return False - - -vcs.register(Git) diff --git a/env/lib/python3.7/site-packages/pip/_internal/vcs/mercurial.py b/env/lib/python3.7/site-packages/pip/_internal/vcs/mercurial.py deleted file mode 100644 index 81edc4a..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/vcs/mercurial.py +++ /dev/null @@ -1,105 +0,0 @@ -from __future__ import absolute_import - -import logging -import os - -from pip._vendor.six.moves import configparser - -from pip._internal.download import path_to_url -from pip._internal.utils.misc import display_path -from pip._internal.utils.temp_dir import TempDirectory -from pip._internal.vcs import VersionControl, vcs - -logger = logging.getLogger(__name__) - - -class Mercurial(VersionControl): - name = 'hg' - dirname = '.hg' - repo_name = 'clone' - schemes = ('hg', 'hg+http', 'hg+https', 'hg+ssh', 'hg+static-http') - - @staticmethod - def get_base_rev_args(rev): - return [rev] - - def export(self, location): - """Export the Hg repository at the url to the destination location""" - with TempDirectory(kind="export") as temp_dir: - self.unpack(temp_dir.path) - - self.run_command( - ['archive', location], show_stdout=False, cwd=temp_dir.path - ) - - @classmethod - def fetch_new(cls, dest, url, rev_options): - rev_display = rev_options.to_display() - logger.info( - 'Cloning hg %s%s to %s', - url, - rev_display, - display_path(dest), - ) - cls.run_command(['clone', '--noupdate', '-q', url, dest]) - cmd_args = ['update', '-q'] + rev_options.to_args() - cls.run_command(cmd_args, cwd=dest) - - def switch(self, dest, url, rev_options): - repo_config = os.path.join(dest, self.dirname, 'hgrc') - config = configparser.SafeConfigParser() - try: - config.read(repo_config) - config.set('paths', 'default', url) - with open(repo_config, 'w') as config_file: - config.write(config_file) - except (OSError, configparser.NoSectionError) as exc: - logger.warning( - 'Could not switch Mercurial repository to %s: %s', url, exc, - ) - else: - cmd_args = ['update', '-q'] + rev_options.to_args() - self.run_command(cmd_args, cwd=dest) - - def update(self, dest, url, rev_options): - self.run_command(['pull', '-q'], cwd=dest) - cmd_args = ['update', '-q'] + rev_options.to_args() - self.run_command(cmd_args, cwd=dest) - - @classmethod - def get_remote_url(cls, location): - url = cls.run_command( - ['showconfig', 'paths.default'], - show_stdout=False, cwd=location).strip() - if cls._is_local_repository(url): - url = path_to_url(url) - return url.strip() - - @classmethod - def get_revision(cls, location): - """ - Return the repository-local changeset revision number, as an integer. - """ - current_revision = cls.run_command( - ['parents', '--template={rev}'], - show_stdout=False, cwd=location).strip() - return current_revision - - @classmethod - def get_requirement_revision(cls, location): - """ - Return the changeset identification hash, as a 40-character - hexadecimal string - """ - current_rev_hash = cls.run_command( - ['parents', '--template={node}'], - show_stdout=False, cwd=location).strip() - return current_rev_hash - - @classmethod - def is_commit_id_equal(cls, dest, name): - """Always assume the versions don't match""" - return False - - -vcs.register(Mercurial) diff --git a/env/lib/python3.7/site-packages/pip/_internal/vcs/subversion.py b/env/lib/python3.7/site-packages/pip/_internal/vcs/subversion.py deleted file mode 100644 index 01bb161..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/vcs/subversion.py +++ /dev/null @@ -1,234 +0,0 @@ -from __future__ import absolute_import - -import logging -import os -import re - -from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import ( - display_path, rmtree, split_auth_from_netloc, -) -from pip._internal.utils.typing import MYPY_CHECK_RUNNING -from pip._internal.vcs import VersionControl, vcs - -_svn_xml_url_re = re.compile('url="([^"]+)"') -_svn_rev_re = re.compile(r'committed-rev="(\d+)"') -_svn_info_xml_rev_re = re.compile(r'\s*revision="(\d+)"') -_svn_info_xml_url_re = re.compile(r'<url>(.*)</url>') - - -if MYPY_CHECK_RUNNING: - from typing import Optional, Tuple - -logger = logging.getLogger(__name__) - - -class Subversion(VersionControl): - name = 'svn' - dirname = '.svn' - repo_name = 'checkout' - schemes = ('svn', 'svn+ssh', 'svn+http', 'svn+https', 'svn+svn') - - @classmethod - def should_add_vcs_url_prefix(cls, remote_url): - return True - - @staticmethod - def get_base_rev_args(rev): - return ['-r', rev] - - def get_vcs_version(self): - # type: () -> Optional[Tuple[int, ...]] - """Return the version of the currently installed Subversion client. - - :return: A tuple containing the parts of the version information or - ``None`` if the version returned from ``svn`` could not be parsed. - :raises: BadCommand: If ``svn`` is not installed. - """ - # Example versions: - # svn, version 1.10.3 (r1842928) - # compiled Feb 25 2019, 14:20:39 on x86_64-apple-darwin17.0.0 - # svn, version 1.7.14 (r1542130) - # compiled Mar 28 2018, 08:49:13 on x86_64-pc-linux-gnu - version_prefix = 'svn, version ' - version = self.run_command(['--version'], show_stdout=False) - if not version.startswith(version_prefix): - return None - - version = version[len(version_prefix):].split()[0] - version_list = version.split('.') - try: - parsed_version = tuple(map(int, version_list)) - except ValueError: - return None - - if not parsed_version: - return None - - return parsed_version - - def export(self, location): - """Export the svn repository at the url to the destination location""" - url, rev_options = self.get_url_rev_options(self.url) - - logger.info('Exporting svn repository %s to %s', url, location) - with indent_log(): - if os.path.exists(location): - # Subversion doesn't like to check out over an existing - # directory --force fixes this, but was only added in svn 1.5 - rmtree(location) - cmd_args = ['export'] + rev_options.to_args() + [url, location] - self.run_command(cmd_args, show_stdout=False) - - @classmethod - def fetch_new(cls, dest, url, rev_options): - rev_display = rev_options.to_display() - logger.info( - 'Checking out %s%s to %s', - url, - rev_display, - display_path(dest), - ) - cmd_args = ['checkout', '-q'] + rev_options.to_args() + [url, dest] - cls.run_command(cmd_args) - - def switch(self, dest, url, rev_options): - cmd_args = ['switch'] + rev_options.to_args() + [url, dest] - self.run_command(cmd_args) - - def update(self, dest, url, rev_options): - cmd_args = ['update'] + rev_options.to_args() + [dest] - self.run_command(cmd_args) - - @classmethod - def get_revision(cls, location): - """ - Return the maximum revision for all files under a given location - """ - # Note: taken from setuptools.command.egg_info - revision = 0 - - for base, dirs, files in os.walk(location): - if cls.dirname not in dirs: - dirs[:] = [] - continue # no sense walking uncontrolled subdirs - dirs.remove(cls.dirname) - entries_fn = os.path.join(base, cls.dirname, 'entries') - if not os.path.exists(entries_fn): - # FIXME: should we warn? - continue - - dirurl, localrev = cls._get_svn_url_rev(base) - - if base == location: - base = dirurl + '/' # save the root url - elif not dirurl or not dirurl.startswith(base): - dirs[:] = [] - continue # not part of the same svn tree, skip it - revision = max(revision, localrev) - return revision - - @classmethod - def get_netloc_and_auth(cls, netloc, scheme): - """ - This override allows the auth information to be passed to svn via the - --username and --password options instead of via the URL. - """ - if scheme == 'ssh': - # The --username and --password options can't be used for - # svn+ssh URLs, so keep the auth information in the URL. - return super(Subversion, cls).get_netloc_and_auth(netloc, scheme) - - return split_auth_from_netloc(netloc) - - @classmethod - def get_url_rev_and_auth(cls, url): - # hotfix the URL scheme after removing svn+ from svn+ssh:// readd it - url, rev, user_pass = super(Subversion, cls).get_url_rev_and_auth(url) - if url.startswith('ssh://'): - url = 'svn+' + url - return url, rev, user_pass - - @staticmethod - def make_rev_args(username, password): - extra_args = [] - if username: - extra_args += ['--username', username] - if password: - extra_args += ['--password', password] - - return extra_args - - @classmethod - def get_remote_url(cls, location): - # In cases where the source is in a subdirectory, not alongside - # setup.py we have to look up in the location until we find a real - # setup.py - orig_location = location - while not os.path.exists(os.path.join(location, 'setup.py')): - last_location = location - location = os.path.dirname(location) - if location == last_location: - # We've traversed up to the root of the filesystem without - # finding setup.py - logger.warning( - "Could not find setup.py for directory %s (tried all " - "parent directories)", - orig_location, - ) - return None - - return cls._get_svn_url_rev(location)[0] - - @classmethod - def _get_svn_url_rev(cls, location): - from pip._internal.exceptions import InstallationError - - entries_path = os.path.join(location, cls.dirname, 'entries') - if os.path.exists(entries_path): - with open(entries_path) as f: - data = f.read() - else: # subversion >= 1.7 does not have the 'entries' file - data = '' - - if (data.startswith('8') or - data.startswith('9') or - data.startswith('10')): - data = list(map(str.splitlines, data.split('\n\x0c\n'))) - del data[0][0] # get rid of the '8' - url = data[0][3] - revs = [int(d[9]) for d in data if len(d) > 9 and d[9]] + [0] - elif data.startswith('<?xml'): - match = _svn_xml_url_re.search(data) - if not match: - raise ValueError('Badly formatted data: %r' % data) - url = match.group(1) # get repository URL - revs = [int(m.group(1)) for m in _svn_rev_re.finditer(data)] + [0] - else: - try: - # subversion >= 1.7 - xml = cls.run_command( - ['info', '--xml', location], - show_stdout=False, - ) - url = _svn_info_xml_url_re.search(xml).group(1) - revs = [ - int(m.group(1)) for m in _svn_info_xml_rev_re.finditer(xml) - ] - except InstallationError: - url, revs = None, [] - - if revs: - rev = max(revs) - else: - rev = 0 - - return url, rev - - @classmethod - def is_commit_id_equal(cls, dest, name): - """Always assume the versions don't match""" - return False - - -vcs.register(Subversion) diff --git a/env/lib/python3.7/site-packages/pip/_internal/wheel.py b/env/lib/python3.7/site-packages/pip/_internal/wheel.py deleted file mode 100644 index 1bdbe93..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/wheel.py +++ /dev/null @@ -1,1098 +0,0 @@ -""" -Support for installing and building the "wheel" binary package format. -""" -from __future__ import absolute_import - -import collections -import compileall -import csv -import hashlib -import logging -import os.path -import re -import shutil -import stat -import sys -import warnings -from base64 import urlsafe_b64encode -from email.parser import Parser - -from pip._vendor import pkg_resources -from pip._vendor.distlib.scripts import ScriptMaker -from pip._vendor.packaging.utils import canonicalize_name -from pip._vendor.six import StringIO - -from pip._internal import pep425tags -from pip._internal.download import path_to_url, unpack_url -from pip._internal.exceptions import ( - InstallationError, InvalidWheelFilename, UnsupportedWheel, -) -from pip._internal.locations import ( - PIP_DELETE_MARKER_FILENAME, distutils_scheme, -) -from pip._internal.models.link import Link -from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import ( - LOG_DIVIDER, call_subprocess, captured_stdout, ensure_dir, - format_command_args, read_chunks, -) -from pip._internal.utils.setuptools_build import SETUPTOOLS_SHIM -from pip._internal.utils.temp_dir import TempDirectory -from pip._internal.utils.typing import MYPY_CHECK_RUNNING -from pip._internal.utils.ui import open_spinner - -if MYPY_CHECK_RUNNING: - from typing import ( - Dict, List, Optional, Sequence, Mapping, Tuple, IO, Text, Any, Iterable - ) - from pip._vendor.packaging.requirements import Requirement - from pip._internal.req.req_install import InstallRequirement - from pip._internal.download import PipSession - from pip._internal.index import FormatControl, PackageFinder - from pip._internal.operations.prepare import ( - RequirementPreparer - ) - from pip._internal.cache import WheelCache - from pip._internal.pep425tags import Pep425Tag - - InstalledCSVRow = Tuple[str, ...] - - -VERSION_COMPATIBLE = (1, 0) - - -logger = logging.getLogger(__name__) - - -def normpath(src, p): - return os.path.relpath(src, p).replace(os.path.sep, '/') - - -def rehash(path, blocksize=1 << 20): - # type: (str, int) -> Tuple[str, str] - """Return (hash, length) for path using hashlib.sha256()""" - h = hashlib.sha256() - length = 0 - with open(path, 'rb') as f: - for block in read_chunks(f, size=blocksize): - length += len(block) - h.update(block) - digest = 'sha256=' + urlsafe_b64encode( - h.digest() - ).decode('latin1').rstrip('=') - # unicode/str python2 issues - return (digest, str(length)) # type: ignore - - -def open_for_csv(name, mode): - # type: (str, Text) -> IO - if sys.version_info[0] < 3: - nl = {} # type: Dict[str, Any] - bin = 'b' - else: - nl = {'newline': ''} # type: Dict[str, Any] - bin = '' - return open(name, mode + bin, **nl) - - -def replace_python_tag(wheelname, new_tag): - # type: (str, str) -> str - """Replace the Python tag in a wheel file name with a new value. - """ - parts = wheelname.split('-') - parts[-3] = new_tag - return '-'.join(parts) - - -def fix_script(path): - # type: (str) -> Optional[bool] - """Replace #!python with #!/path/to/python - Return True if file was changed.""" - # XXX RECORD hashes will need to be updated - if os.path.isfile(path): - with open(path, 'rb') as script: - firstline = script.readline() - if not firstline.startswith(b'#!python'): - return False - exename = sys.executable.encode(sys.getfilesystemencoding()) - firstline = b'#!' + exename + os.linesep.encode("ascii") - rest = script.read() - with open(path, 'wb') as script: - script.write(firstline) - script.write(rest) - return True - return None - - -dist_info_re = re.compile(r"""^(?P<namever>(?P<name>.+?)(-(?P<ver>.+?))?) - \.dist-info$""", re.VERBOSE) - - -def root_is_purelib(name, wheeldir): - # type: (str, str) -> bool - """ - Return True if the extracted wheel in wheeldir should go into purelib. - """ - name_folded = name.replace("-", "_") - for item in os.listdir(wheeldir): - match = dist_info_re.match(item) - if match and match.group('name') == name_folded: - with open(os.path.join(wheeldir, item, 'WHEEL')) as wheel: - for line in wheel: - line = line.lower().rstrip() - if line == "root-is-purelib: true": - return True - return False - - -def get_entrypoints(filename): - # type: (str) -> Tuple[Dict[str, str], Dict[str, str]] - if not os.path.exists(filename): - return {}, {} - - # This is done because you can pass a string to entry_points wrappers which - # means that they may or may not be valid INI files. The attempt here is to - # strip leading and trailing whitespace in order to make them valid INI - # files. - with open(filename) as fp: - data = StringIO() - for line in fp: - data.write(line.strip()) - data.write("\n") - data.seek(0) - - # get the entry points and then the script names - entry_points = pkg_resources.EntryPoint.parse_map(data) - console = entry_points.get('console_scripts', {}) - gui = entry_points.get('gui_scripts', {}) - - def _split_ep(s): - """get the string representation of EntryPoint, remove space and split - on '='""" - return str(s).replace(" ", "").split("=") - - # convert the EntryPoint objects into strings with module:function - console = dict(_split_ep(v) for v in console.values()) - gui = dict(_split_ep(v) for v in gui.values()) - return console, gui - - -def message_about_scripts_not_on_PATH(scripts): - # type: (Sequence[str]) -> Optional[str] - """Determine if any scripts are not on PATH and format a warning. - - Returns a warning message if one or more scripts are not on PATH, - otherwise None. - """ - if not scripts: - return None - - # Group scripts by the path they were installed in - grouped_by_dir = collections.defaultdict(set) # type: Dict[str, set] - for destfile in scripts: - parent_dir = os.path.dirname(destfile) - script_name = os.path.basename(destfile) - grouped_by_dir[parent_dir].add(script_name) - - # We don't want to warn for directories that are on PATH. - not_warn_dirs = [ - os.path.normcase(i).rstrip(os.sep) for i in - os.environ.get("PATH", "").split(os.pathsep) - ] - # If an executable sits with sys.executable, we don't warn for it. - # This covers the case of venv invocations without activating the venv. - not_warn_dirs.append(os.path.normcase(os.path.dirname(sys.executable))) - warn_for = { - parent_dir: scripts for parent_dir, scripts in grouped_by_dir.items() - if os.path.normcase(parent_dir) not in not_warn_dirs - } - if not warn_for: - return None - - # Format a message - msg_lines = [] - for parent_dir, scripts in warn_for.items(): - sorted_scripts = sorted(scripts) # type: List[str] - if len(sorted_scripts) == 1: - start_text = "script {} is".format(sorted_scripts[0]) - else: - start_text = "scripts {} are".format( - ", ".join(sorted_scripts[:-1]) + " and " + sorted_scripts[-1] - ) - - msg_lines.append( - "The {} installed in '{}' which is not on PATH." - .format(start_text, parent_dir) - ) - - last_line_fmt = ( - "Consider adding {} to PATH or, if you prefer " - "to suppress this warning, use --no-warn-script-location." - ) - if len(msg_lines) == 1: - msg_lines.append(last_line_fmt.format("this directory")) - else: - msg_lines.append(last_line_fmt.format("these directories")) - - # Returns the formatted multiline message - return "\n".join(msg_lines) - - -def sorted_outrows(outrows): - # type: (Iterable[InstalledCSVRow]) -> List[InstalledCSVRow] - """ - Return the given rows of a RECORD file in sorted order. - - Each row is a 3-tuple (path, hash, size) and corresponds to a record of - a RECORD file (see PEP 376 and PEP 427 for details). For the rows - passed to this function, the size can be an integer as an int or string, - or the empty string. - """ - # Normally, there should only be one row per path, in which case the - # second and third elements don't come into play when sorting. - # However, in cases in the wild where a path might happen to occur twice, - # we don't want the sort operation to trigger an error (but still want - # determinism). Since the third element can be an int or string, we - # coerce each element to a string to avoid a TypeError in this case. - # For additional background, see-- - # https://github.com/pypa/pip/issues/5868 - return sorted(outrows, key=lambda row: tuple(str(x) for x in row)) - - -def get_csv_rows_for_installed( - old_csv_rows, # type: Iterable[List[str]] - installed, # type: Dict[str, str] - changed, # type: set - generated, # type: List[str] - lib_dir, # type: str -): - # type: (...) -> List[InstalledCSVRow] - """ - :param installed: A map from archive RECORD path to installation RECORD - path. - """ - installed_rows = [] # type: List[InstalledCSVRow] - for row in old_csv_rows: - if len(row) > 3: - logger.warning( - 'RECORD line has more than three elements: {}'.format(row) - ) - # Make a copy because we are mutating the row. - row = list(row) - old_path = row[0] - new_path = installed.pop(old_path, old_path) - row[0] = new_path - if new_path in changed: - digest, length = rehash(new_path) - row[1] = digest - row[2] = length - installed_rows.append(tuple(row)) - for f in generated: - digest, length = rehash(f) - installed_rows.append((normpath(f, lib_dir), digest, str(length))) - for f in installed: - installed_rows.append((installed[f], '', '')) - return installed_rows - - -def move_wheel_files( - name, # type: str - req, # type: Requirement - wheeldir, # type: str - user=False, # type: bool - home=None, # type: Optional[str] - root=None, # type: Optional[str] - pycompile=True, # type: bool - scheme=None, # type: Optional[Mapping[str, str]] - isolated=False, # type: bool - prefix=None, # type: Optional[str] - warn_script_location=True # type: bool -): - # type: (...) -> None - """Install a wheel""" - # TODO: Investigate and break this up. - # TODO: Look into moving this into a dedicated class for representing an - # installation. - - if not scheme: - scheme = distutils_scheme( - name, user=user, home=home, root=root, isolated=isolated, - prefix=prefix, - ) - - if root_is_purelib(name, wheeldir): - lib_dir = scheme['purelib'] - else: - lib_dir = scheme['platlib'] - - info_dir = [] # type: List[str] - data_dirs = [] - source = wheeldir.rstrip(os.path.sep) + os.path.sep - - # Record details of the files moved - # installed = files copied from the wheel to the destination - # changed = files changed while installing (scripts #! line typically) - # generated = files newly generated during the install (script wrappers) - installed = {} # type: Dict[str, str] - changed = set() - generated = [] # type: List[str] - - # Compile all of the pyc files that we're going to be installing - if pycompile: - with captured_stdout() as stdout: - with warnings.catch_warnings(): - warnings.filterwarnings('ignore') - compileall.compile_dir(source, force=True, quiet=True) - logger.debug(stdout.getvalue()) - - def record_installed(srcfile, destfile, modified=False): - """Map archive RECORD paths to installation RECORD paths.""" - oldpath = normpath(srcfile, wheeldir) - newpath = normpath(destfile, lib_dir) - installed[oldpath] = newpath - if modified: - changed.add(destfile) - - def clobber(source, dest, is_base, fixer=None, filter=None): - ensure_dir(dest) # common for the 'include' path - - for dir, subdirs, files in os.walk(source): - basedir = dir[len(source):].lstrip(os.path.sep) - destdir = os.path.join(dest, basedir) - if is_base and basedir.split(os.path.sep, 1)[0].endswith('.data'): - continue - for s in subdirs: - destsubdir = os.path.join(dest, basedir, s) - if is_base and basedir == '' and destsubdir.endswith('.data'): - data_dirs.append(s) - continue - elif (is_base and - s.endswith('.dist-info') and - canonicalize_name(s).startswith( - canonicalize_name(req.name))): - assert not info_dir, ('Multiple .dist-info directories: ' + - destsubdir + ', ' + - ', '.join(info_dir)) - info_dir.append(destsubdir) - for f in files: - # Skip unwanted files - if filter and filter(f): - continue - srcfile = os.path.join(dir, f) - destfile = os.path.join(dest, basedir, f) - # directory creation is lazy and after the file filtering above - # to ensure we don't install empty dirs; empty dirs can't be - # uninstalled. - ensure_dir(destdir) - - # copyfile (called below) truncates the destination if it - # exists and then writes the new contents. This is fine in most - # cases, but can cause a segfault if pip has loaded a shared - # object (e.g. from pyopenssl through its vendored urllib3) - # Since the shared object is mmap'd an attempt to call a - # symbol in it will then cause a segfault. Unlinking the file - # allows writing of new contents while allowing the process to - # continue to use the old copy. - if os.path.exists(destfile): - os.unlink(destfile) - - # We use copyfile (not move, copy, or copy2) to be extra sure - # that we are not moving directories over (copyfile fails for - # directories) as well as to ensure that we are not copying - # over any metadata because we want more control over what - # metadata we actually copy over. - shutil.copyfile(srcfile, destfile) - - # Copy over the metadata for the file, currently this only - # includes the atime and mtime. - st = os.stat(srcfile) - if hasattr(os, "utime"): - os.utime(destfile, (st.st_atime, st.st_mtime)) - - # If our file is executable, then make our destination file - # executable. - if os.access(srcfile, os.X_OK): - st = os.stat(srcfile) - permissions = ( - st.st_mode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH - ) - os.chmod(destfile, permissions) - - changed = False - if fixer: - changed = fixer(destfile) - record_installed(srcfile, destfile, changed) - - clobber(source, lib_dir, True) - - assert info_dir, "%s .dist-info directory not found" % req - - # Get the defined entry points - ep_file = os.path.join(info_dir[0], 'entry_points.txt') - console, gui = get_entrypoints(ep_file) - - def is_entrypoint_wrapper(name): - # EP, EP.exe and EP-script.py are scripts generated for - # entry point EP by setuptools - if name.lower().endswith('.exe'): - matchname = name[:-4] - elif name.lower().endswith('-script.py'): - matchname = name[:-10] - elif name.lower().endswith(".pya"): - matchname = name[:-4] - else: - matchname = name - # Ignore setuptools-generated scripts - return (matchname in console or matchname in gui) - - for datadir in data_dirs: - fixer = None - filter = None - for subdir in os.listdir(os.path.join(wheeldir, datadir)): - fixer = None - if subdir == 'scripts': - fixer = fix_script - filter = is_entrypoint_wrapper - source = os.path.join(wheeldir, datadir, subdir) - dest = scheme[subdir] - clobber(source, dest, False, fixer=fixer, filter=filter) - - maker = ScriptMaker(None, scheme['scripts']) - - # Ensure old scripts are overwritten. - # See https://github.com/pypa/pip/issues/1800 - maker.clobber = True - - # Ensure we don't generate any variants for scripts because this is almost - # never what somebody wants. - # See https://bitbucket.org/pypa/distlib/issue/35/ - maker.variants = {''} - - # This is required because otherwise distlib creates scripts that are not - # executable. - # See https://bitbucket.org/pypa/distlib/issue/32/ - maker.set_mode = True - - # Simplify the script and fix the fact that the default script swallows - # every single stack trace. - # See https://bitbucket.org/pypa/distlib/issue/34/ - # See https://bitbucket.org/pypa/distlib/issue/33/ - def _get_script_text(entry): - if entry.suffix is None: - raise InstallationError( - "Invalid script entry point: %s for req: %s - A callable " - "suffix is required. Cf https://packaging.python.org/en/" - "latest/distributing.html#console-scripts for more " - "information." % (entry, req) - ) - return maker.script_template % { - "module": entry.prefix, - "import_name": entry.suffix.split(".")[0], - "func": entry.suffix, - } - # ignore type, because mypy disallows assigning to a method, - # see https://github.com/python/mypy/issues/2427 - maker._get_script_text = _get_script_text # type: ignore - maker.script_template = r"""# -*- coding: utf-8 -*- -import re -import sys - -from %(module)s import %(import_name)s - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit(%(func)s()) -""" - - # Special case pip and setuptools to generate versioned wrappers - # - # The issue is that some projects (specifically, pip and setuptools) use - # code in setup.py to create "versioned" entry points - pip2.7 on Python - # 2.7, pip3.3 on Python 3.3, etc. But these entry points are baked into - # the wheel metadata at build time, and so if the wheel is installed with - # a *different* version of Python the entry points will be wrong. The - # correct fix for this is to enhance the metadata to be able to describe - # such versioned entry points, but that won't happen till Metadata 2.0 is - # available. - # In the meantime, projects using versioned entry points will either have - # incorrect versioned entry points, or they will not be able to distribute - # "universal" wheels (i.e., they will need a wheel per Python version). - # - # Because setuptools and pip are bundled with _ensurepip and virtualenv, - # we need to use universal wheels. So, as a stopgap until Metadata 2.0, we - # override the versioned entry points in the wheel and generate the - # correct ones. This code is purely a short-term measure until Metadata 2.0 - # is available. - # - # To add the level of hack in this section of code, in order to support - # ensurepip this code will look for an ``ENSUREPIP_OPTIONS`` environment - # variable which will control which version scripts get installed. - # - # ENSUREPIP_OPTIONS=altinstall - # - Only pipX.Y and easy_install-X.Y will be generated and installed - # ENSUREPIP_OPTIONS=install - # - pipX.Y, pipX, easy_install-X.Y will be generated and installed. Note - # that this option is technically if ENSUREPIP_OPTIONS is set and is - # not altinstall - # DEFAULT - # - The default behavior is to install pip, pipX, pipX.Y, easy_install - # and easy_install-X.Y. - pip_script = console.pop('pip', None) - if pip_script: - if "ENSUREPIP_OPTIONS" not in os.environ: - spec = 'pip = ' + pip_script - generated.extend(maker.make(spec)) - - if os.environ.get("ENSUREPIP_OPTIONS", "") != "altinstall": - spec = 'pip%s = %s' % (sys.version[:1], pip_script) - generated.extend(maker.make(spec)) - - spec = 'pip%s = %s' % (sys.version[:3], pip_script) - generated.extend(maker.make(spec)) - # Delete any other versioned pip entry points - pip_ep = [k for k in console if re.match(r'pip(\d(\.\d)?)?$', k)] - for k in pip_ep: - del console[k] - easy_install_script = console.pop('easy_install', None) - if easy_install_script: - if "ENSUREPIP_OPTIONS" not in os.environ: - spec = 'easy_install = ' + easy_install_script - generated.extend(maker.make(spec)) - - spec = 'easy_install-%s = %s' % (sys.version[:3], easy_install_script) - generated.extend(maker.make(spec)) - # Delete any other versioned easy_install entry points - easy_install_ep = [ - k for k in console if re.match(r'easy_install(-\d\.\d)?$', k) - ] - for k in easy_install_ep: - del console[k] - - # Generate the console and GUI entry points specified in the wheel - if len(console) > 0: - generated_console_scripts = maker.make_multiple( - ['%s = %s' % kv for kv in console.items()] - ) - generated.extend(generated_console_scripts) - - if warn_script_location: - msg = message_about_scripts_not_on_PATH(generated_console_scripts) - if msg is not None: - logger.warning(msg) - - if len(gui) > 0: - generated.extend( - maker.make_multiple( - ['%s = %s' % kv for kv in gui.items()], - {'gui': True} - ) - ) - - # Record pip as the installer - installer = os.path.join(info_dir[0], 'INSTALLER') - temp_installer = os.path.join(info_dir[0], 'INSTALLER.pip') - with open(temp_installer, 'wb') as installer_file: - installer_file.write(b'pip\n') - shutil.move(temp_installer, installer) - generated.append(installer) - - # Record details of all files installed - record = os.path.join(info_dir[0], 'RECORD') - temp_record = os.path.join(info_dir[0], 'RECORD.pip') - with open_for_csv(record, 'r') as record_in: - with open_for_csv(temp_record, 'w+') as record_out: - reader = csv.reader(record_in) - outrows = get_csv_rows_for_installed( - reader, installed=installed, changed=changed, - generated=generated, lib_dir=lib_dir, - ) - writer = csv.writer(record_out) - # Sort to simplify testing. - for row in sorted_outrows(outrows): - writer.writerow(row) - shutil.move(temp_record, record) - - -def wheel_version(source_dir): - # type: (Optional[str]) -> Optional[Tuple[int, ...]] - """ - Return the Wheel-Version of an extracted wheel, if possible. - - Otherwise, return None if we couldn't parse / extract it. - """ - try: - dist = [d for d in pkg_resources.find_on_path(None, source_dir)][0] - - wheel_data = dist.get_metadata('WHEEL') - wheel_data = Parser().parsestr(wheel_data) - - version = wheel_data['Wheel-Version'].strip() - version = tuple(map(int, version.split('.'))) - return version - except Exception: - return None - - -def check_compatibility(version, name): - # type: (Optional[Tuple[int, ...]], str) -> None - """ - Raises errors or warns if called with an incompatible Wheel-Version. - - Pip should refuse to install a Wheel-Version that's a major series - ahead of what it's compatible with (e.g 2.0 > 1.1); and warn when - installing a version only minor version ahead (e.g 1.2 > 1.1). - - version: a 2-tuple representing a Wheel-Version (Major, Minor) - name: name of wheel or package to raise exception about - - :raises UnsupportedWheel: when an incompatible Wheel-Version is given - """ - if not version: - raise UnsupportedWheel( - "%s is in an unsupported or invalid wheel" % name - ) - if version[0] > VERSION_COMPATIBLE[0]: - raise UnsupportedWheel( - "%s's Wheel-Version (%s) is not compatible with this version " - "of pip" % (name, '.'.join(map(str, version))) - ) - elif version > VERSION_COMPATIBLE: - logger.warning( - 'Installing from a newer Wheel-Version (%s)', - '.'.join(map(str, version)), - ) - - -class Wheel(object): - """A wheel file""" - - # TODO: Maybe move the class into the models sub-package - # TODO: Maybe move the install code into this class - - wheel_file_re = re.compile( - r"""^(?P<namever>(?P<name>.+?)-(?P<ver>.*?)) - ((-(?P<build>\d[^-]*?))?-(?P<pyver>.+?)-(?P<abi>.+?)-(?P<plat>.+?) - \.whl|\.dist-info)$""", - re.VERBOSE - ) - - def __init__(self, filename): - # type: (str) -> None - """ - :raises InvalidWheelFilename: when the filename is invalid for a wheel - """ - wheel_info = self.wheel_file_re.match(filename) - if not wheel_info: - raise InvalidWheelFilename( - "%s is not a valid wheel filename." % filename - ) - self.filename = filename - self.name = wheel_info.group('name').replace('_', '-') - # we'll assume "_" means "-" due to wheel naming scheme - # (https://github.com/pypa/pip/issues/1150) - self.version = wheel_info.group('ver').replace('_', '-') - self.build_tag = wheel_info.group('build') - self.pyversions = wheel_info.group('pyver').split('.') - self.abis = wheel_info.group('abi').split('.') - self.plats = wheel_info.group('plat').split('.') - - # All the tag combinations from this file - self.file_tags = { - (x, y, z) for x in self.pyversions - for y in self.abis for z in self.plats - } - - def support_index_min(self, tags=None): - # type: (Optional[List[Pep425Tag]]) -> Optional[int] - """ - Return the lowest index that one of the wheel's file_tag combinations - achieves in the supported_tags list e.g. if there are 8 supported tags, - and one of the file tags is first in the list, then return 0. Returns - None is the wheel is not supported. - """ - if tags is None: # for mock - tags = pep425tags.get_supported() - indexes = [tags.index(c) for c in self.file_tags if c in tags] - return min(indexes) if indexes else None - - def supported(self, tags=None): - # type: (Optional[List[Pep425Tag]]) -> bool - """Is this wheel supported on this system?""" - if tags is None: # for mock - tags = pep425tags.get_supported() - return bool(set(tags).intersection(self.file_tags)) - - -def _contains_egg_info( - s, _egg_info_re=re.compile(r'([a-z0-9_.]+)-([a-z0-9_.!+-]+)', re.I)): - """Determine whether the string looks like an egg_info. - - :param s: The string to parse. E.g. foo-2.1 - """ - return bool(_egg_info_re.search(s)) - - -def should_use_ephemeral_cache( - req, # type: InstallRequirement - format_control, # type: FormatControl - autobuilding, # type: bool - cache_available # type: bool -): - # type: (...) -> Optional[bool] - """ - Return whether to build an InstallRequirement object using the - ephemeral cache. - - :param cache_available: whether a cache directory is available for the - autobuilding=True case. - - :return: True or False to build the requirement with ephem_cache=True - or False, respectively; or None not to build the requirement. - """ - if req.constraint: - return None - if req.is_wheel: - if not autobuilding: - logger.info( - 'Skipping %s, due to already being wheel.', req.name, - ) - return None - if not autobuilding: - return False - - if req.editable or not req.source_dir: - return None - - if req.link and not req.link.is_artifact: - # VCS checkout. Build wheel just for this run. - return True - - if "binary" not in format_control.get_allowed_formats( - canonicalize_name(req.name)): - logger.info( - "Skipping bdist_wheel for %s, due to binaries " - "being disabled for it.", req.name, - ) - return None - - link = req.link - base, ext = link.splitext() - if cache_available and _contains_egg_info(base): - return False - - # Otherwise, build the wheel just for this run using the ephemeral - # cache since we are either in the case of e.g. a local directory, or - # no cache directory is available to use. - return True - - -def format_command_result( - command_args, # type: List[str] - command_output, # type: str -): - # type: (...) -> str - """ - Format command information for logging. - """ - command_desc = format_command_args(command_args) - text = 'Command arguments: {}\n'.format(command_desc) - - if not command_output: - text += 'Command output: None' - elif logger.getEffectiveLevel() > logging.DEBUG: - text += 'Command output: [use --verbose to show]' - else: - if not command_output.endswith('\n'): - command_output += '\n' - text += 'Command output:\n{}{}'.format(command_output, LOG_DIVIDER) - - return text - - -def get_legacy_build_wheel_path( - names, # type: List[str] - temp_dir, # type: str - req, # type: InstallRequirement - command_args, # type: List[str] - command_output, # type: str -): - # type: (...) -> Optional[str] - """ - Return the path to the wheel in the temporary build directory. - """ - # Sort for determinism. - names = sorted(names) - if not names: - msg = ( - 'Legacy build of wheel for {!r} created no files.\n' - ).format(req.name) - msg += format_command_result(command_args, command_output) - logger.warning(msg) - return None - - if len(names) > 1: - msg = ( - 'Legacy build of wheel for {!r} created more than one file.\n' - 'Filenames (choosing first): {}\n' - ).format(req.name, names) - msg += format_command_result(command_args, command_output) - logger.warning(msg) - - return os.path.join(temp_dir, names[0]) - - -class WheelBuilder(object): - """Build wheels from a RequirementSet.""" - - def __init__( - self, - finder, # type: PackageFinder - preparer, # type: RequirementPreparer - wheel_cache, # type: WheelCache - build_options=None, # type: Optional[List[str]] - global_options=None, # type: Optional[List[str]] - no_clean=False # type: bool - ): - # type: (...) -> None - self.finder = finder - self.preparer = preparer - self.wheel_cache = wheel_cache - - self._wheel_dir = preparer.wheel_download_dir - - self.build_options = build_options or [] - self.global_options = global_options or [] - self.no_clean = no_clean - - def _build_one(self, req, output_dir, python_tag=None): - """Build one wheel. - - :return: The filename of the built wheel, or None if the build failed. - """ - # Install build deps into temporary directory (PEP 518) - with req.build_env: - return self._build_one_inside_env(req, output_dir, - python_tag=python_tag) - - def _build_one_inside_env(self, req, output_dir, python_tag=None): - with TempDirectory(kind="wheel") as temp_dir: - if req.use_pep517: - builder = self._build_one_pep517 - else: - builder = self._build_one_legacy - wheel_path = builder(req, temp_dir.path, python_tag=python_tag) - if wheel_path is not None: - wheel_name = os.path.basename(wheel_path) - dest_path = os.path.join(output_dir, wheel_name) - try: - shutil.move(wheel_path, dest_path) - logger.info('Stored in directory: %s', output_dir) - return dest_path - except Exception: - pass - # Ignore return, we can't do anything else useful. - self._clean_one(req) - return None - - def _base_setup_args(self, req): - # NOTE: Eventually, we'd want to also -S to the flags here, when we're - # isolating. Currently, it breaks Python in virtualenvs, because it - # relies on site.py to find parts of the standard library outside the - # virtualenv. - return [ - sys.executable, '-u', '-c', - SETUPTOOLS_SHIM % req.setup_py - ] + list(self.global_options) - - def _build_one_pep517(self, req, tempd, python_tag=None): - """Build one InstallRequirement using the PEP 517 build process. - - Returns path to wheel if successfully built. Otherwise, returns None. - """ - assert req.metadata_directory is not None - if self.build_options: - # PEP 517 does not support --build-options - logger.error('Cannot build wheel for %s using PEP 517 when ' - '--build-options is present' % (req.name,)) - return None - try: - req.spin_message = 'Building wheel for %s (PEP 517)' % (req.name,) - logger.debug('Destination directory: %s', tempd) - wheel_name = req.pep517_backend.build_wheel( - tempd, - metadata_directory=req.metadata_directory - ) - if python_tag: - # General PEP 517 backends don't necessarily support - # a "--python-tag" option, so we rename the wheel - # file directly. - new_name = replace_python_tag(wheel_name, python_tag) - os.rename( - os.path.join(tempd, wheel_name), - os.path.join(tempd, new_name) - ) - # Reassign to simplify the return at the end of function - wheel_name = new_name - except Exception: - logger.error('Failed building wheel for %s', req.name) - return None - return os.path.join(tempd, wheel_name) - - def _build_one_legacy(self, req, tempd, python_tag=None): - """Build one InstallRequirement using the "legacy" build process. - - Returns path to wheel if successfully built. Otherwise, returns None. - """ - base_args = self._base_setup_args(req) - - spin_message = 'Building wheel for %s (setup.py)' % (req.name,) - with open_spinner(spin_message) as spinner: - logger.debug('Destination directory: %s', tempd) - wheel_args = base_args + ['bdist_wheel', '-d', tempd] \ - + self.build_options - - if python_tag is not None: - wheel_args += ["--python-tag", python_tag] - - try: - output = call_subprocess(wheel_args, cwd=req.setup_py_dir, - spinner=spinner) - except Exception: - spinner.finish("error") - logger.error('Failed building wheel for %s', req.name) - return None - names = os.listdir(tempd) - wheel_path = get_legacy_build_wheel_path( - names=names, - temp_dir=tempd, - req=req, - command_args=wheel_args, - command_output=output, - ) - return wheel_path - - def _clean_one(self, req): - base_args = self._base_setup_args(req) - - logger.info('Running setup.py clean for %s', req.name) - clean_args = base_args + ['clean', '--all'] - try: - call_subprocess(clean_args, cwd=req.source_dir) - return True - except Exception: - logger.error('Failed cleaning build dir for %s', req.name) - return False - - def build( - self, - requirements, # type: Iterable[InstallRequirement] - session, # type: PipSession - autobuilding=False # type: bool - ): - # type: (...) -> List[InstallRequirement] - """Build wheels. - - :param unpack: If True, replace the sdist we built from with the - newly built wheel, in preparation for installation. - :return: True if all the wheels built correctly. - """ - buildset = [] - format_control = self.finder.format_control - # Whether a cache directory is available for autobuilding=True. - cache_available = bool(self._wheel_dir or self.wheel_cache.cache_dir) - - for req in requirements: - ephem_cache = should_use_ephemeral_cache( - req, format_control=format_control, autobuilding=autobuilding, - cache_available=cache_available, - ) - if ephem_cache is None: - continue - - buildset.append((req, ephem_cache)) - - if not buildset: - return [] - - # Is any wheel build not using the ephemeral cache? - if any(not ephem_cache for _, ephem_cache in buildset): - have_directory_for_build = self._wheel_dir or ( - autobuilding and self.wheel_cache.cache_dir - ) - assert have_directory_for_build - - # TODO by @pradyunsg - # Should break up this method into 2 separate methods. - - # Build the wheels. - logger.info( - 'Building wheels for collected packages: %s', - ', '.join([req.name for (req, _) in buildset]), - ) - _cache = self.wheel_cache # shorter name - with indent_log(): - build_success, build_failure = [], [] - for req, ephem in buildset: - python_tag = None - if autobuilding: - python_tag = pep425tags.implementation_tag - if ephem: - output_dir = _cache.get_ephem_path_for_link(req.link) - else: - output_dir = _cache.get_path_for_link(req.link) - try: - ensure_dir(output_dir) - except OSError as e: - logger.warning("Building wheel for %s failed: %s", - req.name, e) - build_failure.append(req) - continue - else: - output_dir = self._wheel_dir - wheel_file = self._build_one( - req, output_dir, - python_tag=python_tag, - ) - if wheel_file: - build_success.append(req) - if autobuilding: - # XXX: This is mildly duplicative with prepare_files, - # but not close enough to pull out to a single common - # method. - # The code below assumes temporary source dirs - - # prevent it doing bad things. - if req.source_dir and not os.path.exists(os.path.join( - req.source_dir, PIP_DELETE_MARKER_FILENAME)): - raise AssertionError( - "bad source dir - missing marker") - # Delete the source we built the wheel from - req.remove_temporary_source() - # set the build directory again - name is known from - # the work prepare_files did. - req.source_dir = req.build_location( - self.preparer.build_dir - ) - # Update the link for this. - req.link = Link(path_to_url(wheel_file)) - assert req.link.is_wheel - # extract the wheel into the dir - unpack_url( - req.link, req.source_dir, None, False, - session=session, - ) - else: - build_failure.append(req) - - # notify success/failure - if build_success: - logger.info( - 'Successfully built %s', - ' '.join([req.name for req in build_success]), - ) - if build_failure: - logger.info( - 'Failed to build %s', - ' '.join([req.name for req in build_failure]), - ) - # Return a list of requirements that failed to build - return build_failure diff --git a/env/lib/python3.7/site-packages/pip/_vendor/__init__.py b/env/lib/python3.7/site-packages/pip/_vendor/__init__.py deleted file mode 100644 index c1d9508..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/__init__.py +++ /dev/null @@ -1,109 +0,0 @@ -""" -pip._vendor is for vendoring dependencies of pip to prevent needing pip to -depend on something external. - -Files inside of pip._vendor should be considered immutable and should only be -updated to versions from upstream. -""" -from __future__ import absolute_import - -import glob -import os.path -import sys - -# Downstream redistributors which have debundled our dependencies should also -# patch this value to be true. This will trigger the additional patching -# to cause things like "six" to be available as pip. -DEBUNDLED = False - -# By default, look in this directory for a bunch of .whl files which we will -# add to the beginning of sys.path before attempting to import anything. This -# is done to support downstream re-distributors like Debian and Fedora who -# wish to create their own Wheels for our dependencies to aid in debundling. -WHEEL_DIR = os.path.abspath(os.path.dirname(__file__)) - - -# Define a small helper function to alias our vendored modules to the real ones -# if the vendored ones do not exist. This idea of this was taken from -# https://github.com/kennethreitz/requests/pull/2567. -def vendored(modulename): - vendored_name = "{0}.{1}".format(__name__, modulename) - - try: - __import__(modulename, globals(), locals(), level=0) - except ImportError: - # We can just silently allow import failures to pass here. If we - # got to this point it means that ``import pip._vendor.whatever`` - # failed and so did ``import whatever``. Since we're importing this - # upfront in an attempt to alias imports, not erroring here will - # just mean we get a regular import error whenever pip *actually* - # tries to import one of these modules to use it, which actually - # gives us a better error message than we would have otherwise - # gotten. - pass - else: - sys.modules[vendored_name] = sys.modules[modulename] - base, head = vendored_name.rsplit(".", 1) - setattr(sys.modules[base], head, sys.modules[modulename]) - - -# If we're operating in a debundled setup, then we want to go ahead and trigger -# the aliasing of our vendored libraries as well as looking for wheels to add -# to our sys.path. This will cause all of this code to be a no-op typically -# however downstream redistributors can enable it in a consistent way across -# all platforms. -if DEBUNDLED: - # Actually look inside of WHEEL_DIR to find .whl files and add them to the - # front of our sys.path. - sys.path[:] = glob.glob(os.path.join(WHEEL_DIR, "*.whl")) + sys.path - - # Actually alias all of our vendored dependencies. - vendored("cachecontrol") - vendored("colorama") - vendored("distlib") - vendored("distro") - vendored("html5lib") - vendored("lockfile") - vendored("six") - vendored("six.moves") - vendored("six.moves.urllib") - vendored("six.moves.urllib.parse") - vendored("packaging") - vendored("packaging.version") - vendored("packaging.specifiers") - vendored("pep517") - vendored("pkg_resources") - vendored("progress") - vendored("pytoml") - vendored("retrying") - vendored("requests") - vendored("requests.exceptions") - vendored("requests.packages") - vendored("requests.packages.urllib3") - vendored("requests.packages.urllib3._collections") - vendored("requests.packages.urllib3.connection") - vendored("requests.packages.urllib3.connectionpool") - vendored("requests.packages.urllib3.contrib") - vendored("requests.packages.urllib3.contrib.ntlmpool") - vendored("requests.packages.urllib3.contrib.pyopenssl") - vendored("requests.packages.urllib3.exceptions") - vendored("requests.packages.urllib3.fields") - vendored("requests.packages.urllib3.filepost") - vendored("requests.packages.urllib3.packages") - vendored("requests.packages.urllib3.packages.ordered_dict") - vendored("requests.packages.urllib3.packages.six") - vendored("requests.packages.urllib3.packages.ssl_match_hostname") - vendored("requests.packages.urllib3.packages.ssl_match_hostname." - "_implementation") - vendored("requests.packages.urllib3.poolmanager") - vendored("requests.packages.urllib3.request") - vendored("requests.packages.urllib3.response") - vendored("requests.packages.urllib3.util") - vendored("requests.packages.urllib3.util.connection") - vendored("requests.packages.urllib3.util.request") - vendored("requests.packages.urllib3.util.response") - vendored("requests.packages.urllib3.util.retry") - vendored("requests.packages.urllib3.util.ssl_") - vendored("requests.packages.urllib3.util.timeout") - vendored("requests.packages.urllib3.util.url") - vendored("urllib3") diff --git a/env/lib/python3.7/site-packages/pip/_vendor/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 6b6cdaff91ea144de6d23414e5748daf2ce381fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2815 zcmbuA&u`pB6vxLu*7k0*ZQ7=7QfP61H!XD<N@#^Dgi2CTsp<iQ3M-K1cxJOs#vXTO zHe}u86gVRBCnVy;zck{;saFmhIPu1wEEQEY71;88=Ev91GxMI`JnD8k2(IFn+3%uL z2>q@b2bTwxPvH@NS_om(L)gMLwQ{>>Te|L0r{~mkd###Y&%<udC$05huU(fNa%|t) zw|Y~!g}on8uS@)&E&c~__MCeBIGMu!zP)b|Z#_7Nbcr48{AfQ!q>F=H%hGHcb_|ah zP8oI$j~kvaoHjgZc*^j!;f&!K!?T9x3}+4J49^?BWB9J&1;dMm?-_=Mmkci(UNO9C zc+K#-;SIx^hVzEE3~w90Z+OQrGF&jcYq)6mf#E&F4-J<LKQg?piJdRe{DbPZPMMWa zyh#eoc$kT>4`^Chu@+)d!U!qSjEIo+LlB3Og(WATkzqjy*0QF%)2KsMgo5Qn4)hS& zl7trtjXIsj83ij@Au>#ivGJG1fDI`QS4o(%TEGbovpgTlWR;RIDR5{cte_*%b%rHQ zB#2--n}mxDUJLu2<>9atl9MElI<IuB&s*w5vMLxIN)l&z$+&#>IE9$6FBi%Hp3mSB zn^0hD4@qkq?b|!nXja<WNIJVny1NM5*!jt|&~sGGxJb4(I{bl!^!*JgKK>d>Z{6QU za}BMBXxrKgu!~#!_P6$qz2nGst+40NwsWA}b-)t{JmEd7{FirkqL+(1T+a<=-J-C` zR9Vrhx}&2!@J*gb6~u9o<Rp$&CpIgBy1z!*YC?tbC`&buJ*gMF!a3v05hJ1eoZ%t( zKzUr0G?U5~L?%-5c~^CsF>P3Nn*boV{*H226G4<aAPN2z@fn!iUrP%zFBib=cfg%8 zq4W-ZF)Fqe`vcusKPILYV2VX1<2WiuDmXBFL2vgo6v&#gZEMy#-uCQiYue&xp|5J) zioPFEHI*jmfIvV<&Zr7fMj21?MEN)ql4h&Q(-qECFpxQ2(meqzexnb81}o0Csx}l+ z&NhjtrpMK2$SG*6v;Xdi%7nv8+hvk&Bx?}8)yZ)+GC@|&{L>{$l4ku3qEC4xDVG-S zt8Tfm7IPxlkf*TGLCM(~G__zPSq`h<MDh{X*0mQyBBZEJAJihUm6B5GSguZvJDU%} z66W6MGE2EvT|aaviecX<NgJzI57)sy7mcjC`8KMOF<M=ksFWPG`PPw=sE`z570lf} zT3e17<Rl?zHDN8U?PGYjNpKy-qPjduK}pGkoTM4MXW?)=2bzd+Odz$zI7{Uur;T6G zQM~jPhG9cuNDk>B9>9F{Z(ObXr`IB#QYgtGzb86os%sO>fY0)zNY)6S6bZ(_q)mi> zq=cv^)y2cVHk28y<|mIwuSM~Me?psz4yJYE2$SQvO$az+5Pt3I$`R(YrzW|+HYKy1 zu;IkGt96jdl;7mDd-ErhAIF%b&B@Ro${~kSg4>W%m8*{j<ud_EP7ajK1fSCV?d6q6 zUp-rXy0Wa?dc=prvZ>$<4sJLO;Jncp6|A<Of4;KvG+uu4MV+UWyUwzrJ`r9k&S<m2 n!{$8s#D|vPP`Hrk0}Jk!>&<w<dC$4()NS4O|L(@_8#ew14xV-h diff --git a/env/lib/python3.7/site-packages/pip/_vendor/__pycache__/appdirs.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/__pycache__/appdirs.cpython-37.pyc deleted file mode 100644 index 194ad4bf033ca8d8e333cd43ea47d528c5b73d32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20565 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 H0sQ_iaz`!F diff --git a/env/lib/python3.7/site-packages/pip/_vendor/__pycache__/distro.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/__pycache__/distro.cpython-37.pyc deleted file mode 100644 index 4cff2b0f9b76c3f18d51a7d4f6ee2278d599dd03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36278 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/__pycache__/ipaddress.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/__pycache__/ipaddress.cpython-37.pyc deleted file mode 100644 index c3ca7cd4f1e61e5b19429d27afc9b24d8759bf65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66408 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 S-#+}&#Id3G4}bU21OGp-r8!Xm diff --git a/env/lib/python3.7/site-packages/pip/_vendor/__pycache__/pyparsing.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/__pycache__/pyparsing.cpython-37.pyc deleted file mode 100644 index 776525018bce32cf00709aea793b9210b8f9bbcf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 221766 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 Mj+q!EjcBp|1@7Q%Y5)KL diff --git a/env/lib/python3.7/site-packages/pip/_vendor/__pycache__/retrying.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/__pycache__/retrying.cpython-37.pyc deleted file mode 100644 index 2881d2debc4405d64c5ef5130f3ba34b1bfba939..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8046 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 BpE3Xd diff --git a/env/lib/python3.7/site-packages/pip/_vendor/__pycache__/six.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/__pycache__/six.cpython-37.pyc deleted file mode 100644 index d6e203592ef8ae80c4a91717f93bde645d550fc5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26370 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/appdirs.py b/env/lib/python3.7/site-packages/pip/_vendor/appdirs.py deleted file mode 100644 index 2bd3911..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/appdirs.py +++ /dev/null @@ -1,604 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# Copyright (c) 2005-2010 ActiveState Software Inc. -# Copyright (c) 2013 Eddy Petrișor - -"""Utilities for determining application-specific dirs. - -See <http://github.com/ActiveState/appdirs> for details and usage. -""" -# Dev Notes: -# - MSDN on where to store app data files: -# http://support.microsoft.com/default.aspx?scid=kb;en-us;310294#XSLTH3194121123120121120120 -# - Mac OS X: http://developer.apple.com/documentation/MacOSX/Conceptual/BPFileSystem/index.html -# - XDG spec for Un*x: http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html - -__version_info__ = (1, 4, 3) -__version__ = '.'.join(map(str, __version_info__)) - - -import sys -import os - -PY3 = sys.version_info[0] == 3 - -if PY3: - unicode = str - -if sys.platform.startswith('java'): - import platform - os_name = platform.java_ver()[3][0] - if os_name.startswith('Windows'): # "Windows XP", "Windows 7", etc. - system = 'win32' - elif os_name.startswith('Mac'): # "Mac OS X", etc. - system = 'darwin' - else: # "Linux", "SunOS", "FreeBSD", etc. - # Setting this to "linux2" is not ideal, but only Windows or Mac - # are actually checked for and the rest of the module expects - # *sys.platform* style strings. - system = 'linux2' -else: - system = sys.platform - - - -def user_data_dir(appname=None, appauthor=None, version=None, roaming=False): - r"""Return full path to the user-specific data dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "appauthor" (only used on Windows) is the name of the - appauthor or distributing body for this application. Typically - it is the owning company name. This falls back to appname. You may - pass False to disable it. - "version" is an optional version path element to append to the - path. You might want to use this if you want multiple versions - of your app to be able to run independently. If used, this - would typically be "<major>.<minor>". - Only applied when appname is present. - "roaming" (boolean, default False) can be set True to use the Windows - roaming appdata directory. That means that for users on a Windows - network setup for roaming profiles, this user data will be - sync'd on login. See - <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx> - for a discussion of issues. - - Typical user data directories are: - Mac OS X: ~/Library/Application Support/<AppName> - Unix: ~/.local/share/<AppName> # or in $XDG_DATA_HOME, if defined - Win XP (not roaming): C:\Documents and Settings\<username>\Application Data\<AppAuthor>\<AppName> - Win XP (roaming): C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName> - Win 7 (not roaming): C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName> - Win 7 (roaming): C:\Users\<username>\AppData\Roaming\<AppAuthor>\<AppName> - - For Unix, we follow the XDG spec and support $XDG_DATA_HOME. - That means, by default "~/.local/share/<AppName>". - """ - if system == "win32": - if appauthor is None: - appauthor = appname - const = roaming and "CSIDL_APPDATA" or "CSIDL_LOCAL_APPDATA" - path = os.path.normpath(_get_win_folder(const)) - if appname: - if appauthor is not False: - path = os.path.join(path, appauthor, appname) - else: - path = os.path.join(path, appname) - elif system == 'darwin': - path = os.path.expanduser('~/Library/Application Support/') - if appname: - path = os.path.join(path, appname) - else: - path = os.getenv('XDG_DATA_HOME', os.path.expanduser("~/.local/share")) - if appname: - path = os.path.join(path, appname) - if appname and version: - path = os.path.join(path, version) - return path - - -def site_data_dir(appname=None, appauthor=None, version=None, multipath=False): - r"""Return full path to the user-shared data dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "appauthor" (only used on Windows) is the name of the - appauthor or distributing body for this application. Typically - it is the owning company name. This falls back to appname. You may - pass False to disable it. - "version" is an optional version path element to append to the - path. You might want to use this if you want multiple versions - of your app to be able to run independently. If used, this - would typically be "<major>.<minor>". - Only applied when appname is present. - "multipath" is an optional parameter only applicable to *nix - which indicates that the entire list of data dirs should be - returned. By default, the first item from XDG_DATA_DIRS is - returned, or '/usr/local/share/<AppName>', - if XDG_DATA_DIRS is not set - - Typical site data directories are: - Mac OS X: /Library/Application Support/<AppName> - Unix: /usr/local/share/<AppName> or /usr/share/<AppName> - Win XP: C:\Documents and Settings\All Users\Application Data\<AppAuthor>\<AppName> - Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.) - Win 7: C:\ProgramData\<AppAuthor>\<AppName> # Hidden, but writeable on Win 7. - - For Unix, this is using the $XDG_DATA_DIRS[0] default. - - WARNING: Do not use this on Windows. See the Vista-Fail note above for why. - """ - if system == "win32": - if appauthor is None: - appauthor = appname - path = os.path.normpath(_get_win_folder("CSIDL_COMMON_APPDATA")) - if appname: - if appauthor is not False: - path = os.path.join(path, appauthor, appname) - else: - path = os.path.join(path, appname) - elif system == 'darwin': - path = os.path.expanduser('/Library/Application Support') - if appname: - path = os.path.join(path, appname) - else: - # XDG default for $XDG_DATA_DIRS - # only first, if multipath is False - path = os.getenv('XDG_DATA_DIRS', - os.pathsep.join(['/usr/local/share', '/usr/share'])) - pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)] - if appname: - if version: - appname = os.path.join(appname, version) - pathlist = [os.sep.join([x, appname]) for x in pathlist] - - if multipath: - path = os.pathsep.join(pathlist) - else: - path = pathlist[0] - return path - - if appname and version: - path = os.path.join(path, version) - return path - - -def user_config_dir(appname=None, appauthor=None, version=None, roaming=False): - r"""Return full path to the user-specific config dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "appauthor" (only used on Windows) is the name of the - appauthor or distributing body for this application. Typically - it is the owning company name. This falls back to appname. You may - pass False to disable it. - "version" is an optional version path element to append to the - path. You might want to use this if you want multiple versions - of your app to be able to run independently. If used, this - would typically be "<major>.<minor>". - Only applied when appname is present. - "roaming" (boolean, default False) can be set True to use the Windows - roaming appdata directory. That means that for users on a Windows - network setup for roaming profiles, this user data will be - sync'd on login. See - <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx> - for a discussion of issues. - - Typical user config directories are: - Mac OS X: same as user_data_dir - Unix: ~/.config/<AppName> # or in $XDG_CONFIG_HOME, if defined - Win *: same as user_data_dir - - For Unix, we follow the XDG spec and support $XDG_CONFIG_HOME. - That means, by default "~/.config/<AppName>". - """ - if system in ["win32", "darwin"]: - path = user_data_dir(appname, appauthor, None, roaming) - else: - path = os.getenv('XDG_CONFIG_HOME', os.path.expanduser("~/.config")) - if appname: - path = os.path.join(path, appname) - if appname and version: - path = os.path.join(path, version) - return path - - -def site_config_dir(appname=None, appauthor=None, version=None, multipath=False): - r"""Return full path to the user-shared data dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "appauthor" (only used on Windows) is the name of the - appauthor or distributing body for this application. Typically - it is the owning company name. This falls back to appname. You may - pass False to disable it. - "version" is an optional version path element to append to the - path. You might want to use this if you want multiple versions - of your app to be able to run independently. If used, this - would typically be "<major>.<minor>". - Only applied when appname is present. - "multipath" is an optional parameter only applicable to *nix - which indicates that the entire list of config dirs should be - returned. By default, the first item from XDG_CONFIG_DIRS is - returned, or '/etc/xdg/<AppName>', if XDG_CONFIG_DIRS is not set - - Typical site config directories are: - Mac OS X: same as site_data_dir - Unix: /etc/xdg/<AppName> or $XDG_CONFIG_DIRS[i]/<AppName> for each value in - $XDG_CONFIG_DIRS - Win *: same as site_data_dir - Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.) - - For Unix, this is using the $XDG_CONFIG_DIRS[0] default, if multipath=False - - WARNING: Do not use this on Windows. See the Vista-Fail note above for why. - """ - if system in ["win32", "darwin"]: - path = site_data_dir(appname, appauthor) - if appname and version: - path = os.path.join(path, version) - else: - # XDG default for $XDG_CONFIG_DIRS - # only first, if multipath is False - path = os.getenv('XDG_CONFIG_DIRS', '/etc/xdg') - pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)] - if appname: - if version: - appname = os.path.join(appname, version) - pathlist = [os.sep.join([x, appname]) for x in pathlist] - - if multipath: - path = os.pathsep.join(pathlist) - else: - path = pathlist[0] - return path - - -def user_cache_dir(appname=None, appauthor=None, version=None, opinion=True): - r"""Return full path to the user-specific cache dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "appauthor" (only used on Windows) is the name of the - appauthor or distributing body for this application. Typically - it is the owning company name. This falls back to appname. You may - pass False to disable it. - "version" is an optional version path element to append to the - path. You might want to use this if you want multiple versions - of your app to be able to run independently. If used, this - would typically be "<major>.<minor>". - Only applied when appname is present. - "opinion" (boolean) can be False to disable the appending of - "Cache" to the base app data dir for Windows. See - discussion below. - - Typical user cache directories are: - Mac OS X: ~/Library/Caches/<AppName> - Unix: ~/.cache/<AppName> (XDG default) - Win XP: C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName>\Cache - Vista: C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName>\Cache - - On Windows the only suggestion in the MSDN docs is that local settings go in - the `CSIDL_LOCAL_APPDATA` directory. This is identical to the non-roaming - app data dir (the default returned by `user_data_dir` above). Apps typically - put cache data somewhere *under* the given dir here. Some examples: - ...\Mozilla\Firefox\Profiles\<ProfileName>\Cache - ...\Acme\SuperApp\Cache\1.0 - OPINION: This function appends "Cache" to the `CSIDL_LOCAL_APPDATA` value. - This can be disabled with the `opinion=False` option. - """ - if system == "win32": - if appauthor is None: - appauthor = appname - path = os.path.normpath(_get_win_folder("CSIDL_LOCAL_APPDATA")) - if appname: - if appauthor is not False: - path = os.path.join(path, appauthor, appname) - else: - path = os.path.join(path, appname) - if opinion: - path = os.path.join(path, "Cache") - elif system == 'darwin': - path = os.path.expanduser('~/Library/Caches') - if appname: - path = os.path.join(path, appname) - else: - path = os.getenv('XDG_CACHE_HOME', os.path.expanduser('~/.cache')) - if appname: - path = os.path.join(path, appname) - if appname and version: - path = os.path.join(path, version) - return path - - -def user_state_dir(appname=None, appauthor=None, version=None, roaming=False): - r"""Return full path to the user-specific state dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "appauthor" (only used on Windows) is the name of the - appauthor or distributing body for this application. Typically - it is the owning company name. This falls back to appname. You may - pass False to disable it. - "version" is an optional version path element to append to the - path. You might want to use this if you want multiple versions - of your app to be able to run independently. If used, this - would typically be "<major>.<minor>". - Only applied when appname is present. - "roaming" (boolean, default False) can be set True to use the Windows - roaming appdata directory. That means that for users on a Windows - network setup for roaming profiles, this user data will be - sync'd on login. See - <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx> - for a discussion of issues. - - Typical user state directories are: - Mac OS X: same as user_data_dir - Unix: ~/.local/state/<AppName> # or in $XDG_STATE_HOME, if defined - Win *: same as user_data_dir - - For Unix, we follow this Debian proposal <https://wiki.debian.org/XDGBaseDirectorySpecification#state> - to extend the XDG spec and support $XDG_STATE_HOME. - - That means, by default "~/.local/state/<AppName>". - """ - if system in ["win32", "darwin"]: - path = user_data_dir(appname, appauthor, None, roaming) - else: - path = os.getenv('XDG_STATE_HOME', os.path.expanduser("~/.local/state")) - if appname: - path = os.path.join(path, appname) - if appname and version: - path = os.path.join(path, version) - return path - - -def user_log_dir(appname=None, appauthor=None, version=None, opinion=True): - r"""Return full path to the user-specific log dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "appauthor" (only used on Windows) is the name of the - appauthor or distributing body for this application. Typically - it is the owning company name. This falls back to appname. You may - pass False to disable it. - "version" is an optional version path element to append to the - path. You might want to use this if you want multiple versions - of your app to be able to run independently. If used, this - would typically be "<major>.<minor>". - Only applied when appname is present. - "opinion" (boolean) can be False to disable the appending of - "Logs" to the base app data dir for Windows, and "log" to the - base cache dir for Unix. See discussion below. - - Typical user log directories are: - Mac OS X: ~/Library/Logs/<AppName> - Unix: ~/.cache/<AppName>/log # or under $XDG_CACHE_HOME if defined - Win XP: C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName>\Logs - Vista: C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName>\Logs - - On Windows the only suggestion in the MSDN docs is that local settings - go in the `CSIDL_LOCAL_APPDATA` directory. (Note: I'm interested in - examples of what some windows apps use for a logs dir.) - - OPINION: This function appends "Logs" to the `CSIDL_LOCAL_APPDATA` - value for Windows and appends "log" to the user cache dir for Unix. - This can be disabled with the `opinion=False` option. - """ - if system == "darwin": - path = os.path.join( - os.path.expanduser('~/Library/Logs'), - appname) - elif system == "win32": - path = user_data_dir(appname, appauthor, version) - version = False - if opinion: - path = os.path.join(path, "Logs") - else: - path = user_cache_dir(appname, appauthor, version) - version = False - if opinion: - path = os.path.join(path, "log") - if appname and version: - path = os.path.join(path, version) - return path - - -class AppDirs(object): - """Convenience wrapper for getting application dirs.""" - def __init__(self, appname=None, appauthor=None, version=None, - roaming=False, multipath=False): - self.appname = appname - self.appauthor = appauthor - self.version = version - self.roaming = roaming - self.multipath = multipath - - @property - def user_data_dir(self): - return user_data_dir(self.appname, self.appauthor, - version=self.version, roaming=self.roaming) - - @property - def site_data_dir(self): - return site_data_dir(self.appname, self.appauthor, - version=self.version, multipath=self.multipath) - - @property - def user_config_dir(self): - return user_config_dir(self.appname, self.appauthor, - version=self.version, roaming=self.roaming) - - @property - def site_config_dir(self): - return site_config_dir(self.appname, self.appauthor, - version=self.version, multipath=self.multipath) - - @property - def user_cache_dir(self): - return user_cache_dir(self.appname, self.appauthor, - version=self.version) - - @property - def user_state_dir(self): - return user_state_dir(self.appname, self.appauthor, - version=self.version) - - @property - def user_log_dir(self): - return user_log_dir(self.appname, self.appauthor, - version=self.version) - - -#---- internal support stuff - -def _get_win_folder_from_registry(csidl_name): - """This is a fallback technique at best. I'm not sure if using the - registry for this guarantees us the correct answer for all CSIDL_* - names. - """ - if PY3: - import winreg as _winreg - else: - import _winreg - - shell_folder_name = { - "CSIDL_APPDATA": "AppData", - "CSIDL_COMMON_APPDATA": "Common AppData", - "CSIDL_LOCAL_APPDATA": "Local AppData", - }[csidl_name] - - key = _winreg.OpenKey( - _winreg.HKEY_CURRENT_USER, - r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" - ) - dir, type = _winreg.QueryValueEx(key, shell_folder_name) - return dir - - -def _get_win_folder_with_pywin32(csidl_name): - from win32com.shell import shellcon, shell - dir = shell.SHGetFolderPath(0, getattr(shellcon, csidl_name), 0, 0) - # Try to make this a unicode path because SHGetFolderPath does - # not return unicode strings when there is unicode data in the - # path. - try: - dir = unicode(dir) - - # Downgrade to short path name if have highbit chars. See - # <http://bugs.activestate.com/show_bug.cgi?id=85099>. - has_high_char = False - for c in dir: - if ord(c) > 255: - has_high_char = True - break - if has_high_char: - try: - import win32api - dir = win32api.GetShortPathName(dir) - except ImportError: - pass - except UnicodeError: - pass - return dir - - -def _get_win_folder_with_ctypes(csidl_name): - import ctypes - - csidl_const = { - "CSIDL_APPDATA": 26, - "CSIDL_COMMON_APPDATA": 35, - "CSIDL_LOCAL_APPDATA": 28, - }[csidl_name] - - buf = ctypes.create_unicode_buffer(1024) - ctypes.windll.shell32.SHGetFolderPathW(None, csidl_const, None, 0, buf) - - # Downgrade to short path name if have highbit chars. See - # <http://bugs.activestate.com/show_bug.cgi?id=85099>. - has_high_char = False - for c in buf: - if ord(c) > 255: - has_high_char = True - break - if has_high_char: - buf2 = ctypes.create_unicode_buffer(1024) - if ctypes.windll.kernel32.GetShortPathNameW(buf.value, buf2, 1024): - buf = buf2 - - return buf.value - -def _get_win_folder_with_jna(csidl_name): - import array - from com.sun import jna - from com.sun.jna.platform import win32 - - buf_size = win32.WinDef.MAX_PATH * 2 - buf = array.zeros('c', buf_size) - shell = win32.Shell32.INSTANCE - shell.SHGetFolderPath(None, getattr(win32.ShlObj, csidl_name), None, win32.ShlObj.SHGFP_TYPE_CURRENT, buf) - dir = jna.Native.toString(buf.tostring()).rstrip("\0") - - # Downgrade to short path name if have highbit chars. See - # <http://bugs.activestate.com/show_bug.cgi?id=85099>. - has_high_char = False - for c in dir: - if ord(c) > 255: - has_high_char = True - break - if has_high_char: - buf = array.zeros('c', buf_size) - kernel = win32.Kernel32.INSTANCE - if kernel.GetShortPathName(dir, buf, buf_size): - dir = jna.Native.toString(buf.tostring()).rstrip("\0") - - return dir - -if system == "win32": - try: - from ctypes import windll - _get_win_folder = _get_win_folder_with_ctypes - except ImportError: - try: - import com.sun.jna - _get_win_folder = _get_win_folder_with_jna - except ImportError: - _get_win_folder = _get_win_folder_from_registry - - -#---- self test code - -if __name__ == "__main__": - appname = "MyApp" - appauthor = "MyCompany" - - props = ("user_data_dir", - "user_config_dir", - "user_cache_dir", - "user_state_dir", - "user_log_dir", - "site_data_dir", - "site_config_dir") - - print("-- app dirs %s --" % __version__) - - print("-- app dirs (with optional 'version')") - dirs = AppDirs(appname, appauthor, version="1.0") - for prop in props: - print("%s: %s" % (prop, getattr(dirs, prop))) - - print("\n-- app dirs (without optional 'version')") - dirs = AppDirs(appname, appauthor) - for prop in props: - print("%s: %s" % (prop, getattr(dirs, prop))) - - print("\n-- app dirs (without optional 'appauthor')") - dirs = AppDirs(appname) - for prop in props: - print("%s: %s" % (prop, getattr(dirs, prop))) - - print("\n-- app dirs (with disabled 'appauthor')") - dirs = AppDirs(appname, appauthor=False) - for prop in props: - print("%s: %s" % (prop, getattr(dirs, prop))) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__init__.py b/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__init__.py deleted file mode 100644 index 8fdee66..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -"""CacheControl import Interface. - -Make it easy to import from cachecontrol without long namespaces. -""" -__author__ = "Eric Larson" -__email__ = "eric@ionrock.org" -__version__ = "0.12.5" - -from .wrapper import CacheControl -from .adapter import CacheControlAdapter -from .controller import CacheController diff --git a/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 3a2594bf6b27d29f5cfd30f93e6693efb282dc02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 506 zcmYjNJx{|h5Ow;MHf;qG3!~Q#O#ums0U>C`fCMaTk&tC#ms<4~7njoh9VY%#Rwn)e z6PEx|&${z_C*QmCO^3sTpxO7s$2213vm*c2KyZm(oM8|oBO=No(a0L2nKeaAv~|n0 zvvx!fcXY?ZSzO~-cTF$rA?`kqQE&S+<M~3)oDJYKRmM9A^u`7WbDqmIN$&VkQWdD= z#fAp=|6~r%(7dY6|7zDNEZizk?d&tP+{nVCLXjrh{xzta-f}3M-R?^ym&#di`7(9z zyzLyN$0zCO7k-h9qH?f15%PmwekHia*)YAgo7NKUM@bnoCS1-~nJ~szI1V80F(wUH z8eyNYR|y3+M-s1rdoKa1RhBXTRfcB8lD|)(F0?T5L12Ja9locNVEn`@KUTH~T<fuT v+1R(^`JzhJj%}=PFxg$ugfV4RU@Y~UvU_fvSZR4tsTY-YE2>Xp5DlUq+Mt)u diff --git a/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-37.pyc deleted file mode 100644 index cac59a44b318c468d8d0adc828f7ea08c40f4e2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1509 zcmZ`(%Z}SN6eXz_Ez2G^EsAMTr0!!8FEU2AK`>}CDVjxK6rIUNKp_YwYs=LuB%Ndo zXEoX8A3W%)zr<}<{e`Z2FQu6V0YZS(;Uz`gbMB!Yk47<pR{weY+fhKs-#EEx9)KUA z>(?*{B4|lce6o^OEM*k2S9+D7`VRYLP=#sea8O1SPr1WkIjG_^1{?|gmZU>55HUOx zF%$_rM`9vIV*Hk-V|gTw{$R?;@fCsn^qkB-`3JsE7BgzOk}tMW8x8o=vwXRhXH9KX zQ$7-TYovnk;7PGGZV4t~*{oJBJbt8B+e+5vmt1M7mUtpI3LROVLD%2HV90?Qw(+hh zC59dRYw`wT!Jc455XgrvW}yP9h~-+EXY!>iZG>Mc>Xi+i{Pg(w&vtZfl+3HAc`Zt* zY@7?xV@NAncj3Q?8o@FDp3Y6x&fB8BU)0*<WqDt`xU66Q@cSBru4gZ0EgCgnBI#vE zdY&ySanfGe5u~wgvp$6cse~{Pnov&F5ujVX3?{hd_?`kV#Lz3y87c{NedhyPcJP2T z-P40FJm3v=cG&MR*#vu<g?p?`u(+6ccIeW|q{&y>#-MMJm&Fcv57u(43T=wzE?OJY zKA6vU9DxQjixf()d>k+_8=Xt7i>9_g)og2H<DMx>IO)Fee`LmNly`NvzJ?c_nB6eO z(}pW)GF*TY??6Cflu$+|jDs`@jOq)B+=_!{z+{{_UjZ=W3d+AH8wvt3;k`pC$bns> z4g7`mwyNA6U##Wy`LEBWrkNUbIfdFzU9M1Re=W;)<|&liCSZar?|o?F7M+N5baUut z>O%?~Dd3j7a6n(wkdCSP8s<yP7aOX0oA(7wy1cQlu8a&AfT7<o<Kv~;(@k&)_iPhE z=UsUrGQh|+RZmSU=oOf~=71O?XM1n4i_Xw~;+x%Q(U^{;m_E2S8@ha)nAU@o)t8Wj zGoJb!kR5lmQ&P80t)-3ndu%<Gzv@>-b`uO*Rn!J-<s)--j3@Z`?uY95RbJHJ!?K>h zKxjxqFY!X}jyI+;Q}^&io@KZz%kbJx6vx;QZq-SDqnz>5>3fkAmu&B|lip#@sp;L1 zZgcNAC#T<id{cLC!Oi{e1Ne1yM}KsBp&>gpZ_=;xN@m%6-0`2GoWuFUsu9~#o}v>p VO3hiqz}jH$#N#1Pco=`i>3{H2d%yqy diff --git a/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-37.pyc deleted file mode 100644 index c26f646df6100ba489eaedb35964d33f239a09b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2992 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 ZaJN1&BnzM)<|?2cK%mRIkg;@~{{S*X0Z0G< diff --git a/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-37.pyc deleted file mode 100644 index 151b430cefb35910efb6c04c9c62b1d49265b5a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1722 zcma)7OK;Oa5Z<*N$8j4PT2Vj(<O3jCqN$KLA}B2gRYDOj2^0xgu6NVA^{Z>AB2iAX z_x^=eocK$=a^f#=VrI9F(+Cwd+S%85=bM>tHk<9XO`s*;Z+&^76Y>)mRWo3+0X=^L zf{{L9lxY!-wZ2BlYr=G9oDgPk{aEiCux>CD)+RS#-C)fR#I?pd_QyT$1bzTA-Pz|s z;k<ae?F>@kgmD(}m?uS;>?)1C>!3E{1AiD5PMABsQ|t-uGduSO+zFGln8&FYIV=o{ zFim_h>e{~m9dT)Cyh($D02fu$V6p){e*}V)J_RQ<bmD~cbp^j~DA)*?S+H-i767-) z)~28HEyNw*HP~>Z(6^xH7`B2OlW%Y-d_a4EV5OH9+m%<Gy%Hi7u2vd3j|QcFz(+rb zXu@~DpRX5jww{IATA1X8A4O~IaFl#~JlMlc*}Ws4uvDze&;@Byh%{1*ZZ<0QU0xu9 zTw<f+_7rUwP68c{u;F+WVu2}kb<u!9m>|l=ksl4YM5%;@yL!%xHcb9v4o?0%K+2p} zo13>|G9K}QcV<j=YR}YRfDU29aq1j8a*+smsY{g=4EKy9jUY;Mz5<(-D@*nL@~r1J zOUv^TKjxlS+MXAuY#8Bu(en<6exy!B3ol+kv4{erGvkdki=h*k0-WS1EX~sKCwBwb zm^M_~fSz|jOsQ%!jp-*8$O<$CavIEJO&A-@Vl7El3fx;LTQ8v=Bw2fxl7Z~l!dq8C zAX_KIqZ6843vs4Z%+&=dmPP~xR2s}Ld{-r@Y=uc!cvx*S&Phr@jO3Yj8}G;P6Kc`% z@)Sw8Qn-W&6(yo;Fqx2jat3%9IoDJTX##U2gL?r%(sItYJiiNyRTA5^)p`13o}|Ht z7Y0vPDH^6{+JsKDke*XYJ^^>$k@w_t#UZGPWdwp~N^_V&O!#b_2rRyNRLBMgdL4}! zT=R7@#f5JZ2IBM%;G&4^z!di?g#SjTXK8j-tdO4f5f#=q=E$bwP8}~*RQP^11?EI7 zp}-0hH&D#+ysoF3;@3g%CiDx6+XhhF5V+fO&9dovEDfN3TIwl>*Iv=hRR0IE7Nqt} WJg1kJ)>Bo0&yYFN2ZJu^ouxk+#zsj1 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-37.pyc deleted file mode 100644 index 79d1d8b8978ea569239a0adb4b1afe27b2e46caf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 713 zcmZ`#&1&2*5SC;+>ukK+C8s^)kW*m`@wW6@N(dC%O9*YCsh}*bJZapOB}LMP_#OHd zJ@pB4>x1}I2n6~HJ$3w(?WRx}jWqN9ct%H~(U9O$-=-gL7$LV!a=&7{9O8C&7^+E5 zaw<tlIi=)1QTrhQwjA20lr&$91|9l=D0W7w1Zzx&JVN$f&*p13lM#=4X5$^mt#ZHz z54^vw*@28ZbVCu!?Q+P64-`Mvics!!Xs?JN;Uny1ik*zH@1GqL9`RAf$k{tGi+<s( zWJc@3%E~XgP{(*rUZ0+xyai{pa?s?3Tb!GPklH~$o74$%W$`IBnRQ_C8A-kKrZn36 zSJrA<$B4IBJrE~_SW2k3OndUw6ee9<fy%W_EnKd^d51<~nSBPAcE-;U>3(hlH0OJp zqJJs;$tL=L%at#r4I8`Zrr_SLf$<SkA#@J)wufuK@Rh;qaaKY%SKz$;PV5*>+VJ~u z?n^UAyMsbGpGkR;Usme++4)6NY<EBFTx8+`gjU{aITyM#nNLks$1h5quOz&rXzCtg WV01#qbT?o$!E+q-Is03WvHk}|k-ozK diff --git a/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-37.pyc deleted file mode 100644 index f0dff8ee1dc8d71ce8e5544333c0cd3cd3d30e60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7592 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 V3gl{$0WAKGhCfkr&DO2j{{d@X1^)m5 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-37.pyc deleted file mode 100644 index 5c8b1cf8c9769b346db72476e891ac1545fa22da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2110 zcmZ`)&2Aev5GJ`RX}y+R_b+vVAZ2rkfW$_7P7BAWQ}p5<T%fIhf}ob%XzkVRhNLXZ zP*3)Q*yyRRwAZ4Cyh2Z%;Yzk+Y$<Ta<qU`4H=LpNH#TAdt@v~M_kY$1`5Ql0EriJ) zbjv{~qG(PgbVw=rfheYeOQHhJE`nj8!Xq;1yay{XpmlG5?zH{!rv$%OEr7`$bh{5i zlOa`P$P|UW-qSEtq3T?cVMldU55}&F)EbOE^^sav{YyHG)P~xGl{FQ^X<PNDuVtQ( zWODK*%k?itR+TpLloAqiXh##!@>#RYr75R{;*zHoFGt5ZaeOw;k};oUVCA&t`c#{_ z8)wB^ZnRW9D_qH?cQu-(sW#8K1P`;ZF1Q;@$5S|!XO<^<X*Jk`NA#u7bTV}sj!KsB zVBL*jkM_=zvT(X^mX~Scr}4fMd+jUmAe}SW2z*$8t$Ah2vkVRZIN*Z=4Q=u{;`9g_ zHp}flk3Ar1EuUK0KhcwsHnu?^xhkh40PS7aqy*>Bgc$G~_@ckc=rlXy7I<5arYIdA zE0ZKsfEoDAxgASY&L9@IICmOic*EFmWYAwjx7#2bxgZN7=z@Y|3kEV!1n!U?4nl*b z^+VBenL<Ep>g{$_TGdb5HLJJ}f;zN1PiqFY(Q5TCVld(VJ=k@VYPZU&7g=GE+6(n= zUYvcMj&ad<ajFYdn%zVuV~zJ_%6u1tzRaqfYF<Y|WJTtL*h02l5QIjwOV1y-5ZYN8 zCrBC_#tOTS)n_nSkSnOOYx)Os6e2}07{rMknhxj&tlkpht#&sVB1GL=eh&iE1DiT5 z<V2eYrk-ab)={&5vsZ}EVZmZ~leL(hf7y<8=~;*bipn<}(Y1&BJxu2P1vw_iP|PRM z5ebQ7C$Zs_;O{q5uwThM@)p63_Pe`UMLoSYkO#=n<E}Sftt#Nan9|hUro;x+GrUi0 z6M||*T8YN$D{x~!0YNCEeYQ!vjL`_k@cd~z&%4_{po#(VR5?tLhIxSZ12cNXuE{mL zgbFhoWRuN-!3;3CuZ|#mr!t@F|H0jD0Dl9v%e?8*t={>gR*at8VSCy<UxK@W0>i`s zc<d@zFoXwi!)s!m!PvQmJ6T{lLD_YExa$y~x(04%W-_Pir|mU$H$(=LXO(V&oVYqv z(#d=GVjh6iw@A+aztBGXBDje2?KXmlqn+IzxWLfgu%n8eFvAy2v1U9%{e8wSKVTdj zzQ>BQC^q61`&d|+YH<?-^9864zF2oDnuoaX2n8~^EhzICJ`bSVO%Me5Z3Q7)vV79U z^7cHugBTwVtX8PvScplfra8|0LcE*Ge5vUPp~^%E(}yz*zB0E6eT+SfJJ38xEO>(t v3#OvS7sVlqI#ECRI9iV*uY=dOW?9+1z}@DL#4Fmo)zQlaA=K|OlKtR6+;9d* diff --git a/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-37.pyc deleted file mode 100644 index 66f99241e4b727962b87ac51eb098218d339cd3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4630 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-37.pyc deleted file mode 100644 index 9dc2d85a1cb5a37816bef159aadb38321f37e3df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4194 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 OC(67m<}J_m?0*Aa<eB;a diff --git a/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-37.pyc deleted file mode 100644 index 1f165f6f7a18bddf09aaa336b7b9e501027f8a64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 614 zcmYjOy^ho{5VoB^?;k9pxhFtMaYVETA@26-ZMbSBv<k5yk(|WXUf@>V3R<4wKvcYv zTPj|GiW%>n*s<o*=b6d)o5|&3F(qKb&$BnTjF8`WxwityD{%V+KoCI{>FI`2<V>+X z*(AUVk%{~(-J~LUO-lZULUBpM<5k_Xay1UljOs$v+DQZ9$yL|5m|9;q97@q9;K*0t z_7cET%^mqd4%Fv*>F6Q%xu>4_#HT*<g`nT^1NY=R6U_4;jFQNcdk#X<b(w`(gCe%l z)$eVXT4}mkb$e;Tq?J3<S=TjT*&H=0X||23tqqUjSM^&Zx4m@jDD1vyozu^&YR{2a zU}a(wP-<XlBxL=#8(cXFsg=+miw#VQ`3xaPz;%X2eO$%yDT7mo;x6`!m<MqGdr`Sw zSGv>Z-C$j<)VcU@GkkvbuEk*V?MFF?(NyuFy8)_Crq)`Tr}`$$S0~#?3HA(t%%+r6 zc5*nI(>XIs$d$$VdW}|QW&!s&nVBJrgJMn8cLEO~7Wj*P6gwqf;-9xz20b%E|DS(G C$dn@h diff --git a/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/_cmd.py b/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/_cmd.py deleted file mode 100644 index f1e0ad9..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/_cmd.py +++ /dev/null @@ -1,57 +0,0 @@ -import logging - -from pip._vendor import requests - -from pip._vendor.cachecontrol.adapter import CacheControlAdapter -from pip._vendor.cachecontrol.cache import DictCache -from pip._vendor.cachecontrol.controller import logger - -from argparse import ArgumentParser - - -def setup_logging(): - logger.setLevel(logging.DEBUG) - handler = logging.StreamHandler() - logger.addHandler(handler) - - -def get_session(): - adapter = CacheControlAdapter( - DictCache(), cache_etags=True, serializer=None, heuristic=None - ) - sess = requests.Session() - sess.mount("http://", adapter) - sess.mount("https://", adapter) - - sess.cache_controller = adapter.controller - return sess - - -def get_args(): - parser = ArgumentParser() - parser.add_argument("url", help="The URL to try and cache") - return parser.parse_args() - - -def main(args=None): - args = get_args() - sess = get_session() - - # Make a request to get a response - resp = sess.get(args.url) - - # Turn on logging - setup_logging() - - # try setting the cache - sess.cache_controller.cache_response(resp.request, resp.raw) - - # Now try to get it - if sess.cache_controller.cached_request(resp.request): - print("Cached!") - else: - print("Not cached :(") - - -if __name__ == "__main__": - main() diff --git a/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/adapter.py b/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/adapter.py deleted file mode 100644 index 780eb28..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/adapter.py +++ /dev/null @@ -1,133 +0,0 @@ -import types -import functools -import zlib - -from pip._vendor.requests.adapters import HTTPAdapter - -from .controller import CacheController -from .cache import DictCache -from .filewrapper import CallbackFileWrapper - - -class CacheControlAdapter(HTTPAdapter): - invalidating_methods = {"PUT", "DELETE"} - - def __init__( - self, - cache=None, - cache_etags=True, - controller_class=None, - serializer=None, - heuristic=None, - cacheable_methods=None, - *args, - **kw - ): - super(CacheControlAdapter, self).__init__(*args, **kw) - self.cache = cache or DictCache() - self.heuristic = heuristic - self.cacheable_methods = cacheable_methods or ("GET",) - - controller_factory = controller_class or CacheController - self.controller = controller_factory( - self.cache, cache_etags=cache_etags, serializer=serializer - ) - - def send(self, request, cacheable_methods=None, **kw): - """ - Send a request. Use the request information to see if it - exists in the cache and cache the response if we need to and can. - """ - cacheable = cacheable_methods or self.cacheable_methods - if request.method in cacheable: - try: - cached_response = self.controller.cached_request(request) - except zlib.error: - cached_response = None - if cached_response: - return self.build_response(request, cached_response, from_cache=True) - - # check for etags and add headers if appropriate - request.headers.update(self.controller.conditional_headers(request)) - - resp = super(CacheControlAdapter, self).send(request, **kw) - - return resp - - def build_response( - self, request, response, from_cache=False, cacheable_methods=None - ): - """ - Build a response by making a request or using the cache. - - This will end up calling send and returning a potentially - cached response - """ - cacheable = cacheable_methods or self.cacheable_methods - if not from_cache and request.method in cacheable: - # Check for any heuristics that might update headers - # before trying to cache. - if self.heuristic: - response = self.heuristic.apply(response) - - # apply any expiration heuristics - if response.status == 304: - # We must have sent an ETag request. This could mean - # that we've been expired already or that we simply - # have an etag. In either case, we want to try and - # update the cache if that is the case. - cached_response = self.controller.update_cached_response( - request, response - ) - - if cached_response is not response: - from_cache = True - - # We are done with the server response, read a - # possible response body (compliant servers will - # not return one, but we cannot be 100% sure) and - # release the connection back to the pool. - response.read(decode_content=False) - response.release_conn() - - response = cached_response - - # We always cache the 301 responses - elif response.status == 301: - self.controller.cache_response(request, response) - else: - # Wrap the response file with a wrapper that will cache the - # response when the stream has been consumed. - response._fp = CallbackFileWrapper( - response._fp, - functools.partial( - self.controller.cache_response, request, response - ), - ) - if response.chunked: - super_update_chunk_length = response._update_chunk_length - - def _update_chunk_length(self): - super_update_chunk_length() - if self.chunk_left == 0: - self._fp._close() - - response._update_chunk_length = types.MethodType( - _update_chunk_length, response - ) - - resp = super(CacheControlAdapter, self).build_response(request, response) - - # See if we should invalidate the cache. - if request.method in self.invalidating_methods and resp.ok: - cache_url = self.controller.cache_url(request.url) - self.cache.delete(cache_url) - - # Give the request a from_cache attr to let people use it - resp.from_cache = from_cache - - return resp - - def close(self): - self.cache.close() - super(CacheControlAdapter, self).close() diff --git a/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/cache.py b/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/cache.py deleted file mode 100644 index 94e0773..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/cache.py +++ /dev/null @@ -1,39 +0,0 @@ -""" -The cache object API for implementing caches. The default is a thread -safe in-memory dictionary. -""" -from threading import Lock - - -class BaseCache(object): - - def get(self, key): - raise NotImplementedError() - - def set(self, key, value): - raise NotImplementedError() - - def delete(self, key): - raise NotImplementedError() - - def close(self): - pass - - -class DictCache(BaseCache): - - def __init__(self, init_dict=None): - self.lock = Lock() - self.data = init_dict or {} - - def get(self, key): - return self.data.get(key, None) - - def set(self, key, value): - with self.lock: - self.data.update({key: value}) - - def delete(self, key): - with self.lock: - if key in self.data: - self.data.pop(key) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__init__.py b/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__init__.py deleted file mode 100644 index 0e1658f..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from .file_cache import FileCache # noqa -from .redis_cache import RedisCache # noqa diff --git a/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 7e4801d1a80705352e0464dec45b75a6a9dad4a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 250 zcmZ?b<>g`kg1p5Nv0*^^F^B^LOhASM5Esh;i4=wu#vF!R#wbQc5SuB7DVI5l8OUZ1 zX3%7L$p}=U$#{#?Ei)(8IWajS70BTVN=?Zu2J`$hS#EKq0p;S8L6Suvqi=B+f#jhg z%s`Qq3`J}}3QYX+)Gx^`&@ad=(9O&%E=kPE(M>6=%&Ra=%K!<2aeP^7UP^wEKG@9U q{JfH){2U0USU)~KGcU6wK3=b&@)n0pZhlH>PO2TqmBk>tc^CmWK0%5A diff --git a/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-37.pyc deleted file mode 100644 index a7a8d9159f4b84bef86fa5fe42a30501510d4b51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3184 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 a_%YRq;scO?2e_TJ&;&+p)SIBQ^8CLc^5qu* diff --git a/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-37.pyc deleted file mode 100644 index ca5b6c36416a3b9ffd220343b02a43458a3c3aaa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1506 zcmaJ>OK%e~5cXqtvrUsWh>FJrjMPgcnu;3-1PG7-3FQDnph(qfS-b7R#+%wsUs_J| zhcx2EU)n1t{sJdvya^3eg(cgw9?yQ?y!@=&Z4(&!`>maioRFXRu^0gePhr}Jut*|l zLB@1MDax#1V>V)5<^>-Iqkxi^L<TZEBQjLMH$Dnw^p5mfzrdRGX&uY_Ft>TBy_`Db z^05MW<ymUg^EBI68QxqBVAG&K20@V#m1M*umF$d+xa2Z`J&<cMlC3ieSg~AzlSsDZ zD(o%UkzLqh83Kp(y8Twk+%_m|4uLz)=P)gXp`sN@z&o&@LtqwUrPh5`2UZokCW0G3 zh>2nQ{bt*ZC)<;JvXyJ=(xTXs2PgXY!R|gD`k5RmElabVdCyAiOj$G^cH1DC#A^nV zlR8e4T<0!HR*;FOM^CR`Fdi)Q*)nwukf+`Op(3BjIj!i7HsqP7Tk}2T`pmT8M$Nyd z6VJX`5X-E>g60d*wIxt69cEYqIB>@Rc)&*>RNQVXKr1$bO3<4XckG<c$Sv}fdtFdb z7gqc{nvri5ZgH%ahG1(>&?;xplRBEZOqWM>2q)^e=DBut*Od_5#41RHwEe(4Vvukh z9;U@q)h%^A$&Ip?9qYoKb(j{@MQA{KtV2(i-2<4b!`TCag=aHg?f--{lBxiP^Qd|< zm%%sS4>w>gqIzv9s*QC<L5%|wim~-^-2~zIPJ=xoFUU^sD^w&TmSJKkIp}<VE(A90 z^z|!MOq3D3r4d=7Qj_aF0d*+cz7mjVD{?JTAyb!rg7zAS_g0Cc-0io;d}Qg=K{MVP z_IZ<v0L=_?|Br8V=+SP&E$eH8_vmSF$v?0D>mIs^)4PZF=k%X=3o*6I3T!f!Ar~<z z%K{v^FLWuiQc}1Qyeok^x^;1JF!Uks)21LW#}`G76v5;!95xAHmk5Fq`+EiZPN!p) zBy~GU#-*GVD0h<NV44<<#^Af)+r(f=`S2Lbt+|QI1+tfXPlceshO=0wF^hT3+bvil zgPLJKLbTnfn;JkfSOC5OMt9)l7|dUdLALa2G#>`T=YMe(Y8^jn9C(c3w%Dp2sQ3>5 E1I3m{-v9sr diff --git a/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py b/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py deleted file mode 100644 index 1ba0080..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py +++ /dev/null @@ -1,146 +0,0 @@ -import hashlib -import os -from textwrap import dedent - -from ..cache import BaseCache -from ..controller import CacheController - -try: - FileNotFoundError -except NameError: - # py2.X - FileNotFoundError = (IOError, OSError) - - -def _secure_open_write(filename, fmode): - # We only want to write to this file, so open it in write only mode - flags = os.O_WRONLY - - # os.O_CREAT | os.O_EXCL will fail if the file already exists, so we only - # will open *new* files. - # We specify this because we want to ensure that the mode we pass is the - # mode of the file. - flags |= os.O_CREAT | os.O_EXCL - - # Do not follow symlinks to prevent someone from making a symlink that - # we follow and insecurely open a cache file. - if hasattr(os, "O_NOFOLLOW"): - flags |= os.O_NOFOLLOW - - # On Windows we'll mark this file as binary - if hasattr(os, "O_BINARY"): - flags |= os.O_BINARY - - # Before we open our file, we want to delete any existing file that is - # there - try: - os.remove(filename) - except (IOError, OSError): - # The file must not exist already, so we can just skip ahead to opening - pass - - # Open our file, the use of os.O_CREAT | os.O_EXCL will ensure that if a - # race condition happens between the os.remove and this line, that an - # error will be raised. Because we utilize a lockfile this should only - # happen if someone is attempting to attack us. - fd = os.open(filename, flags, fmode) - try: - return os.fdopen(fd, "wb") - - except: - # An error occurred wrapping our FD in a file object - os.close(fd) - raise - - -class FileCache(BaseCache): - - def __init__( - self, - directory, - forever=False, - filemode=0o0600, - dirmode=0o0700, - use_dir_lock=None, - lock_class=None, - ): - - if use_dir_lock is not None and lock_class is not None: - raise ValueError("Cannot use use_dir_lock and lock_class together") - - try: - from pip._vendor.lockfile import LockFile - from pip._vendor.lockfile.mkdirlockfile import MkdirLockFile - except ImportError: - notice = dedent( - """ - NOTE: In order to use the FileCache you must have - lockfile installed. You can install it via pip: - pip install lockfile - """ - ) - raise ImportError(notice) - - else: - if use_dir_lock: - lock_class = MkdirLockFile - - elif lock_class is None: - lock_class = LockFile - - self.directory = directory - self.forever = forever - self.filemode = filemode - self.dirmode = dirmode - self.lock_class = lock_class - - @staticmethod - def encode(x): - return hashlib.sha224(x.encode()).hexdigest() - - def _fn(self, name): - # NOTE: This method should not change as some may depend on it. - # See: https://github.com/ionrock/cachecontrol/issues/63 - hashed = self.encode(name) - parts = list(hashed[:5]) + [hashed] - return os.path.join(self.directory, *parts) - - def get(self, key): - name = self._fn(key) - try: - with open(name, "rb") as fh: - return fh.read() - - except FileNotFoundError: - return None - - def set(self, key, value): - name = self._fn(key) - - # Make sure the directory exists - try: - os.makedirs(os.path.dirname(name), self.dirmode) - except (IOError, OSError): - pass - - with self.lock_class(name) as lock: - # Write our actual file - with _secure_open_write(lock.path, self.filemode) as fh: - fh.write(value) - - def delete(self, key): - name = self._fn(key) - if not self.forever: - try: - os.remove(name) - except FileNotFoundError: - pass - - -def url_to_file_path(url, filecache): - """Return the file cache path based on the URL. - - This does not ensure the file exists! - """ - key = CacheController.cache_url(url) - return filecache._fn(key) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py b/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py deleted file mode 100644 index ed705ce..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py +++ /dev/null @@ -1,33 +0,0 @@ -from __future__ import division - -from datetime import datetime -from pip._vendor.cachecontrol.cache import BaseCache - - -class RedisCache(BaseCache): - - def __init__(self, conn): - self.conn = conn - - def get(self, key): - return self.conn.get(key) - - def set(self, key, value, expires=None): - if not expires: - self.conn.set(key, value) - else: - expires = expires - datetime.utcnow() - self.conn.setex(key, int(expires.total_seconds()), value) - - def delete(self, key): - self.conn.delete(key) - - def clear(self): - """Helper for clearing all the keys in a database. Use with - caution!""" - for key in self.conn.keys(): - self.conn.delete(key) - - def close(self): - """Redis uses connection pooling, no need to close the connection.""" - pass diff --git a/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/compat.py b/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/compat.py deleted file mode 100644 index 33b5aed..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/compat.py +++ /dev/null @@ -1,29 +0,0 @@ -try: - from urllib.parse import urljoin -except ImportError: - from urlparse import urljoin - - -try: - import cPickle as pickle -except ImportError: - import pickle - - -# Handle the case where the requests module has been patched to not have -# urllib3 bundled as part of its source. -try: - from pip._vendor.requests.packages.urllib3.response import HTTPResponse -except ImportError: - from pip._vendor.urllib3.response import HTTPResponse - -try: - from pip._vendor.requests.packages.urllib3.util import is_fp_closed -except ImportError: - from pip._vendor.urllib3.util import is_fp_closed - -# Replicate some six behaviour -try: - text_type = unicode -except NameError: - text_type = str diff --git a/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/controller.py b/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/controller.py deleted file mode 100644 index 1b2b943..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/controller.py +++ /dev/null @@ -1,367 +0,0 @@ -""" -The httplib2 algorithms ported for use with requests. -""" -import logging -import re -import calendar -import time -from email.utils import parsedate_tz - -from pip._vendor.requests.structures import CaseInsensitiveDict - -from .cache import DictCache -from .serialize import Serializer - - -logger = logging.getLogger(__name__) - -URI = re.compile(r"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?") - - -def parse_uri(uri): - """Parses a URI using the regex given in Appendix B of RFC 3986. - - (scheme, authority, path, query, fragment) = parse_uri(uri) - """ - groups = URI.match(uri).groups() - return (groups[1], groups[3], groups[4], groups[6], groups[8]) - - -class CacheController(object): - """An interface to see if request should cached or not. - """ - - def __init__( - self, cache=None, cache_etags=True, serializer=None, status_codes=None - ): - self.cache = cache or DictCache() - self.cache_etags = cache_etags - self.serializer = serializer or Serializer() - self.cacheable_status_codes = status_codes or (200, 203, 300, 301) - - @classmethod - def _urlnorm(cls, uri): - """Normalize the URL to create a safe key for the cache""" - (scheme, authority, path, query, fragment) = parse_uri(uri) - if not scheme or not authority: - raise Exception("Only absolute URIs are allowed. uri = %s" % uri) - - scheme = scheme.lower() - authority = authority.lower() - - if not path: - path = "/" - - # Could do syntax based normalization of the URI before - # computing the digest. See Section 6.2.2 of Std 66. - request_uri = query and "?".join([path, query]) or path - defrag_uri = scheme + "://" + authority + request_uri - - return defrag_uri - - @classmethod - def cache_url(cls, uri): - return cls._urlnorm(uri) - - def parse_cache_control(self, headers): - known_directives = { - # https://tools.ietf.org/html/rfc7234#section-5.2 - "max-age": (int, True), - "max-stale": (int, False), - "min-fresh": (int, True), - "no-cache": (None, False), - "no-store": (None, False), - "no-transform": (None, False), - "only-if-cached": (None, False), - "must-revalidate": (None, False), - "public": (None, False), - "private": (None, False), - "proxy-revalidate": (None, False), - "s-maxage": (int, True), - } - - cc_headers = headers.get("cache-control", headers.get("Cache-Control", "")) - - retval = {} - - for cc_directive in cc_headers.split(","): - if not cc_directive.strip(): - continue - - parts = cc_directive.split("=", 1) - directive = parts[0].strip() - - try: - typ, required = known_directives[directive] - except KeyError: - logger.debug("Ignoring unknown cache-control directive: %s", directive) - continue - - if not typ or not required: - retval[directive] = None - if typ: - try: - retval[directive] = typ(parts[1].strip()) - except IndexError: - if required: - logger.debug( - "Missing value for cache-control " "directive: %s", - directive, - ) - except ValueError: - logger.debug( - "Invalid value for cache-control directive " "%s, must be %s", - directive, - typ.__name__, - ) - - return retval - - def cached_request(self, request): - """ - Return a cached response if it exists in the cache, otherwise - return False. - """ - cache_url = self.cache_url(request.url) - logger.debug('Looking up "%s" in the cache', cache_url) - cc = self.parse_cache_control(request.headers) - - # Bail out if the request insists on fresh data - if "no-cache" in cc: - logger.debug('Request header has "no-cache", cache bypassed') - return False - - if "max-age" in cc and cc["max-age"] == 0: - logger.debug('Request header has "max_age" as 0, cache bypassed') - return False - - # Request allows serving from the cache, let's see if we find something - cache_data = self.cache.get(cache_url) - if cache_data is None: - logger.debug("No cache entry available") - return False - - # Check whether it can be deserialized - resp = self.serializer.loads(request, cache_data) - if not resp: - logger.warning("Cache entry deserialization failed, entry ignored") - return False - - # If we have a cached 301, return it immediately. We don't - # need to test our response for other headers b/c it is - # intrinsically "cacheable" as it is Permanent. - # See: - # https://tools.ietf.org/html/rfc7231#section-6.4.2 - # - # Client can try to refresh the value by repeating the request - # with cache busting headers as usual (ie no-cache). - if resp.status == 301: - msg = ( - 'Returning cached "301 Moved Permanently" response ' - "(ignoring date and etag information)" - ) - logger.debug(msg) - return resp - - headers = CaseInsensitiveDict(resp.headers) - if not headers or "date" not in headers: - if "etag" not in headers: - # Without date or etag, the cached response can never be used - # and should be deleted. - logger.debug("Purging cached response: no date or etag") - self.cache.delete(cache_url) - logger.debug("Ignoring cached response: no date") - return False - - now = time.time() - date = calendar.timegm(parsedate_tz(headers["date"])) - current_age = max(0, now - date) - logger.debug("Current age based on date: %i", current_age) - - # TODO: There is an assumption that the result will be a - # urllib3 response object. This may not be best since we - # could probably avoid instantiating or constructing the - # response until we know we need it. - resp_cc = self.parse_cache_control(headers) - - # determine freshness - freshness_lifetime = 0 - - # Check the max-age pragma in the cache control header - if "max-age" in resp_cc: - freshness_lifetime = resp_cc["max-age"] - logger.debug("Freshness lifetime from max-age: %i", freshness_lifetime) - - # If there isn't a max-age, check for an expires header - elif "expires" in headers: - expires = parsedate_tz(headers["expires"]) - if expires is not None: - expire_time = calendar.timegm(expires) - date - freshness_lifetime = max(0, expire_time) - logger.debug("Freshness lifetime from expires: %i", freshness_lifetime) - - # Determine if we are setting freshness limit in the - # request. Note, this overrides what was in the response. - if "max-age" in cc: - freshness_lifetime = cc["max-age"] - logger.debug( - "Freshness lifetime from request max-age: %i", freshness_lifetime - ) - - if "min-fresh" in cc: - min_fresh = cc["min-fresh"] - # adjust our current age by our min fresh - current_age += min_fresh - logger.debug("Adjusted current age from min-fresh: %i", current_age) - - # Return entry if it is fresh enough - if freshness_lifetime > current_age: - logger.debug('The response is "fresh", returning cached response') - logger.debug("%i > %i", freshness_lifetime, current_age) - return resp - - # we're not fresh. If we don't have an Etag, clear it out - if "etag" not in headers: - logger.debug('The cached response is "stale" with no etag, purging') - self.cache.delete(cache_url) - - # return the original handler - return False - - def conditional_headers(self, request): - cache_url = self.cache_url(request.url) - resp = self.serializer.loads(request, self.cache.get(cache_url)) - new_headers = {} - - if resp: - headers = CaseInsensitiveDict(resp.headers) - - if "etag" in headers: - new_headers["If-None-Match"] = headers["ETag"] - - if "last-modified" in headers: - new_headers["If-Modified-Since"] = headers["Last-Modified"] - - return new_headers - - def cache_response(self, request, response, body=None, status_codes=None): - """ - Algorithm for caching requests. - - This assumes a requests Response object. - """ - # From httplib2: Don't cache 206's since we aren't going to - # handle byte range requests - cacheable_status_codes = status_codes or self.cacheable_status_codes - if response.status not in cacheable_status_codes: - logger.debug( - "Status code %s not in %s", response.status, cacheable_status_codes - ) - return - - response_headers = CaseInsensitiveDict(response.headers) - - # If we've been given a body, our response has a Content-Length, that - # Content-Length is valid then we can check to see if the body we've - # been given matches the expected size, and if it doesn't we'll just - # skip trying to cache it. - if ( - body is not None - and "content-length" in response_headers - and response_headers["content-length"].isdigit() - and int(response_headers["content-length"]) != len(body) - ): - return - - cc_req = self.parse_cache_control(request.headers) - cc = self.parse_cache_control(response_headers) - - cache_url = self.cache_url(request.url) - logger.debug('Updating cache with response from "%s"', cache_url) - - # Delete it from the cache if we happen to have it stored there - no_store = False - if "no-store" in cc: - no_store = True - logger.debug('Response header has "no-store"') - if "no-store" in cc_req: - no_store = True - logger.debug('Request header has "no-store"') - if no_store and self.cache.get(cache_url): - logger.debug('Purging existing cache entry to honor "no-store"') - self.cache.delete(cache_url) - if no_store: - return - - # If we've been given an etag, then keep the response - if self.cache_etags and "etag" in response_headers: - logger.debug("Caching due to etag") - self.cache.set( - cache_url, self.serializer.dumps(request, response, body=body) - ) - - # Add to the cache any 301s. We do this before looking that - # the Date headers. - elif response.status == 301: - logger.debug("Caching permanant redirect") - self.cache.set(cache_url, self.serializer.dumps(request, response)) - - # Add to the cache if the response headers demand it. If there - # is no date header then we can't do anything about expiring - # the cache. - elif "date" in response_headers: - # cache when there is a max-age > 0 - if "max-age" in cc and cc["max-age"] > 0: - logger.debug("Caching b/c date exists and max-age > 0") - self.cache.set( - cache_url, self.serializer.dumps(request, response, body=body) - ) - - # If the request can expire, it means we should cache it - # in the meantime. - elif "expires" in response_headers: - if response_headers["expires"]: - logger.debug("Caching b/c of expires header") - self.cache.set( - cache_url, self.serializer.dumps(request, response, body=body) - ) - - def update_cached_response(self, request, response): - """On a 304 we will get a new set of headers that we want to - update our cached value with, assuming we have one. - - This should only ever be called when we've sent an ETag and - gotten a 304 as the response. - """ - cache_url = self.cache_url(request.url) - - cached_response = self.serializer.loads(request, self.cache.get(cache_url)) - - if not cached_response: - # we didn't have a cached response - return response - - # Lets update our headers with the headers from the new request: - # http://tools.ietf.org/html/draft-ietf-httpbis-p4-conditional-26#section-4.1 - # - # The server isn't supposed to send headers that would make - # the cached body invalid. But... just in case, we'll be sure - # to strip out ones we know that might be problmatic due to - # typical assumptions. - excluded_headers = ["content-length"] - - cached_response.headers.update( - dict( - (k, v) - for k, v in response.headers.items() - if k.lower() not in excluded_headers - ) - ) - - # we want a 200 b/c we have content via the cache - cached_response.status = 200 - - # update our cache - self.cache.set(cache_url, self.serializer.dumps(request, cached_response)) - - return cached_response diff --git a/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/filewrapper.py b/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/filewrapper.py deleted file mode 100644 index 30ed4c5..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/filewrapper.py +++ /dev/null @@ -1,80 +0,0 @@ -from io import BytesIO - - -class CallbackFileWrapper(object): - """ - Small wrapper around a fp object which will tee everything read into a - buffer, and when that file is closed it will execute a callback with the - contents of that buffer. - - All attributes are proxied to the underlying file object. - - This class uses members with a double underscore (__) leading prefix so as - not to accidentally shadow an attribute. - """ - - def __init__(self, fp, callback): - self.__buf = BytesIO() - self.__fp = fp - self.__callback = callback - - def __getattr__(self, name): - # The vaguaries of garbage collection means that self.__fp is - # not always set. By using __getattribute__ and the private - # name[0] allows looking up the attribute value and raising an - # AttributeError when it doesn't exist. This stop thigns from - # infinitely recursing calls to getattr in the case where - # self.__fp hasn't been set. - # - # [0] https://docs.python.org/2/reference/expressions.html#atom-identifiers - fp = self.__getattribute__("_CallbackFileWrapper__fp") - return getattr(fp, name) - - def __is_fp_closed(self): - try: - return self.__fp.fp is None - - except AttributeError: - pass - - try: - return self.__fp.closed - - except AttributeError: - pass - - # We just don't cache it then. - # TODO: Add some logging here... - return False - - def _close(self): - if self.__callback: - self.__callback(self.__buf.getvalue()) - - # We assign this to None here, because otherwise we can get into - # really tricky problems where the CPython interpreter dead locks - # because the callback is holding a reference to something which - # has a __del__ method. Setting this to None breaks the cycle - # and allows the garbage collector to do it's thing normally. - self.__callback = None - - def read(self, amt=None): - data = self.__fp.read(amt) - self.__buf.write(data) - if self.__is_fp_closed(): - self._close() - - return data - - def _safe_read(self, amt): - data = self.__fp._safe_read(amt) - if amt == 2 and data == b"\r\n": - # urllib executes this read to toss the CRLF at the end - # of the chunk. - return data - - self.__buf.write(data) - if self.__is_fp_closed(): - self._close() - - return data diff --git a/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/heuristics.py b/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/heuristics.py deleted file mode 100644 index 6c0e979..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/heuristics.py +++ /dev/null @@ -1,135 +0,0 @@ -import calendar -import time - -from email.utils import formatdate, parsedate, parsedate_tz - -from datetime import datetime, timedelta - -TIME_FMT = "%a, %d %b %Y %H:%M:%S GMT" - - -def expire_after(delta, date=None): - date = date or datetime.utcnow() - return date + delta - - -def datetime_to_header(dt): - return formatdate(calendar.timegm(dt.timetuple())) - - -class BaseHeuristic(object): - - def warning(self, response): - """ - Return a valid 1xx warning header value describing the cache - adjustments. - - The response is provided too allow warnings like 113 - http://tools.ietf.org/html/rfc7234#section-5.5.4 where we need - to explicitly say response is over 24 hours old. - """ - return '110 - "Response is Stale"' - - def update_headers(self, response): - """Update the response headers with any new headers. - - NOTE: This SHOULD always include some Warning header to - signify that the response was cached by the client, not - by way of the provided headers. - """ - return {} - - def apply(self, response): - updated_headers = self.update_headers(response) - - if updated_headers: - response.headers.update(updated_headers) - warning_header_value = self.warning(response) - if warning_header_value is not None: - response.headers.update({"Warning": warning_header_value}) - - return response - - -class OneDayCache(BaseHeuristic): - """ - Cache the response by providing an expires 1 day in the - future. - """ - - def update_headers(self, response): - headers = {} - - if "expires" not in response.headers: - date = parsedate(response.headers["date"]) - expires = expire_after(timedelta(days=1), date=datetime(*date[:6])) - headers["expires"] = datetime_to_header(expires) - headers["cache-control"] = "public" - return headers - - -class ExpiresAfter(BaseHeuristic): - """ - Cache **all** requests for a defined time period. - """ - - def __init__(self, **kw): - self.delta = timedelta(**kw) - - def update_headers(self, response): - expires = expire_after(self.delta) - return {"expires": datetime_to_header(expires), "cache-control": "public"} - - def warning(self, response): - tmpl = "110 - Automatically cached for %s. Response might be stale" - return tmpl % self.delta - - -class LastModified(BaseHeuristic): - """ - If there is no Expires header already, fall back on Last-Modified - using the heuristic from - http://tools.ietf.org/html/rfc7234#section-4.2.2 - to calculate a reasonable value. - - Firefox also does something like this per - https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching_FAQ - http://lxr.mozilla.org/mozilla-release/source/netwerk/protocol/http/nsHttpResponseHead.cpp#397 - Unlike mozilla we limit this to 24-hr. - """ - cacheable_by_default_statuses = { - 200, 203, 204, 206, 300, 301, 404, 405, 410, 414, 501 - } - - def update_headers(self, resp): - headers = resp.headers - - if "expires" in headers: - return {} - - if "cache-control" in headers and headers["cache-control"] != "public": - return {} - - if resp.status not in self.cacheable_by_default_statuses: - return {} - - if "date" not in headers or "last-modified" not in headers: - return {} - - date = calendar.timegm(parsedate_tz(headers["date"])) - last_modified = parsedate(headers["last-modified"]) - if date is None or last_modified is None: - return {} - - now = time.time() - current_age = max(0, now - date) - delta = date - calendar.timegm(last_modified) - freshness_lifetime = max(0, min(delta / 10, 24 * 3600)) - if freshness_lifetime <= current_age: - return {} - - expires = date + freshness_lifetime - return {"expires": time.strftime(TIME_FMT, time.gmtime(expires))} - - def warning(self, resp): - return None diff --git a/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/serialize.py b/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/serialize.py deleted file mode 100644 index ec43ff2..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/serialize.py +++ /dev/null @@ -1,186 +0,0 @@ -import base64 -import io -import json -import zlib - -from pip._vendor import msgpack -from pip._vendor.requests.structures import CaseInsensitiveDict - -from .compat import HTTPResponse, pickle, text_type - - -def _b64_decode_bytes(b): - return base64.b64decode(b.encode("ascii")) - - -def _b64_decode_str(s): - return _b64_decode_bytes(s).decode("utf8") - - -class Serializer(object): - - def dumps(self, request, response, body=None): - response_headers = CaseInsensitiveDict(response.headers) - - if body is None: - body = response.read(decode_content=False) - - # NOTE: 99% sure this is dead code. I'm only leaving it - # here b/c I don't have a test yet to prove - # it. Basically, before using - # `cachecontrol.filewrapper.CallbackFileWrapper`, - # this made an effort to reset the file handle. The - # `CallbackFileWrapper` short circuits this code by - # setting the body as the content is consumed, the - # result being a `body` argument is *always* passed - # into cache_response, and in turn, - # `Serializer.dump`. - response._fp = io.BytesIO(body) - - # NOTE: This is all a bit weird, but it's really important that on - # Python 2.x these objects are unicode and not str, even when - # they contain only ascii. The problem here is that msgpack - # understands the difference between unicode and bytes and we - # have it set to differentiate between them, however Python 2 - # doesn't know the difference. Forcing these to unicode will be - # enough to have msgpack know the difference. - data = { - u"response": { - u"body": body, - u"headers": dict( - (text_type(k), text_type(v)) for k, v in response.headers.items() - ), - u"status": response.status, - u"version": response.version, - u"reason": text_type(response.reason), - u"strict": response.strict, - u"decode_content": response.decode_content, - } - } - - # Construct our vary headers - data[u"vary"] = {} - if u"vary" in response_headers: - varied_headers = response_headers[u"vary"].split(",") - for header in varied_headers: - header = text_type(header).strip() - header_value = request.headers.get(header, None) - if header_value is not None: - header_value = text_type(header_value) - data[u"vary"][header] = header_value - - return b",".join([b"cc=4", msgpack.dumps(data, use_bin_type=True)]) - - def loads(self, request, data): - # Short circuit if we've been given an empty set of data - if not data: - return - - # Determine what version of the serializer the data was serialized - # with - try: - ver, data = data.split(b",", 1) - except ValueError: - ver = b"cc=0" - - # Make sure that our "ver" is actually a version and isn't a false - # positive from a , being in the data stream. - if ver[:3] != b"cc=": - data = ver + data - ver = b"cc=0" - - # Get the version number out of the cc=N - ver = ver.split(b"=", 1)[-1].decode("ascii") - - # Dispatch to the actual load method for the given version - try: - return getattr(self, "_loads_v{}".format(ver))(request, data) - - except AttributeError: - # This is a version we don't have a loads function for, so we'll - # just treat it as a miss and return None - return - - def prepare_response(self, request, cached): - """Verify our vary headers match and construct a real urllib3 - HTTPResponse object. - """ - # Special case the '*' Vary value as it means we cannot actually - # determine if the cached response is suitable for this request. - if "*" in cached.get("vary", {}): - return - - # Ensure that the Vary headers for the cached response match our - # request - for header, value in cached.get("vary", {}).items(): - if request.headers.get(header, None) != value: - return - - body_raw = cached["response"].pop("body") - - headers = CaseInsensitiveDict(data=cached["response"]["headers"]) - if headers.get("transfer-encoding", "") == "chunked": - headers.pop("transfer-encoding") - - cached["response"]["headers"] = headers - - try: - body = io.BytesIO(body_raw) - except TypeError: - # This can happen if cachecontrol serialized to v1 format (pickle) - # using Python 2. A Python 2 str(byte string) will be unpickled as - # a Python 3 str (unicode string), which will cause the above to - # fail with: - # - # TypeError: 'str' does not support the buffer interface - body = io.BytesIO(body_raw.encode("utf8")) - - return HTTPResponse(body=body, preload_content=False, **cached["response"]) - - def _loads_v0(self, request, data): - # The original legacy cache data. This doesn't contain enough - # information to construct everything we need, so we'll treat this as - # a miss. - return - - def _loads_v1(self, request, data): - try: - cached = pickle.loads(data) - except ValueError: - return - - return self.prepare_response(request, cached) - - def _loads_v2(self, request, data): - try: - cached = json.loads(zlib.decompress(data).decode("utf8")) - except (ValueError, zlib.error): - return - - # We need to decode the items that we've base64 encoded - cached["response"]["body"] = _b64_decode_bytes(cached["response"]["body"]) - cached["response"]["headers"] = dict( - (_b64_decode_str(k), _b64_decode_str(v)) - for k, v in cached["response"]["headers"].items() - ) - cached["response"]["reason"] = _b64_decode_str(cached["response"]["reason"]) - cached["vary"] = dict( - (_b64_decode_str(k), _b64_decode_str(v) if v is not None else v) - for k, v in cached["vary"].items() - ) - - return self.prepare_response(request, cached) - - def _loads_v3(self, request, data): - # Due to Python 2 encoding issues, it's impossible to know for sure - # exactly how to load v3 entries, thus we'll treat these as a miss so - # that they get rewritten out as v4 entries. - return - - def _loads_v4(self, request, data): - try: - cached = msgpack.loads(data, encoding="utf-8") - except ValueError: - return - - return self.prepare_response(request, cached) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/wrapper.py b/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/wrapper.py deleted file mode 100644 index 265bfc8..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/wrapper.py +++ /dev/null @@ -1,29 +0,0 @@ -from .adapter import CacheControlAdapter -from .cache import DictCache - - -def CacheControl( - sess, - cache=None, - cache_etags=True, - serializer=None, - heuristic=None, - controller_class=None, - adapter_class=None, - cacheable_methods=None, -): - - cache = cache or DictCache() - adapter_class = adapter_class or CacheControlAdapter - adapter = adapter_class( - cache, - cache_etags=cache_etags, - serializer=serializer, - heuristic=heuristic, - controller_class=controller_class, - cacheable_methods=cacheable_methods, - ) - sess.mount("http://", adapter) - sess.mount("https://", adapter) - - return sess diff --git a/env/lib/python3.7/site-packages/pip/_vendor/certifi/__init__.py b/env/lib/python3.7/site-packages/pip/_vendor/certifi/__init__.py deleted file mode 100644 index 632db8e..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/certifi/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from .core import where - -__version__ = "2019.03.09" diff --git a/env/lib/python3.7/site-packages/pip/_vendor/certifi/__main__.py b/env/lib/python3.7/site-packages/pip/_vendor/certifi/__main__.py deleted file mode 100644 index ae2aff5..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/certifi/__main__.py +++ /dev/null @@ -1,2 +0,0 @@ -from pip._vendor.certifi import where -print(where()) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index ff26625caeed45a484357a2f4fd3f5ba6f2aec09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 213 zcmZ?b<>g`kg1p5Nu_i$JF^B^LOhASM5EqL8i4=wu#vF!R#wbQch7_hKrWEF222GZi zj6f+(##^lA8L367Ra`~}hL(B;#(D;pewxg;Sd#OLQj0*w+~SUpFH0>d&dkq?k6+19 z#0nGx6TfWrOL7bJ3o;9IGxLf|5_58NQwl5dDh$&yK!RWl)R~u(U!<R$T2zvmmZ={f fpP83g5+AQuP<e~PCO1E&G$+*#<d9;JRXj`pY(_O6 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-37.pyc deleted file mode 100644 index b7a07205073a84f068292a3bcfae5f42e3d2d5ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 216 zcmZ?b<>g`kg1p5Nv8F)!F^B^LOhASM5En}Ui4=wu#vF!R#wbQchE%3h#%6|QAS;C_ zm_d{IB~YG0lkpa7c}8kcs-GtFE#ZR90=@XM)V!4ZBE96)qLR$C%p#C^w^$2`GV@AS zG8C}_d0^s~t$s;vfj&@&Zf0I_Nn%cpZc1TgUWH*=21pQ$p+@OLjna>g&rQtCi;veU YsJz8tlbfGXnv-hB2sE)6WC;%=0G`-4FaQ7m diff --git a/env/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-37.pyc deleted file mode 100644 index eb336536c477c4381124343b7918772c5f505a1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 425 zcmYjNJx{|h6tta04OY8XOj$Fu5hD^p2=*?(5(!yR>?p1hJ2)=T3YhpIR80IOuT1;} zCZ5ysanhZiZRy^<cRra=1W<3&8wclyzx;qeaR%(CAROh0V@?{JV;=DE1?7a3OO!^N zYg!6pWhLj`nm+%6(yLnbNvrv)5s49YWmKQoS|n2SwrHBdO0AMcm%Bn&Nm+QOc_-RA z{e-4yQF`^jzz}!=><>XKTH;q?gDrmA)!`!q-1<mlv7vufY2=9RUDy@2b|Ws0Dq7)U z#wyte#$346Ql;48>K&OFoWG7U+jdzeyV*YJjNh)+!%<cH$ARolD6UPmpFAtI5iq`s w?rUMh*oX9K5grrcH=G7;#2D8lW5(}wcpSR@lLPp0@yTvur#{MH65=@c2DjU8%K!iX diff --git a/env/lib/python3.7/site-packages/pip/_vendor/certifi/cacert.pem b/env/lib/python3.7/site-packages/pip/_vendor/certifi/cacert.pem deleted file mode 100644 index 84636dd..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/certifi/cacert.pem +++ /dev/null @@ -1,4658 +0,0 @@ - -# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA -# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA -# Label: "GlobalSign Root CA" -# Serial: 4835703278459707669005204 -# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a -# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c -# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99 ------BEGIN CERTIFICATE----- -MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG -A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv -b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw -MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i -YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT -aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ -jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp -xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp -1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG -snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ -U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 -9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E -BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B -AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz -yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE -38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP -AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad -DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME -HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 -# Label: "GlobalSign Root CA - R2" -# Serial: 4835703278459682885658125 -# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30 -# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe -# SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 -MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL -v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 -eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq -tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd -C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa -zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB -mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH -V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n -bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG -3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs -J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO -291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS -ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd -AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 -TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only -# Label: "Verisign Class 3 Public Primary Certification Authority - G3" -# Serial: 206684696279472310254277870180966723415 -# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09 -# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6 -# SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44 ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl -cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu -LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT -aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD -VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT -aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ -bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu -IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b -N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t -KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu -kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm -CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ -Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu -imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te -2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe -DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC -/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p -F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt -TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== ------END CERTIFICATE----- - -# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Label: "Entrust.net Premium 2048 Secure Server CA" -# Serial: 946069240 -# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90 -# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31 -# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77 ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML -RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp -bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 -IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 -MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 -LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp -YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG -A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq -K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe -sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX -MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT -XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ -HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH -4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub -j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo -U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf -zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b -u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ -bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er -fF6adulZkMV8gzURZVE= ------END CERTIFICATE----- - -# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust -# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust -# Label: "Baltimore CyberTrust Root" -# Serial: 33554617 -# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 -# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 -# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ -RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD -VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX -DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y -ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy -VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr -mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr -IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK -mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu -XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy -dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye -jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 -BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 -DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 -9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx -jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 -Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz -ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS -R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp ------END CERTIFICATE----- - -# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network -# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network -# Label: "AddTrust External Root" -# Serial: 1 -# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f -# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68 -# SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2 ------BEGIN CERTIFICATE----- -MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs -IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 -MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux -FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h -bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v -dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt -H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 -uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX -mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX -a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN -E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 -WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD -VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 -Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU -cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx -IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN -AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH -YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 -6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC -Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX -c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a -mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. -# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. -# Label: "Entrust Root Certification Authority" -# Serial: 1164660820 -# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4 -# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9 -# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c ------BEGIN CERTIFICATE----- -MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 -Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW -KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw -NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw -NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy -ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV -BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ -KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo -Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 -4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 -KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI -rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi -94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB -sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi -gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo -kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE -vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA -A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t -O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua -AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP -9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ -eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m -0vdXcDazv/wor3ElhVsT/h5/WrQ8 ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Global CA O=GeoTrust Inc. -# Subject: CN=GeoTrust Global CA O=GeoTrust Inc. -# Label: "GeoTrust Global CA" -# Serial: 144470 -# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5 -# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12 -# SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a ------BEGIN CERTIFICATE----- -MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT -MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i -YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg -R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 -9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq -fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv -iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU -1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ -bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW -MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA -ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l -uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn -Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS -tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF -PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un -hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV -5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc. -# Subject: CN=GeoTrust Universal CA O=GeoTrust Inc. -# Label: "GeoTrust Universal CA" -# Serial: 1 -# MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48 -# SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79 -# SHA256 Fingerprint: a0:45:9b:9f:63:b2:25:59:f5:fa:5d:4c:6d:b3:f9:f7:2f:f1:93:42:03:35:78:f0:73:bf:1d:1b:46:cb:b9:12 ------BEGIN CERTIFICATE----- -MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy -c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE -BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 -IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV -VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 -cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT -QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh -F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v -c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w -mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd -VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX -teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ -f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe -Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ -nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB -/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY -MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG -9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc -aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX -IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn -ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z -uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN -Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja -QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW -koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 -ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt -DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm -bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. -# Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. -# Label: "GeoTrust Universal CA 2" -# Serial: 1 -# MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7 -# SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79 -# SHA256 Fingerprint: a0:23:4f:3b:c8:52:7c:a5:62:8e:ec:81:ad:5d:69:89:5d:a5:68:0d:c9:1d:1c:b8:47:7f:33:f8:78:b9:5b:0b ------BEGIN CERTIFICATE----- -MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy -c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD -VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 -c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 -WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG -FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq -XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL -se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb -KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd -IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 -y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt -hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc -QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 -Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV -HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ -KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z -dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ -L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr -Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo -ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY -T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz -GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m -1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV -OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH -6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX -QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS ------END CERTIFICATE----- - -# Issuer: CN=AAA Certificate Services O=Comodo CA Limited -# Subject: CN=AAA Certificate Services O=Comodo CA Limited -# Label: "Comodo AAA Services root" -# Serial: 1 -# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0 -# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49 -# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4 ------BEGIN CERTIFICATE----- -MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj -YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM -GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua -BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe -3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 -YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR -rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm -ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU -oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF -MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v -QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t -b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF -AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q -GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz -Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 -G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi -l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 -smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority -# Subject: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority -# Label: "QuoVadis Root CA" -# Serial: 985026699 -# MD5 Fingerprint: 27:de:36:fe:72:b7:00:03:00:9d:f4:f0:1e:6c:04:24 -# SHA1 Fingerprint: de:3f:40:bd:50:93:d3:9b:6c:60:f6:da:bc:07:62:01:00:89:76:c9 -# SHA256 Fingerprint: a4:5e:de:3b:bb:f0:9c:8a:e1:5c:72:ef:c0:72:68:d6:93:a2:1c:99:6f:d5:1e:67:ca:07:94:60:fd:6d:88:73 ------BEGIN CERTIFICATE----- -MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz -MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw -IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR -dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp -li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D -rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ -WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug -F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU -xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC -Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv -dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw -ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl -IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh -c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy -ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh -Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI -KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T -KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq -y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p -dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD -VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL -MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk -fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 -7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R -cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y -mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW -xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK -SnQ2+Q== ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited -# Label: "QuoVadis Root CA 2" -# Serial: 1289 -# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b -# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7 -# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86 ------BEGIN CERTIFICATE----- -MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa -GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg -Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J -WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB -rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp -+ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 -ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i -Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz -PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og -/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH -oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI -yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud -EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 -A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL -MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT -ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f -BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn -g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl -fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K -WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha -B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc -hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR -TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD -mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z -ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y -4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza -8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 3" -# Serial: 1478 -# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf -# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85 -# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35 ------BEGIN CERTIFICATE----- -MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM -V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB -4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr -H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd -8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv -vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT -mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe -btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc -T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt -WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ -c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A -4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD -VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG -CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 -aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 -aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu -dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw -czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G -A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg -Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 -7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem -d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd -+LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B -4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN -t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x -DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 -k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s -zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j -Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT -mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK -4SVhM7JZG+Ju1zdXtg2pEto= ------END CERTIFICATE----- - -# Issuer: O=SECOM Trust.net OU=Security Communication RootCA1 -# Subject: O=SECOM Trust.net OU=Security Communication RootCA1 -# Label: "Security Communication Root CA" -# Serial: 0 -# MD5 Fingerprint: f1:bc:63:6a:54:e0:b5:27:f5:cd:e7:1a:e3:4d:6e:4a -# SHA1 Fingerprint: 36:b1:2b:49:f9:81:9e:d7:4c:9e:bc:38:0f:c6:56:8f:5d:ac:b2:f7 -# SHA256 Fingerprint: e7:5e:72:ed:9f:56:0e:ec:6e:b4:80:00:73:a4:3f:c3:ad:19:19:5a:39:22:82:01:78:95:97:4a:99:02:6b:6c ------BEGIN CERTIFICATE----- -MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY -MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t -dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 -WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD -VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 -9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ -DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 -Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N -QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ -xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G -A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T -AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG -kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr -Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 -Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU -JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot -RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== ------END CERTIFICATE----- - -# Issuer: CN=Sonera Class2 CA O=Sonera -# Subject: CN=Sonera Class2 CA O=Sonera -# Label: "Sonera Class 2 Root CA" -# Serial: 29 -# MD5 Fingerprint: a3:ec:75:0f:2e:88:df:fa:48:01:4e:0b:5c:48:6f:fb -# SHA1 Fingerprint: 37:f7:6d:e6:07:7c:90:c5:b1:3e:93:1a:b7:41:10:b4:f2:e4:9a:27 -# SHA256 Fingerprint: 79:08:b4:03:14:c1:38:10:0b:51:8d:07:35:80:7f:fb:fc:f8:51:8a:00:95:33:71:05:ba:38:6b:15:3d:d9:27 ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP -MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx -MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV -BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o -Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt -5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s -3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej -vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu -8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw -DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG -MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil -zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ -3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD -FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 -Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 -ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M ------END CERTIFICATE----- - -# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com -# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com -# Label: "XRamp Global CA Root" -# Serial: 107108908803651509692980124233745014957 -# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1 -# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6 -# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2 ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB -gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk -MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY -UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx -NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 -dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy -dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 -38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP -KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q -DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 -qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa -JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi -PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P -BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs -jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 -eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD -ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR -vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt -qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa -IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy -i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ -O+7ETPTsJ3xCwnR8gooJybQDJbw= ------END CERTIFICATE----- - -# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority -# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority -# Label: "Go Daddy Class 2 CA" -# Serial: 0 -# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 -# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 -# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 ------BEGIN CERTIFICATE----- -MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh -MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE -YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 -MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo -ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg -MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN -ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA -PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w -wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi -EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY -avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ -YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE -sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h -/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 -IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD -ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy -OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P -TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ -HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER -dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf -ReYNnyicsbkqWletNw+vHX/bvZ8= ------END CERTIFICATE----- - -# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority -# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority -# Label: "Starfield Class 2 CA" -# Serial: 0 -# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24 -# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a -# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58 ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl -MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp -U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw -NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE -ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp -ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 -DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf -8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN -+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 -X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa -K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA -1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G -A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR -zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 -YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD -bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w -DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 -L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D -eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl -xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp -VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY -WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= ------END CERTIFICATE----- - -# Issuer: O=Government Root Certification Authority -# Subject: O=Government Root Certification Authority -# Label: "Taiwan GRCA" -# Serial: 42023070807708724159991140556527066870 -# MD5 Fingerprint: 37:85:44:53:32:45:1f:20:f0:f3:95:e1:25:c4:43:4e -# SHA1 Fingerprint: f4:8b:11:bf:de:ab:be:94:54:20:71:e6:41:de:6b:be:88:2b:40:b9 -# SHA256 Fingerprint: 76:00:29:5e:ef:e8:5b:9e:1f:d6:24:db:76:06:2a:aa:ae:59:81:8a:54:d2:77:4c:d4:c0:b2:c0:11:31:e1:b3 ------BEGIN CERTIFICATE----- -MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ -MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow -PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB -AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR -IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q -gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy -yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts -F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2 -jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx -ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC -VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK -YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH -EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN -Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud -DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE -MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK -UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ -TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf -qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK -ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE -JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7 -hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1 -EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm -nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX -udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz -ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe -LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl -pYYsfPQS ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root CA" -# Serial: 17154717934120587862167794914071425081 -# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 -# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 -# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c ------BEGIN CERTIFICATE----- -MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv -b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl -cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c -JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP -mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ -wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 -VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ -AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB -AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW -BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun -pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC -dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf -fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm -NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx -H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe -+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root CA" -# Serial: 10944719598952040374951832963794454346 -# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e -# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 -# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD -QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB -CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 -nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt -43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P -T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 -gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR -TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw -DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr -hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg -06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF -PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls -YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- - -# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert High Assurance EV Root CA" -# Serial: 3553400076410547919724730734378100087 -# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a -# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 -# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j -ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 -LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug -RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm -+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW -PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM -xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB -Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 -hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg -EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA -FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec -nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z -eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF -hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 -Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe -vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep -+OkuE6N36B9K ------END CERTIFICATE----- - -# Issuer: CN=Class 2 Primary CA O=Certplus -# Subject: CN=Class 2 Primary CA O=Certplus -# Label: "Certplus Class 2 Primary CA" -# Serial: 177770208045934040241468760488327595043 -# MD5 Fingerprint: 88:2c:8c:52:b8:a2:3c:f3:f7:bb:03:ea:ae:ac:42:0b -# SHA1 Fingerprint: 74:20:74:41:72:9c:dd:92:ec:79:31:d8:23:10:8d:c2:81:92:e2:bb -# SHA256 Fingerprint: 0f:99:3c:8a:ef:97:ba:af:56:87:14:0e:d5:9a:d1:82:1b:b4:af:ac:f0:aa:9a:58:b5:d5:7a:33:8a:3a:fb:cb ------BEGIN CERTIFICATE----- -MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw -PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz -cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 -MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz -IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ -ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR -VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL -kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd -EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas -H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 -HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud -DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 -QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu -Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ -AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 -yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR -FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA -ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB -kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 -l7+ijrRU ------END CERTIFICATE----- - -# Issuer: CN=DST Root CA X3 O=Digital Signature Trust Co. -# Subject: CN=DST Root CA X3 O=Digital Signature Trust Co. -# Label: "DST Root CA X3" -# Serial: 91299735575339953335919266965803778155 -# MD5 Fingerprint: 41:03:52:dc:0f:f7:50:1b:16:f0:02:8e:ba:6f:45:c5 -# SHA1 Fingerprint: da:c9:02:4f:54:d8:f6:df:94:93:5f:b1:73:26:38:ca:6a:d7:7c:13 -# SHA256 Fingerprint: 06:87:26:03:31:a7:24:03:d9:09:f1:05:e6:9b:cf:0d:32:e1:bd:24:93:ff:c6:d9:20:6d:11:bc:d6:77:07:39 ------BEGIN CERTIFICATE----- -MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ -MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT -DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow -PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD -Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O -rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq -OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b -xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw -7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD -aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV -HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG -SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 -ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr -AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz -R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 -JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo -Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ ------END CERTIFICATE----- - -# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG -# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG -# Label: "SwissSign Gold CA - G2" -# Serial: 13492815561806991280 -# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93 -# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61 -# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95 ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG -# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG -# Label: "SwissSign Silver CA - G2" -# Serial: 5700383053117599563 -# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13 -# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb -# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5 ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. -# Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. -# Label: "GeoTrust Primary Certification Authority" -# Serial: 32798226551256963324313806436981982369 -# MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf -# SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96 -# SHA256 Fingerprint: 37:d5:10:06:c5:12:ea:ab:62:64:21:f1:ec:8c:92:01:3f:c5:f8:2a:e9:8e:e5:33:eb:46:19:b8:de:b4:d0:6c ------BEGIN CERTIFICATE----- -MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY -MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo -R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx -MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK -Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 -AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA -ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 -7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W -kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI -mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ -KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 -6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl -4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K -oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj -UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU -AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= ------END CERTIFICATE----- - -# Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only -# Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only -# Label: "thawte Primary Root CA" -# Serial: 69529181992039203566298953787712940909 -# MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12 -# SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81 -# SHA256 Fingerprint: 8d:72:2f:81:a9:c1:13:c0:79:1d:f1:36:a2:96:6d:b2:6c:95:0a:97:1d:b4:6b:41:99:f4:ea:54:b7:8b:fb:9f ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB -qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf -Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw -MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV -BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw -NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j -LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG -A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs -W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta -3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk -6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 -Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J -NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA -MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP -r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU -DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz -YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX -xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 -/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ -LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 -jVaMaA== ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only -# Label: "VeriSign Class 3 Public Primary Certification Authority - G5" -# Serial: 33037644167568058970164719475676101450 -# MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c -# SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5 -# SHA256 Fingerprint: 9a:cf:ab:7e:43:c8:d8:80:d0:6b:26:2a:94:de:ee:e4:b4:65:99:89:c3:d0:ca:f1:9b:af:64:05:e4:1a:b7:df ------BEGIN CERTIFICATE----- -MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB -yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL -ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp -U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW -ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW -ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp -U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y -aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 -nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex -t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz -SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG -BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ -rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ -NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E -BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH -BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy -aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv -MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE -p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y -5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK -WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ -4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N -hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq ------END CERTIFICATE----- - -# Issuer: CN=SecureTrust CA O=SecureTrust Corporation -# Subject: CN=SecureTrust CA O=SecureTrust Corporation -# Label: "SecureTrust CA" -# Serial: 17199774589125277788362757014266862032 -# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1 -# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11 -# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73 ------BEGIN CERTIFICATE----- -MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz -MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv -cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz -Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO -0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao -wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj -7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS -8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT -BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg -JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC -NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 -6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ -3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm -D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS -CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR -3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= ------END CERTIFICATE----- - -# Issuer: CN=Secure Global CA O=SecureTrust Corporation -# Subject: CN=Secure Global CA O=SecureTrust Corporation -# Label: "Secure Global CA" -# Serial: 9751836167731051554232119481456978597 -# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de -# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b -# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69 ------BEGIN CERTIFICATE----- -MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx -MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg -Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ -iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa -/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ -jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI -HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 -sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w -gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw -KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG -AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L -URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO -H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm -I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY -iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc -f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW ------END CERTIFICATE----- - -# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO Certification Authority O=COMODO CA Limited -# Label: "COMODO Certification Authority" -# Serial: 104350513648249232941998508985834464573 -# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 -# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b -# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 ------BEGIN CERTIFICATE----- -MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB -gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV -BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw -MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl -YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P -RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 -UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI -2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 -Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp -+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ -DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O -nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW -/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g -PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u -QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY -SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv -IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ -RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 -zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd -BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB -ZQ== ------END CERTIFICATE----- - -# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. -# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. -# Label: "Network Solutions Certificate Authority" -# Serial: 116697915152937497490437556386812487904 -# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e -# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce -# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c ------BEGIN CERTIFICATE----- -MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi -MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu -MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp -dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV -UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO -ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz -c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP -OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl -mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF -BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 -qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw -gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu -bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp -dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 -6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ -h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH -/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv -wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN -pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey ------END CERTIFICATE----- - -# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited -# Label: "COMODO ECC Certification Authority" -# Serial: 41578283867086692638256921589707938090 -# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 -# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 -# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 ------BEGIN CERTIFICATE----- -MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT -IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw -MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy -ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N -T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR -FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J -cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW -BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm -fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv -GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= ------END CERTIFICATE----- - -# Issuer: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed -# Subject: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed -# Label: "OISTE WISeKey Global Root GA CA" -# Serial: 86718877871133159090080555911823548314 -# MD5 Fingerprint: bc:6c:51:33:a7:e9:d3:66:63:54:15:72:1b:21:92:93 -# SHA1 Fingerprint: 59:22:a1:e1:5a:ea:16:35:21:f8:98:39:6a:46:46:b0:44:1b:0f:a9 -# SHA256 Fingerprint: 41:c9:23:86:6a:b4:ca:d6:b7:ad:57:80:81:58:2e:02:07:97:a6:cb:df:4f:ff:78:ce:83:96:b3:89:37:d7:f5 ------BEGIN CERTIFICATE----- -MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB -ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly -aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl -ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w -NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G -A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD -VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX -SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR -VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2 -w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF -mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg -4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9 -4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw -EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx -SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2 -ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8 -vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa -hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi -Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ -/L7fCg0= ------END CERTIFICATE----- - -# Issuer: CN=Certigna O=Dhimyotis -# Subject: CN=Certigna O=Dhimyotis -# Label: "Certigna" -# Serial: 18364802974209362175 -# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff -# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97 -# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d ------BEGIN CERTIFICATE----- -MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV -BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X -DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ -BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 -QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny -gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw -zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q -130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 -JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw -ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT -AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj -AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG -9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h -bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc -fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu -HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w -t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw -WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== ------END CERTIFICATE----- - -# Issuer: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center -# Subject: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center -# Label: "Deutsche Telekom Root CA 2" -# Serial: 38 -# MD5 Fingerprint: 74:01:4a:91:b1:08:c4:58:ce:47:cd:f0:dd:11:53:08 -# SHA1 Fingerprint: 85:a4:08:c0:9c:19:3e:5d:51:58:7d:cd:d6:13:30:fd:8c:de:37:bf -# SHA256 Fingerprint: b6:19:1a:50:d0:c3:97:7f:7d:a9:9b:cd:aa:c8:6a:22:7d:ae:b9:67:9e:c7:0b:a3:b0:c9:d9:22:71:c1:70:d3 ------BEGIN CERTIFICATE----- -MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc -MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj -IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB -IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE -RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl -U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 -IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU -ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC -QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr -rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S -NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc -QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH -txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP -BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC -AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp -tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa -IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl -6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ -xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU -Cm26OWMohpLzGITY+9HPBVZkVw== ------END CERTIFICATE----- - -# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc -# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc -# Label: "Cybertrust Global Root" -# Serial: 4835703278459682877484360 -# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1 -# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6 -# SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3 ------BEGIN CERTIFICATE----- -MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG -A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh -bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE -ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS -b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5 -7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS -J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y -HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP -t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz -FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY -XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ -MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw -hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js -MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA -A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj -Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx -XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o -omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc -A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW -WL1WMRJOEcgh4LMRkWXbtKaIOM5V ------END CERTIFICATE----- - -# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority -# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority -# Label: "ePKI Root Certification Authority" -# Serial: 28956088682735189655030529057352760477 -# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3 -# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0 -# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5 ------BEGIN CERTIFICATE----- -MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe -MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 -ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw -IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL -SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH -SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh -ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X -DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 -TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ -fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA -sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU -WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS -nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH -dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip -NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC -AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF -MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH -ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB -uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl -PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP -JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ -gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 -j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 -5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB -o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS -/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z -Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE -W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D -hNQ+IIX3Sj0rnP0qCglN6oH4EZw= ------END CERTIFICATE----- - -# Issuer: O=certSIGN OU=certSIGN ROOT CA -# Subject: O=certSIGN OU=certSIGN ROOT CA -# Label: "certSIGN ROOT CA" -# Serial: 35210227249154 -# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17 -# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b -# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb ------BEGIN CERTIFICATE----- -MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT -AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD -QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP -MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC -ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do -0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ -UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d -RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ -OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv -JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C -AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O -BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ -LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY -MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ -44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I -Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw -i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN -9u6wWk5JRFRYX0KD ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only -# Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only -# Label: "GeoTrust Primary Certification Authority - G3" -# Serial: 28809105769928564313984085209975885599 -# MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05 -# SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd -# SHA256 Fingerprint: b4:78:b8:12:25:0d:f8:78:63:5c:2a:a7:ec:7d:15:5e:aa:62:5e:e8:29:16:e2:cd:29:43:61:88:6c:d1:fb:d4 ------BEGIN CERTIFICATE----- -MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB -mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT -MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s -eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ -BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg -MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0 -BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz -+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm -hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn -5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W -JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL -DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC -huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw -HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB -AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB -zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN -kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD -AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH -SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G -spki4cErx5z481+oghLrGREt ------END CERTIFICATE----- - -# Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only -# Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only -# Label: "thawte Primary Root CA - G2" -# Serial: 71758320672825410020661621085256472406 -# MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f -# SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12 -# SHA256 Fingerprint: a4:31:0d:50:af:18:a6:44:71:90:37:2a:86:af:af:8b:95:1f:fb:43:1d:83:7f:1e:56:88:b4:59:71:ed:15:57 ------BEGIN CERTIFICATE----- -MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp -IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi -BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw -MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh -d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig -YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v -dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/ -BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6 -papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K -DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3 -KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox -XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== ------END CERTIFICATE----- - -# Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only -# Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only -# Label: "thawte Primary Root CA - G3" -# Serial: 127614157056681299805556476275995414779 -# MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31 -# SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2 -# SHA256 Fingerprint: 4b:03:f4:58:07:ad:70:f2:1b:fc:2c:ae:71:c9:fd:e4:60:4c:06:4c:f5:ff:b6:86:ba:e5:db:aa:d7:fd:d3:4c ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB -rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf -Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw -MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV -BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa -Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl -LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u -MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl -ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm -gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8 -YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf -b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9 -9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S -zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk -OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV -HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA -2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW -oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu -t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c -KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM -m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu -MdRAGmI0Nj81Aa6sY6A= ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only -# Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only -# Label: "GeoTrust Primary Certification Authority - G2" -# Serial: 80682863203381065782177908751794619243 -# MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a -# SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0 -# SHA256 Fingerprint: 5e:db:7a:c4:3b:82:a0:6a:87:61:e8:d7:be:49:79:eb:f2:61:1f:7d:d7:9b:f9:1c:1c:6b:56:6a:21:9e:d7:66 ------BEGIN CERTIFICATE----- -MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL -MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj -KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2 -MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 -eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV -BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw -NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV -BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH -MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL -So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal -tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO -BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG -CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT -qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz -rD6ogRLQy7rQkgu2npaqBA+K ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only -# Label: "VeriSign Universal Root Certification Authority" -# Serial: 85209574734084581917763752644031726877 -# MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19 -# SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54 -# SHA256 Fingerprint: 23:99:56:11:27:a5:71:25:de:8c:ef:ea:61:0d:df:2f:a0:78:b5:c8:06:7f:4e:82:82:90:bf:b8:60:e8:4b:3c ------BEGIN CERTIFICATE----- -MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB -vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL -ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp -U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W -ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX -MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0 -IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y -IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh -bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF -9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH -H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H -LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN -/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT -rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud -EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw -WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs -exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud -DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4 -sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+ -seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz -4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+ -BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR -lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3 -7M2CYfE45k+XmCpajQ== ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only -# Label: "VeriSign Class 3 Public Primary Certification Authority - G4" -# Serial: 63143484348153506665311985501458640051 -# MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41 -# SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a -# SHA256 Fingerprint: 69:dd:d7:ea:90:bb:57:c9:3e:13:5d:c8:5e:a6:fc:d5:48:0b:60:32:39:bd:c4:54:fc:75:8b:2a:26:cf:7f:79 ------BEGIN CERTIFICATE----- -MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW -ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp -U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y -aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp -U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg -SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln -biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm -GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve -fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw -AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ -aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj -aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW -kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC -4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga -FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== ------END CERTIFICATE----- - -# Issuer: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) -# Subject: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) -# Label: "NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny" -# Serial: 80544274841616 -# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88 -# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91 -# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98 ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG -EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 -MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl -cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR -dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB -pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM -b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm -aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz -IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT -lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz -AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 -VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG -ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 -BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG -AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M -U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh -bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C -+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC -bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F -uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 -XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= ------END CERTIFICATE----- - -# Issuer: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden -# Subject: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden -# Label: "Staat der Nederlanden Root CA - G2" -# Serial: 10000012 -# MD5 Fingerprint: 7c:a5:0f:f8:5b:9a:7d:6d:30:ae:54:5a:e3:42:a2:8a -# SHA1 Fingerprint: 59:af:82:79:91:86:c7:b4:75:07:cb:cf:03:57:46:eb:04:dd:b7:16 -# SHA256 Fingerprint: 66:8c:83:94:7d:a6:3b:72:4b:ec:e1:74:3c:31:a0:e6:ae:d0:db:8e:c5:b3:1b:e3:77:bb:78:4f:91:b6:71:6f ------BEGIN CERTIFICATE----- -MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX -DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl -ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv -b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291 -qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp -uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU -Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE -pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp -5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M -UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN -GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy -5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv -6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK -eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6 -B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/ -BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov -L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV -HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG -SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS -CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen -5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897 -IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK -gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL -+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL -vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm -bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk -N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC -Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z -ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ== ------END CERTIFICATE----- - -# Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post -# Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post -# Label: "Hongkong Post Root CA 1" -# Serial: 1000 -# MD5 Fingerprint: a8:0d:6f:39:78:b9:43:6d:77:42:6d:98:5a:cc:23:ca -# SHA1 Fingerprint: d6:da:a8:20:8d:09:d2:15:4d:24:b5:2f:cb:34:6e:b2:58:b2:8a:58 -# SHA256 Fingerprint: f9:e6:7d:33:6c:51:00:2a:c0:54:c6:32:02:2d:66:dd:a2:e7:e3:ff:f1:0a:d0:61:ed:31:d8:bb:b4:10:cf:b2 ------BEGIN CERTIFICATE----- -MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx -FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg -Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG -A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr -b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ -jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn -PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh -ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 -nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h -q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED -MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC -mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 -7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB -oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs -EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO -fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi -AmvZWg== ------END CERTIFICATE----- - -# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. -# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. -# Label: "SecureSign RootCA11" -# Serial: 1 -# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26 -# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3 -# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12 ------BEGIN CERTIFICATE----- -MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr -MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG -A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 -MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp -Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD -QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz -i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 -h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV -MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 -UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni -8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC -h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD -VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB -AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm -KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ -X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr -QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 -pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN -QSdJQO7e5iNEOdyhIta6A/I= ------END CERTIFICATE----- - -# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. -# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. -# Label: "Microsec e-Szigno Root CA 2009" -# Serial: 14014712776195784473 -# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1 -# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e -# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78 ------BEGIN CERTIFICATE----- -MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD -VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 -ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G -CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y -OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx -FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp -Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o -dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP -kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc -cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U -fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 -N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC -xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 -+rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G -A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM -Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG -SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h -mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk -ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 -tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c -2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t -HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 -# Label: "GlobalSign Root CA - R3" -# Serial: 4835703278459759426209954 -# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 -# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad -# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b ------BEGIN CERTIFICATE----- -MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 -MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 -RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT -gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm -KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd -QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ -XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw -DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o -LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU -RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp -jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK -6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX -mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs -Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH -WD9f ------END CERTIFICATE----- - -# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 -# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 -# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068" -# Serial: 6047274297262753887 -# MD5 Fingerprint: 73:3a:74:7a:ec:bb:a3:96:a6:c2:e4:e2:c8:9b:c0:c3 -# SHA1 Fingerprint: ae:c5:fb:3f:c8:e1:bf:c4:e5:4f:03:07:5a:9a:e8:00:b7:f7:b6:fa -# SHA256 Fingerprint: 04:04:80:28:bf:1f:28:64:d4:8f:9a:d4:d8:32:94:36:6a:82:88:56:55:3f:3b:14:30:3f:90:14:7f:5d:40:ef ------BEGIN CERTIFICATE----- -MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE -BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h -cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy -MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg -Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 -thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM -cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG -L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i -NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h -X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b -m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy -Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja -EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T -KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF -6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh -OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD -VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD -VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp -cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv -ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl -AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF -661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9 -am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1 -ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481 -PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS -3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k -SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF -3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM -ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g -StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz -Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB -jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V ------END CERTIFICATE----- - -# Issuer: CN=Izenpe.com O=IZENPE S.A. -# Subject: CN=Izenpe.com O=IZENPE S.A. -# Label: "Izenpe.com" -# Serial: 917563065490389241595536686991402621 -# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73 -# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19 -# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -# Issuer: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. -# Subject: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. -# Label: "Chambers of Commerce Root - 2008" -# Serial: 11806822484801597146 -# MD5 Fingerprint: 5e:80:9e:84:5a:0e:65:0b:17:02:f3:55:18:2a:3e:d7 -# SHA1 Fingerprint: 78:6a:74:ac:76:ab:14:7f:9c:6a:30:50:ba:9e:a8:7e:fe:9a:ce:3c -# SHA256 Fingerprint: 06:3e:4a:fa:c4:91:df:d3:32:f3:08:9b:85:42:e9:46:17:d8:93:d7:fe:94:4e:10:a7:93:7e:e2:9d:96:93:c0 ------BEGIN CERTIFICATE----- -MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD -VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 -IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 -MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz -IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz -MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj -dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw -EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp -MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G -CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9 -28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq -VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q -DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR -5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL -ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a -Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl -UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s -+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5 -Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj -ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx -hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV -HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1 -+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN -YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t -L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy -ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt -IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV -HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w -DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW -PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF -5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1 -glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH -FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2 -pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD -xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG -tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq -jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De -fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg -OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ -d0jQ ------END CERTIFICATE----- - -# Issuer: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. -# Subject: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. -# Label: "Global Chambersign Root - 2008" -# Serial: 14541511773111788494 -# MD5 Fingerprint: 9e:80:ff:78:01:0c:2e:c1:36:bd:fe:96:90:6e:08:f3 -# SHA1 Fingerprint: 4a:bd:ee:ec:95:0d:35:9c:89:ae:c7:52:a1:2c:5b:29:f6:d6:aa:0c -# SHA256 Fingerprint: 13:63:35:43:93:34:a7:69:80:16:a0:d3:24:de:72:28:4e:07:9d:7b:52:20:bb:8f:bd:74:78:16:ee:be:ba:ca ------BEGIN CERTIFICATE----- -MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD -VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 -IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 -MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD -aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx -MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy -cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG -A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl -BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI -hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed -KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7 -G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2 -zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4 -ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG -HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2 -Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V -yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e -beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r -6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh -wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog -zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW -BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr -ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp -ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk -cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt -YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC -CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow -KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI -hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ -UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz -X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x -fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz -a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd -Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd -SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O -AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso -M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge -v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z -09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B ------END CERTIFICATE----- - -# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. -# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. -# Label: "Go Daddy Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 -# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b -# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT -EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp -ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz -NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH -EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE -AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD -E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH -/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy -DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh -GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR -tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA -AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE -FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX -WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu -9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr -gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo -2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO -LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI -4uJEvlz36hz1 ------END CERTIFICATE----- - -# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Label: "Starfield Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 -# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e -# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT -HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs -ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw -MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 -b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj -aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp -Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg -nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 -HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N -Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN -dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 -HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO -BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G -CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU -sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 -4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg -8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K -pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 -mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 ------END CERTIFICATE----- - -# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Label: "Starfield Services Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2 -# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f -# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5 ------BEGIN CERTIFICATE----- -MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT -HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs -ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 -MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD -VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy -ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy -dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p -OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 -8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K -Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe -hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk -6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw -DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q -AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI -bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB -ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z -qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd -iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn -0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN -sSi6 ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Commercial O=AffirmTrust -# Subject: CN=AffirmTrust Commercial O=AffirmTrust -# Label: "AffirmTrust Commercial" -# Serial: 8608355977964138876 -# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7 -# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7 -# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7 ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz -dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL -MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp -cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP -Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr -ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL -MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 -yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr -VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ -nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ -KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG -XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj -vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt -Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g -N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC -nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Networking O=AffirmTrust -# Subject: CN=AffirmTrust Networking O=AffirmTrust -# Label: "AffirmTrust Networking" -# Serial: 8957382827206547757 -# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f -# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f -# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz -dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL -MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp -cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y -YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua -kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL -QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp -6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG -yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i -QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ -KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO -tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu -QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ -Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u -olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 -x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Premium O=AffirmTrust -# Subject: CN=AffirmTrust Premium O=AffirmTrust -# Label: "AffirmTrust Premium" -# Serial: 7893706540734352110 -# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57 -# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27 -# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a ------BEGIN CERTIFICATE----- -MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz -dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG -A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U -cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf -qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ -JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ -+jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS -s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 -HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 -70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG -V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S -qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S -5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia -C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX -OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE -FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 -KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg -Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B -8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ -MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc -0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ -u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF -u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH -YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 -GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO -RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e -KeC2uAloGRwYQw== ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust -# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust -# Label: "AffirmTrust Premium ECC" -# Serial: 8401224907861490260 -# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d -# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb -# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23 ------BEGIN CERTIFICATE----- -MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC -VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ -cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ -BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt -VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D -0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 -ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G -A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs -aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I -flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== ------END CERTIFICATE----- - -# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Label: "Certum Trusted Network CA" -# Serial: 279744 -# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78 -# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e -# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e ------BEGIN CERTIFICATE----- -MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM -MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D -ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU -cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 -WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg -Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw -IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH -UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM -TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU -BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM -kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x -AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV -HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y -sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL -I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 -J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY -VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI -03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= ------END CERTIFICATE----- - -# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA -# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA -# Label: "TWCA Root Certification Authority" -# Serial: 1 -# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79 -# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48 -# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44 ------BEGIN CERTIFICATE----- -MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES -MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU -V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz -WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO -LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE -AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH -K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX -RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z -rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx -3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq -hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC -MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls -XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D -lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn -aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ -YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== ------END CERTIFICATE----- - -# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 -# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 -# Label: "Security Communication RootCA2" -# Serial: 0 -# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43 -# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74 -# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6 ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl -MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe -U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX -DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy -dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj -YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV -OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr -zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM -VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ -hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO -ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw -awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs -OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 -DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF -coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc -okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 -t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy -1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ -SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions RootCA 2011" -# Serial: 0 -# MD5 Fingerprint: 73:9f:4c:4b:73:5b:79:e9:fa:ba:1c:ef:6e:cb:d5:c9 -# SHA1 Fingerprint: fe:45:65:9b:79:03:5b:98:a1:61:b5:51:2e:ac:da:58:09:48:22:4d -# SHA256 Fingerprint: bc:10:4f:15:a4:8b:e7:09:dc:a5:42:a7:e1:d4:b9:df:6f:05:45:27:e8:02:ea:a9:2d:59:54:44:25:8a:fe:71 ------BEGIN CERTIFICATE----- -MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix -RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 -dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p -YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw -NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK -EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl -cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl -c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz -dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ -fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns -bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD -75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP -FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV -HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp -5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu -b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA -A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p -6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 -TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7 -dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys -Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI -l7WdmplNsDz4SgCbZN2fOUvRJ9e4 ------END CERTIFICATE----- - -# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 -# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 -# Label: "Actalis Authentication Root CA" -# Serial: 6271844772424770508 -# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6 -# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac -# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66 ------BEGIN CERTIFICATE----- -MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE -BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w -MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 -IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC -SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 -ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv -UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX -4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 -KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ -gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb -rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ -51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F -be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe -KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F -v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn -fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 -jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz -ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt -ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL -e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 -jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz -WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V -SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j -pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX -X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok -fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R -K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU -ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU -LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT -LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== ------END CERTIFICATE----- - -# Issuer: O=Trustis Limited OU=Trustis FPS Root CA -# Subject: O=Trustis Limited OU=Trustis FPS Root CA -# Label: "Trustis FPS Root CA" -# Serial: 36053640375399034304724988975563710553 -# MD5 Fingerprint: 30:c9:e7:1e:6b:e6:14:eb:65:b2:16:69:20:31:67:4d -# SHA1 Fingerprint: 3b:c0:38:0b:33:c3:f6:a6:0c:86:15:22:93:d9:df:f5:4b:81:c0:04 -# SHA256 Fingerprint: c1:b4:82:99:ab:a5:20:8f:e9:63:0a:ce:55:ca:68:a0:3e:da:5a:51:9c:88:02:a0:d3:a6:73:be:8f:8e:55:7d ------BEGIN CERTIFICATE----- -MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF -MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL -ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx -MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc -MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+ -AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH -iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj -vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA -0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB -OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/ -BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E -FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01 -GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW -zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4 -1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE -f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F -jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN -ZetX2fNXlrtIzYE= ------END CERTIFICATE----- - -# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 -# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 -# Label: "Buypass Class 2 Root CA" -# Serial: 2 -# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29 -# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99 -# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48 ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg -Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow -TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw -HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB -BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr -6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV -L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 -1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx -MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ -QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB -arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr -Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi -FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS -P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN -9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP -AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz -uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h -9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s -A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t -OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo -+fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 -KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 -DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us -H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ -I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 -5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h -3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz -Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= ------END CERTIFICATE----- - -# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 -# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 -# Label: "Buypass Class 3 Root CA" -# Serial: 2 -# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec -# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57 -# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg -Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow -TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw -HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB -BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y -ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E -N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 -tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX -0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c -/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X -KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY -zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS -O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D -34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP -K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 -AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv -Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj -QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV -cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS -IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 -HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa -O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv -033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u -dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE -kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 -3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD -u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq -4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= ------END CERTIFICATE----- - -# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Label: "T-TeleSec GlobalRoot Class 3" -# Serial: 1 -# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef -# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1 -# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx -KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd -BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl -YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 -OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy -aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 -ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN -8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ -RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 -hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 -ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM -EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 -A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy -WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ -1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 -6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT -91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml -e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p -TpPDpFQUWw== ------END CERTIFICATE----- - -# Issuer: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus -# Subject: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus -# Label: "EE Certification Centre Root CA" -# Serial: 112324828676200291871926431888494945866 -# MD5 Fingerprint: 43:5e:88:d4:7d:1a:4a:7e:fd:84:2e:52:eb:01:d4:6f -# SHA1 Fingerprint: c9:a8:b9:e7:55:80:5e:58:e3:53:77:a7:25:eb:af:c3:7b:27:cc:d7 -# SHA256 Fingerprint: 3e:84:ba:43:42:90:85:16:e7:75:73:c0:99:2f:09:79:ca:08:4e:46:85:68:1f:f1:95:cc:ba:8a:22:9b:8a:76 ------BEGIN CERTIFICATE----- -MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1 -MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1 -czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG -CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy -MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl -ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS -b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy -euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO -bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw -WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d -MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE -1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD -VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/ -zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB -BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF -BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV -v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG -E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u -uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW -iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v -GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0= ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH -# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH -# Label: "D-TRUST Root Class 3 CA 2 2009" -# Serial: 623603 -# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f -# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0 -# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1 ------BEGIN CERTIFICATE----- -MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF -MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD -bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha -ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM -HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 -UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 -tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R -ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM -lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp -/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G -A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G -A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj -dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy -MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl -cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js -L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL -BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni -acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 -o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K -zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 -PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y -Johw1+qRzT65ysCQblrGXnRl11z+o+I= ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH -# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH -# Label: "D-TRUST Root Class 3 CA 2 EV 2009" -# Serial: 623604 -# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6 -# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83 -# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81 ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF -MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD -bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw -NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV -BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn -ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 -3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z -qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR -p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 -HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw -ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea -HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw -Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh -c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E -RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt -dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku -Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp -3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 -nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF -CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na -xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX -KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 ------END CERTIFICATE----- - -# Issuer: CN=CA Disig Root R2 O=Disig a.s. -# Subject: CN=CA Disig Root R2 O=Disig a.s. -# Label: "CA Disig Root R2" -# Serial: 10572350602393338211 -# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03 -# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71 -# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03 ------BEGIN CERTIFICATE----- -MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV -BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu -MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy -MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx -EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw -ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe -NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH -PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I -x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe -QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR -yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO -QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 -H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ -QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD -i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs -nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 -rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud -DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI -hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM -tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf -GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb -lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka -+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal -TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i -nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 -gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr -G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os -zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x -L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL ------END CERTIFICATE----- - -# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV -# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV -# Label: "ACCVRAIZ1" -# Serial: 6828503384748696800 -# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02 -# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17 -# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13 ------BEGIN CERTIFICATE----- -MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE -AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw -CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ -BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND -VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb -qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY -HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo -G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA -lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr -IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/ -0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH -k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47 -4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO -m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa -cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl -uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI -KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls -ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG -AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 -VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT -VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG -CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA -cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA -QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA -7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA -cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA -QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA -czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu -aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt -aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud -DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF -BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp -D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU -JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m -AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD -vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms -tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH -7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h -I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA -h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF -d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H -pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 ------END CERTIFICATE----- - -# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA -# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA -# Label: "TWCA Global Root CA" -# Serial: 3262 -# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96 -# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65 -# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b ------BEGIN CERTIFICATE----- -MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx -EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT -VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5 -NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT -B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF -10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz -0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh -MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH -zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc -46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2 -yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi -laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP -oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA -BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE -qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm -4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL -1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn -LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF -H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo -RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+ -nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh -15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW -6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW -nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j -wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz -aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy -KwbQBM0= ------END CERTIFICATE----- - -# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera -# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera -# Label: "TeliaSonera Root CA v1" -# Serial: 199041966741090107964904287217786801558 -# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c -# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37 -# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89 ------BEGIN CERTIFICATE----- -MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw -NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv -b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD -VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2 -MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F -VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1 -7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X -Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+ -/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs -81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm -dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe -Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu -sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4 -pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs -slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ -arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD -VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG -9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl -dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx -0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj -TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed -Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7 -Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI -OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7 -vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW -t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn -HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx -SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= ------END CERTIFICATE----- - -# Issuer: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi -# Subject: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi -# Label: "E-Tugra Certification Authority" -# Serial: 7667447206703254355 -# MD5 Fingerprint: b8:a1:03:63:b0:bd:21:71:70:8a:6f:13:3a:bb:79:49 -# SHA1 Fingerprint: 51:c6:e7:08:49:06:6e:f3:92:d4:5c:a0:0d:6d:a3:62:8f:c3:52:39 -# SHA256 Fingerprint: b0:bf:d5:2b:b0:d7:d9:bd:92:bf:5d:4d:c1:3d:a2:55:c0:2c:54:2f:37:83:65:ea:89:39:11:f5:5e:55:f2:3c ------BEGIN CERTIFICATE----- -MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV -BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC -aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV -BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1 -Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz -MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+ -BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp -em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN -ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY -B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH -D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF -Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo -q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D -k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH -fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut -dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM -ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8 -zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn -rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX -U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6 -Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5 -XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF -Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR -HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY -GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c -77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3 -+GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK -vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6 -FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl -yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P -AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD -y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d -NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA== ------END CERTIFICATE----- - -# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Label: "T-TeleSec GlobalRoot Class 2" -# Serial: 1 -# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a -# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9 -# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52 ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx -KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd -BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl -YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1 -OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy -aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 -ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd -AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC -FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi -1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq -jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ -wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/ -WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy -NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC -uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw -IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6 -g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN -9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP -BSeOE6Fuwg== ------END CERTIFICATE----- - -# Issuer: CN=Atos TrustedRoot 2011 O=Atos -# Subject: CN=Atos TrustedRoot 2011 O=Atos -# Label: "Atos TrustedRoot 2011" -# Serial: 6643877497813316402 -# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56 -# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21 -# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74 ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE -AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG -EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM -FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC -REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp -Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM -VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+ -SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ -4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L -cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi -eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV -HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG -A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 -DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j -vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP -DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc -maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D -lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv -KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 1 G3" -# Serial: 687049649626669250736271037606554624078720034195 -# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab -# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67 -# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00 -MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV -wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe -rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341 -68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh -4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp -UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o -abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc -3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G -KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt -hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO -Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt -zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD -ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC -MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2 -cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN -qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5 -YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv -b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2 -8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k -NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj -ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp -q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt -nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 2 G3" -# Serial: 390156079458959257446133169266079962026824725800 -# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06 -# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36 -# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00 -MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf -qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW -n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym -c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+ -O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1 -o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j -IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq -IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz -8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh -vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l -7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG -cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD -ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 -AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC -roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga -W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n -lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE -+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV -csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd -dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg -KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM -HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4 -WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 3 G3" -# Serial: 268090761170461462463995952157327242137089239581 -# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7 -# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d -# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00 -MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR -/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu -FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR -U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c -ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR -FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k -A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw -eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl -sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp -VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q -A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ -ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD -ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px -KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI -FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv -oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg -u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP -0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf -3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl -8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+ -DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN -PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ -ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0 ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root G2" -# Serial: 15385348160840213938643033620894905419 -# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d -# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f -# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85 ------BEGIN CERTIFICATE----- -MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv -b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl -cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA -n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc -biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp -EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA -bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu -YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB -AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW -BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI -QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I -0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni -lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9 -B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv -ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo -IhNzbM8m9Yop5w== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root G3" -# Serial: 15459312981008553731928384953135426796 -# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb -# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89 -# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2 ------BEGIN CERTIFICATE----- -MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw -CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu -ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg -RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu -Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq -hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf -Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q -RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD -AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY -JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv -6pZjamVFkpUBtA== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root G2" -# Serial: 4293743540046975378534879503202253541 -# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44 -# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4 -# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f ------BEGIN CERTIFICATE----- -MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH -MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI -2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx -1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ -q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz -tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ -vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP -BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV -5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY -1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 -NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG -Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 -8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe -pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl -MrY= ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root G3" -# Serial: 7089244469030293291760083333884364146 -# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca -# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e -# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0 ------BEGIN CERTIFICATE----- -MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw -CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu -ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe -Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw -EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x -IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF -K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG -fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO -Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd -BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx -AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ -oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 -sycX ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Trusted Root G4" -# Serial: 7451500558977370777930084869016614236 -# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49 -# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4 -# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88 ------BEGIN CERTIFICATE----- -MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg -RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu -Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y -ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If -xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV -ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO -DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ -jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/ -CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi -EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM -fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY -uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK -chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t -9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD -ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2 -SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd -+SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc -fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa -sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N -cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N -0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie -4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI -r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1 -/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm -gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+ ------END CERTIFICATE----- - -# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited -# Label: "COMODO RSA Certification Authority" -# Serial: 101909084537582093308941363524873193117 -# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18 -# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4 -# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34 ------BEGIN CERTIFICATE----- -MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB -hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV -BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 -MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT -EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR -Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR -6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X -pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC -9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV -/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf -Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z -+pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w -qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah -SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC -u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf -Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq -crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E -FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB -/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl -wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM -4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV -2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna -FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ -CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK -boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke -jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL -S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb -QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl -0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB -NVOFBkpdn627G190 ------END CERTIFICATE----- - -# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network -# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network -# Label: "USERTrust RSA Certification Authority" -# Serial: 2645093764781058787591871645665788717 -# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5 -# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e -# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2 ------BEGIN CERTIFICATE----- -MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB -iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl -cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV -BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw -MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV -BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU -aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy -dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B -3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY -tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ -Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 -VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT -79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 -c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT -Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l -c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee -UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE -Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd -BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G -A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF -Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO -VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 -ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs -8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR -iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze -Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ -XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ -qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB -VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB -L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG -jjxDah2nGN59PRbxYvnKkKj9 ------END CERTIFICATE----- - -# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network -# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network -# Label: "USERTrust ECC Certification Authority" -# Serial: 123013823720199481456569720443997572134 -# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1 -# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0 -# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a ------BEGIN CERTIFICATE----- -MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL -MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl -eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT -JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx -MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT -Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg -VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo -I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng -o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G -A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB -zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW -RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 -# Label: "GlobalSign ECC Root CA - R4" -# Serial: 14367148294922964480859022125800977897474 -# MD5 Fingerprint: 20:f0:27:68:d1:7e:a0:9d:0e:e6:2a:ca:df:5c:89:8e -# SHA1 Fingerprint: 69:69:56:2e:40:80:f4:24:a1:e7:19:9f:14:ba:f3:ee:58:ab:6a:bb -# SHA256 Fingerprint: be:c9:49:11:c2:95:56:76:db:6c:0a:55:09:86:d7:6e:3b:a0:05:66:7c:44:2c:97:62:b4:fb:b7:73:de:22:8c ------BEGIN CERTIFICATE----- -MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEk -MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpH -bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX -DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD -QSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu -MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJ -FspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAw -DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61F -uOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX -kPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTs -ewv4n4Q= ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 -# Label: "GlobalSign ECC Root CA - R5" -# Serial: 32785792099990507226680698011560947931244 -# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08 -# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa -# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24 ------BEGIN CERTIFICATE----- -MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk -MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH -bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX -DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD -QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu -MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc -8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke -hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI -KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg -515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO -xwy8p2Fp8fc74SrL+SvzZpA3 ------END CERTIFICATE----- - -# Issuer: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden -# Subject: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden -# Label: "Staat der Nederlanden Root CA - G3" -# Serial: 10003001 -# MD5 Fingerprint: 0b:46:67:07:db:10:2f:19:8c:35:50:60:d1:0b:f4:37 -# SHA1 Fingerprint: d8:eb:6b:41:51:92:59:e0:f3:e7:85:00:c0:3d:b6:88:97:c9:ee:fc -# SHA256 Fingerprint: 3c:4f:b0:b9:5a:b8:b3:00:32:f4:32:b8:6f:53:5f:e1:72:c1:85:d0:fd:39:86:58:37:cf:36:18:7f:a6:f4:28 ------BEGIN CERTIFICATE----- -MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloX -DTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl -ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv -b3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4yolQP -cPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WW -IkYFsO2tx1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqX -xz8ecAgwoNzFs21v0IJyEavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFy -KJLZWyNtZrVtB0LrpjPOktvA9mxjeM3KTj215VKb8b475lRgsGYeCasH/lSJEULR -9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUurmkVLoR9BvUhTFXFkC4az -5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU51nus6+N8 -6U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7 -Ngzp07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHP -bMk7ccHViLVlvMDoFxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXt -BznaqB16nzaeErAMZRKQFWDZJkBE41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTt -XUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMBAAGjQjBAMA8GA1UdEwEB/wQF -MAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleuyjWcLhL75Lpd -INyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD -U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwp -LiniyMMB8jPqKqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8 -Ipf3YF3qKS9Ysr1YvY2WTxB1v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixp -gZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA8KCWAg8zxXHzniN9lLf9OtMJgwYh -/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b8KKaa8MFSu1BYBQw -0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0rmj1A -fsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq -4BZ+Extq1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR -1VmiiXTTn74eS9fGbbeIJG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/ -QFH1T/U67cjF68IeHRaVesd+QnGTbksVtzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM -94B7IWcnMFk= ------END CERTIFICATE----- - -# Issuer: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden -# Subject: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden -# Label: "Staat der Nederlanden EV Root CA" -# Serial: 10000013 -# MD5 Fingerprint: fc:06:af:7b:e8:1a:f1:9a:b4:e8:d2:70:1f:c0:f5:ba -# SHA1 Fingerprint: 76:e2:7e:c1:4f:db:82:c1:c0:a6:75:b5:05:be:3d:29:b4:ed:db:bb -# SHA256 Fingerprint: 4d:24:91:41:4c:fe:95:67:46:ec:4c:ef:a6:cf:6f:72:e2:8a:13:29:43:2f:9d:8a:90:7a:c4:cb:5d:ad:c1:5a ------BEGIN CERTIFICATE----- -MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0y -MjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg -TmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBS -b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrS -M4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nC -UiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3d -Z//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46p -rfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13l -pJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXb -j5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxC -KFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS -/ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0X -cgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH -1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrP -px9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7 -MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI -eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u -2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHS -v4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTC -wPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKy -CqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2e -vTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6 -Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIa -Gl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeL -eG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8 -FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc -7uzXLg== ------END CERTIFICATE----- - -# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust -# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust -# Label: "IdenTrust Commercial Root CA 1" -# Serial: 13298821034946342390520003877796839426 -# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7 -# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25 -# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK -MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu -VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw -MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw -JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT -3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU -+ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp -S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1 -bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi -T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL -vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK -Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK -dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT -c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv -l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N -iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD -ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH -6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt -LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93 -nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3 -+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK -W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT -AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq -l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG -4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ -mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A -7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H ------END CERTIFICATE----- - -# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust -# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust -# Label: "IdenTrust Public Sector Root CA 1" -# Serial: 13298821034946342390521976156843933698 -# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba -# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd -# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f ------BEGIN CERTIFICATE----- -MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN -MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu -VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN -MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0 -MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7 -ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy -RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS -bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF -/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R -3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw -EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy -9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V -GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ -2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV -WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD -W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN -AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj -t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV -DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9 -TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G -lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW -mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df -WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5 -+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ -tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA -GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv -8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only -# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only -# Label: "Entrust Root Certification Authority - G2" -# Serial: 1246989352 -# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2 -# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4 -# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39 ------BEGIN CERTIFICATE----- -MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50 -cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs -IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz -dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy -NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu -dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt -dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0 -aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK -AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T -RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN -cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW -wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1 -U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0 -jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN -BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/ -jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ -Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v -1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R -nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH -VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g== ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only -# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only -# Label: "Entrust Root Certification Authority - EC1" -# Serial: 51543124481930649114116133369 -# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc -# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47 -# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5 ------BEGIN CERTIFICATE----- -MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG -A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3 -d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu -dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq -RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy -MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD -VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 -L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g -Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi -A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt -ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH -Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O -BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC -R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX -hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G ------END CERTIFICATE----- - -# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority -# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority -# Label: "CFCA EV ROOT" -# Serial: 407555286 -# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30 -# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83 -# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd ------BEGIN CERTIFICATE----- -MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD -TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y -aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx -MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j -aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP -T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03 -sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL -TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5 -/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp -7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz -EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt -hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP -a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot -aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg -TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV -PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv -cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL -tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd -BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB -ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT -ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL -jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS -ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy -P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19 -xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d -Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN -5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe -/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z -AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ -5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su ------END CERTIFICATE----- - -# Issuer: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 -# Subject: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 -# Label: "Certinomis - Root CA" -# Serial: 1 -# MD5 Fingerprint: 14:0a:fd:8d:a8:28:b5:38:69:db:56:7e:61:22:03:3f -# SHA1 Fingerprint: 9d:70:bb:01:a5:a4:a0:18:11:2e:f7:1c:01:b9:32:c5:34:e7:88:a8 -# SHA256 Fingerprint: 2a:99:f5:bc:11:74:b7:3c:bb:1d:62:08:84:e0:1c:34:e5:1c:cb:39:78:da:12:5f:0e:33:26:88:83:bf:41:58 ------BEGIN CERTIFICATE----- -MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjET -MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAb -BgNVBAMTFENlcnRpbm9taXMgLSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMz -MTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMx -FzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRDZXJ0aW5vbWlzIC0g -Um9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQosP5L2 -fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJfl -LieY6pOod5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQV -WZUKxkd8aRi5pwP5ynapz8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDF -TKWrteoB4owuZH9kb/2jJZOLyKIOSY008B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb -5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09xRLWtwHkziOC/7aOgFLSc -CbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE6OXWk6Ri -wsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJ -wx3tFvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SG -m/lg0h9tkQPTYKbVPZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4 -F2iw4lNVYC2vPsKD2NkJK/DAZNuHi5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZng -WVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I6tNxIqSSaHh0 -2TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF -AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/ -0KGRHCwPT5iVWVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWw -F6YSjNRieOpWauwK0kDDPAUwPk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZS -g081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAXlCOotQqSD7J6wWAsOMwaplv/8gzj -qh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJy29SWwNyhlCVCNSN -h4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9Iff/ -ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8V -btaw5BngDwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwj -Y/M50n92Uaf0yKHxDHYiI0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ -8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nMcyrDflOR1m749fPH0FFNjkulW+YZFzvW -gQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVrhkIGuUE= ------END CERTIFICATE----- - -# Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed -# Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed -# Label: "OISTE WISeKey Global Root GB CA" -# Serial: 157768595616588414422159278966750757568 -# MD5 Fingerprint: a4:eb:b9:61:28:2e:b7:2f:98:b0:35:26:90:99:51:1d -# SHA1 Fingerprint: 0f:f9:40:76:18:d3:d7:6a:4b:98:f0:a8:35:9e:0c:fd:27:ac:cc:ed -# SHA256 Fingerprint: 6b:9c:08:e8:6e:b0:f7:67:cf:ad:65:cd:98:b6:21:49:e5:49:4a:67:f5:84:5e:7b:d1:ed:01:9f:27:b8:6b:d6 ------BEGIN CERTIFICATE----- -MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt -MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg -Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i -YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x -CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG -b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh -bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3 -HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx -WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX -1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk -u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P -99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r -M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB -BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh -cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5 -gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO -ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf -aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic -Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= ------END CERTIFICATE----- - -# Issuer: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. -# Subject: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. -# Label: "SZAFIR ROOT CA2" -# Serial: 357043034767186914217277344587386743377558296292 -# MD5 Fingerprint: 11:64:c1:89:b0:24:b1:8c:b1:07:7e:89:9e:51:9e:99 -# SHA1 Fingerprint: e2:52:fa:95:3f:ed:db:24:60:bd:6e:28:f3:9c:cc:cf:5e:b3:3f:de -# SHA256 Fingerprint: a1:33:9d:33:28:1a:0b:56:e5:57:d3:d3:2b:1c:e7:f9:36:7e:b0:94:bd:5f:a7:2a:7e:50:04:c8:de:d7:ca:fe ------BEGIN CERTIFICATE----- -MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL -BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6 -ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw -NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L -cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg -Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN -QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT -3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw -3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6 -3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5 -BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN -XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD -AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF -AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw -8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG -nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP -oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy -d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg -LvWpCz/UXeHPhJ/iGcJfitYgHuNztw== ------END CERTIFICATE----- - -# Issuer: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Subject: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Label: "Certum Trusted Network CA 2" -# Serial: 44979900017204383099463764357512596969 -# MD5 Fingerprint: 6d:46:9e:d9:25:6d:08:23:5b:5e:74:7d:1e:27:db:f2 -# SHA1 Fingerprint: d3:dd:48:3e:2b:bf:4c:05:e8:af:10:f5:fa:76:26:cf:d3:dc:30:92 -# SHA256 Fingerprint: b6:76:f2:ed:da:e8:77:5c:d3:6c:b0:f6:3c:d1:d4:60:39:61:f4:9e:62:65:ba:01:3a:2f:03:07:b6:d0:b8:04 ------BEGIN CERTIFICATE----- -MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB -gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu -QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG -A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz -OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ -VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3 -b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA -DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn -0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB -OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE -fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E -Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m -o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i -sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW -OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez -Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS -adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n -3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC -AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ -F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf -CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29 -XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm -djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/ -WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb -AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq -P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko -b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj -XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P -5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi -DrW5viSP ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions RootCA 2015" -# Serial: 0 -# MD5 Fingerprint: ca:ff:e2:db:03:d9:cb:4b:e9:0f:ad:84:fd:7b:18:ce -# SHA1 Fingerprint: 01:0c:06:95:a6:98:19:14:ff:bf:5f:c6:b0:b6:95:ea:29:e9:12:a6 -# SHA256 Fingerprint: a0:40:92:9a:02:ce:53:b4:ac:f4:f2:ff:c6:98:1c:e4:49:6f:75:5e:6d:45:fe:0b:2a:69:2b:cd:52:52:3f:36 ------BEGIN CERTIFICATE----- -MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix -DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k -IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT -N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v -dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG -A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh -ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx -QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 -dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA -4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0 -AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10 -4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C -ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV -9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD -gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6 -Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq -NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko -LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc -Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd -ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I -XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI -M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot -9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V -Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea -j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh -X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ -l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf -bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4 -pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK -e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0 -vm9qp/UsQu0yrbYhnr68 ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions ECC RootCA 2015" -# Serial: 0 -# MD5 Fingerprint: 81:e5:b4:17:eb:c2:f5:e1:4b:0d:41:7b:49:92:fe:ef -# SHA1 Fingerprint: 9f:f1:71:8d:92:d5:9a:f3:7d:74:97:b4:bc:6f:84:68:0b:ba:b6:66 -# SHA256 Fingerprint: 44:b5:45:aa:8a:25:e6:5a:73:ca:15:dc:27:fc:36:d2:4c:1c:b9:95:3a:06:65:39:b1:15:82:dc:48:7b:48:33 ------BEGIN CERTIFICATE----- -MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN -BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl -c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl -bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv -b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ -BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj -YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5 -MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0 -dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg -QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa -jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi -C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep -lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof -TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR ------END CERTIFICATE----- - -# Issuer: CN=ISRG Root X1 O=Internet Security Research Group -# Subject: CN=ISRG Root X1 O=Internet Security Research Group -# Label: "ISRG Root X1" -# Serial: 172886928669790476064670243504169061120 -# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e -# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8 -# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6 ------BEGIN CERTIFICATE----- -MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw -TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh -cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 -WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu -ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY -MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc -h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ -0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U -A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW -T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH -B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC -B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv -KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn -OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn -jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw -qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI -rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq -hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL -ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ -3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK -NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 -ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur -TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC -jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc -oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq -4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA -mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d -emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= ------END CERTIFICATE----- - -# Issuer: O=FNMT-RCM OU=AC RAIZ FNMT-RCM -# Subject: O=FNMT-RCM OU=AC RAIZ FNMT-RCM -# Label: "AC RAIZ FNMT-RCM" -# Serial: 485876308206448804701554682760554759 -# MD5 Fingerprint: e2:09:04:b4:d3:bd:d1:a0:14:fd:1a:d2:47:c4:57:1d -# SHA1 Fingerprint: ec:50:35:07:b2:15:c4:95:62:19:e2:a8:9a:5b:42:99:2c:4c:2c:20 -# SHA256 Fingerprint: eb:c5:57:0c:29:01:8c:4d:67:b1:aa:12:7b:af:12:f7:03:b4:61:1e:bc:17:b7:da:b5:57:38:94:17:9b:93:fa ------BEGIN CERTIFICATE----- -MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx -CzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ -WiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ -BgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG -Tk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/ -yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf -BBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz -WHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF -tBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z -374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC -IfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL -mbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7 -wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS -MKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2 -ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet -UqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw -AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H -YJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3 -LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD -nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1 -RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM -LVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf -77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N -JpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm -fZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp -6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp -1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B -9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok -RqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv -uu8wd+RU4riEmViAqhOLUTpPSPaLtrM= ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 1 O=Amazon -# Subject: CN=Amazon Root CA 1 O=Amazon -# Label: "Amazon Root CA 1" -# Serial: 143266978916655856878034712317230054538369994 -# MD5 Fingerprint: 43:c6:bf:ae:ec:fe:ad:2f:18:c6:88:68:30:fc:c8:e6 -# SHA1 Fingerprint: 8d:a7:f9:65:ec:5e:fc:37:91:0f:1c:6e:59:fd:c1:cc:6a:6e:de:16 -# SHA256 Fingerprint: 8e:cd:e6:88:4f:3d:87:b1:12:5b:a3:1a:c3:fc:b1:3d:70:16:de:7f:57:cc:90:4f:e1:cb:97:c6:ae:98:19:6e ------BEGIN CERTIFICATE----- -MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF -ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 -b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv -b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj -ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM -9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw -IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6 -VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L -93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm -jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA -A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI -U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs -N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv -o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU -5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy -rqXRfboQnoZsG4q5WTP468SQvvG5 ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 2 O=Amazon -# Subject: CN=Amazon Root CA 2 O=Amazon -# Label: "Amazon Root CA 2" -# Serial: 143266982885963551818349160658925006970653239 -# MD5 Fingerprint: c8:e5:8d:ce:a8:42:e2:7a:c0:2a:5c:7c:9e:26:bf:66 -# SHA1 Fingerprint: 5a:8c:ef:45:d7:a6:98:59:76:7a:8c:8b:44:96:b5:78:cf:47:4b:1a -# SHA256 Fingerprint: 1b:a5:b2:aa:8c:65:40:1a:82:96:01:18:f8:0b:ec:4f:62:30:4d:83:ce:c4:71:3a:19:c3:9c:01:1e:a4:6d:b4 ------BEGIN CERTIFICATE----- -MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF -ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 -b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv -b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK -gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ -W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg -1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K -8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r -2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me -z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR -8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj -mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz -7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6 -+XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI -0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB -Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm -UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2 -LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY -+gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS -k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl -7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm -btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl -urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+ -fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63 -n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE -76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H -9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT -4PsJYGw= ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 3 O=Amazon -# Subject: CN=Amazon Root CA 3 O=Amazon -# Label: "Amazon Root CA 3" -# Serial: 143266986699090766294700635381230934788665930 -# MD5 Fingerprint: a0:d4:ef:0b:f7:b5:d8:49:95:2a:ec:f5:c4:fc:81:87 -# SHA1 Fingerprint: 0d:44:dd:8c:3c:8c:1a:1a:58:75:64:81:e9:0f:2e:2a:ff:b3:d2:6e -# SHA256 Fingerprint: 18:ce:6c:fe:7b:f1:4e:60:b2:e3:47:b8:df:e8:68:cb:31:d0:2e:bb:3a:da:27:15:69:f5:03:43:b4:6d:b3:a4 ------BEGIN CERTIFICATE----- -MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5 -MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g -Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG -A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg -Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl -ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr -ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr -BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM -YyRIHN8wfdVoOw== ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 4 O=Amazon -# Subject: CN=Amazon Root CA 4 O=Amazon -# Label: "Amazon Root CA 4" -# Serial: 143266989758080763974105200630763877849284878 -# MD5 Fingerprint: 89:bc:27:d5:eb:17:8d:06:6a:69:d5:fd:89:47:b4:cd -# SHA1 Fingerprint: f6:10:84:07:d6:f8:bb:67:98:0c:c2:e2:44:c2:eb:ae:1c:ef:63:be -# SHA256 Fingerprint: e3:5d:28:41:9e:d0:20:25:cf:a6:90:38:cd:62:39:62:45:8d:a5:c6:95:fb:de:a3:c2:2b:0b:fb:25:89:70:92 ------BEGIN CERTIFICATE----- -MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5 -MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g -Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG -A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg -Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi -9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk -M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB -MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw -CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW -1KyLa2tJElMzrdfkviT8tQp21KW8EA== ------END CERTIFICATE----- - -# Issuer: CN=LuxTrust Global Root 2 O=LuxTrust S.A. -# Subject: CN=LuxTrust Global Root 2 O=LuxTrust S.A. -# Label: "LuxTrust Global Root 2" -# Serial: 59914338225734147123941058376788110305822489521 -# MD5 Fingerprint: b2:e1:09:00:61:af:f7:f1:91:6f:c4:ad:8d:5e:3b:7c -# SHA1 Fingerprint: 1e:0e:56:19:0a:d1:8b:25:98:b2:04:44:ff:66:8a:04:17:99:5f:3f -# SHA256 Fingerprint: 54:45:5f:71:29:c2:0b:14:47:c4:18:f9:97:16:8f:24:c5:8f:c5:02:3b:f5:da:5b:e2:eb:6e:1d:d8:90:2e:d5 ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -# Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM -# Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM -# Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1" -# Serial: 1 -# MD5 Fingerprint: dc:00:81:dc:69:2f:3e:2f:b0:3b:f6:3d:5a:91:8e:49 -# SHA1 Fingerprint: 31:43:64:9b:ec:ce:27:ec:ed:3a:3f:0b:8f:0d:e4:e8:91:dd:ee:ca -# SHA256 Fingerprint: 46:ed:c3:68:90:46:d5:3a:45:3f:b3:10:4a:b8:0d:ca:ec:65:8b:26:60:ea:16:29:dd:7e:86:79:90:64:87:16 ------BEGIN CERTIFICATE----- -MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx -GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp -bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w -KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0 -BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy -dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG -EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll -IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU -QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT -TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg -LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7 -a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr -LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr -N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X -YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/ -iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f -AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH -V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL -BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh -AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf -IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4 -lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c -8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf -lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= ------END CERTIFICATE----- - -# Issuer: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. -# Subject: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. -# Label: "GDCA TrustAUTH R5 ROOT" -# Serial: 9009899650740120186 -# MD5 Fingerprint: 63:cc:d9:3d:34:35:5c:6f:53:a3:e2:08:70:48:1f:b4 -# SHA1 Fingerprint: 0f:36:38:5b:81:1a:25:c3:9b:31:4e:83:ca:e9:34:66:70:cc:74:b4 -# SHA256 Fingerprint: bf:ff:8f:d0:44:33:48:7d:6a:8a:a6:0c:1a:29:76:7a:9f:c2:bb:b0:5e:42:0f:71:3a:13:b9:92:89:1d:38:93 ------BEGIN CERTIFICATE----- -MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE -BhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ -IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0 -MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNV -BAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8w -HQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJj -Dp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBj -TnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+u -KU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEj -qcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpm -MUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12 -ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloP -zgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3Gk -L30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeC -jGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoA -HQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkC -AwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg -p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZm -DRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5 -COmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ry -L3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPf -JWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svg -IHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io -2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV -09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQ -XR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrq -T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe -MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== ------END CERTIFICATE----- - -# Issuer: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Subject: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Label: "TrustCor RootCert CA-1" -# Serial: 15752444095811006489 -# MD5 Fingerprint: 6e:85:f1:dc:1a:00:d3:22:d5:b2:b2:ac:6b:37:05:45 -# SHA1 Fingerprint: ff:bd:cd:e7:82:c8:43:5e:3c:6f:26:86:5c:ca:a8:3a:45:5b:c3:0a -# SHA256 Fingerprint: d4:0e:9c:86:cd:8f:e4:68:c1:77:69:59:f4:9e:a7:74:fa:54:86:84:b6:c4:06:f3:90:92:61:f4:dc:e2:57:5c ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYD -VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk -MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U -cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29y -IFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkxMjMxMTcyMzE2WjCB -pDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFuYW1h -IENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUG -A1UECwweVHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZU -cnVzdENvciBSb290Q2VydCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEAv463leLCJhJrMxnHQFgKq1mqjQCj/IDHUHuO1CAmujIS2CNUSSUQIpid -RtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4pQa81QBeCQryJ3pS/C3V -seq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0JEsq1pme -9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CV -EY4hgLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorW -hnAbJN7+KIor0Gqw/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/ -DeOxCbeKyKsZn3MzUOcwHwYDVR0jBBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcw -DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD -ggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5mDo4Nvu7Zp5I -/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf -ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZ -yonnMlo2HD6CqFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djts -L1Ac59v2Z3kf9YKVmgenFK+P3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdN -zl/HHk484IkzlQsPpTLWPFp5LBk= ------END CERTIFICATE----- - -# Issuer: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Subject: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Label: "TrustCor RootCert CA-2" -# Serial: 2711694510199101698 -# MD5 Fingerprint: a2:e1:f8:18:0b:ba:45:d5:c7:41:2a:bb:37:52:45:64 -# SHA1 Fingerprint: b8:be:6d:cb:56:f1:55:b9:63:d4:12:ca:4e:06:34:c7:94:b2:1c:c0 -# SHA256 Fingerprint: 07:53:e9:40:37:8c:1b:d5:e3:83:6e:39:5d:ae:a5:cb:83:9e:50:46:f1:bd:0e:ae:19:51:cf:10:fe:c7:c9:65 ------BEGIN CERTIFICATE----- -MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNV -BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw -IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy -dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEfMB0GA1UEAwwWVHJ1c3RDb3Ig -Um9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEyMzExNzI2MzlaMIGk -MQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEg -Q2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYD -VQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRy -dXN0Q29yIFJvb3RDZXJ0IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQCnIG7CKqJiJJWQdsg4foDSq8GbZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+ -QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9NkRvRUqdw6VC0xK5mC8tkq -1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1oYxOdqHp -2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nK -DOObXUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hape -az6LMvYHL1cEksr1/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF -3wP+TfSvPd9cW436cOGlfifHhi5qjxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88 -oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQPeSghYA2FFn3XVDjxklb9tTNM -g9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+CtgrKAmrhQhJ8Z3 -mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh -8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAd -BgNVHQ4EFgQU2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6U -nrybPZx9mCAZ5YwwYrIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYw -DQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/hOsh80QA9z+LqBrWyOrsGS2h60COX -dKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnpkpfbsEZC89NiqpX+ -MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv2wnL -/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RX -CI/hOWB3S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYa -ZH9bDTMJBzN7Bj8RpFxwPIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW -2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dvDDqPys/cA8GiCcjl/YBeyGBCARsaU1q7 -N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYURpFHmygk71dSTlxCnKr3 -Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANExdqtvArB -As8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp -5KeXRKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu -1uwJ ------END CERTIFICATE----- - -# Issuer: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Subject: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority -# Label: "TrustCor ECA-1" -# Serial: 9548242946988625984 -# MD5 Fingerprint: 27:92:23:1d:0a:f5:40:7c:e9:e6:6b:9d:d8:f5:e7:6c -# SHA1 Fingerprint: 58:d1:df:95:95:67:6b:63:c0:f0:5b:1c:17:4d:8b:84:0b:c8:78:bd -# SHA256 Fingerprint: 5a:88:5d:b1:9c:01:d9:12:c5:75:93:88:93:8c:af:bb:df:03:1a:b2:d4:8e:91:ee:15:58:9b:42:97:1d:03:9c ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYD -VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk -MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U -cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxFzAVBgNVBAMMDlRydXN0Q29y -IEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3MjgwN1owgZwxCzAJBgNV -BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw -IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy -dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3Ig -RUNBLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb -3w9U73NjKYKtR8aja+3+XzP4Q1HpGjORMRegdMTUpwHmspI+ap3tDvl0mEDTPwOA -BoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23xFUfJ3zSCNV2HykVh0A5 -3ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmcp0yJF4Ou -owReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/ -wZ0+fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZF -ZtS6mFjBAgMBAAGjYzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAf -BgNVHSMEGDAWgBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/ -MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEABT41XBVwm8nHc2Fv -civUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u/ukZMjgDfxT2 -AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F -hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50 -soIipX1TH0XsJ5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BI -WJZpTdwHjFGTot+fDz2LYLSCjaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1Wi -tJ/X5g== ------END CERTIFICATE----- - -# Issuer: CN=SSL.com Root Certification Authority RSA O=SSL Corporation -# Subject: CN=SSL.com Root Certification Authority RSA O=SSL Corporation -# Label: "SSL.com Root Certification Authority RSA" -# Serial: 8875640296558310041 -# MD5 Fingerprint: 86:69:12:c0:70:f1:ec:ac:ac:c2:d5:bc:a5:5b:a1:29 -# SHA1 Fingerprint: b7:ab:33:08:d1:ea:44:77:ba:14:80:12:5a:6f:bd:a9:36:49:0c:bb -# SHA256 Fingerprint: 85:66:6a:56:2e:e0:be:5c:e9:25:c1:d8:89:0a:6f:76:a8:7e:c1:6d:4d:7d:5f:29:ea:74:19:cf:20:12:3b:69 ------BEGIN CERTIFICATE----- -MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UE -BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK -DA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYwMjEyMTczOTM5WhcNNDEwMjEyMTcz -OTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv -dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv -bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcN -AQEBBQADggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2R -xFdHaxh3a3by/ZPkPQ/CFp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aX -qhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcC -C52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/geoeOy3ZExqysdBP+lSgQ3 -6YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkpk8zruFvh -/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrF -YD3ZfBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93E -JNyAKoFBbZQ+yODJgUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVc -US4cK38acijnALXRdMbX5J+tB5O2UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8 -ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi81xtZPCvM8hnIk2snYxnP/Okm -+Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4sbE6x/c+cCbqi -M+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV -HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4G -A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGV -cpNxJK1ok1iOMq8bs3AD/CUrdIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBc -Hadm47GUBwwyOabqG7B52B2ccETjit3E+ZUfijhDPwGFpUenPUayvOUiaPd7nNgs -PgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAslu1OJD7OAUN5F7kR/ -q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjqerQ0 -cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jr -a6x+3uxjMxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90I -H37hVZkLId6Tngr75qNJvTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/Y -K9f1JmzJBjSWFupwWRoyeXkLtoh/D1JIPb9s2KJELtFOt3JY04kTlf5Eq/jXixtu -nLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406ywKBjYZC6VWg3dGq2ktuf -oYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NIWuuA8ShY -Ic2wBlX7Jz9TkHCpBB5XJ7k= ------END CERTIFICATE----- - -# Issuer: CN=SSL.com Root Certification Authority ECC O=SSL Corporation -# Subject: CN=SSL.com Root Certification Authority ECC O=SSL Corporation -# Label: "SSL.com Root Certification Authority ECC" -# Serial: 8495723813297216424 -# MD5 Fingerprint: 2e:da:e4:39:7f:9c:8f:37:d1:70:9f:26:17:51:3a:8e -# SHA1 Fingerprint: c3:19:7c:39:24:e6:54:af:1b:c4:ab:20:95:7a:e2:c3:0e:13:02:6a -# SHA256 Fingerprint: 34:17:bb:06:cc:60:07:da:1b:96:1c:92:0b:8a:b4:ce:3f:ad:82:0e:4a:a3:0b:9a:cb:c4:a7:4e:bd:ce:bc:65 ------BEGIN CERTIFICATE----- -MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMC -VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T -U0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0 -aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNDAzWhcNNDEwMjEyMTgxNDAz -WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0 -b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBS -b290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB -BAAiA2IABEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI -7Z4INcgn64mMU1jrYor+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPg -CemB+vNH06NjMGEwHQYDVR0OBBYEFILRhXMw5zUE044CkvvlpNHEIejNMA8GA1Ud -EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTTjgKS++Wk0cQh6M0wDgYD -VR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCWe+0F+S8T -kdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+ -gA0z5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl ------END CERTIFICATE----- - -# Issuer: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation -# Subject: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation -# Label: "SSL.com EV Root Certification Authority RSA R2" -# Serial: 6248227494352943350 -# MD5 Fingerprint: e1:1e:31:58:1a:ae:54:53:02:f6:17:6a:11:7b:4d:95 -# SHA1 Fingerprint: 74:3a:f0:52:9b:d0:32:a0:f4:4a:83:cd:d4:ba:a9:7b:7c:2e:c4:9a -# SHA256 Fingerprint: 2e:7b:f1:6c:c2:24:85:a7:bb:e2:aa:86:96:75:07:61:b0:ae:39:be:3b:2f:e9:d0:cc:6d:4e:f7:34:91:42:5c ------BEGIN CERTIFICATE----- -MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNV -BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UE -CgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2Vy -dGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMB4XDTE3MDUzMTE4MTQzN1oXDTQy -MDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4G -A1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQD -DC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvq -M0fNTPl9fb69LT3w23jhhqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssuf -OePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7wcXHswxzpY6IXFJ3vG2fThVUCAtZJycxa -4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTOZw+oz12WGQvE43LrrdF9 -HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+B6KjBSYR -aZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcA -b9ZhCBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQ -Gp8hLH94t2S42Oim9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQV -PWKchjgGAGYS5Fl2WlPAApiiECtoRHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMO -pgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+SlmJuwgUHfbSguPvuUCYHBBXtSu -UDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48+qvWBkofZ6aY -MBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV -HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa4 -9QaAJadz20ZpqJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBW -s47LCp1Jjr+kxJG7ZhcFUZh1++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5 -Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nxY/hoLVUE0fKNsKTPvDxeH3jnpaAg -cLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2GguDKBAdRUNf/ktUM -79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDzOFSz -/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXt -ll9ldDz7CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEm -Kf7GUmG6sXP/wwyc5WxqlD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKK -QbNmC1r7fSOl8hqw/96bg5Qu0T/fkreRrwU7ZcegbLHNYhLDkBvjJc40vG93drEQ -w/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1hlMYegouCRw2n5H9gooi -S9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX9hwJ1C07 -mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== ------END CERTIFICATE----- - -# Issuer: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation -# Subject: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation -# Label: "SSL.com EV Root Certification Authority ECC" -# Serial: 3182246526754555285 -# MD5 Fingerprint: 59:53:22:65:83:42:01:54:c0:ce:42:b9:5a:7c:f2:90 -# SHA1 Fingerprint: 4c:dd:51:a3:d1:f5:20:32:14:b0:c6:c5:32:23:03:91:c7:46:42:6d -# SHA256 Fingerprint: 22:a2:c1:f7:bd:ed:70:4c:c1:e7:01:b5:f4:08:c3:10:88:0f:e9:56:b5:de:2a:4a:44:f9:9c:87:3a:25:a7:c8 ------BEGIN CERTIFICATE----- -MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMC -VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T -U0wgQ29ycG9yYXRpb24xNDAyBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNTIzWhcNNDEwMjEyMTgx -NTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv -dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NMLmNv -bSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49 -AgEGBSuBBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMA -VIbc/R/fALhBYlzccBYy3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1Kthku -WnBaBu2+8KGwytAJKaNjMGEwHQYDVR0OBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZP -MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX -5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJN+vp1RPZ -ytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg -h5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 -# Label: "GlobalSign Root CA - R6" -# Serial: 1417766617973444989252670301619537 -# MD5 Fingerprint: 4f:dd:07:e4:d4:22:64:39:1e:0c:37:42:ea:d1:c6:ae -# SHA1 Fingerprint: 80:94:64:0e:b5:a7:a1:ca:11:9c:1f:dd:d5:9f:81:02:63:a7:fb:d1 -# SHA256 Fingerprint: 2c:ab:ea:fe:37:d0:6c:a2:2a:ba:73:91:c0:03:3d:25:98:29:52:c4:53:64:73:49:76:3a:3a:b5:ad:6c:cf:69 ------BEGIN CERTIFICATE----- -MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEg -MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2Jh -bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQx -MjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSNjET -MBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCAiIwDQYJ -KoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQssgrRI -xutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1k -ZguSgMpE3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxD -aNc9PIrFsmbVkJq3MQbFvuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJw -LnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqMPKq0pPbzlUoSB239jLKJz9CgYXfIWHSw -1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+azayOeSsJDa38O+2HBNX -k7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05OWgtH8wY2 -SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/h -bguyCLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4n -WUx2OVvq+aWh2IMP0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpY -rZxCRXluDocZXFSxZba/jJvcE+kNb7gu3GduyYsRtYQUigAZcIN5kZeR1Bonvzce -MgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNVHSMEGDAWgBSu -bAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN -nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGt -Ixg93eFyRJa0lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr61 -55wsTLxDKZmOMNOsIeDjHfrYBzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLj -vUYAGm0CuiVdjaExUd1URhxN25mW7xocBFymFe944Hn+Xds+qkxV/ZoVqW/hpvvf -cDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr3TsTjxKM4kEaSHpz -oHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB10jZp -nOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfs -pA9MRf/TuTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+v -JJUEeKgDu+6B5dpffItKoZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R -8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+tJDfLRVpOoERIyNiwmcUVhAn21klJwGW4 -5hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= ------END CERTIFICATE----- - -# Issuer: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed -# Subject: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed -# Label: "OISTE WISeKey Global Root GC CA" -# Serial: 44084345621038548146064804565436152554 -# MD5 Fingerprint: a9:d6:b9:2d:2f:93:64:f8:a5:69:ca:91:e9:68:07:23 -# SHA1 Fingerprint: e0:11:84:5e:34:de:be:88:81:b9:9c:f6:16:26:d1:96:1f:c3:b9:31 -# SHA256 Fingerprint: 85:60:f9:1c:36:24:da:ba:95:70:b5:fe:a0:db:e3:6f:f1:1a:83:23:be:94:86:85:4f:b3:f3:4a:55:71:19:8d ------BEGIN CERTIFICATE----- -MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQsw -CQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91 -bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwg -Um9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRaFw00MjA1MDkwOTU4MzNaMG0xCzAJ -BgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBGb3Vu -ZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2JhbCBS -b290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4ni -eUqjFqdrVCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4W -p2OQ0jnUsYd4XxiWD1AbNTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7T -rYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0EAwMDaAAwZQIwJsdpW9zV -57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtkAjEA2zQg -Mgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 ------END CERTIFICATE----- - -# Issuer: CN=GTS Root R1 O=Google Trust Services LLC -# Subject: CN=GTS Root R1 O=Google Trust Services LLC -# Label: "GTS Root R1" -# Serial: 146587175971765017618439757810265552097 -# MD5 Fingerprint: 82:1a:ef:d4:d2:4a:f2:9f:e2:3d:97:06:14:70:72:85 -# SHA1 Fingerprint: e1:c9:50:e6:ef:22:f8:4c:56:45:72:8b:92:20:60:d7:d5:a7:a3:e8 -# SHA256 Fingerprint: 2a:57:54:71:e3:13:40:bc:21:58:1c:bd:2c:f1:3e:15:84:63:20:3e:ce:94:bc:f9:d3:cc:19:6b:f0:9a:54:72 ------BEGIN CERTIFICATE----- -MIIFWjCCA0KgAwIBAgIQbkepxUtHDA3sM9CJuRz04TANBgkqhkiG9w0BAQwFADBH -MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM -QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy -MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl -cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM -f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vX -mX7wCl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7 -zUjwTcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0P -fyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtc -vfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4 -Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUsp -zBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOO -Rc92wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYW -k70paDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+ -DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgF -lQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBADiW -Cu49tJYeX++dnAsznyvgyv3SjgofQXSlfKqE1OXyHuY3UjKcC9FhHb8owbZEKTV1 -d5iyfNm9dKyKaOOpMQkpAWBz40d8U6iQSifvS9efk+eCNs6aaAyC58/UEBZvXw6Z -XPYfcX3v73svfuo21pdwCxXu11xWajOl40k4DLh9+42FpLFZXvRq4d2h9mREruZR -gyFmxhE+885H7pwoHyXa/6xmld01D1zvICxi/ZG6qcz8WpyTgYMpl0p8WnK0OdC3 -d8t5/Wk6kjftbjhlRn7pYL15iJdfOBL07q9bgsiG1eGZbYwE8na6SfZu6W0eX6Dv -J4J2QPim01hcDyxC2kLGe4g0x8HYRZvBPsVhHdljUEn2NIVq4BjFbkerQUIpm/Zg -DdIx02OYI5NaAIFItO/Nis3Jz5nu2Z6qNuFoS3FJFDYoOj0dzpqPJeaAcWErtXvM -+SUWgeExX6GjfhaknBZqlxi9dnKlC54dNuYvoS++cJEPqOba+MSSQGwlfnuzCdyy -F62ARPBopY+Udf90WuioAnwMCeKpSwughQtiue+hMZL77/ZRBIls6Kl0obsXs7X9 -SQ98POyDGCBDTtWTurQ0sR8WNh8M5mQ5Fkzc4P4dyKliPUDqysU0ArSuiYgzNdws -E3PYJ/HQcu51OyLemGhmW/HGY0dVHLqlCFF1pkgl ------END CERTIFICATE----- - -# Issuer: CN=GTS Root R2 O=Google Trust Services LLC -# Subject: CN=GTS Root R2 O=Google Trust Services LLC -# Label: "GTS Root R2" -# Serial: 146587176055767053814479386953112547951 -# MD5 Fingerprint: 44:ed:9a:0e:a4:09:3b:00:f2:ae:4c:a3:c6:61:b0:8b -# SHA1 Fingerprint: d2:73:96:2a:2a:5e:39:9f:73:3f:e1:c7:1e:64:3f:03:38:34:fc:4d -# SHA256 Fingerprint: c4:5d:7b:b0:8e:6d:67:e6:2e:42:35:11:0b:56:4e:5f:78:fd:92:ef:05:8c:84:0a:ea:4e:64:55:d7:58:5c:60 ------BEGIN CERTIFICATE----- -MIIFWjCCA0KgAwIBAgIQbkepxlqz5yDFMJo/aFLybzANBgkqhkiG9w0BAQwFADBH -MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM -QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy -MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl -cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3Lv -CvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3Kg -GjSY6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9Bu -XvAuMC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOd -re7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXu -PuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1 -mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K -8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqj -x5RWIr9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsR -nTKaG73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0 -kzCqgc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9Ok -twIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBALZp -8KZ3/p7uC4Gt4cCpx/k1HUCCq+YEtN/L9x0Pg/B+E02NjO7jMyLDOfxA325BS0JT -vhaI8dI4XsRomRyYUpOM52jtG2pzegVATX9lO9ZY8c6DR2Dj/5epnGB3GFW1fgiT -z9D2PGcDFWEJ+YF59exTpJ/JjwGLc8R3dtyDovUMSRqodt6Sm2T4syzFJ9MHwAiA -pJiS4wGWAqoC7o87xdFtCjMwc3i5T1QWvwsHoaRc5svJXISPD+AVdyx+Jn7axEvb -pxZ3B7DNdehyQtaVhJ2Gg/LkkM0JR9SLA3DaWsYDQvTtN6LwG1BUSw7YhN4ZKJmB -R64JGz9I0cNv4rBgF/XuIwKl2gBbbZCr7qLpGzvpx0QnRY5rn/WkhLx3+WuXrD5R -RaIRpsyF7gpo8j5QOHokYh4XIDdtak23CZvJ/KRY9bb7nE4Yu5UC56GtmwfuNmsk -0jmGwZODUNKBRqhfYlcsu2xkiAhu7xNUX90txGdj08+JN7+dIPT7eoOboB6BAFDC -5AwiWVIQ7UNWhwD4FFKnHYuTjKJNRn8nxnGbJN7k2oaLDX5rIMHAnuFl2GqjpuiF -izoHCBy69Y9Vmhh1fuXsgWbRIXOhNUQLgD1bnF5vKheW0YMjiGZt5obicDIvUiLn -yOd/xCxgXS/Dr55FBcOEArf9LAhST4Ldo/DUhgkC ------END CERTIFICATE----- - -# Issuer: CN=GTS Root R3 O=Google Trust Services LLC -# Subject: CN=GTS Root R3 O=Google Trust Services LLC -# Label: "GTS Root R3" -# Serial: 146587176140553309517047991083707763997 -# MD5 Fingerprint: 1a:79:5b:6b:04:52:9c:5d:c7:74:33:1b:25:9a:f9:25 -# SHA1 Fingerprint: 30:d4:24:6f:07:ff:db:91:89:8a:0b:e9:49:66:11:eb:8c:5e:46:e5 -# SHA256 Fingerprint: 15:d5:b8:77:46:19:ea:7d:54:ce:1c:a6:d0:b0:c4:03:e0:37:a9:17:f1:31:e8:a0:4e:1e:6b:7a:71:ba:bc:e5 ------BEGIN CERTIFICATE----- -MIICDDCCAZGgAwIBAgIQbkepx2ypcyRAiQ8DVd2NHTAKBggqhkjOPQQDAzBHMQsw -CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU -MBIGA1UEAxMLR1RTIFJvb3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw -MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp -Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjOPQIBBgUrgQQA -IgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout -736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2A -DDL24CejQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud -DgQWBBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEAgFuk -fCPAlaUs3L6JbyO5o91lAFJekazInXJ0glMLfalAvWhgxeG4VDvBNhcl2MG9AjEA -njWSdIUlUfUk7GRSJFClH9voy8l27OyCbvWFGFPouOOaKaqW04MjyaR7YbPMAuhd ------END CERTIFICATE----- - -# Issuer: CN=GTS Root R4 O=Google Trust Services LLC -# Subject: CN=GTS Root R4 O=Google Trust Services LLC -# Label: "GTS Root R4" -# Serial: 146587176229350439916519468929765261721 -# MD5 Fingerprint: 5d:b6:6a:c4:60:17:24:6a:1a:99:a8:4b:ee:5e:b4:26 -# SHA1 Fingerprint: 2a:1d:60:27:d9:4a:b1:0a:1c:4d:91:5c:cd:33:a0:cb:3e:2d:54:cb -# SHA256 Fingerprint: 71:cc:a5:39:1f:9e:79:4b:04:80:25:30:b3:63:e1:21:da:8a:30:43:bb:26:66:2f:ea:4d:ca:7f:c9:51:a4:bd ------BEGIN CERTIFICATE----- -MIICCjCCAZGgAwIBAgIQbkepyIuUtui7OyrYorLBmTAKBggqhkjOPQQDAzBHMQsw -CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU -MBIGA1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw -MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp -Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQA -IgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzu -hXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/l -xKvRHYqjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud -DgQWBBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNnADBkAjBqUFJ0 -CMRw3J5QdCHojXohw0+WbhXRIjVhLfoIN+4Zba3bssx9BzT1YBkstTTZbyACMANx -sbqjYAuG7ZoIapVon+Kz4ZNkfF6Tpt95LY2F45TPI11xzPKwTdb+mciUqXWi4w== ------END CERTIFICATE----- - -# Issuer: CN=UCA Global G2 Root O=UniTrust -# Subject: CN=UCA Global G2 Root O=UniTrust -# Label: "UCA Global G2 Root" -# Serial: 124779693093741543919145257850076631279 -# MD5 Fingerprint: 80:fe:f0:c4:4a:f0:5c:62:32:9f:1c:ba:78:a9:50:f8 -# SHA1 Fingerprint: 28:f9:78:16:19:7a:ff:18:25:18:aa:44:fe:c1:a0:ce:5c:b6:4c:8a -# SHA256 Fingerprint: 9b:ea:11:c9:76:fe:01:47:64:c1:be:56:a6:f9:14:b5:a5:60:31:7a:bd:99:88:39:33:82:e5:16:1a:a0:49:3c ------BEGIN CERTIFICATE----- -MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9 -MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBH -bG9iYWwgRzIgUm9vdDAeFw0xNjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0x -CzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlUcnVzdDEbMBkGA1UEAwwSVUNBIEds -b2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxeYr -b3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmToni9 -kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzm -VHqUwCoV8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/R -VogvGjqNO7uCEeBHANBSh6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDc -C/Vkw85DvG1xudLeJ1uK6NjGruFZfc8oLTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIj -tm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/R+zvWr9LesGtOxdQXGLY -D0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBeKW4bHAyv -j5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6Dl -NaBa4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6 -iIis7nCs+dwp4wwcOxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznP -O6Q0ibd5Ei9Hxeepl2n8pndntd978XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/ -BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFIHEjMz15DD/pQwIX4wV -ZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo5sOASD0Ee/oj -L3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 -1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl -1qnN3e92mI0ADs0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oU -b3n09tDh05S60FdRvScFDcH9yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LV -PtateJLbXDzz2K36uGt/xDYotgIVilQsnLAXc47QN6MUPJiVAAwpBVueSUmxX8fj -y88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHojhJi6IjMtX9Gl8Cb -EGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZkbxqg -DMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI -+Vg7RE+xygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGy -YiGqhkCyLmTTX8jjfhFnRR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bX -UB+K+wb1whnw0A== ------END CERTIFICATE----- - -# Issuer: CN=UCA Extended Validation Root O=UniTrust -# Subject: CN=UCA Extended Validation Root O=UniTrust -# Label: "UCA Extended Validation Root" -# Serial: 106100277556486529736699587978573607008 -# MD5 Fingerprint: a1:f3:5f:43:c6:34:9b:da:bf:8c:7e:05:53:ad:96:e2 -# SHA1 Fingerprint: a3:a1:b0:6f:24:61:23:4a:e3:36:a5:c2:37:fc:a6:ff:dd:f0:d7:3a -# SHA256 Fingerprint: d4:3a:f9:b3:54:73:75:5c:96:84:fc:06:d7:d8:cb:70:ee:5c:28:e7:73:fb:29:4e:b4:1e:e7:17:22:92:4d:24 ------BEGIN CERTIFICATE----- -MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBH -MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBF -eHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMx -MDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNV -BAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrsiWog -D4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvS -sPGP2KxFRv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aop -O2z6+I9tTcg1367r3CTueUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dk -sHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR59mzLC52LqGj3n5qiAno8geK+LLNEOfi -c0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH0mK1lTnj8/FtDw5lhIpj -VMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KRel7sFsLz -KuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/ -TuDvB0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41G -sx2VYVdWf6/wFlthWG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs -1+lvK9JKBZP8nm9rZ/+I8U6laUpSNwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQD -fwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS3H5aBZ8eNJr34RQwDwYDVR0T -AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBADaN -l8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR -ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQ -VBcZEhrxH9cMaVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5 -c6sq1WnIeJEmMX3ixzDx/BR4dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp -4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb+7lsq+KePRXBOy5nAliRn+/4Qh8s -t2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOWF3sGPjLtx7dCvHaj -2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwiGpWO -vpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2C -xR9GUeOcGMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmx -cmtpzyKEC2IPrNkZAJSidjzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbM -fjKaiJUINlK73nZfdklJrX+9ZSCyycErdhh2n1ax ------END CERTIFICATE----- - -# Issuer: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 -# Subject: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 -# Label: "Certigna Root CA" -# Serial: 269714418870597844693661054334862075617 -# MD5 Fingerprint: 0e:5c:30:62:27:eb:5b:bc:d7:ae:62:ba:e9:d5:df:77 -# SHA1 Fingerprint: 2d:0d:52:14:ff:9e:ad:99:24:01:74:20:47:6e:6c:85:27:27:f5:43 -# SHA256 Fingerprint: d4:8d:3d:23:ee:db:50:a4:59:e5:51:97:60:1c:27:77:4b:9d:7b:18:c9:4d:5a:05:95:11:a1:02:50:b9:31:68 ------BEGIN CERTIFICATE----- -MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAw -WjELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAw -MiA0ODE0NjMwODEwMDAzNjEZMBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0x -MzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjdaMFoxCzAJBgNVBAYTAkZSMRIwEAYD -VQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYzMDgxMDAwMzYxGTAX -BgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw -ggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sO -ty3tRQgXstmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9M -CiBtnyN6tMbaLOQdLNyzKNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPu -I9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8JXrJhFwLrN1CTivngqIkicuQstDuI7pm -TLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16XdG+RCYyKfHx9WzMfgIh -C59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq4NYKpkDf -ePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3Yz -IoejwpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWT -Co/1VTp2lc5ZmIoJlXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1k -JWumIWmbat10TWuXekG9qxf5kBdIjzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5 -hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp//TBt2dzhauH8XwIDAQABo4IB -GjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE -FBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of -1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczov -L3d3d3cuY2VydGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilo -dHRwOi8vY3JsLmNlcnRpZ25hLmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYr -aHR0cDovL2NybC5kaGlteW90aXMuY29tL2NlcnRpZ25hcm9vdGNhLmNybDANBgkq -hkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOItOoldaDgvUSILSo3L -6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxPTGRG -HVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH6 -0BGM+RFq7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncB -lA2c5uk5jR+mUYyZDDl34bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdi -o2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1 -gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS6Cvu5zHbugRqh5jnxV/v -faci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaYtlu3zM63 -Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayh -jWZSaX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw -3kAP+HwV96LOPNdeE4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= ------END CERTIFICATE----- - -# Issuer: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI -# Subject: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI -# Label: "emSign Root CA - G1" -# Serial: 235931866688319308814040 -# MD5 Fingerprint: 9c:42:84:57:dd:cb:0b:a7:2e:95:ad:b6:f3:da:bc:ac -# SHA1 Fingerprint: 8a:c7:ad:8f:73:ac:4e:c1:b5:75:4d:a5:40:f4:fc:cf:7c:b5:8e:8c -# SHA256 Fingerprint: 40:f6:af:03:46:a9:9a:a1:cd:1d:55:5a:4e:9c:ce:62:c7:f9:63:46:03:ee:40:66:15:83:3d:c8:c8:d0:03:67 ------BEGIN CERTIFICATE----- -MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYD -VQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBU -ZWNobm9sb2dpZXMgTGltaXRlZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBH -MTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgxODMwMDBaMGcxCzAJBgNVBAYTAklO -MRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVkaHJhIFRlY2hub2xv -Z2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIBIjAN -BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQz -f2N4aLTNLnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO -8oG0x5ZOrRkVUkr+PHB1cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aq -d7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHWDV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhM -tTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ6DqS0hdW5TUaQBw+jSzt -Od9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrHhQIDAQAB -o0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQD -AgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31x -PaOfG1vR2vjTnGs2vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjM -wiI/aTvFthUvozXGaCocV685743QNcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6d -GNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q+Mri/Tm3R7nrft8EI6/6nAYH -6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeihU80Bv2noWgby -RQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx -iN66zB+Afko= ------END CERTIFICATE----- - -# Issuer: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI -# Subject: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI -# Label: "emSign ECC Root CA - G3" -# Serial: 287880440101571086945156 -# MD5 Fingerprint: ce:0b:72:d1:9f:88:8e:d0:50:03:e8:e3:b8:8b:67:40 -# SHA1 Fingerprint: 30:43:fa:4f:f2:57:dc:a0:c3:80:ee:2e:58:ea:78:b2:3f:e6:bb:c1 -# SHA256 Fingerprint: 86:a1:ec:ba:08:9c:4a:8d:3b:be:27:34:c6:12:ba:34:1d:81:3e:04:3c:f9:e8:a8:62:cd:5c:57:a3:6b:be:6b ------BEGIN CERTIFICATE----- -MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQG -EwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNo -bm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g -RzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4MTgzMDAwWjBrMQswCQYDVQQGEwJJ -TjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9s -b2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMw -djAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0 -WXTsuwYc58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xyS -fvalY8L1X44uT6EYGQIrMgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuB -zhccLikenEhjQjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggq -hkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+DCBeQyh+KTOgNG3qxrdWB -CUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7jHvrZQnD -+JbNR6iC8hZVdyR+EhCVBCyj ------END CERTIFICATE----- - -# Issuer: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI -# Subject: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI -# Label: "emSign Root CA - C1" -# Serial: 825510296613316004955058 -# MD5 Fingerprint: d8:e3:5d:01:21:fa:78:5a:b0:df:ba:d2:ee:2a:5f:68 -# SHA1 Fingerprint: e7:2e:f1:df:fc:b2:09:28:cf:5d:d4:d5:67:37:b1:51:cb:86:4f:01 -# SHA256 Fingerprint: 12:56:09:aa:30:1d:a0:a2:49:b9:7a:82:39:cb:6a:34:21:6f:44:dc:ac:9f:39:54:b1:42:92:f2:e8:c8:60:8f ------BEGIN CERTIFICATE----- -MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkG -A1UEBhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEg -SW5jMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAw -MFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln -biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNpZ24gUm9v -dCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+upufGZ -BczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZ -HdPIWoU/Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH -3DspVpNqs8FqOp099cGXOFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvH -GPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4VI5b2P/AgNBbeCsbEBEV5f6f9vtKppa+c -xSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleoomslMuoaJuvimUnzYnu3Yy1 -aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+XJGFehiq -TbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL -BQADggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87 -/kOXSTKZEhVb3xEp/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4 -kqNPEjE2NuLe/gDEo2APJ62gsIq1NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrG -YQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9wC68AivTxEDkigcxHpvOJpkT -+xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQBmIMMMAVSKeo -WXzhriKi4gp6D/piq1JM4fHfyr6DDUI= ------END CERTIFICATE----- - -# Issuer: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI -# Subject: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI -# Label: "emSign ECC Root CA - C3" -# Serial: 582948710642506000014504 -# MD5 Fingerprint: 3e:53:b3:a3:81:ee:d7:10:f8:d3:b0:1d:17:92:f5:d5 -# SHA1 Fingerprint: b6:af:43:c2:9b:81:53:7d:f6:ef:6b:c3:1f:1f:60:15:0c:ee:48:66 -# SHA256 Fingerprint: bc:4d:80:9b:15:18:9d:78:db:3e:1d:8c:f4:f9:72:6a:79:5d:a1:64:3c:a5:f1:35:8e:1d:db:0e:dc:0d:7e:b3 ------BEGIN CERTIFICATE----- -MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQG -EwJVUzETMBEGA1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMx -IDAeBgNVBAMTF2VtU2lnbiBFQ0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAw -MFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln -biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQDExdlbVNpZ24gRUND -IFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd6bci -MK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4Ojavti -sIGJAnB9SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0O -BBYEFPtaSNCAIEDyqOkAB2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB -Af8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQC02C8Cif22TGK6Q04ThHK1rt0c -3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwUZOR8loMRnLDRWmFLpg9J -0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== ------END CERTIFICATE----- - -# Issuer: CN=Hongkong Post Root CA 3 O=Hongkong Post -# Subject: CN=Hongkong Post Root CA 3 O=Hongkong Post -# Label: "Hongkong Post Root CA 3" -# Serial: 46170865288971385588281144162979347873371282084 -# MD5 Fingerprint: 11:fc:9f:bd:73:30:02:8a:fd:3f:f3:58:b9:cb:20:f0 -# SHA1 Fingerprint: 58:a2:d0:ec:20:52:81:5b:c1:f3:f8:64:02:24:4e:c2:8e:02:4b:02 -# SHA256 Fingerprint: 5a:2f:c0:3f:0c:83:b0:90:bb:fa:40:60:4b:09:88:44:6c:76:36:18:3d:f9:84:6e:17:10:1a:44:7f:b8:ef:d6 ------BEGIN CERTIFICATE----- -MIIFzzCCA7egAwIBAgIUCBZfikyl7ADJk0DfxMauI7gcWqQwDQYJKoZIhvcNAQEL -BQAwbzELMAkGA1UEBhMCSEsxEjAQBgNVBAgTCUhvbmcgS29uZzESMBAGA1UEBxMJ -SG9uZyBLb25nMRYwFAYDVQQKEw1Ib25na29uZyBQb3N0MSAwHgYDVQQDExdIb25n -a29uZyBQb3N0IFJvb3QgQ0EgMzAeFw0xNzA2MDMwMjI5NDZaFw00MjA2MDMwMjI5 -NDZaMG8xCzAJBgNVBAYTAkhLMRIwEAYDVQQIEwlIb25nIEtvbmcxEjAQBgNVBAcT -CUhvbmcgS29uZzEWMBQGA1UEChMNSG9uZ2tvbmcgUG9zdDEgMB4GA1UEAxMXSG9u -Z2tvbmcgUG9zdCBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQCziNfqzg8gTr7m1gNt7ln8wlffKWihgw4+aMdoWJwcYEuJQwy51BWy7sFO -dem1p+/l6TWZ5Mwc50tfjTMwIDNT2aa71T4Tjukfh0mtUC1Qyhi+AViiE3CWu4mI -VoBc+L0sPOFMV4i707mV78vH9toxdCim5lSJ9UExyuUmGs2C4HDaOym71QP1mbpV -9WTRYA6ziUm4ii8F0oRFKHyPaFASePwLtVPLwpgchKOesL4jpNrcyCse2m5FHomY -2vkALgbpDDtw1VAliJnLzXNg99X/NWfFobxeq81KuEXryGgeDQ0URhLj0mRiikKY -vLTGCAj4/ahMZJx2Ab0vqWwzD9g/KLg8aQFChn5pwckGyuV6RmXpwtZQQS4/t+Tt -bNe/JgERohYpSms0BpDsE9K2+2p20jzt8NYt3eEV7KObLyzJPivkaTv/ciWxNoZb -x39ri1UbSsUgYT2uy1DhCDq+sI9jQVMwCFk8mB13umOResoQUGC/8Ne8lYePl8X+ -l2oBlKN8W4UdKjk60FSh0Tlxnf0h+bV78OLgAo9uliQlLKAeLKjEiafv7ZkGL7YK -TE/bosw3Gq9HhS2KX8Q0NEwA/RiTZxPRN+ZItIsGxVd7GYYKecsAyVKvQv83j+Gj -Hno9UKtjBucVtT+2RTeUN7F+8kjDf8V1/peNRY8apxpyKBpADwIDAQABo2MwYTAP -BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQXnc0e -i9Y5K3DTXNSguB+wAPzFYTAdBgNVHQ4EFgQUF53NHovWOStw01zUoLgfsAD8xWEw -DQYJKoZIhvcNAQELBQADggIBAFbVe27mIgHSQpsY1Q7XZiNc4/6gx5LS6ZStS6LG -7BJ8dNVI0lkUmcDrudHr9EgwW62nV3OZqdPlt9EuWSRY3GguLmLYauRwCy0gUCCk -MpXRAJi70/33MvJJrsZ64Ee+bs7Lo3I6LWldy8joRTnU+kLBEUx3XZL7av9YROXr -gZ6voJmtvqkBZss4HTzfQx/0TW60uhdG/H39h4F5ag0zD/ov+BS5gLNdTaqX4fnk -GMX41TiMJjz98iji7lpJiCzfeT2OnpA8vUFKOt1b9pq0zj8lMH8yfaIDlNDceqFS -3m6TjRgm/VWsvY+b0s+v54Ysyx8Jb6NvqYTUc79NoXQbTiNg8swOqn+knEwlqLJm -Ozj/2ZQw9nKEvmhVEA/GcywWaZMH/rFF7buiVWqw2rVKAiUnhde3t4ZEFolsgCs+ -l6mc1X5VTMbeRRAc6uk7nwNT7u56AQIWeNTowr5GdogTPyK7SBIdUgC0An4hGh6c -JfTzPV4e0hz5sy229zdcxsshTrD3mUcYhcErulWuBurQB7Lcq9CClnXO0lD+mefP -L5/ndtFhKvshuzHQqp9HpLIiyhY6UFfEW0NnxWViA0kB60PZ2Pierc+xYw5F9KBa -LJstxabArahH9CdMOA0uG0k7UvToiIMrVCjU8jVStDKDYmlkDJGcn5fqdBb9HxEG -mpv0 ------END CERTIFICATE----- diff --git a/env/lib/python3.7/site-packages/pip/_vendor/certifi/core.py b/env/lib/python3.7/site-packages/pip/_vendor/certifi/core.py deleted file mode 100644 index 7271acf..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/certifi/core.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -certifi.py -~~~~~~~~~~ - -This module returns the installation location of cacert.pem. -""" -import os - - -def where(): - f = os.path.dirname(__file__) - - return os.path.join(f, 'cacert.pem') diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__init__.py b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__init__.py deleted file mode 100644 index 0f9f820..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__init__.py +++ /dev/null @@ -1,39 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - - -from .compat import PY2, PY3 -from .universaldetector import UniversalDetector -from .version import __version__, VERSION - - -def detect(byte_str): - """ - Detect the encoding of the given byte string. - - :param byte_str: The byte sequence to examine. - :type byte_str: ``bytes`` or ``bytearray`` - """ - if not isinstance(byte_str, bytearray): - if not isinstance(byte_str, bytes): - raise TypeError('Expected object of type bytes or bytearray, got: ' - '{0}'.format(type(byte_str))) - else: - byte_str = bytearray(byte_str) - detector = UniversalDetector() - detector.feed(byte_str) - return detector.close() diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 3a53db842eaa0cc3650febb049bfacd039f1f673..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 800 zcmYjPO^?$s5ViB&z@ioo?9oRmvF-A4KouYaRD#Qb*aeA5D9I*n8<f~t$3^YZy-<G0 zR(s+v`O1mEz=^Tb0wc|6#-8{5l9}gwdm#d2SNorCdkFp1#m+29o`E-yAmk{=C8}_Q zD=V_FuC3CpoX9b`UAmPQd6ggeP&>K%9YsOz9izVg3j@4wDf{im`#L=6W7T`liZ4_& zY59^$nn^C8;aVK)vx2iYR{n?ayW`hyjxvqbrq#IMFTk5u5F}b5iPu(hXfg}3JJQba zr6b)HTH_5~<8PP+66@*$NpFoV@Csl0E40BFK^ANfD74P6LIT!GA#z3uWf{*4HYI#w z>M5vY<a8-1X{3OQL1-YOIu&VUE@HSCX&Q0@1Z^uln*$Rik`uZ}tAf!%3zN&b?fHiy zNuohbk`OMoMJhzPOcH}Re>h&$@T+J}_~~azjJ6$5qd^*PAa}`>%Mtl{c+u~uuxJX_ z$P|RA&fga0n%7k41SrNraG|^j7gZ{iqtyuqez9^Ul;+CKO5RYIP@pkdvI_F;+<qX@ zgU;VihO(-Mbx|Lf$I9{`KU=cJy~#`;8i(n!oQq*LO9jA(aa^!M#_^zDDzD|+*Td~X zKz@ir?BN?$05Qbk7MvZy*LWGP>QoB74#I|@dh^{b?KHL8{p~Udy)^=s8yONK_rGvc Wa|Dkop3h7AR6o<`-Y&k5yY?T9&fWR| diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-37.pyc deleted file mode 100644 index 2a2833b76e7c977383ce10433402ea6a5beea586..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27135 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-37.pyc deleted file mode 100644 index 38b09c8c974ac9a2c4ac5afe95eb7fb8386eaeb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1076 zcmah|O>Yx15ViL!n<#0a70?4GI7K3jkmwEZkrY)(q#)(C60$aHCtb<ANo@y_sJBGw z-zeh5U$VrB6MumdGv0)T3pld<b|yRXX5MVC)oKt}<=3N+-y=eP;KOzW0A9h?r*Lq> zsU!tWC`If^ukaJ!VP6JCn1l`oGAe3Gjgm9MLmsUOj|5%$Nz7|Q(vE*p2-T+c{$MUm z-dh;azev?km=9_?5(+#A{VC7O$<U-m4ASf(F9leSdimt!G}lJuqq)ha<?Aw)3!Q85 zwR&&QPS|k32JcVbyvrcLpXG0meg;60gmRL2*JMmN<=#3@d=YS;2WzsTNeI|61{__J zfF#JcW*eBgqL(3iTzF$_-1-R|h8TK9R^E;G1)Rn=!3v&PXrdK?yLLrxV)SqVG3j}` zZbLnv38kRt#Kw%}Wo{T#7*K_1t7oncOcx4uu=n^*^(@8mmqOW42`vnCA<#mO;jS~5 z$y95`zL8%qyQY|RXZfs?m)fLKcKGF@{QPu$fkwC4CsFdL>Smw=7p6OcYG+Q2<Jm&R zkoqxfjeyWS+MqFA9^SU(cuW1S-e7<F_!?5@6l(U)ZGdm7J+QQ?YQp7kb?n2VZ6XJ# zhLvd{+F;Qh9K>5b*vYs1pa18q^>Ki-_*dFkrsZUwPDE!X<!*^ve>+B{kQ`&S!B{cn zbBVag*yTKxmB;nW#?V91*DTash^h|Zu&s?WnUE5+#!hT`wGd+y+(0}6pm8!{+Kifk zv*FC_7o$!2l|l;pV-KoH0ey`qsxQXPk-g(I-5Hx|k|KzrVXSb>T<BXS6>?(4&#UrY NJVY`mf0MeO{~NG#0)_wp diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-37.pyc deleted file mode 100644 index 714ad065dbc2aa369eacafe66de4cd56c1f029ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6262 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 a(GmMYaz6ik8#7uzGd-UkRlo7{<bMGMqW)6= diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-37.pyc deleted file mode 100644 index 18a80c35bf2a428830ef2ddaa864e9ce7c5a12c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2183 zcmb_d&2Jk;6rb6dU9TNGEg@|KR3b%1;EJ}YR0)uvEwnV^fQ$M;C5vk0cqUuBo3%Z& zt`f76kQ%8cZX7r!;>4x@2>-#}5T~BFbK>`AouojxvG#lW=40QykKcRqd8^f6c(R{Y z9{sw=*zYtrcqD`yAol^7W}2sLlXp2MIY@&|(G{GnF)g&*Wm+2XOmw9V@3D6DlH-#$ zFPmT6(fS}u?&ZDQVBEU-xM%N~oTiQKW7FY7r_tl?f*IE3nso!c_?&HU9cZyz?+P#D zgx$C+O{gPX+hxyqH-a4Nx|eIZp%->pH`Yzv!n^*QN!D$^rW57T{O~n9nvN?AI{m;O z${4-HoZR~ma+dRgJqw0G!8QMZ+ztw+M8d$OCLU@A#i9ep7SdjpsEt9I8~c(}wxcq1 z)3LFZ94lj`2H7B2s$5XLem;0=R5sl#Yhxb>S1ze_<8qZujdQA+YzL)uCf%?hspDl` zseanSvigPnxpq0<9A6#}#uo>f%X?{hQBStBtt%UkY0{H=YBD{tm-`60Ho1R0lPBbT zb;70bwvD0u9LSNt_!5uso4xh#P+dCkpijA_heAfqQP^Au>>y-&!9GK{5I!ZgE){Gj zZ?Q+`cX+|=*@Dkk5mprzP%so)d<bPqOwK+8w(wQt11mc=g4X-igQ;d~7*x>=t$`=D zP7{RRGOA)~7cgiCw&~~QVdS<&`+#m{PY^o^_8!QQ!1y8@ZgR<EyqEZF<rvrfafg1B zIpq6IkXr?Vhs>=MY>$)Q)rdSGX&3+^yweumwsJ8sx$2Lyje#~<-;_<t4t!BrZxaRL zEw4;HvUeFrT%ogksRog^RPx!|$5{HRy8pvq`#KITV?y_|m;9H7r?BbcV=O!lMhB`6 zD~}*V<iq(rgsm+K93YeJ1V!MMCUFrAxqFk|dw|V8-w}my7cdsN7|JJsy-`qY0#3sS zVW-&|W@A7wP=Fyo7VF?60$Gebu@+CbjcFIYs#jl4;)j$leBYLx+a7Zse(i>bn0*bF zm2$%vZ7KO>eEZIW&Mo!j{VK5`sxUWY)VXtCef5QhW*I3z*_IU`<Mr*_V9MGhD6lKU ze3p+=eHwG0f!uj8=3yBCmH}@7pv0*<i7$f3pxK#YKtM(wCZD<oRgMquPY~cFqgu@Q zFhG!&HAl#3BrtkM1Fu@_1ilXC*0<OlA{BRi$gfSV7GfB=Z!lZii?zh4z8`Q#^Lveb zwj<{&A+3NG3b`*)6G0)LFnhI-NU1>3<>aalw{$;hf%B<KqE7N+?YG(Ti$AU>-z}54 zdp&`{{+YGjb*tGZU#%*Ab_zrMk4kCvQ;gfqDy)<tdxqE>#HcO2lEo+;C5f?RsLlE` zu~c6k=az8X4yz)h^pthqmFW<lvr>BTA4#JUc>r=3z?e^vL~0~{RcE0To<#a$ei}q; z5%}!fF{%4|d!WX#Kz9dq2izSEr8Y-;nv&d9YBKGm)rxQ9zOj`t+8(Z*e7o|CT(ShK zs*+ptOQdhoRH-BQq4oGK=^G?f<0{BeAC389)NC~4W*jg3?%QdHWoU4FxvCIa^PW?+ dTT8cr-*=?El1OzKe^NPc?JVi1gPOc4{sJ94+5!Lo diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-37.pyc deleted file mode 100644 index 5da55ee30f22b3e0e01ea43b9804f9b97a0acfbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3393 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-37.pyc deleted file mode 100644 index 49fb9a4a93dfa1b677ac2aa3b9ccea766a503aed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2840 zcma)8%Wm676djU!(6X$iNsA^(AJa_{p^2TMivU5<=Gkl-x3GgQ1QZ0#8A)_0QkfY! zap0_yZ|FKfSN$b!yUH(g)pIXJ$+Fd;Bg~NVI`_^w_YQS$YpWwr@;@*C*6IoIH+AaL zz{?#}dku{e%FDz+C|?DcH}MC)CmspaP|epuHFfYR7&Mf(FZ!)_SS@znd1(7y*?k-* z<22X%E_OPhsk#Jsxr1sSpwVLBDKYSsHwehYYXLY0A2d}<wb5^>P;KDZRvop8XQ($+ zS8cr(ue?D=^<esg^5XqMrTK`B%?-zY;2a%^a#vb%LQX1=q$}i+HtFzK#`5486IMT+ z={(VLSQv~=W8>0fmc>S5l!3S9kA-0{4UlS=8*8aF4(G7T=tQSS+FqBblh4vDlS8eQ zbmQ2~R~J&lDr_bW3mI$Gt@tQTv-lv>*JY9GY8Q6L(xnr<EuX;L>V{+-=Ob-l(Vl`k zh%F2kIStFH(MM@9v-6#CPA<){;b`qOqZ=(_)NhwqfX-om)hZu}78XNHJ8iUeL}`qr zGgsWGDY@NYp#3Lz_nuS`w{eCPn3jF0P_Yp&hB$L$9Gv*i^eE0&m0>8-a#60O+aM*D zM{$-a36->*7VxLfB7zzNqP3CZ*vbQ~L5I@0ONXge+m&aJAJ%To{mNCEAWq0V@J>9f zo_vV_yDNcn);$KmIqg&@FqsfPghy^!?I=bttF%o=ImF_yV`*Y{9tsT8>b#HzFbs}q zZHh2i1gCs9P7#y|6iABP#SqOA(d6P;xH{BHaV+6Tg>#vX5g9CEI+<vdQog`YO0f!Q z?K2pLn`hzZP_^K5S|9H1{k&H*TM2%O*!OV?jk2ZoXHCh~G-ZmH>A5`3x}%)O$`NB{ z&Q_7OgnUrvHj|{EC)o@^M$Ddvt9QwvDJG<XMX(rHKpyfCghR&U+q^aLar053XMlPi z)!syN;+=>HH!fO_TVDyh2d?p^=~{1TynQ0xgl~n1n;BQ1ziary-6&hp1WAyUy(pO( z6Os546s-FcdQqnHa<iJ}&@S6qF&g3GEH_5l{e*XI$}o!Zc%q}IY|$)6n#ghO`hMB4 zIvbY0o%|)t1-Sdqqa8Py?o89^jWh>hmfcWKkMrl>497IcH9FF{D$EW!fKb_~E>t!@ zzmT`5$7D3kQx`?Ih>9*6;kD+!uJ_{V`TKpl-jNUiROm^JGMfb9#33;T4#AYS+Ybzp zT{ihnG9ljkp263zIt-u4d`R6bG(VtP7Rq~Zd5wAIWT7N|GZ#vZ(K!)^(D4csy&_)v z=y}dR41V{`O@&_6;Q0XaKB|bCw1USPSHwpc{Y1PBxZlJ)twThdh=w?9sMakUlM(2< z+ukiVlPtD2a`f@wa437V+|^*&tyT<iCl;pMWcKIl>4^Q7Y2v|@Fh}MRbz9W5X}-ZU zm0nVIIItM5>~N$pSVbPi1T$E6a{b&zJarF)_97Y)^t>)Kz2Nt#^?Kfm&(;vT+_|DG zsmsceSHw)EsaH9;R>$%ZqME}USARs5AOU{C_FC7k)|g+jWyOz0gwY=;RtO4nCYBA# z8-x^bxjwSW%M8!|DJpiNc@pfOa_j5=a%;`L|La?r;m^V>9=+c`^99`ab>WJ?Ht}kt z-TtQ8#M-hG(cLr4=+5Xy(bHL+&2Nx)6saPKB18IfTA8c#_9-==)824uim5j4m`$Gw zqeUzk%B?R^Ev0Jsal;G4FbI370nhcDW`m%bI-gB!mE*1A;1K`Jczzvd8Gcu}{5`p1 K$wcUPgMR@ynERpt diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/compat.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/compat.cpython-37.pyc deleted file mode 100644 index b613077738a0ba14492eddcb191c2b7a5822917e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 311 zcmXwxzfQw25XSu{Y0|1)5JEfx8A=3<AcPngD<oL3grYRQsDacrwp%sN!^A6jW$G(1 zaW3Lc_q)6AlfL`eY(lWq=jp3T2>FiBe=$7na9o5WlJ-OpAa7K%cVf>Z7fdFCLjq~b z#0XN6sbf?aIvjFH4r(GYNuNlO?lFZd3byCCEk!&(6yw0%;KFnZ)^%D{ooaR9k1v-I zS7>@0vW@B*Eg|H~+Cdeiv4@?n{9quY%fW;DB6b>MBYv(+zc!`m%)C?1*L^>iAA{Om ww5uo{rrLs%+Lq0#wi0~V=(VZ+xfw!!v(|Fc!|e%1xg$i*Cp5v%>4^R9Um}K3aR2}S diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-37.pyc deleted file mode 100644 index be344fd835cca08d1041ee1910cae4aeda4a8393..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1083 zcmah|%We}f6t(9Srz9<uhl<1sRuQyOrEV%AC`~ICC8Z)_GZL~UW49g2Gnv{BB2{;Z z)ZZv##V^g46~DlWdp!xH8*pU%_<DRF=br4h+baY{@onSN>joh|@UR#GfIXPz02V<6 zRV1e|rHDP{<$mlt?5iLT<Iv$iMR_A`Q1X_DP((8#A{kEon2E-Kbl6V{t~#`OeE6|< z^x+^gR%gSp%|^wWB2g2Q8Ms{UjYL+Q4Qyg%KS|HCLW1>Cf2?e_Ke4iRp6G$JCwerL z8g5p5C%Zele9-6p_XmgXQV8*9_;X}-07w#3L1OQkoKiuBH)F9c1L2EcMy50l0lS<5 zN7p1EG3MN;?l}K-xD*S(fjc_KX<oo$iKSO$>fLx>;nMmxn8KNdHkuOH8&~9p;f)~R zlpc4QRcOYg)H;I472`ZBGRwI}hdM-CGj%+0lWPyp55*E+JVC-PrLICPjkLf+V5B;Q zy~%m15@R_3PJZomZC-ZEtlZ2BV-uw|#l@ufvVD4vMmPCqS%{JDrogL^wwsnfXX)78 zDkqvj>}N0y0zy~miqGifgC$b77RldY2N~+&JJgY&P_=hlh3=VN1yhIW7HkgJ%NiW3 z7N!9O@gm9PbFdgJo_LoV%Mq79`hV2uXryIQ{3|R|NpUt#&SZBf<gFqXA9NUY3$x?A zTH!n&iLpZ5;{0NqsQSjyRxzLvdTb~99=O%_VX4~l_M}oN=r>ZaNUV(*S#Y9w3c#Q` z7;Uju;B2UyyRK17TBzl*UdsiVY-L{mZJd~@wR||It8S{shEx$)4M+>6=3M{Hq(-hA S>}6fvt0$NYDxgK(&;Jd;9|6n& diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-37.pyc deleted file mode 100644 index 6a7972255a1ff4b17449d84211797d1e8abc5ae2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2574 zcmbVO+iu%N5T$Mu#n_JHz7%MIF3<}qppnr&x<O%GXos;(86sWO0t$-et|cZEsqB(T zEuc@ypY*AJ&~Mq-KIs>FpIJ%1#Ey}4g&FPa4tIxVX3w&<zHVyJl3zaj@n>Dren(@~ z%Fx*b5o1tP8)*9)Ezsg?jTTwqRcTNJyF|-imz7-tyFzuab!C^qu2KVRL)jIuYt#hW zRJIQGJ-P<=nzE~O-PP(FGj2BHn51VU8#7`h`9wf3$Vk8$$pxce@iZTe(>zly;W*%w zWn>zJ&w>$anC4E9XXBLbkWP@0RvaYCg?veaq;a}3cSn;TiW^}%shc6Z;YBMzZx=*- z42o%k0=#>X76v6+9F%EkP@(04PAd?rE=@a`=9!xX8JoE#f#!`PK^R0$IGb`NSdwA< zjL_)pjBzlDKzBg`k|)s%#zhblh@XX7%1H<jpE4394Yk@FLeS<I(Yy%CsaK`p`$;fi zzAsJRpQJR8vA^c~&+{N&&QyJ$rXji<9rrE2>9%cK)-1QZ>OQvjAN#En&-zv4Yp}3V zf9z~$lj-&}nm&vY2r`Zz(&y*NPhX#naZri>f+aNN+e^^5@l8czdd@LM14N)QO63Cn z)aW&E@hx`I?GdQAgFC2FePGb)pvKCq($WSdGnwAfSQYyBr~%;D<VH70MmeN>FN!n9 zXHVZX0Z;<!IdY~R6yzmSzz5T5d`_~I1Zt(>@OYJ=&N4s4;UX`*1mSZ$A#<hhrRSTd zJ^|&_*LVf~IUFgCS5cvZ+-g6z9m}<R*FHSz+IzOuksqwayneG|dv?!hcBS#8dDKKt zsUP(ER@0GHr|0<XCkL|B>~>{!`H(EZ&}9M_y>;Ag1JnZ$u?5N~FVeBnMnTPAOU(OJ z{n`;vPoreCsQdkQh5e%Lr|>wtQR^IQ;}Te?^;<!#bu7<nd$zMLjlJHn)A4Oj>Q2w| z53O6F_z0FIAlEAsNB=(nhe0@w61D)qd2av|5@fPi<jphxjyP0Yui5ux#p?HaeW}}? z`!)cuB<nW-z|m^}U`g+y+gG6OI-1O&I<3CeUKIwl<x$*n+4GzwA?rrZSR9Shl+J#* z8<zOO6S+Ph$S6Sw=a`(Oah$${`ck|JB>Eysb3xJsxE(3>4S?ntc!>3j4gXQvAOg=O zEdW^*XFEHbWjRm84p1~BKwDUXu=ABTLg3|5$|E4>C{dduy*2oKSVomry&y|rEUuIp z9yYl(Vwn$~{^bJS;`Uh3T50zAO>i1FpK$8tt@Um=)_&8ozqh1u>~!q|t9v5#<-c*% zbAdBp?p_!NLQELkdz60x+g^!L5xioBPhsL45P?H0k_J{Na-0c4E*fIE3nD%Pbyqbk zh#D|9<b(DqhwTND=d<7LE`rNT@e(?6LC<izu~<MoaJ9;C=t5D%taY9-+)1zuiHPyx zkiac`SwWb-EQJpNtd?eSp21lik(defC6SPJ&++=bE`ggmOcN1NxR)sjz$1hDTi(3? z!h6sELG?GPzfk=N%Bk0G%~K7i$l3#b??|%?e|`&y`#|dM$ziM4m6eXY4@6a6?tN=| z@ZdE;7U|JfbPe|?&Ny{ragFHd=~MVxP?xJBa*kxi@j$CQD(~AikjA6M2g7%GJE>jD MrOn#reGt(90r4AgQ2+n{ diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-37.pyc deleted file mode 100644 index 7b0227487ebd2c43dee2054c5b27ed2fc790c04d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2561 zcma)7PjeeJ6qk0_>$SahQj>-h=yVAuGqi!87=|e=iPNTSoJ<@jvojsxtmHrG?%L6= zOX6`($<PaM;>aNxPF(s4_$0b9oO<HUiTAX&+ma50cJ%aC?@3R3@Asa*ESHM}TKwzM z<9LpcKk;YUEMRU!Prd=d38x{6s81>KMrcH)Z))BQttjW`BHOp4yr0)|R_H_pzYrDu zVpQ@=k?XsZ+$B86?Nh>SK~GG-%=1lBb6!x`zD8AfwcC<Sk#5WWo{%t6UG4K;+-at* zRBX0_ZZ8%!Q&k?e;?A(u5$nA$6;ipVKUGuiL{TrQS*mo;XU$EvxwTe*sHz*yt(za; zyt&%AICp>h;@pFs*<1i;oHcX|w&ZIdg7}mZ-{90Y`P?(orrhM#X~DNNj~90QoUnPG zJE!D?`g!0Byr_AHm$-XM`~olY3XH{P#3FtP+%m7`>q+pMOGdvJJ!re#UgEtb@P>&< zyq32d^tteoperJ=?6n31*$20I?Y{K5NJWr>n>-PN7BI<2dbjVoLW;d3PqdO=c;rbD z^gD5H)Y=P$Cz7Bw5FRW~y1jPlCE{QR%h8q;pc?iB_xiDy_VrdhF5<M;KJwD8NMQBU z&<!nZ1cr7RAvmH7P3XxPkd&l!Oiqk_V@x^y5fIiPW5Uca*|*Z%zI~g>HQ>#&eCniy z6M7CBv;X4kA9YKh`|V8Tz9uV!Y&?@yG8sopbDGX;dP&pjn4G<JP7uow45I;XEQJ6( z*4C)2EvQ^F90(~(aDL@5){A>7W2%rjmnD&OK_c;<0OWfcje4`rnj4$j4>#5~>TAk| z@Q9d8bb`zyaZuH{e`os+>dFHC+7GsN>USCvlT^*MAc9W??9GDyFizDamW5St7C`PK zB30FwQ+Qm=6J@gmQ%L0`ge9#R%1T7o*5`w36&MS`R+2FG8~OXzN*WDT2ED=cUJQ%E z@H#&@iVr_&cX3j8_7slYmn&!y%&!1Q0B4Y~HwH(t0_Xe?dh#9+LaWrKE}e%DDRz7E zjjsF~-8ZH_46q(xL!6*{G)@}8OmT8%U}O%LF_vrO@zOCJ)5JSi<S;U8Of&hx;v<sg zQ0D~D#cUndyr#}1s=Kv<EW^e+igF1#D1zYj%+tyYMJyL^`ZAJ5AT>i?K_2yLRKA1! zyGZcHdW+A1Nvc2yt-zfvYG^OGKu3!gZmnZ7yE0xK`zrLr1_H-N08#*;J_8Keyf!(r ztK3QaS=@?59T)3lGe%c07<^Up|Jl{oezRR?3bKt?Y+elQRO`+5&{ud*S>&_{PYZOs zv)Sl8zx&5%;rU-*bU;J5|Mo(qBT`6>xQ&%45Sy?>JCT6vEn{@;f-hdzpB1PaEX1y( z@Cz`9KaVK@?T2II@OwNd@Z)21Y|84`+^5O%0gPwH*f^)h*4RqTed~!KIl$3m06mNB z=eY4H;F%#DbKHDF<xi=-p9fevFjHs}*a6oSVO<p@B`q<}+;c2XWw26#ac-*nh#c6D z&}Xo+W;NC&V&(;OcsDdM<yGKSF&2kumi!XIq;mD0ovob=(Re{+H@0@!W?jCmrCFJ< zH+Gvar=0bzuNrG?V^=L@e!^EH+l@upbDX7x2aB`Z$Z2pYXYVM5GL=e2gDj!kX<5WV zl;z7y@LFvlcoQ~BmVppjgsdq-))e8hA%}|8fe$J6iZQx;A&|HOCW(us7;^whagnj8 z&xaxME@KD7RydL58RPwcF<q{7&MF6L7?kt$NM6I+cu3wyavg{&PikZ!!Vs3tl5bi7 zbnfFz@B#D$i=dOUjLN)QaxK?#Y+YX(wTdcFvM;Nc5|dO_C+{)3X6jcgc`7I3VU*}6 uL}IiiF%(GvugmPo&<}-vAhIepJKW2%q@2$)Pu#+TCiu{};Nu0lWc>rV;$`9h diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-37.pyc deleted file mode 100644 index 88d81de3ad93f1e55447026f972c06f0712e4b0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7022 zcmeHLOK;jh5VirEHwom?9HJ;{dkB>%3B6TSm4u>_1d<9kS*k3TU6NE_s7<OQzooaH z`j4u;_T<0NQ+F2I7{>%TLP1K6wd<XyXU4N1D<7uQ36B2MpBtYud5-%7g!QY^#XcSS z?=Z(94)I;C$4flVp^y~9{MRrY5d^byM1bot1j_RomM-&w7==JDf<!h8NHDo0Sp?CG zNyaniJ7cidon1*pQ7MW;)SHN-D2C!F@k5kiC@ICkip39}Y#Y~_J%#e_yL;v3=Gpe6 z=v^LJ#!ep1n&t20O<CWuouL=*>`Muhl9D)%(l~*WC}UP7g_fi=wVquSsFt14jJ3NG z(`eh@=>1z>J?k~<4l8r(ZhNq7&AatPr+k(T=vq3gH#$`*gO;TwoJLuk!AmHIR#-1B zqg5$OwY{t6e5P}4#pJ%*I^KChMw9h1bF}Qh-$XBWcBCBL11mU7J1U1)&>C82aj&9h zO)kG-@N|#od6KFt?TbqlH;2j)?{Ji>fyAJL(<lNgZh|lt8^J=;f9el6BG&sg1iCUp z7RmZAn9PkB6ymW9VX&RYx|21gNE<UR-j77LiK<licvvXC*(;G~830wsd66XBT}9XB zq4K4RNoquNl=iT%k)#fYYl<@M3q_N=ST*U0s`N04brtpeN;x-i83MUKj7O2q2bZG@ zPsYZdN2%HqfOFP=!Nh4n4Hi*@eB9SYHR2RuZj(pNvqEXNR4SBDN2lBQpy;>-9=Ngn zps3*mmR`IE#^TE?W&^hkpvIWza<vS~@Gt7?)jetDapwf9MZm~^j^6o%|J`N4*Fp!B z9)BXSV`ZSgA$Ojj>H-h{q#sb#rUIyqYyK-WCyM|veg0ttP#QofoH7>F2M%mJX%O+G zuVF<!&94ywt5-c;gKt|ztV(jZ)+9o+b<k)Lq0(raQRSmnQ?6HtK&8zV$%0b#pdr^P zr*iAyuvQ^SkksY+*@sGvr0IDUj<e-c<|{QOsqw~`a{0)OC3jpMf0}SbNrx*CPKIN- z0zG$BCyfbLlytZPp|>m0GhO}Sv{&#VVfy>FIP49IgUdnTQl(!@y4?c$cB5YJbuNI( zhWs6?sIL{_`w7CsBG%h_@Acq@#NPG#=&Fm~Z&FYCHJwu7$crt0o8RKs>GeDu359s; ZikUKyZu6UTyqqEjDd<eo*rL)&+kdYXdxZc1 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-37.pyc deleted file mode 100644 index 8aa6796b24456188b6b8a3e58701a50e68879bf0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2369 zcmai0OK%%D5GMDfl`P4M^Rk1YaDb+OiY88hqUa$glE`Wvh-Jf4P;`NSU5m6VWp^cW zslpbNlU(H5pCF;=p|}1X9(w61m;QiW+8M4S$Uz?~lbjhoX83U)eq1UQ2z<#;o3DN@ z6Y@JUi_Zb#A++>6=s4jtA~6kUYy}oY-iqwl2^>S)ksEt~XJ{wN#eU!$+KuvYAt)Hy zi`L>|P^9Du;W_SK5bg_SVh1IjZ<1=^9R)R2OBWAh|EQaEnkrO67x%*UNjDLOt5SVq zZy2fW<8viyC!uT#g{y^xnT=YXFSgA$fpn|>viAI7x0@>2JsPTRKY5gd(RtcUVe*=p zto0Km&eV#$Y~-xD$M*Jj>o3}1*z&XIRC)k}AOYnhu-=km$|<)l{J=J}%^jc};c}OI z7i2;M4`_31pmRLW3l}8t`5G_6n14$g5)=T1l3p{qvs<+h68vyP#n{r%p;JWBF_~CX zYX+0bR?Y-?<|=POV9Y7sjQKH{7H|b8a5!yL*R-1s2SUm`9HM>3x=B|tCS72qkFtE* zz{t{AddOerE7-9R!5hK;9L`nR8FWjrcBM##0%)C7M8`1Z8EZ#jnlkna`San9iU&J` z?%-}WNmUp{clqgga`xHr2?|YP-;0Fz<xU%3mkYHchV9;9VBYxN;9RbO+B?uv<F>R+ z3)F|-D0|5awR?+O{WE+Y!1l}VjY-eWfLy@jNIc(wB-fFG*Z}-wB^$1wXal>e*x`y# zp`{ox1dJM8S$V{J29is*;B(d%8#slhu^J-}_S}7bV9uSZ%5*Fh=^~;6__8F7#eF=$ zf{s|D%~gG?i~d)w_MeA?Fo9S5FU5WoCY@o}5$JmhrI#>YENB~xU=?~4I*GaG7jWaV zKMd-00>54I>bEx*;BHOrF&$f5WJcfEV{qf1``VHXnDM4L4ldpEq2<Tc4DyUB^wz++ ziwESiY}S@wEeC1&l5`!UAc3<hGxEk6TigQ4uVaYMEeMX@6>dMkabtQFxv?{Yd<N9D zRUR~CE5JH#ZxZZpk{|Gd)%E`}ds_a6fIerg&ocV1gQYiKTR&2H-<*AOMlyQ3IYa$h zuN~wU_W{Xu@C>&xx_u|zhQBNdwokfh8v?K|w?nmk1c?yl-T}}=qFcTD3%=?t2t;@> zq3uW{vIufrNFc{Ch&m-CrV;Jd4-fYbwHNg}9U-;L#nG@Mui-&Au)~McUSq$-_UhWp zc53fgtBJh-_5RDoE_>F}ZnO31u%)kdz%AQDDMbP!xG5;s1qPv?u_l7Fb1VdxC8OS$ zqVv1;R=w7G)_9`VJAK7O(jRtC7!Osb%jV2}a@^%2X$!s4e7b+ws=aKn*3-i}FfVqi zu8B$QBM@Mt)U*p>GEZTqg7|0+LmW&XEu%?(3}$=@%_LMpH>`@uCS}Mcj-jx}{8FYB znBAlv-J}JpY?WydB)&DOtcD$4Z5eKeFgD};9|8fdNv0J15q;V+l%<UCPpm98I|d^8 z2`tVKvg7cqYG?O@E14q2U_92vc}_Om``5w)zJ-=z`X=TIqg$(nUPcv40+azvD2%~_ zvAEBN5z<A*PKRNX&6vb%5}o$J521pn^A%q~D2?U1G|%^K5k*i}mXJe6Gg;FlOe{Vh zK}*pyeOk;F9sK#XO~!3h%i0ymFiwpRX5P9UAI<Yx76uY?t=`C9+PG4j{i9$?8B`{$ yA1jqBD`sAA&`#7@R=qqpGKDgSWiLzhOKUT`(N^t0$PoDo>xMD70?$AH*?$A^mON_! diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-37.pyc deleted file mode 100644 index 1b335b634aa348eb816d71f38dc336a4649f1a95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12019 zcmXxq1-KT}wuRwMw{!^7-GTu~ryyMh1|lI_=@1ZXLXi?Fg9f{m?rtPRkPa0VU;)y? zUGKj4`aFJT%sIy#bN&Cu!#QfbOqtRr#6Nn?&GY2hdlM2)DgOVDWKq<KfA-H3(Iufn zLYHJ6l66VmA$gY+Z4*kTd^UFDA9?B|-kmNXp%jEnu@PQ}!4ZiAQbnAIIf;u>M=XZM z%1+6n<tLUUdh24DIKiMSERDVJi0ME9%aq-fdH9}88Sy<Vw|kNL(%=$xQ@{#?m9Pp{ z!waGY!5ZaSSQin-O71D3k=?>l`cUgxGEiqCLJqzSdjGO)q`plNF<9s(Q59L<)Vs{G znPm&4ioI~vbgS|`q17N8^Ow{%0RvbL>6M2el0T163r!7vh@s&fYP*yjuoHf?>!+01 z(%J_;OfOguyI6L^9@xl|9q#tAUbD7WKn?2NI0!?jd3JxYu@8QR{g7yIfa*v6LLG!d za2UoK9HEZFF*pt<;3Pci1&{jVr<A|KZ}59Wc+3mlF`WY?nBRg{aGLK71o%#Gfp2_+ zyJz*DQl5({{3GhT-XHKMTrvHNs%GPF>a>)9s0(lrE<tNA_=~TIAHZGm2E;PlqW+DR z@GUi3z#Ys_!cb)uhc2^ZXSpJ8sOeRzI(3a2DE<Px=x1J$x^6Jcp>1{-in^h<(X<NO zRDSGG1^7>S3l=foV#xxx^%BxVEH+3+C5IG{5>mlX$5T^jAgA4;Hij9z1jCgtQ=d3F z0IKSxwb9WhN=K!K43H5rL1E@QsLYTBI@--jji9zVc~HtLZe%kkqkO~eK*+B5G;<N< zNGgZkFlA0E7rZLqU3s~cd7u;Xom5`P2X{e!C;+uxD@e7mTNnx{D~kUVmPjeAR|IOZ zyyn_1)1rDyS&C7`p#+qKQcxPoS=$38tv!>p0cA{=7?h=ko0eB@gK~PWyLOlI4eD=d zl-&|u-(I;)xhv^GkQ|0HmlseWB9!#&DzCu^gKl;!n)aur8{Dnjpqwl;hhBDSFBF2? zdevO(8dZ2)XeDcJTKfuev2<V_>Ck-Y0UKLPN9nx@m95<ahYTKs1irUS^NAlK{$7?N zQr=}5ZF-;H{ZIwU#X%UvyoqnQl>Ssz)2p!zKblrkJ^*)l<O;r*g;v)~W1|LD-QXpb zn#x*G8+tRBHaJbqv{A=kDpi-N2g_OZvs8x1l=Tf7z?<T0Ktp9Ccn}&x6DV%_5Y-f# zL33yUEg^4A4o~}7wH$AyciFX?c3Ue~Qf;WWy`U}C4yr46!`r^jF)$V~3TV$VPWdqP z2s{e+CViNwLcAFN+H$vp!Q-&XwI`@2Szcku?Z#7j*G$I??PyxWw3WO`@P??T`KnXn z;AOjwp_7fc5PxS^UXM}XMP+Tilmf;Wd<M@*x#8OT1~s6wUKc4{taVj(gU+Jv)_coF z7f1%rnhp^^Lg-Ds?s|z4p}&p04W84h>BjTaLK{7(v8G3r6MX0z)H8bTD8G+oXfGwB z!3BeY)M!ynls%>Ng5Hqa3;Ixfp&#^z0WdHk6p*)0z}un@OSxb90?Qzn=y(}})iEzT zX=AX#5ctoHHSnUc1K$-dEgya10a#$;8S$AU59J#c5#BH;VYj5|GSf2x?t^#TT|vD9 zwfJ7L`!Wn-eua9LdX@TG%4^j9HeRQSo4!E}j|ioloZ@{iP(M)lsn2Z;f>))SjBDX5 zgAvvmQlq`#faxSp8^=6S@-2h4a2sBCvRj;nU#vaM_qIV5YLtyP;Vl>q^^z=6g%&o( z=sm7CmMUp?95o&$z&o(ep)qk9c3ErdX%h|Jg-I|O)(PkeQ<QnE4HiGy=a>TPO{Y>* zS*F2z@IHJ132_>xICM+EH0BQtro#-F3A11}%z=vz)fPWj`JT1x%6ZDZrt_(8UcXXV z%Ct0WfR9XHHVvjvz$SPV-j{cTI`37b`I704wfnK%<jS)wDX5JGpBQ`!pTXx5p_tG1 zN=ymAQvbxLaE00^`3t@tQa*CyOXXLPGKPki`F8Q0h5FGK-qf4LoE5&XTgUMaJmVL> zuLXPqdt(_Y+ZaimqMBOE&G#Zatjr^2v-rQGB}|1`%&iUjK{q#2x$%mP9I*@|_{Q)R z64f2bGT+0J!bYX2!Z?-;df$50ckq2gh<_%8XH84lT?A9%I=pD(sJtI+EP#cu2u7GL zrk21`SO&{sMMO9+d8P704_`&ChPqzA+O&rF=R~E3ao*hA@n@+u%#~R-Dc363!Ft#L z8(|Y{hAr^0fbKR@yL(phLsGVyZiBmHFC6oNG|>{Ci7KRp6?&s>?6Hwnz;+wcsU1;; ztSpbk8{s<jv1>V%XO#((Pev6wDGM8vQGTr4DPRlrqtIQ@)S(7Y6>>P<MrdYbz4$r8 zLK}4qelVEfEi)mr-X*==qQ18=1okNR!cVXdQu94(;{j?F{A^HEZ$GtwIthuszXP!s z9&~(`Yks>=d>+1mUu@KL?I3lC`CaD2RAK4|(<7!w^&X17aNOXSvZivCathyg4|+-R zaT_VU;5kTUFp}kj!AUp;zrt_uJDi3y;FosdS!ihO9CaT4fIlO`_wGJt+A^LD@$ZDh z?~1xi{l)h;`~w$YytizzaZ#DhSMq}AJ_+Lu>a$FMODzAwWth!8f#r&_w~edRwTSSa zlkZqd&v)HmPE=u{K@aB6P#3=SZQNklY~x40iPS3bi%l0mt~dzo1PoUmhv%a&%#6Ko z7&e-IEa0ZRO9JkJGV<nnL0^_F*49$Bq?}_(#qyuETW}i^;$K6FWet*1$sq-#gj5ls zx|DZfK<GoIHW=&$X{b#xK1?t;rI*3Ck=7uqyPxV^q|)iFrqWXx;HqgxDidt=$XDfk z8uP-xLVI}H9j2LKhJbl)WKm{~2&I|NF=tawSKd_ilvmY_sZ>sApv-P}AC-g32^odv zqH@E0WghAy>P{+eM5rRUS=<fvsE<uEdsPE3&BwQux{F%v<i9Y0CBI$)C<uk1Fl3Ta zgenTfpg6R#TY@SHrJyvFi3m%*pscc7JQ;pamQ$983M@VKws}x`pZ6)KXxdrwC+;>h zJ*Iq@nn88)+@8w2nHyTGL{)}+;10W=!e?-=UOT=?)-FrgPTgnlIZI}kthWR1H>d(x z40`E(K`pS`TUph#8Z=UVY5Em>4G$PRXi%N10X3l()P_1x7wSQMXaEhNm_v=I2VtkE zAECIxH*QS!MfA~Y%+drNf~L?6cKOgNAghhzcE6=&Qs<#LUkhjnt)Mlui3qv;jAlF3 zR<9z}j(Ux1Pi>Qu){SKFu-=sTs?fx4W9l@O&Bj{h@4R3(^CQgPD<6$2Oyle86Fp|o z0Un1Z;19d~On<P^pL){ZDd-4KM}!PgUU03MjZS*+>+SNE3e*At&)8_hQVVu_&~BFJ zSUOwlKz$)<C)8uPAEr9~v|bk}T_LZ*9s$FwWpksO!9wbq>3#65-d9w2>MbfUs?a#D zg)i+sXRuxTOn6?oNJ<ZCuj7>rdMbNCZ|DPkp&!(j+@Bf%1K|Z21m{c#Q$yfI7z&FW znr=Ew`4YSgufVIYgyprULhhuG%ADVWUN>z?{i64Va;$PVH3CLLY9C<~^(HK3ev29n z4Q;$lje)+(u~b1ns3vx=P)`_)Gbpe3iInlmwx&xxa)R=mh>+e(Cn~%0ePZ`r<=$ux zJxtf=HILJfFP7m8Xl;-t#)no^YRPx<Jq2mq%_Oh9vJo{+Z<6FW%ACr{$|<nSs}34m zhpBqg;5~RBma}|7op9|#YC5EMqk_D31_P)W1~Xw6OcVN$!FHC}dUIedyl1dN{7QJ1 zWuC!&_y|6RPhb_xr_^WgIeY<M!dLJ$d;{OYckn%|w)>N7KPVT#LRbWgVF@gSWsu#* za%x3H*zC(*sXXFC4}?|9)o{qCtmgIUV2$2dSO@7$f45PLTCcYOHo_W*azupt+$bI` z;VtU<7!{gD6=o<mG3R7n3;X1afvZmDqBe`)%vV>r6t2K+gER0Y^FCk1`>;;bmbekx zIP{%E0}Vca9n4$h<>K2$m6o@i+5ry;-AVljyCOn1DQlxI?4))Z6tPweUXZ*;?>5UE zcRTZSP|l-{3Ej)G-rWrmA#TOr$_*ZoQoz%iiu#GK8MQB}P*&dO%(<<-t=zBtnQuSr zkdj8g0cAS7^&CII_lsU_(}Pik$$E$M@_5T(>Ikfq@^jn`qga~Tc-+(OgQG0JQpc!X zrsLyA_>=ih<wkkO<22OQJHc1d#!2cF>`?wn9i_gq_969~UV0DzojMI?Af0KT@_XM| z>KvShKj6=Z(8$Sl@+wOC%iwSL2QIMWjFwQ9@4pxt22$UMzsPb4nks*iQp&aFzKuzI zciBj!-eURCjs0+u?_crDOfO5xWw6P&aYfnA##NTuEV+gLPF*v-4tFx&5S2Ho(ABh1 z(lg*s0XO(=!hbNz;8s+jIP={??}#eI{rD@<pd~d|XhOP(s#20s$sq-#gjBHE-S`io z;{T3~DlxTQ8b})v;%fZ05gCd`74pDudg)je#T#Ld-otw7<I_TBDvL+9@`4O{g;<&! zJYujO(hEr8X&I=0sbP>&nJFT)wXsjYd(^k`?()bjuobq!9X2w<c9!jWS(I5J8)SzZ zkP~*W<f3v%gjZvHs0IxjO63`Oe6f4=KGQp(EJ)?CaS!!9-|tS|DJn1IgP}<;rP8u& zhWyF`P!K-VD@5&#Zwce&-Ox(|U;Bm%n?A3cru>mFLAlH8TX@h#Ymd3MTd#<XqEHNq zLkTDerQk_XrKvJd7Ro_+r~q%fQIXmsbg#R$9LgOJg^!{NCzSrZg2YPjp%=`x_KR1I zHhn^GmTQ$+rpH0zJ=9M^_rbl&``~^U#8QP?Y_}@)hR}N;zm3lf4lApfJ^;;P88Uj+ zQTWjD>TwXxP&HUyvzEi!1S%E$EN?$#aCesJaf1VTHLYFq`iJytDQiO=_=TlzRN;af z_4MjP12|~fklG+%i-1PT2ca=EfnSrJ!E(sPH`HP3ucW&yO`(9^5oo4t4lN)nUlR{+ zscZ#D`C3zLpe@YfYeyY3ZBIQ6kHDjF(0A|{)d3!dC*VmqDPSQyrR)e#Lnk;cv>-gA z><nF?E8Hph4<EIg@>ysvYNy^{(?WK;8_ZCiP$nv$iwL)U#VMJO`Kb3&B_hJl1}B+M zL1CC4E#WVN<;-nih|rAiE6Z<C1TyLUP8EgcojgtTpn5_tFZf2@DtG^p*N18i@A(`R z^m;S5k1EV(ZYlYUs6Gb%yE(Bh)eri^U~2=Y<)Q{sFTfy3ZkiyznBBp8GldSJP8mFH z?M3BK7zQszgd<+?vho#p6<&ka;SCrLBO<~&=K8Mv9P`3*<!j>iLvhE4m=1R>uNU+- z7%5=A!6@oYcne0u+b{+uGLNOk!FZSe?;7~+CGj2QS%+qcpO`d-6dqK^gFff`3nm#n z=q;0}Q+mI_9d;|**k|LMyz_kT!xZMJFb&>=7S`UUGJ4Ce@HecnaY)_=rXRv|m;o~* zLO(ZVDgTi2B6F{(!d!#%j;|5b%3wBMQNB4;3DedFbCUv;Jx%8+J5!779%h-ZSCZu; zYLKUWOnnj&4!Ty#w1>4iaEawly}zI|{0(K`Q@fwR=kNvm=GvFkSMW7_1Mi8N?HS)H zC-MCw<vZo~@B=jF`vMjy7eapKMN~ckb6~M@2`q&RqLxw1p`X{UpfWShjR<vpz?FL6 z#c9}~{E=@S%c?jCFX@$YZIr=8ctE+#g9<3eMT8IdG8v?RCZ?+;x1g@^RT8>J?~&LG zm*Pe^WNosI>#!I`+PLWTYnjVZ>!|e+p^}XQe9s8|jd_D<Uuq*&&c-I{M)ZZ1Ho7wZ z%W}?hJL=sbr3-9k-U3@;8*GOi5n&|rC83plgpZP<l&{;}$ugVeM;p6fH|&9AEPJWT zHh!Y^!3R>x>;0@epuD2opH#vxa1ai`;iR6tBh*ni2FKw9oP?V`<tgfj=l)9l77^}@ zj||(rw2EuL8~jb3rtV@sLj^bs=iog20e?n>O#)WCan<fma9R0IQZIglu->6^d=Gl= zQOQ~O{$%+})PK}drhhB{feJqU1viG<eU@cD%SF?}%1hM0a2e)HzGm%;GM^jA^zuVT z8?yymHN6JcVNUFYMQ(IA?ar6Q#!$GyGK{)ux+I2%Ys~i~^-TYRTd>E;(*kZQ6XM^k zNlX?Ip0JVJ;4_waaECHEOA1H{sUS6^fwU1}iQRO{^pF8ELRt^H?(<F*<=<gVd@d=O zN~GRrxz|hYq%s?1fvk`XvO^BI;iq-OwVcXakQ?&AP1E~LyTohZ52~W$cbevf>`qRD zQ7pY#@)`Wc*Tyq;$Ekn59sk;*;<uC#N+|D&zVN)Vm-5Bv3A>efl_z|_3zGB8yCtsx z^|h3(e2?<oHt51v5ZXF9$?i*3K^rd_B*gy{mUz%t^0L7Sz2np?u+yLrb75$qEJCg1 zTjFVplU~Jq685`Ml;s1{HKzTo71JvYB_cvMg9cLa*{H-)(saIFR#Bytbqq?|cq(p$ zuVI7TDSTyEwozrNa!?*BKt*^cY3jz^%1Tff*6Ou$XavhWdiTP8aDPMy4pmXs^^6KO z=2A=Hl-;VP)gYN~vIxrq%IfeBUk$1z)Pm%E-z7cBQEGQK)g3e&n&JxFO#pK1UN zp%FX?ADX@?sw4F{)!3j3e599B-qTbkc*x*&zHDAUgZhYSYS0XtLyL&;iI3k>IfgG$ zKmn?NjZ~6bnYM;D5iLrmI9RA*`}$4WbZqxnt0wj9HtX1+N!xa9n$&CGu1U)l9oy86 z|8X$O|2gW`Yu2!1+a?_v9?bK<o%)UI#>JK$8?|ZJx?{^W4H~xjG@)Or_`^xU^;#7N z^z2iyPhy|)iM{#{=+vV}`7V8j^cq~LTX)T*KRdqAwO5zk{VI0u-l<=gt^+D|9oYH# le%<<Y?OUPGkb`M!^z7YbV2`e~O2^OTA2%eVOrA33{{UX+MIrzI diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-37.pyc deleted file mode 100644 index 37edc2a3d76a163aa4ffc94e4bc48e59513534f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1084 zcmah|O>Yx15ViL!+mf_Z1gJ=y;1r28LgI)}X<Bh8DX0;bm5{YrJMF68O=^1)iF!+< z{*59|{2xxfa^f#=V#eD*dI3ka-_GpL$9t25R%?^MD!=Z2{2meV10Pl^0I&~RAHu;2 zr;-#jp%k$vy~0m?hkY3oVG=qV$f#%}4NBe+9`a~OcqHh;Ph#E}l1}`SLZ}Y44+oVr z`N7PH{&}i~!n{|Lkx<}i_a{6r&xR&7VvuI%c`3m9=;%ZL`1CN>M&+Z*<dgDsnaY{Y zH8{7NlMM%K@b2*FZ3Zd+EdLhi7XSoFC?|<`O~#Z{?k(fQ7XkNqup|qbgn(VmfTL>? zkOXUP*n2L1U15d|;KCb&<JQmMFvQR+vhZ%aFW@x32^R3oLK7_r+>I-86QhR{2ue>n z8#dI{R44_s6B{#@m$_j~VL%n4Z6kA3FkL8=!am?@{j(Gam<we?CA2WWL!gBm!@a>+ zCR42$`$m54_e?SEP4j6tFSSXf?DET5`T6<y9F1<XPom@#)yqH%E=*5U*@c=qLH4FI z6+`Z)ur&fgx9BE~>HPj0DSNBp@34am_3=9_o>S=BJDErDS@-x<ZGo*rRTD0U>th=p zZ4>K&j#!x%q5~G~!9l$F?t04gm;Rg9M#mE+((+$vW0{s`ReC16Yboz^xq6`!qg+@W zV|J6VV!|tlxXIXMmCD-Vc(XC^2qK%A+JUgD4To*r>XQj6L2#sERagr#vf!rT2>^}b z5z}VW44e%IXS*2PwqL8HkRaQx#|1<-qNx8lZkX(j6LxKO>T!x7iiX+3S#zQPR#GFU TM*OmF@6}^021lSt-Ov9G@IeGg diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-37.pyc deleted file mode 100644 index 57428f5d91e66324859a9402a08cfc0a3a2fed01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27139 zcmXxs1=Lq%vjuRvq+6s*x)A~C4(V<rU%DFs>28p20qHKKLr_8#1e7*7N{ESs-t+t4 zdtJ-<Cid*vGtYTN(e+hKlqf;8@Q+?=(zYHyJX*B-g8%;`dgzo7|LmVMG##V0h}JQB zi|8F=w209$X2WQ?V|59$;U5pmMMX;$Em|%n&=M6dZfNes4#WS13wftQFNn`HVB#pu zNFRDTgy)2r5{KqNtk66QH3hxo7KXVX3vXk>(8Lb;gW5Xs$yJCKdc;Nbe=RhV!Z7MX z1ao7ACVi5ynohNLqR=!9Nu#!^W(W&WPw{=nTO5)`t<hV6S4VFYZ&SEO5ay!=UofRm zeHM<3ni&d@nyOk(ZkBL1Qzk+XE*I3&af?|2a?_w5;r>ydh1ZCh1H754m!a_B4#+?B zWwvijZDABGDx<a|?w3J$6{NQnvfFpAJ4c1+-~-i<ZPY>aZ8GMXahBYec6$-#f|n7T z1?Pp;V1{s*Jw}9Ha6veLpsc(t^mPhJgYv>w+U6rYY>)khAJDr*^|Ww2$QY(-c!Q_~ z!0%$IZ+LaM1*9!Byq<7S2o4_eI#d6H<HQBo6s{Fj*)okR{Rh&Os#WFcAU%e(irz)8 zQ5V%NVL|(TquO8i8)-!;eJ2cqB65puIf0kcpxPj}%=n#GH>3}CtKL_w=0TSVUk7>D zwC%hPEm)4+*GYQ~xSioKRI55u9@TSRp$qRwm<w8<nrp36+7^c3Amoe|H3dN}3qFNQ zDL0O{mzNUhZiiiD?svj=2yXdGGV!J{T|C+AI^t1~Iphoa3TIOAKC{d<ev_-`l560S z;oIaDz6Dv2Dogk|MlBAf1p`BH5dMURUprhLN|S;7ZQs`sY(=#M_<gwBR2>KYEaVFo z$aNBa9$q7;CTwHXKV1Ay2o7e;z49`Rd6mrgk(P>P+yb6s<Yu{VP{ocYfXf`3pqsYd z3I#!;t1fk`x(JF8*;3)daIN4b@HU!rT6!7W8d}B}beEupAh~pGllzynqjG)189{5_ za&2!>5T*CISA7%T8*)j_z0FJR-QqBB`<mVedxN|Pa)hK&EvcU>+)i^V9bfop_89(| zjWQ9m7NnUya+$G@jIZR*Vks0(3r+|#hv2B{rfs+24koL&%!1`-ki2Fr(N>tqtUC7a zR#C81M_mNfOj}ApdezQyg+o=r_gF>?&r|vpr7I%FN#gK|=qMRNf+rz3=%FK@-p_dP z-835J+q?|GEA_5oMhd&yG8^H29kxF3yM*V|u{o>;%}^a8<4+He%^u4`FZfy^foUIx zUNB$yHC5f<?!jH~CBCbANOiTj=faZ&Ipo4Sgqyq28injS*7DYcCU{fzisM|gejT_d zax;d)gAxelF*V^Xfn=fnJ_W~}IJOnWIL>vDcd2@zkQ+-q)y9^-AI=TZqS_3%%gc;& zgB%3y7Vcrbv`l7@(O6#S&CIJ|<WEdda?d#IJk_LF`h{K)4hw%St?--SbG5xB?US$& z^i=&F!AFrpc#l0U{)!ob<rukNAh>MR^>BNs+Q9oA>90t0=*?-PlSmV2i;G|*+{er+ zVHz*^56Hf7Zjh6=N%c(~n|bNr-gJW{n4dX&fe;t$1m0p~GOKO@u5R<Kp%+|@R0;oz z((EBikWKD{=c#PVoJ3Xt`7LY<rm23e@V#l<@NH)rn_G>Hq^g&BUmBUvb?aNdp0FX@ zn@DH!4upe(j!6Ft4;B;(y`ZY_qTQaL%0vBZy*ms_tZgSRliUT6n&c+eu@$(nJ)$Xm z$2)+phNT;jvDz{_Ro~IE3spmfQgS88{f7D4Nz!S1gDGjo10zTB()vWND*P#&f~tvJ zJ@k$6Wx|(RSV>znC%J-jqFhcN$UeAlu;jMZB6pb%*HdmcX+OC0I=RKFd*ou_D+Y4f z+^a}mk<m*o531xkzERk#V-#t76{Z_r*YGvGeX7^sW~q)xkk=7&nU>KZ{t!L}o`<C| z&AF)hktuG==6bu)@=`|+xxGXV)RsauH}HPFd3br5CcudZFQfN7RTBumWY7t1CxzGP zTZgom!bF8EI{Y1J)Mk)Ia``A70(V2lw@jz75QJUfmUjCFxF)Y2+*bPflTjRV1-T|f z7Nn}X85gM93z8J1hg=rZ;sc-MRZ!UPlI`SnfxObOEff^2H@t$}TGf9Q;*pV-`GkT4 zM*id^6G+=`j|2D~$Q|Sz4ts+iP`!&~AC~b5mUyV`=u@Hk&eBa)M^iNwc)xG}vlKXp zJV00tM&g@?rJIp&gWN=L$jDEaWja2MC}55-w?Oji$gSGb@ZSl)NkLP~{1~~A+!)?L zxubg9d$PS$WiqXv>(+w%6JI`5hY7l<a2~D%^QLg1j-RO?Zny3_eu-R2I128ucRK)A zl6k0_T;UCcF}#1xSWVS2f<6##Mlf2naEJ>ohj$6ybDSh_f6#Zx3deP9vt@6&bE?f0 z@)=a0NWXvtWAvT?UhYC482%b_jjHQRGv;In38n+@bC=>FUr^cb?Q#bQ>fstwnMY={ z#FAO>>Cg){!8NB~9&ir1<Z=ZZr#X=y5Sb?;gYZ*SeWK&GXKX<89o}h$Wx_tF&X6_- zRj)7%I`F!Xkr!25R1ax+Q?7_`mCaMbUAD|{EGvL}(DE7jp1gk)=DT<)dz|5QCNcrJ zXW>SG6c5AT2EM}vy$*NBYqg;M5~ZK={zAHgIj48ILOyd>leSY~rSNkbmB#l4Tn(hn zna2+M)X0|jnwgQ6pu6r8-`w*$&L|vJc;A8-<Q^f&2eOmbowv%ghfb0o^GO|B(5FD~ zufl!=m6`cOK7l&|QWm5&$VK$|kY3__$$XD~kZNsh6+>_kWuu&Mr{!*`{^zj23jY#r zRjr2kGM1mseLX^;`jy;an`hB>&(gmVG|(mg0lqJ{+FD<0JL;h_BW+J}65jV9(^Lmx zX{h&W%p*Zc%PpY3vTIyXD8u`nszL~&d8n%jt!T-G;2U9V3eHEEnap7r%(V0mMqUHC z9-3g8Tmiy=HS%fb1tsOGYfEp&UljbP?I)(SK~>PNqvagjSHiE|Weac?;crL_(s!BM zC#t)I(TL3NF0u9QRjsch5ASaT1uz#xa8BE&%<sZ9L>3BJf}%vmQ^@K}>lN|{8=y)a znqUja1Dcy6y<zEZnSyZfbi8N50<`#jps0!7C~a5>7VG^E_$G6U`8-0eEe3tjEwcwf zZX1o2D`JH;_$Hyct?g&bcX)T1Yash=-U8&FTq6WA&=0oE7Nno!`@_;};g$*yX!}zx zjxB$|yaKpo2np)a{Fmxv9lPmkr&@v;g1L>y`y1pLv&6{BHhM(Wf5KLJ?^E><{r9{d zm>-#+m@c$T0$yv?UIy)#OJGo2RP%Z7hhA`vsx`t#_zIc(A@C7e+ABO(7)oDj!ylLt zFh4W@==d_cP!KYOOUtc;EA63vlA9vTZ;!ued4jLD+`|wY=!<%er69TKd<?&WJY^n% zv;+CoM%hTq>bj2&ijMRNFPXMN2<B7T-<EI4y}<kfucKUly*EIf;%m<P6+sNry5k$H z&|COaVTITKjrTkA2U8enCb%NJ3*ni9E=2axR^NB9hSJ9Pp2-cu@`c==2)2j4!Kkn! zsHCkS+)Gq#+-1G9j{`1_>MtFCGZlsRRNLxUiS#`i)d>s1FQ~3-Yi8foAfNHpxyyoZ z)!-mVZHMTf?V$CKdg=I<sik)?(mYIiVKvi=lJ<)68_H3uRG$%)9HcP%w~+oxeUV5Q zdO;o2J`%2HULz>Jj-rNtNm?m$|Ha%&wJ-A=)f|vfOn$iEd<^M%(G4$(?+`7&fLvDi z9b|~=Csv(h_&;vn&(;1=EoRWC+S*$BPr1fA{;|w|s)q?GACVzfT<$VRN-V2+FBD?% z9sw7$QC{I&z%h9*LDDJwWyV+Ztp(md_%XvvxK#^UQegfO<hi+T3yZ;}cKb?le`87M zF3)ZB6L1e^CvZD_uZ;Z7jPJ~y!TVRPIoz|5AXpckB=|jY7ktIdxbC5b%WX0(n!-!o za~;_gN?0ozmUk7JSg??}{e)u;`bzGAr|2R~!8Bnun(;P*|7a=6%Lm+o$S-U(4fAk( z*$_01&|5k>EzvTBCcAKr!a@f-Zr@#o7t;{~t|h7$G!LSAfogQU9eCqZo0##gvu8Iv zf5;bv#qjSZ(Z_^qW=0HcF_}G%-BH^?gDz-mDr`wcGTvH+ueHU}k<_5R+D;G|TduJ1 zs2OpDe`1Nt8=&_k_3?xsyH$K%Ou1M{Phu&8;BN#)j4b7dMddO(ae;^o>epf}0(V6r z0jf<%Cn>}Ur3I(#J5QKHTWm9K3SSxdnvR4_BIc}@NzD6KH3=^%GdC0-gv!ESu^r+q zGuEOiM%8&Y7@;>A@MhJ9R!uI9h3Y@1t*1C;!4wMXKz^d-2=(o-q*O@7Ot9b<R8zGT zwPk9BG)!q7{R~ele4R<hl+e)}Rc*|ro$dhd29|G`H{jx;Pak^0XlpgHU@P83st#Eu z1Kc|Z9w2B!L2)DJfn-$u&NV&~exl=rY9@uOz(a`4p*NM=muB9kAT!8TN~0wUO%YnE zFl9{3qB<Kvbk)yDYeQNL;b43>&CLq8Px!#_n5z9LSSZY<`i_zHT_d&!c+BgkBfDxG zxz^^!(wjr>Z<-5u+ME#xuPBz{wyX#|pEp$DO^{poc9Xl;@VH3#MLdwQHfqjm@8REL za%ua}3a`0FZeboKy)cD+)7Uq5s46(dD@DOJ2Ybu#Lu9m}G@fZOO`8xon9Xz9^0YyD zk>-Vq1rnPXLT)~V_<9TI=n7Jh$ovX%TqCaGlMPP**Tl#;2)61-7zzrys$L*%nBD?< zQ<E`P^_A)z;X8Vt@g6ayDJTeB&T(Fl8_&qZPV$!<6jFWLzE?2EHTSH|i=%oA!6M+c z2IV%Wu#O^3d{jkwL#>q|<O@=OTr~V}<m@(TgQ^(ZIy3g0QI3}E2IV!Q74S!@#o^lG zYsy?@5@Hz!@|J2LxHPV@Sgtjb(eMX`_pw$9xb<*1(7!Eg1NRQ|J3&npO4|GYL2ogB z^DC-GI5HTFYNW7(_ibZZ44M<sQW9TzH{FgPfkRXfzQ+67S}XK^L`x~)PI?PtNsJ%~ zQ&ES1T@dx7EuZPQC`_t)mHLBJ#pCTTsD!XIzIT}Wz-4&Dt#vb8E67E7JA4fyBlR}- z9?6i_px`^V`VlT6xf?*<GW-zwj`l5!^a+9+Iy%Xfle_J7y~AAaFM_@x%|Uu8q$Fsm zTn}D4GAh}!GBezuGr&j4ZOc@FtEacIt1Z>>l8lYO=cr0f_)LW=SbEA$1}-1Df!<P% zvjksKd<mEeswwm?0A9$9(fbCfY`}keo;q?zg&!MPQQIyDtHf){Yh<HF;h-SASNIRw z2ogEnA*7uhr!)nXbtG2EsqKuy2&Bt&+?4yu`mgi;G50f&u~v94d<RPzT5d5{(8o1A z6Qxar&zZB@k{Hw*)m@NhAXO+hr&^Vl6eOl=ymHg8!x_P^R=7vdzjDbyk~5V_%a7`9 zg&UZwVd-e(P4o%nK1W|&VF27y^s$&4a>FnuU{bn$O}Q_0oM&nYQz`tXcZ4nH1E-cd zM!{rZ*{~2Cru2%td`Q7g$4NnHN~SidQcib_v@)uf$#^$11Ed`KPYha%CAD029Y4cO zvrH=ceyCbUTN;pU!f8nB%GG1iDpd9Tbw^NNt|aD9Llb;M=~ZpFjr>RNK-Jf^4dSKa zz0jM+s=LU2L#_d;hRiwyKUsgIk0zRfm4#bC<VkW*5uRRKbk$Or8|jU&;|I7phEH*@ zO2S9Hv_?Ke&=~lAGG?o0HnJ(mHFK+3aFXhBPw|S$XJiH=<0)k1{h&~ndBTifGAZmP z_bR@+n9B*97}<`hXJ%xETdDd!&GD=-m^rHYI;AgE%j?Yo{Ecv(YH7G6p%-L~{2&^X zPDfKSeum4c<AUQfll#-s&3SLYHLyY#)q#35=(s5C%3NZGm{G<?3Fu3&tp$Qv6uhH) z*6A`Rv{X1Om(ARaa%F^>?b}K<yFw;~*23yeT!U#NEI~nC;OxGf7!<Ts$f0cz^)-Q~ z5uO=K7G|)*05URC+D=D%<~^n)zMKfI*)pr%;jT6%ay4sB2YC~ugN}1>9pT<4Xa>^s z%pR}sh0R;~4ob@HmD|U3)Y}5zb9|kIyRm#i-!+Bu*2<zSmuXq4?+o`<$QS%UPzHNk z2hOINooR%i3tTPhCj;38l0#uu7zR!CzDreCxR^v9F(^v-iH*LbWiOKh>Hbi2@U6Df z+QunN=EZdOc9f164rNL(J(=1RbVJ&m*-S<$`<C_6Ssd&Js$W8Iupj+vAtb2C%Wdf% z+D6bfO5rbsSVj)B%noh$<f7y*TH#$IM;r93&A(JwZN`44XUG?<(a{U@K#;x!4YKrE zkjpw^GkGYegReJmA7-`tg{iPjSOP%-rl0UPOAoc%R|rxPnND@73;l(@vv4|Z43S5G z`|Hg@#!xGKt+%eZ@m06LO;ot2H!oH7RJ*}lVal32+nM$<|Dr#tH)E(EXin}2SStAR z2AH-3ZXhoQX>qV@1sNnambczXhG8ip9ITMf@Z*%;3Qe#F^H^IJC9OVH-x@wuZ(O89 zv>n6p7F<cDyTS{Q7}m-eeqq5|sBVOVf=_w*4N9Qx0L=|B4@Gq$GKl(;KA#TwuHt*s zcUnMOyf6%UW632~5kXZKDu=HJ@V7R~t=fr<;|kv>3^U`7lQcB45wi{WvbC-mIUJ;5 zC?ojWjC}-Ub&~bWdj=IG<2rCV3oes83|B~DAk7D<8YH)Yf+gq+s~%K6M!^ewhu|8M zu^nF?nop2hP*^3T4?ZTNA*zo|d)u@Ysv{^J$y7BXuik`~`N^~_j`+T65p(mYR#m8H z?i4INon#b90(_%+o#^YYdJI7&`c4wmPg{DqPfZ&G{F=fiAng^38q|W)93c6Pe2MA< z;Cq;7U?~PSR&E^gHAn@!9psIdTjoO7=!?Rf$XXK={sMVsMrCsgn6UsPh80$t@zRW5 z!d1*`%tXDP>bQ&fFmEE3gus(ji<(iKw3_$|G2hAc2RW|o5c*S=o~pMzZ?fJgOcT#I zl~<6e6WVSfcnfJ$)e1UFI8JZ$*DZL1zIsd{ZPO4G=4~^r7s&K57d#KYgP=WA-xpB? zWCm~_RHYE44!vNdYCY$isrnx8dk?=HZkF643KEkxoS>qpN)TDaT^7Ra)waP3ACqx~ z839}sq#D!AMzitFVb(gy2Dr~@X^r3p^~KO1(XrUvk>MqS4McvW<6Ds8Aak+g1erp? z+XTf|Jsr*szSHrFpr@GU0Ut%W+-}<~Q`_+UNYBg72U);;hh?VT<}@b|E>wsP_aX0q zwqjUbQ>|##k`%nHun1%^vxHg7+{Ra(f}1)DQdN}j7G|_$mciXp?adqm{t;g(%!Pc) zw~Xw?Yo+5ng4Vp_z-@TTLzdv7^-svnGWQI9E6}fGYABp!{y~3=SK5qKs>R%8HSe7; z7yOB;jB05QwGrPN6eRJDZ;ia5yEO9@vsKsVO&k`2GkS~D+?KSp3b*aHT<>-2|IvGc zcZD~SSID5UM)m=&N#8oXA2GE;To9(hf9&(p_jx(-Ri)()bDfrLPJBY)4wh^RQ_N_I zetm?`v~%GNg3ef83&Wr+udj|t2+EPsPdLr3-ty^f(7TcOOfDgolLk#R<2UAt3w;dI zjW?CqB#cYiB5ma{=QpDdQ&O(9`@KcvP+<j-$2$C1=~1uA{R{G@X@?c2m=*{9X7pQ_ zlnPrzFKA+!tE$I|Z08kz(NRq3H`k-aU>@g<YVi_UwLRP^Gu~1->+^Y_<42H<=u<J% zQDt?`O{DGM)$&?9v?W579%LI;rxi|8-&}7srnipms_z-uS*`=GggYlh+8;}w5Et~b z%zp^p4y(bJ!oTgd1Hn#aytzr33e?vJUcswmg?!XU6Yc^&C%2oI#%_0AqZL85DLrWT zz_7!=N)3N))OMGaGpc*El_c^Z(%%tO^jdorT3Gs1R3F=DR78R5XL>IHXVBJ-*U`Sy zfeRVg)ka;kjRxtY`Z=ZV>K(}|VZnQ}>@zJo`i~G)He-&Z|G~Up^#F5_>5Qrr&5tmr zH>eKM(sC=YR6$Ucd8V2x%mu5gznHXl;0_z~ErM!r?<$m080>ys%os2CKBWU_DTnI1 z+%s)Q>=whc0nXG@E*sn_W)fUpR5J{ksoE9kAuC+gF(-rs8>xB&xTR~1##h%eA7j}m zw_NpGEHPE@3oG(IL3IancHjXn8Oy;|sqTPFO=Nr3FA!|veX6axrIXV4fx<Mn+ZL=Z z%!=h5;KWG3aD&6z^6My!`G_zZ@Ia6^5!_%Z1K%b*A@4sOiFo&@s$uS9n#($NO<@j$ zen&bQK|Sk_(vbiz%GE{-S0gAxT6^A63Th!Z#v4S&ao!2$By(Qd7~n;AyAX!K*zn>( zTW7x`*A4wwM3y6{ijKn8x{vR)-sx0zhx<k0ZDD;PPnogHsy$SXTj8`^61`(k^;9U2 zIcZ20JTvz_E1X3z%YtWgB*oG|?hfx9Z$_vpD6Zo(klhMrc^@LEZS(jD2AdYo@Ls0P zw$`~27aY-B45T{E$q;-ld{^%p-Um)H5$;1bNFw*S;peRyOV~==Okr>IU#QkW&{|=v zEz|j)*SOVaEUhRQLRA;47GtRbl2q<<D}2G60e*@3yzm0k$Ba$n-p4mfwXa+<y_*$2 zXU>!Hl6O&CU4kyi{cPk#s`_ag$7=yMf!zLb1DH$NwkX6PZ9H7PkR|Bk8lPkN66BJ? zw=RBJ*xPPj%6%nlgEStNk+%F=?h13283tUz>*w^1e<OE|nSkJX8(kOPV0t0Quj3EX zzPEmTYsI85N+Frt16Nx?-?!#A0QnZdKx>^g=sV$NxM*+{DYz+j4b>0k4rQjRUZ!P` z-oZ>okgk~f5_Cqmf}qjB?~pMMa~>uNt|0|kRU7dtnO0VBZn@+J4Z+-4b*u-yMaz1m z?+b4W*XsB#<O_y*fID(cbnH@CXWCu4iypa>L*yo{FM@H*O<J1jNaO}zS?ivT`%Go3 zzUNg5y`Yg9Re61QH_iA#HJd@%2p>xGr@|kt@B-vVkZP!Y;tf;SsxS)fEJ3fxm`lN3 zg^50pg$fOYk9p0AOrdv$+yhisj0|`K^`=xUgS5J78+eO=+v58VxPhfJ;7hHr!OI+x zy9hj(jGyuS!ZbH>n2m-reck?{LTp}99gl>?F+b*|qTsG+!+HN1v`07s!APc|r+A<D zhqhQAB{lFww{Kx&OXdl_G-jlQd&#V0+TnXhb5$M7t<aiDt}uz|1@|4uuUKlh##OoG zrX|+)i}0!HCuaP{o2<8*Y9k_RYWrQG7H^o2hDiG{t%%HxZ<J*cIp?786@qcTjpE^j zg3m)Qm@7=?5I+FF=b=6Te(s3fTzoWwF_Dv)cFFJ`f&Uc##k4l94fD5f5|Ph%9k6_< z;}p_=<Py^N0fL9_@{{Yfr@j<ZSng{C9~ik&csV2pDp1-LB!xq?XU<@G%Z#tgc#i%> zXo9dmTqdjr`FWQNPXSyVb6ZMdJM10%{;8S>^JLYRSiZ)W(u`NaE5d(yBO+f8FAu)X zST5KoF{-O@NwBO{t;|FVe=9#KC9k%JYO3Q;)1oUR*V|ZI4B=R~qzL|o%MKTKo<wkI z48NjU$6aFTh{ZH8yt~{H9aXS=5&3b^8yh4J^DYIq9ju{_H<`E!?VRKrGWr`d*6pie zNi3XVWP6a26kHX4rkV>uH}{K&B|h^$NE1{Q!``4}<SAUTsoXu@HQsyp66mObZ=8`G zkiI523d>H*47b*G9aHq)HS&?%8D0l0qk%sYCe+(eE)j1WzSdUwM#l-8k2k0ca3{FL zaF0Ne@RBkUK*sAm8Y&1LSs|6Mj{7CiI}zjtRh_YPVJ3h)pk)m6soQr|NQN{ylY&Xf zoDIQ28O)PVHA9t=jLE`OAlrNbujJM{@iJyU(vAilQLXMml|a_XMVU4QK_j`QmY%4P zmY@X)O8PARbcoINsDtkt4^T_43chYwilMKm@PXdu^u5m8fu$PK_^7%ArzUs2kzG~m zI#U|Cu{tIJCqvcRw0f#7@J*$(2ZC>f^%Yw3x?`TE+EcX`(?GR1uLI%#nwHqK>2R|` z=HP{MHiT<tnY0wV&ZIK873RFWr?&i#w?5)2)G)G<-o_CV7J~Em(jiD~g$Jhffb(B) zMOCKY4b}8a2Br^v8F_tqvBS2YJC-dp_tZOs+;IqMIY}nqR~{;Zi>C^`V7ZQ`!X~u5 z?YsY3M`qxacI!uddFq>j^fT=jkV@LBsqPO=uo~4-a}&wUrn!x2<AFc3(fyD<cpGkj zLUO7~>A1#A2baa%33_`e^fzrURaq4tf@I@mXIeYw0FbSg&LQ`c`{m^Iqkf?3o5H*b zxp=vmnU2#*?hT|PEtsA+OW`Kw*}Oc!#k^5r!t)CES!OED*O?p4aZ9J7^h4Era4GEZ zz>Ko=HFLiKa{WvzCwI%B3FhY4F%8uqng_xShkNW+gMkMt+}2S5c!;o(LOwHMQ4mwx zbSwoy3Nd$dd@Fa-lNFYGWaI`HDk6L=tY%OHxeUU6mT7};yN#MtpHZO&?|aou!j{6K zSlSr$5gE&vov6Mu_YYwL51O0YRywxvifJov?jVB>8dO|voZh#1C73y$qN9%1dY_nk z*R(dmw?Y0zpA*$txD?^sV7w<wNkK_+hei$?-XO@NkXmlC)7?WgOtk?8dzj(Ex#muV zJ4sM3Guj$?&7gN^E@}8YxE`)M!?Y_1Zg{-5m@|{x5J5X(civ67miXq8yA#zug^9pJ z6iQ*930Io;4wFSSJ8&7{D>Ft=nnCY>3S|{K3V#Jog`k{VC#up|W+tWgY5AT>4Km*f z`&ECC%V@!;2u7kWkDvlmkvWCF0G9Vv+v}+7krOHWfaN=0JGXjIbrETk@a5pWhJFL} zSG9fQ6-ry$|LsQ9Y)Uh#E}*KCkuimpc|W3Gs4&X#tH7PLWkp}xGLw0;c(a+sM*a*^ z1wm=TN9(OB%&A(9_nWpfaKF<x#LHAy$W7WcgT`p<V59ZgYN&P;Hd0-}{DNQ#s!j@L z<(}aCi5Cr3Qp_7&s3w9mM0SasGt31GeVvVkAKJ1La5Cm~H%Q@NACS=*ef!8y0B{%K z@8)g?eovvRTrD$(%H1-25rR2J)>g<!MkzO)s`qCiqcds4TyUJ0JlfvX5ruE7@RqQH z83PQzYr%K%)nV=<9Rqg&^CEl1hnsALv@Y}lWC=)T(#G0oF<f(nj+i?!OGCLq9x~Dz zd5QYEW>m*APFps@?`X@$ls0mj+&#=Ej9hBakJQ)D)=F4jbv%Lz%x(1j5oFi<2UE|W z`plog9Xh7-8pw6S*O1qUxs5b0^97NO<tAco!aGRSafhw#5PxCG0yo#(nh{l@(x8}C zo9g&UM=YONGhuV41#`%;Tk^`1JJ^EVY3b}>M|GT5$g41kf@nH&82P1<ljX95{3~pQ zYNEDd)TiY2Q2kp+Yt<<_dYI8h*p}%+bB+iL`gU^dBLy<j+A;~MyC5@A{e+;7eQW7` z54Z!<k(p}7Ot=m<AFTHwTqo5#+TOF#P@3lnJ1cY*c8PcqWB5M=y-7io+-uhAX?Q@( zFwfXcp`$@jI_~0ook_0xj*iC^OrvT<$QMlVGM`{R!>mL<m!SFD{?n0!mb$|3=+9B# zgBM-(BOUAI+WQWcpr4MuC&*3V5<dacsOlxR0eG9<fkr-v6znl0ax3PHjXEjhbh>9u zZ@mxTUJ>-V>io!BJpbw}st-tCrXIQVnOXR{xyF6q*}`bN8Mge5=3G|T$h0N5AA<hO zbj&lDrB;Yb?mMJafop)iGcBi>J0U@^%{gxgTce+hekQL5GXQBBz0Xk%6n>0v5bpyg znPt@{yxumNE&PY+ZiRdbJ$Qq4ys5Ae^G+M}RM?4m2HY~Hs%h<*=?eEEnj;5e#)8bj z($M-fg+nkev+q#eFs2vgO_bISA1}CV%RcngMfyZ<x{x{8r!W`aaBYvg^dW=RI7tN} zhXNmEen!wZ%mq)ijnFZYd7r83bf4($3wMXK&+#q5@{8OYYsFAlPHqNT-mu_txn=G$ z3RNH8a=C}vDkAs@xVN>U3+MPOMgxzDbSPxfmfy(lsqd%v1JxC#^|eA@xVxBhS^8U~ z{p41Hj0IlB>o2!}w0pq!nRz<KfsALqFesO$3-J1zmK$U>f&mE9Blw=&#D?cleFQg9 z^^o2Ps2W8+DY<u14c9SIVLp8Wbc_di)BWygTgglUd5-j<%_j?|FjJYOz`qjygW+Ag zObaZ74cchXLW4R)_z-k+wY>QHm^%&2bY_i>hG_d4!Dq}uyLCl6*Hg@6CK)*e^DYDv zkj_BxGh9B*Wq1iyCj+0OAf4PmTON~Jqb&{Lw}b`p4K;iwsyM>WwG9Osq-~e*K0&iU z2FuMSXtr<;v)B!OvFfL${mXkn&@jw%K^EvpW#oCxWpzA8RVi|N$N7)&V+v0chU<Mp zp#{EGym_eRGanMP5b1}^FXo=KTYEE7^S(FeL+aN$abNW1Oxs~bT&s>lI>Mj@NOuEg zHEp5rG03m9Bt$h5!G#E^>LPQWs+N&UZ)63KMWhurXc1g)e2aNYn59fP3O+_Z-<duE zNvh*h1Vd1zpk*0wN?zIsAMd4(#b&ItR##LjC}=1*j`x&Vt~Zx!tl%w(w9&j$_-14f z^+TCMM!o|1kCr8<5`jD+a+QwN%o^r59c|5xLD28Q=fbjHVTHDlZd#AGR>yhXL)CS{ zC1fNv@_o3ERTI%%$Fxy$9psk6y)O5Ww)M<t)#|Dfm{b%*VV;L?1IR|^532rTJ{HDy zh)p^+2{$uan5|4V1Rpu)dS(yOJj@aw$OgHM%)c)5z2jtHmPPb=nXW``M*lHfTi!Oz z+d~r+^jGwmX1s%Mhr;_HCG>VzXoPR4LUenyc8!d3jhXkfZ8Bqk=h?10#v!^8`BHV5 zRj+!5{~{vcMyN(pxUR4Z{UqR-2)0D7LGE&U42RndvWHo$H@aLQbEi`JD{mp@ysEPZ z&&T_V<`q~rhkQW|`|icEkC|xre%?~cyrJzP1&NVXB;&B$0gz(C{$?z+$3eM6%qPsJ z%nw-3({eacFua_ON_szVmzA`nj!3gYHLw53j7zlqEw>6}HS<h(1l3r*M|sDXHLAyX zCzv=`*2<00QJ8{t!WhDymZ@aqN#IjV4<nZuxzfH-I!1z=RxPJ`hW8m0%O1<@c2+o! zmaf3(gqIN1u;AyyFPM)EZ=xfP8RzA;c+d;H@d!51d{Nj2!34QW!Y`R46y!If0P~MM zVxh{dZL4Wp@l7RsqTcmJ?m$&UZWmk>;W71IMtVWvE8cAMGq6-ZdYE@q?hjsm@B1~} z6=u5+bCMa4K|WNys*n!fHXUCOxzq67<}Nh%8<3Y?e{%#!?jpS#D7~h-Md3Q{qBp9K z>WLYP;p(bx*EZSkjoN-QV-(V*%oK%Ta<zy&!TU8N2tM+mw?z6BUrmB;7<7qOUTzm~ z0fRoqJli4WV%ZE**+v=VM!H`?xbpa>8o5OHExt{9FH*YPbC=hVoM~X0??5(#{D7|; z-23=;SnH;0O?y0-yCr-I^28DUQrH>df-9DprclV-Md*7n(`dP^Z4`o@)_UKdJCPjk zN2+3}7S?-LVY;>-RcG+F&=(tIjs<7REd}mqg?l=_Hth!oYsQ-ZcVD3-$d?Yb6-y@5 zPQrb!+8AzIWPRaOy|W_2g|$^@3ya$AC%N=ic);5#7n8`}<N~=b5G;}VJ<J7L-Q_34 zrvvYD(>V6X4ws9xLCiJbZq=Md{*3B9C*Gp>5A=Ife^K~T_!l!8Ra|Ba^9z=TAj5fc z2;XkEM{<vuC(K-hUwKcN9U#B)in!@c;b<$I@U8u>@B#Xt<kC9bJOtZpG@rMZv_Ig! zr+ycLKZOfa+hF-i_@mw?SoSi1%Pj=ihv1azV%OL&e4uSNs&l*#;SMN_r6s0MuLy8c zR4?S>5!BTC_C^(@kc^=23e6N2VR>fmKGh12SWI<4+zj4gkfIK;$MAoE9{?{=crILl zYN_y&ju&#bz1DW&OW|1W_79QcNPEe=Qus-4tdK7_>)WWVZ5gTsmiZUtpe_I7MGJo` zIx0F7gNey32d+$RtVrlMHL&#Oy+OfV!uK)D>~Tjmv$^}_HtRh~+6q*IdE@mCceQA$ zqnHCsY%_K%9HOeAL-caBe5!F&<1+D>OLFmf0o(!84l)Vk4)I>&y^b#-FA)>Zaf(q| z5%Wr_5-Y6Y)w5A?)!%rleAzR3OU*bXT(0^FeeqGP)|Ldp2(R#$-G;#>l}pC#R`?_$ zO~;#re=01FdAwY5xCy*0PPf~cR)$_M)VqDD<CSU?R4IVhnESUC&XabG_bF8q;YPvz zqU~SdCC`0W^|<FriC~Pj6_!aQOwHtXt2Df|=>OCEDXLKjekV7D-FEPPMzD(9-^q<` zT3Wqds;)zjRW%2K*A*t=o6OWCqY};O6z+y$FvO}KX<N@ErsXx@)mUPi7R?Gh(7#3a zYAlCc@(nEMnUxA@jGP7c8!v-GGb<bc&S36jdz1i<j`SDwJ9X62krAY)Fr(f~%tg~O z^O}MrByA2{7P<WhVxUT-@Q2>AI^H&8id<H>Y)nbHZaOL>cwoUbOk%j~An_68;3bj! zQ+NdZZhJIy@tmqjRo~=QK{c1jC9KMesUx>=gPRVq^aXRfBZ#HC%Dctp{qEv<fb%j( z-Rd}&Z|qxH?=iWJsPci#!Lor#r}rbcqo|VbYRTn?E5H<FO4<CF6$%M!@;=5FM_XaJ z5!#-adrWRFdjEAx)F!yi%+JCqgy(VMBHDJj&<sC*$(&>hTwDalnd%BdfHPq}As3G+ zO2Jm(6ABwm+a@fEG&!o1aHp8k)c2w9xI?@nOz18@GU=Fqu>66g7=q$Ve7(z@{Vm}f zxVqtmg1bKX1ga$z-eyi<F3CH|E5%!D-*4TtwD7c!6K0&I<y1tA!fZE4L348*W#q~- z=@rsYP%c8CqdczyQ;}I^nP0Shin)yNp^jf&Z3@%dZp-C5gWQu#Y1(B^aoLQom=8c! zFqJUBMs8)^RN!o8OyjLKqbxIBSOsK>EuR}yRoDW!3aafMWd__MVM~SV%x)vkm{Cnf zIeaMzdJOl63w=p$HKb2z{tS4JLFIv~Yx_Y*1z{_swYB{XvPj{aCp+V6Yd~t~NQ*up zs#K~w=u1W4c)d|_HQ`pmJw&=zZyaGQh1yJOg?D*%m_+za5ZMjECZBD63$D{!k*Nz; zkNJ+i#q`w|{sp&_jL#@-Aor1uhP+11Po(A2aUFANa(C&d1owqAHHJ&0(1iEG)td5} zF=sKKW10(R!kwl09MdAq1&e&tpM!KXqa|Di8&yZO+qAZ1e5jhu$U;ui3NA60*1SD% zy(mp!t&1REAU)3{folVol(#oRD(ntd*)qSnUpu+>%ti|4QShGdXVsI!RXRGz?ZYz5 zMh8_dL{`wYUm>l+6X1&quM3kI-cfHG&sfFWPQpyuQu|BG=OA;ekes(i;Q+qQa0es8 z^_FmmG&<rjUwhij^sSG)jNYoeIB+S1T@d7Vp-Tj%)s{s^O4Tprx`K?Qxvz_tM!L?l zL*|}``-IobQ_PQy<i*u-nl~4H6qatx9y2auzMwaQwYn?xV7^kgPT%`XPq}I|w==Sr zaH#eB5INiZP6~S~l%;QPq$<3KzAx`JGd?D5BSHP-zBZ^m(who%P<?8T{;C6*tY!@4 zjqsLNbd*D%3iC6$xWYjohxM+a;Cl;R1-=B=31prd{HZz^cnC9;Iil?-vs(2weZv%n zGv(c21n)~!2i$a|a6V}Vg>wnN1((Az{i#ZAWCKed!(71d<GgpxD93DY({G4;A73T} zCqUlAGD_~6YI)$Z2u>OK94?a?zcD9uJkl`@<hqU<%w=*%M})h^7~V!BKj6JZS`B<( z!Htz0$1IQ=&zrzZWF|2k%=i}bcgzH;4jMUG^&{2wOc9%>bCO-Ecb&5*vrnNsGeyT# z=40U@N4$x2np_>sZy?x!Z-?H_a7iKsW;$F8>+iA04B<>>7Bicf!<@EED>ACve6Cza zq_<4_+U7MuZVNAwF%RTd-q)Dt3l}g8na6tX0N2v?q1;{JB3?GRd&2w7DIfJhxhn>J ziF7gC5@sn=%UY+HWy0mm3Z{$PO5Q5wdwgBxuA(aIB&!t)xW+efr+f!%<km7jfUM(v z?0ZQKlH0+0g=+-^B7cvrnnoeLW3P{ZovF9YuP`-)Pb~ena05sN;J((nruQq??H9QQ zvoXRFn&6@tn}nO0J_vrW$7P4uB6mi|F#0kgO^a`<LSw7WldDO=Ho1vbEv&be+yHa8 zE9_u)GFwpn72<+Rk>POHk>1Bw(@9P{)9Z4z4gUn+e1py??835}*~9D&O`Y5^Z)C30 zxKg90Z5uVOSEEve+HEV>XxOMhjf#yM)u>yiZG#Ho|J+FWe~1bdYgcL8uttk2H`4xZ zrc(6^4ca!U+qP<hD)rmeZBV&NgN@Pp#SWE3%=5AZ2lVVyuuoK<{87F74`|<`NB)j| zhxQs$xN}#@$e(Qob?VizcfW!iy0-7vvD1Kpod$LoFt~HSPJIjX8G0k$J3V`M9N42% S*?i%`{lgC~TCA9{V*U?=I>TuI diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-37.pyc deleted file mode 100644 index b2dd35d9bc94c314d0731d09bbb704e8c650b2fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1084 zcmah|O>Yx15ViL!+mf_Z1*k||;6x<as1iqnO4Eu9DM%@*v=Xx1wcD=b-K4gclBl;- z>fb2h#P8weD<}Q}CuY12q!(~x`|Zr`e7rZ=?R1t2tm^B=$L|RtKk#9`A^<zE%^n<r z2&za)GfEK$Dk#G&^f**e8E3J_kxI%|)}rJM5wS?Fh)5)zg;^?EL()xuQV7+h?%|+T zw%DCm*+1iYDD8VaI+hwd>-~`^s?(w6Rt|W6R#XzKkM=+G50CZ=V|8&{+hSC`uDF_* z!hmzdJK1o+2JiOv-{z3w&kApmc>zF@j0%zk*W`o>DuSyt3uPoi5nYiP&0@g5X28ic ziAaVux7<A+zo{_C25{kx!Eu}Ca9CpLC7A^`!547a&_*+OX0c6X1n$-)xk=F@2n3}E z-6a>BdMvdD+KEdUE2_dWrZJ$7(YBO(DwruXO5q-eh5i{w0;W>CSW6=<@DLfPPT*c* zELYqZ#=enXJ3U*Dd*fofSyaYyr8dR+r24#la)w5~*(X_vk?!Rng^;!<>)c+9y&zlT ziB2K+Q`iOpp(}KmrgVCLft0Oz@psrkhWhv&7B47t9UM#(_-ym=NUwmcOLZGAkDFr^ z9$g#jfR0$jOZf~eCV+zk(~ZTHi!c2*txFDhalxy9rA-yDPHTQDQOtSDJ6+CS=%y$a zR>zoIW~>~ES|M&Tc3yMUcsy?|1s*|UJJD+pR<Fb1I=A}dQYjD|shAhmL5wW;sdxgw z;CQ68owOrw!@*fCk8j&=RMJS0TW`h%M7FYQ{yBb_+?p45VRo8vN+61X*}_@#q5oFW VAg@OHvT5(tV=M+opiTWR_zm!e1h)VH diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-37.pyc deleted file mode 100644 index fe14c45cee27c7d051ca607496c8f3e70c45ea94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19063 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 NubAQ_h?gM#{{en_bz%Sj diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-37.pyc deleted file mode 100644 index 6cb426dfe5ffe3c944be9fd411b31f5ca6df0e8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1092 zcmah|O>Yx15ViL!+i262q9Q<C;6x<asD&d!v<d2k6r|i%Le^&OCM$V2sqG+A^_EKg z8%3P>OTKdAFK}YUn?QO2uWUch?9Pnen>}f@ngmAm?cpaI5%L2M>k$BW3sd)D;e=C3 zN}5uN*ppuAr@q6!49YMK9S&qvHqr(qr-X+*x+Xjlbm^xtZwyH%{z)NJhuQ~&xirPe z!ie4^Q$t}ss_955@a*=cyr{-QlNm9{@<~w%us%LLIeK|`)GxGA#b|DdX?0v>a-j<i z-gfO}!vPz7=)ZfPLy|wkUm^VpfFLR5B=v5{Ipvgl*Kz8LfcreSCQF)zfL+yqqZ<;C z6svC7q)t#5nd2RB;EvI8>KCvWV(1lFdbi$Ja2nqPOE|O8L`wpD<BHtI=-~vS(zDK% z4fT8`lmh07jTtMd!Z4;VpbF8pl{+?=E)}X__xJ__EJF$|g|eX%S{Ps=&_bTWzQtHB zGp!l>PJSJCO*!k%irIcqX_HC0&o36$m&5Z38r@`{Ma8G8n}Zr$nC^IlbkCe92eXBW zA^9_y8Udl(v`J%nxwlEn!MglA{2)g?{1D6M6z=Vv*{J?bZG){tRRWvC_0oo;O|TNU z6RWaPJO_*RU?JY+qdPe_-}-;vMi1Lbi+?4KWmb*n*;t^U>!f!tx_+Y*qh?qjW46gy zIpuSSIAQE!p2^zdxU(^E2}+xVx(9L9eOPR3B~mV=1l5s^b!9EYNQ7&RrvNneNKBI` z37iePr(KR#1k_3?<jC&UJp)P`QPzKu>nOY9)ZJ*Hx~C$DqM^aC;aupymDI=y62Gpm P_vQ%}gKdyd_jtbn;>-g+ diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-37.pyc deleted file mode 100644 index e224f490c9b471bc2addf9aa0d93659803d186fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2926 zcmZuz%WoS+7@yf!)|<7PXY(Yq<!NXV6_GwfRY(&zwP>6wPN}p~HF7*_$BDCcW}UV% zu7uP`<;WTJkO(eZdZ-Y80e{8Z5T}56NIVX`!1vACPV9D9^P6v;`<w4Idp#a^2t2_z zqxTXQ3Hcctt;Yc26DZ+%08Th9lWpozin3PLwslXZWQlN{8~cPCK7Fiv1~;=LX&q5m zlB6=eu#pp4zjj+x)_nmTE=r}Kn62e%ejX;ZAH6As2O#*wqnvmer=HF=*j4vTZg>_q zy&i6PHt+Fb-1ZzE^Ln}CxxCklbJt7oxOa*tyuK%-K=~=&w{Ls>yq^#36K{YI@*$`P z`7l2X^$;K7qfig?F+L9UX@7)I@X3Ahn0liizs9GOJO=XX{EU*vpAdt16L7+_(!J@g z3;#iMvZG&s^wF;fzajjN@CU-52!A2`jqne`zX&Ek@$;c)OFz~3Kdw9J?8@}z%X3$z zFW21%rGQr+gwq#3n48O^Ch@@<b%Z6n22dk4+8~d$1MLt7IcX54D>M|E3N3{_3hf3t zh(&YZ1T>R$q#5p3eId}&(q^m_lxmF0F;*xAxiZUx@mRT1EajmQ<}1RNqbG;%m%`ol zh{>wLzb{?3?iXNY)H>B(UR53-6Rf$Y**1kA`ZaJ2BlOD!sAG)f%egRQ>^t&eezvw< zovoIt)1@G+<;vx0zOxrRyinM{PF2`_ACx6#kt_FWvm44P(e5+VJ<$(G`x;f&2S8|o zS|{H6@JS=iv=q>xa}Aa);0BWb95l`%q+A18QwVwojp~^rm_lCAGf6`XfFuSHh7g7U zl2nYLJkbW+Qj7w83njDx2(mLQS|8|OrnHoAg$UMdT6nI8qSZh`5H^u<HE|k7#0WrA zS09$~rY$3%m2PB;sMW<v_Jdj2c7^+8up|a=_zZRm(NmCPeX4`sOOx}+4<D>8C~XxY z*G+KNO{{_OrVhm@np;-H+mx{z>CF5s_UZhMmbjc+Zi$&Y8EHooZl`2#B&}uV7t={C zIwj3_pT#bPk=s58BF!TtXqWL@b2^w~kSgYAq?ef&jTUP|I+>N#<tFWxjJ#Vi5|1_K z+)g#gig#e&Zn`c|2`WKE`G+>;UWeAlI<$UrUYj;L2U<zd{vHHSFJy{MZA%jaSZAT< zKyT1P`iMUKszDdYy)PeW4al`Hql(4=Nf%FHmI*EEkczbiY`NLPwM$@6*0Y0SkWJJW z$S@Xbj>UrW%^kFk9iFQF)vhOJ;~wC&hH_nN=iFUn>Zn)}Q@~xQd!!fg6y6sC&nB(R z${Jfv$>Bn&41H{)RNP?edo`a`g7Th<H1RI3Re`7Ca2lH!j54;ET1zdgr87&dps>}_ zuqLFQ-xb}qFbclUe}t9c82~cjYL@0`4z)E$ceOt1>V3LHhqMH>sbkdpJM4pN+qnd} zV^MZ_2m+j4g~2F!M3rl4Tc((VUL7o?f}@vgQ89!1M4N4z2i76hJy^pkuo<-MEkmqA zjjL1}RuRFW2Uk(BB@v?8QnQj;rU;)`Pcn9#sN~3UI>VxXTDUpC$`;evwfW3KN)Fyy zSxPT}Z{JK^UrpU*nR!tEz-Q^~oz6a$ab%(hnIm5b3MK9bd0%B9Ie>dFuPml+wYO~> zKwUQB?z*&9z5%J*3NB`M%rQZ3+y4)kt7J?JmpYJ(Tx#hyU{f}1$e>-3a&mp!BIsLK zltnOPI0etsGSZ5ys93x@X-m7D3yQnBqCXBhgeuu-T?wT%qvLz+w2dALR)I8F(>8U8 zymM%y;}-U22_XJY!Ch@d>3jy3sW1?;C}DON7XV&OQ{eO|WT@^IJ)!QuuDeBrR&o;W ze^f8r{|>{<zgtGxWo!p7`DjF(!|x>#-avQ{;Z2115#B<;pGEODfOMPLPGx5?hy7O& zE+Je*z{^?Pf8s1kDr!}%eh5uz!^H!CC$&9s6-V)(M;%DUoBs%Tzg%YQ*jYdc<2XrO zt7y<KpoFLcTQlfOuW6VD_G_+VJGKFD!v4sea1Hf8lu4R0-t?R31{7#KY5KwLb{N?J Yzj6HeNWzax`)Z`XYuHjZj!WJA|8|&~&Hw-a diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-37.pyc deleted file mode 100644 index 8de8c0825113fd9d7d95789c3a910fa2cc6cb9d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22091 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 O&*OJvQL$sij`crHeaf={ diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-37.pyc deleted file mode 100644 index 29d9e9a7e941378af9b09bf53595552bd1fb1249..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37970 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 Wd~^PR@~!-_!TssKdiR;TANe1&`ajhG diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-37.pyc deleted file mode 100644 index b28db55809f60d73435a8a4cb62461760c1f5daa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23584 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 DKNPLz diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langcyrillicmodel.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langcyrillicmodel.cpython-37.pyc deleted file mode 100644 index 8c7cb00176e0801cf2f345d5131d9e6d6d3d37a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29040 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-37.pyc deleted file mode 100644 index b2b64edd08f4f6b3af1fe9c23fae9b309a1ddf4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23542 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 E2bts!DF6Tf diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-37.pyc deleted file mode 100644 index b5b88a7f9d78fafb173df422964c4e4a98def2d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22171 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-37.pyc deleted file mode 100644 index 019f1edf1f24206303a1a7622afeaf55ea627918..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23573 zcmdU%ca&Xa6~!lE5<*jYReDLp5D0{#NLN6rf}*21j+sX?GMNlF6ChZy_g+y^dhb=S zV((p1BUWtBg1y(bH;|v~_1(*xVOS)%*z26L_u1b$=e;-l=RxbNvu01{pOFhTJ#p9F zdV20qa?d}jcY*^t|1R011A{$%J%dyFrVLK)o7(DWO&wfquy=6U;Pk=O&z|15T5HPP zl^J(edI#4yu4mSoGkd1=^tAum>90CL*U<jYy~R`SosP$<i+9`qmi=mz2JL^zs&_na z-;cK+*70l46znOOE!bKxSJ3(FdfGb*b`s1JY%iE4*jBKeV2)rH!J&ek1=|RA5bPt^ zRd9gd5W!voeFK^=)YfOzUSF`eU_F68sP-0uwFMgr)(~tg(D$o7U9gTo2W!s|Y$7;V zpf6{8nm`w7ZzR}2aG+p6!McLAI#4@b`y5Hm6`UtHUvPooLcv9Xiv^bmE)`rRxLk0B z;7Y+&f~y7B2(A@eC%9g4gWyKNO@f;R?-jgHaEsvmf)5BjDEN@z!-9_pZWVk~@G-&1 z1)mUnQgDReQ-V(mJ|p<7;B$h{3%(%uqTm?8mjquHd`0k8!Pf*|7koqTO~Gw~ZwbCF z_>N$?;Jbp`1>Y0wE_j0A`+}ndKM?#-@FT&G1&<WmA^3^lr-H`_ekS<2;1`0n;Fp3& z34SFwNbqREuLZvm+$q>s@L0kAg5L^$C-}YKiGqg+9xwQV;BkUu1%DJACis)!p@QQC zM+uG>Y$-TW@Fc;X1%DCzRj`@haKR%4n+pCW_`BdAf~^F53mz``X9w>31E8<1{|I*R zcPJ%O<uYXjL<%uEktVJE2~B{|&v~-{2v*Z%I$fYY9@PxN8iF+iYYEmCtRv7jqSD7* ztt(hhu)bge!G?l!1^Q!DZ6eS|Tj}GjHWzFm(BIukpK7IV$$cC`--Bvv!8U?z1=|U> z7wjO|QLvL>reKyp->Yh8fqp&JY{4#qIf7jUy9wqBb{Fg+m?zj%u$MsJzxw&~v#Rtv zs`P8D_7mvGR2?8VP@tb*b+F(Nfqrk5en-`z0{w(4{R}Go%Bmv-`ps1O9aTpQo+mg) z@D_o7ewF@YRQiQh`q5STy;b^^RZkY2Ab5)4se(Si(*#c!oG5sPpkHu_U_kIJ!F<7> zpd~m-ut2a-@EpOj1t$xJ1&ahDg2jSS!6|}DutYE>SSmPGaGKzB!7{-af(r!C6}(6A ze8HK57YJS`c#+`6f|m$hDtMXT<$_lTUMYB$;MIcH2wp3Ao#6F?HwfM+c$47Gf_Dqv zDtMdV?Siue7YW`ec&6ZN!A6322+k2)B{)xTzTi^9PzT!nC@xldp;CV+mnpqmaE0JX z!Mg-k3$77dE4WT@z2FAHje?s5Hw$_Nt94*z&$=DwPH^|Pc<!V`+f9ng{h4K}@l0TG zba({=Y(%i06t;Hoc%!5X(~yJ#L!!Gyn?pEqZKVS*<EcEoQ;*9s5ykq!vUIbKHac8m zAP7e*-RV3Kqp{JrBDO3Y%xtY+ur}a+oYT?x?>E7=c!+_5h_rUg*aKZ0EK+nO1B>a1 z$fMC_HpcBDonTuy^9>8aDQxT;DGLU{mO<E=Hb<nv;$n$M3%}Cz%{8o=b<HdnYSzWL zU8Hf6+77N3l3K!(!a9oSy;k#Xel6O@pEkdNU+mUx${vnr^U~Cu#z{)7Yn}=#YK+@O zG{LrT?$*WQ#+Ix=WIql8;Rx1IuukI*>kymu3J{KBt^1Qsq90bJRZF#4zgA-B66+c+ zC0*Q)o8F(RO|X{>l?-5OSDhf?rK2}$k#bm1O6sUIeRFMc&fe_O?fq(3jV+xT_+Gge zfJG8D?q{NTh1w%dur2(!P!N%N(q`~LA)!Wuq*R0TXh<9xJQ^vrn7KKfU|X0@@P0A9 zmyYiXk{}R6IC6*Ch{9@e?&l}t8skqrS{H4lrCke%L)5aI4hd&+%_&<_^SCBpyIA2t zm3Vq)X6cA5@#aB<ftM*sOklv$an4oebhWFpzIS736V!<4uxT6{gXnOIm=mMp&fP|n z^8t8*E}mrbQp9e-#^$hW?#Kj@Q=8J^l%)|n>SBeEOt39n7$}HH*@N9YK|o2z=CDzV z)TXXE;z`#$TD%+Mc9Ghk3th8>ftqz}?kE<F^<&>=mP1&FGilU3X|y#@Ut(=vBF0tg z)+O%eHWnmBhjWSb`koZlHEwUV_DpWG7^??l^JY`FY}PR;gL5k)vmAmb3~)i>2m_~{ zikc%Pbs9C;2R~voE=1%71I)S&f-ULwZceSEBWiTu;$GS;8UL;9H~zNh=+=cjSda@* zE9uxAmYSnlD+mt8{h}7THK*NfJ~=M&8i$C8*C4#5Q&>k3W_g2~(%~8sh*ctD!C0Cz z)k@r9h#Sxwl1MqW38z@C5;v_~bzE1AyTlD_Wl0cDA-G@ECi|OM`^nT2wG((!j#ygI zH6)H$HP~7MKV)#PT@XV!f~Xz5mT+$^+bz+p3wzkvZLHvk-C${hWi$-j5fB})7!dI! zkqvkwBKPt}h;iXv45-<~DYH<6pu>@^d>kUD^fC}fgmuI~h>`GkZOz0g0kMov!u>b| z%fJ%BI^sjI1Qvo?=?&PGJ@SIA#rMSotoN|aHS1t8Ku3*;4(`H})K;B{jo6Zn9GT!Q zoQ_MzzO;oYX_!KUm5CULls0rWC{2L4nYE66X=5~M+yK*(j+xE6jW_7!aadj})#wNp z6TFKHL_{HpwAQ}#9g5ya*~6wbh?7_XAh8vM)7TQ0$P&`hK(z~oIMQhI8%QEGL9MwL zmx#iE<3Kn9{E&efk?p&XL<h^5z#hW2n4Z^4MAT{xLPr{7KoEIcr#_uKq74bVA$AQ3 z1~v^g-o+2Gqi~^yK`C-uiJ(^dq$TVT9i;IF9n9>=1S}~!OoJ^EScSb)chtI=MTdP5 zC5dZ6L>ew(-<+}*F8*?{3=&6t_1u9D1D=E>VtUs~VkAT*9R@_`i0r}yCP*EXBpB32 zyc<_za7U!POAQGuQ^n&v8GE3!Us#zfJsEB2;vsak5%!iaL8+s}^5ueM3`g9mv?Xjz zfS=!J9w_#(m>L7&QmVlcv4U$%MH*t#QpCHSZ(R4|aU!;4AXrC8oH7+UB)CM4Hi(GA zzS)Xioau-fDR0Er!hQgUr5BbOevV2K#Ez_^jT$;6D{;iCj%p`GSCYVT2y~^BxE4=3 zMU14DKth|}B_(QhLFWjUQX4E{YVL@yo>_xg#9<HwQw8Ca8fio}V1-h|8;phyme<fx z3tfy+o7#$7)#|WkG{mruAc$&b4oO(?S`eg2Yz0AN0v$v|7!ZZTX|Q%S1c4X{I*Sc_ z0Cd1IL2V657(lp}v^nyS%@VUEU1>;*nSclb*GRE1)nYWB#5ta<?WiTN@&qM_UQ0@Q zgszK}$1QdWP;=yW{T)Jrfg`35Nf&Hbl~P=S^}DtEMw?R%YI{RMT8enQ#Bvu$mH^zD zS!#8B6c`X;<yuVT8gC$>M#lpjv0&{(%x8%^Xfun%5t3S+t>}%2S@1&wiwiaDNJ~+z zB;JTLUaNIMS8G5ok#7~fF?|>3#DLxygR~Se1`$?7%t8cPyA~2hr3t8oBnFB%qK$_j z=m_VMgjz|=ESS0m!30FX(u>4V=t?zuiNeKcuncLU1h|w~Mk}$dSpr*nG9;x186zS) zQ>#sxASBT{em17}e~xWxE3>=-QF_QVfHrEhQNuJM9;Xdc*l0sS#A_w1(BVg0)Jl&d zCW<zQQiPZYU8!c)v!J8qj&8wi-HNTNy+N%DZ$xj&&ow$iVj`gQE(RfPCQ9O!sm7}8 zL5+x+sd0PQaOr}uA8n-$9^&!ZD6DFA@h-ZUAX3^)c(jrPzvzI7Hc}*x;*FA@dxNO; z3wu%?qDI6UUDSBIIkFWJoFhWQm%+6#h+2uoD#SsM#w?NI!fO%LrqPRz$D5<*a0--q z>EPoo=}NWnci4r2BH|4QIwB%1iKB+|xFWkWckobr6Pw%a56hFxM`ULtq(q3(HP^Zw zmm7q0bBcZFf+(e342}eYl{1P-;~K$wg^-li>OxX#tF47!q%jp~M5H!wT3dr{j24`A z`^@WaJNC}~k3VD0!;d>=_TGEX+h_LNzBLY8I<jD(8X6dxHGTPd^A`?O{bP&!7gvL= zs(;bI=<@YOtJeJ1U~6Q4tCNpaL#Hp_cx>6|(ENen{?WxthQ@|YZS_|JV?&FVZ*X#} zHQL`ASui}bWMThsYiz7lEni!fOIl<7BLj<C%V!J^j4W6>u%LCu+NTYT3@$!x$?V<c z&fE3qS=0KqJhEdlGPi%lJO_6gk6(O@COK+gv~SB!gS2)0`YVVdJ8vAdc(66xx8Yr$ zE10{g8=VkNE??GD-KzgrJ;6T?oiny*bk69|=<K19C1V4_!?OoZSvGR|ZYM2N(f{_J z+UhJ&&Cz~?t+6@UY~ek(T%_lB8C|w~#=f0!>2Pa5eUMAG>_G1Zy_@x(+0#39%02&^ I@qh9E0K&E(!vFvP diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-37.pyc deleted file mode 100644 index 3bf4eb5d8cb5dd44125f50be738f5503a5f6a033..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22150 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 Te^+wmf|>VqW;Snn;J<$ZY&p92 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-37.pyc deleted file mode 100644 index d48c91bc1ee648f38d14b437e6abc971590dfa36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22173 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-37.pyc deleted file mode 100644 index 048ab24b490f07531f84b5ceeaadfa493d156c65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2883 zcmc&$&2Jk;6rY*>@OraO+>)j#EngQ@Bc)L#5JjqJg8PNkCIP1)tx^WpGj^P=*Us!1 z8sl6@q#of<XvK*Oe*}NV+z<zpKY&Y5yf>T1c4z|?2X-{iZ{B+|^XB(Hl21ydkieJz zG=KluEFr(+;^?D<EWslCiV-4+pb6>Fm{R0f!a7du0Pn=EaAQx9*cV=05PlqhtSAa` zD1vxO6yr#QaY_3B`zXj)ALCvJ^3})qeh(0cCQt}r6-v)e)E*yb9f3Xqi{rXiT^HqO zgmB(ym2;Cae@u^>P)?1F2s|2JBR?tg$MmR)exywjPm8H|<`xl=DD4wbl623B%VN4l zDl-R=Y@|X>sk&KLHL2HB_kmO(h>&Zit(vZDdEkQ80ZeiLIY|y2BpwnUNdZX!q_U(? z`mYIYR3{UA-pM9b`yxAho3dndz)S7$CAqQXUSu~qWyFo_Mi-6l9m!6%J36lcUL1W0 zGk)0}Ad<uss+~P1O)98h`$6moN4WbWcBLmg;qQ|@8vDQ(L}2-XD2fpDftV5z{1zV* zm&75&y=0<0b=^)c=kac!pZMV~-ikAO7l<aB4#^&S!k&UskRjoYrS6bC@p2iQM^`Go z@v?qTDiy&t6L8*6+nRGz=1D!%yaD;e8^C6!#G6WP^G3IyYN?E;WF|GFoSVs{3BN_2 z8*=_LdA7W$JH5qTySLCzGhI)T1+l%8KDyl8M4_Gh8<~o(TEr`a)QgFIS<hzjrQVL3 z28ZhSAWTt0r>PHPaAq8UOV8c?8xmFA_%;xYZwKUCRI^!&gLa>IL-N#iX25{0*t`cI zoYnQ)Y6kY0=;r4)KI7Hpb-r@%t}25_VF9UAKq^$7MjrbAAvyD0)dD8NG$i0@L<grQ ze6@H@IErDjj$)k(YMmK`pVn3vu3Y)xqlL@%ju+o&B7_YBz|(q1Ca^z44+$Hbo49n` z>L2em`Ga0^W02I-R=?hoy|LRS!|~jrVSNEJEFYZql@EY{^dm$1l<v|;YeRaS+`qlc zAXV8pvg>FzBwLPlAxzF$0up!V3i^<#CGBnb5XQn9?B5E8t_NDdK7@R~3bvTs+vP7& zR|E{5JfOBIR6=vU*-ju|`L}Jo$z|F~+Sw*gqy|}L4kN^?0OoqPYV*9D185g_yFw;; zP86$mmTNVe5Ljl$Us+w}cW)S<Lw>_ym?cn4$X7g@A|`mSqa~=7p$!vaC=N@>#Y#Gs zLB?%LDKwmt%>f}agb~;oz%QexX~+hrCZdZwj-rZQ;j~z900VeH8`xriU>UPZ15#V= z9$-I&f_O;OMZtDidI6=vIfwS}&j}#w&60VD(s{DWhD<Q9TtiFX{aGsmlnX1Z?`D6w z_1j?o8m7Jd^1lg~)rX?@ms%S?{QBp`jX$mdChvekp@-@%AjZl19gAAU$>H*J7diz1 z)lHjiA=8FD4$*WA5`Luq9*#K#E21t#xO_GTwHHv=3FzSb1Xz=MD^u9)uy~-^g`9V~ zqMslialYNJC%MKpAzSt)fX)PcQtzmFe8THUu+^&ffIxH1L)(x^!uiN=sHNA?$o2?q zv0uZ?kO^qy2VUexZZK_|?@HyADIL~p-UV&bF`i8Ooh%3LENnE+z3Vp>=7@2YYgHsQ zAk{CBtl|>6+NydJOw<J=Zy>=-M~>wjx@Cf^`QtxEvn&P@(TKUsrN@R-rvGKk72T=7 E0FKc`5C8xG diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-37.pyc deleted file mode 100644 index 6918e5990705cdb98bcfddf50185208a1414a2dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2188 zcma)7Ur!rH5Z~SV!`Yk-0g@24P2E;$WvM{>(1%L2Y6CPuYD@&Cl}?IQhj%eY&Ua>S zT?NZ|DO7ptcd*r`zV##YbL?xM_zG2|c4lo{kU;9f&du!X&dkovZ~VAYDH9mkZ_6+C zD}?-o!sT#*`37e384y7PO-YAFlp@bk)^Q@I<3=tePl#}YdrpKa>6sIG!rLQt|ANA? zIyIGzqgd@p{aob-Qq`FWkxR1no{qIN;j_4Plw{IMEjThA=pRS%0}x3fDoDfxjT|xe zh8$AsvlO|O_k@2QM4t4;j0n!j8I5LuFNw0{12HSYa}t$AMO5KienVUm%|ev(=H9bj zs*}g3T3(B@Un|#O+^n>!MvK|-2*Iy2nZ>8TXrk$WoUvmzpo0EtQ#K&n5d^3!m|$%N zoF@o`;4~mfvuT{Q`C*c3sV>lL-8Wv*>q@0OkW9dNk|mmRb5|sVR>?t6Cwa!>EKX1R zQkhaK7m!n4bWEA2aiMt&(hk{n3z;4&A5BtI;=BdQg7e?W-<xZ?(_QN(-IXLObeyIu z;^Z`Y_4(luF51a|l9|ZW8rl+4uXPTPE2Qq)$6W26suEcK1ZEKcA#{QI@YjF;=ESXD zUZaJ@fdjwO+^vIfnY$qyfpS2O9rY0DRCd)W$nIDckl!o0WDPX~HtN2@XvV4Yl!SoQ zEG}TNs}Ofk1?7&PDlW|-nMZO5$O_B?cM)2J%arZxzkAD-todvA!8>iB4Gcn)pP_K! zohiQaVk6hvoo*^SGSgCQDV3{9EaM=ik(h9jYM#X%`30J@^~U-i-4e*v{r@u_wE%W+ z@gHDG_Tsku@`~@<-t}_t6cbpr_!Kq|3^MZSPy4d;4E{FBi$7ii0*=|x8PEZHKt}Yn zGjOzf?7d{F0UCceBLG9k0nE~XjiAlw^6@O7CVWm#s&;P$_6k_7UR#}mRagPr^CR-w z9RS*3We7+FKd^pBIP3Ub7%rkTa7PdxSRAiFG{RXXNbi$h@We#_BLNHU!~(MxmcaL2 zu>IDay*DDr4eyW8`tnOxy}gVL<Rz#8uhIYDQBi~cF??!AiLL>{b5)CV?EqR3=xhNi zETM~kVALNNPr*Y-<D@dPRcy+ce5E-+7McY%N#kwp?(XawKh4{1=mnmT2femh1eIDs zf&epqW2ecVZ5e-j()ioWJ(Pp*cJ>>ae7kA9z2>*OO|#gR&^>xeL5bQff{qam7Cy#3 zlu|%*vfaD1xz*g-Xl^&2n7MYYxy<rj`-qEJ$EIrS<k?{&WY&^qVejeAZgXS5$(v7i zw?O!Qv+h|KngA~kaVbL+DEvt)vmOF0YmOmUXiV{;K7@$Af?2Er!NxNWNDTn70d*~h zbiA^_mT8$)SqL)dS^u3|AcR-D1|5W)En(~&@Qh?gM-wo!aX0xG6gMMCp(=to1}^PC zy2b1DJYk~<vEd``q2ZS~@8qJFA|G;o(u>oHW`=W-w>Y;w*mf=xKxM&?hCaRW`j{vi zi>XZ7e@mt*9GfQevJKh}h{(kw1$M^3aaq+5gU}7#;62+=8}QRqx%M-lFiXahS+7&r dTC-JYH~;5j%%KMptdB4B^+R-n6&%ue=U;c@5rF^z diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-37.pyc deleted file mode 100644 index dae9f1ce6d296bbfeda20b5302596240850080d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1079 zcmZ8fO>fgc5Z(1h5`UznDTki88>x+2Kx!p~P*SKUBC1F$Bui+Oc%3w5ow&OWP?Q5w zD)q#F0CD0kt+;XGFK}XJ<EB;Dn#r5-Iy3LhwCZ)Az#0GCc>lXf$R7-@j|1R2nEDEi z6HW!mXiO<$OIVp5+Xmah$=ujA*b$Yi8dnW=MJ@AU&)|yivmg!(u8J_L$902iVkKLR zR}J>Wy=*OBqvU{ap9hzO2PvJ~af63l64n1wXd|M!(LU|TZdx43$uvKblYS~8>z^FI z+`Wmqhp)QJD0p$wK0I26;X!NX(e}<V#@Dak-h}O=y~lgY&~J@~PnHqhJ$|<c6X<7o zP%J#^0l1XJl#|%v&J`I@ZgKn4i|s4okk|n#u3ml9YIkoD=p>f;nh^Z0f!SbcA6!8S zIwN!I%$iY7zk&RPJtu_&=7Lqgs$exR56qvFVQofOFeBf?9|VPkidF|C3Pf)_WP_0? zK(V@Z)ih6~44{UtF*X{H3dSVXl}JXq=ql)7F^I&bq=ybSMptvAywa{rRa!)rc2p_` zGK7~<%VR7NJ*61?MgHwKi!5*EqkMBTRz**UO@4kc{=7Xn#iTLzF&*=XY$h;Uo)*ol zpQs@Ycu{66zmO~N&kw=WeQ<;}EQj8HeCx}`9aXokSw*x1q65isFH0HIK4aO0PX*$T zvGZw9EZ&$Rx?VP)q(Xos>rl?Ph{^_HY{2Li0Z?XQ)Wn@=T{n;dC~~WNiC45gEe5*_ zI!0yftFw_R6R5Zj(rI#5GB)z-aM;IHEid6P%%u;q%;02nkmRtiWd_Hj{XXn$nZS{m gkBU!a2Iptmy<xUM$V=CrE~I&ei>#1uNbfxMe^6iv;Q#;t diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-37.pyc deleted file mode 100644 index a2fb1b168d3b1874393e4c5f5103b8fde7225a02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15634 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-37.pyc deleted file mode 100644 index 84f1e318e2f7a8f9cc593fe913ba73d2d5e9abf2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2941 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 QoU8c<%77^?sPF~%dk;9uNdN!< diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-37.pyc deleted file mode 100644 index f0e3d62107b917d961a8ea679eb7ddc4ad3bc19d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1569 zcmaJ>%Wm676rCaUpd?bFWZ7|xzP3V}xK1HAi=rs(qHfS8C?Ep`1}F%M97}9wC}l{c zalxz<AV1NCjds&tnr&D8g|2$<4DG}z&=GiW?t`3r@0`(b5OfKw{P+EzbU?^oXk4!b zkgwn=egjBJN(GUWQHtCVj&zx8xGNg6$(pjoTC&aB(qo?Nu#W7qu8B89Px{Q40Sk=X z6n!~h0~xZ=*ex-XBQ`R;Eq3IXjSct2uH0jLhIhmrxzF|~IVEW~?Y$&vkJGKo-bwu# znFN1RC~-pd=wunI881)OYP0@9t>#>T_s%TK7lI#Ol)R4Dp_U&1nB|A}r-vsODib10 z9<5R?boaYe_CQ&_^L<=q`Sf-|_$W?pdwLJ&^1;!Oea9HnsWB#w4$UV%KUJJRu?a)F z?PsrDkT$kE9dE=UR#}|e)ZMzm+ivJ;aQ1L^bpO+{Wt`cKpnaP={g%%a|K-~2Tk~cd zBfHPpMm@=jrO8TQd^gLjS@9kaP8dxIb6$~in$pyH=`r^eX%N<cxx0EWJ3g7cG3^8o z0vC!01V!*;#UB7ADQQKv&ZTojC@I~tv88}bgDrz?gPy^T!LGrcLEm6tuy1g%r3=3z zQCJSQ<OP0hl+p@h@xn3OG2E@_<xb^P?v+DHMSc!1#}!3;;a-85D{{Gu6{Q3ldi>4V zWKTDX&6+DUg0i(2MOmJeQKYaHg?*_eLJOgd;30Gn@G_|$f{%a$P<@0UfNrmiA`2Cw zYk;m{!OKXZ=%PBPTl{&+^Het#hv1~48wD5VI#`-Rt<&_bSS_+77SV0@_*qtL-u8l6 zI#HB}xG19NPx8;#2c=veth4pqEHBDfh`Z_2i~RZF`4XMxiJn0TD|L{-eM)(GP|TBJ zftSiwd2fB8#!&w!@DvDy_MH~}&#&2{KKL8dGclibsptH<|CVU(U5|Lu#Bt}b<WZ!% z5e{Y}ko!^e6xy;8v$GEBjuI{e9L@(&gMkTE?<4;Z0Z;H_cnSx=qsD$bc~_6HFPQEd zEh$XV18CHSY@_DT^-#q5BB}o(%xV3<4s;)1Sm1rP**Ch-BaF<iuegogXhjDYE#XGn z07^#>&}UECdW~>=>#3_mLFv%EY;U#AMAey|UysK!9FF$BfGn8rmpHEiN99wWe&mKU JbdbT%{TKXfq0j&T diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-37.pyc deleted file mode 100644 index f22f5f1412e547f876d995facea379ae4e1dc0a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2395 zcmZuz&2Jh<6rY*>V8MV1P8_?cDo1LhA~kU<RaFmB+r)MfM=`bxQB|a9x@HEvWOu={ zOJyT+!d0&M6O4N5KaoFVu08qMV=wJ{vtZ*kyUfg+kDd44?|t#4R4Nd7;@{U^e<&03 zCr;*%4aASol3$<`M9`2#v_&b>EM$?@vJ7p7cI31iL))Pn<ytvIJE0flTX{pfVIf*- zEk(svk&<Ub<b-!lgeU35YL!I3L289d3T$drukH=QG<b5B%B^ExHDr3A`bSd1PIap< zg1FmA{Z#Jx?c*Spu)5ZGvD?@Vl2ipp!!+o}k7GYPOM(RUR&Z~tAE)v(U05#RGH>kh zz5VT-mo=t~$YXxBF3v7DjM^a8)nm=5<NydsT2zo0dq+A{P{Gc<mSt#5*g)IT5sq-r z$%M9CppD8v=R{r<&PmG?OQHy4{vEMNs{jy`bO8m+^lc*?_~3|qu_fO?my(o@$%I|7 zDQu=zYENL!oz$HW7;~v-#{8IE6!3%~a5t^jmb8-$2U4j#T%tYBgE&YzS9q~<aV_6A z0P`eLXncJ~EWpZr#B~JUJGfVAXRux^Ye&gMrhvMg$gl%rp7VC-Ckf|&kiUP}Oryc( zAQ(Id;w1IM@PRlvi%-Aq9OI&C{8t%^zS?Yq-GxjylU|SvjPV~1&eRfcy$>xh9!tx# zKs|Uz#>N?D59d049K28A>zm+>Nzck)oP%U5yxu^hmXU&}0Q6KP8*brJ6}uJe@WhwU z5`>F@Ory%R1s@tbZis@m+`{u7bikbSXl5H`_~;_44j}T_kHEJL*NojY&)e|nS9k}5 zj<C_)1&)iKf1EK2Dv&9wYwv|W@MAEVVexTx+6(=-JM_B}U2o2F5%c+e+sFfl&^>a{ zjG`|=<@fZI8Qkdv-fi;wueS`8XBXC(j@dey(zn(a+_>kwVd?;O+>4w5m+pDc@?$o& z!OaW3C2;QI0XeCdvn4p&fz|Sj)n!<%n7b=e^41<R!C>XX7{YTM0ly`zM>tk5R?N&E z+iMUYzu~SuWfb>rXM5QkxMin7QeoYNQ)>h$C!_xNojGMrz}f5Flgdv7WN>FPFeAeq zkbd<Idr#F<!{hE0kV5)mZHjWNzp-&X*AZ6kfZcNS(Y^c02K=(n*f<W-4G7A<+VInj zBS@RDcM0$lh2D0FR=LCwzx)TD+9wdEU{I;8P{yhV>$(s_cH|I~sZ{8f+Sxfg+&|QA z*zb0w(vFZv!>&TVQ>)maakX3DZ}Pnz?PgzUcemNVx%YJcRehW9Hnr1eK0a*fl`i;m zd#IF*VFdpM#=5{EF=W%s^X-n5LX`}ABZ|&%?=*L|n!EL9db!(Axs3b6?lBjB>g%$( zvmbW?A>+2x)yDJv!{*kjCT~7J+=0o<?V4kvM|%hf$fz_8Aiib^4wcm&O2ZKc6J6IK z_63OX9kk?I=m@<{D<;{LA>G)9!XDF4nXXcoR#_F!tkD81vobBhX^)MT7s3*Cy9!6N z1vV2Np8)}eB^MOj6<wYgilrtrCM?Siw!uhYrpX|(BLB2zWeS2$roM3)JGwYa*=F`% zz3_scp(U8@iP2%Sz98pKRH0x%k-$vEIT(ybeK8D?E^>Y{^uuh&<YkixwFe#v^(8%9 z@D+s82(C-BYS5Np2vz3_a>zR-tD1z0rRj5M33{eSi@BnWuXoR6<a({Fm!qRumdpHK zp@ZvcW?17nQTErs)HNtmSWFhmSXSBG-k=?)r&%d;;mQPRo~eP3jE7NTeB4AsRtm19 Y&E!T|wf87P<a?|uM&KeCKYJ_IzfiqCiU0rr diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-37.pyc deleted file mode 100644 index eaf77dcbc2ec68c780354986539192baad53a92d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5785 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 AbN~PV diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-37.pyc deleted file mode 100644 index 2930a5958cdca13a1ba8dffbe2ecea201f95d10f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1926 zcmah~&1xe@5bmBojpUJS?1gL~ge4&x6xKF-2=PLQvzE2C!Iq3PCNQux@^nj<JTsPi zM!^>H$%eh{DGy+iQ!e``d4N78<m6Lw&M8$rvQ`dRGSJo4)jw7Jb=5bU<#LI@m;C(r z^{=4)frI<c0_A&X=?(}^IE_e514>ahA|o~fGqwUtkIl%Aoxst$6%}GPa4Fd)+~&?T z;f|nJW>DmX7OA**6ppJ<RjwYlWlLlS^7Kf^ilIEzdP%pHwKJi-{dRcVON1W5@}=r2 zzn`2;;US0qt991eXZww<+Fl4JPd{^_r9LQv1eBA&;50DbkPhVrH?Q5m(z?ZM&~4#x zhZnBN6%7iYyS%7%mzVh5HG%LwUWUH(hFBz+gR9J|61vYX(9PZbwh`j}@WUR1z?Oam zA|n|clPlxKxP{5g%&aRIGn*5T&Y0X3(9Q`QP3sj`+39c~q%6Qz<ucYwdKqKVhM{!O zRtz;HER9u}CBvA-M=S(TQ)Nq$iVX0vQW15aFESQJ?KEZV7xMSUS{4u12ED;bFG;g@ z6s_>Hi{$)y=NOH;u^&akPvsgO$3?a_%sT4>{ZOle3t0s3PobqQ2twy+i8^$&{2q+e z`)L0gjL%@#LomjqZ|1OYgv8Py81*|mzhX=Dqj8WPYM8Tf4yULr=iNM-7Emmrz-7;% zr3h3W;b?ItK8??V;PADoxC7IkQ+NZTKC<E7E9?5)iL2bl)RFQu;38v5I~LDzzX5_6 zqmO31&93=hrz*e42mHBFJLwMFUGepduUX{p=R+L_EW-O>)0g`Rl=J?WZjskVmj<9t zZs^#!rI+T|%#6NyV#sHi)weMr56GFLtp%`dg4KOsErJ!27EUPL0$?XLjx5rj<Hk3{ zAZ+f;`2iBU@4?P8tbGd!K7Wgrg%eA@y+03E0N7^z4g;2&92WHpt5PD)GX@!&35hpQ zcCFcLG$j_4a_SAA?bno(FHp{|-@>u`s&QD~V!OVwTmH+Yua>*;I^j@Ckw6dm9En6H z57d`tn&MW?uT}ls`nH<aYfqC-kBcM}YN@r;X!_MdpZPn@8VvTfDwa+;<sMyR0(?tF zL&$<jCF)ppcDzp!t0M$|0Wqhaf*?>V9yFI)Q#ntU3=hi4HAV|FX@mQw>4NCs#q~3; zg2L$~lu94C_=L!(W7PF{nY<vEl$&Gv7?@-XnXHS+s(0UQ|2}&3?$3=oEQ$$V{k2gs zax}_~dW}_gUN+f5v#|+QtSsdWlc;wh{+0If3C!(5OZD$VUu6-)|9B?+hgeoT<S?uf z##D*1_>>PL)IG+|hV3Yykzc~0nqPDYD;G!yI54}AOE~ce#TO`^fB@FZSuGS%1k5<a z9coAOfu;ha&(EQyXadv?&+%-}@+@~*Q%b#3Qsqg7<`gFpYh??d)Kn*1o_$OCBkQDz r^PiI@W97t0VVcI8lyjDvMv}*baVYoO{L0^bg25o8d2|s{!L$AWLZGo7 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-37.pyc deleted file mode 100644 index bca11d573543bcc06d771ef025662fc378aa22e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 395 zcmXv~Jx{|h5KY>YqM)vb@kTN<0l`#NsH$LKDH25tl~ClyPGjLOY^OB+H6SKt{!Lc? z0V5M`NKd+Fzq`}ZyPFOMq31$;oIL%w_j^b7(RH7ROLOc1dkYWy3!nIJ9o%{M7hT+) zdr`3c3Lgq;fJ<C50%SvtH6R76z)CQbD@OAQG_jhJH5Dtc1%WluhDrgV<V&JK=8zRg zV`9TxOAfEp7F2*Cwp6jI00|6Dqn!d%E)~k2(TbQj3`eN6h14UsMgpb`iDnE=F%t1| zPbVvmD2p@6qj1~1h|l87+K*>ZQ1{am%PdXnqcm-eInp!Exvl$;H}~_~yV<9w58N3V z_#G#ft3**Xq{3Ll*bu)|VsoAsyJC}0Nnojy)^XAbyKU;j@&B=|c7i5w5Of0n4-@En AkN^Mx diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/big5freq.py b/env/lib/python3.7/site-packages/pip/_vendor/chardet/big5freq.py deleted file mode 100644 index 38f3251..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/chardet/big5freq.py +++ /dev/null @@ -1,386 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# Big5 frequency table -# by Taiwan's Mandarin Promotion Council -# <http://www.edu.tw:81/mandr/> -# -# 128 --> 0.42261 -# 256 --> 0.57851 -# 512 --> 0.74851 -# 1024 --> 0.89384 -# 2048 --> 0.97583 -# -# Ideal Distribution Ratio = 0.74851/(1-0.74851) =2.98 -# Random Distribution Ration = 512/(5401-512)=0.105 -# -# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR - -BIG5_TYPICAL_DISTRIBUTION_RATIO = 0.75 - -#Char to FreqOrder table -BIG5_TABLE_SIZE = 5376 - -BIG5_CHAR_TO_FREQ_ORDER = ( - 1,1801,1506, 255,1431, 198, 9, 82, 6,5008, 177, 202,3681,1256,2821, 110, # 16 -3814, 33,3274, 261, 76, 44,2114, 16,2946,2187,1176, 659,3971, 26,3451,2653, # 32 -1198,3972,3350,4202, 410,2215, 302, 590, 361,1964, 8, 204, 58,4510,5009,1932, # 48 - 63,5010,5011, 317,1614, 75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, # 64 -3682, 3, 10,3973,1471, 29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, # 80 -4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947, 34,3556,3204, 64, 604, # 96 -5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337, 72, 406,5017, 80, # 112 - 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449, 69,2987, 591, # 128 - 179,2096, 471, 115,2035,1844, 60, 50,2988, 134, 806,1869, 734,2036,3454, 180, # 144 - 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, # 160 -2502, 90,2716,1338, 663, 11, 906,1099,2553, 20,2441, 182, 532,1716,5019, 732, # 176 -1376,4204,1311,1420,3206, 25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, # 192 -3276, 475,1447,3683,5020, 117, 21, 656, 810,1297,2300,2334,3557,5021, 126,4205, # 208 - 706, 456, 150, 613,4513, 71,1118,2037,4206, 145,3092, 85, 835, 486,2115,1246, # 224 -1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, # 240 -3558,3135,5023,1956,1153,4207, 83, 296,1199,3093, 192, 624, 93,5024, 822,1898, # 256 -2823,3136, 795,2065, 991,1554,1542,1592, 27, 43,2867, 859, 139,1456, 860,4514, # 272 - 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, # 288 -3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, # 304 -1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, # 320 -5026,5027,2176,3207,3685,2682, 593, 845,1062,3277, 88,1723,2038,3978,1951, 212, # 336 - 266, 152, 149, 468,1899,4208,4516, 77, 187,5028,3038, 37, 5,2990,5029,3979, # 352 -5030,5031, 39,2524,4517,2908,3208,2079, 55, 148, 74,4518, 545, 483,1474,1029, # 368 -1665, 217,1870,1531,3138,1104,2655,4209, 24, 172,3562, 900,3980,3563,3564,4519, # 384 - 32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683, 4,3039,3351,1427,1789, # 400 - 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, # 416 -3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439, 38,5037,1063,5038, 794, # 432 -3982,1435,2301, 46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804, 35, 707, # 448 - 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, # 464 -2129,1363,3689,1423, 697, 100,3094, 48, 70,1231, 495,3139,2196,5043,1294,5044, # 480 -2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, # 496 - 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, # 512 - 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, # 528 -3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, # 544 -1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, # 560 -1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, # 576 -1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381, 7, # 592 -2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, # 608 - 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, # 624 -4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, # 640 -1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, # 656 -5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, # 672 -2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, # 688 - 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, # 704 - 98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, # 720 - 523,2789,2790,2658,5061, 141,2235,1333, 68, 176, 441, 876, 907,4220, 603,2602, # 736 - 710, 171,3464, 404, 549, 18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, # 752 -5063,2991, 368,5064, 146, 366, 99, 871,3693,1543, 748, 807,1586,1185, 22,2263, # 768 - 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, # 784 -1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068, 59,5069, # 800 - 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, # 816 - 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, # 832 -5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, # 848 -1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, # 864 - 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, # 880 -3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, # 896 -4224, 57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, # 912 -3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, # 928 - 279,3145, 51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, # 944 - 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, # 960 -1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, # 976 -4227,2475,1436, 953,4228,2055,4545, 671,2400, 79,4229,2446,3285, 608, 567,2689, # 992 -3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, # 1008 -3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, # 1024 -2402,5097,5098,5099,4232,3045, 0,5100,2476, 315, 231,2447, 301,3356,4549,2385, # 1040 -5101, 233,4233,3697,1819,4550,4551,5102, 96,1777,1315,2083,5103, 257,5104,1810, # 1056 -3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, # 1072 -5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, # 1088 -1484,5110,1712, 127, 67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, # 1104 -2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, # 1120 -1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, # 1136 - 78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, # 1152 -1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, # 1168 -4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, # 1184 -3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, # 1200 - 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, # 1216 - 165, 243,4559,3703,2528, 123, 683,4239, 764,4560, 36,3998,1793, 589,2916, 816, # 1232 - 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, # 1248 -2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, # 1264 -5122, 611,1156, 854,2386,1316,2875, 2, 386, 515,2918,5123,5124,3286, 868,2238, # 1280 -1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, # 1296 -2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, # 1312 -1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, # 1328 -1994,5135,4564,5136,5137,2198, 13,2792,3704,2998,3149,1229,1917,5138,3835,2132, # 1344 -5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, # 1360 -5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, # 1376 -5149, 128,2133, 92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, # 1392 -3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, # 1408 -4567,2252, 94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, # 1424 -4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, # 1440 -2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, # 1456 -5163,2337,2068, 23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, # 1472 -3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, # 1488 - 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, # 1504 -5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863, 41, # 1520 -5170,5171,4575,5172,1657,2338, 19, 463,2760,4251, 606,5173,2999,3289,1087,2085, # 1536 -1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, # 1552 -2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, # 1568 -3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, # 1584 -4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, # 1600 -5182,2692, 733, 40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, # 1616 -3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, # 1632 -4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, # 1648 -1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, # 1664 -1871,2762,3004,5187, 435,5188, 343,1108, 596, 17,1751,4579,2239,3477,3709,5189, # 1680 -4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, # 1696 -1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, # 1712 - 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, # 1728 -1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, # 1744 -1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, # 1760 -3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, # 1776 - 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, # 1792 -5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, # 1808 -2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, # 1824 -1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, # 1840 -1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551, 30,2268,4266, # 1856 -5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, # 1872 - 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, # 1888 -4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, # 1904 - 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, # 1920 -2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, # 1936 - 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, # 1952 -1041,3005, 293,1168, 87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, # 1968 -1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, # 1984 - 730,1515, 184,2840, 66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, # 2000 -4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, # 2016 -4021,5231,5232,1186, 15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, # 2032 -1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, # 2048 -3596,1342,1681,1718, 766,3297, 286, 89,2961,3715,5236,1713,5237,2607,3371,3008, # 2064 -5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, # 2080 -5240,3298, 310, 313,3482,2304, 770,4278, 54,3054, 189,4611,3105,3848,4025,5241, # 2096 -1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, # 2112 -2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, # 2128 -1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, # 2144 -3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, # 2160 -2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, # 2176 -3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, # 2192 -2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, # 2208 -4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, # 2224 -4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, # 2240 -3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, # 2256 - 97, 81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, # 2272 -3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, # 2288 - 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, # 2304 -3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, # 2320 -4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, # 2336 -3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, # 2352 -1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, # 2368 -5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, # 2384 - 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, # 2400 -5286, 587, 14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, # 2416 -1702,1226, 102,1547, 62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, # 2432 - 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, # 2448 -4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294, 86,1494,1730, # 2464 -4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, # 2480 - 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, # 2496 -2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, # 2512 -2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885, 28,2695, # 2528 -3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, # 2544 -1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, # 2560 -4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, # 2576 -2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, # 2592 -1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, # 2608 -1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, # 2624 -2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, # 2640 -3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, # 2656 -1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, # 2672 -5313,3493,5314,5315,5316,3310,2698,1433,3311, 131, 95,1504,4049, 723,4303,3166, # 2688 -1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, # 2704 -4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654, 53,5320,3014,5321, # 2720 -1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, # 2736 - 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, # 2752 -1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, # 2768 -4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, # 2784 -4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, # 2800 -2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, # 2816 -1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, # 2832 -4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, # 2848 - 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, # 2864 -5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, # 2880 -2322,3316,5346,5347,4308,5348,4309, 84,4310, 112, 989,5349, 547,1059,4064, 701, # 2896 -3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, # 2912 -4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, # 2928 - 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, # 2944 -5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, # 2960 -5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, # 2976 -1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, # 2992 -4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, # 3008 -4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, # 3024 -2699,1516,3614,1121,1082,1329,3317,4073,1449,3873, 65,1128,2848,2927,2769,1590, # 3040 -3874,5370,5371, 12,2668, 45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, # 3056 -3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, # 3072 -2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, # 3088 -1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, # 3104 -4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, # 3120 -3736,1859, 91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, # 3136 -3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, # 3152 -2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, # 3168 -4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771, 61,4079,3738,1823,4080, # 3184 -5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, # 3200 -3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, # 3216 -2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, # 3232 -3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, # 3248 -1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, # 3264 -2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, # 3280 -3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, # 3296 -4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063, 56,1396,3113, # 3312 -2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, # 3328 -2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, # 3344 -5418,1076, 49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, # 3360 -1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, # 3376 -2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, # 3392 -1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, # 3408 -3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, # 3424 -4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629, 31,2851, # 3440 -2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, # 3456 -3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, # 3472 -3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, # 3488 -2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, # 3504 -4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, # 3520 -2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, # 3536 -3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, # 3552 -4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, # 3568 -5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, # 3584 -3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, # 3600 - 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, # 3616 -1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412, 42,3119, 464,5455,2642, # 3632 -4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, # 3648 -1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, # 3664 -4701,5462,3020, 962, 588,3629, 289,3250,2644,1116, 52,5463,3067,1797,5464,5465, # 3680 -5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, # 3696 - 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, # 3712 -5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, # 3728 -5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, # 3744 -2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, # 3760 -3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, # 3776 -2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, # 3792 -2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, # 3808 - 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, # 3824 -1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, # 3840 -4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, # 3856 -3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, # 3872 -3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, # 3888 - 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, # 3904 -2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, # 3920 - 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, # 3936 -2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, # 3952 -4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, # 3968 -1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, # 3984 -4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, # 4000 -1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, # 4016 -3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, # 4032 - 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, # 4048 -3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, # 4064 -5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, # 4080 -5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, # 4096 -3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, # 4112 -3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, # 4128 -1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, # 4144 -2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, # 4160 -5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, # 4176 -1561,2674,1452,4113,1375,5549,5550, 47,2974, 316,5551,1406,1591,2937,3181,5552, # 4192 -1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, # 4208 -3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, # 4224 - 919,2352,2975,2353,1270,4727,4115, 73,5556,5557, 647,5558,3259,2856,2259,1550, # 4240 -1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, # 4256 -4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, # 4272 -5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, # 4288 -2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, # 4304 -3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, # 4320 - 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, # 4336 -1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, # 4352 -2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, # 4368 -2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, # 4384 -5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, # 4400 -5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, # 4416 -5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, # 4432 -2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, # 4448 -2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, # 4464 -1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, # 4480 -4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, # 4496 -3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, # 4512 -3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, # 4528 -4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, # 4544 -4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, # 4560 -2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, # 4576 -2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, # 4592 -5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, # 4608 -4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, # 4624 -5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, # 4640 -4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, # 4656 - 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, # 4672 - 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, # 4688 -1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, # 4704 -3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, # 4720 -4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, # 4736 -1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, # 4752 -5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, # 4768 -2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, # 4784 -2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, # 4800 -3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, # 4816 -5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, # 4832 -1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, # 4848 -3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, # 4864 -5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, # 4880 -1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, # 4896 -5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, # 4912 -2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, # 4928 -3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, # 4944 -2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, # 4960 -3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, # 4976 -3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, # 4992 -3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, # 5008 -4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, # 5024 - 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, # 5040 -2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, # 5056 -4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, # 5072 -3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, # 5088 -5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, # 5104 -1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, # 5120 -5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, # 5136 - 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, # 5152 -1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, # 5168 - 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, # 5184 -4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, # 5200 -1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, # 5216 -4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, # 5232 -1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, # 5248 - 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, # 5264 -3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, # 5280 -4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, # 5296 -5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, # 5312 - 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, # 5328 -3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, # 5344 - 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, # 5360 -2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376 -) - diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/big5prober.py b/env/lib/python3.7/site-packages/pip/_vendor/chardet/big5prober.py deleted file mode 100644 index 98f9970..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/chardet/big5prober.py +++ /dev/null @@ -1,47 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import Big5DistributionAnalysis -from .mbcssm import BIG5_SM_MODEL - - -class Big5Prober(MultiByteCharSetProber): - def __init__(self): - super(Big5Prober, self).__init__() - self.coding_sm = CodingStateMachine(BIG5_SM_MODEL) - self.distribution_analyzer = Big5DistributionAnalysis() - self.reset() - - @property - def charset_name(self): - return "Big5" - - @property - def language(self): - return "Chinese" diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/chardistribution.py b/env/lib/python3.7/site-packages/pip/_vendor/chardet/chardistribution.py deleted file mode 100644 index c0395f4..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/chardet/chardistribution.py +++ /dev/null @@ -1,233 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .euctwfreq import (EUCTW_CHAR_TO_FREQ_ORDER, EUCTW_TABLE_SIZE, - EUCTW_TYPICAL_DISTRIBUTION_RATIO) -from .euckrfreq import (EUCKR_CHAR_TO_FREQ_ORDER, EUCKR_TABLE_SIZE, - EUCKR_TYPICAL_DISTRIBUTION_RATIO) -from .gb2312freq import (GB2312_CHAR_TO_FREQ_ORDER, GB2312_TABLE_SIZE, - GB2312_TYPICAL_DISTRIBUTION_RATIO) -from .big5freq import (BIG5_CHAR_TO_FREQ_ORDER, BIG5_TABLE_SIZE, - BIG5_TYPICAL_DISTRIBUTION_RATIO) -from .jisfreq import (JIS_CHAR_TO_FREQ_ORDER, JIS_TABLE_SIZE, - JIS_TYPICAL_DISTRIBUTION_RATIO) - - -class CharDistributionAnalysis(object): - ENOUGH_DATA_THRESHOLD = 1024 - SURE_YES = 0.99 - SURE_NO = 0.01 - MINIMUM_DATA_THRESHOLD = 3 - - def __init__(self): - # Mapping table to get frequency order from char order (get from - # GetOrder()) - self._char_to_freq_order = None - self._table_size = None # Size of above table - # This is a constant value which varies from language to language, - # used in calculating confidence. See - # http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html - # for further detail. - self.typical_distribution_ratio = None - self._done = None - self._total_chars = None - self._freq_chars = None - self.reset() - - def reset(self): - """reset analyser, clear any state""" - # If this flag is set to True, detection is done and conclusion has - # been made - self._done = False - self._total_chars = 0 # Total characters encountered - # The number of characters whose frequency order is less than 512 - self._freq_chars = 0 - - def feed(self, char, char_len): - """feed a character with known length""" - if char_len == 2: - # we only care about 2-bytes character in our distribution analysis - order = self.get_order(char) - else: - order = -1 - if order >= 0: - self._total_chars += 1 - # order is valid - if order < self._table_size: - if 512 > self._char_to_freq_order[order]: - self._freq_chars += 1 - - def get_confidence(self): - """return confidence based on existing data""" - # if we didn't receive any character in our consideration range, - # return negative answer - if self._total_chars <= 0 or self._freq_chars <= self.MINIMUM_DATA_THRESHOLD: - return self.SURE_NO - - if self._total_chars != self._freq_chars: - r = (self._freq_chars / ((self._total_chars - self._freq_chars) - * self.typical_distribution_ratio)) - if r < self.SURE_YES: - return r - - # normalize confidence (we don't want to be 100% sure) - return self.SURE_YES - - def got_enough_data(self): - # It is not necessary to receive all data to draw conclusion. - # For charset detection, certain amount of data is enough - return self._total_chars > self.ENOUGH_DATA_THRESHOLD - - def get_order(self, byte_str): - # We do not handle characters based on the original encoding string, - # but convert this encoding string to a number, here called order. - # This allows multiple encodings of a language to share one frequency - # table. - return -1 - - -class EUCTWDistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - super(EUCTWDistributionAnalysis, self).__init__() - self._char_to_freq_order = EUCTW_CHAR_TO_FREQ_ORDER - self._table_size = EUCTW_TABLE_SIZE - self.typical_distribution_ratio = EUCTW_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, byte_str): - # for euc-TW encoding, we are interested - # first byte range: 0xc4 -- 0xfe - # second byte range: 0xa1 -- 0xfe - # no validation needed here. State machine has done that - first_char = byte_str[0] - if first_char >= 0xC4: - return 94 * (first_char - 0xC4) + byte_str[1] - 0xA1 - else: - return -1 - - -class EUCKRDistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - super(EUCKRDistributionAnalysis, self).__init__() - self._char_to_freq_order = EUCKR_CHAR_TO_FREQ_ORDER - self._table_size = EUCKR_TABLE_SIZE - self.typical_distribution_ratio = EUCKR_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, byte_str): - # for euc-KR encoding, we are interested - # first byte range: 0xb0 -- 0xfe - # second byte range: 0xa1 -- 0xfe - # no validation needed here. State machine has done that - first_char = byte_str[0] - if first_char >= 0xB0: - return 94 * (first_char - 0xB0) + byte_str[1] - 0xA1 - else: - return -1 - - -class GB2312DistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - super(GB2312DistributionAnalysis, self).__init__() - self._char_to_freq_order = GB2312_CHAR_TO_FREQ_ORDER - self._table_size = GB2312_TABLE_SIZE - self.typical_distribution_ratio = GB2312_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, byte_str): - # for GB2312 encoding, we are interested - # first byte range: 0xb0 -- 0xfe - # second byte range: 0xa1 -- 0xfe - # no validation needed here. State machine has done that - first_char, second_char = byte_str[0], byte_str[1] - if (first_char >= 0xB0) and (second_char >= 0xA1): - return 94 * (first_char - 0xB0) + second_char - 0xA1 - else: - return -1 - - -class Big5DistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - super(Big5DistributionAnalysis, self).__init__() - self._char_to_freq_order = BIG5_CHAR_TO_FREQ_ORDER - self._table_size = BIG5_TABLE_SIZE - self.typical_distribution_ratio = BIG5_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, byte_str): - # for big5 encoding, we are interested - # first byte range: 0xa4 -- 0xfe - # second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe - # no validation needed here. State machine has done that - first_char, second_char = byte_str[0], byte_str[1] - if first_char >= 0xA4: - if second_char >= 0xA1: - return 157 * (first_char - 0xA4) + second_char - 0xA1 + 63 - else: - return 157 * (first_char - 0xA4) + second_char - 0x40 - else: - return -1 - - -class SJISDistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - super(SJISDistributionAnalysis, self).__init__() - self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER - self._table_size = JIS_TABLE_SIZE - self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, byte_str): - # for sjis encoding, we are interested - # first byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe - # second byte range: 0x40 -- 0x7e, 0x81 -- oxfe - # no validation needed here. State machine has done that - first_char, second_char = byte_str[0], byte_str[1] - if (first_char >= 0x81) and (first_char <= 0x9F): - order = 188 * (first_char - 0x81) - elif (first_char >= 0xE0) and (first_char <= 0xEF): - order = 188 * (first_char - 0xE0 + 31) - else: - return -1 - order = order + second_char - 0x40 - if second_char > 0x7F: - order = -1 - return order - - -class EUCJPDistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - super(EUCJPDistributionAnalysis, self).__init__() - self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER - self._table_size = JIS_TABLE_SIZE - self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, byte_str): - # for euc-JP encoding, we are interested - # first byte range: 0xa0 -- 0xfe - # second byte range: 0xa1 -- 0xfe - # no validation needed here. State machine has done that - char = byte_str[0] - if char >= 0xA0: - return 94 * (char - 0xA1) + byte_str[1] - 0xa1 - else: - return -1 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/charsetgroupprober.py b/env/lib/python3.7/site-packages/pip/_vendor/chardet/charsetgroupprober.py deleted file mode 100644 index 8b3738e..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/chardet/charsetgroupprober.py +++ /dev/null @@ -1,106 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .enums import ProbingState -from .charsetprober import CharSetProber - - -class CharSetGroupProber(CharSetProber): - def __init__(self, lang_filter=None): - super(CharSetGroupProber, self).__init__(lang_filter=lang_filter) - self._active_num = 0 - self.probers = [] - self._best_guess_prober = None - - def reset(self): - super(CharSetGroupProber, self).reset() - self._active_num = 0 - for prober in self.probers: - if prober: - prober.reset() - prober.active = True - self._active_num += 1 - self._best_guess_prober = None - - @property - def charset_name(self): - if not self._best_guess_prober: - self.get_confidence() - if not self._best_guess_prober: - return None - return self._best_guess_prober.charset_name - - @property - def language(self): - if not self._best_guess_prober: - self.get_confidence() - if not self._best_guess_prober: - return None - return self._best_guess_prober.language - - def feed(self, byte_str): - for prober in self.probers: - if not prober: - continue - if not prober.active: - continue - state = prober.feed(byte_str) - if not state: - continue - if state == ProbingState.FOUND_IT: - self._best_guess_prober = prober - return self.state - elif state == ProbingState.NOT_ME: - prober.active = False - self._active_num -= 1 - if self._active_num <= 0: - self._state = ProbingState.NOT_ME - return self.state - return self.state - - def get_confidence(self): - state = self.state - if state == ProbingState.FOUND_IT: - return 0.99 - elif state == ProbingState.NOT_ME: - return 0.01 - best_conf = 0.0 - self._best_guess_prober = None - for prober in self.probers: - if not prober: - continue - if not prober.active: - self.logger.debug('%s not active', prober.charset_name) - continue - conf = prober.get_confidence() - self.logger.debug('%s %s confidence = %s', prober.charset_name, prober.language, conf) - if best_conf < conf: - best_conf = conf - self._best_guess_prober = prober - if not self._best_guess_prober: - return 0.0 - return best_conf diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/charsetprober.py b/env/lib/python3.7/site-packages/pip/_vendor/chardet/charsetprober.py deleted file mode 100644 index eac4e59..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/chardet/charsetprober.py +++ /dev/null @@ -1,145 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -import logging -import re - -from .enums import ProbingState - - -class CharSetProber(object): - - SHORTCUT_THRESHOLD = 0.95 - - def __init__(self, lang_filter=None): - self._state = None - self.lang_filter = lang_filter - self.logger = logging.getLogger(__name__) - - def reset(self): - self._state = ProbingState.DETECTING - - @property - def charset_name(self): - return None - - def feed(self, buf): - pass - - @property - def state(self): - return self._state - - def get_confidence(self): - return 0.0 - - @staticmethod - def filter_high_byte_only(buf): - buf = re.sub(b'([\x00-\x7F])+', b' ', buf) - return buf - - @staticmethod - def filter_international_words(buf): - """ - We define three types of bytes: - alphabet: english alphabets [a-zA-Z] - international: international characters [\x80-\xFF] - marker: everything else [^a-zA-Z\x80-\xFF] - - The input buffer can be thought to contain a series of words delimited - by markers. This function works to filter all words that contain at - least one international character. All contiguous sequences of markers - are replaced by a single space ascii character. - - This filter applies to all scripts which do not use English characters. - """ - filtered = bytearray() - - # This regex expression filters out only words that have at-least one - # international character. The word may include one marker character at - # the end. - words = re.findall(b'[a-zA-Z]*[\x80-\xFF]+[a-zA-Z]*[^a-zA-Z\x80-\xFF]?', - buf) - - for word in words: - filtered.extend(word[:-1]) - - # If the last character in the word is a marker, replace it with a - # space as markers shouldn't affect our analysis (they are used - # similarly across all languages and may thus have similar - # frequencies). - last_char = word[-1:] - if not last_char.isalpha() and last_char < b'\x80': - last_char = b' ' - filtered.extend(last_char) - - return filtered - - @staticmethod - def filter_with_english_letters(buf): - """ - Returns a copy of ``buf`` that retains only the sequences of English - alphabet and high byte characters that are not between <> characters. - Also retains English alphabet and high byte characters immediately - before occurrences of >. - - This filter can be applied to all scripts which contain both English - characters and extended ASCII characters, but is currently only used by - ``Latin1Prober``. - """ - filtered = bytearray() - in_tag = False - prev = 0 - - for curr in range(len(buf)): - # Slice here to get bytes instead of an int with Python 3 - buf_char = buf[curr:curr + 1] - # Check if we're coming out of or entering an HTML tag - if buf_char == b'>': - in_tag = False - elif buf_char == b'<': - in_tag = True - - # If current character is not extended-ASCII and not alphabetic... - if buf_char < b'\x80' and not buf_char.isalpha(): - # ...and we're not in a tag - if curr > prev and not in_tag: - # Keep everything after last non-extended-ASCII, - # non-alphabetic character - filtered.extend(buf[prev:curr]) - # Output a space to delimit stretch we kept - filtered.extend(b' ') - prev = curr + 1 - - # If we're not in a tag... - if not in_tag: - # Keep everything after last non-extended-ASCII, non-alphabetic - # character - filtered.extend(buf[prev:]) - - return filtered diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__init__.py b/env/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__init__.py deleted file mode 100644 index 8b13789..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__init__.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index eaaa54340d12ecb2384987e1dea4b80743982b20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 152 zcmZ?b<>g`kg1p5Nv5Y|aF^B^LAOQy;E@lA|DGb33nv8xc8Hzx{2;!Hceo1bDenDn| zZf0I_Nn%cpZc1TgUWH*=21pQ$<I7U>Qu2%RlQR;FQc_FwlXEil<Kr{)GE3s)^$IF) TaoFVMr<CTT+JTJz48#lo!_p-> diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-37.pyc deleted file mode 100644 index c9d159bab282421ff035c4f159fb6125616e01fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2641 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 Jj;=J^e*w204;KIc diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/cli/chardetect.py b/env/lib/python3.7/site-packages/pip/_vendor/chardet/cli/chardetect.py deleted file mode 100644 index c61136b..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/chardet/cli/chardetect.py +++ /dev/null @@ -1,85 +0,0 @@ -#!/usr/bin/env python -""" -Script which takes one or more file paths and reports on their detected -encodings - -Example:: - - % chardetect somefile someotherfile - somefile: windows-1252 with confidence 0.5 - someotherfile: ascii with confidence 1.0 - -If no paths are provided, it takes its input from stdin. - -""" - -from __future__ import absolute_import, print_function, unicode_literals - -import argparse -import sys - -from pip._vendor.chardet import __version__ -from pip._vendor.chardet.compat import PY2 -from pip._vendor.chardet.universaldetector import UniversalDetector - - -def description_of(lines, name='stdin'): - """ - Return a string describing the probable encoding of a file or - list of strings. - - :param lines: The lines to get the encoding of. - :type lines: Iterable of bytes - :param name: Name of file or collection of lines - :type name: str - """ - u = UniversalDetector() - for line in lines: - line = bytearray(line) - u.feed(line) - # shortcut out of the loop to save reading further - particularly useful if we read a BOM. - if u.done: - break - u.close() - result = u.result - if PY2: - name = name.decode(sys.getfilesystemencoding(), 'ignore') - if result['encoding']: - return '{0}: {1} with confidence {2}'.format(name, result['encoding'], - result['confidence']) - else: - return '{0}: no result'.format(name) - - -def main(argv=None): - """ - Handles command line arguments and gets things started. - - :param argv: List of arguments, as if specified on the command-line. - If None, ``sys.argv[1:]`` is used instead. - :type argv: list of str - """ - # Get command line arguments - parser = argparse.ArgumentParser( - description="Takes one or more file paths and reports their detected \ - encodings") - parser.add_argument('input', - help='File whose encoding we would like to determine. \ - (default: stdin)', - type=argparse.FileType('rb'), nargs='*', - default=[sys.stdin if PY2 else sys.stdin.buffer]) - parser.add_argument('--version', action='version', - version='%(prog)s {0}'.format(__version__)) - args = parser.parse_args(argv) - - for f in args.input: - if f.isatty(): - print("You are running chardetect interactively. Press " + - "CTRL-D twice at the start of a blank line to signal the " + - "end of your input. If you want help, run chardetect " + - "--help\n", file=sys.stderr) - print(description_of(f, f.name)) - - -if __name__ == '__main__': - main() diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/codingstatemachine.py b/env/lib/python3.7/site-packages/pip/_vendor/chardet/codingstatemachine.py deleted file mode 100644 index 68fba44..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/chardet/codingstatemachine.py +++ /dev/null @@ -1,88 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -import logging - -from .enums import MachineState - - -class CodingStateMachine(object): - """ - A state machine to verify a byte sequence for a particular encoding. For - each byte the detector receives, it will feed that byte to every active - state machine available, one byte at a time. The state machine changes its - state based on its previous state and the byte it receives. There are 3 - states in a state machine that are of interest to an auto-detector: - - START state: This is the state to start with, or a legal byte sequence - (i.e. a valid code point) for character has been identified. - - ME state: This indicates that the state machine identified a byte sequence - that is specific to the charset it is designed for and that - there is no other possible encoding which can contain this byte - sequence. This will to lead to an immediate positive answer for - the detector. - - ERROR state: This indicates the state machine identified an illegal byte - sequence for that encoding. This will lead to an immediate - negative answer for this encoding. Detector will exclude this - encoding from consideration from here on. - """ - def __init__(self, sm): - self._model = sm - self._curr_byte_pos = 0 - self._curr_char_len = 0 - self._curr_state = None - self.logger = logging.getLogger(__name__) - self.reset() - - def reset(self): - self._curr_state = MachineState.START - - def next_state(self, c): - # for each byte we get its class - # if it is first byte, we also get byte length - byte_class = self._model['class_table'][c] - if self._curr_state == MachineState.START: - self._curr_byte_pos = 0 - self._curr_char_len = self._model['char_len_table'][byte_class] - # from byte's class and state_table, we get its next state - curr_state = (self._curr_state * self._model['class_factor'] - + byte_class) - self._curr_state = self._model['state_table'][curr_state] - self._curr_byte_pos += 1 - return self._curr_state - - def get_current_charlen(self): - return self._curr_char_len - - def get_coding_state_machine(self): - return self._model['name'] - - @property - def language(self): - return self._model['language'] diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/compat.py b/env/lib/python3.7/site-packages/pip/_vendor/chardet/compat.py deleted file mode 100644 index ddd7468..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/chardet/compat.py +++ /dev/null @@ -1,34 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# Contributor(s): -# Dan Blanchard -# Ian Cordasco -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -import sys - - -if sys.version_info < (3, 0): - PY2 = True - PY3 = False - base_str = (str, unicode) - text_type = unicode -else: - PY2 = False - PY3 = True - base_str = (bytes, str) - text_type = str diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/cp949prober.py b/env/lib/python3.7/site-packages/pip/_vendor/chardet/cp949prober.py deleted file mode 100644 index efd793a..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/chardet/cp949prober.py +++ /dev/null @@ -1,49 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .chardistribution import EUCKRDistributionAnalysis -from .codingstatemachine import CodingStateMachine -from .mbcharsetprober import MultiByteCharSetProber -from .mbcssm import CP949_SM_MODEL - - -class CP949Prober(MultiByteCharSetProber): - def __init__(self): - super(CP949Prober, self).__init__() - self.coding_sm = CodingStateMachine(CP949_SM_MODEL) - # NOTE: CP949 is a superset of EUC-KR, so the distribution should be - # not different. - self.distribution_analyzer = EUCKRDistributionAnalysis() - self.reset() - - @property - def charset_name(self): - return "CP949" - - @property - def language(self): - return "Korean" diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/enums.py b/env/lib/python3.7/site-packages/pip/_vendor/chardet/enums.py deleted file mode 100644 index 0451207..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/chardet/enums.py +++ /dev/null @@ -1,76 +0,0 @@ -""" -All of the Enums that are used throughout the chardet package. - -:author: Dan Blanchard (dan.blanchard@gmail.com) -""" - - -class InputState(object): - """ - This enum represents the different states a universal detector can be in. - """ - PURE_ASCII = 0 - ESC_ASCII = 1 - HIGH_BYTE = 2 - - -class LanguageFilter(object): - """ - This enum represents the different language filters we can apply to a - ``UniversalDetector``. - """ - CHINESE_SIMPLIFIED = 0x01 - CHINESE_TRADITIONAL = 0x02 - JAPANESE = 0x04 - KOREAN = 0x08 - NON_CJK = 0x10 - ALL = 0x1F - CHINESE = CHINESE_SIMPLIFIED | CHINESE_TRADITIONAL - CJK = CHINESE | JAPANESE | KOREAN - - -class ProbingState(object): - """ - This enum represents the different states a prober can be in. - """ - DETECTING = 0 - FOUND_IT = 1 - NOT_ME = 2 - - -class MachineState(object): - """ - This enum represents the different states a state machine can be in. - """ - START = 0 - ERROR = 1 - ITS_ME = 2 - - -class SequenceLikelihood(object): - """ - This enum represents the likelihood of a character following the previous one. - """ - NEGATIVE = 0 - UNLIKELY = 1 - LIKELY = 2 - POSITIVE = 3 - - @classmethod - def get_num_categories(cls): - """:returns: The number of likelihood categories in the enum.""" - return 4 - - -class CharacterCategory(object): - """ - This enum represents the different categories language models for - ``SingleByteCharsetProber`` put characters into. - - Anything less than CONTROL is considered a letter. - """ - UNDEFINED = 255 - LINE_BREAK = 254 - SYMBOL = 253 - DIGIT = 252 - CONTROL = 251 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/escprober.py b/env/lib/python3.7/site-packages/pip/_vendor/chardet/escprober.py deleted file mode 100644 index c70493f..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/chardet/escprober.py +++ /dev/null @@ -1,101 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .charsetprober import CharSetProber -from .codingstatemachine import CodingStateMachine -from .enums import LanguageFilter, ProbingState, MachineState -from .escsm import (HZ_SM_MODEL, ISO2022CN_SM_MODEL, ISO2022JP_SM_MODEL, - ISO2022KR_SM_MODEL) - - -class EscCharSetProber(CharSetProber): - """ - This CharSetProber uses a "code scheme" approach for detecting encodings, - whereby easily recognizable escape or shift sequences are relied on to - identify these encodings. - """ - - def __init__(self, lang_filter=None): - super(EscCharSetProber, self).__init__(lang_filter=lang_filter) - self.coding_sm = [] - if self.lang_filter & LanguageFilter.CHINESE_SIMPLIFIED: - self.coding_sm.append(CodingStateMachine(HZ_SM_MODEL)) - self.coding_sm.append(CodingStateMachine(ISO2022CN_SM_MODEL)) - if self.lang_filter & LanguageFilter.JAPANESE: - self.coding_sm.append(CodingStateMachine(ISO2022JP_SM_MODEL)) - if self.lang_filter & LanguageFilter.KOREAN: - self.coding_sm.append(CodingStateMachine(ISO2022KR_SM_MODEL)) - self.active_sm_count = None - self._detected_charset = None - self._detected_language = None - self._state = None - self.reset() - - def reset(self): - super(EscCharSetProber, self).reset() - for coding_sm in self.coding_sm: - if not coding_sm: - continue - coding_sm.active = True - coding_sm.reset() - self.active_sm_count = len(self.coding_sm) - self._detected_charset = None - self._detected_language = None - - @property - def charset_name(self): - return self._detected_charset - - @property - def language(self): - return self._detected_language - - def get_confidence(self): - if self._detected_charset: - return 0.99 - else: - return 0.00 - - def feed(self, byte_str): - for c in byte_str: - for coding_sm in self.coding_sm: - if not coding_sm or not coding_sm.active: - continue - coding_state = coding_sm.next_state(c) - if coding_state == MachineState.ERROR: - coding_sm.active = False - self.active_sm_count -= 1 - if self.active_sm_count <= 0: - self._state = ProbingState.NOT_ME - return self.state - elif coding_state == MachineState.ITS_ME: - self._state = ProbingState.FOUND_IT - self._detected_charset = coding_sm.get_coding_state_machine() - self._detected_language = coding_sm.language - return self.state - - return self.state diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/escsm.py b/env/lib/python3.7/site-packages/pip/_vendor/chardet/escsm.py deleted file mode 100644 index 0069523..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/chardet/escsm.py +++ /dev/null @@ -1,246 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .enums import MachineState - -HZ_CLS = ( -1,0,0,0,0,0,0,0, # 00 - 07 -0,0,0,0,0,0,0,0, # 08 - 0f -0,0,0,0,0,0,0,0, # 10 - 17 -0,0,0,1,0,0,0,0, # 18 - 1f -0,0,0,0,0,0,0,0, # 20 - 27 -0,0,0,0,0,0,0,0, # 28 - 2f -0,0,0,0,0,0,0,0, # 30 - 37 -0,0,0,0,0,0,0,0, # 38 - 3f -0,0,0,0,0,0,0,0, # 40 - 47 -0,0,0,0,0,0,0,0, # 48 - 4f -0,0,0,0,0,0,0,0, # 50 - 57 -0,0,0,0,0,0,0,0, # 58 - 5f -0,0,0,0,0,0,0,0, # 60 - 67 -0,0,0,0,0,0,0,0, # 68 - 6f -0,0,0,0,0,0,0,0, # 70 - 77 -0,0,0,4,0,5,2,0, # 78 - 7f -1,1,1,1,1,1,1,1, # 80 - 87 -1,1,1,1,1,1,1,1, # 88 - 8f -1,1,1,1,1,1,1,1, # 90 - 97 -1,1,1,1,1,1,1,1, # 98 - 9f -1,1,1,1,1,1,1,1, # a0 - a7 -1,1,1,1,1,1,1,1, # a8 - af -1,1,1,1,1,1,1,1, # b0 - b7 -1,1,1,1,1,1,1,1, # b8 - bf -1,1,1,1,1,1,1,1, # c0 - c7 -1,1,1,1,1,1,1,1, # c8 - cf -1,1,1,1,1,1,1,1, # d0 - d7 -1,1,1,1,1,1,1,1, # d8 - df -1,1,1,1,1,1,1,1, # e0 - e7 -1,1,1,1,1,1,1,1, # e8 - ef -1,1,1,1,1,1,1,1, # f0 - f7 -1,1,1,1,1,1,1,1, # f8 - ff -) - -HZ_ST = ( -MachineState.START,MachineState.ERROR, 3,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07 -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f -MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START, 4,MachineState.ERROR,# 10-17 - 5,MachineState.ERROR, 6,MachineState.ERROR, 5, 5, 4,MachineState.ERROR,# 18-1f - 4,MachineState.ERROR, 4, 4, 4,MachineState.ERROR, 4,MachineState.ERROR,# 20-27 - 4,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 28-2f -) - -HZ_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) - -HZ_SM_MODEL = {'class_table': HZ_CLS, - 'class_factor': 6, - 'state_table': HZ_ST, - 'char_len_table': HZ_CHAR_LEN_TABLE, - 'name': "HZ-GB-2312", - 'language': 'Chinese'} - -ISO2022CN_CLS = ( -2,0,0,0,0,0,0,0, # 00 - 07 -0,0,0,0,0,0,0,0, # 08 - 0f -0,0,0,0,0,0,0,0, # 10 - 17 -0,0,0,1,0,0,0,0, # 18 - 1f -0,0,0,0,0,0,0,0, # 20 - 27 -0,3,0,0,0,0,0,0, # 28 - 2f -0,0,0,0,0,0,0,0, # 30 - 37 -0,0,0,0,0,0,0,0, # 38 - 3f -0,0,0,4,0,0,0,0, # 40 - 47 -0,0,0,0,0,0,0,0, # 48 - 4f -0,0,0,0,0,0,0,0, # 50 - 57 -0,0,0,0,0,0,0,0, # 58 - 5f -0,0,0,0,0,0,0,0, # 60 - 67 -0,0,0,0,0,0,0,0, # 68 - 6f -0,0,0,0,0,0,0,0, # 70 - 77 -0,0,0,0,0,0,0,0, # 78 - 7f -2,2,2,2,2,2,2,2, # 80 - 87 -2,2,2,2,2,2,2,2, # 88 - 8f -2,2,2,2,2,2,2,2, # 90 - 97 -2,2,2,2,2,2,2,2, # 98 - 9f -2,2,2,2,2,2,2,2, # a0 - a7 -2,2,2,2,2,2,2,2, # a8 - af -2,2,2,2,2,2,2,2, # b0 - b7 -2,2,2,2,2,2,2,2, # b8 - bf -2,2,2,2,2,2,2,2, # c0 - c7 -2,2,2,2,2,2,2,2, # c8 - cf -2,2,2,2,2,2,2,2, # d0 - d7 -2,2,2,2,2,2,2,2, # d8 - df -2,2,2,2,2,2,2,2, # e0 - e7 -2,2,2,2,2,2,2,2, # e8 - ef -2,2,2,2,2,2,2,2, # f0 - f7 -2,2,2,2,2,2,2,2, # f8 - ff -) - -ISO2022CN_ST = ( -MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07 -MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f -MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17 -MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,# 18-1f -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 20-27 - 5, 6,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 28-2f -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 30-37 -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,# 38-3f -) - -ISO2022CN_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0) - -ISO2022CN_SM_MODEL = {'class_table': ISO2022CN_CLS, - 'class_factor': 9, - 'state_table': ISO2022CN_ST, - 'char_len_table': ISO2022CN_CHAR_LEN_TABLE, - 'name': "ISO-2022-CN", - 'language': 'Chinese'} - -ISO2022JP_CLS = ( -2,0,0,0,0,0,0,0, # 00 - 07 -0,0,0,0,0,0,2,2, # 08 - 0f -0,0,0,0,0,0,0,0, # 10 - 17 -0,0,0,1,0,0,0,0, # 18 - 1f -0,0,0,0,7,0,0,0, # 20 - 27 -3,0,0,0,0,0,0,0, # 28 - 2f -0,0,0,0,0,0,0,0, # 30 - 37 -0,0,0,0,0,0,0,0, # 38 - 3f -6,0,4,0,8,0,0,0, # 40 - 47 -0,9,5,0,0,0,0,0, # 48 - 4f -0,0,0,0,0,0,0,0, # 50 - 57 -0,0,0,0,0,0,0,0, # 58 - 5f -0,0,0,0,0,0,0,0, # 60 - 67 -0,0,0,0,0,0,0,0, # 68 - 6f -0,0,0,0,0,0,0,0, # 70 - 77 -0,0,0,0,0,0,0,0, # 78 - 7f -2,2,2,2,2,2,2,2, # 80 - 87 -2,2,2,2,2,2,2,2, # 88 - 8f -2,2,2,2,2,2,2,2, # 90 - 97 -2,2,2,2,2,2,2,2, # 98 - 9f -2,2,2,2,2,2,2,2, # a0 - a7 -2,2,2,2,2,2,2,2, # a8 - af -2,2,2,2,2,2,2,2, # b0 - b7 -2,2,2,2,2,2,2,2, # b8 - bf -2,2,2,2,2,2,2,2, # c0 - c7 -2,2,2,2,2,2,2,2, # c8 - cf -2,2,2,2,2,2,2,2, # d0 - d7 -2,2,2,2,2,2,2,2, # d8 - df -2,2,2,2,2,2,2,2, # e0 - e7 -2,2,2,2,2,2,2,2, # e8 - ef -2,2,2,2,2,2,2,2, # f0 - f7 -2,2,2,2,2,2,2,2, # f8 - ff -) - -ISO2022JP_ST = ( -MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07 -MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17 -MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,# 18-1f -MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,MachineState.ERROR,# 20-27 -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 6,MachineState.ITS_ME,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,# 28-2f -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,# 30-37 -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 38-3f -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.START,# 40-47 -) - -ISO2022JP_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) - -ISO2022JP_SM_MODEL = {'class_table': ISO2022JP_CLS, - 'class_factor': 10, - 'state_table': ISO2022JP_ST, - 'char_len_table': ISO2022JP_CHAR_LEN_TABLE, - 'name': "ISO-2022-JP", - 'language': 'Japanese'} - -ISO2022KR_CLS = ( -2,0,0,0,0,0,0,0, # 00 - 07 -0,0,0,0,0,0,0,0, # 08 - 0f -0,0,0,0,0,0,0,0, # 10 - 17 -0,0,0,1,0,0,0,0, # 18 - 1f -0,0,0,0,3,0,0,0, # 20 - 27 -0,4,0,0,0,0,0,0, # 28 - 2f -0,0,0,0,0,0,0,0, # 30 - 37 -0,0,0,0,0,0,0,0, # 38 - 3f -0,0,0,5,0,0,0,0, # 40 - 47 -0,0,0,0,0,0,0,0, # 48 - 4f -0,0,0,0,0,0,0,0, # 50 - 57 -0,0,0,0,0,0,0,0, # 58 - 5f -0,0,0,0,0,0,0,0, # 60 - 67 -0,0,0,0,0,0,0,0, # 68 - 6f -0,0,0,0,0,0,0,0, # 70 - 77 -0,0,0,0,0,0,0,0, # 78 - 7f -2,2,2,2,2,2,2,2, # 80 - 87 -2,2,2,2,2,2,2,2, # 88 - 8f -2,2,2,2,2,2,2,2, # 90 - 97 -2,2,2,2,2,2,2,2, # 98 - 9f -2,2,2,2,2,2,2,2, # a0 - a7 -2,2,2,2,2,2,2,2, # a8 - af -2,2,2,2,2,2,2,2, # b0 - b7 -2,2,2,2,2,2,2,2, # b8 - bf -2,2,2,2,2,2,2,2, # c0 - c7 -2,2,2,2,2,2,2,2, # c8 - cf -2,2,2,2,2,2,2,2, # d0 - d7 -2,2,2,2,2,2,2,2, # d8 - df -2,2,2,2,2,2,2,2, # e0 - e7 -2,2,2,2,2,2,2,2, # e8 - ef -2,2,2,2,2,2,2,2, # f0 - f7 -2,2,2,2,2,2,2,2, # f8 - ff -) - -ISO2022KR_ST = ( -MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07 -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f -MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,MachineState.ERROR,# 10-17 -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 18-1f -MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 20-27 -) - -ISO2022KR_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) - -ISO2022KR_SM_MODEL = {'class_table': ISO2022KR_CLS, - 'class_factor': 6, - 'state_table': ISO2022KR_ST, - 'char_len_table': ISO2022KR_CHAR_LEN_TABLE, - 'name': "ISO-2022-KR", - 'language': 'Korean'} - - diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/eucjpprober.py b/env/lib/python3.7/site-packages/pip/_vendor/chardet/eucjpprober.py deleted file mode 100644 index 20ce8f7..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/chardet/eucjpprober.py +++ /dev/null @@ -1,92 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .enums import ProbingState, MachineState -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import EUCJPDistributionAnalysis -from .jpcntx import EUCJPContextAnalysis -from .mbcssm import EUCJP_SM_MODEL - - -class EUCJPProber(MultiByteCharSetProber): - def __init__(self): - super(EUCJPProber, self).__init__() - self.coding_sm = CodingStateMachine(EUCJP_SM_MODEL) - self.distribution_analyzer = EUCJPDistributionAnalysis() - self.context_analyzer = EUCJPContextAnalysis() - self.reset() - - def reset(self): - super(EUCJPProber, self).reset() - self.context_analyzer.reset() - - @property - def charset_name(self): - return "EUC-JP" - - @property - def language(self): - return "Japanese" - - def feed(self, byte_str): - for i in range(len(byte_str)): - # PY3K: byte_str is a byte array, so byte_str[i] is an int, not a byte - coding_state = self.coding_sm.next_state(byte_str[i]) - if coding_state == MachineState.ERROR: - self.logger.debug('%s %s prober hit error at byte %s', - self.charset_name, self.language, i) - self._state = ProbingState.NOT_ME - break - elif coding_state == MachineState.ITS_ME: - self._state = ProbingState.FOUND_IT - break - elif coding_state == MachineState.START: - char_len = self.coding_sm.get_current_charlen() - if i == 0: - self._last_char[1] = byte_str[0] - self.context_analyzer.feed(self._last_char, char_len) - self.distribution_analyzer.feed(self._last_char, char_len) - else: - self.context_analyzer.feed(byte_str[i - 1:i + 1], - char_len) - self.distribution_analyzer.feed(byte_str[i - 1:i + 1], - char_len) - - self._last_char[0] = byte_str[-1] - - if self.state == ProbingState.DETECTING: - if (self.context_analyzer.got_enough_data() and - (self.get_confidence() > self.SHORTCUT_THRESHOLD)): - self._state = ProbingState.FOUND_IT - - return self.state - - def get_confidence(self): - context_conf = self.context_analyzer.get_confidence() - distrib_conf = self.distribution_analyzer.get_confidence() - return max(context_conf, distrib_conf) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/euckrfreq.py b/env/lib/python3.7/site-packages/pip/_vendor/chardet/euckrfreq.py deleted file mode 100644 index b68078c..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/chardet/euckrfreq.py +++ /dev/null @@ -1,195 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# Sampling from about 20M text materials include literature and computer technology - -# 128 --> 0.79 -# 256 --> 0.92 -# 512 --> 0.986 -# 1024 --> 0.99944 -# 2048 --> 0.99999 -# -# Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24 -# Random Distribution Ration = 512 / (2350-512) = 0.279. -# -# Typical Distribution Ratio - -EUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0 - -EUCKR_TABLE_SIZE = 2352 - -# Char to FreqOrder table , -EUCKR_CHAR_TO_FREQ_ORDER = ( - 13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722, 87, -1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398, -1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488, 20,1733,1269,1734, - 945,1400,1735, 47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739, - 116, 987, 813,1401, 683, 75,1204, 145,1740,1741,1742,1743, 16, 847, 667, 622, - 708,1744,1745,1746, 966, 787, 304, 129,1747, 60, 820, 123, 676,1748,1749,1750, -1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856, - 344,1763,1764,1765,1766, 89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205, - 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779, -1780, 337, 751,1058, 28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782, 19, -1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567, -1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797, -1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802, -1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899, - 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818, -1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409, -1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697, -1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770, -1412,1837,1838, 39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723, - 544,1023,1081, 869, 91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416, -1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300, - 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083, - 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857, -1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871, - 282, 96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420, -1421, 268,1877,1422,1878,1879,1880, 308,1881, 2, 537,1882,1883,1215,1884,1885, - 127, 791,1886,1273,1423,1887, 34, 336, 404, 643,1888, 571, 654, 894, 840,1889, - 0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893, -1894,1123, 48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317, -1899, 694,1900, 909, 734,1424, 572, 866,1425, 691, 85, 524,1010, 543, 394, 841, -1901,1902,1903,1026,1904,1905,1906,1907,1908,1909, 30, 451, 651, 988, 310,1910, -1911,1426, 810,1216, 93,1912,1913,1277,1217,1914, 858, 759, 45, 58, 181, 610, - 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375, -1919, 359,1920, 687,1921, 822,1922, 293,1923,1924, 40, 662, 118, 692, 29, 939, - 887, 640, 482, 174,1925, 69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870, - 217, 854,1163, 823,1927,1928,1929,1930, 834,1931, 78,1932, 859,1933,1063,1934, -1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888, -1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950, -1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065, -1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002, -1283,1222,1960,1961,1962,1963, 36, 383, 228, 753, 247, 454,1964, 876, 678,1965, -1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467, - 50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285, - 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971, 7, - 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979, -1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985, - 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994, -1995, 560, 223,1287, 98, 8, 189, 650, 978,1288,1996,1437,1997, 17, 345, 250, - 423, 277, 234, 512, 226, 97, 289, 42, 167,1998, 201,1999,2000, 843, 836, 824, - 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003, -2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008, 71,1440, 745, - 619, 688,2009, 829,2010,2011, 147,2012, 33, 948,2013,2014, 74, 224,2015, 61, - 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023, -2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591, 52, 724, 246,2031,2032, -2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912, -2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224, - 719,1170, 959, 440, 437, 534, 84, 388, 480,1131, 159, 220, 198, 679,2044,1012, - 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050, -2051,2052,2053, 59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681, - 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414, -1444,2064,2065, 41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068, -2069,1292,2070,2071,1445,2072,1446,2073,2074, 55, 588, 66,1447, 271,1092,2075, -1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850, -2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606, -2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449, -1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452, - 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112, -2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121, -2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130, - 22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174, 73,1096, 231, 274, - 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139, -2141,2142,2143,2144, 11, 374, 844,2145, 154,1232, 46,1461,2146, 838, 830, 721, -1233, 106,2147, 90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298, -2150,1462, 761, 565,2151, 686,2152, 649,2153, 72, 173,2154, 460, 415,2155,1463, -2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747, -2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177, 23, 530, 285, -2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187, -2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193, 10, -2194, 613, 424,2195, 979, 108, 449, 589, 27, 172, 81,1031, 80, 774, 281, 350, -1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201, -2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972, -2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219, -2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233, -2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242, -2243, 521, 486, 548,2244,2245,2246,1473,1300, 53, 549, 137, 875, 76, 158,2247, -1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178, -1475,2249, 82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255, -2256, 18, 450, 206,2257, 290, 292,1142,2258, 511, 162, 99, 346, 164, 735,2259, -1476,1477, 4, 554, 343, 798,1099,2260,1100,2261, 43, 171,1303, 139, 215,2262, -2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702, -1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272, 67,2273, - 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541, -2282,2283,2284,2285,2286, 70, 852,1071,2287,2288,2289,2290, 21, 56, 509, 117, - 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187, -2294,1046,1479,2295, 340,2296, 63,1047, 230,2297,2298,1305, 763,1306, 101, 800, - 808, 494,2299,2300,2301, 903,2302, 37,1072, 14, 5,2303, 79, 675,2304, 312, -2305,2306,2307,2308,2309,1480, 6,1307,2310,2311,2312, 1, 470, 35, 24, 229, -2313, 695, 210, 86, 778, 15, 784, 592, 779, 32, 77, 855, 964,2314, 259,2315, - 501, 380,2316,2317, 83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484, -2320,2321,2322,2323,2324,2325,1485,2326,2327, 128, 57, 68, 261,1048, 211, 170, -1240, 31,2328, 51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335, - 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601, -1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395, -2351,1490,1491, 62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354, -1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476, -2361,2362, 332, 12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035, - 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498, -2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310, -1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389, -2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504, -1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505, -2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145, -1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624, - 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700, -2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221, -2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377, - 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448, - 915, 489,2449,1514,1184,2450,2451, 515, 64, 427, 495,2452, 583,2453, 483, 485, -1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705, -1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465, - 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471, -2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997, -2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486, - 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187, 65,2494, - 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771, - 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323, -2499,2500, 49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491, - 95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510, - 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519, -2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532, -2533, 25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199, - 704, 504, 468, 758, 657,1528, 196, 44, 839,1246, 272, 750,2543, 765, 862,2544, -2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247, -1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441, - 249,1075,2556,2557,2558, 466, 743,2559,2560,2561, 92, 514, 426, 420, 526,2562, -2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362, -2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583, -2584,1532, 54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465, - 3, 458, 9, 38,2588, 107, 110, 890, 209, 26, 737, 498,2589,1534,2590, 431, - 202, 88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151, - 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596, -2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601, 94, 175, 197, 406, -2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611, -2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619, -1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628, -2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042, - 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642, # 512, 256 -) - diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/euckrprober.py b/env/lib/python3.7/site-packages/pip/_vendor/chardet/euckrprober.py deleted file mode 100644 index 345a060..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/chardet/euckrprober.py +++ /dev/null @@ -1,47 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import EUCKRDistributionAnalysis -from .mbcssm import EUCKR_SM_MODEL - - -class EUCKRProber(MultiByteCharSetProber): - def __init__(self): - super(EUCKRProber, self).__init__() - self.coding_sm = CodingStateMachine(EUCKR_SM_MODEL) - self.distribution_analyzer = EUCKRDistributionAnalysis() - self.reset() - - @property - def charset_name(self): - return "EUC-KR" - - @property - def language(self): - return "Korean" diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/euctwfreq.py b/env/lib/python3.7/site-packages/pip/_vendor/chardet/euctwfreq.py deleted file mode 100644 index ed7a995..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/chardet/euctwfreq.py +++ /dev/null @@ -1,387 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# EUCTW frequency table -# Converted from big5 work -# by Taiwan's Mandarin Promotion Council -# <http:#www.edu.tw:81/mandr/> - -# 128 --> 0.42261 -# 256 --> 0.57851 -# 512 --> 0.74851 -# 1024 --> 0.89384 -# 2048 --> 0.97583 -# -# Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98 -# Random Distribution Ration = 512/(5401-512)=0.105 -# -# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR - -EUCTW_TYPICAL_DISTRIBUTION_RATIO = 0.75 - -# Char to FreqOrder table , -EUCTW_TABLE_SIZE = 5376 - -EUCTW_CHAR_TO_FREQ_ORDER = ( - 1,1800,1506, 255,1431, 198, 9, 82, 6,7310, 177, 202,3615,1256,2808, 110, # 2742 -3735, 33,3241, 261, 76, 44,2113, 16,2931,2184,1176, 659,3868, 26,3404,2643, # 2758 -1198,3869,3313,4060, 410,2211, 302, 590, 361,1963, 8, 204, 58,4296,7311,1931, # 2774 - 63,7312,7313, 317,1614, 75, 222, 159,4061,2412,1480,7314,3500,3068, 224,2809, # 2790 -3616, 3, 10,3870,1471, 29,2774,1135,2852,1939, 873, 130,3242,1123, 312,7315, # 2806 -4297,2051, 507, 252, 682,7316, 142,1914, 124, 206,2932, 34,3501,3173, 64, 604, # 2822 -7317,2494,1976,1977, 155,1990, 645, 641,1606,7318,3405, 337, 72, 406,7319, 80, # 2838 - 630, 238,3174,1509, 263, 939,1092,2644, 756,1440,1094,3406, 449, 69,2969, 591, # 2854 - 179,2095, 471, 115,2034,1843, 60, 50,2970, 134, 806,1868, 734,2035,3407, 180, # 2870 - 995,1607, 156, 537,2893, 688,7320, 319,1305, 779,2144, 514,2374, 298,4298, 359, # 2886 -2495, 90,2707,1338, 663, 11, 906,1099,2545, 20,2436, 182, 532,1716,7321, 732, # 2902 -1376,4062,1311,1420,3175, 25,2312,1056, 113, 399, 382,1949, 242,3408,2467, 529, # 2918 -3243, 475,1447,3617,7322, 117, 21, 656, 810,1297,2295,2329,3502,7323, 126,4063, # 2934 - 706, 456, 150, 613,4299, 71,1118,2036,4064, 145,3069, 85, 835, 486,2114,1246, # 2950 -1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,7324,2127,2354, 347,3736, 221, # 2966 -3503,3110,7325,1955,1153,4065, 83, 296,1199,3070, 192, 624, 93,7326, 822,1897, # 2982 -2810,3111, 795,2064, 991,1554,1542,1592, 27, 43,2853, 859, 139,1456, 860,4300, # 2998 - 437, 712,3871, 164,2392,3112, 695, 211,3017,2096, 195,3872,1608,3504,3505,3618, # 3014 -3873, 234, 811,2971,2097,3874,2229,1441,3506,1615,2375, 668,2076,1638, 305, 228, # 3030 -1664,4301, 467, 415,7327, 262,2098,1593, 239, 108, 300, 200,1033, 512,1247,2077, # 3046 -7328,7329,2173,3176,3619,2673, 593, 845,1062,3244, 88,1723,2037,3875,1950, 212, # 3062 - 266, 152, 149, 468,1898,4066,4302, 77, 187,7330,3018, 37, 5,2972,7331,3876, # 3078 -7332,7333, 39,2517,4303,2894,3177,2078, 55, 148, 74,4304, 545, 483,1474,1029, # 3094 -1665, 217,1869,1531,3113,1104,2645,4067, 24, 172,3507, 900,3877,3508,3509,4305, # 3110 - 32,1408,2811,1312, 329, 487,2355,2247,2708, 784,2674, 4,3019,3314,1427,1788, # 3126 - 188, 109, 499,7334,3620,1717,1789, 888,1217,3020,4306,7335,3510,7336,3315,1520, # 3142 -3621,3878, 196,1034, 775,7337,7338, 929,1815, 249, 439, 38,7339,1063,7340, 794, # 3158 -3879,1435,2296, 46, 178,3245,2065,7341,2376,7342, 214,1709,4307, 804, 35, 707, # 3174 - 324,3622,1601,2546, 140, 459,4068,7343,7344,1365, 839, 272, 978,2257,2572,3409, # 3190 -2128,1363,3623,1423, 697, 100,3071, 48, 70,1231, 495,3114,2193,7345,1294,7346, # 3206 -2079, 462, 586,1042,3246, 853, 256, 988, 185,2377,3410,1698, 434,1084,7347,3411, # 3222 - 314,2615,2775,4308,2330,2331, 569,2280, 637,1816,2518, 757,1162,1878,1616,3412, # 3238 - 287,1577,2115, 768,4309,1671,2854,3511,2519,1321,3737, 909,2413,7348,4069, 933, # 3254 -3738,7349,2052,2356,1222,4310, 765,2414,1322, 786,4311,7350,1919,1462,1677,2895, # 3270 -1699,7351,4312,1424,2437,3115,3624,2590,3316,1774,1940,3413,3880,4070, 309,1369, # 3286 -1130,2812, 364,2230,1653,1299,3881,3512,3882,3883,2646, 525,1085,3021, 902,2000, # 3302 -1475, 964,4313, 421,1844,1415,1057,2281, 940,1364,3116, 376,4314,4315,1381, 7, # 3318 -2520, 983,2378, 336,1710,2675,1845, 321,3414, 559,1131,3022,2742,1808,1132,1313, # 3334 - 265,1481,1857,7352, 352,1203,2813,3247, 167,1089, 420,2814, 776, 792,1724,3513, # 3350 -4071,2438,3248,7353,4072,7354, 446, 229, 333,2743, 901,3739,1200,1557,4316,2647, # 3366 -1920, 395,2744,2676,3740,4073,1835, 125, 916,3178,2616,4317,7355,7356,3741,7357, # 3382 -7358,7359,4318,3117,3625,1133,2547,1757,3415,1510,2313,1409,3514,7360,2145, 438, # 3398 -2591,2896,2379,3317,1068, 958,3023, 461, 311,2855,2677,4074,1915,3179,4075,1978, # 3414 - 383, 750,2745,2617,4076, 274, 539, 385,1278,1442,7361,1154,1964, 384, 561, 210, # 3430 - 98,1295,2548,3515,7362,1711,2415,1482,3416,3884,2897,1257, 129,7363,3742, 642, # 3446 - 523,2776,2777,2648,7364, 141,2231,1333, 68, 176, 441, 876, 907,4077, 603,2592, # 3462 - 710, 171,3417, 404, 549, 18,3118,2393,1410,3626,1666,7365,3516,4319,2898,4320, # 3478 -7366,2973, 368,7367, 146, 366, 99, 871,3627,1543, 748, 807,1586,1185, 22,2258, # 3494 - 379,3743,3180,7368,3181, 505,1941,2618,1991,1382,2314,7369, 380,2357, 218, 702, # 3510 -1817,1248,3418,3024,3517,3318,3249,7370,2974,3628, 930,3250,3744,7371, 59,7372, # 3526 - 585, 601,4078, 497,3419,1112,1314,4321,1801,7373,1223,1472,2174,7374, 749,1836, # 3542 - 690,1899,3745,1772,3885,1476, 429,1043,1790,2232,2116, 917,4079, 447,1086,1629, # 3558 -7375, 556,7376,7377,2020,1654, 844,1090, 105, 550, 966,1758,2815,1008,1782, 686, # 3574 -1095,7378,2282, 793,1602,7379,3518,2593,4322,4080,2933,2297,4323,3746, 980,2496, # 3590 - 544, 353, 527,4324, 908,2678,2899,7380, 381,2619,1942,1348,7381,1341,1252, 560, # 3606 -3072,7382,3420,2856,7383,2053, 973, 886,2080, 143,4325,7384,7385, 157,3886, 496, # 3622 -4081, 57, 840, 540,2038,4326,4327,3421,2117,1445, 970,2259,1748,1965,2081,4082, # 3638 -3119,1234,1775,3251,2816,3629, 773,1206,2129,1066,2039,1326,3887,1738,1725,4083, # 3654 - 279,3120, 51,1544,2594, 423,1578,2130,2066, 173,4328,1879,7386,7387,1583, 264, # 3670 - 610,3630,4329,2439, 280, 154,7388,7389,7390,1739, 338,1282,3073, 693,2857,1411, # 3686 -1074,3747,2440,7391,4330,7392,7393,1240, 952,2394,7394,2900,1538,2679, 685,1483, # 3702 -4084,2468,1436, 953,4085,2054,4331, 671,2395, 79,4086,2441,3252, 608, 567,2680, # 3718 -3422,4087,4088,1691, 393,1261,1791,2396,7395,4332,7396,7397,7398,7399,1383,1672, # 3734 -3748,3182,1464, 522,1119, 661,1150, 216, 675,4333,3888,1432,3519, 609,4334,2681, # 3750 -2397,7400,7401,7402,4089,3025, 0,7403,2469, 315, 231,2442, 301,3319,4335,2380, # 3766 -7404, 233,4090,3631,1818,4336,4337,7405, 96,1776,1315,2082,7406, 257,7407,1809, # 3782 -3632,2709,1139,1819,4091,2021,1124,2163,2778,1777,2649,7408,3074, 363,1655,3183, # 3798 -7409,2975,7410,7411,7412,3889,1567,3890, 718, 103,3184, 849,1443, 341,3320,2934, # 3814 -1484,7413,1712, 127, 67, 339,4092,2398, 679,1412, 821,7414,7415, 834, 738, 351, # 3830 -2976,2146, 846, 235,1497,1880, 418,1992,3749,2710, 186,1100,2147,2746,3520,1545, # 3846 -1355,2935,2858,1377, 583,3891,4093,2573,2977,7416,1298,3633,1078,2549,3634,2358, # 3862 - 78,3750,3751, 267,1289,2099,2001,1594,4094, 348, 369,1274,2194,2175,1837,4338, # 3878 -1820,2817,3635,2747,2283,2002,4339,2936,2748, 144,3321, 882,4340,3892,2749,3423, # 3894 -4341,2901,7417,4095,1726, 320,7418,3893,3026, 788,2978,7419,2818,1773,1327,2859, # 3910 -3894,2819,7420,1306,4342,2003,1700,3752,3521,2359,2650, 787,2022, 506, 824,3636, # 3926 - 534, 323,4343,1044,3322,2023,1900, 946,3424,7421,1778,1500,1678,7422,1881,4344, # 3942 - 165, 243,4345,3637,2521, 123, 683,4096, 764,4346, 36,3895,1792, 589,2902, 816, # 3958 - 626,1667,3027,2233,1639,1555,1622,3753,3896,7423,3897,2860,1370,1228,1932, 891, # 3974 -2083,2903, 304,4097,7424, 292,2979,2711,3522, 691,2100,4098,1115,4347, 118, 662, # 3990 -7425, 611,1156, 854,2381,1316,2861, 2, 386, 515,2904,7426,7427,3253, 868,2234, # 4006 -1486, 855,2651, 785,2212,3028,7428,1040,3185,3523,7429,3121, 448,7430,1525,7431, # 4022 -2164,4348,7432,3754,7433,4099,2820,3524,3122, 503, 818,3898,3123,1568, 814, 676, # 4038 -1444, 306,1749,7434,3755,1416,1030, 197,1428, 805,2821,1501,4349,7435,7436,7437, # 4054 -1993,7438,4350,7439,7440,2195, 13,2779,3638,2980,3124,1229,1916,7441,3756,2131, # 4070 -7442,4100,4351,2399,3525,7443,2213,1511,1727,1120,7444,7445, 646,3757,2443, 307, # 4086 -7446,7447,1595,3186,7448,7449,7450,3639,1113,1356,3899,1465,2522,2523,7451, 519, # 4102 -7452, 128,2132, 92,2284,1979,7453,3900,1512, 342,3125,2196,7454,2780,2214,1980, # 4118 -3323,7455, 290,1656,1317, 789, 827,2360,7456,3758,4352, 562, 581,3901,7457, 401, # 4134 -4353,2248, 94,4354,1399,2781,7458,1463,2024,4355,3187,1943,7459, 828,1105,4101, # 4150 -1262,1394,7460,4102, 605,4356,7461,1783,2862,7462,2822, 819,2101, 578,2197,2937, # 4166 -7463,1502, 436,3254,4103,3255,2823,3902,2905,3425,3426,7464,2712,2315,7465,7466, # 4182 -2332,2067, 23,4357, 193, 826,3759,2102, 699,1630,4104,3075, 390,1793,1064,3526, # 4198 -7467,1579,3076,3077,1400,7468,4105,1838,1640,2863,7469,4358,4359, 137,4106, 598, # 4214 -3078,1966, 780, 104, 974,2938,7470, 278, 899, 253, 402, 572, 504, 493,1339,7471, # 4230 -3903,1275,4360,2574,2550,7472,3640,3029,3079,2249, 565,1334,2713, 863, 41,7473, # 4246 -7474,4361,7475,1657,2333, 19, 463,2750,4107, 606,7476,2981,3256,1087,2084,1323, # 4262 -2652,2982,7477,1631,1623,1750,4108,2682,7478,2864, 791,2714,2653,2334, 232,2416, # 4278 -7479,2983,1498,7480,2654,2620, 755,1366,3641,3257,3126,2025,1609, 119,1917,3427, # 4294 - 862,1026,4109,7481,3904,3760,4362,3905,4363,2260,1951,2470,7482,1125, 817,4110, # 4310 -4111,3906,1513,1766,2040,1487,4112,3030,3258,2824,3761,3127,7483,7484,1507,7485, # 4326 -2683, 733, 40,1632,1106,2865, 345,4113, 841,2524, 230,4364,2984,1846,3259,3428, # 4342 -7486,1263, 986,3429,7487, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562,3907, # 4358 -3908,2939, 967,2751,2655,1349, 592,2133,1692,3324,2985,1994,4114,1679,3909,1901, # 4374 -2185,7488, 739,3642,2715,1296,1290,7489,4115,2198,2199,1921,1563,2595,2551,1870, # 4390 -2752,2986,7490, 435,7491, 343,1108, 596, 17,1751,4365,2235,3430,3643,7492,4366, # 4406 - 294,3527,2940,1693, 477, 979, 281,2041,3528, 643,2042,3644,2621,2782,2261,1031, # 4422 -2335,2134,2298,3529,4367, 367,1249,2552,7493,3530,7494,4368,1283,3325,2004, 240, # 4438 -1762,3326,4369,4370, 836,1069,3128, 474,7495,2148,2525, 268,3531,7496,3188,1521, # 4454 -1284,7497,1658,1546,4116,7498,3532,3533,7499,4117,3327,2684,1685,4118, 961,1673, # 4470 -2622, 190,2005,2200,3762,4371,4372,7500, 570,2497,3645,1490,7501,4373,2623,3260, # 4486 -1956,4374, 584,1514, 396,1045,1944,7502,4375,1967,2444,7503,7504,4376,3910, 619, # 4502 -7505,3129,3261, 215,2006,2783,2553,3189,4377,3190,4378, 763,4119,3763,4379,7506, # 4518 -7507,1957,1767,2941,3328,3646,1174, 452,1477,4380,3329,3130,7508,2825,1253,2382, # 4534 -2186,1091,2285,4120, 492,7509, 638,1169,1824,2135,1752,3911, 648, 926,1021,1324, # 4550 -4381, 520,4382, 997, 847,1007, 892,4383,3764,2262,1871,3647,7510,2400,1784,4384, # 4566 -1952,2942,3080,3191,1728,4121,2043,3648,4385,2007,1701,3131,1551, 30,2263,4122, # 4582 -7511,2026,4386,3534,7512, 501,7513,4123, 594,3431,2165,1821,3535,3432,3536,3192, # 4598 - 829,2826,4124,7514,1680,3132,1225,4125,7515,3262,4387,4126,3133,2336,7516,4388, # 4614 -4127,7517,3912,3913,7518,1847,2383,2596,3330,7519,4389, 374,3914, 652,4128,4129, # 4630 - 375,1140, 798,7520,7521,7522,2361,4390,2264, 546,1659, 138,3031,2445,4391,7523, # 4646 -2250, 612,1848, 910, 796,3765,1740,1371, 825,3766,3767,7524,2906,2554,7525, 692, # 4662 - 444,3032,2624, 801,4392,4130,7526,1491, 244,1053,3033,4131,4132, 340,7527,3915, # 4678 -1041,2987, 293,1168, 87,1357,7528,1539, 959,7529,2236, 721, 694,4133,3768, 219, # 4694 -1478, 644,1417,3331,2656,1413,1401,1335,1389,3916,7530,7531,2988,2362,3134,1825, # 4710 - 730,1515, 184,2827, 66,4393,7532,1660,2943, 246,3332, 378,1457, 226,3433, 975, # 4726 -3917,2944,1264,3537, 674, 696,7533, 163,7534,1141,2417,2166, 713,3538,3333,4394, # 4742 -3918,7535,7536,1186, 15,7537,1079,1070,7538,1522,3193,3539, 276,1050,2716, 758, # 4758 -1126, 653,2945,3263,7539,2337, 889,3540,3919,3081,2989, 903,1250,4395,3920,3434, # 4774 -3541,1342,1681,1718, 766,3264, 286, 89,2946,3649,7540,1713,7541,2597,3334,2990, # 4790 -7542,2947,2215,3194,2866,7543,4396,2498,2526, 181, 387,1075,3921, 731,2187,3335, # 4806 -7544,3265, 310, 313,3435,2299, 770,4134, 54,3034, 189,4397,3082,3769,3922,7545, # 4822 -1230,1617,1849, 355,3542,4135,4398,3336, 111,4136,3650,1350,3135,3436,3035,4137, # 4838 -2149,3266,3543,7546,2784,3923,3924,2991, 722,2008,7547,1071, 247,1207,2338,2471, # 4854 -1378,4399,2009, 864,1437,1214,4400, 373,3770,1142,2216, 667,4401, 442,2753,2555, # 4870 -3771,3925,1968,4138,3267,1839, 837, 170,1107, 934,1336,1882,7548,7549,2118,4139, # 4886 -2828, 743,1569,7550,4402,4140, 582,2384,1418,3437,7551,1802,7552, 357,1395,1729, # 4902 -3651,3268,2418,1564,2237,7553,3083,3772,1633,4403,1114,2085,4141,1532,7554, 482, # 4918 -2446,4404,7555,7556,1492, 833,1466,7557,2717,3544,1641,2829,7558,1526,1272,3652, # 4934 -4142,1686,1794, 416,2556,1902,1953,1803,7559,3773,2785,3774,1159,2316,7560,2867, # 4950 -4405,1610,1584,3036,2419,2754, 443,3269,1163,3136,7561,7562,3926,7563,4143,2499, # 4966 -3037,4406,3927,3137,2103,1647,3545,2010,1872,4144,7564,4145, 431,3438,7565, 250, # 4982 - 97, 81,4146,7566,1648,1850,1558, 160, 848,7567, 866, 740,1694,7568,2201,2830, # 4998 -3195,4147,4407,3653,1687, 950,2472, 426, 469,3196,3654,3655,3928,7569,7570,1188, # 5014 - 424,1995, 861,3546,4148,3775,2202,2685, 168,1235,3547,4149,7571,2086,1674,4408, # 5030 -3337,3270, 220,2557,1009,7572,3776, 670,2992, 332,1208, 717,7573,7574,3548,2447, # 5046 -3929,3338,7575, 513,7576,1209,2868,3339,3138,4409,1080,7577,7578,7579,7580,2527, # 5062 -3656,3549, 815,1587,3930,3931,7581,3550,3439,3777,1254,4410,1328,3038,1390,3932, # 5078 -1741,3933,3778,3934,7582, 236,3779,2448,3271,7583,7584,3657,3780,1273,3781,4411, # 5094 -7585, 308,7586,4412, 245,4413,1851,2473,1307,2575, 430, 715,2136,2449,7587, 270, # 5110 - 199,2869,3935,7588,3551,2718,1753, 761,1754, 725,1661,1840,4414,3440,3658,7589, # 5126 -7590, 587, 14,3272, 227,2598, 326, 480,2265, 943,2755,3552, 291, 650,1883,7591, # 5142 -1702,1226, 102,1547, 62,3441, 904,4415,3442,1164,4150,7592,7593,1224,1548,2756, # 5158 - 391, 498,1493,7594,1386,1419,7595,2055,1177,4416, 813, 880,1081,2363, 566,1145, # 5174 -4417,2286,1001,1035,2558,2599,2238, 394,1286,7596,7597,2068,7598, 86,1494,1730, # 5190 -3936, 491,1588, 745, 897,2948, 843,3340,3937,2757,2870,3273,1768, 998,2217,2069, # 5206 - 397,1826,1195,1969,3659,2993,3341, 284,7599,3782,2500,2137,2119,1903,7600,3938, # 5222 -2150,3939,4151,1036,3443,1904, 114,2559,4152, 209,1527,7601,7602,2949,2831,2625, # 5238 -2385,2719,3139, 812,2560,7603,3274,7604,1559, 737,1884,3660,1210, 885, 28,2686, # 5254 -3553,3783,7605,4153,1004,1779,4418,7606, 346,1981,2218,2687,4419,3784,1742, 797, # 5270 -1642,3940,1933,1072,1384,2151, 896,3941,3275,3661,3197,2871,3554,7607,2561,1958, # 5286 -4420,2450,1785,7608,7609,7610,3942,4154,1005,1308,3662,4155,2720,4421,4422,1528, # 5302 -2600, 161,1178,4156,1982, 987,4423,1101,4157, 631,3943,1157,3198,2420,1343,1241, # 5318 -1016,2239,2562, 372, 877,2339,2501,1160, 555,1934, 911,3944,7611, 466,1170, 169, # 5334 -1051,2907,2688,3663,2474,2994,1182,2011,2563,1251,2626,7612, 992,2340,3444,1540, # 5350 -2721,1201,2070,2401,1996,2475,7613,4424, 528,1922,2188,1503,1873,1570,2364,3342, # 5366 -3276,7614, 557,1073,7615,1827,3445,2087,2266,3140,3039,3084, 767,3085,2786,4425, # 5382 -1006,4158,4426,2341,1267,2176,3664,3199, 778,3945,3200,2722,1597,2657,7616,4427, # 5398 -7617,3446,7618,7619,7620,3277,2689,1433,3278, 131, 95,1504,3946, 723,4159,3141, # 5414 -1841,3555,2758,2189,3947,2027,2104,3665,7621,2995,3948,1218,7622,3343,3201,3949, # 5430 -4160,2576, 248,1634,3785, 912,7623,2832,3666,3040,3786, 654, 53,7624,2996,7625, # 5446 -1688,4428, 777,3447,1032,3950,1425,7626, 191, 820,2120,2833, 971,4429, 931,3202, # 5462 - 135, 664, 783,3787,1997, 772,2908,1935,3951,3788,4430,2909,3203, 282,2723, 640, # 5478 -1372,3448,1127, 922, 325,3344,7627,7628, 711,2044,7629,7630,3952,2219,2787,1936, # 5494 -3953,3345,2220,2251,3789,2300,7631,4431,3790,1258,3279,3954,3204,2138,2950,3955, # 5510 -3956,7632,2221, 258,3205,4432, 101,1227,7633,3280,1755,7634,1391,3281,7635,2910, # 5526 -2056, 893,7636,7637,7638,1402,4161,2342,7639,7640,3206,3556,7641,7642, 878,1325, # 5542 -1780,2788,4433, 259,1385,2577, 744,1183,2267,4434,7643,3957,2502,7644, 684,1024, # 5558 -4162,7645, 472,3557,3449,1165,3282,3958,3959, 322,2152, 881, 455,1695,1152,1340, # 5574 - 660, 554,2153,4435,1058,4436,4163, 830,1065,3346,3960,4437,1923,7646,1703,1918, # 5590 -7647, 932,2268, 122,7648,4438, 947, 677,7649,3791,2627, 297,1905,1924,2269,4439, # 5606 -2317,3283,7650,7651,4164,7652,4165, 84,4166, 112, 989,7653, 547,1059,3961, 701, # 5622 -3558,1019,7654,4167,7655,3450, 942, 639, 457,2301,2451, 993,2951, 407, 851, 494, # 5638 -4440,3347, 927,7656,1237,7657,2421,3348, 573,4168, 680, 921,2911,1279,1874, 285, # 5654 - 790,1448,1983, 719,2167,7658,7659,4441,3962,3963,1649,7660,1541, 563,7661,1077, # 5670 -7662,3349,3041,3451, 511,2997,3964,3965,3667,3966,1268,2564,3350,3207,4442,4443, # 5686 -7663, 535,1048,1276,1189,2912,2028,3142,1438,1373,2834,2952,1134,2012,7664,4169, # 5702 -1238,2578,3086,1259,7665, 700,7666,2953,3143,3668,4170,7667,4171,1146,1875,1906, # 5718 -4444,2601,3967, 781,2422, 132,1589, 203, 147, 273,2789,2402, 898,1786,2154,3968, # 5734 -3969,7668,3792,2790,7669,7670,4445,4446,7671,3208,7672,1635,3793, 965,7673,1804, # 5750 -2690,1516,3559,1121,1082,1329,3284,3970,1449,3794, 65,1128,2835,2913,2759,1590, # 5766 -3795,7674,7675, 12,2658, 45, 976,2579,3144,4447, 517,2528,1013,1037,3209,7676, # 5782 -3796,2836,7677,3797,7678,3452,7679,2602, 614,1998,2318,3798,3087,2724,2628,7680, # 5798 -2580,4172, 599,1269,7681,1810,3669,7682,2691,3088, 759,1060, 489,1805,3351,3285, # 5814 -1358,7683,7684,2386,1387,1215,2629,2252, 490,7685,7686,4173,1759,2387,2343,7687, # 5830 -4448,3799,1907,3971,2630,1806,3210,4449,3453,3286,2760,2344, 874,7688,7689,3454, # 5846 -3670,1858, 91,2914,3671,3042,3800,4450,7690,3145,3972,2659,7691,3455,1202,1403, # 5862 -3801,2954,2529,1517,2503,4451,3456,2504,7692,4452,7693,2692,1885,1495,1731,3973, # 5878 -2365,4453,7694,2029,7695,7696,3974,2693,1216, 237,2581,4174,2319,3975,3802,4454, # 5894 -4455,2694,3560,3457, 445,4456,7697,7698,7699,7700,2761, 61,3976,3672,1822,3977, # 5910 -7701, 687,2045, 935, 925, 405,2660, 703,1096,1859,2725,4457,3978,1876,1367,2695, # 5926 -3352, 918,2105,1781,2476, 334,3287,1611,1093,4458, 564,3146,3458,3673,3353, 945, # 5942 -2631,2057,4459,7702,1925, 872,4175,7703,3459,2696,3089, 349,4176,3674,3979,4460, # 5958 -3803,4177,3675,2155,3980,4461,4462,4178,4463,2403,2046, 782,3981, 400, 251,4179, # 5974 -1624,7704,7705, 277,3676, 299,1265, 476,1191,3804,2121,4180,4181,1109, 205,7706, # 5990 -2582,1000,2156,3561,1860,7707,7708,7709,4464,7710,4465,2565, 107,2477,2157,3982, # 6006 -3460,3147,7711,1533, 541,1301, 158, 753,4182,2872,3562,7712,1696, 370,1088,4183, # 6022 -4466,3563, 579, 327, 440, 162,2240, 269,1937,1374,3461, 968,3043, 56,1396,3090, # 6038 -2106,3288,3354,7713,1926,2158,4467,2998,7714,3564,7715,7716,3677,4468,2478,7717, # 6054 -2791,7718,1650,4469,7719,2603,7720,7721,3983,2661,3355,1149,3356,3984,3805,3985, # 6070 -7722,1076, 49,7723, 951,3211,3289,3290, 450,2837, 920,7724,1811,2792,2366,4184, # 6086 -1908,1138,2367,3806,3462,7725,3212,4470,1909,1147,1518,2423,4471,3807,7726,4472, # 6102 -2388,2604, 260,1795,3213,7727,7728,3808,3291, 708,7729,3565,1704,7730,3566,1351, # 6118 -1618,3357,2999,1886, 944,4185,3358,4186,3044,3359,4187,7731,3678, 422, 413,1714, # 6134 -3292, 500,2058,2345,4188,2479,7732,1344,1910, 954,7733,1668,7734,7735,3986,2404, # 6150 -4189,3567,3809,4190,7736,2302,1318,2505,3091, 133,3092,2873,4473, 629, 31,2838, # 6166 -2697,3810,4474, 850, 949,4475,3987,2955,1732,2088,4191,1496,1852,7737,3988, 620, # 6182 -3214, 981,1242,3679,3360,1619,3680,1643,3293,2139,2452,1970,1719,3463,2168,7738, # 6198 -3215,7739,7740,3361,1828,7741,1277,4476,1565,2047,7742,1636,3568,3093,7743, 869, # 6214 -2839, 655,3811,3812,3094,3989,3000,3813,1310,3569,4477,7744,7745,7746,1733, 558, # 6230 -4478,3681, 335,1549,3045,1756,4192,3682,1945,3464,1829,1291,1192, 470,2726,2107, # 6246 -2793, 913,1054,3990,7747,1027,7748,3046,3991,4479, 982,2662,3362,3148,3465,3216, # 6262 -3217,1946,2794,7749, 571,4480,7750,1830,7751,3570,2583,1523,2424,7752,2089, 984, # 6278 -4481,3683,1959,7753,3684, 852, 923,2795,3466,3685, 969,1519, 999,2048,2320,1705, # 6294 -7754,3095, 615,1662, 151, 597,3992,2405,2321,1049, 275,4482,3686,4193, 568,3687, # 6310 -3571,2480,4194,3688,7755,2425,2270, 409,3218,7756,1566,2874,3467,1002, 769,2840, # 6326 - 194,2090,3149,3689,2222,3294,4195, 628,1505,7757,7758,1763,2177,3001,3993, 521, # 6342 -1161,2584,1787,2203,2406,4483,3994,1625,4196,4197, 412, 42,3096, 464,7759,2632, # 6358 -4484,3363,1760,1571,2875,3468,2530,1219,2204,3814,2633,2140,2368,4485,4486,3295, # 6374 -1651,3364,3572,7760,7761,3573,2481,3469,7762,3690,7763,7764,2271,2091, 460,7765, # 6390 -4487,7766,3002, 962, 588,3574, 289,3219,2634,1116, 52,7767,3047,1796,7768,7769, # 6406 -7770,1467,7771,1598,1143,3691,4198,1984,1734,1067,4488,1280,3365, 465,4489,1572, # 6422 - 510,7772,1927,2241,1812,1644,3575,7773,4490,3692,7774,7775,2663,1573,1534,7776, # 6438 -7777,4199, 536,1807,1761,3470,3815,3150,2635,7778,7779,7780,4491,3471,2915,1911, # 6454 -2796,7781,3296,1122, 377,3220,7782, 360,7783,7784,4200,1529, 551,7785,2059,3693, # 6470 -1769,2426,7786,2916,4201,3297,3097,2322,2108,2030,4492,1404, 136,1468,1479, 672, # 6486 -1171,3221,2303, 271,3151,7787,2762,7788,2049, 678,2727, 865,1947,4493,7789,2013, # 6502 -3995,2956,7790,2728,2223,1397,3048,3694,4494,4495,1735,2917,3366,3576,7791,3816, # 6518 - 509,2841,2453,2876,3817,7792,7793,3152,3153,4496,4202,2531,4497,2304,1166,1010, # 6534 - 552, 681,1887,7794,7795,2957,2958,3996,1287,1596,1861,3154, 358, 453, 736, 175, # 6550 - 478,1117, 905,1167,1097,7796,1853,1530,7797,1706,7798,2178,3472,2287,3695,3473, # 6566 -3577,4203,2092,4204,7799,3367,1193,2482,4205,1458,2190,2205,1862,1888,1421,3298, # 6582 -2918,3049,2179,3474, 595,2122,7800,3997,7801,7802,4206,1707,2636, 223,3696,1359, # 6598 - 751,3098, 183,3475,7803,2797,3003, 419,2369, 633, 704,3818,2389, 241,7804,7805, # 6614 -7806, 838,3004,3697,2272,2763,2454,3819,1938,2050,3998,1309,3099,2242,1181,7807, # 6630 -1136,2206,3820,2370,1446,4207,2305,4498,7808,7809,4208,1055,2605, 484,3698,7810, # 6646 -3999, 625,4209,2273,3368,1499,4210,4000,7811,4001,4211,3222,2274,2275,3476,7812, # 6662 -7813,2764, 808,2606,3699,3369,4002,4212,3100,2532, 526,3370,3821,4213, 955,7814, # 6678 -1620,4214,2637,2427,7815,1429,3700,1669,1831, 994, 928,7816,3578,1260,7817,7818, # 6694 -7819,1948,2288, 741,2919,1626,4215,2729,2455, 867,1184, 362,3371,1392,7820,7821, # 6710 -4003,4216,1770,1736,3223,2920,4499,4500,1928,2698,1459,1158,7822,3050,3372,2877, # 6726 -1292,1929,2506,2842,3701,1985,1187,2071,2014,2607,4217,7823,2566,2507,2169,3702, # 6742 -2483,3299,7824,3703,4501,7825,7826, 666,1003,3005,1022,3579,4218,7827,4502,1813, # 6758 -2253, 574,3822,1603, 295,1535, 705,3823,4219, 283, 858, 417,7828,7829,3224,4503, # 6774 -4504,3051,1220,1889,1046,2276,2456,4004,1393,1599, 689,2567, 388,4220,7830,2484, # 6790 - 802,7831,2798,3824,2060,1405,2254,7832,4505,3825,2109,1052,1345,3225,1585,7833, # 6806 - 809,7834,7835,7836, 575,2730,3477, 956,1552,1469,1144,2323,7837,2324,1560,2457, # 6822 -3580,3226,4005, 616,2207,3155,2180,2289,7838,1832,7839,3478,4506,7840,1319,3704, # 6838 -3705,1211,3581,1023,3227,1293,2799,7841,7842,7843,3826, 607,2306,3827, 762,2878, # 6854 -1439,4221,1360,7844,1485,3052,7845,4507,1038,4222,1450,2061,2638,4223,1379,4508, # 6870 -2585,7846,7847,4224,1352,1414,2325,2921,1172,7848,7849,3828,3829,7850,1797,1451, # 6886 -7851,7852,7853,7854,2922,4006,4007,2485,2346, 411,4008,4009,3582,3300,3101,4509, # 6902 -1561,2664,1452,4010,1375,7855,7856, 47,2959, 316,7857,1406,1591,2923,3156,7858, # 6918 -1025,2141,3102,3157, 354,2731, 884,2224,4225,2407, 508,3706, 726,3583, 996,2428, # 6934 -3584, 729,7859, 392,2191,1453,4011,4510,3707,7860,7861,2458,3585,2608,1675,2800, # 6950 - 919,2347,2960,2348,1270,4511,4012, 73,7862,7863, 647,7864,3228,2843,2255,1550, # 6966 -1346,3006,7865,1332, 883,3479,7866,7867,7868,7869,3301,2765,7870,1212, 831,1347, # 6982 -4226,4512,2326,3830,1863,3053, 720,3831,4513,4514,3832,7871,4227,7872,7873,4515, # 6998 -7874,7875,1798,4516,3708,2609,4517,3586,1645,2371,7876,7877,2924, 669,2208,2665, # 7014 -2429,7878,2879,7879,7880,1028,3229,7881,4228,2408,7882,2256,1353,7883,7884,4518, # 7030 -3158, 518,7885,4013,7886,4229,1960,7887,2142,4230,7888,7889,3007,2349,2350,3833, # 7046 - 516,1833,1454,4014,2699,4231,4519,2225,2610,1971,1129,3587,7890,2766,7891,2961, # 7062 -1422, 577,1470,3008,1524,3373,7892,7893, 432,4232,3054,3480,7894,2586,1455,2508, # 7078 -2226,1972,1175,7895,1020,2732,4015,3481,4520,7896,2733,7897,1743,1361,3055,3482, # 7094 -2639,4016,4233,4521,2290, 895, 924,4234,2170, 331,2243,3056, 166,1627,3057,1098, # 7110 -7898,1232,2880,2227,3374,4522, 657, 403,1196,2372, 542,3709,3375,1600,4235,3483, # 7126 -7899,4523,2767,3230, 576, 530,1362,7900,4524,2533,2666,3710,4017,7901, 842,3834, # 7142 -7902,2801,2031,1014,4018, 213,2700,3376, 665, 621,4236,7903,3711,2925,2430,7904, # 7158 -2431,3302,3588,3377,7905,4237,2534,4238,4525,3589,1682,4239,3484,1380,7906, 724, # 7174 -2277, 600,1670,7907,1337,1233,4526,3103,2244,7908,1621,4527,7909, 651,4240,7910, # 7190 -1612,4241,2611,7911,2844,7912,2734,2307,3058,7913, 716,2459,3059, 174,1255,2701, # 7206 -4019,3590, 548,1320,1398, 728,4020,1574,7914,1890,1197,3060,4021,7915,3061,3062, # 7222 -3712,3591,3713, 747,7916, 635,4242,4528,7917,7918,7919,4243,7920,7921,4529,7922, # 7238 -3378,4530,2432, 451,7923,3714,2535,2072,4244,2735,4245,4022,7924,1764,4531,7925, # 7254 -4246, 350,7926,2278,2390,2486,7927,4247,4023,2245,1434,4024, 488,4532, 458,4248, # 7270 -4025,3715, 771,1330,2391,3835,2568,3159,2159,2409,1553,2667,3160,4249,7928,2487, # 7286 -2881,2612,1720,2702,4250,3379,4533,7929,2536,4251,7930,3231,4252,2768,7931,2015, # 7302 -2736,7932,1155,1017,3716,3836,7933,3303,2308, 201,1864,4253,1430,7934,4026,7935, # 7318 -7936,7937,7938,7939,4254,1604,7940, 414,1865, 371,2587,4534,4535,3485,2016,3104, # 7334 -4536,1708, 960,4255, 887, 389,2171,1536,1663,1721,7941,2228,4027,2351,2926,1580, # 7350 -7942,7943,7944,1744,7945,2537,4537,4538,7946,4539,7947,2073,7948,7949,3592,3380, # 7366 -2882,4256,7950,4257,2640,3381,2802, 673,2703,2460, 709,3486,4028,3593,4258,7951, # 7382 -1148, 502, 634,7952,7953,1204,4540,3594,1575,4541,2613,3717,7954,3718,3105, 948, # 7398 -3232, 121,1745,3837,1110,7955,4259,3063,2509,3009,4029,3719,1151,1771,3838,1488, # 7414 -4030,1986,7956,2433,3487,7957,7958,2093,7959,4260,3839,1213,1407,2803, 531,2737, # 7430 -2538,3233,1011,1537,7960,2769,4261,3106,1061,7961,3720,3721,1866,2883,7962,2017, # 7446 - 120,4262,4263,2062,3595,3234,2309,3840,2668,3382,1954,4542,7963,7964,3488,1047, # 7462 -2704,1266,7965,1368,4543,2845, 649,3383,3841,2539,2738,1102,2846,2669,7966,7967, # 7478 -1999,7968,1111,3596,2962,7969,2488,3842,3597,2804,1854,3384,3722,7970,7971,3385, # 7494 -2410,2884,3304,3235,3598,7972,2569,7973,3599,2805,4031,1460, 856,7974,3600,7975, # 7510 -2885,2963,7976,2886,3843,7977,4264, 632,2510, 875,3844,1697,3845,2291,7978,7979, # 7526 -4544,3010,1239, 580,4545,4265,7980, 914, 936,2074,1190,4032,1039,2123,7981,7982, # 7542 -7983,3386,1473,7984,1354,4266,3846,7985,2172,3064,4033, 915,3305,4267,4268,3306, # 7558 -1605,1834,7986,2739, 398,3601,4269,3847,4034, 328,1912,2847,4035,3848,1331,4270, # 7574 -3011, 937,4271,7987,3602,4036,4037,3387,2160,4546,3388, 524, 742, 538,3065,1012, # 7590 -7988,7989,3849,2461,7990, 658,1103, 225,3850,7991,7992,4547,7993,4548,7994,3236, # 7606 -1243,7995,4038, 963,2246,4549,7996,2705,3603,3161,7997,7998,2588,2327,7999,4550, # 7622 -8000,8001,8002,3489,3307, 957,3389,2540,2032,1930,2927,2462, 870,2018,3604,1746, # 7638 -2770,2771,2434,2463,8003,3851,8004,3723,3107,3724,3490,3390,3725,8005,1179,3066, # 7654 -8006,3162,2373,4272,3726,2541,3163,3108,2740,4039,8007,3391,1556,2542,2292, 977, # 7670 -2887,2033,4040,1205,3392,8008,1765,3393,3164,2124,1271,1689, 714,4551,3491,8009, # 7686 -2328,3852, 533,4273,3605,2181, 617,8010,2464,3308,3492,2310,8011,8012,3165,8013, # 7702 -8014,3853,1987, 618, 427,2641,3493,3394,8015,8016,1244,1690,8017,2806,4274,4552, # 7718 -8018,3494,8019,8020,2279,1576, 473,3606,4275,3395, 972,8021,3607,8022,3067,8023, # 7734 -8024,4553,4554,8025,3727,4041,4042,8026, 153,4555, 356,8027,1891,2888,4276,2143, # 7750 - 408, 803,2352,8028,3854,8029,4277,1646,2570,2511,4556,4557,3855,8030,3856,4278, # 7766 -8031,2411,3396, 752,8032,8033,1961,2964,8034, 746,3012,2465,8035,4279,3728, 698, # 7782 -4558,1892,4280,3608,2543,4559,3609,3857,8036,3166,3397,8037,1823,1302,4043,2706, # 7798 -3858,1973,4281,8038,4282,3167, 823,1303,1288,1236,2848,3495,4044,3398, 774,3859, # 7814 -8039,1581,4560,1304,2849,3860,4561,8040,2435,2161,1083,3237,4283,4045,4284, 344, # 7830 -1173, 288,2311, 454,1683,8041,8042,1461,4562,4046,2589,8043,8044,4563, 985, 894, # 7846 -8045,3399,3168,8046,1913,2928,3729,1988,8047,2110,1974,8048,4047,8049,2571,1194, # 7862 - 425,8050,4564,3169,1245,3730,4285,8051,8052,2850,8053, 636,4565,1855,3861, 760, # 7878 -1799,8054,4286,2209,1508,4566,4048,1893,1684,2293,8055,8056,8057,4287,4288,2210, # 7894 - 479,8058,8059, 832,8060,4049,2489,8061,2965,2490,3731, 990,3109, 627,1814,2642, # 7910 -4289,1582,4290,2125,2111,3496,4567,8062, 799,4291,3170,8063,4568,2112,1737,3013, # 7926 -1018, 543, 754,4292,3309,1676,4569,4570,4050,8064,1489,8065,3497,8066,2614,2889, # 7942 -4051,8067,8068,2966,8069,8070,8071,8072,3171,4571,4572,2182,1722,8073,3238,3239, # 7958 -1842,3610,1715, 481, 365,1975,1856,8074,8075,1962,2491,4573,8076,2126,3611,3240, # 7974 - 433,1894,2063,2075,8077, 602,2741,8078,8079,8080,8081,8082,3014,1628,3400,8083, # 7990 -3172,4574,4052,2890,4575,2512,8084,2544,2772,8085,8086,8087,3310,4576,2891,8088, # 8006 -4577,8089,2851,4578,4579,1221,2967,4053,2513,8090,8091,8092,1867,1989,8093,8094, # 8022 -8095,1895,8096,8097,4580,1896,4054, 318,8098,2094,4055,4293,8099,8100, 485,8101, # 8038 - 938,3862, 553,2670, 116,8102,3863,3612,8103,3498,2671,2773,3401,3311,2807,8104, # 8054 -3613,2929,4056,1747,2930,2968,8105,8106, 207,8107,8108,2672,4581,2514,8109,3015, # 8070 - 890,3614,3864,8110,1877,3732,3402,8111,2183,2353,3403,1652,8112,8113,8114, 941, # 8086 -2294, 208,3499,4057,2019, 330,4294,3865,2892,2492,3733,4295,8115,8116,8117,8118, # 8102 -) - diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/euctwprober.py b/env/lib/python3.7/site-packages/pip/_vendor/chardet/euctwprober.py deleted file mode 100644 index 35669cc..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/chardet/euctwprober.py +++ /dev/null @@ -1,46 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import EUCTWDistributionAnalysis -from .mbcssm import EUCTW_SM_MODEL - -class EUCTWProber(MultiByteCharSetProber): - def __init__(self): - super(EUCTWProber, self).__init__() - self.coding_sm = CodingStateMachine(EUCTW_SM_MODEL) - self.distribution_analyzer = EUCTWDistributionAnalysis() - self.reset() - - @property - def charset_name(self): - return "EUC-TW" - - @property - def language(self): - return "Taiwan" diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/gb2312freq.py b/env/lib/python3.7/site-packages/pip/_vendor/chardet/gb2312freq.py deleted file mode 100644 index 697837b..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/chardet/gb2312freq.py +++ /dev/null @@ -1,283 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# GB2312 most frequently used character table -# -# Char to FreqOrder table , from hz6763 - -# 512 --> 0.79 -- 0.79 -# 1024 --> 0.92 -- 0.13 -# 2048 --> 0.98 -- 0.06 -# 6768 --> 1.00 -- 0.02 -# -# Ideal Distribution Ratio = 0.79135/(1-0.79135) = 3.79 -# Random Distribution Ration = 512 / (3755 - 512) = 0.157 -# -# Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR - -GB2312_TYPICAL_DISTRIBUTION_RATIO = 0.9 - -GB2312_TABLE_SIZE = 3760 - -GB2312_CHAR_TO_FREQ_ORDER = ( -1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205, -2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842, -2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409, - 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670, -1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820, -1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585, - 152,1687,1539, 738,1559, 59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566, -1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850, 70,3285,2729,3534,3575, -2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853, -3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061, - 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155, -1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406, - 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816, -2534,1546,2393,2760, 737,2494, 13, 447, 245,2747, 38,2765,2129,2589,1079, 606, - 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023, -2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414, -1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513, -3195,4115,5627,2489,2991, 24,2065,2697,1087,2719, 48,1634, 315, 68, 985,2052, - 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570, -1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575, - 253,3099, 32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250, -2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506, -1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563, 26, -3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835, -1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686, -2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054, -1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894, - 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105, -3777,3657, 643,2298,1148,1779, 190, 989,3544, 414, 11,2135,2063,2979,1471, 403, -3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694, - 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873, -3651, 210, 33,1608,2516, 200,1520, 415, 102, 0,3389,1287, 817, 91,3299,2940, - 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687, 20,1819, 121, -1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648, -3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992, -2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680, 72, 842,1990, 212,1233, -1154,1586, 75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157, - 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807, -1910, 534, 529,3309,1721,1660, 274, 39,2827, 661,2670,1578, 925,3248,3815,1094, -4278,4901,4252, 41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258, - 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478, -3568, 194,5062, 15, 961,3870,1241,1192,2664, 66,5215,3260,2111,1295,1127,2152, -3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426, 53,2909, - 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272, -1272,2363, 284,1753,3679,4064,1695, 81, 815,2677,2757,2731,1386, 859, 500,4221, -2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252, -1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301, -1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254, - 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070, -3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461, -3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640, 67,2360, -4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124, - 296,3979,1739,1611,3684, 23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535, -3116, 17,1074, 467,2692,2201, 387,2922, 45,1326,3055,1645,3659,2817, 958, 243, -1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713, -1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071, -4046,3572,2399,1571,3281, 79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442, - 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946, - 814,4968,3487,1548,2644,1567,1285, 2, 295,2636, 97, 946,3576, 832, 141,4257, -3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180, -1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427, - 602,1525,2608,1605,1639,3175, 694,3064, 10, 465, 76,2000,4846,4208, 444,3781, -1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724, -2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844, 89, 937, - 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943, - 432, 445,2811, 206,4136,1472, 730, 349, 73, 397,2802,2547, 998,1637,1167, 789, - 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552, -3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246, -4996, 371,1575,2436,1621,2210, 984,4033,1734,2638, 16,4529, 663,2755,3255,1451, -3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310, - 750,2058, 165, 80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860, -2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297, -2357, 395,3740, 137,2075, 944,4089,2584,1267,3802, 62,1533,2285, 178, 176, 780, -2440, 201,3707, 590, 478,1560,4354,2117,1075, 30, 74,4643,4004,1635,1441,2745, - 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936, -2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032, - 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669, 43,2523,1657, - 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414, - 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976, -3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436, -2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254, -2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024, 40,3240,1536, -1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238, - 18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059, -2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741, - 90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447, - 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601, -1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269, -1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076, 46,4253,2873,1889,1894, - 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173, - 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994, -1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956, -2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437, -3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154, -2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240, -2269,2246,1446, 36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143, -2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634, -3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472, -1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906, 51, 369, 170,3541, -1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143, -2101,2730,2490, 82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312, -1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414, -3750,2289,2795, 813,3123,2610,1136,4368, 5,3391,4541,2174, 420, 429,1728, 754, -1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424, -1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302, -3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739, - 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004, -2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484, -1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739, -4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535, -1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641, -1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307, -3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573, -1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533, - 47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965, - 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096, 99, -1397,1769,2300,4428,1643,3455,1978,1757,3718,1440, 35,4879,3742,1296,4228,2280, - 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505, -1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012, -1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039, - 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982, -3708, 135,2131, 87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530, -4314, 9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392, -3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656, -2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220, -2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766, -1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535, -3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728, -2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338, -1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627, -1505,1911,1883,3526, 698,3629,3456,1833,1431, 746, 77,1261,2017,2296,1977,1885, - 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411, -2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671, -2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162, -3192,2910,2010, 140,2395,2859, 55,1082,2012,2901, 662, 419,2081,1438, 680,2774, -4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524, -3399, 98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346, - 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040, -3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188, -2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280, -1086,1974,2034, 630, 257,3338,2788,4903,1017, 86,4790, 966,2789,1995,1696,1131, - 259,3095,4188,1308, 179,1463,5257, 289,4107,1248, 42,3413,1725,2288, 896,1947, - 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970, -3034,3310, 540,2370,1562,1288,2990, 502,4765,1147, 4,1853,2708, 207, 294,2814, -4078,2902,2509, 684, 34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557, -2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997, -1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972, -1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369, - 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376, -1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196, 19, 941,3624,3480, -3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610, - 955,1089,3103,1053, 96, 88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128, - 642,4006, 903,2539,1877,2082, 596, 29,4066,1790, 722,2157, 130, 995,1569, 769, -1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445, 50, 625, 487,2207, - 57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392, -1783, 362, 8,3433,3422, 610,2793,3277,1390,1284,1654, 21,3823, 734, 367, 623, - 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782, -2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650, - 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478, -2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773, -2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007, -1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323, -1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598, -2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961, - 819,1541, 142,2284, 44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302, -1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409, -1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683, -2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191, -2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434, 92,1466,4920,2616, -3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302, -1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774, -4462, 64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147, - 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731, - 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464, -3264,2855,2722,1952,1029,2839,2467, 84,4383,2215, 820,1391,2015,2448,3672, 377, -1948,2168, 797,2545,3536,2578,2645, 94,2874,1678, 405,1259,3071, 771, 546,1315, - 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928, 14,2594, 557, -3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903, -1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060, -4031,2641,4067,3145,1870, 37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261, -1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092, -2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810, -1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708, - 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658, -1178,2639,2351, 93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871, -3341,1618,4126,2595,2334, 603, 651, 69, 701, 268,2662,3411,2555,1380,1606, 503, - 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229, -2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112, - 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504, -1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389, -1281, 52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169, 27, -1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542, -3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861, -2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845, -3891,2868,3621,2254, 58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700, -3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469, -3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582, - 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999, -2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274, - 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020, -2724,1927,2333,4440, 567, 22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601, - 12, 974,3783,4391, 951,1412, 1,3720, 453,4608,4041, 528,1041,1027,3230,2628, -1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040, 31, - 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668, - 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778, -1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169, -3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667, -3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118, 63,2076, 314,1881, -1348,1061, 172, 978,3515,1747, 532, 511,3970, 6, 601, 905,2699,3300,1751, 276, -1467,3725,2668, 65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320, -3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751, -2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432, -2754, 95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772, -1985, 244,2546, 474, 495,1046,2611,1851,2061, 71,2089,1675,2590, 742,3758,2843, -3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116, - 451, 3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904, -4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652, -1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664, -2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078, 49,3770, -3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283, -3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626, -1197,1663,4476,3127, 85,4240,2528, 25,1111,1181,3673, 407,3470,4561,2679,2713, - 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333, - 391,2963, 187, 61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062, -2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555, - 931, 317,2517,3027, 325, 569, 686,2107,3084, 60,1042,1333,2794, 264,3177,4014, -1628, 258,3712, 7,4464,1176,1043,1778, 683, 114,1975, 78,1492, 383,1886, 510, - 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015, -1282,1289,4609, 697,1453,3044,2666,3611,1856,2412, 54, 719,1330, 568,3778,2459, -1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390, -1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238, -1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421, 56,1908,1640,2387,2232, -1917,1874,2477,4921, 148, 83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624, - 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189, - 852,1221,1400,1486, 882,2299,4036, 351, 28,1122, 700,6479,6480,6481,6482,6483, #last 512 -) - diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/gb2312prober.py b/env/lib/python3.7/site-packages/pip/_vendor/chardet/gb2312prober.py deleted file mode 100644 index 8446d2d..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/chardet/gb2312prober.py +++ /dev/null @@ -1,46 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import GB2312DistributionAnalysis -from .mbcssm import GB2312_SM_MODEL - -class GB2312Prober(MultiByteCharSetProber): - def __init__(self): - super(GB2312Prober, self).__init__() - self.coding_sm = CodingStateMachine(GB2312_SM_MODEL) - self.distribution_analyzer = GB2312DistributionAnalysis() - self.reset() - - @property - def charset_name(self): - return "GB2312" - - @property - def language(self): - return "Chinese" diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/hebrewprober.py b/env/lib/python3.7/site-packages/pip/_vendor/chardet/hebrewprober.py deleted file mode 100644 index b0e1bf4..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/chardet/hebrewprober.py +++ /dev/null @@ -1,292 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Shy Shalom -# Portions created by the Initial Developer are Copyright (C) 2005 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .charsetprober import CharSetProber -from .enums import ProbingState - -# This prober doesn't actually recognize a language or a charset. -# It is a helper prober for the use of the Hebrew model probers - -### General ideas of the Hebrew charset recognition ### -# -# Four main charsets exist in Hebrew: -# "ISO-8859-8" - Visual Hebrew -# "windows-1255" - Logical Hebrew -# "ISO-8859-8-I" - Logical Hebrew -# "x-mac-hebrew" - ?? Logical Hebrew ?? -# -# Both "ISO" charsets use a completely identical set of code points, whereas -# "windows-1255" and "x-mac-hebrew" are two different proper supersets of -# these code points. windows-1255 defines additional characters in the range -# 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific -# diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6. -# x-mac-hebrew defines similar additional code points but with a different -# mapping. -# -# As far as an average Hebrew text with no diacritics is concerned, all four -# charsets are identical with respect to code points. Meaning that for the -# main Hebrew alphabet, all four map the same values to all 27 Hebrew letters -# (including final letters). -# -# The dominant difference between these charsets is their directionality. -# "Visual" directionality means that the text is ordered as if the renderer is -# not aware of a BIDI rendering algorithm. The renderer sees the text and -# draws it from left to right. The text itself when ordered naturally is read -# backwards. A buffer of Visual Hebrew generally looks like so: -# "[last word of first line spelled backwards] [whole line ordered backwards -# and spelled backwards] [first word of first line spelled backwards] -# [end of line] [last word of second line] ... etc' " -# adding punctuation marks, numbers and English text to visual text is -# naturally also "visual" and from left to right. -# -# "Logical" directionality means the text is ordered "naturally" according to -# the order it is read. It is the responsibility of the renderer to display -# the text from right to left. A BIDI algorithm is used to place general -# punctuation marks, numbers and English text in the text. -# -# Texts in x-mac-hebrew are almost impossible to find on the Internet. From -# what little evidence I could find, it seems that its general directionality -# is Logical. -# -# To sum up all of the above, the Hebrew probing mechanism knows about two -# charsets: -# Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are -# backwards while line order is natural. For charset recognition purposes -# the line order is unimportant (In fact, for this implementation, even -# word order is unimportant). -# Logical Hebrew - "windows-1255" - normal, naturally ordered text. -# -# "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be -# specifically identified. -# "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew -# that contain special punctuation marks or diacritics is displayed with -# some unconverted characters showing as question marks. This problem might -# be corrected using another model prober for x-mac-hebrew. Due to the fact -# that x-mac-hebrew texts are so rare, writing another model prober isn't -# worth the effort and performance hit. -# -#### The Prober #### -# -# The prober is divided between two SBCharSetProbers and a HebrewProber, -# all of which are managed, created, fed data, inquired and deleted by the -# SBCSGroupProber. The two SBCharSetProbers identify that the text is in -# fact some kind of Hebrew, Logical or Visual. The final decision about which -# one is it is made by the HebrewProber by combining final-letter scores -# with the scores of the two SBCharSetProbers to produce a final answer. -# -# The SBCSGroupProber is responsible for stripping the original text of HTML -# tags, English characters, numbers, low-ASCII punctuation characters, spaces -# and new lines. It reduces any sequence of such characters to a single space. -# The buffer fed to each prober in the SBCS group prober is pure text in -# high-ASCII. -# The two SBCharSetProbers (model probers) share the same language model: -# Win1255Model. -# The first SBCharSetProber uses the model normally as any other -# SBCharSetProber does, to recognize windows-1255, upon which this model was -# built. The second SBCharSetProber is told to make the pair-of-letter -# lookup in the language model backwards. This in practice exactly simulates -# a visual Hebrew model using the windows-1255 logical Hebrew model. -# -# The HebrewProber is not using any language model. All it does is look for -# final-letter evidence suggesting the text is either logical Hebrew or visual -# Hebrew. Disjointed from the model probers, the results of the HebrewProber -# alone are meaningless. HebrewProber always returns 0.00 as confidence -# since it never identifies a charset by itself. Instead, the pointer to the -# HebrewProber is passed to the model probers as a helper "Name Prober". -# When the Group prober receives a positive identification from any prober, -# it asks for the name of the charset identified. If the prober queried is a -# Hebrew model prober, the model prober forwards the call to the -# HebrewProber to make the final decision. In the HebrewProber, the -# decision is made according to the final-letters scores maintained and Both -# model probers scores. The answer is returned in the form of the name of the -# charset identified, either "windows-1255" or "ISO-8859-8". - -class HebrewProber(CharSetProber): - # windows-1255 / ISO-8859-8 code points of interest - FINAL_KAF = 0xea - NORMAL_KAF = 0xeb - FINAL_MEM = 0xed - NORMAL_MEM = 0xee - FINAL_NUN = 0xef - NORMAL_NUN = 0xf0 - FINAL_PE = 0xf3 - NORMAL_PE = 0xf4 - FINAL_TSADI = 0xf5 - NORMAL_TSADI = 0xf6 - - # Minimum Visual vs Logical final letter score difference. - # If the difference is below this, don't rely solely on the final letter score - # distance. - MIN_FINAL_CHAR_DISTANCE = 5 - - # Minimum Visual vs Logical model score difference. - # If the difference is below this, don't rely at all on the model score - # distance. - MIN_MODEL_DISTANCE = 0.01 - - VISUAL_HEBREW_NAME = "ISO-8859-8" - LOGICAL_HEBREW_NAME = "windows-1255" - - def __init__(self): - super(HebrewProber, self).__init__() - self._final_char_logical_score = None - self._final_char_visual_score = None - self._prev = None - self._before_prev = None - self._logical_prober = None - self._visual_prober = None - self.reset() - - def reset(self): - self._final_char_logical_score = 0 - self._final_char_visual_score = 0 - # The two last characters seen in the previous buffer, - # mPrev and mBeforePrev are initialized to space in order to simulate - # a word delimiter at the beginning of the data - self._prev = ' ' - self._before_prev = ' ' - # These probers are owned by the group prober. - - def set_model_probers(self, logicalProber, visualProber): - self._logical_prober = logicalProber - self._visual_prober = visualProber - - def is_final(self, c): - return c in [self.FINAL_KAF, self.FINAL_MEM, self.FINAL_NUN, - self.FINAL_PE, self.FINAL_TSADI] - - def is_non_final(self, c): - # The normal Tsadi is not a good Non-Final letter due to words like - # 'lechotet' (to chat) containing an apostrophe after the tsadi. This - # apostrophe is converted to a space in FilterWithoutEnglishLetters - # causing the Non-Final tsadi to appear at an end of a word even - # though this is not the case in the original text. - # The letters Pe and Kaf rarely display a related behavior of not being - # a good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak' - # for example legally end with a Non-Final Pe or Kaf. However, the - # benefit of these letters as Non-Final letters outweighs the damage - # since these words are quite rare. - return c in [self.NORMAL_KAF, self.NORMAL_MEM, - self.NORMAL_NUN, self.NORMAL_PE] - - def feed(self, byte_str): - # Final letter analysis for logical-visual decision. - # Look for evidence that the received buffer is either logical Hebrew - # or visual Hebrew. - # The following cases are checked: - # 1) A word longer than 1 letter, ending with a final letter. This is - # an indication that the text is laid out "naturally" since the - # final letter really appears at the end. +1 for logical score. - # 2) A word longer than 1 letter, ending with a Non-Final letter. In - # normal Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi, - # should not end with the Non-Final form of that letter. Exceptions - # to this rule are mentioned above in isNonFinal(). This is an - # indication that the text is laid out backwards. +1 for visual - # score - # 3) A word longer than 1 letter, starting with a final letter. Final - # letters should not appear at the beginning of a word. This is an - # indication that the text is laid out backwards. +1 for visual - # score. - # - # The visual score and logical score are accumulated throughout the - # text and are finally checked against each other in GetCharSetName(). - # No checking for final letters in the middle of words is done since - # that case is not an indication for either Logical or Visual text. - # - # We automatically filter out all 7-bit characters (replace them with - # spaces) so the word boundary detection works properly. [MAP] - - if self.state == ProbingState.NOT_ME: - # Both model probers say it's not them. No reason to continue. - return ProbingState.NOT_ME - - byte_str = self.filter_high_byte_only(byte_str) - - for cur in byte_str: - if cur == ' ': - # We stand on a space - a word just ended - if self._before_prev != ' ': - # next-to-last char was not a space so self._prev is not a - # 1 letter word - if self.is_final(self._prev): - # case (1) [-2:not space][-1:final letter][cur:space] - self._final_char_logical_score += 1 - elif self.is_non_final(self._prev): - # case (2) [-2:not space][-1:Non-Final letter][ - # cur:space] - self._final_char_visual_score += 1 - else: - # Not standing on a space - if ((self._before_prev == ' ') and - (self.is_final(self._prev)) and (cur != ' ')): - # case (3) [-2:space][-1:final letter][cur:not space] - self._final_char_visual_score += 1 - self._before_prev = self._prev - self._prev = cur - - # Forever detecting, till the end or until both model probers return - # ProbingState.NOT_ME (handled above) - return ProbingState.DETECTING - - @property - def charset_name(self): - # Make the decision: is it Logical or Visual? - # If the final letter score distance is dominant enough, rely on it. - finalsub = self._final_char_logical_score - self._final_char_visual_score - if finalsub >= self.MIN_FINAL_CHAR_DISTANCE: - return self.LOGICAL_HEBREW_NAME - if finalsub <= -self.MIN_FINAL_CHAR_DISTANCE: - return self.VISUAL_HEBREW_NAME - - # It's not dominant enough, try to rely on the model scores instead. - modelsub = (self._logical_prober.get_confidence() - - self._visual_prober.get_confidence()) - if modelsub > self.MIN_MODEL_DISTANCE: - return self.LOGICAL_HEBREW_NAME - if modelsub < -self.MIN_MODEL_DISTANCE: - return self.VISUAL_HEBREW_NAME - - # Still no good, back to final letter distance, maybe it'll save the - # day. - if finalsub < 0.0: - return self.VISUAL_HEBREW_NAME - - # (finalsub > 0 - Logical) or (don't know what to do) default to - # Logical. - return self.LOGICAL_HEBREW_NAME - - @property - def language(self): - return 'Hebrew' - - @property - def state(self): - # Remain active as long as any of the model probers are active. - if (self._logical_prober.state == ProbingState.NOT_ME) and \ - (self._visual_prober.state == ProbingState.NOT_ME): - return ProbingState.NOT_ME - return ProbingState.DETECTING diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/jisfreq.py b/env/lib/python3.7/site-packages/pip/_vendor/chardet/jisfreq.py deleted file mode 100644 index 83fc082..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/chardet/jisfreq.py +++ /dev/null @@ -1,325 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# Sampling from about 20M text materials include literature and computer technology -# -# Japanese frequency table, applied to both S-JIS and EUC-JP -# They are sorted in order. - -# 128 --> 0.77094 -# 256 --> 0.85710 -# 512 --> 0.92635 -# 1024 --> 0.97130 -# 2048 --> 0.99431 -# -# Ideal Distribution Ratio = 0.92635 / (1-0.92635) = 12.58 -# Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191 -# -# Typical Distribution Ratio, 25% of IDR - -JIS_TYPICAL_DISTRIBUTION_RATIO = 3.0 - -# Char to FreqOrder table , -JIS_TABLE_SIZE = 4368 - -JIS_CHAR_TO_FREQ_ORDER = ( - 40, 1, 6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, # 16 -3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247, 18, 179,5071, 856,1661, # 32 -1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, # 48 -2042,1061,1062, 48, 49, 44, 45, 433, 434,1040,1041, 996, 787,2997,1255,4305, # 64 -2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, # 80 -5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, # 96 -1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, # 112 -5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, # 128 -5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, # 144 -5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, # 160 -5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, # 176 -5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, # 192 -5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, # 208 -1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, # 224 -1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, # 240 -1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, # 256 -2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, # 272 -3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161, 26,3377, 2,3929, 20, # 288 -3691, 47,4100, 50, 17, 16, 35, 268, 27, 243, 42, 155, 24, 154, 29, 184, # 304 - 4, 91, 14, 92, 53, 396, 33, 289, 9, 37, 64, 620, 21, 39, 321, 5, # 320 - 12, 11, 52, 13, 3, 208, 138, 0, 7, 60, 526, 141, 151,1069, 181, 275, # 336 -1591, 83, 132,1475, 126, 331, 829, 15, 69, 160, 59, 22, 157, 55,1079, 312, # 352 - 109, 38, 23, 25, 10, 19, 79,5195, 61, 382,1124, 8, 30,5196,5197,5198, # 368 -5199,5200,5201,5202,5203,5204,5205,5206, 89, 62, 74, 34,2416, 112, 139, 196, # 384 - 271, 149, 84, 607, 131, 765, 46, 88, 153, 683, 76, 874, 101, 258, 57, 80, # 400 - 32, 364, 121,1508, 169,1547, 68, 235, 145,2999, 41, 360,3027, 70, 63, 31, # 416 - 43, 259, 262,1383, 99, 533, 194, 66, 93, 846, 217, 192, 56, 106, 58, 565, # 432 - 280, 272, 311, 256, 146, 82, 308, 71, 100, 128, 214, 655, 110, 261, 104,1140, # 448 - 54, 51, 36, 87, 67,3070, 185,2618,2936,2020, 28,1066,2390,2059,5207,5208, # 464 -5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, # 480 -5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, # 496 -5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, # 512 -4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, # 528 -5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, # 544 -5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, # 560 -5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, # 576 -5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, # 592 -5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, # 608 -5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, # 624 -5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, # 640 -5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, # 656 -5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, # 672 -3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, # 688 -5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, # 704 -5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, # 720 -5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, # 736 -5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, # 752 -5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, # 768 -5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, # 784 -5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, # 800 -5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, # 816 -5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, # 832 -5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, # 848 -5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, # 864 -5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, # 880 -5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, # 896 -5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, # 912 -5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, # 928 -5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, # 944 -5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, # 960 -5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, # 976 -5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, # 992 -5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, # 1008 -5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, # 1024 -5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, # 1040 -5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, # 1056 -5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, # 1072 -5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, # 1088 -5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, # 1104 -5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, # 1120 -5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, # 1136 -5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, # 1152 -5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, # 1168 -5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, # 1184 -5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, # 1200 -5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, # 1216 -5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, # 1232 -5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, # 1248 -5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, # 1264 -5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, # 1280 -5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, # 1296 -6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, # 1312 -6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, # 1328 -6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, # 1344 -6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, # 1360 -6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, # 1376 -6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, # 1392 -6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, # 1408 -6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, # 1424 -4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, # 1440 - 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, # 1456 - 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, # 1472 -1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619, 65,3302,2045, # 1488 -1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, # 1504 - 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, # 1520 -3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, # 1536 -3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, # 1552 - 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, # 1568 -3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, # 1584 -3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, # 1600 - 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, # 1616 -2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, # 1632 - 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, # 1648 -3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, # 1664 -1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, # 1680 - 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, # 1696 -1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, # 1712 - 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, # 1728 -2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, # 1744 -2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, # 1760 -2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, # 1776 -2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, # 1792 -1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, # 1808 -1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, # 1824 -1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, # 1840 -1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, # 1856 -2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, # 1872 -1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, # 1888 -2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, # 1904 -1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, # 1920 -1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, # 1936 -1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, # 1952 -1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, # 1968 -1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, # 1984 -1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, # 2000 - 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, # 2016 - 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, # 2032 -1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, # 2048 -2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, # 2064 -2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, # 2080 -2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, # 2096 -3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, # 2112 -3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, # 2128 - 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, # 2144 -3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, # 2160 -1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876, 78,2287,1482,1277, # 2176 - 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, # 2192 -2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, # 2208 -1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, # 2224 - 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, # 2240 -3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, # 2256 -4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, # 2272 -2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, # 2288 -1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, # 2304 -2601,1919,1078, 75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, # 2320 -1075, 292,3818,1756,2602, 317, 98,3173,3605,3525,1844,2218,3819,2502, 814, 567, # 2336 - 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, # 2352 - 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, # 2368 -1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, # 2384 -2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, # 2400 -2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, # 2416 -2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, # 2432 -3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, # 2448 -1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, # 2464 -2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, # 2480 - 359,2291,1676, 73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, # 2496 - 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, # 2512 - 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, # 2528 -1209, 96, 587,2166,1032, 260,1072,2153, 173, 94, 226,3244, 819,2006,4642,4114, # 2544 -2203, 231,1744, 782, 97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, # 2560 - 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, # 2576 -1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, # 2592 -1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, # 2608 - 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, # 2624 -1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, # 2640 -1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, # 2656 -1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, # 2672 - 764,2861,1853, 688,2429,1920,1462, 77, 595, 415,2002,3034, 798,1192,4115,6144, # 2688 -2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, # 2704 - 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, # 2720 -2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, # 2736 -3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, # 2752 -2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, # 2768 -1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, # 2784 -6147, 441, 762,1771,3447,3607,3608,1904, 840,3037, 86, 939,1385, 572,1370,2445, # 2800 -1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, # 2816 -2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, # 2832 -1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, # 2848 - 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, # 2864 - 72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, # 2880 -3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, # 2896 -3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, # 2912 -1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, # 2928 -1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, # 2944 -1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, # 2960 -1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, # 2976 - 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, # 2992 - 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, # 3008 -2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, # 3024 - 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, # 3040 -3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, # 3056 -2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, # 3072 - 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, # 3088 -1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, # 3104 -2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, # 3120 - 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, # 3136 -1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, # 3152 - 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, # 3168 -4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, # 3184 -2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, # 3200 -1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, # 3216 - 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, # 3232 -1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, # 3248 -2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, # 3264 - 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, # 3280 -6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, # 3296 -1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, # 3312 -1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, # 3328 -2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, # 3344 -3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, # 3360 - 914,2550,2587, 81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, # 3376 -3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, # 3392 -1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, # 3408 - 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, # 3424 -1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, # 3440 - 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, # 3456 -3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, # 3472 - 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, # 3488 -2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, # 3504 - 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, # 3520 -4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, # 3536 -2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, # 3552 -1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, # 3568 -1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, # 3584 -1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, # 3600 - 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, # 3616 -1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, # 3632 -3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, # 3648 -1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, # 3664 -3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, # 3680 - 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, # 3696 - 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, # 3712 - 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, # 3728 -2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, # 3744 -1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, # 3760 - 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, # 3776 -1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, # 3792 - 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, # 3808 -1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, # 3824 - 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, # 3840 - 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, # 3856 - 480,2083,1774,3458, 923,2279,1350, 221,3086, 85,2233,2234,3835,1585,3010,2147, # 3872 -1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, # 3888 -1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, # 3904 -2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, # 3920 -4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, # 3936 - 227,1351,1645,2453,2193,1421,2887, 812,2121, 634, 95,2435, 201,2312,4665,1646, # 3952 -1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, # 3968 - 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, # 3984 -1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, # 4000 -3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, # 4016 -1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, # 4032 -2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, # 4048 -2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, # 4064 -1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, # 4080 -1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, # 4096 -2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, # 4112 - 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, # 4128 -2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, # 4144 -1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, # 4160 -1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, # 4176 -1279,2136,1697,2335, 204, 721,2097,3838, 90,6186,2085,2505, 191,3967, 124,2148, # 4192 -1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, # 4208 -3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, # 4224 -2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, # 4240 -2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, # 4256 - 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, # 4272 -3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, # 4288 -3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, # 4304 -1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, # 4320 -2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, # 4336 -1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, # 4352 -2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, # 4368 #last 512 -) - - diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/jpcntx.py b/env/lib/python3.7/site-packages/pip/_vendor/chardet/jpcntx.py deleted file mode 100644 index 20044e4..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/chardet/jpcntx.py +++ /dev/null @@ -1,233 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - - -# This is hiragana 2-char sequence table, the number in each cell represents its frequency category -jp2CharContext = ( -(0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1), -(2,4,0,4,0,3,0,4,0,3,4,4,4,2,4,3,3,4,3,2,3,3,4,2,3,3,3,2,4,1,4,3,3,1,5,4,3,4,3,4,3,5,3,0,3,5,4,2,0,3,1,0,3,3,0,3,3,0,1,1,0,4,3,0,3,3,0,4,0,2,0,3,5,5,5,5,4,0,4,1,0,3,4), -(0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2), -(0,4,0,5,0,5,0,4,0,4,5,4,4,3,5,3,5,1,5,3,4,3,4,4,3,4,3,3,4,3,5,4,4,3,5,5,3,5,5,5,3,5,5,3,4,5,5,3,1,3,2,0,3,4,0,4,2,0,4,2,1,5,3,2,3,5,0,4,0,2,0,5,4,4,5,4,5,0,4,0,0,4,4), -(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), -(0,3,0,4,0,3,0,3,0,4,5,4,3,3,3,3,4,3,5,4,4,3,5,4,4,3,4,3,4,4,4,4,5,3,4,4,3,4,5,5,4,5,5,1,4,5,4,3,0,3,3,1,3,3,0,4,4,0,3,3,1,5,3,3,3,5,0,4,0,3,0,4,4,3,4,3,3,0,4,1,1,3,4), -(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), -(0,4,0,3,0,3,0,4,0,3,4,4,3,2,2,1,2,1,3,1,3,3,3,3,3,4,3,1,3,3,5,3,3,0,4,3,0,5,4,3,3,5,4,4,3,4,4,5,0,1,2,0,1,2,0,2,2,0,1,0,0,5,2,2,1,4,0,3,0,1,0,4,4,3,5,4,3,0,2,1,0,4,3), -(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), -(0,3,0,5,0,4,0,2,1,4,4,2,4,1,4,2,4,2,4,3,3,3,4,3,3,3,3,1,4,2,3,3,3,1,4,4,1,1,1,4,3,3,2,0,2,4,3,2,0,3,3,0,3,1,1,0,0,0,3,3,0,4,2,2,3,4,0,4,0,3,0,4,4,5,3,4,4,0,3,0,0,1,4), -(1,4,0,4,0,4,0,4,0,3,5,4,4,3,4,3,5,4,3,3,4,3,5,4,4,4,4,3,4,2,4,3,3,1,5,4,3,2,4,5,4,5,5,4,4,5,4,4,0,3,2,2,3,3,0,4,3,1,3,2,1,4,3,3,4,5,0,3,0,2,0,4,5,5,4,5,4,0,4,0,0,5,4), -(0,5,0,5,0,4,0,3,0,4,4,3,4,3,3,3,4,0,4,4,4,3,4,3,4,3,3,1,4,2,4,3,4,0,5,4,1,4,5,4,4,5,3,2,4,3,4,3,2,4,1,3,3,3,2,3,2,0,4,3,3,4,3,3,3,4,0,4,0,3,0,4,5,4,4,4,3,0,4,1,0,1,3), -(0,3,1,4,0,3,0,2,0,3,4,4,3,1,4,2,3,3,4,3,4,3,4,3,4,4,3,2,3,1,5,4,4,1,4,4,3,5,4,4,3,5,5,4,3,4,4,3,1,2,3,1,2,2,0,3,2,0,3,1,0,5,3,3,3,4,3,3,3,3,4,4,4,4,5,4,2,0,3,3,2,4,3), -(0,2,0,3,0,1,0,1,0,0,3,2,0,0,2,0,1,0,2,1,3,3,3,1,2,3,1,0,1,0,4,2,1,1,3,3,0,4,3,3,1,4,3,3,0,3,3,2,0,0,0,0,1,0,0,2,0,0,0,0,0,4,1,0,2,3,2,2,2,1,3,3,3,4,4,3,2,0,3,1,0,3,3), -(0,4,0,4,0,3,0,3,0,4,4,4,3,3,3,3,3,3,4,3,4,2,4,3,4,3,3,2,4,3,4,5,4,1,4,5,3,5,4,5,3,5,4,0,3,5,5,3,1,3,3,2,2,3,0,3,4,1,3,3,2,4,3,3,3,4,0,4,0,3,0,4,5,4,4,5,3,0,4,1,0,3,4), -(0,2,0,3,0,3,0,0,0,2,2,2,1,0,1,0,0,0,3,0,3,0,3,0,1,3,1,0,3,1,3,3,3,1,3,3,3,0,1,3,1,3,4,0,0,3,1,1,0,3,2,0,0,0,0,1,3,0,1,0,0,3,3,2,0,3,0,0,0,0,0,3,4,3,4,3,3,0,3,0,0,2,3), -(2,3,0,3,0,2,0,1,0,3,3,4,3,1,3,1,1,1,3,1,4,3,4,3,3,3,0,0,3,1,5,4,3,1,4,3,2,5,5,4,4,4,4,3,3,4,4,4,0,2,1,1,3,2,0,1,2,0,0,1,0,4,1,3,3,3,0,3,0,1,0,4,4,4,5,5,3,0,2,0,0,4,4), -(0,2,0,1,0,3,1,3,0,2,3,3,3,0,3,1,0,0,3,0,3,2,3,1,3,2,1,1,0,0,4,2,1,0,2,3,1,4,3,2,0,4,4,3,1,3,1,3,0,1,0,0,1,0,0,0,1,0,0,0,0,4,1,1,1,2,0,3,0,0,0,3,4,2,4,3,2,0,1,0,0,3,3), -(0,1,0,4,0,5,0,4,0,2,4,4,2,3,3,2,3,3,5,3,3,3,4,3,4,2,3,0,4,3,3,3,4,1,4,3,2,1,5,5,3,4,5,1,3,5,4,2,0,3,3,0,1,3,0,4,2,0,1,3,1,4,3,3,3,3,0,3,0,1,0,3,4,4,4,5,5,0,3,0,1,4,5), -(0,2,0,3,0,3,0,0,0,2,3,1,3,0,4,0,1,1,3,0,3,4,3,2,3,1,0,3,3,2,3,1,3,0,2,3,0,2,1,4,1,2,2,0,0,3,3,0,0,2,0,0,0,1,0,0,0,0,2,2,0,3,2,1,3,3,0,2,0,2,0,0,3,3,1,2,4,0,3,0,2,2,3), -(2,4,0,5,0,4,0,4,0,2,4,4,4,3,4,3,3,3,1,2,4,3,4,3,4,4,5,0,3,3,3,3,2,0,4,3,1,4,3,4,1,4,4,3,3,4,4,3,1,2,3,0,4,2,0,4,1,0,3,3,0,4,3,3,3,4,0,4,0,2,0,3,5,3,4,5,2,0,3,0,0,4,5), -(0,3,0,4,0,1,0,1,0,1,3,2,2,1,3,0,3,0,2,0,2,0,3,0,2,0,0,0,1,0,1,1,0,0,3,1,0,0,0,4,0,3,1,0,2,1,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,2,2,3,1,0,3,0,0,0,1,4,4,4,3,0,0,4,0,0,1,4), -(1,4,1,5,0,3,0,3,0,4,5,4,4,3,5,3,3,4,4,3,4,1,3,3,3,3,2,1,4,1,5,4,3,1,4,4,3,5,4,4,3,5,4,3,3,4,4,4,0,3,3,1,2,3,0,3,1,0,3,3,0,5,4,4,4,4,4,4,3,3,5,4,4,3,3,5,4,0,3,2,0,4,4), -(0,2,0,3,0,1,0,0,0,1,3,3,3,2,4,1,3,0,3,1,3,0,2,2,1,1,0,0,2,0,4,3,1,0,4,3,0,4,4,4,1,4,3,1,1,3,3,1,0,2,0,0,1,3,0,0,0,0,2,0,0,4,3,2,4,3,5,4,3,3,3,4,3,3,4,3,3,0,2,1,0,3,3), -(0,2,0,4,0,3,0,2,0,2,5,5,3,4,4,4,4,1,4,3,3,0,4,3,4,3,1,3,3,2,4,3,0,3,4,3,0,3,4,4,2,4,4,0,4,5,3,3,2,2,1,1,1,2,0,1,5,0,3,3,2,4,3,3,3,4,0,3,0,2,0,4,4,3,5,5,0,0,3,0,2,3,3), -(0,3,0,4,0,3,0,1,0,3,4,3,3,1,3,3,3,0,3,1,3,0,4,3,3,1,1,0,3,0,3,3,0,0,4,4,0,1,5,4,3,3,5,0,3,3,4,3,0,2,0,1,1,1,0,1,3,0,1,2,1,3,3,2,3,3,0,3,0,1,0,1,3,3,4,4,1,0,1,2,2,1,3), -(0,1,0,4,0,4,0,3,0,1,3,3,3,2,3,1,1,0,3,0,3,3,4,3,2,4,2,0,1,0,4,3,2,0,4,3,0,5,3,3,2,4,4,4,3,3,3,4,0,1,3,0,0,1,0,0,1,0,0,0,0,4,2,3,3,3,0,3,0,0,0,4,4,4,5,3,2,0,3,3,0,3,5), -(0,2,0,3,0,0,0,3,0,1,3,0,2,0,0,0,1,0,3,1,1,3,3,0,0,3,0,0,3,0,2,3,1,0,3,1,0,3,3,2,0,4,2,2,0,2,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,2,1,2,0,1,0,1,0,0,0,1,3,1,2,0,0,0,1,0,0,1,4), -(0,3,0,3,0,5,0,1,0,2,4,3,1,3,3,2,1,1,5,2,1,0,5,1,2,0,0,0,3,3,2,2,3,2,4,3,0,0,3,3,1,3,3,0,2,5,3,4,0,3,3,0,1,2,0,2,2,0,3,2,0,2,2,3,3,3,0,2,0,1,0,3,4,4,2,5,4,0,3,0,0,3,5), -(0,3,0,3,0,3,0,1,0,3,3,3,3,0,3,0,2,0,2,1,1,0,2,0,1,0,0,0,2,1,0,0,1,0,3,2,0,0,3,3,1,2,3,1,0,3,3,0,0,1,0,0,0,0,0,2,0,0,0,0,0,2,3,1,2,3,0,3,0,1,0,3,2,1,0,4,3,0,1,1,0,3,3), -(0,4,0,5,0,3,0,3,0,4,5,5,4,3,5,3,4,3,5,3,3,2,5,3,4,4,4,3,4,3,4,5,5,3,4,4,3,4,4,5,4,4,4,3,4,5,5,4,2,3,4,2,3,4,0,3,3,1,4,3,2,4,3,3,5,5,0,3,0,3,0,5,5,5,5,4,4,0,4,0,1,4,4), -(0,4,0,4,0,3,0,3,0,3,5,4,4,2,3,2,5,1,3,2,5,1,4,2,3,2,3,3,4,3,3,3,3,2,5,4,1,3,3,5,3,4,4,0,4,4,3,1,1,3,1,0,2,3,0,2,3,0,3,0,0,4,3,1,3,4,0,3,0,2,0,4,4,4,3,4,5,0,4,0,0,3,4), -(0,3,0,3,0,3,1,2,0,3,4,4,3,3,3,0,2,2,4,3,3,1,3,3,3,1,1,0,3,1,4,3,2,3,4,4,2,4,4,4,3,4,4,3,2,4,4,3,1,3,3,1,3,3,0,4,1,0,2,2,1,4,3,2,3,3,5,4,3,3,5,4,4,3,3,0,4,0,3,2,2,4,4), -(0,2,0,1,0,0,0,0,0,1,2,1,3,0,0,0,0,0,2,0,1,2,1,0,0,1,0,0,0,0,3,0,0,1,0,1,1,3,1,0,0,0,1,1,0,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,1,2,2,0,3,4,0,0,0,1,1,0,0,1,0,0,0,0,0,1,1), -(0,1,0,0,0,1,0,0,0,0,4,0,4,1,4,0,3,0,4,0,3,0,4,0,3,0,3,0,4,1,5,1,4,0,0,3,0,5,0,5,2,0,1,0,0,0,2,1,4,0,1,3,0,0,3,0,0,3,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0), -(1,4,0,5,0,3,0,2,0,3,5,4,4,3,4,3,5,3,4,3,3,0,4,3,3,3,3,3,3,2,4,4,3,1,3,4,4,5,4,4,3,4,4,1,3,5,4,3,3,3,1,2,2,3,3,1,3,1,3,3,3,5,3,3,4,5,0,3,0,3,0,3,4,3,4,4,3,0,3,0,2,4,3), -(0,1,0,4,0,0,0,0,0,1,4,0,4,1,4,2,4,0,3,0,1,0,1,0,0,0,0,0,2,0,3,1,1,1,0,3,0,0,0,1,2,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,3,0,0,0,0,3,2,0,2,2,0,1,0,0,0,2,3,2,3,3,0,0,0,0,2,1,0), -(0,5,1,5,0,3,0,3,0,5,4,4,5,1,5,3,3,0,4,3,4,3,5,3,4,3,3,2,4,3,4,3,3,0,3,3,1,4,4,3,4,4,4,3,4,5,5,3,2,3,1,1,3,3,1,3,1,1,3,3,2,4,5,3,3,5,0,4,0,3,0,4,4,3,5,3,3,0,3,4,0,4,3), -(0,5,0,5,0,3,0,2,0,4,4,3,5,2,4,3,3,3,4,4,4,3,5,3,5,3,3,1,4,0,4,3,3,0,3,3,0,4,4,4,4,5,4,3,3,5,5,3,2,3,1,2,3,2,0,1,0,0,3,2,2,4,4,3,1,5,0,4,0,3,0,4,3,1,3,2,1,0,3,3,0,3,3), -(0,4,0,5,0,5,0,4,0,4,5,5,5,3,4,3,3,2,5,4,4,3,5,3,5,3,4,0,4,3,4,4,3,2,4,4,3,4,5,4,4,5,5,0,3,5,5,4,1,3,3,2,3,3,1,3,1,0,4,3,1,4,4,3,4,5,0,4,0,2,0,4,3,4,4,3,3,0,4,0,0,5,5), -(0,4,0,4,0,5,0,1,1,3,3,4,4,3,4,1,3,0,5,1,3,0,3,1,3,1,1,0,3,0,3,3,4,0,4,3,0,4,4,4,3,4,4,0,3,5,4,1,0,3,0,0,2,3,0,3,1,0,3,1,0,3,2,1,3,5,0,3,0,1,0,3,2,3,3,4,4,0,2,2,0,4,4), -(2,4,0,5,0,4,0,3,0,4,5,5,4,3,5,3,5,3,5,3,5,2,5,3,4,3,3,4,3,4,5,3,2,1,5,4,3,2,3,4,5,3,4,1,2,5,4,3,0,3,3,0,3,2,0,2,3,0,4,1,0,3,4,3,3,5,0,3,0,1,0,4,5,5,5,4,3,0,4,2,0,3,5), -(0,5,0,4,0,4,0,2,0,5,4,3,4,3,4,3,3,3,4,3,4,2,5,3,5,3,4,1,4,3,4,4,4,0,3,5,0,4,4,4,4,5,3,1,3,4,5,3,3,3,3,3,3,3,0,2,2,0,3,3,2,4,3,3,3,5,3,4,1,3,3,5,3,2,0,0,0,0,4,3,1,3,3), -(0,1,0,3,0,3,0,1,0,1,3,3,3,2,3,3,3,0,3,0,0,0,3,1,3,0,0,0,2,2,2,3,0,0,3,2,0,1,2,4,1,3,3,0,0,3,3,3,0,1,0,0,2,1,0,0,3,0,3,1,0,3,0,0,1,3,0,2,0,1,0,3,3,1,3,3,0,0,1,1,0,3,3), -(0,2,0,3,0,2,1,4,0,2,2,3,1,1,3,1,1,0,2,0,3,1,2,3,1,3,0,0,1,0,4,3,2,3,3,3,1,4,2,3,3,3,3,1,0,3,1,4,0,1,1,0,1,2,0,1,1,0,1,1,0,3,1,3,2,2,0,1,0,0,0,2,3,3,3,1,0,0,0,0,0,2,3), -(0,5,0,4,0,5,0,2,0,4,5,5,3,3,4,3,3,1,5,4,4,2,4,4,4,3,4,2,4,3,5,5,4,3,3,4,3,3,5,5,4,5,5,1,3,4,5,3,1,4,3,1,3,3,0,3,3,1,4,3,1,4,5,3,3,5,0,4,0,3,0,5,3,3,1,4,3,0,4,0,1,5,3), -(0,5,0,5,0,4,0,2,0,4,4,3,4,3,3,3,3,3,5,4,4,4,4,4,4,5,3,3,5,2,4,4,4,3,4,4,3,3,4,4,5,5,3,3,4,3,4,3,3,4,3,3,3,3,1,2,2,1,4,3,3,5,4,4,3,4,0,4,0,3,0,4,4,4,4,4,1,0,4,2,0,2,4), -(0,4,0,4,0,3,0,1,0,3,5,2,3,0,3,0,2,1,4,2,3,3,4,1,4,3,3,2,4,1,3,3,3,0,3,3,0,0,3,3,3,5,3,3,3,3,3,2,0,2,0,0,2,0,0,2,0,0,1,0,0,3,1,2,2,3,0,3,0,2,0,4,4,3,3,4,1,0,3,0,0,2,4), -(0,0,0,4,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,1,0,2,0,1,0,0,0,0,0,3,1,3,0,3,2,0,0,0,1,0,3,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,0,2,0,0,0,0,0,0,2), -(0,2,1,3,0,2,0,2,0,3,3,3,3,1,3,1,3,3,3,3,3,3,4,2,2,1,2,1,4,0,4,3,1,3,3,3,2,4,3,5,4,3,3,3,3,3,3,3,0,1,3,0,2,0,0,1,0,0,1,0,0,4,2,0,2,3,0,3,3,0,3,3,4,2,3,1,4,0,1,2,0,2,3), -(0,3,0,3,0,1,0,3,0,2,3,3,3,0,3,1,2,0,3,3,2,3,3,2,3,2,3,1,3,0,4,3,2,0,3,3,1,4,3,3,2,3,4,3,1,3,3,1,1,0,1,1,0,1,0,1,0,1,0,0,0,4,1,1,0,3,0,3,1,0,2,3,3,3,3,3,1,0,0,2,0,3,3), -(0,0,0,0,0,0,0,0,0,0,3,0,2,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,3,0,3,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,2,0,2,3,0,0,0,0,0,0,0,0,3), -(0,2,0,3,1,3,0,3,0,2,3,3,3,1,3,1,3,1,3,1,3,3,3,1,3,0,2,3,1,1,4,3,3,2,3,3,1,2,2,4,1,3,3,0,1,4,2,3,0,1,3,0,3,0,0,1,3,0,2,0,0,3,3,2,1,3,0,3,0,2,0,3,4,4,4,3,1,0,3,0,0,3,3), -(0,2,0,1,0,2,0,0,0,1,3,2,2,1,3,0,1,1,3,0,3,2,3,1,2,0,2,0,1,1,3,3,3,0,3,3,1,1,2,3,2,3,3,1,2,3,2,0,0,1,0,0,0,0,0,0,3,0,1,0,0,2,1,2,1,3,0,3,0,0,0,3,4,4,4,3,2,0,2,0,0,2,4), -(0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,3,1,0,0,0,0,0,0,0,3), -(0,3,0,3,0,2,0,3,0,3,3,3,2,3,2,2,2,0,3,1,3,3,3,2,3,3,0,0,3,0,3,2,2,0,2,3,1,4,3,4,3,3,2,3,1,5,4,4,0,3,1,2,1,3,0,3,1,1,2,0,2,3,1,3,1,3,0,3,0,1,0,3,3,4,4,2,1,0,2,1,0,2,4), -(0,1,0,3,0,1,0,2,0,1,4,2,5,1,4,0,2,0,2,1,3,1,4,0,2,1,0,0,2,1,4,1,1,0,3,3,0,5,1,3,2,3,3,1,0,3,2,3,0,1,0,0,0,0,0,0,1,0,0,0,0,4,0,1,0,3,0,2,0,1,0,3,3,3,4,3,3,0,0,0,0,2,3), -(0,0,0,1,0,0,0,0,0,0,2,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,1,0,0,0,0,0,3), -(0,1,0,3,0,4,0,3,0,2,4,3,1,0,3,2,2,1,3,1,2,2,3,1,1,1,2,1,3,0,1,2,0,1,3,2,1,3,0,5,5,1,0,0,1,3,2,1,0,3,0,0,1,0,0,0,0,0,3,4,0,1,1,1,3,2,0,2,0,1,0,2,3,3,1,2,3,0,1,0,1,0,4), -(0,0,0,1,0,3,0,3,0,2,2,1,0,0,4,0,3,0,3,1,3,0,3,0,3,0,1,0,3,0,3,1,3,0,3,3,0,0,1,2,1,1,1,0,1,2,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,2,1,2,0,0,2,0,0,0,0,2,3,3,3,3,0,0,0,0,1,4), -(0,0,0,3,0,3,0,0,0,0,3,1,1,0,3,0,1,0,2,0,1,0,0,0,0,0,0,0,1,0,3,0,2,0,2,3,0,0,2,2,3,1,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,2,3), -(2,4,0,5,0,5,0,4,0,3,4,3,3,3,4,3,3,3,4,3,4,4,5,4,5,5,5,2,3,0,5,5,4,1,5,4,3,1,5,4,3,4,4,3,3,4,3,3,0,3,2,0,2,3,0,3,0,0,3,3,0,5,3,2,3,3,0,3,0,3,0,3,4,5,4,5,3,0,4,3,0,3,4), -(0,3,0,3,0,3,0,3,0,3,3,4,3,2,3,2,3,0,4,3,3,3,3,3,3,3,3,0,3,2,4,3,3,1,3,4,3,4,4,4,3,4,4,3,2,4,4,1,0,2,0,0,1,1,0,2,0,0,3,1,0,5,3,2,1,3,0,3,0,1,2,4,3,2,4,3,3,0,3,2,0,4,4), -(0,3,0,3,0,1,0,0,0,1,4,3,3,2,3,1,3,1,4,2,3,2,4,2,3,4,3,0,2,2,3,3,3,0,3,3,3,0,3,4,1,3,3,0,3,4,3,3,0,1,1,0,1,0,0,0,4,0,3,0,0,3,1,2,1,3,0,4,0,1,0,4,3,3,4,3,3,0,2,0,0,3,3), -(0,3,0,4,0,1,0,3,0,3,4,3,3,0,3,3,3,1,3,1,3,3,4,3,3,3,0,0,3,1,5,3,3,1,3,3,2,5,4,3,3,4,5,3,2,5,3,4,0,1,0,0,0,0,0,2,0,0,1,1,0,4,2,2,1,3,0,3,0,2,0,4,4,3,5,3,2,0,1,1,0,3,4), -(0,5,0,4,0,5,0,2,0,4,4,3,3,2,3,3,3,1,4,3,4,1,5,3,4,3,4,0,4,2,4,3,4,1,5,4,0,4,4,4,4,5,4,1,3,5,4,2,1,4,1,1,3,2,0,3,1,0,3,2,1,4,3,3,3,4,0,4,0,3,0,4,4,4,3,3,3,0,4,2,0,3,4), -(1,4,0,4,0,3,0,1,0,3,3,3,1,1,3,3,2,2,3,3,1,0,3,2,2,1,2,0,3,1,2,1,2,0,3,2,0,2,2,3,3,4,3,0,3,3,1,2,0,1,1,3,1,2,0,0,3,0,1,1,0,3,2,2,3,3,0,3,0,0,0,2,3,3,4,3,3,0,1,0,0,1,4), -(0,4,0,4,0,4,0,0,0,3,4,4,3,1,4,2,3,2,3,3,3,1,4,3,4,0,3,0,4,2,3,3,2,2,5,4,2,1,3,4,3,4,3,1,3,3,4,2,0,2,1,0,3,3,0,0,2,0,3,1,0,4,4,3,4,3,0,4,0,1,0,2,4,4,4,4,4,0,3,2,0,3,3), -(0,0,0,1,0,4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,3,2,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2), -(0,2,0,3,0,4,0,4,0,1,3,3,3,0,4,0,2,1,2,1,1,1,2,0,3,1,1,0,1,0,3,1,0,0,3,3,2,0,1,1,0,0,0,0,0,1,0,2,0,2,2,0,3,1,0,0,1,0,1,1,0,1,2,0,3,0,0,0,0,1,0,0,3,3,4,3,1,0,1,0,3,0,2), -(0,0,0,3,0,5,0,0,0,0,1,0,2,0,3,1,0,1,3,0,0,0,2,0,0,0,1,0,0,0,1,1,0,0,4,0,0,0,2,3,0,1,4,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,3,0,0,0,0,0,3), -(0,2,0,5,0,5,0,1,0,2,4,3,3,2,5,1,3,2,3,3,3,0,4,1,2,0,3,0,4,0,2,2,1,1,5,3,0,0,1,4,2,3,2,0,3,3,3,2,0,2,4,1,1,2,0,1,1,0,3,1,0,1,3,1,2,3,0,2,0,0,0,1,3,5,4,4,4,0,3,0,0,1,3), -(0,4,0,5,0,4,0,4,0,4,5,4,3,3,4,3,3,3,4,3,4,4,5,3,4,5,4,2,4,2,3,4,3,1,4,4,1,3,5,4,4,5,5,4,4,5,5,5,2,3,3,1,4,3,1,3,3,0,3,3,1,4,3,4,4,4,0,3,0,4,0,3,3,4,4,5,0,0,4,3,0,4,5), -(0,4,0,4,0,3,0,3,0,3,4,4,4,3,3,2,4,3,4,3,4,3,5,3,4,3,2,1,4,2,4,4,3,1,3,4,2,4,5,5,3,4,5,4,1,5,4,3,0,3,2,2,3,2,1,3,1,0,3,3,3,5,3,3,3,5,4,4,2,3,3,4,3,3,3,2,1,0,3,2,1,4,3), -(0,4,0,5,0,4,0,3,0,3,5,5,3,2,4,3,4,0,5,4,4,1,4,4,4,3,3,3,4,3,5,5,2,3,3,4,1,2,5,5,3,5,5,2,3,5,5,4,0,3,2,0,3,3,1,1,5,1,4,1,0,4,3,2,3,5,0,4,0,3,0,5,4,3,4,3,0,0,4,1,0,4,4), -(1,3,0,4,0,2,0,2,0,2,5,5,3,3,3,3,3,0,4,2,3,4,4,4,3,4,0,0,3,4,5,4,3,3,3,3,2,5,5,4,5,5,5,4,3,5,5,5,1,3,1,0,1,0,0,3,2,0,4,2,0,5,2,3,2,4,1,3,0,3,0,4,5,4,5,4,3,0,4,2,0,5,4), -(0,3,0,4,0,5,0,3,0,3,4,4,3,2,3,2,3,3,3,3,3,2,4,3,3,2,2,0,3,3,3,3,3,1,3,3,3,0,4,4,3,4,4,1,1,4,4,2,0,3,1,0,1,1,0,4,1,0,2,3,1,3,3,1,3,4,0,3,0,1,0,3,1,3,0,0,1,0,2,0,0,4,4), -(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), -(0,3,0,3,0,2,0,3,0,1,5,4,3,3,3,1,4,2,1,2,3,4,4,2,4,4,5,0,3,1,4,3,4,0,4,3,3,3,2,3,2,5,3,4,3,2,2,3,0,0,3,0,2,1,0,1,2,0,0,0,0,2,1,1,3,1,0,2,0,4,0,3,4,4,4,5,2,0,2,0,0,1,3), -(0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,4,2,1,1,0,1,0,3,2,0,0,3,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,0,0,0,2,0,0,0,1,4,0,4,2,1,0,0,0,0,0,1), -(0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,3,1,0,0,0,2,0,2,1,0,0,1,2,1,0,1,1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,3,1,0,0,0,0,0,1,0,0,2,1,0,0,0,0,0,0,0,0,2), -(0,4,0,4,0,4,0,3,0,4,4,3,4,2,4,3,2,0,4,4,4,3,5,3,5,3,3,2,4,2,4,3,4,3,1,4,0,2,3,4,4,4,3,3,3,4,4,4,3,4,1,3,4,3,2,1,2,1,3,3,3,4,4,3,3,5,0,4,0,3,0,4,3,3,3,2,1,0,3,0,0,3,3), -(0,4,0,3,0,3,0,3,0,3,5,5,3,3,3,3,4,3,4,3,3,3,4,4,4,3,3,3,3,4,3,5,3,3,1,3,2,4,5,5,5,5,4,3,4,5,5,3,2,2,3,3,3,3,2,3,3,1,2,3,2,4,3,3,3,4,0,4,0,2,0,4,3,2,2,1,2,0,3,0,0,4,1), -) - -class JapaneseContextAnalysis(object): - NUM_OF_CATEGORY = 6 - DONT_KNOW = -1 - ENOUGH_REL_THRESHOLD = 100 - MAX_REL_THRESHOLD = 1000 - MINIMUM_DATA_THRESHOLD = 4 - - def __init__(self): - self._total_rel = None - self._rel_sample = None - self._need_to_skip_char_num = None - self._last_char_order = None - self._done = None - self.reset() - - def reset(self): - self._total_rel = 0 # total sequence received - # category counters, each integer counts sequence in its category - self._rel_sample = [0] * self.NUM_OF_CATEGORY - # if last byte in current buffer is not the last byte of a character, - # we need to know how many bytes to skip in next buffer - self._need_to_skip_char_num = 0 - self._last_char_order = -1 # The order of previous char - # If this flag is set to True, detection is done and conclusion has - # been made - self._done = False - - def feed(self, byte_str, num_bytes): - if self._done: - return - - # The buffer we got is byte oriented, and a character may span in more than one - # buffers. In case the last one or two byte in last buffer is not - # complete, we record how many byte needed to complete that character - # and skip these bytes here. We can choose to record those bytes as - # well and analyse the character once it is complete, but since a - # character will not make much difference, by simply skipping - # this character will simply our logic and improve performance. - i = self._need_to_skip_char_num - while i < num_bytes: - order, char_len = self.get_order(byte_str[i:i + 2]) - i += char_len - if i > num_bytes: - self._need_to_skip_char_num = i - num_bytes - self._last_char_order = -1 - else: - if (order != -1) and (self._last_char_order != -1): - self._total_rel += 1 - if self._total_rel > self.MAX_REL_THRESHOLD: - self._done = True - break - self._rel_sample[jp2CharContext[self._last_char_order][order]] += 1 - self._last_char_order = order - - def got_enough_data(self): - return self._total_rel > self.ENOUGH_REL_THRESHOLD - - def get_confidence(self): - # This is just one way to calculate confidence. It works well for me. - if self._total_rel > self.MINIMUM_DATA_THRESHOLD: - return (self._total_rel - self._rel_sample[0]) / self._total_rel - else: - return self.DONT_KNOW - - def get_order(self, byte_str): - return -1, 1 - -class SJISContextAnalysis(JapaneseContextAnalysis): - def __init__(self): - super(SJISContextAnalysis, self).__init__() - self._charset_name = "SHIFT_JIS" - - @property - def charset_name(self): - return self._charset_name - - def get_order(self, byte_str): - if not byte_str: - return -1, 1 - # find out current char's byte length - first_char = byte_str[0] - if (0x81 <= first_char <= 0x9F) or (0xE0 <= first_char <= 0xFC): - char_len = 2 - if (first_char == 0x87) or (0xFA <= first_char <= 0xFC): - self._charset_name = "CP932" - else: - char_len = 1 - - # return its order if it is hiragana - if len(byte_str) > 1: - second_char = byte_str[1] - if (first_char == 202) and (0x9F <= second_char <= 0xF1): - return second_char - 0x9F, char_len - - return -1, char_len - -class EUCJPContextAnalysis(JapaneseContextAnalysis): - def get_order(self, byte_str): - if not byte_str: - return -1, 1 - # find out current char's byte length - first_char = byte_str[0] - if (first_char == 0x8E) or (0xA1 <= first_char <= 0xFE): - char_len = 2 - elif first_char == 0x8F: - char_len = 3 - else: - char_len = 1 - - # return its order if it is hiragana - if len(byte_str) > 1: - second_char = byte_str[1] - if (first_char == 0xA4) and (0xA1 <= second_char <= 0xF3): - return second_char - 0xA1, char_len - - return -1, char_len - - diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/langbulgarianmodel.py b/env/lib/python3.7/site-packages/pip/_vendor/chardet/langbulgarianmodel.py deleted file mode 100644 index 2aa4fb2..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/chardet/langbulgarianmodel.py +++ /dev/null @@ -1,228 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# Character Mapping Table: -# this table is modified base on win1251BulgarianCharToOrderMap, so -# only number <64 is sure valid - -Latin5_BulgarianCharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 -110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 -253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 -116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 -194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209, # 80 -210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225, # 90 - 81,226,227,228,229,230,105,231,232,233,234,235,236, 45,237,238, # a0 - 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # b0 - 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,239, 67,240, 60, 56, # c0 - 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # d0 - 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,241, 42, 16, # e0 - 62,242,243,244, 58,245, 98,246,247,248,249,250,251, 91,252,253, # f0 -) - -win1251BulgarianCharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 -110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 -253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 -116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 -206,207,208,209,210,211,212,213,120,214,215,216,217,218,219,220, # 80 -221, 78, 64, 83,121, 98,117,105,222,223,224,225,226,227,228,229, # 90 - 88,230,231,232,233,122, 89,106,234,235,236,237,238, 45,239,240, # a0 - 73, 80,118,114,241,242,243,244,245, 62, 58,246,247,248,249,250, # b0 - 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # c0 - 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,251, 67,252, 60, 56, # d0 - 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # e0 - 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,253, 42, 16, # f0 -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 96.9392% -# first 1024 sequences:3.0618% -# rest sequences: 0.2992% -# negative sequences: 0.0020% -BulgarianLangModel = ( -0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,3,3,3,3,3, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,2,2,1,2,2, -3,1,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,0,1, -0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,3,3,0,3,1,0, -0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,2,3,2,2,1,3,3,3,3,2,2,2,1,1,2,0,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,2,3,2,2,3,3,1,1,2,3,3,2,3,3,3,3,2,1,2,0,2,0,3,0,0, -0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,1,3,3,3,3,3,2,3,2,3,3,3,3,3,2,3,3,1,3,0,3,0,2,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,1,3,3,2,3,3,3,1,3,3,2,3,2,2,2,0,0,2,0,2,0,2,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,3,3,1,2,2,3,2,1,1,2,0,2,0,0,0,0, -1,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,2,3,3,1,2,3,2,2,2,3,3,3,3,3,2,2,3,1,2,0,2,1,2,0,0, -0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,1,3,3,3,3,3,2,3,3,3,2,3,3,2,3,2,2,2,3,1,2,0,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,3,3,1,1,1,2,2,1,3,1,3,2,2,3,0,0,1,0,1,0,1,0,0, -0,0,0,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,2,2,3,2,2,3,1,2,1,1,1,2,3,1,3,1,2,2,0,1,1,1,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,1,3,2,2,3,3,1,2,3,1,1,3,3,3,3,1,2,2,1,1,1,0,2,0,2,0,1, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,2,2,3,3,3,2,2,1,1,2,0,2,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,0,1,2,1,3,3,2,3,3,3,3,3,2,3,2,1,0,3,1,2,1,2,1,2,3,2,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,1,3,3,2,3,3,2,2,2,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,0,3,3,3,3,3,2,1,1,2,1,3,3,0,3,1,1,1,1,3,2,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,1,1,3,1,3,3,2,3,2,2,2,3,0,2,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,2,3,3,2,2,3,2,1,1,1,1,1,3,1,3,1,1,0,0,0,1,0,0,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,2,3,2,0,3,2,0,3,0,2,0,0,2,1,3,1,0,0,1,0,0,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,2,1,1,1,1,2,1,1,2,1,1,1,2,2,1,2,1,1,1,0,1,1,0,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,2,1,3,1,1,2,1,3,2,1,1,0,1,2,3,2,1,1,1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,2,2,1,0,1,0,0,1,0,0,0,2,1,0,3,0,0,1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,2,3,2,3,3,1,3,2,1,1,1,2,1,1,2,1,3,0,1,0,0,0,1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,2,2,3,3,2,3,2,2,2,3,1,2,2,1,1,2,1,1,2,2,0,1,1,0,1,0,2,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,2,1,3,1,0,2,2,1,3,2,1,0,0,2,0,2,0,1,0,0,0,0,0,0,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,1,2,0,2,3,1,2,3,2,0,1,3,1,2,1,1,1,0,0,1,0,0,2,2,2,3, -2,2,2,2,1,2,1,1,2,2,1,1,2,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,0,1, -3,3,3,3,3,2,1,2,2,1,2,0,2,0,1,0,1,2,1,2,1,1,0,0,0,1,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,2,3,3,1,1,3,1,0,3,2,1,0,0,0,1,2,0,2,0,1,0,0,0,1,0,1,2,1,2,2, -1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,1,2,1,1,1,0,0,0,0,0,1,1,0,0, -3,1,0,1,0,2,3,2,2,2,3,2,2,2,2,2,1,0,2,1,2,1,1,1,0,1,2,1,2,2,2,1, -1,1,2,2,2,2,1,2,1,1,0,1,2,1,2,2,2,1,1,1,0,1,1,1,1,2,0,1,0,0,0,0, -2,3,2,3,3,0,0,2,1,0,2,1,0,0,0,0,2,3,0,2,0,0,0,0,0,1,0,0,2,0,1,2, -2,1,2,1,2,2,1,1,1,2,1,1,1,0,1,2,2,1,1,1,1,1,0,1,1,1,0,0,1,2,0,0, -3,3,2,2,3,0,2,3,1,1,2,0,0,0,1,0,0,2,0,2,0,0,0,1,0,1,0,1,2,0,2,2, -1,1,1,1,2,1,0,1,2,2,2,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,0,0, -2,3,2,3,3,0,0,3,0,1,1,0,1,0,0,0,2,2,1,2,0,0,0,0,0,0,0,0,2,0,1,2, -2,2,1,1,1,1,1,2,2,2,1,0,2,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,1,0,0, -3,3,3,3,2,2,2,2,2,0,2,1,1,1,1,2,1,2,1,1,0,2,0,1,0,1,0,0,2,0,1,2, -1,1,1,1,1,1,1,2,2,1,1,0,2,0,1,0,2,0,0,1,1,1,0,0,2,0,0,0,1,1,0,0, -2,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,0,0,0,1,2,0,1,2, -2,2,2,1,1,2,1,1,2,2,2,1,2,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,0,0, -2,3,3,3,3,0,2,2,0,2,1,0,0,0,1,1,1,2,0,2,0,0,0,3,0,0,0,0,2,0,2,2, -1,1,1,2,1,2,1,1,2,2,2,1,2,0,1,1,1,0,1,1,1,1,0,2,1,0,0,0,1,1,0,0, -2,3,3,3,3,0,2,1,0,0,2,0,0,0,0,0,1,2,0,2,0,0,0,0,0,0,0,0,2,0,1,2, -1,1,1,2,1,1,1,1,2,2,2,0,1,0,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0, -3,3,2,2,3,0,1,0,1,0,0,0,0,0,0,0,1,1,0,3,0,0,0,0,0,0,0,0,1,0,2,2, -1,1,1,1,1,2,1,1,2,2,1,2,2,1,0,1,1,1,1,1,0,1,0,0,1,0,0,0,1,1,0,0, -3,1,0,1,0,2,2,2,2,3,2,1,1,1,2,3,0,0,1,0,2,1,1,0,1,1,1,1,2,1,1,1, -1,2,2,1,2,1,2,2,1,1,0,1,2,1,2,2,1,1,1,0,0,1,1,1,2,1,0,1,0,0,0,0, -2,1,0,1,0,3,1,2,2,2,2,1,2,2,1,1,1,0,2,1,2,2,1,1,2,1,1,0,2,1,1,1, -1,2,2,2,2,2,2,2,1,2,0,1,1,0,2,1,1,1,1,1,0,0,1,1,1,1,0,1,0,0,0,0, -2,1,1,1,1,2,2,2,2,1,2,2,2,1,2,2,1,1,2,1,2,3,2,2,1,1,1,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,3,2,0,1,2,0,1,2,1,1,0,1,0,1,2,1,2,0,0,0,1,1,0,0,0,1,0,0,2, -1,1,0,0,1,1,0,1,1,1,1,0,2,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0, -2,0,0,0,0,1,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,2,1,1,1, -1,2,2,2,2,1,1,2,1,2,1,1,1,0,2,1,2,1,1,1,0,2,1,1,1,1,0,1,0,0,0,0, -3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, -1,1,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,3,2,0,0,0,0,1,0,0,0,0,0,0,1,1,0,2,0,0,0,0,0,0,0,0,1,0,1,2, -1,1,1,1,1,1,0,0,2,2,2,2,2,0,1,1,0,1,1,1,1,1,0,0,1,0,0,0,1,1,0,1, -2,3,1,2,1,0,1,1,0,2,2,2,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,2, -1,1,1,1,2,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0, -2,2,2,2,2,0,0,2,0,0,2,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,0,2,2, -1,1,1,1,1,0,0,1,2,1,1,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,2,0,0,2,0,1,1,0,0,0,1,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,1,1, -0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,3,2,0,0,1,0,0,1,0,0,0,0,0,0,1,0,2,0,0,0,1,0,0,0,0,0,0,0,2, -1,1,0,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -2,1,2,2,2,1,2,1,2,2,1,1,2,1,1,1,0,1,1,1,1,2,0,1,0,1,1,1,1,0,1,1, -1,1,2,1,1,1,1,1,1,0,0,1,2,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0, -1,0,0,1,3,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,2,1,0,0,1,0,2,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,2,0,0,1, -0,2,0,1,0,0,1,1,2,0,1,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,2,0,1,1,0,2,1,0,1,1,1,0,0,1,0,2,0,1,0,0,0,0,0,0,0,0,0,1, -0,1,0,0,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,2,2,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, -0,1,0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -2,0,1,0,0,1,2,1,1,1,1,1,1,2,2,1,0,0,1,0,1,0,0,0,0,1,1,1,1,0,0,0, -1,1,2,1,1,1,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,1,2,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, -0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, -0,1,1,0,1,1,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, -1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,2,0,0,2,0,1,0,0,1,0,0,1, -1,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, -1,1,1,1,1,1,1,2,0,0,0,0,0,0,2,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -) - -Latin5BulgarianModel = { - 'char_to_order_map': Latin5_BulgarianCharToOrderMap, - 'precedence_matrix': BulgarianLangModel, - 'typical_positive_ratio': 0.969392, - 'keep_english_letter': False, - 'charset_name': "ISO-8859-5", - 'language': 'Bulgairan', -} - -Win1251BulgarianModel = { - 'char_to_order_map': win1251BulgarianCharToOrderMap, - 'precedence_matrix': BulgarianLangModel, - 'typical_positive_ratio': 0.969392, - 'keep_english_letter': False, - 'charset_name': "windows-1251", - 'language': 'Bulgarian', -} diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/langcyrillicmodel.py b/env/lib/python3.7/site-packages/pip/_vendor/chardet/langcyrillicmodel.py deleted file mode 100644 index e5f9a1f..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/chardet/langcyrillicmodel.py +++ /dev/null @@ -1,333 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# KOI8-R language model -# Character Mapping Table: -KOI8R_char_to_order_map = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, # 80 -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, # 90 -223,224,225, 68,226,227,228,229,230,231,232,233,234,235,236,237, # a0 -238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253, # b0 - 27, 3, 21, 28, 13, 2, 39, 19, 26, 4, 23, 11, 8, 12, 5, 1, # c0 - 15, 16, 9, 7, 6, 14, 24, 10, 17, 18, 20, 25, 30, 29, 22, 54, # d0 - 59, 37, 44, 58, 41, 48, 53, 46, 55, 42, 60, 36, 49, 38, 31, 34, # e0 - 35, 43, 45, 32, 40, 52, 56, 33, 61, 62, 51, 57, 47, 63, 50, 70, # f0 -) - -win1251_char_to_order_map = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, -223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, -239,240,241,242,243,244,245,246, 68,247,248,249,250,251,252,253, - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, -) - -latin5_char_to_order_map = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, -223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, -239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, -) - -macCyrillic_char_to_order_map = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, -223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, -239,240,241,242,243,244,245,246,247,248,249,250,251,252, 68, 16, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27,255, -) - -IBM855_char_to_order_map = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 -191,192,193,194, 68,195,196,197,198,199,200,201,202,203,204,205, -206,207,208,209,210,211,212,213,214,215,216,217, 27, 59, 54, 70, - 3, 37, 21, 44, 28, 58, 13, 41, 2, 48, 39, 53, 19, 46,218,219, -220,221,222,223,224, 26, 55, 4, 42,225,226,227,228, 23, 60,229, -230,231,232,233,234,235, 11, 36,236,237,238,239,240,241,242,243, - 8, 49, 12, 38, 5, 31, 1, 34, 15,244,245,246,247, 35, 16,248, - 43, 9, 45, 7, 32, 6, 40, 14, 52, 24, 56, 10, 33, 17, 61,249, -250, 18, 62, 20, 51, 25, 57, 30, 47, 29, 63, 22, 50,251,252,255, -) - -IBM866_char_to_order_map = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, -223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, -239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 97.6601% -# first 1024 sequences: 2.3389% -# rest sequences: 0.1237% -# negative sequences: 0.0009% -RussianLangModel = ( -0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,1,3,3,3,2,3,2,3,3, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,2,2,2,2,2,0,0,2, -3,3,3,2,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,2,3,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,2,3,3,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, -0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, -0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,2,2,2,3,1,3,3,1,3,3,3,3,2,2,3,0,2,2,2,3,3,2,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,3,3,3,2,2,3,2,3,3,3,2,1,2,2,0,1,2,2,2,2,2,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,3,0,2,2,3,3,2,1,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,1,2,3,2,2,3,2,3,3,3,3,2,2,3,0,3,2,2,3,1,1,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,3,3,3,3,2,2,2,0,3,3,3,2,2,2,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,2,3,2,2,0,1,3,2,1,2,2,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,2,1,1,3,0,1,1,1,1,2,1,1,0,2,2,2,1,2,0,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,2,2,2,2,1,3,2,3,2,3,2,1,2,2,0,1,1,2,1,2,1,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,2,3,3,3,2,2,2,2,0,2,2,2,2,3,1,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -3,2,3,2,2,3,3,3,3,3,3,3,3,3,1,3,2,0,0,3,3,3,3,2,3,3,3,3,2,3,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,3,2,2,3,3,0,2,1,0,3,2,3,2,3,0,0,1,2,0,0,1,0,1,2,1,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,3,0,2,3,3,3,3,2,3,3,3,3,1,2,2,0,0,2,3,2,2,2,3,2,3,2,2,3,0,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,3,0,2,3,2,3,0,1,2,3,3,2,0,2,3,0,0,2,3,2,2,0,1,3,1,3,2,2,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,3,0,2,3,3,3,3,3,3,3,3,2,1,3,2,0,0,2,2,3,3,3,2,3,3,0,2,2,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,2,3,3,2,2,2,3,3,0,0,1,1,1,1,1,2,0,0,1,1,1,1,0,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,0,3,2,3,3,2,3,2,0,2,1,0,1,1,0,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,3,2,2,2,2,3,1,3,2,3,1,1,2,1,0,2,2,2,2,1,3,1,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -2,2,3,3,3,3,3,1,2,2,1,3,1,0,3,0,0,3,0,0,0,1,1,0,1,2,1,0,0,0,0,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,2,1,1,3,3,3,2,2,1,2,2,3,1,1,2,0,0,2,2,1,3,0,0,2,1,1,2,1,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,3,3,3,3,1,2,2,2,1,2,1,3,3,1,1,2,1,2,1,2,2,0,2,0,0,1,1,0,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,3,2,1,3,2,2,3,2,0,3,2,0,3,0,1,0,1,1,0,0,1,1,1,1,0,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,2,3,3,3,2,2,2,3,3,1,2,1,2,1,0,1,0,1,1,0,1,0,0,2,1,1,1,0,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -3,1,1,2,1,2,3,3,2,2,1,2,2,3,0,2,1,0,0,2,2,3,2,1,2,2,2,2,2,3,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,1,1,0,1,1,2,2,1,1,3,0,0,1,3,1,1,1,0,0,0,1,0,1,1,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,1,3,3,3,2,0,0,0,2,1,0,1,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,1,0,0,2,3,2,2,2,1,2,2,2,1,2,1,0,0,1,1,1,0,2,0,1,1,1,0,0,1,1, -1,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,0,0,0,0,1,0,0,0,0,3,0,1,2,1,0,0,0,0,0,0,0,1,1,0,0,1,1, -1,0,1,0,1,2,0,0,1,1,2,1,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0, -2,2,3,2,2,2,3,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,1,0,1,1,1,0,2,1, -1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,0,1,1,0, -3,3,3,2,2,2,2,3,2,2,1,1,2,2,2,2,1,1,3,1,2,1,2,0,0,1,1,0,1,0,2,1, -1,1,1,1,1,2,1,0,1,1,1,1,0,1,0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,0, -2,0,0,1,0,3,2,2,2,2,1,2,1,2,1,2,0,0,0,2,1,2,2,1,1,2,2,0,1,1,0,2, -1,1,1,1,1,0,1,1,1,2,1,1,1,2,1,0,1,2,1,1,1,1,0,1,1,1,0,0,1,0,0,1, -1,3,2,2,2,1,1,1,2,3,0,0,0,0,2,0,2,2,1,0,0,0,0,0,0,1,0,0,0,0,1,1, -1,0,1,1,0,1,0,1,1,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, -2,3,2,3,2,1,2,2,2,2,1,0,0,0,2,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,2,1, -1,1,2,1,0,2,0,0,1,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0, -3,0,0,1,0,2,2,2,3,2,2,2,2,2,2,2,0,0,0,2,1,2,1,1,1,2,2,0,0,0,1,2, -1,1,1,1,1,0,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1, -2,3,2,3,3,2,0,1,1,1,0,0,1,0,2,0,1,1,3,1,0,0,0,0,0,0,0,1,0,0,2,1, -1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,1,0, -2,3,3,3,3,1,2,2,2,2,0,1,1,0,2,1,1,1,2,1,0,1,1,0,0,1,0,1,0,0,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,2,0,0,1,1,2,2,1,0,0,2,0,1,1,3,0,0,1,0,0,0,0,0,1,0,1,2,1, -1,1,2,0,1,1,1,0,1,0,1,1,0,1,0,1,1,1,1,0,1,0,0,0,0,0,0,1,0,1,1,0, -1,3,2,3,2,1,0,0,2,2,2,0,1,0,2,0,1,1,1,0,1,0,0,0,3,0,1,1,0,0,2,1, -1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,0,2,1,1,0,1,0,0,0,1,0,1,0,0,1,1,0, -3,1,2,1,1,2,2,2,2,2,2,1,2,2,1,1,0,0,0,2,2,2,0,0,0,1,2,1,0,1,0,1, -2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,1,1,1,0,1,0,1,1,0,1,1,1,0,0,1, -3,0,0,0,0,2,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,0,1,0,1,1,0,0,1,0,1, -1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1, -1,3,3,2,2,0,0,0,2,2,0,0,0,1,2,0,1,1,2,0,0,0,0,0,0,0,0,1,0,0,2,1, -0,1,1,0,0,1,1,0,0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0, -2,3,2,3,2,0,0,0,0,1,1,0,0,0,2,0,2,0,2,0,0,0,0,0,1,0,0,1,0,0,1,1, -1,1,2,0,1,2,1,0,1,1,2,1,1,1,1,1,2,1,1,0,1,0,0,1,1,1,1,1,0,1,1,0, -1,3,2,2,2,1,0,0,2,2,1,0,1,2,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1, -0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,0,2,3,1,2,2,2,2,2,2,1,1,0,0,0,1,0,1,0,2,1,1,1,0,0,0,0,1, -1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, -2,0,2,0,0,1,0,3,2,1,2,1,2,2,0,1,0,0,0,2,1,0,0,2,1,1,1,1,0,2,0,2, -2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,0,0,0,1,1,1,1,0,1,0,0,1, -1,2,2,2,2,1,0,0,1,0,0,0,0,0,2,0,1,1,1,1,0,0,0,0,1,0,1,2,0,0,2,0, -1,0,1,1,1,2,1,0,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,1,0,1,1,0, -2,1,2,2,2,0,3,0,1,1,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0, -1,2,2,3,2,2,0,0,1,1,2,0,1,2,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1, -0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, -2,2,1,1,2,1,2,2,2,2,2,1,2,2,0,1,0,0,0,1,2,2,2,1,2,1,1,1,1,1,2,1, -1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,0,1, -1,2,2,2,2,0,1,0,2,2,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0, -0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,2,0,0,0,2,2,2,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, -0,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,2,0,0,0,0,1,0,0,1,1,2,0,0,0,0,1,0,1,0,0,1,0,0,2,0,0,0,1, -0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,1,1,2,0,2,1,1,1,1,0,2,2,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1, -0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -1,0,2,1,2,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, -0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, -1,0,0,0,0,2,0,1,2,1,0,1,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1, -0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1, -2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -1,1,0,1,1,0,1,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,1,0,1,1,0,1,0,0,0, -0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, -) - -Koi8rModel = { - 'char_to_order_map': KOI8R_char_to_order_map, - 'precedence_matrix': RussianLangModel, - 'typical_positive_ratio': 0.976601, - 'keep_english_letter': False, - 'charset_name': "KOI8-R", - 'language': 'Russian', -} - -Win1251CyrillicModel = { - 'char_to_order_map': win1251_char_to_order_map, - 'precedence_matrix': RussianLangModel, - 'typical_positive_ratio': 0.976601, - 'keep_english_letter': False, - 'charset_name': "windows-1251", - 'language': 'Russian', -} - -Latin5CyrillicModel = { - 'char_to_order_map': latin5_char_to_order_map, - 'precedence_matrix': RussianLangModel, - 'typical_positive_ratio': 0.976601, - 'keep_english_letter': False, - 'charset_name': "ISO-8859-5", - 'language': 'Russian', -} - -MacCyrillicModel = { - 'char_to_order_map': macCyrillic_char_to_order_map, - 'precedence_matrix': RussianLangModel, - 'typical_positive_ratio': 0.976601, - 'keep_english_letter': False, - 'charset_name': "MacCyrillic", - 'language': 'Russian', -} - -Ibm866Model = { - 'char_to_order_map': IBM866_char_to_order_map, - 'precedence_matrix': RussianLangModel, - 'typical_positive_ratio': 0.976601, - 'keep_english_letter': False, - 'charset_name': "IBM866", - 'language': 'Russian', -} - -Ibm855Model = { - 'char_to_order_map': IBM855_char_to_order_map, - 'precedence_matrix': RussianLangModel, - 'typical_positive_ratio': 0.976601, - 'keep_english_letter': False, - 'charset_name': "IBM855", - 'language': 'Russian', -} diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/langgreekmodel.py b/env/lib/python3.7/site-packages/pip/_vendor/chardet/langgreekmodel.py deleted file mode 100644 index 5332221..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/chardet/langgreekmodel.py +++ /dev/null @@ -1,225 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# Character Mapping Table: -Latin7_char_to_order_map = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 - 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 -253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 - 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 -253,233, 90,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 -253,253,253,253,247,248, 61, 36, 46, 71, 73,253, 54,253,108,123, # b0 -110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 - 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 -124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 - 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 -) - -win1253_char_to_order_map = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 - 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 -253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 - 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 -253,233, 61,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 -253,253,253,253,247,253,253, 36, 46, 71, 73,253, 54,253,108,123, # b0 -110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 - 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 -124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 - 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 98.2851% -# first 1024 sequences:1.7001% -# rest sequences: 0.0359% -# negative sequences: 0.0148% -GreekLangModel = ( -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,2,2,3,3,3,3,3,3,3,3,1,3,3,3,0,2,2,3,3,0,3,0,3,2,0,3,3,3,0, -3,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,0,3,3,0,3,2,3,3,0,3,2,3,3,3,0,0,3,0,3,0,3,3,2,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, -0,2,3,2,2,3,3,3,3,3,3,3,3,0,3,3,3,3,0,2,3,3,0,3,3,3,3,2,3,3,3,0, -2,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,2,1,3,3,3,3,2,3,3,2,3,3,2,0, -0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,2,3,3,0, -2,0,1,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,2,3,0,0,0,0,3,3,0,3,1,3,3,3,0,3,3,0,3,3,3,3,0,0,0,0, -2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,0,3,0,3,3,3,3,3,0,3,2,2,2,3,0,2,3,3,3,3,3,2,3,3,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,3,2,2,2,3,3,3,3,0,3,1,3,3,3,3,2,3,3,3,3,3,3,3,2,2,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,2,0,3,0,0,0,3,3,2,3,3,3,3,3,0,0,3,2,3,0,2,3,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,3,0,0,3,3,0,2,3,0,3,0,3,3,3,0,0,3,0,3,0,2,2,3,3,0,0, -0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,2,0,3,2,3,3,3,3,0,3,3,3,3,3,0,3,3,2,3,2,3,3,2,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,2,3,2,3,3,3,3,3,3,0,2,3,2,3,2,2,2,3,2,3,3,2,3,0,2,2,2,3,0, -2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,0,0,0,3,3,3,2,3,3,0,0,3,0,3,0,0,0,3,2,0,3,0,3,0,0,2,0,2,0, -0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,0,0,0,3,3,0,3,3,3,0,0,1,2,3,0, -3,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,2,0,0,3,2,2,3,3,0,3,3,3,3,3,2,1,3,0,3,2,3,3,2,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,3,0,2,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,3,0,3,2,3,0,0,3,3,3,0, -3,0,0,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,0,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,2,0,3,2,3,0,0,3,2,3,0, -2,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,1,2,2,3,3,3,3,3,3,0,2,3,0,3,0,0,0,3,3,0,3,0,2,0,0,2,3,1,0, -2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,3,0,3,0,3,3,2,3,0,3,3,3,3,3,3,0,3,3,3,0,2,3,0,0,3,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,0,0,3,0,0,0,3,3,0,3,0,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,0,0,0,3,3,3,3,3,3,0,0,3,0,2,0,0,0,3,3,0,3,0,3,0,0,2,0,2,0, -0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,3,0,3,0,2,0,3,2,0,3,2,3,2,3,0,0,3,2,3,2,3,3,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,0,0,2,3,3,3,3,3,0,0,0,3,0,2,1,0,0,3,2,2,2,0,3,0,0,2,2,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,2,0,3,0,3,0,3,3,0,2,1,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,3,3,3,0,3,3,3,3,3,3,0,2,3,0,3,0,0,0,2,1,0,2,2,3,0,0,2,2,2,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,0,0,2,3,3,3,2,3,0,0,1,3,0,2,0,0,0,0,3,0,1,0,2,0,0,1,1,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,1,0,3,0,0,0,3,2,0,3,2,3,3,3,0,0,3,0,3,2,2,2,1,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,0,0,3,0,0,0,0,2,0,2,3,3,2,2,2,2,3,0,2,0,2,2,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,2,0,0,0,0,0,0,2,3,0,2,0,2,3,2,0,0,3,0,3,0,3,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,3,2,3,3,2,2,3,0,2,0,3,0,0,0,2,0,0,0,0,1,2,0,2,0,2,0, -0,2,0,2,0,2,2,0,0,1,0,2,2,2,0,2,2,2,0,2,2,2,0,0,2,0,0,1,0,0,0,0, -0,2,0,3,3,2,0,0,0,0,0,0,1,3,0,2,0,2,2,2,0,0,2,0,3,0,0,2,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,2,3,2,0,2,2,0,2,0,2,2,0,2,0,2,2,2,0,0,0,0,0,0,2,3,0,0,0,2, -0,1,2,0,0,0,0,2,2,0,0,0,2,1,0,2,2,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0, -0,0,2,1,0,2,3,2,2,3,2,3,2,0,0,3,3,3,0,0,3,2,0,0,0,1,1,0,2,0,2,2, -0,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2,2,2,0,0,2,0,0,0,2,0,1,0,0,0,0, -0,3,0,3,3,2,2,0,3,0,0,0,2,2,0,2,2,2,1,2,0,0,1,2,2,0,0,3,0,0,0,2, -0,1,2,0,0,0,1,2,0,0,0,0,0,0,0,2,2,0,1,0,0,2,0,0,0,2,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,3,3,2,2,0,0,0,2,0,2,3,3,0,2,0,0,0,0,0,0,2,2,2,0,2,2,0,2,0,2, -0,2,2,0,0,2,2,2,2,1,0,0,2,2,0,2,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0, -0,2,0,3,2,3,0,0,0,3,0,0,2,2,0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,0,2, -0,0,2,2,0,0,2,2,2,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,2,0,0,3,2,0,2,2,2,2,2,0,0,0,2,0,0,0,0,2,0,1,0,0,2,0,1,0,0,0, -0,2,2,2,0,2,2,0,1,2,0,2,2,2,0,2,2,2,2,1,2,2,0,0,2,0,0,0,0,0,0,0, -0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,2,0,2,0,2,2,0,0,0,0,1,2,1,0,0,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,3,2,3,0,0,2,0,0,0,2,2,0,2,0,0,0,1,0,0,2,0,2,0,2,2,0,0,0,0, -0,0,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0, -0,2,2,3,2,2,0,0,0,0,0,0,1,3,0,2,0,2,2,0,0,0,1,0,2,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,0,2,0,3,2,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -0,0,2,0,0,0,0,1,1,0,0,2,1,2,0,2,2,0,1,0,0,1,0,0,0,2,0,0,0,0,0,0, -0,3,0,2,2,2,0,0,2,0,0,0,2,0,0,0,2,3,0,2,0,0,0,0,0,0,2,2,0,0,0,2, -0,1,2,0,0,0,1,2,2,1,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,1,2,0,2,2,0,2,0,0,2,0,0,0,0,1,2,1,0,2,1,0,0,0,0,0,0,0,0,0,0, -0,0,2,0,0,0,3,1,2,2,0,2,0,0,0,0,2,0,0,0,2,0,0,3,0,0,0,0,2,2,2,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,1,0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,2, -0,2,2,0,0,2,2,2,2,2,0,1,2,0,0,0,2,2,0,1,0,2,0,0,2,2,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,2, -0,1,2,0,0,0,0,2,2,1,0,1,0,1,0,2,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0, -0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,2,0,0,2,2,0,0,0,0,1,0,0,0,0,0,0,2, -0,2,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0, -0,2,2,2,2,0,0,0,3,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,1, -0,0,2,0,0,0,0,1,2,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0, -0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,2,2,2,0,0,0,2,0,0,0,0,0,0,0,0,2, -0,0,1,0,0,0,0,2,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, -0,3,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,2, -0,0,2,0,0,0,0,2,2,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,0,2,2,1,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,0,0,0,0,2,0,0,0,0,2, -0,0,2,0,0,2,0,2,2,0,0,0,0,2,0,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0, -0,0,3,0,0,0,2,2,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0, -0,2,2,2,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1, -0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,2,0,0,0,2,0,0,0,0,0,1,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,2,0,0,0, -0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,2,0,2,0,0,0, -0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -) - -Latin7GreekModel = { - 'char_to_order_map': Latin7_char_to_order_map, - 'precedence_matrix': GreekLangModel, - 'typical_positive_ratio': 0.982851, - 'keep_english_letter': False, - 'charset_name': "ISO-8859-7", - 'language': 'Greek', -} - -Win1253GreekModel = { - 'char_to_order_map': win1253_char_to_order_map, - 'precedence_matrix': GreekLangModel, - 'typical_positive_ratio': 0.982851, - 'keep_english_letter': False, - 'charset_name': "windows-1253", - 'language': 'Greek', -} diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/langhebrewmodel.py b/env/lib/python3.7/site-packages/pip/_vendor/chardet/langhebrewmodel.py deleted file mode 100644 index 58f4c87..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/chardet/langhebrewmodel.py +++ /dev/null @@ -1,200 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Simon Montagu -# Portions created by the Initial Developer are Copyright (C) 2005 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# Shoshannah Forbes - original C code (?) -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# Windows-1255 language model -# Character Mapping Table: -WIN1255_CHAR_TO_ORDER_MAP = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 69, 91, 79, 80, 92, 89, 97, 90, 68,111,112, 82, 73, 95, 85, # 40 - 78,121, 86, 71, 67,102,107, 84,114,103,115,253,253,253,253,253, # 50 -253, 50, 74, 60, 61, 42, 76, 70, 64, 53,105, 93, 56, 65, 54, 49, # 60 - 66,110, 51, 43, 44, 63, 81, 77, 98, 75,108,253,253,253,253,253, # 70 -124,202,203,204,205, 40, 58,206,207,208,209,210,211,212,213,214, -215, 83, 52, 47, 46, 72, 32, 94,216,113,217,109,218,219,220,221, - 34,116,222,118,100,223,224,117,119,104,125,225,226, 87, 99,227, -106,122,123,228, 55,229,230,101,231,232,120,233, 48, 39, 57,234, - 30, 59, 41, 88, 33, 37, 36, 31, 29, 35,235, 62, 28,236,126,237, -238, 38, 45,239,240,241,242,243,127,244,245,246,247,248,249,250, - 9, 8, 20, 16, 3, 2, 24, 14, 22, 1, 25, 15, 4, 11, 6, 23, - 12, 19, 13, 26, 18, 27, 21, 17, 7, 10, 5,251,252,128, 96,253, -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 98.4004% -# first 1024 sequences: 1.5981% -# rest sequences: 0.087% -# negative sequences: 0.0015% -HEBREW_LANG_MODEL = ( -0,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,3,2,1,2,0,1,0,0, -3,0,3,1,0,0,1,3,2,0,1,1,2,0,2,2,2,1,1,1,1,2,1,1,1,2,0,0,2,2,0,1, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2, -1,2,1,2,1,2,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2, -1,2,1,3,1,1,0,0,2,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,1,2,2,1,3, -1,2,1,1,2,2,0,0,2,2,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,2,2,3,2, -1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,3,2,2,3,2,2,2,1,2,2,2,2, -1,2,1,1,2,2,0,1,2,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,0,2,2,2,2,2, -0,2,0,2,2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,0,2,2,2, -0,2,1,2,2,2,0,0,2,1,0,0,0,0,1,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,1,2,3,2,2,2, -1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,2,0,2, -0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,2,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,2,3,2,1,2,1,1,1, -0,1,1,1,1,1,3,0,1,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,1,0,0,1,0,0,0,0, -0,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2, -0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,2,1,2,3,3,2,3,3,3,3,2,3,2,1,2,0,2,1,2, -0,2,0,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,2,3,2,3,2,2,3,1,2,2,0,2,2,2, -0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,2,2,3,3,3,3,1,3,2,2,2, -0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,2,3,2,2,2,1,2,2,0,2,2,2,2, -0,2,0,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,1,3,2,3,3,2,3,3,2,2,1,2,2,2,2,2,2, -0,2,1,2,1,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,2,3,3,2,3,3,3,3,2,3,2,3,3,3,3,3,2,2,2,2,2,2,2,1, -0,2,0,1,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,2,1,2,3,3,3,3,3,3,3,2,3,2,3,2,1,2,3,0,2,1,2,2, -0,2,1,1,2,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,3,2,1,3,1,2,2,2,1,2,3,3,1,2,1,2,2,2,2, -0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,0,2,3,3,3,1,3,3,3,1,2,2,2,2,1,1,2,2,2,2,2,2, -0,2,0,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,3,3,2,2,3,3,3,2,1,2,3,2,3,2,2,2,2,1,2,1,1,1,2,2, -0,2,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0, -1,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,2,3,3,2,3,1,2,2,2,2,3,2,3,1,1,2,2,1,2,2,1,1,0,2,2,2,2, -0,1,0,1,2,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,0,0,1,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,0, -0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,1,0,1,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -3,2,2,1,2,2,2,2,2,2,2,1,2,2,1,2,2,1,1,1,1,1,1,1,1,2,1,1,0,3,3,3, -0,3,0,2,2,2,2,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,1,1,1,2,0,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,0,0,0,0, -0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,0,2,1,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -0,3,1,1,2,2,2,2,2,1,2,2,2,1,1,2,2,2,2,2,2,2,1,2,2,1,0,1,1,1,1,0, -0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,1,1,1,1,2,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, -0,0,2,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0, -2,1,1,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,1,2,1,2,1,1,1,1,0,0,0,0, -0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,2,1,2,2,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2,1,1,1,2,1,2,1,2,0,1,0,1, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,1,2,2,2,1,2,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,2,1,2,1,1,0,1,0,1, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,1,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2, -0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,2,0,1,1,1,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,1,1,0,0, -0,1,1,1,2,1,2,2,2,0,2,0,2,0,1,1,2,1,1,1,1,2,1,0,1,1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,1,0,0,0,0,0,1,0,1,2,2,0,1,0,0,1,1,2,2,1,2,0,2,0,0,0,1,2,0,1, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,2,0,2,1,2,0,2,0,0,1,1,1,1,1,1,0,1,0,0,0,1,0,0,1, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,1,2,2,0,0,1,0,0,0,1,0,0,1, -1,1,2,1,0,1,1,1,0,1,0,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,2,1, -0,2,0,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,1,0,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,0,1, -2,0,1,0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,1,2,1,1,2,0,1,0,0,0,1,1,0,1, -1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,0,0,2,1,1,2,0,2,0,0,0,1,1,0,1, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,2,2,1,2,1,1,0,1,0,0,0,1,1,0,1, -2,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,1,0,1, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,2,1,1,1,0,2,1,1,0,0,0,2,1,0,1, -1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,0,2,1,1,0,1,0,0,0,1,1,0,1, -2,2,1,1,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,0,1,2,1,0,2,0,0,0,1,1,0,1, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0, -0,1,0,0,2,0,2,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,1,0,0,1, -1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,1,1,0,1,0,0,0,0,1,0,1, -0,1,1,1,2,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,2,1,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,1,0,0, -) - -Win1255HebrewModel = { - 'char_to_order_map': WIN1255_CHAR_TO_ORDER_MAP, - 'precedence_matrix': HEBREW_LANG_MODEL, - 'typical_positive_ratio': 0.984004, - 'keep_english_letter': False, - 'charset_name': "windows-1255", - 'language': 'Hebrew', -} diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/langhungarianmodel.py b/env/lib/python3.7/site-packages/pip/_vendor/chardet/langhungarianmodel.py deleted file mode 100644 index bb7c095..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/chardet/langhungarianmodel.py +++ /dev/null @@ -1,225 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# Character Mapping Table: -Latin2_HungarianCharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, - 46, 71, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, -253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, - 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, -159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174, -175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190, -191,192,193,194,195,196,197, 75,198,199,200,201,202,203,204,205, - 79,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, -221, 51, 81,222, 78,223,224,225,226, 44,227,228,229, 61,230,231, -232,233,234, 58,235, 66, 59,236,237,238, 60, 69, 63,239,240,241, - 82, 14, 74,242, 70, 80,243, 72,244, 15, 83, 77, 84, 30, 76, 85, -245,246,247, 25, 73, 42, 24,248,249,250, 31, 56, 29,251,252,253, -) - -win1250HungarianCharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, - 46, 72, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, -253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, - 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, -161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176, -177,178,179,180, 78,181, 69,182,183,184,185,186,187,188,189,190, -191,192,193,194,195,196,197, 76,198,199,200,201,202,203,204,205, - 81,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, -221, 51, 83,222, 80,223,224,225,226, 44,227,228,229, 61,230,231, -232,233,234, 58,235, 66, 59,236,237,238, 60, 70, 63,239,240,241, - 84, 14, 75,242, 71, 82,243, 73,244, 15, 85, 79, 86, 30, 77, 87, -245,246,247, 25, 74, 42, 24,248,249,250, 31, 56, 29,251,252,253, -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 94.7368% -# first 1024 sequences:5.2623% -# rest sequences: 0.8894% -# negative sequences: 0.0009% -HungarianLangModel = ( -0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, -3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,2,3,3,1,1,2,2,2,2,2,1,2, -3,2,2,3,3,3,3,3,2,3,3,3,3,3,3,1,2,3,3,3,3,2,3,3,1,1,3,3,0,1,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0, -3,2,1,3,3,3,3,3,2,3,3,3,3,3,1,1,2,3,3,3,3,3,3,3,1,1,3,2,0,1,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,1,1,2,3,3,3,1,3,3,3,3,3,1,3,3,2,2,0,3,2,3, -0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,3,3,2,3,3,2,2,3,2,3,2,0,3,2,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,1,2,3,2,2,3,1,2,3,3,2,2,0,3,3,3, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,2,3,3,3,3,2,3,3,3,3,0,2,3,2, -0,0,0,1,1,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,1,1,1,3,3,2,1,3,2,2,3,2,1,3,2,2,1,0,3,3,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,2,2,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,3,2,2,3,1,1,3,2,0,1,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,1,3,3,3,3,3,2,2,1,3,3,3,0,1,1,2, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,2,0,3,2,3, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,1,3,2,2,2,3,1,1,3,3,1,1,0,3,3,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,2,3,3,3,3,3,1,2,3,2,2,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,2,2,2,3,1,3,3,2,2,1,3,3,3,1,1,3,1,2,3,2,3,2,2,2,1,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, -3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,2,2,3,2,1,0,3,2,0,1,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,1,0,3,3,3,3,0,2,3,0,0,2,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,2,3,3,2,2,2,2,3,3,0,1,2,3,2,3,2,2,3,2,1,2,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, -3,3,3,3,3,3,1,2,3,3,3,2,1,2,3,3,2,2,2,3,2,3,3,1,3,3,1,1,0,2,3,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,1,2,2,2,2,3,3,3,1,1,1,3,3,1,1,3,1,1,3,2,1,2,3,1,1,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,2,1,2,1,1,3,3,1,1,1,1,3,3,1,1,2,2,1,2,1,1,2,2,1,1,0,2,2,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,1,1,2,1,1,3,3,1,0,1,1,3,3,2,0,1,1,2,3,1,0,2,2,1,0,0,1,3,2, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,2,1,3,3,3,3,3,1,2,3,2,3,3,2,1,1,3,2,3,2,1,2,2,0,1,2,1,0,0,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,2,2,2,2,3,1,2,2,1,1,3,3,0,3,2,1,2,3,2,1,3,3,1,1,0,2,1,3, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,2,2,2,3,2,3,3,3,2,1,1,3,3,1,1,1,2,2,3,2,3,2,2,2,1,0,2,2,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -1,0,0,3,3,3,3,3,0,0,3,3,2,3,0,0,0,2,3,3,1,0,1,2,0,0,1,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,2,3,3,3,3,3,1,2,3,3,2,2,1,1,0,3,3,2,2,1,2,2,1,0,2,2,0,1,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,2,2,1,3,1,2,3,3,2,2,1,1,2,2,1,1,1,1,3,2,1,1,1,1,2,1,0,1,2,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -2,3,3,1,1,1,1,1,3,3,3,0,1,1,3,3,1,1,1,1,1,2,2,0,3,1,1,2,0,2,1,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,1,0,1,2,1,2,2,0,1,2,3,1,2,0,0,0,2,1,1,1,1,1,2,0,0,1,1,0,0,0,0, -1,2,1,2,2,2,1,2,1,2,0,2,0,2,2,1,1,2,1,1,2,1,1,1,0,1,0,0,0,1,1,0, -1,1,1,2,3,2,3,3,0,1,2,2,3,1,0,1,0,2,1,2,2,0,1,1,0,0,1,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,3,3,2,2,1,0,0,3,2,3,2,0,0,0,1,1,3,0,0,1,1,0,0,2,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,2,2,3,3,1,0,1,3,2,3,1,1,1,0,1,1,1,1,1,3,1,0,0,2,2,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,1,2,2,2,1,0,1,2,3,3,2,0,0,0,2,1,1,1,2,1,1,1,0,1,1,1,0,0,0, -1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,2,1,1,1,1,1,1,0,1,1,1,0,0,1,1, -3,2,2,1,0,0,1,1,2,2,0,3,0,1,2,1,1,0,0,1,1,1,0,1,1,1,1,0,2,1,1,1, -2,2,1,1,1,2,1,2,1,1,1,1,1,1,1,2,1,1,1,2,3,1,1,1,1,1,1,1,1,1,0,1, -2,3,3,0,1,0,0,0,3,3,1,0,0,1,2,2,1,0,0,0,0,2,0,0,1,1,1,0,2,1,1,1, -2,1,1,1,1,1,1,2,1,1,0,1,1,0,1,1,1,0,1,2,1,1,0,1,1,1,1,1,1,1,0,1, -2,3,3,0,1,0,0,0,2,2,0,0,0,0,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,1,0, -2,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, -3,2,2,0,1,0,1,0,2,3,2,0,0,1,2,2,1,0,0,1,1,1,0,0,2,1,0,1,2,2,1,1, -2,1,1,1,1,1,1,2,1,1,1,1,1,1,0,2,1,0,1,1,0,1,1,1,0,1,1,2,1,1,0,1, -2,2,2,0,0,1,0,0,2,2,1,1,0,0,2,1,1,0,0,0,1,2,0,0,2,1,0,0,2,1,1,1, -2,1,1,1,1,2,1,2,1,1,1,2,2,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1, -1,2,3,0,0,0,1,0,3,2,1,0,0,1,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,2,1, -1,1,0,0,0,1,0,1,1,1,1,1,2,0,0,1,0,0,0,2,0,0,1,1,1,1,1,1,1,1,0,1, -3,0,0,2,1,2,2,1,0,0,2,1,2,2,0,0,0,2,1,1,1,0,1,1,0,0,1,1,2,0,0,0, -1,2,1,2,2,1,1,2,1,2,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,0,0,1, -1,3,2,0,0,0,1,0,2,2,2,0,0,0,2,2,1,0,0,0,0,3,1,1,1,1,0,0,2,1,1,1, -2,1,0,1,1,1,0,1,1,1,1,1,1,1,0,2,1,0,0,1,0,1,1,0,1,1,1,1,1,1,0,1, -2,3,2,0,0,0,1,0,2,2,0,0,0,0,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,1,0, -2,1,1,1,1,2,1,2,1,2,0,1,1,1,0,2,1,1,1,2,1,1,1,1,0,1,1,1,1,1,0,1, -3,1,1,2,2,2,3,2,1,1,2,2,1,1,0,1,0,2,2,1,1,1,1,1,0,0,1,1,0,1,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,0,0,0,0,0,2,2,0,0,0,0,2,2,1,0,0,0,1,1,0,0,1,2,0,0,2,1,1,1, -2,2,1,1,1,2,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,1,1,0,1,2,1,1,1,0,1, -1,0,0,1,2,3,2,1,0,0,2,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,0,0,0,0,0, -1,2,1,2,1,2,1,1,1,2,0,2,1,1,1,0,1,2,0,0,1,1,1,0,0,0,0,0,0,0,0,0, -2,3,2,0,0,0,0,0,1,1,2,1,0,0,1,1,1,0,0,0,0,2,0,0,1,1,0,0,2,1,1,1, -2,1,1,1,1,1,1,2,1,0,1,1,1,1,0,2,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1, -1,2,2,0,1,1,1,0,2,2,2,0,0,0,3,2,1,0,0,0,1,1,0,0,1,1,0,1,1,1,0,0, -1,1,0,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,0,0,1,1,1,0,1,0,1, -2,1,0,2,1,1,2,2,1,1,2,1,1,1,0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,0,0,0, -1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,1,0, -1,2,3,0,0,0,1,0,2,2,0,0,0,0,2,2,0,0,0,0,0,1,0,0,1,0,0,0,2,0,1,0, -2,1,1,1,1,1,0,2,0,0,0,1,2,1,1,1,1,0,1,2,0,1,0,1,0,1,1,1,0,1,0,1, -2,2,2,0,0,0,1,0,2,1,2,0,0,0,1,1,2,0,0,0,0,1,0,0,1,1,0,0,2,1,0,1, -2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, -1,2,2,0,0,0,1,0,2,2,2,0,0,0,1,1,0,0,0,0,0,1,1,0,2,0,0,1,1,1,0,1, -1,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,0,0,1, -1,0,0,1,0,1,2,1,0,0,1,1,1,2,0,0,0,1,1,0,1,0,1,1,0,0,1,0,0,0,0,0, -0,2,1,2,1,1,1,1,1,2,0,2,0,1,1,0,1,2,1,0,1,1,1,0,0,0,0,0,0,1,0,0, -2,1,1,0,1,2,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,2,1,0,1, -2,2,1,1,1,1,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,0,1,0,1,1,1,1,1,0,1, -1,2,2,0,0,0,0,0,1,1,0,0,0,0,2,1,0,0,0,0,0,2,0,0,2,2,0,0,2,0,0,1, -2,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1, -1,1,2,0,0,3,1,0,2,1,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,1,0,1,0, -1,2,1,0,1,1,1,2,1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,0, -2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,2,0,0,0, -2,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,1,0,1, -2,1,1,1,2,1,1,1,0,1,1,2,1,0,0,0,0,1,1,1,1,0,1,0,0,0,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,0,1,1,1,1,1,0,0,1,1,2,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,0,0,0, -1,2,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0, -2,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,2,0,0,1,0,0,1,0,1,0,0,0, -0,1,1,1,1,1,1,1,1,2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, -1,0,0,1,1,1,1,1,0,0,2,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0, -0,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0, -1,0,0,1,1,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -0,1,1,1,1,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, -0,0,0,1,0,0,0,0,0,0,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,1,1,1,0,1,0,0,1,1,0,1,0,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, -2,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,1,0,1,1,1,0,0,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, -0,1,1,1,1,1,1,0,1,1,0,1,0,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0, -) - -Latin2HungarianModel = { - 'char_to_order_map': Latin2_HungarianCharToOrderMap, - 'precedence_matrix': HungarianLangModel, - 'typical_positive_ratio': 0.947368, - 'keep_english_letter': True, - 'charset_name': "ISO-8859-2", - 'language': 'Hungarian', -} - -Win1250HungarianModel = { - 'char_to_order_map': win1250HungarianCharToOrderMap, - 'precedence_matrix': HungarianLangModel, - 'typical_positive_ratio': 0.947368, - 'keep_english_letter': True, - 'charset_name': "windows-1250", - 'language': 'Hungarian', -} diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/langthaimodel.py b/env/lib/python3.7/site-packages/pip/_vendor/chardet/langthaimodel.py deleted file mode 100644 index 15f94c2..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/chardet/langthaimodel.py +++ /dev/null @@ -1,199 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# The following result for thai was collected from a limited sample (1M). - -# Character Mapping Table: -TIS620CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,182,106,107,100,183,184,185,101, 94,186,187,108,109,110,111, # 40 -188,189,190, 89, 95,112,113,191,192,193,194,253,253,253,253,253, # 50 -253, 64, 72, 73,114, 74,115,116,102, 81,201,117, 90,103, 78, 82, # 60 - 96,202, 91, 79, 84,104,105, 97, 98, 92,203,253,253,253,253,253, # 70 -209,210,211,212,213, 88,214,215,216,217,218,219,220,118,221,222, -223,224, 99, 85, 83,225,226,227,228,229,230,231,232,233,234,235, -236, 5, 30,237, 24,238, 75, 8, 26, 52, 34, 51,119, 47, 58, 57, - 49, 53, 55, 43, 20, 19, 44, 14, 48, 3, 17, 25, 39, 62, 31, 54, - 45, 9, 16, 2, 61, 15,239, 12, 42, 46, 18, 21, 76, 4, 66, 63, - 22, 10, 1, 36, 23, 13, 40, 27, 32, 35, 86,240,241,242,243,244, - 11, 28, 41, 29, 33,245, 50, 37, 6, 7, 67, 77, 38, 93,246,247, - 68, 56, 59, 65, 69, 60, 70, 80, 71, 87,248,249,250,251,252,253, -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 92.6386% -# first 1024 sequences:7.3177% -# rest sequences: 1.0230% -# negative sequences: 0.0436% -ThaiLangModel = ( -0,1,3,3,3,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,0,0,3,3,3,0,3,3,3,3, -0,3,3,0,0,0,1,3,0,3,3,2,3,3,0,1,2,3,3,3,3,0,2,0,2,0,0,3,2,1,2,2, -3,0,3,3,2,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,0,3,2,3,0,2,2,2,3, -0,2,3,0,0,0,0,1,0,1,2,3,1,1,3,2,2,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1, -3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,3,3,2,3,2,3,3,2,2,2, -3,1,2,3,0,3,3,2,2,1,2,3,3,1,2,0,1,3,0,1,0,0,1,0,0,0,0,0,0,0,1,1, -3,3,2,2,3,3,3,3,1,2,3,3,3,3,3,2,2,2,2,3,3,2,2,3,3,2,2,3,2,3,2,2, -3,3,1,2,3,1,2,2,3,3,1,0,2,1,0,0,3,1,2,1,0,0,1,0,0,0,0,0,0,1,0,1, -3,3,3,3,3,3,2,2,3,3,3,3,2,3,2,2,3,3,2,2,3,2,2,2,2,1,1,3,1,2,1,1, -3,2,1,0,2,1,0,1,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0, -3,3,3,2,3,2,3,3,2,2,3,2,3,3,2,3,1,1,2,3,2,2,2,3,2,2,2,2,2,1,2,1, -2,2,1,1,3,3,2,1,0,1,2,2,0,1,3,0,0,0,1,1,0,0,0,0,0,2,3,0,0,2,1,1, -3,3,2,3,3,2,0,0,3,3,0,3,3,0,2,2,3,1,2,2,1,1,1,0,2,2,2,0,2,2,1,1, -0,2,1,0,2,0,0,2,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,2,3,3,2,0,0,3,3,0,2,3,0,2,1,2,2,2,2,1,2,0,0,2,2,2,0,2,2,1,1, -0,2,1,0,2,0,0,2,0,1,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0, -3,3,2,3,2,3,2,0,2,2,1,3,2,1,3,2,1,2,3,2,2,3,0,2,3,2,2,1,2,2,2,2, -1,2,2,0,0,0,0,2,0,1,2,0,1,1,1,0,1,0,3,1,1,0,0,0,0,0,0,0,0,0,1,0, -3,3,2,3,3,2,3,2,2,2,3,2,2,3,2,2,1,2,3,2,2,3,1,3,2,2,2,3,2,2,2,3, -3,2,1,3,0,1,1,1,0,2,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,2,0,0, -1,0,0,3,0,3,3,3,3,3,0,0,3,0,2,2,3,3,3,3,3,0,0,0,1,1,3,0,0,0,0,2, -0,0,1,0,0,0,0,0,0,0,2,3,0,0,0,3,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0, -2,0,3,3,3,3,0,0,2,3,0,0,3,0,3,3,2,3,3,3,3,3,0,0,3,3,3,0,0,0,3,3, -0,0,3,0,0,0,0,2,0,0,2,1,1,3,0,0,1,0,0,2,3,0,1,0,0,0,0,0,0,0,1,0, -3,3,3,3,2,3,3,3,3,3,3,3,1,2,1,3,3,2,2,1,2,2,2,3,1,1,2,0,2,1,2,1, -2,2,1,0,0,0,1,1,0,1,0,1,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0, -3,0,2,1,2,3,3,3,0,2,0,2,2,0,2,1,3,2,2,1,2,1,0,0,2,2,1,0,2,1,2,2, -0,1,1,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,2,1,3,3,1,1,3,0,2,3,1,1,3,2,1,1,2,0,2,2,3,2,1,1,1,1,1,2, -3,0,0,1,3,1,2,1,2,0,3,0,0,0,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, -3,3,1,1,3,2,3,3,3,1,3,2,1,3,2,1,3,2,2,2,2,1,3,3,1,2,1,3,1,2,3,0, -2,1,1,3,2,2,2,1,2,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, -3,3,2,3,2,3,3,2,3,2,3,2,3,3,2,1,0,3,2,2,2,1,2,2,2,1,2,2,1,2,1,1, -2,2,2,3,0,1,3,1,1,1,1,0,1,1,0,2,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,2,3,2,2,1,1,3,2,3,2,3,2,0,3,2,2,1,2,0,2,2,2,1,2,2,2,2,1, -3,2,1,2,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,2,3,1,2,3,3,2,2,3,0,1,1,2,0,3,3,2,2,3,0,1,1,3,0,0,0,0, -3,1,0,3,3,0,2,0,2,1,0,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,2,3,2,3,3,0,1,3,1,1,2,1,2,1,1,3,1,1,0,2,3,1,1,1,1,1,1,1,1, -3,1,1,2,2,2,2,1,1,1,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,2,2,1,1,2,1,3,3,2,3,2,2,3,2,2,3,1,2,2,1,2,0,3,2,1,2,2,2,2,2,1, -3,2,1,2,2,2,1,1,1,1,0,0,1,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,1,3,3,0,2,1,0,3,2,0,0,3,1,0,1,1,0,1,0,0,0,0,0,1, -1,0,0,1,0,3,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,2,2,2,3,0,0,1,3,0,3,2,0,3,2,2,3,3,3,3,3,1,0,2,2,2,0,2,2,1,2, -0,2,3,0,0,0,0,1,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,0,2,3,1,3,3,2,3,3,0,3,3,0,3,2,2,3,2,3,3,3,0,0,2,2,3,0,1,1,1,3, -0,0,3,0,0,0,2,2,0,1,3,0,1,2,2,2,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1, -3,2,3,3,2,0,3,3,2,2,3,1,3,2,1,3,2,0,1,2,2,0,2,3,2,1,0,3,0,0,0,0, -3,0,0,2,3,1,3,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,3,2,2,2,1,2,0,1,3,1,1,3,1,3,0,0,2,1,1,1,1,2,1,1,1,0,2,1,0,1, -1,2,0,0,0,3,1,1,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,3,1,0,0,0,1,0, -3,3,3,3,2,2,2,2,2,1,3,1,1,1,2,0,1,1,2,1,2,1,3,2,0,0,3,1,1,1,1,1, -3,1,0,2,3,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,2,3,0,3,3,0,2,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,2,3,1,3,0,0,1,2,0,0,2,0,3,3,2,3,3,3,2,3,0,0,2,2,2,0,0,0,2,2, -0,0,1,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -0,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,1,2,3,1,3,3,0,0,1,0,3,0,0,0,0,0, -0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,1,2,3,1,2,3,1,0,3,0,2,2,1,0,2,1,1,2,0,1,0,0,1,1,1,1,0,1,0,0, -1,0,0,0,0,1,1,0,3,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,2,1,0,1,1,1,3,1,2,2,2,2,2,2,1,1,1,1,0,3,1,0,1,3,1,1,1,1, -1,1,0,2,0,1,3,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1, -3,0,2,2,1,3,3,2,3,3,0,1,1,0,2,2,1,2,1,3,3,1,0,0,3,2,0,0,0,0,2,1, -0,1,0,0,0,0,1,2,0,1,1,3,1,1,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,0,3,0,0,1,0,0,0,3,0,0,3,0,3,1,0,1,1,1,3,2,0,0,0,3,0,0,0,0,2,0, -0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,1,3,2,1,3,3,1,2,2,0,1,2,1,0,1,2,0,0,0,0,0,3,0,0,0,3,0,0,0,0, -3,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,1,2,0,3,3,3,2,2,0,1,1,0,1,3,0,0,0,2,2,0,0,0,0,3,1,0,1,0,0,0, -0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,2,3,1,2,0,0,2,1,0,3,1,0,1,2,0,1,1,1,1,3,0,0,3,1,1,0,2,2,1,1, -0,2,0,0,0,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,3,1,2,0,0,2,2,0,1,2,0,1,0,1,3,1,2,1,0,0,0,2,0,3,0,0,0,1,0, -0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,1,1,2,2,0,0,0,2,0,2,1,0,1,1,0,1,1,1,2,1,0,0,1,1,1,0,2,1,1,1, -0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1, -0,0,0,2,0,1,3,1,1,1,1,0,0,0,0,3,2,0,1,0,0,0,1,2,0,0,0,1,0,0,0,0, -0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,2,3,2,2,0,0,0,1,0,0,0,0,2,3,2,1,2,2,3,0,0,0,2,3,1,0,0,0,1,1, -0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0, -3,3,2,2,0,1,0,0,0,0,2,0,2,0,1,0,0,0,1,1,0,0,0,2,1,0,1,0,1,1,0,0, -0,1,0,2,0,0,1,0,3,0,1,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,1,0,0,1,0,0,0,0,0,1,1,2,0,0,0,0,1,0,0,1,3,1,0,0,0,0,1,1,0,0, -0,1,0,0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0, -3,3,1,1,1,1,2,3,0,0,2,1,1,1,1,1,0,2,1,1,0,0,0,2,1,0,1,2,1,1,0,1, -2,1,0,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,3,1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1, -0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,2,0,0,0,0,0,0,1,2,1,0,1,1,0,2,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,2,0,0,0,1,3,0,1,0,0,0,2,0,0,0,0,0,0,0,1,2,0,0,0,0,0, -3,3,0,0,1,1,2,0,0,1,2,1,0,1,1,1,0,1,1,0,0,2,1,1,0,1,0,0,1,1,1,0, -0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,1,0,0,0,0,1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,0,0,1,1,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,0,1,2,0,1,2,0,0,1,1,0,2,0,1,0,0,1,0,0,0,0,1,0,0,0,2,0,0,0,0, -1,0,0,1,0,1,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,1,0,0,0,0,0,0,0,1,1,0,1,1,0,2,1,3,0,0,0,0,1,1,0,0,0,0,0,0,0,3, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,1,0,1,0,0,2,0,0,2,0,0,1,1,2,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0, -1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,3,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0, -1,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,1,0,0,2,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -) - -TIS620ThaiModel = { - 'char_to_order_map': TIS620CharToOrderMap, - 'precedence_matrix': ThaiLangModel, - 'typical_positive_ratio': 0.926386, - 'keep_english_letter': False, - 'charset_name': "TIS-620", - 'language': 'Thai', -} diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/langturkishmodel.py b/env/lib/python3.7/site-packages/pip/_vendor/chardet/langturkishmodel.py deleted file mode 100644 index a427a45..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/chardet/langturkishmodel.py +++ /dev/null @@ -1,193 +0,0 @@ -# -*- coding: utf-8 -*- -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Özgür Baskın - Turkish Language Model -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# Character Mapping Table: -Latin5_TurkishCharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -255, 23, 37, 47, 39, 29, 52, 36, 45, 53, 60, 16, 49, 20, 46, 42, - 48, 69, 44, 35, 31, 51, 38, 62, 65, 43, 56,255,255,255,255,255, -255, 1, 21, 28, 12, 2, 18, 27, 25, 3, 24, 10, 5, 13, 4, 15, - 26, 64, 7, 8, 9, 14, 32, 57, 58, 11, 22,255,255,255,255,255, -180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165, -164,163,162,161,160,159,101,158,157,156,155,154,153,152,151,106, -150,149,148,147,146,145,144,100,143,142,141,140,139,138,137,136, - 94, 80, 93,135,105,134,133, 63,132,131,130,129,128,127,126,125, -124,104, 73, 99, 79, 85,123, 54,122, 98, 92,121,120, 91,103,119, - 68,118,117, 97,116,115, 50, 90,114,113,112,111, 55, 41, 40, 86, - 89, 70, 59, 78, 71, 82, 88, 33, 77, 66, 84, 83,110, 75, 61, 96, - 30, 67,109, 74, 87,102, 34, 95, 81,108, 76, 72, 17, 6, 19,107, -) - -TurkishLangModel = ( -3,2,3,3,3,1,3,3,3,3,3,3,3,3,2,1,1,3,3,1,3,3,0,3,3,3,3,3,0,3,1,3, -3,2,1,0,0,1,1,0,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1, -3,2,2,3,3,0,3,3,3,3,3,3,3,2,3,1,0,3,3,1,3,3,0,3,3,3,3,3,0,3,0,3, -3,1,1,0,1,0,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,0,1,0,1, -3,3,2,3,3,0,3,3,3,3,3,3,3,2,3,1,1,3,3,0,3,3,1,2,3,3,3,3,0,3,0,3, -3,1,1,0,0,0,1,0,0,0,0,1,1,0,1,2,1,0,0,0,1,0,0,0,0,2,0,0,0,0,0,1, -3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,1,3,3,2,0,3,2,1,2,2,1,3,3,0,0,0,2, -2,2,0,1,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,0,1, -3,3,3,2,3,3,1,2,3,3,3,3,3,3,3,1,3,2,1,0,3,2,0,1,2,3,3,2,1,0,0,2, -2,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,0,0, -1,0,1,3,3,1,3,3,3,3,3,3,3,1,2,0,0,2,3,0,2,3,0,0,2,2,2,3,0,3,0,1, -2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,0,3,2,0,2,3,2,3,3,1,0,0,2, -3,2,0,0,1,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1,0,2,0,0,1, -3,3,3,2,3,3,2,3,3,3,3,2,3,3,3,0,3,3,0,0,2,1,0,0,2,3,2,2,0,0,0,2, -2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,0,1,0,2,0,0,1, -3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,0,1,3,2,1,1,3,2,3,2,1,0,0,2, -2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, -3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,2,0,2,3,0,0,2,2,2,2,0,0,0,2, -3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0, -3,3,3,3,3,3,3,2,2,2,2,3,2,3,3,0,3,3,1,1,2,2,0,0,2,2,3,2,0,0,1,3, -0,3,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1, -3,3,3,2,3,3,3,2,1,2,2,3,2,3,3,0,3,2,0,0,1,1,0,1,1,2,1,2,0,0,0,1, -0,3,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0, -3,3,3,2,3,3,2,3,2,2,2,3,3,3,3,1,3,1,1,0,3,2,1,1,3,3,2,3,1,0,0,1, -1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,0,1, -3,2,2,3,3,0,3,3,3,3,3,3,3,2,2,1,0,3,3,1,3,3,0,1,3,3,2,3,0,3,0,3, -2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, -2,2,2,3,3,0,3,3,3,3,3,3,3,3,3,0,0,3,2,0,3,3,0,3,2,3,3,3,0,3,1,3, -2,0,0,0,0,0,0,0,0,0,0,1,0,1,2,0,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1, -3,3,3,1,2,3,3,1,0,0,1,0,0,3,3,2,3,0,0,2,0,0,2,0,2,0,0,0,2,0,2,0, -0,3,1,0,1,0,0,0,2,2,1,0,1,1,2,1,2,2,2,0,2,1,1,0,0,0,2,0,0,0,0,0, -1,2,1,3,3,0,3,3,3,3,3,2,3,0,0,0,0,2,3,0,2,3,1,0,2,3,1,3,0,3,0,2, -3,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,1,3,3,2,2,3,2,2,0,1,2,3,0,1,2,1,0,1,0,0,0,1,0,2,2,0,0,0,1, -1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0, -3,3,3,1,3,3,1,1,3,3,1,1,3,3,1,0,2,1,2,0,2,1,0,0,1,1,2,1,0,0,0,2, -2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,1,0,2,1,3,0,0,2,0,0,3,3,0,3,0,0,1,0,1,2,0,0,1,1,2,2,0,1,0, -0,1,2,1,1,0,1,0,1,1,1,1,1,0,1,1,1,2,2,1,2,0,1,0,0,0,0,0,0,1,0,0, -3,3,3,2,3,2,3,3,0,2,2,2,3,3,3,0,3,0,0,0,2,2,0,1,2,1,1,1,0,0,0,1, -0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, -3,3,3,3,3,3,2,1,2,2,3,3,3,3,2,0,2,0,0,0,2,2,0,0,2,1,3,3,0,0,1,1, -1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0, -1,1,2,3,3,0,3,3,3,3,3,3,2,2,0,2,0,2,3,2,3,2,2,2,2,2,2,2,1,3,2,3, -2,0,2,1,2,2,2,2,1,1,2,2,1,2,2,1,2,0,0,2,1,1,0,2,1,0,0,1,0,0,0,1, -2,3,3,1,1,1,0,1,1,1,2,3,2,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0, -0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,2,2,2,3,2,3,2,2,1,3,3,3,0,2,1,2,0,2,1,0,0,1,1,1,1,1,0,0,1, -2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0, -3,3,3,2,3,3,3,3,3,2,3,1,2,3,3,1,2,0,0,0,0,0,0,0,3,2,1,1,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, -3,3,3,2,2,3,3,2,1,1,1,1,1,3,3,0,3,1,0,0,1,1,0,0,3,1,2,1,0,0,0,0, -0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, -3,3,3,2,2,3,2,2,2,3,2,1,1,3,3,0,3,0,0,0,0,1,0,0,3,1,1,2,0,0,0,1, -1,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -1,1,1,3,3,0,3,3,3,3,3,2,2,2,1,2,0,2,1,2,2,1,1,0,1,2,2,2,2,2,2,2, -0,0,2,1,2,1,2,1,0,1,1,3,1,2,1,1,2,0,0,2,0,1,0,1,0,1,0,0,0,1,0,1, -3,3,3,1,3,3,3,0,1,1,0,2,2,3,1,0,3,0,0,0,1,0,0,0,1,0,0,1,0,1,0,0, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,2,0,0,2,2,1,0,0,1,0,0,3,3,1,3,0,0,1,1,0,2,0,3,0,0,0,2,0,1,1, -0,1,2,0,1,2,2,0,2,2,2,2,1,0,2,1,1,0,2,0,2,1,2,0,0,0,0,0,0,0,0,0, -3,3,3,1,3,2,3,2,0,2,2,2,1,3,2,0,2,1,2,0,1,2,0,0,1,0,2,2,0,0,0,2, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0, -3,3,3,0,3,3,1,1,2,3,1,0,3,2,3,0,3,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0, -1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,3,3,0,3,3,2,3,3,2,2,0,0,0,0,1,2,0,1,3,0,0,0,3,1,1,0,3,0,2, -2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,1,2,2,1,0,3,1,1,1,1,3,3,2,3,0,0,1,0,1,2,0,2,2,0,2,2,0,2,1, -0,2,2,1,1,1,1,0,2,1,1,0,1,1,1,1,2,1,2,1,2,0,1,0,1,0,0,0,0,0,0,0, -3,3,3,0,1,1,3,0,0,1,1,0,0,2,2,0,3,0,0,1,1,0,1,0,0,0,0,0,2,0,0,0, -0,3,1,0,1,0,1,0,2,0,0,1,0,1,0,1,1,1,2,1,1,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,0,2,0,2,0,1,1,1,0,0,3,3,0,2,0,0,1,0,0,2,1,1,0,1,0,1,0,1,0, -0,2,0,1,2,0,2,0,2,1,1,0,1,0,2,1,1,0,2,1,1,0,1,0,0,0,1,1,0,0,0,0, -3,2,3,0,1,0,0,0,0,0,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,0,2,0,0,0, -0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,2,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,0,0,2,3,0,0,1,0,1,0,2,3,2,3,0,0,1,3,0,2,1,0,0,0,0,2,0,1,0, -0,2,1,0,0,1,1,0,2,1,0,0,1,0,0,1,1,0,1,1,2,0,1,0,0,0,0,1,0,0,0,0, -3,2,2,0,0,1,1,0,0,0,0,0,0,3,1,1,1,0,0,0,0,0,1,0,0,0,0,0,2,0,1,0, -0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, -0,0,0,3,3,0,2,3,2,2,1,2,2,1,1,2,0,1,3,2,2,2,0,0,2,2,0,0,0,1,2,1, -3,0,2,1,1,0,1,1,1,0,1,2,2,2,1,1,2,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0, -0,1,1,2,3,0,3,3,3,2,2,2,2,1,0,1,0,1,0,1,2,2,0,0,2,2,1,3,1,1,2,1, -0,0,1,1,2,0,1,1,0,0,1,2,0,2,1,1,2,0,0,1,0,0,0,1,0,1,0,1,0,0,0,0, -3,3,2,0,0,3,1,0,0,0,0,0,0,3,2,1,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0, -0,2,1,1,0,0,1,0,1,2,0,0,1,1,0,0,2,1,1,1,1,0,2,0,0,0,0,0,0,0,0,0, -3,3,2,0,0,1,0,0,0,0,1,0,0,3,3,2,2,0,0,1,0,0,2,0,1,0,0,0,2,0,1,0, -0,0,1,1,0,0,2,0,2,1,0,0,1,1,2,1,2,0,2,1,2,1,1,1,0,0,1,1,0,0,0,0, -3,3,2,0,0,2,2,0,0,0,1,1,0,2,2,1,3,1,0,1,0,1,2,0,0,0,0,0,1,0,1,0, -0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,2,0,0,0,1,0,0,1,0,0,2,3,1,2,0,0,1,0,0,2,0,0,0,1,0,2,0,2,0, -0,1,1,2,2,1,2,0,2,1,1,0,0,1,1,0,1,1,1,1,2,1,1,0,0,0,0,0,0,0,0,0, -3,3,3,0,2,1,2,1,0,0,1,1,0,3,3,1,2,0,0,1,0,0,2,0,2,0,1,1,2,0,0,0, -0,0,1,1,1,1,2,0,1,1,0,1,1,1,1,0,0,0,1,1,1,0,1,0,0,0,1,0,0,0,0,0, -3,3,3,0,2,2,3,2,0,0,1,0,0,2,3,1,0,0,0,0,0,0,2,0,2,0,0,0,2,0,0,0, -0,1,1,0,0,0,1,0,0,1,0,1,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0, -3,2,3,0,0,0,0,0,0,0,1,0,0,2,2,2,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0, -0,0,2,1,1,0,1,0,2,1,1,0,0,1,1,2,1,0,2,0,2,0,1,0,0,0,2,0,0,0,0,0, -0,0,0,2,2,0,2,1,1,1,1,2,2,0,0,1,0,1,0,0,1,3,0,0,0,0,1,0,0,2,1,0, -0,0,1,0,1,0,0,0,0,0,2,1,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, -2,0,0,2,3,0,2,3,1,2,2,0,2,0,0,2,0,2,1,1,1,2,1,0,0,1,2,1,1,2,1,0, -1,0,2,0,1,0,1,1,0,0,2,2,1,2,1,1,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,0,2,1,2,0,0,0,1,0,0,3,2,0,1,0,0,1,0,0,2,0,0,0,1,2,1,0,1,0, -0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0, -0,0,0,2,2,0,2,2,1,1,0,1,1,1,1,1,0,0,1,2,1,1,1,0,1,0,0,0,1,1,1,1, -0,0,2,1,0,1,1,1,0,1,1,2,1,2,1,1,2,0,1,1,2,1,0,2,0,0,0,0,0,0,0,0, -3,2,2,0,0,2,0,0,0,0,0,0,0,2,2,0,2,0,0,1,0,0,2,0,0,0,0,0,2,0,0,0, -0,2,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, -0,0,0,3,2,0,2,2,0,1,1,0,1,0,0,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0, -2,0,1,0,1,0,1,1,0,0,1,2,0,1,0,1,1,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0, -2,2,2,0,1,1,0,0,0,1,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,1,2,0,1,0, -0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,2,1,0,1,1,1,0,0,0,0,1,2,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, -1,1,2,0,1,0,0,0,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,1, -0,0,1,2,2,0,2,1,2,1,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,0,0,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, -2,2,2,0,0,0,1,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,0,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,0,0,0,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -) - -Latin5TurkishModel = { - 'char_to_order_map': Latin5_TurkishCharToOrderMap, - 'precedence_matrix': TurkishLangModel, - 'typical_positive_ratio': 0.970290, - 'keep_english_letter': True, - 'charset_name': "ISO-8859-9", - 'language': 'Turkish', -} diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/latin1prober.py b/env/lib/python3.7/site-packages/pip/_vendor/chardet/latin1prober.py deleted file mode 100644 index 7d1e8c2..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/chardet/latin1prober.py +++ /dev/null @@ -1,145 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .charsetprober import CharSetProber -from .enums import ProbingState - -FREQ_CAT_NUM = 4 - -UDF = 0 # undefined -OTH = 1 # other -ASC = 2 # ascii capital letter -ASS = 3 # ascii small letter -ACV = 4 # accent capital vowel -ACO = 5 # accent capital other -ASV = 6 # accent small vowel -ASO = 7 # accent small other -CLASS_NUM = 8 # total classes - -Latin1_CharToClass = ( - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 00 - 07 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 08 - 0F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 10 - 17 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 18 - 1F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 20 - 27 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 28 - 2F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 30 - 37 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 38 - 3F - OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 40 - 47 - ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 48 - 4F - ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 50 - 57 - ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH, # 58 - 5F - OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 60 - 67 - ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 68 - 6F - ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 70 - 77 - ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH, # 78 - 7F - OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH, # 80 - 87 - OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF, # 88 - 8F - UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 90 - 97 - OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO, # 98 - 9F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A0 - A7 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A8 - AF - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B0 - B7 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B8 - BF - ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO, # C0 - C7 - ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV, # C8 - CF - ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH, # D0 - D7 - ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO, # D8 - DF - ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO, # E0 - E7 - ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV, # E8 - EF - ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH, # F0 - F7 - ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO, # F8 - FF -) - -# 0 : illegal -# 1 : very unlikely -# 2 : normal -# 3 : very likely -Latin1ClassModel = ( -# UDF OTH ASC ASS ACV ACO ASV ASO - 0, 0, 0, 0, 0, 0, 0, 0, # UDF - 0, 3, 3, 3, 3, 3, 3, 3, # OTH - 0, 3, 3, 3, 3, 3, 3, 3, # ASC - 0, 3, 3, 3, 1, 1, 3, 3, # ASS - 0, 3, 3, 3, 1, 2, 1, 2, # ACV - 0, 3, 3, 3, 3, 3, 3, 3, # ACO - 0, 3, 1, 3, 1, 1, 1, 3, # ASV - 0, 3, 1, 3, 1, 1, 3, 3, # ASO -) - - -class Latin1Prober(CharSetProber): - def __init__(self): - super(Latin1Prober, self).__init__() - self._last_char_class = None - self._freq_counter = None - self.reset() - - def reset(self): - self._last_char_class = OTH - self._freq_counter = [0] * FREQ_CAT_NUM - CharSetProber.reset(self) - - @property - def charset_name(self): - return "ISO-8859-1" - - @property - def language(self): - return "" - - def feed(self, byte_str): - byte_str = self.filter_with_english_letters(byte_str) - for c in byte_str: - char_class = Latin1_CharToClass[c] - freq = Latin1ClassModel[(self._last_char_class * CLASS_NUM) - + char_class] - if freq == 0: - self._state = ProbingState.NOT_ME - break - self._freq_counter[freq] += 1 - self._last_char_class = char_class - - return self.state - - def get_confidence(self): - if self.state == ProbingState.NOT_ME: - return 0.01 - - total = sum(self._freq_counter) - if total < 0.01: - confidence = 0.0 - else: - confidence = ((self._freq_counter[3] - self._freq_counter[1] * 20.0) - / total) - if confidence < 0.0: - confidence = 0.0 - # lower the confidence of latin1 so that other more accurate - # detector can take priority. - confidence = confidence * 0.73 - return confidence diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/mbcharsetprober.py b/env/lib/python3.7/site-packages/pip/_vendor/chardet/mbcharsetprober.py deleted file mode 100644 index 6256ecf..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/chardet/mbcharsetprober.py +++ /dev/null @@ -1,91 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# Proofpoint, Inc. -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .charsetprober import CharSetProber -from .enums import ProbingState, MachineState - - -class MultiByteCharSetProber(CharSetProber): - """ - MultiByteCharSetProber - """ - - def __init__(self, lang_filter=None): - super(MultiByteCharSetProber, self).__init__(lang_filter=lang_filter) - self.distribution_analyzer = None - self.coding_sm = None - self._last_char = [0, 0] - - def reset(self): - super(MultiByteCharSetProber, self).reset() - if self.coding_sm: - self.coding_sm.reset() - if self.distribution_analyzer: - self.distribution_analyzer.reset() - self._last_char = [0, 0] - - @property - def charset_name(self): - raise NotImplementedError - - @property - def language(self): - raise NotImplementedError - - def feed(self, byte_str): - for i in range(len(byte_str)): - coding_state = self.coding_sm.next_state(byte_str[i]) - if coding_state == MachineState.ERROR: - self.logger.debug('%s %s prober hit error at byte %s', - self.charset_name, self.language, i) - self._state = ProbingState.NOT_ME - break - elif coding_state == MachineState.ITS_ME: - self._state = ProbingState.FOUND_IT - break - elif coding_state == MachineState.START: - char_len = self.coding_sm.get_current_charlen() - if i == 0: - self._last_char[1] = byte_str[0] - self.distribution_analyzer.feed(self._last_char, char_len) - else: - self.distribution_analyzer.feed(byte_str[i - 1:i + 1], - char_len) - - self._last_char[0] = byte_str[-1] - - if self.state == ProbingState.DETECTING: - if (self.distribution_analyzer.got_enough_data() and - (self.get_confidence() > self.SHORTCUT_THRESHOLD)): - self._state = ProbingState.FOUND_IT - - return self.state - - def get_confidence(self): - return self.distribution_analyzer.get_confidence() diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/mbcsgroupprober.py b/env/lib/python3.7/site-packages/pip/_vendor/chardet/mbcsgroupprober.py deleted file mode 100644 index 530abe7..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/chardet/mbcsgroupprober.py +++ /dev/null @@ -1,54 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# Proofpoint, Inc. -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .charsetgroupprober import CharSetGroupProber -from .utf8prober import UTF8Prober -from .sjisprober import SJISProber -from .eucjpprober import EUCJPProber -from .gb2312prober import GB2312Prober -from .euckrprober import EUCKRProber -from .cp949prober import CP949Prober -from .big5prober import Big5Prober -from .euctwprober import EUCTWProber - - -class MBCSGroupProber(CharSetGroupProber): - def __init__(self, lang_filter=None): - super(MBCSGroupProber, self).__init__(lang_filter=lang_filter) - self.probers = [ - UTF8Prober(), - SJISProber(), - EUCJPProber(), - GB2312Prober(), - EUCKRProber(), - CP949Prober(), - Big5Prober(), - EUCTWProber() - ] - self.reset() diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/mbcssm.py b/env/lib/python3.7/site-packages/pip/_vendor/chardet/mbcssm.py deleted file mode 100644 index 8360d0f..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/chardet/mbcssm.py +++ /dev/null @@ -1,572 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .enums import MachineState - -# BIG5 - -BIG5_CLS = ( - 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as legal value - 1,1,1,1,1,1,0,0, # 08 - 0f - 1,1,1,1,1,1,1,1, # 10 - 17 - 1,1,1,0,1,1,1,1, # 18 - 1f - 1,1,1,1,1,1,1,1, # 20 - 27 - 1,1,1,1,1,1,1,1, # 28 - 2f - 1,1,1,1,1,1,1,1, # 30 - 37 - 1,1,1,1,1,1,1,1, # 38 - 3f - 2,2,2,2,2,2,2,2, # 40 - 47 - 2,2,2,2,2,2,2,2, # 48 - 4f - 2,2,2,2,2,2,2,2, # 50 - 57 - 2,2,2,2,2,2,2,2, # 58 - 5f - 2,2,2,2,2,2,2,2, # 60 - 67 - 2,2,2,2,2,2,2,2, # 68 - 6f - 2,2,2,2,2,2,2,2, # 70 - 77 - 2,2,2,2,2,2,2,1, # 78 - 7f - 4,4,4,4,4,4,4,4, # 80 - 87 - 4,4,4,4,4,4,4,4, # 88 - 8f - 4,4,4,4,4,4,4,4, # 90 - 97 - 4,4,4,4,4,4,4,4, # 98 - 9f - 4,3,3,3,3,3,3,3, # a0 - a7 - 3,3,3,3,3,3,3,3, # a8 - af - 3,3,3,3,3,3,3,3, # b0 - b7 - 3,3,3,3,3,3,3,3, # b8 - bf - 3,3,3,3,3,3,3,3, # c0 - c7 - 3,3,3,3,3,3,3,3, # c8 - cf - 3,3,3,3,3,3,3,3, # d0 - d7 - 3,3,3,3,3,3,3,3, # d8 - df - 3,3,3,3,3,3,3,3, # e0 - e7 - 3,3,3,3,3,3,3,3, # e8 - ef - 3,3,3,3,3,3,3,3, # f0 - f7 - 3,3,3,3,3,3,3,0 # f8 - ff -) - -BIG5_ST = ( - MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 - MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,#08-0f - MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START#10-17 -) - -BIG5_CHAR_LEN_TABLE = (0, 1, 1, 2, 0) - -BIG5_SM_MODEL = {'class_table': BIG5_CLS, - 'class_factor': 5, - 'state_table': BIG5_ST, - 'char_len_table': BIG5_CHAR_LEN_TABLE, - 'name': 'Big5'} - -# CP949 - -CP949_CLS = ( - 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0, # 00 - 0f - 1,1,1,1,1,1,1,1, 1,1,1,0,1,1,1,1, # 10 - 1f - 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 20 - 2f - 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 30 - 3f - 1,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4, # 40 - 4f - 4,4,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 50 - 5f - 1,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5, # 60 - 6f - 5,5,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 70 - 7f - 0,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 80 - 8f - 6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 90 - 9f - 6,7,7,7,7,7,7,7, 7,7,7,7,7,8,8,8, # a0 - af - 7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7, # b0 - bf - 7,7,7,7,7,7,9,2, 2,3,2,2,2,2,2,2, # c0 - cf - 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # d0 - df - 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # e0 - ef - 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,0, # f0 - ff -) - -CP949_ST = ( -#cls= 0 1 2 3 4 5 6 7 8 9 # previous state = - MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START, 4, 5,MachineState.ERROR, 6, # MachineState.START - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, # MachineState.ERROR - MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME, # MachineState.ITS_ME - MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 3 - MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 4 - MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 5 - MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 6 -) - -CP949_CHAR_LEN_TABLE = (0, 1, 2, 0, 1, 1, 2, 2, 0, 2) - -CP949_SM_MODEL = {'class_table': CP949_CLS, - 'class_factor': 10, - 'state_table': CP949_ST, - 'char_len_table': CP949_CHAR_LEN_TABLE, - 'name': 'CP949'} - -# EUC-JP - -EUCJP_CLS = ( - 4,4,4,4,4,4,4,4, # 00 - 07 - 4,4,4,4,4,4,5,5, # 08 - 0f - 4,4,4,4,4,4,4,4, # 10 - 17 - 4,4,4,5,4,4,4,4, # 18 - 1f - 4,4,4,4,4,4,4,4, # 20 - 27 - 4,4,4,4,4,4,4,4, # 28 - 2f - 4,4,4,4,4,4,4,4, # 30 - 37 - 4,4,4,4,4,4,4,4, # 38 - 3f - 4,4,4,4,4,4,4,4, # 40 - 47 - 4,4,4,4,4,4,4,4, # 48 - 4f - 4,4,4,4,4,4,4,4, # 50 - 57 - 4,4,4,4,4,4,4,4, # 58 - 5f - 4,4,4,4,4,4,4,4, # 60 - 67 - 4,4,4,4,4,4,4,4, # 68 - 6f - 4,4,4,4,4,4,4,4, # 70 - 77 - 4,4,4,4,4,4,4,4, # 78 - 7f - 5,5,5,5,5,5,5,5, # 80 - 87 - 5,5,5,5,5,5,1,3, # 88 - 8f - 5,5,5,5,5,5,5,5, # 90 - 97 - 5,5,5,5,5,5,5,5, # 98 - 9f - 5,2,2,2,2,2,2,2, # a0 - a7 - 2,2,2,2,2,2,2,2, # a8 - af - 2,2,2,2,2,2,2,2, # b0 - b7 - 2,2,2,2,2,2,2,2, # b8 - bf - 2,2,2,2,2,2,2,2, # c0 - c7 - 2,2,2,2,2,2,2,2, # c8 - cf - 2,2,2,2,2,2,2,2, # d0 - d7 - 2,2,2,2,2,2,2,2, # d8 - df - 0,0,0,0,0,0,0,0, # e0 - e7 - 0,0,0,0,0,0,0,0, # e8 - ef - 0,0,0,0,0,0,0,0, # f0 - f7 - 0,0,0,0,0,0,0,5 # f8 - ff -) - -EUCJP_ST = ( - 3, 4, 3, 5,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f - MachineState.ITS_ME,MachineState.ITS_ME,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17 - MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 3,MachineState.ERROR,#18-1f - 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START#20-27 -) - -EUCJP_CHAR_LEN_TABLE = (2, 2, 2, 3, 1, 0) - -EUCJP_SM_MODEL = {'class_table': EUCJP_CLS, - 'class_factor': 6, - 'state_table': EUCJP_ST, - 'char_len_table': EUCJP_CHAR_LEN_TABLE, - 'name': 'EUC-JP'} - -# EUC-KR - -EUCKR_CLS = ( - 1,1,1,1,1,1,1,1, # 00 - 07 - 1,1,1,1,1,1,0,0, # 08 - 0f - 1,1,1,1,1,1,1,1, # 10 - 17 - 1,1,1,0,1,1,1,1, # 18 - 1f - 1,1,1,1,1,1,1,1, # 20 - 27 - 1,1,1,1,1,1,1,1, # 28 - 2f - 1,1,1,1,1,1,1,1, # 30 - 37 - 1,1,1,1,1,1,1,1, # 38 - 3f - 1,1,1,1,1,1,1,1, # 40 - 47 - 1,1,1,1,1,1,1,1, # 48 - 4f - 1,1,1,1,1,1,1,1, # 50 - 57 - 1,1,1,1,1,1,1,1, # 58 - 5f - 1,1,1,1,1,1,1,1, # 60 - 67 - 1,1,1,1,1,1,1,1, # 68 - 6f - 1,1,1,1,1,1,1,1, # 70 - 77 - 1,1,1,1,1,1,1,1, # 78 - 7f - 0,0,0,0,0,0,0,0, # 80 - 87 - 0,0,0,0,0,0,0,0, # 88 - 8f - 0,0,0,0,0,0,0,0, # 90 - 97 - 0,0,0,0,0,0,0,0, # 98 - 9f - 0,2,2,2,2,2,2,2, # a0 - a7 - 2,2,2,2,2,3,3,3, # a8 - af - 2,2,2,2,2,2,2,2, # b0 - b7 - 2,2,2,2,2,2,2,2, # b8 - bf - 2,2,2,2,2,2,2,2, # c0 - c7 - 2,3,2,2,2,2,2,2, # c8 - cf - 2,2,2,2,2,2,2,2, # d0 - d7 - 2,2,2,2,2,2,2,2, # d8 - df - 2,2,2,2,2,2,2,2, # e0 - e7 - 2,2,2,2,2,2,2,2, # e8 - ef - 2,2,2,2,2,2,2,2, # f0 - f7 - 2,2,2,2,2,2,2,0 # f8 - ff -) - -EUCKR_ST = ( - MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 - MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #08-0f -) - -EUCKR_CHAR_LEN_TABLE = (0, 1, 2, 0) - -EUCKR_SM_MODEL = {'class_table': EUCKR_CLS, - 'class_factor': 4, - 'state_table': EUCKR_ST, - 'char_len_table': EUCKR_CHAR_LEN_TABLE, - 'name': 'EUC-KR'} - -# EUC-TW - -EUCTW_CLS = ( - 2,2,2,2,2,2,2,2, # 00 - 07 - 2,2,2,2,2,2,0,0, # 08 - 0f - 2,2,2,2,2,2,2,2, # 10 - 17 - 2,2,2,0,2,2,2,2, # 18 - 1f - 2,2,2,2,2,2,2,2, # 20 - 27 - 2,2,2,2,2,2,2,2, # 28 - 2f - 2,2,2,2,2,2,2,2, # 30 - 37 - 2,2,2,2,2,2,2,2, # 38 - 3f - 2,2,2,2,2,2,2,2, # 40 - 47 - 2,2,2,2,2,2,2,2, # 48 - 4f - 2,2,2,2,2,2,2,2, # 50 - 57 - 2,2,2,2,2,2,2,2, # 58 - 5f - 2,2,2,2,2,2,2,2, # 60 - 67 - 2,2,2,2,2,2,2,2, # 68 - 6f - 2,2,2,2,2,2,2,2, # 70 - 77 - 2,2,2,2,2,2,2,2, # 78 - 7f - 0,0,0,0,0,0,0,0, # 80 - 87 - 0,0,0,0,0,0,6,0, # 88 - 8f - 0,0,0,0,0,0,0,0, # 90 - 97 - 0,0,0,0,0,0,0,0, # 98 - 9f - 0,3,4,4,4,4,4,4, # a0 - a7 - 5,5,1,1,1,1,1,1, # a8 - af - 1,1,1,1,1,1,1,1, # b0 - b7 - 1,1,1,1,1,1,1,1, # b8 - bf - 1,1,3,1,3,3,3,3, # c0 - c7 - 3,3,3,3,3,3,3,3, # c8 - cf - 3,3,3,3,3,3,3,3, # d0 - d7 - 3,3,3,3,3,3,3,3, # d8 - df - 3,3,3,3,3,3,3,3, # e0 - e7 - 3,3,3,3,3,3,3,3, # e8 - ef - 3,3,3,3,3,3,3,3, # f0 - f7 - 3,3,3,3,3,3,3,0 # f8 - ff -) - -EUCTW_ST = ( - MachineState.ERROR,MachineState.ERROR,MachineState.START, 3, 3, 3, 4,MachineState.ERROR,#00-07 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f - MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.ERROR,#10-17 - MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f - 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,#20-27 - MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f -) - -EUCTW_CHAR_LEN_TABLE = (0, 0, 1, 2, 2, 2, 3) - -EUCTW_SM_MODEL = {'class_table': EUCTW_CLS, - 'class_factor': 7, - 'state_table': EUCTW_ST, - 'char_len_table': EUCTW_CHAR_LEN_TABLE, - 'name': 'x-euc-tw'} - -# GB2312 - -GB2312_CLS = ( - 1,1,1,1,1,1,1,1, # 00 - 07 - 1,1,1,1,1,1,0,0, # 08 - 0f - 1,1,1,1,1,1,1,1, # 10 - 17 - 1,1,1,0,1,1,1,1, # 18 - 1f - 1,1,1,1,1,1,1,1, # 20 - 27 - 1,1,1,1,1,1,1,1, # 28 - 2f - 3,3,3,3,3,3,3,3, # 30 - 37 - 3,3,1,1,1,1,1,1, # 38 - 3f - 2,2,2,2,2,2,2,2, # 40 - 47 - 2,2,2,2,2,2,2,2, # 48 - 4f - 2,2,2,2,2,2,2,2, # 50 - 57 - 2,2,2,2,2,2,2,2, # 58 - 5f - 2,2,2,2,2,2,2,2, # 60 - 67 - 2,2,2,2,2,2,2,2, # 68 - 6f - 2,2,2,2,2,2,2,2, # 70 - 77 - 2,2,2,2,2,2,2,4, # 78 - 7f - 5,6,6,6,6,6,6,6, # 80 - 87 - 6,6,6,6,6,6,6,6, # 88 - 8f - 6,6,6,6,6,6,6,6, # 90 - 97 - 6,6,6,6,6,6,6,6, # 98 - 9f - 6,6,6,6,6,6,6,6, # a0 - a7 - 6,6,6,6,6,6,6,6, # a8 - af - 6,6,6,6,6,6,6,6, # b0 - b7 - 6,6,6,6,6,6,6,6, # b8 - bf - 6,6,6,6,6,6,6,6, # c0 - c7 - 6,6,6,6,6,6,6,6, # c8 - cf - 6,6,6,6,6,6,6,6, # d0 - d7 - 6,6,6,6,6,6,6,6, # d8 - df - 6,6,6,6,6,6,6,6, # e0 - e7 - 6,6,6,6,6,6,6,6, # e8 - ef - 6,6,6,6,6,6,6,6, # f0 - f7 - 6,6,6,6,6,6,6,0 # f8 - ff -) - -GB2312_ST = ( - MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, 3,MachineState.ERROR,#00-07 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f - MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,#10-17 - 4,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f - MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#20-27 - MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f -) - -# To be accurate, the length of class 6 can be either 2 or 4. -# But it is not necessary to discriminate between the two since -# it is used for frequency analysis only, and we are validating -# each code range there as well. So it is safe to set it to be -# 2 here. -GB2312_CHAR_LEN_TABLE = (0, 1, 1, 1, 1, 1, 2) - -GB2312_SM_MODEL = {'class_table': GB2312_CLS, - 'class_factor': 7, - 'state_table': GB2312_ST, - 'char_len_table': GB2312_CHAR_LEN_TABLE, - 'name': 'GB2312'} - -# Shift_JIS - -SJIS_CLS = ( - 1,1,1,1,1,1,1,1, # 00 - 07 - 1,1,1,1,1,1,0,0, # 08 - 0f - 1,1,1,1,1,1,1,1, # 10 - 17 - 1,1,1,0,1,1,1,1, # 18 - 1f - 1,1,1,1,1,1,1,1, # 20 - 27 - 1,1,1,1,1,1,1,1, # 28 - 2f - 1,1,1,1,1,1,1,1, # 30 - 37 - 1,1,1,1,1,1,1,1, # 38 - 3f - 2,2,2,2,2,2,2,2, # 40 - 47 - 2,2,2,2,2,2,2,2, # 48 - 4f - 2,2,2,2,2,2,2,2, # 50 - 57 - 2,2,2,2,2,2,2,2, # 58 - 5f - 2,2,2,2,2,2,2,2, # 60 - 67 - 2,2,2,2,2,2,2,2, # 68 - 6f - 2,2,2,2,2,2,2,2, # 70 - 77 - 2,2,2,2,2,2,2,1, # 78 - 7f - 3,3,3,3,3,2,2,3, # 80 - 87 - 3,3,3,3,3,3,3,3, # 88 - 8f - 3,3,3,3,3,3,3,3, # 90 - 97 - 3,3,3,3,3,3,3,3, # 98 - 9f - #0xa0 is illegal in sjis encoding, but some pages does - #contain such byte. We need to be more error forgiven. - 2,2,2,2,2,2,2,2, # a0 - a7 - 2,2,2,2,2,2,2,2, # a8 - af - 2,2,2,2,2,2,2,2, # b0 - b7 - 2,2,2,2,2,2,2,2, # b8 - bf - 2,2,2,2,2,2,2,2, # c0 - c7 - 2,2,2,2,2,2,2,2, # c8 - cf - 2,2,2,2,2,2,2,2, # d0 - d7 - 2,2,2,2,2,2,2,2, # d8 - df - 3,3,3,3,3,3,3,3, # e0 - e7 - 3,3,3,3,3,4,4,4, # e8 - ef - 3,3,3,3,3,3,3,3, # f0 - f7 - 3,3,3,3,3,0,0,0) # f8 - ff - - -SJIS_ST = ( - MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f - MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START #10-17 -) - -SJIS_CHAR_LEN_TABLE = (0, 1, 1, 2, 0, 0) - -SJIS_SM_MODEL = {'class_table': SJIS_CLS, - 'class_factor': 6, - 'state_table': SJIS_ST, - 'char_len_table': SJIS_CHAR_LEN_TABLE, - 'name': 'Shift_JIS'} - -# UCS2-BE - -UCS2BE_CLS = ( - 0,0,0,0,0,0,0,0, # 00 - 07 - 0,0,1,0,0,2,0,0, # 08 - 0f - 0,0,0,0,0,0,0,0, # 10 - 17 - 0,0,0,3,0,0,0,0, # 18 - 1f - 0,0,0,0,0,0,0,0, # 20 - 27 - 0,3,3,3,3,3,0,0, # 28 - 2f - 0,0,0,0,0,0,0,0, # 30 - 37 - 0,0,0,0,0,0,0,0, # 38 - 3f - 0,0,0,0,0,0,0,0, # 40 - 47 - 0,0,0,0,0,0,0,0, # 48 - 4f - 0,0,0,0,0,0,0,0, # 50 - 57 - 0,0,0,0,0,0,0,0, # 58 - 5f - 0,0,0,0,0,0,0,0, # 60 - 67 - 0,0,0,0,0,0,0,0, # 68 - 6f - 0,0,0,0,0,0,0,0, # 70 - 77 - 0,0,0,0,0,0,0,0, # 78 - 7f - 0,0,0,0,0,0,0,0, # 80 - 87 - 0,0,0,0,0,0,0,0, # 88 - 8f - 0,0,0,0,0,0,0,0, # 90 - 97 - 0,0,0,0,0,0,0,0, # 98 - 9f - 0,0,0,0,0,0,0,0, # a0 - a7 - 0,0,0,0,0,0,0,0, # a8 - af - 0,0,0,0,0,0,0,0, # b0 - b7 - 0,0,0,0,0,0,0,0, # b8 - bf - 0,0,0,0,0,0,0,0, # c0 - c7 - 0,0,0,0,0,0,0,0, # c8 - cf - 0,0,0,0,0,0,0,0, # d0 - d7 - 0,0,0,0,0,0,0,0, # d8 - df - 0,0,0,0,0,0,0,0, # e0 - e7 - 0,0,0,0,0,0,0,0, # e8 - ef - 0,0,0,0,0,0,0,0, # f0 - f7 - 0,0,0,0,0,0,4,5 # f8 - ff -) - -UCS2BE_ST = ( - 5, 7, 7,MachineState.ERROR, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f - MachineState.ITS_ME,MachineState.ITS_ME, 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,#10-17 - 6, 6, 6, 6, 6,MachineState.ITS_ME, 6, 6,#18-1f - 6, 6, 6, 6, 5, 7, 7,MachineState.ERROR,#20-27 - 5, 8, 6, 6,MachineState.ERROR, 6, 6, 6,#28-2f - 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #30-37 -) - -UCS2BE_CHAR_LEN_TABLE = (2, 2, 2, 0, 2, 2) - -UCS2BE_SM_MODEL = {'class_table': UCS2BE_CLS, - 'class_factor': 6, - 'state_table': UCS2BE_ST, - 'char_len_table': UCS2BE_CHAR_LEN_TABLE, - 'name': 'UTF-16BE'} - -# UCS2-LE - -UCS2LE_CLS = ( - 0,0,0,0,0,0,0,0, # 00 - 07 - 0,0,1,0,0,2,0,0, # 08 - 0f - 0,0,0,0,0,0,0,0, # 10 - 17 - 0,0,0,3,0,0,0,0, # 18 - 1f - 0,0,0,0,0,0,0,0, # 20 - 27 - 0,3,3,3,3,3,0,0, # 28 - 2f - 0,0,0,0,0,0,0,0, # 30 - 37 - 0,0,0,0,0,0,0,0, # 38 - 3f - 0,0,0,0,0,0,0,0, # 40 - 47 - 0,0,0,0,0,0,0,0, # 48 - 4f - 0,0,0,0,0,0,0,0, # 50 - 57 - 0,0,0,0,0,0,0,0, # 58 - 5f - 0,0,0,0,0,0,0,0, # 60 - 67 - 0,0,0,0,0,0,0,0, # 68 - 6f - 0,0,0,0,0,0,0,0, # 70 - 77 - 0,0,0,0,0,0,0,0, # 78 - 7f - 0,0,0,0,0,0,0,0, # 80 - 87 - 0,0,0,0,0,0,0,0, # 88 - 8f - 0,0,0,0,0,0,0,0, # 90 - 97 - 0,0,0,0,0,0,0,0, # 98 - 9f - 0,0,0,0,0,0,0,0, # a0 - a7 - 0,0,0,0,0,0,0,0, # a8 - af - 0,0,0,0,0,0,0,0, # b0 - b7 - 0,0,0,0,0,0,0,0, # b8 - bf - 0,0,0,0,0,0,0,0, # c0 - c7 - 0,0,0,0,0,0,0,0, # c8 - cf - 0,0,0,0,0,0,0,0, # d0 - d7 - 0,0,0,0,0,0,0,0, # d8 - df - 0,0,0,0,0,0,0,0, # e0 - e7 - 0,0,0,0,0,0,0,0, # e8 - ef - 0,0,0,0,0,0,0,0, # f0 - f7 - 0,0,0,0,0,0,4,5 # f8 - ff -) - -UCS2LE_ST = ( - 6, 6, 7, 6, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f - MachineState.ITS_ME,MachineState.ITS_ME, 5, 5, 5,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#10-17 - 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR, 6, 6,#18-1f - 7, 6, 8, 8, 5, 5, 5,MachineState.ERROR,#20-27 - 5, 5, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5,#28-2f - 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR,MachineState.START,MachineState.START #30-37 -) - -UCS2LE_CHAR_LEN_TABLE = (2, 2, 2, 2, 2, 2) - -UCS2LE_SM_MODEL = {'class_table': UCS2LE_CLS, - 'class_factor': 6, - 'state_table': UCS2LE_ST, - 'char_len_table': UCS2LE_CHAR_LEN_TABLE, - 'name': 'UTF-16LE'} - -# UTF-8 - -UTF8_CLS = ( - 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as a legal value - 1,1,1,1,1,1,0,0, # 08 - 0f - 1,1,1,1,1,1,1,1, # 10 - 17 - 1,1,1,0,1,1,1,1, # 18 - 1f - 1,1,1,1,1,1,1,1, # 20 - 27 - 1,1,1,1,1,1,1,1, # 28 - 2f - 1,1,1,1,1,1,1,1, # 30 - 37 - 1,1,1,1,1,1,1,1, # 38 - 3f - 1,1,1,1,1,1,1,1, # 40 - 47 - 1,1,1,1,1,1,1,1, # 48 - 4f - 1,1,1,1,1,1,1,1, # 50 - 57 - 1,1,1,1,1,1,1,1, # 58 - 5f - 1,1,1,1,1,1,1,1, # 60 - 67 - 1,1,1,1,1,1,1,1, # 68 - 6f - 1,1,1,1,1,1,1,1, # 70 - 77 - 1,1,1,1,1,1,1,1, # 78 - 7f - 2,2,2,2,3,3,3,3, # 80 - 87 - 4,4,4,4,4,4,4,4, # 88 - 8f - 4,4,4,4,4,4,4,4, # 90 - 97 - 4,4,4,4,4,4,4,4, # 98 - 9f - 5,5,5,5,5,5,5,5, # a0 - a7 - 5,5,5,5,5,5,5,5, # a8 - af - 5,5,5,5,5,5,5,5, # b0 - b7 - 5,5,5,5,5,5,5,5, # b8 - bf - 0,0,6,6,6,6,6,6, # c0 - c7 - 6,6,6,6,6,6,6,6, # c8 - cf - 6,6,6,6,6,6,6,6, # d0 - d7 - 6,6,6,6,6,6,6,6, # d8 - df - 7,8,8,8,8,8,8,8, # e0 - e7 - 8,8,8,8,8,9,8,8, # e8 - ef - 10,11,11,11,11,11,11,11, # f0 - f7 - 12,13,13,13,14,15,0,0 # f8 - ff -) - -UTF8_ST = ( - MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12, 10,#00-07 - 9, 11, 8, 7, 6, 5, 4, 3,#08-0f - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f - MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#20-27 - MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#28-2f - MachineState.ERROR,MachineState.ERROR, 5, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#30-37 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#38-3f - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#40-47 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#48-4f - MachineState.ERROR,MachineState.ERROR, 7, 7, 7, 7,MachineState.ERROR,MachineState.ERROR,#50-57 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#58-5f - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 7, 7,MachineState.ERROR,MachineState.ERROR,#60-67 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#68-6f - MachineState.ERROR,MachineState.ERROR, 9, 9, 9, 9,MachineState.ERROR,MachineState.ERROR,#70-77 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#78-7f - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 9,MachineState.ERROR,MachineState.ERROR,#80-87 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#88-8f - MachineState.ERROR,MachineState.ERROR, 12, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,#90-97 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#98-9f - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12,MachineState.ERROR,MachineState.ERROR,#a0-a7 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#a8-af - MachineState.ERROR,MachineState.ERROR, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b0-b7 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b8-bf - MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,#c0-c7 - MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR #c8-cf -) - -UTF8_CHAR_LEN_TABLE = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6) - -UTF8_SM_MODEL = {'class_table': UTF8_CLS, - 'class_factor': 16, - 'state_table': UTF8_ST, - 'char_len_table': UTF8_CHAR_LEN_TABLE, - 'name': 'UTF-8'} diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/sbcharsetprober.py b/env/lib/python3.7/site-packages/pip/_vendor/chardet/sbcharsetprober.py deleted file mode 100644 index 0adb51d..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/chardet/sbcharsetprober.py +++ /dev/null @@ -1,132 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .charsetprober import CharSetProber -from .enums import CharacterCategory, ProbingState, SequenceLikelihood - - -class SingleByteCharSetProber(CharSetProber): - SAMPLE_SIZE = 64 - SB_ENOUGH_REL_THRESHOLD = 1024 # 0.25 * SAMPLE_SIZE^2 - POSITIVE_SHORTCUT_THRESHOLD = 0.95 - NEGATIVE_SHORTCUT_THRESHOLD = 0.05 - - def __init__(self, model, reversed=False, name_prober=None): - super(SingleByteCharSetProber, self).__init__() - self._model = model - # TRUE if we need to reverse every pair in the model lookup - self._reversed = reversed - # Optional auxiliary prober for name decision - self._name_prober = name_prober - self._last_order = None - self._seq_counters = None - self._total_seqs = None - self._total_char = None - self._freq_char = None - self.reset() - - def reset(self): - super(SingleByteCharSetProber, self).reset() - # char order of last character - self._last_order = 255 - self._seq_counters = [0] * SequenceLikelihood.get_num_categories() - self._total_seqs = 0 - self._total_char = 0 - # characters that fall in our sampling range - self._freq_char = 0 - - @property - def charset_name(self): - if self._name_prober: - return self._name_prober.charset_name - else: - return self._model['charset_name'] - - @property - def language(self): - if self._name_prober: - return self._name_prober.language - else: - return self._model.get('language') - - def feed(self, byte_str): - if not self._model['keep_english_letter']: - byte_str = self.filter_international_words(byte_str) - if not byte_str: - return self.state - char_to_order_map = self._model['char_to_order_map'] - for i, c in enumerate(byte_str): - # XXX: Order is in range 1-64, so one would think we want 0-63 here, - # but that leads to 27 more test failures than before. - order = char_to_order_map[c] - # XXX: This was SYMBOL_CAT_ORDER before, with a value of 250, but - # CharacterCategory.SYMBOL is actually 253, so we use CONTROL - # to make it closer to the original intent. The only difference - # is whether or not we count digits and control characters for - # _total_char purposes. - if order < CharacterCategory.CONTROL: - self._total_char += 1 - if order < self.SAMPLE_SIZE: - self._freq_char += 1 - if self._last_order < self.SAMPLE_SIZE: - self._total_seqs += 1 - if not self._reversed: - i = (self._last_order * self.SAMPLE_SIZE) + order - model = self._model['precedence_matrix'][i] - else: # reverse the order of the letters in the lookup - i = (order * self.SAMPLE_SIZE) + self._last_order - model = self._model['precedence_matrix'][i] - self._seq_counters[model] += 1 - self._last_order = order - - charset_name = self._model['charset_name'] - if self.state == ProbingState.DETECTING: - if self._total_seqs > self.SB_ENOUGH_REL_THRESHOLD: - confidence = self.get_confidence() - if confidence > self.POSITIVE_SHORTCUT_THRESHOLD: - self.logger.debug('%s confidence = %s, we have a winner', - charset_name, confidence) - self._state = ProbingState.FOUND_IT - elif confidence < self.NEGATIVE_SHORTCUT_THRESHOLD: - self.logger.debug('%s confidence = %s, below negative ' - 'shortcut threshhold %s', charset_name, - confidence, - self.NEGATIVE_SHORTCUT_THRESHOLD) - self._state = ProbingState.NOT_ME - - return self.state - - def get_confidence(self): - r = 0.01 - if self._total_seqs > 0: - r = ((1.0 * self._seq_counters[SequenceLikelihood.POSITIVE]) / - self._total_seqs / self._model['typical_positive_ratio']) - r = r * self._freq_char / self._total_char - if r >= 1.0: - r = 0.99 - return r diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/sbcsgroupprober.py b/env/lib/python3.7/site-packages/pip/_vendor/chardet/sbcsgroupprober.py deleted file mode 100644 index 98e95dc..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/chardet/sbcsgroupprober.py +++ /dev/null @@ -1,73 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .charsetgroupprober import CharSetGroupProber -from .sbcharsetprober import SingleByteCharSetProber -from .langcyrillicmodel import (Win1251CyrillicModel, Koi8rModel, - Latin5CyrillicModel, MacCyrillicModel, - Ibm866Model, Ibm855Model) -from .langgreekmodel import Latin7GreekModel, Win1253GreekModel -from .langbulgarianmodel import Latin5BulgarianModel, Win1251BulgarianModel -# from .langhungarianmodel import Latin2HungarianModel, Win1250HungarianModel -from .langthaimodel import TIS620ThaiModel -from .langhebrewmodel import Win1255HebrewModel -from .hebrewprober import HebrewProber -from .langturkishmodel import Latin5TurkishModel - - -class SBCSGroupProber(CharSetGroupProber): - def __init__(self): - super(SBCSGroupProber, self).__init__() - self.probers = [ - SingleByteCharSetProber(Win1251CyrillicModel), - SingleByteCharSetProber(Koi8rModel), - SingleByteCharSetProber(Latin5CyrillicModel), - SingleByteCharSetProber(MacCyrillicModel), - SingleByteCharSetProber(Ibm866Model), - SingleByteCharSetProber(Ibm855Model), - SingleByteCharSetProber(Latin7GreekModel), - SingleByteCharSetProber(Win1253GreekModel), - SingleByteCharSetProber(Latin5BulgarianModel), - SingleByteCharSetProber(Win1251BulgarianModel), - # TODO: Restore Hungarian encodings (iso-8859-2 and windows-1250) - # after we retrain model. - # SingleByteCharSetProber(Latin2HungarianModel), - # SingleByteCharSetProber(Win1250HungarianModel), - SingleByteCharSetProber(TIS620ThaiModel), - SingleByteCharSetProber(Latin5TurkishModel), - ] - hebrew_prober = HebrewProber() - logical_hebrew_prober = SingleByteCharSetProber(Win1255HebrewModel, - False, hebrew_prober) - visual_hebrew_prober = SingleByteCharSetProber(Win1255HebrewModel, True, - hebrew_prober) - hebrew_prober.set_model_probers(logical_hebrew_prober, visual_hebrew_prober) - self.probers.extend([hebrew_prober, logical_hebrew_prober, - visual_hebrew_prober]) - - self.reset() diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/sjisprober.py b/env/lib/python3.7/site-packages/pip/_vendor/chardet/sjisprober.py deleted file mode 100644 index 9e29623..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/chardet/sjisprober.py +++ /dev/null @@ -1,92 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import SJISDistributionAnalysis -from .jpcntx import SJISContextAnalysis -from .mbcssm import SJIS_SM_MODEL -from .enums import ProbingState, MachineState - - -class SJISProber(MultiByteCharSetProber): - def __init__(self): - super(SJISProber, self).__init__() - self.coding_sm = CodingStateMachine(SJIS_SM_MODEL) - self.distribution_analyzer = SJISDistributionAnalysis() - self.context_analyzer = SJISContextAnalysis() - self.reset() - - def reset(self): - super(SJISProber, self).reset() - self.context_analyzer.reset() - - @property - def charset_name(self): - return self.context_analyzer.charset_name - - @property - def language(self): - return "Japanese" - - def feed(self, byte_str): - for i in range(len(byte_str)): - coding_state = self.coding_sm.next_state(byte_str[i]) - if coding_state == MachineState.ERROR: - self.logger.debug('%s %s prober hit error at byte %s', - self.charset_name, self.language, i) - self._state = ProbingState.NOT_ME - break - elif coding_state == MachineState.ITS_ME: - self._state = ProbingState.FOUND_IT - break - elif coding_state == MachineState.START: - char_len = self.coding_sm.get_current_charlen() - if i == 0: - self._last_char[1] = byte_str[0] - self.context_analyzer.feed(self._last_char[2 - char_len:], - char_len) - self.distribution_analyzer.feed(self._last_char, char_len) - else: - self.context_analyzer.feed(byte_str[i + 1 - char_len:i + 3 - - char_len], char_len) - self.distribution_analyzer.feed(byte_str[i - 1:i + 1], - char_len) - - self._last_char[0] = byte_str[-1] - - if self.state == ProbingState.DETECTING: - if (self.context_analyzer.got_enough_data() and - (self.get_confidence() > self.SHORTCUT_THRESHOLD)): - self._state = ProbingState.FOUND_IT - - return self.state - - def get_confidence(self): - context_conf = self.context_analyzer.get_confidence() - distrib_conf = self.distribution_analyzer.get_confidence() - return max(context_conf, distrib_conf) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/universaldetector.py b/env/lib/python3.7/site-packages/pip/_vendor/chardet/universaldetector.py deleted file mode 100644 index 7b4e92d..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/chardet/universaldetector.py +++ /dev/null @@ -1,286 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### -""" -Module containing the UniversalDetector detector class, which is the primary -class a user of ``chardet`` should use. - -:author: Mark Pilgrim (initial port to Python) -:author: Shy Shalom (original C code) -:author: Dan Blanchard (major refactoring for 3.0) -:author: Ian Cordasco -""" - - -import codecs -import logging -import re - -from .charsetgroupprober import CharSetGroupProber -from .enums import InputState, LanguageFilter, ProbingState -from .escprober import EscCharSetProber -from .latin1prober import Latin1Prober -from .mbcsgroupprober import MBCSGroupProber -from .sbcsgroupprober import SBCSGroupProber - - -class UniversalDetector(object): - """ - The ``UniversalDetector`` class underlies the ``chardet.detect`` function - and coordinates all of the different charset probers. - - To get a ``dict`` containing an encoding and its confidence, you can simply - run: - - .. code:: - - u = UniversalDetector() - u.feed(some_bytes) - u.close() - detected = u.result - - """ - - MINIMUM_THRESHOLD = 0.20 - HIGH_BYTE_DETECTOR = re.compile(b'[\x80-\xFF]') - ESC_DETECTOR = re.compile(b'(\033|~{)') - WIN_BYTE_DETECTOR = re.compile(b'[\x80-\x9F]') - ISO_WIN_MAP = {'iso-8859-1': 'Windows-1252', - 'iso-8859-2': 'Windows-1250', - 'iso-8859-5': 'Windows-1251', - 'iso-8859-6': 'Windows-1256', - 'iso-8859-7': 'Windows-1253', - 'iso-8859-8': 'Windows-1255', - 'iso-8859-9': 'Windows-1254', - 'iso-8859-13': 'Windows-1257'} - - def __init__(self, lang_filter=LanguageFilter.ALL): - self._esc_charset_prober = None - self._charset_probers = [] - self.result = None - self.done = None - self._got_data = None - self._input_state = None - self._last_char = None - self.lang_filter = lang_filter - self.logger = logging.getLogger(__name__) - self._has_win_bytes = None - self.reset() - - def reset(self): - """ - Reset the UniversalDetector and all of its probers back to their - initial states. This is called by ``__init__``, so you only need to - call this directly in between analyses of different documents. - """ - self.result = {'encoding': None, 'confidence': 0.0, 'language': None} - self.done = False - self._got_data = False - self._has_win_bytes = False - self._input_state = InputState.PURE_ASCII - self._last_char = b'' - if self._esc_charset_prober: - self._esc_charset_prober.reset() - for prober in self._charset_probers: - prober.reset() - - def feed(self, byte_str): - """ - Takes a chunk of a document and feeds it through all of the relevant - charset probers. - - After calling ``feed``, you can check the value of the ``done`` - attribute to see if you need to continue feeding the - ``UniversalDetector`` more data, or if it has made a prediction - (in the ``result`` attribute). - - .. note:: - You should always call ``close`` when you're done feeding in your - document if ``done`` is not already ``True``. - """ - if self.done: - return - - if not len(byte_str): - return - - if not isinstance(byte_str, bytearray): - byte_str = bytearray(byte_str) - - # First check for known BOMs, since these are guaranteed to be correct - if not self._got_data: - # If the data starts with BOM, we know it is UTF - if byte_str.startswith(codecs.BOM_UTF8): - # EF BB BF UTF-8 with BOM - self.result = {'encoding': "UTF-8-SIG", - 'confidence': 1.0, - 'language': ''} - elif byte_str.startswith((codecs.BOM_UTF32_LE, - codecs.BOM_UTF32_BE)): - # FF FE 00 00 UTF-32, little-endian BOM - # 00 00 FE FF UTF-32, big-endian BOM - self.result = {'encoding': "UTF-32", - 'confidence': 1.0, - 'language': ''} - elif byte_str.startswith(b'\xFE\xFF\x00\x00'): - # FE FF 00 00 UCS-4, unusual octet order BOM (3412) - self.result = {'encoding': "X-ISO-10646-UCS-4-3412", - 'confidence': 1.0, - 'language': ''} - elif byte_str.startswith(b'\x00\x00\xFF\xFE'): - # 00 00 FF FE UCS-4, unusual octet order BOM (2143) - self.result = {'encoding': "X-ISO-10646-UCS-4-2143", - 'confidence': 1.0, - 'language': ''} - elif byte_str.startswith((codecs.BOM_LE, codecs.BOM_BE)): - # FF FE UTF-16, little endian BOM - # FE FF UTF-16, big endian BOM - self.result = {'encoding': "UTF-16", - 'confidence': 1.0, - 'language': ''} - - self._got_data = True - if self.result['encoding'] is not None: - self.done = True - return - - # If none of those matched and we've only see ASCII so far, check - # for high bytes and escape sequences - if self._input_state == InputState.PURE_ASCII: - if self.HIGH_BYTE_DETECTOR.search(byte_str): - self._input_state = InputState.HIGH_BYTE - elif self._input_state == InputState.PURE_ASCII and \ - self.ESC_DETECTOR.search(self._last_char + byte_str): - self._input_state = InputState.ESC_ASCII - - self._last_char = byte_str[-1:] - - # If we've seen escape sequences, use the EscCharSetProber, which - # uses a simple state machine to check for known escape sequences in - # HZ and ISO-2022 encodings, since those are the only encodings that - # use such sequences. - if self._input_state == InputState.ESC_ASCII: - if not self._esc_charset_prober: - self._esc_charset_prober = EscCharSetProber(self.lang_filter) - if self._esc_charset_prober.feed(byte_str) == ProbingState.FOUND_IT: - self.result = {'encoding': - self._esc_charset_prober.charset_name, - 'confidence': - self._esc_charset_prober.get_confidence(), - 'language': - self._esc_charset_prober.language} - self.done = True - # If we've seen high bytes (i.e., those with values greater than 127), - # we need to do more complicated checks using all our multi-byte and - # single-byte probers that are left. The single-byte probers - # use character bigram distributions to determine the encoding, whereas - # the multi-byte probers use a combination of character unigram and - # bigram distributions. - elif self._input_state == InputState.HIGH_BYTE: - if not self._charset_probers: - self._charset_probers = [MBCSGroupProber(self.lang_filter)] - # If we're checking non-CJK encodings, use single-byte prober - if self.lang_filter & LanguageFilter.NON_CJK: - self._charset_probers.append(SBCSGroupProber()) - self._charset_probers.append(Latin1Prober()) - for prober in self._charset_probers: - if prober.feed(byte_str) == ProbingState.FOUND_IT: - self.result = {'encoding': prober.charset_name, - 'confidence': prober.get_confidence(), - 'language': prober.language} - self.done = True - break - if self.WIN_BYTE_DETECTOR.search(byte_str): - self._has_win_bytes = True - - def close(self): - """ - Stop analyzing the current document and come up with a final - prediction. - - :returns: The ``result`` attribute, a ``dict`` with the keys - `encoding`, `confidence`, and `language`. - """ - # Don't bother with checks if we're already done - if self.done: - return self.result - self.done = True - - if not self._got_data: - self.logger.debug('no data received!') - - # Default to ASCII if it is all we've seen so far - elif self._input_state == InputState.PURE_ASCII: - self.result = {'encoding': 'ascii', - 'confidence': 1.0, - 'language': ''} - - # If we have seen non-ASCII, return the best that met MINIMUM_THRESHOLD - elif self._input_state == InputState.HIGH_BYTE: - prober_confidence = None - max_prober_confidence = 0.0 - max_prober = None - for prober in self._charset_probers: - if not prober: - continue - prober_confidence = prober.get_confidence() - if prober_confidence > max_prober_confidence: - max_prober_confidence = prober_confidence - max_prober = prober - if max_prober and (max_prober_confidence > self.MINIMUM_THRESHOLD): - charset_name = max_prober.charset_name - lower_charset_name = max_prober.charset_name.lower() - confidence = max_prober.get_confidence() - # Use Windows encoding name instead of ISO-8859 if we saw any - # extra Windows-specific bytes - if lower_charset_name.startswith('iso-8859'): - if self._has_win_bytes: - charset_name = self.ISO_WIN_MAP.get(lower_charset_name, - charset_name) - self.result = {'encoding': charset_name, - 'confidence': confidence, - 'language': max_prober.language} - - # Log all prober confidences if none met MINIMUM_THRESHOLD - if self.logger.getEffectiveLevel() == logging.DEBUG: - if self.result['encoding'] is None: - self.logger.debug('no probers hit minimum threshold') - for group_prober in self._charset_probers: - if not group_prober: - continue - if isinstance(group_prober, CharSetGroupProber): - for prober in group_prober.probers: - self.logger.debug('%s %s confidence = %s', - prober.charset_name, - prober.language, - prober.get_confidence()) - else: - self.logger.debug('%s %s confidence = %s', - prober.charset_name, - prober.language, - prober.get_confidence()) - return self.result diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/utf8prober.py b/env/lib/python3.7/site-packages/pip/_vendor/chardet/utf8prober.py deleted file mode 100644 index 6c3196c..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/chardet/utf8prober.py +++ /dev/null @@ -1,82 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .charsetprober import CharSetProber -from .enums import ProbingState, MachineState -from .codingstatemachine import CodingStateMachine -from .mbcssm import UTF8_SM_MODEL - - - -class UTF8Prober(CharSetProber): - ONE_CHAR_PROB = 0.5 - - def __init__(self): - super(UTF8Prober, self).__init__() - self.coding_sm = CodingStateMachine(UTF8_SM_MODEL) - self._num_mb_chars = None - self.reset() - - def reset(self): - super(UTF8Prober, self).reset() - self.coding_sm.reset() - self._num_mb_chars = 0 - - @property - def charset_name(self): - return "utf-8" - - @property - def language(self): - return "" - - def feed(self, byte_str): - for c in byte_str: - coding_state = self.coding_sm.next_state(c) - if coding_state == MachineState.ERROR: - self._state = ProbingState.NOT_ME - break - elif coding_state == MachineState.ITS_ME: - self._state = ProbingState.FOUND_IT - break - elif coding_state == MachineState.START: - if self.coding_sm.get_current_charlen() >= 2: - self._num_mb_chars += 1 - - if self.state == ProbingState.DETECTING: - if self.get_confidence() > self.SHORTCUT_THRESHOLD: - self._state = ProbingState.FOUND_IT - - return self.state - - def get_confidence(self): - unlike = 0.99 - if self._num_mb_chars < 6: - unlike *= self.ONE_CHAR_PROB ** self._num_mb_chars - return 1.0 - unlike - else: - return unlike diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/version.py b/env/lib/python3.7/site-packages/pip/_vendor/chardet/version.py deleted file mode 100644 index bb2a34a..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/chardet/version.py +++ /dev/null @@ -1,9 +0,0 @@ -""" -This module exists only to simplify retrieving the version number of chardet -from within setup.py and from chardet subpackages. - -:author: Dan Blanchard (dan.blanchard@gmail.com) -""" - -__version__ = "3.0.4" -VERSION = __version__.split('.') diff --git a/env/lib/python3.7/site-packages/pip/_vendor/colorama/__init__.py b/env/lib/python3.7/site-packages/pip/_vendor/colorama/__init__.py deleted file mode 100644 index 2a3bf47..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/colorama/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. -from .initialise import init, deinit, reinit, colorama_text -from .ansi import Fore, Back, Style, Cursor -from .ansitowin32 import AnsiToWin32 - -__version__ = '0.4.1' diff --git a/env/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 4b8a10e1699cbc598c489e2363905eb8146c89c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 400 zcmXw#y-ve05P;*vNz<kgYhNKl8w!l5f`S-XiiBhdSy63-g@1zWLd)wg@k(BqnAn-{ zQPt9Y_kX(cvaUx-eEMVZ@DueHIER-;<06W?j$jExGEs;im6B9tBvY7R1o2ensvw0L zkbx>msfJ|uAJ61SRiuhGCS#VblBW1Zaa4l?7FzgFFuvDzuj{pu#&)Wso^L&r-5ARQ zUUuu}kgxns@=#oDtTVPjp}N#g+?ji!Pfy<S<JsA4e%sVx1S3T!h2s`3uo(aY@`!-D z*k%jx2Y?bVgiHk)Z{A>_g>MNJrLWvNVKk+mi9Lc+!0)2<s&9MIPla~AlXA*lc6vL1 ne1hP=#7@nOZ4WoKl)`3|&iY*_&y`^t$rrGpgJmXYg2w3|V6<t( diff --git a/env/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-37.pyc deleted file mode 100644 index bfa446b72e42ec0b6ea64ed4815ecb1f54eed152..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3298 zcmcguTT|Oc6xK@eO}=0Zfh4`TO)qiV*iENTq?5rm4v-j=Vi+2wR8_qSC^5FP5=mgl zOlQasNvBW!OFMn*lm0@UdcHLmL+CWTRGR&yvqw5-&*fXGmd#ok9lbv;Z~T?gw7(%7 z9VXq((g<D?aLv{@vl-WIog22nO&)ut*(Q(k1YKkNGEZ^q6|>{~3QzM4-6iHVp5?h$ z8qayj1H(>{JjU}R=ap=cJkARw7rYed(<D#uNs=d(oFVxVpCWlm$yqObpxHSuLpbJT z3G<#sIL@crTIuTEZ`SIT9~8Iye5dObH@%)G+|Ub()mD44*x7Q0+X+2U?DRQJhW+9| z_`T5YZPHA)FVqz2xBZ^m4a!#A^Ja=$VK|tnRJ>mKx&Oo;c-(i(eX&`ARDoT`3p(z= zb70ik)8BhYW8)1=bQt9f2d)N<I*lMt5NaXY*ACb;rE^-Nh3hTJwoAG+>g`2o1feJ~ zX~N#0nuya2Z)Pgt_MkHG2RHm)5W3y&4gPeu_u}TGEljH6Jo9?IFDfb$ciXMFy}&OI zc4ZcZoUrd8{vd-z=mZ)QNy1aB#QexAvATV2npS(b%02ztTUh3DyDp7dqe;t*g?`xe z)GCLNAR96jc%h>-V<aB=gYO7FPC5PW)Z8uU0#6CFBT_^4eamI0)Ad~81Rdddy#hUW z<P{mepu>Bo9SQ_-HbiUauj}``OC#RkxkKalK)kawf=L2TBl>7WA0iP^#^453-;}8; z)v8WG1;-0TyeNGgug(y>_%5Vk9I!cU<N8as&t5amerJId>igP0JJ4V1p@F;5+}97- zfx)z=);e+au)Um8Od8x5(xUzmVes4!w`5||3*9gjGC}pijcSRKA<e++K9Xk7-S%Yc zncLlYE8R)Q@q2#gI9IVibdqM~m__Ga;W(P|(L*f?lHPzl$B~xf3>ixI8OM3L<93G{ z@jjUuNi-55&`@H6;0g^@)Fe~#sWc;Bvv}Y(!Eu_ioOUYOhYX%myA`9|YE11{jP|QM zPx6%7ug1B>)7Y<ghVoUAmI`4<1bq>Kz8zE%2d;3X%5uzQc81H<Q~je0tX#6*NMwp7 z`r7@^NORbzd)X7G<+b}4bXhycrMO1c&pI{dme*TfjJO>eaSPoA9oOI0apKPM%6fHW zt~BC%*eWW|<wNxa-Os(Nd$U%p-}`FB_h{VEbx>CvxMI|41n5Y$UlXZ@`!(&|!+Ps# zS2S90*e%HxPOZZ@Ecpw`cFz{TxWC-K0n@6d*j{cV|D<Y_nE05~=U;TC8$OT}AJB8+ zL%>IXPXV6;t^>XVQ~-)cC!iQrBn4gw@bynJOCO#B^Bo$;2l{`OMsT0tm|5VIPHZxW zM<#voW5k`fo#Y8S#gn$hQ+AqLc7~_zEYH|Ep0&q#&d&2O`c~)d0w1?0c!9V!A(M#z zPG5KtB8d=5R0JRk(I<dw04z2FUm|pGWCI=oegbR&eg-&zUjQyat2B8gO)^$%Qn{tE z(wLL6`ISbaCF2ho&F1pDG;7VZhD<C~=Nqlnsx<2lsx28?Uszmi$k<Aw-B^{`=HmRq zsxsj;ew1k?k|_v7oiYhAr*uQpkTZv`t~DTyDe2JFi5e~;4Q(mcB%WKsZz#T-Gy)_k z$;`8-ae7AJ`TxJPHMjF5LPJJieuS=!z{BWk0GJS!0qE2S;Y1wZ0UiN10b2kc@EGuf z;O)|i8chrER?Gn!fIEPBzye?qa2Ie7&;%?2T7YE$8eRMVSOJ_6N8Ks*v`GP*@0xl% ze}3w*!TdX`h#~Re??F4<rT;8&LSzY|DF6*hL*i_Q$7?HSQfbUBF3EUnd1a~ElquD} zPPN%QHzMR4BvRk<qh=DA#f}7*N0)+3I1cZ39B24fmLi?707(G;@<bkhe<2y~|N7YL zgzAf}HW$@~0tr#pr3vm6^QcW^OhqZ<b@fR&Z=Evv{qW!6c8n|pMFLY-eQqS_v<%D4 Or}NqT6rJ%n!}$-}EqGx7 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-37.pyc deleted file mode 100644 index 4b73d6b4bab09fecc3ece927c798b4674af38dc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7554 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 XPDnij6e7BeXkfuaG8fsWg&Y3^9`xl3 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-37.pyc deleted file mode 100644 index 84bfb155541be3868207be080f3585ddc69609d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1619 zcma)6OK%)S5bo}I?CjGIf(e!pD<6<nB3L962SiW+;RA=guu9MhwCZe6*5l01Y^r<X zIBYK12QKg%Y;oc*&6QLB0w=!e&93bTBxY3AUES5))n9$pU$@&0fv@=E_D?_8g!qe% z)fb}k0Ad}K5k}@>xNPN6dRq;ZQ6|WPX*dieJahz!AvH*1LR~kJiO<EbVYW?T>gRIU zG!4_lNGp}cZPPOCb8#kz9n&!z7~L?NW()16k>88nJFjuF=)acGJy|usDr`0=A7#b8 zyN6?*T73$gZy@$IltYkD>vYQrC(q=Cx)caaU_06G1r)%eYL=8uM%I~f?y5SaHgzMN z=YI-{G40jg4-VXPb}-9kce27d%-%82PKy_xJ~`q+FQeyaVM;m}mw8Egst>XvbD7RF zn|?Aor3ia%Lo6dHWFq~@VC+qdaLecU$bUs=5!hWP7Gfb6Y7(4D+I7<44!=mJjsqP+ zM>^&{ZkW(#M(A3x;}RG03aksxqEI+B3UrNqz1NTMs(Y{aEw4z|UBjNc=0(f3FC|b? zy5W%u`Y%5|Aw9c)sB@ck$7S&(&&JMnPcnDZ)x~MIbVn(5HBIghXr2ywohra^)p)4$ zdHO9;NmXD^Z51y;CcdjTQlcyP+34^=v(&88(PSG2rFwc}(y!DmeUZ75DT}m<mqwLP zI?1fVJR{x<tGb@M(r2}*A@=7fxhler*{lkA_p2-uNH408^Y$Kkb{9&hZJ9)|j8#L% z!H)Dg2+<PL>)(mj#mpPxb(nY~<v2-o+H(P{a7Dn#BSBns)MV9W)nc`#-m>Q-i%rV0 z-NU?1pqNE5GwFTw*O4&&*}a6=eW)dgen(1QBB2ja0FO`tC<pX@SQmrx_wifxR23qb z$k)>oZm$L7<7lraJ_7#kb3Vt11BjGtDB8owIvn)Hx+1$U{vR+McwPf$lg<AIhCDF7 zbZ!9i0hW!K2mCRl>k9h_#v-KsRfR1ABYz8DMT_V{UJBY@M91nCst+%P;+NuG_|p!n zTTtt#!yc9M+>Dq<OlYQQFQyOK@8$|(Mpd;Xz3DAPX#<nrK`dWU$Pj<aC)dyP!oz-l z(Ay$@KdJ^u%(&;-V-HZ()OZP9dBQKDf6<n#@?7#TdhoWe)|bRpo~zEAt){xr6I2W* uju<n4?6n|08-4DRFQ%oL=joT6Q_Bky1e&N8Y9dr#f+T9}CACgHsr>_x=1)Wb diff --git a/env/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-37.pyc deleted file mode 100644 index e42093fa4d4e88fda773661c71114399a632ca6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3813 zcmai1OLH5?5#E`7;6acANj)Hnk|4=)1c!ngIaR5|Dn;T$k17~c5wvM<#kIA>3`jtW zU1)Y8iY(|vU6aZ!SGjV^-^kC{Yfe5Vx%i@dJqtoKCB_R*&rEmkOz+o^87@yx7Y#h& z-z(oQo->Sp(d6hUVDJDf{wFgGVYr51F59mQF3f<t9K99rzUi9Gkf!84>yWuNxHh<s z>o8->2<w(1b28uI&x=YhgMPw<mLqa+47VWix-Wib{FR07w+7xW;O!}Qs$X(T{b_f) zKjY3|eW!QEEk8CyQB1ut#FQ)@n(nN$dvm>c_bjC6c9=ZtoyX_``ihoZbQkn|M$R6x z9WEEN{1W<1UT_z+-05A0ba5<Q980gbSGBYZ+10V^>R48FuW8vd=s8)IGt^@bTV5M$ zUK?v(cW-D-?D2u_jj`^HvF<1CP3U}zFS$9E-1I7<B&LDXuf&WvgT5$@4ijZD`-Zs} z#hjSeC|(xl#CdS8hzp_u&Mk3KETF$GE{R3-HDR`l+Li8q-@SX+{SU~G<l|<IrPGb> zw(`|}Bl3k*VC46@VX{Avahp`=f%A2Hj6SwNgn`9a^B*87^Axc(`RU6$Nq=x>&>h_F zhH>Ht!ENzkKYaC@&Mq-^^IpnOMCwjE3L@qA{X5w1i@Wu~ewx1*`2B6+-=D#H|3))Z z4&)cj&|BA-vgwV9Ey_7s;0z7&AT=wsxA&Foq=i<ZhV5jiWa_lN_O7qe+_Uwk&CRuq z$#!_bpfw(##rHv^;WA+$?3rr{F0BsIKvN6B=3r){&!KmSyJNcuZIK7~1yKNA#dKk1 zz1doCta+`KjkUF=xBT^^M{672)8?b~gZWrnRPBaU0Md@a`ffdS#9pg=Ak(tgTN$c2 zQqQ8en{=Zvo!WbtB&xeTOk|wqW3|-<sC((W*!#+V)$I@a8H3(#ll$nQzJ#`d7C!+I zY-IF|UPd{_rXHI;8e3@iEKPHo<~1#V7PVfn$2(K!DHM3~;QFnbV(I_>)oN3UJe#ub zQueLVUMXX)W{GKTMuXI9$WG!q%Tba<eb?UT?(8ON4r0Wa70aM=!o6wE^MIS@U4c$a z-)1n*O88l<!Va#Vj(2_hViRu3dtT`GrRSwZ&+A8G7|^)nc`t^3FqU8=5w*d#SJu}z zR+WjZQfmuCx7hmXVWZ(~tgUQfsZLi0BKA}T3dgL~VW}f>8UoZ=BPJ~J%;FAnSRTJ3 zS0tObi?*QGw7V8DNQ^_{HA~>Ggpb%EJLIo<VvhJB)7e<F^!w>0@3Bl)qA-pE*=j2( z!{uS8Bh}Ne6Dg|bskI$NLCs8^T|X3oOs#gj-A!}xu-%q%e9USx7(gH({Xy45s3m^_ zC#GC7U^PLlZerXf#?eD*sBI>vBnUFW-xvu?U?-?~$U1!0fc0dx*_?bXhc<n3Ozk|# z$oPH+pKH*keuLnB!N+9>sZN{Lc*^Uar)>9x!9Nx5?Z{BR8mRkZS4<0A#=(_iUs1mo zL~TEa@7E`)s12qc?x)j)UMmq#GH9IE=IZ*_n<@2c8ym;Ans^ks_#U5a+L1&CJgRP^ zpL`&3C;qHrf=>eu<WcyQlTR~m!mse^kxxH^rgp5NceDdxYXM;|{l3=~>N>G+5cz}% zZIKb}y@k_*p##lWAO5g)?9DsiwFxnL$Q{&H&|*r%vBexQND(-;kt?z>t$3|T+-=HN z$)rHlOjRcZ+egWYGkZ^1dEt~-`?NFZYB=wr-)xgb^w8&#NL%+30}7SDAVWs1#{_%M z;zf*5t)DYhrO+WcB)mdBE-w`$Lt2T%OmKDS*{`jUX;DG6dd}|*Zg@=3Ip#S%=Lw1+ zd}b$wkv%ds0%lWDW&M#zt*9=eQ}aa55+Oj<uZd8ZQ<V9NqC3Ov;xWvAUg2v_23me_ zRPr5P^oDVg&St$7-bBP>^-)+W?_vG<>MvkHO!fg+ewJC*c@&}|E3-03*!~{;wniNT zI)bTbn3pja2Z4nkU~l;kSqPhNtr7o$Q9*iZ35JoK*duF1fnp}k$VS53uhI8%`n=GP z)$$qzHHB4EN8;4O4TRjA+N)Gr(?#!5HwebHY<-vvhRF)fYQLRG^)Rbt_Deq)%33Z% z%hE@=6UcBU*-dR+K~$oVNvFbL-`i8&B$46A6Xo=+4q=im*A#^%Rz#`hY>p{H<KsB} z0h0GPy+yKUMA%y-wnhmfjgpgCK*`o9*&~NgB76?~>Iddb^66G}cMQo=l`41r*j-?$ zimO5t(zy>|6e*D%0ZY|S+XP*_l|fLgWgc)c4-n{z>b3e31V_l}yJr>X2yaSh^+$T~ z0THT2X@QvfYN8$z^F*#MoWAy-p`IP%2t&ZEfmV;eom5fEGOABH9O)p+V9u%~OJ|QI z)Mhsc<QA?Dc0!|*cAR;i99r{lSS+Tc4W^!g*4Sq4vn+L&FvUet--;EfxDM`DtBpqL zp!SO($f9;;;-WRBB9%@(?GGZA=!v4@r4IxRprX2~17Fd##dW;wUZJZ8T?5kmbE!fZ zd~w$;9Y2vWe`zn}eYK-aa-Am+o2!krG^cPx<LaJOohmJCEw8UP)aMvx{-xYjza`0~ z5BzW}x9*V|0j~&Xw|oMtEk*wexVgr&m95t1hCYvVI%wpMA+3E+l^VDE>}qwNSaA=; zLe1ghj4C6aER4&%!W~|o%kv`7<7ctbxIdZ`m-rm|oXw19SZgxVnoiy-<?>c>E?>+S F{|DVIVEO<6 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-37.pyc deleted file mode 100644 index 9be612bd4dbe236a17167f329019a6bc7c4cf382..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4561 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/colorama/ansi.py b/env/lib/python3.7/site-packages/pip/_vendor/colorama/ansi.py deleted file mode 100644 index 7877658..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/colorama/ansi.py +++ /dev/null @@ -1,102 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. -''' -This module generates ANSI character codes to printing colors to terminals. -See: http://en.wikipedia.org/wiki/ANSI_escape_code -''' - -CSI = '\033[' -OSC = '\033]' -BEL = '\007' - - -def code_to_chars(code): - return CSI + str(code) + 'm' - -def set_title(title): - return OSC + '2;' + title + BEL - -def clear_screen(mode=2): - return CSI + str(mode) + 'J' - -def clear_line(mode=2): - return CSI + str(mode) + 'K' - - -class AnsiCodes(object): - def __init__(self): - # the subclasses declare class attributes which are numbers. - # Upon instantiation we define instance attributes, which are the same - # as the class attributes but wrapped with the ANSI escape sequence - for name in dir(self): - if not name.startswith('_'): - value = getattr(self, name) - setattr(self, name, code_to_chars(value)) - - -class AnsiCursor(object): - def UP(self, n=1): - return CSI + str(n) + 'A' - def DOWN(self, n=1): - return CSI + str(n) + 'B' - def FORWARD(self, n=1): - return CSI + str(n) + 'C' - def BACK(self, n=1): - return CSI + str(n) + 'D' - def POS(self, x=1, y=1): - return CSI + str(y) + ';' + str(x) + 'H' - - -class AnsiFore(AnsiCodes): - BLACK = 30 - RED = 31 - GREEN = 32 - YELLOW = 33 - BLUE = 34 - MAGENTA = 35 - CYAN = 36 - WHITE = 37 - RESET = 39 - - # These are fairly well supported, but not part of the standard. - LIGHTBLACK_EX = 90 - LIGHTRED_EX = 91 - LIGHTGREEN_EX = 92 - LIGHTYELLOW_EX = 93 - LIGHTBLUE_EX = 94 - LIGHTMAGENTA_EX = 95 - LIGHTCYAN_EX = 96 - LIGHTWHITE_EX = 97 - - -class AnsiBack(AnsiCodes): - BLACK = 40 - RED = 41 - GREEN = 42 - YELLOW = 43 - BLUE = 44 - MAGENTA = 45 - CYAN = 46 - WHITE = 47 - RESET = 49 - - # These are fairly well supported, but not part of the standard. - LIGHTBLACK_EX = 100 - LIGHTRED_EX = 101 - LIGHTGREEN_EX = 102 - LIGHTYELLOW_EX = 103 - LIGHTBLUE_EX = 104 - LIGHTMAGENTA_EX = 105 - LIGHTCYAN_EX = 106 - LIGHTWHITE_EX = 107 - - -class AnsiStyle(AnsiCodes): - BRIGHT = 1 - DIM = 2 - NORMAL = 22 - RESET_ALL = 0 - -Fore = AnsiFore() -Back = AnsiBack() -Style = AnsiStyle() -Cursor = AnsiCursor() diff --git a/env/lib/python3.7/site-packages/pip/_vendor/colorama/ansitowin32.py b/env/lib/python3.7/site-packages/pip/_vendor/colorama/ansitowin32.py deleted file mode 100644 index 359c92b..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/colorama/ansitowin32.py +++ /dev/null @@ -1,257 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. -import re -import sys -import os - -from .ansi import AnsiFore, AnsiBack, AnsiStyle, Style -from .winterm import WinTerm, WinColor, WinStyle -from .win32 import windll, winapi_test - - -winterm = None -if windll is not None: - winterm = WinTerm() - - -class StreamWrapper(object): - ''' - Wraps a stream (such as stdout), acting as a transparent proxy for all - attribute access apart from method 'write()', which is delegated to our - Converter instance. - ''' - def __init__(self, wrapped, converter): - # double-underscore everything to prevent clashes with names of - # attributes on the wrapped stream object. - self.__wrapped = wrapped - self.__convertor = converter - - def __getattr__(self, name): - return getattr(self.__wrapped, name) - - def __enter__(self, *args, **kwargs): - # special method lookup bypasses __getattr__/__getattribute__, see - # https://stackoverflow.com/questions/12632894/why-doesnt-getattr-work-with-exit - # thus, contextlib magic methods are not proxied via __getattr__ - return self.__wrapped.__enter__(*args, **kwargs) - - def __exit__(self, *args, **kwargs): - return self.__wrapped.__exit__(*args, **kwargs) - - def write(self, text): - self.__convertor.write(text) - - def isatty(self): - stream = self.__wrapped - if 'PYCHARM_HOSTED' in os.environ: - if stream is not None and (stream is sys.__stdout__ or stream is sys.__stderr__): - return True - try: - stream_isatty = stream.isatty - except AttributeError: - return False - else: - return stream_isatty() - - @property - def closed(self): - stream = self.__wrapped - try: - return stream.closed - except AttributeError: - return True - - -class AnsiToWin32(object): - ''' - Implements a 'write()' method which, on Windows, will strip ANSI character - sequences from the text, and if outputting to a tty, will convert them into - win32 function calls. - ''' - ANSI_CSI_RE = re.compile('\001?\033\\[((?:\\d|;)*)([a-zA-Z])\002?') # Control Sequence Introducer - ANSI_OSC_RE = re.compile('\001?\033\\]((?:.|;)*?)(\x07)\002?') # Operating System Command - - def __init__(self, wrapped, convert=None, strip=None, autoreset=False): - # The wrapped stream (normally sys.stdout or sys.stderr) - self.wrapped = wrapped - - # should we reset colors to defaults after every .write() - self.autoreset = autoreset - - # create the proxy wrapping our output stream - self.stream = StreamWrapper(wrapped, self) - - on_windows = os.name == 'nt' - # We test if the WinAPI works, because even if we are on Windows - # we may be using a terminal that doesn't support the WinAPI - # (e.g. Cygwin Terminal). In this case it's up to the terminal - # to support the ANSI codes. - conversion_supported = on_windows and winapi_test() - - # should we strip ANSI sequences from our output? - if strip is None: - strip = conversion_supported or (not self.stream.closed and not self.stream.isatty()) - self.strip = strip - - # should we should convert ANSI sequences into win32 calls? - if convert is None: - convert = conversion_supported and not self.stream.closed and self.stream.isatty() - self.convert = convert - - # dict of ansi codes to win32 functions and parameters - self.win32_calls = self.get_win32_calls() - - # are we wrapping stderr? - self.on_stderr = self.wrapped is sys.stderr - - def should_wrap(self): - ''' - True if this class is actually needed. If false, then the output - stream will not be affected, nor will win32 calls be issued, so - wrapping stdout is not actually required. This will generally be - False on non-Windows platforms, unless optional functionality like - autoreset has been requested using kwargs to init() - ''' - return self.convert or self.strip or self.autoreset - - def get_win32_calls(self): - if self.convert and winterm: - return { - AnsiStyle.RESET_ALL: (winterm.reset_all, ), - AnsiStyle.BRIGHT: (winterm.style, WinStyle.BRIGHT), - AnsiStyle.DIM: (winterm.style, WinStyle.NORMAL), - AnsiStyle.NORMAL: (winterm.style, WinStyle.NORMAL), - AnsiFore.BLACK: (winterm.fore, WinColor.BLACK), - AnsiFore.RED: (winterm.fore, WinColor.RED), - AnsiFore.GREEN: (winterm.fore, WinColor.GREEN), - AnsiFore.YELLOW: (winterm.fore, WinColor.YELLOW), - AnsiFore.BLUE: (winterm.fore, WinColor.BLUE), - AnsiFore.MAGENTA: (winterm.fore, WinColor.MAGENTA), - AnsiFore.CYAN: (winterm.fore, WinColor.CYAN), - AnsiFore.WHITE: (winterm.fore, WinColor.GREY), - AnsiFore.RESET: (winterm.fore, ), - AnsiFore.LIGHTBLACK_EX: (winterm.fore, WinColor.BLACK, True), - AnsiFore.LIGHTRED_EX: (winterm.fore, WinColor.RED, True), - AnsiFore.LIGHTGREEN_EX: (winterm.fore, WinColor.GREEN, True), - AnsiFore.LIGHTYELLOW_EX: (winterm.fore, WinColor.YELLOW, True), - AnsiFore.LIGHTBLUE_EX: (winterm.fore, WinColor.BLUE, True), - AnsiFore.LIGHTMAGENTA_EX: (winterm.fore, WinColor.MAGENTA, True), - AnsiFore.LIGHTCYAN_EX: (winterm.fore, WinColor.CYAN, True), - AnsiFore.LIGHTWHITE_EX: (winterm.fore, WinColor.GREY, True), - AnsiBack.BLACK: (winterm.back, WinColor.BLACK), - AnsiBack.RED: (winterm.back, WinColor.RED), - AnsiBack.GREEN: (winterm.back, WinColor.GREEN), - AnsiBack.YELLOW: (winterm.back, WinColor.YELLOW), - AnsiBack.BLUE: (winterm.back, WinColor.BLUE), - AnsiBack.MAGENTA: (winterm.back, WinColor.MAGENTA), - AnsiBack.CYAN: (winterm.back, WinColor.CYAN), - AnsiBack.WHITE: (winterm.back, WinColor.GREY), - AnsiBack.RESET: (winterm.back, ), - AnsiBack.LIGHTBLACK_EX: (winterm.back, WinColor.BLACK, True), - AnsiBack.LIGHTRED_EX: (winterm.back, WinColor.RED, True), - AnsiBack.LIGHTGREEN_EX: (winterm.back, WinColor.GREEN, True), - AnsiBack.LIGHTYELLOW_EX: (winterm.back, WinColor.YELLOW, True), - AnsiBack.LIGHTBLUE_EX: (winterm.back, WinColor.BLUE, True), - AnsiBack.LIGHTMAGENTA_EX: (winterm.back, WinColor.MAGENTA, True), - AnsiBack.LIGHTCYAN_EX: (winterm.back, WinColor.CYAN, True), - AnsiBack.LIGHTWHITE_EX: (winterm.back, WinColor.GREY, True), - } - return dict() - - def write(self, text): - if self.strip or self.convert: - self.write_and_convert(text) - else: - self.wrapped.write(text) - self.wrapped.flush() - if self.autoreset: - self.reset_all() - - - def reset_all(self): - if self.convert: - self.call_win32('m', (0,)) - elif not self.strip and not self.stream.closed: - self.wrapped.write(Style.RESET_ALL) - - - def write_and_convert(self, text): - ''' - Write the given text to our wrapped stream, stripping any ANSI - sequences from the text, and optionally converting them into win32 - calls. - ''' - cursor = 0 - text = self.convert_osc(text) - for match in self.ANSI_CSI_RE.finditer(text): - start, end = match.span() - self.write_plain_text(text, cursor, start) - self.convert_ansi(*match.groups()) - cursor = end - self.write_plain_text(text, cursor, len(text)) - - - def write_plain_text(self, text, start, end): - if start < end: - self.wrapped.write(text[start:end]) - self.wrapped.flush() - - - def convert_ansi(self, paramstring, command): - if self.convert: - params = self.extract_params(command, paramstring) - self.call_win32(command, params) - - - def extract_params(self, command, paramstring): - if command in 'Hf': - params = tuple(int(p) if len(p) != 0 else 1 for p in paramstring.split(';')) - while len(params) < 2: - # defaults: - params = params + (1,) - else: - params = tuple(int(p) for p in paramstring.split(';') if len(p) != 0) - if len(params) == 0: - # defaults: - if command in 'JKm': - params = (0,) - elif command in 'ABCD': - params = (1,) - - return params - - - def call_win32(self, command, params): - if command == 'm': - for param in params: - if param in self.win32_calls: - func_args = self.win32_calls[param] - func = func_args[0] - args = func_args[1:] - kwargs = dict(on_stderr=self.on_stderr) - func(*args, **kwargs) - elif command in 'J': - winterm.erase_screen(params[0], on_stderr=self.on_stderr) - elif command in 'K': - winterm.erase_line(params[0], on_stderr=self.on_stderr) - elif command in 'Hf': # cursor position - absolute - winterm.set_cursor_position(params, on_stderr=self.on_stderr) - elif command in 'ABCD': # cursor position - relative - n = params[0] - # A - up, B - down, C - forward, D - back - x, y = {'A': (0, -n), 'B': (0, n), 'C': (n, 0), 'D': (-n, 0)}[command] - winterm.cursor_adjust(x, y, on_stderr=self.on_stderr) - - - def convert_osc(self, text): - for match in self.ANSI_OSC_RE.finditer(text): - start, end = match.span() - text = text[:start] + text[end:] - paramstring, command = match.groups() - if command in '\x07': # \x07 = BEL - params = paramstring.split(";") - # 0 - change title and icon (we will only change title) - # 1 - change icon (we don't support this) - # 2 - change title - if params[0] in '02': - winterm.set_title(params[1]) - return text diff --git a/env/lib/python3.7/site-packages/pip/_vendor/colorama/initialise.py b/env/lib/python3.7/site-packages/pip/_vendor/colorama/initialise.py deleted file mode 100644 index 430d066..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/colorama/initialise.py +++ /dev/null @@ -1,80 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. -import atexit -import contextlib -import sys - -from .ansitowin32 import AnsiToWin32 - - -orig_stdout = None -orig_stderr = None - -wrapped_stdout = None -wrapped_stderr = None - -atexit_done = False - - -def reset_all(): - if AnsiToWin32 is not None: # Issue #74: objects might become None at exit - AnsiToWin32(orig_stdout).reset_all() - - -def init(autoreset=False, convert=None, strip=None, wrap=True): - - if not wrap and any([autoreset, convert, strip]): - raise ValueError('wrap=False conflicts with any other arg=True') - - global wrapped_stdout, wrapped_stderr - global orig_stdout, orig_stderr - - orig_stdout = sys.stdout - orig_stderr = sys.stderr - - if sys.stdout is None: - wrapped_stdout = None - else: - sys.stdout = wrapped_stdout = \ - wrap_stream(orig_stdout, convert, strip, autoreset, wrap) - if sys.stderr is None: - wrapped_stderr = None - else: - sys.stderr = wrapped_stderr = \ - wrap_stream(orig_stderr, convert, strip, autoreset, wrap) - - global atexit_done - if not atexit_done: - atexit.register(reset_all) - atexit_done = True - - -def deinit(): - if orig_stdout is not None: - sys.stdout = orig_stdout - if orig_stderr is not None: - sys.stderr = orig_stderr - - -@contextlib.contextmanager -def colorama_text(*args, **kwargs): - init(*args, **kwargs) - try: - yield - finally: - deinit() - - -def reinit(): - if wrapped_stdout is not None: - sys.stdout = wrapped_stdout - if wrapped_stderr is not None: - sys.stderr = wrapped_stderr - - -def wrap_stream(stream, convert, strip, autoreset, wrap): - if wrap: - wrapper = AnsiToWin32(stream, - convert=convert, strip=strip, autoreset=autoreset) - if wrapper.should_wrap(): - stream = wrapper.stream - return stream diff --git a/env/lib/python3.7/site-packages/pip/_vendor/colorama/win32.py b/env/lib/python3.7/site-packages/pip/_vendor/colorama/win32.py deleted file mode 100644 index c2d8360..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/colorama/win32.py +++ /dev/null @@ -1,152 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. - -# from winbase.h -STDOUT = -11 -STDERR = -12 - -try: - import ctypes - from ctypes import LibraryLoader - windll = LibraryLoader(ctypes.WinDLL) - from ctypes import wintypes -except (AttributeError, ImportError): - windll = None - SetConsoleTextAttribute = lambda *_: None - winapi_test = lambda *_: None -else: - from ctypes import byref, Structure, c_char, POINTER - - COORD = wintypes._COORD - - class CONSOLE_SCREEN_BUFFER_INFO(Structure): - """struct in wincon.h.""" - _fields_ = [ - ("dwSize", COORD), - ("dwCursorPosition", COORD), - ("wAttributes", wintypes.WORD), - ("srWindow", wintypes.SMALL_RECT), - ("dwMaximumWindowSize", COORD), - ] - def __str__(self): - return '(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)' % ( - self.dwSize.Y, self.dwSize.X - , self.dwCursorPosition.Y, self.dwCursorPosition.X - , self.wAttributes - , self.srWindow.Top, self.srWindow.Left, self.srWindow.Bottom, self.srWindow.Right - , self.dwMaximumWindowSize.Y, self.dwMaximumWindowSize.X - ) - - _GetStdHandle = windll.kernel32.GetStdHandle - _GetStdHandle.argtypes = [ - wintypes.DWORD, - ] - _GetStdHandle.restype = wintypes.HANDLE - - _GetConsoleScreenBufferInfo = windll.kernel32.GetConsoleScreenBufferInfo - _GetConsoleScreenBufferInfo.argtypes = [ - wintypes.HANDLE, - POINTER(CONSOLE_SCREEN_BUFFER_INFO), - ] - _GetConsoleScreenBufferInfo.restype = wintypes.BOOL - - _SetConsoleTextAttribute = windll.kernel32.SetConsoleTextAttribute - _SetConsoleTextAttribute.argtypes = [ - wintypes.HANDLE, - wintypes.WORD, - ] - _SetConsoleTextAttribute.restype = wintypes.BOOL - - _SetConsoleCursorPosition = windll.kernel32.SetConsoleCursorPosition - _SetConsoleCursorPosition.argtypes = [ - wintypes.HANDLE, - COORD, - ] - _SetConsoleCursorPosition.restype = wintypes.BOOL - - _FillConsoleOutputCharacterA = windll.kernel32.FillConsoleOutputCharacterA - _FillConsoleOutputCharacterA.argtypes = [ - wintypes.HANDLE, - c_char, - wintypes.DWORD, - COORD, - POINTER(wintypes.DWORD), - ] - _FillConsoleOutputCharacterA.restype = wintypes.BOOL - - _FillConsoleOutputAttribute = windll.kernel32.FillConsoleOutputAttribute - _FillConsoleOutputAttribute.argtypes = [ - wintypes.HANDLE, - wintypes.WORD, - wintypes.DWORD, - COORD, - POINTER(wintypes.DWORD), - ] - _FillConsoleOutputAttribute.restype = wintypes.BOOL - - _SetConsoleTitleW = windll.kernel32.SetConsoleTitleW - _SetConsoleTitleW.argtypes = [ - wintypes.LPCWSTR - ] - _SetConsoleTitleW.restype = wintypes.BOOL - - def _winapi_test(handle): - csbi = CONSOLE_SCREEN_BUFFER_INFO() - success = _GetConsoleScreenBufferInfo( - handle, byref(csbi)) - return bool(success) - - def winapi_test(): - return any(_winapi_test(h) for h in - (_GetStdHandle(STDOUT), _GetStdHandle(STDERR))) - - def GetConsoleScreenBufferInfo(stream_id=STDOUT): - handle = _GetStdHandle(stream_id) - csbi = CONSOLE_SCREEN_BUFFER_INFO() - success = _GetConsoleScreenBufferInfo( - handle, byref(csbi)) - return csbi - - def SetConsoleTextAttribute(stream_id, attrs): - handle = _GetStdHandle(stream_id) - return _SetConsoleTextAttribute(handle, attrs) - - def SetConsoleCursorPosition(stream_id, position, adjust=True): - position = COORD(*position) - # If the position is out of range, do nothing. - if position.Y <= 0 or position.X <= 0: - return - # Adjust for Windows' SetConsoleCursorPosition: - # 1. being 0-based, while ANSI is 1-based. - # 2. expecting (x,y), while ANSI uses (y,x). - adjusted_position = COORD(position.Y - 1, position.X - 1) - if adjust: - # Adjust for viewport's scroll position - sr = GetConsoleScreenBufferInfo(STDOUT).srWindow - adjusted_position.Y += sr.Top - adjusted_position.X += sr.Left - # Resume normal processing - handle = _GetStdHandle(stream_id) - return _SetConsoleCursorPosition(handle, adjusted_position) - - def FillConsoleOutputCharacter(stream_id, char, length, start): - handle = _GetStdHandle(stream_id) - char = c_char(char.encode()) - length = wintypes.DWORD(length) - num_written = wintypes.DWORD(0) - # Note that this is hard-coded for ANSI (vs wide) bytes. - success = _FillConsoleOutputCharacterA( - handle, char, length, start, byref(num_written)) - return num_written.value - - def FillConsoleOutputAttribute(stream_id, attr, length, start): - ''' FillConsoleOutputAttribute( hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten )''' - handle = _GetStdHandle(stream_id) - attribute = wintypes.WORD(attr) - length = wintypes.DWORD(length) - num_written = wintypes.DWORD(0) - # Note that this is hard-coded for ANSI (vs wide) bytes. - return _FillConsoleOutputAttribute( - handle, attribute, length, start, byref(num_written)) - - def SetConsoleTitle(title): - return _SetConsoleTitleW(title) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/colorama/winterm.py b/env/lib/python3.7/site-packages/pip/_vendor/colorama/winterm.py deleted file mode 100644 index 0fdb4ec..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/colorama/winterm.py +++ /dev/null @@ -1,169 +0,0 @@ -# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. -from . import win32 - - -# from wincon.h -class WinColor(object): - BLACK = 0 - BLUE = 1 - GREEN = 2 - CYAN = 3 - RED = 4 - MAGENTA = 5 - YELLOW = 6 - GREY = 7 - -# from wincon.h -class WinStyle(object): - NORMAL = 0x00 # dim text, dim background - BRIGHT = 0x08 # bright text, dim background - BRIGHT_BACKGROUND = 0x80 # dim text, bright background - -class WinTerm(object): - - def __init__(self): - self._default = win32.GetConsoleScreenBufferInfo(win32.STDOUT).wAttributes - self.set_attrs(self._default) - self._default_fore = self._fore - self._default_back = self._back - self._default_style = self._style - # In order to emulate LIGHT_EX in windows, we borrow the BRIGHT style. - # So that LIGHT_EX colors and BRIGHT style do not clobber each other, - # we track them separately, since LIGHT_EX is overwritten by Fore/Back - # and BRIGHT is overwritten by Style codes. - self._light = 0 - - def get_attrs(self): - return self._fore + self._back * 16 + (self._style | self._light) - - def set_attrs(self, value): - self._fore = value & 7 - self._back = (value >> 4) & 7 - self._style = value & (WinStyle.BRIGHT | WinStyle.BRIGHT_BACKGROUND) - - def reset_all(self, on_stderr=None): - self.set_attrs(self._default) - self.set_console(attrs=self._default) - self._light = 0 - - def fore(self, fore=None, light=False, on_stderr=False): - if fore is None: - fore = self._default_fore - self._fore = fore - # Emulate LIGHT_EX with BRIGHT Style - if light: - self._light |= WinStyle.BRIGHT - else: - self._light &= ~WinStyle.BRIGHT - self.set_console(on_stderr=on_stderr) - - def back(self, back=None, light=False, on_stderr=False): - if back is None: - back = self._default_back - self._back = back - # Emulate LIGHT_EX with BRIGHT_BACKGROUND Style - if light: - self._light |= WinStyle.BRIGHT_BACKGROUND - else: - self._light &= ~WinStyle.BRIGHT_BACKGROUND - self.set_console(on_stderr=on_stderr) - - def style(self, style=None, on_stderr=False): - if style is None: - style = self._default_style - self._style = style - self.set_console(on_stderr=on_stderr) - - def set_console(self, attrs=None, on_stderr=False): - if attrs is None: - attrs = self.get_attrs() - handle = win32.STDOUT - if on_stderr: - handle = win32.STDERR - win32.SetConsoleTextAttribute(handle, attrs) - - def get_position(self, handle): - position = win32.GetConsoleScreenBufferInfo(handle).dwCursorPosition - # Because Windows coordinates are 0-based, - # and win32.SetConsoleCursorPosition expects 1-based. - position.X += 1 - position.Y += 1 - return position - - def set_cursor_position(self, position=None, on_stderr=False): - if position is None: - # I'm not currently tracking the position, so there is no default. - # position = self.get_position() - return - handle = win32.STDOUT - if on_stderr: - handle = win32.STDERR - win32.SetConsoleCursorPosition(handle, position) - - def cursor_adjust(self, x, y, on_stderr=False): - handle = win32.STDOUT - if on_stderr: - handle = win32.STDERR - position = self.get_position(handle) - adjusted_position = (position.Y + y, position.X + x) - win32.SetConsoleCursorPosition(handle, adjusted_position, adjust=False) - - def erase_screen(self, mode=0, on_stderr=False): - # 0 should clear from the cursor to the end of the screen. - # 1 should clear from the cursor to the beginning of the screen. - # 2 should clear the entire screen, and move cursor to (1,1) - handle = win32.STDOUT - if on_stderr: - handle = win32.STDERR - csbi = win32.GetConsoleScreenBufferInfo(handle) - # get the number of character cells in the current buffer - cells_in_screen = csbi.dwSize.X * csbi.dwSize.Y - # get number of character cells before current cursor position - cells_before_cursor = csbi.dwSize.X * csbi.dwCursorPosition.Y + csbi.dwCursorPosition.X - if mode == 0: - from_coord = csbi.dwCursorPosition - cells_to_erase = cells_in_screen - cells_before_cursor - elif mode == 1: - from_coord = win32.COORD(0, 0) - cells_to_erase = cells_before_cursor - elif mode == 2: - from_coord = win32.COORD(0, 0) - cells_to_erase = cells_in_screen - else: - # invalid mode - return - # fill the entire screen with blanks - win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord) - # now set the buffer's attributes accordingly - win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord) - if mode == 2: - # put the cursor where needed - win32.SetConsoleCursorPosition(handle, (1, 1)) - - def erase_line(self, mode=0, on_stderr=False): - # 0 should clear from the cursor to the end of the line. - # 1 should clear from the cursor to the beginning of the line. - # 2 should clear the entire line. - handle = win32.STDOUT - if on_stderr: - handle = win32.STDERR - csbi = win32.GetConsoleScreenBufferInfo(handle) - if mode == 0: - from_coord = csbi.dwCursorPosition - cells_to_erase = csbi.dwSize.X - csbi.dwCursorPosition.X - elif mode == 1: - from_coord = win32.COORD(0, csbi.dwCursorPosition.Y) - cells_to_erase = csbi.dwCursorPosition.X - elif mode == 2: - from_coord = win32.COORD(0, csbi.dwCursorPosition.Y) - cells_to_erase = csbi.dwSize.X - else: - # invalid mode - return - # fill the entire screen with blanks - win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord) - # now set the buffer's attributes accordingly - win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord) - - def set_title(self, title): - win32.SetConsoleTitle(title) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/__init__.py b/env/lib/python3.7/site-packages/pip/_vendor/distlib/__init__.py deleted file mode 100644 index a786b4d..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/distlib/__init__.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012-2017 Vinay Sajip. -# Licensed to the Python Software Foundation under a contributor agreement. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -import logging - -__version__ = '0.2.8' - -class DistlibException(Exception): - pass - -try: - from logging import NullHandler -except ImportError: # pragma: no cover - class NullHandler(logging.Handler): - def handle(self, record): pass - def emit(self, record): pass - def createLock(self): self.lock = None - -logger = logging.getLogger(__name__) -logger.addHandler(NullHandler()) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index da58f5907f5201caee66140e97efe48cb0945c61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 998 zcma)4&2H2%5FRJa&t_X#3PODVgp@;fffENn6|e%NY7cM#A|Y#u-EF9oY@HN!D{k$B zwBp1o`O1kiH%`nrZFfN&7;DC3&*%B`JY8Q;0IB-A`C;q<e5b=D#i(o}Hx&vAl4;05 zdKr5G(wF=cBv;;vpZSXcS_2Iw&p3m(P~GLAg8jt2W<U$^p^Ok8DfkrP3;rG|?;R*O zi&T8hvYzUlC5oTGIb#^-4W#i8j0uzD;NI}T@L^7eOJb;OBR6X(6l6?7=DA0n9Xv0Z zRu><~N4c7}MO{r&-^M~z(^3gx6Cui49%|Cpgg7{y>dx{FOo-l``1N?ymh;iPm~RzT z(@wSCk_U_G=>F~=T{;$@RV8aPl3low5JgqALJa2%gKdO9<wr`)+&N{oKRML;<+PGo znLp|w*f!zspjg%;y;I2iuF)Bnfei5+$cUO_=xcI%NJKj|<r#9rQAj`#o49IH&+<m; zT^kye*G4YuG!a5=xaU&ZK>a5&9B-`TIqZ!88_D$0fuVu=I|^52(cUBjecJJ0H3pe- z%AbgKs>jtro+Nw$aaj?zk?T6&Pgxi0>d(4blH90it9B4^3!iqeZm-5#0w!r_d;(F! zOhAG@&8(BSPGafYY1A#(_Zz4*bQLpN?k?@yNY}GjQO#^$;B=S<hYzQ$cQuJ_4jkC_ zUzPLPv}0pxW21|iu)UdTchHA2E-@RDLuG6-mGT1fubgcBsGI30lwmWV#60c|e2)#- JHMSWf>^J%Y&szWh diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-37.pyc deleted file mode 100644 index 59b7825f022de0a6314248eb802e880d2a520b30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32008 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 F{{h=g5=;O9 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-37.pyc deleted file mode 100644 index 33977ec6dd50ef47c3d4265790b6852247ed5fc4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42529 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-37.pyc deleted file mode 100644 index c8c5203590e530f30cad7e5be6bac9b9029e3de8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17294 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 Z9txdcs7r<!kV|ZpP0w1fs1VuK{{ZrTiYx#C diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-37.pyc deleted file mode 100644 index 99b5f86c135e88fd2d95f54a2bff863ea656360e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38680 zcmd75dvqK}dLKI7^Tc5ABnUo5wIEUiC=jG5t#*y2D841i5=2v6OP-~6Fqm!t1Iz=g zZiqm;vFjr$_8!Mt%Nr-QlT8e+*3RbT_-tb5<!qAmCUG3czSllUoX&|~@wxZzjq`Gx zoSe-c$?x}7ch6t|YIk#ea{`>HuI{d`uCDs(dw*4z2L_5M{I%Xc_@?)ZsnoybN&Htp z<|2OXRWp^cQ?}7am3cH9M$;^thQ5|Ar{!LzoRMR;oRwp)oRed|oZl=-u23$#o@yP< zq@2FhqOy$?|K(1xT==e3%X~wh^_TnYw4G^`ngitllt|mz#$a=(Jk%U64>w23BhAtB zXmekAUvsQH*4$s--yAQGHxHB#G!K>!HV>5#H;<H$G>?{#HXkWJ(mYl^CUxW*k2bBc z)qJe{SaYI0A=mPa$D7B?$D1e0C*-`)c%pf-e6l%No@`E)r<$kAr<zZepKMN-r<<qC zr<*h7ndX`D87bS>INN-x{8aN?`J9{=8&5Z%DL>QvQ29ef%E@d$>wNfuQT~XN-~Kkc zAGuk{m7M&_M<1Bw^Kv$T>(AMP<qP&{d&nMs$0$GlLdqVoN8d@=qt4;`>GDOK@3Y5n zKIUA)`DL8%x5sfl?p((C6`UWi590iwoL|NHA^R}S4@>!LI6q<^#raXWe;wzK*vD{w zOwM1x`J=Xlb4$)&#Q9_P1kNYq{07b+w~yoexSYS_yyU!iKjmDvPuNe`C*L*gNqg$u zbotwzZ(n)2{IY!2DSXu{c<xDi8qZBjJLYWTwbazi*9cp4Q%0D-yy-dajaR>B-~!Hv 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 a^8WCp;U|WV4u9N)ghvB=!OWS(^#1_d6P?=t diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-37.pyc deleted file mode 100644 index dd751f243f25dd983740e6f8c054e9890f18a415..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10246 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 DhB}nV diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-37.pyc deleted file mode 100644 index c2a8402df1be2245d626e5a3b3ca87c344cb4643..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4432 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 b2{fo#Hi0UBe3iAi&D~mi-F?+&9PR%D4cY@A diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-37.pyc deleted file mode 100644 index 6538c0635f5fdda4e92cb3305a83d7def604d849..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27642 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-37.pyc deleted file mode 100644 index b789475b81728c8fc1875992e9c1df7796d090e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10842 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-37.pyc deleted file mode 100644 index bedfc41d23f7fd3bfe0a03756199e9255ccd25db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11032 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-37.pyc deleted file mode 100644 index a918a8898e29bfe778736f40e2577a1e03a19d29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47910 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-37.pyc deleted file mode 100644 index 0dc1d39664da45927b4d051fd65159dc7a6be133..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20382 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 T(l_Fa9OX3#X#UKcJz)P|Ok4EZ diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-37.pyc deleted file mode 100644 index 01472237a8244f8c492f579e90c20dc16c39afff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25318 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__init__.py b/env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__init__.py deleted file mode 100644 index f7dbf4c..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -"""Modules copied from Python 3 standard libraries, for internal use only. - -Individual classes and functions are found in d2._backport.misc. Intended -usage is to always import things missing from 3.1 from that module: the -built-in/stdlib objects will be used if found. -""" diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 1a0d50b24121024e3609bab3089316e6733d45d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 440 zcmX|7u};H4483-MDyRz+qt{9_QR#*dLM*5Q2#Ku{I$d&?#&Ed{=SxezhlyY6$|tZf z;WPqEwrro@yJz1{r-@*5A7{^}BO$)};?KAiH|#Xwpv79~(UX{s)d@e`d)-<?Q1}Lo zhBEjX9=lk12TP!+oK``D#XP8hhR&h%0nkMgoU+i80q<;=CdtZa+@fx|TUbTJoD7Dt zbwxz)xC(~BE%(rYzDQ-Rir2=6nAS)|3b0~Ur;ScpQX2zE5IrcnQyl@;{UpQ+-G+bx z#L1v`nJ$JTRw_b$*yoZbO_H~0;~ZT^QS%1i^A}S@f*o25x#`ujm~v2+CJ(dG{#Z)w z3n@QE81u0X;pZ-kb(1yNFc+W1+PQw~-20-e`sTsqmZkfUX{5+sW&g`%Qli5sW!iN6 O$<-k5`iQx|*~KsBiHsQl diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/misc.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/misc.cpython-37.pyc deleted file mode 100644 index 57975de69e791d691030dd216af122be9f3a90c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1037 zcmZ8fOKTKC5bo-k*`1wzkbp0U$RH>#m@M9dXo3ep_F_OCkYTsGcb#NjcK3!%SUs5h zkOV;x{3rf{zIyU6c(S^8gO47nrn<VS`m3*cuiuXduJZG(x8FTNe%Q^`3ek9iqQ0Tx zBq1C)%^?BzrwQdA_jxe)60g}nUn}>EAPIoHBIO;Qh}KagUjVTm@9~g(=a2+%NJ(Fl zCKT<Yjd2e!F2uNx>p0+@yi-I;ggFuS&q>l=XG8)HyGa*wZevalbH1!|x;((R?kbMc zmt@#K9qmonQC&%`;#no*tmN5o#ut-3X8A-Zq2fu&<JqEQI;%>x^AlSnW3$O7?43ww zvMN$lEhG~rWRpCfOmnnmN|dbPVhECA_yM!pE@X~admlwzL$w4Ma;PItKhPyv(whWP zd1C|2K=l>Pq+K`ZEW@e+7t_Vuc;ZCMHl{lDYk#DRdQ@lic2+8l2)6nAraXBxduN?a z(qmEbN{)D@be>H|>2%%lsK^xCsT&7!(?ar55$M4XOt`;phk<qCvVYrv18-l0CQG8> z%n}LXAvIB^9Eg$$*~N3L;#JebKWL@RlD5VcigK*LKlLpDSAQ3ctNL=VL|WXAo>6&! zNiIC?Uj&!r642k`pxaAw28ZDd)SrM`66yGKOPth#>3G^`oFh(GY56cND;?ic!;b9X z6((?p#=|4iT1^c%jWXBgLR;R^)}nAHSvfbIgQgbGq^zXzHJT<&({fUXG_{=B1iSmc zW!u(W6lL!u5P^>}pgt0PFzlOln(~UJsiBpUb`aKs^rOeiirUS`be|XYow~anho&>e zt5#ULtjcrj)xJ^3y|h=F!BeeeHeKjd*k7>R3$o)d;cij!MJ^t<aHnEaJ`EwHkw;+z R2CxxO2=U*e1D{&h@Eh>&_ap!S diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-37.pyc deleted file mode 100644 index b841ddc4e9925b8aa0152dd0cc385c232beeaa9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21353 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 Pnq)rjG-^p+Q1O2Q>9GrF diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-37.pyc deleted file mode 100644 index 35649cdd75eaaa34a2bfc183e9c19e7a00b0de14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15818 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-37.pyc deleted file mode 100644 index 7da0f4b60397024808499c1abf098e251aa204c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62683 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 Tf=~3nwyUgTmC{|oP&WNPM%+Qo diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/misc.py b/env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/misc.py deleted file mode 100644 index cfb318d..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/misc.py +++ /dev/null @@ -1,41 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012 The Python Software Foundation. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -"""Backports for individual classes and functions.""" - -import os -import sys - -__all__ = ['cache_from_source', 'callable', 'fsencode'] - - -try: - from imp import cache_from_source -except ImportError: - def cache_from_source(py_file, debug=__debug__): - ext = debug and 'c' or 'o' - return py_file + ext - - -try: - callable = callable -except NameError: - from collections import Callable - - def callable(obj): - return isinstance(obj, Callable) - - -try: - fsencode = os.fsencode -except AttributeError: - def fsencode(filename): - if isinstance(filename, bytes): - return filename - elif isinstance(filename, str): - return filename.encode(sys.getfilesystemencoding()) - else: - raise TypeError("expect bytes or str, not %s" % - type(filename).__name__) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/shutil.py b/env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/shutil.py deleted file mode 100644 index 159e49e..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/shutil.py +++ /dev/null @@ -1,761 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012 The Python Software Foundation. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -"""Utility functions for copying and archiving files and directory trees. - -XXX The functions here don't copy the resource fork or other metadata on Mac. - -""" - -import os -import sys -import stat -from os.path import abspath -import fnmatch -import collections -import errno -from . import tarfile - -try: - import bz2 - _BZ2_SUPPORTED = True -except ImportError: - _BZ2_SUPPORTED = False - -try: - from pwd import getpwnam -except ImportError: - getpwnam = None - -try: - from grp import getgrnam -except ImportError: - getgrnam = None - -__all__ = ["copyfileobj", "copyfile", "copymode", "copystat", "copy", "copy2", - "copytree", "move", "rmtree", "Error", "SpecialFileError", - "ExecError", "make_archive", "get_archive_formats", - "register_archive_format", "unregister_archive_format", - "get_unpack_formats", "register_unpack_format", - "unregister_unpack_format", "unpack_archive", "ignore_patterns"] - -class Error(EnvironmentError): - pass - -class SpecialFileError(EnvironmentError): - """Raised when trying to do a kind of operation (e.g. copying) which is - not supported on a special file (e.g. a named pipe)""" - -class ExecError(EnvironmentError): - """Raised when a command could not be executed""" - -class ReadError(EnvironmentError): - """Raised when an archive cannot be read""" - -class RegistryError(Exception): - """Raised when a registry operation with the archiving - and unpacking registries fails""" - - -try: - WindowsError -except NameError: - WindowsError = None - -def copyfileobj(fsrc, fdst, length=16*1024): - """copy data from file-like object fsrc to file-like object fdst""" - while 1: - buf = fsrc.read(length) - if not buf: - break - fdst.write(buf) - -def _samefile(src, dst): - # Macintosh, Unix. - if hasattr(os.path, 'samefile'): - try: - return os.path.samefile(src, dst) - except OSError: - return False - - # All other platforms: check for same pathname. - return (os.path.normcase(os.path.abspath(src)) == - os.path.normcase(os.path.abspath(dst))) - -def copyfile(src, dst): - """Copy data from src to dst""" - if _samefile(src, dst): - raise Error("`%s` and `%s` are the same file" % (src, dst)) - - for fn in [src, dst]: - try: - st = os.stat(fn) - except OSError: - # File most likely does not exist - pass - else: - # XXX What about other special files? (sockets, devices...) - if stat.S_ISFIFO(st.st_mode): - raise SpecialFileError("`%s` is a named pipe" % fn) - - with open(src, 'rb') as fsrc: - with open(dst, 'wb') as fdst: - copyfileobj(fsrc, fdst) - -def copymode(src, dst): - """Copy mode bits from src to dst""" - if hasattr(os, 'chmod'): - st = os.stat(src) - mode = stat.S_IMODE(st.st_mode) - os.chmod(dst, mode) - -def copystat(src, dst): - """Copy all stat info (mode bits, atime, mtime, flags) from src to dst""" - st = os.stat(src) - mode = stat.S_IMODE(st.st_mode) - if hasattr(os, 'utime'): - os.utime(dst, (st.st_atime, st.st_mtime)) - if hasattr(os, 'chmod'): - os.chmod(dst, mode) - if hasattr(os, 'chflags') and hasattr(st, 'st_flags'): - try: - os.chflags(dst, st.st_flags) - except OSError as why: - if (not hasattr(errno, 'EOPNOTSUPP') or - why.errno != errno.EOPNOTSUPP): - raise - -def copy(src, dst): - """Copy data and mode bits ("cp src dst"). - - The destination may be a directory. - - """ - if os.path.isdir(dst): - dst = os.path.join(dst, os.path.basename(src)) - copyfile(src, dst) - copymode(src, dst) - -def copy2(src, dst): - """Copy data and all stat info ("cp -p src dst"). - - The destination may be a directory. - - """ - if os.path.isdir(dst): - dst = os.path.join(dst, os.path.basename(src)) - copyfile(src, dst) - copystat(src, dst) - -def ignore_patterns(*patterns): - """Function that can be used as copytree() ignore parameter. - - Patterns is a sequence of glob-style patterns - that are used to exclude files""" - def _ignore_patterns(path, names): - ignored_names = [] - for pattern in patterns: - ignored_names.extend(fnmatch.filter(names, pattern)) - return set(ignored_names) - return _ignore_patterns - -def copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, - ignore_dangling_symlinks=False): - """Recursively copy a directory tree. - - The destination directory must not already exist. - If exception(s) occur, an Error is raised with a list of reasons. - - If the optional symlinks flag is true, symbolic links in the - source tree result in symbolic links in the destination tree; if - it is false, the contents of the files pointed to by symbolic - links are copied. If the file pointed by the symlink doesn't - exist, an exception will be added in the list of errors raised in - an Error exception at the end of the copy process. - - You can set the optional ignore_dangling_symlinks flag to true if you - want to silence this exception. Notice that this has no effect on - platforms that don't support os.symlink. - - The optional ignore argument is a callable. If given, it - is called with the `src` parameter, which is the directory - being visited by copytree(), and `names` which is the list of - `src` contents, as returned by os.listdir(): - - callable(src, names) -> ignored_names - - Since copytree() is called recursively, the callable will be - called once for each directory that is copied. It returns a - list of names relative to the `src` directory that should - not be copied. - - The optional copy_function argument is a callable that will be used - to copy each file. It will be called with the source path and the - destination path as arguments. By default, copy2() is used, but any - function that supports the same signature (like copy()) can be used. - - """ - names = os.listdir(src) - if ignore is not None: - ignored_names = ignore(src, names) - else: - ignored_names = set() - - os.makedirs(dst) - errors = [] - for name in names: - if name in ignored_names: - continue - srcname = os.path.join(src, name) - dstname = os.path.join(dst, name) - try: - if os.path.islink(srcname): - linkto = os.readlink(srcname) - if symlinks: - os.symlink(linkto, dstname) - else: - # ignore dangling symlink if the flag is on - if not os.path.exists(linkto) and ignore_dangling_symlinks: - continue - # otherwise let the copy occurs. copy2 will raise an error - copy_function(srcname, dstname) - elif os.path.isdir(srcname): - copytree(srcname, dstname, symlinks, ignore, copy_function) - else: - # Will raise a SpecialFileError for unsupported file types - copy_function(srcname, dstname) - # catch the Error from the recursive copytree so that we can - # continue with other files - except Error as err: - errors.extend(err.args[0]) - except EnvironmentError as why: - errors.append((srcname, dstname, str(why))) - try: - copystat(src, dst) - except OSError as why: - if WindowsError is not None and isinstance(why, WindowsError): - # Copying file access times may fail on Windows - pass - else: - errors.extend((src, dst, str(why))) - if errors: - raise Error(errors) - -def rmtree(path, ignore_errors=False, onerror=None): - """Recursively delete a directory tree. - - If ignore_errors is set, errors are ignored; otherwise, if onerror - is set, it is called to handle the error with arguments (func, - path, exc_info) where func is os.listdir, os.remove, or os.rmdir; - path is the argument to that function that caused it to fail; and - exc_info is a tuple returned by sys.exc_info(). If ignore_errors - is false and onerror is None, an exception is raised. - - """ - if ignore_errors: - def onerror(*args): - pass - elif onerror is None: - def onerror(*args): - raise - try: - if os.path.islink(path): - # symlinks to directories are forbidden, see bug #1669 - raise OSError("Cannot call rmtree on a symbolic link") - except OSError: - onerror(os.path.islink, path, sys.exc_info()) - # can't continue even if onerror hook returns - return - names = [] - try: - names = os.listdir(path) - except os.error: - onerror(os.listdir, path, sys.exc_info()) - for name in names: - fullname = os.path.join(path, name) - try: - mode = os.lstat(fullname).st_mode - except os.error: - mode = 0 - if stat.S_ISDIR(mode): - rmtree(fullname, ignore_errors, onerror) - else: - try: - os.remove(fullname) - except os.error: - onerror(os.remove, fullname, sys.exc_info()) - try: - os.rmdir(path) - except os.error: - onerror(os.rmdir, path, sys.exc_info()) - - -def _basename(path): - # A basename() variant which first strips the trailing slash, if present. - # Thus we always get the last component of the path, even for directories. - return os.path.basename(path.rstrip(os.path.sep)) - -def move(src, dst): - """Recursively move a file or directory to another location. This is - similar to the Unix "mv" command. - - If the destination is a directory or a symlink to a directory, the source - is moved inside the directory. The destination path must not already - exist. - - If the destination already exists but is not a directory, it may be - overwritten depending on os.rename() semantics. - - If the destination is on our current filesystem, then rename() is used. - Otherwise, src is copied to the destination and then removed. - A lot more could be done here... A look at a mv.c shows a lot of - the issues this implementation glosses over. - - """ - real_dst = dst - if os.path.isdir(dst): - if _samefile(src, dst): - # We might be on a case insensitive filesystem, - # perform the rename anyway. - os.rename(src, dst) - return - - real_dst = os.path.join(dst, _basename(src)) - if os.path.exists(real_dst): - raise Error("Destination path '%s' already exists" % real_dst) - try: - os.rename(src, real_dst) - except OSError: - if os.path.isdir(src): - if _destinsrc(src, dst): - raise Error("Cannot move a directory '%s' into itself '%s'." % (src, dst)) - copytree(src, real_dst, symlinks=True) - rmtree(src) - else: - copy2(src, real_dst) - os.unlink(src) - -def _destinsrc(src, dst): - src = abspath(src) - dst = abspath(dst) - if not src.endswith(os.path.sep): - src += os.path.sep - if not dst.endswith(os.path.sep): - dst += os.path.sep - return dst.startswith(src) - -def _get_gid(name): - """Returns a gid, given a group name.""" - if getgrnam is None or name is None: - return None - try: - result = getgrnam(name) - except KeyError: - result = None - if result is not None: - return result[2] - return None - -def _get_uid(name): - """Returns an uid, given a user name.""" - if getpwnam is None or name is None: - return None - try: - result = getpwnam(name) - except KeyError: - result = None - if result is not None: - return result[2] - return None - -def _make_tarball(base_name, base_dir, compress="gzip", verbose=0, dry_run=0, - owner=None, group=None, logger=None): - """Create a (possibly compressed) tar file from all the files under - 'base_dir'. - - 'compress' must be "gzip" (the default), "bzip2", or None. - - 'owner' and 'group' can be used to define an owner and a group for the - archive that is being built. If not provided, the current owner and group - will be used. - - The output tar file will be named 'base_name' + ".tar", possibly plus - the appropriate compression extension (".gz", or ".bz2"). - - Returns the output filename. - """ - tar_compression = {'gzip': 'gz', None: ''} - compress_ext = {'gzip': '.gz'} - - if _BZ2_SUPPORTED: - tar_compression['bzip2'] = 'bz2' - compress_ext['bzip2'] = '.bz2' - - # flags for compression program, each element of list will be an argument - if compress is not None and compress not in compress_ext: - raise ValueError("bad value for 'compress', or compression format not " - "supported : {0}".format(compress)) - - archive_name = base_name + '.tar' + compress_ext.get(compress, '') - archive_dir = os.path.dirname(archive_name) - - if not os.path.exists(archive_dir): - if logger is not None: - logger.info("creating %s", archive_dir) - if not dry_run: - os.makedirs(archive_dir) - - # creating the tarball - if logger is not None: - logger.info('Creating tar archive') - - uid = _get_uid(owner) - gid = _get_gid(group) - - def _set_uid_gid(tarinfo): - if gid is not None: - tarinfo.gid = gid - tarinfo.gname = group - if uid is not None: - tarinfo.uid = uid - tarinfo.uname = owner - return tarinfo - - if not dry_run: - tar = tarfile.open(archive_name, 'w|%s' % tar_compression[compress]) - try: - tar.add(base_dir, filter=_set_uid_gid) - finally: - tar.close() - - return archive_name - -def _call_external_zip(base_dir, zip_filename, verbose=False, dry_run=False): - # XXX see if we want to keep an external call here - if verbose: - zipoptions = "-r" - else: - zipoptions = "-rq" - from distutils.errors import DistutilsExecError - from distutils.spawn import spawn - try: - spawn(["zip", zipoptions, zip_filename, base_dir], dry_run=dry_run) - except DistutilsExecError: - # XXX really should distinguish between "couldn't find - # external 'zip' command" and "zip failed". - raise ExecError("unable to create zip file '%s': " - "could neither import the 'zipfile' module nor " - "find a standalone zip utility") % zip_filename - -def _make_zipfile(base_name, base_dir, verbose=0, dry_run=0, logger=None): - """Create a zip file from all the files under 'base_dir'. - - The output zip file will be named 'base_name' + ".zip". Uses either the - "zipfile" Python module (if available) or the InfoZIP "zip" utility - (if installed and found on the default search path). If neither tool is - available, raises ExecError. Returns the name of the output zip - file. - """ - zip_filename = base_name + ".zip" - archive_dir = os.path.dirname(base_name) - - if not os.path.exists(archive_dir): - if logger is not None: - logger.info("creating %s", archive_dir) - if not dry_run: - os.makedirs(archive_dir) - - # If zipfile module is not available, try spawning an external 'zip' - # command. - try: - import zipfile - except ImportError: - zipfile = None - - if zipfile is None: - _call_external_zip(base_dir, zip_filename, verbose, dry_run) - else: - if logger is not None: - logger.info("creating '%s' and adding '%s' to it", - zip_filename, base_dir) - - if not dry_run: - zip = zipfile.ZipFile(zip_filename, "w", - compression=zipfile.ZIP_DEFLATED) - - for dirpath, dirnames, filenames in os.walk(base_dir): - for name in filenames: - path = os.path.normpath(os.path.join(dirpath, name)) - if os.path.isfile(path): - zip.write(path, path) - if logger is not None: - logger.info("adding '%s'", path) - zip.close() - - return zip_filename - -_ARCHIVE_FORMATS = { - 'gztar': (_make_tarball, [('compress', 'gzip')], "gzip'ed tar-file"), - 'bztar': (_make_tarball, [('compress', 'bzip2')], "bzip2'ed tar-file"), - 'tar': (_make_tarball, [('compress', None)], "uncompressed tar file"), - 'zip': (_make_zipfile, [], "ZIP file"), - } - -if _BZ2_SUPPORTED: - _ARCHIVE_FORMATS['bztar'] = (_make_tarball, [('compress', 'bzip2')], - "bzip2'ed tar-file") - -def get_archive_formats(): - """Returns a list of supported formats for archiving and unarchiving. - - Each element of the returned sequence is a tuple (name, description) - """ - formats = [(name, registry[2]) for name, registry in - _ARCHIVE_FORMATS.items()] - formats.sort() - return formats - -def register_archive_format(name, function, extra_args=None, description=''): - """Registers an archive format. - - name is the name of the format. function is the callable that will be - used to create archives. If provided, extra_args is a sequence of - (name, value) tuples that will be passed as arguments to the callable. - description can be provided to describe the format, and will be returned - by the get_archive_formats() function. - """ - if extra_args is None: - extra_args = [] - if not isinstance(function, collections.Callable): - raise TypeError('The %s object is not callable' % function) - if not isinstance(extra_args, (tuple, list)): - raise TypeError('extra_args needs to be a sequence') - for element in extra_args: - if not isinstance(element, (tuple, list)) or len(element) !=2: - raise TypeError('extra_args elements are : (arg_name, value)') - - _ARCHIVE_FORMATS[name] = (function, extra_args, description) - -def unregister_archive_format(name): - del _ARCHIVE_FORMATS[name] - -def make_archive(base_name, format, root_dir=None, base_dir=None, verbose=0, - dry_run=0, owner=None, group=None, logger=None): - """Create an archive file (eg. zip or tar). - - 'base_name' is the name of the file to create, minus any format-specific - extension; 'format' is the archive format: one of "zip", "tar", "bztar" - or "gztar". - - 'root_dir' is a directory that will be the root directory of the - archive; ie. we typically chdir into 'root_dir' before creating the - archive. 'base_dir' is the directory where we start archiving from; - ie. 'base_dir' will be the common prefix of all files and - directories in the archive. 'root_dir' and 'base_dir' both default - to the current directory. Returns the name of the archive file. - - 'owner' and 'group' are used when creating a tar archive. By default, - uses the current owner and group. - """ - save_cwd = os.getcwd() - if root_dir is not None: - if logger is not None: - logger.debug("changing into '%s'", root_dir) - base_name = os.path.abspath(base_name) - if not dry_run: - os.chdir(root_dir) - - if base_dir is None: - base_dir = os.curdir - - kwargs = {'dry_run': dry_run, 'logger': logger} - - try: - format_info = _ARCHIVE_FORMATS[format] - except KeyError: - raise ValueError("unknown archive format '%s'" % format) - - func = format_info[0] - for arg, val in format_info[1]: - kwargs[arg] = val - - if format != 'zip': - kwargs['owner'] = owner - kwargs['group'] = group - - try: - filename = func(base_name, base_dir, **kwargs) - finally: - if root_dir is not None: - if logger is not None: - logger.debug("changing back to '%s'", save_cwd) - os.chdir(save_cwd) - - return filename - - -def get_unpack_formats(): - """Returns a list of supported formats for unpacking. - - Each element of the returned sequence is a tuple - (name, extensions, description) - """ - formats = [(name, info[0], info[3]) for name, info in - _UNPACK_FORMATS.items()] - formats.sort() - return formats - -def _check_unpack_options(extensions, function, extra_args): - """Checks what gets registered as an unpacker.""" - # first make sure no other unpacker is registered for this extension - existing_extensions = {} - for name, info in _UNPACK_FORMATS.items(): - for ext in info[0]: - existing_extensions[ext] = name - - for extension in extensions: - if extension in existing_extensions: - msg = '%s is already registered for "%s"' - raise RegistryError(msg % (extension, - existing_extensions[extension])) - - if not isinstance(function, collections.Callable): - raise TypeError('The registered function must be a callable') - - -def register_unpack_format(name, extensions, function, extra_args=None, - description=''): - """Registers an unpack format. - - `name` is the name of the format. `extensions` is a list of extensions - corresponding to the format. - - `function` is the callable that will be - used to unpack archives. The callable will receive archives to unpack. - If it's unable to handle an archive, it needs to raise a ReadError - exception. - - If provided, `extra_args` is a sequence of - (name, value) tuples that will be passed as arguments to the callable. - description can be provided to describe the format, and will be returned - by the get_unpack_formats() function. - """ - if extra_args is None: - extra_args = [] - _check_unpack_options(extensions, function, extra_args) - _UNPACK_FORMATS[name] = extensions, function, extra_args, description - -def unregister_unpack_format(name): - """Removes the pack format from the registry.""" - del _UNPACK_FORMATS[name] - -def _ensure_directory(path): - """Ensure that the parent directory of `path` exists""" - dirname = os.path.dirname(path) - if not os.path.isdir(dirname): - os.makedirs(dirname) - -def _unpack_zipfile(filename, extract_dir): - """Unpack zip `filename` to `extract_dir` - """ - try: - import zipfile - except ImportError: - raise ReadError('zlib not supported, cannot unpack this archive.') - - if not zipfile.is_zipfile(filename): - raise ReadError("%s is not a zip file" % filename) - - zip = zipfile.ZipFile(filename) - try: - for info in zip.infolist(): - name = info.filename - - # don't extract absolute paths or ones with .. in them - if name.startswith('/') or '..' in name: - continue - - target = os.path.join(extract_dir, *name.split('/')) - if not target: - continue - - _ensure_directory(target) - if not name.endswith('/'): - # file - data = zip.read(info.filename) - f = open(target, 'wb') - try: - f.write(data) - finally: - f.close() - del data - finally: - zip.close() - -def _unpack_tarfile(filename, extract_dir): - """Unpack tar/tar.gz/tar.bz2 `filename` to `extract_dir` - """ - try: - tarobj = tarfile.open(filename) - except tarfile.TarError: - raise ReadError( - "%s is not a compressed or uncompressed tar file" % filename) - try: - tarobj.extractall(extract_dir) - finally: - tarobj.close() - -_UNPACK_FORMATS = { - 'gztar': (['.tar.gz', '.tgz'], _unpack_tarfile, [], "gzip'ed tar-file"), - 'tar': (['.tar'], _unpack_tarfile, [], "uncompressed tar file"), - 'zip': (['.zip'], _unpack_zipfile, [], "ZIP file") - } - -if _BZ2_SUPPORTED: - _UNPACK_FORMATS['bztar'] = (['.bz2'], _unpack_tarfile, [], - "bzip2'ed tar-file") - -def _find_unpack_format(filename): - for name, info in _UNPACK_FORMATS.items(): - for extension in info[0]: - if filename.endswith(extension): - return name - return None - -def unpack_archive(filename, extract_dir=None, format=None): - """Unpack an archive. - - `filename` is the name of the archive. - - `extract_dir` is the name of the target directory, where the archive - is unpacked. If not provided, the current working directory is used. - - `format` is the archive format: one of "zip", "tar", or "gztar". Or any - other registered format. If not provided, unpack_archive will use the - filename extension and see if an unpacker was registered for that - extension. - - In case none is found, a ValueError is raised. - """ - if extract_dir is None: - extract_dir = os.getcwd() - - if format is not None: - try: - format_info = _UNPACK_FORMATS[format] - except KeyError: - raise ValueError("Unknown unpack format '{0}'".format(format)) - - func = format_info[1] - func(filename, extract_dir, **dict(format_info[2])) - else: - # we need to look at the registered unpackers supported extensions - format = _find_unpack_format(filename) - if format is None: - raise ReadError("Unknown archive format '{0}'".format(filename)) - - func = _UNPACK_FORMATS[format][1] - kwargs = dict(_UNPACK_FORMATS[format][2]) - func(filename, extract_dir, **kwargs) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg b/env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg deleted file mode 100644 index 1746bd0..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg +++ /dev/null @@ -1,84 +0,0 @@ -[posix_prefix] -# Configuration directories. Some of these come straight out of the -# configure script. They are for implementing the other variables, not to -# be used directly in [resource_locations]. -confdir = /etc -datadir = /usr/share -libdir = /usr/lib -statedir = /var -# User resource directory -local = ~/.local/{distribution.name} - -stdlib = {base}/lib/python{py_version_short} -platstdlib = {platbase}/lib/python{py_version_short} -purelib = {base}/lib/python{py_version_short}/site-packages -platlib = {platbase}/lib/python{py_version_short}/site-packages -include = {base}/include/python{py_version_short}{abiflags} -platinclude = {platbase}/include/python{py_version_short}{abiflags} -data = {base} - -[posix_home] -stdlib = {base}/lib/python -platstdlib = {base}/lib/python -purelib = {base}/lib/python -platlib = {base}/lib/python -include = {base}/include/python -platinclude = {base}/include/python -scripts = {base}/bin -data = {base} - -[nt] -stdlib = {base}/Lib -platstdlib = {base}/Lib -purelib = {base}/Lib/site-packages -platlib = {base}/Lib/site-packages -include = {base}/Include -platinclude = {base}/Include -scripts = {base}/Scripts -data = {base} - -[os2] -stdlib = {base}/Lib -platstdlib = {base}/Lib -purelib = {base}/Lib/site-packages -platlib = {base}/Lib/site-packages -include = {base}/Include -platinclude = {base}/Include -scripts = {base}/Scripts -data = {base} - -[os2_home] -stdlib = {userbase}/lib/python{py_version_short} -platstdlib = {userbase}/lib/python{py_version_short} -purelib = {userbase}/lib/python{py_version_short}/site-packages -platlib = {userbase}/lib/python{py_version_short}/site-packages -include = {userbase}/include/python{py_version_short} -scripts = {userbase}/bin -data = {userbase} - -[nt_user] -stdlib = {userbase}/Python{py_version_nodot} -platstdlib = {userbase}/Python{py_version_nodot} -purelib = {userbase}/Python{py_version_nodot}/site-packages -platlib = {userbase}/Python{py_version_nodot}/site-packages -include = {userbase}/Python{py_version_nodot}/Include -scripts = {userbase}/Scripts -data = {userbase} - -[posix_user] -stdlib = {userbase}/lib/python{py_version_short} -platstdlib = {userbase}/lib/python{py_version_short} -purelib = {userbase}/lib/python{py_version_short}/site-packages -platlib = {userbase}/lib/python{py_version_short}/site-packages -include = {userbase}/include/python{py_version_short} -scripts = {userbase}/bin -data = {userbase} - -[osx_framework_user] -stdlib = {userbase}/lib/python -platstdlib = {userbase}/lib/python -purelib = {userbase}/lib/python/site-packages -platlib = {userbase}/lib/python/site-packages -include = {userbase}/include -scripts = {userbase}/bin -data = {userbase} diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.py b/env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.py deleted file mode 100644 index 1df3aba..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.py +++ /dev/null @@ -1,788 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012 The Python Software Foundation. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -"""Access to Python's configuration information.""" - -import codecs -import os -import re -import sys -from os.path import pardir, realpath -try: - import configparser -except ImportError: - import ConfigParser as configparser - - -__all__ = [ - 'get_config_h_filename', - 'get_config_var', - 'get_config_vars', - 'get_makefile_filename', - 'get_path', - 'get_path_names', - 'get_paths', - 'get_platform', - 'get_python_version', - 'get_scheme_names', - 'parse_config_h', -] - - -def _safe_realpath(path): - try: - return realpath(path) - except OSError: - return path - - -if sys.executable: - _PROJECT_BASE = os.path.dirname(_safe_realpath(sys.executable)) -else: - # sys.executable can be empty if argv[0] has been changed and Python is - # unable to retrieve the real program name - _PROJECT_BASE = _safe_realpath(os.getcwd()) - -if os.name == "nt" and "pcbuild" in _PROJECT_BASE[-8:].lower(): - _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir)) -# PC/VS7.1 -if os.name == "nt" and "\\pc\\v" in _PROJECT_BASE[-10:].lower(): - _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir, pardir)) -# PC/AMD64 -if os.name == "nt" and "\\pcbuild\\amd64" in _PROJECT_BASE[-14:].lower(): - _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir, pardir)) - - -def is_python_build(): - for fn in ("Setup.dist", "Setup.local"): - if os.path.isfile(os.path.join(_PROJECT_BASE, "Modules", fn)): - return True - return False - -_PYTHON_BUILD = is_python_build() - -_cfg_read = False - -def _ensure_cfg_read(): - global _cfg_read - if not _cfg_read: - from ..resources import finder - backport_package = __name__.rsplit('.', 1)[0] - _finder = finder(backport_package) - _cfgfile = _finder.find('sysconfig.cfg') - assert _cfgfile, 'sysconfig.cfg exists' - with _cfgfile.as_stream() as s: - _SCHEMES.readfp(s) - if _PYTHON_BUILD: - for scheme in ('posix_prefix', 'posix_home'): - _SCHEMES.set(scheme, 'include', '{srcdir}/Include') - _SCHEMES.set(scheme, 'platinclude', '{projectbase}/.') - - _cfg_read = True - - -_SCHEMES = configparser.RawConfigParser() -_VAR_REPL = re.compile(r'\{([^{]*?)\}') - -def _expand_globals(config): - _ensure_cfg_read() - if config.has_section('globals'): - globals = config.items('globals') - else: - globals = tuple() - - sections = config.sections() - for section in sections: - if section == 'globals': - continue - for option, value in globals: - if config.has_option(section, option): - continue - config.set(section, option, value) - config.remove_section('globals') - - # now expanding local variables defined in the cfg file - # - for section in config.sections(): - variables = dict(config.items(section)) - - def _replacer(matchobj): - name = matchobj.group(1) - if name in variables: - return variables[name] - return matchobj.group(0) - - for option, value in config.items(section): - config.set(section, option, _VAR_REPL.sub(_replacer, value)) - -#_expand_globals(_SCHEMES) - - # FIXME don't rely on sys.version here, its format is an implementation detail - # of CPython, use sys.version_info or sys.hexversion -_PY_VERSION = sys.version.split()[0] -_PY_VERSION_SHORT = sys.version[:3] -_PY_VERSION_SHORT_NO_DOT = _PY_VERSION[0] + _PY_VERSION[2] -_PREFIX = os.path.normpath(sys.prefix) -_EXEC_PREFIX = os.path.normpath(sys.exec_prefix) -_CONFIG_VARS = None -_USER_BASE = None - - -def _subst_vars(path, local_vars): - """In the string `path`, replace tokens like {some.thing} with the - corresponding value from the map `local_vars`. - - If there is no corresponding value, leave the token unchanged. - """ - def _replacer(matchobj): - name = matchobj.group(1) - if name in local_vars: - return local_vars[name] - elif name in os.environ: - return os.environ[name] - return matchobj.group(0) - return _VAR_REPL.sub(_replacer, path) - - -def _extend_dict(target_dict, other_dict): - target_keys = target_dict.keys() - for key, value in other_dict.items(): - if key in target_keys: - continue - target_dict[key] = value - - -def _expand_vars(scheme, vars): - res = {} - if vars is None: - vars = {} - _extend_dict(vars, get_config_vars()) - - for key, value in _SCHEMES.items(scheme): - if os.name in ('posix', 'nt'): - value = os.path.expanduser(value) - res[key] = os.path.normpath(_subst_vars(value, vars)) - return res - - -def format_value(value, vars): - def _replacer(matchobj): - name = matchobj.group(1) - if name in vars: - return vars[name] - return matchobj.group(0) - return _VAR_REPL.sub(_replacer, value) - - -def _get_default_scheme(): - if os.name == 'posix': - # the default scheme for posix is posix_prefix - return 'posix_prefix' - return os.name - - -def _getuserbase(): - env_base = os.environ.get("PYTHONUSERBASE", None) - - def joinuser(*args): - return os.path.expanduser(os.path.join(*args)) - - # what about 'os2emx', 'riscos' ? - if os.name == "nt": - base = os.environ.get("APPDATA") or "~" - if env_base: - return env_base - else: - return joinuser(base, "Python") - - if sys.platform == "darwin": - framework = get_config_var("PYTHONFRAMEWORK") - if framework: - if env_base: - return env_base - else: - return joinuser("~", "Library", framework, "%d.%d" % - sys.version_info[:2]) - - if env_base: - return env_base - else: - return joinuser("~", ".local") - - -def _parse_makefile(filename, vars=None): - """Parse a Makefile-style file. - - A dictionary containing name/value pairs is returned. If an - optional dictionary is passed in as the second argument, it is - used instead of a new dictionary. - """ - # Regexes needed for parsing Makefile (and similar syntaxes, - # like old-style Setup files). - _variable_rx = re.compile(r"([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*(.*)") - _findvar1_rx = re.compile(r"\$\(([A-Za-z][A-Za-z0-9_]*)\)") - _findvar2_rx = re.compile(r"\${([A-Za-z][A-Za-z0-9_]*)}") - - if vars is None: - vars = {} - done = {} - notdone = {} - - with codecs.open(filename, encoding='utf-8', errors="surrogateescape") as f: - lines = f.readlines() - - for line in lines: - if line.startswith('#') or line.strip() == '': - continue - m = _variable_rx.match(line) - if m: - n, v = m.group(1, 2) - v = v.strip() - # `$$' is a literal `$' in make - tmpv = v.replace('$$', '') - - if "$" in tmpv: - notdone[n] = v - else: - try: - v = int(v) - except ValueError: - # insert literal `$' - done[n] = v.replace('$$', '$') - else: - done[n] = v - - # do variable interpolation here - variables = list(notdone.keys()) - - # Variables with a 'PY_' prefix in the makefile. These need to - # be made available without that prefix through sysconfig. - # Special care is needed to ensure that variable expansion works, even - # if the expansion uses the name without a prefix. - renamed_variables = ('CFLAGS', 'LDFLAGS', 'CPPFLAGS') - - while len(variables) > 0: - for name in tuple(variables): - value = notdone[name] - m = _findvar1_rx.search(value) or _findvar2_rx.search(value) - if m is not None: - n = m.group(1) - found = True - if n in done: - item = str(done[n]) - elif n in notdone: - # get it on a subsequent round - found = False - elif n in os.environ: - # do it like make: fall back to environment - item = os.environ[n] - - elif n in renamed_variables: - if (name.startswith('PY_') and - name[3:] in renamed_variables): - item = "" - - elif 'PY_' + n in notdone: - found = False - - else: - item = str(done['PY_' + n]) - - else: - done[n] = item = "" - - if found: - after = value[m.end():] - value = value[:m.start()] + item + after - if "$" in after: - notdone[name] = value - else: - try: - value = int(value) - except ValueError: - done[name] = value.strip() - else: - done[name] = value - variables.remove(name) - - if (name.startswith('PY_') and - name[3:] in renamed_variables): - - name = name[3:] - if name not in done: - done[name] = value - - else: - # bogus variable reference (e.g. "prefix=$/opt/python"); - # just drop it since we can't deal - done[name] = value - variables.remove(name) - - # strip spurious spaces - for k, v in done.items(): - if isinstance(v, str): - done[k] = v.strip() - - # save the results in the global dictionary - vars.update(done) - return vars - - -def get_makefile_filename(): - """Return the path of the Makefile.""" - if _PYTHON_BUILD: - return os.path.join(_PROJECT_BASE, "Makefile") - if hasattr(sys, 'abiflags'): - config_dir_name = 'config-%s%s' % (_PY_VERSION_SHORT, sys.abiflags) - else: - config_dir_name = 'config' - return os.path.join(get_path('stdlib'), config_dir_name, 'Makefile') - - -def _init_posix(vars): - """Initialize the module as appropriate for POSIX systems.""" - # load the installed Makefile: - makefile = get_makefile_filename() - try: - _parse_makefile(makefile, vars) - except IOError as e: - msg = "invalid Python installation: unable to open %s" % makefile - if hasattr(e, "strerror"): - msg = msg + " (%s)" % e.strerror - raise IOError(msg) - # load the installed pyconfig.h: - config_h = get_config_h_filename() - try: - with open(config_h) as f: - parse_config_h(f, vars) - except IOError as e: - msg = "invalid Python installation: unable to open %s" % config_h - if hasattr(e, "strerror"): - msg = msg + " (%s)" % e.strerror - raise IOError(msg) - # On AIX, there are wrong paths to the linker scripts in the Makefile - # -- these paths are relative to the Python source, but when installed - # the scripts are in another directory. - if _PYTHON_BUILD: - vars['LDSHARED'] = vars['BLDSHARED'] - - -def _init_non_posix(vars): - """Initialize the module as appropriate for NT""" - # set basic install directories - vars['LIBDEST'] = get_path('stdlib') - vars['BINLIBDEST'] = get_path('platstdlib') - vars['INCLUDEPY'] = get_path('include') - vars['SO'] = '.pyd' - vars['EXE'] = '.exe' - vars['VERSION'] = _PY_VERSION_SHORT_NO_DOT - vars['BINDIR'] = os.path.dirname(_safe_realpath(sys.executable)) - -# -# public APIs -# - - -def parse_config_h(fp, vars=None): - """Parse a config.h-style file. - - A dictionary containing name/value pairs is returned. If an - optional dictionary is passed in as the second argument, it is - used instead of a new dictionary. - """ - if vars is None: - vars = {} - define_rx = re.compile("#define ([A-Z][A-Za-z0-9_]+) (.*)\n") - undef_rx = re.compile("/[*] #undef ([A-Z][A-Za-z0-9_]+) [*]/\n") - - while True: - line = fp.readline() - if not line: - break - m = define_rx.match(line) - if m: - n, v = m.group(1, 2) - try: - v = int(v) - except ValueError: - pass - vars[n] = v - else: - m = undef_rx.match(line) - if m: - vars[m.group(1)] = 0 - return vars - - -def get_config_h_filename(): - """Return the path of pyconfig.h.""" - if _PYTHON_BUILD: - if os.name == "nt": - inc_dir = os.path.join(_PROJECT_BASE, "PC") - else: - inc_dir = _PROJECT_BASE - else: - inc_dir = get_path('platinclude') - return os.path.join(inc_dir, 'pyconfig.h') - - -def get_scheme_names(): - """Return a tuple containing the schemes names.""" - return tuple(sorted(_SCHEMES.sections())) - - -def get_path_names(): - """Return a tuple containing the paths names.""" - # xxx see if we want a static list - return _SCHEMES.options('posix_prefix') - - -def get_paths(scheme=_get_default_scheme(), vars=None, expand=True): - """Return a mapping containing an install scheme. - - ``scheme`` is the install scheme name. If not provided, it will - return the default scheme for the current platform. - """ - _ensure_cfg_read() - if expand: - return _expand_vars(scheme, vars) - else: - return dict(_SCHEMES.items(scheme)) - - -def get_path(name, scheme=_get_default_scheme(), vars=None, expand=True): - """Return a path corresponding to the scheme. - - ``scheme`` is the install scheme name. - """ - return get_paths(scheme, vars, expand)[name] - - -def get_config_vars(*args): - """With no arguments, return a dictionary of all configuration - variables relevant for the current platform. - - On Unix, this means every variable defined in Python's installed Makefile; - On Windows and Mac OS it's a much smaller set. - - With arguments, return a list of values that result from looking up - each argument in the configuration variable dictionary. - """ - global _CONFIG_VARS - if _CONFIG_VARS is None: - _CONFIG_VARS = {} - # Normalized versions of prefix and exec_prefix are handy to have; - # in fact, these are the standard versions used most places in the - # distutils2 module. - _CONFIG_VARS['prefix'] = _PREFIX - _CONFIG_VARS['exec_prefix'] = _EXEC_PREFIX - _CONFIG_VARS['py_version'] = _PY_VERSION - _CONFIG_VARS['py_version_short'] = _PY_VERSION_SHORT - _CONFIG_VARS['py_version_nodot'] = _PY_VERSION[0] + _PY_VERSION[2] - _CONFIG_VARS['base'] = _PREFIX - _CONFIG_VARS['platbase'] = _EXEC_PREFIX - _CONFIG_VARS['projectbase'] = _PROJECT_BASE - try: - _CONFIG_VARS['abiflags'] = sys.abiflags - except AttributeError: - # sys.abiflags may not be defined on all platforms. - _CONFIG_VARS['abiflags'] = '' - - if os.name in ('nt', 'os2'): - _init_non_posix(_CONFIG_VARS) - if os.name == 'posix': - _init_posix(_CONFIG_VARS) - # Setting 'userbase' is done below the call to the - # init function to enable using 'get_config_var' in - # the init-function. - if sys.version >= '2.6': - _CONFIG_VARS['userbase'] = _getuserbase() - - if 'srcdir' not in _CONFIG_VARS: - _CONFIG_VARS['srcdir'] = _PROJECT_BASE - else: - _CONFIG_VARS['srcdir'] = _safe_realpath(_CONFIG_VARS['srcdir']) - - # Convert srcdir into an absolute path if it appears necessary. - # Normally it is relative to the build directory. However, during - # testing, for example, we might be running a non-installed python - # from a different directory. - if _PYTHON_BUILD and os.name == "posix": - base = _PROJECT_BASE - try: - cwd = os.getcwd() - except OSError: - cwd = None - if (not os.path.isabs(_CONFIG_VARS['srcdir']) and - base != cwd): - # srcdir is relative and we are not in the same directory - # as the executable. Assume executable is in the build - # directory and make srcdir absolute. - srcdir = os.path.join(base, _CONFIG_VARS['srcdir']) - _CONFIG_VARS['srcdir'] = os.path.normpath(srcdir) - - if sys.platform == 'darwin': - kernel_version = os.uname()[2] # Kernel version (8.4.3) - major_version = int(kernel_version.split('.')[0]) - - if major_version < 8: - # On Mac OS X before 10.4, check if -arch and -isysroot - # are in CFLAGS or LDFLAGS and remove them if they are. - # This is needed when building extensions on a 10.3 system - # using a universal build of python. - for key in ('LDFLAGS', 'BASECFLAGS', - # a number of derived variables. These need to be - # patched up as well. - 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): - flags = _CONFIG_VARS[key] - flags = re.sub(r'-arch\s+\w+\s', ' ', flags) - flags = re.sub('-isysroot [^ \t]*', ' ', flags) - _CONFIG_VARS[key] = flags - else: - # Allow the user to override the architecture flags using - # an environment variable. - # NOTE: This name was introduced by Apple in OSX 10.5 and - # is used by several scripting languages distributed with - # that OS release. - if 'ARCHFLAGS' in os.environ: - arch = os.environ['ARCHFLAGS'] - for key in ('LDFLAGS', 'BASECFLAGS', - # a number of derived variables. These need to be - # patched up as well. - 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): - - flags = _CONFIG_VARS[key] - flags = re.sub(r'-arch\s+\w+\s', ' ', flags) - flags = flags + ' ' + arch - _CONFIG_VARS[key] = flags - - # If we're on OSX 10.5 or later and the user tries to - # compiles an extension using an SDK that is not present - # on the current machine it is better to not use an SDK - # than to fail. - # - # The major usecase for this is users using a Python.org - # binary installer on OSX 10.6: that installer uses - # the 10.4u SDK, but that SDK is not installed by default - # when you install Xcode. - # - CFLAGS = _CONFIG_VARS.get('CFLAGS', '') - m = re.search(r'-isysroot\s+(\S+)', CFLAGS) - if m is not None: - sdk = m.group(1) - if not os.path.exists(sdk): - for key in ('LDFLAGS', 'BASECFLAGS', - # a number of derived variables. These need to be - # patched up as well. - 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): - - flags = _CONFIG_VARS[key] - flags = re.sub(r'-isysroot\s+\S+(\s|$)', ' ', flags) - _CONFIG_VARS[key] = flags - - if args: - vals = [] - for name in args: - vals.append(_CONFIG_VARS.get(name)) - return vals - else: - return _CONFIG_VARS - - -def get_config_var(name): - """Return the value of a single variable using the dictionary returned by - 'get_config_vars()'. - - Equivalent to get_config_vars().get(name) - """ - return get_config_vars().get(name) - - -def get_platform(): - """Return a string that identifies the current platform. - - This is used mainly to distinguish platform-specific build directories and - platform-specific built distributions. Typically includes the OS name - and version and the architecture (as supplied by 'os.uname()'), - although the exact information included depends on the OS; eg. for IRIX - the architecture isn't particularly important (IRIX only runs on SGI - hardware), but for Linux the kernel version isn't particularly - important. - - Examples of returned values: - linux-i586 - linux-alpha (?) - solaris-2.6-sun4u - irix-5.3 - irix64-6.2 - - Windows will return one of: - win-amd64 (64bit Windows on AMD64 (aka x86_64, Intel64, EM64T, etc) - win-ia64 (64bit Windows on Itanium) - win32 (all others - specifically, sys.platform is returned) - - For other non-POSIX platforms, currently just returns 'sys.platform'. - """ - if os.name == 'nt': - # sniff sys.version for architecture. - prefix = " bit (" - i = sys.version.find(prefix) - if i == -1: - return sys.platform - j = sys.version.find(")", i) - look = sys.version[i+len(prefix):j].lower() - if look == 'amd64': - return 'win-amd64' - if look == 'itanium': - return 'win-ia64' - return sys.platform - - if os.name != "posix" or not hasattr(os, 'uname'): - # XXX what about the architecture? NT is Intel or Alpha, - # Mac OS is M68k or PPC, etc. - return sys.platform - - # Try to distinguish various flavours of Unix - osname, host, release, version, machine = os.uname() - - # Convert the OS name to lowercase, remove '/' characters - # (to accommodate BSD/OS), and translate spaces (for "Power Macintosh") - osname = osname.lower().replace('/', '') - machine = machine.replace(' ', '_') - machine = machine.replace('/', '-') - - if osname[:5] == "linux": - # At least on Linux/Intel, 'machine' is the processor -- - # i386, etc. - # XXX what about Alpha, SPARC, etc? - return "%s-%s" % (osname, machine) - elif osname[:5] == "sunos": - if release[0] >= "5": # SunOS 5 == Solaris 2 - osname = "solaris" - release = "%d.%s" % (int(release[0]) - 3, release[2:]) - # fall through to standard osname-release-machine representation - elif osname[:4] == "irix": # could be "irix64"! - return "%s-%s" % (osname, release) - elif osname[:3] == "aix": - return "%s-%s.%s" % (osname, version, release) - elif osname[:6] == "cygwin": - osname = "cygwin" - rel_re = re.compile(r'[\d.]+') - m = rel_re.match(release) - if m: - release = m.group() - elif osname[:6] == "darwin": - # - # For our purposes, we'll assume that the system version from - # distutils' perspective is what MACOSX_DEPLOYMENT_TARGET is set - # to. This makes the compatibility story a bit more sane because the - # machine is going to compile and link as if it were - # MACOSX_DEPLOYMENT_TARGET. - cfgvars = get_config_vars() - macver = cfgvars.get('MACOSX_DEPLOYMENT_TARGET') - - if True: - # Always calculate the release of the running machine, - # needed to determine if we can build fat binaries or not. - - macrelease = macver - # Get the system version. Reading this plist is a documented - # way to get the system version (see the documentation for - # the Gestalt Manager) - try: - f = open('/System/Library/CoreServices/SystemVersion.plist') - except IOError: - # We're on a plain darwin box, fall back to the default - # behaviour. - pass - else: - try: - m = re.search(r'<key>ProductUserVisibleVersion</key>\s*' - r'<string>(.*?)</string>', f.read()) - finally: - f.close() - if m is not None: - macrelease = '.'.join(m.group(1).split('.')[:2]) - # else: fall back to the default behaviour - - if not macver: - macver = macrelease - - if macver: - release = macver - osname = "macosx" - - if ((macrelease + '.') >= '10.4.' and - '-arch' in get_config_vars().get('CFLAGS', '').strip()): - # The universal build will build fat binaries, but not on - # systems before 10.4 - # - # Try to detect 4-way universal builds, those have machine-type - # 'universal' instead of 'fat'. - - machine = 'fat' - cflags = get_config_vars().get('CFLAGS') - - archs = re.findall(r'-arch\s+(\S+)', cflags) - archs = tuple(sorted(set(archs))) - - if len(archs) == 1: - machine = archs[0] - elif archs == ('i386', 'ppc'): - machine = 'fat' - elif archs == ('i386', 'x86_64'): - machine = 'intel' - elif archs == ('i386', 'ppc', 'x86_64'): - machine = 'fat3' - elif archs == ('ppc64', 'x86_64'): - machine = 'fat64' - elif archs == ('i386', 'ppc', 'ppc64', 'x86_64'): - machine = 'universal' - else: - raise ValueError( - "Don't know machine value for archs=%r" % (archs,)) - - elif machine == 'i386': - # On OSX the machine type returned by uname is always the - # 32-bit variant, even if the executable architecture is - # the 64-bit variant - if sys.maxsize >= 2**32: - machine = 'x86_64' - - elif machine in ('PowerPC', 'Power_Macintosh'): - # Pick a sane name for the PPC architecture. - # See 'i386' case - if sys.maxsize >= 2**32: - machine = 'ppc64' - else: - machine = 'ppc' - - return "%s-%s-%s" % (osname, release, machine) - - -def get_python_version(): - return _PY_VERSION_SHORT - - -def _print_dict(title, data): - for index, (key, value) in enumerate(sorted(data.items())): - if index == 0: - print('%s: ' % (title)) - print('\t%s = "%s"' % (key, value)) - - -def _main(): - """Display all information sysconfig detains.""" - print('Platform: "%s"' % get_platform()) - print('Python version: "%s"' % get_python_version()) - print('Current installation scheme: "%s"' % _get_default_scheme()) - print() - _print_dict('Paths', get_paths()) - print() - _print_dict('Variables', get_config_vars()) - - -if __name__ == '__main__': - _main() diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/tarfile.py b/env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/tarfile.py deleted file mode 100644 index d66d856..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/tarfile.py +++ /dev/null @@ -1,2607 +0,0 @@ -#------------------------------------------------------------------- -# tarfile.py -#------------------------------------------------------------------- -# Copyright (C) 2002 Lars Gustaebel <lars@gustaebel.de> -# All rights reserved. -# -# Permission is hereby granted, free of charge, to any person -# obtaining a copy of this software and associated documentation -# files (the "Software"), to deal in the Software without -# restriction, including without limitation the rights to use, -# copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the -# Software is furnished to do so, subject to the following -# conditions: -# -# The above copyright notice and this permission notice shall be -# included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -# OTHER DEALINGS IN THE SOFTWARE. -# -from __future__ import print_function - -"""Read from and write to tar format archives. -""" - -__version__ = "$Revision$" - -version = "0.9.0" -__author__ = "Lars Gust\u00e4bel (lars@gustaebel.de)" -__date__ = "$Date: 2011-02-25 17:42:01 +0200 (Fri, 25 Feb 2011) $" -__cvsid__ = "$Id: tarfile.py 88586 2011-02-25 15:42:01Z marc-andre.lemburg $" -__credits__ = "Gustavo Niemeyer, Niels Gust\u00e4bel, Richard Townsend." - -#--------- -# Imports -#--------- -import sys -import os -import stat -import errno -import time -import struct -import copy -import re - -try: - import grp, pwd -except ImportError: - grp = pwd = None - -# os.symlink on Windows prior to 6.0 raises NotImplementedError -symlink_exception = (AttributeError, NotImplementedError) -try: - # WindowsError (1314) will be raised if the caller does not hold the - # SeCreateSymbolicLinkPrivilege privilege - symlink_exception += (WindowsError,) -except NameError: - pass - -# from tarfile import * -__all__ = ["TarFile", "TarInfo", "is_tarfile", "TarError"] - -if sys.version_info[0] < 3: - import __builtin__ as builtins -else: - import builtins - -_open = builtins.open # Since 'open' is TarFile.open - -#--------------------------------------------------------- -# tar constants -#--------------------------------------------------------- -NUL = b"\0" # the null character -BLOCKSIZE = 512 # length of processing blocks -RECORDSIZE = BLOCKSIZE * 20 # length of records -GNU_MAGIC = b"ustar \0" # magic gnu tar string -POSIX_MAGIC = b"ustar\x0000" # magic posix tar string - -LENGTH_NAME = 100 # maximum length of a filename -LENGTH_LINK = 100 # maximum length of a linkname -LENGTH_PREFIX = 155 # maximum length of the prefix field - -REGTYPE = b"0" # regular file -AREGTYPE = b"\0" # regular file -LNKTYPE = b"1" # link (inside tarfile) -SYMTYPE = b"2" # symbolic link -CHRTYPE = b"3" # character special device -BLKTYPE = b"4" # block special device -DIRTYPE = b"5" # directory -FIFOTYPE = b"6" # fifo special device -CONTTYPE = b"7" # contiguous file - -GNUTYPE_LONGNAME = b"L" # GNU tar longname -GNUTYPE_LONGLINK = b"K" # GNU tar longlink -GNUTYPE_SPARSE = b"S" # GNU tar sparse file - -XHDTYPE = b"x" # POSIX.1-2001 extended header -XGLTYPE = b"g" # POSIX.1-2001 global header -SOLARIS_XHDTYPE = b"X" # Solaris extended header - -USTAR_FORMAT = 0 # POSIX.1-1988 (ustar) format -GNU_FORMAT = 1 # GNU tar format -PAX_FORMAT = 2 # POSIX.1-2001 (pax) format -DEFAULT_FORMAT = GNU_FORMAT - -#--------------------------------------------------------- -# tarfile constants -#--------------------------------------------------------- -# File types that tarfile supports: -SUPPORTED_TYPES = (REGTYPE, AREGTYPE, LNKTYPE, - SYMTYPE, DIRTYPE, FIFOTYPE, - CONTTYPE, CHRTYPE, BLKTYPE, - GNUTYPE_LONGNAME, GNUTYPE_LONGLINK, - GNUTYPE_SPARSE) - -# File types that will be treated as a regular file. -REGULAR_TYPES = (REGTYPE, AREGTYPE, - CONTTYPE, GNUTYPE_SPARSE) - -# File types that are part of the GNU tar format. -GNU_TYPES = (GNUTYPE_LONGNAME, GNUTYPE_LONGLINK, - GNUTYPE_SPARSE) - -# Fields from a pax header that override a TarInfo attribute. -PAX_FIELDS = ("path", "linkpath", "size", "mtime", - "uid", "gid", "uname", "gname") - -# Fields from a pax header that are affected by hdrcharset. -PAX_NAME_FIELDS = set(("path", "linkpath", "uname", "gname")) - -# Fields in a pax header that are numbers, all other fields -# are treated as strings. -PAX_NUMBER_FIELDS = { - "atime": float, - "ctime": float, - "mtime": float, - "uid": int, - "gid": int, - "size": int -} - -#--------------------------------------------------------- -# Bits used in the mode field, values in octal. -#--------------------------------------------------------- -S_IFLNK = 0o120000 # symbolic link -S_IFREG = 0o100000 # regular file -S_IFBLK = 0o060000 # block device -S_IFDIR = 0o040000 # directory -S_IFCHR = 0o020000 # character device -S_IFIFO = 0o010000 # fifo - -TSUID = 0o4000 # set UID on execution -TSGID = 0o2000 # set GID on execution -TSVTX = 0o1000 # reserved - -TUREAD = 0o400 # read by owner -TUWRITE = 0o200 # write by owner -TUEXEC = 0o100 # execute/search by owner -TGREAD = 0o040 # read by group -TGWRITE = 0o020 # write by group -TGEXEC = 0o010 # execute/search by group -TOREAD = 0o004 # read by other -TOWRITE = 0o002 # write by other -TOEXEC = 0o001 # execute/search by other - -#--------------------------------------------------------- -# initialization -#--------------------------------------------------------- -if os.name in ("nt", "ce"): - ENCODING = "utf-8" -else: - ENCODING = sys.getfilesystemencoding() - -#--------------------------------------------------------- -# Some useful functions -#--------------------------------------------------------- - -def stn(s, length, encoding, errors): - """Convert a string to a null-terminated bytes object. - """ - s = s.encode(encoding, errors) - return s[:length] + (length - len(s)) * NUL - -def nts(s, encoding, errors): - """Convert a null-terminated bytes object to a string. - """ - p = s.find(b"\0") - if p != -1: - s = s[:p] - return s.decode(encoding, errors) - -def nti(s): - """Convert a number field to a python number. - """ - # There are two possible encodings for a number field, see - # itn() below. - if s[0] != chr(0o200): - try: - n = int(nts(s, "ascii", "strict") or "0", 8) - except ValueError: - raise InvalidHeaderError("invalid header") - else: - n = 0 - for i in range(len(s) - 1): - n <<= 8 - n += ord(s[i + 1]) - return n - -def itn(n, digits=8, format=DEFAULT_FORMAT): - """Convert a python number to a number field. - """ - # POSIX 1003.1-1988 requires numbers to be encoded as a string of - # octal digits followed by a null-byte, this allows values up to - # (8**(digits-1))-1. GNU tar allows storing numbers greater than - # that if necessary. A leading 0o200 byte indicates this particular - # encoding, the following digits-1 bytes are a big-endian - # representation. This allows values up to (256**(digits-1))-1. - if 0 <= n < 8 ** (digits - 1): - s = ("%0*o" % (digits - 1, n)).encode("ascii") + NUL - else: - if format != GNU_FORMAT or n >= 256 ** (digits - 1): - raise ValueError("overflow in number field") - - if n < 0: - # XXX We mimic GNU tar's behaviour with negative numbers, - # this could raise OverflowError. - n = struct.unpack("L", struct.pack("l", n))[0] - - s = bytearray() - for i in range(digits - 1): - s.insert(0, n & 0o377) - n >>= 8 - s.insert(0, 0o200) - return s - -def calc_chksums(buf): - """Calculate the checksum for a member's header by summing up all - characters except for the chksum field which is treated as if - it was filled with spaces. According to the GNU tar sources, - some tars (Sun and NeXT) calculate chksum with signed char, - which will be different if there are chars in the buffer with - the high bit set. So we calculate two checksums, unsigned and - signed. - """ - unsigned_chksum = 256 + sum(struct.unpack("148B", buf[:148]) + struct.unpack("356B", buf[156:512])) - signed_chksum = 256 + sum(struct.unpack("148b", buf[:148]) + struct.unpack("356b", buf[156:512])) - return unsigned_chksum, signed_chksum - -def copyfileobj(src, dst, length=None): - """Copy length bytes from fileobj src to fileobj dst. - If length is None, copy the entire content. - """ - if length == 0: - return - if length is None: - while True: - buf = src.read(16*1024) - if not buf: - break - dst.write(buf) - return - - BUFSIZE = 16 * 1024 - blocks, remainder = divmod(length, BUFSIZE) - for b in range(blocks): - buf = src.read(BUFSIZE) - if len(buf) < BUFSIZE: - raise IOError("end of file reached") - dst.write(buf) - - if remainder != 0: - buf = src.read(remainder) - if len(buf) < remainder: - raise IOError("end of file reached") - dst.write(buf) - return - -filemode_table = ( - ((S_IFLNK, "l"), - (S_IFREG, "-"), - (S_IFBLK, "b"), - (S_IFDIR, "d"), - (S_IFCHR, "c"), - (S_IFIFO, "p")), - - ((TUREAD, "r"),), - ((TUWRITE, "w"),), - ((TUEXEC|TSUID, "s"), - (TSUID, "S"), - (TUEXEC, "x")), - - ((TGREAD, "r"),), - ((TGWRITE, "w"),), - ((TGEXEC|TSGID, "s"), - (TSGID, "S"), - (TGEXEC, "x")), - - ((TOREAD, "r"),), - ((TOWRITE, "w"),), - ((TOEXEC|TSVTX, "t"), - (TSVTX, "T"), - (TOEXEC, "x")) -) - -def filemode(mode): - """Convert a file's mode to a string of the form - -rwxrwxrwx. - Used by TarFile.list() - """ - perm = [] - for table in filemode_table: - for bit, char in table: - if mode & bit == bit: - perm.append(char) - break - else: - perm.append("-") - return "".join(perm) - -class TarError(Exception): - """Base exception.""" - pass -class ExtractError(TarError): - """General exception for extract errors.""" - pass -class ReadError(TarError): - """Exception for unreadable tar archives.""" - pass -class CompressionError(TarError): - """Exception for unavailable compression methods.""" - pass -class StreamError(TarError): - """Exception for unsupported operations on stream-like TarFiles.""" - pass -class HeaderError(TarError): - """Base exception for header errors.""" - pass -class EmptyHeaderError(HeaderError): - """Exception for empty headers.""" - pass -class TruncatedHeaderError(HeaderError): - """Exception for truncated headers.""" - pass -class EOFHeaderError(HeaderError): - """Exception for end of file headers.""" - pass -class InvalidHeaderError(HeaderError): - """Exception for invalid headers.""" - pass -class SubsequentHeaderError(HeaderError): - """Exception for missing and invalid extended headers.""" - pass - -#--------------------------- -# internal stream interface -#--------------------------- -class _LowLevelFile(object): - """Low-level file object. Supports reading and writing. - It is used instead of a regular file object for streaming - access. - """ - - def __init__(self, name, mode): - mode = { - "r": os.O_RDONLY, - "w": os.O_WRONLY | os.O_CREAT | os.O_TRUNC, - }[mode] - if hasattr(os, "O_BINARY"): - mode |= os.O_BINARY - self.fd = os.open(name, mode, 0o666) - - def close(self): - os.close(self.fd) - - def read(self, size): - return os.read(self.fd, size) - - def write(self, s): - os.write(self.fd, s) - -class _Stream(object): - """Class that serves as an adapter between TarFile and - a stream-like object. The stream-like object only - needs to have a read() or write() method and is accessed - blockwise. Use of gzip or bzip2 compression is possible. - A stream-like object could be for example: sys.stdin, - sys.stdout, a socket, a tape device etc. - - _Stream is intended to be used only internally. - """ - - def __init__(self, name, mode, comptype, fileobj, bufsize): - """Construct a _Stream object. - """ - self._extfileobj = True - if fileobj is None: - fileobj = _LowLevelFile(name, mode) - self._extfileobj = False - - if comptype == '*': - # Enable transparent compression detection for the - # stream interface - fileobj = _StreamProxy(fileobj) - comptype = fileobj.getcomptype() - - self.name = name or "" - self.mode = mode - self.comptype = comptype - self.fileobj = fileobj - self.bufsize = bufsize - self.buf = b"" - self.pos = 0 - self.closed = False - - try: - if comptype == "gz": - try: - import zlib - except ImportError: - raise CompressionError("zlib module is not available") - self.zlib = zlib - self.crc = zlib.crc32(b"") - if mode == "r": - self._init_read_gz() - else: - self._init_write_gz() - - if comptype == "bz2": - try: - import bz2 - except ImportError: - raise CompressionError("bz2 module is not available") - if mode == "r": - self.dbuf = b"" - self.cmp = bz2.BZ2Decompressor() - else: - self.cmp = bz2.BZ2Compressor() - except: - if not self._extfileobj: - self.fileobj.close() - self.closed = True - raise - - def __del__(self): - if hasattr(self, "closed") and not self.closed: - self.close() - - def _init_write_gz(self): - """Initialize for writing with gzip compression. - """ - self.cmp = self.zlib.compressobj(9, self.zlib.DEFLATED, - -self.zlib.MAX_WBITS, - self.zlib.DEF_MEM_LEVEL, - 0) - timestamp = struct.pack("<L", int(time.time())) - self.__write(b"\037\213\010\010" + timestamp + b"\002\377") - if self.name.endswith(".gz"): - self.name = self.name[:-3] - # RFC1952 says we must use ISO-8859-1 for the FNAME field. - self.__write(self.name.encode("iso-8859-1", "replace") + NUL) - - def write(self, s): - """Write string s to the stream. - """ - if self.comptype == "gz": - self.crc = self.zlib.crc32(s, self.crc) - self.pos += len(s) - if self.comptype != "tar": - s = self.cmp.compress(s) - self.__write(s) - - def __write(self, s): - """Write string s to the stream if a whole new block - is ready to be written. - """ - self.buf += s - while len(self.buf) > self.bufsize: - self.fileobj.write(self.buf[:self.bufsize]) - self.buf = self.buf[self.bufsize:] - - def close(self): - """Close the _Stream object. No operation should be - done on it afterwards. - """ - if self.closed: - return - - if self.mode == "w" and self.comptype != "tar": - self.buf += self.cmp.flush() - - if self.mode == "w" and self.buf: - self.fileobj.write(self.buf) - self.buf = b"" - if self.comptype == "gz": - # The native zlib crc is an unsigned 32-bit integer, but - # the Python wrapper implicitly casts that to a signed C - # long. So, on a 32-bit box self.crc may "look negative", - # while the same crc on a 64-bit box may "look positive". - # To avoid irksome warnings from the `struct` module, force - # it to look positive on all boxes. - self.fileobj.write(struct.pack("<L", self.crc & 0xffffffff)) - self.fileobj.write(struct.pack("<L", self.pos & 0xffffFFFF)) - - if not self._extfileobj: - self.fileobj.close() - - self.closed = True - - def _init_read_gz(self): - """Initialize for reading a gzip compressed fileobj. - """ - self.cmp = self.zlib.decompressobj(-self.zlib.MAX_WBITS) - self.dbuf = b"" - - # taken from gzip.GzipFile with some alterations - if self.__read(2) != b"\037\213": - raise ReadError("not a gzip file") - if self.__read(1) != b"\010": - raise CompressionError("unsupported compression method") - - flag = ord(self.__read(1)) - self.__read(6) - - if flag & 4: - xlen = ord(self.__read(1)) + 256 * ord(self.__read(1)) - self.read(xlen) - if flag & 8: - while True: - s = self.__read(1) - if not s or s == NUL: - break - if flag & 16: - while True: - s = self.__read(1) - if not s or s == NUL: - break - if flag & 2: - self.__read(2) - - def tell(self): - """Return the stream's file pointer position. - """ - return self.pos - - def seek(self, pos=0): - """Set the stream's file pointer to pos. Negative seeking - is forbidden. - """ - if pos - self.pos >= 0: - blocks, remainder = divmod(pos - self.pos, self.bufsize) - for i in range(blocks): - self.read(self.bufsize) - self.read(remainder) - else: - raise StreamError("seeking backwards is not allowed") - return self.pos - - def read(self, size=None): - """Return the next size number of bytes from the stream. - If size is not defined, return all bytes of the stream - up to EOF. - """ - if size is None: - t = [] - while True: - buf = self._read(self.bufsize) - if not buf: - break - t.append(buf) - buf = "".join(t) - else: - buf = self._read(size) - self.pos += len(buf) - return buf - - def _read(self, size): - """Return size bytes from the stream. - """ - if self.comptype == "tar": - return self.__read(size) - - c = len(self.dbuf) - while c < size: - buf = self.__read(self.bufsize) - if not buf: - break - try: - buf = self.cmp.decompress(buf) - except IOError: - raise ReadError("invalid compressed data") - self.dbuf += buf - c += len(buf) - buf = self.dbuf[:size] - self.dbuf = self.dbuf[size:] - return buf - - def __read(self, size): - """Return size bytes from stream. If internal buffer is empty, - read another block from the stream. - """ - c = len(self.buf) - while c < size: - buf = self.fileobj.read(self.bufsize) - if not buf: - break - self.buf += buf - c += len(buf) - buf = self.buf[:size] - self.buf = self.buf[size:] - return buf -# class _Stream - -class _StreamProxy(object): - """Small proxy class that enables transparent compression - detection for the Stream interface (mode 'r|*'). - """ - - def __init__(self, fileobj): - self.fileobj = fileobj - self.buf = self.fileobj.read(BLOCKSIZE) - - def read(self, size): - self.read = self.fileobj.read - return self.buf - - def getcomptype(self): - if self.buf.startswith(b"\037\213\010"): - return "gz" - if self.buf.startswith(b"BZh91"): - return "bz2" - return "tar" - - def close(self): - self.fileobj.close() -# class StreamProxy - -class _BZ2Proxy(object): - """Small proxy class that enables external file object - support for "r:bz2" and "w:bz2" modes. This is actually - a workaround for a limitation in bz2 module's BZ2File - class which (unlike gzip.GzipFile) has no support for - a file object argument. - """ - - blocksize = 16 * 1024 - - def __init__(self, fileobj, mode): - self.fileobj = fileobj - self.mode = mode - self.name = getattr(self.fileobj, "name", None) - self.init() - - def init(self): - import bz2 - self.pos = 0 - if self.mode == "r": - self.bz2obj = bz2.BZ2Decompressor() - self.fileobj.seek(0) - self.buf = b"" - else: - self.bz2obj = bz2.BZ2Compressor() - - def read(self, size): - x = len(self.buf) - while x < size: - raw = self.fileobj.read(self.blocksize) - if not raw: - break - data = self.bz2obj.decompress(raw) - self.buf += data - x += len(data) - - buf = self.buf[:size] - self.buf = self.buf[size:] - self.pos += len(buf) - return buf - - def seek(self, pos): - if pos < self.pos: - self.init() - self.read(pos - self.pos) - - def tell(self): - return self.pos - - def write(self, data): - self.pos += len(data) - raw = self.bz2obj.compress(data) - self.fileobj.write(raw) - - def close(self): - if self.mode == "w": - raw = self.bz2obj.flush() - self.fileobj.write(raw) -# class _BZ2Proxy - -#------------------------ -# Extraction file object -#------------------------ -class _FileInFile(object): - """A thin wrapper around an existing file object that - provides a part of its data as an individual file - object. - """ - - def __init__(self, fileobj, offset, size, blockinfo=None): - self.fileobj = fileobj - self.offset = offset - self.size = size - self.position = 0 - - if blockinfo is None: - blockinfo = [(0, size)] - - # Construct a map with data and zero blocks. - self.map_index = 0 - self.map = [] - lastpos = 0 - realpos = self.offset - for offset, size in blockinfo: - if offset > lastpos: - self.map.append((False, lastpos, offset, None)) - self.map.append((True, offset, offset + size, realpos)) - realpos += size - lastpos = offset + size - if lastpos < self.size: - self.map.append((False, lastpos, self.size, None)) - - def seekable(self): - if not hasattr(self.fileobj, "seekable"): - # XXX gzip.GzipFile and bz2.BZ2File - return True - return self.fileobj.seekable() - - def tell(self): - """Return the current file position. - """ - return self.position - - def seek(self, position): - """Seek to a position in the file. - """ - self.position = position - - def read(self, size=None): - """Read data from the file. - """ - if size is None: - size = self.size - self.position - else: - size = min(size, self.size - self.position) - - buf = b"" - while size > 0: - while True: - data, start, stop, offset = self.map[self.map_index] - if start <= self.position < stop: - break - else: - self.map_index += 1 - if self.map_index == len(self.map): - self.map_index = 0 - length = min(size, stop - self.position) - if data: - self.fileobj.seek(offset + (self.position - start)) - buf += self.fileobj.read(length) - else: - buf += NUL * length - size -= length - self.position += length - return buf -#class _FileInFile - - -class ExFileObject(object): - """File-like object for reading an archive member. - Is returned by TarFile.extractfile(). - """ - blocksize = 1024 - - def __init__(self, tarfile, tarinfo): - self.fileobj = _FileInFile(tarfile.fileobj, - tarinfo.offset_data, - tarinfo.size, - tarinfo.sparse) - self.name = tarinfo.name - self.mode = "r" - self.closed = False - self.size = tarinfo.size - - self.position = 0 - self.buffer = b"" - - def readable(self): - return True - - def writable(self): - return False - - def seekable(self): - return self.fileobj.seekable() - - def read(self, size=None): - """Read at most size bytes from the file. If size is not - present or None, read all data until EOF is reached. - """ - if self.closed: - raise ValueError("I/O operation on closed file") - - buf = b"" - if self.buffer: - if size is None: - buf = self.buffer - self.buffer = b"" - else: - buf = self.buffer[:size] - self.buffer = self.buffer[size:] - - if size is None: - buf += self.fileobj.read() - else: - buf += self.fileobj.read(size - len(buf)) - - self.position += len(buf) - return buf - - # XXX TextIOWrapper uses the read1() method. - read1 = read - - def readline(self, size=-1): - """Read one entire line from the file. If size is present - and non-negative, return a string with at most that - size, which may be an incomplete line. - """ - if self.closed: - raise ValueError("I/O operation on closed file") - - pos = self.buffer.find(b"\n") + 1 - if pos == 0: - # no newline found. - while True: - buf = self.fileobj.read(self.blocksize) - self.buffer += buf - if not buf or b"\n" in buf: - pos = self.buffer.find(b"\n") + 1 - if pos == 0: - # no newline found. - pos = len(self.buffer) - break - - if size != -1: - pos = min(size, pos) - - buf = self.buffer[:pos] - self.buffer = self.buffer[pos:] - self.position += len(buf) - return buf - - def readlines(self): - """Return a list with all remaining lines. - """ - result = [] - while True: - line = self.readline() - if not line: break - result.append(line) - return result - - def tell(self): - """Return the current file position. - """ - if self.closed: - raise ValueError("I/O operation on closed file") - - return self.position - - def seek(self, pos, whence=os.SEEK_SET): - """Seek to a position in the file. - """ - if self.closed: - raise ValueError("I/O operation on closed file") - - if whence == os.SEEK_SET: - self.position = min(max(pos, 0), self.size) - elif whence == os.SEEK_CUR: - if pos < 0: - self.position = max(self.position + pos, 0) - else: - self.position = min(self.position + pos, self.size) - elif whence == os.SEEK_END: - self.position = max(min(self.size + pos, self.size), 0) - else: - raise ValueError("Invalid argument") - - self.buffer = b"" - self.fileobj.seek(self.position) - - def close(self): - """Close the file object. - """ - self.closed = True - - def __iter__(self): - """Get an iterator over the file's lines. - """ - while True: - line = self.readline() - if not line: - break - yield line -#class ExFileObject - -#------------------ -# Exported Classes -#------------------ -class TarInfo(object): - """Informational class which holds the details about an - archive member given by a tar header block. - TarInfo objects are returned by TarFile.getmember(), - TarFile.getmembers() and TarFile.gettarinfo() and are - usually created internally. - """ - - __slots__ = ("name", "mode", "uid", "gid", "size", "mtime", - "chksum", "type", "linkname", "uname", "gname", - "devmajor", "devminor", - "offset", "offset_data", "pax_headers", "sparse", - "tarfile", "_sparse_structs", "_link_target") - - def __init__(self, name=""): - """Construct a TarInfo object. name is the optional name - of the member. - """ - self.name = name # member name - self.mode = 0o644 # file permissions - self.uid = 0 # user id - self.gid = 0 # group id - self.size = 0 # file size - self.mtime = 0 # modification time - self.chksum = 0 # header checksum - self.type = REGTYPE # member type - self.linkname = "" # link name - self.uname = "" # user name - self.gname = "" # group name - self.devmajor = 0 # device major number - self.devminor = 0 # device minor number - - self.offset = 0 # the tar header starts here - self.offset_data = 0 # the file's data starts here - - self.sparse = None # sparse member information - self.pax_headers = {} # pax header information - - # In pax headers the "name" and "linkname" field are called - # "path" and "linkpath". - def _getpath(self): - return self.name - def _setpath(self, name): - self.name = name - path = property(_getpath, _setpath) - - def _getlinkpath(self): - return self.linkname - def _setlinkpath(self, linkname): - self.linkname = linkname - linkpath = property(_getlinkpath, _setlinkpath) - - def __repr__(self): - return "<%s %r at %#x>" % (self.__class__.__name__,self.name,id(self)) - - def get_info(self): - """Return the TarInfo's attributes as a dictionary. - """ - info = { - "name": self.name, - "mode": self.mode & 0o7777, - "uid": self.uid, - "gid": self.gid, - "size": self.size, - "mtime": self.mtime, - "chksum": self.chksum, - "type": self.type, - "linkname": self.linkname, - "uname": self.uname, - "gname": self.gname, - "devmajor": self.devmajor, - "devminor": self.devminor - } - - if info["type"] == DIRTYPE and not info["name"].endswith("/"): - info["name"] += "/" - - return info - - def tobuf(self, format=DEFAULT_FORMAT, encoding=ENCODING, errors="surrogateescape"): - """Return a tar header as a string of 512 byte blocks. - """ - info = self.get_info() - - if format == USTAR_FORMAT: - return self.create_ustar_header(info, encoding, errors) - elif format == GNU_FORMAT: - return self.create_gnu_header(info, encoding, errors) - elif format == PAX_FORMAT: - return self.create_pax_header(info, encoding) - else: - raise ValueError("invalid format") - - def create_ustar_header(self, info, encoding, errors): - """Return the object as a ustar header block. - """ - info["magic"] = POSIX_MAGIC - - if len(info["linkname"]) > LENGTH_LINK: - raise ValueError("linkname is too long") - - if len(info["name"]) > LENGTH_NAME: - info["prefix"], info["name"] = self._posix_split_name(info["name"]) - - return self._create_header(info, USTAR_FORMAT, encoding, errors) - - def create_gnu_header(self, info, encoding, errors): - """Return the object as a GNU header block sequence. - """ - info["magic"] = GNU_MAGIC - - buf = b"" - if len(info["linkname"]) > LENGTH_LINK: - buf += self._create_gnu_long_header(info["linkname"], GNUTYPE_LONGLINK, encoding, errors) - - if len(info["name"]) > LENGTH_NAME: - buf += self._create_gnu_long_header(info["name"], GNUTYPE_LONGNAME, encoding, errors) - - return buf + self._create_header(info, GNU_FORMAT, encoding, errors) - - def create_pax_header(self, info, encoding): - """Return the object as a ustar header block. If it cannot be - represented this way, prepend a pax extended header sequence - with supplement information. - """ - info["magic"] = POSIX_MAGIC - pax_headers = self.pax_headers.copy() - - # Test string fields for values that exceed the field length or cannot - # be represented in ASCII encoding. - for name, hname, length in ( - ("name", "path", LENGTH_NAME), ("linkname", "linkpath", LENGTH_LINK), - ("uname", "uname", 32), ("gname", "gname", 32)): - - if hname in pax_headers: - # The pax header has priority. - continue - - # Try to encode the string as ASCII. - try: - info[name].encode("ascii", "strict") - except UnicodeEncodeError: - pax_headers[hname] = info[name] - continue - - if len(info[name]) > length: - pax_headers[hname] = info[name] - - # Test number fields for values that exceed the field limit or values - # that like to be stored as float. - for name, digits in (("uid", 8), ("gid", 8), ("size", 12), ("mtime", 12)): - if name in pax_headers: - # The pax header has priority. Avoid overflow. - info[name] = 0 - continue - - val = info[name] - if not 0 <= val < 8 ** (digits - 1) or isinstance(val, float): - pax_headers[name] = str(val) - info[name] = 0 - - # Create a pax extended header if necessary. - if pax_headers: - buf = self._create_pax_generic_header(pax_headers, XHDTYPE, encoding) - else: - buf = b"" - - return buf + self._create_header(info, USTAR_FORMAT, "ascii", "replace") - - @classmethod - def create_pax_global_header(cls, pax_headers): - """Return the object as a pax global header block sequence. - """ - return cls._create_pax_generic_header(pax_headers, XGLTYPE, "utf8") - - def _posix_split_name(self, name): - """Split a name longer than 100 chars into a prefix - and a name part. - """ - prefix = name[:LENGTH_PREFIX + 1] - while prefix and prefix[-1] != "/": - prefix = prefix[:-1] - - name = name[len(prefix):] - prefix = prefix[:-1] - - if not prefix or len(name) > LENGTH_NAME: - raise ValueError("name is too long") - return prefix, name - - @staticmethod - def _create_header(info, format, encoding, errors): - """Return a header block. info is a dictionary with file - information, format must be one of the *_FORMAT constants. - """ - parts = [ - stn(info.get("name", ""), 100, encoding, errors), - itn(info.get("mode", 0) & 0o7777, 8, format), - itn(info.get("uid", 0), 8, format), - itn(info.get("gid", 0), 8, format), - itn(info.get("size", 0), 12, format), - itn(info.get("mtime", 0), 12, format), - b" ", # checksum field - info.get("type", REGTYPE), - stn(info.get("linkname", ""), 100, encoding, errors), - info.get("magic", POSIX_MAGIC), - stn(info.get("uname", ""), 32, encoding, errors), - stn(info.get("gname", ""), 32, encoding, errors), - itn(info.get("devmajor", 0), 8, format), - itn(info.get("devminor", 0), 8, format), - stn(info.get("prefix", ""), 155, encoding, errors) - ] - - buf = struct.pack("%ds" % BLOCKSIZE, b"".join(parts)) - chksum = calc_chksums(buf[-BLOCKSIZE:])[0] - buf = buf[:-364] + ("%06o\0" % chksum).encode("ascii") + buf[-357:] - return buf - - @staticmethod - def _create_payload(payload): - """Return the string payload filled with zero bytes - up to the next 512 byte border. - """ - blocks, remainder = divmod(len(payload), BLOCKSIZE) - if remainder > 0: - payload += (BLOCKSIZE - remainder) * NUL - return payload - - @classmethod - def _create_gnu_long_header(cls, name, type, encoding, errors): - """Return a GNUTYPE_LONGNAME or GNUTYPE_LONGLINK sequence - for name. - """ - name = name.encode(encoding, errors) + NUL - - info = {} - info["name"] = "././@LongLink" - info["type"] = type - info["size"] = len(name) - info["magic"] = GNU_MAGIC - - # create extended header + name blocks. - return cls._create_header(info, USTAR_FORMAT, encoding, errors) + \ - cls._create_payload(name) - - @classmethod - def _create_pax_generic_header(cls, pax_headers, type, encoding): - """Return a POSIX.1-2008 extended or global header sequence - that contains a list of keyword, value pairs. The values - must be strings. - """ - # Check if one of the fields contains surrogate characters and thereby - # forces hdrcharset=BINARY, see _proc_pax() for more information. - binary = False - for keyword, value in pax_headers.items(): - try: - value.encode("utf8", "strict") - except UnicodeEncodeError: - binary = True - break - - records = b"" - if binary: - # Put the hdrcharset field at the beginning of the header. - records += b"21 hdrcharset=BINARY\n" - - for keyword, value in pax_headers.items(): - keyword = keyword.encode("utf8") - if binary: - # Try to restore the original byte representation of `value'. - # Needless to say, that the encoding must match the string. - value = value.encode(encoding, "surrogateescape") - else: - value = value.encode("utf8") - - l = len(keyword) + len(value) + 3 # ' ' + '=' + '\n' - n = p = 0 - while True: - n = l + len(str(p)) - if n == p: - break - p = n - records += bytes(str(p), "ascii") + b" " + keyword + b"=" + value + b"\n" - - # We use a hardcoded "././@PaxHeader" name like star does - # instead of the one that POSIX recommends. - info = {} - info["name"] = "././@PaxHeader" - info["type"] = type - info["size"] = len(records) - info["magic"] = POSIX_MAGIC - - # Create pax header + record blocks. - return cls._create_header(info, USTAR_FORMAT, "ascii", "replace") + \ - cls._create_payload(records) - - @classmethod - def frombuf(cls, buf, encoding, errors): - """Construct a TarInfo object from a 512 byte bytes object. - """ - if len(buf) == 0: - raise EmptyHeaderError("empty header") - if len(buf) != BLOCKSIZE: - raise TruncatedHeaderError("truncated header") - if buf.count(NUL) == BLOCKSIZE: - raise EOFHeaderError("end of file header") - - chksum = nti(buf[148:156]) - if chksum not in calc_chksums(buf): - raise InvalidHeaderError("bad checksum") - - obj = cls() - obj.name = nts(buf[0:100], encoding, errors) - obj.mode = nti(buf[100:108]) - obj.uid = nti(buf[108:116]) - obj.gid = nti(buf[116:124]) - obj.size = nti(buf[124:136]) - obj.mtime = nti(buf[136:148]) - obj.chksum = chksum - obj.type = buf[156:157] - obj.linkname = nts(buf[157:257], encoding, errors) - obj.uname = nts(buf[265:297], encoding, errors) - obj.gname = nts(buf[297:329], encoding, errors) - obj.devmajor = nti(buf[329:337]) - obj.devminor = nti(buf[337:345]) - prefix = nts(buf[345:500], encoding, errors) - - # Old V7 tar format represents a directory as a regular - # file with a trailing slash. - if obj.type == AREGTYPE and obj.name.endswith("/"): - obj.type = DIRTYPE - - # The old GNU sparse format occupies some of the unused - # space in the buffer for up to 4 sparse structures. - # Save the them for later processing in _proc_sparse(). - if obj.type == GNUTYPE_SPARSE: - pos = 386 - structs = [] - for i in range(4): - try: - offset = nti(buf[pos:pos + 12]) - numbytes = nti(buf[pos + 12:pos + 24]) - except ValueError: - break - structs.append((offset, numbytes)) - pos += 24 - isextended = bool(buf[482]) - origsize = nti(buf[483:495]) - obj._sparse_structs = (structs, isextended, origsize) - - # Remove redundant slashes from directories. - if obj.isdir(): - obj.name = obj.name.rstrip("/") - - # Reconstruct a ustar longname. - if prefix and obj.type not in GNU_TYPES: - obj.name = prefix + "/" + obj.name - return obj - - @classmethod - def fromtarfile(cls, tarfile): - """Return the next TarInfo object from TarFile object - tarfile. - """ - buf = tarfile.fileobj.read(BLOCKSIZE) - obj = cls.frombuf(buf, tarfile.encoding, tarfile.errors) - obj.offset = tarfile.fileobj.tell() - BLOCKSIZE - return obj._proc_member(tarfile) - - #-------------------------------------------------------------------------- - # The following are methods that are called depending on the type of a - # member. The entry point is _proc_member() which can be overridden in a - # subclass to add custom _proc_*() methods. A _proc_*() method MUST - # implement the following - # operations: - # 1. Set self.offset_data to the position where the data blocks begin, - # if there is data that follows. - # 2. Set tarfile.offset to the position where the next member's header will - # begin. - # 3. Return self or another valid TarInfo object. - def _proc_member(self, tarfile): - """Choose the right processing method depending on - the type and call it. - """ - if self.type in (GNUTYPE_LONGNAME, GNUTYPE_LONGLINK): - return self._proc_gnulong(tarfile) - elif self.type == GNUTYPE_SPARSE: - return self._proc_sparse(tarfile) - elif self.type in (XHDTYPE, XGLTYPE, SOLARIS_XHDTYPE): - return self._proc_pax(tarfile) - else: - return self._proc_builtin(tarfile) - - def _proc_builtin(self, tarfile): - """Process a builtin type or an unknown type which - will be treated as a regular file. - """ - self.offset_data = tarfile.fileobj.tell() - offset = self.offset_data - if self.isreg() or self.type not in SUPPORTED_TYPES: - # Skip the following data blocks. - offset += self._block(self.size) - tarfile.offset = offset - - # Patch the TarInfo object with saved global - # header information. - self._apply_pax_info(tarfile.pax_headers, tarfile.encoding, tarfile.errors) - - return self - - def _proc_gnulong(self, tarfile): - """Process the blocks that hold a GNU longname - or longlink member. - """ - buf = tarfile.fileobj.read(self._block(self.size)) - - # Fetch the next header and process it. - try: - next = self.fromtarfile(tarfile) - except HeaderError: - raise SubsequentHeaderError("missing or bad subsequent header") - - # Patch the TarInfo object from the next header with - # the longname information. - next.offset = self.offset - if self.type == GNUTYPE_LONGNAME: - next.name = nts(buf, tarfile.encoding, tarfile.errors) - elif self.type == GNUTYPE_LONGLINK: - next.linkname = nts(buf, tarfile.encoding, tarfile.errors) - - return next - - def _proc_sparse(self, tarfile): - """Process a GNU sparse header plus extra headers. - """ - # We already collected some sparse structures in frombuf(). - structs, isextended, origsize = self._sparse_structs - del self._sparse_structs - - # Collect sparse structures from extended header blocks. - while isextended: - buf = tarfile.fileobj.read(BLOCKSIZE) - pos = 0 - for i in range(21): - try: - offset = nti(buf[pos:pos + 12]) - numbytes = nti(buf[pos + 12:pos + 24]) - except ValueError: - break - if offset and numbytes: - structs.append((offset, numbytes)) - pos += 24 - isextended = bool(buf[504]) - self.sparse = structs - - self.offset_data = tarfile.fileobj.tell() - tarfile.offset = self.offset_data + self._block(self.size) - self.size = origsize - return self - - def _proc_pax(self, tarfile): - """Process an extended or global header as described in - POSIX.1-2008. - """ - # Read the header information. - buf = tarfile.fileobj.read(self._block(self.size)) - - # A pax header stores supplemental information for either - # the following file (extended) or all following files - # (global). - if self.type == XGLTYPE: - pax_headers = tarfile.pax_headers - else: - pax_headers = tarfile.pax_headers.copy() - - # Check if the pax header contains a hdrcharset field. This tells us - # the encoding of the path, linkpath, uname and gname fields. Normally, - # these fields are UTF-8 encoded but since POSIX.1-2008 tar - # implementations are allowed to store them as raw binary strings if - # the translation to UTF-8 fails. - match = re.search(br"\d+ hdrcharset=([^\n]+)\n", buf) - if match is not None: - pax_headers["hdrcharset"] = match.group(1).decode("utf8") - - # For the time being, we don't care about anything other than "BINARY". - # The only other value that is currently allowed by the standard is - # "ISO-IR 10646 2000 UTF-8" in other words UTF-8. - hdrcharset = pax_headers.get("hdrcharset") - if hdrcharset == "BINARY": - encoding = tarfile.encoding - else: - encoding = "utf8" - - # Parse pax header information. A record looks like that: - # "%d %s=%s\n" % (length, keyword, value). length is the size - # of the complete record including the length field itself and - # the newline. keyword and value are both UTF-8 encoded strings. - regex = re.compile(br"(\d+) ([^=]+)=") - pos = 0 - while True: - match = regex.match(buf, pos) - if not match: - break - - length, keyword = match.groups() - length = int(length) - value = buf[match.end(2) + 1:match.start(1) + length - 1] - - # Normally, we could just use "utf8" as the encoding and "strict" - # as the error handler, but we better not take the risk. For - # example, GNU tar <= 1.23 is known to store filenames it cannot - # translate to UTF-8 as raw strings (unfortunately without a - # hdrcharset=BINARY header). - # We first try the strict standard encoding, and if that fails we - # fall back on the user's encoding and error handler. - keyword = self._decode_pax_field(keyword, "utf8", "utf8", - tarfile.errors) - if keyword in PAX_NAME_FIELDS: - value = self._decode_pax_field(value, encoding, tarfile.encoding, - tarfile.errors) - else: - value = self._decode_pax_field(value, "utf8", "utf8", - tarfile.errors) - - pax_headers[keyword] = value - pos += length - - # Fetch the next header. - try: - next = self.fromtarfile(tarfile) - except HeaderError: - raise SubsequentHeaderError("missing or bad subsequent header") - - # Process GNU sparse information. - if "GNU.sparse.map" in pax_headers: - # GNU extended sparse format version 0.1. - self._proc_gnusparse_01(next, pax_headers) - - elif "GNU.sparse.size" in pax_headers: - # GNU extended sparse format version 0.0. - self._proc_gnusparse_00(next, pax_headers, buf) - - elif pax_headers.get("GNU.sparse.major") == "1" and pax_headers.get("GNU.sparse.minor") == "0": - # GNU extended sparse format version 1.0. - self._proc_gnusparse_10(next, pax_headers, tarfile) - - if self.type in (XHDTYPE, SOLARIS_XHDTYPE): - # Patch the TarInfo object with the extended header info. - next._apply_pax_info(pax_headers, tarfile.encoding, tarfile.errors) - next.offset = self.offset - - if "size" in pax_headers: - # If the extended header replaces the size field, - # we need to recalculate the offset where the next - # header starts. - offset = next.offset_data - if next.isreg() or next.type not in SUPPORTED_TYPES: - offset += next._block(next.size) - tarfile.offset = offset - - return next - - def _proc_gnusparse_00(self, next, pax_headers, buf): - """Process a GNU tar extended sparse header, version 0.0. - """ - offsets = [] - for match in re.finditer(br"\d+ GNU.sparse.offset=(\d+)\n", buf): - offsets.append(int(match.group(1))) - numbytes = [] - for match in re.finditer(br"\d+ GNU.sparse.numbytes=(\d+)\n", buf): - numbytes.append(int(match.group(1))) - next.sparse = list(zip(offsets, numbytes)) - - def _proc_gnusparse_01(self, next, pax_headers): - """Process a GNU tar extended sparse header, version 0.1. - """ - sparse = [int(x) for x in pax_headers["GNU.sparse.map"].split(",")] - next.sparse = list(zip(sparse[::2], sparse[1::2])) - - def _proc_gnusparse_10(self, next, pax_headers, tarfile): - """Process a GNU tar extended sparse header, version 1.0. - """ - fields = None - sparse = [] - buf = tarfile.fileobj.read(BLOCKSIZE) - fields, buf = buf.split(b"\n", 1) - fields = int(fields) - while len(sparse) < fields * 2: - if b"\n" not in buf: - buf += tarfile.fileobj.read(BLOCKSIZE) - number, buf = buf.split(b"\n", 1) - sparse.append(int(number)) - next.offset_data = tarfile.fileobj.tell() - next.sparse = list(zip(sparse[::2], sparse[1::2])) - - def _apply_pax_info(self, pax_headers, encoding, errors): - """Replace fields with supplemental information from a previous - pax extended or global header. - """ - for keyword, value in pax_headers.items(): - if keyword == "GNU.sparse.name": - setattr(self, "path", value) - elif keyword == "GNU.sparse.size": - setattr(self, "size", int(value)) - elif keyword == "GNU.sparse.realsize": - setattr(self, "size", int(value)) - elif keyword in PAX_FIELDS: - if keyword in PAX_NUMBER_FIELDS: - try: - value = PAX_NUMBER_FIELDS[keyword](value) - except ValueError: - value = 0 - if keyword == "path": - value = value.rstrip("/") - setattr(self, keyword, value) - - self.pax_headers = pax_headers.copy() - - def _decode_pax_field(self, value, encoding, fallback_encoding, fallback_errors): - """Decode a single field from a pax record. - """ - try: - return value.decode(encoding, "strict") - except UnicodeDecodeError: - return value.decode(fallback_encoding, fallback_errors) - - def _block(self, count): - """Round up a byte count by BLOCKSIZE and return it, - e.g. _block(834) => 1024. - """ - blocks, remainder = divmod(count, BLOCKSIZE) - if remainder: - blocks += 1 - return blocks * BLOCKSIZE - - def isreg(self): - return self.type in REGULAR_TYPES - def isfile(self): - return self.isreg() - def isdir(self): - return self.type == DIRTYPE - def issym(self): - return self.type == SYMTYPE - def islnk(self): - return self.type == LNKTYPE - def ischr(self): - return self.type == CHRTYPE - def isblk(self): - return self.type == BLKTYPE - def isfifo(self): - return self.type == FIFOTYPE - def issparse(self): - return self.sparse is not None - def isdev(self): - return self.type in (CHRTYPE, BLKTYPE, FIFOTYPE) -# class TarInfo - -class TarFile(object): - """The TarFile Class provides an interface to tar archives. - """ - - debug = 0 # May be set from 0 (no msgs) to 3 (all msgs) - - dereference = False # If true, add content of linked file to the - # tar file, else the link. - - ignore_zeros = False # If true, skips empty or invalid blocks and - # continues processing. - - errorlevel = 1 # If 0, fatal errors only appear in debug - # messages (if debug >= 0). If > 0, errors - # are passed to the caller as exceptions. - - format = DEFAULT_FORMAT # The format to use when creating an archive. - - encoding = ENCODING # Encoding for 8-bit character strings. - - errors = None # Error handler for unicode conversion. - - tarinfo = TarInfo # The default TarInfo class to use. - - fileobject = ExFileObject # The default ExFileObject class to use. - - def __init__(self, name=None, mode="r", fileobj=None, format=None, - tarinfo=None, dereference=None, ignore_zeros=None, encoding=None, - errors="surrogateescape", pax_headers=None, debug=None, errorlevel=None): - """Open an (uncompressed) tar archive `name'. `mode' is either 'r' to - read from an existing archive, 'a' to append data to an existing - file or 'w' to create a new file overwriting an existing one. `mode' - defaults to 'r'. - If `fileobj' is given, it is used for reading or writing data. If it - can be determined, `mode' is overridden by `fileobj's mode. - `fileobj' is not closed, when TarFile is closed. - """ - if len(mode) > 1 or mode not in "raw": - raise ValueError("mode must be 'r', 'a' or 'w'") - self.mode = mode - self._mode = {"r": "rb", "a": "r+b", "w": "wb"}[mode] - - if not fileobj: - if self.mode == "a" and not os.path.exists(name): - # Create nonexistent files in append mode. - self.mode = "w" - self._mode = "wb" - fileobj = bltn_open(name, self._mode) - self._extfileobj = False - else: - if name is None and hasattr(fileobj, "name"): - name = fileobj.name - if hasattr(fileobj, "mode"): - self._mode = fileobj.mode - self._extfileobj = True - self.name = os.path.abspath(name) if name else None - self.fileobj = fileobj - - # Init attributes. - if format is not None: - self.format = format - if tarinfo is not None: - self.tarinfo = tarinfo - if dereference is not None: - self.dereference = dereference - if ignore_zeros is not None: - self.ignore_zeros = ignore_zeros - if encoding is not None: - self.encoding = encoding - self.errors = errors - - if pax_headers is not None and self.format == PAX_FORMAT: - self.pax_headers = pax_headers - else: - self.pax_headers = {} - - if debug is not None: - self.debug = debug - if errorlevel is not None: - self.errorlevel = errorlevel - - # Init datastructures. - self.closed = False - self.members = [] # list of members as TarInfo objects - self._loaded = False # flag if all members have been read - self.offset = self.fileobj.tell() - # current position in the archive file - self.inodes = {} # dictionary caching the inodes of - # archive members already added - - try: - if self.mode == "r": - self.firstmember = None - self.firstmember = self.next() - - if self.mode == "a": - # Move to the end of the archive, - # before the first empty block. - while True: - self.fileobj.seek(self.offset) - try: - tarinfo = self.tarinfo.fromtarfile(self) - self.members.append(tarinfo) - except EOFHeaderError: - self.fileobj.seek(self.offset) - break - except HeaderError as e: - raise ReadError(str(e)) - - if self.mode in "aw": - self._loaded = True - - if self.pax_headers: - buf = self.tarinfo.create_pax_global_header(self.pax_headers.copy()) - self.fileobj.write(buf) - self.offset += len(buf) - except: - if not self._extfileobj: - self.fileobj.close() - self.closed = True - raise - - #-------------------------------------------------------------------------- - # Below are the classmethods which act as alternate constructors to the - # TarFile class. The open() method is the only one that is needed for - # public use; it is the "super"-constructor and is able to select an - # adequate "sub"-constructor for a particular compression using the mapping - # from OPEN_METH. - # - # This concept allows one to subclass TarFile without losing the comfort of - # the super-constructor. A sub-constructor is registered and made available - # by adding it to the mapping in OPEN_METH. - - @classmethod - def open(cls, name=None, mode="r", fileobj=None, bufsize=RECORDSIZE, **kwargs): - """Open a tar archive for reading, writing or appending. Return - an appropriate TarFile class. - - mode: - 'r' or 'r:*' open for reading with transparent compression - 'r:' open for reading exclusively uncompressed - 'r:gz' open for reading with gzip compression - 'r:bz2' open for reading with bzip2 compression - 'a' or 'a:' open for appending, creating the file if necessary - 'w' or 'w:' open for writing without compression - 'w:gz' open for writing with gzip compression - 'w:bz2' open for writing with bzip2 compression - - 'r|*' open a stream of tar blocks with transparent compression - 'r|' open an uncompressed stream of tar blocks for reading - 'r|gz' open a gzip compressed stream of tar blocks - 'r|bz2' open a bzip2 compressed stream of tar blocks - 'w|' open an uncompressed stream for writing - 'w|gz' open a gzip compressed stream for writing - 'w|bz2' open a bzip2 compressed stream for writing - """ - - if not name and not fileobj: - raise ValueError("nothing to open") - - if mode in ("r", "r:*"): - # Find out which *open() is appropriate for opening the file. - for comptype in cls.OPEN_METH: - func = getattr(cls, cls.OPEN_METH[comptype]) - if fileobj is not None: - saved_pos = fileobj.tell() - try: - return func(name, "r", fileobj, **kwargs) - except (ReadError, CompressionError) as e: - if fileobj is not None: - fileobj.seek(saved_pos) - continue - raise ReadError("file could not be opened successfully") - - elif ":" in mode: - filemode, comptype = mode.split(":", 1) - filemode = filemode or "r" - comptype = comptype or "tar" - - # Select the *open() function according to - # given compression. - if comptype in cls.OPEN_METH: - func = getattr(cls, cls.OPEN_METH[comptype]) - else: - raise CompressionError("unknown compression type %r" % comptype) - return func(name, filemode, fileobj, **kwargs) - - elif "|" in mode: - filemode, comptype = mode.split("|", 1) - filemode = filemode or "r" - comptype = comptype or "tar" - - if filemode not in "rw": - raise ValueError("mode must be 'r' or 'w'") - - stream = _Stream(name, filemode, comptype, fileobj, bufsize) - try: - t = cls(name, filemode, stream, **kwargs) - except: - stream.close() - raise - t._extfileobj = False - return t - - elif mode in "aw": - return cls.taropen(name, mode, fileobj, **kwargs) - - raise ValueError("undiscernible mode") - - @classmethod - def taropen(cls, name, mode="r", fileobj=None, **kwargs): - """Open uncompressed tar archive name for reading or writing. - """ - if len(mode) > 1 or mode not in "raw": - raise ValueError("mode must be 'r', 'a' or 'w'") - return cls(name, mode, fileobj, **kwargs) - - @classmethod - def gzopen(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs): - """Open gzip compressed tar archive name for reading or writing. - Appending is not allowed. - """ - if len(mode) > 1 or mode not in "rw": - raise ValueError("mode must be 'r' or 'w'") - - try: - import gzip - gzip.GzipFile - except (ImportError, AttributeError): - raise CompressionError("gzip module is not available") - - extfileobj = fileobj is not None - try: - fileobj = gzip.GzipFile(name, mode + "b", compresslevel, fileobj) - t = cls.taropen(name, mode, fileobj, **kwargs) - except IOError: - if not extfileobj and fileobj is not None: - fileobj.close() - if fileobj is None: - raise - raise ReadError("not a gzip file") - except: - if not extfileobj and fileobj is not None: - fileobj.close() - raise - t._extfileobj = extfileobj - return t - - @classmethod - def bz2open(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs): - """Open bzip2 compressed tar archive name for reading or writing. - Appending is not allowed. - """ - if len(mode) > 1 or mode not in "rw": - raise ValueError("mode must be 'r' or 'w'.") - - try: - import bz2 - except ImportError: - raise CompressionError("bz2 module is not available") - - if fileobj is not None: - fileobj = _BZ2Proxy(fileobj, mode) - else: - fileobj = bz2.BZ2File(name, mode, compresslevel=compresslevel) - - try: - t = cls.taropen(name, mode, fileobj, **kwargs) - except (IOError, EOFError): - fileobj.close() - raise ReadError("not a bzip2 file") - t._extfileobj = False - return t - - # All *open() methods are registered here. - OPEN_METH = { - "tar": "taropen", # uncompressed tar - "gz": "gzopen", # gzip compressed tar - "bz2": "bz2open" # bzip2 compressed tar - } - - #-------------------------------------------------------------------------- - # The public methods which TarFile provides: - - def close(self): - """Close the TarFile. In write-mode, two finishing zero blocks are - appended to the archive. - """ - if self.closed: - return - - if self.mode in "aw": - self.fileobj.write(NUL * (BLOCKSIZE * 2)) - self.offset += (BLOCKSIZE * 2) - # fill up the end with zero-blocks - # (like option -b20 for tar does) - blocks, remainder = divmod(self.offset, RECORDSIZE) - if remainder > 0: - self.fileobj.write(NUL * (RECORDSIZE - remainder)) - - if not self._extfileobj: - self.fileobj.close() - self.closed = True - - def getmember(self, name): - """Return a TarInfo object for member `name'. If `name' can not be - found in the archive, KeyError is raised. If a member occurs more - than once in the archive, its last occurrence is assumed to be the - most up-to-date version. - """ - tarinfo = self._getmember(name) - if tarinfo is None: - raise KeyError("filename %r not found" % name) - return tarinfo - - def getmembers(self): - """Return the members of the archive as a list of TarInfo objects. The - list has the same order as the members in the archive. - """ - self._check() - if not self._loaded: # if we want to obtain a list of - self._load() # all members, we first have to - # scan the whole archive. - return self.members - - def getnames(self): - """Return the members of the archive as a list of their names. It has - the same order as the list returned by getmembers(). - """ - return [tarinfo.name for tarinfo in self.getmembers()] - - def gettarinfo(self, name=None, arcname=None, fileobj=None): - """Create a TarInfo object for either the file `name' or the file - object `fileobj' (using os.fstat on its file descriptor). You can - modify some of the TarInfo's attributes before you add it using - addfile(). If given, `arcname' specifies an alternative name for the - file in the archive. - """ - self._check("aw") - - # When fileobj is given, replace name by - # fileobj's real name. - if fileobj is not None: - name = fileobj.name - - # Building the name of the member in the archive. - # Backward slashes are converted to forward slashes, - # Absolute paths are turned to relative paths. - if arcname is None: - arcname = name - drv, arcname = os.path.splitdrive(arcname) - arcname = arcname.replace(os.sep, "/") - arcname = arcname.lstrip("/") - - # Now, fill the TarInfo object with - # information specific for the file. - tarinfo = self.tarinfo() - tarinfo.tarfile = self - - # Use os.stat or os.lstat, depending on platform - # and if symlinks shall be resolved. - if fileobj is None: - if hasattr(os, "lstat") and not self.dereference: - statres = os.lstat(name) - else: - statres = os.stat(name) - else: - statres = os.fstat(fileobj.fileno()) - linkname = "" - - stmd = statres.st_mode - if stat.S_ISREG(stmd): - inode = (statres.st_ino, statres.st_dev) - if not self.dereference and statres.st_nlink > 1 and \ - inode in self.inodes and arcname != self.inodes[inode]: - # Is it a hardlink to an already - # archived file? - type = LNKTYPE - linkname = self.inodes[inode] - else: - # The inode is added only if its valid. - # For win32 it is always 0. - type = REGTYPE - if inode[0]: - self.inodes[inode] = arcname - elif stat.S_ISDIR(stmd): - type = DIRTYPE - elif stat.S_ISFIFO(stmd): - type = FIFOTYPE - elif stat.S_ISLNK(stmd): - type = SYMTYPE - linkname = os.readlink(name) - elif stat.S_ISCHR(stmd): - type = CHRTYPE - elif stat.S_ISBLK(stmd): - type = BLKTYPE - else: - return None - - # Fill the TarInfo object with all - # information we can get. - tarinfo.name = arcname - tarinfo.mode = stmd - tarinfo.uid = statres.st_uid - tarinfo.gid = statres.st_gid - if type == REGTYPE: - tarinfo.size = statres.st_size - else: - tarinfo.size = 0 - tarinfo.mtime = statres.st_mtime - tarinfo.type = type - tarinfo.linkname = linkname - if pwd: - try: - tarinfo.uname = pwd.getpwuid(tarinfo.uid)[0] - except KeyError: - pass - if grp: - try: - tarinfo.gname = grp.getgrgid(tarinfo.gid)[0] - except KeyError: - pass - - if type in (CHRTYPE, BLKTYPE): - if hasattr(os, "major") and hasattr(os, "minor"): - tarinfo.devmajor = os.major(statres.st_rdev) - tarinfo.devminor = os.minor(statres.st_rdev) - return tarinfo - - def list(self, verbose=True): - """Print a table of contents to sys.stdout. If `verbose' is False, only - the names of the members are printed. If it is True, an `ls -l'-like - output is produced. - """ - self._check() - - for tarinfo in self: - if verbose: - print(filemode(tarinfo.mode), end=' ') - print("%s/%s" % (tarinfo.uname or tarinfo.uid, - tarinfo.gname or tarinfo.gid), end=' ') - if tarinfo.ischr() or tarinfo.isblk(): - print("%10s" % ("%d,%d" \ - % (tarinfo.devmajor, tarinfo.devminor)), end=' ') - else: - print("%10d" % tarinfo.size, end=' ') - print("%d-%02d-%02d %02d:%02d:%02d" \ - % time.localtime(tarinfo.mtime)[:6], end=' ') - - print(tarinfo.name + ("/" if tarinfo.isdir() else ""), end=' ') - - if verbose: - if tarinfo.issym(): - print("->", tarinfo.linkname, end=' ') - if tarinfo.islnk(): - print("link to", tarinfo.linkname, end=' ') - print() - - def add(self, name, arcname=None, recursive=True, exclude=None, filter=None): - """Add the file `name' to the archive. `name' may be any type of file - (directory, fifo, symbolic link, etc.). If given, `arcname' - specifies an alternative name for the file in the archive. - Directories are added recursively by default. This can be avoided by - setting `recursive' to False. `exclude' is a function that should - return True for each filename to be excluded. `filter' is a function - that expects a TarInfo object argument and returns the changed - TarInfo object, if it returns None the TarInfo object will be - excluded from the archive. - """ - self._check("aw") - - if arcname is None: - arcname = name - - # Exclude pathnames. - if exclude is not None: - import warnings - warnings.warn("use the filter argument instead", - DeprecationWarning, 2) - if exclude(name): - self._dbg(2, "tarfile: Excluded %r" % name) - return - - # Skip if somebody tries to archive the archive... - if self.name is not None and os.path.abspath(name) == self.name: - self._dbg(2, "tarfile: Skipped %r" % name) - return - - self._dbg(1, name) - - # Create a TarInfo object from the file. - tarinfo = self.gettarinfo(name, arcname) - - if tarinfo is None: - self._dbg(1, "tarfile: Unsupported type %r" % name) - return - - # Change or exclude the TarInfo object. - if filter is not None: - tarinfo = filter(tarinfo) - if tarinfo is None: - self._dbg(2, "tarfile: Excluded %r" % name) - return - - # Append the tar header and data to the archive. - if tarinfo.isreg(): - f = bltn_open(name, "rb") - self.addfile(tarinfo, f) - f.close() - - elif tarinfo.isdir(): - self.addfile(tarinfo) - if recursive: - for f in os.listdir(name): - self.add(os.path.join(name, f), os.path.join(arcname, f), - recursive, exclude, filter=filter) - - else: - self.addfile(tarinfo) - - def addfile(self, tarinfo, fileobj=None): - """Add the TarInfo object `tarinfo' to the archive. If `fileobj' is - given, tarinfo.size bytes are read from it and added to the archive. - You can create TarInfo objects using gettarinfo(). - On Windows platforms, `fileobj' should always be opened with mode - 'rb' to avoid irritation about the file size. - """ - self._check("aw") - - tarinfo = copy.copy(tarinfo) - - buf = tarinfo.tobuf(self.format, self.encoding, self.errors) - self.fileobj.write(buf) - self.offset += len(buf) - - # If there's data to follow, append it. - if fileobj is not None: - copyfileobj(fileobj, self.fileobj, tarinfo.size) - blocks, remainder = divmod(tarinfo.size, BLOCKSIZE) - if remainder > 0: - self.fileobj.write(NUL * (BLOCKSIZE - remainder)) - blocks += 1 - self.offset += blocks * BLOCKSIZE - - self.members.append(tarinfo) - - def extractall(self, path=".", members=None): - """Extract all members from the archive to the current working - directory and set owner, modification time and permissions on - directories afterwards. `path' specifies a different directory - to extract to. `members' is optional and must be a subset of the - list returned by getmembers(). - """ - directories = [] - - if members is None: - members = self - - for tarinfo in members: - if tarinfo.isdir(): - # Extract directories with a safe mode. - directories.append(tarinfo) - tarinfo = copy.copy(tarinfo) - tarinfo.mode = 0o700 - # Do not set_attrs directories, as we will do that further down - self.extract(tarinfo, path, set_attrs=not tarinfo.isdir()) - - # Reverse sort directories. - directories.sort(key=lambda a: a.name) - directories.reverse() - - # Set correct owner, mtime and filemode on directories. - for tarinfo in directories: - dirpath = os.path.join(path, tarinfo.name) - try: - self.chown(tarinfo, dirpath) - self.utime(tarinfo, dirpath) - self.chmod(tarinfo, dirpath) - except ExtractError as e: - if self.errorlevel > 1: - raise - else: - self._dbg(1, "tarfile: %s" % e) - - def extract(self, member, path="", set_attrs=True): - """Extract a member from the archive to the current working directory, - using its full name. Its file information is extracted as accurately - as possible. `member' may be a filename or a TarInfo object. You can - specify a different directory using `path'. File attributes (owner, - mtime, mode) are set unless `set_attrs' is False. - """ - self._check("r") - - if isinstance(member, str): - tarinfo = self.getmember(member) - else: - tarinfo = member - - # Prepare the link target for makelink(). - if tarinfo.islnk(): - tarinfo._link_target = os.path.join(path, tarinfo.linkname) - - try: - self._extract_member(tarinfo, os.path.join(path, tarinfo.name), - set_attrs=set_attrs) - except EnvironmentError as e: - if self.errorlevel > 0: - raise - else: - if e.filename is None: - self._dbg(1, "tarfile: %s" % e.strerror) - else: - self._dbg(1, "tarfile: %s %r" % (e.strerror, e.filename)) - except ExtractError as e: - if self.errorlevel > 1: - raise - else: - self._dbg(1, "tarfile: %s" % e) - - def extractfile(self, member): - """Extract a member from the archive as a file object. `member' may be - a filename or a TarInfo object. If `member' is a regular file, a - file-like object is returned. If `member' is a link, a file-like - object is constructed from the link's target. If `member' is none of - the above, None is returned. - The file-like object is read-only and provides the following - methods: read(), readline(), readlines(), seek() and tell() - """ - self._check("r") - - if isinstance(member, str): - tarinfo = self.getmember(member) - else: - tarinfo = member - - if tarinfo.isreg(): - return self.fileobject(self, tarinfo) - - elif tarinfo.type not in SUPPORTED_TYPES: - # If a member's type is unknown, it is treated as a - # regular file. - return self.fileobject(self, tarinfo) - - elif tarinfo.islnk() or tarinfo.issym(): - if isinstance(self.fileobj, _Stream): - # A small but ugly workaround for the case that someone tries - # to extract a (sym)link as a file-object from a non-seekable - # stream of tar blocks. - raise StreamError("cannot extract (sym)link as file object") - else: - # A (sym)link's file object is its target's file object. - return self.extractfile(self._find_link_target(tarinfo)) - else: - # If there's no data associated with the member (directory, chrdev, - # blkdev, etc.), return None instead of a file object. - return None - - def _extract_member(self, tarinfo, targetpath, set_attrs=True): - """Extract the TarInfo object tarinfo to a physical - file called targetpath. - """ - # Fetch the TarInfo object for the given name - # and build the destination pathname, replacing - # forward slashes to platform specific separators. - targetpath = targetpath.rstrip("/") - targetpath = targetpath.replace("/", os.sep) - - # Create all upper directories. - upperdirs = os.path.dirname(targetpath) - if upperdirs and not os.path.exists(upperdirs): - # Create directories that are not part of the archive with - # default permissions. - os.makedirs(upperdirs) - - if tarinfo.islnk() or tarinfo.issym(): - self._dbg(1, "%s -> %s" % (tarinfo.name, tarinfo.linkname)) - else: - self._dbg(1, tarinfo.name) - - if tarinfo.isreg(): - self.makefile(tarinfo, targetpath) - elif tarinfo.isdir(): - self.makedir(tarinfo, targetpath) - elif tarinfo.isfifo(): - self.makefifo(tarinfo, targetpath) - elif tarinfo.ischr() or tarinfo.isblk(): - self.makedev(tarinfo, targetpath) - elif tarinfo.islnk() or tarinfo.issym(): - self.makelink(tarinfo, targetpath) - elif tarinfo.type not in SUPPORTED_TYPES: - self.makeunknown(tarinfo, targetpath) - else: - self.makefile(tarinfo, targetpath) - - if set_attrs: - self.chown(tarinfo, targetpath) - if not tarinfo.issym(): - self.chmod(tarinfo, targetpath) - self.utime(tarinfo, targetpath) - - #-------------------------------------------------------------------------- - # Below are the different file methods. They are called via - # _extract_member() when extract() is called. They can be replaced in a - # subclass to implement other functionality. - - def makedir(self, tarinfo, targetpath): - """Make a directory called targetpath. - """ - try: - # Use a safe mode for the directory, the real mode is set - # later in _extract_member(). - os.mkdir(targetpath, 0o700) - except EnvironmentError as e: - if e.errno != errno.EEXIST: - raise - - def makefile(self, tarinfo, targetpath): - """Make a file called targetpath. - """ - source = self.fileobj - source.seek(tarinfo.offset_data) - target = bltn_open(targetpath, "wb") - if tarinfo.sparse is not None: - for offset, size in tarinfo.sparse: - target.seek(offset) - copyfileobj(source, target, size) - else: - copyfileobj(source, target, tarinfo.size) - target.seek(tarinfo.size) - target.truncate() - target.close() - - def makeunknown(self, tarinfo, targetpath): - """Make a file from a TarInfo object with an unknown type - at targetpath. - """ - self.makefile(tarinfo, targetpath) - self._dbg(1, "tarfile: Unknown file type %r, " \ - "extracted as regular file." % tarinfo.type) - - def makefifo(self, tarinfo, targetpath): - """Make a fifo called targetpath. - """ - if hasattr(os, "mkfifo"): - os.mkfifo(targetpath) - else: - raise ExtractError("fifo not supported by system") - - def makedev(self, tarinfo, targetpath): - """Make a character or block device called targetpath. - """ - if not hasattr(os, "mknod") or not hasattr(os, "makedev"): - raise ExtractError("special devices not supported by system") - - mode = tarinfo.mode - if tarinfo.isblk(): - mode |= stat.S_IFBLK - else: - mode |= stat.S_IFCHR - - os.mknod(targetpath, mode, - os.makedev(tarinfo.devmajor, tarinfo.devminor)) - - def makelink(self, tarinfo, targetpath): - """Make a (symbolic) link called targetpath. If it cannot be created - (platform limitation), we try to make a copy of the referenced file - instead of a link. - """ - try: - # For systems that support symbolic and hard links. - if tarinfo.issym(): - os.symlink(tarinfo.linkname, targetpath) - else: - # See extract(). - if os.path.exists(tarinfo._link_target): - os.link(tarinfo._link_target, targetpath) - else: - self._extract_member(self._find_link_target(tarinfo), - targetpath) - except symlink_exception: - if tarinfo.issym(): - linkpath = os.path.join(os.path.dirname(tarinfo.name), - tarinfo.linkname) - else: - linkpath = tarinfo.linkname - else: - try: - self._extract_member(self._find_link_target(tarinfo), - targetpath) - except KeyError: - raise ExtractError("unable to resolve link inside archive") - - def chown(self, tarinfo, targetpath): - """Set owner of targetpath according to tarinfo. - """ - if pwd and hasattr(os, "geteuid") and os.geteuid() == 0: - # We have to be root to do so. - try: - g = grp.getgrnam(tarinfo.gname)[2] - except KeyError: - g = tarinfo.gid - try: - u = pwd.getpwnam(tarinfo.uname)[2] - except KeyError: - u = tarinfo.uid - try: - if tarinfo.issym() and hasattr(os, "lchown"): - os.lchown(targetpath, u, g) - else: - if sys.platform != "os2emx": - os.chown(targetpath, u, g) - except EnvironmentError as e: - raise ExtractError("could not change owner") - - def chmod(self, tarinfo, targetpath): - """Set file permissions of targetpath according to tarinfo. - """ - if hasattr(os, 'chmod'): - try: - os.chmod(targetpath, tarinfo.mode) - except EnvironmentError as e: - raise ExtractError("could not change mode") - - def utime(self, tarinfo, targetpath): - """Set modification time of targetpath according to tarinfo. - """ - if not hasattr(os, 'utime'): - return - try: - os.utime(targetpath, (tarinfo.mtime, tarinfo.mtime)) - except EnvironmentError as e: - raise ExtractError("could not change modification time") - - #-------------------------------------------------------------------------- - def next(self): - """Return the next member of the archive as a TarInfo object, when - TarFile is opened for reading. Return None if there is no more - available. - """ - self._check("ra") - if self.firstmember is not None: - m = self.firstmember - self.firstmember = None - return m - - # Read the next block. - self.fileobj.seek(self.offset) - tarinfo = None - while True: - try: - tarinfo = self.tarinfo.fromtarfile(self) - except EOFHeaderError as e: - if self.ignore_zeros: - self._dbg(2, "0x%X: %s" % (self.offset, e)) - self.offset += BLOCKSIZE - continue - except InvalidHeaderError as e: - if self.ignore_zeros: - self._dbg(2, "0x%X: %s" % (self.offset, e)) - self.offset += BLOCKSIZE - continue - elif self.offset == 0: - raise ReadError(str(e)) - except EmptyHeaderError: - if self.offset == 0: - raise ReadError("empty file") - except TruncatedHeaderError as e: - if self.offset == 0: - raise ReadError(str(e)) - except SubsequentHeaderError as e: - raise ReadError(str(e)) - break - - if tarinfo is not None: - self.members.append(tarinfo) - else: - self._loaded = True - - return tarinfo - - #-------------------------------------------------------------------------- - # Little helper methods: - - def _getmember(self, name, tarinfo=None, normalize=False): - """Find an archive member by name from bottom to top. - If tarinfo is given, it is used as the starting point. - """ - # Ensure that all members have been loaded. - members = self.getmembers() - - # Limit the member search list up to tarinfo. - if tarinfo is not None: - members = members[:members.index(tarinfo)] - - if normalize: - name = os.path.normpath(name) - - for member in reversed(members): - if normalize: - member_name = os.path.normpath(member.name) - else: - member_name = member.name - - if name == member_name: - return member - - def _load(self): - """Read through the entire archive file and look for readable - members. - """ - while True: - tarinfo = self.next() - if tarinfo is None: - break - self._loaded = True - - def _check(self, mode=None): - """Check if TarFile is still open, and if the operation's mode - corresponds to TarFile's mode. - """ - if self.closed: - raise IOError("%s is closed" % self.__class__.__name__) - if mode is not None and self.mode not in mode: - raise IOError("bad operation for mode %r" % self.mode) - - def _find_link_target(self, tarinfo): - """Find the target member of a symlink or hardlink member in the - archive. - """ - if tarinfo.issym(): - # Always search the entire archive. - linkname = os.path.dirname(tarinfo.name) + "/" + tarinfo.linkname - limit = None - else: - # Search the archive before the link, because a hard link is - # just a reference to an already archived file. - linkname = tarinfo.linkname - limit = tarinfo - - member = self._getmember(linkname, tarinfo=limit, normalize=True) - if member is None: - raise KeyError("linkname %r not found" % linkname) - return member - - def __iter__(self): - """Provide an iterator object. - """ - if self._loaded: - return iter(self.members) - else: - return TarIter(self) - - def _dbg(self, level, msg): - """Write debugging output to sys.stderr. - """ - if level <= self.debug: - print(msg, file=sys.stderr) - - def __enter__(self): - self._check() - return self - - def __exit__(self, type, value, traceback): - if type is None: - self.close() - else: - # An exception occurred. We must not call close() because - # it would try to write end-of-archive blocks and padding. - if not self._extfileobj: - self.fileobj.close() - self.closed = True -# class TarFile - -class TarIter(object): - """Iterator Class. - - for tarinfo in TarFile(...): - suite... - """ - - def __init__(self, tarfile): - """Construct a TarIter object. - """ - self.tarfile = tarfile - self.index = 0 - def __iter__(self): - """Return iterator object. - """ - return self - - def __next__(self): - """Return the next item using TarFile's next() method. - When all members have been read, set TarFile as _loaded. - """ - # Fix for SF #1100429: Under rare circumstances it can - # happen that getmembers() is called during iteration, - # which will cause TarIter to stop prematurely. - if not self.tarfile._loaded: - tarinfo = self.tarfile.next() - if not tarinfo: - self.tarfile._loaded = True - raise StopIteration - else: - try: - tarinfo = self.tarfile.members[self.index] - except IndexError: - raise StopIteration - self.index += 1 - return tarinfo - - next = __next__ # for Python 2.x - -#-------------------- -# exported functions -#-------------------- -def is_tarfile(name): - """Return True if name points to a tar archive that we - are able to handle, else return False. - """ - try: - t = open(name) - t.close() - return True - except TarError: - return False - -bltn_open = open -open = TarFile.open diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/compat.py b/env/lib/python3.7/site-packages/pip/_vendor/distlib/compat.py deleted file mode 100644 index ff328c8..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/distlib/compat.py +++ /dev/null @@ -1,1120 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2013-2017 Vinay Sajip. -# Licensed to the Python Software Foundation under a contributor agreement. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -from __future__ import absolute_import - -import os -import re -import sys - -try: - import ssl -except ImportError: # pragma: no cover - ssl = None - -if sys.version_info[0] < 3: # pragma: no cover - from StringIO import StringIO - string_types = basestring, - text_type = unicode - from types import FileType as file_type - import __builtin__ as builtins - import ConfigParser as configparser - from ._backport import shutil - from urlparse import urlparse, urlunparse, urljoin, urlsplit, urlunsplit - from urllib import (urlretrieve, quote as _quote, unquote, url2pathname, - pathname2url, ContentTooShortError, splittype) - - def quote(s): - if isinstance(s, unicode): - s = s.encode('utf-8') - return _quote(s) - - import urllib2 - from urllib2 import (Request, urlopen, URLError, HTTPError, - HTTPBasicAuthHandler, HTTPPasswordMgr, - HTTPHandler, HTTPRedirectHandler, - build_opener) - if ssl: - from urllib2 import HTTPSHandler - import httplib - import xmlrpclib - import Queue as queue - from HTMLParser import HTMLParser - import htmlentitydefs - raw_input = raw_input - from itertools import ifilter as filter - from itertools import ifilterfalse as filterfalse - - _userprog = None - def splituser(host): - """splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.""" - global _userprog - if _userprog is None: - import re - _userprog = re.compile('^(.*)@(.*)$') - - match = _userprog.match(host) - if match: return match.group(1, 2) - return None, host - -else: # pragma: no cover - from io import StringIO - string_types = str, - text_type = str - from io import TextIOWrapper as file_type - import builtins - import configparser - import shutil - from urllib.parse import (urlparse, urlunparse, urljoin, splituser, quote, - unquote, urlsplit, urlunsplit, splittype) - from urllib.request import (urlopen, urlretrieve, Request, url2pathname, - pathname2url, - HTTPBasicAuthHandler, HTTPPasswordMgr, - HTTPHandler, HTTPRedirectHandler, - build_opener) - if ssl: - from urllib.request import HTTPSHandler - from urllib.error import HTTPError, URLError, ContentTooShortError - import http.client as httplib - import urllib.request as urllib2 - import xmlrpc.client as xmlrpclib - import queue - from html.parser import HTMLParser - import html.entities as htmlentitydefs - raw_input = input - from itertools import filterfalse - filter = filter - -try: - from ssl import match_hostname, CertificateError -except ImportError: # pragma: no cover - class CertificateError(ValueError): - pass - - - def _dnsname_match(dn, hostname, max_wildcards=1): - """Matching according to RFC 6125, section 6.4.3 - - http://tools.ietf.org/html/rfc6125#section-6.4.3 - """ - pats = [] - if not dn: - return False - - parts = dn.split('.') - leftmost, remainder = parts[0], parts[1:] - - wildcards = leftmost.count('*') - if wildcards > max_wildcards: - # Issue #17980: avoid denials of service by refusing more - # than one wildcard per fragment. A survey of established - # policy among SSL implementations showed it to be a - # reasonable choice. - raise CertificateError( - "too many wildcards in certificate DNS name: " + repr(dn)) - - # speed up common case w/o wildcards - if not wildcards: - return dn.lower() == hostname.lower() - - # RFC 6125, section 6.4.3, subitem 1. - # The client SHOULD NOT attempt to match a presented identifier in which - # the wildcard character comprises a label other than the left-most label. - if leftmost == '*': - # When '*' is a fragment by itself, it matches a non-empty dotless - # fragment. - pats.append('[^.]+') - elif leftmost.startswith('xn--') or hostname.startswith('xn--'): - # RFC 6125, section 6.4.3, subitem 3. - # The client SHOULD NOT attempt to match a presented identifier - # where the wildcard character is embedded within an A-label or - # U-label of an internationalized domain name. - pats.append(re.escape(leftmost)) - else: - # Otherwise, '*' matches any dotless string, e.g. www* - pats.append(re.escape(leftmost).replace(r'\*', '[^.]*')) - - # add the remaining fragments, ignore any wildcards - for frag in remainder: - pats.append(re.escape(frag)) - - pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) - return pat.match(hostname) - - - def match_hostname(cert, hostname): - """Verify that *cert* (in decoded format as returned by - SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 - rules are followed, but IP addresses are not accepted for *hostname*. - - CertificateError is raised on failure. On success, the function - returns nothing. - """ - if not cert: - raise ValueError("empty or no certificate, match_hostname needs a " - "SSL socket or SSL context with either " - "CERT_OPTIONAL or CERT_REQUIRED") - dnsnames = [] - san = cert.get('subjectAltName', ()) - for key, value in san: - if key == 'DNS': - if _dnsname_match(value, hostname): - return - dnsnames.append(value) - if not dnsnames: - # The subject is only checked when there is no dNSName entry - # in subjectAltName - for sub in cert.get('subject', ()): - for key, value in sub: - # XXX according to RFC 2818, the most specific Common Name - # must be used. - if key == 'commonName': - if _dnsname_match(value, hostname): - return - dnsnames.append(value) - if len(dnsnames) > 1: - raise CertificateError("hostname %r " - "doesn't match either of %s" - % (hostname, ', '.join(map(repr, dnsnames)))) - elif len(dnsnames) == 1: - raise CertificateError("hostname %r " - "doesn't match %r" - % (hostname, dnsnames[0])) - else: - raise CertificateError("no appropriate commonName or " - "subjectAltName fields were found") - - -try: - from types import SimpleNamespace as Container -except ImportError: # pragma: no cover - class Container(object): - """ - A generic container for when multiple values need to be returned - """ - def __init__(self, **kwargs): - self.__dict__.update(kwargs) - - -try: - from shutil import which -except ImportError: # pragma: no cover - # Implementation from Python 3.3 - def which(cmd, mode=os.F_OK | os.X_OK, path=None): - """Given a command, mode, and a PATH string, return the path which - conforms to the given mode on the PATH, or None if there is no such - file. - - `mode` defaults to os.F_OK | os.X_OK. `path` defaults to the result - of os.environ.get("PATH"), or can be overridden with a custom search - path. - - """ - # Check that a given file can be accessed with the correct mode. - # Additionally check that `file` is not a directory, as on Windows - # directories pass the os.access check. - def _access_check(fn, mode): - return (os.path.exists(fn) and os.access(fn, mode) - and not os.path.isdir(fn)) - - # If we're given a path with a directory part, look it up directly rather - # than referring to PATH directories. This includes checking relative to the - # current directory, e.g. ./script - if os.path.dirname(cmd): - if _access_check(cmd, mode): - return cmd - return None - - if path is None: - path = os.environ.get("PATH", os.defpath) - if not path: - return None - path = path.split(os.pathsep) - - if sys.platform == "win32": - # The current directory takes precedence on Windows. - if not os.curdir in path: - path.insert(0, os.curdir) - - # PATHEXT is necessary to check on Windows. - pathext = os.environ.get("PATHEXT", "").split(os.pathsep) - # See if the given file matches any of the expected path extensions. - # This will allow us to short circuit when given "python.exe". - # If it does match, only test that one, otherwise we have to try - # others. - if any(cmd.lower().endswith(ext.lower()) for ext in pathext): - files = [cmd] - else: - files = [cmd + ext for ext in pathext] - else: - # On other platforms you don't have things like PATHEXT to tell you - # what file suffixes are executable, so just pass on cmd as-is. - files = [cmd] - - seen = set() - for dir in path: - normdir = os.path.normcase(dir) - if not normdir in seen: - seen.add(normdir) - for thefile in files: - name = os.path.join(dir, thefile) - if _access_check(name, mode): - return name - return None - - -# ZipFile is a context manager in 2.7, but not in 2.6 - -from zipfile import ZipFile as BaseZipFile - -if hasattr(BaseZipFile, '__enter__'): # pragma: no cover - ZipFile = BaseZipFile -else: # pragma: no cover - from zipfile import ZipExtFile as BaseZipExtFile - - class ZipExtFile(BaseZipExtFile): - def __init__(self, base): - self.__dict__.update(base.__dict__) - - def __enter__(self): - return self - - def __exit__(self, *exc_info): - self.close() - # return None, so if an exception occurred, it will propagate - - class ZipFile(BaseZipFile): - def __enter__(self): - return self - - def __exit__(self, *exc_info): - self.close() - # return None, so if an exception occurred, it will propagate - - def open(self, *args, **kwargs): - base = BaseZipFile.open(self, *args, **kwargs) - return ZipExtFile(base) - -try: - from platform import python_implementation -except ImportError: # pragma: no cover - def python_implementation(): - """Return a string identifying the Python implementation.""" - if 'PyPy' in sys.version: - return 'PyPy' - if os.name == 'java': - return 'Jython' - if sys.version.startswith('IronPython'): - return 'IronPython' - return 'CPython' - -try: - import sysconfig -except ImportError: # pragma: no cover - from ._backport import sysconfig - -try: - callable = callable -except NameError: # pragma: no cover - from collections import Callable - - def callable(obj): - return isinstance(obj, Callable) - - -try: - fsencode = os.fsencode - fsdecode = os.fsdecode -except AttributeError: # pragma: no cover - # Issue #99: on some systems (e.g. containerised), - # sys.getfilesystemencoding() returns None, and we need a real value, - # so fall back to utf-8. From the CPython 2.7 docs relating to Unix and - # sys.getfilesystemencoding(): the return value is "the user’s preference - # according to the result of nl_langinfo(CODESET), or None if the - # nl_langinfo(CODESET) failed." - _fsencoding = sys.getfilesystemencoding() or 'utf-8' - if _fsencoding == 'mbcs': - _fserrors = 'strict' - else: - _fserrors = 'surrogateescape' - - def fsencode(filename): - if isinstance(filename, bytes): - return filename - elif isinstance(filename, text_type): - return filename.encode(_fsencoding, _fserrors) - else: - raise TypeError("expect bytes or str, not %s" % - type(filename).__name__) - - def fsdecode(filename): - if isinstance(filename, text_type): - return filename - elif isinstance(filename, bytes): - return filename.decode(_fsencoding, _fserrors) - else: - raise TypeError("expect bytes or str, not %s" % - type(filename).__name__) - -try: - from tokenize import detect_encoding -except ImportError: # pragma: no cover - from codecs import BOM_UTF8, lookup - import re - - cookie_re = re.compile(r"coding[:=]\s*([-\w.]+)") - - def _get_normal_name(orig_enc): - """Imitates get_normal_name in tokenizer.c.""" - # Only care about the first 12 characters. - enc = orig_enc[:12].lower().replace("_", "-") - if enc == "utf-8" or enc.startswith("utf-8-"): - return "utf-8" - if enc in ("latin-1", "iso-8859-1", "iso-latin-1") or \ - enc.startswith(("latin-1-", "iso-8859-1-", "iso-latin-1-")): - return "iso-8859-1" - return orig_enc - - def detect_encoding(readline): - """ - The detect_encoding() function is used to detect the encoding that should - be used to decode a Python source file. It requires one argument, readline, - in the same way as the tokenize() generator. - - It will call readline a maximum of twice, and return the encoding used - (as a string) and a list of any lines (left as bytes) it has read in. - - It detects the encoding from the presence of a utf-8 bom or an encoding - cookie as specified in pep-0263. If both a bom and a cookie are present, - but disagree, a SyntaxError will be raised. If the encoding cookie is an - invalid charset, raise a SyntaxError. Note that if a utf-8 bom is found, - 'utf-8-sig' is returned. - - If no encoding is specified, then the default of 'utf-8' will be returned. - """ - try: - filename = readline.__self__.name - except AttributeError: - filename = None - bom_found = False - encoding = None - default = 'utf-8' - def read_or_stop(): - try: - return readline() - except StopIteration: - return b'' - - def find_cookie(line): - try: - # Decode as UTF-8. Either the line is an encoding declaration, - # in which case it should be pure ASCII, or it must be UTF-8 - # per default encoding. - line_string = line.decode('utf-8') - except UnicodeDecodeError: - msg = "invalid or missing encoding declaration" - if filename is not None: - msg = '{} for {!r}'.format(msg, filename) - raise SyntaxError(msg) - - matches = cookie_re.findall(line_string) - if not matches: - return None - encoding = _get_normal_name(matches[0]) - try: - codec = lookup(encoding) - except LookupError: - # This behaviour mimics the Python interpreter - if filename is None: - msg = "unknown encoding: " + encoding - else: - msg = "unknown encoding for {!r}: {}".format(filename, - encoding) - raise SyntaxError(msg) - - if bom_found: - if codec.name != 'utf-8': - # This behaviour mimics the Python interpreter - if filename is None: - msg = 'encoding problem: utf-8' - else: - msg = 'encoding problem for {!r}: utf-8'.format(filename) - raise SyntaxError(msg) - encoding += '-sig' - return encoding - - first = read_or_stop() - if first.startswith(BOM_UTF8): - bom_found = True - first = first[3:] - default = 'utf-8-sig' - if not first: - return default, [] - - encoding = find_cookie(first) - if encoding: - return encoding, [first] - - second = read_or_stop() - if not second: - return default, [first] - - encoding = find_cookie(second) - if encoding: - return encoding, [first, second] - - return default, [first, second] - -# For converting & <-> & etc. -try: - from html import escape -except ImportError: - from cgi import escape -if sys.version_info[:2] < (3, 4): - unescape = HTMLParser().unescape -else: - from html import unescape - -try: - from collections import ChainMap -except ImportError: # pragma: no cover - from collections import MutableMapping - - try: - from reprlib import recursive_repr as _recursive_repr - except ImportError: - def _recursive_repr(fillvalue='...'): - ''' - Decorator to make a repr function return fillvalue for a recursive - call - ''' - - def decorating_function(user_function): - repr_running = set() - - def wrapper(self): - key = id(self), get_ident() - if key in repr_running: - return fillvalue - repr_running.add(key) - try: - result = user_function(self) - finally: - repr_running.discard(key) - return result - - # Can't use functools.wraps() here because of bootstrap issues - wrapper.__module__ = getattr(user_function, '__module__') - wrapper.__doc__ = getattr(user_function, '__doc__') - wrapper.__name__ = getattr(user_function, '__name__') - wrapper.__annotations__ = getattr(user_function, '__annotations__', {}) - return wrapper - - return decorating_function - - class ChainMap(MutableMapping): - ''' A ChainMap groups multiple dicts (or other mappings) together - to create a single, updateable view. - - The underlying mappings are stored in a list. That list is public and can - accessed or updated using the *maps* attribute. There is no other state. - - Lookups search the underlying mappings successively until a key is found. - In contrast, writes, updates, and deletions only operate on the first - mapping. - - ''' - - def __init__(self, *maps): - '''Initialize a ChainMap by setting *maps* to the given mappings. - If no mappings are provided, a single empty dictionary is used. - - ''' - self.maps = list(maps) or [{}] # always at least one map - - def __missing__(self, key): - raise KeyError(key) - - def __getitem__(self, key): - for mapping in self.maps: - try: - return mapping[key] # can't use 'key in mapping' with defaultdict - except KeyError: - pass - return self.__missing__(key) # support subclasses that define __missing__ - - def get(self, key, default=None): - return self[key] if key in self else default - - def __len__(self): - return len(set().union(*self.maps)) # reuses stored hash values if possible - - def __iter__(self): - return iter(set().union(*self.maps)) - - def __contains__(self, key): - return any(key in m for m in self.maps) - - def __bool__(self): - return any(self.maps) - - @_recursive_repr() - def __repr__(self): - return '{0.__class__.__name__}({1})'.format( - self, ', '.join(map(repr, self.maps))) - - @classmethod - def fromkeys(cls, iterable, *args): - 'Create a ChainMap with a single dict created from the iterable.' - return cls(dict.fromkeys(iterable, *args)) - - def copy(self): - 'New ChainMap or subclass with a new copy of maps[0] and refs to maps[1:]' - return self.__class__(self.maps[0].copy(), *self.maps[1:]) - - __copy__ = copy - - def new_child(self): # like Django's Context.push() - 'New ChainMap with a new dict followed by all previous maps.' - return self.__class__({}, *self.maps) - - @property - def parents(self): # like Django's Context.pop() - 'New ChainMap from maps[1:].' - return self.__class__(*self.maps[1:]) - - def __setitem__(self, key, value): - self.maps[0][key] = value - - def __delitem__(self, key): - try: - del self.maps[0][key] - except KeyError: - raise KeyError('Key not found in the first mapping: {!r}'.format(key)) - - def popitem(self): - 'Remove and return an item pair from maps[0]. Raise KeyError is maps[0] is empty.' - try: - return self.maps[0].popitem() - except KeyError: - raise KeyError('No keys found in the first mapping.') - - def pop(self, key, *args): - 'Remove *key* from maps[0] and return its value. Raise KeyError if *key* not in maps[0].' - try: - return self.maps[0].pop(key, *args) - except KeyError: - raise KeyError('Key not found in the first mapping: {!r}'.format(key)) - - def clear(self): - 'Clear maps[0], leaving maps[1:] intact.' - self.maps[0].clear() - -try: - from importlib.util import cache_from_source # Python >= 3.4 -except ImportError: # pragma: no cover - try: - from imp import cache_from_source - except ImportError: # pragma: no cover - def cache_from_source(path, debug_override=None): - assert path.endswith('.py') - if debug_override is None: - debug_override = __debug__ - if debug_override: - suffix = 'c' - else: - suffix = 'o' - return path + suffix - -try: - from collections import OrderedDict -except ImportError: # pragma: no cover -## {{{ http://code.activestate.com/recipes/576693/ (r9) -# Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7 and pypy. -# Passes Python2.7's test suite and incorporates all the latest updates. - try: - from thread import get_ident as _get_ident - except ImportError: - from dummy_thread import get_ident as _get_ident - - try: - from _abcoll import KeysView, ValuesView, ItemsView - except ImportError: - pass - - - class OrderedDict(dict): - 'Dictionary that remembers insertion order' - # An inherited dict maps keys to values. - # The inherited dict provides __getitem__, __len__, __contains__, and get. - # The remaining methods are order-aware. - # Big-O running times for all methods are the same as for regular dictionaries. - - # The internal self.__map dictionary maps keys to links in a doubly linked list. - # The circular doubly linked list starts and ends with a sentinel element. - # The sentinel element never gets deleted (this simplifies the algorithm). - # Each link is stored as a list of length three: [PREV, NEXT, KEY]. - - def __init__(self, *args, **kwds): - '''Initialize an ordered dictionary. Signature is the same as for - regular dictionaries, but keyword arguments are not recommended - because their insertion order is arbitrary. - - ''' - if len(args) > 1: - raise TypeError('expected at most 1 arguments, got %d' % len(args)) - try: - self.__root - except AttributeError: - self.__root = root = [] # sentinel node - root[:] = [root, root, None] - self.__map = {} - self.__update(*args, **kwds) - - def __setitem__(self, key, value, dict_setitem=dict.__setitem__): - 'od.__setitem__(i, y) <==> od[i]=y' - # Setting a new item creates a new link which goes at the end of the linked - # list, and the inherited dictionary is updated with the new key/value pair. - if key not in self: - root = self.__root - last = root[0] - last[1] = root[0] = self.__map[key] = [last, root, key] - dict_setitem(self, key, value) - - def __delitem__(self, key, dict_delitem=dict.__delitem__): - 'od.__delitem__(y) <==> del od[y]' - # Deleting an existing item uses self.__map to find the link which is - # then removed by updating the links in the predecessor and successor nodes. - dict_delitem(self, key) - link_prev, link_next, key = self.__map.pop(key) - link_prev[1] = link_next - link_next[0] = link_prev - - def __iter__(self): - 'od.__iter__() <==> iter(od)' - root = self.__root - curr = root[1] - while curr is not root: - yield curr[2] - curr = curr[1] - - def __reversed__(self): - 'od.__reversed__() <==> reversed(od)' - root = self.__root - curr = root[0] - while curr is not root: - yield curr[2] - curr = curr[0] - - def clear(self): - 'od.clear() -> None. Remove all items from od.' - try: - for node in self.__map.itervalues(): - del node[:] - root = self.__root - root[:] = [root, root, None] - self.__map.clear() - except AttributeError: - pass - dict.clear(self) - - def popitem(self, last=True): - '''od.popitem() -> (k, v), return and remove a (key, value) pair. - Pairs are returned in LIFO order if last is true or FIFO order if false. - - ''' - if not self: - raise KeyError('dictionary is empty') - root = self.__root - if last: - link = root[0] - link_prev = link[0] - link_prev[1] = root - root[0] = link_prev - else: - link = root[1] - link_next = link[1] - root[1] = link_next - link_next[0] = root - key = link[2] - del self.__map[key] - value = dict.pop(self, key) - return key, value - - # -- the following methods do not depend on the internal structure -- - - def keys(self): - 'od.keys() -> list of keys in od' - return list(self) - - def values(self): - 'od.values() -> list of values in od' - return [self[key] for key in self] - - def items(self): - 'od.items() -> list of (key, value) pairs in od' - return [(key, self[key]) for key in self] - - def iterkeys(self): - 'od.iterkeys() -> an iterator over the keys in od' - return iter(self) - - def itervalues(self): - 'od.itervalues -> an iterator over the values in od' - for k in self: - yield self[k] - - def iteritems(self): - 'od.iteritems -> an iterator over the (key, value) items in od' - for k in self: - yield (k, self[k]) - - def update(*args, **kwds): - '''od.update(E, **F) -> None. Update od from dict/iterable E and F. - - If E is a dict instance, does: for k in E: od[k] = E[k] - If E has a .keys() method, does: for k in E.keys(): od[k] = E[k] - Or if E is an iterable of items, does: for k, v in E: od[k] = v - In either case, this is followed by: for k, v in F.items(): od[k] = v - - ''' - if len(args) > 2: - raise TypeError('update() takes at most 2 positional ' - 'arguments (%d given)' % (len(args),)) - elif not args: - raise TypeError('update() takes at least 1 argument (0 given)') - self = args[0] - # Make progressively weaker assumptions about "other" - other = () - if len(args) == 2: - other = args[1] - if isinstance(other, dict): - for key in other: - self[key] = other[key] - elif hasattr(other, 'keys'): - for key in other.keys(): - self[key] = other[key] - else: - for key, value in other: - self[key] = value - for key, value in kwds.items(): - self[key] = value - - __update = update # let subclasses override update without breaking __init__ - - __marker = object() - - def pop(self, key, default=__marker): - '''od.pop(k[,d]) -> v, remove specified key and return the corresponding value. - If key is not found, d is returned if given, otherwise KeyError is raised. - - ''' - if key in self: - result = self[key] - del self[key] - return result - if default is self.__marker: - raise KeyError(key) - return default - - def setdefault(self, key, default=None): - 'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od' - if key in self: - return self[key] - self[key] = default - return default - - def __repr__(self, _repr_running=None): - 'od.__repr__() <==> repr(od)' - if not _repr_running: _repr_running = {} - call_key = id(self), _get_ident() - if call_key in _repr_running: - return '...' - _repr_running[call_key] = 1 - try: - if not self: - return '%s()' % (self.__class__.__name__,) - return '%s(%r)' % (self.__class__.__name__, self.items()) - finally: - del _repr_running[call_key] - - def __reduce__(self): - 'Return state information for pickling' - items = [[k, self[k]] for k in self] - inst_dict = vars(self).copy() - for k in vars(OrderedDict()): - inst_dict.pop(k, None) - if inst_dict: - return (self.__class__, (items,), inst_dict) - return self.__class__, (items,) - - def copy(self): - 'od.copy() -> a shallow copy of od' - return self.__class__(self) - - @classmethod - def fromkeys(cls, iterable, value=None): - '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S - and values equal to v (which defaults to None). - - ''' - d = cls() - for key in iterable: - d[key] = value - return d - - def __eq__(self, other): - '''od.__eq__(y) <==> od==y. Comparison to another OD is order-sensitive - while comparison to a regular mapping is order-insensitive. - - ''' - if isinstance(other, OrderedDict): - return len(self)==len(other) and self.items() == other.items() - return dict.__eq__(self, other) - - def __ne__(self, other): - return not self == other - - # -- the following methods are only used in Python 2.7 -- - - def viewkeys(self): - "od.viewkeys() -> a set-like object providing a view on od's keys" - return KeysView(self) - - def viewvalues(self): - "od.viewvalues() -> an object providing a view on od's values" - return ValuesView(self) - - def viewitems(self): - "od.viewitems() -> a set-like object providing a view on od's items" - return ItemsView(self) - -try: - from logging.config import BaseConfigurator, valid_ident -except ImportError: # pragma: no cover - IDENTIFIER = re.compile('^[a-z_][a-z0-9_]*$', re.I) - - - def valid_ident(s): - m = IDENTIFIER.match(s) - if not m: - raise ValueError('Not a valid Python identifier: %r' % s) - return True - - - # The ConvertingXXX classes are wrappers around standard Python containers, - # and they serve to convert any suitable values in the container. The - # conversion converts base dicts, lists and tuples to their wrapped - # equivalents, whereas strings which match a conversion format are converted - # appropriately. - # - # Each wrapper should have a configurator attribute holding the actual - # configurator to use for conversion. - - class ConvertingDict(dict): - """A converting dictionary wrapper.""" - - def __getitem__(self, key): - value = dict.__getitem__(self, key) - result = self.configurator.convert(value) - #If the converted value is different, save for next time - if value is not result: - self[key] = result - if type(result) in (ConvertingDict, ConvertingList, - ConvertingTuple): - result.parent = self - result.key = key - return result - - def get(self, key, default=None): - value = dict.get(self, key, default) - result = self.configurator.convert(value) - #If the converted value is different, save for next time - if value is not result: - self[key] = result - if type(result) in (ConvertingDict, ConvertingList, - ConvertingTuple): - result.parent = self - result.key = key - return result - - def pop(self, key, default=None): - value = dict.pop(self, key, default) - result = self.configurator.convert(value) - if value is not result: - if type(result) in (ConvertingDict, ConvertingList, - ConvertingTuple): - result.parent = self - result.key = key - return result - - class ConvertingList(list): - """A converting list wrapper.""" - def __getitem__(self, key): - value = list.__getitem__(self, key) - result = self.configurator.convert(value) - #If the converted value is different, save for next time - if value is not result: - self[key] = result - if type(result) in (ConvertingDict, ConvertingList, - ConvertingTuple): - result.parent = self - result.key = key - return result - - def pop(self, idx=-1): - value = list.pop(self, idx) - result = self.configurator.convert(value) - if value is not result: - if type(result) in (ConvertingDict, ConvertingList, - ConvertingTuple): - result.parent = self - return result - - class ConvertingTuple(tuple): - """A converting tuple wrapper.""" - def __getitem__(self, key): - value = tuple.__getitem__(self, key) - result = self.configurator.convert(value) - if value is not result: - if type(result) in (ConvertingDict, ConvertingList, - ConvertingTuple): - result.parent = self - result.key = key - return result - - class BaseConfigurator(object): - """ - The configurator base class which defines some useful defaults. - """ - - CONVERT_PATTERN = re.compile(r'^(?P<prefix>[a-z]+)://(?P<suffix>.*)$') - - WORD_PATTERN = re.compile(r'^\s*(\w+)\s*') - DOT_PATTERN = re.compile(r'^\.\s*(\w+)\s*') - INDEX_PATTERN = re.compile(r'^\[\s*(\w+)\s*\]\s*') - DIGIT_PATTERN = re.compile(r'^\d+$') - - value_converters = { - 'ext' : 'ext_convert', - 'cfg' : 'cfg_convert', - } - - # We might want to use a different one, e.g. importlib - importer = staticmethod(__import__) - - def __init__(self, config): - self.config = ConvertingDict(config) - self.config.configurator = self - - def resolve(self, s): - """ - Resolve strings to objects using standard import and attribute - syntax. - """ - name = s.split('.') - used = name.pop(0) - try: - found = self.importer(used) - for frag in name: - used += '.' + frag - try: - found = getattr(found, frag) - except AttributeError: - self.importer(used) - found = getattr(found, frag) - return found - except ImportError: - e, tb = sys.exc_info()[1:] - v = ValueError('Cannot resolve %r: %s' % (s, e)) - v.__cause__, v.__traceback__ = e, tb - raise v - - def ext_convert(self, value): - """Default converter for the ext:// protocol.""" - return self.resolve(value) - - def cfg_convert(self, value): - """Default converter for the cfg:// protocol.""" - rest = value - m = self.WORD_PATTERN.match(rest) - if m is None: - raise ValueError("Unable to convert %r" % value) - else: - rest = rest[m.end():] - d = self.config[m.groups()[0]] - #print d, rest - while rest: - m = self.DOT_PATTERN.match(rest) - if m: - d = d[m.groups()[0]] - else: - m = self.INDEX_PATTERN.match(rest) - if m: - idx = m.groups()[0] - if not self.DIGIT_PATTERN.match(idx): - d = d[idx] - else: - try: - n = int(idx) # try as number first (most likely) - d = d[n] - except TypeError: - d = d[idx] - if m: - rest = rest[m.end():] - else: - raise ValueError('Unable to convert ' - '%r at %r' % (value, rest)) - #rest should be empty - return d - - def convert(self, value): - """ - Convert values to an appropriate type. dicts, lists and tuples are - replaced by their converting alternatives. Strings are checked to - see if they have a conversion format and are converted if they do. - """ - if not isinstance(value, ConvertingDict) and isinstance(value, dict): - value = ConvertingDict(value) - value.configurator = self - elif not isinstance(value, ConvertingList) and isinstance(value, list): - value = ConvertingList(value) - value.configurator = self - elif not isinstance(value, ConvertingTuple) and\ - isinstance(value, tuple): - value = ConvertingTuple(value) - value.configurator = self - elif isinstance(value, string_types): - m = self.CONVERT_PATTERN.match(value) - if m: - d = m.groupdict() - prefix = d['prefix'] - converter = self.value_converters.get(prefix, None) - if converter: - suffix = d['suffix'] - converter = getattr(self, converter) - value = converter(suffix) - return value - - def configure_custom(self, config): - """Configure an object with a user-supplied factory.""" - c = config.pop('()') - if not callable(c): - c = self.resolve(c) - props = config.pop('.', None) - # Check for valid identifiers - kwargs = dict([(k, config[k]) for k in config if valid_ident(k)]) - result = c(**kwargs) - if props: - for name, value in props.items(): - setattr(result, name, value) - return result - - def as_tuple(self, value): - """Utility function which converts lists to tuples.""" - if isinstance(value, list): - value = tuple(value) - return value diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/database.py b/env/lib/python3.7/site-packages/pip/_vendor/distlib/database.py deleted file mode 100644 index b13cdac..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/distlib/database.py +++ /dev/null @@ -1,1339 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012-2017 The Python Software Foundation. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -"""PEP 376 implementation.""" - -from __future__ import unicode_literals - -import base64 -import codecs -import contextlib -import hashlib -import logging -import os -import posixpath -import sys -import zipimport - -from . import DistlibException, resources -from .compat import StringIO -from .version import get_scheme, UnsupportedVersionError -from .metadata import (Metadata, METADATA_FILENAME, WHEEL_METADATA_FILENAME, - LEGACY_METADATA_FILENAME) -from .util import (parse_requirement, cached_property, parse_name_and_version, - read_exports, write_exports, CSVReader, CSVWriter) - - -__all__ = ['Distribution', 'BaseInstalledDistribution', - 'InstalledDistribution', 'EggInfoDistribution', - 'DistributionPath'] - - -logger = logging.getLogger(__name__) - -EXPORTS_FILENAME = 'pydist-exports.json' -COMMANDS_FILENAME = 'pydist-commands.json' - -DIST_FILES = ('INSTALLER', METADATA_FILENAME, 'RECORD', 'REQUESTED', - 'RESOURCES', EXPORTS_FILENAME, 'SHARED') - -DISTINFO_EXT = '.dist-info' - - -class _Cache(object): - """ - A simple cache mapping names and .dist-info paths to distributions - """ - def __init__(self): - """ - Initialise an instance. There is normally one for each DistributionPath. - """ - self.name = {} - self.path = {} - self.generated = False - - def clear(self): - """ - Clear the cache, setting it to its initial state. - """ - self.name.clear() - self.path.clear() - self.generated = False - - def add(self, dist): - """ - Add a distribution to the cache. - :param dist: The distribution to add. - """ - if dist.path not in self.path: - self.path[dist.path] = dist - self.name.setdefault(dist.key, []).append(dist) - - -class DistributionPath(object): - """ - Represents a set of distributions installed on a path (typically sys.path). - """ - def __init__(self, path=None, include_egg=False): - """ - Create an instance from a path, optionally including legacy (distutils/ - setuptools/distribute) distributions. - :param path: The path to use, as a list of directories. If not specified, - sys.path is used. - :param include_egg: If True, this instance will look for and return legacy - distributions as well as those based on PEP 376. - """ - if path is None: - path = sys.path - self.path = path - self._include_dist = True - self._include_egg = include_egg - - self._cache = _Cache() - self._cache_egg = _Cache() - self._cache_enabled = True - self._scheme = get_scheme('default') - - def _get_cache_enabled(self): - return self._cache_enabled - - def _set_cache_enabled(self, value): - self._cache_enabled = value - - cache_enabled = property(_get_cache_enabled, _set_cache_enabled) - - def clear_cache(self): - """ - Clears the internal cache. - """ - self._cache.clear() - self._cache_egg.clear() - - - def _yield_distributions(self): - """ - Yield .dist-info and/or .egg(-info) distributions. - """ - # We need to check if we've seen some resources already, because on - # some Linux systems (e.g. some Debian/Ubuntu variants) there are - # symlinks which alias other files in the environment. - seen = set() - for path in self.path: - finder = resources.finder_for_path(path) - if finder is None: - continue - r = finder.find('') - if not r or not r.is_container: - continue - rset = sorted(r.resources) - for entry in rset: - r = finder.find(entry) - if not r or r.path in seen: - continue - if self._include_dist and entry.endswith(DISTINFO_EXT): - possible_filenames = [METADATA_FILENAME, - WHEEL_METADATA_FILENAME, - LEGACY_METADATA_FILENAME] - for metadata_filename in possible_filenames: - metadata_path = posixpath.join(entry, metadata_filename) - pydist = finder.find(metadata_path) - if pydist: - break - else: - continue - - with contextlib.closing(pydist.as_stream()) as stream: - metadata = Metadata(fileobj=stream, scheme='legacy') - logger.debug('Found %s', r.path) - seen.add(r.path) - yield new_dist_class(r.path, metadata=metadata, - env=self) - elif self._include_egg and entry.endswith(('.egg-info', - '.egg')): - logger.debug('Found %s', r.path) - seen.add(r.path) - yield old_dist_class(r.path, self) - - def _generate_cache(self): - """ - Scan the path for distributions and populate the cache with - those that are found. - """ - gen_dist = not self._cache.generated - gen_egg = self._include_egg and not self._cache_egg.generated - if gen_dist or gen_egg: - for dist in self._yield_distributions(): - if isinstance(dist, InstalledDistribution): - self._cache.add(dist) - else: - self._cache_egg.add(dist) - - if gen_dist: - self._cache.generated = True - if gen_egg: - self._cache_egg.generated = True - - @classmethod - def distinfo_dirname(cls, name, version): - """ - The *name* and *version* parameters are converted into their - filename-escaped form, i.e. any ``'-'`` characters are replaced - with ``'_'`` other than the one in ``'dist-info'`` and the one - separating the name from the version number. - - :parameter name: is converted to a standard distribution name by replacing - any runs of non- alphanumeric characters with a single - ``'-'``. - :type name: string - :parameter version: is converted to a standard version string. Spaces - become dots, and all other non-alphanumeric characters - (except dots) become dashes, with runs of multiple - dashes condensed to a single dash. - :type version: string - :returns: directory name - :rtype: string""" - name = name.replace('-', '_') - return '-'.join([name, version]) + DISTINFO_EXT - - def get_distributions(self): - """ - Provides an iterator that looks for distributions and returns - :class:`InstalledDistribution` or - :class:`EggInfoDistribution` instances for each one of them. - - :rtype: iterator of :class:`InstalledDistribution` and - :class:`EggInfoDistribution` instances - """ - if not self._cache_enabled: - for dist in self._yield_distributions(): - yield dist - else: - self._generate_cache() - - for dist in self._cache.path.values(): - yield dist - - if self._include_egg: - for dist in self._cache_egg.path.values(): - yield dist - - def get_distribution(self, name): - """ - Looks for a named distribution on the path. - - This function only returns the first result found, as no more than one - value is expected. If nothing is found, ``None`` is returned. - - :rtype: :class:`InstalledDistribution`, :class:`EggInfoDistribution` - or ``None`` - """ - result = None - name = name.lower() - if not self._cache_enabled: - for dist in self._yield_distributions(): - if dist.key == name: - result = dist - break - else: - self._generate_cache() - - if name in self._cache.name: - result = self._cache.name[name][0] - elif self._include_egg and name in self._cache_egg.name: - result = self._cache_egg.name[name][0] - return result - - def provides_distribution(self, name, version=None): - """ - Iterates over all distributions to find which distributions provide *name*. - If a *version* is provided, it will be used to filter the results. - - This function only returns the first result found, since no more than - one values are expected. If the directory is not found, returns ``None``. - - :parameter version: a version specifier that indicates the version - required, conforming to the format in ``PEP-345`` - - :type name: string - :type version: string - """ - matcher = None - if version is not None: - try: - matcher = self._scheme.matcher('%s (%s)' % (name, version)) - except ValueError: - raise DistlibException('invalid name or version: %r, %r' % - (name, version)) - - for dist in self.get_distributions(): - # We hit a problem on Travis where enum34 was installed and doesn't - # have a provides attribute ... - if not hasattr(dist, 'provides'): - logger.debug('No "provides": %s', dist) - else: - provided = dist.provides - - for p in provided: - p_name, p_ver = parse_name_and_version(p) - if matcher is None: - if p_name == name: - yield dist - break - else: - if p_name == name and matcher.match(p_ver): - yield dist - break - - def get_file_path(self, name, relative_path): - """ - Return the path to a resource file. - """ - dist = self.get_distribution(name) - if dist is None: - raise LookupError('no distribution named %r found' % name) - return dist.get_resource_path(relative_path) - - def get_exported_entries(self, category, name=None): - """ - Return all of the exported entries in a particular category. - - :param category: The category to search for entries. - :param name: If specified, only entries with that name are returned. - """ - for dist in self.get_distributions(): - r = dist.exports - if category in r: - d = r[category] - if name is not None: - if name in d: - yield d[name] - else: - for v in d.values(): - yield v - - -class Distribution(object): - """ - A base class for distributions, whether installed or from indexes. - Either way, it must have some metadata, so that's all that's needed - for construction. - """ - - build_time_dependency = False - """ - Set to True if it's known to be only a build-time dependency (i.e. - not needed after installation). - """ - - requested = False - """A boolean that indicates whether the ``REQUESTED`` metadata file is - present (in other words, whether the package was installed by user - request or it was installed as a dependency).""" - - def __init__(self, metadata): - """ - Initialise an instance. - :param metadata: The instance of :class:`Metadata` describing this - distribution. - """ - self.metadata = metadata - self.name = metadata.name - self.key = self.name.lower() # for case-insensitive comparisons - self.version = metadata.version - self.locator = None - self.digest = None - self.extras = None # additional features requested - self.context = None # environment marker overrides - self.download_urls = set() - self.digests = {} - - @property - def source_url(self): - """ - The source archive download URL for this distribution. - """ - return self.metadata.source_url - - download_url = source_url # Backward compatibility - - @property - def name_and_version(self): - """ - A utility property which displays the name and version in parentheses. - """ - return '%s (%s)' % (self.name, self.version) - - @property - def provides(self): - """ - A set of distribution names and versions provided by this distribution. - :return: A set of "name (version)" strings. - """ - plist = self.metadata.provides - s = '%s (%s)' % (self.name, self.version) - if s not in plist: - plist.append(s) - return plist - - def _get_requirements(self, req_attr): - md = self.metadata - logger.debug('Getting requirements from metadata %r', md.todict()) - reqts = getattr(md, req_attr) - return set(md.get_requirements(reqts, extras=self.extras, - env=self.context)) - - @property - def run_requires(self): - return self._get_requirements('run_requires') - - @property - def meta_requires(self): - return self._get_requirements('meta_requires') - - @property - def build_requires(self): - return self._get_requirements('build_requires') - - @property - def test_requires(self): - return self._get_requirements('test_requires') - - @property - def dev_requires(self): - return self._get_requirements('dev_requires') - - def matches_requirement(self, req): - """ - Say if this instance matches (fulfills) a requirement. - :param req: The requirement to match. - :rtype req: str - :return: True if it matches, else False. - """ - # Requirement may contain extras - parse to lose those - # from what's passed to the matcher - r = parse_requirement(req) - scheme = get_scheme(self.metadata.scheme) - try: - matcher = scheme.matcher(r.requirement) - except UnsupportedVersionError: - # XXX compat-mode if cannot read the version - logger.warning('could not read version %r - using name only', - req) - name = req.split()[0] - matcher = scheme.matcher(name) - - name = matcher.key # case-insensitive - - result = False - for p in self.provides: - p_name, p_ver = parse_name_and_version(p) - if p_name != name: - continue - try: - result = matcher.match(p_ver) - break - except UnsupportedVersionError: - pass - return result - - def __repr__(self): - """ - Return a textual representation of this instance, - """ - if self.source_url: - suffix = ' [%s]' % self.source_url - else: - suffix = '' - return '<Distribution %s (%s)%s>' % (self.name, self.version, suffix) - - def __eq__(self, other): - """ - See if this distribution is the same as another. - :param other: The distribution to compare with. To be equal to one - another. distributions must have the same type, name, - version and source_url. - :return: True if it is the same, else False. - """ - if type(other) is not type(self): - result = False - else: - result = (self.name == other.name and - self.version == other.version and - self.source_url == other.source_url) - return result - - def __hash__(self): - """ - Compute hash in a way which matches the equality test. - """ - return hash(self.name) + hash(self.version) + hash(self.source_url) - - -class BaseInstalledDistribution(Distribution): - """ - This is the base class for installed distributions (whether PEP 376 or - legacy). - """ - - hasher = None - - def __init__(self, metadata, path, env=None): - """ - Initialise an instance. - :param metadata: An instance of :class:`Metadata` which describes the - distribution. This will normally have been initialised - from a metadata file in the ``path``. - :param path: The path of the ``.dist-info`` or ``.egg-info`` - directory for the distribution. - :param env: This is normally the :class:`DistributionPath` - instance where this distribution was found. - """ - super(BaseInstalledDistribution, self).__init__(metadata) - self.path = path - self.dist_path = env - - def get_hash(self, data, hasher=None): - """ - Get the hash of some data, using a particular hash algorithm, if - specified. - - :param data: The data to be hashed. - :type data: bytes - :param hasher: The name of a hash implementation, supported by hashlib, - or ``None``. Examples of valid values are ``'sha1'``, - ``'sha224'``, ``'sha384'``, '``sha256'``, ``'md5'`` and - ``'sha512'``. If no hasher is specified, the ``hasher`` - attribute of the :class:`InstalledDistribution` instance - is used. If the hasher is determined to be ``None``, MD5 - is used as the hashing algorithm. - :returns: The hash of the data. If a hasher was explicitly specified, - the returned hash will be prefixed with the specified hasher - followed by '='. - :rtype: str - """ - if hasher is None: - hasher = self.hasher - if hasher is None: - hasher = hashlib.md5 - prefix = '' - else: - hasher = getattr(hashlib, hasher) - prefix = '%s=' % self.hasher - digest = hasher(data).digest() - digest = base64.urlsafe_b64encode(digest).rstrip(b'=').decode('ascii') - return '%s%s' % (prefix, digest) - - -class InstalledDistribution(BaseInstalledDistribution): - """ - Created with the *path* of the ``.dist-info`` directory provided to the - constructor. It reads the metadata contained in ``pydist.json`` when it is - instantiated., or uses a passed in Metadata instance (useful for when - dry-run mode is being used). - """ - - hasher = 'sha256' - - def __init__(self, path, metadata=None, env=None): - self.modules = [] - self.finder = finder = resources.finder_for_path(path) - if finder is None: - raise ValueError('finder unavailable for %s' % path) - if env and env._cache_enabled and path in env._cache.path: - metadata = env._cache.path[path].metadata - elif metadata is None: - r = finder.find(METADATA_FILENAME) - # Temporary - for Wheel 0.23 support - if r is None: - r = finder.find(WHEEL_METADATA_FILENAME) - # Temporary - for legacy support - if r is None: - r = finder.find('METADATA') - if r is None: - raise ValueError('no %s found in %s' % (METADATA_FILENAME, - path)) - with contextlib.closing(r.as_stream()) as stream: - metadata = Metadata(fileobj=stream, scheme='legacy') - - super(InstalledDistribution, self).__init__(metadata, path, env) - - if env and env._cache_enabled: - env._cache.add(self) - - r = finder.find('REQUESTED') - self.requested = r is not None - p = os.path.join(path, 'top_level.txt') - if os.path.exists(p): - with open(p, 'rb') as f: - data = f.read() - self.modules = data.splitlines() - - def __repr__(self): - return '<InstalledDistribution %r %s at %r>' % ( - self.name, self.version, self.path) - - def __str__(self): - return "%s %s" % (self.name, self.version) - - def _get_records(self): - """ - Get the list of installed files for the distribution - :return: A list of tuples of path, hash and size. Note that hash and - size might be ``None`` for some entries. The path is exactly - as stored in the file (which is as in PEP 376). - """ - results = [] - r = self.get_distinfo_resource('RECORD') - with contextlib.closing(r.as_stream()) as stream: - with CSVReader(stream=stream) as record_reader: - # Base location is parent dir of .dist-info dir - #base_location = os.path.dirname(self.path) - #base_location = os.path.abspath(base_location) - for row in record_reader: - missing = [None for i in range(len(row), 3)] - path, checksum, size = row + missing - #if not os.path.isabs(path): - # path = path.replace('/', os.sep) - # path = os.path.join(base_location, path) - results.append((path, checksum, size)) - return results - - @cached_property - def exports(self): - """ - Return the information exported by this distribution. - :return: A dictionary of exports, mapping an export category to a dict - of :class:`ExportEntry` instances describing the individual - export entries, and keyed by name. - """ - result = {} - r = self.get_distinfo_resource(EXPORTS_FILENAME) - if r: - result = self.read_exports() - return result - - def read_exports(self): - """ - Read exports data from a file in .ini format. - - :return: A dictionary of exports, mapping an export category to a list - of :class:`ExportEntry` instances describing the individual - export entries. - """ - result = {} - r = self.get_distinfo_resource(EXPORTS_FILENAME) - if r: - with contextlib.closing(r.as_stream()) as stream: - result = read_exports(stream) - return result - - def write_exports(self, exports): - """ - Write a dictionary of exports to a file in .ini format. - :param exports: A dictionary of exports, mapping an export category to - a list of :class:`ExportEntry` instances describing the - individual export entries. - """ - rf = self.get_distinfo_file(EXPORTS_FILENAME) - with open(rf, 'w') as f: - write_exports(exports, f) - - def get_resource_path(self, relative_path): - """ - NOTE: This API may change in the future. - - Return the absolute path to a resource file with the given relative - path. - - :param relative_path: The path, relative to .dist-info, of the resource - of interest. - :return: The absolute path where the resource is to be found. - """ - r = self.get_distinfo_resource('RESOURCES') - with contextlib.closing(r.as_stream()) as stream: - with CSVReader(stream=stream) as resources_reader: - for relative, destination in resources_reader: - if relative == relative_path: - return destination - raise KeyError('no resource file with relative path %r ' - 'is installed' % relative_path) - - def list_installed_files(self): - """ - Iterates over the ``RECORD`` entries and returns a tuple - ``(path, hash, size)`` for each line. - - :returns: iterator of (path, hash, size) - """ - for result in self._get_records(): - yield result - - def write_installed_files(self, paths, prefix, dry_run=False): - """ - Writes the ``RECORD`` file, using the ``paths`` iterable passed in. Any - existing ``RECORD`` file is silently overwritten. - - prefix is used to determine when to write absolute paths. - """ - prefix = os.path.join(prefix, '') - base = os.path.dirname(self.path) - base_under_prefix = base.startswith(prefix) - base = os.path.join(base, '') - record_path = self.get_distinfo_file('RECORD') - logger.info('creating %s', record_path) - if dry_run: - return None - with CSVWriter(record_path) as writer: - for path in paths: - if os.path.isdir(path) or path.endswith(('.pyc', '.pyo')): - # do not put size and hash, as in PEP-376 - hash_value = size = '' - else: - size = '%d' % os.path.getsize(path) - with open(path, 'rb') as fp: - hash_value = self.get_hash(fp.read()) - if path.startswith(base) or (base_under_prefix and - path.startswith(prefix)): - path = os.path.relpath(path, base) - writer.writerow((path, hash_value, size)) - - # add the RECORD file itself - if record_path.startswith(base): - record_path = os.path.relpath(record_path, base) - writer.writerow((record_path, '', '')) - return record_path - - def check_installed_files(self): - """ - Checks that the hashes and sizes of the files in ``RECORD`` are - matched by the files themselves. Returns a (possibly empty) list of - mismatches. Each entry in the mismatch list will be a tuple consisting - of the path, 'exists', 'size' or 'hash' according to what didn't match - (existence is checked first, then size, then hash), the expected - value and the actual value. - """ - mismatches = [] - base = os.path.dirname(self.path) - record_path = self.get_distinfo_file('RECORD') - for path, hash_value, size in self.list_installed_files(): - if not os.path.isabs(path): - path = os.path.join(base, path) - if path == record_path: - continue - if not os.path.exists(path): - mismatches.append((path, 'exists', True, False)) - elif os.path.isfile(path): - actual_size = str(os.path.getsize(path)) - if size and actual_size != size: - mismatches.append((path, 'size', size, actual_size)) - elif hash_value: - if '=' in hash_value: - hasher = hash_value.split('=', 1)[0] - else: - hasher = None - - with open(path, 'rb') as f: - actual_hash = self.get_hash(f.read(), hasher) - if actual_hash != hash_value: - mismatches.append((path, 'hash', hash_value, actual_hash)) - return mismatches - - @cached_property - def shared_locations(self): - """ - A dictionary of shared locations whose keys are in the set 'prefix', - 'purelib', 'platlib', 'scripts', 'headers', 'data' and 'namespace'. - The corresponding value is the absolute path of that category for - this distribution, and takes into account any paths selected by the - user at installation time (e.g. via command-line arguments). In the - case of the 'namespace' key, this would be a list of absolute paths - for the roots of namespace packages in this distribution. - - The first time this property is accessed, the relevant information is - read from the SHARED file in the .dist-info directory. - """ - result = {} - shared_path = os.path.join(self.path, 'SHARED') - if os.path.isfile(shared_path): - with codecs.open(shared_path, 'r', encoding='utf-8') as f: - lines = f.read().splitlines() - for line in lines: - key, value = line.split('=', 1) - if key == 'namespace': - result.setdefault(key, []).append(value) - else: - result[key] = value - return result - - def write_shared_locations(self, paths, dry_run=False): - """ - Write shared location information to the SHARED file in .dist-info. - :param paths: A dictionary as described in the documentation for - :meth:`shared_locations`. - :param dry_run: If True, the action is logged but no file is actually - written. - :return: The path of the file written to. - """ - shared_path = os.path.join(self.path, 'SHARED') - logger.info('creating %s', shared_path) - if dry_run: - return None - lines = [] - for key in ('prefix', 'lib', 'headers', 'scripts', 'data'): - path = paths[key] - if os.path.isdir(paths[key]): - lines.append('%s=%s' % (key, path)) - for ns in paths.get('namespace', ()): - lines.append('namespace=%s' % ns) - - with codecs.open(shared_path, 'w', encoding='utf-8') as f: - f.write('\n'.join(lines)) - return shared_path - - def get_distinfo_resource(self, path): - if path not in DIST_FILES: - raise DistlibException('invalid path for a dist-info file: ' - '%r at %r' % (path, self.path)) - finder = resources.finder_for_path(self.path) - if finder is None: - raise DistlibException('Unable to get a finder for %s' % self.path) - return finder.find(path) - - def get_distinfo_file(self, path): - """ - Returns a path located under the ``.dist-info`` directory. Returns a - string representing the path. - - :parameter path: a ``'/'``-separated path relative to the - ``.dist-info`` directory or an absolute path; - If *path* is an absolute path and doesn't start - with the ``.dist-info`` directory path, - a :class:`DistlibException` is raised - :type path: str - :rtype: str - """ - # Check if it is an absolute path # XXX use relpath, add tests - if path.find(os.sep) >= 0: - # it's an absolute path? - distinfo_dirname, path = path.split(os.sep)[-2:] - if distinfo_dirname != self.path.split(os.sep)[-1]: - raise DistlibException( - 'dist-info file %r does not belong to the %r %s ' - 'distribution' % (path, self.name, self.version)) - - # The file must be relative - if path not in DIST_FILES: - raise DistlibException('invalid path for a dist-info file: ' - '%r at %r' % (path, self.path)) - - return os.path.join(self.path, path) - - def list_distinfo_files(self): - """ - Iterates over the ``RECORD`` entries and returns paths for each line if - the path is pointing to a file located in the ``.dist-info`` directory - or one of its subdirectories. - - :returns: iterator of paths - """ - base = os.path.dirname(self.path) - for path, checksum, size in self._get_records(): - # XXX add separator or use real relpath algo - if not os.path.isabs(path): - path = os.path.join(base, path) - if path.startswith(self.path): - yield path - - def __eq__(self, other): - return (isinstance(other, InstalledDistribution) and - self.path == other.path) - - # See http://docs.python.org/reference/datamodel#object.__hash__ - __hash__ = object.__hash__ - - -class EggInfoDistribution(BaseInstalledDistribution): - """Created with the *path* of the ``.egg-info`` directory or file provided - to the constructor. It reads the metadata contained in the file itself, or - if the given path happens to be a directory, the metadata is read from the - file ``PKG-INFO`` under that directory.""" - - requested = True # as we have no way of knowing, assume it was - shared_locations = {} - - def __init__(self, path, env=None): - def set_name_and_version(s, n, v): - s.name = n - s.key = n.lower() # for case-insensitive comparisons - s.version = v - - self.path = path - self.dist_path = env - if env and env._cache_enabled and path in env._cache_egg.path: - metadata = env._cache_egg.path[path].metadata - set_name_and_version(self, metadata.name, metadata.version) - else: - metadata = self._get_metadata(path) - - # Need to be set before caching - set_name_and_version(self, metadata.name, metadata.version) - - if env and env._cache_enabled: - env._cache_egg.add(self) - super(EggInfoDistribution, self).__init__(metadata, path, env) - - def _get_metadata(self, path): - requires = None - - def parse_requires_data(data): - """Create a list of dependencies from a requires.txt file. - - *data*: the contents of a setuptools-produced requires.txt file. - """ - reqs = [] - lines = data.splitlines() - for line in lines: - line = line.strip() - if line.startswith('['): - logger.warning('Unexpected line: quitting requirement scan: %r', - line) - break - r = parse_requirement(line) - if not r: - logger.warning('Not recognised as a requirement: %r', line) - continue - if r.extras: - logger.warning('extra requirements in requires.txt are ' - 'not supported') - if not r.constraints: - reqs.append(r.name) - else: - cons = ', '.join('%s%s' % c for c in r.constraints) - reqs.append('%s (%s)' % (r.name, cons)) - return reqs - - def parse_requires_path(req_path): - """Create a list of dependencies from a requires.txt file. - - *req_path*: the path to a setuptools-produced requires.txt file. - """ - - reqs = [] - try: - with codecs.open(req_path, 'r', 'utf-8') as fp: - reqs = parse_requires_data(fp.read()) - except IOError: - pass - return reqs - - tl_path = tl_data = None - if path.endswith('.egg'): - if os.path.isdir(path): - p = os.path.join(path, 'EGG-INFO') - meta_path = os.path.join(p, 'PKG-INFO') - metadata = Metadata(path=meta_path, scheme='legacy') - req_path = os.path.join(p, 'requires.txt') - tl_path = os.path.join(p, 'top_level.txt') - requires = parse_requires_path(req_path) - else: - # FIXME handle the case where zipfile is not available - zipf = zipimport.zipimporter(path) - fileobj = StringIO( - zipf.get_data('EGG-INFO/PKG-INFO').decode('utf8')) - metadata = Metadata(fileobj=fileobj, scheme='legacy') - try: - data = zipf.get_data('EGG-INFO/requires.txt') - tl_data = zipf.get_data('EGG-INFO/top_level.txt').decode('utf-8') - requires = parse_requires_data(data.decode('utf-8')) - except IOError: - requires = None - elif path.endswith('.egg-info'): - if os.path.isdir(path): - req_path = os.path.join(path, 'requires.txt') - requires = parse_requires_path(req_path) - path = os.path.join(path, 'PKG-INFO') - tl_path = os.path.join(path, 'top_level.txt') - metadata = Metadata(path=path, scheme='legacy') - else: - raise DistlibException('path must end with .egg-info or .egg, ' - 'got %r' % path) - - if requires: - metadata.add_requirements(requires) - # look for top-level modules in top_level.txt, if present - if tl_data is None: - if tl_path is not None and os.path.exists(tl_path): - with open(tl_path, 'rb') as f: - tl_data = f.read().decode('utf-8') - if not tl_data: - tl_data = [] - else: - tl_data = tl_data.splitlines() - self.modules = tl_data - return metadata - - def __repr__(self): - return '<EggInfoDistribution %r %s at %r>' % ( - self.name, self.version, self.path) - - def __str__(self): - return "%s %s" % (self.name, self.version) - - def check_installed_files(self): - """ - Checks that the hashes and sizes of the files in ``RECORD`` are - matched by the files themselves. Returns a (possibly empty) list of - mismatches. Each entry in the mismatch list will be a tuple consisting - of the path, 'exists', 'size' or 'hash' according to what didn't match - (existence is checked first, then size, then hash), the expected - value and the actual value. - """ - mismatches = [] - record_path = os.path.join(self.path, 'installed-files.txt') - if os.path.exists(record_path): - for path, _, _ in self.list_installed_files(): - if path == record_path: - continue - if not os.path.exists(path): - mismatches.append((path, 'exists', True, False)) - return mismatches - - def list_installed_files(self): - """ - Iterates over the ``installed-files.txt`` entries and returns a tuple - ``(path, hash, size)`` for each line. - - :returns: a list of (path, hash, size) - """ - - def _md5(path): - f = open(path, 'rb') - try: - content = f.read() - finally: - f.close() - return hashlib.md5(content).hexdigest() - - def _size(path): - return os.stat(path).st_size - - record_path = os.path.join(self.path, 'installed-files.txt') - result = [] - if os.path.exists(record_path): - with codecs.open(record_path, 'r', encoding='utf-8') as f: - for line in f: - line = line.strip() - p = os.path.normpath(os.path.join(self.path, line)) - # "./" is present as a marker between installed files - # and installation metadata files - if not os.path.exists(p): - logger.warning('Non-existent file: %s', p) - if p.endswith(('.pyc', '.pyo')): - continue - #otherwise fall through and fail - if not os.path.isdir(p): - result.append((p, _md5(p), _size(p))) - result.append((record_path, None, None)) - return result - - def list_distinfo_files(self, absolute=False): - """ - Iterates over the ``installed-files.txt`` entries and returns paths for - each line if the path is pointing to a file located in the - ``.egg-info`` directory or one of its subdirectories. - - :parameter absolute: If *absolute* is ``True``, each returned path is - transformed into a local absolute path. Otherwise the - raw value from ``installed-files.txt`` is returned. - :type absolute: boolean - :returns: iterator of paths - """ - record_path = os.path.join(self.path, 'installed-files.txt') - if os.path.exists(record_path): - skip = True - with codecs.open(record_path, 'r', encoding='utf-8') as f: - for line in f: - line = line.strip() - if line == './': - skip = False - continue - if not skip: - p = os.path.normpath(os.path.join(self.path, line)) - if p.startswith(self.path): - if absolute: - yield p - else: - yield line - - def __eq__(self, other): - return (isinstance(other, EggInfoDistribution) and - self.path == other.path) - - # See http://docs.python.org/reference/datamodel#object.__hash__ - __hash__ = object.__hash__ - -new_dist_class = InstalledDistribution -old_dist_class = EggInfoDistribution - - -class DependencyGraph(object): - """ - Represents a dependency graph between distributions. - - The dependency relationships are stored in an ``adjacency_list`` that maps - distributions to a list of ``(other, label)`` tuples where ``other`` - is a distribution and the edge is labeled with ``label`` (i.e. the version - specifier, if such was provided). Also, for more efficient traversal, for - every distribution ``x``, a list of predecessors is kept in - ``reverse_list[x]``. An edge from distribution ``a`` to - distribution ``b`` means that ``a`` depends on ``b``. If any missing - dependencies are found, they are stored in ``missing``, which is a - dictionary that maps distributions to a list of requirements that were not - provided by any other distributions. - """ - - def __init__(self): - self.adjacency_list = {} - self.reverse_list = {} - self.missing = {} - - def add_distribution(self, distribution): - """Add the *distribution* to the graph. - - :type distribution: :class:`distutils2.database.InstalledDistribution` - or :class:`distutils2.database.EggInfoDistribution` - """ - self.adjacency_list[distribution] = [] - self.reverse_list[distribution] = [] - #self.missing[distribution] = [] - - def add_edge(self, x, y, label=None): - """Add an edge from distribution *x* to distribution *y* with the given - *label*. - - :type x: :class:`distutils2.database.InstalledDistribution` or - :class:`distutils2.database.EggInfoDistribution` - :type y: :class:`distutils2.database.InstalledDistribution` or - :class:`distutils2.database.EggInfoDistribution` - :type label: ``str`` or ``None`` - """ - self.adjacency_list[x].append((y, label)) - # multiple edges are allowed, so be careful - if x not in self.reverse_list[y]: - self.reverse_list[y].append(x) - - def add_missing(self, distribution, requirement): - """ - Add a missing *requirement* for the given *distribution*. - - :type distribution: :class:`distutils2.database.InstalledDistribution` - or :class:`distutils2.database.EggInfoDistribution` - :type requirement: ``str`` - """ - logger.debug('%s missing %r', distribution, requirement) - self.missing.setdefault(distribution, []).append(requirement) - - def _repr_dist(self, dist): - return '%s %s' % (dist.name, dist.version) - - def repr_node(self, dist, level=1): - """Prints only a subgraph""" - output = [self._repr_dist(dist)] - for other, label in self.adjacency_list[dist]: - dist = self._repr_dist(other) - if label is not None: - dist = '%s [%s]' % (dist, label) - output.append(' ' * level + str(dist)) - suboutput = self.repr_node(other, level + 1) - subs = suboutput.split('\n') - output.extend(subs[1:]) - return '\n'.join(output) - - def to_dot(self, f, skip_disconnected=True): - """Writes a DOT output for the graph to the provided file *f*. - - If *skip_disconnected* is set to ``True``, then all distributions - that are not dependent on any other distribution are skipped. - - :type f: has to support ``file``-like operations - :type skip_disconnected: ``bool`` - """ - disconnected = [] - - f.write("digraph dependencies {\n") - for dist, adjs in self.adjacency_list.items(): - if len(adjs) == 0 and not skip_disconnected: - disconnected.append(dist) - for other, label in adjs: - if not label is None: - f.write('"%s" -> "%s" [label="%s"]\n' % - (dist.name, other.name, label)) - else: - f.write('"%s" -> "%s"\n' % (dist.name, other.name)) - if not skip_disconnected and len(disconnected) > 0: - f.write('subgraph disconnected {\n') - f.write('label = "Disconnected"\n') - f.write('bgcolor = red\n') - - for dist in disconnected: - f.write('"%s"' % dist.name) - f.write('\n') - f.write('}\n') - f.write('}\n') - - def topological_sort(self): - """ - Perform a topological sort of the graph. - :return: A tuple, the first element of which is a topologically sorted - list of distributions, and the second element of which is a - list of distributions that cannot be sorted because they have - circular dependencies and so form a cycle. - """ - result = [] - # Make a shallow copy of the adjacency list - alist = {} - for k, v in self.adjacency_list.items(): - alist[k] = v[:] - while True: - # See what we can remove in this run - to_remove = [] - for k, v in list(alist.items())[:]: - if not v: - to_remove.append(k) - del alist[k] - if not to_remove: - # What's left in alist (if anything) is a cycle. - break - # Remove from the adjacency list of others - for k, v in alist.items(): - alist[k] = [(d, r) for d, r in v if d not in to_remove] - logger.debug('Moving to result: %s', - ['%s (%s)' % (d.name, d.version) for d in to_remove]) - result.extend(to_remove) - return result, list(alist.keys()) - - def __repr__(self): - """Representation of the graph""" - output = [] - for dist, adjs in self.adjacency_list.items(): - output.append(self.repr_node(dist)) - return '\n'.join(output) - - -def make_graph(dists, scheme='default'): - """Makes a dependency graph from the given distributions. - - :parameter dists: a list of distributions - :type dists: list of :class:`distutils2.database.InstalledDistribution` and - :class:`distutils2.database.EggInfoDistribution` instances - :rtype: a :class:`DependencyGraph` instance - """ - scheme = get_scheme(scheme) - graph = DependencyGraph() - provided = {} # maps names to lists of (version, dist) tuples - - # first, build the graph and find out what's provided - for dist in dists: - graph.add_distribution(dist) - - for p in dist.provides: - name, version = parse_name_and_version(p) - logger.debug('Add to provided: %s, %s, %s', name, version, dist) - provided.setdefault(name, []).append((version, dist)) - - # now make the edges - for dist in dists: - requires = (dist.run_requires | dist.meta_requires | - dist.build_requires | dist.dev_requires) - for req in requires: - try: - matcher = scheme.matcher(req) - except UnsupportedVersionError: - # XXX compat-mode if cannot read the version - logger.warning('could not read version %r - using name only', - req) - name = req.split()[0] - matcher = scheme.matcher(name) - - name = matcher.key # case-insensitive - - matched = False - if name in provided: - for version, provider in provided[name]: - try: - match = matcher.match(version) - except UnsupportedVersionError: - match = False - - if match: - graph.add_edge(dist, provider, req) - matched = True - break - if not matched: - graph.add_missing(dist, req) - return graph - - -def get_dependent_dists(dists, dist): - """Recursively generate a list of distributions from *dists* that are - dependent on *dist*. - - :param dists: a list of distributions - :param dist: a distribution, member of *dists* for which we are interested - """ - if dist not in dists: - raise DistlibException('given distribution %r is not a member ' - 'of the list' % dist.name) - graph = make_graph(dists) - - dep = [dist] # dependent distributions - todo = graph.reverse_list[dist] # list of nodes we should inspect - - while todo: - d = todo.pop() - dep.append(d) - for succ in graph.reverse_list[d]: - if succ not in dep: - todo.append(succ) - - dep.pop(0) # remove dist from dep, was there to prevent infinite loops - return dep - - -def get_required_dists(dists, dist): - """Recursively generate a list of distributions from *dists* that are - required by *dist*. - - :param dists: a list of distributions - :param dist: a distribution, member of *dists* for which we are interested - """ - if dist not in dists: - raise DistlibException('given distribution %r is not a member ' - 'of the list' % dist.name) - graph = make_graph(dists) - - req = [] # required distributions - todo = graph.adjacency_list[dist] # list of nodes we should inspect - - while todo: - d = todo.pop()[0] - req.append(d) - for pred in graph.adjacency_list[d]: - if pred not in req: - todo.append(pred) - - return req - - -def make_dist(name, version, **kwargs): - """ - A convenience method for making a dist given just a name and version. - """ - summary = kwargs.pop('summary', 'Placeholder for summary') - md = Metadata(**kwargs) - md.name = name - md.version = version - md.summary = summary or 'Placeholder for summary' - return Distribution(md) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/index.py b/env/lib/python3.7/site-packages/pip/_vendor/distlib/index.py deleted file mode 100644 index 2406be2..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/distlib/index.py +++ /dev/null @@ -1,516 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2013 Vinay Sajip. -# Licensed to the Python Software Foundation under a contributor agreement. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -import hashlib -import logging -import os -import shutil -import subprocess -import tempfile -try: - from threading import Thread -except ImportError: - from dummy_threading import Thread - -from . import DistlibException -from .compat import (HTTPBasicAuthHandler, Request, HTTPPasswordMgr, - urlparse, build_opener, string_types) -from .util import cached_property, zip_dir, ServerProxy - -logger = logging.getLogger(__name__) - -DEFAULT_INDEX = 'https://pypi.python.org/pypi' -DEFAULT_REALM = 'pypi' - -class PackageIndex(object): - """ - This class represents a package index compatible with PyPI, the Python - Package Index. - """ - - boundary = b'----------ThIs_Is_tHe_distlib_index_bouNdaRY_$' - - def __init__(self, url=None): - """ - Initialise an instance. - - :param url: The URL of the index. If not specified, the URL for PyPI is - used. - """ - self.url = url or DEFAULT_INDEX - self.read_configuration() - scheme, netloc, path, params, query, frag = urlparse(self.url) - if params or query or frag or scheme not in ('http', 'https'): - raise DistlibException('invalid repository: %s' % self.url) - self.password_handler = None - self.ssl_verifier = None - self.gpg = None - self.gpg_home = None - with open(os.devnull, 'w') as sink: - # Use gpg by default rather than gpg2, as gpg2 insists on - # prompting for passwords - for s in ('gpg', 'gpg2'): - try: - rc = subprocess.check_call([s, '--version'], stdout=sink, - stderr=sink) - if rc == 0: - self.gpg = s - break - except OSError: - pass - - def _get_pypirc_command(self): - """ - Get the distutils command for interacting with PyPI configurations. - :return: the command. - """ - from distutils.core import Distribution - from distutils.config import PyPIRCCommand - d = Distribution() - return PyPIRCCommand(d) - - def read_configuration(self): - """ - Read the PyPI access configuration as supported by distutils, getting - PyPI to do the actual work. This populates ``username``, ``password``, - ``realm`` and ``url`` attributes from the configuration. - """ - # get distutils to do the work - c = self._get_pypirc_command() - c.repository = self.url - cfg = c._read_pypirc() - self.username = cfg.get('username') - self.password = cfg.get('password') - self.realm = cfg.get('realm', 'pypi') - self.url = cfg.get('repository', self.url) - - def save_configuration(self): - """ - Save the PyPI access configuration. You must have set ``username`` and - ``password`` attributes before calling this method. - - Again, distutils is used to do the actual work. - """ - self.check_credentials() - # get distutils to do the work - c = self._get_pypirc_command() - c._store_pypirc(self.username, self.password) - - def check_credentials(self): - """ - Check that ``username`` and ``password`` have been set, and raise an - exception if not. - """ - if self.username is None or self.password is None: - raise DistlibException('username and password must be set') - pm = HTTPPasswordMgr() - _, netloc, _, _, _, _ = urlparse(self.url) - pm.add_password(self.realm, netloc, self.username, self.password) - self.password_handler = HTTPBasicAuthHandler(pm) - - def register(self, metadata): - """ - Register a distribution on PyPI, using the provided metadata. - - :param metadata: A :class:`Metadata` instance defining at least a name - and version number for the distribution to be - registered. - :return: The HTTP response received from PyPI upon submission of the - request. - """ - self.check_credentials() - metadata.validate() - d = metadata.todict() - d[':action'] = 'verify' - request = self.encode_request(d.items(), []) - response = self.send_request(request) - d[':action'] = 'submit' - request = self.encode_request(d.items(), []) - return self.send_request(request) - - def _reader(self, name, stream, outbuf): - """ - Thread runner for reading lines of from a subprocess into a buffer. - - :param name: The logical name of the stream (used for logging only). - :param stream: The stream to read from. This will typically a pipe - connected to the output stream of a subprocess. - :param outbuf: The list to append the read lines to. - """ - while True: - s = stream.readline() - if not s: - break - s = s.decode('utf-8').rstrip() - outbuf.append(s) - logger.debug('%s: %s' % (name, s)) - stream.close() - - def get_sign_command(self, filename, signer, sign_password, - keystore=None): - """ - Return a suitable command for signing a file. - - :param filename: The pathname to the file to be signed. - :param signer: The identifier of the signer of the file. - :param sign_password: The passphrase for the signer's - private key used for signing. - :param keystore: The path to a directory which contains the keys - used in verification. If not specified, the - instance's ``gpg_home`` attribute is used instead. - :return: The signing command as a list suitable to be - passed to :class:`subprocess.Popen`. - """ - cmd = [self.gpg, '--status-fd', '2', '--no-tty'] - if keystore is None: - keystore = self.gpg_home - if keystore: - cmd.extend(['--homedir', keystore]) - if sign_password is not None: - cmd.extend(['--batch', '--passphrase-fd', '0']) - td = tempfile.mkdtemp() - sf = os.path.join(td, os.path.basename(filename) + '.asc') - cmd.extend(['--detach-sign', '--armor', '--local-user', - signer, '--output', sf, filename]) - logger.debug('invoking: %s', ' '.join(cmd)) - return cmd, sf - - def run_command(self, cmd, input_data=None): - """ - Run a command in a child process , passing it any input data specified. - - :param cmd: The command to run. - :param input_data: If specified, this must be a byte string containing - data to be sent to the child process. - :return: A tuple consisting of the subprocess' exit code, a list of - lines read from the subprocess' ``stdout``, and a list of - lines read from the subprocess' ``stderr``. - """ - kwargs = { - 'stdout': subprocess.PIPE, - 'stderr': subprocess.PIPE, - } - if input_data is not None: - kwargs['stdin'] = subprocess.PIPE - stdout = [] - stderr = [] - p = subprocess.Popen(cmd, **kwargs) - # We don't use communicate() here because we may need to - # get clever with interacting with the command - t1 = Thread(target=self._reader, args=('stdout', p.stdout, stdout)) - t1.start() - t2 = Thread(target=self._reader, args=('stderr', p.stderr, stderr)) - t2.start() - if input_data is not None: - p.stdin.write(input_data) - p.stdin.close() - - p.wait() - t1.join() - t2.join() - return p.returncode, stdout, stderr - - def sign_file(self, filename, signer, sign_password, keystore=None): - """ - Sign a file. - - :param filename: The pathname to the file to be signed. - :param signer: The identifier of the signer of the file. - :param sign_password: The passphrase for the signer's - private key used for signing. - :param keystore: The path to a directory which contains the keys - used in signing. If not specified, the instance's - ``gpg_home`` attribute is used instead. - :return: The absolute pathname of the file where the signature is - stored. - """ - cmd, sig_file = self.get_sign_command(filename, signer, sign_password, - keystore) - rc, stdout, stderr = self.run_command(cmd, - sign_password.encode('utf-8')) - if rc != 0: - raise DistlibException('sign command failed with error ' - 'code %s' % rc) - return sig_file - - def upload_file(self, metadata, filename, signer=None, sign_password=None, - filetype='sdist', pyversion='source', keystore=None): - """ - Upload a release file to the index. - - :param metadata: A :class:`Metadata` instance defining at least a name - and version number for the file to be uploaded. - :param filename: The pathname of the file to be uploaded. - :param signer: The identifier of the signer of the file. - :param sign_password: The passphrase for the signer's - private key used for signing. - :param filetype: The type of the file being uploaded. This is the - distutils command which produced that file, e.g. - ``sdist`` or ``bdist_wheel``. - :param pyversion: The version of Python which the release relates - to. For code compatible with any Python, this would - be ``source``, otherwise it would be e.g. ``3.2``. - :param keystore: The path to a directory which contains the keys - used in signing. If not specified, the instance's - ``gpg_home`` attribute is used instead. - :return: The HTTP response received from PyPI upon submission of the - request. - """ - self.check_credentials() - if not os.path.exists(filename): - raise DistlibException('not found: %s' % filename) - metadata.validate() - d = metadata.todict() - sig_file = None - if signer: - if not self.gpg: - logger.warning('no signing program available - not signed') - else: - sig_file = self.sign_file(filename, signer, sign_password, - keystore) - with open(filename, 'rb') as f: - file_data = f.read() - md5_digest = hashlib.md5(file_data).hexdigest() - sha256_digest = hashlib.sha256(file_data).hexdigest() - d.update({ - ':action': 'file_upload', - 'protocol_version': '1', - 'filetype': filetype, - 'pyversion': pyversion, - 'md5_digest': md5_digest, - 'sha256_digest': sha256_digest, - }) - files = [('content', os.path.basename(filename), file_data)] - if sig_file: - with open(sig_file, 'rb') as f: - sig_data = f.read() - files.append(('gpg_signature', os.path.basename(sig_file), - sig_data)) - shutil.rmtree(os.path.dirname(sig_file)) - request = self.encode_request(d.items(), files) - return self.send_request(request) - - def upload_documentation(self, metadata, doc_dir): - """ - Upload documentation to the index. - - :param metadata: A :class:`Metadata` instance defining at least a name - and version number for the documentation to be - uploaded. - :param doc_dir: The pathname of the directory which contains the - documentation. This should be the directory that - contains the ``index.html`` for the documentation. - :return: The HTTP response received from PyPI upon submission of the - request. - """ - self.check_credentials() - if not os.path.isdir(doc_dir): - raise DistlibException('not a directory: %r' % doc_dir) - fn = os.path.join(doc_dir, 'index.html') - if not os.path.exists(fn): - raise DistlibException('not found: %r' % fn) - metadata.validate() - name, version = metadata.name, metadata.version - zip_data = zip_dir(doc_dir).getvalue() - fields = [(':action', 'doc_upload'), - ('name', name), ('version', version)] - files = [('content', name, zip_data)] - request = self.encode_request(fields, files) - return self.send_request(request) - - def get_verify_command(self, signature_filename, data_filename, - keystore=None): - """ - Return a suitable command for verifying a file. - - :param signature_filename: The pathname to the file containing the - signature. - :param data_filename: The pathname to the file containing the - signed data. - :param keystore: The path to a directory which contains the keys - used in verification. If not specified, the - instance's ``gpg_home`` attribute is used instead. - :return: The verifying command as a list suitable to be - passed to :class:`subprocess.Popen`. - """ - cmd = [self.gpg, '--status-fd', '2', '--no-tty'] - if keystore is None: - keystore = self.gpg_home - if keystore: - cmd.extend(['--homedir', keystore]) - cmd.extend(['--verify', signature_filename, data_filename]) - logger.debug('invoking: %s', ' '.join(cmd)) - return cmd - - def verify_signature(self, signature_filename, data_filename, - keystore=None): - """ - Verify a signature for a file. - - :param signature_filename: The pathname to the file containing the - signature. - :param data_filename: The pathname to the file containing the - signed data. - :param keystore: The path to a directory which contains the keys - used in verification. If not specified, the - instance's ``gpg_home`` attribute is used instead. - :return: True if the signature was verified, else False. - """ - if not self.gpg: - raise DistlibException('verification unavailable because gpg ' - 'unavailable') - cmd = self.get_verify_command(signature_filename, data_filename, - keystore) - rc, stdout, stderr = self.run_command(cmd) - if rc not in (0, 1): - raise DistlibException('verify command failed with error ' - 'code %s' % rc) - return rc == 0 - - def download_file(self, url, destfile, digest=None, reporthook=None): - """ - This is a convenience method for downloading a file from an URL. - Normally, this will be a file from the index, though currently - no check is made for this (i.e. a file can be downloaded from - anywhere). - - The method is just like the :func:`urlretrieve` function in the - standard library, except that it allows digest computation to be - done during download and checking that the downloaded data - matched any expected value. - - :param url: The URL of the file to be downloaded (assumed to be - available via an HTTP GET request). - :param destfile: The pathname where the downloaded file is to be - saved. - :param digest: If specified, this must be a (hasher, value) - tuple, where hasher is the algorithm used (e.g. - ``'md5'``) and ``value`` is the expected value. - :param reporthook: The same as for :func:`urlretrieve` in the - standard library. - """ - if digest is None: - digester = None - logger.debug('No digest specified') - else: - if isinstance(digest, (list, tuple)): - hasher, digest = digest - else: - hasher = 'md5' - digester = getattr(hashlib, hasher)() - logger.debug('Digest specified: %s' % digest) - # The following code is equivalent to urlretrieve. - # We need to do it this way so that we can compute the - # digest of the file as we go. - with open(destfile, 'wb') as dfp: - # addinfourl is not a context manager on 2.x - # so we have to use try/finally - sfp = self.send_request(Request(url)) - try: - headers = sfp.info() - blocksize = 8192 - size = -1 - read = 0 - blocknum = 0 - if "content-length" in headers: - size = int(headers["Content-Length"]) - if reporthook: - reporthook(blocknum, blocksize, size) - while True: - block = sfp.read(blocksize) - if not block: - break - read += len(block) - dfp.write(block) - if digester: - digester.update(block) - blocknum += 1 - if reporthook: - reporthook(blocknum, blocksize, size) - finally: - sfp.close() - - # check that we got the whole file, if we can - if size >= 0 and read < size: - raise DistlibException( - 'retrieval incomplete: got only %d out of %d bytes' - % (read, size)) - # if we have a digest, it must match. - if digester: - actual = digester.hexdigest() - if digest != actual: - raise DistlibException('%s digest mismatch for %s: expected ' - '%s, got %s' % (hasher, destfile, - digest, actual)) - logger.debug('Digest verified: %s', digest) - - def send_request(self, req): - """ - Send a standard library :class:`Request` to PyPI and return its - response. - - :param req: The request to send. - :return: The HTTP response from PyPI (a standard library HTTPResponse). - """ - handlers = [] - if self.password_handler: - handlers.append(self.password_handler) - if self.ssl_verifier: - handlers.append(self.ssl_verifier) - opener = build_opener(*handlers) - return opener.open(req) - - def encode_request(self, fields, files): - """ - Encode fields and files for posting to an HTTP server. - - :param fields: The fields to send as a list of (fieldname, value) - tuples. - :param files: The files to send as a list of (fieldname, filename, - file_bytes) tuple. - """ - # Adapted from packaging, which in turn was adapted from - # http://code.activestate.com/recipes/146306 - - parts = [] - boundary = self.boundary - for k, values in fields: - if not isinstance(values, (list, tuple)): - values = [values] - - for v in values: - parts.extend(( - b'--' + boundary, - ('Content-Disposition: form-data; name="%s"' % - k).encode('utf-8'), - b'', - v.encode('utf-8'))) - for key, filename, value in files: - parts.extend(( - b'--' + boundary, - ('Content-Disposition: form-data; name="%s"; filename="%s"' % - (key, filename)).encode('utf-8'), - b'', - value)) - - parts.extend((b'--' + boundary + b'--', b'')) - - body = b'\r\n'.join(parts) - ct = b'multipart/form-data; boundary=' + boundary - headers = { - 'Content-type': ct, - 'Content-length': str(len(body)) - } - return Request(self.url, body, headers) - - def search(self, terms, operator=None): - if isinstance(terms, string_types): - terms = {'name': terms} - rpc_proxy = ServerProxy(self.url, timeout=3.0) - try: - return rpc_proxy.search(terms, operator or 'and') - finally: - rpc_proxy('close')() diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/locators.py b/env/lib/python3.7/site-packages/pip/_vendor/distlib/locators.py deleted file mode 100644 index 5c655c3..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/distlib/locators.py +++ /dev/null @@ -1,1295 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012-2015 Vinay Sajip. -# Licensed to the Python Software Foundation under a contributor agreement. -# See LICENSE.txt and CONTRIBUTORS.txt. -# - -import gzip -from io import BytesIO -import json -import logging -import os -import posixpath -import re -try: - import threading -except ImportError: # pragma: no cover - import dummy_threading as threading -import zlib - -from . import DistlibException -from .compat import (urljoin, urlparse, urlunparse, url2pathname, pathname2url, - queue, quote, unescape, string_types, build_opener, - HTTPRedirectHandler as BaseRedirectHandler, text_type, - Request, HTTPError, URLError) -from .database import Distribution, DistributionPath, make_dist -from .metadata import Metadata, MetadataInvalidError -from .util import (cached_property, parse_credentials, ensure_slash, - split_filename, get_project_data, parse_requirement, - parse_name_and_version, ServerProxy, normalize_name) -from .version import get_scheme, UnsupportedVersionError -from .wheel import Wheel, is_compatible - -logger = logging.getLogger(__name__) - -HASHER_HASH = re.compile(r'^(\w+)=([a-f0-9]+)') -CHARSET = re.compile(r';\s*charset\s*=\s*(.*)\s*$', re.I) -HTML_CONTENT_TYPE = re.compile('text/html|application/x(ht)?ml') -DEFAULT_INDEX = 'https://pypi.python.org/pypi' - -def get_all_distribution_names(url=None): - """ - Return all distribution names known by an index. - :param url: The URL of the index. - :return: A list of all known distribution names. - """ - if url is None: - url = DEFAULT_INDEX - client = ServerProxy(url, timeout=3.0) - try: - return client.list_packages() - finally: - client('close')() - -class RedirectHandler(BaseRedirectHandler): - """ - A class to work around a bug in some Python 3.2.x releases. - """ - # There's a bug in the base version for some 3.2.x - # (e.g. 3.2.2 on Ubuntu Oneiric). If a Location header - # returns e.g. /abc, it bails because it says the scheme '' - # is bogus, when actually it should use the request's - # URL for the scheme. See Python issue #13696. - def http_error_302(self, req, fp, code, msg, headers): - # Some servers (incorrectly) return multiple Location headers - # (so probably same goes for URI). Use first header. - newurl = None - for key in ('location', 'uri'): - if key in headers: - newurl = headers[key] - break - if newurl is None: # pragma: no cover - return - urlparts = urlparse(newurl) - if urlparts.scheme == '': - newurl = urljoin(req.get_full_url(), newurl) - if hasattr(headers, 'replace_header'): - headers.replace_header(key, newurl) - else: - headers[key] = newurl - return BaseRedirectHandler.http_error_302(self, req, fp, code, msg, - headers) - - http_error_301 = http_error_303 = http_error_307 = http_error_302 - -class Locator(object): - """ - A base class for locators - things that locate distributions. - """ - source_extensions = ('.tar.gz', '.tar.bz2', '.tar', '.zip', '.tgz', '.tbz') - binary_extensions = ('.egg', '.exe', '.whl') - excluded_extensions = ('.pdf',) - - # A list of tags indicating which wheels you want to match. The default - # value of None matches against the tags compatible with the running - # Python. If you want to match other values, set wheel_tags on a locator - # instance to a list of tuples (pyver, abi, arch) which you want to match. - wheel_tags = None - - downloadable_extensions = source_extensions + ('.whl',) - - def __init__(self, scheme='default'): - """ - Initialise an instance. - :param scheme: Because locators look for most recent versions, they - need to know the version scheme to use. This specifies - the current PEP-recommended scheme - use ``'legacy'`` - if you need to support existing distributions on PyPI. - """ - self._cache = {} - self.scheme = scheme - # Because of bugs in some of the handlers on some of the platforms, - # we use our own opener rather than just using urlopen. - self.opener = build_opener(RedirectHandler()) - # If get_project() is called from locate(), the matcher instance - # is set from the requirement passed to locate(). See issue #18 for - # why this can be useful to know. - self.matcher = None - self.errors = queue.Queue() - - def get_errors(self): - """ - Return any errors which have occurred. - """ - result = [] - while not self.errors.empty(): # pragma: no cover - try: - e = self.errors.get(False) - result.append(e) - except self.errors.Empty: - continue - self.errors.task_done() - return result - - def clear_errors(self): - """ - Clear any errors which may have been logged. - """ - # Just get the errors and throw them away - self.get_errors() - - def clear_cache(self): - self._cache.clear() - - def _get_scheme(self): - return self._scheme - - def _set_scheme(self, value): - self._scheme = value - - scheme = property(_get_scheme, _set_scheme) - - def _get_project(self, name): - """ - For a given project, get a dictionary mapping available versions to Distribution - instances. - - This should be implemented in subclasses. - - If called from a locate() request, self.matcher will be set to a - matcher for the requirement to satisfy, otherwise it will be None. - """ - raise NotImplementedError('Please implement in the subclass') - - def get_distribution_names(self): - """ - Return all the distribution names known to this locator. - """ - raise NotImplementedError('Please implement in the subclass') - - def get_project(self, name): - """ - For a given project, get a dictionary mapping available versions to Distribution - instances. - - This calls _get_project to do all the work, and just implements a caching layer on top. - """ - if self._cache is None: # pragma: no cover - result = self._get_project(name) - elif name in self._cache: - result = self._cache[name] - else: - self.clear_errors() - result = self._get_project(name) - self._cache[name] = result - return result - - def score_url(self, url): - """ - Give an url a score which can be used to choose preferred URLs - for a given project release. - """ - t = urlparse(url) - basename = posixpath.basename(t.path) - compatible = True - is_wheel = basename.endswith('.whl') - is_downloadable = basename.endswith(self.downloadable_extensions) - if is_wheel: - compatible = is_compatible(Wheel(basename), self.wheel_tags) - return (t.scheme == 'https', 'pypi.python.org' in t.netloc, - is_downloadable, is_wheel, compatible, basename) - - def prefer_url(self, url1, url2): - """ - Choose one of two URLs where both are candidates for distribution - archives for the same version of a distribution (for example, - .tar.gz vs. zip). - - The current implementation favours https:// URLs over http://, archives - from PyPI over those from other locations, wheel compatibility (if a - wheel) and then the archive name. - """ - result = url2 - if url1: - s1 = self.score_url(url1) - s2 = self.score_url(url2) - if s1 > s2: - result = url1 - if result != url2: - logger.debug('Not replacing %r with %r', url1, url2) - else: - logger.debug('Replacing %r with %r', url1, url2) - return result - - def split_filename(self, filename, project_name): - """ - Attempt to split a filename in project name, version and Python version. - """ - return split_filename(filename, project_name) - - def convert_url_to_download_info(self, url, project_name): - """ - See if a URL is a candidate for a download URL for a project (the URL - has typically been scraped from an HTML page). - - If it is, a dictionary is returned with keys "name", "version", - "filename" and "url"; otherwise, None is returned. - """ - def same_project(name1, name2): - return normalize_name(name1) == normalize_name(name2) - - result = None - scheme, netloc, path, params, query, frag = urlparse(url) - if frag.lower().startswith('egg='): # pragma: no cover - logger.debug('%s: version hint in fragment: %r', - project_name, frag) - m = HASHER_HASH.match(frag) - if m: - algo, digest = m.groups() - else: - algo, digest = None, None - origpath = path - if path and path[-1] == '/': # pragma: no cover - path = path[:-1] - if path.endswith('.whl'): - try: - wheel = Wheel(path) - if not is_compatible(wheel, self.wheel_tags): - logger.debug('Wheel not compatible: %s', path) - else: - if project_name is None: - include = True - else: - include = same_project(wheel.name, project_name) - if include: - result = { - 'name': wheel.name, - 'version': wheel.version, - 'filename': wheel.filename, - 'url': urlunparse((scheme, netloc, origpath, - params, query, '')), - 'python-version': ', '.join( - ['.'.join(list(v[2:])) for v in wheel.pyver]), - } - except Exception as e: # pragma: no cover - logger.warning('invalid path for wheel: %s', path) - elif not path.endswith(self.downloadable_extensions): # pragma: no cover - logger.debug('Not downloadable: %s', path) - else: # downloadable extension - path = filename = posixpath.basename(path) - for ext in self.downloadable_extensions: - if path.endswith(ext): - path = path[:-len(ext)] - t = self.split_filename(path, project_name) - if not t: # pragma: no cover - logger.debug('No match for project/version: %s', path) - else: - name, version, pyver = t - if not project_name or same_project(project_name, name): - result = { - 'name': name, - 'version': version, - 'filename': filename, - 'url': urlunparse((scheme, netloc, origpath, - params, query, '')), - #'packagetype': 'sdist', - } - if pyver: # pragma: no cover - result['python-version'] = pyver - break - if result and algo: - result['%s_digest' % algo] = digest - return result - - def _get_digest(self, info): - """ - Get a digest from a dictionary by looking at keys of the form - 'algo_digest'. - - Returns a 2-tuple (algo, digest) if found, else None. Currently - looks only for SHA256, then MD5. - """ - result = None - for algo in ('sha256', 'md5'): - key = '%s_digest' % algo - if key in info: - result = (algo, info[key]) - break - return result - - def _update_version_data(self, result, info): - """ - Update a result dictionary (the final result from _get_project) with a - dictionary for a specific version, which typically holds information - gleaned from a filename or URL for an archive for the distribution. - """ - name = info.pop('name') - version = info.pop('version') - if version in result: - dist = result[version] - md = dist.metadata - else: - dist = make_dist(name, version, scheme=self.scheme) - md = dist.metadata - dist.digest = digest = self._get_digest(info) - url = info['url'] - result['digests'][url] = digest - if md.source_url != info['url']: - md.source_url = self.prefer_url(md.source_url, url) - result['urls'].setdefault(version, set()).add(url) - dist.locator = self - result[version] = dist - - def locate(self, requirement, prereleases=False): - """ - Find the most recent distribution which matches the given - requirement. - - :param requirement: A requirement of the form 'foo (1.0)' or perhaps - 'foo (>= 1.0, < 2.0, != 1.3)' - :param prereleases: If ``True``, allow pre-release versions - to be located. Otherwise, pre-release versions - are not returned. - :return: A :class:`Distribution` instance, or ``None`` if no such - distribution could be located. - """ - result = None - r = parse_requirement(requirement) - if r is None: # pragma: no cover - raise DistlibException('Not a valid requirement: %r' % requirement) - scheme = get_scheme(self.scheme) - self.matcher = matcher = scheme.matcher(r.requirement) - logger.debug('matcher: %s (%s)', matcher, type(matcher).__name__) - versions = self.get_project(r.name) - if len(versions) > 2: # urls and digests keys are present - # sometimes, versions are invalid - slist = [] - vcls = matcher.version_class - for k in versions: - if k in ('urls', 'digests'): - continue - try: - if not matcher.match(k): - logger.debug('%s did not match %r', matcher, k) - else: - if prereleases or not vcls(k).is_prerelease: - slist.append(k) - else: - logger.debug('skipping pre-release ' - 'version %s of %s', k, matcher.name) - except Exception: # pragma: no cover - logger.warning('error matching %s with %r', matcher, k) - pass # slist.append(k) - if len(slist) > 1: - slist = sorted(slist, key=scheme.key) - if slist: - logger.debug('sorted list: %s', slist) - version = slist[-1] - result = versions[version] - if result: - if r.extras: - result.extras = r.extras - result.download_urls = versions.get('urls', {}).get(version, set()) - d = {} - sd = versions.get('digests', {}) - for url in result.download_urls: - if url in sd: # pragma: no cover - d[url] = sd[url] - result.digests = d - self.matcher = None - return result - - -class PyPIRPCLocator(Locator): - """ - This locator uses XML-RPC to locate distributions. It therefore - cannot be used with simple mirrors (that only mirror file content). - """ - def __init__(self, url, **kwargs): - """ - Initialise an instance. - - :param url: The URL to use for XML-RPC. - :param kwargs: Passed to the superclass constructor. - """ - super(PyPIRPCLocator, self).__init__(**kwargs) - self.base_url = url - self.client = ServerProxy(url, timeout=3.0) - - def get_distribution_names(self): - """ - Return all the distribution names known to this locator. - """ - return set(self.client.list_packages()) - - def _get_project(self, name): - result = {'urls': {}, 'digests': {}} - versions = self.client.package_releases(name, True) - for v in versions: - urls = self.client.release_urls(name, v) - data = self.client.release_data(name, v) - metadata = Metadata(scheme=self.scheme) - metadata.name = data['name'] - metadata.version = data['version'] - metadata.license = data.get('license') - metadata.keywords = data.get('keywords', []) - metadata.summary = data.get('summary') - dist = Distribution(metadata) - if urls: - info = urls[0] - metadata.source_url = info['url'] - dist.digest = self._get_digest(info) - dist.locator = self - result[v] = dist - for info in urls: - url = info['url'] - digest = self._get_digest(info) - result['urls'].setdefault(v, set()).add(url) - result['digests'][url] = digest - return result - -class PyPIJSONLocator(Locator): - """ - This locator uses PyPI's JSON interface. It's very limited in functionality - and probably not worth using. - """ - def __init__(self, url, **kwargs): - super(PyPIJSONLocator, self).__init__(**kwargs) - self.base_url = ensure_slash(url) - - def get_distribution_names(self): - """ - Return all the distribution names known to this locator. - """ - raise NotImplementedError('Not available from this locator') - - def _get_project(self, name): - result = {'urls': {}, 'digests': {}} - url = urljoin(self.base_url, '%s/json' % quote(name)) - try: - resp = self.opener.open(url) - data = resp.read().decode() # for now - d = json.loads(data) - md = Metadata(scheme=self.scheme) - data = d['info'] - md.name = data['name'] - md.version = data['version'] - md.license = data.get('license') - md.keywords = data.get('keywords', []) - md.summary = data.get('summary') - dist = Distribution(md) - dist.locator = self - urls = d['urls'] - result[md.version] = dist - for info in d['urls']: - url = info['url'] - dist.download_urls.add(url) - dist.digests[url] = self._get_digest(info) - result['urls'].setdefault(md.version, set()).add(url) - result['digests'][url] = self._get_digest(info) - # Now get other releases - for version, infos in d['releases'].items(): - if version == md.version: - continue # already done - omd = Metadata(scheme=self.scheme) - omd.name = md.name - omd.version = version - odist = Distribution(omd) - odist.locator = self - result[version] = odist - for info in infos: - url = info['url'] - odist.download_urls.add(url) - odist.digests[url] = self._get_digest(info) - result['urls'].setdefault(version, set()).add(url) - result['digests'][url] = self._get_digest(info) -# for info in urls: -# md.source_url = info['url'] -# dist.digest = self._get_digest(info) -# dist.locator = self -# for info in urls: -# url = info['url'] -# result['urls'].setdefault(md.version, set()).add(url) -# result['digests'][url] = self._get_digest(info) - except Exception as e: - self.errors.put(text_type(e)) - logger.exception('JSON fetch failed: %s', e) - return result - - -class Page(object): - """ - This class represents a scraped HTML page. - """ - # The following slightly hairy-looking regex just looks for the contents of - # an anchor link, which has an attribute "href" either immediately preceded - # or immediately followed by a "rel" attribute. The attribute values can be - # declared with double quotes, single quotes or no quotes - which leads to - # the length of the expression. - _href = re.compile(""" -(rel\\s*=\\s*(?:"(?P<rel1>[^"]*)"|'(?P<rel2>[^']*)'|(?P<rel3>[^>\\s\n]*))\\s+)? -href\\s*=\\s*(?:"(?P<url1>[^"]*)"|'(?P<url2>[^']*)'|(?P<url3>[^>\\s\n]*)) -(\\s+rel\\s*=\\s*(?:"(?P<rel4>[^"]*)"|'(?P<rel5>[^']*)'|(?P<rel6>[^>\\s\n]*)))? -""", re.I | re.S | re.X) - _base = re.compile(r"""<base\s+href\s*=\s*['"]?([^'">]+)""", re.I | re.S) - - def __init__(self, data, url): - """ - Initialise an instance with the Unicode page contents and the URL they - came from. - """ - self.data = data - self.base_url = self.url = url - m = self._base.search(self.data) - if m: - self.base_url = m.group(1) - - _clean_re = re.compile(r'[^a-z0-9$&+,/:;=?@.#%_\\|-]', re.I) - - @cached_property - def links(self): - """ - Return the URLs of all the links on a page together with information - about their "rel" attribute, for determining which ones to treat as - downloads and which ones to queue for further scraping. - """ - def clean(url): - "Tidy up an URL." - scheme, netloc, path, params, query, frag = urlparse(url) - return urlunparse((scheme, netloc, quote(path), - params, query, frag)) - - result = set() - for match in self._href.finditer(self.data): - d = match.groupdict('') - rel = (d['rel1'] or d['rel2'] or d['rel3'] or - d['rel4'] or d['rel5'] or d['rel6']) - url = d['url1'] or d['url2'] or d['url3'] - url = urljoin(self.base_url, url) - url = unescape(url) - url = self._clean_re.sub(lambda m: '%%%2x' % ord(m.group(0)), url) - result.add((url, rel)) - # We sort the result, hoping to bring the most recent versions - # to the front - result = sorted(result, key=lambda t: t[0], reverse=True) - return result - - -class SimpleScrapingLocator(Locator): - """ - A locator which scrapes HTML pages to locate downloads for a distribution. - This runs multiple threads to do the I/O; performance is at least as good - as pip's PackageFinder, which works in an analogous fashion. - """ - - # These are used to deal with various Content-Encoding schemes. - decoders = { - 'deflate': zlib.decompress, - 'gzip': lambda b: gzip.GzipFile(fileobj=BytesIO(d)).read(), - 'none': lambda b: b, - } - - def __init__(self, url, timeout=None, num_workers=10, **kwargs): - """ - Initialise an instance. - :param url: The root URL to use for scraping. - :param timeout: The timeout, in seconds, to be applied to requests. - This defaults to ``None`` (no timeout specified). - :param num_workers: The number of worker threads you want to do I/O, - This defaults to 10. - :param kwargs: Passed to the superclass. - """ - super(SimpleScrapingLocator, self).__init__(**kwargs) - self.base_url = ensure_slash(url) - self.timeout = timeout - self._page_cache = {} - self._seen = set() - self._to_fetch = queue.Queue() - self._bad_hosts = set() - self.skip_externals = False - self.num_workers = num_workers - self._lock = threading.RLock() - # See issue #45: we need to be resilient when the locator is used - # in a thread, e.g. with concurrent.futures. We can't use self._lock - # as it is for coordinating our internal threads - the ones created - # in _prepare_threads. - self._gplock = threading.RLock() - self.platform_check = False # See issue #112 - - def _prepare_threads(self): - """ - Threads are created only when get_project is called, and terminate - before it returns. They are there primarily to parallelise I/O (i.e. - fetching web pages). - """ - self._threads = [] - for i in range(self.num_workers): - t = threading.Thread(target=self._fetch) - t.setDaemon(True) - t.start() - self._threads.append(t) - - def _wait_threads(self): - """ - Tell all the threads to terminate (by sending a sentinel value) and - wait for them to do so. - """ - # Note that you need two loops, since you can't say which - # thread will get each sentinel - for t in self._threads: - self._to_fetch.put(None) # sentinel - for t in self._threads: - t.join() - self._threads = [] - - def _get_project(self, name): - result = {'urls': {}, 'digests': {}} - with self._gplock: - self.result = result - self.project_name = name - url = urljoin(self.base_url, '%s/' % quote(name)) - self._seen.clear() - self._page_cache.clear() - self._prepare_threads() - try: - logger.debug('Queueing %s', url) - self._to_fetch.put(url) - self._to_fetch.join() - finally: - self._wait_threads() - del self.result - return result - - platform_dependent = re.compile(r'\b(linux_(i\d86|x86_64|arm\w+)|' - r'win(32|_amd64)|macosx_?\d+)\b', re.I) - - def _is_platform_dependent(self, url): - """ - Does an URL refer to a platform-specific download? - """ - return self.platform_dependent.search(url) - - def _process_download(self, url): - """ - See if an URL is a suitable download for a project. - - If it is, register information in the result dictionary (for - _get_project) about the specific version it's for. - - Note that the return value isn't actually used other than as a boolean - value. - """ - if self.platform_check and self._is_platform_dependent(url): - info = None - else: - info = self.convert_url_to_download_info(url, self.project_name) - logger.debug('process_download: %s -> %s', url, info) - if info: - with self._lock: # needed because self.result is shared - self._update_version_data(self.result, info) - return info - - def _should_queue(self, link, referrer, rel): - """ - Determine whether a link URL from a referring page and with a - particular "rel" attribute should be queued for scraping. - """ - scheme, netloc, path, _, _, _ = urlparse(link) - if path.endswith(self.source_extensions + self.binary_extensions + - self.excluded_extensions): - result = False - elif self.skip_externals and not link.startswith(self.base_url): - result = False - elif not referrer.startswith(self.base_url): - result = False - elif rel not in ('homepage', 'download'): - result = False - elif scheme not in ('http', 'https', 'ftp'): - result = False - elif self._is_platform_dependent(link): - result = False - else: - host = netloc.split(':', 1)[0] - if host.lower() == 'localhost': - result = False - else: - result = True - logger.debug('should_queue: %s (%s) from %s -> %s', link, rel, - referrer, result) - return result - - def _fetch(self): - """ - Get a URL to fetch from the work queue, get the HTML page, examine its - links for download candidates and candidates for further scraping. - - This is a handy method to run in a thread. - """ - while True: - url = self._to_fetch.get() - try: - if url: - page = self.get_page(url) - if page is None: # e.g. after an error - continue - for link, rel in page.links: - if link not in self._seen: - try: - self._seen.add(link) - if (not self._process_download(link) and - self._should_queue(link, url, rel)): - logger.debug('Queueing %s from %s', link, url) - self._to_fetch.put(link) - except MetadataInvalidError: # e.g. invalid versions - pass - except Exception as e: # pragma: no cover - self.errors.put(text_type(e)) - finally: - # always do this, to avoid hangs :-) - self._to_fetch.task_done() - if not url: - #logger.debug('Sentinel seen, quitting.') - break - - def get_page(self, url): - """ - Get the HTML for an URL, possibly from an in-memory cache. - - XXX TODO Note: this cache is never actually cleared. It's assumed that - the data won't get stale over the lifetime of a locator instance (not - necessarily true for the default_locator). - """ - # http://peak.telecommunity.com/DevCenter/EasyInstall#package-index-api - scheme, netloc, path, _, _, _ = urlparse(url) - if scheme == 'file' and os.path.isdir(url2pathname(path)): - url = urljoin(ensure_slash(url), 'index.html') - - if url in self._page_cache: - result = self._page_cache[url] - logger.debug('Returning %s from cache: %s', url, result) - else: - host = netloc.split(':', 1)[0] - result = None - if host in self._bad_hosts: - logger.debug('Skipping %s due to bad host %s', url, host) - else: - req = Request(url, headers={'Accept-encoding': 'identity'}) - try: - logger.debug('Fetching %s', url) - resp = self.opener.open(req, timeout=self.timeout) - logger.debug('Fetched %s', url) - headers = resp.info() - content_type = headers.get('Content-Type', '') - if HTML_CONTENT_TYPE.match(content_type): - final_url = resp.geturl() - data = resp.read() - encoding = headers.get('Content-Encoding') - if encoding: - decoder = self.decoders[encoding] # fail if not found - data = decoder(data) - encoding = 'utf-8' - m = CHARSET.search(content_type) - if m: - encoding = m.group(1) - try: - data = data.decode(encoding) - except UnicodeError: # pragma: no cover - data = data.decode('latin-1') # fallback - result = Page(data, final_url) - self._page_cache[final_url] = result - except HTTPError as e: - if e.code != 404: - logger.exception('Fetch failed: %s: %s', url, e) - except URLError as e: # pragma: no cover - logger.exception('Fetch failed: %s: %s', url, e) - with self._lock: - self._bad_hosts.add(host) - except Exception as e: # pragma: no cover - logger.exception('Fetch failed: %s: %s', url, e) - finally: - self._page_cache[url] = result # even if None (failure) - return result - - _distname_re = re.compile('<a href=[^>]*>([^<]+)<') - - def get_distribution_names(self): - """ - Return all the distribution names known to this locator. - """ - result = set() - page = self.get_page(self.base_url) - if not page: - raise DistlibException('Unable to get %s' % self.base_url) - for match in self._distname_re.finditer(page.data): - result.add(match.group(1)) - return result - -class DirectoryLocator(Locator): - """ - This class locates distributions in a directory tree. - """ - - def __init__(self, path, **kwargs): - """ - Initialise an instance. - :param path: The root of the directory tree to search. - :param kwargs: Passed to the superclass constructor, - except for: - * recursive - if True (the default), subdirectories are - recursed into. If False, only the top-level directory - is searched, - """ - self.recursive = kwargs.pop('recursive', True) - super(DirectoryLocator, self).__init__(**kwargs) - path = os.path.abspath(path) - if not os.path.isdir(path): # pragma: no cover - raise DistlibException('Not a directory: %r' % path) - self.base_dir = path - - def should_include(self, filename, parent): - """ - Should a filename be considered as a candidate for a distribution - archive? As well as the filename, the directory which contains it - is provided, though not used by the current implementation. - """ - return filename.endswith(self.downloadable_extensions) - - def _get_project(self, name): - result = {'urls': {}, 'digests': {}} - for root, dirs, files in os.walk(self.base_dir): - for fn in files: - if self.should_include(fn, root): - fn = os.path.join(root, fn) - url = urlunparse(('file', '', - pathname2url(os.path.abspath(fn)), - '', '', '')) - info = self.convert_url_to_download_info(url, name) - if info: - self._update_version_data(result, info) - if not self.recursive: - break - return result - - def get_distribution_names(self): - """ - Return all the distribution names known to this locator. - """ - result = set() - for root, dirs, files in os.walk(self.base_dir): - for fn in files: - if self.should_include(fn, root): - fn = os.path.join(root, fn) - url = urlunparse(('file', '', - pathname2url(os.path.abspath(fn)), - '', '', '')) - info = self.convert_url_to_download_info(url, None) - if info: - result.add(info['name']) - if not self.recursive: - break - return result - -class JSONLocator(Locator): - """ - This locator uses special extended metadata (not available on PyPI) and is - the basis of performant dependency resolution in distlib. Other locators - require archive downloads before dependencies can be determined! As you - might imagine, that can be slow. - """ - def get_distribution_names(self): - """ - Return all the distribution names known to this locator. - """ - raise NotImplementedError('Not available from this locator') - - def _get_project(self, name): - result = {'urls': {}, 'digests': {}} - data = get_project_data(name) - if data: - for info in data.get('files', []): - if info['ptype'] != 'sdist' or info['pyversion'] != 'source': - continue - # We don't store summary in project metadata as it makes - # the data bigger for no benefit during dependency - # resolution - dist = make_dist(data['name'], info['version'], - summary=data.get('summary', - 'Placeholder for summary'), - scheme=self.scheme) - md = dist.metadata - md.source_url = info['url'] - # TODO SHA256 digest - if 'digest' in info and info['digest']: - dist.digest = ('md5', info['digest']) - md.dependencies = info.get('requirements', {}) - dist.exports = info.get('exports', {}) - result[dist.version] = dist - result['urls'].setdefault(dist.version, set()).add(info['url']) - return result - -class DistPathLocator(Locator): - """ - This locator finds installed distributions in a path. It can be useful for - adding to an :class:`AggregatingLocator`. - """ - def __init__(self, distpath, **kwargs): - """ - Initialise an instance. - - :param distpath: A :class:`DistributionPath` instance to search. - """ - super(DistPathLocator, self).__init__(**kwargs) - assert isinstance(distpath, DistributionPath) - self.distpath = distpath - - def _get_project(self, name): - dist = self.distpath.get_distribution(name) - if dist is None: - result = {'urls': {}, 'digests': {}} - else: - result = { - dist.version: dist, - 'urls': {dist.version: set([dist.source_url])}, - 'digests': {dist.version: set([None])} - } - return result - - -class AggregatingLocator(Locator): - """ - This class allows you to chain and/or merge a list of locators. - """ - def __init__(self, *locators, **kwargs): - """ - Initialise an instance. - - :param locators: The list of locators to search. - :param kwargs: Passed to the superclass constructor, - except for: - * merge - if False (the default), the first successful - search from any of the locators is returned. If True, - the results from all locators are merged (this can be - slow). - """ - self.merge = kwargs.pop('merge', False) - self.locators = locators - super(AggregatingLocator, self).__init__(**kwargs) - - def clear_cache(self): - super(AggregatingLocator, self).clear_cache() - for locator in self.locators: - locator.clear_cache() - - def _set_scheme(self, value): - self._scheme = value - for locator in self.locators: - locator.scheme = value - - scheme = property(Locator.scheme.fget, _set_scheme) - - def _get_project(self, name): - result = {} - for locator in self.locators: - d = locator.get_project(name) - if d: - if self.merge: - files = result.get('urls', {}) - digests = result.get('digests', {}) - # next line could overwrite result['urls'], result['digests'] - result.update(d) - df = result.get('urls') - if files and df: - for k, v in files.items(): - if k in df: - df[k] |= v - else: - df[k] = v - dd = result.get('digests') - if digests and dd: - dd.update(digests) - else: - # See issue #18. If any dists are found and we're looking - # for specific constraints, we only return something if - # a match is found. For example, if a DirectoryLocator - # returns just foo (1.0) while we're looking for - # foo (>= 2.0), we'll pretend there was nothing there so - # that subsequent locators can be queried. Otherwise we - # would just return foo (1.0) which would then lead to a - # failure to find foo (>= 2.0), because other locators - # weren't searched. Note that this only matters when - # merge=False. - if self.matcher is None: - found = True - else: - found = False - for k in d: - if self.matcher.match(k): - found = True - break - if found: - result = d - break - return result - - def get_distribution_names(self): - """ - Return all the distribution names known to this locator. - """ - result = set() - for locator in self.locators: - try: - result |= locator.get_distribution_names() - except NotImplementedError: - pass - return result - - -# We use a legacy scheme simply because most of the dists on PyPI use legacy -# versions which don't conform to PEP 426 / PEP 440. -default_locator = AggregatingLocator( - JSONLocator(), - SimpleScrapingLocator('https://pypi.python.org/simple/', - timeout=3.0), - scheme='legacy') - -locate = default_locator.locate - -NAME_VERSION_RE = re.compile(r'(?P<name>[\w-]+)\s*' - r'\(\s*(==\s*)?(?P<ver>[^)]+)\)$') - -class DependencyFinder(object): - """ - Locate dependencies for distributions. - """ - - def __init__(self, locator=None): - """ - Initialise an instance, using the specified locator - to locate distributions. - """ - self.locator = locator or default_locator - self.scheme = get_scheme(self.locator.scheme) - - def add_distribution(self, dist): - """ - Add a distribution to the finder. This will update internal information - about who provides what. - :param dist: The distribution to add. - """ - logger.debug('adding distribution %s', dist) - name = dist.key - self.dists_by_name[name] = dist - self.dists[(name, dist.version)] = dist - for p in dist.provides: - name, version = parse_name_and_version(p) - logger.debug('Add to provided: %s, %s, %s', name, version, dist) - self.provided.setdefault(name, set()).add((version, dist)) - - def remove_distribution(self, dist): - """ - Remove a distribution from the finder. This will update internal - information about who provides what. - :param dist: The distribution to remove. - """ - logger.debug('removing distribution %s', dist) - name = dist.key - del self.dists_by_name[name] - del self.dists[(name, dist.version)] - for p in dist.provides: - name, version = parse_name_and_version(p) - logger.debug('Remove from provided: %s, %s, %s', name, version, dist) - s = self.provided[name] - s.remove((version, dist)) - if not s: - del self.provided[name] - - def get_matcher(self, reqt): - """ - Get a version matcher for a requirement. - :param reqt: The requirement - :type reqt: str - :return: A version matcher (an instance of - :class:`distlib.version.Matcher`). - """ - try: - matcher = self.scheme.matcher(reqt) - except UnsupportedVersionError: # pragma: no cover - # XXX compat-mode if cannot read the version - name = reqt.split()[0] - matcher = self.scheme.matcher(name) - return matcher - - def find_providers(self, reqt): - """ - Find the distributions which can fulfill a requirement. - - :param reqt: The requirement. - :type reqt: str - :return: A set of distribution which can fulfill the requirement. - """ - matcher = self.get_matcher(reqt) - name = matcher.key # case-insensitive - result = set() - provided = self.provided - if name in provided: - for version, provider in provided[name]: - try: - match = matcher.match(version) - except UnsupportedVersionError: - match = False - - if match: - result.add(provider) - break - return result - - def try_to_replace(self, provider, other, problems): - """ - Attempt to replace one provider with another. This is typically used - when resolving dependencies from multiple sources, e.g. A requires - (B >= 1.0) while C requires (B >= 1.1). - - For successful replacement, ``provider`` must meet all the requirements - which ``other`` fulfills. - - :param provider: The provider we are trying to replace with. - :param other: The provider we're trying to replace. - :param problems: If False is returned, this will contain what - problems prevented replacement. This is currently - a tuple of the literal string 'cantreplace', - ``provider``, ``other`` and the set of requirements - that ``provider`` couldn't fulfill. - :return: True if we can replace ``other`` with ``provider``, else - False. - """ - rlist = self.reqts[other] - unmatched = set() - for s in rlist: - matcher = self.get_matcher(s) - if not matcher.match(provider.version): - unmatched.add(s) - if unmatched: - # can't replace other with provider - problems.add(('cantreplace', provider, other, - frozenset(unmatched))) - result = False - else: - # can replace other with provider - self.remove_distribution(other) - del self.reqts[other] - for s in rlist: - self.reqts.setdefault(provider, set()).add(s) - self.add_distribution(provider) - result = True - return result - - def find(self, requirement, meta_extras=None, prereleases=False): - """ - Find a distribution and all distributions it depends on. - - :param requirement: The requirement specifying the distribution to - find, or a Distribution instance. - :param meta_extras: A list of meta extras such as :test:, :build: and - so on. - :param prereleases: If ``True``, allow pre-release versions to be - returned - otherwise, don't return prereleases - unless they're all that's available. - - Return a set of :class:`Distribution` instances and a set of - problems. - - The distributions returned should be such that they have the - :attr:`required` attribute set to ``True`` if they were - from the ``requirement`` passed to ``find()``, and they have the - :attr:`build_time_dependency` attribute set to ``True`` unless they - are post-installation dependencies of the ``requirement``. - - The problems should be a tuple consisting of the string - ``'unsatisfied'`` and the requirement which couldn't be satisfied - by any distribution known to the locator. - """ - - self.provided = {} - self.dists = {} - self.dists_by_name = {} - self.reqts = {} - - meta_extras = set(meta_extras or []) - if ':*:' in meta_extras: - meta_extras.remove(':*:') - # :meta: and :run: are implicitly included - meta_extras |= set([':test:', ':build:', ':dev:']) - - if isinstance(requirement, Distribution): - dist = odist = requirement - logger.debug('passed %s as requirement', odist) - else: - dist = odist = self.locator.locate(requirement, - prereleases=prereleases) - if dist is None: - raise DistlibException('Unable to locate %r' % requirement) - logger.debug('located %s', odist) - dist.requested = True - problems = set() - todo = set([dist]) - install_dists = set([odist]) - while todo: - dist = todo.pop() - name = dist.key # case-insensitive - if name not in self.dists_by_name: - self.add_distribution(dist) - else: - #import pdb; pdb.set_trace() - other = self.dists_by_name[name] - if other != dist: - self.try_to_replace(dist, other, problems) - - ireqts = dist.run_requires | dist.meta_requires - sreqts = dist.build_requires - ereqts = set() - if meta_extras and dist in install_dists: - for key in ('test', 'build', 'dev'): - e = ':%s:' % key - if e in meta_extras: - ereqts |= getattr(dist, '%s_requires' % key) - all_reqts = ireqts | sreqts | ereqts - for r in all_reqts: - providers = self.find_providers(r) - if not providers: - logger.debug('No providers found for %r', r) - provider = self.locator.locate(r, prereleases=prereleases) - # If no provider is found and we didn't consider - # prereleases, consider them now. - if provider is None and not prereleases: - provider = self.locator.locate(r, prereleases=True) - if provider is None: - logger.debug('Cannot satisfy %r', r) - problems.add(('unsatisfied', r)) - else: - n, v = provider.key, provider.version - if (n, v) not in self.dists: - todo.add(provider) - providers.add(provider) - if r in ireqts and dist in install_dists: - install_dists.add(provider) - logger.debug('Adding %s to install_dists', - provider.name_and_version) - for p in providers: - name = p.key - if name not in self.dists_by_name: - self.reqts.setdefault(p, set()).add(r) - else: - other = self.dists_by_name[name] - if other != p: - # see if other can be replaced by p - self.try_to_replace(p, other, problems) - - dists = set(self.dists.values()) - for dist in dists: - dist.build_time_dependency = dist not in install_dists - if dist.build_time_dependency: - logger.debug('%s is a build-time dependency only.', - dist.name_and_version) - logger.debug('find done for %s', odist) - return dists, problems diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/manifest.py b/env/lib/python3.7/site-packages/pip/_vendor/distlib/manifest.py deleted file mode 100644 index ca0fe44..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/distlib/manifest.py +++ /dev/null @@ -1,393 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012-2013 Python Software Foundation. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -""" -Class representing the list of files in a distribution. - -Equivalent to distutils.filelist, but fixes some problems. -""" -import fnmatch -import logging -import os -import re -import sys - -from . import DistlibException -from .compat import fsdecode -from .util import convert_path - - -__all__ = ['Manifest'] - -logger = logging.getLogger(__name__) - -# a \ followed by some spaces + EOL -_COLLAPSE_PATTERN = re.compile('\\\\w*\n', re.M) -_COMMENTED_LINE = re.compile('#.*?(?=\n)|\n(?=$)', re.M | re.S) - -# -# Due to the different results returned by fnmatch.translate, we need -# to do slightly different processing for Python 2.7 and 3.2 ... this needed -# to be brought in for Python 3.6 onwards. -# -_PYTHON_VERSION = sys.version_info[:2] - -class Manifest(object): - """A list of files built by on exploring the filesystem and filtered by - applying various patterns to what we find there. - """ - - def __init__(self, base=None): - """ - Initialise an instance. - - :param base: The base directory to explore under. - """ - self.base = os.path.abspath(os.path.normpath(base or os.getcwd())) - self.prefix = self.base + os.sep - self.allfiles = None - self.files = set() - - # - # Public API - # - - def findall(self): - """Find all files under the base and set ``allfiles`` to the absolute - pathnames of files found. - """ - from stat import S_ISREG, S_ISDIR, S_ISLNK - - self.allfiles = allfiles = [] - root = self.base - stack = [root] - pop = stack.pop - push = stack.append - - while stack: - root = pop() - names = os.listdir(root) - - for name in names: - fullname = os.path.join(root, name) - - # Avoid excess stat calls -- just one will do, thank you! - stat = os.stat(fullname) - mode = stat.st_mode - if S_ISREG(mode): - allfiles.append(fsdecode(fullname)) - elif S_ISDIR(mode) and not S_ISLNK(mode): - push(fullname) - - def add(self, item): - """ - Add a file to the manifest. - - :param item: The pathname to add. This can be relative to the base. - """ - if not item.startswith(self.prefix): - item = os.path.join(self.base, item) - self.files.add(os.path.normpath(item)) - - def add_many(self, items): - """ - Add a list of files to the manifest. - - :param items: The pathnames to add. These can be relative to the base. - """ - for item in items: - self.add(item) - - def sorted(self, wantdirs=False): - """ - Return sorted files in directory order - """ - - def add_dir(dirs, d): - dirs.add(d) - logger.debug('add_dir added %s', d) - if d != self.base: - parent, _ = os.path.split(d) - assert parent not in ('', '/') - add_dir(dirs, parent) - - result = set(self.files) # make a copy! - if wantdirs: - dirs = set() - for f in result: - add_dir(dirs, os.path.dirname(f)) - result |= dirs - return [os.path.join(*path_tuple) for path_tuple in - sorted(os.path.split(path) for path in result)] - - def clear(self): - """Clear all collected files.""" - self.files = set() - self.allfiles = [] - - def process_directive(self, directive): - """ - Process a directive which either adds some files from ``allfiles`` to - ``files``, or removes some files from ``files``. - - :param directive: The directive to process. This should be in a format - compatible with distutils ``MANIFEST.in`` files: - - http://docs.python.org/distutils/sourcedist.html#commands - """ - # Parse the line: split it up, make sure the right number of words - # is there, and return the relevant words. 'action' is always - # defined: it's the first word of the line. Which of the other - # three are defined depends on the action; it'll be either - # patterns, (dir and patterns), or (dirpattern). - action, patterns, thedir, dirpattern = self._parse_directive(directive) - - # OK, now we know that the action is valid and we have the - # right number of words on the line for that action -- so we - # can proceed with minimal error-checking. - if action == 'include': - for pattern in patterns: - if not self._include_pattern(pattern, anchor=True): - logger.warning('no files found matching %r', pattern) - - elif action == 'exclude': - for pattern in patterns: - found = self._exclude_pattern(pattern, anchor=True) - #if not found: - # logger.warning('no previously-included files ' - # 'found matching %r', pattern) - - elif action == 'global-include': - for pattern in patterns: - if not self._include_pattern(pattern, anchor=False): - logger.warning('no files found matching %r ' - 'anywhere in distribution', pattern) - - elif action == 'global-exclude': - for pattern in patterns: - found = self._exclude_pattern(pattern, anchor=False) - #if not found: - # logger.warning('no previously-included files ' - # 'matching %r found anywhere in ' - # 'distribution', pattern) - - elif action == 'recursive-include': - for pattern in patterns: - if not self._include_pattern(pattern, prefix=thedir): - logger.warning('no files found matching %r ' - 'under directory %r', pattern, thedir) - - elif action == 'recursive-exclude': - for pattern in patterns: - found = self._exclude_pattern(pattern, prefix=thedir) - #if not found: - # logger.warning('no previously-included files ' - # 'matching %r found under directory %r', - # pattern, thedir) - - elif action == 'graft': - if not self._include_pattern(None, prefix=dirpattern): - logger.warning('no directories found matching %r', - dirpattern) - - elif action == 'prune': - if not self._exclude_pattern(None, prefix=dirpattern): - logger.warning('no previously-included directories found ' - 'matching %r', dirpattern) - else: # pragma: no cover - # This should never happen, as it should be caught in - # _parse_template_line - raise DistlibException( - 'invalid action %r' % action) - - # - # Private API - # - - def _parse_directive(self, directive): - """ - Validate a directive. - :param directive: The directive to validate. - :return: A tuple of action, patterns, thedir, dir_patterns - """ - words = directive.split() - if len(words) == 1 and words[0] not in ('include', 'exclude', - 'global-include', - 'global-exclude', - 'recursive-include', - 'recursive-exclude', - 'graft', 'prune'): - # no action given, let's use the default 'include' - words.insert(0, 'include') - - action = words[0] - patterns = thedir = dir_pattern = None - - if action in ('include', 'exclude', - 'global-include', 'global-exclude'): - if len(words) < 2: - raise DistlibException( - '%r expects <pattern1> <pattern2> ...' % action) - - patterns = [convert_path(word) for word in words[1:]] - - elif action in ('recursive-include', 'recursive-exclude'): - if len(words) < 3: - raise DistlibException( - '%r expects <dir> <pattern1> <pattern2> ...' % action) - - thedir = convert_path(words[1]) - patterns = [convert_path(word) for word in words[2:]] - - elif action in ('graft', 'prune'): - if len(words) != 2: - raise DistlibException( - '%r expects a single <dir_pattern>' % action) - - dir_pattern = convert_path(words[1]) - - else: - raise DistlibException('unknown action %r' % action) - - return action, patterns, thedir, dir_pattern - - def _include_pattern(self, pattern, anchor=True, prefix=None, - is_regex=False): - """Select strings (presumably filenames) from 'self.files' that - match 'pattern', a Unix-style wildcard (glob) pattern. - - Patterns are not quite the same as implemented by the 'fnmatch' - module: '*' and '?' match non-special characters, where "special" - is platform-dependent: slash on Unix; colon, slash, and backslash on - DOS/Windows; and colon on Mac OS. - - If 'anchor' is true (the default), then the pattern match is more - stringent: "*.py" will match "foo.py" but not "foo/bar.py". If - 'anchor' is false, both of these will match. - - If 'prefix' is supplied, then only filenames starting with 'prefix' - (itself a pattern) and ending with 'pattern', with anything in between - them, will match. 'anchor' is ignored in this case. - - If 'is_regex' is true, 'anchor' and 'prefix' are ignored, and - 'pattern' is assumed to be either a string containing a regex or a - regex object -- no translation is done, the regex is just compiled - and used as-is. - - Selected strings will be added to self.files. - - Return True if files are found. - """ - # XXX docstring lying about what the special chars are? - found = False - pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex) - - # delayed loading of allfiles list - if self.allfiles is None: - self.findall() - - for name in self.allfiles: - if pattern_re.search(name): - self.files.add(name) - found = True - return found - - def _exclude_pattern(self, pattern, anchor=True, prefix=None, - is_regex=False): - """Remove strings (presumably filenames) from 'files' that match - 'pattern'. - - Other parameters are the same as for 'include_pattern()', above. - The list 'self.files' is modified in place. Return True if files are - found. - - This API is public to allow e.g. exclusion of SCM subdirs, e.g. when - packaging source distributions - """ - found = False - pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex) - for f in list(self.files): - if pattern_re.search(f): - self.files.remove(f) - found = True - return found - - def _translate_pattern(self, pattern, anchor=True, prefix=None, - is_regex=False): - """Translate a shell-like wildcard pattern to a compiled regular - expression. - - Return the compiled regex. If 'is_regex' true, - then 'pattern' is directly compiled to a regex (if it's a string) - or just returned as-is (assumes it's a regex object). - """ - if is_regex: - if isinstance(pattern, str): - return re.compile(pattern) - else: - return pattern - - if _PYTHON_VERSION > (3, 2): - # ditch start and end characters - start, _, end = self._glob_to_re('_').partition('_') - - if pattern: - pattern_re = self._glob_to_re(pattern) - if _PYTHON_VERSION > (3, 2): - assert pattern_re.startswith(start) and pattern_re.endswith(end) - else: - pattern_re = '' - - base = re.escape(os.path.join(self.base, '')) - if prefix is not None: - # ditch end of pattern character - if _PYTHON_VERSION <= (3, 2): - empty_pattern = self._glob_to_re('') - prefix_re = self._glob_to_re(prefix)[:-len(empty_pattern)] - else: - prefix_re = self._glob_to_re(prefix) - assert prefix_re.startswith(start) and prefix_re.endswith(end) - prefix_re = prefix_re[len(start): len(prefix_re) - len(end)] - sep = os.sep - if os.sep == '\\': - sep = r'\\' - if _PYTHON_VERSION <= (3, 2): - pattern_re = '^' + base + sep.join((prefix_re, - '.*' + pattern_re)) - else: - pattern_re = pattern_re[len(start): len(pattern_re) - len(end)] - pattern_re = r'%s%s%s%s.*%s%s' % (start, base, prefix_re, sep, - pattern_re, end) - else: # no prefix -- respect anchor flag - if anchor: - if _PYTHON_VERSION <= (3, 2): - pattern_re = '^' + base + pattern_re - else: - pattern_re = r'%s%s%s' % (start, base, pattern_re[len(start):]) - - return re.compile(pattern_re) - - def _glob_to_re(self, pattern): - """Translate a shell-like glob pattern to a regular expression. - - Return a string containing the regex. Differs from - 'fnmatch.translate()' in that '*' does not match "special characters" - (which are platform-specific). - """ - pattern_re = fnmatch.translate(pattern) - - # '?' and '*' in the glob pattern become '.' and '.*' in the RE, which - # IMHO is wrong -- '?' and '*' aren't supposed to match slash in Unix, - # and by extension they shouldn't match such "special characters" under - # any OS. So change all non-escaped dots in the RE to match any - # character except the special characters (currently: just os.sep). - sep = os.sep - if os.sep == '\\': - # we're using a regex to manipulate a regex, so we need - # to escape the backslash twice - sep = r'\\\\' - escaped = r'\1[^%s]' % sep - pattern_re = re.sub(r'((?<!\\)(\\\\)*)\.', escaped, pattern_re) - return pattern_re diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/markers.py b/env/lib/python3.7/site-packages/pip/_vendor/distlib/markers.py deleted file mode 100644 index ee1f3e2..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/distlib/markers.py +++ /dev/null @@ -1,131 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012-2017 Vinay Sajip. -# Licensed to the Python Software Foundation under a contributor agreement. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -""" -Parser for the environment markers micro-language defined in PEP 508. -""" - -# Note: In PEP 345, the micro-language was Python compatible, so the ast -# module could be used to parse it. However, PEP 508 introduced operators such -# as ~= and === which aren't in Python, necessitating a different approach. - -import os -import sys -import platform -import re - -from .compat import python_implementation, urlparse, string_types -from .util import in_venv, parse_marker - -__all__ = ['interpret'] - -def _is_literal(o): - if not isinstance(o, string_types) or not o: - return False - return o[0] in '\'"' - -class Evaluator(object): - """ - This class is used to evaluate marker expessions. - """ - - operations = { - '==': lambda x, y: x == y, - '===': lambda x, y: x == y, - '~=': lambda x, y: x == y or x > y, - '!=': lambda x, y: x != y, - '<': lambda x, y: x < y, - '<=': lambda x, y: x == y or x < y, - '>': lambda x, y: x > y, - '>=': lambda x, y: x == y or x > y, - 'and': lambda x, y: x and y, - 'or': lambda x, y: x or y, - 'in': lambda x, y: x in y, - 'not in': lambda x, y: x not in y, - } - - def evaluate(self, expr, context): - """ - Evaluate a marker expression returned by the :func:`parse_requirement` - function in the specified context. - """ - if isinstance(expr, string_types): - if expr[0] in '\'"': - result = expr[1:-1] - else: - if expr not in context: - raise SyntaxError('unknown variable: %s' % expr) - result = context[expr] - else: - assert isinstance(expr, dict) - op = expr['op'] - if op not in self.operations: - raise NotImplementedError('op not implemented: %s' % op) - elhs = expr['lhs'] - erhs = expr['rhs'] - if _is_literal(expr['lhs']) and _is_literal(expr['rhs']): - raise SyntaxError('invalid comparison: %s %s %s' % (elhs, op, erhs)) - - lhs = self.evaluate(elhs, context) - rhs = self.evaluate(erhs, context) - result = self.operations[op](lhs, rhs) - return result - -def default_context(): - def format_full_version(info): - version = '%s.%s.%s' % (info.major, info.minor, info.micro) - kind = info.releaselevel - if kind != 'final': - version += kind[0] + str(info.serial) - return version - - if hasattr(sys, 'implementation'): - implementation_version = format_full_version(sys.implementation.version) - implementation_name = sys.implementation.name - else: - implementation_version = '0' - implementation_name = '' - - result = { - 'implementation_name': implementation_name, - 'implementation_version': implementation_version, - 'os_name': os.name, - 'platform_machine': platform.machine(), - 'platform_python_implementation': platform.python_implementation(), - 'platform_release': platform.release(), - 'platform_system': platform.system(), - 'platform_version': platform.version(), - 'platform_in_venv': str(in_venv()), - 'python_full_version': platform.python_version(), - 'python_version': platform.python_version()[:3], - 'sys_platform': sys.platform, - } - return result - -DEFAULT_CONTEXT = default_context() -del default_context - -evaluator = Evaluator() - -def interpret(marker, execution_context=None): - """ - Interpret a marker and return a result depending on environment. - - :param marker: The marker to interpret. - :type marker: str - :param execution_context: The context used for name lookup. - :type execution_context: mapping - """ - try: - expr, rest = parse_marker(marker) - except Exception as e: - raise SyntaxError('Unable to interpret marker syntax: %s: %s' % (marker, e)) - if rest and rest[0] != '#': - raise SyntaxError('unexpected trailing data in marker: %s: %s' % (marker, rest)) - context = dict(DEFAULT_CONTEXT) - if execution_context: - context.update(execution_context) - return evaluator.evaluate(expr, context) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/metadata.py b/env/lib/python3.7/site-packages/pip/_vendor/distlib/metadata.py deleted file mode 100644 index 77eed7f..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/distlib/metadata.py +++ /dev/null @@ -1,1094 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012 The Python Software Foundation. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -"""Implementation of the Metadata for Python packages PEPs. - -Supports all metadata formats (1.0, 1.1, 1.2, and 2.0 experimental). -""" -from __future__ import unicode_literals - -import codecs -from email import message_from_file -import json -import logging -import re - - -from . import DistlibException, __version__ -from .compat import StringIO, string_types, text_type -from .markers import interpret -from .util import extract_by_key, get_extras -from .version import get_scheme, PEP440_VERSION_RE - -logger = logging.getLogger(__name__) - - -class MetadataMissingError(DistlibException): - """A required metadata is missing""" - - -class MetadataConflictError(DistlibException): - """Attempt to read or write metadata fields that are conflictual.""" - - -class MetadataUnrecognizedVersionError(DistlibException): - """Unknown metadata version number.""" - - -class MetadataInvalidError(DistlibException): - """A metadata value is invalid""" - -# public API of this module -__all__ = ['Metadata', 'PKG_INFO_ENCODING', 'PKG_INFO_PREFERRED_VERSION'] - -# Encoding used for the PKG-INFO files -PKG_INFO_ENCODING = 'utf-8' - -# preferred version. Hopefully will be changed -# to 1.2 once PEP 345 is supported everywhere -PKG_INFO_PREFERRED_VERSION = '1.1' - -_LINE_PREFIX_1_2 = re.compile('\n \\|') -_LINE_PREFIX_PRE_1_2 = re.compile('\n ') -_241_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', - 'Summary', 'Description', - 'Keywords', 'Home-page', 'Author', 'Author-email', - 'License') - -_314_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', - 'Supported-Platform', 'Summary', 'Description', - 'Keywords', 'Home-page', 'Author', 'Author-email', - 'License', 'Classifier', 'Download-URL', 'Obsoletes', - 'Provides', 'Requires') - -_314_MARKERS = ('Obsoletes', 'Provides', 'Requires', 'Classifier', - 'Download-URL') - -_345_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', - 'Supported-Platform', 'Summary', 'Description', - 'Keywords', 'Home-page', 'Author', 'Author-email', - 'Maintainer', 'Maintainer-email', 'License', - 'Classifier', 'Download-URL', 'Obsoletes-Dist', - 'Project-URL', 'Provides-Dist', 'Requires-Dist', - 'Requires-Python', 'Requires-External') - -_345_MARKERS = ('Provides-Dist', 'Requires-Dist', 'Requires-Python', - 'Obsoletes-Dist', 'Requires-External', 'Maintainer', - 'Maintainer-email', 'Project-URL') - -_426_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', - 'Supported-Platform', 'Summary', 'Description', - 'Keywords', 'Home-page', 'Author', 'Author-email', - 'Maintainer', 'Maintainer-email', 'License', - 'Classifier', 'Download-URL', 'Obsoletes-Dist', - 'Project-URL', 'Provides-Dist', 'Requires-Dist', - 'Requires-Python', 'Requires-External', 'Private-Version', - 'Obsoleted-By', 'Setup-Requires-Dist', 'Extension', - 'Provides-Extra') - -_426_MARKERS = ('Private-Version', 'Provides-Extra', 'Obsoleted-By', - 'Setup-Requires-Dist', 'Extension') - -# See issue #106: Sometimes 'Requires' occurs wrongly in the metadata. Include -# it in the tuple literal below to allow it (for now) -_566_FIELDS = _426_FIELDS + ('Description-Content-Type', 'Requires') - -_566_MARKERS = ('Description-Content-Type',) - -_ALL_FIELDS = set() -_ALL_FIELDS.update(_241_FIELDS) -_ALL_FIELDS.update(_314_FIELDS) -_ALL_FIELDS.update(_345_FIELDS) -_ALL_FIELDS.update(_426_FIELDS) -_ALL_FIELDS.update(_566_FIELDS) - -EXTRA_RE = re.compile(r'''extra\s*==\s*("([^"]+)"|'([^']+)')''') - - -def _version2fieldlist(version): - if version == '1.0': - return _241_FIELDS - elif version == '1.1': - return _314_FIELDS - elif version == '1.2': - return _345_FIELDS - elif version in ('1.3', '2.1'): - return _345_FIELDS + _566_FIELDS - elif version == '2.0': - return _426_FIELDS - raise MetadataUnrecognizedVersionError(version) - - -def _best_version(fields): - """Detect the best version depending on the fields used.""" - def _has_marker(keys, markers): - for marker in markers: - if marker in keys: - return True - return False - - keys = [] - for key, value in fields.items(): - if value in ([], 'UNKNOWN', None): - continue - keys.append(key) - - possible_versions = ['1.0', '1.1', '1.2', '1.3', '2.0', '2.1'] - - # first let's try to see if a field is not part of one of the version - for key in keys: - if key not in _241_FIELDS and '1.0' in possible_versions: - possible_versions.remove('1.0') - logger.debug('Removed 1.0 due to %s', key) - if key not in _314_FIELDS and '1.1' in possible_versions: - possible_versions.remove('1.1') - logger.debug('Removed 1.1 due to %s', key) - if key not in _345_FIELDS and '1.2' in possible_versions: - possible_versions.remove('1.2') - logger.debug('Removed 1.2 due to %s', key) - if key not in _566_FIELDS and '1.3' in possible_versions: - possible_versions.remove('1.3') - logger.debug('Removed 1.3 due to %s', key) - if key not in _566_FIELDS and '2.1' in possible_versions: - if key != 'Description': # In 2.1, description allowed after headers - possible_versions.remove('2.1') - logger.debug('Removed 2.1 due to %s', key) - if key not in _426_FIELDS and '2.0' in possible_versions: - possible_versions.remove('2.0') - logger.debug('Removed 2.0 due to %s', key) - - # possible_version contains qualified versions - if len(possible_versions) == 1: - return possible_versions[0] # found ! - elif len(possible_versions) == 0: - logger.debug('Out of options - unknown metadata set: %s', fields) - raise MetadataConflictError('Unknown metadata set') - - # let's see if one unique marker is found - is_1_1 = '1.1' in possible_versions and _has_marker(keys, _314_MARKERS) - is_1_2 = '1.2' in possible_versions and _has_marker(keys, _345_MARKERS) - is_2_1 = '2.1' in possible_versions and _has_marker(keys, _566_MARKERS) - is_2_0 = '2.0' in possible_versions and _has_marker(keys, _426_MARKERS) - if int(is_1_1) + int(is_1_2) + int(is_2_1) + int(is_2_0) > 1: - raise MetadataConflictError('You used incompatible 1.1/1.2/2.0/2.1 fields') - - # we have the choice, 1.0, or 1.2, or 2.0 - # - 1.0 has a broken Summary field but works with all tools - # - 1.1 is to avoid - # - 1.2 fixes Summary but has little adoption - # - 2.0 adds more features and is very new - if not is_1_1 and not is_1_2 and not is_2_1 and not is_2_0: - # we couldn't find any specific marker - if PKG_INFO_PREFERRED_VERSION in possible_versions: - return PKG_INFO_PREFERRED_VERSION - if is_1_1: - return '1.1' - if is_1_2: - return '1.2' - if is_2_1: - return '2.1' - - return '2.0' - -_ATTR2FIELD = { - 'metadata_version': 'Metadata-Version', - 'name': 'Name', - 'version': 'Version', - 'platform': 'Platform', - 'supported_platform': 'Supported-Platform', - 'summary': 'Summary', - 'description': 'Description', - 'keywords': 'Keywords', - 'home_page': 'Home-page', - 'author': 'Author', - 'author_email': 'Author-email', - 'maintainer': 'Maintainer', - 'maintainer_email': 'Maintainer-email', - 'license': 'License', - 'classifier': 'Classifier', - 'download_url': 'Download-URL', - 'obsoletes_dist': 'Obsoletes-Dist', - 'provides_dist': 'Provides-Dist', - 'requires_dist': 'Requires-Dist', - 'setup_requires_dist': 'Setup-Requires-Dist', - 'requires_python': 'Requires-Python', - 'requires_external': 'Requires-External', - 'requires': 'Requires', - 'provides': 'Provides', - 'obsoletes': 'Obsoletes', - 'project_url': 'Project-URL', - 'private_version': 'Private-Version', - 'obsoleted_by': 'Obsoleted-By', - 'extension': 'Extension', - 'provides_extra': 'Provides-Extra', -} - -_PREDICATE_FIELDS = ('Requires-Dist', 'Obsoletes-Dist', 'Provides-Dist') -_VERSIONS_FIELDS = ('Requires-Python',) -_VERSION_FIELDS = ('Version',) -_LISTFIELDS = ('Platform', 'Classifier', 'Obsoletes', - 'Requires', 'Provides', 'Obsoletes-Dist', - 'Provides-Dist', 'Requires-Dist', 'Requires-External', - 'Project-URL', 'Supported-Platform', 'Setup-Requires-Dist', - 'Provides-Extra', 'Extension') -_LISTTUPLEFIELDS = ('Project-URL',) - -_ELEMENTSFIELD = ('Keywords',) - -_UNICODEFIELDS = ('Author', 'Maintainer', 'Summary', 'Description') - -_MISSING = object() - -_FILESAFE = re.compile('[^A-Za-z0-9.]+') - - -def _get_name_and_version(name, version, for_filename=False): - """Return the distribution name with version. - - If for_filename is true, return a filename-escaped form.""" - if for_filename: - # For both name and version any runs of non-alphanumeric or '.' - # characters are replaced with a single '-'. Additionally any - # spaces in the version string become '.' - name = _FILESAFE.sub('-', name) - version = _FILESAFE.sub('-', version.replace(' ', '.')) - return '%s-%s' % (name, version) - - -class LegacyMetadata(object): - """The legacy metadata of a release. - - Supports versions 1.0, 1.1 and 1.2 (auto-detected). You can - instantiate the class with one of these arguments (or none): - - *path*, the path to a metadata file - - *fileobj* give a file-like object with metadata as content - - *mapping* is a dict-like object - - *scheme* is a version scheme name - """ - # TODO document the mapping API and UNKNOWN default key - - def __init__(self, path=None, fileobj=None, mapping=None, - scheme='default'): - if [path, fileobj, mapping].count(None) < 2: - raise TypeError('path, fileobj and mapping are exclusive') - self._fields = {} - self.requires_files = [] - self._dependencies = None - self.scheme = scheme - if path is not None: - self.read(path) - elif fileobj is not None: - self.read_file(fileobj) - elif mapping is not None: - self.update(mapping) - self.set_metadata_version() - - def set_metadata_version(self): - self._fields['Metadata-Version'] = _best_version(self._fields) - - def _write_field(self, fileobj, name, value): - fileobj.write('%s: %s\n' % (name, value)) - - def __getitem__(self, name): - return self.get(name) - - def __setitem__(self, name, value): - return self.set(name, value) - - def __delitem__(self, name): - field_name = self._convert_name(name) - try: - del self._fields[field_name] - except KeyError: - raise KeyError(name) - - def __contains__(self, name): - return (name in self._fields or - self._convert_name(name) in self._fields) - - def _convert_name(self, name): - if name in _ALL_FIELDS: - return name - name = name.replace('-', '_').lower() - return _ATTR2FIELD.get(name, name) - - def _default_value(self, name): - if name in _LISTFIELDS or name in _ELEMENTSFIELD: - return [] - return 'UNKNOWN' - - def _remove_line_prefix(self, value): - if self.metadata_version in ('1.0', '1.1'): - return _LINE_PREFIX_PRE_1_2.sub('\n', value) - else: - return _LINE_PREFIX_1_2.sub('\n', value) - - def __getattr__(self, name): - if name in _ATTR2FIELD: - return self[name] - raise AttributeError(name) - - # - # Public API - # - -# dependencies = property(_get_dependencies, _set_dependencies) - - def get_fullname(self, filesafe=False): - """Return the distribution name with version. - - If filesafe is true, return a filename-escaped form.""" - return _get_name_and_version(self['Name'], self['Version'], filesafe) - - def is_field(self, name): - """return True if name is a valid metadata key""" - name = self._convert_name(name) - return name in _ALL_FIELDS - - def is_multi_field(self, name): - name = self._convert_name(name) - return name in _LISTFIELDS - - def read(self, filepath): - """Read the metadata values from a file path.""" - fp = codecs.open(filepath, 'r', encoding='utf-8') - try: - self.read_file(fp) - finally: - fp.close() - - def read_file(self, fileob): - """Read the metadata values from a file object.""" - msg = message_from_file(fileob) - self._fields['Metadata-Version'] = msg['metadata-version'] - - # When reading, get all the fields we can - for field in _ALL_FIELDS: - if field not in msg: - continue - if field in _LISTFIELDS: - # we can have multiple lines - values = msg.get_all(field) - if field in _LISTTUPLEFIELDS and values is not None: - values = [tuple(value.split(',')) for value in values] - self.set(field, values) - else: - # single line - value = msg[field] - if value is not None and value != 'UNKNOWN': - self.set(field, value) - # logger.debug('Attempting to set metadata for %s', self) - # self.set_metadata_version() - - def write(self, filepath, skip_unknown=False): - """Write the metadata fields to filepath.""" - fp = codecs.open(filepath, 'w', encoding='utf-8') - try: - self.write_file(fp, skip_unknown) - finally: - fp.close() - - def write_file(self, fileobject, skip_unknown=False): - """Write the PKG-INFO format data to a file object.""" - self.set_metadata_version() - - for field in _version2fieldlist(self['Metadata-Version']): - values = self.get(field) - if skip_unknown and values in ('UNKNOWN', [], ['UNKNOWN']): - continue - if field in _ELEMENTSFIELD: - self._write_field(fileobject, field, ','.join(values)) - continue - if field not in _LISTFIELDS: - if field == 'Description': - if self.metadata_version in ('1.0', '1.1'): - values = values.replace('\n', '\n ') - else: - values = values.replace('\n', '\n |') - values = [values] - - if field in _LISTTUPLEFIELDS: - values = [','.join(value) for value in values] - - for value in values: - self._write_field(fileobject, field, value) - - def update(self, other=None, **kwargs): - """Set metadata values from the given iterable `other` and kwargs. - - Behavior is like `dict.update`: If `other` has a ``keys`` method, - they are looped over and ``self[key]`` is assigned ``other[key]``. - Else, ``other`` is an iterable of ``(key, value)`` iterables. - - Keys that don't match a metadata field or that have an empty value are - dropped. - """ - def _set(key, value): - if key in _ATTR2FIELD and value: - self.set(self._convert_name(key), value) - - if not other: - # other is None or empty container - pass - elif hasattr(other, 'keys'): - for k in other.keys(): - _set(k, other[k]) - else: - for k, v in other: - _set(k, v) - - if kwargs: - for k, v in kwargs.items(): - _set(k, v) - - def set(self, name, value): - """Control then set a metadata field.""" - name = self._convert_name(name) - - if ((name in _ELEMENTSFIELD or name == 'Platform') and - not isinstance(value, (list, tuple))): - if isinstance(value, string_types): - value = [v.strip() for v in value.split(',')] - else: - value = [] - elif (name in _LISTFIELDS and - not isinstance(value, (list, tuple))): - if isinstance(value, string_types): - value = [value] - else: - value = [] - - if logger.isEnabledFor(logging.WARNING): - project_name = self['Name'] - - scheme = get_scheme(self.scheme) - if name in _PREDICATE_FIELDS and value is not None: - for v in value: - # check that the values are valid - if not scheme.is_valid_matcher(v.split(';')[0]): - logger.warning( - "'%s': '%s' is not valid (field '%s')", - project_name, v, name) - # FIXME this rejects UNKNOWN, is that right? - elif name in _VERSIONS_FIELDS and value is not None: - if not scheme.is_valid_constraint_list(value): - logger.warning("'%s': '%s' is not a valid version (field '%s')", - project_name, value, name) - elif name in _VERSION_FIELDS and value is not None: - if not scheme.is_valid_version(value): - logger.warning("'%s': '%s' is not a valid version (field '%s')", - project_name, value, name) - - if name in _UNICODEFIELDS: - if name == 'Description': - value = self._remove_line_prefix(value) - - self._fields[name] = value - - def get(self, name, default=_MISSING): - """Get a metadata field.""" - name = self._convert_name(name) - if name not in self._fields: - if default is _MISSING: - default = self._default_value(name) - return default - if name in _UNICODEFIELDS: - value = self._fields[name] - return value - elif name in _LISTFIELDS: - value = self._fields[name] - if value is None: - return [] - res = [] - for val in value: - if name not in _LISTTUPLEFIELDS: - res.append(val) - else: - # That's for Project-URL - res.append((val[0], val[1])) - return res - - elif name in _ELEMENTSFIELD: - value = self._fields[name] - if isinstance(value, string_types): - return value.split(',') - return self._fields[name] - - def check(self, strict=False): - """Check if the metadata is compliant. If strict is True then raise if - no Name or Version are provided""" - self.set_metadata_version() - - # XXX should check the versions (if the file was loaded) - missing, warnings = [], [] - - for attr in ('Name', 'Version'): # required by PEP 345 - if attr not in self: - missing.append(attr) - - if strict and missing != []: - msg = 'missing required metadata: %s' % ', '.join(missing) - raise MetadataMissingError(msg) - - for attr in ('Home-page', 'Author'): - if attr not in self: - missing.append(attr) - - # checking metadata 1.2 (XXX needs to check 1.1, 1.0) - if self['Metadata-Version'] != '1.2': - return missing, warnings - - scheme = get_scheme(self.scheme) - - def are_valid_constraints(value): - for v in value: - if not scheme.is_valid_matcher(v.split(';')[0]): - return False - return True - - for fields, controller in ((_PREDICATE_FIELDS, are_valid_constraints), - (_VERSIONS_FIELDS, - scheme.is_valid_constraint_list), - (_VERSION_FIELDS, - scheme.is_valid_version)): - for field in fields: - value = self.get(field, None) - if value is not None and not controller(value): - warnings.append("Wrong value for '%s': %s" % (field, value)) - - return missing, warnings - - def todict(self, skip_missing=False): - """Return fields as a dict. - - Field names will be converted to use the underscore-lowercase style - instead of hyphen-mixed case (i.e. home_page instead of Home-page). - """ - self.set_metadata_version() - - mapping_1_0 = ( - ('metadata_version', 'Metadata-Version'), - ('name', 'Name'), - ('version', 'Version'), - ('summary', 'Summary'), - ('home_page', 'Home-page'), - ('author', 'Author'), - ('author_email', 'Author-email'), - ('license', 'License'), - ('description', 'Description'), - ('keywords', 'Keywords'), - ('platform', 'Platform'), - ('classifiers', 'Classifier'), - ('download_url', 'Download-URL'), - ) - - data = {} - for key, field_name in mapping_1_0: - if not skip_missing or field_name in self._fields: - data[key] = self[field_name] - - if self['Metadata-Version'] == '1.2': - mapping_1_2 = ( - ('requires_dist', 'Requires-Dist'), - ('requires_python', 'Requires-Python'), - ('requires_external', 'Requires-External'), - ('provides_dist', 'Provides-Dist'), - ('obsoletes_dist', 'Obsoletes-Dist'), - ('project_url', 'Project-URL'), - ('maintainer', 'Maintainer'), - ('maintainer_email', 'Maintainer-email'), - ) - for key, field_name in mapping_1_2: - if not skip_missing or field_name in self._fields: - if key != 'project_url': - data[key] = self[field_name] - else: - data[key] = [','.join(u) for u in self[field_name]] - - elif self['Metadata-Version'] == '1.1': - mapping_1_1 = ( - ('provides', 'Provides'), - ('requires', 'Requires'), - ('obsoletes', 'Obsoletes'), - ) - for key, field_name in mapping_1_1: - if not skip_missing or field_name in self._fields: - data[key] = self[field_name] - - return data - - def add_requirements(self, requirements): - if self['Metadata-Version'] == '1.1': - # we can't have 1.1 metadata *and* Setuptools requires - for field in ('Obsoletes', 'Requires', 'Provides'): - if field in self: - del self[field] - self['Requires-Dist'] += requirements - - # Mapping API - # TODO could add iter* variants - - def keys(self): - return list(_version2fieldlist(self['Metadata-Version'])) - - def __iter__(self): - for key in self.keys(): - yield key - - def values(self): - return [self[key] for key in self.keys()] - - def items(self): - return [(key, self[key]) for key in self.keys()] - - def __repr__(self): - return '<%s %s %s>' % (self.__class__.__name__, self.name, - self.version) - - -METADATA_FILENAME = 'pydist.json' -WHEEL_METADATA_FILENAME = 'metadata.json' -LEGACY_METADATA_FILENAME = 'METADATA' - - -class Metadata(object): - """ - The metadata of a release. This implementation uses 2.0 (JSON) - metadata where possible. If not possible, it wraps a LegacyMetadata - instance which handles the key-value metadata format. - """ - - METADATA_VERSION_MATCHER = re.compile(r'^\d+(\.\d+)*$') - - NAME_MATCHER = re.compile('^[0-9A-Z]([0-9A-Z_.-]*[0-9A-Z])?$', re.I) - - VERSION_MATCHER = PEP440_VERSION_RE - - SUMMARY_MATCHER = re.compile('.{1,2047}') - - METADATA_VERSION = '2.0' - - GENERATOR = 'distlib (%s)' % __version__ - - MANDATORY_KEYS = { - 'name': (), - 'version': (), - 'summary': ('legacy',), - } - - INDEX_KEYS = ('name version license summary description author ' - 'author_email keywords platform home_page classifiers ' - 'download_url') - - DEPENDENCY_KEYS = ('extras run_requires test_requires build_requires ' - 'dev_requires provides meta_requires obsoleted_by ' - 'supports_environments') - - SYNTAX_VALIDATORS = { - 'metadata_version': (METADATA_VERSION_MATCHER, ()), - 'name': (NAME_MATCHER, ('legacy',)), - 'version': (VERSION_MATCHER, ('legacy',)), - 'summary': (SUMMARY_MATCHER, ('legacy',)), - } - - __slots__ = ('_legacy', '_data', 'scheme') - - def __init__(self, path=None, fileobj=None, mapping=None, - scheme='default'): - if [path, fileobj, mapping].count(None) < 2: - raise TypeError('path, fileobj and mapping are exclusive') - self._legacy = None - self._data = None - self.scheme = scheme - #import pdb; pdb.set_trace() - if mapping is not None: - try: - self._validate_mapping(mapping, scheme) - self._data = mapping - except MetadataUnrecognizedVersionError: - self._legacy = LegacyMetadata(mapping=mapping, scheme=scheme) - self.validate() - else: - data = None - if path: - with open(path, 'rb') as f: - data = f.read() - elif fileobj: - data = fileobj.read() - if data is None: - # Initialised with no args - to be added - self._data = { - 'metadata_version': self.METADATA_VERSION, - 'generator': self.GENERATOR, - } - else: - if not isinstance(data, text_type): - data = data.decode('utf-8') - try: - self._data = json.loads(data) - self._validate_mapping(self._data, scheme) - except ValueError: - # Note: MetadataUnrecognizedVersionError does not - # inherit from ValueError (it's a DistlibException, - # which should not inherit from ValueError). - # The ValueError comes from the json.load - if that - # succeeds and we get a validation error, we want - # that to propagate - self._legacy = LegacyMetadata(fileobj=StringIO(data), - scheme=scheme) - self.validate() - - common_keys = set(('name', 'version', 'license', 'keywords', 'summary')) - - none_list = (None, list) - none_dict = (None, dict) - - mapped_keys = { - 'run_requires': ('Requires-Dist', list), - 'build_requires': ('Setup-Requires-Dist', list), - 'dev_requires': none_list, - 'test_requires': none_list, - 'meta_requires': none_list, - 'extras': ('Provides-Extra', list), - 'modules': none_list, - 'namespaces': none_list, - 'exports': none_dict, - 'commands': none_dict, - 'classifiers': ('Classifier', list), - 'source_url': ('Download-URL', None), - 'metadata_version': ('Metadata-Version', None), - } - - del none_list, none_dict - - def __getattribute__(self, key): - common = object.__getattribute__(self, 'common_keys') - mapped = object.__getattribute__(self, 'mapped_keys') - if key in mapped: - lk, maker = mapped[key] - if self._legacy: - if lk is None: - result = None if maker is None else maker() - else: - result = self._legacy.get(lk) - else: - value = None if maker is None else maker() - if key not in ('commands', 'exports', 'modules', 'namespaces', - 'classifiers'): - result = self._data.get(key, value) - else: - # special cases for PEP 459 - sentinel = object() - result = sentinel - d = self._data.get('extensions') - if d: - if key == 'commands': - result = d.get('python.commands', value) - elif key == 'classifiers': - d = d.get('python.details') - if d: - result = d.get(key, value) - else: - d = d.get('python.exports') - if not d: - d = self._data.get('python.exports') - if d: - result = d.get(key, value) - if result is sentinel: - result = value - elif key not in common: - result = object.__getattribute__(self, key) - elif self._legacy: - result = self._legacy.get(key) - else: - result = self._data.get(key) - return result - - def _validate_value(self, key, value, scheme=None): - if key in self.SYNTAX_VALIDATORS: - pattern, exclusions = self.SYNTAX_VALIDATORS[key] - if (scheme or self.scheme) not in exclusions: - m = pattern.match(value) - if not m: - raise MetadataInvalidError("'%s' is an invalid value for " - "the '%s' property" % (value, - key)) - - def __setattr__(self, key, value): - self._validate_value(key, value) - common = object.__getattribute__(self, 'common_keys') - mapped = object.__getattribute__(self, 'mapped_keys') - if key in mapped: - lk, _ = mapped[key] - if self._legacy: - if lk is None: - raise NotImplementedError - self._legacy[lk] = value - elif key not in ('commands', 'exports', 'modules', 'namespaces', - 'classifiers'): - self._data[key] = value - else: - # special cases for PEP 459 - d = self._data.setdefault('extensions', {}) - if key == 'commands': - d['python.commands'] = value - elif key == 'classifiers': - d = d.setdefault('python.details', {}) - d[key] = value - else: - d = d.setdefault('python.exports', {}) - d[key] = value - elif key not in common: - object.__setattr__(self, key, value) - else: - if key == 'keywords': - if isinstance(value, string_types): - value = value.strip() - if value: - value = value.split() - else: - value = [] - if self._legacy: - self._legacy[key] = value - else: - self._data[key] = value - - @property - def name_and_version(self): - return _get_name_and_version(self.name, self.version, True) - - @property - def provides(self): - if self._legacy: - result = self._legacy['Provides-Dist'] - else: - result = self._data.setdefault('provides', []) - s = '%s (%s)' % (self.name, self.version) - if s not in result: - result.append(s) - return result - - @provides.setter - def provides(self, value): - if self._legacy: - self._legacy['Provides-Dist'] = value - else: - self._data['provides'] = value - - def get_requirements(self, reqts, extras=None, env=None): - """ - Base method to get dependencies, given a set of extras - to satisfy and an optional environment context. - :param reqts: A list of sometimes-wanted dependencies, - perhaps dependent on extras and environment. - :param extras: A list of optional components being requested. - :param env: An optional environment for marker evaluation. - """ - if self._legacy: - result = reqts - else: - result = [] - extras = get_extras(extras or [], self.extras) - for d in reqts: - if 'extra' not in d and 'environment' not in d: - # unconditional - include = True - else: - if 'extra' not in d: - # Not extra-dependent - only environment-dependent - include = True - else: - include = d.get('extra') in extras - if include: - # Not excluded because of extras, check environment - marker = d.get('environment') - if marker: - include = interpret(marker, env) - if include: - result.extend(d['requires']) - for key in ('build', 'dev', 'test'): - e = ':%s:' % key - if e in extras: - extras.remove(e) - # A recursive call, but it should terminate since 'test' - # has been removed from the extras - reqts = self._data.get('%s_requires' % key, []) - result.extend(self.get_requirements(reqts, extras=extras, - env=env)) - return result - - @property - def dictionary(self): - if self._legacy: - return self._from_legacy() - return self._data - - @property - def dependencies(self): - if self._legacy: - raise NotImplementedError - else: - return extract_by_key(self._data, self.DEPENDENCY_KEYS) - - @dependencies.setter - def dependencies(self, value): - if self._legacy: - raise NotImplementedError - else: - self._data.update(value) - - def _validate_mapping(self, mapping, scheme): - if mapping.get('metadata_version') != self.METADATA_VERSION: - raise MetadataUnrecognizedVersionError() - missing = [] - for key, exclusions in self.MANDATORY_KEYS.items(): - if key not in mapping: - if scheme not in exclusions: - missing.append(key) - if missing: - msg = 'Missing metadata items: %s' % ', '.join(missing) - raise MetadataMissingError(msg) - for k, v in mapping.items(): - self._validate_value(k, v, scheme) - - def validate(self): - if self._legacy: - missing, warnings = self._legacy.check(True) - if missing or warnings: - logger.warning('Metadata: missing: %s, warnings: %s', - missing, warnings) - else: - self._validate_mapping(self._data, self.scheme) - - def todict(self): - if self._legacy: - return self._legacy.todict(True) - else: - result = extract_by_key(self._data, self.INDEX_KEYS) - return result - - def _from_legacy(self): - assert self._legacy and not self._data - result = { - 'metadata_version': self.METADATA_VERSION, - 'generator': self.GENERATOR, - } - lmd = self._legacy.todict(True) # skip missing ones - for k in ('name', 'version', 'license', 'summary', 'description', - 'classifier'): - if k in lmd: - if k == 'classifier': - nk = 'classifiers' - else: - nk = k - result[nk] = lmd[k] - kw = lmd.get('Keywords', []) - if kw == ['']: - kw = [] - result['keywords'] = kw - keys = (('requires_dist', 'run_requires'), - ('setup_requires_dist', 'build_requires')) - for ok, nk in keys: - if ok in lmd and lmd[ok]: - result[nk] = [{'requires': lmd[ok]}] - result['provides'] = self.provides - author = {} - maintainer = {} - return result - - LEGACY_MAPPING = { - 'name': 'Name', - 'version': 'Version', - 'license': 'License', - 'summary': 'Summary', - 'description': 'Description', - 'classifiers': 'Classifier', - } - - def _to_legacy(self): - def process_entries(entries): - reqts = set() - for e in entries: - extra = e.get('extra') - env = e.get('environment') - rlist = e['requires'] - for r in rlist: - if not env and not extra: - reqts.add(r) - else: - marker = '' - if extra: - marker = 'extra == "%s"' % extra - if env: - if marker: - marker = '(%s) and %s' % (env, marker) - else: - marker = env - reqts.add(';'.join((r, marker))) - return reqts - - assert self._data and not self._legacy - result = LegacyMetadata() - nmd = self._data - for nk, ok in self.LEGACY_MAPPING.items(): - if nk in nmd: - result[ok] = nmd[nk] - r1 = process_entries(self.run_requires + self.meta_requires) - r2 = process_entries(self.build_requires + self.dev_requires) - if self.extras: - result['Provides-Extra'] = sorted(self.extras) - result['Requires-Dist'] = sorted(r1) - result['Setup-Requires-Dist'] = sorted(r2) - # TODO: other fields such as contacts - return result - - def write(self, path=None, fileobj=None, legacy=False, skip_unknown=True): - if [path, fileobj].count(None) != 1: - raise ValueError('Exactly one of path and fileobj is needed') - self.validate() - if legacy: - if self._legacy: - legacy_md = self._legacy - else: - legacy_md = self._to_legacy() - if path: - legacy_md.write(path, skip_unknown=skip_unknown) - else: - legacy_md.write_file(fileobj, skip_unknown=skip_unknown) - else: - if self._legacy: - d = self._from_legacy() - else: - d = self._data - if fileobj: - json.dump(d, fileobj, ensure_ascii=True, indent=2, - sort_keys=True) - else: - with codecs.open(path, 'w', 'utf-8') as f: - json.dump(d, f, ensure_ascii=True, indent=2, - sort_keys=True) - - def add_requirements(self, requirements): - if self._legacy: - self._legacy.add_requirements(requirements) - else: - run_requires = self._data.setdefault('run_requires', []) - always = None - for entry in run_requires: - if 'environment' not in entry and 'extra' not in entry: - always = entry - break - if always is None: - always = { 'requires': requirements } - run_requires.insert(0, always) - else: - rset = set(always['requires']) | set(requirements) - always['requires'] = sorted(rset) - - def __repr__(self): - name = self.name or '(no name)' - version = self.version or 'no version' - return '<%s %s %s (%s)>' % (self.__class__.__name__, - self.metadata_version, name, version) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/resources.py b/env/lib/python3.7/site-packages/pip/_vendor/distlib/resources.py deleted file mode 100644 index 1884016..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/distlib/resources.py +++ /dev/null @@ -1,355 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2013-2017 Vinay Sajip. -# Licensed to the Python Software Foundation under a contributor agreement. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -from __future__ import unicode_literals - -import bisect -import io -import logging -import os -import pkgutil -import shutil -import sys -import types -import zipimport - -from . import DistlibException -from .util import cached_property, get_cache_base, path_to_cache_dir, Cache - -logger = logging.getLogger(__name__) - - -cache = None # created when needed - - -class ResourceCache(Cache): - def __init__(self, base=None): - if base is None: - # Use native string to avoid issues on 2.x: see Python #20140. - base = os.path.join(get_cache_base(), str('resource-cache')) - super(ResourceCache, self).__init__(base) - - def is_stale(self, resource, path): - """ - Is the cache stale for the given resource? - - :param resource: The :class:`Resource` being cached. - :param path: The path of the resource in the cache. - :return: True if the cache is stale. - """ - # Cache invalidation is a hard problem :-) - return True - - def get(self, resource): - """ - Get a resource into the cache, - - :param resource: A :class:`Resource` instance. - :return: The pathname of the resource in the cache. - """ - prefix, path = resource.finder.get_cache_info(resource) - if prefix is None: - result = path - else: - result = os.path.join(self.base, self.prefix_to_dir(prefix), path) - dirname = os.path.dirname(result) - if not os.path.isdir(dirname): - os.makedirs(dirname) - if not os.path.exists(result): - stale = True - else: - stale = self.is_stale(resource, path) - if stale: - # write the bytes of the resource to the cache location - with open(result, 'wb') as f: - f.write(resource.bytes) - return result - - -class ResourceBase(object): - def __init__(self, finder, name): - self.finder = finder - self.name = name - - -class Resource(ResourceBase): - """ - A class representing an in-package resource, such as a data file. This is - not normally instantiated by user code, but rather by a - :class:`ResourceFinder` which manages the resource. - """ - is_container = False # Backwards compatibility - - def as_stream(self): - """ - Get the resource as a stream. - - This is not a property to make it obvious that it returns a new stream - each time. - """ - return self.finder.get_stream(self) - - @cached_property - def file_path(self): - global cache - if cache is None: - cache = ResourceCache() - return cache.get(self) - - @cached_property - def bytes(self): - return self.finder.get_bytes(self) - - @cached_property - def size(self): - return self.finder.get_size(self) - - -class ResourceContainer(ResourceBase): - is_container = True # Backwards compatibility - - @cached_property - def resources(self): - return self.finder.get_resources(self) - - -class ResourceFinder(object): - """ - Resource finder for file system resources. - """ - - if sys.platform.startswith('java'): - skipped_extensions = ('.pyc', '.pyo', '.class') - else: - skipped_extensions = ('.pyc', '.pyo') - - def __init__(self, module): - self.module = module - self.loader = getattr(module, '__loader__', None) - self.base = os.path.dirname(getattr(module, '__file__', '')) - - def _adjust_path(self, path): - return os.path.realpath(path) - - def _make_path(self, resource_name): - # Issue #50: need to preserve type of path on Python 2.x - # like os.path._get_sep - if isinstance(resource_name, bytes): # should only happen on 2.x - sep = b'/' - else: - sep = '/' - parts = resource_name.split(sep) - parts.insert(0, self.base) - result = os.path.join(*parts) - return self._adjust_path(result) - - def _find(self, path): - return os.path.exists(path) - - def get_cache_info(self, resource): - return None, resource.path - - def find(self, resource_name): - path = self._make_path(resource_name) - if not self._find(path): - result = None - else: - if self._is_directory(path): - result = ResourceContainer(self, resource_name) - else: - result = Resource(self, resource_name) - result.path = path - return result - - def get_stream(self, resource): - return open(resource.path, 'rb') - - def get_bytes(self, resource): - with open(resource.path, 'rb') as f: - return f.read() - - def get_size(self, resource): - return os.path.getsize(resource.path) - - def get_resources(self, resource): - def allowed(f): - return (f != '__pycache__' and not - f.endswith(self.skipped_extensions)) - return set([f for f in os.listdir(resource.path) if allowed(f)]) - - def is_container(self, resource): - return self._is_directory(resource.path) - - _is_directory = staticmethod(os.path.isdir) - - def iterator(self, resource_name): - resource = self.find(resource_name) - if resource is not None: - todo = [resource] - while todo: - resource = todo.pop(0) - yield resource - if resource.is_container: - rname = resource.name - for name in resource.resources: - if not rname: - new_name = name - else: - new_name = '/'.join([rname, name]) - child = self.find(new_name) - if child.is_container: - todo.append(child) - else: - yield child - - -class ZipResourceFinder(ResourceFinder): - """ - Resource finder for resources in .zip files. - """ - def __init__(self, module): - super(ZipResourceFinder, self).__init__(module) - archive = self.loader.archive - self.prefix_len = 1 + len(archive) - # PyPy doesn't have a _files attr on zipimporter, and you can't set one - if hasattr(self.loader, '_files'): - self._files = self.loader._files - else: - self._files = zipimport._zip_directory_cache[archive] - self.index = sorted(self._files) - - def _adjust_path(self, path): - return path - - def _find(self, path): - path = path[self.prefix_len:] - if path in self._files: - result = True - else: - if path and path[-1] != os.sep: - path = path + os.sep - i = bisect.bisect(self.index, path) - try: - result = self.index[i].startswith(path) - except IndexError: - result = False - if not result: - logger.debug('_find failed: %r %r', path, self.loader.prefix) - else: - logger.debug('_find worked: %r %r', path, self.loader.prefix) - return result - - def get_cache_info(self, resource): - prefix = self.loader.archive - path = resource.path[1 + len(prefix):] - return prefix, path - - def get_bytes(self, resource): - return self.loader.get_data(resource.path) - - def get_stream(self, resource): - return io.BytesIO(self.get_bytes(resource)) - - def get_size(self, resource): - path = resource.path[self.prefix_len:] - return self._files[path][3] - - def get_resources(self, resource): - path = resource.path[self.prefix_len:] - if path and path[-1] != os.sep: - path += os.sep - plen = len(path) - result = set() - i = bisect.bisect(self.index, path) - while i < len(self.index): - if not self.index[i].startswith(path): - break - s = self.index[i][plen:] - result.add(s.split(os.sep, 1)[0]) # only immediate children - i += 1 - return result - - def _is_directory(self, path): - path = path[self.prefix_len:] - if path and path[-1] != os.sep: - path += os.sep - i = bisect.bisect(self.index, path) - try: - result = self.index[i].startswith(path) - except IndexError: - result = False - return result - -_finder_registry = { - type(None): ResourceFinder, - zipimport.zipimporter: ZipResourceFinder -} - -try: - # In Python 3.6, _frozen_importlib -> _frozen_importlib_external - try: - import _frozen_importlib_external as _fi - except ImportError: - import _frozen_importlib as _fi - _finder_registry[_fi.SourceFileLoader] = ResourceFinder - _finder_registry[_fi.FileFinder] = ResourceFinder - del _fi -except (ImportError, AttributeError): - pass - - -def register_finder(loader, finder_maker): - _finder_registry[type(loader)] = finder_maker - -_finder_cache = {} - - -def finder(package): - """ - Return a resource finder for a package. - :param package: The name of the package. - :return: A :class:`ResourceFinder` instance for the package. - """ - if package in _finder_cache: - result = _finder_cache[package] - else: - if package not in sys.modules: - __import__(package) - module = sys.modules[package] - path = getattr(module, '__path__', None) - if path is None: - raise DistlibException('You cannot get a finder for a module, ' - 'only for a package') - loader = getattr(module, '__loader__', None) - finder_maker = _finder_registry.get(type(loader)) - if finder_maker is None: - raise DistlibException('Unable to locate finder for %r' % package) - result = finder_maker(module) - _finder_cache[package] = result - return result - - -_dummy_module = types.ModuleType(str('__dummy__')) - - -def finder_for_path(path): - """ - Return a resource finder for a path, which should represent a container. - - :param path: The path. - :return: A :class:`ResourceFinder` instance for the path. - """ - result = None - # calls any path hooks, gets importer into cache - pkgutil.get_importer(path) - loader = sys.path_importer_cache.get(path) - finder = _finder_registry.get(type(loader)) - if finder: - module = _dummy_module - module.__file__ = os.path.join(path, '') - module.__loader__ = loader - result = finder(module) - return result diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/scripts.py b/env/lib/python3.7/site-packages/pip/_vendor/distlib/scripts.py deleted file mode 100644 index 8e22cb9..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/distlib/scripts.py +++ /dev/null @@ -1,417 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2013-2015 Vinay Sajip. -# Licensed to the Python Software Foundation under a contributor agreement. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -from io import BytesIO -import logging -import os -import re -import struct -import sys - -from .compat import sysconfig, detect_encoding, ZipFile -from .resources import finder -from .util import (FileOperator, get_export_entry, convert_path, - get_executable, in_venv) - -logger = logging.getLogger(__name__) - -_DEFAULT_MANIFEST = ''' -<?xml version="1.0" encoding="UTF-8" standalone="yes"?> -<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> - <assemblyIdentity version="1.0.0.0" - processorArchitecture="X86" - name="%s" - type="win32"/> - - <!-- Identify the application security requirements. --> - <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> - <security> - <requestedPrivileges> - <requestedExecutionLevel level="asInvoker" uiAccess="false"/> - </requestedPrivileges> - </security> - </trustInfo> -</assembly>'''.strip() - -# check if Python is called on the first line with this expression -FIRST_LINE_RE = re.compile(b'^#!.*pythonw?[0-9.]*([ \t].*)?$') -SCRIPT_TEMPLATE = r'''# -*- coding: utf-8 -*- -if __name__ == '__main__': - import sys, re - - def _resolve(module, func): - __import__(module) - mod = sys.modules[module] - parts = func.split('.') - result = getattr(mod, parts.pop(0)) - for p in parts: - result = getattr(result, p) - return result - - try: - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - - func = _resolve('%(module)s', '%(func)s') - rc = func() # None interpreted as 0 - except Exception as e: # only supporting Python >= 2.6 - sys.stderr.write('%%s\n' %% e) - rc = 1 - sys.exit(rc) -''' - - -def _enquote_executable(executable): - if ' ' in executable: - # make sure we quote only the executable in case of env - # for example /usr/bin/env "/dir with spaces/bin/jython" - # instead of "/usr/bin/env /dir with spaces/bin/jython" - # otherwise whole - if executable.startswith('/usr/bin/env '): - env, _executable = executable.split(' ', 1) - if ' ' in _executable and not _executable.startswith('"'): - executable = '%s "%s"' % (env, _executable) - else: - if not executable.startswith('"'): - executable = '"%s"' % executable - return executable - - -class ScriptMaker(object): - """ - A class to copy or create scripts from source scripts or callable - specifications. - """ - script_template = SCRIPT_TEMPLATE - - executable = None # for shebangs - - def __init__(self, source_dir, target_dir, add_launchers=True, - dry_run=False, fileop=None): - self.source_dir = source_dir - self.target_dir = target_dir - self.add_launchers = add_launchers - self.force = False - self.clobber = False - # It only makes sense to set mode bits on POSIX. - self.set_mode = (os.name == 'posix') or (os.name == 'java' and - os._name == 'posix') - self.variants = set(('', 'X.Y')) - self._fileop = fileop or FileOperator(dry_run) - - self._is_nt = os.name == 'nt' or ( - os.name == 'java' and os._name == 'nt') - - def _get_alternate_executable(self, executable, options): - if options.get('gui', False) and self._is_nt: # pragma: no cover - dn, fn = os.path.split(executable) - fn = fn.replace('python', 'pythonw') - executable = os.path.join(dn, fn) - return executable - - if sys.platform.startswith('java'): # pragma: no cover - def _is_shell(self, executable): - """ - Determine if the specified executable is a script - (contains a #! line) - """ - try: - with open(executable) as fp: - return fp.read(2) == '#!' - except (OSError, IOError): - logger.warning('Failed to open %s', executable) - return False - - def _fix_jython_executable(self, executable): - if self._is_shell(executable): - # Workaround for Jython is not needed on Linux systems. - import java - - if java.lang.System.getProperty('os.name') == 'Linux': - return executable - elif executable.lower().endswith('jython.exe'): - # Use wrapper exe for Jython on Windows - return executable - return '/usr/bin/env %s' % executable - - def _build_shebang(self, executable, post_interp): - """ - Build a shebang line. In the simple case (on Windows, or a shebang line - which is not too long or contains spaces) use a simple formulation for - the shebang. Otherwise, use /bin/sh as the executable, with a contrived - shebang which allows the script to run either under Python or sh, using - suitable quoting. Thanks to Harald Nordgren for his input. - - See also: http://www.in-ulm.de/~mascheck/various/shebang/#length - https://hg.mozilla.org/mozilla-central/file/tip/mach - """ - if os.name != 'posix': - simple_shebang = True - else: - # Add 3 for '#!' prefix and newline suffix. - shebang_length = len(executable) + len(post_interp) + 3 - if sys.platform == 'darwin': - max_shebang_length = 512 - else: - max_shebang_length = 127 - simple_shebang = ((b' ' not in executable) and - (shebang_length <= max_shebang_length)) - - if simple_shebang: - result = b'#!' + executable + post_interp + b'\n' - else: - result = b'#!/bin/sh\n' - result += b"'''exec' " + executable + post_interp + b' "$0" "$@"\n' - result += b"' '''" - return result - - def _get_shebang(self, encoding, post_interp=b'', options=None): - enquote = True - if self.executable: - executable = self.executable - enquote = False # assume this will be taken care of - elif not sysconfig.is_python_build(): - executable = get_executable() - elif in_venv(): # pragma: no cover - executable = os.path.join(sysconfig.get_path('scripts'), - 'python%s' % sysconfig.get_config_var('EXE')) - else: # pragma: no cover - executable = os.path.join( - sysconfig.get_config_var('BINDIR'), - 'python%s%s' % (sysconfig.get_config_var('VERSION'), - sysconfig.get_config_var('EXE'))) - if options: - executable = self._get_alternate_executable(executable, options) - - if sys.platform.startswith('java'): # pragma: no cover - executable = self._fix_jython_executable(executable) - # Normalise case for Windows - executable = os.path.normcase(executable) - # If the user didn't specify an executable, it may be necessary to - # cater for executable paths with spaces (not uncommon on Windows) - if enquote: - executable = _enquote_executable(executable) - # Issue #51: don't use fsencode, since we later try to - # check that the shebang is decodable using utf-8. - executable = executable.encode('utf-8') - # in case of IronPython, play safe and enable frames support - if (sys.platform == 'cli' and '-X:Frames' not in post_interp - and '-X:FullFrames' not in post_interp): # pragma: no cover - post_interp += b' -X:Frames' - shebang = self._build_shebang(executable, post_interp) - # Python parser starts to read a script using UTF-8 until - # it gets a #coding:xxx cookie. The shebang has to be the - # first line of a file, the #coding:xxx cookie cannot be - # written before. So the shebang has to be decodable from - # UTF-8. - try: - shebang.decode('utf-8') - except UnicodeDecodeError: # pragma: no cover - raise ValueError( - 'The shebang (%r) is not decodable from utf-8' % shebang) - # If the script is encoded to a custom encoding (use a - # #coding:xxx cookie), the shebang has to be decodable from - # the script encoding too. - if encoding != 'utf-8': - try: - shebang.decode(encoding) - except UnicodeDecodeError: # pragma: no cover - raise ValueError( - 'The shebang (%r) is not decodable ' - 'from the script encoding (%r)' % (shebang, encoding)) - return shebang - - def _get_script_text(self, entry): - return self.script_template % dict(module=entry.prefix, - func=entry.suffix) - - manifest = _DEFAULT_MANIFEST - - def get_manifest(self, exename): - base = os.path.basename(exename) - return self.manifest % base - - def _write_script(self, names, shebang, script_bytes, filenames, ext): - use_launcher = self.add_launchers and self._is_nt - linesep = os.linesep.encode('utf-8') - if not shebang.endswith(linesep): - shebang += linesep - if not use_launcher: - script_bytes = shebang + script_bytes - else: # pragma: no cover - if ext == 'py': - launcher = self._get_launcher('t') - else: - launcher = self._get_launcher('w') - stream = BytesIO() - with ZipFile(stream, 'w') as zf: - zf.writestr('__main__.py', script_bytes) - zip_data = stream.getvalue() - script_bytes = launcher + shebang + zip_data - for name in names: - outname = os.path.join(self.target_dir, name) - if use_launcher: # pragma: no cover - n, e = os.path.splitext(outname) - if e.startswith('.py'): - outname = n - outname = '%s.exe' % outname - try: - self._fileop.write_binary_file(outname, script_bytes) - except Exception: - # Failed writing an executable - it might be in use. - logger.warning('Failed to write executable - trying to ' - 'use .deleteme logic') - dfname = '%s.deleteme' % outname - if os.path.exists(dfname): - os.remove(dfname) # Not allowed to fail here - os.rename(outname, dfname) # nor here - self._fileop.write_binary_file(outname, script_bytes) - logger.debug('Able to replace executable using ' - '.deleteme logic') - try: - os.remove(dfname) - except Exception: - pass # still in use - ignore error - else: - if self._is_nt and not outname.endswith('.' + ext): # pragma: no cover - outname = '%s.%s' % (outname, ext) - if os.path.exists(outname) and not self.clobber: - logger.warning('Skipping existing file %s', outname) - continue - self._fileop.write_binary_file(outname, script_bytes) - if self.set_mode: - self._fileop.set_executable_mode([outname]) - filenames.append(outname) - - def _make_script(self, entry, filenames, options=None): - post_interp = b'' - if options: - args = options.get('interpreter_args', []) - if args: - args = ' %s' % ' '.join(args) - post_interp = args.encode('utf-8') - shebang = self._get_shebang('utf-8', post_interp, options=options) - script = self._get_script_text(entry).encode('utf-8') - name = entry.name - scriptnames = set() - if '' in self.variants: - scriptnames.add(name) - if 'X' in self.variants: - scriptnames.add('%s%s' % (name, sys.version[0])) - if 'X.Y' in self.variants: - scriptnames.add('%s-%s' % (name, sys.version[:3])) - if options and options.get('gui', False): - ext = 'pyw' - else: - ext = 'py' - self._write_script(scriptnames, shebang, script, filenames, ext) - - def _copy_script(self, script, filenames): - adjust = False - script = os.path.join(self.source_dir, convert_path(script)) - outname = os.path.join(self.target_dir, os.path.basename(script)) - if not self.force and not self._fileop.newer(script, outname): - logger.debug('not copying %s (up-to-date)', script) - return - - # Always open the file, but ignore failures in dry-run mode -- - # that way, we'll get accurate feedback if we can read the - # script. - try: - f = open(script, 'rb') - except IOError: # pragma: no cover - if not self.dry_run: - raise - f = None - else: - first_line = f.readline() - if not first_line: # pragma: no cover - logger.warning('%s: %s is an empty file (skipping)', - self.get_command_name(), script) - return - - match = FIRST_LINE_RE.match(first_line.replace(b'\r\n', b'\n')) - if match: - adjust = True - post_interp = match.group(1) or b'' - - if not adjust: - if f: - f.close() - self._fileop.copy_file(script, outname) - if self.set_mode: - self._fileop.set_executable_mode([outname]) - filenames.append(outname) - else: - logger.info('copying and adjusting %s -> %s', script, - self.target_dir) - if not self._fileop.dry_run: - encoding, lines = detect_encoding(f.readline) - f.seek(0) - shebang = self._get_shebang(encoding, post_interp) - if b'pythonw' in first_line: # pragma: no cover - ext = 'pyw' - else: - ext = 'py' - n = os.path.basename(outname) - self._write_script([n], shebang, f.read(), filenames, ext) - if f: - f.close() - - @property - def dry_run(self): - return self._fileop.dry_run - - @dry_run.setter - def dry_run(self, value): - self._fileop.dry_run = value - - if os.name == 'nt' or (os.name == 'java' and os._name == 'nt'): # pragma: no cover - # Executable launcher support. - # Launchers are from https://bitbucket.org/vinay.sajip/simple_launcher/ - - def _get_launcher(self, kind): - if struct.calcsize('P') == 8: # 64-bit - bits = '64' - else: - bits = '32' - name = '%s%s.exe' % (kind, bits) - # Issue 31: don't hardcode an absolute package name, but - # determine it relative to the current package - distlib_package = __name__.rsplit('.', 1)[0] - result = finder(distlib_package).find(name).bytes - return result - - # Public API follows - - def make(self, specification, options=None): - """ - Make a script. - - :param specification: The specification, which is either a valid export - entry specification (to make a script from a - callable) or a filename (to make a script by - copying from a source location). - :param options: A dictionary of options controlling script generation. - :return: A list of all absolute pathnames written to. - """ - filenames = [] - entry = get_export_entry(specification) - if entry is None: - self._copy_script(specification, filenames) - else: - self._make_script(entry, filenames, options=options) - return filenames - - def make_multiple(self, specifications, options=None): - """ - Take a list of specifications and make scripts from them, - :param specifications: A list of specifications. - :return: A list of all absolute pathnames written to, - """ - filenames = [] - for specification in specifications: - filenames.extend(self.make(specification, options)) - return filenames diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/t32.exe b/env/lib/python3.7/site-packages/pip/_vendor/distlib/t32.exe deleted file mode 100644 index a09d926872d84ae22a617dfe9ebb560d420b37de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 92672 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/t64.exe b/env/lib/python3.7/site-packages/pip/_vendor/distlib/t64.exe deleted file mode 100644 index 9da9b40de922fb203df6b9a1d0ad4139af536850..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 102400 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�vlnW`{LoXpTySn$@;x8yoz96jn?+Kk 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�?dYNUd4WaURX_A__M4W}D0!0n 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/util.py b/env/lib/python3.7/site-packages/pip/_vendor/distlib/util.py deleted file mode 100644 index 9d4bfd3..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/distlib/util.py +++ /dev/null @@ -1,1756 +0,0 @@ -# -# Copyright (C) 2012-2017 The Python Software Foundation. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -import codecs -from collections import deque -import contextlib -import csv -from glob import iglob as std_iglob -import io -import json -import logging -import os -import py_compile -import re -import socket -try: - import ssl -except ImportError: # pragma: no cover - ssl = None -import subprocess -import sys -import tarfile -import tempfile -import textwrap - -try: - import threading -except ImportError: # pragma: no cover - import dummy_threading as threading -import time - -from . import DistlibException -from .compat import (string_types, text_type, shutil, raw_input, StringIO, - cache_from_source, urlopen, urljoin, httplib, xmlrpclib, - splittype, HTTPHandler, BaseConfigurator, valid_ident, - Container, configparser, URLError, ZipFile, fsdecode, - unquote, urlparse) - -logger = logging.getLogger(__name__) - -# -# Requirement parsing code as per PEP 508 -# - -IDENTIFIER = re.compile(r'^([\w\.-]+)\s*') -VERSION_IDENTIFIER = re.compile(r'^([\w\.*+-]+)\s*') -COMPARE_OP = re.compile(r'^(<=?|>=?|={2,3}|[~!]=)\s*') -MARKER_OP = re.compile(r'^((<=?)|(>=?)|={2,3}|[~!]=|in|not\s+in)\s*') -OR = re.compile(r'^or\b\s*') -AND = re.compile(r'^and\b\s*') -NON_SPACE = re.compile(r'(\S+)\s*') -STRING_CHUNK = re.compile(r'([\s\w\.{}()*+#:;,/?!~`@$%^&=|<>\[\]-]+)') - - -def parse_marker(marker_string): - """ - Parse a marker string and return a dictionary containing a marker expression. - - The dictionary will contain keys "op", "lhs" and "rhs" for non-terminals in - the expression grammar, or strings. A string contained in quotes is to be - interpreted as a literal string, and a string not contained in quotes is a - variable (such as os_name). - """ - def marker_var(remaining): - # either identifier, or literal string - m = IDENTIFIER.match(remaining) - if m: - result = m.groups()[0] - remaining = remaining[m.end():] - elif not remaining: - raise SyntaxError('unexpected end of input') - else: - q = remaining[0] - if q not in '\'"': - raise SyntaxError('invalid expression: %s' % remaining) - oq = '\'"'.replace(q, '') - remaining = remaining[1:] - parts = [q] - while remaining: - # either a string chunk, or oq, or q to terminate - if remaining[0] == q: - break - elif remaining[0] == oq: - parts.append(oq) - remaining = remaining[1:] - else: - m = STRING_CHUNK.match(remaining) - if not m: - raise SyntaxError('error in string literal: %s' % remaining) - parts.append(m.groups()[0]) - remaining = remaining[m.end():] - else: - s = ''.join(parts) - raise SyntaxError('unterminated string: %s' % s) - parts.append(q) - result = ''.join(parts) - remaining = remaining[1:].lstrip() # skip past closing quote - return result, remaining - - def marker_expr(remaining): - if remaining and remaining[0] == '(': - result, remaining = marker(remaining[1:].lstrip()) - if remaining[0] != ')': - raise SyntaxError('unterminated parenthesis: %s' % remaining) - remaining = remaining[1:].lstrip() - else: - lhs, remaining = marker_var(remaining) - while remaining: - m = MARKER_OP.match(remaining) - if not m: - break - op = m.groups()[0] - remaining = remaining[m.end():] - rhs, remaining = marker_var(remaining) - lhs = {'op': op, 'lhs': lhs, 'rhs': rhs} - result = lhs - return result, remaining - - def marker_and(remaining): - lhs, remaining = marker_expr(remaining) - while remaining: - m = AND.match(remaining) - if not m: - break - remaining = remaining[m.end():] - rhs, remaining = marker_expr(remaining) - lhs = {'op': 'and', 'lhs': lhs, 'rhs': rhs} - return lhs, remaining - - def marker(remaining): - lhs, remaining = marker_and(remaining) - while remaining: - m = OR.match(remaining) - if not m: - break - remaining = remaining[m.end():] - rhs, remaining = marker_and(remaining) - lhs = {'op': 'or', 'lhs': lhs, 'rhs': rhs} - return lhs, remaining - - return marker(marker_string) - - -def parse_requirement(req): - """ - Parse a requirement passed in as a string. Return a Container - whose attributes contain the various parts of the requirement. - """ - remaining = req.strip() - if not remaining or remaining.startswith('#'): - return None - m = IDENTIFIER.match(remaining) - if not m: - raise SyntaxError('name expected: %s' % remaining) - distname = m.groups()[0] - remaining = remaining[m.end():] - extras = mark_expr = versions = uri = None - if remaining and remaining[0] == '[': - i = remaining.find(']', 1) - if i < 0: - raise SyntaxError('unterminated extra: %s' % remaining) - s = remaining[1:i] - remaining = remaining[i + 1:].lstrip() - extras = [] - while s: - m = IDENTIFIER.match(s) - if not m: - raise SyntaxError('malformed extra: %s' % s) - extras.append(m.groups()[0]) - s = s[m.end():] - if not s: - break - if s[0] != ',': - raise SyntaxError('comma expected in extras: %s' % s) - s = s[1:].lstrip() - if not extras: - extras = None - if remaining: - if remaining[0] == '@': - # it's a URI - remaining = remaining[1:].lstrip() - m = NON_SPACE.match(remaining) - if not m: - raise SyntaxError('invalid URI: %s' % remaining) - uri = m.groups()[0] - t = urlparse(uri) - # there are issues with Python and URL parsing, so this test - # is a bit crude. See bpo-20271, bpo-23505. Python doesn't - # always parse invalid URLs correctly - it should raise - # exceptions for malformed URLs - if not (t.scheme and t.netloc): - raise SyntaxError('Invalid URL: %s' % uri) - remaining = remaining[m.end():].lstrip() - else: - - def get_versions(ver_remaining): - """ - Return a list of operator, version tuples if any are - specified, else None. - """ - m = COMPARE_OP.match(ver_remaining) - versions = None - if m: - versions = [] - while True: - op = m.groups()[0] - ver_remaining = ver_remaining[m.end():] - m = VERSION_IDENTIFIER.match(ver_remaining) - if not m: - raise SyntaxError('invalid version: %s' % ver_remaining) - v = m.groups()[0] - versions.append((op, v)) - ver_remaining = ver_remaining[m.end():] - if not ver_remaining or ver_remaining[0] != ',': - break - ver_remaining = ver_remaining[1:].lstrip() - m = COMPARE_OP.match(ver_remaining) - if not m: - raise SyntaxError('invalid constraint: %s' % ver_remaining) - if not versions: - versions = None - return versions, ver_remaining - - if remaining[0] != '(': - versions, remaining = get_versions(remaining) - else: - i = remaining.find(')', 1) - if i < 0: - raise SyntaxError('unterminated parenthesis: %s' % remaining) - s = remaining[1:i] - remaining = remaining[i + 1:].lstrip() - # As a special diversion from PEP 508, allow a version number - # a.b.c in parentheses as a synonym for ~= a.b.c (because this - # is allowed in earlier PEPs) - if COMPARE_OP.match(s): - versions, _ = get_versions(s) - else: - m = VERSION_IDENTIFIER.match(s) - if not m: - raise SyntaxError('invalid constraint: %s' % s) - v = m.groups()[0] - s = s[m.end():].lstrip() - if s: - raise SyntaxError('invalid constraint: %s' % s) - versions = [('~=', v)] - - if remaining: - if remaining[0] != ';': - raise SyntaxError('invalid requirement: %s' % remaining) - remaining = remaining[1:].lstrip() - - mark_expr, remaining = parse_marker(remaining) - - if remaining and remaining[0] != '#': - raise SyntaxError('unexpected trailing data: %s' % remaining) - - if not versions: - rs = distname - else: - rs = '%s %s' % (distname, ', '.join(['%s %s' % con for con in versions])) - return Container(name=distname, extras=extras, constraints=versions, - marker=mark_expr, url=uri, requirement=rs) - - -def get_resources_dests(resources_root, rules): - """Find destinations for resources files""" - - def get_rel_path(root, path): - # normalizes and returns a lstripped-/-separated path - root = root.replace(os.path.sep, '/') - path = path.replace(os.path.sep, '/') - assert path.startswith(root) - return path[len(root):].lstrip('/') - - destinations = {} - for base, suffix, dest in rules: - prefix = os.path.join(resources_root, base) - for abs_base in iglob(prefix): - abs_glob = os.path.join(abs_base, suffix) - for abs_path in iglob(abs_glob): - resource_file = get_rel_path(resources_root, abs_path) - if dest is None: # remove the entry if it was here - destinations.pop(resource_file, None) - else: - rel_path = get_rel_path(abs_base, abs_path) - rel_dest = dest.replace(os.path.sep, '/').rstrip('/') - destinations[resource_file] = rel_dest + '/' + rel_path - return destinations - - -def in_venv(): - if hasattr(sys, 'real_prefix'): - # virtualenv venvs - result = True - else: - # PEP 405 venvs - result = sys.prefix != getattr(sys, 'base_prefix', sys.prefix) - return result - - -def get_executable(): -# The __PYVENV_LAUNCHER__ dance is apparently no longer needed, as -# changes to the stub launcher mean that sys.executable always points -# to the stub on OS X -# if sys.platform == 'darwin' and ('__PYVENV_LAUNCHER__' -# in os.environ): -# result = os.environ['__PYVENV_LAUNCHER__'] -# else: -# result = sys.executable -# return result - result = os.path.normcase(sys.executable) - if not isinstance(result, text_type): - result = fsdecode(result) - return result - - -def proceed(prompt, allowed_chars, error_prompt=None, default=None): - p = prompt - while True: - s = raw_input(p) - p = prompt - if not s and default: - s = default - if s: - c = s[0].lower() - if c in allowed_chars: - break - if error_prompt: - p = '%c: %s\n%s' % (c, error_prompt, prompt) - return c - - -def extract_by_key(d, keys): - if isinstance(keys, string_types): - keys = keys.split() - result = {} - for key in keys: - if key in d: - result[key] = d[key] - return result - -def read_exports(stream): - if sys.version_info[0] >= 3: - # needs to be a text stream - stream = codecs.getreader('utf-8')(stream) - # Try to load as JSON, falling back on legacy format - data = stream.read() - stream = StringIO(data) - try: - jdata = json.load(stream) - result = jdata['extensions']['python.exports']['exports'] - for group, entries in result.items(): - for k, v in entries.items(): - s = '%s = %s' % (k, v) - entry = get_export_entry(s) - assert entry is not None - entries[k] = entry - return result - except Exception: - stream.seek(0, 0) - - def read_stream(cp, stream): - if hasattr(cp, 'read_file'): - cp.read_file(stream) - else: - cp.readfp(stream) - - cp = configparser.ConfigParser() - try: - read_stream(cp, stream) - except configparser.MissingSectionHeaderError: - stream.close() - data = textwrap.dedent(data) - stream = StringIO(data) - read_stream(cp, stream) - - result = {} - for key in cp.sections(): - result[key] = entries = {} - for name, value in cp.items(key): - s = '%s = %s' % (name, value) - entry = get_export_entry(s) - assert entry is not None - #entry.dist = self - entries[name] = entry - return result - - -def write_exports(exports, stream): - if sys.version_info[0] >= 3: - # needs to be a text stream - stream = codecs.getwriter('utf-8')(stream) - cp = configparser.ConfigParser() - for k, v in exports.items(): - # TODO check k, v for valid values - cp.add_section(k) - for entry in v.values(): - if entry.suffix is None: - s = entry.prefix - else: - s = '%s:%s' % (entry.prefix, entry.suffix) - if entry.flags: - s = '%s [%s]' % (s, ', '.join(entry.flags)) - cp.set(k, entry.name, s) - cp.write(stream) - - -@contextlib.contextmanager -def tempdir(): - td = tempfile.mkdtemp() - try: - yield td - finally: - shutil.rmtree(td) - -@contextlib.contextmanager -def chdir(d): - cwd = os.getcwd() - try: - os.chdir(d) - yield - finally: - os.chdir(cwd) - - -@contextlib.contextmanager -def socket_timeout(seconds=15): - cto = socket.getdefaulttimeout() - try: - socket.setdefaulttimeout(seconds) - yield - finally: - socket.setdefaulttimeout(cto) - - -class cached_property(object): - def __init__(self, func): - self.func = func - #for attr in ('__name__', '__module__', '__doc__'): - # setattr(self, attr, getattr(func, attr, None)) - - def __get__(self, obj, cls=None): - if obj is None: - return self - value = self.func(obj) - object.__setattr__(obj, self.func.__name__, value) - #obj.__dict__[self.func.__name__] = value = self.func(obj) - return value - -def convert_path(pathname): - """Return 'pathname' as a name that will work on the native filesystem. - - The path is split on '/' and put back together again using the current - directory separator. Needed because filenames in the setup script are - always supplied in Unix style, and have to be converted to the local - convention before we can actually use them in the filesystem. Raises - ValueError on non-Unix-ish systems if 'pathname' either starts or - ends with a slash. - """ - if os.sep == '/': - return pathname - if not pathname: - return pathname - if pathname[0] == '/': - raise ValueError("path '%s' cannot be absolute" % pathname) - if pathname[-1] == '/': - raise ValueError("path '%s' cannot end with '/'" % pathname) - - paths = pathname.split('/') - while os.curdir in paths: - paths.remove(os.curdir) - if not paths: - return os.curdir - return os.path.join(*paths) - - -class FileOperator(object): - def __init__(self, dry_run=False): - self.dry_run = dry_run - self.ensured = set() - self._init_record() - - def _init_record(self): - self.record = False - self.files_written = set() - self.dirs_created = set() - - def record_as_written(self, path): - if self.record: - self.files_written.add(path) - - def newer(self, source, target): - """Tell if the target is newer than the source. - - Returns true if 'source' exists and is more recently modified than - 'target', or if 'source' exists and 'target' doesn't. - - Returns false if both exist and 'target' is the same age or younger - than 'source'. Raise PackagingFileError if 'source' does not exist. - - Note that this test is not very accurate: files created in the same - second will have the same "age". - """ - if not os.path.exists(source): - raise DistlibException("file '%r' does not exist" % - os.path.abspath(source)) - if not os.path.exists(target): - return True - - return os.stat(source).st_mtime > os.stat(target).st_mtime - - def copy_file(self, infile, outfile, check=True): - """Copy a file respecting dry-run and force flags. - """ - self.ensure_dir(os.path.dirname(outfile)) - logger.info('Copying %s to %s', infile, outfile) - if not self.dry_run: - msg = None - if check: - if os.path.islink(outfile): - msg = '%s is a symlink' % outfile - elif os.path.exists(outfile) and not os.path.isfile(outfile): - msg = '%s is a non-regular file' % outfile - if msg: - raise ValueError(msg + ' which would be overwritten') - shutil.copyfile(infile, outfile) - self.record_as_written(outfile) - - def copy_stream(self, instream, outfile, encoding=None): - assert not os.path.isdir(outfile) - self.ensure_dir(os.path.dirname(outfile)) - logger.info('Copying stream %s to %s', instream, outfile) - if not self.dry_run: - if encoding is None: - outstream = open(outfile, 'wb') - else: - outstream = codecs.open(outfile, 'w', encoding=encoding) - try: - shutil.copyfileobj(instream, outstream) - finally: - outstream.close() - self.record_as_written(outfile) - - def write_binary_file(self, path, data): - self.ensure_dir(os.path.dirname(path)) - if not self.dry_run: - if os.path.exists(path): - os.remove(path) - with open(path, 'wb') as f: - f.write(data) - self.record_as_written(path) - - def write_text_file(self, path, data, encoding): - self.write_binary_file(path, data.encode(encoding)) - - def set_mode(self, bits, mask, files): - if os.name == 'posix' or (os.name == 'java' and os._name == 'posix'): - # Set the executable bits (owner, group, and world) on - # all the files specified. - for f in files: - if self.dry_run: - logger.info("changing mode of %s", f) - else: - mode = (os.stat(f).st_mode | bits) & mask - logger.info("changing mode of %s to %o", f, mode) - os.chmod(f, mode) - - set_executable_mode = lambda s, f: s.set_mode(0o555, 0o7777, f) - - def ensure_dir(self, path): - path = os.path.abspath(path) - if path not in self.ensured and not os.path.exists(path): - self.ensured.add(path) - d, f = os.path.split(path) - self.ensure_dir(d) - logger.info('Creating %s' % path) - if not self.dry_run: - os.mkdir(path) - if self.record: - self.dirs_created.add(path) - - def byte_compile(self, path, optimize=False, force=False, prefix=None, hashed_invalidation=False): - dpath = cache_from_source(path, not optimize) - logger.info('Byte-compiling %s to %s', path, dpath) - if not self.dry_run: - if force or self.newer(path, dpath): - if not prefix: - diagpath = None - else: - assert path.startswith(prefix) - diagpath = path[len(prefix):] - compile_kwargs = {} - if hashed_invalidation and hasattr(py_compile, 'PycInvalidationMode'): - compile_kwargs['invalidation_mode'] = py_compile.PycInvalidationMode.CHECKED_HASH - py_compile.compile(path, dpath, diagpath, True, **compile_kwargs) # raise error - self.record_as_written(dpath) - return dpath - - def ensure_removed(self, path): - if os.path.exists(path): - if os.path.isdir(path) and not os.path.islink(path): - logger.debug('Removing directory tree at %s', path) - if not self.dry_run: - shutil.rmtree(path) - if self.record: - if path in self.dirs_created: - self.dirs_created.remove(path) - else: - if os.path.islink(path): - s = 'link' - else: - s = 'file' - logger.debug('Removing %s %s', s, path) - if not self.dry_run: - os.remove(path) - if self.record: - if path in self.files_written: - self.files_written.remove(path) - - def is_writable(self, path): - result = False - while not result: - if os.path.exists(path): - result = os.access(path, os.W_OK) - break - parent = os.path.dirname(path) - if parent == path: - break - path = parent - return result - - def commit(self): - """ - Commit recorded changes, turn off recording, return - changes. - """ - assert self.record - result = self.files_written, self.dirs_created - self._init_record() - return result - - def rollback(self): - if not self.dry_run: - for f in list(self.files_written): - if os.path.exists(f): - os.remove(f) - # dirs should all be empty now, except perhaps for - # __pycache__ subdirs - # reverse so that subdirs appear before their parents - dirs = sorted(self.dirs_created, reverse=True) - for d in dirs: - flist = os.listdir(d) - if flist: - assert flist == ['__pycache__'] - sd = os.path.join(d, flist[0]) - os.rmdir(sd) - os.rmdir(d) # should fail if non-empty - self._init_record() - -def resolve(module_name, dotted_path): - if module_name in sys.modules: - mod = sys.modules[module_name] - else: - mod = __import__(module_name) - if dotted_path is None: - result = mod - else: - parts = dotted_path.split('.') - result = getattr(mod, parts.pop(0)) - for p in parts: - result = getattr(result, p) - return result - - -class ExportEntry(object): - def __init__(self, name, prefix, suffix, flags): - self.name = name - self.prefix = prefix - self.suffix = suffix - self.flags = flags - - @cached_property - def value(self): - return resolve(self.prefix, self.suffix) - - def __repr__(self): # pragma: no cover - return '<ExportEntry %s = %s:%s %s>' % (self.name, self.prefix, - self.suffix, self.flags) - - def __eq__(self, other): - if not isinstance(other, ExportEntry): - result = False - else: - result = (self.name == other.name and - self.prefix == other.prefix and - self.suffix == other.suffix and - self.flags == other.flags) - return result - - __hash__ = object.__hash__ - - -ENTRY_RE = re.compile(r'''(?P<name>(\w|[-.+])+) - \s*=\s*(?P<callable>(\w+)([:\.]\w+)*) - \s*(\[\s*(?P<flags>\w+(=\w+)?(,\s*\w+(=\w+)?)*)\s*\])? - ''', re.VERBOSE) - -def get_export_entry(specification): - m = ENTRY_RE.search(specification) - if not m: - result = None - if '[' in specification or ']' in specification: - raise DistlibException("Invalid specification " - "'%s'" % specification) - else: - d = m.groupdict() - name = d['name'] - path = d['callable'] - colons = path.count(':') - if colons == 0: - prefix, suffix = path, None - else: - if colons != 1: - raise DistlibException("Invalid specification " - "'%s'" % specification) - prefix, suffix = path.split(':') - flags = d['flags'] - if flags is None: - if '[' in specification or ']' in specification: - raise DistlibException("Invalid specification " - "'%s'" % specification) - flags = [] - else: - flags = [f.strip() for f in flags.split(',')] - result = ExportEntry(name, prefix, suffix, flags) - return result - - -def get_cache_base(suffix=None): - """ - Return the default base location for distlib caches. If the directory does - not exist, it is created. Use the suffix provided for the base directory, - and default to '.distlib' if it isn't provided. - - On Windows, if LOCALAPPDATA is defined in the environment, then it is - assumed to be a directory, and will be the parent directory of the result. - On POSIX, and on Windows if LOCALAPPDATA is not defined, the user's home - directory - using os.expanduser('~') - will be the parent directory of - the result. - - The result is just the directory '.distlib' in the parent directory as - determined above, or with the name specified with ``suffix``. - """ - if suffix is None: - suffix = '.distlib' - if os.name == 'nt' and 'LOCALAPPDATA' in os.environ: - result = os.path.expandvars('$localappdata') - else: - # Assume posix, or old Windows - result = os.path.expanduser('~') - # we use 'isdir' instead of 'exists', because we want to - # fail if there's a file with that name - if os.path.isdir(result): - usable = os.access(result, os.W_OK) - if not usable: - logger.warning('Directory exists but is not writable: %s', result) - else: - try: - os.makedirs(result) - usable = True - except OSError: - logger.warning('Unable to create %s', result, exc_info=True) - usable = False - if not usable: - result = tempfile.mkdtemp() - logger.warning('Default location unusable, using %s', result) - return os.path.join(result, suffix) - - -def path_to_cache_dir(path): - """ - Convert an absolute path to a directory name for use in a cache. - - The algorithm used is: - - #. On Windows, any ``':'`` in the drive is replaced with ``'---'``. - #. Any occurrence of ``os.sep`` is replaced with ``'--'``. - #. ``'.cache'`` is appended. - """ - d, p = os.path.splitdrive(os.path.abspath(path)) - if d: - d = d.replace(':', '---') - p = p.replace(os.sep, '--') - return d + p + '.cache' - - -def ensure_slash(s): - if not s.endswith('/'): - return s + '/' - return s - - -def parse_credentials(netloc): - username = password = None - if '@' in netloc: - prefix, netloc = netloc.split('@', 1) - if ':' not in prefix: - username = prefix - else: - username, password = prefix.split(':', 1) - return username, password, netloc - - -def get_process_umask(): - result = os.umask(0o22) - os.umask(result) - return result - -def is_string_sequence(seq): - result = True - i = None - for i, s in enumerate(seq): - if not isinstance(s, string_types): - result = False - break - assert i is not None - return result - -PROJECT_NAME_AND_VERSION = re.compile('([a-z0-9_]+([.-][a-z_][a-z0-9_]*)*)-' - '([a-z0-9_.+-]+)', re.I) -PYTHON_VERSION = re.compile(r'-py(\d\.?\d?)') - - -def split_filename(filename, project_name=None): - """ - Extract name, version, python version from a filename (no extension) - - Return name, version, pyver or None - """ - result = None - pyver = None - filename = unquote(filename).replace(' ', '-') - m = PYTHON_VERSION.search(filename) - if m: - pyver = m.group(1) - filename = filename[:m.start()] - if project_name and len(filename) > len(project_name) + 1: - m = re.match(re.escape(project_name) + r'\b', filename) - if m: - n = m.end() - result = filename[:n], filename[n + 1:], pyver - if result is None: - m = PROJECT_NAME_AND_VERSION.match(filename) - if m: - result = m.group(1), m.group(3), pyver - return result - -# Allow spaces in name because of legacy dists like "Twisted Core" -NAME_VERSION_RE = re.compile(r'(?P<name>[\w .-]+)\s*' - r'\(\s*(?P<ver>[^\s)]+)\)$') - -def parse_name_and_version(p): - """ - A utility method used to get name and version from a string. - - From e.g. a Provides-Dist value. - - :param p: A value in a form 'foo (1.0)' - :return: The name and version as a tuple. - """ - m = NAME_VERSION_RE.match(p) - if not m: - raise DistlibException('Ill-formed name/version string: \'%s\'' % p) - d = m.groupdict() - return d['name'].strip().lower(), d['ver'] - -def get_extras(requested, available): - result = set() - requested = set(requested or []) - available = set(available or []) - if '*' in requested: - requested.remove('*') - result |= available - for r in requested: - if r == '-': - result.add(r) - elif r.startswith('-'): - unwanted = r[1:] - if unwanted not in available: - logger.warning('undeclared extra: %s' % unwanted) - if unwanted in result: - result.remove(unwanted) - else: - if r not in available: - logger.warning('undeclared extra: %s' % r) - result.add(r) - return result -# -# Extended metadata functionality -# - -def _get_external_data(url): - result = {} - try: - # urlopen might fail if it runs into redirections, - # because of Python issue #13696. Fixed in locators - # using a custom redirect handler. - resp = urlopen(url) - headers = resp.info() - ct = headers.get('Content-Type') - if not ct.startswith('application/json'): - logger.debug('Unexpected response for JSON request: %s', ct) - else: - reader = codecs.getreader('utf-8')(resp) - #data = reader.read().decode('utf-8') - #result = json.loads(data) - result = json.load(reader) - except Exception as e: - logger.exception('Failed to get external data for %s: %s', url, e) - return result - -_external_data_base_url = 'https://www.red-dove.com/pypi/projects/' - -def get_project_data(name): - url = '%s/%s/project.json' % (name[0].upper(), name) - url = urljoin(_external_data_base_url, url) - result = _get_external_data(url) - return result - -def get_package_data(name, version): - url = '%s/%s/package-%s.json' % (name[0].upper(), name, version) - url = urljoin(_external_data_base_url, url) - return _get_external_data(url) - - -class Cache(object): - """ - A class implementing a cache for resources that need to live in the file system - e.g. shared libraries. This class was moved from resources to here because it - could be used by other modules, e.g. the wheel module. - """ - - def __init__(self, base): - """ - Initialise an instance. - - :param base: The base directory where the cache should be located. - """ - # we use 'isdir' instead of 'exists', because we want to - # fail if there's a file with that name - if not os.path.isdir(base): # pragma: no cover - os.makedirs(base) - if (os.stat(base).st_mode & 0o77) != 0: - logger.warning('Directory \'%s\' is not private', base) - self.base = os.path.abspath(os.path.normpath(base)) - - def prefix_to_dir(self, prefix): - """ - Converts a resource prefix to a directory name in the cache. - """ - return path_to_cache_dir(prefix) - - def clear(self): - """ - Clear the cache. - """ - not_removed = [] - for fn in os.listdir(self.base): - fn = os.path.join(self.base, fn) - try: - if os.path.islink(fn) or os.path.isfile(fn): - os.remove(fn) - elif os.path.isdir(fn): - shutil.rmtree(fn) - except Exception: - not_removed.append(fn) - return not_removed - - -class EventMixin(object): - """ - A very simple publish/subscribe system. - """ - def __init__(self): - self._subscribers = {} - - def add(self, event, subscriber, append=True): - """ - Add a subscriber for an event. - - :param event: The name of an event. - :param subscriber: The subscriber to be added (and called when the - event is published). - :param append: Whether to append or prepend the subscriber to an - existing subscriber list for the event. - """ - subs = self._subscribers - if event not in subs: - subs[event] = deque([subscriber]) - else: - sq = subs[event] - if append: - sq.append(subscriber) - else: - sq.appendleft(subscriber) - - def remove(self, event, subscriber): - """ - Remove a subscriber for an event. - - :param event: The name of an event. - :param subscriber: The subscriber to be removed. - """ - subs = self._subscribers - if event not in subs: - raise ValueError('No subscribers: %r' % event) - subs[event].remove(subscriber) - - def get_subscribers(self, event): - """ - Return an iterator for the subscribers for an event. - :param event: The event to return subscribers for. - """ - return iter(self._subscribers.get(event, ())) - - def publish(self, event, *args, **kwargs): - """ - Publish a event and return a list of values returned by its - subscribers. - - :param event: The event to publish. - :param args: The positional arguments to pass to the event's - subscribers. - :param kwargs: The keyword arguments to pass to the event's - subscribers. - """ - result = [] - for subscriber in self.get_subscribers(event): - try: - value = subscriber(event, *args, **kwargs) - except Exception: - logger.exception('Exception during event publication') - value = None - result.append(value) - logger.debug('publish %s: args = %s, kwargs = %s, result = %s', - event, args, kwargs, result) - return result - -# -# Simple sequencing -# -class Sequencer(object): - def __init__(self): - self._preds = {} - self._succs = {} - self._nodes = set() # nodes with no preds/succs - - def add_node(self, node): - self._nodes.add(node) - - def remove_node(self, node, edges=False): - if node in self._nodes: - self._nodes.remove(node) - if edges: - for p in set(self._preds.get(node, ())): - self.remove(p, node) - for s in set(self._succs.get(node, ())): - self.remove(node, s) - # Remove empties - for k, v in list(self._preds.items()): - if not v: - del self._preds[k] - for k, v in list(self._succs.items()): - if not v: - del self._succs[k] - - def add(self, pred, succ): - assert pred != succ - self._preds.setdefault(succ, set()).add(pred) - self._succs.setdefault(pred, set()).add(succ) - - def remove(self, pred, succ): - assert pred != succ - try: - preds = self._preds[succ] - succs = self._succs[pred] - except KeyError: # pragma: no cover - raise ValueError('%r not a successor of anything' % succ) - try: - preds.remove(pred) - succs.remove(succ) - except KeyError: # pragma: no cover - raise ValueError('%r not a successor of %r' % (succ, pred)) - - def is_step(self, step): - return (step in self._preds or step in self._succs or - step in self._nodes) - - def get_steps(self, final): - if not self.is_step(final): - raise ValueError('Unknown: %r' % final) - result = [] - todo = [] - seen = set() - todo.append(final) - while todo: - step = todo.pop(0) - if step in seen: - # if a step was already seen, - # move it to the end (so it will appear earlier - # when reversed on return) ... but not for the - # final step, as that would be confusing for - # users - if step != final: - result.remove(step) - result.append(step) - else: - seen.add(step) - result.append(step) - preds = self._preds.get(step, ()) - todo.extend(preds) - return reversed(result) - - @property - def strong_connections(self): - #http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm - index_counter = [0] - stack = [] - lowlinks = {} - index = {} - result = [] - - graph = self._succs - - def strongconnect(node): - # set the depth index for this node to the smallest unused index - index[node] = index_counter[0] - lowlinks[node] = index_counter[0] - index_counter[0] += 1 - stack.append(node) - - # Consider successors - try: - successors = graph[node] - except Exception: - successors = [] - for successor in successors: - if successor not in lowlinks: - # Successor has not yet been visited - strongconnect(successor) - lowlinks[node] = min(lowlinks[node],lowlinks[successor]) - elif successor in stack: - # the successor is in the stack and hence in the current - # strongly connected component (SCC) - lowlinks[node] = min(lowlinks[node],index[successor]) - - # If `node` is a root node, pop the stack and generate an SCC - if lowlinks[node] == index[node]: - connected_component = [] - - while True: - successor = stack.pop() - connected_component.append(successor) - if successor == node: break - component = tuple(connected_component) - # storing the result - result.append(component) - - for node in graph: - if node not in lowlinks: - strongconnect(node) - - return result - - @property - def dot(self): - result = ['digraph G {'] - for succ in self._preds: - preds = self._preds[succ] - for pred in preds: - result.append(' %s -> %s;' % (pred, succ)) - for node in self._nodes: - result.append(' %s;' % node) - result.append('}') - return '\n'.join(result) - -# -# Unarchiving functionality for zip, tar, tgz, tbz, whl -# - -ARCHIVE_EXTENSIONS = ('.tar.gz', '.tar.bz2', '.tar', '.zip', - '.tgz', '.tbz', '.whl') - -def unarchive(archive_filename, dest_dir, format=None, check=True): - - def check_path(path): - if not isinstance(path, text_type): - path = path.decode('utf-8') - p = os.path.abspath(os.path.join(dest_dir, path)) - if not p.startswith(dest_dir) or p[plen] != os.sep: - raise ValueError('path outside destination: %r' % p) - - dest_dir = os.path.abspath(dest_dir) - plen = len(dest_dir) - archive = None - if format is None: - if archive_filename.endswith(('.zip', '.whl')): - format = 'zip' - elif archive_filename.endswith(('.tar.gz', '.tgz')): - format = 'tgz' - mode = 'r:gz' - elif archive_filename.endswith(('.tar.bz2', '.tbz')): - format = 'tbz' - mode = 'r:bz2' - elif archive_filename.endswith('.tar'): - format = 'tar' - mode = 'r' - else: # pragma: no cover - raise ValueError('Unknown format for %r' % archive_filename) - try: - if format == 'zip': - archive = ZipFile(archive_filename, 'r') - if check: - names = archive.namelist() - for name in names: - check_path(name) - else: - archive = tarfile.open(archive_filename, mode) - if check: - names = archive.getnames() - for name in names: - check_path(name) - if format != 'zip' and sys.version_info[0] < 3: - # See Python issue 17153. If the dest path contains Unicode, - # tarfile extraction fails on Python 2.x if a member path name - # contains non-ASCII characters - it leads to an implicit - # bytes -> unicode conversion using ASCII to decode. - for tarinfo in archive.getmembers(): - if not isinstance(tarinfo.name, text_type): - tarinfo.name = tarinfo.name.decode('utf-8') - archive.extractall(dest_dir) - - finally: - if archive: - archive.close() - - -def zip_dir(directory): - """zip a directory tree into a BytesIO object""" - result = io.BytesIO() - dlen = len(directory) - with ZipFile(result, "w") as zf: - for root, dirs, files in os.walk(directory): - for name in files: - full = os.path.join(root, name) - rel = root[dlen:] - dest = os.path.join(rel, name) - zf.write(full, dest) - return result - -# -# Simple progress bar -# - -UNITS = ('', 'K', 'M', 'G','T','P') - - -class Progress(object): - unknown = 'UNKNOWN' - - def __init__(self, minval=0, maxval=100): - assert maxval is None or maxval >= minval - self.min = self.cur = minval - self.max = maxval - self.started = None - self.elapsed = 0 - self.done = False - - def update(self, curval): - assert self.min <= curval - assert self.max is None or curval <= self.max - self.cur = curval - now = time.time() - if self.started is None: - self.started = now - else: - self.elapsed = now - self.started - - def increment(self, incr): - assert incr >= 0 - self.update(self.cur + incr) - - def start(self): - self.update(self.min) - return self - - def stop(self): - if self.max is not None: - self.update(self.max) - self.done = True - - @property - def maximum(self): - return self.unknown if self.max is None else self.max - - @property - def percentage(self): - if self.done: - result = '100 %' - elif self.max is None: - result = ' ?? %' - else: - v = 100.0 * (self.cur - self.min) / (self.max - self.min) - result = '%3d %%' % v - return result - - def format_duration(self, duration): - if (duration <= 0) and self.max is None or self.cur == self.min: - result = '??:??:??' - #elif duration < 1: - # result = '--:--:--' - else: - result = time.strftime('%H:%M:%S', time.gmtime(duration)) - return result - - @property - def ETA(self): - if self.done: - prefix = 'Done' - t = self.elapsed - #import pdb; pdb.set_trace() - else: - prefix = 'ETA ' - if self.max is None: - t = -1 - elif self.elapsed == 0 or (self.cur == self.min): - t = 0 - else: - #import pdb; pdb.set_trace() - t = float(self.max - self.min) - t /= self.cur - self.min - t = (t - 1) * self.elapsed - return '%s: %s' % (prefix, self.format_duration(t)) - - @property - def speed(self): - if self.elapsed == 0: - result = 0.0 - else: - result = (self.cur - self.min) / self.elapsed - for unit in UNITS: - if result < 1000: - break - result /= 1000.0 - return '%d %sB/s' % (result, unit) - -# -# Glob functionality -# - -RICH_GLOB = re.compile(r'\{([^}]*)\}') -_CHECK_RECURSIVE_GLOB = re.compile(r'[^/\\,{]\*\*|\*\*[^/\\,}]') -_CHECK_MISMATCH_SET = re.compile(r'^[^{]*\}|\{[^}]*$') - - -def iglob(path_glob): - """Extended globbing function that supports ** and {opt1,opt2,opt3}.""" - if _CHECK_RECURSIVE_GLOB.search(path_glob): - msg = """invalid glob %r: recursive glob "**" must be used alone""" - raise ValueError(msg % path_glob) - if _CHECK_MISMATCH_SET.search(path_glob): - msg = """invalid glob %r: mismatching set marker '{' or '}'""" - raise ValueError(msg % path_glob) - return _iglob(path_glob) - - -def _iglob(path_glob): - rich_path_glob = RICH_GLOB.split(path_glob, 1) - if len(rich_path_glob) > 1: - assert len(rich_path_glob) == 3, rich_path_glob - prefix, set, suffix = rich_path_glob - for item in set.split(','): - for path in _iglob(''.join((prefix, item, suffix))): - yield path - else: - if '**' not in path_glob: - for item in std_iglob(path_glob): - yield item - else: - prefix, radical = path_glob.split('**', 1) - if prefix == '': - prefix = '.' - if radical == '': - radical = '*' - else: - # we support both - radical = radical.lstrip('/') - radical = radical.lstrip('\\') - for path, dir, files in os.walk(prefix): - path = os.path.normpath(path) - for fn in _iglob(os.path.join(path, radical)): - yield fn - -if ssl: - from .compat import (HTTPSHandler as BaseHTTPSHandler, match_hostname, - CertificateError) - - -# -# HTTPSConnection which verifies certificates/matches domains -# - - class HTTPSConnection(httplib.HTTPSConnection): - ca_certs = None # set this to the path to the certs file (.pem) - check_domain = True # only used if ca_certs is not None - - # noinspection PyPropertyAccess - def connect(self): - sock = socket.create_connection((self.host, self.port), self.timeout) - if getattr(self, '_tunnel_host', False): - self.sock = sock - self._tunnel() - - if not hasattr(ssl, 'SSLContext'): - # For 2.x - if self.ca_certs: - cert_reqs = ssl.CERT_REQUIRED - else: - cert_reqs = ssl.CERT_NONE - self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file, - cert_reqs=cert_reqs, - ssl_version=ssl.PROTOCOL_SSLv23, - ca_certs=self.ca_certs) - else: # pragma: no cover - context = ssl.SSLContext(ssl.PROTOCOL_SSLv23) - context.options |= ssl.OP_NO_SSLv2 - if self.cert_file: - context.load_cert_chain(self.cert_file, self.key_file) - kwargs = {} - if self.ca_certs: - context.verify_mode = ssl.CERT_REQUIRED - context.load_verify_locations(cafile=self.ca_certs) - if getattr(ssl, 'HAS_SNI', False): - kwargs['server_hostname'] = self.host - self.sock = context.wrap_socket(sock, **kwargs) - if self.ca_certs and self.check_domain: - try: - match_hostname(self.sock.getpeercert(), self.host) - logger.debug('Host verified: %s', self.host) - except CertificateError: # pragma: no cover - self.sock.shutdown(socket.SHUT_RDWR) - self.sock.close() - raise - - class HTTPSHandler(BaseHTTPSHandler): - def __init__(self, ca_certs, check_domain=True): - BaseHTTPSHandler.__init__(self) - self.ca_certs = ca_certs - self.check_domain = check_domain - - def _conn_maker(self, *args, **kwargs): - """ - This is called to create a connection instance. Normally you'd - pass a connection class to do_open, but it doesn't actually check for - a class, and just expects a callable. As long as we behave just as a - constructor would have, we should be OK. If it ever changes so that - we *must* pass a class, we'll create an UnsafeHTTPSConnection class - which just sets check_domain to False in the class definition, and - choose which one to pass to do_open. - """ - result = HTTPSConnection(*args, **kwargs) - if self.ca_certs: - result.ca_certs = self.ca_certs - result.check_domain = self.check_domain - return result - - def https_open(self, req): - try: - return self.do_open(self._conn_maker, req) - except URLError as e: - if 'certificate verify failed' in str(e.reason): - raise CertificateError('Unable to verify server certificate ' - 'for %s' % req.host) - else: - raise - - # - # To prevent against mixing HTTP traffic with HTTPS (examples: A Man-In-The- - # Middle proxy using HTTP listens on port 443, or an index mistakenly serves - # HTML containing a http://xyz link when it should be https://xyz), - # you can use the following handler class, which does not allow HTTP traffic. - # - # It works by inheriting from HTTPHandler - so build_opener won't add a - # handler for HTTP itself. - # - class HTTPSOnlyHandler(HTTPSHandler, HTTPHandler): - def http_open(self, req): - raise URLError('Unexpected HTTP request on what should be a secure ' - 'connection: %s' % req) - -# -# XML-RPC with timeouts -# - -_ver_info = sys.version_info[:2] - -if _ver_info == (2, 6): - class HTTP(httplib.HTTP): - def __init__(self, host='', port=None, **kwargs): - if port == 0: # 0 means use port 0, not the default port - port = None - self._setup(self._connection_class(host, port, **kwargs)) - - - if ssl: - class HTTPS(httplib.HTTPS): - def __init__(self, host='', port=None, **kwargs): - if port == 0: # 0 means use port 0, not the default port - port = None - self._setup(self._connection_class(host, port, **kwargs)) - - -class Transport(xmlrpclib.Transport): - def __init__(self, timeout, use_datetime=0): - self.timeout = timeout - xmlrpclib.Transport.__init__(self, use_datetime) - - def make_connection(self, host): - h, eh, x509 = self.get_host_info(host) - if _ver_info == (2, 6): - result = HTTP(h, timeout=self.timeout) - else: - if not self._connection or host != self._connection[0]: - self._extra_headers = eh - self._connection = host, httplib.HTTPConnection(h) - result = self._connection[1] - return result - -if ssl: - class SafeTransport(xmlrpclib.SafeTransport): - def __init__(self, timeout, use_datetime=0): - self.timeout = timeout - xmlrpclib.SafeTransport.__init__(self, use_datetime) - - def make_connection(self, host): - h, eh, kwargs = self.get_host_info(host) - if not kwargs: - kwargs = {} - kwargs['timeout'] = self.timeout - if _ver_info == (2, 6): - result = HTTPS(host, None, **kwargs) - else: - if not self._connection or host != self._connection[0]: - self._extra_headers = eh - self._connection = host, httplib.HTTPSConnection(h, None, - **kwargs) - result = self._connection[1] - return result - - -class ServerProxy(xmlrpclib.ServerProxy): - def __init__(self, uri, **kwargs): - self.timeout = timeout = kwargs.pop('timeout', None) - # The above classes only come into play if a timeout - # is specified - if timeout is not None: - scheme, _ = splittype(uri) - use_datetime = kwargs.get('use_datetime', 0) - if scheme == 'https': - tcls = SafeTransport - else: - tcls = Transport - kwargs['transport'] = t = tcls(timeout, use_datetime=use_datetime) - self.transport = t - xmlrpclib.ServerProxy.__init__(self, uri, **kwargs) - -# -# CSV functionality. This is provided because on 2.x, the csv module can't -# handle Unicode. However, we need to deal with Unicode in e.g. RECORD files. -# - -def _csv_open(fn, mode, **kwargs): - if sys.version_info[0] < 3: - mode += 'b' - else: - kwargs['newline'] = '' - # Python 3 determines encoding from locale. Force 'utf-8' - # file encoding to match other forced utf-8 encoding - kwargs['encoding'] = 'utf-8' - return open(fn, mode, **kwargs) - - -class CSVBase(object): - defaults = { - 'delimiter': str(','), # The strs are used because we need native - 'quotechar': str('"'), # str in the csv API (2.x won't take - 'lineterminator': str('\n') # Unicode) - } - - def __enter__(self): - return self - - def __exit__(self, *exc_info): - self.stream.close() - - -class CSVReader(CSVBase): - def __init__(self, **kwargs): - if 'stream' in kwargs: - stream = kwargs['stream'] - if sys.version_info[0] >= 3: - # needs to be a text stream - stream = codecs.getreader('utf-8')(stream) - self.stream = stream - else: - self.stream = _csv_open(kwargs['path'], 'r') - self.reader = csv.reader(self.stream, **self.defaults) - - def __iter__(self): - return self - - def next(self): - result = next(self.reader) - if sys.version_info[0] < 3: - for i, item in enumerate(result): - if not isinstance(item, text_type): - result[i] = item.decode('utf-8') - return result - - __next__ = next - -class CSVWriter(CSVBase): - def __init__(self, fn, **kwargs): - self.stream = _csv_open(fn, 'w') - self.writer = csv.writer(self.stream, **self.defaults) - - def writerow(self, row): - if sys.version_info[0] < 3: - r = [] - for item in row: - if isinstance(item, text_type): - item = item.encode('utf-8') - r.append(item) - row = r - self.writer.writerow(row) - -# -# Configurator functionality -# - -class Configurator(BaseConfigurator): - - value_converters = dict(BaseConfigurator.value_converters) - value_converters['inc'] = 'inc_convert' - - def __init__(self, config, base=None): - super(Configurator, self).__init__(config) - self.base = base or os.getcwd() - - def configure_custom(self, config): - def convert(o): - if isinstance(o, (list, tuple)): - result = type(o)([convert(i) for i in o]) - elif isinstance(o, dict): - if '()' in o: - result = self.configure_custom(o) - else: - result = {} - for k in o: - result[k] = convert(o[k]) - else: - result = self.convert(o) - return result - - c = config.pop('()') - if not callable(c): - c = self.resolve(c) - props = config.pop('.', None) - # Check for valid identifiers - args = config.pop('[]', ()) - if args: - args = tuple([convert(o) for o in args]) - items = [(k, convert(config[k])) for k in config if valid_ident(k)] - kwargs = dict(items) - result = c(*args, **kwargs) - if props: - for n, v in props.items(): - setattr(result, n, convert(v)) - return result - - def __getitem__(self, key): - result = self.config[key] - if isinstance(result, dict) and '()' in result: - self.config[key] = result = self.configure_custom(result) - return result - - def inc_convert(self, value): - """Default converter for the inc:// protocol.""" - if not os.path.isabs(value): - value = os.path.join(self.base, value) - with codecs.open(value, 'r', encoding='utf-8') as f: - result = json.load(f) - return result - - -class SubprocessMixin(object): - """ - Mixin for running subprocesses and capturing their output - """ - def __init__(self, verbose=False, progress=None): - self.verbose = verbose - self.progress = progress - - def reader(self, stream, context): - """ - Read lines from a subprocess' output stream and either pass to a progress - callable (if specified) or write progress information to sys.stderr. - """ - progress = self.progress - verbose = self.verbose - while True: - s = stream.readline() - if not s: - break - if progress is not None: - progress(s, context) - else: - if not verbose: - sys.stderr.write('.') - else: - sys.stderr.write(s.decode('utf-8')) - sys.stderr.flush() - stream.close() - - def run_command(self, cmd, **kwargs): - p = subprocess.Popen(cmd, stdout=subprocess.PIPE, - stderr=subprocess.PIPE, **kwargs) - t1 = threading.Thread(target=self.reader, args=(p.stdout, 'stdout')) - t1.start() - t2 = threading.Thread(target=self.reader, args=(p.stderr, 'stderr')) - t2.start() - p.wait() - t1.join() - t2.join() - if self.progress is not None: - self.progress('done.', 'main') - elif self.verbose: - sys.stderr.write('done.\n') - return p - - -def normalize_name(name): - """Normalize a python package name a la PEP 503""" - # https://www.python.org/dev/peps/pep-0503/#normalized-names - return re.sub('[-_.]+', '-', name).lower() diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/version.py b/env/lib/python3.7/site-packages/pip/_vendor/distlib/version.py deleted file mode 100644 index 3eebe18..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/distlib/version.py +++ /dev/null @@ -1,736 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012-2017 The Python Software Foundation. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -""" -Implementation of a flexible versioning scheme providing support for PEP-440, -setuptools-compatible and semantic versioning. -""" - -import logging -import re - -from .compat import string_types -from .util import parse_requirement - -__all__ = ['NormalizedVersion', 'NormalizedMatcher', - 'LegacyVersion', 'LegacyMatcher', - 'SemanticVersion', 'SemanticMatcher', - 'UnsupportedVersionError', 'get_scheme'] - -logger = logging.getLogger(__name__) - - -class UnsupportedVersionError(ValueError): - """This is an unsupported version.""" - pass - - -class Version(object): - def __init__(self, s): - self._string = s = s.strip() - self._parts = parts = self.parse(s) - assert isinstance(parts, tuple) - assert len(parts) > 0 - - def parse(self, s): - raise NotImplementedError('please implement in a subclass') - - def _check_compatible(self, other): - if type(self) != type(other): - raise TypeError('cannot compare %r and %r' % (self, other)) - - def __eq__(self, other): - self._check_compatible(other) - return self._parts == other._parts - - def __ne__(self, other): - return not self.__eq__(other) - - def __lt__(self, other): - self._check_compatible(other) - return self._parts < other._parts - - def __gt__(self, other): - return not (self.__lt__(other) or self.__eq__(other)) - - def __le__(self, other): - return self.__lt__(other) or self.__eq__(other) - - def __ge__(self, other): - return self.__gt__(other) or self.__eq__(other) - - # See http://docs.python.org/reference/datamodel#object.__hash__ - def __hash__(self): - return hash(self._parts) - - def __repr__(self): - return "%s('%s')" % (self.__class__.__name__, self._string) - - def __str__(self): - return self._string - - @property - def is_prerelease(self): - raise NotImplementedError('Please implement in subclasses.') - - -class Matcher(object): - version_class = None - - # value is either a callable or the name of a method - _operators = { - '<': lambda v, c, p: v < c, - '>': lambda v, c, p: v > c, - '<=': lambda v, c, p: v == c or v < c, - '>=': lambda v, c, p: v == c or v > c, - '==': lambda v, c, p: v == c, - '===': lambda v, c, p: v == c, - # by default, compatible => >=. - '~=': lambda v, c, p: v == c or v > c, - '!=': lambda v, c, p: v != c, - } - - # this is a method only to support alternative implementations - # via overriding - def parse_requirement(self, s): - return parse_requirement(s) - - def __init__(self, s): - if self.version_class is None: - raise ValueError('Please specify a version class') - self._string = s = s.strip() - r = self.parse_requirement(s) - if not r: - raise ValueError('Not valid: %r' % s) - self.name = r.name - self.key = self.name.lower() # for case-insensitive comparisons - clist = [] - if r.constraints: - # import pdb; pdb.set_trace() - for op, s in r.constraints: - if s.endswith('.*'): - if op not in ('==', '!='): - raise ValueError('\'.*\' not allowed for ' - '%r constraints' % op) - # Could be a partial version (e.g. for '2.*') which - # won't parse as a version, so keep it as a string - vn, prefix = s[:-2], True - # Just to check that vn is a valid version - self.version_class(vn) - else: - # Should parse as a version, so we can create an - # instance for the comparison - vn, prefix = self.version_class(s), False - clist.append((op, vn, prefix)) - self._parts = tuple(clist) - - def match(self, version): - """ - Check if the provided version matches the constraints. - - :param version: The version to match against this instance. - :type version: String or :class:`Version` instance. - """ - if isinstance(version, string_types): - version = self.version_class(version) - for operator, constraint, prefix in self._parts: - f = self._operators.get(operator) - if isinstance(f, string_types): - f = getattr(self, f) - if not f: - msg = ('%r not implemented ' - 'for %s' % (operator, self.__class__.__name__)) - raise NotImplementedError(msg) - if not f(version, constraint, prefix): - return False - return True - - @property - def exact_version(self): - result = None - if len(self._parts) == 1 and self._parts[0][0] in ('==', '==='): - result = self._parts[0][1] - return result - - def _check_compatible(self, other): - if type(self) != type(other) or self.name != other.name: - raise TypeError('cannot compare %s and %s' % (self, other)) - - def __eq__(self, other): - self._check_compatible(other) - return self.key == other.key and self._parts == other._parts - - def __ne__(self, other): - return not self.__eq__(other) - - # See http://docs.python.org/reference/datamodel#object.__hash__ - def __hash__(self): - return hash(self.key) + hash(self._parts) - - def __repr__(self): - return "%s(%r)" % (self.__class__.__name__, self._string) - - def __str__(self): - return self._string - - -PEP440_VERSION_RE = re.compile(r'^v?(\d+!)?(\d+(\.\d+)*)((a|b|c|rc)(\d+))?' - r'(\.(post)(\d+))?(\.(dev)(\d+))?' - r'(\+([a-zA-Z\d]+(\.[a-zA-Z\d]+)?))?$') - - -def _pep_440_key(s): - s = s.strip() - m = PEP440_VERSION_RE.match(s) - if not m: - raise UnsupportedVersionError('Not a valid version: %s' % s) - groups = m.groups() - nums = tuple(int(v) for v in groups[1].split('.')) - while len(nums) > 1 and nums[-1] == 0: - nums = nums[:-1] - - if not groups[0]: - epoch = 0 - else: - epoch = int(groups[0]) - pre = groups[4:6] - post = groups[7:9] - dev = groups[10:12] - local = groups[13] - if pre == (None, None): - pre = () - else: - pre = pre[0], int(pre[1]) - if post == (None, None): - post = () - else: - post = post[0], int(post[1]) - if dev == (None, None): - dev = () - else: - dev = dev[0], int(dev[1]) - if local is None: - local = () - else: - parts = [] - for part in local.split('.'): - # to ensure that numeric compares as > lexicographic, avoid - # comparing them directly, but encode a tuple which ensures - # correct sorting - if part.isdigit(): - part = (1, int(part)) - else: - part = (0, part) - parts.append(part) - local = tuple(parts) - if not pre: - # either before pre-release, or final release and after - if not post and dev: - # before pre-release - pre = ('a', -1) # to sort before a0 - else: - pre = ('z',) # to sort after all pre-releases - # now look at the state of post and dev. - if not post: - post = ('_',) # sort before 'a' - if not dev: - dev = ('final',) - - #print('%s -> %s' % (s, m.groups())) - return epoch, nums, pre, post, dev, local - - -_normalized_key = _pep_440_key - - -class NormalizedVersion(Version): - """A rational version. - - Good: - 1.2 # equivalent to "1.2.0" - 1.2.0 - 1.2a1 - 1.2.3a2 - 1.2.3b1 - 1.2.3c1 - 1.2.3.4 - TODO: fill this out - - Bad: - 1 # minimum two numbers - 1.2a # release level must have a release serial - 1.2.3b - """ - def parse(self, s): - result = _normalized_key(s) - # _normalized_key loses trailing zeroes in the release - # clause, since that's needed to ensure that X.Y == X.Y.0 == X.Y.0.0 - # However, PEP 440 prefix matching needs it: for example, - # (~= 1.4.5.0) matches differently to (~= 1.4.5.0.0). - m = PEP440_VERSION_RE.match(s) # must succeed - groups = m.groups() - self._release_clause = tuple(int(v) for v in groups[1].split('.')) - return result - - PREREL_TAGS = set(['a', 'b', 'c', 'rc', 'dev']) - - @property - def is_prerelease(self): - return any(t[0] in self.PREREL_TAGS for t in self._parts if t) - - -def _match_prefix(x, y): - x = str(x) - y = str(y) - if x == y: - return True - if not x.startswith(y): - return False - n = len(y) - return x[n] == '.' - - -class NormalizedMatcher(Matcher): - version_class = NormalizedVersion - - # value is either a callable or the name of a method - _operators = { - '~=': '_match_compatible', - '<': '_match_lt', - '>': '_match_gt', - '<=': '_match_le', - '>=': '_match_ge', - '==': '_match_eq', - '===': '_match_arbitrary', - '!=': '_match_ne', - } - - def _adjust_local(self, version, constraint, prefix): - if prefix: - strip_local = '+' not in constraint and version._parts[-1] - else: - # both constraint and version are - # NormalizedVersion instances. - # If constraint does not have a local component, - # ensure the version doesn't, either. - strip_local = not constraint._parts[-1] and version._parts[-1] - if strip_local: - s = version._string.split('+', 1)[0] - version = self.version_class(s) - return version, constraint - - def _match_lt(self, version, constraint, prefix): - version, constraint = self._adjust_local(version, constraint, prefix) - if version >= constraint: - return False - release_clause = constraint._release_clause - pfx = '.'.join([str(i) for i in release_clause]) - return not _match_prefix(version, pfx) - - def _match_gt(self, version, constraint, prefix): - version, constraint = self._adjust_local(version, constraint, prefix) - if version <= constraint: - return False - release_clause = constraint._release_clause - pfx = '.'.join([str(i) for i in release_clause]) - return not _match_prefix(version, pfx) - - def _match_le(self, version, constraint, prefix): - version, constraint = self._adjust_local(version, constraint, prefix) - return version <= constraint - - def _match_ge(self, version, constraint, prefix): - version, constraint = self._adjust_local(version, constraint, prefix) - return version >= constraint - - def _match_eq(self, version, constraint, prefix): - version, constraint = self._adjust_local(version, constraint, prefix) - if not prefix: - result = (version == constraint) - else: - result = _match_prefix(version, constraint) - return result - - def _match_arbitrary(self, version, constraint, prefix): - return str(version) == str(constraint) - - def _match_ne(self, version, constraint, prefix): - version, constraint = self._adjust_local(version, constraint, prefix) - if not prefix: - result = (version != constraint) - else: - result = not _match_prefix(version, constraint) - return result - - def _match_compatible(self, version, constraint, prefix): - version, constraint = self._adjust_local(version, constraint, prefix) - if version == constraint: - return True - if version < constraint: - return False -# if not prefix: -# return True - release_clause = constraint._release_clause - if len(release_clause) > 1: - release_clause = release_clause[:-1] - pfx = '.'.join([str(i) for i in release_clause]) - return _match_prefix(version, pfx) - -_REPLACEMENTS = ( - (re.compile('[.+-]$'), ''), # remove trailing puncts - (re.compile(r'^[.](\d)'), r'0.\1'), # .N -> 0.N at start - (re.compile('^[.-]'), ''), # remove leading puncts - (re.compile(r'^\((.*)\)$'), r'\1'), # remove parentheses - (re.compile(r'^v(ersion)?\s*(\d+)'), r'\2'), # remove leading v(ersion) - (re.compile(r'^r(ev)?\s*(\d+)'), r'\2'), # remove leading v(ersion) - (re.compile('[.]{2,}'), '.'), # multiple runs of '.' - (re.compile(r'\b(alfa|apha)\b'), 'alpha'), # misspelt alpha - (re.compile(r'\b(pre-alpha|prealpha)\b'), - 'pre.alpha'), # standardise - (re.compile(r'\(beta\)$'), 'beta'), # remove parentheses -) - -_SUFFIX_REPLACEMENTS = ( - (re.compile('^[:~._+-]+'), ''), # remove leading puncts - (re.compile('[,*")([\\]]'), ''), # remove unwanted chars - (re.compile('[~:+_ -]'), '.'), # replace illegal chars - (re.compile('[.]{2,}'), '.'), # multiple runs of '.' - (re.compile(r'\.$'), ''), # trailing '.' -) - -_NUMERIC_PREFIX = re.compile(r'(\d+(\.\d+)*)') - - -def _suggest_semantic_version(s): - """ - Try to suggest a semantic form for a version for which - _suggest_normalized_version couldn't come up with anything. - """ - result = s.strip().lower() - for pat, repl in _REPLACEMENTS: - result = pat.sub(repl, result) - if not result: - result = '0.0.0' - - # Now look for numeric prefix, and separate it out from - # the rest. - #import pdb; pdb.set_trace() - m = _NUMERIC_PREFIX.match(result) - if not m: - prefix = '0.0.0' - suffix = result - else: - prefix = m.groups()[0].split('.') - prefix = [int(i) for i in prefix] - while len(prefix) < 3: - prefix.append(0) - if len(prefix) == 3: - suffix = result[m.end():] - else: - suffix = '.'.join([str(i) for i in prefix[3:]]) + result[m.end():] - prefix = prefix[:3] - prefix = '.'.join([str(i) for i in prefix]) - suffix = suffix.strip() - if suffix: - #import pdb; pdb.set_trace() - # massage the suffix. - for pat, repl in _SUFFIX_REPLACEMENTS: - suffix = pat.sub(repl, suffix) - - if not suffix: - result = prefix - else: - sep = '-' if 'dev' in suffix else '+' - result = prefix + sep + suffix - if not is_semver(result): - result = None - return result - - -def _suggest_normalized_version(s): - """Suggest a normalized version close to the given version string. - - If you have a version string that isn't rational (i.e. NormalizedVersion - doesn't like it) then you might be able to get an equivalent (or close) - rational version from this function. - - This does a number of simple normalizations to the given string, based - on observation of versions currently in use on PyPI. Given a dump of - those version during PyCon 2009, 4287 of them: - - 2312 (53.93%) match NormalizedVersion without change - with the automatic suggestion - - 3474 (81.04%) match when using this suggestion method - - @param s {str} An irrational version string. - @returns A rational version string, or None, if couldn't determine one. - """ - try: - _normalized_key(s) - return s # already rational - except UnsupportedVersionError: - pass - - rs = s.lower() - - # part of this could use maketrans - for orig, repl in (('-alpha', 'a'), ('-beta', 'b'), ('alpha', 'a'), - ('beta', 'b'), ('rc', 'c'), ('-final', ''), - ('-pre', 'c'), - ('-release', ''), ('.release', ''), ('-stable', ''), - ('+', '.'), ('_', '.'), (' ', ''), ('.final', ''), - ('final', '')): - rs = rs.replace(orig, repl) - - # if something ends with dev or pre, we add a 0 - rs = re.sub(r"pre$", r"pre0", rs) - rs = re.sub(r"dev$", r"dev0", rs) - - # if we have something like "b-2" or "a.2" at the end of the - # version, that is probably beta, alpha, etc - # let's remove the dash or dot - rs = re.sub(r"([abc]|rc)[\-\.](\d+)$", r"\1\2", rs) - - # 1.0-dev-r371 -> 1.0.dev371 - # 0.1-dev-r79 -> 0.1.dev79 - rs = re.sub(r"[\-\.](dev)[\-\.]?r?(\d+)$", r".\1\2", rs) - - # Clean: 2.0.a.3, 2.0.b1, 0.9.0~c1 - rs = re.sub(r"[.~]?([abc])\.?", r"\1", rs) - - # Clean: v0.3, v1.0 - if rs.startswith('v'): - rs = rs[1:] - - # Clean leading '0's on numbers. - #TODO: unintended side-effect on, e.g., "2003.05.09" - # PyPI stats: 77 (~2%) better - rs = re.sub(r"\b0+(\d+)(?!\d)", r"\1", rs) - - # Clean a/b/c with no version. E.g. "1.0a" -> "1.0a0". Setuptools infers - # zero. - # PyPI stats: 245 (7.56%) better - rs = re.sub(r"(\d+[abc])$", r"\g<1>0", rs) - - # the 'dev-rNNN' tag is a dev tag - rs = re.sub(r"\.?(dev-r|dev\.r)\.?(\d+)$", r".dev\2", rs) - - # clean the - when used as a pre delimiter - rs = re.sub(r"-(a|b|c)(\d+)$", r"\1\2", rs) - - # a terminal "dev" or "devel" can be changed into ".dev0" - rs = re.sub(r"[\.\-](dev|devel)$", r".dev0", rs) - - # a terminal "dev" can be changed into ".dev0" - rs = re.sub(r"(?![\.\-])dev$", r".dev0", rs) - - # a terminal "final" or "stable" can be removed - rs = re.sub(r"(final|stable)$", "", rs) - - # The 'r' and the '-' tags are post release tags - # 0.4a1.r10 -> 0.4a1.post10 - # 0.9.33-17222 -> 0.9.33.post17222 - # 0.9.33-r17222 -> 0.9.33.post17222 - rs = re.sub(r"\.?(r|-|-r)\.?(\d+)$", r".post\2", rs) - - # Clean 'r' instead of 'dev' usage: - # 0.9.33+r17222 -> 0.9.33.dev17222 - # 1.0dev123 -> 1.0.dev123 - # 1.0.git123 -> 1.0.dev123 - # 1.0.bzr123 -> 1.0.dev123 - # 0.1a0dev.123 -> 0.1a0.dev123 - # PyPI stats: ~150 (~4%) better - rs = re.sub(r"\.?(dev|git|bzr)\.?(\d+)$", r".dev\2", rs) - - # Clean '.pre' (normalized from '-pre' above) instead of 'c' usage: - # 0.2.pre1 -> 0.2c1 - # 0.2-c1 -> 0.2c1 - # 1.0preview123 -> 1.0c123 - # PyPI stats: ~21 (0.62%) better - rs = re.sub(r"\.?(pre|preview|-c)(\d+)$", r"c\g<2>", rs) - - # Tcl/Tk uses "px" for their post release markers - rs = re.sub(r"p(\d+)$", r".post\1", rs) - - try: - _normalized_key(rs) - except UnsupportedVersionError: - rs = None - return rs - -# -# Legacy version processing (distribute-compatible) -# - -_VERSION_PART = re.compile(r'([a-z]+|\d+|[\.-])', re.I) -_VERSION_REPLACE = { - 'pre': 'c', - 'preview': 'c', - '-': 'final-', - 'rc': 'c', - 'dev': '@', - '': None, - '.': None, -} - - -def _legacy_key(s): - def get_parts(s): - result = [] - for p in _VERSION_PART.split(s.lower()): - p = _VERSION_REPLACE.get(p, p) - if p: - if '0' <= p[:1] <= '9': - p = p.zfill(8) - else: - p = '*' + p - result.append(p) - result.append('*final') - return result - - result = [] - for p in get_parts(s): - if p.startswith('*'): - if p < '*final': - while result and result[-1] == '*final-': - result.pop() - while result and result[-1] == '00000000': - result.pop() - result.append(p) - return tuple(result) - - -class LegacyVersion(Version): - def parse(self, s): - return _legacy_key(s) - - @property - def is_prerelease(self): - result = False - for x in self._parts: - if (isinstance(x, string_types) and x.startswith('*') and - x < '*final'): - result = True - break - return result - - -class LegacyMatcher(Matcher): - version_class = LegacyVersion - - _operators = dict(Matcher._operators) - _operators['~='] = '_match_compatible' - - numeric_re = re.compile(r'^(\d+(\.\d+)*)') - - def _match_compatible(self, version, constraint, prefix): - if version < constraint: - return False - m = self.numeric_re.match(str(constraint)) - if not m: - logger.warning('Cannot compute compatible match for version %s ' - ' and constraint %s', version, constraint) - return True - s = m.groups()[0] - if '.' in s: - s = s.rsplit('.', 1)[0] - return _match_prefix(version, s) - -# -# Semantic versioning -# - -_SEMVER_RE = re.compile(r'^(\d+)\.(\d+)\.(\d+)' - r'(-[a-z0-9]+(\.[a-z0-9-]+)*)?' - r'(\+[a-z0-9]+(\.[a-z0-9-]+)*)?$', re.I) - - -def is_semver(s): - return _SEMVER_RE.match(s) - - -def _semantic_key(s): - def make_tuple(s, absent): - if s is None: - result = (absent,) - else: - parts = s[1:].split('.') - # We can't compare ints and strings on Python 3, so fudge it - # by zero-filling numeric values so simulate a numeric comparison - result = tuple([p.zfill(8) if p.isdigit() else p for p in parts]) - return result - - m = is_semver(s) - if not m: - raise UnsupportedVersionError(s) - groups = m.groups() - major, minor, patch = [int(i) for i in groups[:3]] - # choose the '|' and '*' so that versions sort correctly - pre, build = make_tuple(groups[3], '|'), make_tuple(groups[5], '*') - return (major, minor, patch), pre, build - - -class SemanticVersion(Version): - def parse(self, s): - return _semantic_key(s) - - @property - def is_prerelease(self): - return self._parts[1][0] != '|' - - -class SemanticMatcher(Matcher): - version_class = SemanticVersion - - -class VersionScheme(object): - def __init__(self, key, matcher, suggester=None): - self.key = key - self.matcher = matcher - self.suggester = suggester - - def is_valid_version(self, s): - try: - self.matcher.version_class(s) - result = True - except UnsupportedVersionError: - result = False - return result - - def is_valid_matcher(self, s): - try: - self.matcher(s) - result = True - except UnsupportedVersionError: - result = False - return result - - def is_valid_constraint_list(self, s): - """ - Used for processing some metadata fields - """ - return self.is_valid_matcher('dummy_name (%s)' % s) - - def suggest(self, s): - if self.suggester is None: - result = None - else: - result = self.suggester(s) - return result - -_SCHEMES = { - 'normalized': VersionScheme(_normalized_key, NormalizedMatcher, - _suggest_normalized_version), - 'legacy': VersionScheme(_legacy_key, LegacyMatcher, lambda self, s: s), - 'semantic': VersionScheme(_semantic_key, SemanticMatcher, - _suggest_semantic_version), -} - -_SCHEMES['default'] = _SCHEMES['normalized'] - - -def get_scheme(name): - if name not in _SCHEMES: - raise ValueError('unknown scheme name: %r' % name) - return _SCHEMES[name] diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/w32.exe b/env/lib/python3.7/site-packages/pip/_vendor/distlib/w32.exe deleted file mode 100644 index 732215a9d34ccb7b417d637a7646d9b843ecafa8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89088 zcmeFae|S?>wm*FGqitH!CO`{C3REl(SahnPNDYM`O{q#T7)Xdvz$<hz5gjb&0FD$| zPs=nt#$jgk-tk`NUb*PJIy$3wMg@OiORy=5PEkZ0P^;6cyPm2=Y8#~Xyq~pC(iU~@ z_dd`2ywCg3TS)e=wSTX@_S$Q$y;FJf9>F9Cf*Bu86NCeB>CeT#|L3nblC!40kR?2m z{>H@z3`^g*ct!B1Tk<#8{Ol(+x7?n8>n(TO@iQ_1pEl;#NO$D_^p5<p8@>6r|7^p? zD>5@P3KB)%InlPUc<U{5lb_$uJ2!U@!dIxT&CTYnHuoCtzCL#`-1%8w%`JjkymkHD zpYr&>Cg9H}+(GW%^wV2|ROUbGfyXTfOART)i?<!WISJD#7!6|#8G`TvV*Xu^z32+K zc6>T0?9%;4K}Zn{6fx`yPa}*$9C+R!7zI~72c&$InY+UdMGBkF3c`HyxD3K09`bzW z?_q;rO&5ec#{?noJ4vI19bbHBt~vx^h2FH$V8i|^#EsiUg#JboP3@w-(&Uf&%NK<8 zSJZ5{MZ852W)~s>WeT(LIf&1wKNqULLI)GN_(-E-D)X~ZK=1;t<%*guHMhdg`-(mb zHzDv1KBN9zR9?--O+N$ReOXAr81V9z!X5SJ5`=3<1^<8V|AP@&sr2}Qvp;hQT24iW zOHg|EiZd1ojV;oo#(r^ba2`^8T22{~_UQ@YMZp7O1R*2@?SerFE~TuJB_wDaYC0h8 zfONF1t%{=H`W`bdYp+>YBsg9Ty9ec3iy+O3xa}TIvPK#Q&udyx1MvwG0(#iaGC|N| zJ#3?<Y4YLRkU`54s9BYRjyISA>){9$tW;Y34lPnX=&>D4X~|k7c$TwEfOzs@Yh#Nz z`FV;`(w!E`sKg@`2E}bDY>ku^4XS@tV(WO*<eu67;0Clk;vRHp!Qf<+5w0B!*Y>g? zYH=KK#%%Yu1~&m>IlB^#2^syGG|2AB1(}4aOcaC%!)}%`I7AIC2(Ro3yW`GSttng^ z_xb=ECor!L{-PNO>_ulJ3%fm=O0X!s%)$GZ?~I94l-^KEAX0n$?4wGpr7&i4#~)OB zQD%2NrWUKtZuYT1Vnu}AeF`cSgx>Rkk@}Lg{WltgT76VeA2aic`cTnpXrt2WXmJkM z9%u<Rp-*9{$HQ)>Xm?McyDyZ28Ux7mpxy?mnmvzMMr-85vkRrJLaDRx>|I7je+cM+ zj{RJ(3Vrgke;W@#D!y%U%fQLtlPKTAzWtVuOQdXpwsy6eRjt^cZ%0D4bF7$F;f!th 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ðeLyi^XKZ@T)O?Rs!5wIFTl%?8Q=3bg%o36c5r4;Y4ycajn+NC8bv2_T% zc!;Bj2`||-6#*wY>mNg{QObQ%LH^V5KzX&$Pj)C`PL3m39-<OsbezPe4z0%YKtX;k zy@yv8<mcf=ucxwz`Wh7sr@7-sljc~dk}6a&;;=1oXnjl|eu5o(i>WU#AYJkuSR$}j znMO4xV6<u<CkKww!%mu%Tg-Yt11EZ7xLh4zM0J3`KDL&6fr2{d0&*;_l!~N4!>4cq z?#p`Ho!Qv73km`iByTbY#cV0wK_smZcB=-yCveh*Mk_?9O%&WfgkP=#c#PeZe;5gR zFU#jKce_>dkCGInEfEF<jR>avwoHFFzO^=6+i46rza4!c)3)K2W!N-jc;#bdt-wdV zbbkzu=Ar69H{~D7X}i!Pza+cmg(LPu;=<8t^7QJo3OHYK9I;_Rwaz_5IFuxGuq&N> zL5WaJsc`IUvfI|6i$c24cGjUvSt{j}Uy{>+-qt=2Rm-si0jtOTK#qO8cflG>FmU+N zMgPSO+!arkH6LA8To`%QYu7LxG4KKBhA7sv7_8GFS`8iha{axnw@X#~9qM<Nn|Ekg zXjHP@4?`WSSjYV2&t6Ky9mF|!O7&Ii08RCkHH^wd==z}u`->J<%gSE-EV2U6X{ghx z8`(M#MS&OAMp|+8DeJ)R&-5p+GJGZjgPi6EJ<t9Hd8f7FUWx`Uy=O<t&u?#v@4hR_ zI=Qwk8_i>!?S4T)7gIS%>@6&FPRJsr<tToVziU)urQ{{HP^l1S2Sm^W%oB&@_SJ4Z zka#ikDQmAaZRo*zk8y52S2OXi?ZuR9U`ZZZZP+Mfj-!a2F34YnUwq3V3waZp+MqD< z9I{--2N>d<U-m{hQnT9z`K!0qzOsnEH853iNQ^UEWzDp(K-l(N*)4W;=!-1tphZCa zX1+R6SUt&pyyAmcI6x-~^OPD<S8(mCvo#4jVK07~Sy@}jBHlRtmLkA<^=^_w^(&UU zFH?O0SWZk@h4neV{6J}v;{V$!ax;4|ZyK8N3xQ7^U2IKtS55D~yofVt82qh%AXKbe z9V$uy9sdU77QhO43ve2K`hbW#$9Q<*V3rF9ZrS5_x4S4ue|Aq+W5@PM58{JGk8V5r zu=eMRvQjl=Jr?J{svQS0mxs||JXV=jIzQ`xg4mDg;oY{D&Mue?)xKVE>~?%w7EL7= zQ;A&zxDfQ5HVcS=t+d5cs7#Gwovk>NTDJdc3$1>`d?D7*^0Zd0ZrJm4sBn5923Lwr zJ%(+VFmA#S0iP_rfq7oLSvc3g)p6MA_^5O(Y5_jA!L$QE56$Y}T&0JzRfTi5!)@6? zwN#`qNDVKrBvku!8N-25{XOho;?w0==S0w2;}Z%@P3qIPTubmNl_a-mI#w{@WLbM> ztLhwX(lXUhHWo}YWd)5q=9qBOIT!xwV9viW3vJl=#wpx8<B@3fz)mj!te-E)_x*;A zlb`za#;-pXOL2bx6||^ea%bmrm~F*2U@PG0L$!Xm<+#j&AR5Cj#}#(eK2mkpj-gvV z%CB3!y$3E9tm%d{mlcNK7at#5vG0VNttV_R7Y=e^cqiuwrUicYsZRdDBj}xWLfYpe z{IK7SiHFK^3-5Oz#bC@tXE1uM=>3}V9)o7(DX<Maa!q+F@Zii^i@F<{h65W%pkXv4 zSA1X)>u{I84IMwpHoY+M&aaS7d3Pan;7``3ehM{HUM!wvn{M!TtWhjck+F4P{%vFm zb_=-o7W8Kd@<Z{sJfHNSYn?v>>T!7!M-i#?DZ%C!T#%XH5l@Z=?z`>tp_|(*kM&(P z;oP#AU+j1JVVM?HP}xY+JKJNO2QZ%DCl3LRLgwl9fqM*A_lE}VG2Oc!2_tNN1m5El zgz+2&;nQ!fUiuq)ec@6eQg#!*SI`2*I=x-Oa5E52@}$-;j5!AzVPPQ?8VmhIp6IbP zLxlF>%Me7s76yviSgg4|7wgC;Q4RstY1<5w<Bbu_p|W-qQd-=%7vxiR{ENsY(~9%x zUD}IDKe`88Dpr*y7xq;rx-0Trvl<C+QW2Smn`y;HJji^eFIDQLcBB-9oxX$W*}9mv z_+V?E%i#2O?$)4?saH@$`U(n}vmS7qRPUS}x`WBdfr^u+{3zz560N7>X}uL&C&U&g zf9DU~Tmy3up<$q519j!E@-r>H2w^PsgukQt@>W`yW#di0j^+gsCcn}%kS3qK6iq*h z=2|@F7E@->+b5zJOR?4}N%O~6C-?q_5RMOg&U-0AD9j&$K-dE%yT|fY*sEj>3oZ8& zwkOf>*d>~U4#OVA!<Jl@t+4jxV@J6b#S7bO6z2CrXq2H!r0!x2XLc%_o8krLA65kN z-A*s15U{m^X=xhRU)sG2b?kY=0(C)p1pMslSs{SChB-x+xZg?S!%bUSxgU4mr{Ql0 z{vF(kSgNVbCMOrPb11UhcexcY3GFwzpoROcCB=MknUuZpM=47|y{S!EBHy`EHk_1= zR3WvxuIf0;!N!+`eAEeZA?u<}R-oe{CG1;na8pw6zK^8g#4-|fRdO~!p=Fi$oS!&x z=7eS#DHfJv(dyX3!VyT;Yr7i!#X7d*1Xpc$6q*Qm#IPyv5xo|vQUw{iVhi&IGICu- zYi;UY#DIavb3Q18&5Yl}Yod)eQyi*#YelTpTUF3az>cyI;KG>PoJSUsEz;M|sQ5T+ zM@fr)J*5{Zvd-5`->%vaVN0_Yt1#9+*igh@RY7d5G#Z8otvPj0#BG6hS%_Xe@4(}v zvi^p)p)wCeUq*>xu3rabXzb=}uHttDE1Wmt)^1kcQ8jfaM7)%$pw$#-*xl(oZDj`r zUnMx%%+oMZ^?l?~SOyT+xecy{4%;!BscL*5`I;W=(W+q1K-^x>_mK;3fC6#-K2mSl z<DBUgY`&UmyN(1`r#wu{tgi1RpM#h7z2tT#t2OA_Ns(%&c4sV1tvI{SvmlJSb~dv| zHTB#b){fn+vX*%8C=6>2FT6rc6^<}Zdm_Huchgrt>U|!Qa}(?X8aKEU(xsbogY)4k zFQ-3l%Z?j!sQR)?Or>I17B>(3$xvfWrT%e`T9LpFTAT7T=y+2;_xH!AmTv*$t;YOq z--*sw`GV84T_-x9!@cX)V-MrGdh0Pv*6v&$+O1no5cYp^f}n{`n-*DGkx+_DLQ`uc z6myk?@NMQ(Dxuq45;D6a)Vfwe9#<rUJppsAQ)!)#JeOKOmR}(`m){J<s3wdWzJcl@ z%BJGe$VKIgy|D}0{2LtDaBRpq?2gr3-w~}jSUBVyw!bdKXM)<cdV7WkE-GJmAQ@#; zX0{LWxIDj^150(WWu%+ELA|nO+>jIza*+{sp@raU`~T0O<g0!j_KHI%sQ!2?^+7{v zY~PP{1gc25XPUK*|I`-N7JfH#<8V)`%g`3G;L~Y*v!S}&<<79Vs63J7{<pWb-K+&_ zVA|Xq%UxVI7Dtbz>;uwm+Kkhq-vvMUS-N!*w;EXX5+3ar-4=I8Gq=#}bI5-x776bd z2Y!v6nA%8YVuO4xJIOCWXfB&+5vZbMnf>l`!%E*=#z$tRyksaOeXoGhJ8<v(74`&e zw<=d;Sf2yo&2=nXjvR}ekTgyKuaTQ6KLCNs-clnHuDDj~HqiU#x6CNIYGKCG1FpLm zY(uNP8LMSt${huJfE0F42<t9#(XhL2W1z3JV2YmVXbc`wZdi^qcOsVqHz~38f>Dd7 z5H|HWbm1q*5!`vgEqCm^kc9Vp9J}bcA1oV=`zd(CZG8~tVClin4}O2}NRz#`a~IA! z$`J~N4fwRU@U8p7tmc6TH_tQ66o{~M8;$mY$4%qAVbfdOdE&0=g`=22IVv3Q<FLig zn9rR%T4)=6Vh;^krsl&k)q#9-dSPB@(xf*j!pYdWr#=>BV>w_0ojKPqNQD~)sezCh z(-vB!VzHk**RJ4G(R#2+VGm&%rCOwh;QeB}pQNl(2kNp)%}1xRdhnvwe!)Tss}zb2 zYrP5!U&nlQLD6CUt~tfu{Fl^kh59|Be$T1jW9oOK`aOVOXF@i9HaZyRNjxj7)LK01 zL!AiR<`$R0M_Hxb#*JZ>`T-M}uozvo?l)~|i%B(j6%?ITzwfHw4g7uRBz}_vKQZM! zi|{zG&i!IR@zZ$cuVR>1%*SikjIa#@twvjFTaAjCmS#2bcC{MuHLXTt$kK|2ru&*9 z9oUS#He-YXn-R$cO^?DU$k*uA_@Hq>;|w`adJ@A1<Xh8bgm26=o6%<YHY#H9(k&cc z6!O-i^u?-sx6-F@zeK%9Z4jla7(+dl=HoWm4x5pe16z)H7==SbFqkMvu1W+ZBfc!< zFbC5(xTS$-i*7PfUj7Wco@9yAK1RCTYotq0rpuFIbq<u)Qz_ENHAOy`e#iND5MB|5 zZJ#P;T0`v>uo~f<Zyc`;FO4K+H7dqqvOOft*3$i={u)he>2r9kF{DN5<5l<O(v`S3 zZNWM0gKX`S?K$;)Z8u=nQ;!H9mCk113LnjPfabft0yxPW;5A11!d5g)-RQ<5PTuGF zsy8qfd8r%Ni@K^C7(CkZW<A9M96StXT%nS%-T5qKw7tUFmeskmoOU0Q4ZBZ&^b1UR z+wiOGK3r77L&#zGfdJeAz`2U1{4X)^wbSnNsGgE0)ea?O8UsQLi!0%&P0tsX;}!=I z;}`om7OX__yYtC%bb&?baXengC$*ZjXfIxBiI_`^abN9cYpB0>6f-t9qq5cCMkYa) z&Z`v6nn*b&R~D>crl!1$&=pve*+jRN@TGk{F%ga;KER~7vL)!@r{y@92zQ$LfcYJk z_lB3K@X&Z+69TCS@GoZMg$GKHAz@`%IsyD?ReFecI~$tv&Y{U5o8CeQ(-sQ4&-q~n zenkfm-4Og|ac>>EEPoH&!u;3qi#|LZY+Hz5AvdzQD^&iNrX)vkRHW)RVvcfwsi0^h zUX?XWE>M12h=P35rKz6MLBPSKPN=yBWpnb;*ji<CVjSxY7<N?4N9j)-8?PtAqVzl5 zyYMj9+2#<1=KzDy;`9wf1tWa?+ACmjdPlv7#pydv(!k=BPK#4FWpR22ei}P+3yP=? zt<&_n08W-otWpdpMQ7**RfY5Bqabt^DmxRkEA}m<ok=NL_uWdVQLIZZuw<0NfrW|b zLlf#!Byx%6V+iJc+!0>kh^s997!S4^pp|CW;x(ycB4r~3_uw=jC8dr%OD?X%yTyYG zH)*z^Qhd1UP?{XJA*yxo6}F*jzGDs?wjl~BBRbr5+t5y=xC$>F;jj%oh#S4oVFkj2 zvJEkgCLWlZp{NzA81b&Qp*5^5v<-a?a+Ga|vG6&Io*WLVtF{d#+l$Eq8izi24dG%O z3Q@)(CQ4ht@B&p|<4fB^jth#I^lsIDLQjaYZpuJ(4>Sj5{z>+ZXdv2$h+3$g2&I>< z#(ii;@O&Xcrg~#v%lr?KphG2SFByyHeR#%M>G&<>tfVfNh-J#>b9LRecGS`h)%Zg@ zQMj@bg;zdS)>iieYYkhGYWnrp*1GIP2E}@ot58x^_9Dem+KYIjBm(v#MlkF}d`~MP zUBg~PA_|Lsg~&V9d#N;{tI3E(p_z>8p9gI;8LeOfN2*LlFX2%$8Rat}Wi?WWqH<_D zv_L5?>zxp~hK^mie%{tNSxDJ)C<)Z`)Gpy&7NiuPW*x8gudd)_jm9Y3QUmwxFeaV# zQqd1qXt~&nHzG+C!Uj<9P}&tAVSC}@42YaZYM-*^*v;4@)vK%lcBO8eYMzu_P{^X) zolh>1V~*k@xbsp9)2o<o3zR5sXlm<LcC*$frJA)?X^eBZGEuNHV*vwgM8{<j<G_%@ z-!+HvTd0HwnvlVq_bD3@c|#jfKdq!aY&{$*m$DA2-dfs@onxH0)lU5@d+`Cp6t-E8 zHK%cd?HChbbj4i_MQmtbYU=pdk<MK|v*w|$v(#W%>L!cmr4gfL=PZF)#l4sTCgp#g zv$3o%R_x$GmUY)^v__FsrD)Kl2->XMhxi~C`sf5%d+P*U!LoRShh>v#>nyVuZ(v*+ zh<M{{I};(+t9O$es+;LhwF12n?4PHUV{+gwh|z)4IpC1L>Rn>qpqTvzScu&4vX1Vq zrgW=@nU3kYg=ojiIGp#zP;m}0=A}^a1mJnV4}eqf)4p)PNHrdl3X?S3N%mOnV_KR< z3^R!dTU6SEnoHY2{fIiQJhR<w$Ck=1xc0=>DlYY0nP*(;FJ<m=spoO#A7{rJ7IbXj zQ!=^iMrU~rJM8G`31<av?PksnX}c0(wI1e2w9g_wSU5Sb8SOXOagObnXK?(aaL^1F z+z9-<+9!69J;+;Hy^YiII(dCyZ4qVljJgUI_NEOm+AM41Os&Qu3%A%2!FBI<41{Q5 zYUiA&VdxC33XX6!rd>KX2k2qiR)ulCwHOlh@s%GUpO5gw-nRd8czCMAS3J*R&g)i0 z<F}IBKvZodTD^-XzK&*H#pXMAdfEo!An`ZRty0I6<GKA68+c;xnyII-ho@m|@<v?j z=5Ot!($;J}`nH;d5q{i`a}`GO+=t_P;JXvsk1p~=CilQ_sZU>l4_D41;p<(-eGqX$ zMZ1~3NX2xdz*#YVf_yBsi8F?Yz*MVtkmZ~%-u=pV__P@3ecNTIsW1?)9lpg}0mvo% z{OTSDA2>YJoBHhi1eTlZ599UuVK^#&vVAdDQThSHSD6sDFT$QB>fKFOvZ6lhZe{M= zU=^DqIeQ@u`=Vp`q_*%*Y;3LQW}4QU@IXTByF$zCI9(eXM<V?NOUMBg;alvw>V~1T zmxkx|%MHNHll9%pal9Cg;+D1r!%J_IXg;|!?Q0l)V=pQmv}H{!Y^vzM9FVq4t)u0V z9g3zM*==`)Vk3P|xhu4OV{Xrd{b&)X?2GN+)yFmjnk4MUGD)nE)XQrZ1t;FQ2aOK7 z>ft&8$*ROc?7j$v2sUrcCHBdtGbLkDb+Dol5pwX&)K@v%oeiyn^$+}#O*w9WuonC= z^T(S%q5O&E&t3e<EG)=H@*`{quyS~?V+U42T1{o{FgU~4tuU&^2z;*emC4%CvBT%{ z?cdk4dKR=VjPi)aRz)Y>tqqp74;x{-H2L<Ojw2U7x9@D>^^s4>ILAl$tQUT6VbQir z+shaSDS3>vRoqcJfvm)Kd*09)>$v$b76fB*IF=$N7NVkPo9DH1zHpDBML3DH7C5?0 z3g6&#RCzo5;<oJQRX3?_fay>->%KT=8V6j)WN-t>Mt^Ke4Nc2^0DXZDxY$IWqsQ)f zI40~AL<(oIw|DkO4miQCz|+~fDqGhA(u}^RoO$roW{96+UfK*XCS9@P^kQsmh@Ep! zKZf@>8Q2loQ9nVZo%4u#hwt_}K&o&$x~(09@*^AWq3Z|C%5HS*^V)-rf$QB~)&$$> z?lnDDQWzoJurymKb?m@af#qmr-Oy3RL{a!lsH$qSjuwsvm>I)*vmw@-`7vL6wK*jS z{lu}$t3Kmwuc&w72-B&4E-Tko2H;p=d}p{H9|ex`Z;18i+dV>Ye2wkG#L!faSm%b# z;0ewx#|BfFrtwT|<ZPS>+8o@ct&P{^Sm(Fs_^XqW9Ug-z(m&wLV=Qpy*UKt>%zi@q zOyo|o=djgzJLek<SmHOLq@9y-%VMW!#^E3k=z+lFR!i!TIOoQx$QS!9VX9|B;0fzk ze8}iOub$d@r(!KB3anp=Ut446Ac)#J^=6lC{#tJLhF!X?K4@|KId6X%e%$5KnFVHH zG#Bsu>P6mIM?1Z%@L-d{Lt*@F6{urSX2A2NR1fEjB2c=HDI&3>1>XLO{kB%{8l}9n zT&>#*yd7$zP9Xo97q?ufJP7q!?i_}$HHZkjY+CUfNc8tH<^2M;(0407Svr}(3DZgZ zXijbZftDV}=fJGs=5wAD%uB5|8Q)-4I@<u_N$xviogI;>&XYUfLBESHXnyg|?;h5r z!Ib|E^1$?~&)!0h;g~kY1g`te3!mMz7yJF}8H-J&gS1*;vd5g0&RgfRIC>*WyfX$U zO#&CJ=oM5tL-2&6n*{2x{r^$YGTLK!L35z*-@tYjx)s}~ne3zCq<UaDL~b~50FFv1 zu}}>js$fdJaED}V;KZVO7fuuouZK-dR^%haAzB)D<2E+cLr-Jh>naV-v?VfE?Bdq+ zje?d1b3DkN{#u%!!3X=MO@wu0E)oI0_upyYi<J~!jL3tQtH0tag+FGKv8Tbg<r7-x zjd$yW-VV2Q$B|7g^UJs31PXk43mL&Vx1n`TG<&G2W*qhUIC4f$)tI>E=iE(Dqn*pJ z&k^RJX^26s!2wF1&YvLAlh9>}i7)fUJGWt|{Vtz)hoVdzJbM04|N7lJ;G>eziO!*m z5e0a3!hybXKbYtoz-Q-tkZT;*%kGwQ23|PIjZKZ(;t9KVmVM<MQ{%m~srQcEW$!D# z;A2^I&;mc0TYau@3!E$5!6o&wFq|vg0-Iv|glT;%2=jDCVo;7#Dv7((6U1v<qFGx9 z9?x#!b#`K^a6bWU`?M-QZd7J$Rc$}r4!djM5H>e{;OL2SRqzF>Gx2lu*dm>3r<{Tb zIBr5(C-I;sl@t6Ndv19j?By|0Vcd*jQ46o~n=YA_?Si!Cc;Z-ibqe8Dn%?5DQD&Rl z(F1^%PlJQ?O;AQ{ozWm$<CZf7w+;cE_U@d?ISS^|2DP0nJvhIxagIme*(?voPT0J5 zLBpbgc{=+XQ?wAZL60%_`3-VDLiz1?@Y_>-E#m1s2yA#XSS6&wKw&0O@cCSw2;w|y zMG}7XZB3lTxYPE9vhS17hh@cqzvj$Yh-|ZGfoQ!ka7G`M(m3VHlotUuGaIj8z<N+O z1xah?z>j#WAhP_H9oVl7=-F;{-dUBrGa0vrOkn$ZTlp=vbJ(lIl*c{JkrlStax&2q zpSfnmI)%DJN6CosEs9!iRM=YUvp3e3SGn(79)=@$;!T?uc;E{fZ3*qciY32_P>fw; z;ey51p>Q#nwf3M}PgrlJi!D)x<VJbqIvN*_>fdd7%iOP)<i78=tYulxns1lpzF)7* znVaa5Q`W57C$~#(KF^7>HB@`UP2EXmbQdK!M3Y(TbrFgS<=@5`4O4^O+We3OMRnut z2+-^<Sm+91%$T|}-my#dtW5da1+?Zt`<FS}zi()@;GC`}@B-bVj0S+w=w4+^G~?$^ zcCQ)&#^6;>JYMA_;8jL)D1Opo@iX@>{4CCd#|*s7$-ujud3cwTlUcYq7iku5<8QQW z9hRj>;n1`1J<us@>zZFq!@{{O3UgXS+s@#~IBPeIoNx?8GsleuZ3}U%bdE<97R=%U z9CvFY?f^1uc$DqJ?RO?j-T4-(g77-v_5N7L4kN&g%i5{{+nqI%7-2g*sk8~}u&yR` zBPBjNYJt<uTH-9gX5b=hl=TYQL2=!qJ-DO4t5ko^+*Z!huzhMD`>(<sK0SkCXh+N4 zqDgpEHcV6gDxd_LYU?*)(V|If?jYDfO-Q~;JPwWD@uaF?&b3HDYloZ<Gc9!lbB&G4 z5vxbwuk*~#xy-feodw>`4!ENsG9N1qX(B2`n=Y5(xCWx#K-*eQ88U-Nryj-|_k}S{ z$Hv7^#QLb1)??!erZ!bZQLg_$#MU@s%9O8m3yARy{J>gV;8ymgreEz9cboEKkpPrW z9z;t9{%X2+7F?2Y;R!`b>0~@Brm~rES!DPC>J|1~(j|1PeaJ?%n3u7+X#%F5*7AY% zShHSZEd@?(s^luN7*8xAYZIXwZR=OGPU~GO{fxkG&<a(b5!l`tpGi(~G{M6Ilr6k; z2=tsfB``pFc7<ozmzY~>%R>ctMqnY{)H)-OhlF9!6_;8M#|2Jqva{+KwA-BXIOS2I z9TYfA-B%qHc;gAEDO5ci6u9F!ZmSOpv@;9spul?iL4jT$;G{sDg`l4lSp0=zAar-x zX#EH_b`a21UH?geZQ{6aajbLs$JLq*>&TJsR2cHxm387`z)Gn1rVbokg;!H6osm`f z`s2vJCRJ=JYv|b79aB9nX9l9pL}REH$Y7gws?fP>Ax@cYsr4p0hff5u+-?*b6m*6k zwl$B1!CdR4d!XrUs%`kyGM#!>wT`-(8XcARiE*&RH`!~Aft?i=)-7SL-Lcus??ihv zKDE4|wI{xgyaiu2VymKn@3I;Md_AvTy>A0{<8CMJb_JZoj_5c;=Ah5sfRolnZ-Q?! ztKNmr9NQ<eFRs=ly2qxv&qOJN&g}SoC>ks7Y_^Vax6_b5D^@#R#wWkpmg&_-bQ-~F zI&ZQEzfEn8@a%EnOW3gEE_|t*(P0vI*9_`kx_>koUb6esXsZ5uT@ME;@hy8}j14*h zdIKT=;{Zv3`GA#x7XZ5e#{fSAnx7Y<8^8}R0&qJZ6>vA;Z-8e3jnUj*x+KIA+@A(i z0z5AW(HhVL;0G8DxC>wftOC3O*a0{S_!-avAJ_K=3<8V>+zChp%m>^HSOwSscmuEx z@GanHfVe0`Q^1XYt^i*^1RxeL4Uh>~3V0H*8So+CD?lZnDRAxz2m(X^#sTgGqyusR zs{k(nN&trdrvV*7E3XpJSo`ws7b;#3$9_>`u!q%Kq2hR2XjPEhJ)z=D_}9L+&N_St z-$6Nx7(lx-fG@BNI3p`^eu_0VD`UDPJ6nj^B3n!s86rzq@Yh!)i8TBPVaB*~K43cj z5KK%E<Ha!1NBFti_ZNf2C=rP_^dBvvM7S6uBGj9a_#KCLkqF@<1|a1K+>KIUhoxl? z%d%Jm+&GJMVq%(2-4A!U4@*nSn9jgi!Y0y%Ripq@i!cMS@JD>jDy?RMwmSjrMj`Jw z{JDnFeB*%GXfeDFACwPb#b85chPX1ON*Z(w65gP~M=-rU2!|mK{w%;L6RsJMfnOUq zMI2**MHKKcE6ygVcgYIt*(&TzP?L?jMEo+wY%vWyUw}7BNFxir>0$<+(h-7`&s8a~ zl(e+ypQ3yc5idpDt%u9N`^Mmekv_vE!GF5)x9EAAk(*7WPk%G=%}}`#pG^EQMJ+}O ze9}>JW>7;aHLPdjZMJ%5$XUQm!`+H}Nj)Vg8!4u#Fc~5l@0cFt%AhP!<!tb&kKz+~ znSwAD;A|GXL_fSuLu$9;DH-Xd<C)wbPJBZtAU_iUS8^&{;YjIWEKOdt-|CnV3a1#P zK)m{@(q)Mo<vpOPywi~aIbcCJa%%=?H6w>i#GS6FPS*2CgR4<XUNBwFXEs6_*c&oy z<kP<@pStCWsnjfQrfu*$9QcmMGs}g%*L*Y%lUKyA?|(!tYSZCeMTdct!MD07NUFu} z0njZ*{bFe+s#>AZ!`f9>8fGPPlv@Lr>hc>P23MtL;BkHBHxGH$o#T~d=$hZ4Kan46 z66@%n$!}m)ewmO-t?cI_tt_Nz1OL*%wJU3mQ5UN@rpe&|;aip7_46wMn5RR+<|AJ# z>MS{AJW&#jQmoF+s9*hse^q{Um3Ib8mF1;rQP$@Sr5&gxEzpV7QWlj0%Yc_gNB>%K zL~NK6^?;^ZsHZ41*Vgy_UF3)OU75~oaG6?;l+RTBPgJ@~(*d)7H~l{&FEw*YQv6QT zxnR&=T@T59Y6UCwDfQ?~glEe$4b&LC)ig6XW0aAWj<-wsT)#XpRZRvd7i_cHdTS{g z=~mbC>rXckRLlUsjTE!1ur<ov8@&wX!}d8D<&vRzL#@HKG!xIfrxs`H#FkFu3|kLP zyK8YMUDdpxT(J+8do+}GGtmn!N2doq3q@Yo&;Tx{Exh5j<ohF`;s(Bl+lueuwu4*p zX{cxqHxq6LxB~7?a8`YSPbJ}o!o|{TA>ej~<M(kWFhzQYLq!+3Cl6tdP`GcyT>$rK zxOc<NgUd~$7Q*Ee#T2+Ps&24-WSvP?G*84k(yeKQaN&hNGinSan-Z+`u14W*8aPdE zGZ*y16_o-l2>;Nh1>czR3>Av)FEzCmn`zBb+?<EsU=_c14v~nb_20Uvv}0?e7NBSz zAx4M*q&XYE>>=?=(*JHlh#38knjlH=%>w<8ecc#nA-?aY-Z5@0-th|4-3XL0bqD)h z>`(F<4Vu``a(y>O>5Po3P;u~Qf6p}(tT;+8smFOm<C*;-<DPnhSD4}(`!~dq{GE>4 zh?4^0PmZ%>44y~hKHcSwhOdF6K#!HW4AaI6AEr$ljJ!2BUC)P@Xn7m?8hJ7t^I<yF z+H66nPc+<z;VH%Cc|5RXh-{a4@yI_3DX_n1#2k-MuFo;xD|?|vx^eKY`OLhD6Z2y~ zp83F@qtfOx(<AOohqy96cjpM0Jv)FS7{~^$+srYz%)D8EOT@(VOG@g88(gs{{xCp< zWx8edG>a<m(HV2A?#E2GX7F{KCDUrW471I!WdpHjTbfEE+Lo>gGAuJIMU`P<)^t^V zmT6hG#4IgLV!FCTJ_6|rq{}n~(qcM*bP<!dKp+jcSz?%FnutzJ7jcPJTUHW0a1F~! zQFr5K+Oo3sckz~_bc_Bl-lpBfWTY$KIGgS!S{YX$o<MkkZ~|cj{DoURcaQoF8hSQr z+@xu<=B5@cZ)nxJ&5do_weN6K$4)nQHh1ZIOSkSldiJ`tx7Tfb`u6kgKfuR#;Gn^N z{sDnOLxMv>!-j@OL=GE1A}V_1sF=}XV#kh)8$V%U{OyzOm^@|boe6g(PMe-&NuDt? zC3RNX?DUMxIa%3O+uV8c7u<c%!bOX7NY?+;ml+zW=3g(g$J$@b_jNywKnruNzdUi} zU(N7KMD?GWxV}Hv6qbtWzj|m7ujkK*Z~lL}>^0)AEZ3R;(-Pper0UP@IxnLH=`MAv z{;TJ9eSb#$E2;mZZ+@=^FsIh|Gjilp^?eI$7yd`C+TpK{+Uig(MD@LP=jKK^$X&A3 zo|k{`eai}#J605~ynof|zdi8aLk~al=wpvR@#LDnKlSw5XVyKt{<-Hj{NsfeUwZkK ze{S6L>T9nTZQk<6n{RD>yZD`LCEIuGeD}RwyZ7vU|AP<zwQv7{gNHsk{P8EB9{KF( z=f}P{e&XbpUwwV*n{U5!mVRG$`iCFSl>hYe*>k^~zff`U(yx`j;nbAB+7Mh_(O*|X z@V`y}|91X=ng74n5MSM2HN^kh^w-BQ2pco1s}t_=6^6PVcDXOaJ;zzRR=V6{OSr1{ zt6c6^yWIcH<^BPedmc+_q*>&0?~Xh;mP2}?DF74D`n-62N_tYpyf|y3H3fYryq}P5 z$r>{))iT{0m7biDHCuVaYjH*;W?RFiTT|v*Vly&rnJOLaSxZL5V5U8BhGl5R{CLch z$Elg|+H>N)(5vOhAr0enUcJ(7X=&Q6z(-IG&}c)Wxi=6E>b3BQjEt<$YoIsAHVka` zi@m*}rx@(*9UqI2FwAB}uIF7d@4^LRN9KH7o(O?6-8?<vc;b(b>S~aidvETNTx8&W zZ|=QIb6eN1j~w#z^HE^l-np^4%MiL(PrumsT*OBvv9Ze#(cCL{SuSD;WHWQ-Oi#~- z^D{H&WoFh$pB9190NM|_A*>CI^cm1MDGi<IYQBt5nQh6iS;Nr(O|&ManIp5ZGP2Am z>E=<1w)E*U(KpY+D2dmw#FR8klG&PJ&d9W+n=SJ#({0woX=&`7Pe|tt{gP3B=EQV! zVkQD5Av}BQD4@PBVX`cVN#^9NjM)gSqKjL)aI6>xOh=%MZikE2bj%c2bjCE`Q&sfl zIW|kyf|T?b=46G?75>>4tJTF@WLuL!PLeG%EoHhA9wQ>sh98Kp+Y^44tgO2Is_C5$ zVyqT(re@VK+p?K;&+cj2{MN>WXEQ8Tuq?%Do}Q6pF=r$jF*v^G{1&+=Fmk3PBMa^{ zjLFjBYO^}Z6F-sjGf@$=QqVY!^k&aa1kb^3W(`t%_C?wB<X!em%d|wiOiM|(1ek#o z)43vzc{5Y2mh8;L=@xThvelAh?%B_loz-tzN_sy_`rMvI#A=#V&ei45oDeW2D<gfj zCEaR-ubG!6Yj#RH*bi*LatKSGIkpTi4&~}1N>@XAyi0T~-n<m+Ocq_XH8D%2`bUy; zDHlbH&Zjzf19m99wL0O-&l-G8vZ!Kp_18sV!uVl*{Az?%IrhAzr#Vr_p3>kNv#v7g z*`+5~1=HL-C0~eLt9a|cy=Dp3$l(eZNX(jHW8r0+ds*h9cBdqpEweMN3vRu3KGPsF zdc{wq-H=tm5J(E0dA4PC28QTeMR(}eY`A9q&RoYk%q>u8{^aGs*_Jb*f^EyVxQMu* z^t;xFmHCa%9em5Dr#JoFgCDep2TWmml09W2gmJ+Xv^i{8vZrLH%+5@+B&6v&Z%R^1 zwsp!pXv@qbP5J3K#SX?iqCe&g7uAg<R_bsnP#o4><JsCFR7EhJOKSPw(W$0??f6H! zU)#USt=IPN+56i5k9%F)f5B}v{g=7mf2>caC<pK|=sV!z&-dGWL+Moc*QRe>U`_uc zF7YM&+=FWR*XG~pAvOJ7<0D(~Oh{-|-kV(RYllk;s}7gxa$g(Y))80FZ);?z*azTc z@S}G82_tLzf9OIl<MkX<)4z877su7~ug&iciP!cow$${moqyB}&0pYZgL{LH+WFj- zRx_R2{_k3A`q$3qfrZ!hFIiL5zjpeo*4Ol}&8Jas)b!s|i_b0J()<Okm^ZIZ=c`*o z#fGyCrCqO{hkHPXbLWgVSciglqqwNIj_becbpHM8blSVQE~mNA4P%9HtuHhREl<4Y z<Pm3K=QB3ZIx}9(!ISF<0=-IYR3WChaY@XmlxbO<Ox_^ERgcaXj$kmOQnqDfp?TEb zii;lci7D1$8Ch{?j?*l9N;42L-I9eyFgznYJ0r~!Zp})IM01MS>>EW`c6Q2)bUlUf z8Py1g6U>3cgrje0WFcDD!`qmQBwLzg7`n-$6K8`cvEF?w`@b$@q3VQYxX0MitSLhm zSS{l-;!~0=;WIJU{g6&kRXFtZlbCj#HE9HTj_iTg<1<H7s{4<=1fPjXSW;4!TCEi1 zJ}M(IN#_z$=tF+Gkg27Vh0nAi^q#gwPkfvRPs_+Qo<>HF8yz{y7>7i<#aXlP9|g+d zMvRINi;YqPly=p$YpKBheOeL7pp2Asbj!s4dLt}}nQA$c_(0ujOP5kK+OkkG;}>L- zXZO~UjWF?%3SUzqgqW_yM2FIrNe0JbpltL!tIOphj|u5B72lE~=TC>>0s~bP5K$8A z$(5^nyGLb5Sf<%#%&=s|f~^#cA4Mdo3C~KgVtA4khwcamzQW&qlqGSl<%;)T*NaL= z(8RQqyK8%fr6<K@rlf~w*pTk`NY|BH?L5X=(<Y>&`<NsSf|F?$NNKH1LtM)ke0$Gh zd|I}?9&9)7Ar#u0u|0eOsoK*nKB<B@1MENzdV;eoNm1z-9I;c0aTfXFB46*h)T!|^ zIUbBk!qQ^b*eGlxcK7=6z*N-&@h??!S{=n2HI+^*3ro!8eONe#<%3y{V<KaC-xxdx zmMKZ9ZecD!^l={*9+Q{}se^=o$`bc+$e&eAhz#PXNu0(;ah9plld>d|>CY!a2t}gO z9+B0<A1&SNcyW|5>+%q-s->H0v1X%2wXAPc+3^`w^;kTw)%RFSmKp)4Pls+n`9jzp zU@GHNrq9wb-L801Lr;OJ3zSSR$cA~1L;bL9MGNl4s~&M_7TCz{*YyKE;>BUDW<a`x zcwD8Zt1|HNC6{L?CWN?;{BY4D9^kgFz%sIiVPtH}LdCHtNso6MmS)SI$!vz&l9SO3 zr)?Q3J2NrMQdJu9OwomF6BDyiIK+q-hZJVxESf;ZY2lK_Br`$G5|B<kYw888an+<o z*HI|w{~umlA2Isd(5;)=Z;K##B|RWWx~t86t4B^?U2!q4+ZAuCU(lcM-|N2|xLyuW zo^Avfvcs`B?>zuqi&G!a48XB?BS1p{=YKgLN|*2Ga(xf|IA?A6F<r)`YXUG`iZ$PH z{m%_L@O>8m-wy=vnYDt?;rcU_nTj(`e;=p2)Dld85`cMQs#L|B4c82ST2X6;(9|nj zNe9E{0*Lbx-CYWowAcak&jT=j%$ciM=D+LDYvB^VX93Lbc>u$00g$GB0Q!Flpnp3s zh5R9qFTC6|r^?kItDX)2tG&OP{~rx+q+_^7{QpfC!##C%TN)~^2mZ6Twz%r0<!ip` z^`FJ-e=7B>8!<Huu5Lv8pTh7zpU+iAKyRV1Dgx&JJZ}GkIs6|Nh1mLGFe!U@K8ptK zuB8i>cF|e)+zIVw?Rw2!^3+K#5f!0}bCtUR;kU0ly3VY5U-7%-vi2%ecZ;qwe3%}7 zGs5qG=F~GC#5d14pP791^cSyHF~*`n9((l8qh^tCH1+6!E5m<u<oL;pLiAs(Va9pD zaD;mDM5uTa@E~9nU<F_qAP=w*U<ITB?gESli~@uLf&hL1Uw}8@Hb5^xH-H(?5zr3M z8qfmZ38*}dO{)N>0Stc%?lHh&z#c#e;B~+Tz_Wm-0S^Ll0aidGbUutWDGkp_fGL3S zfKh-5KoH<IKu17RK*blx2XGir0(b+k5wHR9G~iLdD!?*8E?_<&6EG8S7a$f81n>rQ z12B9$KvO{FF>Gc7I0ASVuo18U@HAirAPEo);AP;g9{!C#*2ZBqQv0jV#IrW8e$A`% zFn<Xezd>1l2VNoXlTE@zx35EM;P8L(;rG@y)vI;6>z6?*`O+19U?(M4`<%}3`ctmC z{sZk@BeL)4diBKv!5d{W3Y!`H9^~kkFT%$n{MCSE&GKj3bd76#De4!%xC}dj@hnEx zXBYav*I(oSR2(jM{9#E7h9k}4Vyu$OG1oG<aMY!RYpBZTX}qU=yaAW-4#1_q6E4ST z2$ajhX$O~MF&syo3rAgAI&Ny!!iYNFQwHv;<2@tKcM%XH9ll?7mG_Tc<^6`Myno{= z@Aq8g{gJD@ch>QqZAk^*dk%FIPB8D3Mt~@fa1*`o-gs^|%uQ^-0L^$V8SN%!f~m%H zukrBjUj2Mv0iMwVH2mi;M|h-dJfB>NXYj~)9&x{$xWgsCUhp#mLIG|<M+*0KU48rZ z6~l)Q7xD4&A|)k7*laeD%YeDL_|FxOKKiJ5{`u#{n{U1;N=iz^r=NZ*E?>S(9i>94 zz<4O<Q&VyOhq+CKY4^N&`_<!qd8RVAY300m3l}oL8Tn!5e)-`Ac<;uuCmzlqE}rMj z<Fj)=b}~@Ucq@e`e$L3sWaU3^VY%mNM3%es=Xv`*D;PgH8R_%NVfYXCCnxVm{_0t! zpPZbA_Xv~2^ef@d3t?1v#^;rG0ne4lfB!D^j7*sR3Ffb^3&<ZEGwi3)lJAIL<^GE& z@N}L56#h#qmw#CK;d!RP=gZ@!L?J+B8q&ve{kQkFzV*ou_k)CF^2hVY%S&330k|so z{9FEjmZLu0j}R*m9O?h#@&0~V0QFq)ul>(<ed$9Lmi~x$IxI+5AiA0Z0RH>djsLKs za(`|K{lOpk+k|ZumCBpp!Qav+E2Q#P{AUtQ&70xXP7+5nZ<W5njfpe8W%^a39z|v6 zlAM$7xgohibanxE+`9pkXk5jmKf}4kV>)#~4&KXL;RbLAGz6Fcoh9YG1;7mWJvsOF z^~JX+_|iEpPTYO>-3m8D##gOcC0=;p1@ZdpuPYh<<daXtH{X0yCFhx(ZrKPOx^YWG zO8PyS_sGr3+eFT`Gux79Wr!RUQSvtIZoaK70g^B)=f__XHsdDe@84h-mtT_??fquL zgbCY{NBO=8H(^%voH0@sCCJ4EJ-1DskRWp8x@|=hnBJQ!nSPFxKU}!5Q79?C2isY9 z?krn0>@0=54xk;Zs~e0k3{Nm=d?JrR6`!Dpu5oqm-d%Wkd11Yww-_>HhzJYAH~CRf zig#njjuqG|4f|A05>uy66^oOGi5W9yh}6_nF?;rGk(Gt-r=UL;Em|bj+Cs#OcMlP- zEe;g+8IfYetZ?yQMwoaaD^zS<5+GjAjS`P9nI^V8nkjbOKT;f6H%s(-M~d5aNYQ_n z6d~_QG4OpUg7!%<<zG^SAC_X|Q7OirkRlr};VUU7e<#KClTu7OEya>0OGH6IfmpqI zwRq%_N5o@~Jtm%f@=5XZ(@%@_>({ID-MDe1C@Lyay6o+@-xeS3+$fg*Bt=oV6z{$F zp4hv0ulU!${v{3`JSYwyJ}izNJu1HV;tO%+n<L_*pQZTn%P*B&l$Mr?b7#I6Utg4> zyu4goxNt$q3fWq(ALch>F{cTk@mz&@z>N?dRQBfOkW+bs7$W<N$#Se%Am@lj<!VtR zH(`CyK|`O4)`;IV7VT@M5JOgB4Z%jtKO+8&a<rAQrC5&mPa^&+h+l&EhY<giOZ*;) z9~vvf9hpK{S7Gh$Mj`%z_&dslIEeU15dS#he~tL1h<^t0&%4C$*8^)W!yxOEu^tz; zx{WI_hWv*R<vURc549BXNPi)}7%SwdIYNHFTFCNELY_ZZg@3=+h~E|Qy%9ec@naAl zX_coS{(_c5F7Geonz2IubB>VPS0l|$LVk0wIzBodu^x!u0P!(tx)J^0{m?(<=)_3# z4MGO@7jnv2A@80e<Rhzv+`LK1!w0M5i{@B6+7|ttE?7_Og=#xU?1$u+WA6mn@(v;U zX9_v?ULof^Ddg%`h1|49$b%<b;+qkF5aN$Q{Aq|kAMsZr{<Dbx8sfi$_`4Awd9FT& z_}?IYc~$(|uu5|zQb<7x_aTM#Na0<i@Fh|xZz;vk{iQfJR*Lg;q`0tJii?}1`1K$T z5Rj@p6*nP%AH)wq{Bejs9r5QP{xZaWtfdss^_SxHu~O`qBgOvJQXJbPMcKjX_@0PQ z4zxl1n-ISX;`c!O+Ympvr4+aKmtxLXDOSuuTC1hlwn>Vk2dm@PR1FE*<@z!_d}!Fv zun6^PRPSEhyLIi_V|Z17u%XdWQ4tZ*;UOVm5ea>I_3YWb+wkGHB<KMmqTr4HDBMIu zBzWD*0K<oyb^qv?@W|*8Bp(?b7BVy};Wh^7-o0xV-9IWOG%PwSJR%(NiCN#<yu5;S z92q1!Cfc}$-PEpaLSF=63f;PPG2a3tqnLhlbW})mLZ?>k+rb|Jdg%drBp`lB7!wGO zPPnO6tM;0|!m(RdGmwm`N<X1Z>sGBs4p9ksDJr|bANWTwepod8Tes>oQpasnZ=!(s z2_a!IqoboEqZ2wXf%fg%w!N`w)21Cq5l8y-<H;E0lF*?>fCRFE{^5}^QPI&ckujZX z1b~0f-YWf}F%i*`F%dDtZtl=V&jL9l+}f+pDA3RJ!&Mdr*Ajx-0R=vRe=7a{fiYll zOk{M7B0}M4@E`amMD!0O3ehn!2_1$FYt^b1h^X>U7}Ovkv|l8$7!CiMhYeFycC7Lb zH`O=!HTRB;j)(!5hjms|b{eLOM@T?e*Z_A^eeaNjn1q<9$QTVvs1WUn3illv-p|9W z@o3$Hyo!o|y3+j<{QI?N)WFTH<p^L%6l0=8AV}5zVS@*H`!sU*ydesn;X@(IzP{n% z)&2<yL&L@dHg8ye5ON4lVCqp3)%hocQ|`tDHmlb#l>Xr%5Z7oUI`~KaK)^zqv}`^m zAv`7|5VBU~4S(Yr(W0e)Oc?kW<>F2LN2m~ZKiDTc5LLz1TcwZkjgEjIMnw(`sO9aF zJ_<T2ETCp=)Q_51OpU~$Uu8*7g()}WBsv!*fLsm!N`Ec~Y19T;S6?nygw*QKUAv!R z^ykKn8>jjsi!H;e`X0~E4;IT(BE_Rw;o|kBkz(WHi^bqQ=u<$?jrdfGiRe49&oCeE z!w)|!o_OL3v1ZL0v3BiR@$9qDs=mT&uf3-FgKxd{mSA7u<C5pa6X<VjL|@_Eci$EJ z_U%)BgHvCf5MO=ul{j_klqf4J6Q@s~7C--VM)eJT`Q;b!+i$;#)fc4LgucSTUtRQU zzb<I#2BV=vy<9aN4c!7XboZm7drq{JuZ#Zj9Whq!5p(26VzoRbHpy?$epk0Mq8}Q> z*mj7I#&*?hh(8GNLlHk3@h2nx9K^p5@z)^!tBAiB@lRB>Gym<UfPMe%r~IGnr>K29 z1oo8c&;gZ5i1uohvqQV?{rdIm&G+UG9olv1(z|nu=FM+Lf4F_uUfsL*?B1_s3)8L5 z@Z6!xEj@c8Y|9p%`+4>A5*@qt?$xhT<9;m>pn0=qH+SsPy;r{`jeFg!zc8D7_3r2C z*|Znp+<HUvW*yqK?cJ}5r)T3v_3Jmi)nw}6(V#=`PE9-;^F_ZFo!c~YYuFWG`}OP8 zs6Nxbv0c4ZcxrM><3^3VFb?R_{U-O0@I{nPct-wS9b5Oj#j9UGub#jk`S<qn>gMIu z#Y@rG5f?3iUAm}8kz>OC9}N)@ePso1aO=AG-U!3+h$lL$IYEK$xws49Cd~N#OIJO_ zMvq-B<3O)nx%J^P=l_Z8YSdpVZ{pho(57?e&RyUVx&eALYSaiLAbgIZIE5}WwmAee z0~j2~?Z4$Bf0!;tH`jHMw=Dn^fAdpMJr$33XX}|WXTJUM#~;5#+w;{AKm70w+!N={ zojZeZ>8WGKj&0h#d$$9239q1_AV@w-UoE|1I$V-MKKv2>v8>rJ-_WB+k6Yl9SDaqH zo~zyD$&*6{;X>e>FpqdY#?f-ywr%pe@4l00PbKDEI6);(oH!vd{+9Fy4H9GUFPu(i zDQNxj(4j+r-@bi&&d{MleUJ{zsUx5*fJ<bE3(K{!4!kFi>Bprvod9hySK(7pQE>_P zXgIGM|MuYbe$+u<rZIT%;2y*ecq#nffB$`nIZ_Gy<Qs3iq435WlKl4DZ{>jl2PEbc zR5->#AA#>rA<k2qHf>t8Wy_XD==Me0?e;O5nVAtQSFVgjznZw+3h-*%wyh85HtrZO zU;ug7E+QhL7t_W4AHx6a*|QRTnbo)4a?3#QaOL;ke=jkoTgB)7`}fPwKKo4JiSkjn zvusYDJSji_{B!k8nhZdnN8Ll_&i(Y$PZf~6Uy-Ks(xprC=bwK*`|-ygzxnmoU!Oo; z7a0e1K7jf*5IC%4+&_vx`co2lRRQrgfP6K8WnuvFC$H!l_k1Q8bkHR}1^{Pi0Lok% zV7xQjKZF0yojX^c9J@j$@<_{$9Xk{aln=}|NtOZTnUuT`N7f0{VdZ}G(MOWNy20|G z%lg5(!#E#&@PVR%Wr+GOSq_-1=M-+$h38-KzLNf^!!+_=Z~bk5{``4~W=P4upPye3 z$}xdufO#{yb?a7%GMDHxt2)dwV3}ZEO#yM=vuBTFT{&{(h`J{Y)B%(?))STyaohZ( zloo7ZAF>apneUad-+MgAPRhO|I3M$UDPO=b=D(aj{}Jj6>;Ls!3jcTBd1rOEZrui= z55E%nQldN*4b(X-1M-#huq=o>?^*uGj~`dSd-9z8Cccyf(n7q+f6C}Hr=^VeM9R=Z z*xDOY@PlD9@Yw?z-j%X9Xy{QaW!JZ)T!~`=Dl03WydLBcM&S=#FAX661{h^wxPPXe zupUre;*U!?93R7lWB2P2(tt7;^nsKEKtuYcuy<5qzWX3f0ewe_Rr&Sek9ktc@(Ldx zpRSOFJko)3Q1lpd&?PS^N92E9bdc}lIm?K0L;0uP#h6VYGzR#O{9L19C_VxU2Cf01 z0rSZ+6Lb;(l#itB_O@0nt`~o_8Pd@Ilz+5Gl3<hvUE*)ZIpv?_LAj!A7__jCQ_d*& ztQ&^QdciC1ODRW#1|H!s4E!byL-4Vi|GzXEyipf0PcD0HQ^Bc6ujgt{{Gp3iV~&3y z%3&qz8FfotbWq-1%fyf?y5v9o*)A|H^^EH^@f7MPY4}3QD9{iI8aDpm8se(=Kf&km zs}R%v;>C*+?Mw|I4F(u=)Kw-1Ev|I@`s=Uq;G1jY`i0T*@i`&#;fzp)*d5<WIpJ$5 z$DWijhBV-O3ss*XGeJgurcOeArcUaCdcgYJ2lB)^eHnJPI%rV%qr6vO?xHL7dLC(^ zKBQ~VK$mh)xvouzAzzer%F>AsUzg9%3zF+>L*(DHgB1-VU}`D0%-3m%Jt5^N;4}g> zRMltFpx5WV)Jf2(-Jz4ZfQHU*Xu1{2EU86<!oO?Ru2uRUZ9LogE6RiQm+gU39;^?1 zHtGrShu)JVk0i+#7X-=Y<_(e0fQB`ofmb5*=M>OzJ9PZ`uW+c(iR$`H8jSi(oz#Cf z_`XxhTS)`>Z^oYWW1y#S?W+ra=zAsqsB0_PA7Y&|=rCwu8L&NYEfa$ly2PJ)vS>+| zeC3`%`2uKI4;t25HT<*BNO@NoXmH|42hhO!Oq~=Bon+K!(qPnQ(qPnQ>ZD#<75*1$ z<Ij4=_67Z{Dj*F8)TYCzE3S0#o;2{<lH)I5T^Jx=xjRt)V?Jn@J4F6c{=NJZ)tNLT zfCkvuWV}m#rcPpg4ntj_PV$3JV*709q@LSwVuFT$ZN1c<_@jTnV&K4mUC~F$BOTO> zbSX2WgMA*lq=oO;)*AgX`mw!bpMlp~x&CtVVt=^_G`tKNHh_k=AIp&E&Omss<0=K6 zvr#5~Y@b1c(Z}fdjuyE#|EVtw`40#P=)tlufc2Gl6F1^+&_dl$ea~?X^(NaYwr#xL zS?VX>1Pw)t1LVeqf$}BLP`f@q1f8^cc9>i-Yp7h75-#mC!evfUgml>MkjFngAW4I3 zA4An==p<fs;SYVU<RAE~B<{qEE^#8>tPkX~Q6|*!uKi>7he#vkf9JAbSqvK901dA% z0u87Otk0x@^_e>9G3Zs&u!=OK4wd)K1P#d%a&c0mqJem_kHPlY=wl2-`-bZZ`KQic z8^(SFVZ(+E^2HZll<b!pV3Y^lYt<9X%gO_PPn6s3gXP;xKm+Q+YoOtudVQu&T5AiI zYqEmnqnRP{!Sqmhe_EJyfQEZP!&1<&2sH4j-N(2SbpzKG`iJ;K7L@!$uJcICz4zWL zUwY{!MUO!P-K)_-nkZY0>pb|H+>tj}mVkz>ph4AV&_JDJ)aR$6lb*~9k&k4C$_GHh zO3<(zG~`2$mRKSbqSQ%YE`5yGQ15YFq5p}$A^(Aafjx)=@x-c-DjHZWu5?_BmfwD> zlwWRtT)wv=TyC@b$*p>QrcN^I^Rv)Nq~QsjhQC3MR?Z5O1t}U0L{#-L(BB>fSOa}^ zS;`M;$vz+3v&_-{uEsis==AjT_lYa(BkRE8#fudUuJTozmfB^)XX*sjh2OhAefO2B zJ_hS^p<bVB#k*$zhxoJXM~oQ3a*+S{$3Ilxi+vi*56HQ5=T^~hEjq4MCd7w2>2>O) z->c7{fma>8uIp8M@(F8gwnKNyo;`cYgoFf%wHcEAy6o(1X|-DAiWMtVy~dP}(mU)6 z)kO<=&$fZOihUvWM>!tg#rnMeIh(A!gz?6@xvG73?PENq*XLEJ3%u$=)_8}x3KRPJ z<MFKU@6)HxAS~@k$5yvx=trw^c;=aB<d`vIB-R$m!oorco05F+!3PyS9N&}Qq=9V# z+X>1QfnylbKz&L%WLrocz3YgOhn^??=jHp)&aLiapf0eF!TL;{^!WT3qW`<&FU<WF zz!bWK@&j34jdA}#tb=(8by&hrVox%OIwAQya^y(W@4<Q)r9X)~ab+2i1_Stx{HE-2 zoWs5y%YyZRbz0SDlmpvmqdrq7xz^_ow>-su;1dR~ujTst`#*>^J!&3=dFypqVvQnC zaFm$SlDFP^t3=;g;X*vv-*5%eV1PjfU8YB%Oc`lYxBhF*H2HRZDB5SOkHPl&#YN$A z%L6my=O1jA=YRR-Bb4`b&p%)-rOeCAJBu|+a_Q2gzua-h9WpH~P4OM$N+nCAf%Ss( zKE#c5)TV`V5NwAj_v|CFu5dnL8^)7-$37C<3DQ!>1r}U9&hq-B^FK@rb@yq^QJ%Qx zo_j76PplhNz&dTv(7ShUiM4C09N1=1=Gpf#=peqtpE6H6IX0ln`oKEE`e2j^UCJQ) zCPv%Cu{X!hke5F+|H-;V`G+j6#d@*Btf#Pu%Y_RUs&XI=)T@|Vmbc%2yL!(uAPokP z24mdIF(v!hlzZYymoh}!4Ef@F_NmzChA#OV=AH&&o#Fi)L;M;1Dfa}*66c#q6LI65 zGuGaz`Wqe|E<-~@C03`Xa-cus7&Oo|<jN=$qn@yS5O>3+9C6G*xne(%WoOK90Dqd> zngXupQu-5guYd`lD|nd4`dnOGtY{#AIB$shp=d}<Oq8QWjZ(4&o4mrGye7{{3-M+> zp#I@|ju9w7>}zjBJzyPRonX4u!NC18(#dPru3ad~{Ta+VIe|27KD6sx&!zegh77X* zWAK&uoH%hp;e)c3=v#1Av8oR!ZwYx*GQc*9d}eq8pGgDtD0xc#|LUu+%2!@_MYVzd z{O3PaJkAk-PfqBzsc0h?0{0zwcOQ_Z-Q#-gH|>cp`#;qGsE;f8%=$)`xUk%*7a*sq zF9AD=(ygfLs(qubp?p*3h(GHA>m|#Ca>6p;d=~wUi}y^IWyJDedk%Wn18?e0+6k}s zQurHkO4n6}NrM5zjdW3lSQqZQ?>-5gCD~59Uc}7+#-W~}F5*S`;h2a(+)39{Pd&vs z#;5Ta&mYB|G%Ea!{y+GgM;Z*hXwYKNK$rZcZbI9w#tD=uwzaPOC9ZrX{wy1#4?(*Q z<({%cp0f@?XFLi#{tWI__`AwKb%bkq)Kw;=i*xK#rc9Aom#gI4;JK^IaFiv=I^VMm zAnt~J1Y@K%e*t%eKl3ogzi4|_QZCsBkq*{D@`?I`x{mFUYnhO@n>TNkk3asnl4tVU z0Mbp_VclWBiO-Z7rpLAbI`esa>h)*&PTYC5CqAz2BJnqXG#GHLGGQ866Rpyrj4=*r zBfgZaZP1;h#lRi?)93!AylYrj|El>P)GsyuMf;scTF8I81|4(_I_Q$8)Gw?H1eOio zu^gy7Sx;GJ)J3!<&;~_X$am!NXY@=p#x?I0{)YUcuh4^hB3!FX*uQ80hjh^{N1$xc z-L-3%(!1mV>nr7*__H2B9-l?_e^q8&DQHiA8uOpf6IJs+q=9WG`!CdglmoU$Y&*$g zjycJDmIM0&Mmg}AI-k0hdJJO<W!C`B|8Cq#hmwC+*{Ch&#<NjxU0upLpBaW_L769? zNh4()a&#Ge1SiUh?JCz;{E@ba`2F5>0|Iaj!haH&2iHDuoyK3jWG)()ZS&?;iiYxX z$h>(c@qJFY=HgC0|NC5bJv}$w#n&&$57%FGjr5H4UGUCj@^~)M-IIUC&C&6cn(L;! z?z-DhcTKw6S$9KpH%E7+=DN}C1$@kaP{5yDr^WR>?B5b7&sXg$qNJAqFbgiv16(gY z)1p#)J`l;(c`>hc7z=u%&5yQNEMw8%kHDON7~XpW*ynBosFG8r{Y8b8b7AWl@rh<* z<6JOp3Ikx<nS#0DPkvS?T?+@&+7Y|4560MT4(fCT^%?q{zd+xXqAfTLy>t})^Jg$m zmWn=b1j6?RbVYyT%naB#XeZ-bXej1yY4fJN`0!aN_hVKL-y`w*5#g_Pb%G9Ghde8& zKdB=*ULp<z!-k>v`7cASo`uf+2zv7^CQO?t?Txfs)4swvaoUGIJ}2b?(0(1Z-p<t1 zm{&-|+|xwjz`hg5o@^hf*Vz_PSF<n6ehU3~&ucPlRkV51)<zo-?VYqy(Y`~wKW%Kh zu0}lGcjg!XW6*Sr7gE{&vR&gim-(_EO`hoVtG<(#qV`LB*&Ud>rM-`~ve(O9ee1lZ z5zAE`RQ?<fvX4L@4g~6V0(rvr>xXZS%IED9m0g1K;k>5(0DIT>n%y)GIMD9PH4vQJ zr_I-pN7{R7XAFY-aZQ=*%r*t%*F^MlClU_>7nVQ!z{G{^&(_Cgt2u4joH-|N<WC&# z1P-)&(tfVw5jfD+MjH?1kv1yYI%y}IggSz2k6tF7*^Xo0B^}@2rLt`%7&x%cL7uR0 z{mSBSW$UAThVzKLm^Xp8SK5zh^K+F)u4SQ(hPFQ1m?)24#VYD~BY*aT4ErM6Rrb@2 z{+oddV{l%XbAjtHpGli9zNM2(P{&+xpgc~jC68FYuj&NX(oi02+37knf7nwJF|RPu z6%Xc3Ij75u_BPr`XfLFlYV#wRziTu6{t`|?KLML3aNv3#)(P5dc^UMxUx72v(sOch zQrQP37<h2rguLLz`E}ZwXyc%*jCLm4H)toLjfu7m+Q?{MS~y*UhnJ>E;-KUac2~pp z&GcOJrw$;nZ$og!gSfE#x8D~cY43U!IB-srbK|tJP#$ULqJ4$7MrGsD^Iw!Sj9IBV zVaVeU@Bvp<`Lk~ZJ47PByPQZ}!0|r&=cJpskOy=RtxHjML)xooyQR&Lw&$mGdm-xt z?IW}m=E6p0@PL`Q>S)?-aaGAb>lVK4O^5zZWnHA+;kbZfJMx6Ohx|C_{7k<8K&-M8 zaDJNdNE<%qrj0s5I}>evw3FrNI54x=6Pg`=3i3X7fp4mGP-pfpDTAzs?DNwl9t84( zKs?ANmczBKk9Pc1*-UAx%L5Lym)5$j(0|O|;cz7W{qKLDNZSzm<HUnJ=eU|<YR;Py z5AuTgh<?0izvVgrqfXQ%j|`{FT3t?O_OUTvk&gM6+2q6h_usGd9`!EUKk9$V0{KB% zWZuMu7wg22Umcb|eDw+HL@jwlouEAOsw-nd{y84!JO}4=$zzVMP#4vBi*=JY8Rg?z zHY|(xR>#WnQ-|f5uRp1lN7M=0uPKjDES|*d>ump_TiM_4%=}@C_%bAfy}EhIHjO<M z<nraq)%cD$Q7^I{5D)Tz<wM?_bsm-b*3Ob|+QZaZ07D+1Sujk#`cS4UJB7|kwXD@( zLvV1g59WIpkPg@}Gp0?Owj1AX%UQE#sd-?mkyLXR#@L5ECqKx4j_)W7<OlJueKAdh zI|SKsZEI`f&j;AWCZOJ{aUk1z+GS{4LO)Al-M6CK7=IBD0{KBaYL^Z1W4lG&!Eq^) z9|U0k?pjx8jzQ7?_@1^z+9mLvspR}CahNk_j^aD@0oy^QZO8!gqFylSD%y!k*kxuw zmb1}Ex{OS@=IQswRGrBy@O~8z;n_tS59jFd!M|i#(7uLtS>?n20Qt`R3G9=xk7l@N zt1f|`_aLpOV6XTAd2=Z6dzX?w)<LGlz8(3^xm?O1=hA7{VErJT#@rRlfO>)Phzof^ zy-l4-JhyGzc0V$1{(G6jU)6uuZxity-9+ZiG+EBX0s90<>?<Hgj~=aXBMt<HVI5#N z$_@KT)E8Wrh`I2!NS9-U>$#NvrT)P>`c$TO0(0_g^Qm)aTfm+L%ErukLHu};55^oX z`^&Vcu-^_Eo<yeCn>X=O`5W>~z7mKBf%&mL!X61qH*l>gX{XGwyvS?PO`VLnm*@Uq z-YS3Q16`x^e_ePOePDcZAo0DUnk#0%kaJFy$G?!b%AfQa?Js4C^fFBXbsp;+>o)16 zjB))A*IwYe0Hq)PB;CxLS7*{+oA0jtXBiNvd#U?a&e#)z^7jMg!wQfF=TH9Z#cxeo z{7GQ_`aS)2RlF)Y<C|T#s_%6>=YkgiH-NYfU^pXAXG9@{;GF?ExF^WmI`&}6z2duF zv$)!YwOUNO&I|Gw{?t=Xy$&1AdFZGgu`c9q&pr2C4ZQ;!z!{{G@xlu)sP_otv2NYE zD9mTS^YY6ttMWA3FqSiP`X{cL(Vm9&&zxud6=|G={GDSx<k*<<`U=J%ap>1^U1JEw zR!?9Yh--_H2E$UO*@rXwGe(`FE=$0;iDM?tAsj-t#uw{4aT)z%LHhyoVqK$NB2Zo# zmscW&CmaKB(Yj>no&NI++|ATYtVhI^eFw_+fw!NPt24B|;dFic#_=P^uN*6Itm2Ka z(qq7jwpNbGi96+=`Tk>Zl<MQ0#Te`f;LJ2Q7U$TDa}gZ(aop*LaVO`f*{34j)LXnb zhT$0MwTI?Nrr~;(LB(=Thw}&=vyp!+C$>TC2l3i^Z=~vPas0ut2gg3_>vFvD(vt;} zX>c4q0(h|eu=k9zb5n<r4=3MUD>vs3QR7MW-Pv#FxPfD*MV8?zkGK<3Zos$}-+9ZN zoE)`AgmyKSCFRB7zY2_>1KT&Me*Yqjee{dO7Lk8w7nI(jO^)ja7}t=wO^bu&_a{G6 z{NxxaKSkw#&X6C<9(6tS4$BhXt}C8WSF<dS?|4SOx^%c&&%I{;NcsL-&olcXBR;-e zQGGS)FUk$|Hv3#G59(7_TzJp6+=xq;;f?Yq?~H!e3AB^UpY0LH2~3-M8Et=#YkcZy z;>~o(3;3)0#5SArNsP;JHrsC4Vrs-?I*S{=6xISD+;tFeuLedKh9{U9)(sPxW;4!( zg|g(1Yi<HN=&C2~w^k2+eCMflTXTn>_Qbu`Jg}n?pUi5fwfcHUJRwX2J)~Lfver-p zC1z*i{PDB}=J~VJ(zAzjwPmFTWKW-InVp#3XLic;tc>i8WNRNBZ5EK2J-hGR{$0&D zbT1{@l5L%cgA8zD$B?f5`+9c`Zr0dr4zgz90CS#6ah<98Xz>s;8)quwsEY+E9W$<= zEDO#%#OV!5u~{i|anivIOLmo~t9PV2juD8A!uf4!<~05e>6(}wl|DCPmL;pJ*_IME zeL9YE8PYX5F)iEDH8`kWRoXQpSEcU~;)>jZ`qjWSs9zP)h#u6>;Ae1bSZr8CMAYcv zx8JVc{P+3a#}D>CsBG$cH}Sr~yR&x>Z!hmq?^y5Y-p_dN@c!7l(z`+boBRLVf82ms z16~}kb-<nhKM%M(pt(<k&m<p<&te~k&sv{%d_ML$?PKz7?K{YKr0-1MeBTFspYeUi zcen2szNdVD^u6TUXkhb!=7D_&`V72p;Nt`L4)hrmJSbsM{-EQ7P7i7|IAU<j;PHb~ z2ImicV(_8C=La|N8|k;$Z?E48zbyZU{9p6m=^q;Kb3jFaTcBrP@4%-5pAUR1@V&tI z1CIrM8(0?DFsNlv&!7Q8qk`gt5`r><Y(e)1Z425PbSCJ0P>UgLhYTH3I^@g{x8Qq% z?ZJ-*uM2)R1Qi;mGzl@=`$<r_$@{(j@dLXL8ZxM8@U6)84S&CY(15W4Qv+-P`vY19 zIf6DKz1=~FgH8sW4*EIBV@Ok^dgqYoLuL<oXNY(3px~h3p}`}9M+Z*`o)SDgI5l`q z@ciJM;QNB_4}Jvsy%fADcuVm1;P-<+4*oLu+u-xTzXrR7Gz{q!(k;X*q<_fBkUK(V zgk*=<Lzag;7P3C%)sRm@oFV5!fFQIF)Q@Q5-Nrl6JKcMc_r2aPcz@>Y^j<&U(*frP zwDFnm^Mp^a&mN!4KFxjoe4~6P`cCzo?VID9=X==qTi;y+4-EWb;7x<N4(c~(;GnEQ zD+g^F^zNXa1~nf%ZE%oZgx?gud4Bu+e(`hjZyMkanxg}z1Y`#+3Aiudg@8=~?*|+Y zI2G_ifC&8m+PnUrs>(PF6Acv$4Ga99VxgkGU(Px2Iqz4Th-fs?X}XE&4E1Ut*wom> zb!CL8=){<!q23r0GL~p&WXkRc4V^A6GjsSQ!?dzAXKKW<&&59@?k{({+d1$1JfG)z zK0ABQJ~v)uiUx5>+z@ecsEh}$89b&>kkh3fxZWbalb2<Tic`bXNR_CtGAf|<s{@MZ z6yRi`_5l}L^e!C$E)MB0I=Q&0TXmcM71-#|J<anb&WtdVfC;||nv-y1_|SBi&>>bl z;O~b<gCb9(-_av99y9F6MYsZgi1*_I_y|6Rzr?5Td3*_9!8h?AxE(*i5u_J+mc)=a zGL*y<N~Vx$WH!klnPe$hK~|Hsq=b}`9V9@4<RrOD!f7OprhfV!-9mTMAU#1((;umA zaci!%0Q9`cDz#i&+0*Q7dmU)_Z#&8v;w*C3I_sTEr`D-=8lC&j6DNjE0&YKMt*pD- z*PZRobC<XsuIHtDL4Kb17O`TuK*AFf#XF)vl!$%efM^0050*3JBH;196slI8Qd&>d z^K_2hsJ8)c2SGbO>%00d{jct3`WeqG1ih>`--a}j9u^illp2nfp+>Y07<q+EAT!7& zQfeKwKDVRUi|nHN#O=+8^9KG4UoPX-ICVq)seF2so@!>A2PQPsVJqB&piESPuHz{r zhpZxdNgMf%gwe@#I?bnL^boyBdswkninY|rvFfek;O<A(D0{lS#@XZScg{EiS%Ev( z%l2BmIG(`Y;;Xrzm+}f&_W>U+=8L6bou~!ZM#yXOrqudXJrf*Kt*`3adX%w@Hq$@> zu#w!(nX+L6@EA<7hc!;d^-$?=ptdQ1Z86zEwv$RyOAe7na*Nz0?PLHQLC4d@G>5LC zhrtu4V6V?v1L5_zS=Jj+!EM$KYoE0O)Stm}*cKLGpRf~9rIBtsA0%dpd{H5)#c|Mh zcX>!As#3LE_1ELI3w}PT@8}5A8&n!=2AN@IipepXO_?b-6((S+OpU2C^`_l~9-KnC z5{4pBB#J_BgJa9lUQ~r@P#ro8>K%m<wy=vOP6AA+I1O(HB?oX7uEDWn2x$g1_sL@t zN&C<t^ktez9V%%GO{1^V`E(he%cBK!GdTVR?Vx^8;%57x-EP0{yveSxFn6b0D7VWR zc~qY1OsW@Dg5oL-(kfRKs4`Wp8q{eODs~!dGaPo-1Zk3nGx0`TY3;N}vuw7L9c8<{ zp0W?*YJV9g2g{e_NV!+m$rJJ?IaEznmz4+Z?a+5ZwF*4dUw_D_R(ymM(a-2vNTadV zX{*DEw=3-)&M0T1lj#&WUpuj^iJfIDAlY~D0<lXpimzbaAB>yp)L(Cuf;Zq#@%K1L z$3SLLhdIJAaP?$ouCv^E*Qs)@fzNue(QGZ-#~RsX_Ka(}#?5xuxP@-Bd(rLZF)!K6 z^7eSuUYmD`U*WfSUxCFEu|kB)1eqbT<Tz!iBsE24s1MXf>WFGm*}7T(pd-y#^G^s< z5N4&oS2*f}l2Hci>NQB1b9fAyL#jy*EwZcZhjur}Rn8``Tz56BzRukStHVX-p8f~z z0^rn#vv4lXhrGG~>D0#WfDbx&goqL`Vi2TiqOgP%$s$e66d91QSz;yVun=+q?sNU= z5RoVo4f<+<jsU;ids??hlz>u^4;7+fP*w|SgBnKS1W;Bw&cJ!N442~uSn)Av%7r~= z5`SmXT?aQ0qe-A9AI!lB4~v0pjYhF3!A`W1ZP~6Z?Ib(dPPNnQJTH&ugMSNoF)!g; zc^NMUCkJ>Hui<sPo*xERALBvZ%v<;wevV(@mv}3`4jtn*;JgP&9|P7f5dl3rN<;(V zSin3C($5kupiTnZsen8ku+IVX3jn_l7{~<<@_+?D@K6j)Y!zjq9K0D2RiZ}JiF$Du zdeJcv6wRVVoDt{51?Wt!OqFw_Pv*%AP=6hC?8CA_9+N@UtX$~NNje!ibec|w#F+zK p+NZO0u3ia!I$!&Bp)Q8rR25QU*QbktE(W?7=whIYf&T>q{{c%Cm0JJ+ diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/w64.exe b/env/lib/python3.7/site-packages/pip/_vendor/distlib/w64.exe deleted file mode 100644 index c41bd0a011fd760ce20ba795d9e535e0d2c39876..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 99328 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 B=L-M; diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/wheel.py b/env/lib/python3.7/site-packages/pip/_vendor/distlib/wheel.py deleted file mode 100644 index b04bfae..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/distlib/wheel.py +++ /dev/null @@ -1,988 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2013-2017 Vinay Sajip. -# Licensed to the Python Software Foundation under a contributor agreement. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -from __future__ import unicode_literals - -import base64 -import codecs -import datetime -import distutils.util -from email import message_from_file -import hashlib -import imp -import json -import logging -import os -import posixpath -import re -import shutil -import sys -import tempfile -import zipfile - -from . import __version__, DistlibException -from .compat import sysconfig, ZipFile, fsdecode, text_type, filter -from .database import InstalledDistribution -from .metadata import Metadata, METADATA_FILENAME, WHEEL_METADATA_FILENAME -from .util import (FileOperator, convert_path, CSVReader, CSVWriter, Cache, - cached_property, get_cache_base, read_exports, tempdir) -from .version import NormalizedVersion, UnsupportedVersionError - -logger = logging.getLogger(__name__) - -cache = None # created when needed - -if hasattr(sys, 'pypy_version_info'): # pragma: no cover - IMP_PREFIX = 'pp' -elif sys.platform.startswith('java'): # pragma: no cover - IMP_PREFIX = 'jy' -elif sys.platform == 'cli': # pragma: no cover - IMP_PREFIX = 'ip' -else: - IMP_PREFIX = 'cp' - -VER_SUFFIX = sysconfig.get_config_var('py_version_nodot') -if not VER_SUFFIX: # pragma: no cover - VER_SUFFIX = '%s%s' % sys.version_info[:2] -PYVER = 'py' + VER_SUFFIX -IMPVER = IMP_PREFIX + VER_SUFFIX - -ARCH = distutils.util.get_platform().replace('-', '_').replace('.', '_') - -ABI = sysconfig.get_config_var('SOABI') -if ABI and ABI.startswith('cpython-'): - ABI = ABI.replace('cpython-', 'cp') -else: - def _derive_abi(): - parts = ['cp', VER_SUFFIX] - if sysconfig.get_config_var('Py_DEBUG'): - parts.append('d') - if sysconfig.get_config_var('WITH_PYMALLOC'): - parts.append('m') - if sysconfig.get_config_var('Py_UNICODE_SIZE') == 4: - parts.append('u') - return ''.join(parts) - ABI = _derive_abi() - del _derive_abi - -FILENAME_RE = re.compile(r''' -(?P<nm>[^-]+) --(?P<vn>\d+[^-]*) -(-(?P<bn>\d+[^-]*))? --(?P<py>\w+\d+(\.\w+\d+)*) --(?P<bi>\w+) --(?P<ar>\w+(\.\w+)*) -\.whl$ -''', re.IGNORECASE | re.VERBOSE) - -NAME_VERSION_RE = re.compile(r''' -(?P<nm>[^-]+) --(?P<vn>\d+[^-]*) -(-(?P<bn>\d+[^-]*))?$ -''', re.IGNORECASE | re.VERBOSE) - -SHEBANG_RE = re.compile(br'\s*#![^\r\n]*') -SHEBANG_DETAIL_RE = re.compile(br'^(\s*#!("[^"]+"|\S+))\s+(.*)$') -SHEBANG_PYTHON = b'#!python' -SHEBANG_PYTHONW = b'#!pythonw' - -if os.sep == '/': - to_posix = lambda o: o -else: - to_posix = lambda o: o.replace(os.sep, '/') - - -class Mounter(object): - def __init__(self): - self.impure_wheels = {} - self.libs = {} - - def add(self, pathname, extensions): - self.impure_wheels[pathname] = extensions - self.libs.update(extensions) - - def remove(self, pathname): - extensions = self.impure_wheels.pop(pathname) - for k, v in extensions: - if k in self.libs: - del self.libs[k] - - def find_module(self, fullname, path=None): - if fullname in self.libs: - result = self - else: - result = None - return result - - def load_module(self, fullname): - if fullname in sys.modules: - result = sys.modules[fullname] - else: - if fullname not in self.libs: - raise ImportError('unable to find extension for %s' % fullname) - result = imp.load_dynamic(fullname, self.libs[fullname]) - result.__loader__ = self - parts = fullname.rsplit('.', 1) - if len(parts) > 1: - result.__package__ = parts[0] - return result - -_hook = Mounter() - - -class Wheel(object): - """ - Class to build and install from Wheel files (PEP 427). - """ - - wheel_version = (1, 1) - hash_kind = 'sha256' - - def __init__(self, filename=None, sign=False, verify=False): - """ - Initialise an instance using a (valid) filename. - """ - self.sign = sign - self.should_verify = verify - self.buildver = '' - self.pyver = [PYVER] - self.abi = ['none'] - self.arch = ['any'] - self.dirname = os.getcwd() - if filename is None: - self.name = 'dummy' - self.version = '0.1' - self._filename = self.filename - else: - m = NAME_VERSION_RE.match(filename) - if m: - info = m.groupdict('') - self.name = info['nm'] - # Reinstate the local version separator - self.version = info['vn'].replace('_', '-') - self.buildver = info['bn'] - self._filename = self.filename - else: - dirname, filename = os.path.split(filename) - m = FILENAME_RE.match(filename) - if not m: - raise DistlibException('Invalid name or ' - 'filename: %r' % filename) - if dirname: - self.dirname = os.path.abspath(dirname) - self._filename = filename - info = m.groupdict('') - self.name = info['nm'] - self.version = info['vn'] - self.buildver = info['bn'] - self.pyver = info['py'].split('.') - self.abi = info['bi'].split('.') - self.arch = info['ar'].split('.') - - @property - def filename(self): - """ - Build and return a filename from the various components. - """ - if self.buildver: - buildver = '-' + self.buildver - else: - buildver = '' - pyver = '.'.join(self.pyver) - abi = '.'.join(self.abi) - arch = '.'.join(self.arch) - # replace - with _ as a local version separator - version = self.version.replace('-', '_') - return '%s-%s%s-%s-%s-%s.whl' % (self.name, version, buildver, - pyver, abi, arch) - - @property - def exists(self): - path = os.path.join(self.dirname, self.filename) - return os.path.isfile(path) - - @property - def tags(self): - for pyver in self.pyver: - for abi in self.abi: - for arch in self.arch: - yield pyver, abi, arch - - @cached_property - def metadata(self): - pathname = os.path.join(self.dirname, self.filename) - name_ver = '%s-%s' % (self.name, self.version) - info_dir = '%s.dist-info' % name_ver - wrapper = codecs.getreader('utf-8') - with ZipFile(pathname, 'r') as zf: - wheel_metadata = self.get_wheel_metadata(zf) - wv = wheel_metadata['Wheel-Version'].split('.', 1) - file_version = tuple([int(i) for i in wv]) - if file_version < (1, 1): - fns = [WHEEL_METADATA_FILENAME, METADATA_FILENAME, 'METADATA'] - else: - fns = [WHEEL_METADATA_FILENAME, METADATA_FILENAME] - result = None - for fn in fns: - try: - metadata_filename = posixpath.join(info_dir, fn) - with zf.open(metadata_filename) as bf: - wf = wrapper(bf) - result = Metadata(fileobj=wf) - if result: - break - except KeyError: - pass - if not result: - raise ValueError('Invalid wheel, because metadata is ' - 'missing: looked in %s' % ', '.join(fns)) - return result - - def get_wheel_metadata(self, zf): - name_ver = '%s-%s' % (self.name, self.version) - info_dir = '%s.dist-info' % name_ver - metadata_filename = posixpath.join(info_dir, 'WHEEL') - with zf.open(metadata_filename) as bf: - wf = codecs.getreader('utf-8')(bf) - message = message_from_file(wf) - return dict(message) - - @cached_property - def info(self): - pathname = os.path.join(self.dirname, self.filename) - with ZipFile(pathname, 'r') as zf: - result = self.get_wheel_metadata(zf) - return result - - def process_shebang(self, data): - m = SHEBANG_RE.match(data) - if m: - end = m.end() - shebang, data_after_shebang = data[:end], data[end:] - # Preserve any arguments after the interpreter - if b'pythonw' in shebang.lower(): - shebang_python = SHEBANG_PYTHONW - else: - shebang_python = SHEBANG_PYTHON - m = SHEBANG_DETAIL_RE.match(shebang) - if m: - args = b' ' + m.groups()[-1] - else: - args = b'' - shebang = shebang_python + args - data = shebang + data_after_shebang - else: - cr = data.find(b'\r') - lf = data.find(b'\n') - if cr < 0 or cr > lf: - term = b'\n' - else: - if data[cr:cr + 2] == b'\r\n': - term = b'\r\n' - else: - term = b'\r' - data = SHEBANG_PYTHON + term + data - return data - - def get_hash(self, data, hash_kind=None): - if hash_kind is None: - hash_kind = self.hash_kind - try: - hasher = getattr(hashlib, hash_kind) - except AttributeError: - raise DistlibException('Unsupported hash algorithm: %r' % hash_kind) - result = hasher(data).digest() - result = base64.urlsafe_b64encode(result).rstrip(b'=').decode('ascii') - return hash_kind, result - - def write_record(self, records, record_path, base): - records = list(records) # make a copy for sorting - p = to_posix(os.path.relpath(record_path, base)) - records.append((p, '', '')) - records.sort() - with CSVWriter(record_path) as writer: - for row in records: - writer.writerow(row) - - def write_records(self, info, libdir, archive_paths): - records = [] - distinfo, info_dir = info - hasher = getattr(hashlib, self.hash_kind) - for ap, p in archive_paths: - with open(p, 'rb') as f: - data = f.read() - digest = '%s=%s' % self.get_hash(data) - size = os.path.getsize(p) - records.append((ap, digest, size)) - - p = os.path.join(distinfo, 'RECORD') - self.write_record(records, p, libdir) - ap = to_posix(os.path.join(info_dir, 'RECORD')) - archive_paths.append((ap, p)) - - def build_zip(self, pathname, archive_paths): - with ZipFile(pathname, 'w', zipfile.ZIP_DEFLATED) as zf: - for ap, p in archive_paths: - logger.debug('Wrote %s to %s in wheel', p, ap) - zf.write(p, ap) - - def build(self, paths, tags=None, wheel_version=None): - """ - Build a wheel from files in specified paths, and use any specified tags - when determining the name of the wheel. - """ - if tags is None: - tags = {} - - libkey = list(filter(lambda o: o in paths, ('purelib', 'platlib')))[0] - if libkey == 'platlib': - is_pure = 'false' - default_pyver = [IMPVER] - default_abi = [ABI] - default_arch = [ARCH] - else: - is_pure = 'true' - default_pyver = [PYVER] - default_abi = ['none'] - default_arch = ['any'] - - self.pyver = tags.get('pyver', default_pyver) - self.abi = tags.get('abi', default_abi) - self.arch = tags.get('arch', default_arch) - - libdir = paths[libkey] - - name_ver = '%s-%s' % (self.name, self.version) - data_dir = '%s.data' % name_ver - info_dir = '%s.dist-info' % name_ver - - archive_paths = [] - - # First, stuff which is not in site-packages - for key in ('data', 'headers', 'scripts'): - if key not in paths: - continue - path = paths[key] - if os.path.isdir(path): - for root, dirs, files in os.walk(path): - for fn in files: - p = fsdecode(os.path.join(root, fn)) - rp = os.path.relpath(p, path) - ap = to_posix(os.path.join(data_dir, key, rp)) - archive_paths.append((ap, p)) - if key == 'scripts' and not p.endswith('.exe'): - with open(p, 'rb') as f: - data = f.read() - data = self.process_shebang(data) - with open(p, 'wb') as f: - f.write(data) - - # Now, stuff which is in site-packages, other than the - # distinfo stuff. - path = libdir - distinfo = None - for root, dirs, files in os.walk(path): - if root == path: - # At the top level only, save distinfo for later - # and skip it for now - for i, dn in enumerate(dirs): - dn = fsdecode(dn) - if dn.endswith('.dist-info'): - distinfo = os.path.join(root, dn) - del dirs[i] - break - assert distinfo, '.dist-info directory expected, not found' - - for fn in files: - # comment out next suite to leave .pyc files in - if fsdecode(fn).endswith(('.pyc', '.pyo')): - continue - p = os.path.join(root, fn) - rp = to_posix(os.path.relpath(p, path)) - archive_paths.append((rp, p)) - - # Now distinfo. Assumed to be flat, i.e. os.listdir is enough. - files = os.listdir(distinfo) - for fn in files: - if fn not in ('RECORD', 'INSTALLER', 'SHARED', 'WHEEL'): - p = fsdecode(os.path.join(distinfo, fn)) - ap = to_posix(os.path.join(info_dir, fn)) - archive_paths.append((ap, p)) - - wheel_metadata = [ - 'Wheel-Version: %d.%d' % (wheel_version or self.wheel_version), - 'Generator: distlib %s' % __version__, - 'Root-Is-Purelib: %s' % is_pure, - ] - for pyver, abi, arch in self.tags: - wheel_metadata.append('Tag: %s-%s-%s' % (pyver, abi, arch)) - p = os.path.join(distinfo, 'WHEEL') - with open(p, 'w') as f: - f.write('\n'.join(wheel_metadata)) - ap = to_posix(os.path.join(info_dir, 'WHEEL')) - archive_paths.append((ap, p)) - - # Now, at last, RECORD. - # Paths in here are archive paths - nothing else makes sense. - self.write_records((distinfo, info_dir), libdir, archive_paths) - # Now, ready to build the zip file - pathname = os.path.join(self.dirname, self.filename) - self.build_zip(pathname, archive_paths) - return pathname - - def install(self, paths, maker, **kwargs): - """ - Install a wheel to the specified paths. If kwarg ``warner`` is - specified, it should be a callable, which will be called with two - tuples indicating the wheel version of this software and the wheel - version in the file, if there is a discrepancy in the versions. - This can be used to issue any warnings to raise any exceptions. - If kwarg ``lib_only`` is True, only the purelib/platlib files are - installed, and the headers, scripts, data and dist-info metadata are - not written. If kwarg ``bytecode_hashed_invalidation`` is True, written - bytecode will try to use file-hash based invalidation (PEP-552) on - supported interpreter versions (CPython 2.7+). - - The return value is a :class:`InstalledDistribution` instance unless - ``options.lib_only`` is True, in which case the return value is ``None``. - """ - - dry_run = maker.dry_run - warner = kwargs.get('warner') - lib_only = kwargs.get('lib_only', False) - bc_hashed_invalidation = kwargs.get('bytecode_hashed_invalidation', False) - - pathname = os.path.join(self.dirname, self.filename) - name_ver = '%s-%s' % (self.name, self.version) - data_dir = '%s.data' % name_ver - info_dir = '%s.dist-info' % name_ver - - metadata_name = posixpath.join(info_dir, METADATA_FILENAME) - wheel_metadata_name = posixpath.join(info_dir, 'WHEEL') - record_name = posixpath.join(info_dir, 'RECORD') - - wrapper = codecs.getreader('utf-8') - - with ZipFile(pathname, 'r') as zf: - with zf.open(wheel_metadata_name) as bwf: - wf = wrapper(bwf) - message = message_from_file(wf) - wv = message['Wheel-Version'].split('.', 1) - file_version = tuple([int(i) for i in wv]) - if (file_version != self.wheel_version) and warner: - warner(self.wheel_version, file_version) - - if message['Root-Is-Purelib'] == 'true': - libdir = paths['purelib'] - else: - libdir = paths['platlib'] - - records = {} - with zf.open(record_name) as bf: - with CSVReader(stream=bf) as reader: - for row in reader: - p = row[0] - records[p] = row - - data_pfx = posixpath.join(data_dir, '') - info_pfx = posixpath.join(info_dir, '') - script_pfx = posixpath.join(data_dir, 'scripts', '') - - # make a new instance rather than a copy of maker's, - # as we mutate it - fileop = FileOperator(dry_run=dry_run) - fileop.record = True # so we can rollback if needed - - bc = not sys.dont_write_bytecode # Double negatives. Lovely! - - outfiles = [] # for RECORD writing - - # for script copying/shebang processing - workdir = tempfile.mkdtemp() - # set target dir later - # we default add_launchers to False, as the - # Python Launcher should be used instead - maker.source_dir = workdir - maker.target_dir = None - try: - for zinfo in zf.infolist(): - arcname = zinfo.filename - if isinstance(arcname, text_type): - u_arcname = arcname - else: - u_arcname = arcname.decode('utf-8') - # The signature file won't be in RECORD, - # and we don't currently don't do anything with it - if u_arcname.endswith('/RECORD.jws'): - continue - row = records[u_arcname] - if row[2] and str(zinfo.file_size) != row[2]: - raise DistlibException('size mismatch for ' - '%s' % u_arcname) - if row[1]: - kind, value = row[1].split('=', 1) - with zf.open(arcname) as bf: - data = bf.read() - _, digest = self.get_hash(data, kind) - if digest != value: - raise DistlibException('digest mismatch for ' - '%s' % arcname) - - if lib_only and u_arcname.startswith((info_pfx, data_pfx)): - logger.debug('lib_only: skipping %s', u_arcname) - continue - is_script = (u_arcname.startswith(script_pfx) - and not u_arcname.endswith('.exe')) - - if u_arcname.startswith(data_pfx): - _, where, rp = u_arcname.split('/', 2) - outfile = os.path.join(paths[where], convert_path(rp)) - else: - # meant for site-packages. - if u_arcname in (wheel_metadata_name, record_name): - continue - outfile = os.path.join(libdir, convert_path(u_arcname)) - if not is_script: - with zf.open(arcname) as bf: - fileop.copy_stream(bf, outfile) - outfiles.append(outfile) - # Double check the digest of the written file - if not dry_run and row[1]: - with open(outfile, 'rb') as bf: - data = bf.read() - _, newdigest = self.get_hash(data, kind) - if newdigest != digest: - raise DistlibException('digest mismatch ' - 'on write for ' - '%s' % outfile) - if bc and outfile.endswith('.py'): - try: - pyc = fileop.byte_compile(outfile, - hashed_invalidation=bc_hashed_invalidation) - outfiles.append(pyc) - except Exception: - # Don't give up if byte-compilation fails, - # but log it and perhaps warn the user - logger.warning('Byte-compilation failed', - exc_info=True) - else: - fn = os.path.basename(convert_path(arcname)) - workname = os.path.join(workdir, fn) - with zf.open(arcname) as bf: - fileop.copy_stream(bf, workname) - - dn, fn = os.path.split(outfile) - maker.target_dir = dn - filenames = maker.make(fn) - fileop.set_executable_mode(filenames) - outfiles.extend(filenames) - - if lib_only: - logger.debug('lib_only: returning None') - dist = None - else: - # Generate scripts - - # Try to get pydist.json so we can see if there are - # any commands to generate. If this fails (e.g. because - # of a legacy wheel), log a warning but don't give up. - commands = None - file_version = self.info['Wheel-Version'] - if file_version == '1.0': - # Use legacy info - ep = posixpath.join(info_dir, 'entry_points.txt') - try: - with zf.open(ep) as bwf: - epdata = read_exports(bwf) - commands = {} - for key in ('console', 'gui'): - k = '%s_scripts' % key - if k in epdata: - commands['wrap_%s' % key] = d = {} - for v in epdata[k].values(): - s = '%s:%s' % (v.prefix, v.suffix) - if v.flags: - s += ' %s' % v.flags - d[v.name] = s - except Exception: - logger.warning('Unable to read legacy script ' - 'metadata, so cannot generate ' - 'scripts') - else: - try: - with zf.open(metadata_name) as bwf: - wf = wrapper(bwf) - commands = json.load(wf).get('extensions') - if commands: - commands = commands.get('python.commands') - except Exception: - logger.warning('Unable to read JSON metadata, so ' - 'cannot generate scripts') - if commands: - console_scripts = commands.get('wrap_console', {}) - gui_scripts = commands.get('wrap_gui', {}) - if console_scripts or gui_scripts: - script_dir = paths.get('scripts', '') - if not os.path.isdir(script_dir): - raise ValueError('Valid script path not ' - 'specified') - maker.target_dir = script_dir - for k, v in console_scripts.items(): - script = '%s = %s' % (k, v) - filenames = maker.make(script) - fileop.set_executable_mode(filenames) - - if gui_scripts: - options = {'gui': True } - for k, v in gui_scripts.items(): - script = '%s = %s' % (k, v) - filenames = maker.make(script, options) - fileop.set_executable_mode(filenames) - - p = os.path.join(libdir, info_dir) - dist = InstalledDistribution(p) - - # Write SHARED - paths = dict(paths) # don't change passed in dict - del paths['purelib'] - del paths['platlib'] - paths['lib'] = libdir - p = dist.write_shared_locations(paths, dry_run) - if p: - outfiles.append(p) - - # Write RECORD - dist.write_installed_files(outfiles, paths['prefix'], - dry_run) - return dist - except Exception: # pragma: no cover - logger.exception('installation failed.') - fileop.rollback() - raise - finally: - shutil.rmtree(workdir) - - def _get_dylib_cache(self): - global cache - if cache is None: - # Use native string to avoid issues on 2.x: see Python #20140. - base = os.path.join(get_cache_base(), str('dylib-cache'), - sys.version[:3]) - cache = Cache(base) - return cache - - def _get_extensions(self): - pathname = os.path.join(self.dirname, self.filename) - name_ver = '%s-%s' % (self.name, self.version) - info_dir = '%s.dist-info' % name_ver - arcname = posixpath.join(info_dir, 'EXTENSIONS') - wrapper = codecs.getreader('utf-8') - result = [] - with ZipFile(pathname, 'r') as zf: - try: - with zf.open(arcname) as bf: - wf = wrapper(bf) - extensions = json.load(wf) - cache = self._get_dylib_cache() - prefix = cache.prefix_to_dir(pathname) - cache_base = os.path.join(cache.base, prefix) - if not os.path.isdir(cache_base): - os.makedirs(cache_base) - for name, relpath in extensions.items(): - dest = os.path.join(cache_base, convert_path(relpath)) - if not os.path.exists(dest): - extract = True - else: - file_time = os.stat(dest).st_mtime - file_time = datetime.datetime.fromtimestamp(file_time) - info = zf.getinfo(relpath) - wheel_time = datetime.datetime(*info.date_time) - extract = wheel_time > file_time - if extract: - zf.extract(relpath, cache_base) - result.append((name, dest)) - except KeyError: - pass - return result - - def is_compatible(self): - """ - Determine if a wheel is compatible with the running system. - """ - return is_compatible(self) - - def is_mountable(self): - """ - Determine if a wheel is asserted as mountable by its metadata. - """ - return True # for now - metadata details TBD - - def mount(self, append=False): - pathname = os.path.abspath(os.path.join(self.dirname, self.filename)) - if not self.is_compatible(): - msg = 'Wheel %s not compatible with this Python.' % pathname - raise DistlibException(msg) - if not self.is_mountable(): - msg = 'Wheel %s is marked as not mountable.' % pathname - raise DistlibException(msg) - if pathname in sys.path: - logger.debug('%s already in path', pathname) - else: - if append: - sys.path.append(pathname) - else: - sys.path.insert(0, pathname) - extensions = self._get_extensions() - if extensions: - if _hook not in sys.meta_path: - sys.meta_path.append(_hook) - _hook.add(pathname, extensions) - - def unmount(self): - pathname = os.path.abspath(os.path.join(self.dirname, self.filename)) - if pathname not in sys.path: - logger.debug('%s not in path', pathname) - else: - sys.path.remove(pathname) - if pathname in _hook.impure_wheels: - _hook.remove(pathname) - if not _hook.impure_wheels: - if _hook in sys.meta_path: - sys.meta_path.remove(_hook) - - def verify(self): - pathname = os.path.join(self.dirname, self.filename) - name_ver = '%s-%s' % (self.name, self.version) - data_dir = '%s.data' % name_ver - info_dir = '%s.dist-info' % name_ver - - metadata_name = posixpath.join(info_dir, METADATA_FILENAME) - wheel_metadata_name = posixpath.join(info_dir, 'WHEEL') - record_name = posixpath.join(info_dir, 'RECORD') - - wrapper = codecs.getreader('utf-8') - - with ZipFile(pathname, 'r') as zf: - with zf.open(wheel_metadata_name) as bwf: - wf = wrapper(bwf) - message = message_from_file(wf) - wv = message['Wheel-Version'].split('.', 1) - file_version = tuple([int(i) for i in wv]) - # TODO version verification - - records = {} - with zf.open(record_name) as bf: - with CSVReader(stream=bf) as reader: - for row in reader: - p = row[0] - records[p] = row - - for zinfo in zf.infolist(): - arcname = zinfo.filename - if isinstance(arcname, text_type): - u_arcname = arcname - else: - u_arcname = arcname.decode('utf-8') - if '..' in u_arcname: - raise DistlibException('invalid entry in ' - 'wheel: %r' % u_arcname) - - # The signature file won't be in RECORD, - # and we don't currently don't do anything with it - if u_arcname.endswith('/RECORD.jws'): - continue - row = records[u_arcname] - if row[2] and str(zinfo.file_size) != row[2]: - raise DistlibException('size mismatch for ' - '%s' % u_arcname) - if row[1]: - kind, value = row[1].split('=', 1) - with zf.open(arcname) as bf: - data = bf.read() - _, digest = self.get_hash(data, kind) - if digest != value: - raise DistlibException('digest mismatch for ' - '%s' % arcname) - - def update(self, modifier, dest_dir=None, **kwargs): - """ - Update the contents of a wheel in a generic way. The modifier should - be a callable which expects a dictionary argument: its keys are - archive-entry paths, and its values are absolute filesystem paths - where the contents the corresponding archive entries can be found. The - modifier is free to change the contents of the files pointed to, add - new entries and remove entries, before returning. This method will - extract the entire contents of the wheel to a temporary location, call - the modifier, and then use the passed (and possibly updated) - dictionary to write a new wheel. If ``dest_dir`` is specified, the new - wheel is written there -- otherwise, the original wheel is overwritten. - - The modifier should return True if it updated the wheel, else False. - This method returns the same value the modifier returns. - """ - - def get_version(path_map, info_dir): - version = path = None - key = '%s/%s' % (info_dir, METADATA_FILENAME) - if key not in path_map: - key = '%s/PKG-INFO' % info_dir - if key in path_map: - path = path_map[key] - version = Metadata(path=path).version - return version, path - - def update_version(version, path): - updated = None - try: - v = NormalizedVersion(version) - i = version.find('-') - if i < 0: - updated = '%s+1' % version - else: - parts = [int(s) for s in version[i + 1:].split('.')] - parts[-1] += 1 - updated = '%s+%s' % (version[:i], - '.'.join(str(i) for i in parts)) - except UnsupportedVersionError: - logger.debug('Cannot update non-compliant (PEP-440) ' - 'version %r', version) - if updated: - md = Metadata(path=path) - md.version = updated - legacy = not path.endswith(METADATA_FILENAME) - md.write(path=path, legacy=legacy) - logger.debug('Version updated from %r to %r', version, - updated) - - pathname = os.path.join(self.dirname, self.filename) - name_ver = '%s-%s' % (self.name, self.version) - info_dir = '%s.dist-info' % name_ver - record_name = posixpath.join(info_dir, 'RECORD') - with tempdir() as workdir: - with ZipFile(pathname, 'r') as zf: - path_map = {} - for zinfo in zf.infolist(): - arcname = zinfo.filename - if isinstance(arcname, text_type): - u_arcname = arcname - else: - u_arcname = arcname.decode('utf-8') - if u_arcname == record_name: - continue - if '..' in u_arcname: - raise DistlibException('invalid entry in ' - 'wheel: %r' % u_arcname) - zf.extract(zinfo, workdir) - path = os.path.join(workdir, convert_path(u_arcname)) - path_map[u_arcname] = path - - # Remember the version. - original_version, _ = get_version(path_map, info_dir) - # Files extracted. Call the modifier. - modified = modifier(path_map, **kwargs) - if modified: - # Something changed - need to build a new wheel. - current_version, path = get_version(path_map, info_dir) - if current_version and (current_version == original_version): - # Add or update local version to signify changes. - update_version(current_version, path) - # Decide where the new wheel goes. - if dest_dir is None: - fd, newpath = tempfile.mkstemp(suffix='.whl', - prefix='wheel-update-', - dir=workdir) - os.close(fd) - else: - if not os.path.isdir(dest_dir): - raise DistlibException('Not a directory: %r' % dest_dir) - newpath = os.path.join(dest_dir, self.filename) - archive_paths = list(path_map.items()) - distinfo = os.path.join(workdir, info_dir) - info = distinfo, info_dir - self.write_records(info, workdir, archive_paths) - self.build_zip(newpath, archive_paths) - if dest_dir is None: - shutil.copyfile(newpath, pathname) - return modified - -def compatible_tags(): - """ - Return (pyver, abi, arch) tuples compatible with this Python. - """ - versions = [VER_SUFFIX] - major = VER_SUFFIX[0] - for minor in range(sys.version_info[1] - 1, - 1, -1): - versions.append(''.join([major, str(minor)])) - - abis = [] - for suffix, _, _ in imp.get_suffixes(): - if suffix.startswith('.abi'): - abis.append(suffix.split('.', 2)[1]) - abis.sort() - if ABI != 'none': - abis.insert(0, ABI) - abis.append('none') - result = [] - - arches = [ARCH] - if sys.platform == 'darwin': - m = re.match(r'(\w+)_(\d+)_(\d+)_(\w+)$', ARCH) - if m: - name, major, minor, arch = m.groups() - minor = int(minor) - matches = [arch] - if arch in ('i386', 'ppc'): - matches.append('fat') - if arch in ('i386', 'ppc', 'x86_64'): - matches.append('fat3') - if arch in ('ppc64', 'x86_64'): - matches.append('fat64') - if arch in ('i386', 'x86_64'): - matches.append('intel') - if arch in ('i386', 'x86_64', 'intel', 'ppc', 'ppc64'): - matches.append('universal') - while minor >= 0: - for match in matches: - s = '%s_%s_%s_%s' % (name, major, minor, match) - if s != ARCH: # already there - arches.append(s) - minor -= 1 - - # Most specific - our Python version, ABI and arch - for abi in abis: - for arch in arches: - result.append((''.join((IMP_PREFIX, versions[0])), abi, arch)) - - # where no ABI / arch dependency, but IMP_PREFIX dependency - for i, version in enumerate(versions): - result.append((''.join((IMP_PREFIX, version)), 'none', 'any')) - if i == 0: - result.append((''.join((IMP_PREFIX, version[0])), 'none', 'any')) - - # no IMP_PREFIX, ABI or arch dependency - for i, version in enumerate(versions): - result.append((''.join(('py', version)), 'none', 'any')) - if i == 0: - result.append((''.join(('py', version[0])), 'none', 'any')) - return set(result) - - -COMPATIBLE_TAGS = compatible_tags() - -del compatible_tags - - -def is_compatible(wheel, tags=None): - if not isinstance(wheel, Wheel): - wheel = Wheel(wheel) # assume it's a filename - result = False - if tags is None: - tags = COMPATIBLE_TAGS - for ver, abi, arch in tags: - if ver in wheel.pyver and abi in wheel.abi and arch in wheel.arch: - result = True - break - return result diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distro.py b/env/lib/python3.7/site-packages/pip/_vendor/distro.py deleted file mode 100644 index 3306163..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/distro.py +++ /dev/null @@ -1,1216 +0,0 @@ -# Copyright 2015,2016,2017 Nir Cohen -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -""" -The ``distro`` package (``distro`` stands for Linux Distribution) provides -information about the Linux distribution it runs on, such as a reliable -machine-readable distro ID, or version information. - -It is the recommended replacement for Python's original -:py:func:`platform.linux_distribution` function, but it provides much more -functionality. An alternative implementation became necessary because Python -3.5 deprecated this function, and Python 3.8 will remove it altogether. -Its predecessor function :py:func:`platform.dist` was already -deprecated since Python 2.6 and will also be removed in Python 3.8. -Still, there are many cases in which access to OS distribution information -is needed. See `Python issue 1322 <https://bugs.python.org/issue1322>`_ for -more information. -""" - -import os -import re -import sys -import json -import shlex -import logging -import argparse -import subprocess - - -_UNIXCONFDIR = os.environ.get('UNIXCONFDIR', '/etc') -_OS_RELEASE_BASENAME = 'os-release' - -#: Translation table for normalizing the "ID" attribute defined in os-release -#: files, for use by the :func:`distro.id` method. -#: -#: * Key: Value as defined in the os-release file, translated to lower case, -#: with blanks translated to underscores. -#: -#: * Value: Normalized value. -NORMALIZED_OS_ID = { - 'ol': 'oracle', # Oracle Enterprise Linux -} - -#: Translation table for normalizing the "Distributor ID" attribute returned by -#: the lsb_release command, for use by the :func:`distro.id` method. -#: -#: * Key: Value as returned by the lsb_release command, translated to lower -#: case, with blanks translated to underscores. -#: -#: * Value: Normalized value. -NORMALIZED_LSB_ID = { - 'enterpriseenterprise': 'oracle', # Oracle Enterprise Linux - 'redhatenterpriseworkstation': 'rhel', # RHEL 6, 7 Workstation - 'redhatenterpriseserver': 'rhel', # RHEL 6, 7 Server -} - -#: Translation table for normalizing the distro ID derived from the file name -#: of distro release files, for use by the :func:`distro.id` method. -#: -#: * Key: Value as derived from the file name of a distro release file, -#: translated to lower case, with blanks translated to underscores. -#: -#: * Value: Normalized value. -NORMALIZED_DISTRO_ID = { - 'redhat': 'rhel', # RHEL 6.x, 7.x -} - -# Pattern for content of distro release file (reversed) -_DISTRO_RELEASE_CONTENT_REVERSED_PATTERN = re.compile( - r'(?:[^)]*\)(.*)\()? *(?:STL )?([\d.+\-a-z]*\d) *(?:esaeler *)?(.+)') - -# Pattern for base file name of distro release file -_DISTRO_RELEASE_BASENAME_PATTERN = re.compile( - r'(\w+)[-_](release|version)$') - -# Base file names to be ignored when searching for distro release file -_DISTRO_RELEASE_IGNORE_BASENAMES = ( - 'debian_version', - 'lsb-release', - 'oem-release', - _OS_RELEASE_BASENAME, - 'system-release' -) - - -def linux_distribution(full_distribution_name=True): - """ - Return information about the current OS distribution as a tuple - ``(id_name, version, codename)`` with items as follows: - - * ``id_name``: If *full_distribution_name* is false, the result of - :func:`distro.id`. Otherwise, the result of :func:`distro.name`. - - * ``version``: The result of :func:`distro.version`. - - * ``codename``: The result of :func:`distro.codename`. - - The interface of this function is compatible with the original - :py:func:`platform.linux_distribution` function, supporting a subset of - its parameters. - - The data it returns may not exactly be the same, because it uses more data - sources than the original function, and that may lead to different data if - the OS distribution is not consistent across multiple data sources it - provides (there are indeed such distributions ...). - - Another reason for differences is the fact that the :func:`distro.id` - method normalizes the distro ID string to a reliable machine-readable value - for a number of popular OS distributions. - """ - return _distro.linux_distribution(full_distribution_name) - - -def id(): - """ - Return the distro ID of the current distribution, as a - machine-readable string. - - For a number of OS distributions, the returned distro ID value is - *reliable*, in the sense that it is documented and that it does not change - across releases of the distribution. - - This package maintains the following reliable distro ID values: - - ============== ========================================= - Distro ID Distribution - ============== ========================================= - "ubuntu" Ubuntu - "debian" Debian - "rhel" RedHat Enterprise Linux - "centos" CentOS - "fedora" Fedora - "sles" SUSE Linux Enterprise Server - "opensuse" openSUSE - "amazon" Amazon Linux - "arch" Arch Linux - "cloudlinux" CloudLinux OS - "exherbo" Exherbo Linux - "gentoo" GenToo Linux - "ibm_powerkvm" IBM PowerKVM - "kvmibm" KVM for IBM z Systems - "linuxmint" Linux Mint - "mageia" Mageia - "mandriva" Mandriva Linux - "parallels" Parallels - "pidora" Pidora - "raspbian" Raspbian - "oracle" Oracle Linux (and Oracle Enterprise Linux) - "scientific" Scientific Linux - "slackware" Slackware - "xenserver" XenServer - "openbsd" OpenBSD - "netbsd" NetBSD - "freebsd" FreeBSD - ============== ========================================= - - If you have a need to get distros for reliable IDs added into this set, - or if you find that the :func:`distro.id` function returns a different - distro ID for one of the listed distros, please create an issue in the - `distro issue tracker`_. - - **Lookup hierarchy and transformations:** - - First, the ID is obtained from the following sources, in the specified - order. The first available and non-empty value is used: - - * the value of the "ID" attribute of the os-release file, - - * the value of the "Distributor ID" attribute returned by the lsb_release - command, - - * the first part of the file name of the distro release file, - - The so determined ID value then passes the following transformations, - before it is returned by this method: - - * it is translated to lower case, - - * blanks (which should not be there anyway) are translated to underscores, - - * a normalization of the ID is performed, based upon - `normalization tables`_. The purpose of this normalization is to ensure - that the ID is as reliable as possible, even across incompatible changes - in the OS distributions. A common reason for an incompatible change is - the addition of an os-release file, or the addition of the lsb_release - command, with ID values that differ from what was previously determined - from the distro release file name. - """ - return _distro.id() - - -def name(pretty=False): - """ - Return the name of the current OS distribution, as a human-readable - string. - - If *pretty* is false, the name is returned without version or codename. - (e.g. "CentOS Linux") - - If *pretty* is true, the version and codename are appended. - (e.g. "CentOS Linux 7.1.1503 (Core)") - - **Lookup hierarchy:** - - The name is obtained from the following sources, in the specified order. - The first available and non-empty value is used: - - * If *pretty* is false: - - - the value of the "NAME" attribute of the os-release file, - - - the value of the "Distributor ID" attribute returned by the lsb_release - command, - - - the value of the "<name>" field of the distro release file. - - * If *pretty* is true: - - - the value of the "PRETTY_NAME" attribute of the os-release file, - - - the value of the "Description" attribute returned by the lsb_release - command, - - - the value of the "<name>" field of the distro release file, appended - with the value of the pretty version ("<version_id>" and "<codename>" - fields) of the distro release file, if available. - """ - return _distro.name(pretty) - - -def version(pretty=False, best=False): - """ - Return the version of the current OS distribution, as a human-readable - string. - - If *pretty* is false, the version is returned without codename (e.g. - "7.0"). - - If *pretty* is true, the codename in parenthesis is appended, if the - codename is non-empty (e.g. "7.0 (Maipo)"). - - Some distributions provide version numbers with different precisions in - the different sources of distribution information. Examining the different - sources in a fixed priority order does not always yield the most precise - version (e.g. for Debian 8.2, or CentOS 7.1). - - The *best* parameter can be used to control the approach for the returned - version: - - If *best* is false, the first non-empty version number in priority order of - the examined sources is returned. - - If *best* is true, the most precise version number out of all examined - sources is returned. - - **Lookup hierarchy:** - - In all cases, the version number is obtained from the following sources. - If *best* is false, this order represents the priority order: - - * the value of the "VERSION_ID" attribute of the os-release file, - * the value of the "Release" attribute returned by the lsb_release - command, - * the version number parsed from the "<version_id>" field of the first line - of the distro release file, - * the version number parsed from the "PRETTY_NAME" attribute of the - os-release file, if it follows the format of the distro release files. - * the version number parsed from the "Description" attribute returned by - the lsb_release command, if it follows the format of the distro release - files. - """ - return _distro.version(pretty, best) - - -def version_parts(best=False): - """ - Return the version of the current OS distribution as a tuple - ``(major, minor, build_number)`` with items as follows: - - * ``major``: The result of :func:`distro.major_version`. - - * ``minor``: The result of :func:`distro.minor_version`. - - * ``build_number``: The result of :func:`distro.build_number`. - - For a description of the *best* parameter, see the :func:`distro.version` - method. - """ - return _distro.version_parts(best) - - -def major_version(best=False): - """ - Return the major version of the current OS distribution, as a string, - if provided. - Otherwise, the empty string is returned. The major version is the first - part of the dot-separated version string. - - For a description of the *best* parameter, see the :func:`distro.version` - method. - """ - return _distro.major_version(best) - - -def minor_version(best=False): - """ - Return the minor version of the current OS distribution, as a string, - if provided. - Otherwise, the empty string is returned. The minor version is the second - part of the dot-separated version string. - - For a description of the *best* parameter, see the :func:`distro.version` - method. - """ - return _distro.minor_version(best) - - -def build_number(best=False): - """ - Return the build number of the current OS distribution, as a string, - if provided. - Otherwise, the empty string is returned. The build number is the third part - of the dot-separated version string. - - For a description of the *best* parameter, see the :func:`distro.version` - method. - """ - return _distro.build_number(best) - - -def like(): - """ - Return a space-separated list of distro IDs of distributions that are - closely related to the current OS distribution in regards to packaging - and programming interfaces, for example distributions the current - distribution is a derivative from. - - **Lookup hierarchy:** - - This information item is only provided by the os-release file. - For details, see the description of the "ID_LIKE" attribute in the - `os-release man page - <http://www.freedesktop.org/software/systemd/man/os-release.html>`_. - """ - return _distro.like() - - -def codename(): - """ - Return the codename for the release of the current OS distribution, - as a string. - - If the distribution does not have a codename, an empty string is returned. - - Note that the returned codename is not always really a codename. For - example, openSUSE returns "x86_64". This function does not handle such - cases in any special way and just returns the string it finds, if any. - - **Lookup hierarchy:** - - * the codename within the "VERSION" attribute of the os-release file, if - provided, - - * the value of the "Codename" attribute returned by the lsb_release - command, - - * the value of the "<codename>" field of the distro release file. - """ - return _distro.codename() - - -def info(pretty=False, best=False): - """ - Return certain machine-readable information items about the current OS - distribution in a dictionary, as shown in the following example: - - .. sourcecode:: python - - { - 'id': 'rhel', - 'version': '7.0', - 'version_parts': { - 'major': '7', - 'minor': '0', - 'build_number': '' - }, - 'like': 'fedora', - 'codename': 'Maipo' - } - - The dictionary structure and keys are always the same, regardless of which - information items are available in the underlying data sources. The values - for the various keys are as follows: - - * ``id``: The result of :func:`distro.id`. - - * ``version``: The result of :func:`distro.version`. - - * ``version_parts -> major``: The result of :func:`distro.major_version`. - - * ``version_parts -> minor``: The result of :func:`distro.minor_version`. - - * ``version_parts -> build_number``: The result of - :func:`distro.build_number`. - - * ``like``: The result of :func:`distro.like`. - - * ``codename``: The result of :func:`distro.codename`. - - For a description of the *pretty* and *best* parameters, see the - :func:`distro.version` method. - """ - return _distro.info(pretty, best) - - -def os_release_info(): - """ - Return a dictionary containing key-value pairs for the information items - from the os-release file data source of the current OS distribution. - - See `os-release file`_ for details about these information items. - """ - return _distro.os_release_info() - - -def lsb_release_info(): - """ - Return a dictionary containing key-value pairs for the information items - from the lsb_release command data source of the current OS distribution. - - See `lsb_release command output`_ for details about these information - items. - """ - return _distro.lsb_release_info() - - -def distro_release_info(): - """ - Return a dictionary containing key-value pairs for the information items - from the distro release file data source of the current OS distribution. - - See `distro release file`_ for details about these information items. - """ - return _distro.distro_release_info() - - -def uname_info(): - """ - Return a dictionary containing key-value pairs for the information items - from the distro release file data source of the current OS distribution. - """ - return _distro.uname_info() - - -def os_release_attr(attribute): - """ - Return a single named information item from the os-release file data source - of the current OS distribution. - - Parameters: - - * ``attribute`` (string): Key of the information item. - - Returns: - - * (string): Value of the information item, if the item exists. - The empty string, if the item does not exist. - - See `os-release file`_ for details about these information items. - """ - return _distro.os_release_attr(attribute) - - -def lsb_release_attr(attribute): - """ - Return a single named information item from the lsb_release command output - data source of the current OS distribution. - - Parameters: - - * ``attribute`` (string): Key of the information item. - - Returns: - - * (string): Value of the information item, if the item exists. - The empty string, if the item does not exist. - - See `lsb_release command output`_ for details about these information - items. - """ - return _distro.lsb_release_attr(attribute) - - -def distro_release_attr(attribute): - """ - Return a single named information item from the distro release file - data source of the current OS distribution. - - Parameters: - - * ``attribute`` (string): Key of the information item. - - Returns: - - * (string): Value of the information item, if the item exists. - The empty string, if the item does not exist. - - See `distro release file`_ for details about these information items. - """ - return _distro.distro_release_attr(attribute) - - -def uname_attr(attribute): - """ - Return a single named information item from the distro release file - data source of the current OS distribution. - - Parameters: - - * ``attribute`` (string): Key of the information item. - - Returns: - - * (string): Value of the information item, if the item exists. - The empty string, if the item does not exist. - """ - return _distro.uname_attr(attribute) - - -class cached_property(object): - """A version of @property which caches the value. On access, it calls the - underlying function and sets the value in `__dict__` so future accesses - will not re-call the property. - """ - def __init__(self, f): - self._fname = f.__name__ - self._f = f - - def __get__(self, obj, owner): - assert obj is not None, 'call {} on an instance'.format(self._fname) - ret = obj.__dict__[self._fname] = self._f(obj) - return ret - - -class LinuxDistribution(object): - """ - Provides information about a OS distribution. - - This package creates a private module-global instance of this class with - default initialization arguments, that is used by the - `consolidated accessor functions`_ and `single source accessor functions`_. - By using default initialization arguments, that module-global instance - returns data about the current OS distribution (i.e. the distro this - package runs on). - - Normally, it is not necessary to create additional instances of this class. - However, in situations where control is needed over the exact data sources - that are used, instances of this class can be created with a specific - distro release file, or a specific os-release file, or without invoking the - lsb_release command. - """ - - def __init__(self, - include_lsb=True, - os_release_file='', - distro_release_file='', - include_uname=True): - """ - The initialization method of this class gathers information from the - available data sources, and stores that in private instance attributes. - Subsequent access to the information items uses these private instance - attributes, so that the data sources are read only once. - - Parameters: - - * ``include_lsb`` (bool): Controls whether the - `lsb_release command output`_ is included as a data source. - - If the lsb_release command is not available in the program execution - path, the data source for the lsb_release command will be empty. - - * ``os_release_file`` (string): The path name of the - `os-release file`_ that is to be used as a data source. - - An empty string (the default) will cause the default path name to - be used (see `os-release file`_ for details). - - If the specified or defaulted os-release file does not exist, the - data source for the os-release file will be empty. - - * ``distro_release_file`` (string): The path name of the - `distro release file`_ that is to be used as a data source. - - An empty string (the default) will cause a default search algorithm - to be used (see `distro release file`_ for details). - - If the specified distro release file does not exist, or if no default - distro release file can be found, the data source for the distro - release file will be empty. - - * ``include_name`` (bool): Controls whether uname command output is - included as a data source. If the uname command is not available in - the program execution path the data source for the uname command will - be empty. - - Public instance attributes: - - * ``os_release_file`` (string): The path name of the - `os-release file`_ that is actually used as a data source. The - empty string if no distro release file is used as a data source. - - * ``distro_release_file`` (string): The path name of the - `distro release file`_ that is actually used as a data source. The - empty string if no distro release file is used as a data source. - - * ``include_lsb`` (bool): The result of the ``include_lsb`` parameter. - This controls whether the lsb information will be loaded. - - * ``include_uname`` (bool): The result of the ``include_uname`` - parameter. This controls whether the uname information will - be loaded. - - Raises: - - * :py:exc:`IOError`: Some I/O issue with an os-release file or distro - release file. - - * :py:exc:`subprocess.CalledProcessError`: The lsb_release command had - some issue (other than not being available in the program execution - path). - - * :py:exc:`UnicodeError`: A data source has unexpected characters or - uses an unexpected encoding. - """ - self.os_release_file = os_release_file or \ - os.path.join(_UNIXCONFDIR, _OS_RELEASE_BASENAME) - self.distro_release_file = distro_release_file or '' # updated later - self.include_lsb = include_lsb - self.include_uname = include_uname - - def __repr__(self): - """Return repr of all info - """ - return \ - "LinuxDistribution(" \ - "os_release_file={self.os_release_file!r}, " \ - "distro_release_file={self.distro_release_file!r}, " \ - "include_lsb={self.include_lsb!r}, " \ - "include_uname={self.include_uname!r}, " \ - "_os_release_info={self._os_release_info!r}, " \ - "_lsb_release_info={self._lsb_release_info!r}, " \ - "_distro_release_info={self._distro_release_info!r}, " \ - "_uname_info={self._uname_info!r})".format( - self=self) - - def linux_distribution(self, full_distribution_name=True): - """ - Return information about the OS distribution that is compatible - with Python's :func:`platform.linux_distribution`, supporting a subset - of its parameters. - - For details, see :func:`distro.linux_distribution`. - """ - return ( - self.name() if full_distribution_name else self.id(), - self.version(), - self.codename() - ) - - def id(self): - """Return the distro ID of the OS distribution, as a string. - - For details, see :func:`distro.id`. - """ - def normalize(distro_id, table): - distro_id = distro_id.lower().replace(' ', '_') - return table.get(distro_id, distro_id) - - distro_id = self.os_release_attr('id') - if distro_id: - return normalize(distro_id, NORMALIZED_OS_ID) - - distro_id = self.lsb_release_attr('distributor_id') - if distro_id: - return normalize(distro_id, NORMALIZED_LSB_ID) - - distro_id = self.distro_release_attr('id') - if distro_id: - return normalize(distro_id, NORMALIZED_DISTRO_ID) - - distro_id = self.uname_attr('id') - if distro_id: - return normalize(distro_id, NORMALIZED_DISTRO_ID) - - return '' - - def name(self, pretty=False): - """ - Return the name of the OS distribution, as a string. - - For details, see :func:`distro.name`. - """ - name = self.os_release_attr('name') \ - or self.lsb_release_attr('distributor_id') \ - or self.distro_release_attr('name') \ - or self.uname_attr('name') - if pretty: - name = self.os_release_attr('pretty_name') \ - or self.lsb_release_attr('description') - if not name: - name = self.distro_release_attr('name') \ - or self.uname_attr('name') - version = self.version(pretty=True) - if version: - name = name + ' ' + version - return name or '' - - def version(self, pretty=False, best=False): - """ - Return the version of the OS distribution, as a string. - - For details, see :func:`distro.version`. - """ - versions = [ - self.os_release_attr('version_id'), - self.lsb_release_attr('release'), - self.distro_release_attr('version_id'), - self._parse_distro_release_content( - self.os_release_attr('pretty_name')).get('version_id', ''), - self._parse_distro_release_content( - self.lsb_release_attr('description')).get('version_id', ''), - self.uname_attr('release') - ] - version = '' - if best: - # This algorithm uses the last version in priority order that has - # the best precision. If the versions are not in conflict, that - # does not matter; otherwise, using the last one instead of the - # first one might be considered a surprise. - for v in versions: - if v.count(".") > version.count(".") or version == '': - version = v - else: - for v in versions: - if v != '': - version = v - break - if pretty and version and self.codename(): - version = u'{0} ({1})'.format(version, self.codename()) - return version - - def version_parts(self, best=False): - """ - Return the version of the OS distribution, as a tuple of version - numbers. - - For details, see :func:`distro.version_parts`. - """ - version_str = self.version(best=best) - if version_str: - version_regex = re.compile(r'(\d+)\.?(\d+)?\.?(\d+)?') - matches = version_regex.match(version_str) - if matches: - major, minor, build_number = matches.groups() - return major, minor or '', build_number or '' - return '', '', '' - - def major_version(self, best=False): - """ - Return the major version number of the current distribution. - - For details, see :func:`distro.major_version`. - """ - return self.version_parts(best)[0] - - def minor_version(self, best=False): - """ - Return the minor version number of the current distribution. - - For details, see :func:`distro.minor_version`. - """ - return self.version_parts(best)[1] - - def build_number(self, best=False): - """ - Return the build number of the current distribution. - - For details, see :func:`distro.build_number`. - """ - return self.version_parts(best)[2] - - def like(self): - """ - Return the IDs of distributions that are like the OS distribution. - - For details, see :func:`distro.like`. - """ - return self.os_release_attr('id_like') or '' - - def codename(self): - """ - Return the codename of the OS distribution. - - For details, see :func:`distro.codename`. - """ - try: - # Handle os_release specially since distros might purposefully set - # this to empty string to have no codename - return self._os_release_info['codename'] - except KeyError: - return self.lsb_release_attr('codename') \ - or self.distro_release_attr('codename') \ - or '' - - def info(self, pretty=False, best=False): - """ - Return certain machine-readable information about the OS - distribution. - - For details, see :func:`distro.info`. - """ - return dict( - id=self.id(), - version=self.version(pretty, best), - version_parts=dict( - major=self.major_version(best), - minor=self.minor_version(best), - build_number=self.build_number(best) - ), - like=self.like(), - codename=self.codename(), - ) - - def os_release_info(self): - """ - Return a dictionary containing key-value pairs for the information - items from the os-release file data source of the OS distribution. - - For details, see :func:`distro.os_release_info`. - """ - return self._os_release_info - - def lsb_release_info(self): - """ - Return a dictionary containing key-value pairs for the information - items from the lsb_release command data source of the OS - distribution. - - For details, see :func:`distro.lsb_release_info`. - """ - return self._lsb_release_info - - def distro_release_info(self): - """ - Return a dictionary containing key-value pairs for the information - items from the distro release file data source of the OS - distribution. - - For details, see :func:`distro.distro_release_info`. - """ - return self._distro_release_info - - def uname_info(self): - """ - Return a dictionary containing key-value pairs for the information - items from the uname command data source of the OS distribution. - - For details, see :func:`distro.uname_info`. - """ - return self._uname_info - - def os_release_attr(self, attribute): - """ - Return a single named information item from the os-release file data - source of the OS distribution. - - For details, see :func:`distro.os_release_attr`. - """ - return self._os_release_info.get(attribute, '') - - def lsb_release_attr(self, attribute): - """ - Return a single named information item from the lsb_release command - output data source of the OS distribution. - - For details, see :func:`distro.lsb_release_attr`. - """ - return self._lsb_release_info.get(attribute, '') - - def distro_release_attr(self, attribute): - """ - Return a single named information item from the distro release file - data source of the OS distribution. - - For details, see :func:`distro.distro_release_attr`. - """ - return self._distro_release_info.get(attribute, '') - - def uname_attr(self, attribute): - """ - Return a single named information item from the uname command - output data source of the OS distribution. - - For details, see :func:`distro.uname_release_attr`. - """ - return self._uname_info.get(attribute, '') - - @cached_property - def _os_release_info(self): - """ - Get the information items from the specified os-release file. - - Returns: - A dictionary containing all information items. - """ - if os.path.isfile(self.os_release_file): - with open(self.os_release_file) as release_file: - return self._parse_os_release_content(release_file) - return {} - - @staticmethod - def _parse_os_release_content(lines): - """ - Parse the lines of an os-release file. - - Parameters: - - * lines: Iterable through the lines in the os-release file. - Each line must be a unicode string or a UTF-8 encoded byte - string. - - Returns: - A dictionary containing all information items. - """ - props = {} - lexer = shlex.shlex(lines, posix=True) - lexer.whitespace_split = True - - # The shlex module defines its `wordchars` variable using literals, - # making it dependent on the encoding of the Python source file. - # In Python 2.6 and 2.7, the shlex source file is encoded in - # 'iso-8859-1', and the `wordchars` variable is defined as a byte - # string. This causes a UnicodeDecodeError to be raised when the - # parsed content is a unicode object. The following fix resolves that - # (... but it should be fixed in shlex...): - if sys.version_info[0] == 2 and isinstance(lexer.wordchars, bytes): - lexer.wordchars = lexer.wordchars.decode('iso-8859-1') - - tokens = list(lexer) - for token in tokens: - # At this point, all shell-like parsing has been done (i.e. - # comments processed, quotes and backslash escape sequences - # processed, multi-line values assembled, trailing newlines - # stripped, etc.), so the tokens are now either: - # * variable assignments: var=value - # * commands or their arguments (not allowed in os-release) - if '=' in token: - k, v = token.split('=', 1) - if isinstance(v, bytes): - v = v.decode('utf-8') - props[k.lower()] = v - else: - # Ignore any tokens that are not variable assignments - pass - - if 'version_codename' in props: - # os-release added a version_codename field. Use that in - # preference to anything else Note that some distros purposefully - # do not have code names. They should be setting - # version_codename="" - props['codename'] = props['version_codename'] - elif 'ubuntu_codename' in props: - # Same as above but a non-standard field name used on older Ubuntus - props['codename'] = props['ubuntu_codename'] - elif 'version' in props: - # If there is no version_codename, parse it from the version - codename = re.search(r'(\(\D+\))|,(\s+)?\D+', props['version']) - if codename: - codename = codename.group() - codename = codename.strip('()') - codename = codename.strip(',') - codename = codename.strip() - # codename appears within paranthese. - props['codename'] = codename - - return props - - @cached_property - def _lsb_release_info(self): - """ - Get the information items from the lsb_release command output. - - Returns: - A dictionary containing all information items. - """ - if not self.include_lsb: - return {} - with open(os.devnull, 'w') as devnull: - try: - cmd = ('lsb_release', '-a') - stdout = subprocess.check_output(cmd, stderr=devnull) - except OSError: # Command not found - return {} - content = stdout.decode(sys.getfilesystemencoding()).splitlines() - return self._parse_lsb_release_content(content) - - @staticmethod - def _parse_lsb_release_content(lines): - """ - Parse the output of the lsb_release command. - - Parameters: - - * lines: Iterable through the lines of the lsb_release output. - Each line must be a unicode string or a UTF-8 encoded byte - string. - - Returns: - A dictionary containing all information items. - """ - props = {} - for line in lines: - kv = line.strip('\n').split(':', 1) - if len(kv) != 2: - # Ignore lines without colon. - continue - k, v = kv - props.update({k.replace(' ', '_').lower(): v.strip()}) - return props - - @cached_property - def _uname_info(self): - with open(os.devnull, 'w') as devnull: - try: - cmd = ('uname', '-rs') - stdout = subprocess.check_output(cmd, stderr=devnull) - except OSError: - return {} - content = stdout.decode(sys.getfilesystemencoding()).splitlines() - return self._parse_uname_content(content) - - @staticmethod - def _parse_uname_content(lines): - props = {} - match = re.search(r'^([^\s]+)\s+([\d\.]+)', lines[0].strip()) - if match: - name, version = match.groups() - - # This is to prevent the Linux kernel version from - # appearing as the 'best' version on otherwise - # identifiable distributions. - if name == 'Linux': - return {} - props['id'] = name.lower() - props['name'] = name - props['release'] = version - return props - - @cached_property - def _distro_release_info(self): - """ - Get the information items from the specified distro release file. - - Returns: - A dictionary containing all information items. - """ - if self.distro_release_file: - # If it was specified, we use it and parse what we can, even if - # its file name or content does not match the expected pattern. - distro_info = self._parse_distro_release_file( - self.distro_release_file) - basename = os.path.basename(self.distro_release_file) - # The file name pattern for user-specified distro release files - # is somewhat more tolerant (compared to when searching for the - # file), because we want to use what was specified as best as - # possible. - match = _DISTRO_RELEASE_BASENAME_PATTERN.match(basename) - if 'name' in distro_info \ - and 'cloudlinux' in distro_info['name'].lower(): - distro_info['id'] = 'cloudlinux' - elif match: - distro_info['id'] = match.group(1) - return distro_info - else: - try: - basenames = os.listdir(_UNIXCONFDIR) - # We sort for repeatability in cases where there are multiple - # distro specific files; e.g. CentOS, Oracle, Enterprise all - # containing `redhat-release` on top of their own. - basenames.sort() - except OSError: - # This may occur when /etc is not readable but we can't be - # sure about the *-release files. Check common entries of - # /etc for information. If they turn out to not be there the - # error is handled in `_parse_distro_release_file()`. - basenames = ['SuSE-release', - 'arch-release', - 'base-release', - 'centos-release', - 'fedora-release', - 'gentoo-release', - 'mageia-release', - 'mandrake-release', - 'mandriva-release', - 'mandrivalinux-release', - 'manjaro-release', - 'oracle-release', - 'redhat-release', - 'sl-release', - 'slackware-version'] - for basename in basenames: - if basename in _DISTRO_RELEASE_IGNORE_BASENAMES: - continue - match = _DISTRO_RELEASE_BASENAME_PATTERN.match(basename) - if match: - filepath = os.path.join(_UNIXCONFDIR, basename) - distro_info = self._parse_distro_release_file(filepath) - if 'name' in distro_info: - # The name is always present if the pattern matches - self.distro_release_file = filepath - distro_info['id'] = match.group(1) - if 'cloudlinux' in distro_info['name'].lower(): - distro_info['id'] = 'cloudlinux' - return distro_info - return {} - - def _parse_distro_release_file(self, filepath): - """ - Parse a distro release file. - - Parameters: - - * filepath: Path name of the distro release file. - - Returns: - A dictionary containing all information items. - """ - try: - with open(filepath) as fp: - # Only parse the first line. For instance, on SLES there - # are multiple lines. We don't want them... - return self._parse_distro_release_content(fp.readline()) - except (OSError, IOError): - # Ignore not being able to read a specific, seemingly version - # related file. - # See https://github.com/nir0s/distro/issues/162 - return {} - - @staticmethod - def _parse_distro_release_content(line): - """ - Parse a line from a distro release file. - - Parameters: - * line: Line from the distro release file. Must be a unicode string - or a UTF-8 encoded byte string. - - Returns: - A dictionary containing all information items. - """ - if isinstance(line, bytes): - line = line.decode('utf-8') - matches = _DISTRO_RELEASE_CONTENT_REVERSED_PATTERN.match( - line.strip()[::-1]) - distro_info = {} - if matches: - # regexp ensures non-None - distro_info['name'] = matches.group(3)[::-1] - if matches.group(2): - distro_info['version_id'] = matches.group(2)[::-1] - if matches.group(1): - distro_info['codename'] = matches.group(1)[::-1] - elif line: - distro_info['name'] = line.strip() - return distro_info - - -_distro = LinuxDistribution() - - -def main(): - logger = logging.getLogger(__name__) - logger.setLevel(logging.DEBUG) - logger.addHandler(logging.StreamHandler(sys.stdout)) - - parser = argparse.ArgumentParser(description="OS distro info tool") - parser.add_argument( - '--json', - '-j', - help="Output in machine readable format", - action="store_true") - args = parser.parse_args() - - if args.json: - logger.info(json.dumps(info(), indent=4, sort_keys=True)) - else: - logger.info('Name: %s', name(pretty=True)) - distribution_version = version(pretty=True) - logger.info('Version: %s', distribution_version) - distribution_codename = codename() - logger.info('Codename: %s', distribution_codename) - - -if __name__ == '__main__': - main() diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/__init__.py b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/__init__.py deleted file mode 100644 index 0491234..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/__init__.py +++ /dev/null @@ -1,35 +0,0 @@ -""" -HTML parsing library based on the `WHATWG HTML specification -<https://whatwg.org/html>`_. The parser is designed to be compatible with -existing HTML found in the wild and implements well-defined error recovery that -is largely compatible with modern desktop web browsers. - -Example usage:: - - from pip._vendor import html5lib - with open("my_document.html", "rb") as f: - tree = html5lib.parse(f) - -For convenience, this module re-exports the following names: - -* :func:`~.html5parser.parse` -* :func:`~.html5parser.parseFragment` -* :class:`~.html5parser.HTMLParser` -* :func:`~.treebuilders.getTreeBuilder` -* :func:`~.treewalkers.getTreeWalker` -* :func:`~.serializer.serialize` -""" - -from __future__ import absolute_import, division, unicode_literals - -from .html5parser import HTMLParser, parse, parseFragment -from .treebuilders import getTreeBuilder -from .treewalkers import getTreeWalker -from .serializer import serialize - -__all__ = ["HTMLParser", "parse", "parseFragment", "getTreeBuilder", - "getTreeWalker", "serialize"] - -# this has to be at the top level, see how setup.py parses this -#: Distribution version number. -__version__ = "1.0.1" diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 1e28eb16d1cfa51d779628458c8d2828fc34a3db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1269 zcmaJ>%WfMt6dgS*$&_TffCFSncohZlC|+bEq(&Pck40J(r~v~51Qch;84=-QN^&eK zi+(_VqpJe_qS<DZU&tz#9LJ4aAQa|`yt;GF;eF`Ee2x-W`tOJD{u(C9$8h+%MzHw_ z9=8F*k}P38)|Wli&-!YR4b(6j_7XN=L%F9$*+`AEv6^I)=-ZR~3S}tnM{=rW*(~nI za;^@t1K3a4K0|EEW^7)KvO{)|9kIjTlf@DJx1S{F&BZToaZRlgy24WAmf9W8spAYA zjs1q>_2rwNFD_r>80l(Wh*A{P3!~BVjrX-%EtlI3_1h{nwpwnylILrZ;tO~;0CS6l z!;CvoX+ZS`=NuPC)qs&pj<>>Z5Wg1A2MLj-G>v9hbo^T(8K&W^YRMJX-r+5m@|5vX z1VnDFvDos$TyYTZK??##No~dD?miV(hH<Ndp!eR?0F~q1nl0#bDMBx=X`sQ4qZMDR z5W=uZYZR_UosuiA8IXY#V?7RceFjO3LE#?Q)LcJ0Q9Hs+(FCn&h&g$JPi%g&z|`S# z6{7>Jx18f2Z&A{itw-eop;y3B7!7QK>w-UlOTmpmc>~fcKjqhf-^KcrMoO~{xzki} z2a+G-RoUobwf-}*KkKT{!LPsj>nlsEpgKksk~()EB-H1(Sk*g7;VO9pl?qv`xW9n& zi|+itxGk0MzX`jH$2(C_3qhs$z-@ZFU87Gh9?4?R9@5+y*?3O6GPDyWu7rbzY>yf( z3aBrU!gEWd`_${+iGAMbZueq7+Ijr?dgDc}J-DkIJo6h*ClMU`w{mQlT00JA63l)u zVaDwg%!j?R^l5tb>*9xYOhPXZ(jr32#y6G|Vqx+UI|v5;43c&l8!76s_ki2kx2cUZ z?KHS<vKTpA^q;QCA6TiBz&a(+voPI86Y@`Dj{|2gpU;<G)k|pVQ=y%Q;8XU;PG6su vo8XMkO}EF94sE_9L}=j&N$XuZdET|-`2#?6M_`8i<Nk4P7C!w+Z!-J><+P3r diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-37.pyc deleted file mode 100644 index 6d040fd7eed54d18233e5e93fb249077af5bda1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13716 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 MSXb|@_tpFUFDU5K2><{9 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_inputstream.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_inputstream.cpython-37.pyc deleted file mode 100644 index 6c836a301ff5b4a159b09defd036b46ec8e2c652..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22607 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-37.pyc deleted file mode 100644 index 887a5f9de781b92e7a41b9d0361979f91ad9bc67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41508 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 W_q6Pb=lCBS*aN=AS~2;ZN&H`>pIMmz diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_utils.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_utils.cpython-37.pyc deleted file mode 100644 index 608b22b5042982516db01b317349e14b4c1bccae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3261 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 D&vqL7 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/constants.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/constants.cpython-37.pyc deleted file mode 100644 index fd70f095e2d580bb708b185ab730a84b15b0aef5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66173 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 eFqa87kx$gvz9;6s|kEGKf5=FE7J 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/html5parser.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/html5parser.cpython-37.pyc deleted file mode 100644 index 01c889f4e9766b8453dcbd3bbf3f29a47ac6d3f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 97770 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/serializer.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/serializer.cpython-37.pyc deleted file mode 100644 index cae17c0bc938474bbd548b1515663a83080b5a24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10786 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/_ihatexml.py b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/_ihatexml.py deleted file mode 100644 index 4c77717..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/_ihatexml.py +++ /dev/null @@ -1,288 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -import re -import warnings - -from .constants import DataLossWarning - -baseChar = """ -[#x0041-#x005A] | [#x0061-#x007A] | [#x00C0-#x00D6] | [#x00D8-#x00F6] | -[#x00F8-#x00FF] | [#x0100-#x0131] | [#x0134-#x013E] | [#x0141-#x0148] | -[#x014A-#x017E] | [#x0180-#x01C3] | [#x01CD-#x01F0] | [#x01F4-#x01F5] | -[#x01FA-#x0217] | [#x0250-#x02A8] | [#x02BB-#x02C1] | #x0386 | -[#x0388-#x038A] | #x038C | [#x038E-#x03A1] | [#x03A3-#x03CE] | -[#x03D0-#x03D6] | #x03DA | #x03DC | #x03DE | #x03E0 | [#x03E2-#x03F3] | -[#x0401-#x040C] | [#x040E-#x044F] | [#x0451-#x045C] | [#x045E-#x0481] | -[#x0490-#x04C4] | [#x04C7-#x04C8] | [#x04CB-#x04CC] | [#x04D0-#x04EB] | -[#x04EE-#x04F5] | [#x04F8-#x04F9] | [#x0531-#x0556] | #x0559 | -[#x0561-#x0586] | [#x05D0-#x05EA] | [#x05F0-#x05F2] | [#x0621-#x063A] | -[#x0641-#x064A] | [#x0671-#x06B7] | [#x06BA-#x06BE] | [#x06C0-#x06CE] | -[#x06D0-#x06D3] | #x06D5 | [#x06E5-#x06E6] | [#x0905-#x0939] | #x093D | -[#x0958-#x0961] | [#x0985-#x098C] | [#x098F-#x0990] | [#x0993-#x09A8] | -[#x09AA-#x09B0] | #x09B2 | [#x09B6-#x09B9] | [#x09DC-#x09DD] | -[#x09DF-#x09E1] | [#x09F0-#x09F1] | [#x0A05-#x0A0A] | [#x0A0F-#x0A10] | -[#x0A13-#x0A28] | [#x0A2A-#x0A30] | [#x0A32-#x0A33] | [#x0A35-#x0A36] | -[#x0A38-#x0A39] | [#x0A59-#x0A5C] | #x0A5E | [#x0A72-#x0A74] | -[#x0A85-#x0A8B] | #x0A8D | [#x0A8F-#x0A91] | [#x0A93-#x0AA8] | -[#x0AAA-#x0AB0] | [#x0AB2-#x0AB3] | [#x0AB5-#x0AB9] | #x0ABD | #x0AE0 | -[#x0B05-#x0B0C] | [#x0B0F-#x0B10] | [#x0B13-#x0B28] | [#x0B2A-#x0B30] | -[#x0B32-#x0B33] | [#x0B36-#x0B39] | #x0B3D | [#x0B5C-#x0B5D] | -[#x0B5F-#x0B61] | [#x0B85-#x0B8A] | [#x0B8E-#x0B90] | [#x0B92-#x0B95] | -[#x0B99-#x0B9A] | #x0B9C | [#x0B9E-#x0B9F] | [#x0BA3-#x0BA4] | -[#x0BA8-#x0BAA] | [#x0BAE-#x0BB5] | [#x0BB7-#x0BB9] | [#x0C05-#x0C0C] | -[#x0C0E-#x0C10] | [#x0C12-#x0C28] | [#x0C2A-#x0C33] | [#x0C35-#x0C39] | -[#x0C60-#x0C61] | [#x0C85-#x0C8C] | [#x0C8E-#x0C90] | [#x0C92-#x0CA8] | -[#x0CAA-#x0CB3] | [#x0CB5-#x0CB9] | #x0CDE | [#x0CE0-#x0CE1] | -[#x0D05-#x0D0C] | [#x0D0E-#x0D10] | [#x0D12-#x0D28] | [#x0D2A-#x0D39] | -[#x0D60-#x0D61] | [#x0E01-#x0E2E] | #x0E30 | [#x0E32-#x0E33] | -[#x0E40-#x0E45] | [#x0E81-#x0E82] | #x0E84 | [#x0E87-#x0E88] | #x0E8A | -#x0E8D | [#x0E94-#x0E97] | [#x0E99-#x0E9F] | [#x0EA1-#x0EA3] | #x0EA5 | -#x0EA7 | [#x0EAA-#x0EAB] | [#x0EAD-#x0EAE] | #x0EB0 | [#x0EB2-#x0EB3] | -#x0EBD | [#x0EC0-#x0EC4] | [#x0F40-#x0F47] | [#x0F49-#x0F69] | -[#x10A0-#x10C5] | [#x10D0-#x10F6] | #x1100 | [#x1102-#x1103] | -[#x1105-#x1107] | #x1109 | [#x110B-#x110C] | [#x110E-#x1112] | #x113C | -#x113E | #x1140 | #x114C | #x114E | #x1150 | [#x1154-#x1155] | #x1159 | -[#x115F-#x1161] | #x1163 | #x1165 | #x1167 | #x1169 | [#x116D-#x116E] | -[#x1172-#x1173] | #x1175 | #x119E | #x11A8 | #x11AB | [#x11AE-#x11AF] | -[#x11B7-#x11B8] | #x11BA | [#x11BC-#x11C2] | #x11EB | #x11F0 | #x11F9 | -[#x1E00-#x1E9B] | [#x1EA0-#x1EF9] | [#x1F00-#x1F15] | [#x1F18-#x1F1D] | -[#x1F20-#x1F45] | [#x1F48-#x1F4D] | [#x1F50-#x1F57] | #x1F59 | #x1F5B | -#x1F5D | [#x1F5F-#x1F7D] | [#x1F80-#x1FB4] | [#x1FB6-#x1FBC] | #x1FBE | -[#x1FC2-#x1FC4] | [#x1FC6-#x1FCC] | [#x1FD0-#x1FD3] | [#x1FD6-#x1FDB] | -[#x1FE0-#x1FEC] | [#x1FF2-#x1FF4] | [#x1FF6-#x1FFC] | #x2126 | -[#x212A-#x212B] | #x212E | [#x2180-#x2182] | [#x3041-#x3094] | -[#x30A1-#x30FA] | [#x3105-#x312C] | [#xAC00-#xD7A3]""" - -ideographic = """[#x4E00-#x9FA5] | #x3007 | [#x3021-#x3029]""" - -combiningCharacter = """ -[#x0300-#x0345] | [#x0360-#x0361] | [#x0483-#x0486] | [#x0591-#x05A1] | -[#x05A3-#x05B9] | [#x05BB-#x05BD] | #x05BF | [#x05C1-#x05C2] | #x05C4 | -[#x064B-#x0652] | #x0670 | [#x06D6-#x06DC] | [#x06DD-#x06DF] | -[#x06E0-#x06E4] | [#x06E7-#x06E8] | [#x06EA-#x06ED] | [#x0901-#x0903] | -#x093C | [#x093E-#x094C] | #x094D | [#x0951-#x0954] | [#x0962-#x0963] | -[#x0981-#x0983] | #x09BC | #x09BE | #x09BF | [#x09C0-#x09C4] | -[#x09C7-#x09C8] | [#x09CB-#x09CD] | #x09D7 | [#x09E2-#x09E3] | #x0A02 | -#x0A3C | #x0A3E | #x0A3F | [#x0A40-#x0A42] | [#x0A47-#x0A48] | -[#x0A4B-#x0A4D] | [#x0A70-#x0A71] | [#x0A81-#x0A83] | #x0ABC | -[#x0ABE-#x0AC5] | [#x0AC7-#x0AC9] | [#x0ACB-#x0ACD] | [#x0B01-#x0B03] | -#x0B3C | [#x0B3E-#x0B43] | [#x0B47-#x0B48] | [#x0B4B-#x0B4D] | -[#x0B56-#x0B57] | [#x0B82-#x0B83] | [#x0BBE-#x0BC2] | [#x0BC6-#x0BC8] | -[#x0BCA-#x0BCD] | #x0BD7 | [#x0C01-#x0C03] | [#x0C3E-#x0C44] | -[#x0C46-#x0C48] | [#x0C4A-#x0C4D] | [#x0C55-#x0C56] | [#x0C82-#x0C83] | -[#x0CBE-#x0CC4] | [#x0CC6-#x0CC8] | [#x0CCA-#x0CCD] | [#x0CD5-#x0CD6] | -[#x0D02-#x0D03] | [#x0D3E-#x0D43] | [#x0D46-#x0D48] | [#x0D4A-#x0D4D] | -#x0D57 | #x0E31 | [#x0E34-#x0E3A] | [#x0E47-#x0E4E] | #x0EB1 | -[#x0EB4-#x0EB9] | [#x0EBB-#x0EBC] | [#x0EC8-#x0ECD] | [#x0F18-#x0F19] | -#x0F35 | #x0F37 | #x0F39 | #x0F3E | #x0F3F | [#x0F71-#x0F84] | -[#x0F86-#x0F8B] | [#x0F90-#x0F95] | #x0F97 | [#x0F99-#x0FAD] | -[#x0FB1-#x0FB7] | #x0FB9 | [#x20D0-#x20DC] | #x20E1 | [#x302A-#x302F] | -#x3099 | #x309A""" - -digit = """ -[#x0030-#x0039] | [#x0660-#x0669] | [#x06F0-#x06F9] | [#x0966-#x096F] | -[#x09E6-#x09EF] | [#x0A66-#x0A6F] | [#x0AE6-#x0AEF] | [#x0B66-#x0B6F] | -[#x0BE7-#x0BEF] | [#x0C66-#x0C6F] | [#x0CE6-#x0CEF] | [#x0D66-#x0D6F] | -[#x0E50-#x0E59] | [#x0ED0-#x0ED9] | [#x0F20-#x0F29]""" - -extender = """ -#x00B7 | #x02D0 | #x02D1 | #x0387 | #x0640 | #x0E46 | #x0EC6 | #x3005 | -#[#x3031-#x3035] | [#x309D-#x309E] | [#x30FC-#x30FE]""" - -letter = " | ".join([baseChar, ideographic]) - -# Without the -name = " | ".join([letter, digit, ".", "-", "_", combiningCharacter, - extender]) -nameFirst = " | ".join([letter, "_"]) - -reChar = re.compile(r"#x([\d|A-F]{4,4})") -reCharRange = re.compile(r"\[#x([\d|A-F]{4,4})-#x([\d|A-F]{4,4})\]") - - -def charStringToList(chars): - charRanges = [item.strip() for item in chars.split(" | ")] - rv = [] - for item in charRanges: - foundMatch = False - for regexp in (reChar, reCharRange): - match = regexp.match(item) - if match is not None: - rv.append([hexToInt(item) for item in match.groups()]) - if len(rv[-1]) == 1: - rv[-1] = rv[-1] * 2 - foundMatch = True - break - if not foundMatch: - assert len(item) == 1 - - rv.append([ord(item)] * 2) - rv = normaliseCharList(rv) - return rv - - -def normaliseCharList(charList): - charList = sorted(charList) - for item in charList: - assert item[1] >= item[0] - rv = [] - i = 0 - while i < len(charList): - j = 1 - rv.append(charList[i]) - while i + j < len(charList) and charList[i + j][0] <= rv[-1][1] + 1: - rv[-1][1] = charList[i + j][1] - j += 1 - i += j - return rv - -# We don't really support characters above the BMP :( -max_unicode = int("FFFF", 16) - - -def missingRanges(charList): - rv = [] - if charList[0] != 0: - rv.append([0, charList[0][0] - 1]) - for i, item in enumerate(charList[:-1]): - rv.append([item[1] + 1, charList[i + 1][0] - 1]) - if charList[-1][1] != max_unicode: - rv.append([charList[-1][1] + 1, max_unicode]) - return rv - - -def listToRegexpStr(charList): - rv = [] - for item in charList: - if item[0] == item[1]: - rv.append(escapeRegexp(chr(item[0]))) - else: - rv.append(escapeRegexp(chr(item[0])) + "-" + - escapeRegexp(chr(item[1]))) - return "[%s]" % "".join(rv) - - -def hexToInt(hex_str): - return int(hex_str, 16) - - -def escapeRegexp(string): - specialCharacters = (".", "^", "$", "*", "+", "?", "{", "}", - "[", "]", "|", "(", ")", "-") - for char in specialCharacters: - string = string.replace(char, "\\" + char) - - return string - -# output from the above -nonXmlNameBMPRegexp = re.compile('[\x00-,/:-@\\[-\\^`\\{-\xb6\xb8-\xbf\xd7\xf7\u0132-\u0133\u013f-\u0140\u0149\u017f\u01c4-\u01cc\u01f1-\u01f3\u01f6-\u01f9\u0218-\u024f\u02a9-\u02ba\u02c2-\u02cf\u02d2-\u02ff\u0346-\u035f\u0362-\u0385\u038b\u038d\u03a2\u03cf\u03d7-\u03d9\u03db\u03dd\u03df\u03e1\u03f4-\u0400\u040d\u0450\u045d\u0482\u0487-\u048f\u04c5-\u04c6\u04c9-\u04ca\u04cd-\u04cf\u04ec-\u04ed\u04f6-\u04f7\u04fa-\u0530\u0557-\u0558\u055a-\u0560\u0587-\u0590\u05a2\u05ba\u05be\u05c0\u05c3\u05c5-\u05cf\u05eb-\u05ef\u05f3-\u0620\u063b-\u063f\u0653-\u065f\u066a-\u066f\u06b8-\u06b9\u06bf\u06cf\u06d4\u06e9\u06ee-\u06ef\u06fa-\u0900\u0904\u093a-\u093b\u094e-\u0950\u0955-\u0957\u0964-\u0965\u0970-\u0980\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09bb\u09bd\u09c5-\u09c6\u09c9-\u09ca\u09ce-\u09d6\u09d8-\u09db\u09de\u09e4-\u09e5\u09f2-\u0a01\u0a03-\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a3b\u0a3d\u0a43-\u0a46\u0a49-\u0a4a\u0a4e-\u0a58\u0a5d\u0a5f-\u0a65\u0a75-\u0a80\u0a84\u0a8c\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abb\u0ac6\u0aca\u0ace-\u0adf\u0ae1-\u0ae5\u0af0-\u0b00\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34-\u0b35\u0b3a-\u0b3b\u0b44-\u0b46\u0b49-\u0b4a\u0b4e-\u0b55\u0b58-\u0b5b\u0b5e\u0b62-\u0b65\u0b70-\u0b81\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bb6\u0bba-\u0bbd\u0bc3-\u0bc5\u0bc9\u0bce-\u0bd6\u0bd8-\u0be6\u0bf0-\u0c00\u0c04\u0c0d\u0c11\u0c29\u0c34\u0c3a-\u0c3d\u0c45\u0c49\u0c4e-\u0c54\u0c57-\u0c5f\u0c62-\u0c65\u0c70-\u0c81\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cbd\u0cc5\u0cc9\u0cce-\u0cd4\u0cd7-\u0cdd\u0cdf\u0ce2-\u0ce5\u0cf0-\u0d01\u0d04\u0d0d\u0d11\u0d29\u0d3a-\u0d3d\u0d44-\u0d45\u0d49\u0d4e-\u0d56\u0d58-\u0d5f\u0d62-\u0d65\u0d70-\u0e00\u0e2f\u0e3b-\u0e3f\u0e4f\u0e5a-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eaf\u0eba\u0ebe-\u0ebf\u0ec5\u0ec7\u0ece-\u0ecf\u0eda-\u0f17\u0f1a-\u0f1f\u0f2a-\u0f34\u0f36\u0f38\u0f3a-\u0f3d\u0f48\u0f6a-\u0f70\u0f85\u0f8c-\u0f8f\u0f96\u0f98\u0fae-\u0fb0\u0fb8\u0fba-\u109f\u10c6-\u10cf\u10f7-\u10ff\u1101\u1104\u1108\u110a\u110d\u1113-\u113b\u113d\u113f\u1141-\u114b\u114d\u114f\u1151-\u1153\u1156-\u1158\u115a-\u115e\u1162\u1164\u1166\u1168\u116a-\u116c\u116f-\u1171\u1174\u1176-\u119d\u119f-\u11a7\u11a9-\u11aa\u11ac-\u11ad\u11b0-\u11b6\u11b9\u11bb\u11c3-\u11ea\u11ec-\u11ef\u11f1-\u11f8\u11fa-\u1dff\u1e9c-\u1e9f\u1efa-\u1eff\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fbd\u1fbf-\u1fc1\u1fc5\u1fcd-\u1fcf\u1fd4-\u1fd5\u1fdc-\u1fdf\u1fed-\u1ff1\u1ff5\u1ffd-\u20cf\u20dd-\u20e0\u20e2-\u2125\u2127-\u2129\u212c-\u212d\u212f-\u217f\u2183-\u3004\u3006\u3008-\u3020\u3030\u3036-\u3040\u3095-\u3098\u309b-\u309c\u309f-\u30a0\u30fb\u30ff-\u3104\u312d-\u4dff\u9fa6-\uabff\ud7a4-\uffff]') # noqa - -nonXmlNameFirstBMPRegexp = re.compile('[\x00-@\\[-\\^`\\{-\xbf\xd7\xf7\u0132-\u0133\u013f-\u0140\u0149\u017f\u01c4-\u01cc\u01f1-\u01f3\u01f6-\u01f9\u0218-\u024f\u02a9-\u02ba\u02c2-\u0385\u0387\u038b\u038d\u03a2\u03cf\u03d7-\u03d9\u03db\u03dd\u03df\u03e1\u03f4-\u0400\u040d\u0450\u045d\u0482-\u048f\u04c5-\u04c6\u04c9-\u04ca\u04cd-\u04cf\u04ec-\u04ed\u04f6-\u04f7\u04fa-\u0530\u0557-\u0558\u055a-\u0560\u0587-\u05cf\u05eb-\u05ef\u05f3-\u0620\u063b-\u0640\u064b-\u0670\u06b8-\u06b9\u06bf\u06cf\u06d4\u06d6-\u06e4\u06e7-\u0904\u093a-\u093c\u093e-\u0957\u0962-\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09db\u09de\u09e2-\u09ef\u09f2-\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a58\u0a5d\u0a5f-\u0a71\u0a75-\u0a84\u0a8c\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abc\u0abe-\u0adf\u0ae1-\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34-\u0b35\u0b3a-\u0b3c\u0b3e-\u0b5b\u0b5e\u0b62-\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bb6\u0bba-\u0c04\u0c0d\u0c11\u0c29\u0c34\u0c3a-\u0c5f\u0c62-\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cdd\u0cdf\u0ce2-\u0d04\u0d0d\u0d11\u0d29\u0d3a-\u0d5f\u0d62-\u0e00\u0e2f\u0e31\u0e34-\u0e3f\u0e46-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eaf\u0eb1\u0eb4-\u0ebc\u0ebe-\u0ebf\u0ec5-\u0f3f\u0f48\u0f6a-\u109f\u10c6-\u10cf\u10f7-\u10ff\u1101\u1104\u1108\u110a\u110d\u1113-\u113b\u113d\u113f\u1141-\u114b\u114d\u114f\u1151-\u1153\u1156-\u1158\u115a-\u115e\u1162\u1164\u1166\u1168\u116a-\u116c\u116f-\u1171\u1174\u1176-\u119d\u119f-\u11a7\u11a9-\u11aa\u11ac-\u11ad\u11b0-\u11b6\u11b9\u11bb\u11c3-\u11ea\u11ec-\u11ef\u11f1-\u11f8\u11fa-\u1dff\u1e9c-\u1e9f\u1efa-\u1eff\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fbd\u1fbf-\u1fc1\u1fc5\u1fcd-\u1fcf\u1fd4-\u1fd5\u1fdc-\u1fdf\u1fed-\u1ff1\u1ff5\u1ffd-\u2125\u2127-\u2129\u212c-\u212d\u212f-\u217f\u2183-\u3006\u3008-\u3020\u302a-\u3040\u3095-\u30a0\u30fb-\u3104\u312d-\u4dff\u9fa6-\uabff\ud7a4-\uffff]') # noqa - -# Simpler things -nonPubidCharRegexp = re.compile("[^\x20\x0D\x0Aa-zA-Z0-9\\-'()+,./:=?;!*#@$_%]") - - -class InfosetFilter(object): - replacementRegexp = re.compile(r"U[\dA-F]{5,5}") - - def __init__(self, - dropXmlnsLocalName=False, - dropXmlnsAttrNs=False, - preventDoubleDashComments=False, - preventDashAtCommentEnd=False, - replaceFormFeedCharacters=True, - preventSingleQuotePubid=False): - - self.dropXmlnsLocalName = dropXmlnsLocalName - self.dropXmlnsAttrNs = dropXmlnsAttrNs - - self.preventDoubleDashComments = preventDoubleDashComments - self.preventDashAtCommentEnd = preventDashAtCommentEnd - - self.replaceFormFeedCharacters = replaceFormFeedCharacters - - self.preventSingleQuotePubid = preventSingleQuotePubid - - self.replaceCache = {} - - def coerceAttribute(self, name, namespace=None): - if self.dropXmlnsLocalName and name.startswith("xmlns:"): - warnings.warn("Attributes cannot begin with xmlns", DataLossWarning) - return None - elif (self.dropXmlnsAttrNs and - namespace == "http://www.w3.org/2000/xmlns/"): - warnings.warn("Attributes cannot be in the xml namespace", DataLossWarning) - return None - else: - return self.toXmlName(name) - - def coerceElement(self, name): - return self.toXmlName(name) - - def coerceComment(self, data): - if self.preventDoubleDashComments: - while "--" in data: - warnings.warn("Comments cannot contain adjacent dashes", DataLossWarning) - data = data.replace("--", "- -") - if data.endswith("-"): - warnings.warn("Comments cannot end in a dash", DataLossWarning) - data += " " - return data - - def coerceCharacters(self, data): - if self.replaceFormFeedCharacters: - for _ in range(data.count("\x0C")): - warnings.warn("Text cannot contain U+000C", DataLossWarning) - data = data.replace("\x0C", " ") - # Other non-xml characters - return data - - def coercePubid(self, data): - dataOutput = data - for char in nonPubidCharRegexp.findall(data): - warnings.warn("Coercing non-XML pubid", DataLossWarning) - replacement = self.getReplacementCharacter(char) - dataOutput = dataOutput.replace(char, replacement) - if self.preventSingleQuotePubid and dataOutput.find("'") >= 0: - warnings.warn("Pubid cannot contain single quote", DataLossWarning) - dataOutput = dataOutput.replace("'", self.getReplacementCharacter("'")) - return dataOutput - - def toXmlName(self, name): - nameFirst = name[0] - nameRest = name[1:] - m = nonXmlNameFirstBMPRegexp.match(nameFirst) - if m: - warnings.warn("Coercing non-XML name", DataLossWarning) - nameFirstOutput = self.getReplacementCharacter(nameFirst) - else: - nameFirstOutput = nameFirst - - nameRestOutput = nameRest - replaceChars = set(nonXmlNameBMPRegexp.findall(nameRest)) - for char in replaceChars: - warnings.warn("Coercing non-XML name", DataLossWarning) - replacement = self.getReplacementCharacter(char) - nameRestOutput = nameRestOutput.replace(char, replacement) - return nameFirstOutput + nameRestOutput - - def getReplacementCharacter(self, char): - if char in self.replaceCache: - replacement = self.replaceCache[char] - else: - replacement = self.escapeChar(char) - return replacement - - def fromXmlName(self, name): - for item in set(self.replacementRegexp.findall(name)): - name = name.replace(item, self.unescapeChar(item)) - return name - - def escapeChar(self, char): - replacement = "U%05X" % ord(char) - self.replaceCache[char] = replacement - return replacement - - def unescapeChar(self, charcode): - return chr(int(charcode[1:], 16)) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/_inputstream.py b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/_inputstream.py deleted file mode 100644 index a65e55f..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/_inputstream.py +++ /dev/null @@ -1,923 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from pip._vendor.six import text_type, binary_type -from pip._vendor.six.moves import http_client, urllib - -import codecs -import re - -from pip._vendor import webencodings - -from .constants import EOF, spaceCharacters, asciiLetters, asciiUppercase -from .constants import _ReparseException -from . import _utils - -from io import StringIO - -try: - from io import BytesIO -except ImportError: - BytesIO = StringIO - -# Non-unicode versions of constants for use in the pre-parser -spaceCharactersBytes = frozenset([item.encode("ascii") for item in spaceCharacters]) -asciiLettersBytes = frozenset([item.encode("ascii") for item in asciiLetters]) -asciiUppercaseBytes = frozenset([item.encode("ascii") for item in asciiUppercase]) -spacesAngleBrackets = spaceCharactersBytes | frozenset([b">", b"<"]) - - -invalid_unicode_no_surrogate = "[\u0001-\u0008\u000B\u000E-\u001F\u007F-\u009F\uFDD0-\uFDEF\uFFFE\uFFFF\U0001FFFE\U0001FFFF\U0002FFFE\U0002FFFF\U0003FFFE\U0003FFFF\U0004FFFE\U0004FFFF\U0005FFFE\U0005FFFF\U0006FFFE\U0006FFFF\U0007FFFE\U0007FFFF\U0008FFFE\U0008FFFF\U0009FFFE\U0009FFFF\U000AFFFE\U000AFFFF\U000BFFFE\U000BFFFF\U000CFFFE\U000CFFFF\U000DFFFE\U000DFFFF\U000EFFFE\U000EFFFF\U000FFFFE\U000FFFFF\U0010FFFE\U0010FFFF]" # noqa - -if _utils.supports_lone_surrogates: - # Use one extra step of indirection and create surrogates with - # eval. Not using this indirection would introduce an illegal - # unicode literal on platforms not supporting such lone - # surrogates. - assert invalid_unicode_no_surrogate[-1] == "]" and invalid_unicode_no_surrogate.count("]") == 1 - invalid_unicode_re = re.compile(invalid_unicode_no_surrogate[:-1] + - eval('"\\uD800-\\uDFFF"') + # pylint:disable=eval-used - "]") -else: - invalid_unicode_re = re.compile(invalid_unicode_no_surrogate) - -non_bmp_invalid_codepoints = set([0x1FFFE, 0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE, - 0x3FFFF, 0x4FFFE, 0x4FFFF, 0x5FFFE, 0x5FFFF, - 0x6FFFE, 0x6FFFF, 0x7FFFE, 0x7FFFF, 0x8FFFE, - 0x8FFFF, 0x9FFFE, 0x9FFFF, 0xAFFFE, 0xAFFFF, - 0xBFFFE, 0xBFFFF, 0xCFFFE, 0xCFFFF, 0xDFFFE, - 0xDFFFF, 0xEFFFE, 0xEFFFF, 0xFFFFE, 0xFFFFF, - 0x10FFFE, 0x10FFFF]) - -ascii_punctuation_re = re.compile("[\u0009-\u000D\u0020-\u002F\u003A-\u0040\u005C\u005B-\u0060\u007B-\u007E]") - -# Cache for charsUntil() -charsUntilRegEx = {} - - -class BufferedStream(object): - """Buffering for streams that do not have buffering of their own - - The buffer is implemented as a list of chunks on the assumption that - joining many strings will be slow since it is O(n**2) - """ - - def __init__(self, stream): - self.stream = stream - self.buffer = [] - self.position = [-1, 0] # chunk number, offset - - def tell(self): - pos = 0 - for chunk in self.buffer[:self.position[0]]: - pos += len(chunk) - pos += self.position[1] - return pos - - def seek(self, pos): - assert pos <= self._bufferedBytes() - offset = pos - i = 0 - while len(self.buffer[i]) < offset: - offset -= len(self.buffer[i]) - i += 1 - self.position = [i, offset] - - def read(self, bytes): - if not self.buffer: - return self._readStream(bytes) - elif (self.position[0] == len(self.buffer) and - self.position[1] == len(self.buffer[-1])): - return self._readStream(bytes) - else: - return self._readFromBuffer(bytes) - - def _bufferedBytes(self): - return sum([len(item) for item in self.buffer]) - - def _readStream(self, bytes): - data = self.stream.read(bytes) - self.buffer.append(data) - self.position[0] += 1 - self.position[1] = len(data) - return data - - def _readFromBuffer(self, bytes): - remainingBytes = bytes - rv = [] - bufferIndex = self.position[0] - bufferOffset = self.position[1] - while bufferIndex < len(self.buffer) and remainingBytes != 0: - assert remainingBytes > 0 - bufferedData = self.buffer[bufferIndex] - - if remainingBytes <= len(bufferedData) - bufferOffset: - bytesToRead = remainingBytes - self.position = [bufferIndex, bufferOffset + bytesToRead] - else: - bytesToRead = len(bufferedData) - bufferOffset - self.position = [bufferIndex, len(bufferedData)] - bufferIndex += 1 - rv.append(bufferedData[bufferOffset:bufferOffset + bytesToRead]) - remainingBytes -= bytesToRead - - bufferOffset = 0 - - if remainingBytes: - rv.append(self._readStream(remainingBytes)) - - return b"".join(rv) - - -def HTMLInputStream(source, **kwargs): - # Work around Python bug #20007: read(0) closes the connection. - # http://bugs.python.org/issue20007 - if (isinstance(source, http_client.HTTPResponse) or - # Also check for addinfourl wrapping HTTPResponse - (isinstance(source, urllib.response.addbase) and - isinstance(source.fp, http_client.HTTPResponse))): - isUnicode = False - elif hasattr(source, "read"): - isUnicode = isinstance(source.read(0), text_type) - else: - isUnicode = isinstance(source, text_type) - - if isUnicode: - encodings = [x for x in kwargs if x.endswith("_encoding")] - if encodings: - raise TypeError("Cannot set an encoding with a unicode input, set %r" % encodings) - - return HTMLUnicodeInputStream(source, **kwargs) - else: - return HTMLBinaryInputStream(source, **kwargs) - - -class HTMLUnicodeInputStream(object): - """Provides a unicode stream of characters to the HTMLTokenizer. - - This class takes care of character encoding and removing or replacing - incorrect byte-sequences and also provides column and line tracking. - - """ - - _defaultChunkSize = 10240 - - def __init__(self, source): - """Initialises the HTMLInputStream. - - HTMLInputStream(source, [encoding]) -> Normalized stream from source - for use by html5lib. - - source can be either a file-object, local filename or a string. - - The optional encoding parameter must be a string that indicates - the encoding. If specified, that encoding will be used, - regardless of any BOM or later declaration (such as in a meta - element) - - """ - - if not _utils.supports_lone_surrogates: - # Such platforms will have already checked for such - # surrogate errors, so no need to do this checking. - self.reportCharacterErrors = None - elif len("\U0010FFFF") == 1: - self.reportCharacterErrors = self.characterErrorsUCS4 - else: - self.reportCharacterErrors = self.characterErrorsUCS2 - - # List of where new lines occur - self.newLines = [0] - - self.charEncoding = (lookupEncoding("utf-8"), "certain") - self.dataStream = self.openStream(source) - - self.reset() - - def reset(self): - self.chunk = "" - self.chunkSize = 0 - self.chunkOffset = 0 - self.errors = [] - - # number of (complete) lines in previous chunks - self.prevNumLines = 0 - # number of columns in the last line of the previous chunk - self.prevNumCols = 0 - - # Deal with CR LF and surrogates split over chunk boundaries - self._bufferedCharacter = None - - def openStream(self, source): - """Produces a file object from source. - - source can be either a file object, local filename or a string. - - """ - # Already a file object - if hasattr(source, 'read'): - stream = source - else: - stream = StringIO(source) - - return stream - - def _position(self, offset): - chunk = self.chunk - nLines = chunk.count('\n', 0, offset) - positionLine = self.prevNumLines + nLines - lastLinePos = chunk.rfind('\n', 0, offset) - if lastLinePos == -1: - positionColumn = self.prevNumCols + offset - else: - positionColumn = offset - (lastLinePos + 1) - return (positionLine, positionColumn) - - def position(self): - """Returns (line, col) of the current position in the stream.""" - line, col = self._position(self.chunkOffset) - return (line + 1, col) - - def char(self): - """ Read one character from the stream or queue if available. Return - EOF when EOF is reached. - """ - # Read a new chunk from the input stream if necessary - if self.chunkOffset >= self.chunkSize: - if not self.readChunk(): - return EOF - - chunkOffset = self.chunkOffset - char = self.chunk[chunkOffset] - self.chunkOffset = chunkOffset + 1 - - return char - - def readChunk(self, chunkSize=None): - if chunkSize is None: - chunkSize = self._defaultChunkSize - - self.prevNumLines, self.prevNumCols = self._position(self.chunkSize) - - self.chunk = "" - self.chunkSize = 0 - self.chunkOffset = 0 - - data = self.dataStream.read(chunkSize) - - # Deal with CR LF and surrogates broken across chunks - if self._bufferedCharacter: - data = self._bufferedCharacter + data - self._bufferedCharacter = None - elif not data: - # We have no more data, bye-bye stream - return False - - if len(data) > 1: - lastv = ord(data[-1]) - if lastv == 0x0D or 0xD800 <= lastv <= 0xDBFF: - self._bufferedCharacter = data[-1] - data = data[:-1] - - if self.reportCharacterErrors: - self.reportCharacterErrors(data) - - # Replace invalid characters - data = data.replace("\r\n", "\n") - data = data.replace("\r", "\n") - - self.chunk = data - self.chunkSize = len(data) - - return True - - def characterErrorsUCS4(self, data): - for _ in range(len(invalid_unicode_re.findall(data))): - self.errors.append("invalid-codepoint") - - def characterErrorsUCS2(self, data): - # Someone picked the wrong compile option - # You lose - skip = False - for match in invalid_unicode_re.finditer(data): - if skip: - continue - codepoint = ord(match.group()) - pos = match.start() - # Pretty sure there should be endianness issues here - if _utils.isSurrogatePair(data[pos:pos + 2]): - # We have a surrogate pair! - char_val = _utils.surrogatePairToCodepoint(data[pos:pos + 2]) - if char_val in non_bmp_invalid_codepoints: - self.errors.append("invalid-codepoint") - skip = True - elif (codepoint >= 0xD800 and codepoint <= 0xDFFF and - pos == len(data) - 1): - self.errors.append("invalid-codepoint") - else: - skip = False - self.errors.append("invalid-codepoint") - - def charsUntil(self, characters, opposite=False): - """ Returns a string of characters from the stream up to but not - including any character in 'characters' or EOF. 'characters' must be - a container that supports the 'in' method and iteration over its - characters. - """ - - # Use a cache of regexps to find the required characters - try: - chars = charsUntilRegEx[(characters, opposite)] - except KeyError: - if __debug__: - for c in characters: - assert(ord(c) < 128) - regex = "".join(["\\x%02x" % ord(c) for c in characters]) - if not opposite: - regex = "^%s" % regex - chars = charsUntilRegEx[(characters, opposite)] = re.compile("[%s]+" % regex) - - rv = [] - - while True: - # Find the longest matching prefix - m = chars.match(self.chunk, self.chunkOffset) - if m is None: - # If nothing matched, and it wasn't because we ran out of chunk, - # then stop - if self.chunkOffset != self.chunkSize: - break - else: - end = m.end() - # If not the whole chunk matched, return everything - # up to the part that didn't match - if end != self.chunkSize: - rv.append(self.chunk[self.chunkOffset:end]) - self.chunkOffset = end - break - # If the whole remainder of the chunk matched, - # use it all and read the next chunk - rv.append(self.chunk[self.chunkOffset:]) - if not self.readChunk(): - # Reached EOF - break - - r = "".join(rv) - return r - - def unget(self, char): - # Only one character is allowed to be ungotten at once - it must - # be consumed again before any further call to unget - if char is not None: - if self.chunkOffset == 0: - # unget is called quite rarely, so it's a good idea to do - # more work here if it saves a bit of work in the frequently - # called char and charsUntil. - # So, just prepend the ungotten character onto the current - # chunk: - self.chunk = char + self.chunk - self.chunkSize += 1 - else: - self.chunkOffset -= 1 - assert self.chunk[self.chunkOffset] == char - - -class HTMLBinaryInputStream(HTMLUnicodeInputStream): - """Provides a unicode stream of characters to the HTMLTokenizer. - - This class takes care of character encoding and removing or replacing - incorrect byte-sequences and also provides column and line tracking. - - """ - - def __init__(self, source, override_encoding=None, transport_encoding=None, - same_origin_parent_encoding=None, likely_encoding=None, - default_encoding="windows-1252", useChardet=True): - """Initialises the HTMLInputStream. - - HTMLInputStream(source, [encoding]) -> Normalized stream from source - for use by html5lib. - - source can be either a file-object, local filename or a string. - - The optional encoding parameter must be a string that indicates - the encoding. If specified, that encoding will be used, - regardless of any BOM or later declaration (such as in a meta - element) - - """ - # Raw Stream - for unicode objects this will encode to utf-8 and set - # self.charEncoding as appropriate - self.rawStream = self.openStream(source) - - HTMLUnicodeInputStream.__init__(self, self.rawStream) - - # Encoding Information - # Number of bytes to use when looking for a meta element with - # encoding information - self.numBytesMeta = 1024 - # Number of bytes to use when using detecting encoding using chardet - self.numBytesChardet = 100 - # Things from args - self.override_encoding = override_encoding - self.transport_encoding = transport_encoding - self.same_origin_parent_encoding = same_origin_parent_encoding - self.likely_encoding = likely_encoding - self.default_encoding = default_encoding - - # Determine encoding - self.charEncoding = self.determineEncoding(useChardet) - assert self.charEncoding[0] is not None - - # Call superclass - self.reset() - - def reset(self): - self.dataStream = self.charEncoding[0].codec_info.streamreader(self.rawStream, 'replace') - HTMLUnicodeInputStream.reset(self) - - def openStream(self, source): - """Produces a file object from source. - - source can be either a file object, local filename or a string. - - """ - # Already a file object - if hasattr(source, 'read'): - stream = source - else: - stream = BytesIO(source) - - try: - stream.seek(stream.tell()) - except: # pylint:disable=bare-except - stream = BufferedStream(stream) - - return stream - - def determineEncoding(self, chardet=True): - # BOMs take precedence over everything - # This will also read past the BOM if present - charEncoding = self.detectBOM(), "certain" - if charEncoding[0] is not None: - return charEncoding - - # If we've been overriden, we've been overriden - charEncoding = lookupEncoding(self.override_encoding), "certain" - if charEncoding[0] is not None: - return charEncoding - - # Now check the transport layer - charEncoding = lookupEncoding(self.transport_encoding), "certain" - if charEncoding[0] is not None: - return charEncoding - - # Look for meta elements with encoding information - charEncoding = self.detectEncodingMeta(), "tentative" - if charEncoding[0] is not None: - return charEncoding - - # Parent document encoding - charEncoding = lookupEncoding(self.same_origin_parent_encoding), "tentative" - if charEncoding[0] is not None and not charEncoding[0].name.startswith("utf-16"): - return charEncoding - - # "likely" encoding - charEncoding = lookupEncoding(self.likely_encoding), "tentative" - if charEncoding[0] is not None: - return charEncoding - - # Guess with chardet, if available - if chardet: - try: - from pip._vendor.chardet.universaldetector import UniversalDetector - except ImportError: - pass - else: - buffers = [] - detector = UniversalDetector() - while not detector.done: - buffer = self.rawStream.read(self.numBytesChardet) - assert isinstance(buffer, bytes) - if not buffer: - break - buffers.append(buffer) - detector.feed(buffer) - detector.close() - encoding = lookupEncoding(detector.result['encoding']) - self.rawStream.seek(0) - if encoding is not None: - return encoding, "tentative" - - # Try the default encoding - charEncoding = lookupEncoding(self.default_encoding), "tentative" - if charEncoding[0] is not None: - return charEncoding - - # Fallback to html5lib's default if even that hasn't worked - return lookupEncoding("windows-1252"), "tentative" - - def changeEncoding(self, newEncoding): - assert self.charEncoding[1] != "certain" - newEncoding = lookupEncoding(newEncoding) - if newEncoding is None: - return - if newEncoding.name in ("utf-16be", "utf-16le"): - newEncoding = lookupEncoding("utf-8") - assert newEncoding is not None - elif newEncoding == self.charEncoding[0]: - self.charEncoding = (self.charEncoding[0], "certain") - else: - self.rawStream.seek(0) - self.charEncoding = (newEncoding, "certain") - self.reset() - raise _ReparseException("Encoding changed from %s to %s" % (self.charEncoding[0], newEncoding)) - - def detectBOM(self): - """Attempts to detect at BOM at the start of the stream. If - an encoding can be determined from the BOM return the name of the - encoding otherwise return None""" - bomDict = { - codecs.BOM_UTF8: 'utf-8', - codecs.BOM_UTF16_LE: 'utf-16le', codecs.BOM_UTF16_BE: 'utf-16be', - codecs.BOM_UTF32_LE: 'utf-32le', codecs.BOM_UTF32_BE: 'utf-32be' - } - - # Go to beginning of file and read in 4 bytes - string = self.rawStream.read(4) - assert isinstance(string, bytes) - - # Try detecting the BOM using bytes from the string - encoding = bomDict.get(string[:3]) # UTF-8 - seek = 3 - if not encoding: - # Need to detect UTF-32 before UTF-16 - encoding = bomDict.get(string) # UTF-32 - seek = 4 - if not encoding: - encoding = bomDict.get(string[:2]) # UTF-16 - seek = 2 - - # Set the read position past the BOM if one was found, otherwise - # set it to the start of the stream - if encoding: - self.rawStream.seek(seek) - return lookupEncoding(encoding) - else: - self.rawStream.seek(0) - return None - - def detectEncodingMeta(self): - """Report the encoding declared by the meta element - """ - buffer = self.rawStream.read(self.numBytesMeta) - assert isinstance(buffer, bytes) - parser = EncodingParser(buffer) - self.rawStream.seek(0) - encoding = parser.getEncoding() - - if encoding is not None and encoding.name in ("utf-16be", "utf-16le"): - encoding = lookupEncoding("utf-8") - - return encoding - - -class EncodingBytes(bytes): - """String-like object with an associated position and various extra methods - If the position is ever greater than the string length then an exception is - raised""" - def __new__(self, value): - assert isinstance(value, bytes) - return bytes.__new__(self, value.lower()) - - def __init__(self, value): - # pylint:disable=unused-argument - self._position = -1 - - def __iter__(self): - return self - - def __next__(self): - p = self._position = self._position + 1 - if p >= len(self): - raise StopIteration - elif p < 0: - raise TypeError - return self[p:p + 1] - - def next(self): - # Py2 compat - return self.__next__() - - def previous(self): - p = self._position - if p >= len(self): - raise StopIteration - elif p < 0: - raise TypeError - self._position = p = p - 1 - return self[p:p + 1] - - def setPosition(self, position): - if self._position >= len(self): - raise StopIteration - self._position = position - - def getPosition(self): - if self._position >= len(self): - raise StopIteration - if self._position >= 0: - return self._position - else: - return None - - position = property(getPosition, setPosition) - - def getCurrentByte(self): - return self[self.position:self.position + 1] - - currentByte = property(getCurrentByte) - - def skip(self, chars=spaceCharactersBytes): - """Skip past a list of characters""" - p = self.position # use property for the error-checking - while p < len(self): - c = self[p:p + 1] - if c not in chars: - self._position = p - return c - p += 1 - self._position = p - return None - - def skipUntil(self, chars): - p = self.position - while p < len(self): - c = self[p:p + 1] - if c in chars: - self._position = p - return c - p += 1 - self._position = p - return None - - def matchBytes(self, bytes): - """Look for a sequence of bytes at the start of a string. If the bytes - are found return True and advance the position to the byte after the - match. Otherwise return False and leave the position alone""" - p = self.position - data = self[p:p + len(bytes)] - rv = data.startswith(bytes) - if rv: - self.position += len(bytes) - return rv - - def jumpTo(self, bytes): - """Look for the next sequence of bytes matching a given sequence. If - a match is found advance the position to the last byte of the match""" - newPosition = self[self.position:].find(bytes) - if newPosition > -1: - # XXX: This is ugly, but I can't see a nicer way to fix this. - if self._position == -1: - self._position = 0 - self._position += (newPosition + len(bytes) - 1) - return True - else: - raise StopIteration - - -class EncodingParser(object): - """Mini parser for detecting character encoding from meta elements""" - - def __init__(self, data): - """string - the data to work on for encoding detection""" - self.data = EncodingBytes(data) - self.encoding = None - - def getEncoding(self): - methodDispatch = ( - (b"<!--", self.handleComment), - (b"<meta", self.handleMeta), - (b"</", self.handlePossibleEndTag), - (b"<!", self.handleOther), - (b"<?", self.handleOther), - (b"<", self.handlePossibleStartTag)) - for _ in self.data: - keepParsing = True - for key, method in methodDispatch: - if self.data.matchBytes(key): - try: - keepParsing = method() - break - except StopIteration: - keepParsing = False - break - if not keepParsing: - break - - return self.encoding - - def handleComment(self): - """Skip over comments""" - return self.data.jumpTo(b"-->") - - def handleMeta(self): - if self.data.currentByte not in spaceCharactersBytes: - # if we have <meta not followed by a space so just keep going - return True - # We have a valid meta element we want to search for attributes - hasPragma = False - pendingEncoding = None - while True: - # Try to find the next attribute after the current position - attr = self.getAttribute() - if attr is None: - return True - else: - if attr[0] == b"http-equiv": - hasPragma = attr[1] == b"content-type" - if hasPragma and pendingEncoding is not None: - self.encoding = pendingEncoding - return False - elif attr[0] == b"charset": - tentativeEncoding = attr[1] - codec = lookupEncoding(tentativeEncoding) - if codec is not None: - self.encoding = codec - return False - elif attr[0] == b"content": - contentParser = ContentAttrParser(EncodingBytes(attr[1])) - tentativeEncoding = contentParser.parse() - if tentativeEncoding is not None: - codec = lookupEncoding(tentativeEncoding) - if codec is not None: - if hasPragma: - self.encoding = codec - return False - else: - pendingEncoding = codec - - def handlePossibleStartTag(self): - return self.handlePossibleTag(False) - - def handlePossibleEndTag(self): - next(self.data) - return self.handlePossibleTag(True) - - def handlePossibleTag(self, endTag): - data = self.data - if data.currentByte not in asciiLettersBytes: - # If the next byte is not an ascii letter either ignore this - # fragment (possible start tag case) or treat it according to - # handleOther - if endTag: - data.previous() - self.handleOther() - return True - - c = data.skipUntil(spacesAngleBrackets) - if c == b"<": - # return to the first step in the overall "two step" algorithm - # reprocessing the < byte - data.previous() - else: - # Read all attributes - attr = self.getAttribute() - while attr is not None: - attr = self.getAttribute() - return True - - def handleOther(self): - return self.data.jumpTo(b">") - - def getAttribute(self): - """Return a name,value pair for the next attribute in the stream, - if one is found, or None""" - data = self.data - # Step 1 (skip chars) - c = data.skip(spaceCharactersBytes | frozenset([b"/"])) - assert c is None or len(c) == 1 - # Step 2 - if c in (b">", None): - return None - # Step 3 - attrName = [] - attrValue = [] - # Step 4 attribute name - while True: - if c == b"=" and attrName: - break - elif c in spaceCharactersBytes: - # Step 6! - c = data.skip() - break - elif c in (b"/", b">"): - return b"".join(attrName), b"" - elif c in asciiUppercaseBytes: - attrName.append(c.lower()) - elif c is None: - return None - else: - attrName.append(c) - # Step 5 - c = next(data) - # Step 7 - if c != b"=": - data.previous() - return b"".join(attrName), b"" - # Step 8 - next(data) - # Step 9 - c = data.skip() - # Step 10 - if c in (b"'", b'"'): - # 10.1 - quoteChar = c - while True: - # 10.2 - c = next(data) - # 10.3 - if c == quoteChar: - next(data) - return b"".join(attrName), b"".join(attrValue) - # 10.4 - elif c in asciiUppercaseBytes: - attrValue.append(c.lower()) - # 10.5 - else: - attrValue.append(c) - elif c == b">": - return b"".join(attrName), b"" - elif c in asciiUppercaseBytes: - attrValue.append(c.lower()) - elif c is None: - return None - else: - attrValue.append(c) - # Step 11 - while True: - c = next(data) - if c in spacesAngleBrackets: - return b"".join(attrName), b"".join(attrValue) - elif c in asciiUppercaseBytes: - attrValue.append(c.lower()) - elif c is None: - return None - else: - attrValue.append(c) - - -class ContentAttrParser(object): - def __init__(self, data): - assert isinstance(data, bytes) - self.data = data - - def parse(self): - try: - # Check if the attr name is charset - # otherwise return - self.data.jumpTo(b"charset") - self.data.position += 1 - self.data.skip() - if not self.data.currentByte == b"=": - # If there is no = sign keep looking for attrs - return None - self.data.position += 1 - self.data.skip() - # Look for an encoding between matching quote marks - if self.data.currentByte in (b'"', b"'"): - quoteMark = self.data.currentByte - self.data.position += 1 - oldPosition = self.data.position - if self.data.jumpTo(quoteMark): - return self.data[oldPosition:self.data.position] - else: - return None - else: - # Unquoted value - oldPosition = self.data.position - try: - self.data.skipUntil(spaceCharactersBytes) - return self.data[oldPosition:self.data.position] - except StopIteration: - # Return the whole remaining value - return self.data[oldPosition:] - except StopIteration: - return None - - -def lookupEncoding(encoding): - """Return the python codec name corresponding to an encoding or None if the - string doesn't correspond to a valid encoding.""" - if isinstance(encoding, binary_type): - try: - encoding = encoding.decode("ascii") - except UnicodeDecodeError: - return None - - if encoding is not None: - try: - return webencodings.lookup(encoding) - except AttributeError: - return None - else: - return None diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/_tokenizer.py b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/_tokenizer.py deleted file mode 100644 index 178f6e7..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/_tokenizer.py +++ /dev/null @@ -1,1721 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from pip._vendor.six import unichr as chr - -from collections import deque - -from .constants import spaceCharacters -from .constants import entities -from .constants import asciiLetters, asciiUpper2Lower -from .constants import digits, hexDigits, EOF -from .constants import tokenTypes, tagTokenTypes -from .constants import replacementCharacters - -from ._inputstream import HTMLInputStream - -from ._trie import Trie - -entitiesTrie = Trie(entities) - - -class HTMLTokenizer(object): - """ This class takes care of tokenizing HTML. - - * self.currentToken - Holds the token that is currently being processed. - - * self.state - Holds a reference to the method to be invoked... XXX - - * self.stream - Points to HTMLInputStream object. - """ - - def __init__(self, stream, parser=None, **kwargs): - - self.stream = HTMLInputStream(stream, **kwargs) - self.parser = parser - - # Setup the initial tokenizer state - self.escapeFlag = False - self.lastFourChars = [] - self.state = self.dataState - self.escape = False - - # The current token being created - self.currentToken = None - super(HTMLTokenizer, self).__init__() - - def __iter__(self): - """ This is where the magic happens. - - We do our usually processing through the states and when we have a token - to return we yield the token which pauses processing until the next token - is requested. - """ - self.tokenQueue = deque([]) - # Start processing. When EOF is reached self.state will return False - # instead of True and the loop will terminate. - while self.state(): - while self.stream.errors: - yield {"type": tokenTypes["ParseError"], "data": self.stream.errors.pop(0)} - while self.tokenQueue: - yield self.tokenQueue.popleft() - - def consumeNumberEntity(self, isHex): - """This function returns either U+FFFD or the character based on the - decimal or hexadecimal representation. It also discards ";" if present. - If not present self.tokenQueue.append({"type": tokenTypes["ParseError"]}) is invoked. - """ - - allowed = digits - radix = 10 - if isHex: - allowed = hexDigits - radix = 16 - - charStack = [] - - # Consume all the characters that are in range while making sure we - # don't hit an EOF. - c = self.stream.char() - while c in allowed and c is not EOF: - charStack.append(c) - c = self.stream.char() - - # Convert the set of characters consumed to an int. - charAsInt = int("".join(charStack), radix) - - # Certain characters get replaced with others - if charAsInt in replacementCharacters: - char = replacementCharacters[charAsInt] - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "illegal-codepoint-for-numeric-entity", - "datavars": {"charAsInt": charAsInt}}) - elif ((0xD800 <= charAsInt <= 0xDFFF) or - (charAsInt > 0x10FFFF)): - char = "\uFFFD" - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "illegal-codepoint-for-numeric-entity", - "datavars": {"charAsInt": charAsInt}}) - else: - # Should speed up this check somehow (e.g. move the set to a constant) - if ((0x0001 <= charAsInt <= 0x0008) or - (0x000E <= charAsInt <= 0x001F) or - (0x007F <= charAsInt <= 0x009F) or - (0xFDD0 <= charAsInt <= 0xFDEF) or - charAsInt in frozenset([0x000B, 0xFFFE, 0xFFFF, 0x1FFFE, - 0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE, - 0x3FFFF, 0x4FFFE, 0x4FFFF, 0x5FFFE, - 0x5FFFF, 0x6FFFE, 0x6FFFF, 0x7FFFE, - 0x7FFFF, 0x8FFFE, 0x8FFFF, 0x9FFFE, - 0x9FFFF, 0xAFFFE, 0xAFFFF, 0xBFFFE, - 0xBFFFF, 0xCFFFE, 0xCFFFF, 0xDFFFE, - 0xDFFFF, 0xEFFFE, 0xEFFFF, 0xFFFFE, - 0xFFFFF, 0x10FFFE, 0x10FFFF])): - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": - "illegal-codepoint-for-numeric-entity", - "datavars": {"charAsInt": charAsInt}}) - try: - # Try/except needed as UCS-2 Python builds' unichar only works - # within the BMP. - char = chr(charAsInt) - except ValueError: - v = charAsInt - 0x10000 - char = chr(0xD800 | (v >> 10)) + chr(0xDC00 | (v & 0x3FF)) - - # Discard the ; if present. Otherwise, put it back on the queue and - # invoke parseError on parser. - if c != ";": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "numeric-entity-without-semicolon"}) - self.stream.unget(c) - - return char - - def consumeEntity(self, allowedChar=None, fromAttribute=False): - # Initialise to the default output for when no entity is matched - output = "&" - - charStack = [self.stream.char()] - if (charStack[0] in spaceCharacters or charStack[0] in (EOF, "<", "&") or - (allowedChar is not None and allowedChar == charStack[0])): - self.stream.unget(charStack[0]) - - elif charStack[0] == "#": - # Read the next character to see if it's hex or decimal - hex = False - charStack.append(self.stream.char()) - if charStack[-1] in ("x", "X"): - hex = True - charStack.append(self.stream.char()) - - # charStack[-1] should be the first digit - if (hex and charStack[-1] in hexDigits) \ - or (not hex and charStack[-1] in digits): - # At least one digit found, so consume the whole number - self.stream.unget(charStack[-1]) - output = self.consumeNumberEntity(hex) - else: - # No digits found - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "expected-numeric-entity"}) - self.stream.unget(charStack.pop()) - output = "&" + "".join(charStack) - - else: - # At this point in the process might have named entity. Entities - # are stored in the global variable "entities". - # - # Consume characters and compare to these to a substring of the - # entity names in the list until the substring no longer matches. - while (charStack[-1] is not EOF): - if not entitiesTrie.has_keys_with_prefix("".join(charStack)): - break - charStack.append(self.stream.char()) - - # At this point we have a string that starts with some characters - # that may match an entity - # Try to find the longest entity the string will match to take care - # of ¬i for instance. - try: - entityName = entitiesTrie.longest_prefix("".join(charStack[:-1])) - entityLength = len(entityName) - except KeyError: - entityName = None - - if entityName is not None: - if entityName[-1] != ";": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "named-entity-without-semicolon"}) - if (entityName[-1] != ";" and fromAttribute and - (charStack[entityLength] in asciiLetters or - charStack[entityLength] in digits or - charStack[entityLength] == "=")): - self.stream.unget(charStack.pop()) - output = "&" + "".join(charStack) - else: - output = entities[entityName] - self.stream.unget(charStack.pop()) - output += "".join(charStack[entityLength:]) - else: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-named-entity"}) - self.stream.unget(charStack.pop()) - output = "&" + "".join(charStack) - - if fromAttribute: - self.currentToken["data"][-1][1] += output - else: - if output in spaceCharacters: - tokenType = "SpaceCharacters" - else: - tokenType = "Characters" - self.tokenQueue.append({"type": tokenTypes[tokenType], "data": output}) - - def processEntityInAttribute(self, allowedChar): - """This method replaces the need for "entityInAttributeValueState". - """ - self.consumeEntity(allowedChar=allowedChar, fromAttribute=True) - - def emitCurrentToken(self): - """This method is a generic handler for emitting the tags. It also sets - the state to "data" because that's what's needed after a token has been - emitted. - """ - token = self.currentToken - # Add token to the queue to be yielded - if (token["type"] in tagTokenTypes): - token["name"] = token["name"].translate(asciiUpper2Lower) - if token["type"] == tokenTypes["EndTag"]: - if token["data"]: - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "attributes-in-end-tag"}) - if token["selfClosing"]: - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "self-closing-flag-on-end-tag"}) - self.tokenQueue.append(token) - self.state = self.dataState - - # Below are the various tokenizer states worked out. - def dataState(self): - data = self.stream.char() - if data == "&": - self.state = self.entityDataState - elif data == "<": - self.state = self.tagOpenState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "\u0000"}) - elif data is EOF: - # Tokenization ends. - return False - elif data in spaceCharacters: - # Directly after emitting a token you switch back to the "data - # state". At that point spaceCharacters are important so they are - # emitted separately. - self.tokenQueue.append({"type": tokenTypes["SpaceCharacters"], "data": - data + self.stream.charsUntil(spaceCharacters, True)}) - # No need to update lastFourChars here, since the first space will - # have already been appended to lastFourChars and will have broken - # any <!-- or --> sequences - else: - chars = self.stream.charsUntil(("&", "<", "\u0000")) - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": - data + chars}) - return True - - def entityDataState(self): - self.consumeEntity() - self.state = self.dataState - return True - - def rcdataState(self): - data = self.stream.char() - if data == "&": - self.state = self.characterReferenceInRcdata - elif data == "<": - self.state = self.rcdataLessThanSignState - elif data == EOF: - # Tokenization ends. - return False - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "\uFFFD"}) - elif data in spaceCharacters: - # Directly after emitting a token you switch back to the "data - # state". At that point spaceCharacters are important so they are - # emitted separately. - self.tokenQueue.append({"type": tokenTypes["SpaceCharacters"], "data": - data + self.stream.charsUntil(spaceCharacters, True)}) - # No need to update lastFourChars here, since the first space will - # have already been appended to lastFourChars and will have broken - # any <!-- or --> sequences - else: - chars = self.stream.charsUntil(("&", "<", "\u0000")) - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": - data + chars}) - return True - - def characterReferenceInRcdata(self): - self.consumeEntity() - self.state = self.rcdataState - return True - - def rawtextState(self): - data = self.stream.char() - if data == "<": - self.state = self.rawtextLessThanSignState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "\uFFFD"}) - elif data == EOF: - # Tokenization ends. - return False - else: - chars = self.stream.charsUntil(("<", "\u0000")) - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": - data + chars}) - return True - - def scriptDataState(self): - data = self.stream.char() - if data == "<": - self.state = self.scriptDataLessThanSignState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "\uFFFD"}) - elif data == EOF: - # Tokenization ends. - return False - else: - chars = self.stream.charsUntil(("<", "\u0000")) - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": - data + chars}) - return True - - def plaintextState(self): - data = self.stream.char() - if data == EOF: - # Tokenization ends. - return False - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "\uFFFD"}) - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": - data + self.stream.charsUntil("\u0000")}) - return True - - def tagOpenState(self): - data = self.stream.char() - if data == "!": - self.state = self.markupDeclarationOpenState - elif data == "/": - self.state = self.closeTagOpenState - elif data in asciiLetters: - self.currentToken = {"type": tokenTypes["StartTag"], - "name": data, "data": [], - "selfClosing": False, - "selfClosingAcknowledged": False} - self.state = self.tagNameState - elif data == ">": - # XXX In theory it could be something besides a tag name. But - # do we really care? - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-tag-name-but-got-right-bracket"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<>"}) - self.state = self.dataState - elif data == "?": - # XXX In theory it could be something besides a tag name. But - # do we really care? - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-tag-name-but-got-question-mark"}) - self.stream.unget(data) - self.state = self.bogusCommentState - else: - # XXX - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-tag-name"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) - self.stream.unget(data) - self.state = self.dataState - return True - - def closeTagOpenState(self): - data = self.stream.char() - if data in asciiLetters: - self.currentToken = {"type": tokenTypes["EndTag"], "name": data, - "data": [], "selfClosing": False} - self.state = self.tagNameState - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-closing-tag-but-got-right-bracket"}) - self.state = self.dataState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-closing-tag-but-got-eof"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) - self.state = self.dataState - else: - # XXX data can be _'_... - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-closing-tag-but-got-char", - "datavars": {"data": data}}) - self.stream.unget(data) - self.state = self.bogusCommentState - return True - - def tagNameState(self): - data = self.stream.char() - if data in spaceCharacters: - self.state = self.beforeAttributeNameState - elif data == ">": - self.emitCurrentToken() - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-tag-name"}) - self.state = self.dataState - elif data == "/": - self.state = self.selfClosingStartTagState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["name"] += "\uFFFD" - else: - self.currentToken["name"] += data - # (Don't use charsUntil here, because tag names are - # very short and it's faster to not do anything fancy) - return True - - def rcdataLessThanSignState(self): - data = self.stream.char() - if data == "/": - self.temporaryBuffer = "" - self.state = self.rcdataEndTagOpenState - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) - self.stream.unget(data) - self.state = self.rcdataState - return True - - def rcdataEndTagOpenState(self): - data = self.stream.char() - if data in asciiLetters: - self.temporaryBuffer += data - self.state = self.rcdataEndTagNameState - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) - self.stream.unget(data) - self.state = self.rcdataState - return True - - def rcdataEndTagNameState(self): - appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower() - data = self.stream.char() - if data in spaceCharacters and appropriate: - self.currentToken = {"type": tokenTypes["EndTag"], - "name": self.temporaryBuffer, - "data": [], "selfClosing": False} - self.state = self.beforeAttributeNameState - elif data == "/" and appropriate: - self.currentToken = {"type": tokenTypes["EndTag"], - "name": self.temporaryBuffer, - "data": [], "selfClosing": False} - self.state = self.selfClosingStartTagState - elif data == ">" and appropriate: - self.currentToken = {"type": tokenTypes["EndTag"], - "name": self.temporaryBuffer, - "data": [], "selfClosing": False} - self.emitCurrentToken() - self.state = self.dataState - elif data in asciiLetters: - self.temporaryBuffer += data - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "</" + self.temporaryBuffer}) - self.stream.unget(data) - self.state = self.rcdataState - return True - - def rawtextLessThanSignState(self): - data = self.stream.char() - if data == "/": - self.temporaryBuffer = "" - self.state = self.rawtextEndTagOpenState - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) - self.stream.unget(data) - self.state = self.rawtextState - return True - - def rawtextEndTagOpenState(self): - data = self.stream.char() - if data in asciiLetters: - self.temporaryBuffer += data - self.state = self.rawtextEndTagNameState - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) - self.stream.unget(data) - self.state = self.rawtextState - return True - - def rawtextEndTagNameState(self): - appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower() - data = self.stream.char() - if data in spaceCharacters and appropriate: - self.currentToken = {"type": tokenTypes["EndTag"], - "name": self.temporaryBuffer, - "data": [], "selfClosing": False} - self.state = self.beforeAttributeNameState - elif data == "/" and appropriate: - self.currentToken = {"type": tokenTypes["EndTag"], - "name": self.temporaryBuffer, - "data": [], "selfClosing": False} - self.state = self.selfClosingStartTagState - elif data == ">" and appropriate: - self.currentToken = {"type": tokenTypes["EndTag"], - "name": self.temporaryBuffer, - "data": [], "selfClosing": False} - self.emitCurrentToken() - self.state = self.dataState - elif data in asciiLetters: - self.temporaryBuffer += data - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "</" + self.temporaryBuffer}) - self.stream.unget(data) - self.state = self.rawtextState - return True - - def scriptDataLessThanSignState(self): - data = self.stream.char() - if data == "/": - self.temporaryBuffer = "" - self.state = self.scriptDataEndTagOpenState - elif data == "!": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<!"}) - self.state = self.scriptDataEscapeStartState - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) - self.stream.unget(data) - self.state = self.scriptDataState - return True - - def scriptDataEndTagOpenState(self): - data = self.stream.char() - if data in asciiLetters: - self.temporaryBuffer += data - self.state = self.scriptDataEndTagNameState - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) - self.stream.unget(data) - self.state = self.scriptDataState - return True - - def scriptDataEndTagNameState(self): - appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower() - data = self.stream.char() - if data in spaceCharacters and appropriate: - self.currentToken = {"type": tokenTypes["EndTag"], - "name": self.temporaryBuffer, - "data": [], "selfClosing": False} - self.state = self.beforeAttributeNameState - elif data == "/" and appropriate: - self.currentToken = {"type": tokenTypes["EndTag"], - "name": self.temporaryBuffer, - "data": [], "selfClosing": False} - self.state = self.selfClosingStartTagState - elif data == ">" and appropriate: - self.currentToken = {"type": tokenTypes["EndTag"], - "name": self.temporaryBuffer, - "data": [], "selfClosing": False} - self.emitCurrentToken() - self.state = self.dataState - elif data in asciiLetters: - self.temporaryBuffer += data - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "</" + self.temporaryBuffer}) - self.stream.unget(data) - self.state = self.scriptDataState - return True - - def scriptDataEscapeStartState(self): - data = self.stream.char() - if data == "-": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) - self.state = self.scriptDataEscapeStartDashState - else: - self.stream.unget(data) - self.state = self.scriptDataState - return True - - def scriptDataEscapeStartDashState(self): - data = self.stream.char() - if data == "-": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) - self.state = self.scriptDataEscapedDashDashState - else: - self.stream.unget(data) - self.state = self.scriptDataState - return True - - def scriptDataEscapedState(self): - data = self.stream.char() - if data == "-": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) - self.state = self.scriptDataEscapedDashState - elif data == "<": - self.state = self.scriptDataEscapedLessThanSignState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "\uFFFD"}) - elif data == EOF: - self.state = self.dataState - else: - chars = self.stream.charsUntil(("<", "-", "\u0000")) - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": - data + chars}) - return True - - def scriptDataEscapedDashState(self): - data = self.stream.char() - if data == "-": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) - self.state = self.scriptDataEscapedDashDashState - elif data == "<": - self.state = self.scriptDataEscapedLessThanSignState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "\uFFFD"}) - self.state = self.scriptDataEscapedState - elif data == EOF: - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) - self.state = self.scriptDataEscapedState - return True - - def scriptDataEscapedDashDashState(self): - data = self.stream.char() - if data == "-": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) - elif data == "<": - self.state = self.scriptDataEscapedLessThanSignState - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": ">"}) - self.state = self.scriptDataState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "\uFFFD"}) - self.state = self.scriptDataEscapedState - elif data == EOF: - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) - self.state = self.scriptDataEscapedState - return True - - def scriptDataEscapedLessThanSignState(self): - data = self.stream.char() - if data == "/": - self.temporaryBuffer = "" - self.state = self.scriptDataEscapedEndTagOpenState - elif data in asciiLetters: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<" + data}) - self.temporaryBuffer = data - self.state = self.scriptDataDoubleEscapeStartState - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) - self.stream.unget(data) - self.state = self.scriptDataEscapedState - return True - - def scriptDataEscapedEndTagOpenState(self): - data = self.stream.char() - if data in asciiLetters: - self.temporaryBuffer = data - self.state = self.scriptDataEscapedEndTagNameState - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) - self.stream.unget(data) - self.state = self.scriptDataEscapedState - return True - - def scriptDataEscapedEndTagNameState(self): - appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower() - data = self.stream.char() - if data in spaceCharacters and appropriate: - self.currentToken = {"type": tokenTypes["EndTag"], - "name": self.temporaryBuffer, - "data": [], "selfClosing": False} - self.state = self.beforeAttributeNameState - elif data == "/" and appropriate: - self.currentToken = {"type": tokenTypes["EndTag"], - "name": self.temporaryBuffer, - "data": [], "selfClosing": False} - self.state = self.selfClosingStartTagState - elif data == ">" and appropriate: - self.currentToken = {"type": tokenTypes["EndTag"], - "name": self.temporaryBuffer, - "data": [], "selfClosing": False} - self.emitCurrentToken() - self.state = self.dataState - elif data in asciiLetters: - self.temporaryBuffer += data - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "</" + self.temporaryBuffer}) - self.stream.unget(data) - self.state = self.scriptDataEscapedState - return True - - def scriptDataDoubleEscapeStartState(self): - data = self.stream.char() - if data in (spaceCharacters | frozenset(("/", ">"))): - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) - if self.temporaryBuffer.lower() == "script": - self.state = self.scriptDataDoubleEscapedState - else: - self.state = self.scriptDataEscapedState - elif data in asciiLetters: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) - self.temporaryBuffer += data - else: - self.stream.unget(data) - self.state = self.scriptDataEscapedState - return True - - def scriptDataDoubleEscapedState(self): - data = self.stream.char() - if data == "-": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) - self.state = self.scriptDataDoubleEscapedDashState - elif data == "<": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) - self.state = self.scriptDataDoubleEscapedLessThanSignState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "\uFFFD"}) - elif data == EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-script-in-script"}) - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) - return True - - def scriptDataDoubleEscapedDashState(self): - data = self.stream.char() - if data == "-": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) - self.state = self.scriptDataDoubleEscapedDashDashState - elif data == "<": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) - self.state = self.scriptDataDoubleEscapedLessThanSignState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "\uFFFD"}) - self.state = self.scriptDataDoubleEscapedState - elif data == EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-script-in-script"}) - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) - self.state = self.scriptDataDoubleEscapedState - return True - - def scriptDataDoubleEscapedDashDashState(self): - data = self.stream.char() - if data == "-": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) - elif data == "<": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) - self.state = self.scriptDataDoubleEscapedLessThanSignState - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": ">"}) - self.state = self.scriptDataState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": "\uFFFD"}) - self.state = self.scriptDataDoubleEscapedState - elif data == EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-script-in-script"}) - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) - self.state = self.scriptDataDoubleEscapedState - return True - - def scriptDataDoubleEscapedLessThanSignState(self): - data = self.stream.char() - if data == "/": - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "/"}) - self.temporaryBuffer = "" - self.state = self.scriptDataDoubleEscapeEndState - else: - self.stream.unget(data) - self.state = self.scriptDataDoubleEscapedState - return True - - def scriptDataDoubleEscapeEndState(self): - data = self.stream.char() - if data in (spaceCharacters | frozenset(("/", ">"))): - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) - if self.temporaryBuffer.lower() == "script": - self.state = self.scriptDataEscapedState - else: - self.state = self.scriptDataDoubleEscapedState - elif data in asciiLetters: - self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) - self.temporaryBuffer += data - else: - self.stream.unget(data) - self.state = self.scriptDataDoubleEscapedState - return True - - def beforeAttributeNameState(self): - data = self.stream.char() - if data in spaceCharacters: - self.stream.charsUntil(spaceCharacters, True) - elif data in asciiLetters: - self.currentToken["data"].append([data, ""]) - self.state = self.attributeNameState - elif data == ">": - self.emitCurrentToken() - elif data == "/": - self.state = self.selfClosingStartTagState - elif data in ("'", '"', "=", "<"): - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "invalid-character-in-attribute-name"}) - self.currentToken["data"].append([data, ""]) - self.state = self.attributeNameState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"].append(["\uFFFD", ""]) - self.state = self.attributeNameState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-attribute-name-but-got-eof"}) - self.state = self.dataState - else: - self.currentToken["data"].append([data, ""]) - self.state = self.attributeNameState - return True - - def attributeNameState(self): - data = self.stream.char() - leavingThisState = True - emitToken = False - if data == "=": - self.state = self.beforeAttributeValueState - elif data in asciiLetters: - self.currentToken["data"][-1][0] += data +\ - self.stream.charsUntil(asciiLetters, True) - leavingThisState = False - elif data == ">": - # XXX If we emit here the attributes are converted to a dict - # without being checked and when the code below runs we error - # because data is a dict not a list - emitToken = True - elif data in spaceCharacters: - self.state = self.afterAttributeNameState - elif data == "/": - self.state = self.selfClosingStartTagState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"][-1][0] += "\uFFFD" - leavingThisState = False - elif data in ("'", '"', "<"): - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": - "invalid-character-in-attribute-name"}) - self.currentToken["data"][-1][0] += data - leavingThisState = False - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "eof-in-attribute-name"}) - self.state = self.dataState - else: - self.currentToken["data"][-1][0] += data - leavingThisState = False - - if leavingThisState: - # Attributes are not dropped at this stage. That happens when the - # start tag token is emitted so values can still be safely appended - # to attributes, but we do want to report the parse error in time. - self.currentToken["data"][-1][0] = ( - self.currentToken["data"][-1][0].translate(asciiUpper2Lower)) - for name, _ in self.currentToken["data"][:-1]: - if self.currentToken["data"][-1][0] == name: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "duplicate-attribute"}) - break - # XXX Fix for above XXX - if emitToken: - self.emitCurrentToken() - return True - - def afterAttributeNameState(self): - data = self.stream.char() - if data in spaceCharacters: - self.stream.charsUntil(spaceCharacters, True) - elif data == "=": - self.state = self.beforeAttributeValueState - elif data == ">": - self.emitCurrentToken() - elif data in asciiLetters: - self.currentToken["data"].append([data, ""]) - self.state = self.attributeNameState - elif data == "/": - self.state = self.selfClosingStartTagState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"].append(["\uFFFD", ""]) - self.state = self.attributeNameState - elif data in ("'", '"', "<"): - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "invalid-character-after-attribute-name"}) - self.currentToken["data"].append([data, ""]) - self.state = self.attributeNameState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-end-of-tag-but-got-eof"}) - self.state = self.dataState - else: - self.currentToken["data"].append([data, ""]) - self.state = self.attributeNameState - return True - - def beforeAttributeValueState(self): - data = self.stream.char() - if data in spaceCharacters: - self.stream.charsUntil(spaceCharacters, True) - elif data == "\"": - self.state = self.attributeValueDoubleQuotedState - elif data == "&": - self.state = self.attributeValueUnQuotedState - self.stream.unget(data) - elif data == "'": - self.state = self.attributeValueSingleQuotedState - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-attribute-value-but-got-right-bracket"}) - self.emitCurrentToken() - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"][-1][1] += "\uFFFD" - self.state = self.attributeValueUnQuotedState - elif data in ("=", "<", "`"): - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "equals-in-unquoted-attribute-value"}) - self.currentToken["data"][-1][1] += data - self.state = self.attributeValueUnQuotedState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-attribute-value-but-got-eof"}) - self.state = self.dataState - else: - self.currentToken["data"][-1][1] += data - self.state = self.attributeValueUnQuotedState - return True - - def attributeValueDoubleQuotedState(self): - data = self.stream.char() - if data == "\"": - self.state = self.afterAttributeValueState - elif data == "&": - self.processEntityInAttribute('"') - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"][-1][1] += "\uFFFD" - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-attribute-value-double-quote"}) - self.state = self.dataState - else: - self.currentToken["data"][-1][1] += data +\ - self.stream.charsUntil(("\"", "&", "\u0000")) - return True - - def attributeValueSingleQuotedState(self): - data = self.stream.char() - if data == "'": - self.state = self.afterAttributeValueState - elif data == "&": - self.processEntityInAttribute("'") - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"][-1][1] += "\uFFFD" - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-attribute-value-single-quote"}) - self.state = self.dataState - else: - self.currentToken["data"][-1][1] += data +\ - self.stream.charsUntil(("'", "&", "\u0000")) - return True - - def attributeValueUnQuotedState(self): - data = self.stream.char() - if data in spaceCharacters: - self.state = self.beforeAttributeNameState - elif data == "&": - self.processEntityInAttribute(">") - elif data == ">": - self.emitCurrentToken() - elif data in ('"', "'", "=", "<", "`"): - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-character-in-unquoted-attribute-value"}) - self.currentToken["data"][-1][1] += data - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"][-1][1] += "\uFFFD" - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-attribute-value-no-quotes"}) - self.state = self.dataState - else: - self.currentToken["data"][-1][1] += data + self.stream.charsUntil( - frozenset(("&", ">", '"', "'", "=", "<", "`", "\u0000")) | spaceCharacters) - return True - - def afterAttributeValueState(self): - data = self.stream.char() - if data in spaceCharacters: - self.state = self.beforeAttributeNameState - elif data == ">": - self.emitCurrentToken() - elif data == "/": - self.state = self.selfClosingStartTagState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-EOF-after-attribute-value"}) - self.stream.unget(data) - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-character-after-attribute-value"}) - self.stream.unget(data) - self.state = self.beforeAttributeNameState - return True - - def selfClosingStartTagState(self): - data = self.stream.char() - if data == ">": - self.currentToken["selfClosing"] = True - self.emitCurrentToken() - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": - "unexpected-EOF-after-solidus-in-tag"}) - self.stream.unget(data) - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-character-after-solidus-in-tag"}) - self.stream.unget(data) - self.state = self.beforeAttributeNameState - return True - - def bogusCommentState(self): - # Make a new comment token and give it as value all the characters - # until the first > or EOF (charsUntil checks for EOF automatically) - # and emit it. - data = self.stream.charsUntil(">") - data = data.replace("\u0000", "\uFFFD") - self.tokenQueue.append( - {"type": tokenTypes["Comment"], "data": data}) - - # Eat the character directly after the bogus comment which is either a - # ">" or an EOF. - self.stream.char() - self.state = self.dataState - return True - - def markupDeclarationOpenState(self): - charStack = [self.stream.char()] - if charStack[-1] == "-": - charStack.append(self.stream.char()) - if charStack[-1] == "-": - self.currentToken = {"type": tokenTypes["Comment"], "data": ""} - self.state = self.commentStartState - return True - elif charStack[-1] in ('d', 'D'): - matched = True - for expected in (('o', 'O'), ('c', 'C'), ('t', 'T'), - ('y', 'Y'), ('p', 'P'), ('e', 'E')): - charStack.append(self.stream.char()) - if charStack[-1] not in expected: - matched = False - break - if matched: - self.currentToken = {"type": tokenTypes["Doctype"], - "name": "", - "publicId": None, "systemId": None, - "correct": True} - self.state = self.doctypeState - return True - elif (charStack[-1] == "[" and - self.parser is not None and - self.parser.tree.openElements and - self.parser.tree.openElements[-1].namespace != self.parser.tree.defaultNamespace): - matched = True - for expected in ["C", "D", "A", "T", "A", "["]: - charStack.append(self.stream.char()) - if charStack[-1] != expected: - matched = False - break - if matched: - self.state = self.cdataSectionState - return True - - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-dashes-or-doctype"}) - - while charStack: - self.stream.unget(charStack.pop()) - self.state = self.bogusCommentState - return True - - def commentStartState(self): - data = self.stream.char() - if data == "-": - self.state = self.commentStartDashState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"] += "\uFFFD" - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "incorrect-comment"}) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-comment"}) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.currentToken["data"] += data - self.state = self.commentState - return True - - def commentStartDashState(self): - data = self.stream.char() - if data == "-": - self.state = self.commentEndState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"] += "-\uFFFD" - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "incorrect-comment"}) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-comment"}) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.currentToken["data"] += "-" + data - self.state = self.commentState - return True - - def commentState(self): - data = self.stream.char() - if data == "-": - self.state = self.commentEndDashState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"] += "\uFFFD" - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "eof-in-comment"}) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.currentToken["data"] += data + \ - self.stream.charsUntil(("-", "\u0000")) - return True - - def commentEndDashState(self): - data = self.stream.char() - if data == "-": - self.state = self.commentEndState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"] += "-\uFFFD" - self.state = self.commentState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-comment-end-dash"}) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.currentToken["data"] += "-" + data - self.state = self.commentState - return True - - def commentEndState(self): - data = self.stream.char() - if data == ">": - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"] += "--\uFFFD" - self.state = self.commentState - elif data == "!": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-bang-after-double-dash-in-comment"}) - self.state = self.commentEndBangState - elif data == "-": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-dash-after-double-dash-in-comment"}) - self.currentToken["data"] += data - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-comment-double-dash"}) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - # XXX - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-char-in-comment"}) - self.currentToken["data"] += "--" + data - self.state = self.commentState - return True - - def commentEndBangState(self): - data = self.stream.char() - if data == ">": - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data == "-": - self.currentToken["data"] += "--!" - self.state = self.commentEndDashState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["data"] += "--!\uFFFD" - self.state = self.commentState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-comment-end-bang-state"}) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.currentToken["data"] += "--!" + data - self.state = self.commentState - return True - - def doctypeState(self): - data = self.stream.char() - if data in spaceCharacters: - self.state = self.beforeDoctypeNameState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-doctype-name-but-got-eof"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "need-space-after-doctype"}) - self.stream.unget(data) - self.state = self.beforeDoctypeNameState - return True - - def beforeDoctypeNameState(self): - data = self.stream.char() - if data in spaceCharacters: - pass - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-doctype-name-but-got-right-bracket"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["name"] = "\uFFFD" - self.state = self.doctypeNameState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-doctype-name-but-got-eof"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.currentToken["name"] = data - self.state = self.doctypeNameState - return True - - def doctypeNameState(self): - data = self.stream.char() - if data in spaceCharacters: - self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) - self.state = self.afterDoctypeNameState - elif data == ">": - self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["name"] += "\uFFFD" - self.state = self.doctypeNameState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype-name"}) - self.currentToken["correct"] = False - self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.currentToken["name"] += data - return True - - def afterDoctypeNameState(self): - data = self.stream.char() - if data in spaceCharacters: - pass - elif data == ">": - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data is EOF: - self.currentToken["correct"] = False - self.stream.unget(data) - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - if data in ("p", "P"): - matched = True - for expected in (("u", "U"), ("b", "B"), ("l", "L"), - ("i", "I"), ("c", "C")): - data = self.stream.char() - if data not in expected: - matched = False - break - if matched: - self.state = self.afterDoctypePublicKeywordState - return True - elif data in ("s", "S"): - matched = True - for expected in (("y", "Y"), ("s", "S"), ("t", "T"), - ("e", "E"), ("m", "M")): - data = self.stream.char() - if data not in expected: - matched = False - break - if matched: - self.state = self.afterDoctypeSystemKeywordState - return True - - # All the characters read before the current 'data' will be - # [a-zA-Z], so they're garbage in the bogus doctype and can be - # discarded; only the latest character might be '>' or EOF - # and needs to be ungetted - self.stream.unget(data) - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "expected-space-or-right-bracket-in-doctype", "datavars": - {"data": data}}) - self.currentToken["correct"] = False - self.state = self.bogusDoctypeState - - return True - - def afterDoctypePublicKeywordState(self): - data = self.stream.char() - if data in spaceCharacters: - self.state = self.beforeDoctypePublicIdentifierState - elif data in ("'", '"'): - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-char-in-doctype"}) - self.stream.unget(data) - self.state = self.beforeDoctypePublicIdentifierState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.stream.unget(data) - self.state = self.beforeDoctypePublicIdentifierState - return True - - def beforeDoctypePublicIdentifierState(self): - data = self.stream.char() - if data in spaceCharacters: - pass - elif data == "\"": - self.currentToken["publicId"] = "" - self.state = self.doctypePublicIdentifierDoubleQuotedState - elif data == "'": - self.currentToken["publicId"] = "" - self.state = self.doctypePublicIdentifierSingleQuotedState - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-end-of-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-char-in-doctype"}) - self.currentToken["correct"] = False - self.state = self.bogusDoctypeState - return True - - def doctypePublicIdentifierDoubleQuotedState(self): - data = self.stream.char() - if data == "\"": - self.state = self.afterDoctypePublicIdentifierState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["publicId"] += "\uFFFD" - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-end-of-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.currentToken["publicId"] += data - return True - - def doctypePublicIdentifierSingleQuotedState(self): - data = self.stream.char() - if data == "'": - self.state = self.afterDoctypePublicIdentifierState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["publicId"] += "\uFFFD" - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-end-of-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.currentToken["publicId"] += data - return True - - def afterDoctypePublicIdentifierState(self): - data = self.stream.char() - if data in spaceCharacters: - self.state = self.betweenDoctypePublicAndSystemIdentifiersState - elif data == ">": - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data == '"': - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-char-in-doctype"}) - self.currentToken["systemId"] = "" - self.state = self.doctypeSystemIdentifierDoubleQuotedState - elif data == "'": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-char-in-doctype"}) - self.currentToken["systemId"] = "" - self.state = self.doctypeSystemIdentifierSingleQuotedState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-char-in-doctype"}) - self.currentToken["correct"] = False - self.state = self.bogusDoctypeState - return True - - def betweenDoctypePublicAndSystemIdentifiersState(self): - data = self.stream.char() - if data in spaceCharacters: - pass - elif data == ">": - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data == '"': - self.currentToken["systemId"] = "" - self.state = self.doctypeSystemIdentifierDoubleQuotedState - elif data == "'": - self.currentToken["systemId"] = "" - self.state = self.doctypeSystemIdentifierSingleQuotedState - elif data == EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-char-in-doctype"}) - self.currentToken["correct"] = False - self.state = self.bogusDoctypeState - return True - - def afterDoctypeSystemKeywordState(self): - data = self.stream.char() - if data in spaceCharacters: - self.state = self.beforeDoctypeSystemIdentifierState - elif data in ("'", '"'): - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-char-in-doctype"}) - self.stream.unget(data) - self.state = self.beforeDoctypeSystemIdentifierState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.stream.unget(data) - self.state = self.beforeDoctypeSystemIdentifierState - return True - - def beforeDoctypeSystemIdentifierState(self): - data = self.stream.char() - if data in spaceCharacters: - pass - elif data == "\"": - self.currentToken["systemId"] = "" - self.state = self.doctypeSystemIdentifierDoubleQuotedState - elif data == "'": - self.currentToken["systemId"] = "" - self.state = self.doctypeSystemIdentifierSingleQuotedState - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-char-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-char-in-doctype"}) - self.currentToken["correct"] = False - self.state = self.bogusDoctypeState - return True - - def doctypeSystemIdentifierDoubleQuotedState(self): - data = self.stream.char() - if data == "\"": - self.state = self.afterDoctypeSystemIdentifierState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["systemId"] += "\uFFFD" - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-end-of-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.currentToken["systemId"] += data - return True - - def doctypeSystemIdentifierSingleQuotedState(self): - data = self.stream.char() - if data == "'": - self.state = self.afterDoctypeSystemIdentifierState - elif data == "\u0000": - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - self.currentToken["systemId"] += "\uFFFD" - elif data == ">": - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-end-of-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.currentToken["systemId"] += data - return True - - def afterDoctypeSystemIdentifierState(self): - data = self.stream.char() - if data in spaceCharacters: - pass - elif data == ">": - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data is EOF: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "eof-in-doctype"}) - self.currentToken["correct"] = False - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": - "unexpected-char-in-doctype"}) - self.state = self.bogusDoctypeState - return True - - def bogusDoctypeState(self): - data = self.stream.char() - if data == ">": - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - elif data is EOF: - # XXX EMIT - self.stream.unget(data) - self.tokenQueue.append(self.currentToken) - self.state = self.dataState - else: - pass - return True - - def cdataSectionState(self): - data = [] - while True: - data.append(self.stream.charsUntil("]")) - data.append(self.stream.charsUntil(">")) - char = self.stream.char() - if char == EOF: - break - else: - assert char == ">" - if data[-1][-2:] == "]]": - data[-1] = data[-1][:-2] - break - else: - data.append(char) - - data = "".join(data) # pylint:disable=redefined-variable-type - # Deal with null here rather than in the parser - nullCount = data.count("\u0000") - if nullCount > 0: - for _ in range(nullCount): - self.tokenQueue.append({"type": tokenTypes["ParseError"], - "data": "invalid-codepoint"}) - data = data.replace("\u0000", "\uFFFD") - if data: - self.tokenQueue.append({"type": tokenTypes["Characters"], - "data": data}) - self.state = self.dataState - return True diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__init__.py b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__init__.py deleted file mode 100644 index a5ba4bf..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from .py import Trie as PyTrie - -Trie = PyTrie - -# pylint:disable=wrong-import-position -try: - from .datrie import Trie as DATrie -except ImportError: - pass -else: - Trie = DATrie -# pylint:enable=wrong-import-position diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 006dfb4d9e269c5832f84034b73ff43f4e96c3c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 382 zcmXwzy-ve05XaBX2O*`ULkCvI3?*V<LkLijU_l6w087Y9v8!6xPH>!xJP#AE<dvzf zz=R!%v+j3yfBVjNIUeWWO@AG{9wLCBQ2blwlXLIwy$1t^Bq&6X!UU^`L<ksWk&IPB zQUp9DNk1Kw9j{~vo<PrH;Jfd+xkeDq3+VJ2ct#QyKR}Ue{ah#_w_h#WT6UIGp_<xQ zmoc#st*Et|c3QmEj8iErH<fI+eoH8jiyw{Pw?*!9N>`oj45!p!e`lhA*u&wbH)%-H zyFNT8DXZ)d7Z;&+qnqKsD`RT&4Q3QN1AZ5!RZZE5W-fGVD=Fvfqt~Cut91|uryH(W uZOXM(@<fVdNyF%pQlW*V^r-1wcB*RDNq!b~ZYLfyyocimqbZu86#oHMEMipv diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-37.pyc deleted file mode 100644 index 49be76fddbe38029d74b69730364297528b4e7b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1465 zcmZuxO>Y}F5FK(?(n^+{)HYhXNCN@QWe<^3puGf!(X?rMD5{GM1Xv&-*2`72F!#eG zmB_~C61hmu{RMV=>R;MxPx%Wub%wHCt1to1a>*g*y*EStu)f{{Y{g$YFaPua{-K}i z=HuXd?B-iE5+qZQvxwz9;<*=jjOMuV^H$Vi@C!&!`sX11w6*Y}wrm|h*#3w+A@rJi z@sTOj%%&pCt5Vx0klE|ZWM$FZpA}hB%2cS#raD$8WKHL{xT><^RYKdZ8^NJwo}x)1 zViF=QS>(yJ_b_2Dd^hrCOSaD;YRQfa@Y|MM*~4$=J@^m>2&&)shdN8ozIt|Ktd0{q zIEqa=NK|ahU{dOV#Z@y-xQhmWvfOm@1b-}8R>Oi{@Jo2hKcEc9fqrPcnlIP^I4n%^ z^PuL>fo4K)oUp6I=+GASE$rq?G*hVI<>p&fvkUkDmrVOL`-7kO2k<wb5<O#MZOxm^ zPD9@C;gg2Vak^dUbdt?=2T%C)Y-IClRAtrUtU!0A9?O%{V*br!N|UaO*J&Y3J(}8F zeW$Xcksy*ILClBM>8I|VNo`W*)&6|~Mkw2G_JDL69;c^fxTnelbF)9ZaSZ*YWoA{X zbsN1KpWGS`kHK{NCRG!?hV%L!8U)-G!U-%y$d(KJ>(wp}On?UX1`k-k&$>5pSCT*l z@FO`tLNk9@!v$Qzb5f7j`~nq3^?DKoKk2=|%5=gX{v2|LK~sd#)1TqT0cbo#>;zmI z!qaR|V<U)(AjQQ}<xN~!0%RMkM*w#nz`K0!27HJo)L1jeZQZXC;QXn@>x5Or7EH1) zu$GX<Bcy>fUGp{go$q2<p!eYR3=$i>0E=D=_6|LfARm9E%0kIoIxb$Nji=J034Tpa zf6}_tD|}h@f3_Q{#68Ad@!TbzBm=O3`Fw|MvQ2)r<+!eTuCS#0;nMOs4k#&<2uewf zTy|kXiC|+)JC*wiqK>*%#<#MtwHi&}!;pWCn~i${Fa>8jcYtzk6sg+;LKJbH3eoh0 z$V)j>H0}#=GK<yKN=FD;CPFN$V;hfm0QCbLHS1U9nxsmh3tcm3kOftPcEw9|Pu<WH zN{VfCgHF(M_hB4%DE4G#XBuN`x>1^x(!`-zOG>5E#Nq>JG`$CI(|>Vpi4p8A3G7p% KodVmu@BIsT`A&BL diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/datrie.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/datrie.cpython-37.pyc deleted file mode 100644 index fbf55d46f7b34d3761b8e63764605aba2ec4e290..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1984 zcmb7FOK%%D5GI$qtCcLvitPk;pH7<;724S7p_d{kVkbpWpwOj34G0N{wMg6R>_a9g zS2k9c*uSDD8$I<e@!C`VLQkFHO0HxWX-$Dc?vR}C<2<OH#l;4JmjAK#`gfm@zwl$) z;F~;yu73t0h@dISXpd%I&&ybkQPg><p9Q_p%~@K@qFw}ZAM|z5Hz@g$h(LrFM1-<& z&U%5U{X#m?JFrMP%r3=yx=4pc@+2D+%GgLGCy7pq+_r~#(l3PMX=0>`Q{AD~f2k4) zW8KJ+;pTK8-%&8sM{Co@VDb#Q{uP8IJt|1g6I6H?q{jpkK8$|F3E7AUzC%$L4H#=; zRW!xo1?@$mC6+)_7j1D5#)eoHD=;pI1>k>Q1z^1Ifxs3*N5ymK`UHd_=Va`SzANb^ zy&^Bj>&-DUUdaqQ_w*OW7xbLIrK1NWgSFP!FTKm4^sgu-$6xP~<Mu8wq3|wirFR88 zOTwekCt$1YY%Ra?#%vsvK}n9Hl07BIuXZ66K#O(H*0$4h<BdGk8`)5sjXk-cjY{$Z zZAqtLnU==-xNIBX<y@OM?@NXJZT%&<^9Q90WmznQ4PR`dx2=CvB)JW^h)rw*h()G5 zq4l*)_pM(k`-id8mVsUC<J<-(aXOTL614`F|K8a$*<fps44yc|G<_nDPxH|?`-iA> zou9~D6l&|xWa+nQvbV*7wcG;pFl-J^ZNzz!Cx&xOSG^2^(2%xhgGSJoy*6E@XNyR9 zbGq|7JQybIE<AX?1eYF>HzBx;b~{wHLD%sVT2=Q^Ani)5!^}20?-#j=fj;LCK%-sc z>Dj#r;J>SV%tvfE&Vd>Npb*Up)Uzy=d4)_X<Qt$h&S3}V$Y6@soZz{IIVgm?z8|LF zTgdy#{p?D&Fh6C3RAw?aQn(<)wcUMhprW6l+&KSe2KL&oZsk3G1+SKLeTw^^eqG@F zKpIRb&Oe>OYfr9uz1W?@#0qzJZNda2c}YupHFc~*RT$<;NNqS!az7c}h^pK2*$isk zp<;2|70s?5#+u_v{##-Wd4)I4sE2@Y6B}_K&tR`R?Axr|nM*4z@&l>O|6uVsF!*wY z#foDwfBw$+EA!_uowE12;t>$|YKFwxEhH)<P^(RR2=X|SoZANHSs{ig&Y?n&hjCi1 zs1LxL`Vhs(C@{6u1`5myg}zsKb%oF~k#VJf<>p@ZI!xR{6Va#{vFg`wqg(HG7LdaJ z&<qt&P+05=Q&ZvpCj6zix65r+EzsB{c<eSO58bAQe00xl!1rP;ZEbt!IbQrWIyQP* SUG#gbavgzK^_sNlHQ7Jb46L01 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/py.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/py.cpython-37.pyc deleted file mode 100644 index cb90a77ac25ff891467a1ae8bd04d4ff86acd1ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2187 zcma)7UvC>l5Z~SV<Fn%=PAO?4pco-QM$~}^%1agX4-^Sic_9MHqFOoLOLNKj?Ch?K z6P;ghKS(2<_yT;GedVc7y!VOU?8R;qRTX!-+1c5-otfY4%syCMZ7@8=pEsZU8#DF~ zO%_iG<{m!t7(_9}b2j8XJ`_DM40-`4naIOo)QdbH<ngf9tAP(ylqbV_uff@mOvS49 zoT*ycm<PSON`7XY`b+G{I)Pj7@0(FRv8l|4<B_&5QQ5Q1WTV2hCPg+FsZ{2fO?5vv z9q#Hjomy#6$0;T&`<Y1xR_5t}eaUG*?!rBtr32c0@dRM*;WLjwQr6>&^@QR|JZHT? z1uDb{cU6orQZ<!ej8$DVFxFH{HPz~K-b>V)T8E^rR^a}IPO#ZPfY3uDVf7H7`3b}V zD>6{>7yO)k&*ps2%`GcbFz0{pl9x;dHmp|XG>cRS8mq|GO6VR4%o4?5D&8GXX!I=1 z81UvMNXeeGX57Mz<#X{1<LpHEpZIP^xCUS>jO`bLR7cQ;NOZq;eEJvDP0U~IY}?^@ zdz_7Ld%Zlrtxish={E<5B=nzrmKJKHw-4<w|2EI|x1|NX+vC&j`1Do%?$fkLr(?ad zLLOD_owX?gT`997vr=~N=A!{}x6@rJpWVEl=k4S4)U<~aW83>_+hEt?sc}sEG}c|v z&vO@&j;rq>+dpVM(k_y!Z~HDbI4G&Yv{I0R{@^gh9xlk!!ZoY;c$5{^An4Gf`GE`R zS08spR^hTs7H(1v7y^ayO`eFDuko0ltzHV{Qo1QvpKkh-5_-grW26hnbNwD<9ig`{ zxBxz0HQSVOFe+>xuuDnG9y`X*HZBalUR@@ifVpH8X=g_`E0s~9Z$P24%)RBSMr#s< zQb@V^hP~#6J-_h3O}UT?@?EwFSExuy5G;aQqUl%OfhMpl`4%1it7z&EDM-rG8%bP| z@@Z;eZzv_LFYL80f?F=`E^XGJMkV1h_&1mmUEw$}n;7}Azz82q+xol`#3)si<WX?W z^<#|TZ(=59fsIHH*%xIn4?{K!XHn5wNav!Gpf=eoE<+oW_8j|bTjH!tzw&=aTMT=1 z?EIpPU(^<|bIw^ADe)bfMJLaGB`ateWmrbOIfS%BC)m~N@Lp3qokYKn!38F@u7SGO z*8HB?Lrn?S)GjpoJM-rR^`%s&R-MpztkZ*R>O?+r;xKcO|JU(MZ;<|Fw7u+O$jvPf zs+NXm@&?}&EnhXExW-$&3BDoD>OKQhq)X%p^(FEOlSS?5HC5qEm<ynB2V-!7Gn(U3 zw7_{57ELryFPV#3c!6x>k=;`Q*`l=&xT4jbQ-K7#dyfz<m74yP$Q4WoI1fxGs%qym z5`0eN3nCpNmw|BC5BtV9AW1083dB25G}k~FFbO>}*F;mSfj`^wXuRz&I_C{)Mn!*^ zO6eL>4o7N|6OUeTGU?~livEBc`G^R?uiHdEA>vc@C2_Ca^c?j$e_PeTm^F}uC-o$# z-o_2Tw%b`DqX!c^(J-p1(dd8(U2AR~*FpE<D(ISQ>aP<QSJ$sURp`b0eUtjlT<!jY ahZO7ETye?WDzqJHXojxQ>o_iWgZ}`z7}(_i diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/_base.py b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/_base.py deleted file mode 100644 index a1158bb..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/_base.py +++ /dev/null @@ -1,37 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from collections import Mapping - - -class Trie(Mapping): - """Abstract base class for tries""" - - def keys(self, prefix=None): - # pylint:disable=arguments-differ - keys = super(Trie, self).keys() - - if prefix is None: - return set(keys) - - return {x for x in keys if x.startswith(prefix)} - - def has_keys_with_prefix(self, prefix): - for key in self.keys(): - if key.startswith(prefix): - return True - - return False - - def longest_prefix(self, prefix): - if prefix in self: - return prefix - - for i in range(1, len(prefix) + 1): - if prefix[:-i] in self: - return prefix[:-i] - - raise KeyError(prefix) - - def longest_prefix_item(self, prefix): - lprefix = self.longest_prefix(prefix) - return (lprefix, self[lprefix]) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/datrie.py b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/datrie.py deleted file mode 100644 index e2e5f86..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/datrie.py +++ /dev/null @@ -1,44 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from datrie import Trie as DATrie -from pip._vendor.six import text_type - -from ._base import Trie as ABCTrie - - -class Trie(ABCTrie): - def __init__(self, data): - chars = set() - for key in data.keys(): - if not isinstance(key, text_type): - raise TypeError("All keys must be strings") - for char in key: - chars.add(char) - - self._data = DATrie("".join(chars)) - for key, value in data.items(): - self._data[key] = value - - def __contains__(self, key): - return key in self._data - - def __len__(self): - return len(self._data) - - def __iter__(self): - raise NotImplementedError() - - def __getitem__(self, key): - return self._data[key] - - def keys(self, prefix=None): - return self._data.keys(prefix) - - def has_keys_with_prefix(self, prefix): - return self._data.has_keys_with_prefix(prefix) - - def longest_prefix(self, prefix): - return self._data.longest_prefix(prefix) - - def longest_prefix_item(self, prefix): - return self._data.longest_prefix_item(prefix) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/py.py b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/py.py deleted file mode 100644 index c178b21..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/py.py +++ /dev/null @@ -1,67 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals -from pip._vendor.six import text_type - -from bisect import bisect_left - -from ._base import Trie as ABCTrie - - -class Trie(ABCTrie): - def __init__(self, data): - if not all(isinstance(x, text_type) for x in data.keys()): - raise TypeError("All keys must be strings") - - self._data = data - self._keys = sorted(data.keys()) - self._cachestr = "" - self._cachepoints = (0, len(data)) - - def __contains__(self, key): - return key in self._data - - def __len__(self): - return len(self._data) - - def __iter__(self): - return iter(self._data) - - def __getitem__(self, key): - return self._data[key] - - def keys(self, prefix=None): - if prefix is None or prefix == "" or not self._keys: - return set(self._keys) - - if prefix.startswith(self._cachestr): - lo, hi = self._cachepoints - start = i = bisect_left(self._keys, prefix, lo, hi) - else: - start = i = bisect_left(self._keys, prefix) - - keys = set() - if start == len(self._keys): - return keys - - while self._keys[i].startswith(prefix): - keys.add(self._keys[i]) - i += 1 - - self._cachestr = prefix - self._cachepoints = (start, i) - - return keys - - def has_keys_with_prefix(self, prefix): - if prefix in self._data: - return True - - if prefix.startswith(self._cachestr): - lo, hi = self._cachepoints - i = bisect_left(self._keys, prefix, lo, hi) - else: - i = bisect_left(self._keys, prefix) - - if i == len(self._keys): - return False - - return self._keys[i].startswith(prefix) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/_utils.py b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/_utils.py deleted file mode 100644 index 0703afb..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/_utils.py +++ /dev/null @@ -1,124 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from types import ModuleType - -from pip._vendor.six import text_type - -try: - import xml.etree.cElementTree as default_etree -except ImportError: - import xml.etree.ElementTree as default_etree - - -__all__ = ["default_etree", "MethodDispatcher", "isSurrogatePair", - "surrogatePairToCodepoint", "moduleFactoryFactory", - "supports_lone_surrogates"] - - -# Platforms not supporting lone surrogates (\uD800-\uDFFF) should be -# caught by the below test. In general this would be any platform -# using UTF-16 as its encoding of unicode strings, such as -# Jython. This is because UTF-16 itself is based on the use of such -# surrogates, and there is no mechanism to further escape such -# escapes. -try: - _x = eval('"\\uD800"') # pylint:disable=eval-used - if not isinstance(_x, text_type): - # We need this with u"" because of http://bugs.jython.org/issue2039 - _x = eval('u"\\uD800"') # pylint:disable=eval-used - assert isinstance(_x, text_type) -except: # pylint:disable=bare-except - supports_lone_surrogates = False -else: - supports_lone_surrogates = True - - -class MethodDispatcher(dict): - """Dict with 2 special properties: - - On initiation, keys that are lists, sets or tuples are converted to - multiple keys so accessing any one of the items in the original - list-like object returns the matching value - - md = MethodDispatcher({("foo", "bar"):"baz"}) - md["foo"] == "baz" - - A default value which can be set through the default attribute. - """ - - def __init__(self, items=()): - # Using _dictEntries instead of directly assigning to self is about - # twice as fast. Please do careful performance testing before changing - # anything here. - _dictEntries = [] - for name, value in items: - if isinstance(name, (list, tuple, frozenset, set)): - for item in name: - _dictEntries.append((item, value)) - else: - _dictEntries.append((name, value)) - dict.__init__(self, _dictEntries) - assert len(self) == len(_dictEntries) - self.default = None - - def __getitem__(self, key): - return dict.get(self, key, self.default) - - -# Some utility functions to deal with weirdness around UCS2 vs UCS4 -# python builds - -def isSurrogatePair(data): - return (len(data) == 2 and - ord(data[0]) >= 0xD800 and ord(data[0]) <= 0xDBFF and - ord(data[1]) >= 0xDC00 and ord(data[1]) <= 0xDFFF) - - -def surrogatePairToCodepoint(data): - char_val = (0x10000 + (ord(data[0]) - 0xD800) * 0x400 + - (ord(data[1]) - 0xDC00)) - return char_val - -# Module Factory Factory (no, this isn't Java, I know) -# Here to stop this being duplicated all over the place. - - -def moduleFactoryFactory(factory): - moduleCache = {} - - def moduleFactory(baseModule, *args, **kwargs): - if isinstance(ModuleType.__name__, type("")): - name = "_%s_factory" % baseModule.__name__ - else: - name = b"_%s_factory" % baseModule.__name__ - - kwargs_tuple = tuple(kwargs.items()) - - try: - return moduleCache[name][args][kwargs_tuple] - except KeyError: - mod = ModuleType(name) - objs = factory(baseModule, *args, **kwargs) - mod.__dict__.update(objs) - if "name" not in moduleCache: - moduleCache[name] = {} - if "args" not in moduleCache[name]: - moduleCache[name][args] = {} - if "kwargs" not in moduleCache[name][args]: - moduleCache[name][args][kwargs_tuple] = {} - moduleCache[name][args][kwargs_tuple] = mod - return mod - - return moduleFactory - - -def memoize(func): - cache = {} - - def wrapped(*args, **kwargs): - key = (tuple(args), tuple(kwargs.items())) - if key not in cache: - cache[key] = func(*args, **kwargs) - return cache[key] - - return wrapped diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/constants.py b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/constants.py deleted file mode 100644 index 1ff8041..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/constants.py +++ /dev/null @@ -1,2947 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -import string - -EOF = None - -E = { - "null-character": - "Null character in input stream, replaced with U+FFFD.", - "invalid-codepoint": - "Invalid codepoint in stream.", - "incorrectly-placed-solidus": - "Solidus (/) incorrectly placed in tag.", - "incorrect-cr-newline-entity": - "Incorrect CR newline entity, replaced with LF.", - "illegal-windows-1252-entity": - "Entity used with illegal number (windows-1252 reference).", - "cant-convert-numeric-entity": - "Numeric entity couldn't be converted to character " - "(codepoint U+%(charAsInt)08x).", - "illegal-codepoint-for-numeric-entity": - "Numeric entity represents an illegal codepoint: " - "U+%(charAsInt)08x.", - "numeric-entity-without-semicolon": - "Numeric entity didn't end with ';'.", - "expected-numeric-entity-but-got-eof": - "Numeric entity expected. Got end of file instead.", - "expected-numeric-entity": - "Numeric entity expected but none found.", - "named-entity-without-semicolon": - "Named entity didn't end with ';'.", - "expected-named-entity": - "Named entity expected. Got none.", - "attributes-in-end-tag": - "End tag contains unexpected attributes.", - 'self-closing-flag-on-end-tag': - "End tag contains unexpected self-closing flag.", - "expected-tag-name-but-got-right-bracket": - "Expected tag name. Got '>' instead.", - "expected-tag-name-but-got-question-mark": - "Expected tag name. Got '?' instead. (HTML doesn't " - "support processing instructions.)", - "expected-tag-name": - "Expected tag name. Got something else instead", - "expected-closing-tag-but-got-right-bracket": - "Expected closing tag. Got '>' instead. Ignoring '</>'.", - "expected-closing-tag-but-got-eof": - "Expected closing tag. Unexpected end of file.", - "expected-closing-tag-but-got-char": - "Expected closing tag. Unexpected character '%(data)s' found.", - "eof-in-tag-name": - "Unexpected end of file in the tag name.", - "expected-attribute-name-but-got-eof": - "Unexpected end of file. Expected attribute name instead.", - "eof-in-attribute-name": - "Unexpected end of file in attribute name.", - "invalid-character-in-attribute-name": - "Invalid character in attribute name", - "duplicate-attribute": - "Dropped duplicate attribute on tag.", - "expected-end-of-tag-name-but-got-eof": - "Unexpected end of file. Expected = or end of tag.", - "expected-attribute-value-but-got-eof": - "Unexpected end of file. Expected attribute value.", - "expected-attribute-value-but-got-right-bracket": - "Expected attribute value. Got '>' instead.", - 'equals-in-unquoted-attribute-value': - "Unexpected = in unquoted attribute", - 'unexpected-character-in-unquoted-attribute-value': - "Unexpected character in unquoted attribute", - "invalid-character-after-attribute-name": - "Unexpected character after attribute name.", - "unexpected-character-after-attribute-value": - "Unexpected character after attribute value.", - "eof-in-attribute-value-double-quote": - "Unexpected end of file in attribute value (\").", - "eof-in-attribute-value-single-quote": - "Unexpected end of file in attribute value (').", - "eof-in-attribute-value-no-quotes": - "Unexpected end of file in attribute value.", - "unexpected-EOF-after-solidus-in-tag": - "Unexpected end of file in tag. Expected >", - "unexpected-character-after-solidus-in-tag": - "Unexpected character after / in tag. Expected >", - "expected-dashes-or-doctype": - "Expected '--' or 'DOCTYPE'. Not found.", - "unexpected-bang-after-double-dash-in-comment": - "Unexpected ! after -- in comment", - "unexpected-space-after-double-dash-in-comment": - "Unexpected space after -- in comment", - "incorrect-comment": - "Incorrect comment.", - "eof-in-comment": - "Unexpected end of file in comment.", - "eof-in-comment-end-dash": - "Unexpected end of file in comment (-)", - "unexpected-dash-after-double-dash-in-comment": - "Unexpected '-' after '--' found in comment.", - "eof-in-comment-double-dash": - "Unexpected end of file in comment (--).", - "eof-in-comment-end-space-state": - "Unexpected end of file in comment.", - "eof-in-comment-end-bang-state": - "Unexpected end of file in comment.", - "unexpected-char-in-comment": - "Unexpected character in comment found.", - "need-space-after-doctype": - "No space after literal string 'DOCTYPE'.", - "expected-doctype-name-but-got-right-bracket": - "Unexpected > character. Expected DOCTYPE name.", - "expected-doctype-name-but-got-eof": - "Unexpected end of file. Expected DOCTYPE name.", - "eof-in-doctype-name": - "Unexpected end of file in DOCTYPE name.", - "eof-in-doctype": - "Unexpected end of file in DOCTYPE.", - "expected-space-or-right-bracket-in-doctype": - "Expected space or '>'. Got '%(data)s'", - "unexpected-end-of-doctype": - "Unexpected end of DOCTYPE.", - "unexpected-char-in-doctype": - "Unexpected character in DOCTYPE.", - "eof-in-innerhtml": - "XXX innerHTML EOF", - "unexpected-doctype": - "Unexpected DOCTYPE. Ignored.", - "non-html-root": - "html needs to be the first start tag.", - "expected-doctype-but-got-eof": - "Unexpected End of file. Expected DOCTYPE.", - "unknown-doctype": - "Erroneous DOCTYPE.", - "expected-doctype-but-got-chars": - "Unexpected non-space characters. Expected DOCTYPE.", - "expected-doctype-but-got-start-tag": - "Unexpected start tag (%(name)s). Expected DOCTYPE.", - "expected-doctype-but-got-end-tag": - "Unexpected end tag (%(name)s). Expected DOCTYPE.", - "end-tag-after-implied-root": - "Unexpected end tag (%(name)s) after the (implied) root element.", - "expected-named-closing-tag-but-got-eof": - "Unexpected end of file. Expected end tag (%(name)s).", - "two-heads-are-not-better-than-one": - "Unexpected start tag head in existing head. Ignored.", - "unexpected-end-tag": - "Unexpected end tag (%(name)s). Ignored.", - "unexpected-start-tag-out-of-my-head": - "Unexpected start tag (%(name)s) that can be in head. Moved.", - "unexpected-start-tag": - "Unexpected start tag (%(name)s).", - "missing-end-tag": - "Missing end tag (%(name)s).", - "missing-end-tags": - "Missing end tags (%(name)s).", - "unexpected-start-tag-implies-end-tag": - "Unexpected start tag (%(startName)s) " - "implies end tag (%(endName)s).", - "unexpected-start-tag-treated-as": - "Unexpected start tag (%(originalName)s). Treated as %(newName)s.", - "deprecated-tag": - "Unexpected start tag %(name)s. Don't use it!", - "unexpected-start-tag-ignored": - "Unexpected start tag %(name)s. Ignored.", - "expected-one-end-tag-but-got-another": - "Unexpected end tag (%(gotName)s). " - "Missing end tag (%(expectedName)s).", - "end-tag-too-early": - "End tag (%(name)s) seen too early. Expected other end tag.", - "end-tag-too-early-named": - "Unexpected end tag (%(gotName)s). Expected end tag (%(expectedName)s).", - "end-tag-too-early-ignored": - "End tag (%(name)s) seen too early. Ignored.", - "adoption-agency-1.1": - "End tag (%(name)s) violates step 1, " - "paragraph 1 of the adoption agency algorithm.", - "adoption-agency-1.2": - "End tag (%(name)s) violates step 1, " - "paragraph 2 of the adoption agency algorithm.", - "adoption-agency-1.3": - "End tag (%(name)s) violates step 1, " - "paragraph 3 of the adoption agency algorithm.", - "adoption-agency-4.4": - "End tag (%(name)s) violates step 4, " - "paragraph 4 of the adoption agency algorithm.", - "unexpected-end-tag-treated-as": - "Unexpected end tag (%(originalName)s). Treated as %(newName)s.", - "no-end-tag": - "This element (%(name)s) has no end tag.", - "unexpected-implied-end-tag-in-table": - "Unexpected implied end tag (%(name)s) in the table phase.", - "unexpected-implied-end-tag-in-table-body": - "Unexpected implied end tag (%(name)s) in the table body phase.", - "unexpected-char-implies-table-voodoo": - "Unexpected non-space characters in " - "table context caused voodoo mode.", - "unexpected-hidden-input-in-table": - "Unexpected input with type hidden in table context.", - "unexpected-form-in-table": - "Unexpected form in table context.", - "unexpected-start-tag-implies-table-voodoo": - "Unexpected start tag (%(name)s) in " - "table context caused voodoo mode.", - "unexpected-end-tag-implies-table-voodoo": - "Unexpected end tag (%(name)s) in " - "table context caused voodoo mode.", - "unexpected-cell-in-table-body": - "Unexpected table cell start tag (%(name)s) " - "in the table body phase.", - "unexpected-cell-end-tag": - "Got table cell end tag (%(name)s) " - "while required end tags are missing.", - "unexpected-end-tag-in-table-body": - "Unexpected end tag (%(name)s) in the table body phase. Ignored.", - "unexpected-implied-end-tag-in-table-row": - "Unexpected implied end tag (%(name)s) in the table row phase.", - "unexpected-end-tag-in-table-row": - "Unexpected end tag (%(name)s) in the table row phase. Ignored.", - "unexpected-select-in-select": - "Unexpected select start tag in the select phase " - "treated as select end tag.", - "unexpected-input-in-select": - "Unexpected input start tag in the select phase.", - "unexpected-start-tag-in-select": - "Unexpected start tag token (%(name)s in the select phase. " - "Ignored.", - "unexpected-end-tag-in-select": - "Unexpected end tag (%(name)s) in the select phase. Ignored.", - "unexpected-table-element-start-tag-in-select-in-table": - "Unexpected table element start tag (%(name)s) in the select in table phase.", - "unexpected-table-element-end-tag-in-select-in-table": - "Unexpected table element end tag (%(name)s) in the select in table phase.", - "unexpected-char-after-body": - "Unexpected non-space characters in the after body phase.", - "unexpected-start-tag-after-body": - "Unexpected start tag token (%(name)s)" - " in the after body phase.", - "unexpected-end-tag-after-body": - "Unexpected end tag token (%(name)s)" - " in the after body phase.", - "unexpected-char-in-frameset": - "Unexpected characters in the frameset phase. Characters ignored.", - "unexpected-start-tag-in-frameset": - "Unexpected start tag token (%(name)s)" - " in the frameset phase. Ignored.", - "unexpected-frameset-in-frameset-innerhtml": - "Unexpected end tag token (frameset) " - "in the frameset phase (innerHTML).", - "unexpected-end-tag-in-frameset": - "Unexpected end tag token (%(name)s)" - " in the frameset phase. Ignored.", - "unexpected-char-after-frameset": - "Unexpected non-space characters in the " - "after frameset phase. Ignored.", - "unexpected-start-tag-after-frameset": - "Unexpected start tag (%(name)s)" - " in the after frameset phase. Ignored.", - "unexpected-end-tag-after-frameset": - "Unexpected end tag (%(name)s)" - " in the after frameset phase. Ignored.", - "unexpected-end-tag-after-body-innerhtml": - "Unexpected end tag after body(innerHtml)", - "expected-eof-but-got-char": - "Unexpected non-space characters. Expected end of file.", - "expected-eof-but-got-start-tag": - "Unexpected start tag (%(name)s)" - ". Expected end of file.", - "expected-eof-but-got-end-tag": - "Unexpected end tag (%(name)s)" - ". Expected end of file.", - "eof-in-table": - "Unexpected end of file. Expected table content.", - "eof-in-select": - "Unexpected end of file. Expected select content.", - "eof-in-frameset": - "Unexpected end of file. Expected frameset content.", - "eof-in-script-in-script": - "Unexpected end of file. Expected script content.", - "eof-in-foreign-lands": - "Unexpected end of file. Expected foreign content", - "non-void-element-with-trailing-solidus": - "Trailing solidus not allowed on element %(name)s", - "unexpected-html-element-in-foreign-content": - "Element %(name)s not allowed in a non-html context", - "unexpected-end-tag-before-html": - "Unexpected end tag (%(name)s) before html.", - "unexpected-inhead-noscript-tag": - "Element %(name)s not allowed in a inhead-noscript context", - "eof-in-head-noscript": - "Unexpected end of file. Expected inhead-noscript content", - "char-in-head-noscript": - "Unexpected non-space character. Expected inhead-noscript content", - "XXX-undefined-error": - "Undefined error (this sucks and should be fixed)", -} - -namespaces = { - "html": "http://www.w3.org/1999/xhtml", - "mathml": "http://www.w3.org/1998/Math/MathML", - "svg": "http://www.w3.org/2000/svg", - "xlink": "http://www.w3.org/1999/xlink", - "xml": "http://www.w3.org/XML/1998/namespace", - "xmlns": "http://www.w3.org/2000/xmlns/" -} - -scopingElements = frozenset([ - (namespaces["html"], "applet"), - (namespaces["html"], "caption"), - (namespaces["html"], "html"), - (namespaces["html"], "marquee"), - (namespaces["html"], "object"), - (namespaces["html"], "table"), - (namespaces["html"], "td"), - (namespaces["html"], "th"), - (namespaces["mathml"], "mi"), - (namespaces["mathml"], "mo"), - (namespaces["mathml"], "mn"), - (namespaces["mathml"], "ms"), - (namespaces["mathml"], "mtext"), - (namespaces["mathml"], "annotation-xml"), - (namespaces["svg"], "foreignObject"), - (namespaces["svg"], "desc"), - (namespaces["svg"], "title"), -]) - -formattingElements = frozenset([ - (namespaces["html"], "a"), - (namespaces["html"], "b"), - (namespaces["html"], "big"), - (namespaces["html"], "code"), - (namespaces["html"], "em"), - (namespaces["html"], "font"), - (namespaces["html"], "i"), - (namespaces["html"], "nobr"), - (namespaces["html"], "s"), - (namespaces["html"], "small"), - (namespaces["html"], "strike"), - (namespaces["html"], "strong"), - (namespaces["html"], "tt"), - (namespaces["html"], "u") -]) - -specialElements = frozenset([ - (namespaces["html"], "address"), - (namespaces["html"], "applet"), - (namespaces["html"], "area"), - (namespaces["html"], "article"), - (namespaces["html"], "aside"), - (namespaces["html"], "base"), - (namespaces["html"], "basefont"), - (namespaces["html"], "bgsound"), - (namespaces["html"], "blockquote"), - (namespaces["html"], "body"), - (namespaces["html"], "br"), - (namespaces["html"], "button"), - (namespaces["html"], "caption"), - (namespaces["html"], "center"), - (namespaces["html"], "col"), - (namespaces["html"], "colgroup"), - (namespaces["html"], "command"), - (namespaces["html"], "dd"), - (namespaces["html"], "details"), - (namespaces["html"], "dir"), - (namespaces["html"], "div"), - (namespaces["html"], "dl"), - (namespaces["html"], "dt"), - (namespaces["html"], "embed"), - (namespaces["html"], "fieldset"), - (namespaces["html"], "figure"), - (namespaces["html"], "footer"), - (namespaces["html"], "form"), - (namespaces["html"], "frame"), - (namespaces["html"], "frameset"), - (namespaces["html"], "h1"), - (namespaces["html"], "h2"), - (namespaces["html"], "h3"), - (namespaces["html"], "h4"), - (namespaces["html"], "h5"), - (namespaces["html"], "h6"), - (namespaces["html"], "head"), - (namespaces["html"], "header"), - (namespaces["html"], "hr"), - (namespaces["html"], "html"), - (namespaces["html"], "iframe"), - # Note that image is commented out in the spec as "this isn't an - # element that can end up on the stack, so it doesn't matter," - (namespaces["html"], "image"), - (namespaces["html"], "img"), - (namespaces["html"], "input"), - (namespaces["html"], "isindex"), - (namespaces["html"], "li"), - (namespaces["html"], "link"), - (namespaces["html"], "listing"), - (namespaces["html"], "marquee"), - (namespaces["html"], "menu"), - (namespaces["html"], "meta"), - (namespaces["html"], "nav"), - (namespaces["html"], "noembed"), - (namespaces["html"], "noframes"), - (namespaces["html"], "noscript"), - (namespaces["html"], "object"), - (namespaces["html"], "ol"), - (namespaces["html"], "p"), - (namespaces["html"], "param"), - (namespaces["html"], "plaintext"), - (namespaces["html"], "pre"), - (namespaces["html"], "script"), - (namespaces["html"], "section"), - (namespaces["html"], "select"), - (namespaces["html"], "style"), - (namespaces["html"], "table"), - (namespaces["html"], "tbody"), - (namespaces["html"], "td"), - (namespaces["html"], "textarea"), - (namespaces["html"], "tfoot"), - (namespaces["html"], "th"), - (namespaces["html"], "thead"), - (namespaces["html"], "title"), - (namespaces["html"], "tr"), - (namespaces["html"], "ul"), - (namespaces["html"], "wbr"), - (namespaces["html"], "xmp"), - (namespaces["svg"], "foreignObject") -]) - -htmlIntegrationPointElements = frozenset([ - (namespaces["mathml"], "annotation-xml"), - (namespaces["svg"], "foreignObject"), - (namespaces["svg"], "desc"), - (namespaces["svg"], "title") -]) - -mathmlTextIntegrationPointElements = frozenset([ - (namespaces["mathml"], "mi"), - (namespaces["mathml"], "mo"), - (namespaces["mathml"], "mn"), - (namespaces["mathml"], "ms"), - (namespaces["mathml"], "mtext") -]) - -adjustSVGAttributes = { - "attributename": "attributeName", - "attributetype": "attributeType", - "basefrequency": "baseFrequency", - "baseprofile": "baseProfile", - "calcmode": "calcMode", - "clippathunits": "clipPathUnits", - "contentscripttype": "contentScriptType", - "contentstyletype": "contentStyleType", - "diffuseconstant": "diffuseConstant", - "edgemode": "edgeMode", - "externalresourcesrequired": "externalResourcesRequired", - "filterres": "filterRes", - "filterunits": "filterUnits", - "glyphref": "glyphRef", - "gradienttransform": "gradientTransform", - "gradientunits": "gradientUnits", - "kernelmatrix": "kernelMatrix", - "kernelunitlength": "kernelUnitLength", - "keypoints": "keyPoints", - "keysplines": "keySplines", - "keytimes": "keyTimes", - "lengthadjust": "lengthAdjust", - "limitingconeangle": "limitingConeAngle", - "markerheight": "markerHeight", - "markerunits": "markerUnits", - "markerwidth": "markerWidth", - "maskcontentunits": "maskContentUnits", - "maskunits": "maskUnits", - "numoctaves": "numOctaves", - "pathlength": "pathLength", - "patterncontentunits": "patternContentUnits", - "patterntransform": "patternTransform", - "patternunits": "patternUnits", - "pointsatx": "pointsAtX", - "pointsaty": "pointsAtY", - "pointsatz": "pointsAtZ", - "preservealpha": "preserveAlpha", - "preserveaspectratio": "preserveAspectRatio", - "primitiveunits": "primitiveUnits", - "refx": "refX", - "refy": "refY", - "repeatcount": "repeatCount", - "repeatdur": "repeatDur", - "requiredextensions": "requiredExtensions", - "requiredfeatures": "requiredFeatures", - "specularconstant": "specularConstant", - "specularexponent": "specularExponent", - "spreadmethod": "spreadMethod", - "startoffset": "startOffset", - "stddeviation": "stdDeviation", - "stitchtiles": "stitchTiles", - "surfacescale": "surfaceScale", - "systemlanguage": "systemLanguage", - "tablevalues": "tableValues", - "targetx": "targetX", - "targety": "targetY", - "textlength": "textLength", - "viewbox": "viewBox", - "viewtarget": "viewTarget", - "xchannelselector": "xChannelSelector", - "ychannelselector": "yChannelSelector", - "zoomandpan": "zoomAndPan" -} - -adjustMathMLAttributes = {"definitionurl": "definitionURL"} - -adjustForeignAttributes = { - "xlink:actuate": ("xlink", "actuate", namespaces["xlink"]), - "xlink:arcrole": ("xlink", "arcrole", namespaces["xlink"]), - "xlink:href": ("xlink", "href", namespaces["xlink"]), - "xlink:role": ("xlink", "role", namespaces["xlink"]), - "xlink:show": ("xlink", "show", namespaces["xlink"]), - "xlink:title": ("xlink", "title", namespaces["xlink"]), - "xlink:type": ("xlink", "type", namespaces["xlink"]), - "xml:base": ("xml", "base", namespaces["xml"]), - "xml:lang": ("xml", "lang", namespaces["xml"]), - "xml:space": ("xml", "space", namespaces["xml"]), - "xmlns": (None, "xmlns", namespaces["xmlns"]), - "xmlns:xlink": ("xmlns", "xlink", namespaces["xmlns"]) -} - -unadjustForeignAttributes = dict([((ns, local), qname) for qname, (prefix, local, ns) in - adjustForeignAttributes.items()]) - -spaceCharacters = frozenset([ - "\t", - "\n", - "\u000C", - " ", - "\r" -]) - -tableInsertModeElements = frozenset([ - "table", - "tbody", - "tfoot", - "thead", - "tr" -]) - -asciiLowercase = frozenset(string.ascii_lowercase) -asciiUppercase = frozenset(string.ascii_uppercase) -asciiLetters = frozenset(string.ascii_letters) -digits = frozenset(string.digits) -hexDigits = frozenset(string.hexdigits) - -asciiUpper2Lower = dict([(ord(c), ord(c.lower())) - for c in string.ascii_uppercase]) - -# Heading elements need to be ordered -headingElements = ( - "h1", - "h2", - "h3", - "h4", - "h5", - "h6" -) - -voidElements = frozenset([ - "base", - "command", - "event-source", - "link", - "meta", - "hr", - "br", - "img", - "embed", - "param", - "area", - "col", - "input", - "source", - "track" -]) - -cdataElements = frozenset(['title', 'textarea']) - -rcdataElements = frozenset([ - 'style', - 'script', - 'xmp', - 'iframe', - 'noembed', - 'noframes', - 'noscript' -]) - -booleanAttributes = { - "": frozenset(["irrelevant", "itemscope"]), - "style": frozenset(["scoped"]), - "img": frozenset(["ismap"]), - "audio": frozenset(["autoplay", "controls"]), - "video": frozenset(["autoplay", "controls"]), - "script": frozenset(["defer", "async"]), - "details": frozenset(["open"]), - "datagrid": frozenset(["multiple", "disabled"]), - "command": frozenset(["hidden", "disabled", "checked", "default"]), - "hr": frozenset(["noshade"]), - "menu": frozenset(["autosubmit"]), - "fieldset": frozenset(["disabled", "readonly"]), - "option": frozenset(["disabled", "readonly", "selected"]), - "optgroup": frozenset(["disabled", "readonly"]), - "button": frozenset(["disabled", "autofocus"]), - "input": frozenset(["disabled", "readonly", "required", "autofocus", "checked", "ismap"]), - "select": frozenset(["disabled", "readonly", "autofocus", "multiple"]), - "output": frozenset(["disabled", "readonly"]), - "iframe": frozenset(["seamless"]), -} - -# entitiesWindows1252 has to be _ordered_ and needs to have an index. It -# therefore can't be a frozenset. -entitiesWindows1252 = ( - 8364, # 0x80 0x20AC EURO SIGN - 65533, # 0x81 UNDEFINED - 8218, # 0x82 0x201A SINGLE LOW-9 QUOTATION MARK - 402, # 0x83 0x0192 LATIN SMALL LETTER F WITH HOOK - 8222, # 0x84 0x201E DOUBLE LOW-9 QUOTATION MARK - 8230, # 0x85 0x2026 HORIZONTAL ELLIPSIS - 8224, # 0x86 0x2020 DAGGER - 8225, # 0x87 0x2021 DOUBLE DAGGER - 710, # 0x88 0x02C6 MODIFIER LETTER CIRCUMFLEX ACCENT - 8240, # 0x89 0x2030 PER MILLE SIGN - 352, # 0x8A 0x0160 LATIN CAPITAL LETTER S WITH CARON - 8249, # 0x8B 0x2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK - 338, # 0x8C 0x0152 LATIN CAPITAL LIGATURE OE - 65533, # 0x8D UNDEFINED - 381, # 0x8E 0x017D LATIN CAPITAL LETTER Z WITH CARON - 65533, # 0x8F UNDEFINED - 65533, # 0x90 UNDEFINED - 8216, # 0x91 0x2018 LEFT SINGLE QUOTATION MARK - 8217, # 0x92 0x2019 RIGHT SINGLE QUOTATION MARK - 8220, # 0x93 0x201C LEFT DOUBLE QUOTATION MARK - 8221, # 0x94 0x201D RIGHT DOUBLE QUOTATION MARK - 8226, # 0x95 0x2022 BULLET - 8211, # 0x96 0x2013 EN DASH - 8212, # 0x97 0x2014 EM DASH - 732, # 0x98 0x02DC SMALL TILDE - 8482, # 0x99 0x2122 TRADE MARK SIGN - 353, # 0x9A 0x0161 LATIN SMALL LETTER S WITH CARON - 8250, # 0x9B 0x203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - 339, # 0x9C 0x0153 LATIN SMALL LIGATURE OE - 65533, # 0x9D UNDEFINED - 382, # 0x9E 0x017E LATIN SMALL LETTER Z WITH CARON - 376 # 0x9F 0x0178 LATIN CAPITAL LETTER Y WITH DIAERESIS -) - -xmlEntities = frozenset(['lt;', 'gt;', 'amp;', 'apos;', 'quot;']) - -entities = { - "AElig": "\xc6", - "AElig;": "\xc6", - "AMP": "&", - "AMP;": "&", - "Aacute": "\xc1", - "Aacute;": "\xc1", - "Abreve;": "\u0102", - "Acirc": "\xc2", - "Acirc;": "\xc2", - "Acy;": "\u0410", - "Afr;": "\U0001d504", - "Agrave": "\xc0", - "Agrave;": "\xc0", - "Alpha;": "\u0391", - "Amacr;": "\u0100", - "And;": "\u2a53", - "Aogon;": "\u0104", - "Aopf;": "\U0001d538", - "ApplyFunction;": "\u2061", - "Aring": "\xc5", - "Aring;": "\xc5", - "Ascr;": "\U0001d49c", - "Assign;": "\u2254", - "Atilde": "\xc3", - "Atilde;": "\xc3", - "Auml": "\xc4", - "Auml;": "\xc4", - "Backslash;": "\u2216", - "Barv;": "\u2ae7", - "Barwed;": "\u2306", - "Bcy;": "\u0411", - "Because;": "\u2235", - "Bernoullis;": "\u212c", - "Beta;": "\u0392", - "Bfr;": "\U0001d505", - "Bopf;": "\U0001d539", - "Breve;": "\u02d8", - "Bscr;": "\u212c", - "Bumpeq;": "\u224e", - "CHcy;": "\u0427", - "COPY": "\xa9", - "COPY;": "\xa9", - "Cacute;": "\u0106", - "Cap;": "\u22d2", - "CapitalDifferentialD;": "\u2145", - "Cayleys;": "\u212d", - "Ccaron;": "\u010c", - "Ccedil": "\xc7", - "Ccedil;": "\xc7", - "Ccirc;": "\u0108", - "Cconint;": "\u2230", - "Cdot;": "\u010a", - "Cedilla;": "\xb8", - "CenterDot;": "\xb7", - "Cfr;": "\u212d", - "Chi;": "\u03a7", - "CircleDot;": "\u2299", - "CircleMinus;": "\u2296", - "CirclePlus;": "\u2295", - "CircleTimes;": "\u2297", - "ClockwiseContourIntegral;": "\u2232", - "CloseCurlyDoubleQuote;": "\u201d", - "CloseCurlyQuote;": "\u2019", - "Colon;": "\u2237", - "Colone;": "\u2a74", - "Congruent;": "\u2261", - "Conint;": "\u222f", - "ContourIntegral;": "\u222e", - "Copf;": "\u2102", - "Coproduct;": "\u2210", - "CounterClockwiseContourIntegral;": "\u2233", - "Cross;": "\u2a2f", - "Cscr;": "\U0001d49e", - "Cup;": "\u22d3", - "CupCap;": "\u224d", - "DD;": "\u2145", - "DDotrahd;": "\u2911", - "DJcy;": "\u0402", - "DScy;": "\u0405", - "DZcy;": "\u040f", - "Dagger;": "\u2021", - "Darr;": "\u21a1", - "Dashv;": "\u2ae4", - "Dcaron;": "\u010e", - "Dcy;": "\u0414", - "Del;": "\u2207", - "Delta;": "\u0394", - "Dfr;": "\U0001d507", - "DiacriticalAcute;": "\xb4", - "DiacriticalDot;": "\u02d9", - "DiacriticalDoubleAcute;": "\u02dd", - "DiacriticalGrave;": "`", - "DiacriticalTilde;": "\u02dc", - "Diamond;": "\u22c4", - "DifferentialD;": "\u2146", - "Dopf;": "\U0001d53b", - "Dot;": "\xa8", - "DotDot;": "\u20dc", - "DotEqual;": "\u2250", - "DoubleContourIntegral;": "\u222f", - "DoubleDot;": "\xa8", - "DoubleDownArrow;": "\u21d3", - "DoubleLeftArrow;": "\u21d0", - "DoubleLeftRightArrow;": "\u21d4", - "DoubleLeftTee;": "\u2ae4", - "DoubleLongLeftArrow;": "\u27f8", - "DoubleLongLeftRightArrow;": "\u27fa", - "DoubleLongRightArrow;": "\u27f9", - "DoubleRightArrow;": "\u21d2", - "DoubleRightTee;": "\u22a8", - "DoubleUpArrow;": "\u21d1", - "DoubleUpDownArrow;": "\u21d5", - "DoubleVerticalBar;": "\u2225", - "DownArrow;": "\u2193", - "DownArrowBar;": "\u2913", - "DownArrowUpArrow;": "\u21f5", - "DownBreve;": "\u0311", - "DownLeftRightVector;": "\u2950", - "DownLeftTeeVector;": "\u295e", - "DownLeftVector;": "\u21bd", - "DownLeftVectorBar;": "\u2956", - "DownRightTeeVector;": "\u295f", - "DownRightVector;": "\u21c1", - "DownRightVectorBar;": "\u2957", - "DownTee;": "\u22a4", - "DownTeeArrow;": "\u21a7", - "Downarrow;": "\u21d3", - "Dscr;": "\U0001d49f", - "Dstrok;": "\u0110", - "ENG;": "\u014a", - "ETH": "\xd0", - "ETH;": "\xd0", - "Eacute": "\xc9", - "Eacute;": "\xc9", - "Ecaron;": "\u011a", - "Ecirc": "\xca", - "Ecirc;": "\xca", - "Ecy;": "\u042d", - "Edot;": "\u0116", - "Efr;": "\U0001d508", - "Egrave": "\xc8", - "Egrave;": "\xc8", - "Element;": "\u2208", - "Emacr;": "\u0112", - "EmptySmallSquare;": "\u25fb", - "EmptyVerySmallSquare;": "\u25ab", - "Eogon;": "\u0118", - "Eopf;": "\U0001d53c", - "Epsilon;": "\u0395", - "Equal;": "\u2a75", - "EqualTilde;": "\u2242", - "Equilibrium;": "\u21cc", - "Escr;": "\u2130", - "Esim;": "\u2a73", - "Eta;": "\u0397", - "Euml": "\xcb", - "Euml;": "\xcb", - "Exists;": "\u2203", - "ExponentialE;": "\u2147", - "Fcy;": "\u0424", - "Ffr;": "\U0001d509", - "FilledSmallSquare;": "\u25fc", - "FilledVerySmallSquare;": "\u25aa", - "Fopf;": "\U0001d53d", - "ForAll;": "\u2200", - "Fouriertrf;": "\u2131", - "Fscr;": "\u2131", - "GJcy;": "\u0403", - "GT": ">", - "GT;": ">", - "Gamma;": "\u0393", - "Gammad;": "\u03dc", - "Gbreve;": "\u011e", - "Gcedil;": "\u0122", - "Gcirc;": "\u011c", - "Gcy;": "\u0413", - "Gdot;": "\u0120", - "Gfr;": "\U0001d50a", - "Gg;": "\u22d9", - "Gopf;": "\U0001d53e", - "GreaterEqual;": "\u2265", - "GreaterEqualLess;": "\u22db", - "GreaterFullEqual;": "\u2267", - "GreaterGreater;": "\u2aa2", - "GreaterLess;": "\u2277", - "GreaterSlantEqual;": "\u2a7e", - "GreaterTilde;": "\u2273", - "Gscr;": "\U0001d4a2", - "Gt;": "\u226b", - "HARDcy;": "\u042a", - "Hacek;": "\u02c7", - "Hat;": "^", - "Hcirc;": "\u0124", - "Hfr;": "\u210c", - "HilbertSpace;": "\u210b", - "Hopf;": "\u210d", - "HorizontalLine;": "\u2500", - "Hscr;": "\u210b", - "Hstrok;": "\u0126", - "HumpDownHump;": "\u224e", - "HumpEqual;": "\u224f", - "IEcy;": "\u0415", - "IJlig;": "\u0132", - "IOcy;": "\u0401", - "Iacute": "\xcd", - "Iacute;": "\xcd", - "Icirc": "\xce", - "Icirc;": "\xce", - "Icy;": "\u0418", - "Idot;": "\u0130", - "Ifr;": "\u2111", - "Igrave": "\xcc", - "Igrave;": "\xcc", - "Im;": "\u2111", - "Imacr;": "\u012a", - "ImaginaryI;": "\u2148", - "Implies;": "\u21d2", - "Int;": "\u222c", - "Integral;": "\u222b", - "Intersection;": "\u22c2", - "InvisibleComma;": "\u2063", - "InvisibleTimes;": "\u2062", - "Iogon;": "\u012e", - "Iopf;": "\U0001d540", - "Iota;": "\u0399", - "Iscr;": "\u2110", - "Itilde;": "\u0128", - "Iukcy;": "\u0406", - "Iuml": "\xcf", - "Iuml;": "\xcf", - "Jcirc;": "\u0134", - "Jcy;": "\u0419", - "Jfr;": "\U0001d50d", - "Jopf;": "\U0001d541", - "Jscr;": "\U0001d4a5", - "Jsercy;": "\u0408", - "Jukcy;": "\u0404", - "KHcy;": "\u0425", - "KJcy;": "\u040c", - "Kappa;": "\u039a", - "Kcedil;": "\u0136", - "Kcy;": "\u041a", - "Kfr;": "\U0001d50e", - "Kopf;": "\U0001d542", - "Kscr;": "\U0001d4a6", - "LJcy;": "\u0409", - "LT": "<", - "LT;": "<", - "Lacute;": "\u0139", - "Lambda;": "\u039b", - "Lang;": "\u27ea", - "Laplacetrf;": "\u2112", - "Larr;": "\u219e", - "Lcaron;": "\u013d", - "Lcedil;": "\u013b", - "Lcy;": "\u041b", - "LeftAngleBracket;": "\u27e8", - "LeftArrow;": "\u2190", - "LeftArrowBar;": "\u21e4", - "LeftArrowRightArrow;": "\u21c6", - "LeftCeiling;": "\u2308", - "LeftDoubleBracket;": "\u27e6", - "LeftDownTeeVector;": "\u2961", - "LeftDownVector;": "\u21c3", - "LeftDownVectorBar;": "\u2959", - "LeftFloor;": "\u230a", - "LeftRightArrow;": "\u2194", - "LeftRightVector;": "\u294e", - "LeftTee;": "\u22a3", - "LeftTeeArrow;": "\u21a4", - "LeftTeeVector;": "\u295a", - "LeftTriangle;": "\u22b2", - "LeftTriangleBar;": "\u29cf", - "LeftTriangleEqual;": "\u22b4", - "LeftUpDownVector;": "\u2951", - "LeftUpTeeVector;": "\u2960", - "LeftUpVector;": "\u21bf", - "LeftUpVectorBar;": "\u2958", - "LeftVector;": "\u21bc", - "LeftVectorBar;": "\u2952", - "Leftarrow;": "\u21d0", - "Leftrightarrow;": "\u21d4", - "LessEqualGreater;": "\u22da", - "LessFullEqual;": "\u2266", - "LessGreater;": "\u2276", - "LessLess;": "\u2aa1", - "LessSlantEqual;": "\u2a7d", - "LessTilde;": "\u2272", - "Lfr;": "\U0001d50f", - "Ll;": "\u22d8", - "Lleftarrow;": "\u21da", - "Lmidot;": "\u013f", - "LongLeftArrow;": "\u27f5", - "LongLeftRightArrow;": "\u27f7", - "LongRightArrow;": "\u27f6", - "Longleftarrow;": "\u27f8", - "Longleftrightarrow;": "\u27fa", - "Longrightarrow;": "\u27f9", - "Lopf;": "\U0001d543", - "LowerLeftArrow;": "\u2199", - "LowerRightArrow;": "\u2198", - "Lscr;": "\u2112", - "Lsh;": "\u21b0", - "Lstrok;": "\u0141", - "Lt;": "\u226a", - "Map;": "\u2905", - "Mcy;": "\u041c", - "MediumSpace;": "\u205f", - "Mellintrf;": "\u2133", - "Mfr;": "\U0001d510", - "MinusPlus;": "\u2213", - "Mopf;": "\U0001d544", - "Mscr;": "\u2133", - "Mu;": "\u039c", - "NJcy;": "\u040a", - "Nacute;": "\u0143", - "Ncaron;": "\u0147", - "Ncedil;": "\u0145", - "Ncy;": "\u041d", - "NegativeMediumSpace;": "\u200b", - "NegativeThickSpace;": "\u200b", - "NegativeThinSpace;": "\u200b", - "NegativeVeryThinSpace;": "\u200b", - "NestedGreaterGreater;": "\u226b", - "NestedLessLess;": "\u226a", - "NewLine;": "\n", - "Nfr;": "\U0001d511", - "NoBreak;": "\u2060", - "NonBreakingSpace;": "\xa0", - "Nopf;": "\u2115", - "Not;": "\u2aec", - "NotCongruent;": "\u2262", - "NotCupCap;": "\u226d", - "NotDoubleVerticalBar;": "\u2226", - "NotElement;": "\u2209", - "NotEqual;": "\u2260", - "NotEqualTilde;": "\u2242\u0338", - "NotExists;": "\u2204", - "NotGreater;": "\u226f", - "NotGreaterEqual;": "\u2271", - "NotGreaterFullEqual;": "\u2267\u0338", - "NotGreaterGreater;": "\u226b\u0338", - "NotGreaterLess;": "\u2279", - "NotGreaterSlantEqual;": "\u2a7e\u0338", - "NotGreaterTilde;": "\u2275", - "NotHumpDownHump;": "\u224e\u0338", - "NotHumpEqual;": "\u224f\u0338", - "NotLeftTriangle;": "\u22ea", - "NotLeftTriangleBar;": "\u29cf\u0338", - "NotLeftTriangleEqual;": "\u22ec", - "NotLess;": "\u226e", - "NotLessEqual;": "\u2270", - "NotLessGreater;": "\u2278", - "NotLessLess;": "\u226a\u0338", - "NotLessSlantEqual;": "\u2a7d\u0338", - "NotLessTilde;": "\u2274", - "NotNestedGreaterGreater;": "\u2aa2\u0338", - "NotNestedLessLess;": "\u2aa1\u0338", - "NotPrecedes;": "\u2280", - "NotPrecedesEqual;": "\u2aaf\u0338", - "NotPrecedesSlantEqual;": "\u22e0", - "NotReverseElement;": "\u220c", - "NotRightTriangle;": "\u22eb", - "NotRightTriangleBar;": "\u29d0\u0338", - "NotRightTriangleEqual;": "\u22ed", - "NotSquareSubset;": "\u228f\u0338", - "NotSquareSubsetEqual;": "\u22e2", - "NotSquareSuperset;": "\u2290\u0338", - "NotSquareSupersetEqual;": "\u22e3", - "NotSubset;": "\u2282\u20d2", - "NotSubsetEqual;": "\u2288", - "NotSucceeds;": "\u2281", - "NotSucceedsEqual;": "\u2ab0\u0338", - "NotSucceedsSlantEqual;": "\u22e1", - "NotSucceedsTilde;": "\u227f\u0338", - "NotSuperset;": "\u2283\u20d2", - "NotSupersetEqual;": "\u2289", - "NotTilde;": "\u2241", - "NotTildeEqual;": "\u2244", - "NotTildeFullEqual;": "\u2247", - "NotTildeTilde;": "\u2249", - "NotVerticalBar;": "\u2224", - "Nscr;": "\U0001d4a9", - "Ntilde": "\xd1", - "Ntilde;": "\xd1", - "Nu;": "\u039d", - "OElig;": "\u0152", - "Oacute": "\xd3", - "Oacute;": "\xd3", - "Ocirc": "\xd4", - "Ocirc;": "\xd4", - "Ocy;": "\u041e", - "Odblac;": "\u0150", - "Ofr;": "\U0001d512", - "Ograve": "\xd2", - "Ograve;": "\xd2", - "Omacr;": "\u014c", - "Omega;": "\u03a9", - "Omicron;": "\u039f", - "Oopf;": "\U0001d546", - "OpenCurlyDoubleQuote;": "\u201c", - "OpenCurlyQuote;": "\u2018", - "Or;": "\u2a54", - "Oscr;": "\U0001d4aa", - "Oslash": "\xd8", - "Oslash;": "\xd8", - "Otilde": "\xd5", - "Otilde;": "\xd5", - "Otimes;": "\u2a37", - "Ouml": "\xd6", - "Ouml;": "\xd6", - "OverBar;": "\u203e", - "OverBrace;": "\u23de", - "OverBracket;": "\u23b4", - "OverParenthesis;": "\u23dc", - "PartialD;": "\u2202", - "Pcy;": "\u041f", - "Pfr;": "\U0001d513", - "Phi;": "\u03a6", - "Pi;": "\u03a0", - "PlusMinus;": "\xb1", - "Poincareplane;": "\u210c", - "Popf;": "\u2119", - "Pr;": "\u2abb", - "Precedes;": "\u227a", - "PrecedesEqual;": "\u2aaf", - "PrecedesSlantEqual;": "\u227c", - "PrecedesTilde;": "\u227e", - "Prime;": "\u2033", - "Product;": "\u220f", - "Proportion;": "\u2237", - "Proportional;": "\u221d", - "Pscr;": "\U0001d4ab", - "Psi;": "\u03a8", - "QUOT": "\"", - "QUOT;": "\"", - "Qfr;": "\U0001d514", - "Qopf;": "\u211a", - "Qscr;": "\U0001d4ac", - "RBarr;": "\u2910", - "REG": "\xae", - "REG;": "\xae", - "Racute;": "\u0154", - "Rang;": "\u27eb", - "Rarr;": "\u21a0", - "Rarrtl;": "\u2916", - "Rcaron;": "\u0158", - "Rcedil;": "\u0156", - "Rcy;": "\u0420", - "Re;": "\u211c", - "ReverseElement;": "\u220b", - "ReverseEquilibrium;": "\u21cb", - "ReverseUpEquilibrium;": "\u296f", - "Rfr;": "\u211c", - "Rho;": "\u03a1", - "RightAngleBracket;": "\u27e9", - "RightArrow;": "\u2192", - "RightArrowBar;": "\u21e5", - "RightArrowLeftArrow;": "\u21c4", - "RightCeiling;": "\u2309", - "RightDoubleBracket;": "\u27e7", - "RightDownTeeVector;": "\u295d", - "RightDownVector;": "\u21c2", - "RightDownVectorBar;": "\u2955", - "RightFloor;": "\u230b", - "RightTee;": "\u22a2", - "RightTeeArrow;": "\u21a6", - "RightTeeVector;": "\u295b", - "RightTriangle;": "\u22b3", - "RightTriangleBar;": "\u29d0", - "RightTriangleEqual;": "\u22b5", - "RightUpDownVector;": "\u294f", - "RightUpTeeVector;": "\u295c", - "RightUpVector;": "\u21be", - "RightUpVectorBar;": "\u2954", - "RightVector;": "\u21c0", - "RightVectorBar;": "\u2953", - "Rightarrow;": "\u21d2", - "Ropf;": "\u211d", - "RoundImplies;": "\u2970", - "Rrightarrow;": "\u21db", - "Rscr;": "\u211b", - "Rsh;": "\u21b1", - "RuleDelayed;": "\u29f4", - "SHCHcy;": "\u0429", - "SHcy;": "\u0428", - "SOFTcy;": "\u042c", - "Sacute;": "\u015a", - "Sc;": "\u2abc", - "Scaron;": "\u0160", - "Scedil;": "\u015e", - "Scirc;": "\u015c", - "Scy;": "\u0421", - "Sfr;": "\U0001d516", - "ShortDownArrow;": "\u2193", - "ShortLeftArrow;": "\u2190", - "ShortRightArrow;": "\u2192", - "ShortUpArrow;": "\u2191", - "Sigma;": "\u03a3", - "SmallCircle;": "\u2218", - "Sopf;": "\U0001d54a", - "Sqrt;": "\u221a", - "Square;": "\u25a1", - "SquareIntersection;": "\u2293", - "SquareSubset;": "\u228f", - "SquareSubsetEqual;": "\u2291", - "SquareSuperset;": "\u2290", - "SquareSupersetEqual;": "\u2292", - "SquareUnion;": "\u2294", - "Sscr;": "\U0001d4ae", - "Star;": "\u22c6", - "Sub;": "\u22d0", - "Subset;": "\u22d0", - "SubsetEqual;": "\u2286", - "Succeeds;": "\u227b", - "SucceedsEqual;": "\u2ab0", - "SucceedsSlantEqual;": "\u227d", - "SucceedsTilde;": "\u227f", - "SuchThat;": "\u220b", - "Sum;": "\u2211", - "Sup;": "\u22d1", - "Superset;": "\u2283", - "SupersetEqual;": "\u2287", - "Supset;": "\u22d1", - "THORN": "\xde", - "THORN;": "\xde", - "TRADE;": "\u2122", - "TSHcy;": "\u040b", - "TScy;": "\u0426", - "Tab;": "\t", - "Tau;": "\u03a4", - "Tcaron;": "\u0164", - "Tcedil;": "\u0162", - "Tcy;": "\u0422", - "Tfr;": "\U0001d517", - "Therefore;": "\u2234", - "Theta;": "\u0398", - "ThickSpace;": "\u205f\u200a", - "ThinSpace;": "\u2009", - "Tilde;": "\u223c", - "TildeEqual;": "\u2243", - "TildeFullEqual;": "\u2245", - "TildeTilde;": "\u2248", - "Topf;": "\U0001d54b", - "TripleDot;": "\u20db", - "Tscr;": "\U0001d4af", - "Tstrok;": "\u0166", - "Uacute": "\xda", - "Uacute;": "\xda", - "Uarr;": "\u219f", - "Uarrocir;": "\u2949", - "Ubrcy;": "\u040e", - "Ubreve;": "\u016c", - "Ucirc": "\xdb", - "Ucirc;": "\xdb", - "Ucy;": "\u0423", - "Udblac;": "\u0170", - "Ufr;": "\U0001d518", - "Ugrave": "\xd9", - "Ugrave;": "\xd9", - "Umacr;": "\u016a", - "UnderBar;": "_", - "UnderBrace;": "\u23df", - "UnderBracket;": "\u23b5", - "UnderParenthesis;": "\u23dd", - "Union;": "\u22c3", - "UnionPlus;": "\u228e", - "Uogon;": "\u0172", - "Uopf;": "\U0001d54c", - "UpArrow;": "\u2191", - "UpArrowBar;": "\u2912", - "UpArrowDownArrow;": "\u21c5", - "UpDownArrow;": "\u2195", - "UpEquilibrium;": "\u296e", - "UpTee;": "\u22a5", - "UpTeeArrow;": "\u21a5", - "Uparrow;": "\u21d1", - "Updownarrow;": "\u21d5", - "UpperLeftArrow;": "\u2196", - "UpperRightArrow;": "\u2197", - "Upsi;": "\u03d2", - "Upsilon;": "\u03a5", - "Uring;": "\u016e", - "Uscr;": "\U0001d4b0", - "Utilde;": "\u0168", - "Uuml": "\xdc", - "Uuml;": "\xdc", - "VDash;": "\u22ab", - "Vbar;": "\u2aeb", - "Vcy;": "\u0412", - "Vdash;": "\u22a9", - "Vdashl;": "\u2ae6", - "Vee;": "\u22c1", - "Verbar;": "\u2016", - "Vert;": "\u2016", - "VerticalBar;": "\u2223", - "VerticalLine;": "|", - "VerticalSeparator;": "\u2758", - "VerticalTilde;": "\u2240", - "VeryThinSpace;": "\u200a", - "Vfr;": "\U0001d519", - "Vopf;": "\U0001d54d", - "Vscr;": "\U0001d4b1", - "Vvdash;": "\u22aa", - "Wcirc;": "\u0174", - "Wedge;": "\u22c0", - "Wfr;": "\U0001d51a", - "Wopf;": "\U0001d54e", - "Wscr;": "\U0001d4b2", - "Xfr;": "\U0001d51b", - "Xi;": "\u039e", - "Xopf;": "\U0001d54f", - "Xscr;": "\U0001d4b3", - "YAcy;": "\u042f", - "YIcy;": "\u0407", - "YUcy;": "\u042e", - "Yacute": "\xdd", - "Yacute;": "\xdd", - "Ycirc;": "\u0176", - "Ycy;": "\u042b", - "Yfr;": "\U0001d51c", - "Yopf;": "\U0001d550", - "Yscr;": "\U0001d4b4", - "Yuml;": "\u0178", - "ZHcy;": "\u0416", - "Zacute;": "\u0179", - "Zcaron;": "\u017d", - "Zcy;": "\u0417", - "Zdot;": "\u017b", - "ZeroWidthSpace;": "\u200b", - "Zeta;": "\u0396", - "Zfr;": "\u2128", - "Zopf;": "\u2124", - "Zscr;": "\U0001d4b5", - "aacute": "\xe1", - "aacute;": "\xe1", - "abreve;": "\u0103", - "ac;": "\u223e", - "acE;": "\u223e\u0333", - "acd;": "\u223f", - "acirc": "\xe2", - "acirc;": "\xe2", - "acute": "\xb4", - "acute;": "\xb4", - "acy;": "\u0430", - "aelig": "\xe6", - "aelig;": "\xe6", - "af;": "\u2061", - "afr;": "\U0001d51e", - "agrave": "\xe0", - "agrave;": "\xe0", - "alefsym;": "\u2135", - "aleph;": "\u2135", - "alpha;": "\u03b1", - "amacr;": "\u0101", - "amalg;": "\u2a3f", - "amp": "&", - "amp;": "&", - "and;": "\u2227", - "andand;": "\u2a55", - "andd;": "\u2a5c", - "andslope;": "\u2a58", - "andv;": "\u2a5a", - "ang;": "\u2220", - "ange;": "\u29a4", - "angle;": "\u2220", - "angmsd;": "\u2221", - "angmsdaa;": "\u29a8", - "angmsdab;": "\u29a9", - "angmsdac;": "\u29aa", - "angmsdad;": "\u29ab", - "angmsdae;": "\u29ac", - "angmsdaf;": "\u29ad", - "angmsdag;": "\u29ae", - "angmsdah;": "\u29af", - "angrt;": "\u221f", - "angrtvb;": "\u22be", - "angrtvbd;": "\u299d", - "angsph;": "\u2222", - "angst;": "\xc5", - "angzarr;": "\u237c", - "aogon;": "\u0105", - "aopf;": "\U0001d552", - "ap;": "\u2248", - "apE;": "\u2a70", - "apacir;": "\u2a6f", - "ape;": "\u224a", - "apid;": "\u224b", - "apos;": "'", - "approx;": "\u2248", - "approxeq;": "\u224a", - "aring": "\xe5", - "aring;": "\xe5", - "ascr;": "\U0001d4b6", - "ast;": "*", - "asymp;": "\u2248", - "asympeq;": "\u224d", - "atilde": "\xe3", - "atilde;": "\xe3", - "auml": "\xe4", - "auml;": "\xe4", - "awconint;": "\u2233", - "awint;": "\u2a11", - "bNot;": "\u2aed", - "backcong;": "\u224c", - "backepsilon;": "\u03f6", - "backprime;": "\u2035", - "backsim;": "\u223d", - "backsimeq;": "\u22cd", - "barvee;": "\u22bd", - "barwed;": "\u2305", - "barwedge;": "\u2305", - "bbrk;": "\u23b5", - "bbrktbrk;": "\u23b6", - "bcong;": "\u224c", - "bcy;": "\u0431", - "bdquo;": "\u201e", - "becaus;": "\u2235", - "because;": "\u2235", - "bemptyv;": "\u29b0", - "bepsi;": "\u03f6", - "bernou;": "\u212c", - "beta;": "\u03b2", - "beth;": "\u2136", - "between;": "\u226c", - "bfr;": "\U0001d51f", - "bigcap;": "\u22c2", - "bigcirc;": "\u25ef", - "bigcup;": "\u22c3", - "bigodot;": "\u2a00", - "bigoplus;": "\u2a01", - "bigotimes;": "\u2a02", - "bigsqcup;": "\u2a06", - "bigstar;": "\u2605", - "bigtriangledown;": "\u25bd", - "bigtriangleup;": "\u25b3", - "biguplus;": "\u2a04", - "bigvee;": "\u22c1", - "bigwedge;": "\u22c0", - "bkarow;": "\u290d", - "blacklozenge;": "\u29eb", - "blacksquare;": "\u25aa", - "blacktriangle;": "\u25b4", - "blacktriangledown;": "\u25be", - "blacktriangleleft;": "\u25c2", - "blacktriangleright;": "\u25b8", - "blank;": "\u2423", - "blk12;": "\u2592", - "blk14;": "\u2591", - "blk34;": "\u2593", - "block;": "\u2588", - "bne;": "=\u20e5", - "bnequiv;": "\u2261\u20e5", - "bnot;": "\u2310", - "bopf;": "\U0001d553", - "bot;": "\u22a5", - "bottom;": "\u22a5", - "bowtie;": "\u22c8", - "boxDL;": "\u2557", - "boxDR;": "\u2554", - "boxDl;": "\u2556", - "boxDr;": "\u2553", - "boxH;": "\u2550", - "boxHD;": "\u2566", - "boxHU;": "\u2569", - "boxHd;": "\u2564", - "boxHu;": "\u2567", - "boxUL;": "\u255d", - "boxUR;": "\u255a", - "boxUl;": "\u255c", - "boxUr;": "\u2559", - "boxV;": "\u2551", - "boxVH;": "\u256c", - "boxVL;": "\u2563", - "boxVR;": "\u2560", - "boxVh;": "\u256b", - "boxVl;": "\u2562", - "boxVr;": "\u255f", - "boxbox;": "\u29c9", - "boxdL;": "\u2555", - "boxdR;": "\u2552", - "boxdl;": "\u2510", - "boxdr;": "\u250c", - "boxh;": "\u2500", - "boxhD;": "\u2565", - "boxhU;": "\u2568", - "boxhd;": "\u252c", - "boxhu;": "\u2534", - "boxminus;": "\u229f", - "boxplus;": "\u229e", - "boxtimes;": "\u22a0", - "boxuL;": "\u255b", - "boxuR;": "\u2558", - "boxul;": "\u2518", - "boxur;": "\u2514", - "boxv;": "\u2502", - "boxvH;": "\u256a", - "boxvL;": "\u2561", - "boxvR;": "\u255e", - "boxvh;": "\u253c", - "boxvl;": "\u2524", - "boxvr;": "\u251c", - "bprime;": "\u2035", - "breve;": "\u02d8", - "brvbar": "\xa6", - "brvbar;": "\xa6", - "bscr;": "\U0001d4b7", - "bsemi;": "\u204f", - "bsim;": "\u223d", - "bsime;": "\u22cd", - "bsol;": "\\", - "bsolb;": "\u29c5", - "bsolhsub;": "\u27c8", - "bull;": "\u2022", - "bullet;": "\u2022", - "bump;": "\u224e", - "bumpE;": "\u2aae", - "bumpe;": "\u224f", - "bumpeq;": "\u224f", - "cacute;": "\u0107", - "cap;": "\u2229", - "capand;": "\u2a44", - "capbrcup;": "\u2a49", - "capcap;": "\u2a4b", - "capcup;": "\u2a47", - "capdot;": "\u2a40", - "caps;": "\u2229\ufe00", - "caret;": "\u2041", - "caron;": "\u02c7", - "ccaps;": "\u2a4d", - "ccaron;": "\u010d", - "ccedil": "\xe7", - "ccedil;": "\xe7", - "ccirc;": "\u0109", - "ccups;": "\u2a4c", - "ccupssm;": "\u2a50", - "cdot;": "\u010b", - "cedil": "\xb8", - "cedil;": "\xb8", - "cemptyv;": "\u29b2", - "cent": "\xa2", - "cent;": "\xa2", - "centerdot;": "\xb7", - "cfr;": "\U0001d520", - "chcy;": "\u0447", - "check;": "\u2713", - "checkmark;": "\u2713", - "chi;": "\u03c7", - "cir;": "\u25cb", - "cirE;": "\u29c3", - "circ;": "\u02c6", - "circeq;": "\u2257", - "circlearrowleft;": "\u21ba", - "circlearrowright;": "\u21bb", - "circledR;": "\xae", - "circledS;": "\u24c8", - "circledast;": "\u229b", - "circledcirc;": "\u229a", - "circleddash;": "\u229d", - "cire;": "\u2257", - "cirfnint;": "\u2a10", - "cirmid;": "\u2aef", - "cirscir;": "\u29c2", - "clubs;": "\u2663", - "clubsuit;": "\u2663", - "colon;": ":", - "colone;": "\u2254", - "coloneq;": "\u2254", - "comma;": ",", - "commat;": "@", - "comp;": "\u2201", - "compfn;": "\u2218", - "complement;": "\u2201", - "complexes;": "\u2102", - "cong;": "\u2245", - "congdot;": "\u2a6d", - "conint;": "\u222e", - "copf;": "\U0001d554", - "coprod;": "\u2210", - "copy": "\xa9", - "copy;": "\xa9", - "copysr;": "\u2117", - "crarr;": "\u21b5", - "cross;": "\u2717", - "cscr;": "\U0001d4b8", - "csub;": "\u2acf", - "csube;": "\u2ad1", - "csup;": "\u2ad0", - "csupe;": "\u2ad2", - "ctdot;": "\u22ef", - "cudarrl;": "\u2938", - "cudarrr;": "\u2935", - "cuepr;": "\u22de", - "cuesc;": "\u22df", - "cularr;": "\u21b6", - "cularrp;": "\u293d", - "cup;": "\u222a", - "cupbrcap;": "\u2a48", - "cupcap;": "\u2a46", - "cupcup;": "\u2a4a", - "cupdot;": "\u228d", - "cupor;": "\u2a45", - "cups;": "\u222a\ufe00", - "curarr;": "\u21b7", - "curarrm;": "\u293c", - "curlyeqprec;": "\u22de", - "curlyeqsucc;": "\u22df", - "curlyvee;": "\u22ce", - "curlywedge;": "\u22cf", - "curren": "\xa4", - "curren;": "\xa4", - "curvearrowleft;": "\u21b6", - "curvearrowright;": "\u21b7", - "cuvee;": "\u22ce", - "cuwed;": "\u22cf", - "cwconint;": "\u2232", - "cwint;": "\u2231", - "cylcty;": "\u232d", - "dArr;": "\u21d3", - "dHar;": "\u2965", - "dagger;": "\u2020", - "daleth;": "\u2138", - "darr;": "\u2193", - "dash;": "\u2010", - "dashv;": "\u22a3", - "dbkarow;": "\u290f", - "dblac;": "\u02dd", - "dcaron;": "\u010f", - "dcy;": "\u0434", - "dd;": "\u2146", - "ddagger;": "\u2021", - "ddarr;": "\u21ca", - "ddotseq;": "\u2a77", - "deg": "\xb0", - "deg;": "\xb0", - "delta;": "\u03b4", - "demptyv;": "\u29b1", - "dfisht;": "\u297f", - "dfr;": "\U0001d521", - "dharl;": "\u21c3", - "dharr;": "\u21c2", - "diam;": "\u22c4", - "diamond;": "\u22c4", - "diamondsuit;": "\u2666", - "diams;": "\u2666", - "die;": "\xa8", - "digamma;": "\u03dd", - "disin;": "\u22f2", - "div;": "\xf7", - "divide": "\xf7", - "divide;": "\xf7", - "divideontimes;": "\u22c7", - "divonx;": "\u22c7", - "djcy;": "\u0452", - "dlcorn;": "\u231e", - "dlcrop;": "\u230d", - "dollar;": "$", - "dopf;": "\U0001d555", - "dot;": "\u02d9", - "doteq;": "\u2250", - "doteqdot;": "\u2251", - "dotminus;": "\u2238", - "dotplus;": "\u2214", - "dotsquare;": "\u22a1", - "doublebarwedge;": "\u2306", - "downarrow;": "\u2193", - "downdownarrows;": "\u21ca", - "downharpoonleft;": "\u21c3", - "downharpoonright;": "\u21c2", - "drbkarow;": "\u2910", - "drcorn;": "\u231f", - "drcrop;": "\u230c", - "dscr;": "\U0001d4b9", - "dscy;": "\u0455", - "dsol;": "\u29f6", - "dstrok;": "\u0111", - "dtdot;": "\u22f1", - "dtri;": "\u25bf", - "dtrif;": "\u25be", - "duarr;": "\u21f5", - "duhar;": "\u296f", - "dwangle;": "\u29a6", - "dzcy;": "\u045f", - "dzigrarr;": "\u27ff", - "eDDot;": "\u2a77", - "eDot;": "\u2251", - "eacute": "\xe9", - "eacute;": "\xe9", - "easter;": "\u2a6e", - "ecaron;": "\u011b", - "ecir;": "\u2256", - "ecirc": "\xea", - "ecirc;": "\xea", - "ecolon;": "\u2255", - "ecy;": "\u044d", - "edot;": "\u0117", - "ee;": "\u2147", - "efDot;": "\u2252", - "efr;": "\U0001d522", - "eg;": "\u2a9a", - "egrave": "\xe8", - "egrave;": "\xe8", - "egs;": "\u2a96", - "egsdot;": "\u2a98", - "el;": "\u2a99", - "elinters;": "\u23e7", - "ell;": "\u2113", - "els;": "\u2a95", - "elsdot;": "\u2a97", - "emacr;": "\u0113", - "empty;": "\u2205", - "emptyset;": "\u2205", - "emptyv;": "\u2205", - "emsp13;": "\u2004", - "emsp14;": "\u2005", - "emsp;": "\u2003", - "eng;": "\u014b", - "ensp;": "\u2002", - "eogon;": "\u0119", - "eopf;": "\U0001d556", - "epar;": "\u22d5", - "eparsl;": "\u29e3", - "eplus;": "\u2a71", - "epsi;": "\u03b5", - "epsilon;": "\u03b5", - "epsiv;": "\u03f5", - "eqcirc;": "\u2256", - "eqcolon;": "\u2255", - "eqsim;": "\u2242", - "eqslantgtr;": "\u2a96", - "eqslantless;": "\u2a95", - "equals;": "=", - "equest;": "\u225f", - "equiv;": "\u2261", - "equivDD;": "\u2a78", - "eqvparsl;": "\u29e5", - "erDot;": "\u2253", - "erarr;": "\u2971", - "escr;": "\u212f", - "esdot;": "\u2250", - "esim;": "\u2242", - "eta;": "\u03b7", - "eth": "\xf0", - "eth;": "\xf0", - "euml": "\xeb", - "euml;": "\xeb", - "euro;": "\u20ac", - "excl;": "!", - "exist;": "\u2203", - "expectation;": "\u2130", - "exponentiale;": "\u2147", - "fallingdotseq;": "\u2252", - "fcy;": "\u0444", - "female;": "\u2640", - "ffilig;": "\ufb03", - "fflig;": "\ufb00", - "ffllig;": "\ufb04", - "ffr;": "\U0001d523", - "filig;": "\ufb01", - "fjlig;": "fj", - "flat;": "\u266d", - "fllig;": "\ufb02", - "fltns;": "\u25b1", - "fnof;": "\u0192", - "fopf;": "\U0001d557", - "forall;": "\u2200", - "fork;": "\u22d4", - "forkv;": "\u2ad9", - "fpartint;": "\u2a0d", - "frac12": "\xbd", - "frac12;": "\xbd", - "frac13;": "\u2153", - "frac14": "\xbc", - "frac14;": "\xbc", - "frac15;": "\u2155", - "frac16;": "\u2159", - "frac18;": "\u215b", - "frac23;": "\u2154", - "frac25;": "\u2156", - "frac34": "\xbe", - "frac34;": "\xbe", - "frac35;": "\u2157", - "frac38;": "\u215c", - "frac45;": "\u2158", - "frac56;": "\u215a", - "frac58;": "\u215d", - "frac78;": "\u215e", - "frasl;": "\u2044", - "frown;": "\u2322", - "fscr;": "\U0001d4bb", - "gE;": "\u2267", - "gEl;": "\u2a8c", - "gacute;": "\u01f5", - "gamma;": "\u03b3", - "gammad;": "\u03dd", - "gap;": "\u2a86", - "gbreve;": "\u011f", - "gcirc;": "\u011d", - "gcy;": "\u0433", - "gdot;": "\u0121", - "ge;": "\u2265", - "gel;": "\u22db", - "geq;": "\u2265", - "geqq;": "\u2267", - "geqslant;": "\u2a7e", - "ges;": "\u2a7e", - "gescc;": "\u2aa9", - "gesdot;": "\u2a80", - "gesdoto;": "\u2a82", - "gesdotol;": "\u2a84", - "gesl;": "\u22db\ufe00", - "gesles;": "\u2a94", - "gfr;": "\U0001d524", - "gg;": "\u226b", - "ggg;": "\u22d9", - "gimel;": "\u2137", - "gjcy;": "\u0453", - "gl;": "\u2277", - "glE;": "\u2a92", - "gla;": "\u2aa5", - "glj;": "\u2aa4", - "gnE;": "\u2269", - "gnap;": "\u2a8a", - "gnapprox;": "\u2a8a", - "gne;": "\u2a88", - "gneq;": "\u2a88", - "gneqq;": "\u2269", - "gnsim;": "\u22e7", - "gopf;": "\U0001d558", - "grave;": "`", - "gscr;": "\u210a", - "gsim;": "\u2273", - "gsime;": "\u2a8e", - "gsiml;": "\u2a90", - "gt": ">", - "gt;": ">", - "gtcc;": "\u2aa7", - "gtcir;": "\u2a7a", - "gtdot;": "\u22d7", - "gtlPar;": "\u2995", - "gtquest;": "\u2a7c", - "gtrapprox;": "\u2a86", - "gtrarr;": "\u2978", - "gtrdot;": "\u22d7", - "gtreqless;": "\u22db", - "gtreqqless;": "\u2a8c", - "gtrless;": "\u2277", - "gtrsim;": "\u2273", - "gvertneqq;": "\u2269\ufe00", - "gvnE;": "\u2269\ufe00", - "hArr;": "\u21d4", - "hairsp;": "\u200a", - "half;": "\xbd", - "hamilt;": "\u210b", - "hardcy;": "\u044a", - "harr;": "\u2194", - "harrcir;": "\u2948", - "harrw;": "\u21ad", - "hbar;": "\u210f", - "hcirc;": "\u0125", - "hearts;": "\u2665", - "heartsuit;": "\u2665", - "hellip;": "\u2026", - "hercon;": "\u22b9", - "hfr;": "\U0001d525", - "hksearow;": "\u2925", - "hkswarow;": "\u2926", - "hoarr;": "\u21ff", - "homtht;": "\u223b", - "hookleftarrow;": "\u21a9", - "hookrightarrow;": "\u21aa", - "hopf;": "\U0001d559", - "horbar;": "\u2015", - "hscr;": "\U0001d4bd", - "hslash;": "\u210f", - "hstrok;": "\u0127", - "hybull;": "\u2043", - "hyphen;": "\u2010", - "iacute": "\xed", - "iacute;": "\xed", - "ic;": "\u2063", - "icirc": "\xee", - "icirc;": "\xee", - "icy;": "\u0438", - "iecy;": "\u0435", - "iexcl": "\xa1", - "iexcl;": "\xa1", - "iff;": "\u21d4", - "ifr;": "\U0001d526", - "igrave": "\xec", - "igrave;": "\xec", - "ii;": "\u2148", - "iiiint;": "\u2a0c", - "iiint;": "\u222d", - "iinfin;": "\u29dc", - "iiota;": "\u2129", - "ijlig;": "\u0133", - "imacr;": "\u012b", - "image;": "\u2111", - "imagline;": "\u2110", - "imagpart;": "\u2111", - "imath;": "\u0131", - "imof;": "\u22b7", - "imped;": "\u01b5", - "in;": "\u2208", - "incare;": "\u2105", - "infin;": "\u221e", - "infintie;": "\u29dd", - "inodot;": "\u0131", - "int;": "\u222b", - "intcal;": "\u22ba", - "integers;": "\u2124", - "intercal;": "\u22ba", - "intlarhk;": "\u2a17", - "intprod;": "\u2a3c", - "iocy;": "\u0451", - "iogon;": "\u012f", - "iopf;": "\U0001d55a", - "iota;": "\u03b9", - "iprod;": "\u2a3c", - "iquest": "\xbf", - "iquest;": "\xbf", - "iscr;": "\U0001d4be", - "isin;": "\u2208", - "isinE;": "\u22f9", - "isindot;": "\u22f5", - "isins;": "\u22f4", - "isinsv;": "\u22f3", - "isinv;": "\u2208", - "it;": "\u2062", - "itilde;": "\u0129", - "iukcy;": "\u0456", - "iuml": "\xef", - "iuml;": "\xef", - "jcirc;": "\u0135", - "jcy;": "\u0439", - "jfr;": "\U0001d527", - "jmath;": "\u0237", - "jopf;": "\U0001d55b", - "jscr;": "\U0001d4bf", - "jsercy;": "\u0458", - "jukcy;": "\u0454", - "kappa;": "\u03ba", - "kappav;": "\u03f0", - "kcedil;": "\u0137", - "kcy;": "\u043a", - "kfr;": "\U0001d528", - "kgreen;": "\u0138", - "khcy;": "\u0445", - "kjcy;": "\u045c", - "kopf;": "\U0001d55c", - "kscr;": "\U0001d4c0", - "lAarr;": "\u21da", - "lArr;": "\u21d0", - "lAtail;": "\u291b", - "lBarr;": "\u290e", - "lE;": "\u2266", - "lEg;": "\u2a8b", - "lHar;": "\u2962", - "lacute;": "\u013a", - "laemptyv;": "\u29b4", - "lagran;": "\u2112", - "lambda;": "\u03bb", - "lang;": "\u27e8", - "langd;": "\u2991", - "langle;": "\u27e8", - "lap;": "\u2a85", - "laquo": "\xab", - "laquo;": "\xab", - "larr;": "\u2190", - "larrb;": "\u21e4", - "larrbfs;": "\u291f", - "larrfs;": "\u291d", - "larrhk;": "\u21a9", - "larrlp;": "\u21ab", - "larrpl;": "\u2939", - "larrsim;": "\u2973", - "larrtl;": "\u21a2", - "lat;": "\u2aab", - "latail;": "\u2919", - "late;": "\u2aad", - "lates;": "\u2aad\ufe00", - "lbarr;": "\u290c", - "lbbrk;": "\u2772", - "lbrace;": "{", - "lbrack;": "[", - "lbrke;": "\u298b", - "lbrksld;": "\u298f", - "lbrkslu;": "\u298d", - "lcaron;": "\u013e", - "lcedil;": "\u013c", - "lceil;": "\u2308", - "lcub;": "{", - "lcy;": "\u043b", - "ldca;": "\u2936", - "ldquo;": "\u201c", - "ldquor;": "\u201e", - "ldrdhar;": "\u2967", - "ldrushar;": "\u294b", - "ldsh;": "\u21b2", - "le;": "\u2264", - "leftarrow;": "\u2190", - "leftarrowtail;": "\u21a2", - "leftharpoondown;": "\u21bd", - "leftharpoonup;": "\u21bc", - "leftleftarrows;": "\u21c7", - "leftrightarrow;": "\u2194", - "leftrightarrows;": "\u21c6", - "leftrightharpoons;": "\u21cb", - "leftrightsquigarrow;": "\u21ad", - "leftthreetimes;": "\u22cb", - "leg;": "\u22da", - "leq;": "\u2264", - "leqq;": "\u2266", - "leqslant;": "\u2a7d", - "les;": "\u2a7d", - "lescc;": "\u2aa8", - "lesdot;": "\u2a7f", - "lesdoto;": "\u2a81", - "lesdotor;": "\u2a83", - "lesg;": "\u22da\ufe00", - "lesges;": "\u2a93", - "lessapprox;": "\u2a85", - "lessdot;": "\u22d6", - "lesseqgtr;": "\u22da", - "lesseqqgtr;": "\u2a8b", - "lessgtr;": "\u2276", - "lesssim;": "\u2272", - "lfisht;": "\u297c", - "lfloor;": "\u230a", - "lfr;": "\U0001d529", - "lg;": "\u2276", - "lgE;": "\u2a91", - "lhard;": "\u21bd", - "lharu;": "\u21bc", - "lharul;": "\u296a", - "lhblk;": "\u2584", - "ljcy;": "\u0459", - "ll;": "\u226a", - "llarr;": "\u21c7", - "llcorner;": "\u231e", - "llhard;": "\u296b", - "lltri;": "\u25fa", - "lmidot;": "\u0140", - "lmoust;": "\u23b0", - "lmoustache;": "\u23b0", - "lnE;": "\u2268", - "lnap;": "\u2a89", - "lnapprox;": "\u2a89", - "lne;": "\u2a87", - "lneq;": "\u2a87", - "lneqq;": "\u2268", - "lnsim;": "\u22e6", - "loang;": "\u27ec", - "loarr;": "\u21fd", - "lobrk;": "\u27e6", - "longleftarrow;": "\u27f5", - "longleftrightarrow;": "\u27f7", - "longmapsto;": "\u27fc", - "longrightarrow;": "\u27f6", - "looparrowleft;": "\u21ab", - "looparrowright;": "\u21ac", - "lopar;": "\u2985", - "lopf;": "\U0001d55d", - "loplus;": "\u2a2d", - "lotimes;": "\u2a34", - "lowast;": "\u2217", - "lowbar;": "_", - "loz;": "\u25ca", - "lozenge;": "\u25ca", - "lozf;": "\u29eb", - "lpar;": "(", - "lparlt;": "\u2993", - "lrarr;": "\u21c6", - "lrcorner;": "\u231f", - "lrhar;": "\u21cb", - "lrhard;": "\u296d", - "lrm;": "\u200e", - "lrtri;": "\u22bf", - "lsaquo;": "\u2039", - "lscr;": "\U0001d4c1", - "lsh;": "\u21b0", - "lsim;": "\u2272", - "lsime;": "\u2a8d", - "lsimg;": "\u2a8f", - "lsqb;": "[", - "lsquo;": "\u2018", - "lsquor;": "\u201a", - "lstrok;": "\u0142", - "lt": "<", - "lt;": "<", - "ltcc;": "\u2aa6", - "ltcir;": "\u2a79", - "ltdot;": "\u22d6", - "lthree;": "\u22cb", - "ltimes;": "\u22c9", - "ltlarr;": "\u2976", - "ltquest;": "\u2a7b", - "ltrPar;": "\u2996", - "ltri;": "\u25c3", - "ltrie;": "\u22b4", - "ltrif;": "\u25c2", - "lurdshar;": "\u294a", - "luruhar;": "\u2966", - "lvertneqq;": "\u2268\ufe00", - "lvnE;": "\u2268\ufe00", - "mDDot;": "\u223a", - "macr": "\xaf", - "macr;": "\xaf", - "male;": "\u2642", - "malt;": "\u2720", - "maltese;": "\u2720", - "map;": "\u21a6", - "mapsto;": "\u21a6", - "mapstodown;": "\u21a7", - "mapstoleft;": "\u21a4", - "mapstoup;": "\u21a5", - "marker;": "\u25ae", - "mcomma;": "\u2a29", - "mcy;": "\u043c", - "mdash;": "\u2014", - "measuredangle;": "\u2221", - "mfr;": "\U0001d52a", - "mho;": "\u2127", - "micro": "\xb5", - "micro;": "\xb5", - "mid;": "\u2223", - "midast;": "*", - "midcir;": "\u2af0", - "middot": "\xb7", - "middot;": "\xb7", - "minus;": "\u2212", - "minusb;": "\u229f", - "minusd;": "\u2238", - "minusdu;": "\u2a2a", - "mlcp;": "\u2adb", - "mldr;": "\u2026", - "mnplus;": "\u2213", - "models;": "\u22a7", - "mopf;": "\U0001d55e", - "mp;": "\u2213", - "mscr;": "\U0001d4c2", - "mstpos;": "\u223e", - "mu;": "\u03bc", - "multimap;": "\u22b8", - "mumap;": "\u22b8", - "nGg;": "\u22d9\u0338", - "nGt;": "\u226b\u20d2", - "nGtv;": "\u226b\u0338", - "nLeftarrow;": "\u21cd", - "nLeftrightarrow;": "\u21ce", - "nLl;": "\u22d8\u0338", - "nLt;": "\u226a\u20d2", - "nLtv;": "\u226a\u0338", - "nRightarrow;": "\u21cf", - "nVDash;": "\u22af", - "nVdash;": "\u22ae", - "nabla;": "\u2207", - "nacute;": "\u0144", - "nang;": "\u2220\u20d2", - "nap;": "\u2249", - "napE;": "\u2a70\u0338", - "napid;": "\u224b\u0338", - "napos;": "\u0149", - "napprox;": "\u2249", - "natur;": "\u266e", - "natural;": "\u266e", - "naturals;": "\u2115", - "nbsp": "\xa0", - "nbsp;": "\xa0", - "nbump;": "\u224e\u0338", - "nbumpe;": "\u224f\u0338", - "ncap;": "\u2a43", - "ncaron;": "\u0148", - "ncedil;": "\u0146", - "ncong;": "\u2247", - "ncongdot;": "\u2a6d\u0338", - "ncup;": "\u2a42", - "ncy;": "\u043d", - "ndash;": "\u2013", - "ne;": "\u2260", - "neArr;": "\u21d7", - "nearhk;": "\u2924", - "nearr;": "\u2197", - "nearrow;": "\u2197", - "nedot;": "\u2250\u0338", - "nequiv;": "\u2262", - "nesear;": "\u2928", - "nesim;": "\u2242\u0338", - "nexist;": "\u2204", - "nexists;": "\u2204", - "nfr;": "\U0001d52b", - "ngE;": "\u2267\u0338", - "nge;": "\u2271", - "ngeq;": "\u2271", - "ngeqq;": "\u2267\u0338", - "ngeqslant;": "\u2a7e\u0338", - "nges;": "\u2a7e\u0338", - "ngsim;": "\u2275", - "ngt;": "\u226f", - "ngtr;": "\u226f", - "nhArr;": "\u21ce", - "nharr;": "\u21ae", - "nhpar;": "\u2af2", - "ni;": "\u220b", - "nis;": "\u22fc", - "nisd;": "\u22fa", - "niv;": "\u220b", - "njcy;": "\u045a", - "nlArr;": "\u21cd", - "nlE;": "\u2266\u0338", - "nlarr;": "\u219a", - "nldr;": "\u2025", - "nle;": "\u2270", - "nleftarrow;": "\u219a", - "nleftrightarrow;": "\u21ae", - "nleq;": "\u2270", - "nleqq;": "\u2266\u0338", - "nleqslant;": "\u2a7d\u0338", - "nles;": "\u2a7d\u0338", - "nless;": "\u226e", - "nlsim;": "\u2274", - "nlt;": "\u226e", - "nltri;": "\u22ea", - "nltrie;": "\u22ec", - "nmid;": "\u2224", - "nopf;": "\U0001d55f", - "not": "\xac", - "not;": "\xac", - "notin;": "\u2209", - "notinE;": "\u22f9\u0338", - "notindot;": "\u22f5\u0338", - "notinva;": "\u2209", - "notinvb;": "\u22f7", - "notinvc;": "\u22f6", - "notni;": "\u220c", - "notniva;": "\u220c", - "notnivb;": "\u22fe", - "notnivc;": "\u22fd", - "npar;": "\u2226", - "nparallel;": "\u2226", - "nparsl;": "\u2afd\u20e5", - "npart;": "\u2202\u0338", - "npolint;": "\u2a14", - "npr;": "\u2280", - "nprcue;": "\u22e0", - "npre;": "\u2aaf\u0338", - "nprec;": "\u2280", - "npreceq;": "\u2aaf\u0338", - "nrArr;": "\u21cf", - "nrarr;": "\u219b", - "nrarrc;": "\u2933\u0338", - "nrarrw;": "\u219d\u0338", - "nrightarrow;": "\u219b", - "nrtri;": "\u22eb", - "nrtrie;": "\u22ed", - "nsc;": "\u2281", - "nsccue;": "\u22e1", - "nsce;": "\u2ab0\u0338", - "nscr;": "\U0001d4c3", - "nshortmid;": "\u2224", - "nshortparallel;": "\u2226", - "nsim;": "\u2241", - "nsime;": "\u2244", - "nsimeq;": "\u2244", - "nsmid;": "\u2224", - "nspar;": "\u2226", - "nsqsube;": "\u22e2", - "nsqsupe;": "\u22e3", - "nsub;": "\u2284", - "nsubE;": "\u2ac5\u0338", - "nsube;": "\u2288", - "nsubset;": "\u2282\u20d2", - "nsubseteq;": "\u2288", - "nsubseteqq;": "\u2ac5\u0338", - "nsucc;": "\u2281", - "nsucceq;": "\u2ab0\u0338", - "nsup;": "\u2285", - "nsupE;": "\u2ac6\u0338", - "nsupe;": "\u2289", - "nsupset;": "\u2283\u20d2", - "nsupseteq;": "\u2289", - "nsupseteqq;": "\u2ac6\u0338", - "ntgl;": "\u2279", - "ntilde": "\xf1", - "ntilde;": "\xf1", - "ntlg;": "\u2278", - "ntriangleleft;": "\u22ea", - "ntrianglelefteq;": "\u22ec", - "ntriangleright;": "\u22eb", - "ntrianglerighteq;": "\u22ed", - "nu;": "\u03bd", - "num;": "#", - "numero;": "\u2116", - "numsp;": "\u2007", - "nvDash;": "\u22ad", - "nvHarr;": "\u2904", - "nvap;": "\u224d\u20d2", - "nvdash;": "\u22ac", - "nvge;": "\u2265\u20d2", - "nvgt;": ">\u20d2", - "nvinfin;": "\u29de", - "nvlArr;": "\u2902", - "nvle;": "\u2264\u20d2", - "nvlt;": "<\u20d2", - "nvltrie;": "\u22b4\u20d2", - "nvrArr;": "\u2903", - "nvrtrie;": "\u22b5\u20d2", - "nvsim;": "\u223c\u20d2", - "nwArr;": "\u21d6", - "nwarhk;": "\u2923", - "nwarr;": "\u2196", - "nwarrow;": "\u2196", - "nwnear;": "\u2927", - "oS;": "\u24c8", - "oacute": "\xf3", - "oacute;": "\xf3", - "oast;": "\u229b", - "ocir;": "\u229a", - "ocirc": "\xf4", - "ocirc;": "\xf4", - "ocy;": "\u043e", - "odash;": "\u229d", - "odblac;": "\u0151", - "odiv;": "\u2a38", - "odot;": "\u2299", - "odsold;": "\u29bc", - "oelig;": "\u0153", - "ofcir;": "\u29bf", - "ofr;": "\U0001d52c", - "ogon;": "\u02db", - "ograve": "\xf2", - "ograve;": "\xf2", - "ogt;": "\u29c1", - "ohbar;": "\u29b5", - "ohm;": "\u03a9", - "oint;": "\u222e", - "olarr;": "\u21ba", - "olcir;": "\u29be", - "olcross;": "\u29bb", - "oline;": "\u203e", - "olt;": "\u29c0", - "omacr;": "\u014d", - "omega;": "\u03c9", - "omicron;": "\u03bf", - "omid;": "\u29b6", - "ominus;": "\u2296", - "oopf;": "\U0001d560", - "opar;": "\u29b7", - "operp;": "\u29b9", - "oplus;": "\u2295", - "or;": "\u2228", - "orarr;": "\u21bb", - "ord;": "\u2a5d", - "order;": "\u2134", - "orderof;": "\u2134", - "ordf": "\xaa", - "ordf;": "\xaa", - "ordm": "\xba", - "ordm;": "\xba", - "origof;": "\u22b6", - "oror;": "\u2a56", - "orslope;": "\u2a57", - "orv;": "\u2a5b", - "oscr;": "\u2134", - "oslash": "\xf8", - "oslash;": "\xf8", - "osol;": "\u2298", - "otilde": "\xf5", - "otilde;": "\xf5", - "otimes;": "\u2297", - "otimesas;": "\u2a36", - "ouml": "\xf6", - "ouml;": "\xf6", - "ovbar;": "\u233d", - "par;": "\u2225", - "para": "\xb6", - "para;": "\xb6", - "parallel;": "\u2225", - "parsim;": "\u2af3", - "parsl;": "\u2afd", - "part;": "\u2202", - "pcy;": "\u043f", - "percnt;": "%", - "period;": ".", - "permil;": "\u2030", - "perp;": "\u22a5", - "pertenk;": "\u2031", - "pfr;": "\U0001d52d", - "phi;": "\u03c6", - "phiv;": "\u03d5", - "phmmat;": "\u2133", - "phone;": "\u260e", - "pi;": "\u03c0", - "pitchfork;": "\u22d4", - "piv;": "\u03d6", - "planck;": "\u210f", - "planckh;": "\u210e", - "plankv;": "\u210f", - "plus;": "+", - "plusacir;": "\u2a23", - "plusb;": "\u229e", - "pluscir;": "\u2a22", - "plusdo;": "\u2214", - "plusdu;": "\u2a25", - "pluse;": "\u2a72", - "plusmn": "\xb1", - "plusmn;": "\xb1", - "plussim;": "\u2a26", - "plustwo;": "\u2a27", - "pm;": "\xb1", - "pointint;": "\u2a15", - "popf;": "\U0001d561", - "pound": "\xa3", - "pound;": "\xa3", - "pr;": "\u227a", - "prE;": "\u2ab3", - "prap;": "\u2ab7", - "prcue;": "\u227c", - "pre;": "\u2aaf", - "prec;": "\u227a", - "precapprox;": "\u2ab7", - "preccurlyeq;": "\u227c", - "preceq;": "\u2aaf", - "precnapprox;": "\u2ab9", - "precneqq;": "\u2ab5", - "precnsim;": "\u22e8", - "precsim;": "\u227e", - "prime;": "\u2032", - "primes;": "\u2119", - "prnE;": "\u2ab5", - "prnap;": "\u2ab9", - "prnsim;": "\u22e8", - "prod;": "\u220f", - "profalar;": "\u232e", - "profline;": "\u2312", - "profsurf;": "\u2313", - "prop;": "\u221d", - "propto;": "\u221d", - "prsim;": "\u227e", - "prurel;": "\u22b0", - "pscr;": "\U0001d4c5", - "psi;": "\u03c8", - "puncsp;": "\u2008", - "qfr;": "\U0001d52e", - "qint;": "\u2a0c", - "qopf;": "\U0001d562", - "qprime;": "\u2057", - "qscr;": "\U0001d4c6", - "quaternions;": "\u210d", - "quatint;": "\u2a16", - "quest;": "?", - "questeq;": "\u225f", - "quot": "\"", - "quot;": "\"", - "rAarr;": "\u21db", - "rArr;": "\u21d2", - "rAtail;": "\u291c", - "rBarr;": "\u290f", - "rHar;": "\u2964", - "race;": "\u223d\u0331", - "racute;": "\u0155", - "radic;": "\u221a", - "raemptyv;": "\u29b3", - "rang;": "\u27e9", - "rangd;": "\u2992", - "range;": "\u29a5", - "rangle;": "\u27e9", - "raquo": "\xbb", - "raquo;": "\xbb", - "rarr;": "\u2192", - "rarrap;": "\u2975", - "rarrb;": "\u21e5", - "rarrbfs;": "\u2920", - "rarrc;": "\u2933", - "rarrfs;": "\u291e", - "rarrhk;": "\u21aa", - "rarrlp;": "\u21ac", - "rarrpl;": "\u2945", - "rarrsim;": "\u2974", - "rarrtl;": "\u21a3", - "rarrw;": "\u219d", - "ratail;": "\u291a", - "ratio;": "\u2236", - "rationals;": "\u211a", - "rbarr;": "\u290d", - "rbbrk;": "\u2773", - "rbrace;": "}", - "rbrack;": "]", - "rbrke;": "\u298c", - "rbrksld;": "\u298e", - "rbrkslu;": "\u2990", - "rcaron;": "\u0159", - "rcedil;": "\u0157", - "rceil;": "\u2309", - "rcub;": "}", - "rcy;": "\u0440", - "rdca;": "\u2937", - "rdldhar;": "\u2969", - "rdquo;": "\u201d", - "rdquor;": "\u201d", - "rdsh;": "\u21b3", - "real;": "\u211c", - "realine;": "\u211b", - "realpart;": "\u211c", - "reals;": "\u211d", - "rect;": "\u25ad", - "reg": "\xae", - "reg;": "\xae", - "rfisht;": "\u297d", - "rfloor;": "\u230b", - "rfr;": "\U0001d52f", - "rhard;": "\u21c1", - "rharu;": "\u21c0", - "rharul;": "\u296c", - "rho;": "\u03c1", - "rhov;": "\u03f1", - "rightarrow;": "\u2192", - "rightarrowtail;": "\u21a3", - "rightharpoondown;": "\u21c1", - "rightharpoonup;": "\u21c0", - "rightleftarrows;": "\u21c4", - "rightleftharpoons;": "\u21cc", - "rightrightarrows;": "\u21c9", - "rightsquigarrow;": "\u219d", - "rightthreetimes;": "\u22cc", - "ring;": "\u02da", - "risingdotseq;": "\u2253", - "rlarr;": "\u21c4", - "rlhar;": "\u21cc", - "rlm;": "\u200f", - "rmoust;": "\u23b1", - "rmoustache;": "\u23b1", - "rnmid;": "\u2aee", - "roang;": "\u27ed", - "roarr;": "\u21fe", - "robrk;": "\u27e7", - "ropar;": "\u2986", - "ropf;": "\U0001d563", - "roplus;": "\u2a2e", - "rotimes;": "\u2a35", - "rpar;": ")", - "rpargt;": "\u2994", - "rppolint;": "\u2a12", - "rrarr;": "\u21c9", - "rsaquo;": "\u203a", - "rscr;": "\U0001d4c7", - "rsh;": "\u21b1", - "rsqb;": "]", - "rsquo;": "\u2019", - "rsquor;": "\u2019", - "rthree;": "\u22cc", - "rtimes;": "\u22ca", - "rtri;": "\u25b9", - "rtrie;": "\u22b5", - "rtrif;": "\u25b8", - "rtriltri;": "\u29ce", - "ruluhar;": "\u2968", - "rx;": "\u211e", - "sacute;": "\u015b", - "sbquo;": "\u201a", - "sc;": "\u227b", - "scE;": "\u2ab4", - "scap;": "\u2ab8", - "scaron;": "\u0161", - "sccue;": "\u227d", - "sce;": "\u2ab0", - "scedil;": "\u015f", - "scirc;": "\u015d", - "scnE;": "\u2ab6", - "scnap;": "\u2aba", - "scnsim;": "\u22e9", - "scpolint;": "\u2a13", - "scsim;": "\u227f", - "scy;": "\u0441", - "sdot;": "\u22c5", - "sdotb;": "\u22a1", - "sdote;": "\u2a66", - "seArr;": "\u21d8", - "searhk;": "\u2925", - "searr;": "\u2198", - "searrow;": "\u2198", - "sect": "\xa7", - "sect;": "\xa7", - "semi;": ";", - "seswar;": "\u2929", - "setminus;": "\u2216", - "setmn;": "\u2216", - "sext;": "\u2736", - "sfr;": "\U0001d530", - "sfrown;": "\u2322", - "sharp;": "\u266f", - "shchcy;": "\u0449", - "shcy;": "\u0448", - "shortmid;": "\u2223", - "shortparallel;": "\u2225", - "shy": "\xad", - "shy;": "\xad", - "sigma;": "\u03c3", - "sigmaf;": "\u03c2", - "sigmav;": "\u03c2", - "sim;": "\u223c", - "simdot;": "\u2a6a", - "sime;": "\u2243", - "simeq;": "\u2243", - "simg;": "\u2a9e", - "simgE;": "\u2aa0", - "siml;": "\u2a9d", - "simlE;": "\u2a9f", - "simne;": "\u2246", - "simplus;": "\u2a24", - "simrarr;": "\u2972", - "slarr;": "\u2190", - "smallsetminus;": "\u2216", - "smashp;": "\u2a33", - "smeparsl;": "\u29e4", - "smid;": "\u2223", - "smile;": "\u2323", - "smt;": "\u2aaa", - "smte;": "\u2aac", - "smtes;": "\u2aac\ufe00", - "softcy;": "\u044c", - "sol;": "/", - "solb;": "\u29c4", - "solbar;": "\u233f", - "sopf;": "\U0001d564", - "spades;": "\u2660", - "spadesuit;": "\u2660", - "spar;": "\u2225", - "sqcap;": "\u2293", - "sqcaps;": "\u2293\ufe00", - "sqcup;": "\u2294", - "sqcups;": "\u2294\ufe00", - "sqsub;": "\u228f", - "sqsube;": "\u2291", - "sqsubset;": "\u228f", - "sqsubseteq;": "\u2291", - "sqsup;": "\u2290", - "sqsupe;": "\u2292", - "sqsupset;": "\u2290", - "sqsupseteq;": "\u2292", - "squ;": "\u25a1", - "square;": "\u25a1", - "squarf;": "\u25aa", - "squf;": "\u25aa", - "srarr;": "\u2192", - "sscr;": "\U0001d4c8", - "ssetmn;": "\u2216", - "ssmile;": "\u2323", - "sstarf;": "\u22c6", - "star;": "\u2606", - "starf;": "\u2605", - "straightepsilon;": "\u03f5", - "straightphi;": "\u03d5", - "strns;": "\xaf", - "sub;": "\u2282", - "subE;": "\u2ac5", - "subdot;": "\u2abd", - "sube;": "\u2286", - "subedot;": "\u2ac3", - "submult;": "\u2ac1", - "subnE;": "\u2acb", - "subne;": "\u228a", - "subplus;": "\u2abf", - "subrarr;": "\u2979", - "subset;": "\u2282", - "subseteq;": "\u2286", - "subseteqq;": "\u2ac5", - "subsetneq;": "\u228a", - "subsetneqq;": "\u2acb", - "subsim;": "\u2ac7", - "subsub;": "\u2ad5", - "subsup;": "\u2ad3", - "succ;": "\u227b", - "succapprox;": "\u2ab8", - "succcurlyeq;": "\u227d", - "succeq;": "\u2ab0", - "succnapprox;": "\u2aba", - "succneqq;": "\u2ab6", - "succnsim;": "\u22e9", - "succsim;": "\u227f", - "sum;": "\u2211", - "sung;": "\u266a", - "sup1": "\xb9", - "sup1;": "\xb9", - "sup2": "\xb2", - "sup2;": "\xb2", - "sup3": "\xb3", - "sup3;": "\xb3", - "sup;": "\u2283", - "supE;": "\u2ac6", - "supdot;": "\u2abe", - "supdsub;": "\u2ad8", - "supe;": "\u2287", - "supedot;": "\u2ac4", - "suphsol;": "\u27c9", - "suphsub;": "\u2ad7", - "suplarr;": "\u297b", - "supmult;": "\u2ac2", - "supnE;": "\u2acc", - "supne;": "\u228b", - "supplus;": "\u2ac0", - "supset;": "\u2283", - "supseteq;": "\u2287", - "supseteqq;": "\u2ac6", - "supsetneq;": "\u228b", - "supsetneqq;": "\u2acc", - "supsim;": "\u2ac8", - "supsub;": "\u2ad4", - "supsup;": "\u2ad6", - "swArr;": "\u21d9", - "swarhk;": "\u2926", - "swarr;": "\u2199", - "swarrow;": "\u2199", - "swnwar;": "\u292a", - "szlig": "\xdf", - "szlig;": "\xdf", - "target;": "\u2316", - "tau;": "\u03c4", - "tbrk;": "\u23b4", - "tcaron;": "\u0165", - "tcedil;": "\u0163", - "tcy;": "\u0442", - "tdot;": "\u20db", - "telrec;": "\u2315", - "tfr;": "\U0001d531", - "there4;": "\u2234", - "therefore;": "\u2234", - "theta;": "\u03b8", - "thetasym;": "\u03d1", - "thetav;": "\u03d1", - "thickapprox;": "\u2248", - "thicksim;": "\u223c", - "thinsp;": "\u2009", - "thkap;": "\u2248", - "thksim;": "\u223c", - "thorn": "\xfe", - "thorn;": "\xfe", - "tilde;": "\u02dc", - "times": "\xd7", - "times;": "\xd7", - "timesb;": "\u22a0", - "timesbar;": "\u2a31", - "timesd;": "\u2a30", - "tint;": "\u222d", - "toea;": "\u2928", - "top;": "\u22a4", - "topbot;": "\u2336", - "topcir;": "\u2af1", - "topf;": "\U0001d565", - "topfork;": "\u2ada", - "tosa;": "\u2929", - "tprime;": "\u2034", - "trade;": "\u2122", - "triangle;": "\u25b5", - "triangledown;": "\u25bf", - "triangleleft;": "\u25c3", - "trianglelefteq;": "\u22b4", - "triangleq;": "\u225c", - "triangleright;": "\u25b9", - "trianglerighteq;": "\u22b5", - "tridot;": "\u25ec", - "trie;": "\u225c", - "triminus;": "\u2a3a", - "triplus;": "\u2a39", - "trisb;": "\u29cd", - "tritime;": "\u2a3b", - "trpezium;": "\u23e2", - "tscr;": "\U0001d4c9", - "tscy;": "\u0446", - "tshcy;": "\u045b", - "tstrok;": "\u0167", - "twixt;": "\u226c", - "twoheadleftarrow;": "\u219e", - "twoheadrightarrow;": "\u21a0", - "uArr;": "\u21d1", - "uHar;": "\u2963", - "uacute": "\xfa", - "uacute;": "\xfa", - "uarr;": "\u2191", - "ubrcy;": "\u045e", - "ubreve;": "\u016d", - "ucirc": "\xfb", - "ucirc;": "\xfb", - "ucy;": "\u0443", - "udarr;": "\u21c5", - "udblac;": "\u0171", - "udhar;": "\u296e", - "ufisht;": "\u297e", - "ufr;": "\U0001d532", - "ugrave": "\xf9", - "ugrave;": "\xf9", - "uharl;": "\u21bf", - "uharr;": "\u21be", - "uhblk;": "\u2580", - "ulcorn;": "\u231c", - "ulcorner;": "\u231c", - "ulcrop;": "\u230f", - "ultri;": "\u25f8", - "umacr;": "\u016b", - "uml": "\xa8", - "uml;": "\xa8", - "uogon;": "\u0173", - "uopf;": "\U0001d566", - "uparrow;": "\u2191", - "updownarrow;": "\u2195", - "upharpoonleft;": "\u21bf", - "upharpoonright;": "\u21be", - "uplus;": "\u228e", - "upsi;": "\u03c5", - "upsih;": "\u03d2", - "upsilon;": "\u03c5", - "upuparrows;": "\u21c8", - "urcorn;": "\u231d", - "urcorner;": "\u231d", - "urcrop;": "\u230e", - "uring;": "\u016f", - "urtri;": "\u25f9", - "uscr;": "\U0001d4ca", - "utdot;": "\u22f0", - "utilde;": "\u0169", - "utri;": "\u25b5", - "utrif;": "\u25b4", - "uuarr;": "\u21c8", - "uuml": "\xfc", - "uuml;": "\xfc", - "uwangle;": "\u29a7", - "vArr;": "\u21d5", - "vBar;": "\u2ae8", - "vBarv;": "\u2ae9", - "vDash;": "\u22a8", - "vangrt;": "\u299c", - "varepsilon;": "\u03f5", - "varkappa;": "\u03f0", - "varnothing;": "\u2205", - "varphi;": "\u03d5", - "varpi;": "\u03d6", - "varpropto;": "\u221d", - "varr;": "\u2195", - "varrho;": "\u03f1", - "varsigma;": "\u03c2", - "varsubsetneq;": "\u228a\ufe00", - "varsubsetneqq;": "\u2acb\ufe00", - "varsupsetneq;": "\u228b\ufe00", - "varsupsetneqq;": "\u2acc\ufe00", - "vartheta;": "\u03d1", - "vartriangleleft;": "\u22b2", - "vartriangleright;": "\u22b3", - "vcy;": "\u0432", - "vdash;": "\u22a2", - "vee;": "\u2228", - "veebar;": "\u22bb", - "veeeq;": "\u225a", - "vellip;": "\u22ee", - "verbar;": "|", - "vert;": "|", - "vfr;": "\U0001d533", - "vltri;": "\u22b2", - "vnsub;": "\u2282\u20d2", - "vnsup;": "\u2283\u20d2", - "vopf;": "\U0001d567", - "vprop;": "\u221d", - "vrtri;": "\u22b3", - "vscr;": "\U0001d4cb", - "vsubnE;": "\u2acb\ufe00", - "vsubne;": "\u228a\ufe00", - "vsupnE;": "\u2acc\ufe00", - "vsupne;": "\u228b\ufe00", - "vzigzag;": "\u299a", - "wcirc;": "\u0175", - "wedbar;": "\u2a5f", - "wedge;": "\u2227", - "wedgeq;": "\u2259", - "weierp;": "\u2118", - "wfr;": "\U0001d534", - "wopf;": "\U0001d568", - "wp;": "\u2118", - "wr;": "\u2240", - "wreath;": "\u2240", - "wscr;": "\U0001d4cc", - "xcap;": "\u22c2", - "xcirc;": "\u25ef", - "xcup;": "\u22c3", - "xdtri;": "\u25bd", - "xfr;": "\U0001d535", - "xhArr;": "\u27fa", - "xharr;": "\u27f7", - "xi;": "\u03be", - "xlArr;": "\u27f8", - "xlarr;": "\u27f5", - "xmap;": "\u27fc", - "xnis;": "\u22fb", - "xodot;": "\u2a00", - "xopf;": "\U0001d569", - "xoplus;": "\u2a01", - "xotime;": "\u2a02", - "xrArr;": "\u27f9", - "xrarr;": "\u27f6", - "xscr;": "\U0001d4cd", - "xsqcup;": "\u2a06", - "xuplus;": "\u2a04", - "xutri;": "\u25b3", - "xvee;": "\u22c1", - "xwedge;": "\u22c0", - "yacute": "\xfd", - "yacute;": "\xfd", - "yacy;": "\u044f", - "ycirc;": "\u0177", - "ycy;": "\u044b", - "yen": "\xa5", - "yen;": "\xa5", - "yfr;": "\U0001d536", - "yicy;": "\u0457", - "yopf;": "\U0001d56a", - "yscr;": "\U0001d4ce", - "yucy;": "\u044e", - "yuml": "\xff", - "yuml;": "\xff", - "zacute;": "\u017a", - "zcaron;": "\u017e", - "zcy;": "\u0437", - "zdot;": "\u017c", - "zeetrf;": "\u2128", - "zeta;": "\u03b6", - "zfr;": "\U0001d537", - "zhcy;": "\u0436", - "zigrarr;": "\u21dd", - "zopf;": "\U0001d56b", - "zscr;": "\U0001d4cf", - "zwj;": "\u200d", - "zwnj;": "\u200c", -} - -replacementCharacters = { - 0x0: "\uFFFD", - 0x0d: "\u000D", - 0x80: "\u20AC", - 0x81: "\u0081", - 0x82: "\u201A", - 0x83: "\u0192", - 0x84: "\u201E", - 0x85: "\u2026", - 0x86: "\u2020", - 0x87: "\u2021", - 0x88: "\u02C6", - 0x89: "\u2030", - 0x8A: "\u0160", - 0x8B: "\u2039", - 0x8C: "\u0152", - 0x8D: "\u008D", - 0x8E: "\u017D", - 0x8F: "\u008F", - 0x90: "\u0090", - 0x91: "\u2018", - 0x92: "\u2019", - 0x93: "\u201C", - 0x94: "\u201D", - 0x95: "\u2022", - 0x96: "\u2013", - 0x97: "\u2014", - 0x98: "\u02DC", - 0x99: "\u2122", - 0x9A: "\u0161", - 0x9B: "\u203A", - 0x9C: "\u0153", - 0x9D: "\u009D", - 0x9E: "\u017E", - 0x9F: "\u0178", -} - -tokenTypes = { - "Doctype": 0, - "Characters": 1, - "SpaceCharacters": 2, - "StartTag": 3, - "EndTag": 4, - "EmptyTag": 5, - "Comment": 6, - "ParseError": 7 -} - -tagTokenTypes = frozenset([tokenTypes["StartTag"], tokenTypes["EndTag"], - tokenTypes["EmptyTag"]]) - - -prefixes = dict([(v, k) for k, v in namespaces.items()]) -prefixes["http://www.w3.org/1998/Math/MathML"] = "math" - - -class DataLossWarning(UserWarning): - """Raised when the current tree is unable to represent the input data""" - pass - - -class _ReparseException(Exception): - pass diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__init__.py b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 77eaa416a131a5b399a8f9d0156ed305e9ff6400..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 157 zcmZ?b<>g`kg1p5Nu^{>}h=2h`Aj1KOi&=m~3PUi1CZpd<h9ZzKg81d8Uy@s(Uyxa# zo0(T!l9-dDn^IVrS7Dfz0TKk`__EZzl>8$7jFQ|O)11sC{j|)SlGLJN{rLFIyv&mL Yc)fzkTO2mI`6;D2sdgaqKLarX0F@0VMF0Q* diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-37.pyc deleted file mode 100644 index d2b12752c89cd9622ab63b1a57259c8f185f6bf7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1273 zcmZux&2JPp6u0MNcXqQ0Q7IBgJ@`<Gu2iz>p_eK`P`)G%TL}=6Mx_()*poH!e8l!H z*=TcuD`&1CPW(&0_Qao1PJPeGLJzg(JwHF&zxV0+eS3RIU^E}EzjzlD@;5FvBLU$K zkbMkH5J5GmX-?}XkLoy&DG`x~byBB!3NjIi?$!Og4{|DcZ%Cd!BBC#{H$-GIeK~j? z=L0c#O2)&_fJer$zrts>)e9#JRd=m%J`-xGtZEy-yJ%F|3R!67q~Y3rrg(??WX7$8 zdFu}&q><vjDqV?tIB<q2$UPwY1F$uCeIrn}BcjVye1lXG_>r9b^F+FZX&8sE>rC4j z#hqlwa>c6F1hsQU&A`Q=u;8R>j)p@9<L+k5vN>N$##zH_X**s@=H}e75@2VNN#*9! zu*1V?+sMO1hQQ1MY;&~74rIWBqc`C~TX)>xZJ<{zTrT;-hV|+u=!L2(h`DjhtvYFc zX0~OoBwTBj(zpQh)rxD;eOY&Ib!m)M%2>B|;k?0Ad16wSK83t;2*(Uy8Q7O+6IXYW zPIb3bV;$G}mN;28r@vHlR0b-RvJtJB%w4U2)oM1Wl!jv23D@16&!kf&*9aRDX!p96 z9~8JQAi)_}vJo(nnGx_3#mzwd9Uyxhm?SwBB##8mW9&HStVASGzts0028(Au-rZO{ zla_rm8Hy>RZLiYnNcmNNCauV5fgM@{+!X{`f%elNZx-x~8FTqT`-<?&8<vJUac! zC7^}gd7pkDt|yYW5uDxqGdhpYlXbF=*6}_$`R#y!1n2h2nm&hyJlQ#bw}IYHeS&2h zM?QP%xN*<;k<T7rflx{WcO3dUhTM$%rU!1BZD2kt3VZ@ZVfwi2VGl~-Q&846qz)31 zSg9+Yy7pK$KE(uBpI|%sbjkHXek-imLgcH!t^wIyV1#~0N3=(G=q}6|J-c#|*1e78 zDOdnE5U(iwuqf(QEHuiaqBvP_eYw*w3elF}DZ>B9Waz437bC(=i~p94CN#u29S;$; zTEJrjRD<O=F)}=6uvJ1r{8rg&ElUS~2piH7;tv@AXU=E)7oOh6Znuc@eKd+jaklj@ DlbA}$ diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/base.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/base.cpython-37.pyc deleted file mode 100644 index 2d2263755f282051248218b6b3e47a07b63d6913..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 807 zcmZuvJ&)8d5VhkZ8}37k5Cs(#1u5<#3Oa;NhXma<bdk^~8+$pQoR71e6Nk3j`zKWV zCAU=k1uABo+tVImq?xhf=Xr0&IX^x=U}*i17hhg-#(vReXDKeu(A{ecl1Xk@$7|jt zb<&AiaQ2DGM2b5mg-W-g&Sd(TmDz7Zvr>d*vvPx(yaL^ggY}`1`bIlF^x^5$>voU| zjP}Yl#<g^3X9+IO(A_Hxiq%}QI+0u^cdQmt$P{xbGnr$~<N`U1kbl$$OSN>Dj57HL zbVn_2_=W*?foOhF@{qe>vaKqUkUC}7Hb=})W(!Pz&MV)I)u_i4-8<hHb0V*A`)_a7 zm-I0@+^Aj-wz~A4d295lT1S3Yts19J$J<Z<=w5q(j1)v!{QGiNdAd7mapch`Ka%U& zhF$S3pXH)R8dMZna=SouR62(zxQ%=W0iX{4!xzsUjYl9bj^_v$Gv9`9lO5yYtMZNa z_oPWA4QbzW>R;+ZfO{;!;U4?5hi)H^FUp*hQWb!30MHF`GPFJdxSkp_pICY^OS<fm z0`;^Ps9{TUr9afs%N4v3g^1sX0t>GvKUpknX{?rdwS*4&u)0#MkI=o6kzpR>yIIqF KdXqTF=i)EH<*+UQ diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-37.pyc deleted file mode 100644 index a952f1b7fd8859470fc326b0eabc5b840a799edf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1827 zcmZuyJ8v8}5GJ|LJDsG9^@yA_3j-;xkcAXU;mC#&Nj3}w7Y8=%U}1q;9eKJv?dwRM zA|3XMApQX=QUrku38~TrDOKkOq~5|!D*uHb2r}fJY(+2+oFzHm3}=Qjb6?KSHxZ2N zm$lvR=Mef!Z!U)oi~BI;=Rg=@I6)~6aY{mxTA_szBg{(d)CnDo9wKHl=OtnecZTi{ zR_HSK3F>%nKo)hZYBAcEc`{a<#%YlYRrxGFie;Q<RePMpy_|8H#EOe3k#De;!Iixq zN#4^6E(d|deV8%;!cmAB3JJrZrA>K>Lc2C1bn441_d%S1&dJ?J*^u{?4EFXmQ?8<* zH;9Df>h4Z=>+9`D-G}$~_5u|h1aYSFV8A05<o$r<y>ZGj)wAF>J@i*cWecWU1ESCn zpOF%k_?%!=!iri9gWqJLwgit9mq8TNMl_qjY}|>&K_K(7=<z#&8t~aVQ28Ox0;xbS zy@uu)L@3S<YW(F6Bm(f_9k$!Cg$s5G4@l)x8fUShwDK<{;3aIylYZsa_lpJqe?_7N zpTED^P-(GI#Kn4?Nfjl@Ivbs2$Dj5G`p`^z#50zQje$y&&ysk5qi+H%H)0cDs)I{s z!M$Ca2p{z7DRtP8zknx;bu?~Y+Sb#Lt%puTZF>)<d<~}zPjQKcka~yylpLU`b&8Mw zP<TkrtP-8$ZFGuvf1lc=&B#qObxMa>heSMvy?qm%+2@dqu>Xp=Q+$fEA@IFJa*F?l z@B#5JYfRna*C5vfIp-X0qupmO$O|&{rv9{1dSF3A{5UE{W$7Eeb0Br0ZL4KUuk`z5 z6S3BmJVqMD<^fTb4TE0LYv8$~@;NG9@ef<9<qq|_t@W(VG_l26OLol*u==6|+vNqb zm{Uu$4_;Z%5R{?Ee0D=?iSgUBCFZc@SH$qas?jau|B~_l0_3km$moXH!VT7$%T~^@ zmNK{f^gi9kYo$j2b`^b!M?XI|{<BqhHOyRd)1QFxO8XpRG`dyVTJPu<;1HC^huzRG z1gE;%DqEctyz-x@NT{dLL1kxA$}3y*LNCs0kiU}_>cp^ho;|2+7OAN6X8HDX(i|vN ztn<-0KAN<8d8VLv*R|#j=>n`in5-y%tV{-f@wN|qB0H8?fXowZO_qUxj97th<?dt* zF71#j0G+g9qsXN)rgeN%NY`o)IuF#IljPrVQ901uQdwC=UQ}*W6i`Q<rqD@WIZ$kh zhfPyF{d}CU%F}$P_sTI%!Q32vJcuOKE>hznojF8J>>4^^vWR-zxKKGqQ8MPHuxm08 zR|(y;mSD<nfgo(-Cbr2c_TksYK561MvGGT+vvCXG0BYl9IB&z+C2PQ2fRi@xfCK0? z(!#De@oO}kwaC>PH!<jTT-}Vcg%FS?rD@K_iC(uT9gU-8#_=eHo=d4|8^+cv_UjfU zj1#)K=}sXv(Wd%yrr~uvo>tx;t1;vi75d*o=$<Wf_o>jk=Xsyn%HOQbx~Cu4G^}OP Gvi<|r;L$|@ diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/lint.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/lint.cpython-37.pyc deleted file mode 100644 index 0809387abbe2f1b2da8c811b5aba7bcf4f74bddf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2591 zcmZuzOK%)S5bmDG?(Ex1oK0*X8jyHwMC@<?A%jpz;-E;#2OJV<lrSDo_uAu~$GW@M zv8`PR#gQU$+6xy>wm2an#1G(rIOZ3ixq>2vBS%hD_3YXXWUTJ4?y9c(s;alj*Bgy0 zfiM03;)9Qxg#3Y<>1P3P4Tju=i4jI)l2DH(hG!(EXHq;fVk@yd8)%bRaVaT#WuR?V zik+n5Rg$V#)%!B+YhDd#=djLeN7So*Mp%Va9}`yP<*mkn=`~nwm2~RQ!5Zn9c`I0# zSv*kOkCJ{SRPL~7Cz4T?<}-sd3Nyz2I8s~$vFy;iqWG@z)n1=Jr>KDD)_NfMa|1U< zUQL69%YG1Ynb&u+h%LuF;i<x_Eq#7tGY~-t`eaT*#4!CZ4*1E-Fmd8hMm&R2&t&B% zq)XBB#}&^)uOAc7enKqbmB14xFWrh_P`JPGc?6bRwaHzT^?2$^C3ujy-AuS#h)l?8 z)rIeN*Nv3hjZ!AvAl;kr-i5=r<Jc8JBsrYBYiplM$%TSYEaUC9wT0sTozT=s3Bh$b z<UDK?QFKTSj6-8ck0>QWV@Q0HQNU^Je|rPqC=N#50&$@ZAuR=B!<E@UgnUUmP|z>< z@gHfyw+E5neiEo~GfFpn6>P{Q_u(do00<X+PBR4x+=-w&6?9SXMA=Hm%56F5LxdXO zLGJi|lt#+;^Ybq?0dK~VJnrVD0;8CLTlg}3Ka2w@eg6mY&-F!>^cVY4|4Nif6~yrs zw!N3`zSrHvLp}T*p0Z3VZmJ}HKaSQHyE=<<F@`KI^!G#y^qz$w^~-Q(=zgmR+rkuK zh))o|3Je=Y2t%$wMmETZj?LZcifmEH1v#QO$=G~wbz}_TP0f*!IW(EkD~+jGffEx> zELbgA?V-g;&yim!b7(2+zyQjAMB&u#ner>7fn#e<tU0#k>`piaE6ovAf_vW-_r!Og zr_9Q8q-Thq;il6o!D=$6XUJbrCauG+GTjxl_<cyWDlpT->d+e6T?60KZXZyB{=?c4 zxk(<Z-8b$VBWq-jN(JgMmGvoZO&=qN-TVZh#t!?-8lOfFyALPalJ@Kw?zW%ZBV(HW z4T!2eV{C}(%VPz%ADy!LNbA+{0?v4%cWU)ebEj5+Dr6xKznw%0c7GOeLW<SKhAb(Y z)mdX`N3=~2D8%dyjL+B<*C0amBQh!v%SD_3sVT3aUcmkVU~g*dSBuDv96;)zkEf(& zK&l0=!4O~nPimTf2eS-F)-+<1&7d8y?i@B$^N0fXSY!Gt=sTmW{ssDqS7qa?g8M&C zUyr6SKL$HH2UT8kpPu4A)s_r)Zo);cCNFP_J-rK-W;K#3@U*SdzG?r@YyM@;$G3UP z_p}Ys)zM;YMu+A!x<lhGp=5jZ9^iu7bzvp9u;xRBcUDy()SX}>cb1dB+C!>xT=jDc zNl}O2VQ#TN1-XU4Z*dV0#05MpEvF3b+}dBb3+=(>MSp-Ih0TXEH;`^2QPjRA_sw^p zUUg({!jhM7WC`{YY&EAkNoy5b&dGsz9Zi*QW+9@^o&I1wj>6k4cjTT_JOK)Ds7UR3 ztyM0fAddFA&{cl_)i2XtnmtS>wHFm=5a_<_v_u(QIj)q@cc4;Mp<!a3OG7TO4&}`k zTL;7<3YEYzCGbB1T{H7i(C<SH%x!3|2{_o#`cR3Li29-iLY;~@1B=(lK+2y4O6Ioi zZK928=5WHkliNE%Jm7d8vLjx>^V#F+JW_AL^coBq!$hb>+ti^|7!FW%+JteIUZhO} z=_Z|rzb2i5(KZUH>HZQ(>0A1IR?jF`ok-5pOVou^yw^6{#_6)H!_}d8I%VuL_*O7_ zzMo`l5F=gp{p~>zPdH`YXIbd`x)*2<^2VgigglOcaqMJ=igVzX(7s}N@D0imOpa~Q zW=*GTrPD-f-GLfF=kx{s*CMci3+yp@3wqPSq%SSVXjkV_KW3fvyb@+Q%SxU~C8jF3 iwz4SICQc9)6ynL9j|&Gs!G<Lf*{o5AK+nLan*Rcc{H}li diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-37.pyc deleted file mode 100644 index a8f63788461d6257f402fb015b640972324ed81e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2718 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 L%1C6<Xqx{5%K(dF diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-37.pyc deleted file mode 100644 index efac0fbd114e2bda835011eedfdfd11ad46c0441..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16393 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 al-q=7#Ytd2a2-$s%D^_DWR?*~=l%@^mok0; diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-37.pyc deleted file mode 100644 index e18e893005ac60d76ac61e57c27502aeb47963bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1311 zcmZ8hPjA~c6elT4mK-|{f~;+}9t;dU7)xvHP_!6|Vr}Ymry!Vzt<Vq%ibyv~s6QcT zHwm0mihY0{diJo>zQjHVuRG-{^tAWnx+zNGQR4eUzTf*j>Up=@CNRps?;QNg3Hc8f zs{w2BBZw(s5=2l%3L4Xb#jNmRkD`t#9&_OduKXg11JL;*P^}`2!y<|!Shp5!8U01$ zNb<#+2xWAOz^e0-h)A^G6492yarerLyJAgr-jaA-urV2Qui;EG@LVrFG?kiKndC)X zY3o9f&vKJjrQ4X6c~%LTsN71ODzkS@F^D>Tm>PM_aKYTV&O~a{k&=Zht#Lh5r<vS6 zN_Cn+oN?sB|KpxH_%6dESK|}-9neS;Q$b=TXzWQYnDAaR>C51X-X>QxZV4`YNIet* zq~3DDPq~7fFP`mIN~N`trvK&$a%>Ln%d<?@wx5^%TFafjm1j29GTrH?rRbYX=U|kp zWIgb4;mRjNd^j*W6inGHU=s9_p1rr^m@e2H3jBf`{CUadOt5Wo>CHXioiP1;PR(P` z@oh3E$KFYR8sR@8m$cjmp8$Mb%_)lTAEWjMh?s$;1(q2^hTBBXM1)^YNO>2m@4(sy z>pRPr_A9!y&e?B-lGDxKp-rGFYkL}#cif)WfM^Vu?XT%;$IG;k+DB6`Dg~-~<1Yx} z$lnLrckLV22EGm;NUvdJm?YQ&N#ee0YP_$dk$NU?IL|&Zku-KQ;Eo%qCUFS$ZCssi zs}ou3b=dD8qQ8OHho6VGsE2i4-_J{9Q>E^U)ARD|`^gb18%bue6qOzx*+M;3`QdQV zP;Z7egg>ay^)1+L1H^m{6QP`L(h#0a+GZV)Er#z6cF|jQ&Vv=6y+MTFutor`og_si zrV771Npd<()kjM!Nko-_I-2O}LY78a$5n2u4&gj~8z;=6!S&g67j;;|4v4{mhLGGA zYjmHw4T-~U+eIhzv}8dAg+9Zp%J%dY=-{Sx#{189N8{v|(aX^*=b7mt-bHNQFOR$f z0rzk>yrYC_Tn~B(a5A-14FEM-w1*QO?U<Gte^m|ZF3Kuo1g`TEV1zFGxXMe{%BrHy nmDJy&H)3mc|11OKRwHs3K3UfDDIzpT{T2(63E*Vi+uZ&i0rX6} diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py deleted file mode 100644 index 5ba926e..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py +++ /dev/null @@ -1,29 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from . import base - -from collections import OrderedDict - - -def _attr_key(attr): - """Return an appropriate key for an attribute for sorting - - Attributes have a namespace that can be either ``None`` or a string. We - can't compare the two because they're different types, so we convert - ``None`` to an empty string first. - - """ - return (attr[0][0] or ''), attr[0][1] - - -class Filter(base.Filter): - """Alphabetizes attributes for elements""" - def __iter__(self): - for token in base.Filter.__iter__(self): - if token["type"] in ("StartTag", "EmptyTag"): - attrs = OrderedDict() - for name, value in sorted(token["data"].items(), - key=_attr_key): - attrs[name] = value - token["data"] = attrs - yield token diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/base.py b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/base.py deleted file mode 100644 index c7dbaed..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/base.py +++ /dev/null @@ -1,12 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - - -class Filter(object): - def __init__(self, source): - self.source = source - - def __iter__(self): - return iter(self.source) - - def __getattr__(self, name): - return getattr(self.source, name) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py deleted file mode 100644 index aefb5c8..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py +++ /dev/null @@ -1,73 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from . import base - - -class Filter(base.Filter): - """Injects ``<meta charset=ENCODING>`` tag into head of document""" - def __init__(self, source, encoding): - """Creates a Filter - - :arg source: the source token stream - - :arg encoding: the encoding to set - - """ - base.Filter.__init__(self, source) - self.encoding = encoding - - def __iter__(self): - state = "pre_head" - meta_found = (self.encoding is None) - pending = [] - - for token in base.Filter.__iter__(self): - type = token["type"] - if type == "StartTag": - if token["name"].lower() == "head": - state = "in_head" - - elif type == "EmptyTag": - if token["name"].lower() == "meta": - # replace charset with actual encoding - has_http_equiv_content_type = False - for (namespace, name), value in token["data"].items(): - if namespace is not None: - continue - elif name.lower() == 'charset': - token["data"][(namespace, name)] = self.encoding - meta_found = True - break - elif name == 'http-equiv' and value.lower() == 'content-type': - has_http_equiv_content_type = True - else: - if has_http_equiv_content_type and (None, "content") in token["data"]: - token["data"][(None, "content")] = 'text/html; charset=%s' % self.encoding - meta_found = True - - elif token["name"].lower() == "head" and not meta_found: - # insert meta into empty head - yield {"type": "StartTag", "name": "head", - "data": token["data"]} - yield {"type": "EmptyTag", "name": "meta", - "data": {(None, "charset"): self.encoding}} - yield {"type": "EndTag", "name": "head"} - meta_found = True - continue - - elif type == "EndTag": - if token["name"].lower() == "head" and pending: - # insert meta into head (if necessary) and flush pending queue - yield pending.pop(0) - if not meta_found: - yield {"type": "EmptyTag", "name": "meta", - "data": {(None, "charset"): self.encoding}} - while pending: - yield pending.pop(0) - meta_found = True - state = "post_head" - - if state == "in_head": - pending.append(token) - else: - yield token diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/lint.py b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/lint.py deleted file mode 100644 index fcc07ee..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/lint.py +++ /dev/null @@ -1,93 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from pip._vendor.six import text_type - -from . import base -from ..constants import namespaces, voidElements - -from ..constants import spaceCharacters -spaceCharacters = "".join(spaceCharacters) - - -class Filter(base.Filter): - """Lints the token stream for errors - - If it finds any errors, it'll raise an ``AssertionError``. - - """ - def __init__(self, source, require_matching_tags=True): - """Creates a Filter - - :arg source: the source token stream - - :arg require_matching_tags: whether or not to require matching tags - - """ - super(Filter, self).__init__(source) - self.require_matching_tags = require_matching_tags - - def __iter__(self): - open_elements = [] - for token in base.Filter.__iter__(self): - type = token["type"] - if type in ("StartTag", "EmptyTag"): - namespace = token["namespace"] - name = token["name"] - assert namespace is None or isinstance(namespace, text_type) - assert namespace != "" - assert isinstance(name, text_type) - assert name != "" - assert isinstance(token["data"], dict) - if (not namespace or namespace == namespaces["html"]) and name in voidElements: - assert type == "EmptyTag" - else: - assert type == "StartTag" - if type == "StartTag" and self.require_matching_tags: - open_elements.append((namespace, name)) - for (namespace, name), value in token["data"].items(): - assert namespace is None or isinstance(namespace, text_type) - assert namespace != "" - assert isinstance(name, text_type) - assert name != "" - assert isinstance(value, text_type) - - elif type == "EndTag": - namespace = token["namespace"] - name = token["name"] - assert namespace is None or isinstance(namespace, text_type) - assert namespace != "" - assert isinstance(name, text_type) - assert name != "" - if (not namespace or namespace == namespaces["html"]) and name in voidElements: - assert False, "Void element reported as EndTag token: %(tag)s" % {"tag": name} - elif self.require_matching_tags: - start = open_elements.pop() - assert start == (namespace, name) - - elif type == "Comment": - data = token["data"] - assert isinstance(data, text_type) - - elif type in ("Characters", "SpaceCharacters"): - data = token["data"] - assert isinstance(data, text_type) - assert data != "" - if type == "SpaceCharacters": - assert data.strip(spaceCharacters) == "" - - elif type == "Doctype": - name = token["name"] - assert name is None or isinstance(name, text_type) - assert token["publicId"] is None or isinstance(name, text_type) - assert token["systemId"] is None or isinstance(name, text_type) - - elif type == "Entity": - assert isinstance(token["name"], text_type) - - elif type == "SerializerError": - assert isinstance(token["data"], text_type) - - else: - assert False, "Unknown token type: %(type)s" % {"type": type} - - yield token diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/optionaltags.py b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/optionaltags.py deleted file mode 100644 index 4a86501..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/optionaltags.py +++ /dev/null @@ -1,207 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from . import base - - -class Filter(base.Filter): - """Removes optional tags from the token stream""" - def slider(self): - previous1 = previous2 = None - for token in self.source: - if previous1 is not None: - yield previous2, previous1, token - previous2 = previous1 - previous1 = token - if previous1 is not None: - yield previous2, previous1, None - - def __iter__(self): - for previous, token, next in self.slider(): - type = token["type"] - if type == "StartTag": - if (token["data"] or - not self.is_optional_start(token["name"], previous, next)): - yield token - elif type == "EndTag": - if not self.is_optional_end(token["name"], next): - yield token - else: - yield token - - def is_optional_start(self, tagname, previous, next): - type = next and next["type"] or None - if tagname in 'html': - # An html element's start tag may be omitted if the first thing - # inside the html element is not a space character or a comment. - return type not in ("Comment", "SpaceCharacters") - elif tagname == 'head': - # A head element's start tag may be omitted if the first thing - # inside the head element is an element. - # XXX: we also omit the start tag if the head element is empty - if type in ("StartTag", "EmptyTag"): - return True - elif type == "EndTag": - return next["name"] == "head" - elif tagname == 'body': - # A body element's start tag may be omitted if the first thing - # inside the body element is not a space character or a comment, - # except if the first thing inside the body element is a script - # or style element and the node immediately preceding the body - # element is a head element whose end tag has been omitted. - if type in ("Comment", "SpaceCharacters"): - return False - elif type == "StartTag": - # XXX: we do not look at the preceding event, so we never omit - # the body element's start tag if it's followed by a script or - # a style element. - return next["name"] not in ('script', 'style') - else: - return True - elif tagname == 'colgroup': - # A colgroup element's start tag may be omitted if the first thing - # inside the colgroup element is a col element, and if the element - # is not immediately preceded by another colgroup element whose - # end tag has been omitted. - if type in ("StartTag", "EmptyTag"): - # XXX: we do not look at the preceding event, so instead we never - # omit the colgroup element's end tag when it is immediately - # followed by another colgroup element. See is_optional_end. - return next["name"] == "col" - else: - return False - elif tagname == 'tbody': - # A tbody element's start tag may be omitted if the first thing - # inside the tbody element is a tr element, and if the element is - # not immediately preceded by a tbody, thead, or tfoot element - # whose end tag has been omitted. - if type == "StartTag": - # omit the thead and tfoot elements' end tag when they are - # immediately followed by a tbody element. See is_optional_end. - if previous and previous['type'] == 'EndTag' and \ - previous['name'] in ('tbody', 'thead', 'tfoot'): - return False - return next["name"] == 'tr' - else: - return False - return False - - def is_optional_end(self, tagname, next): - type = next and next["type"] or None - if tagname in ('html', 'head', 'body'): - # An html element's end tag may be omitted if the html element - # is not immediately followed by a space character or a comment. - return type not in ("Comment", "SpaceCharacters") - elif tagname in ('li', 'optgroup', 'tr'): - # A li element's end tag may be omitted if the li element is - # immediately followed by another li element or if there is - # no more content in the parent element. - # An optgroup element's end tag may be omitted if the optgroup - # element is immediately followed by another optgroup element, - # or if there is no more content in the parent element. - # A tr element's end tag may be omitted if the tr element is - # immediately followed by another tr element, or if there is - # no more content in the parent element. - if type == "StartTag": - return next["name"] == tagname - else: - return type == "EndTag" or type is None - elif tagname in ('dt', 'dd'): - # A dt element's end tag may be omitted if the dt element is - # immediately followed by another dt element or a dd element. - # A dd element's end tag may be omitted if the dd element is - # immediately followed by another dd element or a dt element, - # or if there is no more content in the parent element. - if type == "StartTag": - return next["name"] in ('dt', 'dd') - elif tagname == 'dd': - return type == "EndTag" or type is None - else: - return False - elif tagname == 'p': - # A p element's end tag may be omitted if the p element is - # immediately followed by an address, article, aside, - # blockquote, datagrid, dialog, dir, div, dl, fieldset, - # footer, form, h1, h2, h3, h4, h5, h6, header, hr, menu, - # nav, ol, p, pre, section, table, or ul, element, or if - # there is no more content in the parent element. - if type in ("StartTag", "EmptyTag"): - return next["name"] in ('address', 'article', 'aside', - 'blockquote', 'datagrid', 'dialog', - 'dir', 'div', 'dl', 'fieldset', 'footer', - 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', - 'header', 'hr', 'menu', 'nav', 'ol', - 'p', 'pre', 'section', 'table', 'ul') - else: - return type == "EndTag" or type is None - elif tagname == 'option': - # An option element's end tag may be omitted if the option - # element is immediately followed by another option element, - # or if it is immediately followed by an <code>optgroup</code> - # element, or if there is no more content in the parent - # element. - if type == "StartTag": - return next["name"] in ('option', 'optgroup') - else: - return type == "EndTag" or type is None - elif tagname in ('rt', 'rp'): - # An rt element's end tag may be omitted if the rt element is - # immediately followed by an rt or rp element, or if there is - # no more content in the parent element. - # An rp element's end tag may be omitted if the rp element is - # immediately followed by an rt or rp element, or if there is - # no more content in the parent element. - if type == "StartTag": - return next["name"] in ('rt', 'rp') - else: - return type == "EndTag" or type is None - elif tagname == 'colgroup': - # A colgroup element's end tag may be omitted if the colgroup - # element is not immediately followed by a space character or - # a comment. - if type in ("Comment", "SpaceCharacters"): - return False - elif type == "StartTag": - # XXX: we also look for an immediately following colgroup - # element. See is_optional_start. - return next["name"] != 'colgroup' - else: - return True - elif tagname in ('thead', 'tbody'): - # A thead element's end tag may be omitted if the thead element - # is immediately followed by a tbody or tfoot element. - # A tbody element's end tag may be omitted if the tbody element - # is immediately followed by a tbody or tfoot element, or if - # there is no more content in the parent element. - # A tfoot element's end tag may be omitted if the tfoot element - # is immediately followed by a tbody element, or if there is no - # more content in the parent element. - # XXX: we never omit the end tag when the following element is - # a tbody. See is_optional_start. - if type == "StartTag": - return next["name"] in ['tbody', 'tfoot'] - elif tagname == 'tbody': - return type == "EndTag" or type is None - else: - return False - elif tagname == 'tfoot': - # A tfoot element's end tag may be omitted if the tfoot element - # is immediately followed by a tbody element, or if there is no - # more content in the parent element. - # XXX: we never omit the end tag when the following element is - # a tbody. See is_optional_start. - if type == "StartTag": - return next["name"] == 'tbody' - else: - return type == "EndTag" or type is None - elif tagname in ('td', 'th'): - # A td element's end tag may be omitted if the td element is - # immediately followed by a td or th element, or if there is - # no more content in the parent element. - # A th element's end tag may be omitted if the th element is - # immediately followed by a td or th element, or if there is - # no more content in the parent element. - if type == "StartTag": - return next["name"] in ('td', 'th') - else: - return type == "EndTag" or type is None - return False diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/sanitizer.py b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/sanitizer.py deleted file mode 100644 index af8e77b..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/sanitizer.py +++ /dev/null @@ -1,896 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -import re -from xml.sax.saxutils import escape, unescape - -from pip._vendor.six.moves import urllib_parse as urlparse - -from . import base -from ..constants import namespaces, prefixes - -__all__ = ["Filter"] - - -allowed_elements = frozenset(( - (namespaces['html'], 'a'), - (namespaces['html'], 'abbr'), - (namespaces['html'], 'acronym'), - (namespaces['html'], 'address'), - (namespaces['html'], 'area'), - (namespaces['html'], 'article'), - (namespaces['html'], 'aside'), - (namespaces['html'], 'audio'), - (namespaces['html'], 'b'), - (namespaces['html'], 'big'), - (namespaces['html'], 'blockquote'), - (namespaces['html'], 'br'), - (namespaces['html'], 'button'), - (namespaces['html'], 'canvas'), - (namespaces['html'], 'caption'), - (namespaces['html'], 'center'), - (namespaces['html'], 'cite'), - (namespaces['html'], 'code'), - (namespaces['html'], 'col'), - (namespaces['html'], 'colgroup'), - (namespaces['html'], 'command'), - (namespaces['html'], 'datagrid'), - (namespaces['html'], 'datalist'), - (namespaces['html'], 'dd'), - (namespaces['html'], 'del'), - (namespaces['html'], 'details'), - (namespaces['html'], 'dfn'), - (namespaces['html'], 'dialog'), - (namespaces['html'], 'dir'), - (namespaces['html'], 'div'), - (namespaces['html'], 'dl'), - (namespaces['html'], 'dt'), - (namespaces['html'], 'em'), - (namespaces['html'], 'event-source'), - (namespaces['html'], 'fieldset'), - (namespaces['html'], 'figcaption'), - (namespaces['html'], 'figure'), - (namespaces['html'], 'footer'), - (namespaces['html'], 'font'), - (namespaces['html'], 'form'), - (namespaces['html'], 'header'), - (namespaces['html'], 'h1'), - (namespaces['html'], 'h2'), - (namespaces['html'], 'h3'), - (namespaces['html'], 'h4'), - (namespaces['html'], 'h5'), - (namespaces['html'], 'h6'), - (namespaces['html'], 'hr'), - (namespaces['html'], 'i'), - (namespaces['html'], 'img'), - (namespaces['html'], 'input'), - (namespaces['html'], 'ins'), - (namespaces['html'], 'keygen'), - (namespaces['html'], 'kbd'), - (namespaces['html'], 'label'), - (namespaces['html'], 'legend'), - (namespaces['html'], 'li'), - (namespaces['html'], 'm'), - (namespaces['html'], 'map'), - (namespaces['html'], 'menu'), - (namespaces['html'], 'meter'), - (namespaces['html'], 'multicol'), - (namespaces['html'], 'nav'), - (namespaces['html'], 'nextid'), - (namespaces['html'], 'ol'), - (namespaces['html'], 'output'), - (namespaces['html'], 'optgroup'), - (namespaces['html'], 'option'), - (namespaces['html'], 'p'), - (namespaces['html'], 'pre'), - (namespaces['html'], 'progress'), - (namespaces['html'], 'q'), - (namespaces['html'], 's'), - (namespaces['html'], 'samp'), - (namespaces['html'], 'section'), - (namespaces['html'], 'select'), - (namespaces['html'], 'small'), - (namespaces['html'], 'sound'), - (namespaces['html'], 'source'), - (namespaces['html'], 'spacer'), - (namespaces['html'], 'span'), - (namespaces['html'], 'strike'), - (namespaces['html'], 'strong'), - (namespaces['html'], 'sub'), - (namespaces['html'], 'sup'), - (namespaces['html'], 'table'), - (namespaces['html'], 'tbody'), - (namespaces['html'], 'td'), - (namespaces['html'], 'textarea'), - (namespaces['html'], 'time'), - (namespaces['html'], 'tfoot'), - (namespaces['html'], 'th'), - (namespaces['html'], 'thead'), - (namespaces['html'], 'tr'), - (namespaces['html'], 'tt'), - (namespaces['html'], 'u'), - (namespaces['html'], 'ul'), - (namespaces['html'], 'var'), - (namespaces['html'], 'video'), - (namespaces['mathml'], 'maction'), - (namespaces['mathml'], 'math'), - (namespaces['mathml'], 'merror'), - (namespaces['mathml'], 'mfrac'), - (namespaces['mathml'], 'mi'), - (namespaces['mathml'], 'mmultiscripts'), - (namespaces['mathml'], 'mn'), - (namespaces['mathml'], 'mo'), - (namespaces['mathml'], 'mover'), - (namespaces['mathml'], 'mpadded'), - (namespaces['mathml'], 'mphantom'), - (namespaces['mathml'], 'mprescripts'), - (namespaces['mathml'], 'mroot'), - (namespaces['mathml'], 'mrow'), - (namespaces['mathml'], 'mspace'), - (namespaces['mathml'], 'msqrt'), - (namespaces['mathml'], 'mstyle'), - (namespaces['mathml'], 'msub'), - (namespaces['mathml'], 'msubsup'), - (namespaces['mathml'], 'msup'), - (namespaces['mathml'], 'mtable'), - (namespaces['mathml'], 'mtd'), - (namespaces['mathml'], 'mtext'), - (namespaces['mathml'], 'mtr'), - (namespaces['mathml'], 'munder'), - (namespaces['mathml'], 'munderover'), - (namespaces['mathml'], 'none'), - (namespaces['svg'], 'a'), - (namespaces['svg'], 'animate'), - (namespaces['svg'], 'animateColor'), - (namespaces['svg'], 'animateMotion'), - (namespaces['svg'], 'animateTransform'), - (namespaces['svg'], 'clipPath'), - (namespaces['svg'], 'circle'), - (namespaces['svg'], 'defs'), - (namespaces['svg'], 'desc'), - (namespaces['svg'], 'ellipse'), - (namespaces['svg'], 'font-face'), - (namespaces['svg'], 'font-face-name'), - (namespaces['svg'], 'font-face-src'), - (namespaces['svg'], 'g'), - (namespaces['svg'], 'glyph'), - (namespaces['svg'], 'hkern'), - (namespaces['svg'], 'linearGradient'), - (namespaces['svg'], 'line'), - (namespaces['svg'], 'marker'), - (namespaces['svg'], 'metadata'), - (namespaces['svg'], 'missing-glyph'), - (namespaces['svg'], 'mpath'), - (namespaces['svg'], 'path'), - (namespaces['svg'], 'polygon'), - (namespaces['svg'], 'polyline'), - (namespaces['svg'], 'radialGradient'), - (namespaces['svg'], 'rect'), - (namespaces['svg'], 'set'), - (namespaces['svg'], 'stop'), - (namespaces['svg'], 'svg'), - (namespaces['svg'], 'switch'), - (namespaces['svg'], 'text'), - (namespaces['svg'], 'title'), - (namespaces['svg'], 'tspan'), - (namespaces['svg'], 'use'), -)) - -allowed_attributes = frozenset(( - # HTML attributes - (None, 'abbr'), - (None, 'accept'), - (None, 'accept-charset'), - (None, 'accesskey'), - (None, 'action'), - (None, 'align'), - (None, 'alt'), - (None, 'autocomplete'), - (None, 'autofocus'), - (None, 'axis'), - (None, 'background'), - (None, 'balance'), - (None, 'bgcolor'), - (None, 'bgproperties'), - (None, 'border'), - (None, 'bordercolor'), - (None, 'bordercolordark'), - (None, 'bordercolorlight'), - (None, 'bottompadding'), - (None, 'cellpadding'), - (None, 'cellspacing'), - (None, 'ch'), - (None, 'challenge'), - (None, 'char'), - (None, 'charoff'), - (None, 'choff'), - (None, 'charset'), - (None, 'checked'), - (None, 'cite'), - (None, 'class'), - (None, 'clear'), - (None, 'color'), - (None, 'cols'), - (None, 'colspan'), - (None, 'compact'), - (None, 'contenteditable'), - (None, 'controls'), - (None, 'coords'), - (None, 'data'), - (None, 'datafld'), - (None, 'datapagesize'), - (None, 'datasrc'), - (None, 'datetime'), - (None, 'default'), - (None, 'delay'), - (None, 'dir'), - (None, 'disabled'), - (None, 'draggable'), - (None, 'dynsrc'), - (None, 'enctype'), - (None, 'end'), - (None, 'face'), - (None, 'for'), - (None, 'form'), - (None, 'frame'), - (None, 'galleryimg'), - (None, 'gutter'), - (None, 'headers'), - (None, 'height'), - (None, 'hidefocus'), - (None, 'hidden'), - (None, 'high'), - (None, 'href'), - (None, 'hreflang'), - (None, 'hspace'), - (None, 'icon'), - (None, 'id'), - (None, 'inputmode'), - (None, 'ismap'), - (None, 'keytype'), - (None, 'label'), - (None, 'leftspacing'), - (None, 'lang'), - (None, 'list'), - (None, 'longdesc'), - (None, 'loop'), - (None, 'loopcount'), - (None, 'loopend'), - (None, 'loopstart'), - (None, 'low'), - (None, 'lowsrc'), - (None, 'max'), - (None, 'maxlength'), - (None, 'media'), - (None, 'method'), - (None, 'min'), - (None, 'multiple'), - (None, 'name'), - (None, 'nohref'), - (None, 'noshade'), - (None, 'nowrap'), - (None, 'open'), - (None, 'optimum'), - (None, 'pattern'), - (None, 'ping'), - (None, 'point-size'), - (None, 'poster'), - (None, 'pqg'), - (None, 'preload'), - (None, 'prompt'), - (None, 'radiogroup'), - (None, 'readonly'), - (None, 'rel'), - (None, 'repeat-max'), - (None, 'repeat-min'), - (None, 'replace'), - (None, 'required'), - (None, 'rev'), - (None, 'rightspacing'), - (None, 'rows'), - (None, 'rowspan'), - (None, 'rules'), - (None, 'scope'), - (None, 'selected'), - (None, 'shape'), - (None, 'size'), - (None, 'span'), - (None, 'src'), - (None, 'start'), - (None, 'step'), - (None, 'style'), - (None, 'summary'), - (None, 'suppress'), - (None, 'tabindex'), - (None, 'target'), - (None, 'template'), - (None, 'title'), - (None, 'toppadding'), - (None, 'type'), - (None, 'unselectable'), - (None, 'usemap'), - (None, 'urn'), - (None, 'valign'), - (None, 'value'), - (None, 'variable'), - (None, 'volume'), - (None, 'vspace'), - (None, 'vrml'), - (None, 'width'), - (None, 'wrap'), - (namespaces['xml'], 'lang'), - # MathML attributes - (None, 'actiontype'), - (None, 'align'), - (None, 'columnalign'), - (None, 'columnalign'), - (None, 'columnalign'), - (None, 'columnlines'), - (None, 'columnspacing'), - (None, 'columnspan'), - (None, 'depth'), - (None, 'display'), - (None, 'displaystyle'), - (None, 'equalcolumns'), - (None, 'equalrows'), - (None, 'fence'), - (None, 'fontstyle'), - (None, 'fontweight'), - (None, 'frame'), - (None, 'height'), - (None, 'linethickness'), - (None, 'lspace'), - (None, 'mathbackground'), - (None, 'mathcolor'), - (None, 'mathvariant'), - (None, 'mathvariant'), - (None, 'maxsize'), - (None, 'minsize'), - (None, 'other'), - (None, 'rowalign'), - (None, 'rowalign'), - (None, 'rowalign'), - (None, 'rowlines'), - (None, 'rowspacing'), - (None, 'rowspan'), - (None, 'rspace'), - (None, 'scriptlevel'), - (None, 'selection'), - (None, 'separator'), - (None, 'stretchy'), - (None, 'width'), - (None, 'width'), - (namespaces['xlink'], 'href'), - (namespaces['xlink'], 'show'), - (namespaces['xlink'], 'type'), - # SVG attributes - (None, 'accent-height'), - (None, 'accumulate'), - (None, 'additive'), - (None, 'alphabetic'), - (None, 'arabic-form'), - (None, 'ascent'), - (None, 'attributeName'), - (None, 'attributeType'), - (None, 'baseProfile'), - (None, 'bbox'), - (None, 'begin'), - (None, 'by'), - (None, 'calcMode'), - (None, 'cap-height'), - (None, 'class'), - (None, 'clip-path'), - (None, 'color'), - (None, 'color-rendering'), - (None, 'content'), - (None, 'cx'), - (None, 'cy'), - (None, 'd'), - (None, 'dx'), - (None, 'dy'), - (None, 'descent'), - (None, 'display'), - (None, 'dur'), - (None, 'end'), - (None, 'fill'), - (None, 'fill-opacity'), - (None, 'fill-rule'), - (None, 'font-family'), - (None, 'font-size'), - (None, 'font-stretch'), - (None, 'font-style'), - (None, 'font-variant'), - (None, 'font-weight'), - (None, 'from'), - (None, 'fx'), - (None, 'fy'), - (None, 'g1'), - (None, 'g2'), - (None, 'glyph-name'), - (None, 'gradientUnits'), - (None, 'hanging'), - (None, 'height'), - (None, 'horiz-adv-x'), - (None, 'horiz-origin-x'), - (None, 'id'), - (None, 'ideographic'), - (None, 'k'), - (None, 'keyPoints'), - (None, 'keySplines'), - (None, 'keyTimes'), - (None, 'lang'), - (None, 'marker-end'), - (None, 'marker-mid'), - (None, 'marker-start'), - (None, 'markerHeight'), - (None, 'markerUnits'), - (None, 'markerWidth'), - (None, 'mathematical'), - (None, 'max'), - (None, 'min'), - (None, 'name'), - (None, 'offset'), - (None, 'opacity'), - (None, 'orient'), - (None, 'origin'), - (None, 'overline-position'), - (None, 'overline-thickness'), - (None, 'panose-1'), - (None, 'path'), - (None, 'pathLength'), - (None, 'points'), - (None, 'preserveAspectRatio'), - (None, 'r'), - (None, 'refX'), - (None, 'refY'), - (None, 'repeatCount'), - (None, 'repeatDur'), - (None, 'requiredExtensions'), - (None, 'requiredFeatures'), - (None, 'restart'), - (None, 'rotate'), - (None, 'rx'), - (None, 'ry'), - (None, 'slope'), - (None, 'stemh'), - (None, 'stemv'), - (None, 'stop-color'), - (None, 'stop-opacity'), - (None, 'strikethrough-position'), - (None, 'strikethrough-thickness'), - (None, 'stroke'), - (None, 'stroke-dasharray'), - (None, 'stroke-dashoffset'), - (None, 'stroke-linecap'), - (None, 'stroke-linejoin'), - (None, 'stroke-miterlimit'), - (None, 'stroke-opacity'), - (None, 'stroke-width'), - (None, 'systemLanguage'), - (None, 'target'), - (None, 'text-anchor'), - (None, 'to'), - (None, 'transform'), - (None, 'type'), - (None, 'u1'), - (None, 'u2'), - (None, 'underline-position'), - (None, 'underline-thickness'), - (None, 'unicode'), - (None, 'unicode-range'), - (None, 'units-per-em'), - (None, 'values'), - (None, 'version'), - (None, 'viewBox'), - (None, 'visibility'), - (None, 'width'), - (None, 'widths'), - (None, 'x'), - (None, 'x-height'), - (None, 'x1'), - (None, 'x2'), - (namespaces['xlink'], 'actuate'), - (namespaces['xlink'], 'arcrole'), - (namespaces['xlink'], 'href'), - (namespaces['xlink'], 'role'), - (namespaces['xlink'], 'show'), - (namespaces['xlink'], 'title'), - (namespaces['xlink'], 'type'), - (namespaces['xml'], 'base'), - (namespaces['xml'], 'lang'), - (namespaces['xml'], 'space'), - (None, 'y'), - (None, 'y1'), - (None, 'y2'), - (None, 'zoomAndPan'), -)) - -attr_val_is_uri = frozenset(( - (None, 'href'), - (None, 'src'), - (None, 'cite'), - (None, 'action'), - (None, 'longdesc'), - (None, 'poster'), - (None, 'background'), - (None, 'datasrc'), - (None, 'dynsrc'), - (None, 'lowsrc'), - (None, 'ping'), - (namespaces['xlink'], 'href'), - (namespaces['xml'], 'base'), -)) - -svg_attr_val_allows_ref = frozenset(( - (None, 'clip-path'), - (None, 'color-profile'), - (None, 'cursor'), - (None, 'fill'), - (None, 'filter'), - (None, 'marker'), - (None, 'marker-start'), - (None, 'marker-mid'), - (None, 'marker-end'), - (None, 'mask'), - (None, 'stroke'), -)) - -svg_allow_local_href = frozenset(( - (None, 'altGlyph'), - (None, 'animate'), - (None, 'animateColor'), - (None, 'animateMotion'), - (None, 'animateTransform'), - (None, 'cursor'), - (None, 'feImage'), - (None, 'filter'), - (None, 'linearGradient'), - (None, 'pattern'), - (None, 'radialGradient'), - (None, 'textpath'), - (None, 'tref'), - (None, 'set'), - (None, 'use') -)) - -allowed_css_properties = frozenset(( - 'azimuth', - 'background-color', - 'border-bottom-color', - 'border-collapse', - 'border-color', - 'border-left-color', - 'border-right-color', - 'border-top-color', - 'clear', - 'color', - 'cursor', - 'direction', - 'display', - 'elevation', - 'float', - 'font', - 'font-family', - 'font-size', - 'font-style', - 'font-variant', - 'font-weight', - 'height', - 'letter-spacing', - 'line-height', - 'overflow', - 'pause', - 'pause-after', - 'pause-before', - 'pitch', - 'pitch-range', - 'richness', - 'speak', - 'speak-header', - 'speak-numeral', - 'speak-punctuation', - 'speech-rate', - 'stress', - 'text-align', - 'text-decoration', - 'text-indent', - 'unicode-bidi', - 'vertical-align', - 'voice-family', - 'volume', - 'white-space', - 'width', -)) - -allowed_css_keywords = frozenset(( - 'auto', - 'aqua', - 'black', - 'block', - 'blue', - 'bold', - 'both', - 'bottom', - 'brown', - 'center', - 'collapse', - 'dashed', - 'dotted', - 'fuchsia', - 'gray', - 'green', - '!important', - 'italic', - 'left', - 'lime', - 'maroon', - 'medium', - 'none', - 'navy', - 'normal', - 'nowrap', - 'olive', - 'pointer', - 'purple', - 'red', - 'right', - 'solid', - 'silver', - 'teal', - 'top', - 'transparent', - 'underline', - 'white', - 'yellow', -)) - -allowed_svg_properties = frozenset(( - 'fill', - 'fill-opacity', - 'fill-rule', - 'stroke', - 'stroke-width', - 'stroke-linecap', - 'stroke-linejoin', - 'stroke-opacity', -)) - -allowed_protocols = frozenset(( - 'ed2k', - 'ftp', - 'http', - 'https', - 'irc', - 'mailto', - 'news', - 'gopher', - 'nntp', - 'telnet', - 'webcal', - 'xmpp', - 'callto', - 'feed', - 'urn', - 'aim', - 'rsync', - 'tag', - 'ssh', - 'sftp', - 'rtsp', - 'afs', - 'data', -)) - -allowed_content_types = frozenset(( - 'image/png', - 'image/jpeg', - 'image/gif', - 'image/webp', - 'image/bmp', - 'text/plain', -)) - - -data_content_type = re.compile(r''' - ^ - # Match a content type <application>/<type> - (?P<content_type>[-a-zA-Z0-9.]+/[-a-zA-Z0-9.]+) - # Match any character set and encoding - (?:(?:;charset=(?:[-a-zA-Z0-9]+)(?:;(?:base64))?) - |(?:;(?:base64))?(?:;charset=(?:[-a-zA-Z0-9]+))?) - # Assume the rest is data - ,.* - $ - ''', - re.VERBOSE) - - -class Filter(base.Filter): - """Sanitizes token stream of XHTML+MathML+SVG and of inline style attributes""" - def __init__(self, - source, - allowed_elements=allowed_elements, - allowed_attributes=allowed_attributes, - allowed_css_properties=allowed_css_properties, - allowed_css_keywords=allowed_css_keywords, - allowed_svg_properties=allowed_svg_properties, - allowed_protocols=allowed_protocols, - allowed_content_types=allowed_content_types, - attr_val_is_uri=attr_val_is_uri, - svg_attr_val_allows_ref=svg_attr_val_allows_ref, - svg_allow_local_href=svg_allow_local_href): - """Creates a Filter - - :arg allowed_elements: set of elements to allow--everything else will - be escaped - - :arg allowed_attributes: set of attributes to allow in - elements--everything else will be stripped - - :arg allowed_css_properties: set of CSS properties to allow--everything - else will be stripped - - :arg allowed_css_keywords: set of CSS keywords to allow--everything - else will be stripped - - :arg allowed_svg_properties: set of SVG properties to allow--everything - else will be removed - - :arg allowed_protocols: set of allowed protocols for URIs - - :arg allowed_content_types: set of allowed content types for ``data`` URIs. - - :arg attr_val_is_uri: set of attributes that have URI values--values - that have a scheme not listed in ``allowed_protocols`` are removed - - :arg svg_attr_val_allows_ref: set of SVG attributes that can have - references - - :arg svg_allow_local_href: set of SVG elements that can have local - hrefs--these are removed - - """ - super(Filter, self).__init__(source) - self.allowed_elements = allowed_elements - self.allowed_attributes = allowed_attributes - self.allowed_css_properties = allowed_css_properties - self.allowed_css_keywords = allowed_css_keywords - self.allowed_svg_properties = allowed_svg_properties - self.allowed_protocols = allowed_protocols - self.allowed_content_types = allowed_content_types - self.attr_val_is_uri = attr_val_is_uri - self.svg_attr_val_allows_ref = svg_attr_val_allows_ref - self.svg_allow_local_href = svg_allow_local_href - - def __iter__(self): - for token in base.Filter.__iter__(self): - token = self.sanitize_token(token) - if token: - yield token - - # Sanitize the +html+, escaping all elements not in ALLOWED_ELEMENTS, and - # stripping out all attributes not in ALLOWED_ATTRIBUTES. Style attributes - # are parsed, and a restricted set, specified by ALLOWED_CSS_PROPERTIES and - # ALLOWED_CSS_KEYWORDS, are allowed through. attributes in ATTR_VAL_IS_URI - # are scanned, and only URI schemes specified in ALLOWED_PROTOCOLS are - # allowed. - # - # sanitize_html('<script> do_nasty_stuff() </script>') - # => <script> do_nasty_stuff() </script> - # sanitize_html('<a href="javascript: sucker();">Click here for $100</a>') - # => <a>Click here for $100</a> - def sanitize_token(self, token): - - # accommodate filters which use token_type differently - token_type = token["type"] - if token_type in ("StartTag", "EndTag", "EmptyTag"): - name = token["name"] - namespace = token["namespace"] - if ((namespace, name) in self.allowed_elements or - (namespace is None and - (namespaces["html"], name) in self.allowed_elements)): - return self.allowed_token(token) - else: - return self.disallowed_token(token) - elif token_type == "Comment": - pass - else: - return token - - def allowed_token(self, token): - if "data" in token: - attrs = token["data"] - attr_names = set(attrs.keys()) - - # Remove forbidden attributes - for to_remove in (attr_names - self.allowed_attributes): - del token["data"][to_remove] - attr_names.remove(to_remove) - - # Remove attributes with disallowed URL values - for attr in (attr_names & self.attr_val_is_uri): - assert attr in attrs - # I don't have a clue where this regexp comes from or why it matches those - # characters, nor why we call unescape. I just know it's always been here. - # Should you be worried by this comment in a sanitizer? Yes. On the other hand, all - # this will do is remove *more* than it otherwise would. - val_unescaped = re.sub("[`\x00-\x20\x7f-\xa0\\s]+", '', - unescape(attrs[attr])).lower() - # remove replacement characters from unescaped characters - val_unescaped = val_unescaped.replace("\ufffd", "") - try: - uri = urlparse.urlparse(val_unescaped) - except ValueError: - uri = None - del attrs[attr] - if uri and uri.scheme: - if uri.scheme not in self.allowed_protocols: - del attrs[attr] - if uri.scheme == 'data': - m = data_content_type.match(uri.path) - if not m: - del attrs[attr] - elif m.group('content_type') not in self.allowed_content_types: - del attrs[attr] - - for attr in self.svg_attr_val_allows_ref: - if attr in attrs: - attrs[attr] = re.sub(r'url\s*\(\s*[^#\s][^)]+?\)', - ' ', - unescape(attrs[attr])) - if (token["name"] in self.svg_allow_local_href and - (namespaces['xlink'], 'href') in attrs and re.search(r'^\s*[^#\s].*', - attrs[(namespaces['xlink'], 'href')])): - del attrs[(namespaces['xlink'], 'href')] - if (None, 'style') in attrs: - attrs[(None, 'style')] = self.sanitize_css(attrs[(None, 'style')]) - token["data"] = attrs - return token - - def disallowed_token(self, token): - token_type = token["type"] - if token_type == "EndTag": - token["data"] = "</%s>" % token["name"] - elif token["data"]: - assert token_type in ("StartTag", "EmptyTag") - attrs = [] - for (ns, name), v in token["data"].items(): - attrs.append(' %s="%s"' % (name if ns is None else "%s:%s" % (prefixes[ns], name), escape(v))) - token["data"] = "<%s%s>" % (token["name"], ''.join(attrs)) - else: - token["data"] = "<%s>" % token["name"] - if token.get("selfClosing"): - token["data"] = token["data"][:-1] + "/>" - - token["type"] = "Characters" - - del token["name"] - return token - - def sanitize_css(self, style): - # disallow urls - style = re.compile(r'url\s*\(\s*[^\s)]+?\s*\)\s*').sub(' ', style) - - # gauntlet - if not re.match(r"""^([:,;#%.\sa-zA-Z0-9!]|\w-\w|'[\s\w]+'|"[\s\w]+"|\([\d,\s]+\))*$""", style): - return '' - if not re.match(r"^\s*([-\w]+\s*:[^:;]*(;\s*|$))*$", style): - return '' - - clean = [] - for prop, value in re.findall(r"([-\w]+)\s*:\s*([^:;]*)", style): - if not value: - continue - if prop.lower() in self.allowed_css_properties: - clean.append(prop + ': ' + value + ';') - elif prop.split('-')[0].lower() in ['background', 'border', 'margin', - 'padding']: - for keyword in value.split(): - if keyword not in self.allowed_css_keywords and \ - not re.match(r"^(#[0-9a-fA-F]+|rgb\(\d+%?,\d*%?,?\d*%?\)?|\d{0,2}\.?\d{0,2}(cm|em|ex|in|mm|pc|pt|px|%|,|\))?)$", keyword): # noqa - break - else: - clean.append(prop + ': ' + value + ';') - elif prop.lower() in self.allowed_svg_properties: - clean.append(prop + ': ' + value + ';') - - return ' '.join(clean) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/whitespace.py b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/whitespace.py deleted file mode 100644 index 0d12584..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/whitespace.py +++ /dev/null @@ -1,38 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -import re - -from . import base -from ..constants import rcdataElements, spaceCharacters -spaceCharacters = "".join(spaceCharacters) - -SPACES_REGEX = re.compile("[%s]+" % spaceCharacters) - - -class Filter(base.Filter): - """Collapses whitespace except in pre, textarea, and script elements""" - spacePreserveElements = frozenset(["pre", "textarea"] + list(rcdataElements)) - - def __iter__(self): - preserve = 0 - for token in base.Filter.__iter__(self): - type = token["type"] - if type == "StartTag" \ - and (preserve or token["name"] in self.spacePreserveElements): - preserve += 1 - - elif type == "EndTag" and preserve: - preserve -= 1 - - elif not preserve and type == "SpaceCharacters" and token["data"]: - # Test on token["data"] above to not introduce spaces where there were not - token["data"] = " " - - elif not preserve and type == "Characters": - token["data"] = collapse_spaces(token["data"]) - - yield token - - -def collapse_spaces(text): - return SPACES_REGEX.sub(' ', text) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/html5parser.py b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/html5parser.py deleted file mode 100644 index ae41a13..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/html5parser.py +++ /dev/null @@ -1,2791 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals -from pip._vendor.six import with_metaclass, viewkeys - -import types -from collections import OrderedDict - -from . import _inputstream -from . import _tokenizer - -from . import treebuilders -from .treebuilders.base import Marker - -from . import _utils -from .constants import ( - spaceCharacters, asciiUpper2Lower, - specialElements, headingElements, cdataElements, rcdataElements, - tokenTypes, tagTokenTypes, - namespaces, - htmlIntegrationPointElements, mathmlTextIntegrationPointElements, - adjustForeignAttributes as adjustForeignAttributesMap, - adjustMathMLAttributes, adjustSVGAttributes, - E, - _ReparseException -) - - -def parse(doc, treebuilder="etree", namespaceHTMLElements=True, **kwargs): - """Parse an HTML document as a string or file-like object into a tree - - :arg doc: the document to parse as a string or file-like object - - :arg treebuilder: the treebuilder to use when parsing - - :arg namespaceHTMLElements: whether or not to namespace HTML elements - - :returns: parsed tree - - Example: - - >>> from html5lib.html5parser import parse - >>> parse('<html><body><p>This is a doc</p></body></html>') - <Element u'{http://www.w3.org/1999/xhtml}html' at 0x7feac4909db0> - - """ - tb = treebuilders.getTreeBuilder(treebuilder) - p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) - return p.parse(doc, **kwargs) - - -def parseFragment(doc, container="div", treebuilder="etree", namespaceHTMLElements=True, **kwargs): - """Parse an HTML fragment as a string or file-like object into a tree - - :arg doc: the fragment to parse as a string or file-like object - - :arg container: the container context to parse the fragment in - - :arg treebuilder: the treebuilder to use when parsing - - :arg namespaceHTMLElements: whether or not to namespace HTML elements - - :returns: parsed tree - - Example: - - >>> from html5lib.html5libparser import parseFragment - >>> parseFragment('<b>this is a fragment</b>') - <Element u'DOCUMENT_FRAGMENT' at 0x7feac484b090> - - """ - tb = treebuilders.getTreeBuilder(treebuilder) - p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) - return p.parseFragment(doc, container=container, **kwargs) - - -def method_decorator_metaclass(function): - class Decorated(type): - def __new__(meta, classname, bases, classDict): - for attributeName, attribute in classDict.items(): - if isinstance(attribute, types.FunctionType): - attribute = function(attribute) - - classDict[attributeName] = attribute - return type.__new__(meta, classname, bases, classDict) - return Decorated - - -class HTMLParser(object): - """HTML parser - - Generates a tree structure from a stream of (possibly malformed) HTML. - - """ - - def __init__(self, tree=None, strict=False, namespaceHTMLElements=True, debug=False): - """ - :arg tree: a treebuilder class controlling the type of tree that will be - returned. Built in treebuilders can be accessed through - html5lib.treebuilders.getTreeBuilder(treeType) - - :arg strict: raise an exception when a parse error is encountered - - :arg namespaceHTMLElements: whether or not to namespace HTML elements - - :arg debug: whether or not to enable debug mode which logs things - - Example: - - >>> from html5lib.html5parser import HTMLParser - >>> parser = HTMLParser() # generates parser with etree builder - >>> parser = HTMLParser('lxml', strict=True) # generates parser with lxml builder which is strict - - """ - - # Raise an exception on the first error encountered - self.strict = strict - - if tree is None: - tree = treebuilders.getTreeBuilder("etree") - self.tree = tree(namespaceHTMLElements) - self.errors = [] - - self.phases = dict([(name, cls(self, self.tree)) for name, cls in - getPhases(debug).items()]) - - def _parse(self, stream, innerHTML=False, container="div", scripting=False, **kwargs): - - self.innerHTMLMode = innerHTML - self.container = container - self.scripting = scripting - self.tokenizer = _tokenizer.HTMLTokenizer(stream, parser=self, **kwargs) - self.reset() - - try: - self.mainLoop() - except _ReparseException: - self.reset() - self.mainLoop() - - def reset(self): - self.tree.reset() - self.firstStartTag = False - self.errors = [] - self.log = [] # only used with debug mode - # "quirks" / "limited quirks" / "no quirks" - self.compatMode = "no quirks" - - if self.innerHTMLMode: - self.innerHTML = self.container.lower() - - if self.innerHTML in cdataElements: - self.tokenizer.state = self.tokenizer.rcdataState - elif self.innerHTML in rcdataElements: - self.tokenizer.state = self.tokenizer.rawtextState - elif self.innerHTML == 'plaintext': - self.tokenizer.state = self.tokenizer.plaintextState - else: - # state already is data state - # self.tokenizer.state = self.tokenizer.dataState - pass - self.phase = self.phases["beforeHtml"] - self.phase.insertHtmlElement() - self.resetInsertionMode() - else: - self.innerHTML = False # pylint:disable=redefined-variable-type - self.phase = self.phases["initial"] - - self.lastPhase = None - - self.beforeRCDataPhase = None - - self.framesetOK = True - - @property - def documentEncoding(self): - """Name of the character encoding that was used to decode the input stream, or - :obj:`None` if that is not determined yet - - """ - if not hasattr(self, 'tokenizer'): - return None - return self.tokenizer.stream.charEncoding[0].name - - def isHTMLIntegrationPoint(self, element): - if (element.name == "annotation-xml" and - element.namespace == namespaces["mathml"]): - return ("encoding" in element.attributes and - element.attributes["encoding"].translate( - asciiUpper2Lower) in - ("text/html", "application/xhtml+xml")) - else: - return (element.namespace, element.name) in htmlIntegrationPointElements - - def isMathMLTextIntegrationPoint(self, element): - return (element.namespace, element.name) in mathmlTextIntegrationPointElements - - def mainLoop(self): - CharactersToken = tokenTypes["Characters"] - SpaceCharactersToken = tokenTypes["SpaceCharacters"] - StartTagToken = tokenTypes["StartTag"] - EndTagToken = tokenTypes["EndTag"] - CommentToken = tokenTypes["Comment"] - DoctypeToken = tokenTypes["Doctype"] - ParseErrorToken = tokenTypes["ParseError"] - - for token in self.normalizedTokens(): - prev_token = None - new_token = token - while new_token is not None: - prev_token = new_token - currentNode = self.tree.openElements[-1] if self.tree.openElements else None - currentNodeNamespace = currentNode.namespace if currentNode else None - currentNodeName = currentNode.name if currentNode else None - - type = new_token["type"] - - if type == ParseErrorToken: - self.parseError(new_token["data"], new_token.get("datavars", {})) - new_token = None - else: - if (len(self.tree.openElements) == 0 or - currentNodeNamespace == self.tree.defaultNamespace or - (self.isMathMLTextIntegrationPoint(currentNode) and - ((type == StartTagToken and - token["name"] not in frozenset(["mglyph", "malignmark"])) or - type in (CharactersToken, SpaceCharactersToken))) or - (currentNodeNamespace == namespaces["mathml"] and - currentNodeName == "annotation-xml" and - type == StartTagToken and - token["name"] == "svg") or - (self.isHTMLIntegrationPoint(currentNode) and - type in (StartTagToken, CharactersToken, SpaceCharactersToken))): - phase = self.phase - else: - phase = self.phases["inForeignContent"] - - if type == CharactersToken: - new_token = phase.processCharacters(new_token) - elif type == SpaceCharactersToken: - new_token = phase.processSpaceCharacters(new_token) - elif type == StartTagToken: - new_token = phase.processStartTag(new_token) - elif type == EndTagToken: - new_token = phase.processEndTag(new_token) - elif type == CommentToken: - new_token = phase.processComment(new_token) - elif type == DoctypeToken: - new_token = phase.processDoctype(new_token) - - if (type == StartTagToken and prev_token["selfClosing"] and - not prev_token["selfClosingAcknowledged"]): - self.parseError("non-void-element-with-trailing-solidus", - {"name": prev_token["name"]}) - - # When the loop finishes it's EOF - reprocess = True - phases = [] - while reprocess: - phases.append(self.phase) - reprocess = self.phase.processEOF() - if reprocess: - assert self.phase not in phases - - def normalizedTokens(self): - for token in self.tokenizer: - yield self.normalizeToken(token) - - def parse(self, stream, *args, **kwargs): - """Parse a HTML document into a well-formed tree - - :arg stream: a file-like object or string containing the HTML to be parsed - - The optional encoding parameter must be a string that indicates - the encoding. If specified, that encoding will be used, - regardless of any BOM or later declaration (such as in a meta - element). - - :arg scripting: treat noscript elements as if JavaScript was turned on - - :returns: parsed tree - - Example: - - >>> from html5lib.html5parser import HTMLParser - >>> parser = HTMLParser() - >>> parser.parse('<html><body><p>This is a doc</p></body></html>') - <Element u'{http://www.w3.org/1999/xhtml}html' at 0x7feac4909db0> - - """ - self._parse(stream, False, None, *args, **kwargs) - return self.tree.getDocument() - - def parseFragment(self, stream, *args, **kwargs): - """Parse a HTML fragment into a well-formed tree fragment - - :arg container: name of the element we're setting the innerHTML - property if set to None, default to 'div' - - :arg stream: a file-like object or string containing the HTML to be parsed - - The optional encoding parameter must be a string that indicates - the encoding. If specified, that encoding will be used, - regardless of any BOM or later declaration (such as in a meta - element) - - :arg scripting: treat noscript elements as if JavaScript was turned on - - :returns: parsed tree - - Example: - - >>> from html5lib.html5libparser import HTMLParser - >>> parser = HTMLParser() - >>> parser.parseFragment('<b>this is a fragment</b>') - <Element u'DOCUMENT_FRAGMENT' at 0x7feac484b090> - - """ - self._parse(stream, True, *args, **kwargs) - return self.tree.getFragment() - - def parseError(self, errorcode="XXX-undefined-error", datavars=None): - # XXX The idea is to make errorcode mandatory. - if datavars is None: - datavars = {} - self.errors.append((self.tokenizer.stream.position(), errorcode, datavars)) - if self.strict: - raise ParseError(E[errorcode] % datavars) - - def normalizeToken(self, token): - # HTML5 specific normalizations to the token stream - if token["type"] == tokenTypes["StartTag"]: - raw = token["data"] - token["data"] = OrderedDict(raw) - if len(raw) > len(token["data"]): - # we had some duplicated attribute, fix so first wins - token["data"].update(raw[::-1]) - - return token - - def adjustMathMLAttributes(self, token): - adjust_attributes(token, adjustMathMLAttributes) - - def adjustSVGAttributes(self, token): - adjust_attributes(token, adjustSVGAttributes) - - def adjustForeignAttributes(self, token): - adjust_attributes(token, adjustForeignAttributesMap) - - def reparseTokenNormal(self, token): - # pylint:disable=unused-argument - self.parser.phase() - - def resetInsertionMode(self): - # The name of this method is mostly historical. (It's also used in the - # specification.) - last = False - newModes = { - "select": "inSelect", - "td": "inCell", - "th": "inCell", - "tr": "inRow", - "tbody": "inTableBody", - "thead": "inTableBody", - "tfoot": "inTableBody", - "caption": "inCaption", - "colgroup": "inColumnGroup", - "table": "inTable", - "head": "inBody", - "body": "inBody", - "frameset": "inFrameset", - "html": "beforeHead" - } - for node in self.tree.openElements[::-1]: - nodeName = node.name - new_phase = None - if node == self.tree.openElements[0]: - assert self.innerHTML - last = True - nodeName = self.innerHTML - # Check for conditions that should only happen in the innerHTML - # case - if nodeName in ("select", "colgroup", "head", "html"): - assert self.innerHTML - - if not last and node.namespace != self.tree.defaultNamespace: - continue - - if nodeName in newModes: - new_phase = self.phases[newModes[nodeName]] - break - elif last: - new_phase = self.phases["inBody"] - break - - self.phase = new_phase - - def parseRCDataRawtext(self, token, contentType): - # Generic RCDATA/RAWTEXT Parsing algorithm - assert contentType in ("RAWTEXT", "RCDATA") - - self.tree.insertElement(token) - - if contentType == "RAWTEXT": - self.tokenizer.state = self.tokenizer.rawtextState - else: - self.tokenizer.state = self.tokenizer.rcdataState - - self.originalPhase = self.phase - - self.phase = self.phases["text"] - - -@_utils.memoize -def getPhases(debug): - def log(function): - """Logger that records which phase processes each token""" - type_names = dict((value, key) for key, value in - tokenTypes.items()) - - def wrapped(self, *args, **kwargs): - if function.__name__.startswith("process") and len(args) > 0: - token = args[0] - try: - info = {"type": type_names[token['type']]} - except: - raise - if token['type'] in tagTokenTypes: - info["name"] = token['name'] - - self.parser.log.append((self.parser.tokenizer.state.__name__, - self.parser.phase.__class__.__name__, - self.__class__.__name__, - function.__name__, - info)) - return function(self, *args, **kwargs) - else: - return function(self, *args, **kwargs) - return wrapped - - def getMetaclass(use_metaclass, metaclass_func): - if use_metaclass: - return method_decorator_metaclass(metaclass_func) - else: - return type - - # pylint:disable=unused-argument - class Phase(with_metaclass(getMetaclass(debug, log))): - """Base class for helper object that implements each phase of processing - """ - - def __init__(self, parser, tree): - self.parser = parser - self.tree = tree - - def processEOF(self): - raise NotImplementedError - - def processComment(self, token): - # For most phases the following is correct. Where it's not it will be - # overridden. - self.tree.insertComment(token, self.tree.openElements[-1]) - - def processDoctype(self, token): - self.parser.parseError("unexpected-doctype") - - def processCharacters(self, token): - self.tree.insertText(token["data"]) - - def processSpaceCharacters(self, token): - self.tree.insertText(token["data"]) - - def processStartTag(self, token): - return self.startTagHandler[token["name"]](token) - - def startTagHtml(self, token): - if not self.parser.firstStartTag and token["name"] == "html": - self.parser.parseError("non-html-root") - # XXX Need a check here to see if the first start tag token emitted is - # this token... If it's not, invoke self.parser.parseError(). - for attr, value in token["data"].items(): - if attr not in self.tree.openElements[0].attributes: - self.tree.openElements[0].attributes[attr] = value - self.parser.firstStartTag = False - - def processEndTag(self, token): - return self.endTagHandler[token["name"]](token) - - class InitialPhase(Phase): - def processSpaceCharacters(self, token): - pass - - def processComment(self, token): - self.tree.insertComment(token, self.tree.document) - - def processDoctype(self, token): - name = token["name"] - publicId = token["publicId"] - systemId = token["systemId"] - correct = token["correct"] - - if (name != "html" or publicId is not None or - systemId is not None and systemId != "about:legacy-compat"): - self.parser.parseError("unknown-doctype") - - if publicId is None: - publicId = "" - - self.tree.insertDoctype(token) - - if publicId != "": - publicId = publicId.translate(asciiUpper2Lower) - - if (not correct or token["name"] != "html" or - publicId.startswith( - ("+//silmaril//dtd html pro v0r11 19970101//", - "-//advasoft ltd//dtd html 3.0 aswedit + extensions//", - "-//as//dtd html 3.0 aswedit + extensions//", - "-//ietf//dtd html 2.0 level 1//", - "-//ietf//dtd html 2.0 level 2//", - "-//ietf//dtd html 2.0 strict level 1//", - "-//ietf//dtd html 2.0 strict level 2//", - "-//ietf//dtd html 2.0 strict//", - "-//ietf//dtd html 2.0//", - "-//ietf//dtd html 2.1e//", - "-//ietf//dtd html 3.0//", - "-//ietf//dtd html 3.2 final//", - "-//ietf//dtd html 3.2//", - "-//ietf//dtd html 3//", - "-//ietf//dtd html level 0//", - "-//ietf//dtd html level 1//", - "-//ietf//dtd html level 2//", - "-//ietf//dtd html level 3//", - "-//ietf//dtd html strict level 0//", - "-//ietf//dtd html strict level 1//", - "-//ietf//dtd html strict level 2//", - "-//ietf//dtd html strict level 3//", - "-//ietf//dtd html strict//", - "-//ietf//dtd html//", - "-//metrius//dtd metrius presentational//", - "-//microsoft//dtd internet explorer 2.0 html strict//", - "-//microsoft//dtd internet explorer 2.0 html//", - "-//microsoft//dtd internet explorer 2.0 tables//", - "-//microsoft//dtd internet explorer 3.0 html strict//", - "-//microsoft//dtd internet explorer 3.0 html//", - "-//microsoft//dtd internet explorer 3.0 tables//", - "-//netscape comm. corp.//dtd html//", - "-//netscape comm. corp.//dtd strict html//", - "-//o'reilly and associates//dtd html 2.0//", - "-//o'reilly and associates//dtd html extended 1.0//", - "-//o'reilly and associates//dtd html extended relaxed 1.0//", - "-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//", - "-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//", - "-//spyglass//dtd html 2.0 extended//", - "-//sq//dtd html 2.0 hotmetal + extensions//", - "-//sun microsystems corp.//dtd hotjava html//", - "-//sun microsystems corp.//dtd hotjava strict html//", - "-//w3c//dtd html 3 1995-03-24//", - "-//w3c//dtd html 3.2 draft//", - "-//w3c//dtd html 3.2 final//", - "-//w3c//dtd html 3.2//", - "-//w3c//dtd html 3.2s draft//", - "-//w3c//dtd html 4.0 frameset//", - "-//w3c//dtd html 4.0 transitional//", - "-//w3c//dtd html experimental 19960712//", - "-//w3c//dtd html experimental 970421//", - "-//w3c//dtd w3 html//", - "-//w3o//dtd w3 html 3.0//", - "-//webtechs//dtd mozilla html 2.0//", - "-//webtechs//dtd mozilla html//")) or - publicId in ("-//w3o//dtd w3 html strict 3.0//en//", - "-/w3c/dtd html 4.0 transitional/en", - "html") or - publicId.startswith( - ("-//w3c//dtd html 4.01 frameset//", - "-//w3c//dtd html 4.01 transitional//")) and - systemId is None or - systemId and systemId.lower() == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd"): - self.parser.compatMode = "quirks" - elif (publicId.startswith( - ("-//w3c//dtd xhtml 1.0 frameset//", - "-//w3c//dtd xhtml 1.0 transitional//")) or - publicId.startswith( - ("-//w3c//dtd html 4.01 frameset//", - "-//w3c//dtd html 4.01 transitional//")) and - systemId is not None): - self.parser.compatMode = "limited quirks" - - self.parser.phase = self.parser.phases["beforeHtml"] - - def anythingElse(self): - self.parser.compatMode = "quirks" - self.parser.phase = self.parser.phases["beforeHtml"] - - def processCharacters(self, token): - self.parser.parseError("expected-doctype-but-got-chars") - self.anythingElse() - return token - - def processStartTag(self, token): - self.parser.parseError("expected-doctype-but-got-start-tag", - {"name": token["name"]}) - self.anythingElse() - return token - - def processEndTag(self, token): - self.parser.parseError("expected-doctype-but-got-end-tag", - {"name": token["name"]}) - self.anythingElse() - return token - - def processEOF(self): - self.parser.parseError("expected-doctype-but-got-eof") - self.anythingElse() - return True - - class BeforeHtmlPhase(Phase): - # helper methods - def insertHtmlElement(self): - self.tree.insertRoot(impliedTagToken("html", "StartTag")) - self.parser.phase = self.parser.phases["beforeHead"] - - # other - def processEOF(self): - self.insertHtmlElement() - return True - - def processComment(self, token): - self.tree.insertComment(token, self.tree.document) - - def processSpaceCharacters(self, token): - pass - - def processCharacters(self, token): - self.insertHtmlElement() - return token - - def processStartTag(self, token): - if token["name"] == "html": - self.parser.firstStartTag = True - self.insertHtmlElement() - return token - - def processEndTag(self, token): - if token["name"] not in ("head", "body", "html", "br"): - self.parser.parseError("unexpected-end-tag-before-html", - {"name": token["name"]}) - else: - self.insertHtmlElement() - return token - - class BeforeHeadPhase(Phase): - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - ("head", self.startTagHead) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - (("head", "body", "html", "br"), self.endTagImplyHead) - ]) - self.endTagHandler.default = self.endTagOther - - def processEOF(self): - self.startTagHead(impliedTagToken("head", "StartTag")) - return True - - def processSpaceCharacters(self, token): - pass - - def processCharacters(self, token): - self.startTagHead(impliedTagToken("head", "StartTag")) - return token - - def startTagHtml(self, token): - return self.parser.phases["inBody"].processStartTag(token) - - def startTagHead(self, token): - self.tree.insertElement(token) - self.tree.headPointer = self.tree.openElements[-1] - self.parser.phase = self.parser.phases["inHead"] - - def startTagOther(self, token): - self.startTagHead(impliedTagToken("head", "StartTag")) - return token - - def endTagImplyHead(self, token): - self.startTagHead(impliedTagToken("head", "StartTag")) - return token - - def endTagOther(self, token): - self.parser.parseError("end-tag-after-implied-root", - {"name": token["name"]}) - - class InHeadPhase(Phase): - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - ("title", self.startTagTitle), - (("noframes", "style"), self.startTagNoFramesStyle), - ("noscript", self.startTagNoscript), - ("script", self.startTagScript), - (("base", "basefont", "bgsound", "command", "link"), - self.startTagBaseLinkCommand), - ("meta", self.startTagMeta), - ("head", self.startTagHead) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - ("head", self.endTagHead), - (("br", "html", "body"), self.endTagHtmlBodyBr) - ]) - self.endTagHandler.default = self.endTagOther - - # the real thing - def processEOF(self): - self.anythingElse() - return True - - def processCharacters(self, token): - self.anythingElse() - return token - - def startTagHtml(self, token): - return self.parser.phases["inBody"].processStartTag(token) - - def startTagHead(self, token): - self.parser.parseError("two-heads-are-not-better-than-one") - - def startTagBaseLinkCommand(self, token): - self.tree.insertElement(token) - self.tree.openElements.pop() - token["selfClosingAcknowledged"] = True - - def startTagMeta(self, token): - self.tree.insertElement(token) - self.tree.openElements.pop() - token["selfClosingAcknowledged"] = True - - attributes = token["data"] - if self.parser.tokenizer.stream.charEncoding[1] == "tentative": - if "charset" in attributes: - self.parser.tokenizer.stream.changeEncoding(attributes["charset"]) - elif ("content" in attributes and - "http-equiv" in attributes and - attributes["http-equiv"].lower() == "content-type"): - # Encoding it as UTF-8 here is a hack, as really we should pass - # the abstract Unicode string, and just use the - # ContentAttrParser on that, but using UTF-8 allows all chars - # to be encoded and as a ASCII-superset works. - data = _inputstream.EncodingBytes(attributes["content"].encode("utf-8")) - parser = _inputstream.ContentAttrParser(data) - codec = parser.parse() - self.parser.tokenizer.stream.changeEncoding(codec) - - def startTagTitle(self, token): - self.parser.parseRCDataRawtext(token, "RCDATA") - - def startTagNoFramesStyle(self, token): - # Need to decide whether to implement the scripting-disabled case - self.parser.parseRCDataRawtext(token, "RAWTEXT") - - def startTagNoscript(self, token): - if self.parser.scripting: - self.parser.parseRCDataRawtext(token, "RAWTEXT") - else: - self.tree.insertElement(token) - self.parser.phase = self.parser.phases["inHeadNoscript"] - - def startTagScript(self, token): - self.tree.insertElement(token) - self.parser.tokenizer.state = self.parser.tokenizer.scriptDataState - self.parser.originalPhase = self.parser.phase - self.parser.phase = self.parser.phases["text"] - - def startTagOther(self, token): - self.anythingElse() - return token - - def endTagHead(self, token): - node = self.parser.tree.openElements.pop() - assert node.name == "head", "Expected head got %s" % node.name - self.parser.phase = self.parser.phases["afterHead"] - - def endTagHtmlBodyBr(self, token): - self.anythingElse() - return token - - def endTagOther(self, token): - self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) - - def anythingElse(self): - self.endTagHead(impliedTagToken("head")) - - class InHeadNoscriptPhase(Phase): - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - (("basefont", "bgsound", "link", "meta", "noframes", "style"), self.startTagBaseLinkCommand), - (("head", "noscript"), self.startTagHeadNoscript), - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - ("noscript", self.endTagNoscript), - ("br", self.endTagBr), - ]) - self.endTagHandler.default = self.endTagOther - - def processEOF(self): - self.parser.parseError("eof-in-head-noscript") - self.anythingElse() - return True - - def processComment(self, token): - return self.parser.phases["inHead"].processComment(token) - - def processCharacters(self, token): - self.parser.parseError("char-in-head-noscript") - self.anythingElse() - return token - - def processSpaceCharacters(self, token): - return self.parser.phases["inHead"].processSpaceCharacters(token) - - def startTagHtml(self, token): - return self.parser.phases["inBody"].processStartTag(token) - - def startTagBaseLinkCommand(self, token): - return self.parser.phases["inHead"].processStartTag(token) - - def startTagHeadNoscript(self, token): - self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) - - def startTagOther(self, token): - self.parser.parseError("unexpected-inhead-noscript-tag", {"name": token["name"]}) - self.anythingElse() - return token - - def endTagNoscript(self, token): - node = self.parser.tree.openElements.pop() - assert node.name == "noscript", "Expected noscript got %s" % node.name - self.parser.phase = self.parser.phases["inHead"] - - def endTagBr(self, token): - self.parser.parseError("unexpected-inhead-noscript-tag", {"name": token["name"]}) - self.anythingElse() - return token - - def endTagOther(self, token): - self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) - - def anythingElse(self): - # Caller must raise parse error first! - self.endTagNoscript(impliedTagToken("noscript")) - - class AfterHeadPhase(Phase): - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - ("body", self.startTagBody), - ("frameset", self.startTagFrameset), - (("base", "basefont", "bgsound", "link", "meta", "noframes", "script", - "style", "title"), - self.startTagFromHead), - ("head", self.startTagHead) - ]) - self.startTagHandler.default = self.startTagOther - self.endTagHandler = _utils.MethodDispatcher([(("body", "html", "br"), - self.endTagHtmlBodyBr)]) - self.endTagHandler.default = self.endTagOther - - def processEOF(self): - self.anythingElse() - return True - - def processCharacters(self, token): - self.anythingElse() - return token - - def startTagHtml(self, token): - return self.parser.phases["inBody"].processStartTag(token) - - def startTagBody(self, token): - self.parser.framesetOK = False - self.tree.insertElement(token) - self.parser.phase = self.parser.phases["inBody"] - - def startTagFrameset(self, token): - self.tree.insertElement(token) - self.parser.phase = self.parser.phases["inFrameset"] - - def startTagFromHead(self, token): - self.parser.parseError("unexpected-start-tag-out-of-my-head", - {"name": token["name"]}) - self.tree.openElements.append(self.tree.headPointer) - self.parser.phases["inHead"].processStartTag(token) - for node in self.tree.openElements[::-1]: - if node.name == "head": - self.tree.openElements.remove(node) - break - - def startTagHead(self, token): - self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) - - def startTagOther(self, token): - self.anythingElse() - return token - - def endTagHtmlBodyBr(self, token): - self.anythingElse() - return token - - def endTagOther(self, token): - self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) - - def anythingElse(self): - self.tree.insertElement(impliedTagToken("body", "StartTag")) - self.parser.phase = self.parser.phases["inBody"] - self.parser.framesetOK = True - - class InBodyPhase(Phase): - # http://www.whatwg.org/specs/web-apps/current-work/#parsing-main-inbody - # the really-really-really-very crazy mode - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - # Set this to the default handler - self.processSpaceCharacters = self.processSpaceCharactersNonPre - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - (("base", "basefont", "bgsound", "command", "link", "meta", - "script", "style", "title"), - self.startTagProcessInHead), - ("body", self.startTagBody), - ("frameset", self.startTagFrameset), - (("address", "article", "aside", "blockquote", "center", "details", - "dir", "div", "dl", "fieldset", "figcaption", "figure", - "footer", "header", "hgroup", "main", "menu", "nav", "ol", "p", - "section", "summary", "ul"), - self.startTagCloseP), - (headingElements, self.startTagHeading), - (("pre", "listing"), self.startTagPreListing), - ("form", self.startTagForm), - (("li", "dd", "dt"), self.startTagListItem), - ("plaintext", self.startTagPlaintext), - ("a", self.startTagA), - (("b", "big", "code", "em", "font", "i", "s", "small", "strike", - "strong", "tt", "u"), self.startTagFormatting), - ("nobr", self.startTagNobr), - ("button", self.startTagButton), - (("applet", "marquee", "object"), self.startTagAppletMarqueeObject), - ("xmp", self.startTagXmp), - ("table", self.startTagTable), - (("area", "br", "embed", "img", "keygen", "wbr"), - self.startTagVoidFormatting), - (("param", "source", "track"), self.startTagParamSource), - ("input", self.startTagInput), - ("hr", self.startTagHr), - ("image", self.startTagImage), - ("isindex", self.startTagIsIndex), - ("textarea", self.startTagTextarea), - ("iframe", self.startTagIFrame), - ("noscript", self.startTagNoscript), - (("noembed", "noframes"), self.startTagRawtext), - ("select", self.startTagSelect), - (("rp", "rt"), self.startTagRpRt), - (("option", "optgroup"), self.startTagOpt), - (("math"), self.startTagMath), - (("svg"), self.startTagSvg), - (("caption", "col", "colgroup", "frame", "head", - "tbody", "td", "tfoot", "th", "thead", - "tr"), self.startTagMisplaced) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - ("body", self.endTagBody), - ("html", self.endTagHtml), - (("address", "article", "aside", "blockquote", "button", "center", - "details", "dialog", "dir", "div", "dl", "fieldset", "figcaption", "figure", - "footer", "header", "hgroup", "listing", "main", "menu", "nav", "ol", "pre", - "section", "summary", "ul"), self.endTagBlock), - ("form", self.endTagForm), - ("p", self.endTagP), - (("dd", "dt", "li"), self.endTagListItem), - (headingElements, self.endTagHeading), - (("a", "b", "big", "code", "em", "font", "i", "nobr", "s", "small", - "strike", "strong", "tt", "u"), self.endTagFormatting), - (("applet", "marquee", "object"), self.endTagAppletMarqueeObject), - ("br", self.endTagBr), - ]) - self.endTagHandler.default = self.endTagOther - - def isMatchingFormattingElement(self, node1, node2): - return (node1.name == node2.name and - node1.namespace == node2.namespace and - node1.attributes == node2.attributes) - - # helper - def addFormattingElement(self, token): - self.tree.insertElement(token) - element = self.tree.openElements[-1] - - matchingElements = [] - for node in self.tree.activeFormattingElements[::-1]: - if node is Marker: - break - elif self.isMatchingFormattingElement(node, element): - matchingElements.append(node) - - assert len(matchingElements) <= 3 - if len(matchingElements) == 3: - self.tree.activeFormattingElements.remove(matchingElements[-1]) - self.tree.activeFormattingElements.append(element) - - # the real deal - def processEOF(self): - allowed_elements = frozenset(("dd", "dt", "li", "p", "tbody", "td", - "tfoot", "th", "thead", "tr", "body", - "html")) - for node in self.tree.openElements[::-1]: - if node.name not in allowed_elements: - self.parser.parseError("expected-closing-tag-but-got-eof") - break - # Stop parsing - - def processSpaceCharactersDropNewline(self, token): - # Sometimes (start of <pre>, <listing>, and <textarea> blocks) we - # want to drop leading newlines - data = token["data"] - self.processSpaceCharacters = self.processSpaceCharactersNonPre - if (data.startswith("\n") and - self.tree.openElements[-1].name in ("pre", "listing", "textarea") and - not self.tree.openElements[-1].hasContent()): - data = data[1:] - if data: - self.tree.reconstructActiveFormattingElements() - self.tree.insertText(data) - - def processCharacters(self, token): - if token["data"] == "\u0000": - # The tokenizer should always emit null on its own - return - self.tree.reconstructActiveFormattingElements() - self.tree.insertText(token["data"]) - # This must be bad for performance - if (self.parser.framesetOK and - any([char not in spaceCharacters - for char in token["data"]])): - self.parser.framesetOK = False - - def processSpaceCharactersNonPre(self, token): - self.tree.reconstructActiveFormattingElements() - self.tree.insertText(token["data"]) - - def startTagProcessInHead(self, token): - return self.parser.phases["inHead"].processStartTag(token) - - def startTagBody(self, token): - self.parser.parseError("unexpected-start-tag", {"name": "body"}) - if (len(self.tree.openElements) == 1 or - self.tree.openElements[1].name != "body"): - assert self.parser.innerHTML - else: - self.parser.framesetOK = False - for attr, value in token["data"].items(): - if attr not in self.tree.openElements[1].attributes: - self.tree.openElements[1].attributes[attr] = value - - def startTagFrameset(self, token): - self.parser.parseError("unexpected-start-tag", {"name": "frameset"}) - if (len(self.tree.openElements) == 1 or self.tree.openElements[1].name != "body"): - assert self.parser.innerHTML - elif not self.parser.framesetOK: - pass - else: - if self.tree.openElements[1].parent: - self.tree.openElements[1].parent.removeChild(self.tree.openElements[1]) - while self.tree.openElements[-1].name != "html": - self.tree.openElements.pop() - self.tree.insertElement(token) - self.parser.phase = self.parser.phases["inFrameset"] - - def startTagCloseP(self, token): - if self.tree.elementInScope("p", variant="button"): - self.endTagP(impliedTagToken("p")) - self.tree.insertElement(token) - - def startTagPreListing(self, token): - if self.tree.elementInScope("p", variant="button"): - self.endTagP(impliedTagToken("p")) - self.tree.insertElement(token) - self.parser.framesetOK = False - self.processSpaceCharacters = self.processSpaceCharactersDropNewline - - def startTagForm(self, token): - if self.tree.formPointer: - self.parser.parseError("unexpected-start-tag", {"name": "form"}) - else: - if self.tree.elementInScope("p", variant="button"): - self.endTagP(impliedTagToken("p")) - self.tree.insertElement(token) - self.tree.formPointer = self.tree.openElements[-1] - - def startTagListItem(self, token): - self.parser.framesetOK = False - - stopNamesMap = {"li": ["li"], - "dt": ["dt", "dd"], - "dd": ["dt", "dd"]} - stopNames = stopNamesMap[token["name"]] - for node in reversed(self.tree.openElements): - if node.name in stopNames: - self.parser.phase.processEndTag( - impliedTagToken(node.name, "EndTag")) - break - if (node.nameTuple in specialElements and - node.name not in ("address", "div", "p")): - break - - if self.tree.elementInScope("p", variant="button"): - self.parser.phase.processEndTag( - impliedTagToken("p", "EndTag")) - - self.tree.insertElement(token) - - def startTagPlaintext(self, token): - if self.tree.elementInScope("p", variant="button"): - self.endTagP(impliedTagToken("p")) - self.tree.insertElement(token) - self.parser.tokenizer.state = self.parser.tokenizer.plaintextState - - def startTagHeading(self, token): - if self.tree.elementInScope("p", variant="button"): - self.endTagP(impliedTagToken("p")) - if self.tree.openElements[-1].name in headingElements: - self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) - self.tree.openElements.pop() - self.tree.insertElement(token) - - def startTagA(self, token): - afeAElement = self.tree.elementInActiveFormattingElements("a") - if afeAElement: - self.parser.parseError("unexpected-start-tag-implies-end-tag", - {"startName": "a", "endName": "a"}) - self.endTagFormatting(impliedTagToken("a")) - if afeAElement in self.tree.openElements: - self.tree.openElements.remove(afeAElement) - if afeAElement in self.tree.activeFormattingElements: - self.tree.activeFormattingElements.remove(afeAElement) - self.tree.reconstructActiveFormattingElements() - self.addFormattingElement(token) - - def startTagFormatting(self, token): - self.tree.reconstructActiveFormattingElements() - self.addFormattingElement(token) - - def startTagNobr(self, token): - self.tree.reconstructActiveFormattingElements() - if self.tree.elementInScope("nobr"): - self.parser.parseError("unexpected-start-tag-implies-end-tag", - {"startName": "nobr", "endName": "nobr"}) - self.processEndTag(impliedTagToken("nobr")) - # XXX Need tests that trigger the following - self.tree.reconstructActiveFormattingElements() - self.addFormattingElement(token) - - def startTagButton(self, token): - if self.tree.elementInScope("button"): - self.parser.parseError("unexpected-start-tag-implies-end-tag", - {"startName": "button", "endName": "button"}) - self.processEndTag(impliedTagToken("button")) - return token - else: - self.tree.reconstructActiveFormattingElements() - self.tree.insertElement(token) - self.parser.framesetOK = False - - def startTagAppletMarqueeObject(self, token): - self.tree.reconstructActiveFormattingElements() - self.tree.insertElement(token) - self.tree.activeFormattingElements.append(Marker) - self.parser.framesetOK = False - - def startTagXmp(self, token): - if self.tree.elementInScope("p", variant="button"): - self.endTagP(impliedTagToken("p")) - self.tree.reconstructActiveFormattingElements() - self.parser.framesetOK = False - self.parser.parseRCDataRawtext(token, "RAWTEXT") - - def startTagTable(self, token): - if self.parser.compatMode != "quirks": - if self.tree.elementInScope("p", variant="button"): - self.processEndTag(impliedTagToken("p")) - self.tree.insertElement(token) - self.parser.framesetOK = False - self.parser.phase = self.parser.phases["inTable"] - - def startTagVoidFormatting(self, token): - self.tree.reconstructActiveFormattingElements() - self.tree.insertElement(token) - self.tree.openElements.pop() - token["selfClosingAcknowledged"] = True - self.parser.framesetOK = False - - def startTagInput(self, token): - framesetOK = self.parser.framesetOK - self.startTagVoidFormatting(token) - if ("type" in token["data"] and - token["data"]["type"].translate(asciiUpper2Lower) == "hidden"): - # input type=hidden doesn't change framesetOK - self.parser.framesetOK = framesetOK - - def startTagParamSource(self, token): - self.tree.insertElement(token) - self.tree.openElements.pop() - token["selfClosingAcknowledged"] = True - - def startTagHr(self, token): - if self.tree.elementInScope("p", variant="button"): - self.endTagP(impliedTagToken("p")) - self.tree.insertElement(token) - self.tree.openElements.pop() - token["selfClosingAcknowledged"] = True - self.parser.framesetOK = False - - def startTagImage(self, token): - # No really... - self.parser.parseError("unexpected-start-tag-treated-as", - {"originalName": "image", "newName": "img"}) - self.processStartTag(impliedTagToken("img", "StartTag", - attributes=token["data"], - selfClosing=token["selfClosing"])) - - def startTagIsIndex(self, token): - self.parser.parseError("deprecated-tag", {"name": "isindex"}) - if self.tree.formPointer: - return - form_attrs = {} - if "action" in token["data"]: - form_attrs["action"] = token["data"]["action"] - self.processStartTag(impliedTagToken("form", "StartTag", - attributes=form_attrs)) - self.processStartTag(impliedTagToken("hr", "StartTag")) - self.processStartTag(impliedTagToken("label", "StartTag")) - # XXX Localization ... - if "prompt" in token["data"]: - prompt = token["data"]["prompt"] - else: - prompt = "This is a searchable index. Enter search keywords: " - self.processCharacters( - {"type": tokenTypes["Characters"], "data": prompt}) - attributes = token["data"].copy() - if "action" in attributes: - del attributes["action"] - if "prompt" in attributes: - del attributes["prompt"] - attributes["name"] = "isindex" - self.processStartTag(impliedTagToken("input", "StartTag", - attributes=attributes, - selfClosing=token["selfClosing"])) - self.processEndTag(impliedTagToken("label")) - self.processStartTag(impliedTagToken("hr", "StartTag")) - self.processEndTag(impliedTagToken("form")) - - def startTagTextarea(self, token): - self.tree.insertElement(token) - self.parser.tokenizer.state = self.parser.tokenizer.rcdataState - self.processSpaceCharacters = self.processSpaceCharactersDropNewline - self.parser.framesetOK = False - - def startTagIFrame(self, token): - self.parser.framesetOK = False - self.startTagRawtext(token) - - def startTagNoscript(self, token): - if self.parser.scripting: - self.startTagRawtext(token) - else: - self.startTagOther(token) - - def startTagRawtext(self, token): - """iframe, noembed noframes, noscript(if scripting enabled)""" - self.parser.parseRCDataRawtext(token, "RAWTEXT") - - def startTagOpt(self, token): - if self.tree.openElements[-1].name == "option": - self.parser.phase.processEndTag(impliedTagToken("option")) - self.tree.reconstructActiveFormattingElements() - self.parser.tree.insertElement(token) - - def startTagSelect(self, token): - self.tree.reconstructActiveFormattingElements() - self.tree.insertElement(token) - self.parser.framesetOK = False - if self.parser.phase in (self.parser.phases["inTable"], - self.parser.phases["inCaption"], - self.parser.phases["inColumnGroup"], - self.parser.phases["inTableBody"], - self.parser.phases["inRow"], - self.parser.phases["inCell"]): - self.parser.phase = self.parser.phases["inSelectInTable"] - else: - self.parser.phase = self.parser.phases["inSelect"] - - def startTagRpRt(self, token): - if self.tree.elementInScope("ruby"): - self.tree.generateImpliedEndTags() - if self.tree.openElements[-1].name != "ruby": - self.parser.parseError() - self.tree.insertElement(token) - - def startTagMath(self, token): - self.tree.reconstructActiveFormattingElements() - self.parser.adjustMathMLAttributes(token) - self.parser.adjustForeignAttributes(token) - token["namespace"] = namespaces["mathml"] - self.tree.insertElement(token) - # Need to get the parse error right for the case where the token - # has a namespace not equal to the xmlns attribute - if token["selfClosing"]: - self.tree.openElements.pop() - token["selfClosingAcknowledged"] = True - - def startTagSvg(self, token): - self.tree.reconstructActiveFormattingElements() - self.parser.adjustSVGAttributes(token) - self.parser.adjustForeignAttributes(token) - token["namespace"] = namespaces["svg"] - self.tree.insertElement(token) - # Need to get the parse error right for the case where the token - # has a namespace not equal to the xmlns attribute - if token["selfClosing"]: - self.tree.openElements.pop() - token["selfClosingAcknowledged"] = True - - def startTagMisplaced(self, token): - """ Elements that should be children of other elements that have a - different insertion mode; here they are ignored - "caption", "col", "colgroup", "frame", "frameset", "head", - "option", "optgroup", "tbody", "td", "tfoot", "th", "thead", - "tr", "noscript" - """ - self.parser.parseError("unexpected-start-tag-ignored", {"name": token["name"]}) - - def startTagOther(self, token): - self.tree.reconstructActiveFormattingElements() - self.tree.insertElement(token) - - def endTagP(self, token): - if not self.tree.elementInScope("p", variant="button"): - self.startTagCloseP(impliedTagToken("p", "StartTag")) - self.parser.parseError("unexpected-end-tag", {"name": "p"}) - self.endTagP(impliedTagToken("p", "EndTag")) - else: - self.tree.generateImpliedEndTags("p") - if self.tree.openElements[-1].name != "p": - self.parser.parseError("unexpected-end-tag", {"name": "p"}) - node = self.tree.openElements.pop() - while node.name != "p": - node = self.tree.openElements.pop() - - def endTagBody(self, token): - if not self.tree.elementInScope("body"): - self.parser.parseError() - return - elif self.tree.openElements[-1].name != "body": - for node in self.tree.openElements[2:]: - if node.name not in frozenset(("dd", "dt", "li", "optgroup", - "option", "p", "rp", "rt", - "tbody", "td", "tfoot", - "th", "thead", "tr", "body", - "html")): - # Not sure this is the correct name for the parse error - self.parser.parseError( - "expected-one-end-tag-but-got-another", - {"gotName": "body", "expectedName": node.name}) - break - self.parser.phase = self.parser.phases["afterBody"] - - def endTagHtml(self, token): - # We repeat the test for the body end tag token being ignored here - if self.tree.elementInScope("body"): - self.endTagBody(impliedTagToken("body")) - return token - - def endTagBlock(self, token): - # Put us back in the right whitespace handling mode - if token["name"] == "pre": - self.processSpaceCharacters = self.processSpaceCharactersNonPre - inScope = self.tree.elementInScope(token["name"]) - if inScope: - self.tree.generateImpliedEndTags() - if self.tree.openElements[-1].name != token["name"]: - self.parser.parseError("end-tag-too-early", {"name": token["name"]}) - if inScope: - node = self.tree.openElements.pop() - while node.name != token["name"]: - node = self.tree.openElements.pop() - - def endTagForm(self, token): - node = self.tree.formPointer - self.tree.formPointer = None - if node is None or not self.tree.elementInScope(node): - self.parser.parseError("unexpected-end-tag", - {"name": "form"}) - else: - self.tree.generateImpliedEndTags() - if self.tree.openElements[-1] != node: - self.parser.parseError("end-tag-too-early-ignored", - {"name": "form"}) - self.tree.openElements.remove(node) - - def endTagListItem(self, token): - if token["name"] == "li": - variant = "list" - else: - variant = None - if not self.tree.elementInScope(token["name"], variant=variant): - self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) - else: - self.tree.generateImpliedEndTags(exclude=token["name"]) - if self.tree.openElements[-1].name != token["name"]: - self.parser.parseError( - "end-tag-too-early", - {"name": token["name"]}) - node = self.tree.openElements.pop() - while node.name != token["name"]: - node = self.tree.openElements.pop() - - def endTagHeading(self, token): - for item in headingElements: - if self.tree.elementInScope(item): - self.tree.generateImpliedEndTags() - break - if self.tree.openElements[-1].name != token["name"]: - self.parser.parseError("end-tag-too-early", {"name": token["name"]}) - - for item in headingElements: - if self.tree.elementInScope(item): - item = self.tree.openElements.pop() - while item.name not in headingElements: - item = self.tree.openElements.pop() - break - - def endTagFormatting(self, token): - """The much-feared adoption agency algorithm""" - # http://svn.whatwg.org/webapps/complete.html#adoptionAgency revision 7867 - # XXX Better parseError messages appreciated. - - # Step 1 - outerLoopCounter = 0 - - # Step 2 - while outerLoopCounter < 8: - - # Step 3 - outerLoopCounter += 1 - - # Step 4: - - # Let the formatting element be the last element in - # the list of active formatting elements that: - # - is between the end of the list and the last scope - # marker in the list, if any, or the start of the list - # otherwise, and - # - has the same tag name as the token. - formattingElement = self.tree.elementInActiveFormattingElements( - token["name"]) - if (not formattingElement or - (formattingElement in self.tree.openElements and - not self.tree.elementInScope(formattingElement.name))): - # If there is no such node, then abort these steps - # and instead act as described in the "any other - # end tag" entry below. - self.endTagOther(token) - return - - # Otherwise, if there is such a node, but that node is - # not in the stack of open elements, then this is a - # parse error; remove the element from the list, and - # abort these steps. - elif formattingElement not in self.tree.openElements: - self.parser.parseError("adoption-agency-1.2", {"name": token["name"]}) - self.tree.activeFormattingElements.remove(formattingElement) - return - - # Otherwise, if there is such a node, and that node is - # also in the stack of open elements, but the element - # is not in scope, then this is a parse error; ignore - # the token, and abort these steps. - elif not self.tree.elementInScope(formattingElement.name): - self.parser.parseError("adoption-agency-4.4", {"name": token["name"]}) - return - - # Otherwise, there is a formatting element and that - # element is in the stack and is in scope. If the - # element is not the current node, this is a parse - # error. In any case, proceed with the algorithm as - # written in the following steps. - else: - if formattingElement != self.tree.openElements[-1]: - self.parser.parseError("adoption-agency-1.3", {"name": token["name"]}) - - # Step 5: - - # Let the furthest block be the topmost node in the - # stack of open elements that is lower in the stack - # than the formatting element, and is an element in - # the special category. There might not be one. - afeIndex = self.tree.openElements.index(formattingElement) - furthestBlock = None - for element in self.tree.openElements[afeIndex:]: - if element.nameTuple in specialElements: - furthestBlock = element - break - - # Step 6: - - # If there is no furthest block, then the UA must - # first pop all the nodes from the bottom of the stack - # of open elements, from the current node up to and - # including the formatting element, then remove the - # formatting element from the list of active - # formatting elements, and finally abort these steps. - if furthestBlock is None: - element = self.tree.openElements.pop() - while element != formattingElement: - element = self.tree.openElements.pop() - self.tree.activeFormattingElements.remove(element) - return - - # Step 7 - commonAncestor = self.tree.openElements[afeIndex - 1] - - # Step 8: - # The bookmark is supposed to help us identify where to reinsert - # nodes in step 15. We have to ensure that we reinsert nodes after - # the node before the active formatting element. Note the bookmark - # can move in step 9.7 - bookmark = self.tree.activeFormattingElements.index(formattingElement) - - # Step 9 - lastNode = node = furthestBlock - innerLoopCounter = 0 - - index = self.tree.openElements.index(node) - while innerLoopCounter < 3: - innerLoopCounter += 1 - # Node is element before node in open elements - index -= 1 - node = self.tree.openElements[index] - if node not in self.tree.activeFormattingElements: - self.tree.openElements.remove(node) - continue - # Step 9.6 - if node == formattingElement: - break - # Step 9.7 - if lastNode == furthestBlock: - bookmark = self.tree.activeFormattingElements.index(node) + 1 - # Step 9.8 - clone = node.cloneNode() - # Replace node with clone - self.tree.activeFormattingElements[ - self.tree.activeFormattingElements.index(node)] = clone - self.tree.openElements[ - self.tree.openElements.index(node)] = clone - node = clone - # Step 9.9 - # Remove lastNode from its parents, if any - if lastNode.parent: - lastNode.parent.removeChild(lastNode) - node.appendChild(lastNode) - # Step 9.10 - lastNode = node - - # Step 10 - # Foster parent lastNode if commonAncestor is a - # table, tbody, tfoot, thead, or tr we need to foster - # parent the lastNode - if lastNode.parent: - lastNode.parent.removeChild(lastNode) - - if commonAncestor.name in frozenset(("table", "tbody", "tfoot", "thead", "tr")): - parent, insertBefore = self.tree.getTableMisnestedNodePosition() - parent.insertBefore(lastNode, insertBefore) - else: - commonAncestor.appendChild(lastNode) - - # Step 11 - clone = formattingElement.cloneNode() - - # Step 12 - furthestBlock.reparentChildren(clone) - - # Step 13 - furthestBlock.appendChild(clone) - - # Step 14 - self.tree.activeFormattingElements.remove(formattingElement) - self.tree.activeFormattingElements.insert(bookmark, clone) - - # Step 15 - self.tree.openElements.remove(formattingElement) - self.tree.openElements.insert( - self.tree.openElements.index(furthestBlock) + 1, clone) - - def endTagAppletMarqueeObject(self, token): - if self.tree.elementInScope(token["name"]): - self.tree.generateImpliedEndTags() - if self.tree.openElements[-1].name != token["name"]: - self.parser.parseError("end-tag-too-early", {"name": token["name"]}) - - if self.tree.elementInScope(token["name"]): - element = self.tree.openElements.pop() - while element.name != token["name"]: - element = self.tree.openElements.pop() - self.tree.clearActiveFormattingElements() - - def endTagBr(self, token): - self.parser.parseError("unexpected-end-tag-treated-as", - {"originalName": "br", "newName": "br element"}) - self.tree.reconstructActiveFormattingElements() - self.tree.insertElement(impliedTagToken("br", "StartTag")) - self.tree.openElements.pop() - - def endTagOther(self, token): - for node in self.tree.openElements[::-1]: - if node.name == token["name"]: - self.tree.generateImpliedEndTags(exclude=token["name"]) - if self.tree.openElements[-1].name != token["name"]: - self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) - while self.tree.openElements.pop() != node: - pass - break - else: - if node.nameTuple in specialElements: - self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) - break - - class TextPhase(Phase): - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - self.startTagHandler = _utils.MethodDispatcher([]) - self.startTagHandler.default = self.startTagOther - self.endTagHandler = _utils.MethodDispatcher([ - ("script", self.endTagScript)]) - self.endTagHandler.default = self.endTagOther - - def processCharacters(self, token): - self.tree.insertText(token["data"]) - - def processEOF(self): - self.parser.parseError("expected-named-closing-tag-but-got-eof", - {"name": self.tree.openElements[-1].name}) - self.tree.openElements.pop() - self.parser.phase = self.parser.originalPhase - return True - - def startTagOther(self, token): - assert False, "Tried to process start tag %s in RCDATA/RAWTEXT mode" % token['name'] - - def endTagScript(self, token): - node = self.tree.openElements.pop() - assert node.name == "script" - self.parser.phase = self.parser.originalPhase - # The rest of this method is all stuff that only happens if - # document.write works - - def endTagOther(self, token): - self.tree.openElements.pop() - self.parser.phase = self.parser.originalPhase - - class InTablePhase(Phase): - # http://www.whatwg.org/specs/web-apps/current-work/#in-table - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - ("caption", self.startTagCaption), - ("colgroup", self.startTagColgroup), - ("col", self.startTagCol), - (("tbody", "tfoot", "thead"), self.startTagRowGroup), - (("td", "th", "tr"), self.startTagImplyTbody), - ("table", self.startTagTable), - (("style", "script"), self.startTagStyleScript), - ("input", self.startTagInput), - ("form", self.startTagForm) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - ("table", self.endTagTable), - (("body", "caption", "col", "colgroup", "html", "tbody", "td", - "tfoot", "th", "thead", "tr"), self.endTagIgnore) - ]) - self.endTagHandler.default = self.endTagOther - - # helper methods - def clearStackToTableContext(self): - # "clear the stack back to a table context" - while self.tree.openElements[-1].name not in ("table", "html"): - # self.parser.parseError("unexpected-implied-end-tag-in-table", - # {"name": self.tree.openElements[-1].name}) - self.tree.openElements.pop() - # When the current node is <html> it's an innerHTML case - - # processing methods - def processEOF(self): - if self.tree.openElements[-1].name != "html": - self.parser.parseError("eof-in-table") - else: - assert self.parser.innerHTML - # Stop parsing - - def processSpaceCharacters(self, token): - originalPhase = self.parser.phase - self.parser.phase = self.parser.phases["inTableText"] - self.parser.phase.originalPhase = originalPhase - self.parser.phase.processSpaceCharacters(token) - - def processCharacters(self, token): - originalPhase = self.parser.phase - self.parser.phase = self.parser.phases["inTableText"] - self.parser.phase.originalPhase = originalPhase - self.parser.phase.processCharacters(token) - - def insertText(self, token): - # If we get here there must be at least one non-whitespace character - # Do the table magic! - self.tree.insertFromTable = True - self.parser.phases["inBody"].processCharacters(token) - self.tree.insertFromTable = False - - def startTagCaption(self, token): - self.clearStackToTableContext() - self.tree.activeFormattingElements.append(Marker) - self.tree.insertElement(token) - self.parser.phase = self.parser.phases["inCaption"] - - def startTagColgroup(self, token): - self.clearStackToTableContext() - self.tree.insertElement(token) - self.parser.phase = self.parser.phases["inColumnGroup"] - - def startTagCol(self, token): - self.startTagColgroup(impliedTagToken("colgroup", "StartTag")) - return token - - def startTagRowGroup(self, token): - self.clearStackToTableContext() - self.tree.insertElement(token) - self.parser.phase = self.parser.phases["inTableBody"] - - def startTagImplyTbody(self, token): - self.startTagRowGroup(impliedTagToken("tbody", "StartTag")) - return token - - def startTagTable(self, token): - self.parser.parseError("unexpected-start-tag-implies-end-tag", - {"startName": "table", "endName": "table"}) - self.parser.phase.processEndTag(impliedTagToken("table")) - if not self.parser.innerHTML: - return token - - def startTagStyleScript(self, token): - return self.parser.phases["inHead"].processStartTag(token) - - def startTagInput(self, token): - if ("type" in token["data"] and - token["data"]["type"].translate(asciiUpper2Lower) == "hidden"): - self.parser.parseError("unexpected-hidden-input-in-table") - self.tree.insertElement(token) - # XXX associate with form - self.tree.openElements.pop() - else: - self.startTagOther(token) - - def startTagForm(self, token): - self.parser.parseError("unexpected-form-in-table") - if self.tree.formPointer is None: - self.tree.insertElement(token) - self.tree.formPointer = self.tree.openElements[-1] - self.tree.openElements.pop() - - def startTagOther(self, token): - self.parser.parseError("unexpected-start-tag-implies-table-voodoo", {"name": token["name"]}) - # Do the table magic! - self.tree.insertFromTable = True - self.parser.phases["inBody"].processStartTag(token) - self.tree.insertFromTable = False - - def endTagTable(self, token): - if self.tree.elementInScope("table", variant="table"): - self.tree.generateImpliedEndTags() - if self.tree.openElements[-1].name != "table": - self.parser.parseError("end-tag-too-early-named", - {"gotName": "table", - "expectedName": self.tree.openElements[-1].name}) - while self.tree.openElements[-1].name != "table": - self.tree.openElements.pop() - self.tree.openElements.pop() - self.parser.resetInsertionMode() - else: - # innerHTML case - assert self.parser.innerHTML - self.parser.parseError() - - def endTagIgnore(self, token): - self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) - - def endTagOther(self, token): - self.parser.parseError("unexpected-end-tag-implies-table-voodoo", {"name": token["name"]}) - # Do the table magic! - self.tree.insertFromTable = True - self.parser.phases["inBody"].processEndTag(token) - self.tree.insertFromTable = False - - class InTableTextPhase(Phase): - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - self.originalPhase = None - self.characterTokens = [] - - def flushCharacters(self): - data = "".join([item["data"] for item in self.characterTokens]) - if any([item not in spaceCharacters for item in data]): - token = {"type": tokenTypes["Characters"], "data": data} - self.parser.phases["inTable"].insertText(token) - elif data: - self.tree.insertText(data) - self.characterTokens = [] - - def processComment(self, token): - self.flushCharacters() - self.parser.phase = self.originalPhase - return token - - def processEOF(self): - self.flushCharacters() - self.parser.phase = self.originalPhase - return True - - def processCharacters(self, token): - if token["data"] == "\u0000": - return - self.characterTokens.append(token) - - def processSpaceCharacters(self, token): - # pretty sure we should never reach here - self.characterTokens.append(token) - # assert False - - def processStartTag(self, token): - self.flushCharacters() - self.parser.phase = self.originalPhase - return token - - def processEndTag(self, token): - self.flushCharacters() - self.parser.phase = self.originalPhase - return token - - class InCaptionPhase(Phase): - # http://www.whatwg.org/specs/web-apps/current-work/#in-caption - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - (("caption", "col", "colgroup", "tbody", "td", "tfoot", "th", - "thead", "tr"), self.startTagTableElement) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - ("caption", self.endTagCaption), - ("table", self.endTagTable), - (("body", "col", "colgroup", "html", "tbody", "td", "tfoot", "th", - "thead", "tr"), self.endTagIgnore) - ]) - self.endTagHandler.default = self.endTagOther - - def ignoreEndTagCaption(self): - return not self.tree.elementInScope("caption", variant="table") - - def processEOF(self): - self.parser.phases["inBody"].processEOF() - - def processCharacters(self, token): - return self.parser.phases["inBody"].processCharacters(token) - - def startTagTableElement(self, token): - self.parser.parseError() - # XXX Have to duplicate logic here to find out if the tag is ignored - ignoreEndTag = self.ignoreEndTagCaption() - self.parser.phase.processEndTag(impliedTagToken("caption")) - if not ignoreEndTag: - return token - - def startTagOther(self, token): - return self.parser.phases["inBody"].processStartTag(token) - - def endTagCaption(self, token): - if not self.ignoreEndTagCaption(): - # AT this code is quite similar to endTagTable in "InTable" - self.tree.generateImpliedEndTags() - if self.tree.openElements[-1].name != "caption": - self.parser.parseError("expected-one-end-tag-but-got-another", - {"gotName": "caption", - "expectedName": self.tree.openElements[-1].name}) - while self.tree.openElements[-1].name != "caption": - self.tree.openElements.pop() - self.tree.openElements.pop() - self.tree.clearActiveFormattingElements() - self.parser.phase = self.parser.phases["inTable"] - else: - # innerHTML case - assert self.parser.innerHTML - self.parser.parseError() - - def endTagTable(self, token): - self.parser.parseError() - ignoreEndTag = self.ignoreEndTagCaption() - self.parser.phase.processEndTag(impliedTagToken("caption")) - if not ignoreEndTag: - return token - - def endTagIgnore(self, token): - self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) - - def endTagOther(self, token): - return self.parser.phases["inBody"].processEndTag(token) - - class InColumnGroupPhase(Phase): - # http://www.whatwg.org/specs/web-apps/current-work/#in-column - - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - ("col", self.startTagCol) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - ("colgroup", self.endTagColgroup), - ("col", self.endTagCol) - ]) - self.endTagHandler.default = self.endTagOther - - def ignoreEndTagColgroup(self): - return self.tree.openElements[-1].name == "html" - - def processEOF(self): - if self.tree.openElements[-1].name == "html": - assert self.parser.innerHTML - return - else: - ignoreEndTag = self.ignoreEndTagColgroup() - self.endTagColgroup(impliedTagToken("colgroup")) - if not ignoreEndTag: - return True - - def processCharacters(self, token): - ignoreEndTag = self.ignoreEndTagColgroup() - self.endTagColgroup(impliedTagToken("colgroup")) - if not ignoreEndTag: - return token - - def startTagCol(self, token): - self.tree.insertElement(token) - self.tree.openElements.pop() - token["selfClosingAcknowledged"] = True - - def startTagOther(self, token): - ignoreEndTag = self.ignoreEndTagColgroup() - self.endTagColgroup(impliedTagToken("colgroup")) - if not ignoreEndTag: - return token - - def endTagColgroup(self, token): - if self.ignoreEndTagColgroup(): - # innerHTML case - assert self.parser.innerHTML - self.parser.parseError() - else: - self.tree.openElements.pop() - self.parser.phase = self.parser.phases["inTable"] - - def endTagCol(self, token): - self.parser.parseError("no-end-tag", {"name": "col"}) - - def endTagOther(self, token): - ignoreEndTag = self.ignoreEndTagColgroup() - self.endTagColgroup(impliedTagToken("colgroup")) - if not ignoreEndTag: - return token - - class InTableBodyPhase(Phase): - # http://www.whatwg.org/specs/web-apps/current-work/#in-table0 - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - ("tr", self.startTagTr), - (("td", "th"), self.startTagTableCell), - (("caption", "col", "colgroup", "tbody", "tfoot", "thead"), - self.startTagTableOther) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - (("tbody", "tfoot", "thead"), self.endTagTableRowGroup), - ("table", self.endTagTable), - (("body", "caption", "col", "colgroup", "html", "td", "th", - "tr"), self.endTagIgnore) - ]) - self.endTagHandler.default = self.endTagOther - - # helper methods - def clearStackToTableBodyContext(self): - while self.tree.openElements[-1].name not in ("tbody", "tfoot", - "thead", "html"): - # self.parser.parseError("unexpected-implied-end-tag-in-table", - # {"name": self.tree.openElements[-1].name}) - self.tree.openElements.pop() - if self.tree.openElements[-1].name == "html": - assert self.parser.innerHTML - - # the rest - def processEOF(self): - self.parser.phases["inTable"].processEOF() - - def processSpaceCharacters(self, token): - return self.parser.phases["inTable"].processSpaceCharacters(token) - - def processCharacters(self, token): - return self.parser.phases["inTable"].processCharacters(token) - - def startTagTr(self, token): - self.clearStackToTableBodyContext() - self.tree.insertElement(token) - self.parser.phase = self.parser.phases["inRow"] - - def startTagTableCell(self, token): - self.parser.parseError("unexpected-cell-in-table-body", - {"name": token["name"]}) - self.startTagTr(impliedTagToken("tr", "StartTag")) - return token - - def startTagTableOther(self, token): - # XXX AT Any ideas on how to share this with endTagTable? - if (self.tree.elementInScope("tbody", variant="table") or - self.tree.elementInScope("thead", variant="table") or - self.tree.elementInScope("tfoot", variant="table")): - self.clearStackToTableBodyContext() - self.endTagTableRowGroup( - impliedTagToken(self.tree.openElements[-1].name)) - return token - else: - # innerHTML case - assert self.parser.innerHTML - self.parser.parseError() - - def startTagOther(self, token): - return self.parser.phases["inTable"].processStartTag(token) - - def endTagTableRowGroup(self, token): - if self.tree.elementInScope(token["name"], variant="table"): - self.clearStackToTableBodyContext() - self.tree.openElements.pop() - self.parser.phase = self.parser.phases["inTable"] - else: - self.parser.parseError("unexpected-end-tag-in-table-body", - {"name": token["name"]}) - - def endTagTable(self, token): - if (self.tree.elementInScope("tbody", variant="table") or - self.tree.elementInScope("thead", variant="table") or - self.tree.elementInScope("tfoot", variant="table")): - self.clearStackToTableBodyContext() - self.endTagTableRowGroup( - impliedTagToken(self.tree.openElements[-1].name)) - return token - else: - # innerHTML case - assert self.parser.innerHTML - self.parser.parseError() - - def endTagIgnore(self, token): - self.parser.parseError("unexpected-end-tag-in-table-body", - {"name": token["name"]}) - - def endTagOther(self, token): - return self.parser.phases["inTable"].processEndTag(token) - - class InRowPhase(Phase): - # http://www.whatwg.org/specs/web-apps/current-work/#in-row - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - (("td", "th"), self.startTagTableCell), - (("caption", "col", "colgroup", "tbody", "tfoot", "thead", - "tr"), self.startTagTableOther) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - ("tr", self.endTagTr), - ("table", self.endTagTable), - (("tbody", "tfoot", "thead"), self.endTagTableRowGroup), - (("body", "caption", "col", "colgroup", "html", "td", "th"), - self.endTagIgnore) - ]) - self.endTagHandler.default = self.endTagOther - - # helper methods (XXX unify this with other table helper methods) - def clearStackToTableRowContext(self): - while self.tree.openElements[-1].name not in ("tr", "html"): - self.parser.parseError("unexpected-implied-end-tag-in-table-row", - {"name": self.tree.openElements[-1].name}) - self.tree.openElements.pop() - - def ignoreEndTagTr(self): - return not self.tree.elementInScope("tr", variant="table") - - # the rest - def processEOF(self): - self.parser.phases["inTable"].processEOF() - - def processSpaceCharacters(self, token): - return self.parser.phases["inTable"].processSpaceCharacters(token) - - def processCharacters(self, token): - return self.parser.phases["inTable"].processCharacters(token) - - def startTagTableCell(self, token): - self.clearStackToTableRowContext() - self.tree.insertElement(token) - self.parser.phase = self.parser.phases["inCell"] - self.tree.activeFormattingElements.append(Marker) - - def startTagTableOther(self, token): - ignoreEndTag = self.ignoreEndTagTr() - self.endTagTr(impliedTagToken("tr")) - # XXX how are we sure it's always ignored in the innerHTML case? - if not ignoreEndTag: - return token - - def startTagOther(self, token): - return self.parser.phases["inTable"].processStartTag(token) - - def endTagTr(self, token): - if not self.ignoreEndTagTr(): - self.clearStackToTableRowContext() - self.tree.openElements.pop() - self.parser.phase = self.parser.phases["inTableBody"] - else: - # innerHTML case - assert self.parser.innerHTML - self.parser.parseError() - - def endTagTable(self, token): - ignoreEndTag = self.ignoreEndTagTr() - self.endTagTr(impliedTagToken("tr")) - # Reprocess the current tag if the tr end tag was not ignored - # XXX how are we sure it's always ignored in the innerHTML case? - if not ignoreEndTag: - return token - - def endTagTableRowGroup(self, token): - if self.tree.elementInScope(token["name"], variant="table"): - self.endTagTr(impliedTagToken("tr")) - return token - else: - self.parser.parseError() - - def endTagIgnore(self, token): - self.parser.parseError("unexpected-end-tag-in-table-row", - {"name": token["name"]}) - - def endTagOther(self, token): - return self.parser.phases["inTable"].processEndTag(token) - - class InCellPhase(Phase): - # http://www.whatwg.org/specs/web-apps/current-work/#in-cell - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - (("caption", "col", "colgroup", "tbody", "td", "tfoot", "th", - "thead", "tr"), self.startTagTableOther) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - (("td", "th"), self.endTagTableCell), - (("body", "caption", "col", "colgroup", "html"), self.endTagIgnore), - (("table", "tbody", "tfoot", "thead", "tr"), self.endTagImply) - ]) - self.endTagHandler.default = self.endTagOther - - # helper - def closeCell(self): - if self.tree.elementInScope("td", variant="table"): - self.endTagTableCell(impliedTagToken("td")) - elif self.tree.elementInScope("th", variant="table"): - self.endTagTableCell(impliedTagToken("th")) - - # the rest - def processEOF(self): - self.parser.phases["inBody"].processEOF() - - def processCharacters(self, token): - return self.parser.phases["inBody"].processCharacters(token) - - def startTagTableOther(self, token): - if (self.tree.elementInScope("td", variant="table") or - self.tree.elementInScope("th", variant="table")): - self.closeCell() - return token - else: - # innerHTML case - assert self.parser.innerHTML - self.parser.parseError() - - def startTagOther(self, token): - return self.parser.phases["inBody"].processStartTag(token) - - def endTagTableCell(self, token): - if self.tree.elementInScope(token["name"], variant="table"): - self.tree.generateImpliedEndTags(token["name"]) - if self.tree.openElements[-1].name != token["name"]: - self.parser.parseError("unexpected-cell-end-tag", - {"name": token["name"]}) - while True: - node = self.tree.openElements.pop() - if node.name == token["name"]: - break - else: - self.tree.openElements.pop() - self.tree.clearActiveFormattingElements() - self.parser.phase = self.parser.phases["inRow"] - else: - self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) - - def endTagIgnore(self, token): - self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) - - def endTagImply(self, token): - if self.tree.elementInScope(token["name"], variant="table"): - self.closeCell() - return token - else: - # sometimes innerHTML case - self.parser.parseError() - - def endTagOther(self, token): - return self.parser.phases["inBody"].processEndTag(token) - - class InSelectPhase(Phase): - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - ("option", self.startTagOption), - ("optgroup", self.startTagOptgroup), - ("select", self.startTagSelect), - (("input", "keygen", "textarea"), self.startTagInput), - ("script", self.startTagScript) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - ("option", self.endTagOption), - ("optgroup", self.endTagOptgroup), - ("select", self.endTagSelect) - ]) - self.endTagHandler.default = self.endTagOther - - # http://www.whatwg.org/specs/web-apps/current-work/#in-select - def processEOF(self): - if self.tree.openElements[-1].name != "html": - self.parser.parseError("eof-in-select") - else: - assert self.parser.innerHTML - - def processCharacters(self, token): - if token["data"] == "\u0000": - return - self.tree.insertText(token["data"]) - - def startTagOption(self, token): - # We need to imply </option> if <option> is the current node. - if self.tree.openElements[-1].name == "option": - self.tree.openElements.pop() - self.tree.insertElement(token) - - def startTagOptgroup(self, token): - if self.tree.openElements[-1].name == "option": - self.tree.openElements.pop() - if self.tree.openElements[-1].name == "optgroup": - self.tree.openElements.pop() - self.tree.insertElement(token) - - def startTagSelect(self, token): - self.parser.parseError("unexpected-select-in-select") - self.endTagSelect(impliedTagToken("select")) - - def startTagInput(self, token): - self.parser.parseError("unexpected-input-in-select") - if self.tree.elementInScope("select", variant="select"): - self.endTagSelect(impliedTagToken("select")) - return token - else: - assert self.parser.innerHTML - - def startTagScript(self, token): - return self.parser.phases["inHead"].processStartTag(token) - - def startTagOther(self, token): - self.parser.parseError("unexpected-start-tag-in-select", - {"name": token["name"]}) - - def endTagOption(self, token): - if self.tree.openElements[-1].name == "option": - self.tree.openElements.pop() - else: - self.parser.parseError("unexpected-end-tag-in-select", - {"name": "option"}) - - def endTagOptgroup(self, token): - # </optgroup> implicitly closes <option> - if (self.tree.openElements[-1].name == "option" and - self.tree.openElements[-2].name == "optgroup"): - self.tree.openElements.pop() - # It also closes </optgroup> - if self.tree.openElements[-1].name == "optgroup": - self.tree.openElements.pop() - # But nothing else - else: - self.parser.parseError("unexpected-end-tag-in-select", - {"name": "optgroup"}) - - def endTagSelect(self, token): - if self.tree.elementInScope("select", variant="select"): - node = self.tree.openElements.pop() - while node.name != "select": - node = self.tree.openElements.pop() - self.parser.resetInsertionMode() - else: - # innerHTML case - assert self.parser.innerHTML - self.parser.parseError() - - def endTagOther(self, token): - self.parser.parseError("unexpected-end-tag-in-select", - {"name": token["name"]}) - - class InSelectInTablePhase(Phase): - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = _utils.MethodDispatcher([ - (("caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th"), - self.startTagTable) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - (("caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th"), - self.endTagTable) - ]) - self.endTagHandler.default = self.endTagOther - - def processEOF(self): - self.parser.phases["inSelect"].processEOF() - - def processCharacters(self, token): - return self.parser.phases["inSelect"].processCharacters(token) - - def startTagTable(self, token): - self.parser.parseError("unexpected-table-element-start-tag-in-select-in-table", {"name": token["name"]}) - self.endTagOther(impliedTagToken("select")) - return token - - def startTagOther(self, token): - return self.parser.phases["inSelect"].processStartTag(token) - - def endTagTable(self, token): - self.parser.parseError("unexpected-table-element-end-tag-in-select-in-table", {"name": token["name"]}) - if self.tree.elementInScope(token["name"], variant="table"): - self.endTagOther(impliedTagToken("select")) - return token - - def endTagOther(self, token): - return self.parser.phases["inSelect"].processEndTag(token) - - class InForeignContentPhase(Phase): - breakoutElements = frozenset(["b", "big", "blockquote", "body", "br", - "center", "code", "dd", "div", "dl", "dt", - "em", "embed", "h1", "h2", "h3", - "h4", "h5", "h6", "head", "hr", "i", "img", - "li", "listing", "menu", "meta", "nobr", - "ol", "p", "pre", "ruby", "s", "small", - "span", "strong", "strike", "sub", "sup", - "table", "tt", "u", "ul", "var"]) - - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - def adjustSVGTagNames(self, token): - replacements = {"altglyph": "altGlyph", - "altglyphdef": "altGlyphDef", - "altglyphitem": "altGlyphItem", - "animatecolor": "animateColor", - "animatemotion": "animateMotion", - "animatetransform": "animateTransform", - "clippath": "clipPath", - "feblend": "feBlend", - "fecolormatrix": "feColorMatrix", - "fecomponenttransfer": "feComponentTransfer", - "fecomposite": "feComposite", - "feconvolvematrix": "feConvolveMatrix", - "fediffuselighting": "feDiffuseLighting", - "fedisplacementmap": "feDisplacementMap", - "fedistantlight": "feDistantLight", - "feflood": "feFlood", - "fefunca": "feFuncA", - "fefuncb": "feFuncB", - "fefuncg": "feFuncG", - "fefuncr": "feFuncR", - "fegaussianblur": "feGaussianBlur", - "feimage": "feImage", - "femerge": "feMerge", - "femergenode": "feMergeNode", - "femorphology": "feMorphology", - "feoffset": "feOffset", - "fepointlight": "fePointLight", - "fespecularlighting": "feSpecularLighting", - "fespotlight": "feSpotLight", - "fetile": "feTile", - "feturbulence": "feTurbulence", - "foreignobject": "foreignObject", - "glyphref": "glyphRef", - "lineargradient": "linearGradient", - "radialgradient": "radialGradient", - "textpath": "textPath"} - - if token["name"] in replacements: - token["name"] = replacements[token["name"]] - - def processCharacters(self, token): - if token["data"] == "\u0000": - token["data"] = "\uFFFD" - elif (self.parser.framesetOK and - any(char not in spaceCharacters for char in token["data"])): - self.parser.framesetOK = False - Phase.processCharacters(self, token) - - def processStartTag(self, token): - currentNode = self.tree.openElements[-1] - if (token["name"] in self.breakoutElements or - (token["name"] == "font" and - set(token["data"].keys()) & set(["color", "face", "size"]))): - self.parser.parseError("unexpected-html-element-in-foreign-content", - {"name": token["name"]}) - while (self.tree.openElements[-1].namespace != - self.tree.defaultNamespace and - not self.parser.isHTMLIntegrationPoint(self.tree.openElements[-1]) and - not self.parser.isMathMLTextIntegrationPoint(self.tree.openElements[-1])): - self.tree.openElements.pop() - return token - - else: - if currentNode.namespace == namespaces["mathml"]: - self.parser.adjustMathMLAttributes(token) - elif currentNode.namespace == namespaces["svg"]: - self.adjustSVGTagNames(token) - self.parser.adjustSVGAttributes(token) - self.parser.adjustForeignAttributes(token) - token["namespace"] = currentNode.namespace - self.tree.insertElement(token) - if token["selfClosing"]: - self.tree.openElements.pop() - token["selfClosingAcknowledged"] = True - - def processEndTag(self, token): - nodeIndex = len(self.tree.openElements) - 1 - node = self.tree.openElements[-1] - if node.name.translate(asciiUpper2Lower) != token["name"]: - self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) - - while True: - if node.name.translate(asciiUpper2Lower) == token["name"]: - # XXX this isn't in the spec but it seems necessary - if self.parser.phase == self.parser.phases["inTableText"]: - self.parser.phase.flushCharacters() - self.parser.phase = self.parser.phase.originalPhase - while self.tree.openElements.pop() != node: - assert self.tree.openElements - new_token = None - break - nodeIndex -= 1 - - node = self.tree.openElements[nodeIndex] - if node.namespace != self.tree.defaultNamespace: - continue - else: - new_token = self.parser.phase.processEndTag(token) - break - return new_token - - class AfterBodyPhase(Phase): - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([("html", self.endTagHtml)]) - self.endTagHandler.default = self.endTagOther - - def processEOF(self): - # Stop parsing - pass - - def processComment(self, token): - # This is needed because data is to be appended to the <html> element - # here and not to whatever is currently open. - self.tree.insertComment(token, self.tree.openElements[0]) - - def processCharacters(self, token): - self.parser.parseError("unexpected-char-after-body") - self.parser.phase = self.parser.phases["inBody"] - return token - - def startTagHtml(self, token): - return self.parser.phases["inBody"].processStartTag(token) - - def startTagOther(self, token): - self.parser.parseError("unexpected-start-tag-after-body", - {"name": token["name"]}) - self.parser.phase = self.parser.phases["inBody"] - return token - - def endTagHtml(self, name): - if self.parser.innerHTML: - self.parser.parseError("unexpected-end-tag-after-body-innerhtml") - else: - self.parser.phase = self.parser.phases["afterAfterBody"] - - def endTagOther(self, token): - self.parser.parseError("unexpected-end-tag-after-body", - {"name": token["name"]}) - self.parser.phase = self.parser.phases["inBody"] - return token - - class InFramesetPhase(Phase): - # http://www.whatwg.org/specs/web-apps/current-work/#in-frameset - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - ("frameset", self.startTagFrameset), - ("frame", self.startTagFrame), - ("noframes", self.startTagNoframes) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - ("frameset", self.endTagFrameset) - ]) - self.endTagHandler.default = self.endTagOther - - def processEOF(self): - if self.tree.openElements[-1].name != "html": - self.parser.parseError("eof-in-frameset") - else: - assert self.parser.innerHTML - - def processCharacters(self, token): - self.parser.parseError("unexpected-char-in-frameset") - - def startTagFrameset(self, token): - self.tree.insertElement(token) - - def startTagFrame(self, token): - self.tree.insertElement(token) - self.tree.openElements.pop() - - def startTagNoframes(self, token): - return self.parser.phases["inBody"].processStartTag(token) - - def startTagOther(self, token): - self.parser.parseError("unexpected-start-tag-in-frameset", - {"name": token["name"]}) - - def endTagFrameset(self, token): - if self.tree.openElements[-1].name == "html": - # innerHTML case - self.parser.parseError("unexpected-frameset-in-frameset-innerhtml") - else: - self.tree.openElements.pop() - if (not self.parser.innerHTML and - self.tree.openElements[-1].name != "frameset"): - # If we're not in innerHTML mode and the current node is not a - # "frameset" element (anymore) then switch. - self.parser.phase = self.parser.phases["afterFrameset"] - - def endTagOther(self, token): - self.parser.parseError("unexpected-end-tag-in-frameset", - {"name": token["name"]}) - - class AfterFramesetPhase(Phase): - # http://www.whatwg.org/specs/web-apps/current-work/#after3 - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - ("noframes", self.startTagNoframes) - ]) - self.startTagHandler.default = self.startTagOther - - self.endTagHandler = _utils.MethodDispatcher([ - ("html", self.endTagHtml) - ]) - self.endTagHandler.default = self.endTagOther - - def processEOF(self): - # Stop parsing - pass - - def processCharacters(self, token): - self.parser.parseError("unexpected-char-after-frameset") - - def startTagNoframes(self, token): - return self.parser.phases["inHead"].processStartTag(token) - - def startTagOther(self, token): - self.parser.parseError("unexpected-start-tag-after-frameset", - {"name": token["name"]}) - - def endTagHtml(self, token): - self.parser.phase = self.parser.phases["afterAfterFrameset"] - - def endTagOther(self, token): - self.parser.parseError("unexpected-end-tag-after-frameset", - {"name": token["name"]}) - - class AfterAfterBodyPhase(Phase): - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml) - ]) - self.startTagHandler.default = self.startTagOther - - def processEOF(self): - pass - - def processComment(self, token): - self.tree.insertComment(token, self.tree.document) - - def processSpaceCharacters(self, token): - return self.parser.phases["inBody"].processSpaceCharacters(token) - - def processCharacters(self, token): - self.parser.parseError("expected-eof-but-got-char") - self.parser.phase = self.parser.phases["inBody"] - return token - - def startTagHtml(self, token): - return self.parser.phases["inBody"].processStartTag(token) - - def startTagOther(self, token): - self.parser.parseError("expected-eof-but-got-start-tag", - {"name": token["name"]}) - self.parser.phase = self.parser.phases["inBody"] - return token - - def processEndTag(self, token): - self.parser.parseError("expected-eof-but-got-end-tag", - {"name": token["name"]}) - self.parser.phase = self.parser.phases["inBody"] - return token - - class AfterAfterFramesetPhase(Phase): - def __init__(self, parser, tree): - Phase.__init__(self, parser, tree) - - self.startTagHandler = _utils.MethodDispatcher([ - ("html", self.startTagHtml), - ("noframes", self.startTagNoFrames) - ]) - self.startTagHandler.default = self.startTagOther - - def processEOF(self): - pass - - def processComment(self, token): - self.tree.insertComment(token, self.tree.document) - - def processSpaceCharacters(self, token): - return self.parser.phases["inBody"].processSpaceCharacters(token) - - def processCharacters(self, token): - self.parser.parseError("expected-eof-but-got-char") - - def startTagHtml(self, token): - return self.parser.phases["inBody"].processStartTag(token) - - def startTagNoFrames(self, token): - return self.parser.phases["inHead"].processStartTag(token) - - def startTagOther(self, token): - self.parser.parseError("expected-eof-but-got-start-tag", - {"name": token["name"]}) - - def processEndTag(self, token): - self.parser.parseError("expected-eof-but-got-end-tag", - {"name": token["name"]}) - # pylint:enable=unused-argument - - return { - "initial": InitialPhase, - "beforeHtml": BeforeHtmlPhase, - "beforeHead": BeforeHeadPhase, - "inHead": InHeadPhase, - "inHeadNoscript": InHeadNoscriptPhase, - "afterHead": AfterHeadPhase, - "inBody": InBodyPhase, - "text": TextPhase, - "inTable": InTablePhase, - "inTableText": InTableTextPhase, - "inCaption": InCaptionPhase, - "inColumnGroup": InColumnGroupPhase, - "inTableBody": InTableBodyPhase, - "inRow": InRowPhase, - "inCell": InCellPhase, - "inSelect": InSelectPhase, - "inSelectInTable": InSelectInTablePhase, - "inForeignContent": InForeignContentPhase, - "afterBody": AfterBodyPhase, - "inFrameset": InFramesetPhase, - "afterFrameset": AfterFramesetPhase, - "afterAfterBody": AfterAfterBodyPhase, - "afterAfterFrameset": AfterAfterFramesetPhase, - # XXX after after frameset - } - - -def adjust_attributes(token, replacements): - needs_adjustment = viewkeys(token['data']) & viewkeys(replacements) - if needs_adjustment: - token['data'] = OrderedDict((replacements.get(k, k), v) - for k, v in token['data'].items()) - - -def impliedTagToken(name, type="EndTag", attributes=None, - selfClosing=False): - if attributes is None: - attributes = {} - return {"type": tokenTypes[type], "name": name, "data": attributes, - "selfClosing": selfClosing} - - -class ParseError(Exception): - """Error in parsed document""" - pass diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/serializer.py b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/serializer.py deleted file mode 100644 index 53f4d44..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/serializer.py +++ /dev/null @@ -1,409 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals -from pip._vendor.six import text_type - -import re - -from codecs import register_error, xmlcharrefreplace_errors - -from .constants import voidElements, booleanAttributes, spaceCharacters -from .constants import rcdataElements, entities, xmlEntities -from . import treewalkers, _utils -from xml.sax.saxutils import escape - -_quoteAttributeSpecChars = "".join(spaceCharacters) + "\"'=<>`" -_quoteAttributeSpec = re.compile("[" + _quoteAttributeSpecChars + "]") -_quoteAttributeLegacy = re.compile("[" + _quoteAttributeSpecChars + - "\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n" - "\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15" - "\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" - "\x20\x2f\x60\xa0\u1680\u180e\u180f\u2000" - "\u2001\u2002\u2003\u2004\u2005\u2006\u2007" - "\u2008\u2009\u200a\u2028\u2029\u202f\u205f" - "\u3000]") - - -_encode_entity_map = {} -_is_ucs4 = len("\U0010FFFF") == 1 -for k, v in list(entities.items()): - # skip multi-character entities - if ((_is_ucs4 and len(v) > 1) or - (not _is_ucs4 and len(v) > 2)): - continue - if v != "&": - if len(v) == 2: - v = _utils.surrogatePairToCodepoint(v) - else: - v = ord(v) - if v not in _encode_entity_map or k.islower(): - # prefer < over < and similarly for &, >, etc. - _encode_entity_map[v] = k - - -def htmlentityreplace_errors(exc): - if isinstance(exc, (UnicodeEncodeError, UnicodeTranslateError)): - res = [] - codepoints = [] - skip = False - for i, c in enumerate(exc.object[exc.start:exc.end]): - if skip: - skip = False - continue - index = i + exc.start - if _utils.isSurrogatePair(exc.object[index:min([exc.end, index + 2])]): - codepoint = _utils.surrogatePairToCodepoint(exc.object[index:index + 2]) - skip = True - else: - codepoint = ord(c) - codepoints.append(codepoint) - for cp in codepoints: - e = _encode_entity_map.get(cp) - if e: - res.append("&") - res.append(e) - if not e.endswith(";"): - res.append(";") - else: - res.append("&#x%s;" % (hex(cp)[2:])) - return ("".join(res), exc.end) - else: - return xmlcharrefreplace_errors(exc) - - -register_error("htmlentityreplace", htmlentityreplace_errors) - - -def serialize(input, tree="etree", encoding=None, **serializer_opts): - """Serializes the input token stream using the specified treewalker - - :arg input: the token stream to serialize - - :arg tree: the treewalker to use - - :arg encoding: the encoding to use - - :arg serializer_opts: any options to pass to the - :py:class:`html5lib.serializer.HTMLSerializer` that gets created - - :returns: the tree serialized as a string - - Example: - - >>> from html5lib.html5parser import parse - >>> from html5lib.serializer import serialize - >>> token_stream = parse('<html><body><p>Hi!</p></body></html>') - >>> serialize(token_stream, omit_optional_tags=False) - '<html><head></head><body><p>Hi!</p></body></html>' - - """ - # XXX: Should we cache this? - walker = treewalkers.getTreeWalker(tree) - s = HTMLSerializer(**serializer_opts) - return s.render(walker(input), encoding) - - -class HTMLSerializer(object): - - # attribute quoting options - quote_attr_values = "legacy" # be secure by default - quote_char = '"' - use_best_quote_char = True - - # tag syntax options - omit_optional_tags = True - minimize_boolean_attributes = True - use_trailing_solidus = False - space_before_trailing_solidus = True - - # escaping options - escape_lt_in_attrs = False - escape_rcdata = False - resolve_entities = True - - # miscellaneous options - alphabetical_attributes = False - inject_meta_charset = True - strip_whitespace = False - sanitize = False - - options = ("quote_attr_values", "quote_char", "use_best_quote_char", - "omit_optional_tags", "minimize_boolean_attributes", - "use_trailing_solidus", "space_before_trailing_solidus", - "escape_lt_in_attrs", "escape_rcdata", "resolve_entities", - "alphabetical_attributes", "inject_meta_charset", - "strip_whitespace", "sanitize") - - def __init__(self, **kwargs): - """Initialize HTMLSerializer - - :arg inject_meta_charset: Whether or not to inject the meta charset. - - Defaults to ``True``. - - :arg quote_attr_values: Whether to quote attribute values that don't - require quoting per legacy browser behavior (``"legacy"``), when - required by the standard (``"spec"``), or always (``"always"``). - - Defaults to ``"legacy"``. - - :arg quote_char: Use given quote character for attribute quoting. - - Defaults to ``"`` which will use double quotes unless attribute - value contains a double quote, in which case single quotes are - used. - - :arg escape_lt_in_attrs: Whether or not to escape ``<`` in attribute - values. - - Defaults to ``False``. - - :arg escape_rcdata: Whether to escape characters that need to be - escaped within normal elements within rcdata elements such as - style. - - Defaults to ``False``. - - :arg resolve_entities: Whether to resolve named character entities that - appear in the source tree. The XML predefined entities < > - & " ' are unaffected by this setting. - - Defaults to ``True``. - - :arg strip_whitespace: Whether to remove semantically meaningless - whitespace. (This compresses all whitespace to a single space - except within ``pre``.) - - Defaults to ``False``. - - :arg minimize_boolean_attributes: Shortens boolean attributes to give - just the attribute value, for example:: - - <input disabled="disabled"> - - becomes:: - - <input disabled> - - Defaults to ``True``. - - :arg use_trailing_solidus: Includes a close-tag slash at the end of the - start tag of void elements (empty elements whose end tag is - forbidden). E.g. ``<hr/>``. - - Defaults to ``False``. - - :arg space_before_trailing_solidus: Places a space immediately before - the closing slash in a tag using a trailing solidus. E.g. - ``<hr />``. Requires ``use_trailing_solidus=True``. - - Defaults to ``True``. - - :arg sanitize: Strip all unsafe or unknown constructs from output. - See :py:class:`html5lib.filters.sanitizer.Filter`. - - Defaults to ``False``. - - :arg omit_optional_tags: Omit start/end tags that are optional. - - Defaults to ``True``. - - :arg alphabetical_attributes: Reorder attributes to be in alphabetical order. - - Defaults to ``False``. - - """ - unexpected_args = frozenset(kwargs) - frozenset(self.options) - if len(unexpected_args) > 0: - raise TypeError("__init__() got an unexpected keyword argument '%s'" % next(iter(unexpected_args))) - if 'quote_char' in kwargs: - self.use_best_quote_char = False - for attr in self.options: - setattr(self, attr, kwargs.get(attr, getattr(self, attr))) - self.errors = [] - self.strict = False - - def encode(self, string): - assert(isinstance(string, text_type)) - if self.encoding: - return string.encode(self.encoding, "htmlentityreplace") - else: - return string - - def encodeStrict(self, string): - assert(isinstance(string, text_type)) - if self.encoding: - return string.encode(self.encoding, "strict") - else: - return string - - def serialize(self, treewalker, encoding=None): - # pylint:disable=too-many-nested-blocks - self.encoding = encoding - in_cdata = False - self.errors = [] - - if encoding and self.inject_meta_charset: - from .filters.inject_meta_charset import Filter - treewalker = Filter(treewalker, encoding) - # Alphabetical attributes is here under the assumption that none of - # the later filters add or change order of attributes; it needs to be - # before the sanitizer so escaped elements come out correctly - if self.alphabetical_attributes: - from .filters.alphabeticalattributes import Filter - treewalker = Filter(treewalker) - # WhitespaceFilter should be used before OptionalTagFilter - # for maximum efficiently of this latter filter - if self.strip_whitespace: - from .filters.whitespace import Filter - treewalker = Filter(treewalker) - if self.sanitize: - from .filters.sanitizer import Filter - treewalker = Filter(treewalker) - if self.omit_optional_tags: - from .filters.optionaltags import Filter - treewalker = Filter(treewalker) - - for token in treewalker: - type = token["type"] - if type == "Doctype": - doctype = "<!DOCTYPE %s" % token["name"] - - if token["publicId"]: - doctype += ' PUBLIC "%s"' % token["publicId"] - elif token["systemId"]: - doctype += " SYSTEM" - if token["systemId"]: - if token["systemId"].find('"') >= 0: - if token["systemId"].find("'") >= 0: - self.serializeError("System identifer contains both single and double quote characters") - quote_char = "'" - else: - quote_char = '"' - doctype += " %s%s%s" % (quote_char, token["systemId"], quote_char) - - doctype += ">" - yield self.encodeStrict(doctype) - - elif type in ("Characters", "SpaceCharacters"): - if type == "SpaceCharacters" or in_cdata: - if in_cdata and token["data"].find("</") >= 0: - self.serializeError("Unexpected </ in CDATA") - yield self.encode(token["data"]) - else: - yield self.encode(escape(token["data"])) - - elif type in ("StartTag", "EmptyTag"): - name = token["name"] - yield self.encodeStrict("<%s" % name) - if name in rcdataElements and not self.escape_rcdata: - in_cdata = True - elif in_cdata: - self.serializeError("Unexpected child element of a CDATA element") - for (_, attr_name), attr_value in token["data"].items(): - # TODO: Add namespace support here - k = attr_name - v = attr_value - yield self.encodeStrict(' ') - - yield self.encodeStrict(k) - if not self.minimize_boolean_attributes or \ - (k not in booleanAttributes.get(name, tuple()) and - k not in booleanAttributes.get("", tuple())): - yield self.encodeStrict("=") - if self.quote_attr_values == "always" or len(v) == 0: - quote_attr = True - elif self.quote_attr_values == "spec": - quote_attr = _quoteAttributeSpec.search(v) is not None - elif self.quote_attr_values == "legacy": - quote_attr = _quoteAttributeLegacy.search(v) is not None - else: - raise ValueError("quote_attr_values must be one of: " - "'always', 'spec', or 'legacy'") - v = v.replace("&", "&") - if self.escape_lt_in_attrs: - v = v.replace("<", "<") - if quote_attr: - quote_char = self.quote_char - if self.use_best_quote_char: - if "'" in v and '"' not in v: - quote_char = '"' - elif '"' in v and "'" not in v: - quote_char = "'" - if quote_char == "'": - v = v.replace("'", "'") - else: - v = v.replace('"', """) - yield self.encodeStrict(quote_char) - yield self.encode(v) - yield self.encodeStrict(quote_char) - else: - yield self.encode(v) - if name in voidElements and self.use_trailing_solidus: - if self.space_before_trailing_solidus: - yield self.encodeStrict(" /") - else: - yield self.encodeStrict("/") - yield self.encode(">") - - elif type == "EndTag": - name = token["name"] - if name in rcdataElements: - in_cdata = False - elif in_cdata: - self.serializeError("Unexpected child element of a CDATA element") - yield self.encodeStrict("</%s>" % name) - - elif type == "Comment": - data = token["data"] - if data.find("--") >= 0: - self.serializeError("Comment contains --") - yield self.encodeStrict("<!--%s-->" % token["data"]) - - elif type == "Entity": - name = token["name"] - key = name + ";" - if key not in entities: - self.serializeError("Entity %s not recognized" % name) - if self.resolve_entities and key not in xmlEntities: - data = entities[key] - else: - data = "&%s;" % name - yield self.encodeStrict(data) - - else: - self.serializeError(token["data"]) - - def render(self, treewalker, encoding=None): - """Serializes the stream from the treewalker into a string - - :arg treewalker: the treewalker to serialize - - :arg encoding: the string encoding to use - - :returns: the serialized tree - - Example: - - >>> from html5lib import parse, getTreeWalker - >>> from html5lib.serializer import HTMLSerializer - >>> token_stream = parse('<html><body>Hi!</body></html>') - >>> walker = getTreeWalker('etree') - >>> serializer = HTMLSerializer(omit_optional_tags=False) - >>> serializer.render(walker(token_stream)) - '<html><head></head><body>Hi!</body></html>' - - """ - if encoding: - return b"".join(list(self.serialize(treewalker, encoding))) - else: - return "".join(list(self.serialize(treewalker))) - - def serializeError(self, data="XXX ERROR MESSAGE NEEDED"): - # XXX The idea is to make data mandatory. - self.errors.append(data) - if self.strict: - raise SerializeError - - -class SerializeError(Exception): - """Error in serialized tree""" - pass diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py deleted file mode 100644 index 7ef5959..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py +++ /dev/null @@ -1,30 +0,0 @@ -"""Tree adapters let you convert from one tree structure to another - -Example: - -.. code-block:: python - - from pip._vendor import html5lib - from pip._vendor.html5lib.treeadapters import genshi - - doc = '<html><body>Hi!</body></html>' - treebuilder = html5lib.getTreeBuilder('etree') - parser = html5lib.HTMLParser(tree=treebuilder) - tree = parser.parse(doc) - TreeWalker = html5lib.getTreeWalker('etree') - - genshi_tree = genshi.to_genshi(TreeWalker(tree)) - -""" -from __future__ import absolute_import, division, unicode_literals - -from . import sax - -__all__ = ["sax"] - -try: - from . import genshi # noqa -except ImportError: - pass -else: - __all__.append("genshi") diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 18e3f2d057e80a6dd8022afe80fadc7582b543ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 896 zcmZuvPjAyO6t~kZ?XrIr+JU1vwK+5u2QF1tp-Gd5fC-68gGgYdwcA>C?BF<6`)xoR z5Z{J#uAKH2IPsjc8<TM4m-p}Yd$!-ZJUIyvEcN~Arym|dzn!sPZBSmq&Od`-C`Jr3 zPvX>zy|fWG(q`Pmh&5PK9;ANkgMP5UackQFpAWuv+{Wk@sq-e{hpWKcVC24!NF9Gb zy!AC;t#24m?e{1=Onza6CWdp8uq3nG<V12ywz?oQt=8OFGB-LUT5)1sT5e4-vxNau zlSFB|<R%ENHc6UEJ`92=0wCl4snoO8a7ePPU1}8sgw#Zt$RfJtifKbcnrSGow5fa{ z#q@tU(LNZt>i1{dAs1ZbOHq+CJtG&SJ97Es(NweT_*y(04JvIksN7vw!SPHBAsIIS zxTjxm>z?7Vj`X_R<#j`c$P$x3PQISJee<sJ_FUS<Kb#f9*+5<cqw3d#16HvK#BLM0 zdd#>hUk4tlyYlrV>5j9uBCBbw^&a@DvxH#~+`-_Wuu+~R(_G8Ka$3Jv*=Axba-mh( zDU@)1qEbN96Pe$^9H0=FjXc>Hzt;V_glU0!6CRZ<O5qlimI0;n!VLkX2F4eeh7(N? zC91$KHIWj+4qG0*sycmTj5ej8WEu4TCo-oF<;0)Y1Dj?8n2o+rxdmjOec7tb^ZC*_ ztGyeVs*`S72JS)j12LdfC}Am$vTfNOrJ5CzkDmZ_-T~3X=iagBdmirKQ|x<x0gF2g AlK=n! diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/genshi.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/genshi.cpython-37.pyc deleted file mode 100644 index d9a5ae0820947fb1ccd4c6ed5f6b09bb19d8403f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1493 zcmah}OK%%D5GJ_~tyYq)D5+7U4ImWAK}BP=MS3v|qp7TefkbH{p-mSxg!Ph=w%V6T z%C%hS<op2l(7TPEdTxFVuRZzRQ!edrCD|!@2nCLY!<mnqnUDKTrQ#wO$?qQ?{%Irh zmtL#~0p)9$;wcD<D2`B!JscB{#D-^JZ6lExTb>o$o}I4^SQorP?08OG^op_TxpB!W z!JbL2*T^eVyN8;EYd}OzLv8v;B8{e!4Z=7}xl|4fPeKu<iK<SMFi0sIM4@Edk3^Fw z>qXa(nX;Zp$wkvrR<Hl$WnUSc?!GenomYKTXg`1UtkVT$|9QLr!?&FP>!V;mcKHn8 zU%UeA2rcjhK7Bk#`{)86e!3uYLUA1}jJZL{#O7bl@g)MAQAbx8qvZY^^QRJ1^ODT* z6{gnE_zvM52O?~Ucmv*rI^vu<OATbPj)r6lEzCsQV6`x%L0wvUy~4gUuiysf_#7`R zX-Ru-p5wVSBx`)YE>8%5Lo4~sDxm+pI!C?doWc@qjdWZFtc?k|z`QE;Z6LG%>}>*e zSr(V~1X-=?JKli|j9b6s^7m*CmE-;Y*MiodyLZoiYp2Nx<Fes5BxkH4Q_w~%5#um7 zxNZZ+j?YJppZ#dU_)bHP!3}(uYaKBad7w7j>}q?k!VcvMhBG<kiP+I608?bj8|iR; zTmlplOGjnOS;l}yZhP!=KLA<@wb{%3fW2cdsV{v6<m_Jm1B2fIzCeuAlRlSyf25pF zoXMHiiV3h$==d}Hmxp5UP$*NIZa8N^tOc{DIrkXE2+h&qXFrk!UJwaYqzF2ICq@1V z1x{_D#0DF51sFhv<X3WRLOo5cIow^JajjQP%r!7PA+r6sGJSXu$~y6*Df<KQ`>^x& zpe5t1m4(@(FcH#^qDS<2mYjYu9BX4f2PZ6{DQ}Hs9DNmqM=jj|pZb}uOl#S%?QHhe z-Hk#agEY?e9ssn^9|jwrJ&@^O<+K~60X)&Y?ORWN7rd0+NvJMWp`FGtOC-F@G|+8O zPBuM?!r*`^N6ds|@d52NU1j@O2Djox9c})Uh6&d%S6T2Chy^czo@dS-t?7>!FM(*< z%3e|jy39_cvSd182`_7h4?rkO*GS~GS&EOewRn?*Mi#pukYnNv?7**zO<cn!(fU>{ zYxo}MHx^POF0R4O2Cf+<u`zE#e79Lq?qD#S0xj8Kz;(H}rUExXc%@a%f|RpmDmuYs mW_eON_1nyH$ak)-o6GaNJG*g8rxDxJgb*6!9;xDwjeh}gF?RU? diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-37.pyc deleted file mode 100644 index c4d9a3fa137d252dabd1992810263c61c53751f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1443 zcmah}OK&4Z5bo}Idi;oqvI27&iHGnZYjc1@w2C%l6Ttxs$)KRouB?u`6VJNm;qG?U zS=kqsAHYwD;e_}fh!a1cPe`1W6DJOws2*pNAT6RtT~l54)pM%nlV&qQu<{??dh(}_ z(C_x}YPrBXgsmn(7-CqU3@11v3CWzq!B$3un|X-`yu)1KXF(EVVG?4LqNKKXp9fdb z8a+Z!-hS*P^`wzBd7XLFn%w72UgPx#XtsZXn9qW5QPN`G5Ou?s5Dj%5vqeu;A?BKo z(yT0`HX%zdQk53DY0vX?TrfTospgUj)y1ZLptVd-0j~zb&$3dyB-RfxZ&LPjuJmys zd3v7TqD*I=|A%TYwzhT!u%R#L5VraNBecX<XpJyh#2R0bs<xfSWJOjEXq+WkI%|T_ zZ2JT)eqGwie_pvum*Eatc}tIxDUqMf`m;Xp&eWIRYpZoTNP92H$_F1loV^YL>UYo? z*}Rwj8u|@30oeZqsNi*|Dzfz)0_vClMb#kwZ-5HH7i6%;khist!1|9_pVd`g*I45P z{szzbP|xcsj+VsQeTQf6iS13@_J%d#JGP$xbV!AWhX-Hpige23agl4D>v%$QCb*1G zsp2dy@>omGpHVRd+2$2RF|0i*&#wi0v7Yd|I9<eZ1(Koy+-R);!d!5v<5b^qa~*Tf zW^<Fk#>oa{Tzy$`6Fe%$mVvPehnh<LB|SIcQC8|p%ejndYHB&nxGL$G8`rY30mEVZ zqnrT-ETh8-m2?b~sm#{U;_e87!y?O|4ad*7zsje1@eJxOrW`1Q9dsL}scc-xV{T!l zRZ4!AE=CzG%QQbX9!z|u%yxzPqSAf7QArQdkfF_`RcVg|w=M=l)8IL~Jw@Z&{8|S} zLAT&i9Z6Y8(+1?fyqY>lUS-n_jKBFrCb({?@iz&|mJRGxwa8k<Q@D`oM<m~Y)8EHE zot3>ZEqBu#vJ+yL%`WrBhi4NjtoG;vLKU(%(V6&2q^CVQ7?jb{cCx4F;(mE)d|ixy zZGunrF%T4ncpJA#ghP1Tiuxe&;jx;=4Q&HQNSgo}%lE*tyJe!$=xna%l8;8xUU}(Q zVt;(e8;eZbw?W}8Aq_682AdiT7!;6eCGF3lYPh@yobfNHm~$m#YhDw@n2LcN58Ih4 iVAY8`<XvkOKFA6-7knRnE=XDI4rxG|F5ZEJ8_qw(37P)@ diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py deleted file mode 100644 index 61d5fb6..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py +++ /dev/null @@ -1,54 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from genshi.core import QName, Attrs -from genshi.core import START, END, TEXT, COMMENT, DOCTYPE - - -def to_genshi(walker): - """Convert a tree to a genshi tree - - :arg walker: the treewalker to use to walk the tree to convert it - - :returns: generator of genshi nodes - - """ - text = [] - for token in walker: - type = token["type"] - if type in ("Characters", "SpaceCharacters"): - text.append(token["data"]) - elif text: - yield TEXT, "".join(text), (None, -1, -1) - text = [] - - if type in ("StartTag", "EmptyTag"): - if token["namespace"]: - name = "{%s}%s" % (token["namespace"], token["name"]) - else: - name = token["name"] - attrs = Attrs([(QName("{%s}%s" % attr if attr[0] is not None else attr[1]), value) - for attr, value in token["data"].items()]) - yield (START, (QName(name), attrs), (None, -1, -1)) - if type == "EmptyTag": - type = "EndTag" - - if type == "EndTag": - if token["namespace"]: - name = "{%s}%s" % (token["namespace"], token["name"]) - else: - name = token["name"] - - yield END, QName(name), (None, -1, -1) - - elif type == "Comment": - yield COMMENT, token["data"], (None, -1, -1) - - elif type == "Doctype": - yield DOCTYPE, (token["name"], token["publicId"], - token["systemId"]), (None, -1, -1) - - else: - pass # FIXME: What to do? - - if text: - yield TEXT, "".join(text), (None, -1, -1) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/sax.py b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/sax.py deleted file mode 100644 index f4ccea5..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/sax.py +++ /dev/null @@ -1,50 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from xml.sax.xmlreader import AttributesNSImpl - -from ..constants import adjustForeignAttributes, unadjustForeignAttributes - -prefix_mapping = {} -for prefix, localName, namespace in adjustForeignAttributes.values(): - if prefix is not None: - prefix_mapping[prefix] = namespace - - -def to_sax(walker, handler): - """Call SAX-like content handler based on treewalker walker - - :arg walker: the treewalker to use to walk the tree to convert it - - :arg handler: SAX handler to use - - """ - handler.startDocument() - for prefix, namespace in prefix_mapping.items(): - handler.startPrefixMapping(prefix, namespace) - - for token in walker: - type = token["type"] - if type == "Doctype": - continue - elif type in ("StartTag", "EmptyTag"): - attrs = AttributesNSImpl(token["data"], - unadjustForeignAttributes) - handler.startElementNS((token["namespace"], token["name"]), - token["name"], - attrs) - if type == "EmptyTag": - handler.endElementNS((token["namespace"], token["name"]), - token["name"]) - elif type == "EndTag": - handler.endElementNS((token["namespace"], token["name"]), - token["name"]) - elif type in ("Characters", "SpaceCharacters"): - handler.characters(token["data"]) - elif type == "Comment": - pass - else: - assert False, "Unknown token type" - - for prefix, namespace in prefix_mapping.items(): - handler.endPrefixMapping(prefix) - handler.endDocument() diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py deleted file mode 100644 index d44447e..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py +++ /dev/null @@ -1,88 +0,0 @@ -"""A collection of modules for building different kinds of trees from HTML -documents. - -To create a treebuilder for a new type of tree, you need to do -implement several things: - -1. A set of classes for various types of elements: Document, Doctype, Comment, - Element. These must implement the interface of ``base.treebuilders.Node`` - (although comment nodes have a different signature for their constructor, - see ``treebuilders.etree.Comment``) Textual content may also be implemented - as another node type, or not, as your tree implementation requires. - -2. A treebuilder object (called ``TreeBuilder`` by convention) that inherits - from ``treebuilders.base.TreeBuilder``. This has 4 required attributes: - - * ``documentClass`` - the class to use for the bottommost node of a document - * ``elementClass`` - the class to use for HTML Elements - * ``commentClass`` - the class to use for comments - * ``doctypeClass`` - the class to use for doctypes - - It also has one required method: - - * ``getDocument`` - Returns the root node of the complete document tree - -3. If you wish to run the unit tests, you must also create a ``testSerializer`` - method on your treebuilder which accepts a node and returns a string - containing Node and its children serialized according to the format used in - the unittests - -""" - -from __future__ import absolute_import, division, unicode_literals - -from .._utils import default_etree - -treeBuilderCache = {} - - -def getTreeBuilder(treeType, implementation=None, **kwargs): - """Get a TreeBuilder class for various types of trees with built-in support - - :arg treeType: the name of the tree type required (case-insensitive). Supported - values are: - - * "dom" - A generic builder for DOM implementations, defaulting to a - xml.dom.minidom based implementation. - * "etree" - A generic builder for tree implementations exposing an - ElementTree-like interface, defaulting to xml.etree.cElementTree if - available and xml.etree.ElementTree if not. - * "lxml" - A etree-based builder for lxml.etree, handling limitations - of lxml's implementation. - - :arg implementation: (Currently applies to the "etree" and "dom" tree - types). A module implementing the tree type e.g. xml.etree.ElementTree - or xml.etree.cElementTree. - - :arg kwargs: Any additional options to pass to the TreeBuilder when - creating it. - - Example: - - >>> from html5lib.treebuilders import getTreeBuilder - >>> builder = getTreeBuilder('etree') - - """ - - treeType = treeType.lower() - if treeType not in treeBuilderCache: - if treeType == "dom": - from . import dom - # Come up with a sane default (pref. from the stdlib) - if implementation is None: - from xml.dom import minidom - implementation = minidom - # NEVER cache here, caching is done in the dom submodule - return dom.getDomModule(implementation, **kwargs).TreeBuilder - elif treeType == "lxml": - from . import etree_lxml - treeBuilderCache[treeType] = etree_lxml.TreeBuilder - elif treeType == "etree": - from . import etree - if implementation is None: - implementation = default_etree - # NEVER cache here, caching is done in the etree submodule - return etree.getETreeModule(implementation, **kwargs).TreeBuilder - else: - raise ValueError("""Unrecognised treebuilder "%s" """ % treeType) - return treeBuilderCache.get(treeType) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index fce6e544d173846144dd719d6309b8048428fa95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3277 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-37.pyc deleted file mode 100644 index c706affc1411b77c9b590bece7e764a7487f6a51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11200 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-37.pyc deleted file mode 100644 index 51b52e2d0a350bbb36b24a88426f202032d3ca54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9230 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-37.pyc deleted file mode 100644 index 37c7392c8d877da979aff094b4bb681872134162..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11809 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 F{9o5Cn5O^$ diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-37.pyc deleted file mode 100644 index c9ad906a2328a75fc95bc7de0331e2c2acb94faa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11749 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≪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 Tt)lJlG|-;TO_$ww-NpY0K6=p} diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/base.py b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/base.py deleted file mode 100644 index 73973db..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/base.py +++ /dev/null @@ -1,417 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals -from pip._vendor.six import text_type - -from ..constants import scopingElements, tableInsertModeElements, namespaces - -# The scope markers are inserted when entering object elements, -# marquees, table cells, and table captions, and are used to prevent formatting -# from "leaking" into tables, object elements, and marquees. -Marker = None - -listElementsMap = { - None: (frozenset(scopingElements), False), - "button": (frozenset(scopingElements | set([(namespaces["html"], "button")])), False), - "list": (frozenset(scopingElements | set([(namespaces["html"], "ol"), - (namespaces["html"], "ul")])), False), - "table": (frozenset([(namespaces["html"], "html"), - (namespaces["html"], "table")]), False), - "select": (frozenset([(namespaces["html"], "optgroup"), - (namespaces["html"], "option")]), True) -} - - -class Node(object): - """Represents an item in the tree""" - def __init__(self, name): - """Creates a Node - - :arg name: The tag name associated with the node - - """ - # The tag name assocaited with the node - self.name = name - # The parent of the current node (or None for the document node) - self.parent = None - # The value of the current node (applies to text nodes and comments) - self.value = None - # A dict holding name -> value pairs for attributes of the node - self.attributes = {} - # A list of child nodes of the current node. This must include all - # elements but not necessarily other node types. - self.childNodes = [] - # A list of miscellaneous flags that can be set on the node. - self._flags = [] - - def __str__(self): - attributesStr = " ".join(["%s=\"%s\"" % (name, value) - for name, value in - self.attributes.items()]) - if attributesStr: - return "<%s %s>" % (self.name, attributesStr) - else: - return "<%s>" % (self.name) - - def __repr__(self): - return "<%s>" % (self.name) - - def appendChild(self, node): - """Insert node as a child of the current node - - :arg node: the node to insert - - """ - raise NotImplementedError - - def insertText(self, data, insertBefore=None): - """Insert data as text in the current node, positioned before the - start of node insertBefore or to the end of the node's text. - - :arg data: the data to insert - - :arg insertBefore: True if you want to insert the text before the node - and False if you want to insert it after the node - - """ - raise NotImplementedError - - def insertBefore(self, node, refNode): - """Insert node as a child of the current node, before refNode in the - list of child nodes. Raises ValueError if refNode is not a child of - the current node - - :arg node: the node to insert - - :arg refNode: the child node to insert the node before - - """ - raise NotImplementedError - - def removeChild(self, node): - """Remove node from the children of the current node - - :arg node: the child node to remove - - """ - raise NotImplementedError - - def reparentChildren(self, newParent): - """Move all the children of the current node to newParent. - This is needed so that trees that don't store text as nodes move the - text in the correct way - - :arg newParent: the node to move all this node's children to - - """ - # XXX - should this method be made more general? - for child in self.childNodes: - newParent.appendChild(child) - self.childNodes = [] - - def cloneNode(self): - """Return a shallow copy of the current node i.e. a node with the same - name and attributes but with no parent or child nodes - """ - raise NotImplementedError - - def hasContent(self): - """Return true if the node has children or text, false otherwise - """ - raise NotImplementedError - - -class ActiveFormattingElements(list): - def append(self, node): - equalCount = 0 - if node != Marker: - for element in self[::-1]: - if element == Marker: - break - if self.nodesEqual(element, node): - equalCount += 1 - if equalCount == 3: - self.remove(element) - break - list.append(self, node) - - def nodesEqual(self, node1, node2): - if not node1.nameTuple == node2.nameTuple: - return False - - if not node1.attributes == node2.attributes: - return False - - return True - - -class TreeBuilder(object): - """Base treebuilder implementation - - * documentClass - the class to use for the bottommost node of a document - * elementClass - the class to use for HTML Elements - * commentClass - the class to use for comments - * doctypeClass - the class to use for doctypes - - """ - # pylint:disable=not-callable - - # Document class - documentClass = None - - # The class to use for creating a node - elementClass = None - - # The class to use for creating comments - commentClass = None - - # The class to use for creating doctypes - doctypeClass = None - - # Fragment class - fragmentClass = None - - def __init__(self, namespaceHTMLElements): - """Create a TreeBuilder - - :arg namespaceHTMLElements: whether or not to namespace HTML elements - - """ - if namespaceHTMLElements: - self.defaultNamespace = "http://www.w3.org/1999/xhtml" - else: - self.defaultNamespace = None - self.reset() - - def reset(self): - self.openElements = [] - self.activeFormattingElements = ActiveFormattingElements() - - # XXX - rename these to headElement, formElement - self.headPointer = None - self.formPointer = None - - self.insertFromTable = False - - self.document = self.documentClass() - - def elementInScope(self, target, variant=None): - - # If we pass a node in we match that. if we pass a string - # match any node with that name - exactNode = hasattr(target, "nameTuple") - if not exactNode: - if isinstance(target, text_type): - target = (namespaces["html"], target) - assert isinstance(target, tuple) - - listElements, invert = listElementsMap[variant] - - for node in reversed(self.openElements): - if exactNode and node == target: - return True - elif not exactNode and node.nameTuple == target: - return True - elif (invert ^ (node.nameTuple in listElements)): - return False - - assert False # We should never reach this point - - def reconstructActiveFormattingElements(self): - # Within this algorithm the order of steps described in the - # specification is not quite the same as the order of steps in the - # code. It should still do the same though. - - # Step 1: stop the algorithm when there's nothing to do. - if not self.activeFormattingElements: - return - - # Step 2 and step 3: we start with the last element. So i is -1. - i = len(self.activeFormattingElements) - 1 - entry = self.activeFormattingElements[i] - if entry == Marker or entry in self.openElements: - return - - # Step 6 - while entry != Marker and entry not in self.openElements: - if i == 0: - # This will be reset to 0 below - i = -1 - break - i -= 1 - # Step 5: let entry be one earlier in the list. - entry = self.activeFormattingElements[i] - - while True: - # Step 7 - i += 1 - - # Step 8 - entry = self.activeFormattingElements[i] - clone = entry.cloneNode() # Mainly to get a new copy of the attributes - - # Step 9 - element = self.insertElement({"type": "StartTag", - "name": clone.name, - "namespace": clone.namespace, - "data": clone.attributes}) - - # Step 10 - self.activeFormattingElements[i] = element - - # Step 11 - if element == self.activeFormattingElements[-1]: - break - - def clearActiveFormattingElements(self): - entry = self.activeFormattingElements.pop() - while self.activeFormattingElements and entry != Marker: - entry = self.activeFormattingElements.pop() - - def elementInActiveFormattingElements(self, name): - """Check if an element exists between the end of the active - formatting elements and the last marker. If it does, return it, else - return false""" - - for item in self.activeFormattingElements[::-1]: - # Check for Marker first because if it's a Marker it doesn't have a - # name attribute. - if item == Marker: - break - elif item.name == name: - return item - return False - - def insertRoot(self, token): - element = self.createElement(token) - self.openElements.append(element) - self.document.appendChild(element) - - def insertDoctype(self, token): - name = token["name"] - publicId = token["publicId"] - systemId = token["systemId"] - - doctype = self.doctypeClass(name, publicId, systemId) - self.document.appendChild(doctype) - - def insertComment(self, token, parent=None): - if parent is None: - parent = self.openElements[-1] - parent.appendChild(self.commentClass(token["data"])) - - def createElement(self, token): - """Create an element but don't insert it anywhere""" - name = token["name"] - namespace = token.get("namespace", self.defaultNamespace) - element = self.elementClass(name, namespace) - element.attributes = token["data"] - return element - - def _getInsertFromTable(self): - return self._insertFromTable - - def _setInsertFromTable(self, value): - """Switch the function used to insert an element from the - normal one to the misnested table one and back again""" - self._insertFromTable = value - if value: - self.insertElement = self.insertElementTable - else: - self.insertElement = self.insertElementNormal - - insertFromTable = property(_getInsertFromTable, _setInsertFromTable) - - def insertElementNormal(self, token): - name = token["name"] - assert isinstance(name, text_type), "Element %s not unicode" % name - namespace = token.get("namespace", self.defaultNamespace) - element = self.elementClass(name, namespace) - element.attributes = token["data"] - self.openElements[-1].appendChild(element) - self.openElements.append(element) - return element - - def insertElementTable(self, token): - """Create an element and insert it into the tree""" - element = self.createElement(token) - if self.openElements[-1].name not in tableInsertModeElements: - return self.insertElementNormal(token) - else: - # We should be in the InTable mode. This means we want to do - # special magic element rearranging - parent, insertBefore = self.getTableMisnestedNodePosition() - if insertBefore is None: - parent.appendChild(element) - else: - parent.insertBefore(element, insertBefore) - self.openElements.append(element) - return element - - def insertText(self, data, parent=None): - """Insert text data.""" - if parent is None: - parent = self.openElements[-1] - - if (not self.insertFromTable or (self.insertFromTable and - self.openElements[-1].name - not in tableInsertModeElements)): - parent.insertText(data) - else: - # We should be in the InTable mode. This means we want to do - # special magic element rearranging - parent, insertBefore = self.getTableMisnestedNodePosition() - parent.insertText(data, insertBefore) - - def getTableMisnestedNodePosition(self): - """Get the foster parent element, and sibling to insert before - (or None) when inserting a misnested table node""" - # The foster parent element is the one which comes before the most - # recently opened table element - # XXX - this is really inelegant - lastTable = None - fosterParent = None - insertBefore = None - for elm in self.openElements[::-1]: - if elm.name == "table": - lastTable = elm - break - if lastTable: - # XXX - we should really check that this parent is actually a - # node here - if lastTable.parent: - fosterParent = lastTable.parent - insertBefore = lastTable - else: - fosterParent = self.openElements[ - self.openElements.index(lastTable) - 1] - else: - fosterParent = self.openElements[0] - return fosterParent, insertBefore - - def generateImpliedEndTags(self, exclude=None): - name = self.openElements[-1].name - # XXX td, th and tr are not actually needed - if (name in frozenset(("dd", "dt", "li", "option", "optgroup", "p", "rp", "rt")) and - name != exclude): - self.openElements.pop() - # XXX This is not entirely what the specification says. We should - # investigate it more closely. - self.generateImpliedEndTags(exclude) - - def getDocument(self): - """Return the final tree""" - return self.document - - def getFragment(self): - """Return the final fragment""" - # assert self.innerHTML - fragment = self.fragmentClass() - self.openElements[0].reparentChildren(fragment) - return fragment - - def testSerializer(self, node): - """Serialize the subtree of node in the format required by unit tests - - :arg node: the node from which to start serializing - - """ - raise NotImplementedError diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/dom.py b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/dom.py deleted file mode 100644 index dcfac22..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/dom.py +++ /dev/null @@ -1,236 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - - -from collections import MutableMapping -from xml.dom import minidom, Node -import weakref - -from . import base -from .. import constants -from ..constants import namespaces -from .._utils import moduleFactoryFactory - - -def getDomBuilder(DomImplementation): - Dom = DomImplementation - - class AttrList(MutableMapping): - def __init__(self, element): - self.element = element - - def __iter__(self): - return iter(self.element.attributes.keys()) - - def __setitem__(self, name, value): - if isinstance(name, tuple): - raise NotImplementedError - else: - attr = self.element.ownerDocument.createAttribute(name) - attr.value = value - self.element.attributes[name] = attr - - def __len__(self): - return len(self.element.attributes) - - def items(self): - return list(self.element.attributes.items()) - - def values(self): - return list(self.element.attributes.values()) - - def __getitem__(self, name): - if isinstance(name, tuple): - raise NotImplementedError - else: - return self.element.attributes[name].value - - def __delitem__(self, name): - if isinstance(name, tuple): - raise NotImplementedError - else: - del self.element.attributes[name] - - class NodeBuilder(base.Node): - def __init__(self, element): - base.Node.__init__(self, element.nodeName) - self.element = element - - namespace = property(lambda self: hasattr(self.element, "namespaceURI") and - self.element.namespaceURI or None) - - def appendChild(self, node): - node.parent = self - self.element.appendChild(node.element) - - def insertText(self, data, insertBefore=None): - text = self.element.ownerDocument.createTextNode(data) - if insertBefore: - self.element.insertBefore(text, insertBefore.element) - else: - self.element.appendChild(text) - - def insertBefore(self, node, refNode): - self.element.insertBefore(node.element, refNode.element) - node.parent = self - - def removeChild(self, node): - if node.element.parentNode == self.element: - self.element.removeChild(node.element) - node.parent = None - - def reparentChildren(self, newParent): - while self.element.hasChildNodes(): - child = self.element.firstChild - self.element.removeChild(child) - newParent.element.appendChild(child) - self.childNodes = [] - - def getAttributes(self): - return AttrList(self.element) - - def setAttributes(self, attributes): - if attributes: - for name, value in list(attributes.items()): - if isinstance(name, tuple): - if name[0] is not None: - qualifiedName = (name[0] + ":" + name[1]) - else: - qualifiedName = name[1] - self.element.setAttributeNS(name[2], qualifiedName, - value) - else: - self.element.setAttribute( - name, value) - attributes = property(getAttributes, setAttributes) - - def cloneNode(self): - return NodeBuilder(self.element.cloneNode(False)) - - def hasContent(self): - return self.element.hasChildNodes() - - def getNameTuple(self): - if self.namespace is None: - return namespaces["html"], self.name - else: - return self.namespace, self.name - - nameTuple = property(getNameTuple) - - class TreeBuilder(base.TreeBuilder): # pylint:disable=unused-variable - def documentClass(self): - self.dom = Dom.getDOMImplementation().createDocument(None, None, None) - return weakref.proxy(self) - - def insertDoctype(self, token): - name = token["name"] - publicId = token["publicId"] - systemId = token["systemId"] - - domimpl = Dom.getDOMImplementation() - doctype = domimpl.createDocumentType(name, publicId, systemId) - self.document.appendChild(NodeBuilder(doctype)) - if Dom == minidom: - doctype.ownerDocument = self.dom - - def elementClass(self, name, namespace=None): - if namespace is None and self.defaultNamespace is None: - node = self.dom.createElement(name) - else: - node = self.dom.createElementNS(namespace, name) - - return NodeBuilder(node) - - def commentClass(self, data): - return NodeBuilder(self.dom.createComment(data)) - - def fragmentClass(self): - return NodeBuilder(self.dom.createDocumentFragment()) - - def appendChild(self, node): - self.dom.appendChild(node.element) - - def testSerializer(self, element): - return testSerializer(element) - - def getDocument(self): - return self.dom - - def getFragment(self): - return base.TreeBuilder.getFragment(self).element - - def insertText(self, data, parent=None): - data = data - if parent != self: - base.TreeBuilder.insertText(self, data, parent) - else: - # HACK: allow text nodes as children of the document node - if hasattr(self.dom, '_child_node_types'): - # pylint:disable=protected-access - if Node.TEXT_NODE not in self.dom._child_node_types: - self.dom._child_node_types = list(self.dom._child_node_types) - self.dom._child_node_types.append(Node.TEXT_NODE) - self.dom.appendChild(self.dom.createTextNode(data)) - - implementation = DomImplementation - name = None - - def testSerializer(element): - element.normalize() - rv = [] - - def serializeElement(element, indent=0): - if element.nodeType == Node.DOCUMENT_TYPE_NODE: - if element.name: - if element.publicId or element.systemId: - publicId = element.publicId or "" - systemId = element.systemId or "" - rv.append("""|%s<!DOCTYPE %s "%s" "%s">""" % - (' ' * indent, element.name, publicId, systemId)) - else: - rv.append("|%s<!DOCTYPE %s>" % (' ' * indent, element.name)) - else: - rv.append("|%s<!DOCTYPE >" % (' ' * indent,)) - elif element.nodeType == Node.DOCUMENT_NODE: - rv.append("#document") - elif element.nodeType == Node.DOCUMENT_FRAGMENT_NODE: - rv.append("#document-fragment") - elif element.nodeType == Node.COMMENT_NODE: - rv.append("|%s<!-- %s -->" % (' ' * indent, element.nodeValue)) - elif element.nodeType == Node.TEXT_NODE: - rv.append("|%s\"%s\"" % (' ' * indent, element.nodeValue)) - else: - if (hasattr(element, "namespaceURI") and - element.namespaceURI is not None): - name = "%s %s" % (constants.prefixes[element.namespaceURI], - element.nodeName) - else: - name = element.nodeName - rv.append("|%s<%s>" % (' ' * indent, name)) - if element.hasAttributes(): - attributes = [] - for i in range(len(element.attributes)): - attr = element.attributes.item(i) - name = attr.nodeName - value = attr.value - ns = attr.namespaceURI - if ns: - name = "%s %s" % (constants.prefixes[ns], attr.localName) - else: - name = attr.nodeName - attributes.append((name, value)) - - for name, value in sorted(attributes): - rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value)) - indent += 2 - for child in element.childNodes: - serializeElement(child, indent) - serializeElement(element, 0) - - return "\n".join(rv) - - return locals() - - -# The actual means to get a module! -getDomModule = moduleFactoryFactory(getDomBuilder) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/etree.py b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/etree.py deleted file mode 100644 index 0dedf44..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/etree.py +++ /dev/null @@ -1,340 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals -# pylint:disable=protected-access - -from pip._vendor.six import text_type - -import re - -from . import base -from .. import _ihatexml -from .. import constants -from ..constants import namespaces -from .._utils import moduleFactoryFactory - -tag_regexp = re.compile("{([^}]*)}(.*)") - - -def getETreeBuilder(ElementTreeImplementation, fullTree=False): - ElementTree = ElementTreeImplementation - ElementTreeCommentType = ElementTree.Comment("asd").tag - - class Element(base.Node): - def __init__(self, name, namespace=None): - self._name = name - self._namespace = namespace - self._element = ElementTree.Element(self._getETreeTag(name, - namespace)) - if namespace is None: - self.nameTuple = namespaces["html"], self._name - else: - self.nameTuple = self._namespace, self._name - self.parent = None - self._childNodes = [] - self._flags = [] - - def _getETreeTag(self, name, namespace): - if namespace is None: - etree_tag = name - else: - etree_tag = "{%s}%s" % (namespace, name) - return etree_tag - - def _setName(self, name): - self._name = name - self._element.tag = self._getETreeTag(self._name, self._namespace) - - def _getName(self): - return self._name - - name = property(_getName, _setName) - - def _setNamespace(self, namespace): - self._namespace = namespace - self._element.tag = self._getETreeTag(self._name, self._namespace) - - def _getNamespace(self): - return self._namespace - - namespace = property(_getNamespace, _setNamespace) - - def _getAttributes(self): - return self._element.attrib - - def _setAttributes(self, attributes): - # Delete existing attributes first - # XXX - there may be a better way to do this... - for key in list(self._element.attrib.keys()): - del self._element.attrib[key] - for key, value in attributes.items(): - if isinstance(key, tuple): - name = "{%s}%s" % (key[2], key[1]) - else: - name = key - self._element.set(name, value) - - attributes = property(_getAttributes, _setAttributes) - - def _getChildNodes(self): - return self._childNodes - - def _setChildNodes(self, value): - del self._element[:] - self._childNodes = [] - for element in value: - self.insertChild(element) - - childNodes = property(_getChildNodes, _setChildNodes) - - def hasContent(self): - """Return true if the node has children or text""" - return bool(self._element.text or len(self._element)) - - def appendChild(self, node): - self._childNodes.append(node) - self._element.append(node._element) - node.parent = self - - def insertBefore(self, node, refNode): - index = list(self._element).index(refNode._element) - self._element.insert(index, node._element) - node.parent = self - - def removeChild(self, node): - self._childNodes.remove(node) - self._element.remove(node._element) - node.parent = None - - def insertText(self, data, insertBefore=None): - if not(len(self._element)): - if not self._element.text: - self._element.text = "" - self._element.text += data - elif insertBefore is None: - # Insert the text as the tail of the last child element - if not self._element[-1].tail: - self._element[-1].tail = "" - self._element[-1].tail += data - else: - # Insert the text before the specified node - children = list(self._element) - index = children.index(insertBefore._element) - if index > 0: - if not self._element[index - 1].tail: - self._element[index - 1].tail = "" - self._element[index - 1].tail += data - else: - if not self._element.text: - self._element.text = "" - self._element.text += data - - def cloneNode(self): - element = type(self)(self.name, self.namespace) - for name, value in self.attributes.items(): - element.attributes[name] = value - return element - - def reparentChildren(self, newParent): - if newParent.childNodes: - newParent.childNodes[-1]._element.tail += self._element.text - else: - if not newParent._element.text: - newParent._element.text = "" - if self._element.text is not None: - newParent._element.text += self._element.text - self._element.text = "" - base.Node.reparentChildren(self, newParent) - - class Comment(Element): - def __init__(self, data): - # Use the superclass constructor to set all properties on the - # wrapper element - self._element = ElementTree.Comment(data) - self.parent = None - self._childNodes = [] - self._flags = [] - - def _getData(self): - return self._element.text - - def _setData(self, value): - self._element.text = value - - data = property(_getData, _setData) - - class DocumentType(Element): - def __init__(self, name, publicId, systemId): - Element.__init__(self, "<!DOCTYPE>") - self._element.text = name - self.publicId = publicId - self.systemId = systemId - - def _getPublicId(self): - return self._element.get("publicId", "") - - def _setPublicId(self, value): - if value is not None: - self._element.set("publicId", value) - - publicId = property(_getPublicId, _setPublicId) - - def _getSystemId(self): - return self._element.get("systemId", "") - - def _setSystemId(self, value): - if value is not None: - self._element.set("systemId", value) - - systemId = property(_getSystemId, _setSystemId) - - class Document(Element): - def __init__(self): - Element.__init__(self, "DOCUMENT_ROOT") - - class DocumentFragment(Element): - def __init__(self): - Element.__init__(self, "DOCUMENT_FRAGMENT") - - def testSerializer(element): - rv = [] - - def serializeElement(element, indent=0): - if not(hasattr(element, "tag")): - element = element.getroot() - if element.tag == "<!DOCTYPE>": - if element.get("publicId") or element.get("systemId"): - publicId = element.get("publicId") or "" - systemId = element.get("systemId") or "" - rv.append("""<!DOCTYPE %s "%s" "%s">""" % - (element.text, publicId, systemId)) - else: - rv.append("<!DOCTYPE %s>" % (element.text,)) - elif element.tag == "DOCUMENT_ROOT": - rv.append("#document") - if element.text is not None: - rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text)) - if element.tail is not None: - raise TypeError("Document node cannot have tail") - if hasattr(element, "attrib") and len(element.attrib): - raise TypeError("Document node cannot have attributes") - elif element.tag == ElementTreeCommentType: - rv.append("|%s<!-- %s -->" % (' ' * indent, element.text)) - else: - assert isinstance(element.tag, text_type), \ - "Expected unicode, got %s, %s" % (type(element.tag), element.tag) - nsmatch = tag_regexp.match(element.tag) - - if nsmatch is None: - name = element.tag - else: - ns, name = nsmatch.groups() - prefix = constants.prefixes[ns] - name = "%s %s" % (prefix, name) - rv.append("|%s<%s>" % (' ' * indent, name)) - - if hasattr(element, "attrib"): - attributes = [] - for name, value in element.attrib.items(): - nsmatch = tag_regexp.match(name) - if nsmatch is not None: - ns, name = nsmatch.groups() - prefix = constants.prefixes[ns] - attr_string = "%s %s" % (prefix, name) - else: - attr_string = name - attributes.append((attr_string, value)) - - for name, value in sorted(attributes): - rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value)) - if element.text: - rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text)) - indent += 2 - for child in element: - serializeElement(child, indent) - if element.tail: - rv.append("|%s\"%s\"" % (' ' * (indent - 2), element.tail)) - serializeElement(element, 0) - - return "\n".join(rv) - - def tostring(element): # pylint:disable=unused-variable - """Serialize an element and its child nodes to a string""" - rv = [] - filter = _ihatexml.InfosetFilter() - - def serializeElement(element): - if isinstance(element, ElementTree.ElementTree): - element = element.getroot() - - if element.tag == "<!DOCTYPE>": - if element.get("publicId") or element.get("systemId"): - publicId = element.get("publicId") or "" - systemId = element.get("systemId") or "" - rv.append("""<!DOCTYPE %s PUBLIC "%s" "%s">""" % - (element.text, publicId, systemId)) - else: - rv.append("<!DOCTYPE %s>" % (element.text,)) - elif element.tag == "DOCUMENT_ROOT": - if element.text is not None: - rv.append(element.text) - if element.tail is not None: - raise TypeError("Document node cannot have tail") - if hasattr(element, "attrib") and len(element.attrib): - raise TypeError("Document node cannot have attributes") - - for child in element: - serializeElement(child) - - elif element.tag == ElementTreeCommentType: - rv.append("<!--%s-->" % (element.text,)) - else: - # This is assumed to be an ordinary element - if not element.attrib: - rv.append("<%s>" % (filter.fromXmlName(element.tag),)) - else: - attr = " ".join(["%s=\"%s\"" % ( - filter.fromXmlName(name), value) - for name, value in element.attrib.items()]) - rv.append("<%s %s>" % (element.tag, attr)) - if element.text: - rv.append(element.text) - - for child in element: - serializeElement(child) - - rv.append("</%s>" % (element.tag,)) - - if element.tail: - rv.append(element.tail) - - serializeElement(element) - - return "".join(rv) - - class TreeBuilder(base.TreeBuilder): # pylint:disable=unused-variable - documentClass = Document - doctypeClass = DocumentType - elementClass = Element - commentClass = Comment - fragmentClass = DocumentFragment - implementation = ElementTreeImplementation - - def testSerializer(self, element): - return testSerializer(element) - - def getDocument(self): - if fullTree: - return self.document._element - else: - if self.defaultNamespace is not None: - return self.document._element.find( - "{%s}html" % self.defaultNamespace) - else: - return self.document._element.find("html") - - def getFragment(self): - return base.TreeBuilder.getFragment(self)._element - - return locals() - - -getETreeModule = moduleFactoryFactory(getETreeBuilder) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py deleted file mode 100644 index ca12a99..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py +++ /dev/null @@ -1,366 +0,0 @@ -"""Module for supporting the lxml.etree library. The idea here is to use as much -of the native library as possible, without using fragile hacks like custom element -names that break between releases. The downside of this is that we cannot represent -all possible trees; specifically the following are known to cause problems: - -Text or comments as siblings of the root element -Docypes with no name - -When any of these things occur, we emit a DataLossWarning -""" - -from __future__ import absolute_import, division, unicode_literals -# pylint:disable=protected-access - -import warnings -import re -import sys - -from . import base -from ..constants import DataLossWarning -from .. import constants -from . import etree as etree_builders -from .. import _ihatexml - -import lxml.etree as etree - - -fullTree = True -tag_regexp = re.compile("{([^}]*)}(.*)") - -comment_type = etree.Comment("asd").tag - - -class DocumentType(object): - def __init__(self, name, publicId, systemId): - self.name = name - self.publicId = publicId - self.systemId = systemId - - -class Document(object): - def __init__(self): - self._elementTree = None - self._childNodes = [] - - def appendChild(self, element): - self._elementTree.getroot().addnext(element._element) - - def _getChildNodes(self): - return self._childNodes - - childNodes = property(_getChildNodes) - - -def testSerializer(element): - rv = [] - infosetFilter = _ihatexml.InfosetFilter(preventDoubleDashComments=True) - - def serializeElement(element, indent=0): - if not hasattr(element, "tag"): - if hasattr(element, "getroot"): - # Full tree case - rv.append("#document") - if element.docinfo.internalDTD: - if not (element.docinfo.public_id or - element.docinfo.system_url): - dtd_str = "<!DOCTYPE %s>" % element.docinfo.root_name - else: - dtd_str = """<!DOCTYPE %s "%s" "%s">""" % ( - element.docinfo.root_name, - element.docinfo.public_id, - element.docinfo.system_url) - rv.append("|%s%s" % (' ' * (indent + 2), dtd_str)) - next_element = element.getroot() - while next_element.getprevious() is not None: - next_element = next_element.getprevious() - while next_element is not None: - serializeElement(next_element, indent + 2) - next_element = next_element.getnext() - elif isinstance(element, str) or isinstance(element, bytes): - # Text in a fragment - assert isinstance(element, str) or sys.version_info[0] == 2 - rv.append("|%s\"%s\"" % (' ' * indent, element)) - else: - # Fragment case - rv.append("#document-fragment") - for next_element in element: - serializeElement(next_element, indent + 2) - elif element.tag == comment_type: - rv.append("|%s<!-- %s -->" % (' ' * indent, element.text)) - if hasattr(element, "tail") and element.tail: - rv.append("|%s\"%s\"" % (' ' * indent, element.tail)) - else: - assert isinstance(element, etree._Element) - nsmatch = etree_builders.tag_regexp.match(element.tag) - if nsmatch is not None: - ns = nsmatch.group(1) - tag = nsmatch.group(2) - prefix = constants.prefixes[ns] - rv.append("|%s<%s %s>" % (' ' * indent, prefix, - infosetFilter.fromXmlName(tag))) - else: - rv.append("|%s<%s>" % (' ' * indent, - infosetFilter.fromXmlName(element.tag))) - - if hasattr(element, "attrib"): - attributes = [] - for name, value in element.attrib.items(): - nsmatch = tag_regexp.match(name) - if nsmatch is not None: - ns, name = nsmatch.groups() - name = infosetFilter.fromXmlName(name) - prefix = constants.prefixes[ns] - attr_string = "%s %s" % (prefix, name) - else: - attr_string = infosetFilter.fromXmlName(name) - attributes.append((attr_string, value)) - - for name, value in sorted(attributes): - rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value)) - - if element.text: - rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text)) - indent += 2 - for child in element: - serializeElement(child, indent) - if hasattr(element, "tail") and element.tail: - rv.append("|%s\"%s\"" % (' ' * (indent - 2), element.tail)) - serializeElement(element, 0) - - return "\n".join(rv) - - -def tostring(element): - """Serialize an element and its child nodes to a string""" - rv = [] - - def serializeElement(element): - if not hasattr(element, "tag"): - if element.docinfo.internalDTD: - if element.docinfo.doctype: - dtd_str = element.docinfo.doctype - else: - dtd_str = "<!DOCTYPE %s>" % element.docinfo.root_name - rv.append(dtd_str) - serializeElement(element.getroot()) - - elif element.tag == comment_type: - rv.append("<!--%s-->" % (element.text,)) - - else: - # This is assumed to be an ordinary element - if not element.attrib: - rv.append("<%s>" % (element.tag,)) - else: - attr = " ".join(["%s=\"%s\"" % (name, value) - for name, value in element.attrib.items()]) - rv.append("<%s %s>" % (element.tag, attr)) - if element.text: - rv.append(element.text) - - for child in element: - serializeElement(child) - - rv.append("</%s>" % (element.tag,)) - - if hasattr(element, "tail") and element.tail: - rv.append(element.tail) - - serializeElement(element) - - return "".join(rv) - - -class TreeBuilder(base.TreeBuilder): - documentClass = Document - doctypeClass = DocumentType - elementClass = None - commentClass = None - fragmentClass = Document - implementation = etree - - def __init__(self, namespaceHTMLElements, fullTree=False): - builder = etree_builders.getETreeModule(etree, fullTree=fullTree) - infosetFilter = self.infosetFilter = _ihatexml.InfosetFilter(preventDoubleDashComments=True) - self.namespaceHTMLElements = namespaceHTMLElements - - class Attributes(dict): - def __init__(self, element, value=None): - if value is None: - value = {} - self._element = element - dict.__init__(self, value) # pylint:disable=non-parent-init-called - for key, value in self.items(): - if isinstance(key, tuple): - name = "{%s}%s" % (key[2], infosetFilter.coerceAttribute(key[1])) - else: - name = infosetFilter.coerceAttribute(key) - self._element._element.attrib[name] = value - - def __setitem__(self, key, value): - dict.__setitem__(self, key, value) - if isinstance(key, tuple): - name = "{%s}%s" % (key[2], infosetFilter.coerceAttribute(key[1])) - else: - name = infosetFilter.coerceAttribute(key) - self._element._element.attrib[name] = value - - class Element(builder.Element): - def __init__(self, name, namespace): - name = infosetFilter.coerceElement(name) - builder.Element.__init__(self, name, namespace=namespace) - self._attributes = Attributes(self) - - def _setName(self, name): - self._name = infosetFilter.coerceElement(name) - self._element.tag = self._getETreeTag( - self._name, self._namespace) - - def _getName(self): - return infosetFilter.fromXmlName(self._name) - - name = property(_getName, _setName) - - def _getAttributes(self): - return self._attributes - - def _setAttributes(self, attributes): - self._attributes = Attributes(self, attributes) - - attributes = property(_getAttributes, _setAttributes) - - def insertText(self, data, insertBefore=None): - data = infosetFilter.coerceCharacters(data) - builder.Element.insertText(self, data, insertBefore) - - def appendChild(self, child): - builder.Element.appendChild(self, child) - - class Comment(builder.Comment): - def __init__(self, data): - data = infosetFilter.coerceComment(data) - builder.Comment.__init__(self, data) - - def _setData(self, data): - data = infosetFilter.coerceComment(data) - self._element.text = data - - def _getData(self): - return self._element.text - - data = property(_getData, _setData) - - self.elementClass = Element - self.commentClass = Comment - # self.fragmentClass = builder.DocumentFragment - base.TreeBuilder.__init__(self, namespaceHTMLElements) - - def reset(self): - base.TreeBuilder.reset(self) - self.insertComment = self.insertCommentInitial - self.initial_comments = [] - self.doctype = None - - def testSerializer(self, element): - return testSerializer(element) - - def getDocument(self): - if fullTree: - return self.document._elementTree - else: - return self.document._elementTree.getroot() - - def getFragment(self): - fragment = [] - element = self.openElements[0]._element - if element.text: - fragment.append(element.text) - fragment.extend(list(element)) - if element.tail: - fragment.append(element.tail) - return fragment - - def insertDoctype(self, token): - name = token["name"] - publicId = token["publicId"] - systemId = token["systemId"] - - if not name: - warnings.warn("lxml cannot represent empty doctype", DataLossWarning) - self.doctype = None - else: - coercedName = self.infosetFilter.coerceElement(name) - if coercedName != name: - warnings.warn("lxml cannot represent non-xml doctype", DataLossWarning) - - doctype = self.doctypeClass(coercedName, publicId, systemId) - self.doctype = doctype - - def insertCommentInitial(self, data, parent=None): - assert parent is None or parent is self.document - assert self.document._elementTree is None - self.initial_comments.append(data) - - def insertCommentMain(self, data, parent=None): - if (parent == self.document and - self.document._elementTree.getroot()[-1].tag == comment_type): - warnings.warn("lxml cannot represent adjacent comments beyond the root elements", DataLossWarning) - super(TreeBuilder, self).insertComment(data, parent) - - def insertRoot(self, token): - # Because of the way libxml2 works, it doesn't seem to be possible to - # alter information like the doctype after the tree has been parsed. - # Therefore we need to use the built-in parser to create our initial - # tree, after which we can add elements like normal - docStr = "" - if self.doctype: - assert self.doctype.name - docStr += "<!DOCTYPE %s" % self.doctype.name - if (self.doctype.publicId is not None or - self.doctype.systemId is not None): - docStr += (' PUBLIC "%s" ' % - (self.infosetFilter.coercePubid(self.doctype.publicId or ""))) - if self.doctype.systemId: - sysid = self.doctype.systemId - if sysid.find("'") >= 0 and sysid.find('"') >= 0: - warnings.warn("DOCTYPE system cannot contain single and double quotes", DataLossWarning) - sysid = sysid.replace("'", 'U00027') - if sysid.find("'") >= 0: - docStr += '"%s"' % sysid - else: - docStr += "'%s'" % sysid - else: - docStr += "''" - docStr += ">" - if self.doctype.name != token["name"]: - warnings.warn("lxml cannot represent doctype with a different name to the root element", DataLossWarning) - docStr += "<THIS_SHOULD_NEVER_APPEAR_PUBLICLY/>" - root = etree.fromstring(docStr) - - # Append the initial comments: - for comment_token in self.initial_comments: - comment = self.commentClass(comment_token["data"]) - root.addprevious(comment._element) - - # Create the root document and add the ElementTree to it - self.document = self.documentClass() - self.document._elementTree = root.getroottree() - - # Give the root element the right name - name = token["name"] - namespace = token.get("namespace", self.defaultNamespace) - if namespace is None: - etree_tag = name - else: - etree_tag = "{%s}%s" % (namespace, name) - root.tag = etree_tag - - # Add the root element to the internal child/open data structures - root_element = self.elementClass(name, namespace) - root_element._element = root - self.document._childNodes.append(root_element) - self.openElements.append(root_element) - - # Reset to the default insert comment function - self.insertComment = self.insertCommentMain diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py deleted file mode 100644 index 9bec207..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py +++ /dev/null @@ -1,154 +0,0 @@ -"""A collection of modules for iterating through different kinds of -tree, generating tokens identical to those produced by the tokenizer -module. - -To create a tree walker for a new type of tree, you need to do -implement a tree walker object (called TreeWalker by convention) that -implements a 'serialize' method taking a tree as sole argument and -returning an iterator generating tokens. -""" - -from __future__ import absolute_import, division, unicode_literals - -from .. import constants -from .._utils import default_etree - -__all__ = ["getTreeWalker", "pprint"] - -treeWalkerCache = {} - - -def getTreeWalker(treeType, implementation=None, **kwargs): - """Get a TreeWalker class for various types of tree with built-in support - - :arg str treeType: the name of the tree type required (case-insensitive). - Supported values are: - - * "dom": The xml.dom.minidom DOM implementation - * "etree": A generic walker for tree implementations exposing an - elementtree-like interface (known to work with ElementTree, - cElementTree and lxml.etree). - * "lxml": Optimized walker for lxml.etree - * "genshi": a Genshi stream - - :arg implementation: A module implementing the tree type e.g. - xml.etree.ElementTree or cElementTree (Currently applies to the "etree" - tree type only). - - :arg kwargs: keyword arguments passed to the etree walker--for other - walkers, this has no effect - - :returns: a TreeWalker class - - """ - - treeType = treeType.lower() - if treeType not in treeWalkerCache: - if treeType == "dom": - from . import dom - treeWalkerCache[treeType] = dom.TreeWalker - elif treeType == "genshi": - from . import genshi - treeWalkerCache[treeType] = genshi.TreeWalker - elif treeType == "lxml": - from . import etree_lxml - treeWalkerCache[treeType] = etree_lxml.TreeWalker - elif treeType == "etree": - from . import etree - if implementation is None: - implementation = default_etree - # XXX: NEVER cache here, caching is done in the etree submodule - return etree.getETreeModule(implementation, **kwargs).TreeWalker - return treeWalkerCache.get(treeType) - - -def concatenateCharacterTokens(tokens): - pendingCharacters = [] - for token in tokens: - type = token["type"] - if type in ("Characters", "SpaceCharacters"): - pendingCharacters.append(token["data"]) - else: - if pendingCharacters: - yield {"type": "Characters", "data": "".join(pendingCharacters)} - pendingCharacters = [] - yield token - if pendingCharacters: - yield {"type": "Characters", "data": "".join(pendingCharacters)} - - -def pprint(walker): - """Pretty printer for tree walkers - - Takes a TreeWalker instance and pretty prints the output of walking the tree. - - :arg walker: a TreeWalker instance - - """ - output = [] - indent = 0 - for token in concatenateCharacterTokens(walker): - type = token["type"] - if type in ("StartTag", "EmptyTag"): - # tag name - if token["namespace"] and token["namespace"] != constants.namespaces["html"]: - if token["namespace"] in constants.prefixes: - ns = constants.prefixes[token["namespace"]] - else: - ns = token["namespace"] - name = "%s %s" % (ns, token["name"]) - else: - name = token["name"] - output.append("%s<%s>" % (" " * indent, name)) - indent += 2 - # attributes (sorted for consistent ordering) - attrs = token["data"] - for (namespace, localname), value in sorted(attrs.items()): - if namespace: - if namespace in constants.prefixes: - ns = constants.prefixes[namespace] - else: - ns = namespace - name = "%s %s" % (ns, localname) - else: - name = localname - output.append("%s%s=\"%s\"" % (" " * indent, name, value)) - # self-closing - if type == "EmptyTag": - indent -= 2 - - elif type == "EndTag": - indent -= 2 - - elif type == "Comment": - output.append("%s<!-- %s -->" % (" " * indent, token["data"])) - - elif type == "Doctype": - if token["name"]: - if token["publicId"]: - output.append("""%s<!DOCTYPE %s "%s" "%s">""" % - (" " * indent, - token["name"], - token["publicId"], - token["systemId"] if token["systemId"] else "")) - elif token["systemId"]: - output.append("""%s<!DOCTYPE %s "" "%s">""" % - (" " * indent, - token["name"], - token["systemId"])) - else: - output.append("%s<!DOCTYPE %s>" % (" " * indent, - token["name"])) - else: - output.append("%s<!DOCTYPE >" % (" " * indent,)) - - elif type == "Characters": - output.append("%s\"%s\"" % (" " * indent, token["data"])) - - elif type == "SpaceCharacters": - assert False, "concatenateCharacterTokens should have got rid of all Space tokens" - - else: - raise ValueError("Unknown token type, %s" % type) - - return "\n".join(output) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 1fde618f984a534a3166cc217bf21d673f99063e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3954 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-37.pyc deleted file mode 100644 index 428806a43a9fbb0b117e2b4e6a8bb1ad1a9c1337..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6950 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-37.pyc deleted file mode 100644 index 0c0ade60becc2863e5f84e6a9e9af47a016eae3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1679 zcma)6&2Aev5GMCWyHcdYaa6~SQ=o?eg^I>P4+VM%f;f^AxNTN}E!Qo9bg>e-@ygtl zOs-rja861495#CDwU5z9;I+Nv-cwJVSw&J}6hR2g>~Lmw=HqaN4{EgvftCHX{`41@ zkiT#<Uk(WOf%F4loNy{hN*PTpW~DZ>De5fgq%Lzowz(rqsmDA@9ue;H(ksGC!W;T8 zZC2*q9%=ZmAr5KS=33O(BRR=Mn55&8%8k#HlSC(@%&bhZWH90)lu0gBBz1!tCjiB3 zivPl<A89ebK=WmRa34s20Zb4^Ibjy3+<HZrjj-VB%m6W$d)$Y8iI)LT#Z-Dqh=WKT z2{phtxbWB|pcat+2iO@MlAI2$BTIdf+d~KTE>H=`i=Dl>-3Om?Y#o)<J@Bf4^-63l ztX25?kA%FiPQS@(V7q#L?Sj0dZSwT%7xo!FUpcccC`k73y80FP>Y0Ty(2dx-OOAh< z={SL}JJTEx$Ww<{*MU9)e|o-lL1K52^Csl{6MWV$Vc7trw+f_xgLN~edl>09co9U* z3DkxLjgOh1LFIeXu~5((gsrx_t^LQHpcnRje9{SnZo8vAG<aY@m2t8t6~-S=`Z5{p zaO3N#&PBSzS-IEwp;!FER$J}u-gdaxY4vux!A$3%nUyi$_mP|kR_%P(DN<n;<H$tk zrV{13O8U?^+BipIs@cjjk#EnH*e0xs2=q7_i2dCi<DL}3%5pS_WB?ZCy@_jzvlXh^ zVWeA!iR2hSvudmRc$wLIvtzZz;SmvATWlZhZa-T1Gk>l(-hS|H&^-tmj&Zb*F%$>l z8y61&`0?{QQ8%G}|8|;rI&O}W@tq{oc_if>emu=izl;x2Sx|T)GCoqx!#tH=$)w-R zp>uyOI#)OODBT)Q%~hxdo}n%BD3Q7hq4lT02(8k(wMwg2l{&OeE3^drI%rW-1&eP# z-&l^q*1K^QlYtY0V^~ZEjtF+ltXC+j#EH^*QOAa*Zh%$Qk>LSnY#k(1gV+xjo`_Bt zgGZmQzYAdL^kMn0Wa2d6OQ7+xXYT`06lv-D*;@!Mmtg7jVGt_gNQtbtg7+c75<FRW ze*PAKOC?x31r5*mVTipQhNcpR>4;Ax%GEGDo<wqHQ5z6U-9omB>^8FH1r!qAg7SeO z=|Z6Xrf>Upp$+g=48wSmPZY#gcsa^OhVP>BPE)xB?N&SphRnu)Ef{6HVlYuUIT6cS YEaLrNdgI@n;lGF7q_LCg7PO-M9{|jv#{d8T diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-37.pyc deleted file mode 100644 index ef04999511189993d321f0621f1addb062091621..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3486 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree_lxml.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree_lxml.cpython-37.pyc deleted file mode 100644 index 6aaa7d31e6b8f68e236062dc454dd085357aa3d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6595 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 SdWyed<SQ>!%9VWO#s33hsau%< diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/genshi.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/genshi.cpython-37.pyc deleted file mode 100644 index 103a133b833de7eaf39b48c1dac715268cede223..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1853 zcmZ`(OK%iM5bo}I?(FP(y{rvR$U`|Gtpu1zNt6RZIQA+J#S6hJOh%x|dV37xoyWST z*Q`-b6ba6VpMaHIa!2_I`4N51iA#P!6h*0;!30IgjJmqIs=DgyuB!g5)$#~@*^lS$ zSq(yd!^P=m0&^Wk@e~LroF*it0Zm!JQX?=Z%2;BiR$x`U0lXd9sS`M<8@OpBXrx}? zRXP)N&7hh3fuFX5R@x5Q=~A$ic7hJ*Ep8{vX*cKs?{GIcllFpMx)Q8V@;TuR?mZ#g zi@FD^kBwlJH+M+ie+igK-_T3ry&_NMG795#mJ6v}9v{U;oM*Z-&*DkWqcDkOB*sb6 zr`q~vI8LL!rLCRO#;uVy2E#4gy0iUtINaDC?A+Yg9B60j#^&hTn*(i*26sk%Tf3EQ zINZ@TnB&~6C7W9tqYd3aVa>9eUutLb#`gALIC@DDA=T#IxQJddTrlk)<uM;5Q5t2k z&|U^$irIJ)6%#zq>4(PGVHD?qL?ob`1dLP8o{+%c1~*|gxdr!NYi}f?Xm^}UBQe2< z_+jQO80fU%KsYJs;uA#<$QHSGv1AH7P8;H*#aoIzr-~|e!a(DdhB9swN)9jV62(e- z=)+vwes^li$-iuG?Sg;6LWgibQvw`q%X}JTMc>qB5heTDor&lu&gX@;q9ZuEwkm_4 ziFgOl{qe=ROlRw}cy=ky3OP=aOZ@OSTYR|x0EN{EVH?lI`U9CJA1CqNI>vce9lKb+ z53wG^muJV?4MR+J7`E`}T_A*+)Tb`(QjfX@&X3Ogb7hxL?I#A>!q<l3!l>@<2e?s1 z?;531nx&--Nv2Hvs?58rv`a_X2efp7va%7A(p!A09Js|Rplz1EG*nZXkC_-LUwNu| zz+ljQc9k4nK?x_SS+C%Z8`9!*4ZXimuC%ANc(M2ja^t9ma$z^~$?UmeoUIY*PK}B; z)`+sF#)(;FuBBR4=6>2GSqFAD>YXQ5KC@o{y9?g`Qf7tOM9i<F8pZEbR7d;?J3ZWa z!q8jxJ?v{v*)u9uLE|g)gjVu>khd!NwM77$HfjKeU%tZej2>PDB-g-hsj|Bb)z?wx zQ&R1}0P<zIB)jsA?8z0my6;SFh%(E3@OD-ib)2fM%%L_h?E=eNECcDE6E;k`k>rzc zf=#3wuUkob(EeCP*(4I!1!4tB4@lrf=}aDv#`lF&Ex}4iSZW)p3&kA}YiE+D*q{R6 zMyTj$Aq6~+py2sL9?v3y1tOYAd?Z+G0t-hh0nyGpn`ZgLtlt)ED0~}*W(IDwIgK-} zO+J=mO+#(S@%_LVODW>L0!-i};sdY_mM3|36bTve@Kj5unjQ&!5vr!C$-B5b2Lxjj z*MShMbNFreP1=T4mvvYVdY}ux&$_JE^=OBAv<;(EQRLc`8IP9V=#ILLhwxrPV<EaQ z)Ls~-IiDxU`(b!EuQL#a;ys97fq4TU_P3}|t^$X*Rp9Fc2-^ZB!~R+HxIdS30UiZD zeFA$?pjps-)!LI>yh<h}zRF&m1k6j7r~geyol_$4G0+XTS1b)#R0UC&2IBZH$lASH VpY$45UV-3y%%|t+`^;w@<8Lnxz0m*w diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/base.py b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/base.py deleted file mode 100644 index 80c474c..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/base.py +++ /dev/null @@ -1,252 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from xml.dom import Node -from ..constants import namespaces, voidElements, spaceCharacters - -__all__ = ["DOCUMENT", "DOCTYPE", "TEXT", "ELEMENT", "COMMENT", "ENTITY", "UNKNOWN", - "TreeWalker", "NonRecursiveTreeWalker"] - -DOCUMENT = Node.DOCUMENT_NODE -DOCTYPE = Node.DOCUMENT_TYPE_NODE -TEXT = Node.TEXT_NODE -ELEMENT = Node.ELEMENT_NODE -COMMENT = Node.COMMENT_NODE -ENTITY = Node.ENTITY_NODE -UNKNOWN = "<#UNKNOWN#>" - -spaceCharacters = "".join(spaceCharacters) - - -class TreeWalker(object): - """Walks a tree yielding tokens - - Tokens are dicts that all have a ``type`` field specifying the type of the - token. - - """ - def __init__(self, tree): - """Creates a TreeWalker - - :arg tree: the tree to walk - - """ - self.tree = tree - - def __iter__(self): - raise NotImplementedError - - def error(self, msg): - """Generates an error token with the given message - - :arg msg: the error message - - :returns: SerializeError token - - """ - return {"type": "SerializeError", "data": msg} - - def emptyTag(self, namespace, name, attrs, hasChildren=False): - """Generates an EmptyTag token - - :arg namespace: the namespace of the token--can be ``None`` - - :arg name: the name of the element - - :arg attrs: the attributes of the element as a dict - - :arg hasChildren: whether or not to yield a SerializationError because - this tag shouldn't have children - - :returns: EmptyTag token - - """ - yield {"type": "EmptyTag", "name": name, - "namespace": namespace, - "data": attrs} - if hasChildren: - yield self.error("Void element has children") - - def startTag(self, namespace, name, attrs): - """Generates a StartTag token - - :arg namespace: the namespace of the token--can be ``None`` - - :arg name: the name of the element - - :arg attrs: the attributes of the element as a dict - - :returns: StartTag token - - """ - return {"type": "StartTag", - "name": name, - "namespace": namespace, - "data": attrs} - - def endTag(self, namespace, name): - """Generates an EndTag token - - :arg namespace: the namespace of the token--can be ``None`` - - :arg name: the name of the element - - :returns: EndTag token - - """ - return {"type": "EndTag", - "name": name, - "namespace": namespace} - - def text(self, data): - """Generates SpaceCharacters and Characters tokens - - Depending on what's in the data, this generates one or more - ``SpaceCharacters`` and ``Characters`` tokens. - - For example: - - >>> from html5lib.treewalkers.base import TreeWalker - >>> # Give it an empty tree just so it instantiates - >>> walker = TreeWalker([]) - >>> list(walker.text('')) - [] - >>> list(walker.text(' ')) - [{u'data': ' ', u'type': u'SpaceCharacters'}] - >>> list(walker.text(' abc ')) # doctest: +NORMALIZE_WHITESPACE - [{u'data': ' ', u'type': u'SpaceCharacters'}, - {u'data': u'abc', u'type': u'Characters'}, - {u'data': u' ', u'type': u'SpaceCharacters'}] - - :arg data: the text data - - :returns: one or more ``SpaceCharacters`` and ``Characters`` tokens - - """ - data = data - middle = data.lstrip(spaceCharacters) - left = data[:len(data) - len(middle)] - if left: - yield {"type": "SpaceCharacters", "data": left} - data = middle - middle = data.rstrip(spaceCharacters) - right = data[len(middle):] - if middle: - yield {"type": "Characters", "data": middle} - if right: - yield {"type": "SpaceCharacters", "data": right} - - def comment(self, data): - """Generates a Comment token - - :arg data: the comment - - :returns: Comment token - - """ - return {"type": "Comment", "data": data} - - def doctype(self, name, publicId=None, systemId=None): - """Generates a Doctype token - - :arg name: - - :arg publicId: - - :arg systemId: - - :returns: the Doctype token - - """ - return {"type": "Doctype", - "name": name, - "publicId": publicId, - "systemId": systemId} - - def entity(self, name): - """Generates an Entity token - - :arg name: the entity name - - :returns: an Entity token - - """ - return {"type": "Entity", "name": name} - - def unknown(self, nodeType): - """Handles unknown node types""" - return self.error("Unknown node type: " + nodeType) - - -class NonRecursiveTreeWalker(TreeWalker): - def getNodeDetails(self, node): - raise NotImplementedError - - def getFirstChild(self, node): - raise NotImplementedError - - def getNextSibling(self, node): - raise NotImplementedError - - def getParentNode(self, node): - raise NotImplementedError - - def __iter__(self): - currentNode = self.tree - while currentNode is not None: - details = self.getNodeDetails(currentNode) - type, details = details[0], details[1:] - hasChildren = False - - if type == DOCTYPE: - yield self.doctype(*details) - - elif type == TEXT: - for token in self.text(*details): - yield token - - elif type == ELEMENT: - namespace, name, attributes, hasChildren = details - if (not namespace or namespace == namespaces["html"]) and name in voidElements: - for token in self.emptyTag(namespace, name, attributes, - hasChildren): - yield token - hasChildren = False - else: - yield self.startTag(namespace, name, attributes) - - elif type == COMMENT: - yield self.comment(details[0]) - - elif type == ENTITY: - yield self.entity(details[0]) - - elif type == DOCUMENT: - hasChildren = True - - else: - yield self.unknown(details[0]) - - if hasChildren: - firstChild = self.getFirstChild(currentNode) - else: - firstChild = None - - if firstChild is not None: - currentNode = firstChild - else: - while currentNode is not None: - details = self.getNodeDetails(currentNode) - type, details = details[0], details[1:] - if type == ELEMENT: - namespace, name, attributes, hasChildren = details - if (namespace and namespace != namespaces["html"]) or name not in voidElements: - yield self.endTag(namespace, name) - if self.tree is currentNode: - currentNode = None - break - nextSibling = self.getNextSibling(currentNode) - if nextSibling is not None: - currentNode = nextSibling - break - else: - currentNode = self.getParentNode(currentNode) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/dom.py b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/dom.py deleted file mode 100644 index b0c89b0..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/dom.py +++ /dev/null @@ -1,43 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from xml.dom import Node - -from . import base - - -class TreeWalker(base.NonRecursiveTreeWalker): - def getNodeDetails(self, node): - if node.nodeType == Node.DOCUMENT_TYPE_NODE: - return base.DOCTYPE, node.name, node.publicId, node.systemId - - elif node.nodeType in (Node.TEXT_NODE, Node.CDATA_SECTION_NODE): - return base.TEXT, node.nodeValue - - elif node.nodeType == Node.ELEMENT_NODE: - attrs = {} - for attr in list(node.attributes.keys()): - attr = node.getAttributeNode(attr) - if attr.namespaceURI: - attrs[(attr.namespaceURI, attr.localName)] = attr.value - else: - attrs[(None, attr.name)] = attr.value - return (base.ELEMENT, node.namespaceURI, node.nodeName, - attrs, node.hasChildNodes()) - - elif node.nodeType == Node.COMMENT_NODE: - return base.COMMENT, node.nodeValue - - elif node.nodeType in (Node.DOCUMENT_NODE, Node.DOCUMENT_FRAGMENT_NODE): - return (base.DOCUMENT,) - - else: - return base.UNKNOWN, node.nodeType - - def getFirstChild(self, node): - return node.firstChild - - def getNextSibling(self, node): - return node.nextSibling - - def getParentNode(self, node): - return node.parentNode diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/etree.py b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/etree.py deleted file mode 100644 index 95fc0c1..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/etree.py +++ /dev/null @@ -1,130 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from collections import OrderedDict -import re - -from pip._vendor.six import string_types - -from . import base -from .._utils import moduleFactoryFactory - -tag_regexp = re.compile("{([^}]*)}(.*)") - - -def getETreeBuilder(ElementTreeImplementation): - ElementTree = ElementTreeImplementation - ElementTreeCommentType = ElementTree.Comment("asd").tag - - class TreeWalker(base.NonRecursiveTreeWalker): # pylint:disable=unused-variable - """Given the particular ElementTree representation, this implementation, - to avoid using recursion, returns "nodes" as tuples with the following - content: - - 1. The current element - - 2. The index of the element relative to its parent - - 3. A stack of ancestor elements - - 4. A flag "text", "tail" or None to indicate if the current node is a - text node; either the text or tail of the current element (1) - """ - def getNodeDetails(self, node): - if isinstance(node, tuple): # It might be the root Element - elt, _, _, flag = node - if flag in ("text", "tail"): - return base.TEXT, getattr(elt, flag) - else: - node = elt - - if not(hasattr(node, "tag")): - node = node.getroot() - - if node.tag in ("DOCUMENT_ROOT", "DOCUMENT_FRAGMENT"): - return (base.DOCUMENT,) - - elif node.tag == "<!DOCTYPE>": - return (base.DOCTYPE, node.text, - node.get("publicId"), node.get("systemId")) - - elif node.tag == ElementTreeCommentType: - return base.COMMENT, node.text - - else: - assert isinstance(node.tag, string_types), type(node.tag) - # This is assumed to be an ordinary element - match = tag_regexp.match(node.tag) - if match: - namespace, tag = match.groups() - else: - namespace = None - tag = node.tag - attrs = OrderedDict() - for name, value in list(node.attrib.items()): - match = tag_regexp.match(name) - if match: - attrs[(match.group(1), match.group(2))] = value - else: - attrs[(None, name)] = value - return (base.ELEMENT, namespace, tag, - attrs, len(node) or node.text) - - def getFirstChild(self, node): - if isinstance(node, tuple): - element, key, parents, flag = node - else: - element, key, parents, flag = node, None, [], None - - if flag in ("text", "tail"): - return None - else: - if element.text: - return element, key, parents, "text" - elif len(element): - parents.append(element) - return element[0], 0, parents, None - else: - return None - - def getNextSibling(self, node): - if isinstance(node, tuple): - element, key, parents, flag = node - else: - return None - - if flag == "text": - if len(element): - parents.append(element) - return element[0], 0, parents, None - else: - return None - else: - if element.tail and flag != "tail": - return element, key, parents, "tail" - elif key < len(parents[-1]) - 1: - return parents[-1][key + 1], key + 1, parents, None - else: - return None - - def getParentNode(self, node): - if isinstance(node, tuple): - element, key, parents, flag = node - else: - return None - - if flag == "text": - if not parents: - return element - else: - return element, key, parents, None - else: - parent = parents.pop() - if not parents: - return parent - else: - assert list(parents[-1]).count(parent) == 1 - return parent, list(parents[-1]).index(parent), parents, None - - return locals() - -getETreeModule = moduleFactoryFactory(getETreeBuilder) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py deleted file mode 100644 index e81ddf3..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py +++ /dev/null @@ -1,213 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals -from pip._vendor.six import text_type - -from lxml import etree -from ..treebuilders.etree import tag_regexp - -from . import base - -from .. import _ihatexml - - -def ensure_str(s): - if s is None: - return None - elif isinstance(s, text_type): - return s - else: - return s.decode("ascii", "strict") - - -class Root(object): - def __init__(self, et): - self.elementtree = et - self.children = [] - - try: - if et.docinfo.internalDTD: - self.children.append(Doctype(self, - ensure_str(et.docinfo.root_name), - ensure_str(et.docinfo.public_id), - ensure_str(et.docinfo.system_url))) - except AttributeError: - pass - - try: - node = et.getroot() - except AttributeError: - node = et - - while node.getprevious() is not None: - node = node.getprevious() - while node is not None: - self.children.append(node) - node = node.getnext() - - self.text = None - self.tail = None - - def __getitem__(self, key): - return self.children[key] - - def getnext(self): - return None - - def __len__(self): - return 1 - - -class Doctype(object): - def __init__(self, root_node, name, public_id, system_id): - self.root_node = root_node - self.name = name - self.public_id = public_id - self.system_id = system_id - - self.text = None - self.tail = None - - def getnext(self): - return self.root_node.children[1] - - -class FragmentRoot(Root): - def __init__(self, children): - self.children = [FragmentWrapper(self, child) for child in children] - self.text = self.tail = None - - def getnext(self): - return None - - -class FragmentWrapper(object): - def __init__(self, fragment_root, obj): - self.root_node = fragment_root - self.obj = obj - if hasattr(self.obj, 'text'): - self.text = ensure_str(self.obj.text) - else: - self.text = None - if hasattr(self.obj, 'tail'): - self.tail = ensure_str(self.obj.tail) - else: - self.tail = None - - def __getattr__(self, name): - return getattr(self.obj, name) - - def getnext(self): - siblings = self.root_node.children - idx = siblings.index(self) - if idx < len(siblings) - 1: - return siblings[idx + 1] - else: - return None - - def __getitem__(self, key): - return self.obj[key] - - def __bool__(self): - return bool(self.obj) - - def getparent(self): - return None - - def __str__(self): - return str(self.obj) - - def __unicode__(self): - return str(self.obj) - - def __len__(self): - return len(self.obj) - - -class TreeWalker(base.NonRecursiveTreeWalker): - def __init__(self, tree): - # pylint:disable=redefined-variable-type - if isinstance(tree, list): - self.fragmentChildren = set(tree) - tree = FragmentRoot(tree) - else: - self.fragmentChildren = set() - tree = Root(tree) - base.NonRecursiveTreeWalker.__init__(self, tree) - self.filter = _ihatexml.InfosetFilter() - - def getNodeDetails(self, node): - if isinstance(node, tuple): # Text node - node, key = node - assert key in ("text", "tail"), "Text nodes are text or tail, found %s" % key - return base.TEXT, ensure_str(getattr(node, key)) - - elif isinstance(node, Root): - return (base.DOCUMENT,) - - elif isinstance(node, Doctype): - return base.DOCTYPE, node.name, node.public_id, node.system_id - - elif isinstance(node, FragmentWrapper) and not hasattr(node, "tag"): - return base.TEXT, ensure_str(node.obj) - - elif node.tag == etree.Comment: - return base.COMMENT, ensure_str(node.text) - - elif node.tag == etree.Entity: - return base.ENTITY, ensure_str(node.text)[1:-1] # strip &; - - else: - # This is assumed to be an ordinary element - match = tag_regexp.match(ensure_str(node.tag)) - if match: - namespace, tag = match.groups() - else: - namespace = None - tag = ensure_str(node.tag) - attrs = {} - for name, value in list(node.attrib.items()): - name = ensure_str(name) - value = ensure_str(value) - match = tag_regexp.match(name) - if match: - attrs[(match.group(1), match.group(2))] = value - else: - attrs[(None, name)] = value - return (base.ELEMENT, namespace, self.filter.fromXmlName(tag), - attrs, len(node) > 0 or node.text) - - def getFirstChild(self, node): - assert not isinstance(node, tuple), "Text nodes have no children" - - assert len(node) or node.text, "Node has no children" - if node.text: - return (node, "text") - else: - return node[0] - - def getNextSibling(self, node): - if isinstance(node, tuple): # Text node - node, key = node - assert key in ("text", "tail"), "Text nodes are text or tail, found %s" % key - if key == "text": - # XXX: we cannot use a "bool(node) and node[0] or None" construct here - # because node[0] might evaluate to False if it has no child element - if len(node): - return node[0] - else: - return None - else: # tail - return node.getnext() - - return (node, "tail") if node.tail else node.getnext() - - def getParentNode(self, node): - if isinstance(node, tuple): # Text node - node, key = node - assert key in ("text", "tail"), "Text nodes are text or tail, found %s" % key - if key == "text": - return node - # else: fallback to "normal" processing - elif node in self.fragmentChildren: - return None - - return node.getparent() diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py deleted file mode 100644 index 7483be2..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py +++ /dev/null @@ -1,69 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from genshi.core import QName -from genshi.core import START, END, XML_NAMESPACE, DOCTYPE, TEXT -from genshi.core import START_NS, END_NS, START_CDATA, END_CDATA, PI, COMMENT - -from . import base - -from ..constants import voidElements, namespaces - - -class TreeWalker(base.TreeWalker): - def __iter__(self): - # Buffer the events so we can pass in the following one - previous = None - for event in self.tree: - if previous is not None: - for token in self.tokens(previous, event): - yield token - previous = event - - # Don't forget the final event! - if previous is not None: - for token in self.tokens(previous, None): - yield token - - def tokens(self, event, next): - kind, data, _ = event - if kind == START: - tag, attribs = data - name = tag.localname - namespace = tag.namespace - converted_attribs = {} - for k, v in attribs: - if isinstance(k, QName): - converted_attribs[(k.namespace, k.localname)] = v - else: - converted_attribs[(None, k)] = v - - if namespace == namespaces["html"] and name in voidElements: - for token in self.emptyTag(namespace, name, converted_attribs, - not next or next[0] != END or - next[1] != tag): - yield token - else: - yield self.startTag(namespace, name, converted_attribs) - - elif kind == END: - name = data.localname - namespace = data.namespace - if namespace != namespaces["html"] or name not in voidElements: - yield self.endTag(namespace, name) - - elif kind == COMMENT: - yield self.comment(data) - - elif kind == TEXT: - for token in self.text(data): - yield token - - elif kind == DOCTYPE: - yield self.doctype(*data) - - elif kind in (XML_NAMESPACE, DOCTYPE, START_NS, END_NS, - START_CDATA, END_CDATA, PI): - pass - - else: - yield self.unknown(kind) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/idna/__init__.py b/env/lib/python3.7/site-packages/pip/_vendor/idna/__init__.py deleted file mode 100644 index 847bf93..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/idna/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from .package_data import __version__ -from .core import * diff --git a/env/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index f0f87426a2be05fa4df4f06c407489ac19f5814b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 214 zcmXv|K?=e!5KP)4qV2t3sG!Ab5fLBYMNfh(p{W{7)0jrF@A2f9a`ogFJh>@2Ftane zu)FId84-kfriTLS+lM~_G%IAAqHw~gBsJYr>U|)C9pT}YWYLG>IHPV1aIZ`&8U=un zPBvNSV$I46J5|7$WyWuGQQ4U4Ma%$0FW(}!wa&HBQ=wYRq@40=ryld;**AOQYQ-Cq c3$9oWAe68GGu^r2qHg$2R!jdy>kq{A2N|6<4gdfE diff --git a/env/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-37.pyc deleted file mode 100644 index fa6749bd6d98a72628b33214f0170ced9b619421..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3021 zcmc(h&yy2H6vw;gcV@HMB_h8>4RA43u?uPy9t2ld%HpyIDWz&GYHCPNmRTp0&@)k3 zCzM4vs((YaJn7k^{v%!9IC0|cMZd3Sv)Nw=>cLL+o9@@0{_*<rUiY>6d7mL=Kc2Yr zw9eR5s!WrO!U}Refe=jal=XPPdq!aN%)snffz`7En=@euGj#$-f8D^1-H9ixEgsZ9 zVZs*96DFM4+3?3^;6vjI4;l}eIcVz8)PxU>56wI@4QS>>9h!Pfx`nY7EI>Ce8qhVg zZV|dgu^<+ou;7R=Z?X1~XB^9H+scWvPG7{z5png6(&%oSDrZ=IYd2TdKE5GkUp~Vh z*xC^LW?w8l{r2(mUw?T1+t!^9si(<AVFfvFLBuTJf&~V)fGt1afhn+2VWVUT2aBjF z`#R?CC?_vu(kVLhcS`iNkgp@>OAw_Y_?M<UR=|1_UK(3`%pdcT=Wo$&3Zq25FiCa| z3~a5*8veD}`Yg+bgF#;wv1rA#iPpU+6KRsIx6XcZadftAC?;KWZCld8M>*ZT>_vq% zsA8sZ);5)u$7xqtA}S)7i$=+RVsa5Z{<yqc^ajg=WN;zL@*+yp3*!F6?7^k(JyPl% zeidh;FP9UMMayL3&eGta9-o$&YoH8|Hw=qg#%5g`WT`ro|HB@V7PQ+Wa*h;qB9e~2 zZOVBnH%KgyAVXB*2$iVkYsfFyS%ukJo9h#rer)B1VHWk`FjRgR_WEL&Qn?<6_lHqh zwP>SNE1AuyOL}4tlhRS<M2=_pz9dZtc_-1St{~?}A$IWO!hm0x+Al2CyqR@m+>0|D z=MC)}vO^<Mq7x%O*IfRB!ppdvfXOXBvV=9VOG|!U0{@dNUlk73g?)u(&C<-Z{tBZW z)UwV-j&MirgLg}7mEAc%@=9l76?W;3F&by3D<7AL3zyl*E#1N)J(cf^+lU<#w{*66 zX&=WZy49{)OVqS?)Lz{?W;E#1vp<m(U($R?9YH+pHyRSP7!I?95D!Ja$U_+`J0GM; zp`2(ifEP%zqozn%8~r3}*Y>fb>~4}p2tGRY<f>lCC?Rj90hJ@;e3%yS$7B;j>puJF zQ;qQMu-lDgSb5M}m@vNx!T8k0d=5uLO=rWQ8o3_#c|+?K%?7XY%`*ovSlT=G8e&G1 zHbk^bB1)bmaTuGgqv1{DoCx%|r22m%b5%#{7m)coMt>QZCF14Sknb1P#I6|4PJ<*w z(2<U$!WtVOjZbW0Yl1bg@)4+YL2xQ;O|ZL7u-0pWA5n`Y*xN_2TX?$&{uu<<wh6B7 z5d0kowkQ4`f@|e|g8hF(u(G4PlO*yutW$A)j7k(TDwOATq3kEQj_6q@R_->{@&t7~ z3873}Sn?EADI92|<r^p+AX=WLb~<`VEXub@v`CyGF=K^7*o@vPN`3@g{sF`ey{6CW zrUzDi&FtS$Y#g9?8<`!7r;+#o#qVIkT`QYK*mG#Oiae#5>U$`rh_FH(=%$#(SKP>k zs^2PP9QAI?q=@Aju91DdGc(0(!ZwCkr}4JkhU))x!cXH!yz+$SF~P>J38}tkLb?I2 zQ->Br!8W+yg)wFurk04&g;RiYVSMjm*XEkC=-zL;%Az}Lc7v&AGP`D~SS9!9s?(9G z4$@$@ueI5xHE6IWyq_HXpvYBCKO1glc)if2H=9RC8hMU%WIRb5I_zxK+<J_O)^Y90 zhdp%4=@b|uqQM>f4E>YuLDz07tJ9aeHdDoQ?FsaVl9wQqf$;Bk`n^Gt#+B#L%G9ZA yIzGqZV0_hUJ+#9%y8HJ*t2uNt-iOr-;wk}|6KJOq@$n`wn#Y=Fn(d?JQS&dmql2*k diff --git a/env/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-37.pyc deleted file mode 100644 index 9108b59dbe866c4dca87a607bb2ed1b01ee5b56d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 574 zcma)3Jx{|h5ViBsrie}~j9H6XQkXg*L@5kiva~En2!)&xksRANE&{|v`6o>LrK~LQ z7nrz9RS6*>anjv8+vn%!yW?(mgQ2O{?TZh@cUr8?!{i9P>SF)~T(bEJIid&t3p@89 zfDqA#7PJuqh-R$U`Q&(|$7{ZmQ$|Kej1%-K!r<5wTXL-CDOR?G$~6egLYZ9&`NnLB zMPH-Dl_oKT85F8=nUn*#eNgv%*Eh7;_~o5Yplwos%931{CUd*yp>EIhcs7|%1A35N zX56+h{#y}<l_E<Fjha<x;j-?`^_eQDfH>Fuoj>_E@x);dm;9Ln!(V&pV}E**j^q8| za1?_URjjm&7p{;+C1RD8!dPKqW3|({me`rCRJ&<uq$q`Q0#2>fmYQ7s78k8=({R_? uNI}{Q>mb)w)FDaFn}%3YZRz+24>jL5KaCDb4GSp_X@bq<A|82>ANk+R>~=W- diff --git a/env/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/core.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/core.cpython-37.pyc deleted file mode 100644 index cd69a1b37b1d90eee28fbbe584917910b1c897d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9017 zcmbVSTWlQHd7j(O&Mub}McpWevB$Ekcx_UWCB;@$$I+FM9Azz7w5_srSHnF+a>V8A z^2|^o*Sl>HDgk<l<A)X~{7{f7P@qQP2ctj>^nw;BilQj`5V$}v@IwF>1(=r<abN19 zX}|BB-Q~rW9cQUIw>jrO=l{=tzW+b}=;GjD(ZDbM<I>ZNe}<V5RqSP&kh#dEPV( zVF<HsESl4%X$VW$b!*yExjk*G+?jS%o}130uTysy^V50s%}sm4oi2pVdQs#z%;|wJ zcc&z*!-nt{EO|Q|oE{4IOb>tE5Cu`ZZ-`>Jcg>z2L481!P%niesP994Pz<3yr0V-o z-y?=mA6E4PVy_svZ%iK)`^0|ahr|JK5c#M$Bu0@R7Kg<{$R8445M#){Af6Qui%0I8 z(__LHkD}#^;)r+*`NQI<cpUj7;+Xgna$lSkPlz&lJ}RCRPod?A7#9=B9}~yL3FJq` zSH#oe6nZ=^&WY3F3`)nuuZS;;XHfc*ux}dW=QbfjqikkgB;r5>X|Rd9Q9;YzC{AS% z&xJ{~)`-&}iZ=_CI>o;dPfRSAQ24duAAIZEKmF@Be)=~XuWj0BsNw1VNc%jVWEe?k zOq;^M?wH&e%x!0dYnLk*u1MLCt!Mp<K@$4mN-b=rQ6u(e8`2Nzb)Q`(!noEDQ9S3% zupXqL@SCzRQx6vtzfyKGuUd_R#jsk<iq-03LoC->E>){b%R#;SCSR?JMy*=?Q$upy zD*5P{6X{~}L^EnmL~)X0wh6Jc8m~M(JI_Y-RPTndXvh;3&xu+?hR2($G7k!5Ny)-9 z9aFV@F4hOh*TqOgn*Fc(SNfdan-61u2CrmTqbPzp*j`#jbuo<7#1CZX$Booaf;38I zBS-^6kRG|>21%YAIl!dPsV)t&Z3xK$JX>pL%ja7A@U{4EP>;l=h6tMts7dSj-OCSr z5hW04;~tiWom>VN^+rwY9kx;r^P|LHPCn=Q_h7XT?N~osKG*sW?Oy*S=y$l1wyx}E zBb^WZ9m}QM74Lo&`}(aK>PP7>#SOLSksaKyrN)E9pM{6#?Gm2kB$CuvH&d%^teG2T z$84Lz1Xzuu)$X+><0$}d&HOgr@{m=ejd3mi<#-`(+>8C%d?15b8cK4o97kl2=f0fF z2DVkRLanhl6U8`mnalQhnK?X5S@D&iz8osGEnAsYYi8!%ZJI_U%Z33N-O<%rJxG$H zWI#c>Ib?e3k)vp<kwgA=aJnB2sgauGGqvv6ZS%0PM#wO!=@dw2H>8jpl;x9}jGAdu zw&X$9U0vV3q+&Hns`}Ma=$5F7O*w{gU)&TsrKQBp)wYdw*q03o(yC-$b2(n6ynv3b zf+UvAWcO5sYOmvQ(CE$Nqx|5Rgt?B{x-+#3FF*DA$#W;q-0E;DK;dGLmQ6`b**#gV zx(ua!dfP-tc27iB6-!#Klq&Sbk;8;xWd@we=GV|^athPg^)N=3s|Pb-efMl5O8Kkm zT@@YY()llQY8Q!Nl?a8$P};Gr{pl&|6kM)BHRX^nV_0e|W0Xq}4rH9GZ2la5Hvbn1 z*CMGl*w@FAWhGdns1AJukf*!XwNI}rNhLezg*}H+-G%Mv!k#46{>liIT(uI+EOuU) z9c$$(*N5X{T{d1j_v=>2?l`HrZnYg8w_H0XY#g`eQ(HLePMTAk*c<w=<wS15g-G3w zwKV*y(YBK5wwX)|_a+n>6bz9+jQv$qJoLPao^I@eW&t$sV|F(l0p((k@`lMnjP^Vp zZ{^Rot?W-ewleoks4{2`Eac^nK&7<qv~5iRt%I2FKQLcDE}=HGV9TG8F3NirIPyl@ zd(%w3cCO>aBW>ghHd{ewm}^*i8$I_f<k5BpZ6iBq?^6^mle+3h>Ti?!(%X;%#w0Ts zvtRK7S(Fb{CMC~VX0%TCFln2qi_%pBlTtAM^^+YxNd0CbiIh+9`qLeF4dzRkb>TXm z%9O%3D9AVnO8ALJW?pYSKN-m+-HzMa=`Akf-AoAk)Hko3^ZK~|5)IXb>*eAWImrW@ zSyw7}Zf4dcJXfYN>qXQrRx-PC^P8=!U1PFEP`NH!R$~VPU<lj=zKrJP(}}b(Q4eQR z%`K3v&xRz{tI6dvD1k#RM76d~T?%4l{}-bbKVDu8B^-owwHYQ4Chf@+z44MzAx|+m z&EyOdo?$i9FUbzMAUBGwE<4uNoUN1B2_`;Vsl>k*rSpDNuZMG3_m-G;?nl|p3ZZ5W zrfM&imksW4iIg8BALR>2hD}*6Xp|__=EK@TwVukX$N?IvGCLA0+B_8c6J@qc>sd)7 z2bM-tH-I^3LRqCecVkRZlO|OK8aFVxVLRr2vuJwOewa1>IW`TP%f}kA8~_jATdoD8 zhllNsRYdM0E!su2vWAfsQcGR{%^g;P)=o`FSf}|1lE55p02y#sv49;9r?~g1^QAFV z9g58SW>4xf;T+ssEqAESmgu_{ddnr4D%)Dt9zC_WhSaVufS3rpTOJ3sJm4dwQBdz% z{80WDx^`jrAo!A(QQyIljRwUL0h-(h>pQ%65nD%7SOW5b_8i*W1uHqJv6E$a7Vka9 zYXMkNtZdS_Y*I!oYht2xM(f#pkZkuq=U1C>snzi~ErlP%!aoBY?7@nX*GJ~W=KtZ> zDr*u7CX|<*1~MfwKtsAR^ff^mDBc7fAf7#1Ji2eSvG84V)h>`V47rR_HrLR$LpJ^0 z*0ypTy9}=Y)&r<IihWkLMi}7TCjLxbYCXPfy?`~KONH)2J!;{4fP2&=YW}6(#uno4 z%ka~d-aSO|Z0-A8G#6!H(egT%ONsMG<JmW$X94LnP|8z-A#GdAGyMo2Doy;^)YNZ< zJ!-(0gK0~tx@T$jMXqD7Or`Mh_*S^WU9&G6ubqeKb?)TWT{Y6-C~ZEW0{J!iz3Eb= zozn_|w6JE*Suk`J;dJa9#!?05$4=f7x$X?F=ot<fX`Y5#nfTA1<3~&HsyT{S@zxyg zcISAPbKHcnhvBtg9#3k1Q5yebj`>FO%vIsxR+cJJ$;bKP!BDnwYEoWBIWwmehGynv zWg4PE^eTJuF#FMa&JI=YMlx6ocDvhIPTkzKgFJW#cQm?1%1C7PT$pOd%GHo*;~->S ztyu*UE{B=bSjfyMD{UXO`{)m8&}3Wy_oh34fVCt%&2RxN4=^_hkaNs~fWDGxA$0(E zfI>W@+uI0*fWL?E-f`qDjIU7!{N?cU55qs~)GoViEA0}(YMTx`_63+meOsUgp>{iV zOe4m<h#J|`IpIKOZui;_DLvF}YA4{FfNmar{-|y4p!Qa;22Fm8_bk%nct8<7Xgv~c zT=EVm6hYx%v>wQR>h-49i-B#uOG;lxSDtGd(DgGNr|rN^v*b^f-p3e646Q+*l9DR# z*;XE2v*i0+@6!9Ps+q;!wyk7fQvbxr0`t1!|Ln>sMg7T+BldxB0BgVJwAinDo>M&? z^6;j)bPhDBmHW2Qyx;BlcORp<cNfify0gErgXSAun$+|ImCe7v#%^i)W*yb3$!Hn- zp5?wS!*C(`5PKi}7n01q8qUb@Ui3e3huFjTVC}Cm?<!P&E{KE7`v&f<3oO}JgE+bk zG>Rf7|H<UPkpTA8VL8f43903rHf1+ahKJFMxyUJY;Pvs-HNElo=#o5-L}|L|n@>=8 zq48tp2yy~DbC`CNEb|Cb#~MS;$Fo(E0Vwo=pL))C%_Tg^jjpZ(Kdf0?MC2$gq0o0= zpOHH1?ndMsPjMNcAxvGinO#&v?&<o<&(i`+(5|21x&Ta0i*1;Xj-3v)?X+}fP!Lls zDVHism3|wHF53QmbvzxSp08QSpQU?*yFQ#k&v<bYc_8QrDQ~FxUp3-Wj*;$LD9Rt3 z2LG@!@4@|l)rhTIK<EC91<nYaJ(BL%GeYmrW6t7(X<+mLG4N^cUp3N$S`J-=ZRM8J z*@?4C^I8K}7Mt|>>6B*fjaM#QzjitEF1=Wpx^ipkh1SFi089i(c>SOY(2Ha3@Z_IX zp8V^lItsB{U+djvwmjNE+zD!k*!gM0Czy6AelnH*^e?tfUg`(Pez6to9<h6d#;lKZ zZfB)@C@V&Z3VO!1Fw4!XreTs5m<3V>tC=f8GNSB+@)VTqSN@7}=;X7|ReiRoz1q<1 z?engKK4GFTT@JIyqfF?-%C9hC2vVH_$?%<WdvO6$ZYIyBK8xy9mRMDZ3M~zE9enQH zPw+~G#SCi*=c@z<S~=m?2+rLwPUbMqAl>URM4Vil!4dTFts|DagOUC7hZAQoe5%f0 z8->+ly}%F7oQgt0t5wu3If~1yzVHLjp!W{+{+!l(t=VlOxr#peY^o3eXzVznsN;+t zGLUPUE8A(7ol2Gql3EnChO}#!HX44t5zn=}O2fYvH<wdfb{@tu5tys1Ak8sU)GlQs zFYAcj6$Z?8kS@!2!+MHo>2u&vHBcj~O&QKcD-ZBsUEQe&`6S#q!=g01*BnX|_Pi@` zom;YrUY{)2@8S(@Zx7d!bE`m@9<l*N#=6pkE2&XLpWim*d<)~&-3>?#c|P?vO!*t2 zR7i0Z5C$&~9RtA=C2f;^iaKbgN|r*-{yXJ5%LS}Pei2D|K!z;OGMQsS$;w40R1(C& z5W~i065j`8n(*=}8+@ru$~;P+EIdiW_828cvqSx~ATf0{gpL-?5vH&cxCF50RNwKT zAt>Te%J?J*@P33ZTt>&nS1ZJ$R)4(mL#>p6_J0Jl=Q=JF$py6M+jct-m&TCi+IdEk z7^y)^Zr0kcgh?l)<F!5B96JSwi{j(0s*W~9rx1_xI>mN@5vk-4k<*pA-?k*naB$@h z5YhTUyNEAj9?DMJeb(qWOJk~~Am2kTxHZW?cYFUWqI@iq%6p*l9!3<qBMNYKY&n*? zYX;&=V}R@Yx+jJZXM;lpMQ|62FbPMys!$Mn){8J0aQhL7GGTy9TLwrUJK<qthg%n4 z3MUqWrVh>bBHild$6&n<5Bfn3A9B>^Bp~z4Q#a2%!|zG8FaaXY9angc0BB)3P0l>S z(70s4coSL)k9=CXsK_fwDw+9;te}vYr{zVJUz0B&-;KwgZ9~d~GQq$tRL$I(D8c8S zY(VD-Y0he|Ju6;|MYy8k@9MHHzrm3TMIU9UkFn(ez<6U3AMU8V;&fHw!&su?sId;H z1$8xT<~Ej7z=~8}k;5+pS&{frRbO{9Pf0>H?jg3G2I+E=;m|beFmC)HwcBGFP`#`8 zS`{>TE$jj`W5X5zn8AO>1$h50F*X8_F5!<yfe=o}MzHofV5OEr!XIO`G&AZ<{1Aoh zK(gIIf|fl&Cka~btl1sJM>@GVqvJvo&jSqLG64+oaWQq*0SGL&^YRwY%p5P2w^N)I z6@ADH7Y;iw40rL?{VJ}Uo!rWJJC8GWwBrH5adrqtI2-Od9IXwwU`uU`SJ8>3HZF!a z`7Ymy0^h-%DYjh&MFUu04vy8oqW6G~b*M|A0;S2!Jg)SuRnkt1-a&OAoa#9)3cEjq z9E=YkVB>ge&t<jG@HDikD3^Al8j(r~HOnQ<dX(Z5P1h_ioStC2w3#P>XKv7JBHWQV zbX!#192SQkAE*E_f?C3x!r_n|QvFRPW%X8u$#Ol-T(!VNn{#ElRYLo%;B|^>!4Raj z+YYv!fimPkL}FwK*4j}j!8X37N3GD3@LZ!Z@JFlNSB$?z<+Bw7)>|uv1I5Sz(9Wlb zF(_ql<06#ARZ8NvT_}e8F~vZ1;;@lOywOVGKq*|M6tGJKD5Vs?-_G@wVx_MXD^LnY zzQcC{9~21ZP>P)T=u@cZ?U%HZznB7i+;sIfS^f^G{5BItsFaD3zsu6^AwdX1eM$Nr z8{S}|_K{mC8Ss&BGI^ZIuFc~F2{&&Xg$HdOqnx`pPjY10oa8@iYO?H1;#anrJfXN% z9;94FFCBrjWSH5>DxA{(e?w3o{^X17LJOSb@r|(=)kDQB;<%wq5b&x-@oWP_Qz>Ki zvhn3o?qjLc^Nsi)4zyf`NK8Se@=+O6QP)K2v!syp7)wtwxxnNylWR<_Ghxg^yRmmz z;_1=CCVpvGLT$>H992nqvfgw0|0?jmu^0&r2prh%Uy0!oI0!>XajnehKQHgu_;Zlw Xi_ak~c&;~IEPK9p*gH@hD?al7RKqgv diff --git a/env/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-37.pyc deleted file mode 100644 index 96d856cd3ac7af29c01af162a47ca7c704983944..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21388 zcmeI)4^-8K{r~X~h>D7eN=inGN(zdKN=k@&Ra8_`GcqGmw5x$4qF&7s?bhgzMP`m~ zF(Y%16&Y*RSUJZUD=I50D=NpBqsF(d6>EGOYtHel@9Xt>ecsddJ^jw_Z0G#W?|V+` z^z!k%_j5lNE@+K=Z?k&$?&;uvg+GYC?uADj=l2Zz-v^<N<3ns|>*_duC)@Fd_(T0& z{9*pC{%#drvqSvd|KYE2bPw;ZaQv#j!|^NsI(Lm-@{hmv^p3R4c?SKZ+uGUf(r^0J z?&<&Z>o?u@pSfHg=l{I7^B;rrKLfjuUhZSWI(J*U?%d~Ymz+D>x%)eJ-TBhl&cEb; zn#b6s)VV$<yZ&GOwdZ;FW%qRM-p@ZfFV%Myf3<7)b+_BuW#@j?XRBlW@u+k6!n20^ zd!BdJb7%PfUFUwE_44=n`=j!&ebn9E$HLD1ubu1v?$!}sd+d9l^f$M=Kf?VE)YsC^ z7jfR_YF|kmZN;y*{eABHR@dqp+jD2;ec3(y^S|moc>8nu=Cj%NvOfB6KJNeRHNE$S zR<vY?`uq6%`Xl}QD!OEM@%O*dNf>Z*w+R!*C5=l;h%4xVe*y$Bb-i6~2OGs*;At@k zc8a%yk$v1_?*ya8d%#%nUNA{K1g3}|f~BGphI{Mlo?*<zj#D0Rxf%>?b-A9GigjS; zHuutjL-COoyBq@MigUrBxCo5h=^n5g^oiM^U(5ju#1&vb+yxekKLwp#?ipSLPl}CT z^eyhC&ERse9Sn$n29JwhfhTV%z-Q=;8ivmzEW~kR?U)d!Y;0G>eIfWKZ`W|e_YuKv zUd&yJhbg0vlhDt-)&6lfPpWr{4n%>)d*g9Uns-gNB*%&Jc@d6?u^5dgu}DL-SUht% zPO!wgP5aOge4#@10Ttei@OM`<A?otIcz-1RMZt;GHJ467#9W{ll7hI-i$jaLI>B5o zK3Lz?sY@N`9d<Jg%N^t-^l%@|<EZq3E<Xi*gIxX@tR3Wj{!?~@IDrE1-lrj2EM_3i zSj<8=8@$8jAR;W5AfgcoVea`J#3K+k)BB_kA_B9#7&@Vg6Xxr!4>M#lzY2YwgmCv( zf8&E_2RaiRr(?EvD`z6UljnKy6~edBi{+E>NM(9abW4a+zSH~o4j}3+LXvP#xZ8xT zO<m`0UbAL>Q<scYg-zWu)~w#V=EkP*jQq{3Zdg^gswsTos=%uC(8pKd#2=?~mU3ou zvN)NT_!fL;<vZOlA)HW77fu+bD<_=OixbNk#u?5T!HMHs!WqdK#fj%6a7J^+a1uFV zIpa9vIZ2!eoQa%CoMg_WoXMOioD|MwoK((KP8w$#XF6vF$H$q;nZ=pSN$1Sr%;n7E zWN_wl7H|qV8#$Xen>kxJ0nS#=HqMQl?VOu9H*<Dyia9$uyEwOSf}C49w{gD1DdF7C zxr1{j=Pu4}&fT1QIHjC>IeR$warScV=j`Krms7_1H_ii`2RY@O?{W5X9^zDR9_Ae2 zJi<B1`99|m=Leih&JQ_{avtMUaUSO!<~+fv=KP5BB<IJRBb=u=Pji04sp0&T^9<)% z&QZ?KILA0Y=hSk3!Fi7JOHLi<SDfcLFL3HPFLGYuyv#Yyd4=;T=QU0P=XK5-oHscq zIB#*@=Dfpsm-AcBXPiHB&T{_7>EwLH>DwI>$?4A-z=`5qz!}IH#EIry$QjJJh!exP zm@|YkloQJt#u?5T!HMHs!WqdK#fj%6a7J^+a1uFVIpa9vIhS)5aTaryaIWAi<y^_h z;#|d9#<`laoO2B)n{zEEhjSfg1!pBEm$QnqnsYq|f8IO!YdC8;H*oSe__N>1U&mR` z!5_I!KK?+(?=sFtP7!AlXESFDC&1at*~Yn%vz>Dj=Vs0hPB9068sfJa=N8VZoYy!F zoYy&TaNgvc;Jn3ooAVB*k@GI+J<j`_lbm03nmE7VG;@B-ImP)Mr-kzY=R?l#Ijx+3 z=X}KZ56)@M$DB_%XF0xb%uLQK&TLLPXAWmBXC5bmGoQ17vyhX?xtz0zvzW7la|LH9 z=Sof%=PJ%J&efddoLtT-&T7u}96x6bXD#OjP97(pvyO9+^L@@C&JQ@1oF8%?<vhlz z;ylhd%z1)S&G`}MNzRWsM>tP$p62|7Q^R?N^DO5m=VzQ_oS$=QIlth1$mtf1>CWlN z>BEWT4C4&vjNrs^F5!&ijN-&|5;&tdV>pSNv7B+7@th>i1kOaxBu+BtQqE+~6iy1~ zGEORIDkqIIjWeAygX81O<jmsC=A?7xaOQI6aWXjbISV)oIhmZxIg2=pIZHTKaF%ke z<YaNK;w<A_%~{U5hLg>?mXpJ|j<bTZl9S6>#aYd{p5y1N;jHD{z{%s}bJlUza|$>c zIE9>zoFdL9&SuUQPJpwOvyF2jXFDgzxs`Jp=R2Gd&h4B#ICpaH;_T+!&AEqD%DI=b zhjSliFXw*FKF)VJWt@NGJivL7Q_lGwXFum5P6g*-&H>INoP(V2a}IHSz^UZ?kn<?# zF-{fdFef4w)0;D%vzBuMCy$fQ@l|1Fa%OR6bJ96;ICDAkI2oMzoCTbPoJ`K;oJE|) zoF$wqI7>NKa<VvAah7qe<}Bx2!^!4c%gNzf$63Ky$;suc;;iOe&+&8CaMp5e;N)@g zIqNv<IR%^zoI=h<P7!AlXESFDr><uR{z1=qp7R2yp7SE-CC<y7<D6GGuX0}FG;m($ zyuo>sbAt00=WWhAoJP*OocB2Ib53%8&1vHNhSSXXE$0;Hcbpc^2b>Q%zvr}aKIOD= z{=oT+^G8mw7v@&ZZJh6LN;tQ3?%>?Xxr?)#b2sN6PATVJ&K}NvoV}d;IgfJ=bDrQ- zbAH5mlJjGZ(;E}Q3FUO*gmJoZx^cR5!Z|%SJvqHN5uDzfKAgUsNKQXaf6f3-6z2lY zK+YgeH0MIjV9rIH7|z9<A)KL{Sk5rcaLx!$QeVsj&P2{6PBQ0G&ScIMP73ETPAX?A zCyg_WGo3So<KxWa%;L=Eq;uwQuHY=?T*=Ae{2~(bI>-4K6T%7Qbm4??x^lX4x^u!g zJvco%y*Lq^-kd(1zMM!-KTdzn08SL=0?t6rAWk&rLe5~$MVuJU#hf9Wp`2LGFwSt! z2u>X563$4@C{8>lfis#jhLgw{%NfTR&q?A;;7sI9;v{n}<xJ*G;iPab<D_z?a?&`{ zIMX>ZI6lry&MeMsO#CMNc*Fg_>iqFUjhG77i95iO5chz;fW=*0I{5$SEn+Ab7Uo`x zpN}{ZVmB~K3<qOG{04O5#0W4^>;oo?_#!)LVt+7Qi~=*ofnb&x4d#f0LBALS7KlT@ zfEWuFi^IVZF%B#hM}lQyJXj%)1}nuxuv#1k)`&@9tvC^^7bk;_;$>j7I2AlCP6OM; z8Q>WaKZtO`ySk6$957PEPb8dZaXuI;;-?W#qPPf57MFl&;!-eO%mOpTWnh-L9Ly23 zLBE&-7KkgrfS3ywi>tvB(GQl2Yr!%x53CT^ft6wbSS=QUHDVE1D{cns#Q@kKZUY;| z?O?OWpAelEcY^IAeiY-J5pM;ZZtf#l0!D~;fKlRZFjm|HCW+q#GsFkLEU^Ogi;sZY z#Y13;SP7PjkAh|5<KRKD8mtnZ1Z%{nz&i1#;0f_r@T6D^wu<#&hxjI#(%t>s-U5B% zJ79+RF1SQ|A6zc}8q5`c1LldRz#_2)EEYcmOT<>NRQw1m6HkK`;wNCG*alXMpMf>v ze}c8*7ht1!7Hkze!8Y+rutRk4v#(Au6buX3pD<vA*bR&l!@(G_Cm1J2fQe!sFj<TQ z)5QK@x)=p!iUYwcF&fMf2ZMew1}qSVfB`WUEEb1@C1M;{Dvkup#CWhm91T{AiD0!j z4y+NAz*=!4STCl64dOJgU7QJainGCR{a`i&j1d=rabhNzC@un%#Uo&v_&nI!(|y$6 z2BUkq`~!GI{3Cc&^x+4ePK0~FY%p9;E-VJ4#Ujur^2f3DBA=;f5cy0+v&d&E+Qj=o zpPpxU6FefG1atJ1Llfv1o52F{6c`X&z+#b4T9k;bV5#^KSSFqZE5uL0O0f;B7C!@P z#CEV&>;N0Yzk)5|e}QdcE}tTabRV77U`aohey~(r3zms_V1>92tQ7f^>uRwOtPzXA zT5&U2F9yH{aU0kuZU>vio55DG7;F=FfgNHH>=bVU!}_})?_FSoSPCYJd%$FIFPJ9o z1JlJaFjIU0%o5AN9C1JB7c0O5@c<YQ4}!(wA+SWO1WUz7!7{N5tPl@_m0~qmEj|g> zh)2L$@oBJLtN|OuXTV1BDA+6>16##fuuXgp>=5g~PVogWe1QA#y$D8%FN4wID`2en z8W=CW4kn2wz!dRqFkNf}GsXA7Eb%0mBQ}A4u^B87Pk{lk1uPan1WUwLuvGjAEE7+I z72+pgrPu~mi=TltVmnwXeh$`)9bkj_1=uK_0h`6MV5`^(wuxVY9ioHhkvhdtFf7V_ zP{Y6ou^SjAhJ!I;PcTl5029SNV6qqqriuN*bTJCd6bFJ?Vl<c|4hH>V3|Jrz0Rv(z zSS$_)OT;*^ROGX7Wnw&7A&v$s#YC`L90%5jNnov*4f-!|ABQ`^ptu{1)zfg#f!;H6 zbzrA1eE|&9lXEYDks_bHixJOz_U=!(6wlt_k22>X{H)y<?a~JZ#auA#LibWW6?0T< z1Y1S^06*&@_kfSVVzC{p5*_^L^|ZJU^u@TxJ`E;c?D7lH8S3&&utOXdj!R?ROLNF! zF4u!W@u%c)_tNLUlOlgSnK{C}ba@YaEkr*Uyu`h<2rL&%z<TjsFlwZG!2MvF_&As; zJ_S~ZKLL-6$H0@~i(tF>3K%oWJ=vRJqIeR_5nI8a_&HcE{ukITeg&Qp!|;l*uz2@m zy}&53ADAX4fSKY1uu7Z+9v3HrjbbX;B2EL_#o6E)aXuK6;NIIJFi~6zri<5sMdCKF zTr2^@M!PrL14fDaz%=o3FjIUAtP*R$<Ki)}QG5w(7heTq#<=Hw156a(0)1jD7!=#V za?$C9Z%;7{3`=y+&>M^r`+;d<0+=aI0IS4g@VJ-?Hi~n=c5yx!Ggc22m?$m>my3R| zSS$j|#m!*7SOSKRbI))O7$x2hric%K8RA2rUwjxW5)Xpg#UFyD;uGLO@fdhid;vTo zz5+&%*Mkbii*JEG@g$fdwu9wj?+E-ZOmc754@?mgzzi`JtP<yd9pZd2dV(G(FkZYG z%o48!b45QG6pO%eu>^D`x@Wi-j1un$Q^d!?46z2R5|4q6;)`Ir_zD<3NuN9zFTM|E ziN6E4i>+W#YzNE5KY{gPSZ{n}$?nN|gHd8XFh!gLW{C5_=u6#W7lZNQa&U?02aClb zuv`p+r^OO5e6o9n2f--uX)sT$1slZYzz*?c(3#@i>@_f6d>2d;-v^hAEnu$L4wj1@ z;Bj$MAN+PoaZffCJRvRyoy*)yvq7Ku9UhzNUV1wiDeeYi#CyPaaSxa*mV-;ggP>om z1WUw6!7{N5tPrcgD)A>^jd%<^AwCDTi7$fARQDr$8H^U+0As}_&?mNl+r^N+xLKNe zvj{Lz91P})qrsp!8Eh0&z-BQOY!zpNXGFYq#fhBep7(MvPFxD6h*yJ|Vh)%q=7Rxo z16U<)0qe!B;0f_o@U(b47(U&-x9@_{VmY`(d>HhLhrsRPV_>OR4IUJK2G)qb08fiA zgV8hGyI2s3$IR#Q0O*_P@^9p9mrg%?r;79Y<Jb)M(nVnWe3w^)KJgkbS6l(+iMzp| zxCe}1;NI*h&?i0v9v6QJwurw1orUhPFM;9W`(UitZvgI190+D)y2oD2OT}C;aJhTw zUeH<O@(VC1ZWxH)0ZZIVgJA77E+68h*)Bf?gW_Mo`fJ@wdk@0Na$H^jrihn<K{1O5 zT<0FJftQM#z@uUSJTBJo*cI-vjo?Y~B$%_(z4R1VBz^)0#ld(E&6n#Qa1$65p8%cJ z?xkOVb>h$qajD<EG!YDnX<(gL2u81Q57^2}#cI%5>t6aQFBO|W-wp1iF@teHp39YB zP~1u8yO-V#c8dE!-#YiwDzHL)4y+S1FT%+R+yk;f-v*Zfuv+Zk0fp|RDKTJ?%LU{n zm%G4Z@g2~&#l7?_xI|3Es~_<KIR49Y5?Cvyfo<YqFlDQIz;>`&d<bk6&w|d4?g7pa z+)NAw!?wGZhJg`cH!w;J2V=yZV4N5MCW?K)WHAy<6Z?bdVicGu4g|BrXfQ_{4En_w zus|FF2E<sfSR4+Ph;d-4I1(%q<G~7XG*~Gng4N<UutrP*YsHCRy_gI(h?BuaF$HWE zQ^8g-4QvyqgB_v|>=b8#VK=#tZ#ozu&IO~y3@}Dq0LF=#V4}DPOcs}bY2s2aUCaVA z#bscYxE#z8vq8U@0~UxYz<`(w7K^LF644Kqifh3#F%PT|*MXH{0az^-f;D0hSSxM@ z>%{=rAZ`O2#qD6Tcr(~47K3f#F0exkf}P@RVA##><68noh<AWd;$2{jcsCd)mV$}m z9xz$l3#N(tz;v+;%oO*7S>ge(NIVD@i-*7xu@Wp59|g<ADzHL43|5NOV72%pSR)<* zYsII*da(v<5T5}X#iL-ecnoY6Yr!`0Ij}>l13Sg%!LS|f!&eVRh%bRr;&CuWd=-on z8^A>I4KP_e0j7y>gXv-;m?^#oW{D@k9I*-Xi_KtxcnS=NEnu<uAy^`|f~Dd|V3~Lt ztPno|E5$ajTKo*G5!=C9@pG_V>;N0YFTh6e4A?B51zW{Vuuc3D>=488%I{8*uT=LH zyN_=?=)F8W1+3Ghe9^kI(>>t4SE}dnSY5h_$BJ9P<KkBEgm@!(QoIRl5qE&6#hqZg z_%v9z%e}W}LGM-VFN5Bz+TQ_vx3~wK1icry{~iqL($nBx@h_nF0{6wk@DHD^-fNt1 zM?`k>Vr3%k5l?jThtSSyM9Bm%Za|b-<RcDRtVdK?Y(N~b*o>&R*otVdC`O#LxD648 zr&QfLEkQ(B+<}O)xC;?uaW^8)q7;#6u?LZCu@{kMu@8}MQHIF0cmR=QQI5#5*pKjA zR3Hj04j=*+2NA^<hY%$em55S{M-gQfRfr0U!-z_YYDBfglZYCNBZyjyrxEoQHHZd_ zXAq4RM-j~y#}KU+wTL#0=MWthb%;)j=MiC(ysu9^BEsS&M3lvGM2y9&h&YP|M54tT zh-8Zsh%}405$P6<h)j$35Lp%{5jhr32){)$qQK%5B4E*iD7N?zQDX7$h*FC`AdXmk zjyP)3foQN8ITpV=lD!8c9#LU24pC!~hp4l75Yc(5cbmr$!O33y7;(_zS>DFtmxvaN zml4hs?>28DVlCcB_$+>h$hC0B;eITV5Va}Z3HWA{zrXWj9HPqST{8{QZt=DET|9(q z{Ik5n9zp#5O&DK$qs3P|fxXcp3GcdyO80K_b3|~i7hih|#y7vI<=!|vPwaT_zxfj3 z8{kFnk+=pwy?6iENJRMXLwh%7A;K>7A{`N7F&7bKk%5S@Sb&JL$V4PsEJ7q(EJ37M zEJdVSWFaywmLak%mLqa3vJrlZ97KV|3Pivn7g21n8c|~5N0eHuMU+|OAu24^Au25j z5Y-k%h#HGsh!Yk;M5o1Vh%h|&p+A)o5f*nKqAc!0#8}*oh_fg~BwFl2BwOr7q*?4k zq+66BGA$lJWLcCWaxC^E{1z360*j9j+bupv)LrC#3bCVb0z84^em-%CQj3v@GK+Xb zg~ez@r9~p5+F~4{#$qC()*>0vU@;ldXpw?wwn#;^TBIS`ET$tmEPRMgi&==Ui|zXw z5n(YG5oM8qh_P6Jh_lE<Bw8#&BwH*&q**LQq+4VmGA))NvMiP(axAhDev2GLfyD|$ zz#<n>Y_S?qV&O-WTC7EsS>z!qEY=|^Eea6T7KMl!iy}m=#Z8EMiyes57CRB`7C}U( z#chZ%JjthTe?)}E9f&B4-G~^Adl5+%dl4xX`w;0C4<Irv$`Lsh`w@PN3Pgd$0Yt#! zAfnjf5TeAQ5>aaLD5A`w3Q=Kk7*T0)1W{}845HEED5BZo7^2nU46hmLJv#At72Roz z0AEr!%)90#2A&gjAH*hvZ-f_T5J8JhM4QF91bq8jWFhMCOsac=Um+Ykm#VWN(nfjl z6(VRcg|Fnp^Q`V+ix>%BWFveQHzI--FCb1^oI(_g@ov-3!z})SIBwB>48B9~%&mJr zeGzdMgAnN!qYy!h@rZ*K*COgH_&(F1z0dShgfred^=F797H4@Ii^{8U7@j3|KY~cS z;WGvA{Bff{BHiKwM5aY7qS#_MqQv47M5)DSM1{prya;c*y=OCN7d}wDBgnm<0HOi! z400pF!K;KE?+vk|5Xlx(5eF@%Bibz%Av!HqAbcU-3I2v~LcRDhBor?e^WtH?NUWz9 zZy|yfA251(*Ti<gVG&-;MATR;K!o@9uGxX`SsdVP`gqsWBZ3wu5V3u|YYv3r^NIB0 zFe2FBi%vxD059UZ;%re~_z`s$Q@Z1tXz!Y3jElX<Lj*0l@zrjz-ZecCu@;jN@fMdM znk}Xw+AWqLIxTKQ1c!NNdj#PO_u@~yW`q}CAWm2e?197LylYYsL5rijW~6sb9pa2d z7+;td?_JX!5oHmDNV14VWLZo`_${U)S}c5sPK%w0V1jq*hY`+bFOD<Dc<~>IIE%@> za806j%`(PVFSa0p7W;S&UTWZeE6?W(3X{C}6JwGW@x2krUZf)GEH3VgYtrm6M1{o_ zh&qdTd{v^)JFEy%KGTbzBRVZUM)+oX*PKPvSzOu=CrJ0M@gYuH%tJ)Z@vaFVd=@wI zFpC!v&Rp-X*Aa2^y!Z`oWAR%=kwt&LfHK27ECrEiF#~bN;!Ym6z&mU=BGzILBHrQv zBF*A)M6t!Eh&qe2jD_CW!Uo{fnO^ipL|ODhq*){&GA$+`sw|Qb$1PG3jTUndZ5Hzp zF_(Myvj~xBaRtI>u^f?O;YS24HXzC^wj$~*7V@R1OT1HOBYb$vp!@x{60zOlB_4+N z5xUnLN5ov|MH6ph@yrD{3~w!T5Bn9O#o`nq7w<Q8ubIggx#E3?Zp=YMUgJeJ!e?=m zhh=-$yvn%Ni;D&!@WLDS1c``%MJl4sVk%!jo9i9+3FCS%oD1=NZ83wduFdnV$w0*9 zdr^Y$S?otduk)@sfCyOp72&M+uIa%S=oWb~1rcvC6VYOkjqq*q4%>@3Zc&BE*z8^N zETYn)`^7kQz`Ld=BGzIGBGF<h;<UwdM7u=>qSGQ9;oIt+Z7m{bk&mdbxDQcfv5&Xe z=H2Fdh)j#ah@iz^@XF-i4)3u2Bk)l>J@my&zXZ|Wi}A?_pBMAyA|iY0u*=pVVtXl8 zGVn?m_p7}Q5w!RW;Tz*!^Jhez#gz59O`>;AI%BLC*$AJ-c0{SgUPOmQun_linRlBx z8*zd(FK$8jrg?D?kv83n4-vr`UVPpiPqq2H_)||rY=k}q{`VpHA8K$vpU#P0oI1P` z!;ST6xCXDUaAPN;Zj%?gdCg`o_9J{2k01gTQ?hYbULT!c1ES4h8=^7ayXJO8<T@`7 zA_^>yAWAH{=i+QmU!CnjM6AVdM1jR6h*FC&h;oY;^KgP#?*#87d?UPAnBT>@E6$5- zgzpkNj4w_6C;!7B2_fzy*C!VLq;x`@gl_K7p^xHx&7m&0;p6fCi!}UCgES0sFI|V% z0|qa2$+!5|U8JuJerVK&9~vceY3jCQ+04xO=}qCY7ca`1vpj3T-?eyALReF;l`FTc z*}NrxW8un`P2IO#zd64su%)T@x{djT`Gq&E4BS+-W=m7Q>o@w>6yc)4%IgbOZP~JB z%j3>wJ~8jk+0^lY4MpRN@{7ji7j6lxDkvE1-*i*q_6ckAc%l0@?xfJaar5|mf8i>3 z{P^#9j4QgSDLie%M*r4=HPiX!+R}ngEUZiD$j||yy+XT%_X-X9_OEXrfo~syZy$kg WAA$dUk3i3`&|93Z|Ft8u%YOqqB$yQd diff --git a/env/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-37.pyc deleted file mode 100644 index 95b7affe24bbd03176319185968ddd1625b0d1a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1754 zcmZuxNpIXX6ecNYtc-0SOIwf8A|+fPumESg<d!-M(jdJAE|3H$U^I|rkuxJ$L&+q^ zOQ1mx)86_c67<v`)C;dY`7iY1zDIdUgHqu3_%?lSdA7LNB{0+<y|;gL2>BZ?mxICK zDNM5giy*s1P{B&NOGO~UU&$^Lk?6o4h&d6%9*P^H3wtEkYm&@oHz*<9AB!WYc*e`Z zSY8cyp{yKAZPxfW6OvDAB(9FCS`H><d71#L8E0k5)nvRcHNKXW8ge~RrVE$6Qby(z z3u-^nl~?0>VkHP`S!-#evY9O^h2nN3`JmF{?&_+snYNp2Tq?1dtnv1~<?mYw@Avyj zpT8NQzsekgaTGnANaIzl9A}1~@C)_bLiy)P7sEnjrT@VvE8r8i#aQy6R?BL*`knVX zN&4M0z>w_Z0Er)fHJO9?15EQfES5B6MyGU0rcBUjaH1`>tf4dbo|Cux)36BzTOuv( zfasSEZNg=OE7F&VU_Elc^vlD$Knsx8zWm0P$uw%%hrotSBm$6$1V#QOGGiYp1-@x; zc=u;wfonz~c4784IQr@m%Kr%;2P_~`63|h(M3{A^hSEIjau^p#ryCyHbmI!^v;{v! z^bzhgZYKE%fXwWF(DYg^Q-x<*a(R;Fwmb!{%18*qwVV%XTJY^hK;FjK!UY1(O$Bi% z`dzQ=m3OaIrSeKhfxlo1H7u_a=^`We_BMa8#T(QGE~?5RubtGTG<~n_>>S1!22<mb zbX><&+DhRfkAn+Jsaz+kYf#}9QveA}rtMqgHGxcoMUlGsRy4(%>$Et!ZkfT`u`aB1 zv~Y|0L~F?ER>hx0-vqP&e7|nT^?F^@_X`Cul;wSKc&bh|2O}i<nL_!AO0O3}W$S=w ztG-{Kx;t05bfBxTH;>K0d<6@MV;aJDo8F{7%IFvL8yYix8(wnk3pjAc>2r7i4h?jO z$B>cF2;>mkIpaX{jwZ}SK1?nEZ#=18ZXrhu%eOF%S4{o=s!$N#0H!yBKaED7;L4to z0XCXoN8bT@iCpLJ&))|ZHmRffGgA-=A+IB`0uq--m*9N$XIPmbOmFlZ9I!eCov|si z^aE67!#=WU098g0LcL>yw&HqFg){mKn}$$tVFM}xazOQqCW3n1Q6VKN6v1oKU?oCb z1NEqty^`yo98~cU@`(_BFM9XrxwKM`3k8Wf;Cm3ZbdL`p+6Fsd#VdHY=yPp!u?g+9 z$GyH!P>tZcd67gOT-Vtzpov;H-|lHC2Ua5j8v9Z*=R!21F{ZBLvo&==T^Sc5C**iB z99c)x&*8mwol?-JZC0pzprTDE)};$U42jgEAzOg7!UWSC?RDH-nu;n<Q{98R&ob|5 j>l5;PVhNK#W8%1Ydt8Z0DIcTP26H!LF^j*9gE;&bb2Y~x diff --git a/env/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-37.pyc deleted file mode 100644 index 78acb45aff2b143de5fd60b7296e4f75f5d15f29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 168 zcmZ?b<>g`kg1p5Nv7$iwF^B^Lj6jA15EpX*i4=w?h7`tN22G|aW+OcdKTXD4-0|^c zsYS(^`FZj2D;bKIfU3a6FFXB`+yecA%mUrayyB9?oE+Vh!pgh~!?X;LAQ%I6=B4Bp q>1U?oCF&O>CTAz6r^crwmL%#GRNmsS$<0qG%}KQbx!^MpGXMaUS1U6B diff --git a/env/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-37.pyc deleted file mode 100644 index 3c539fb483ca5ac84d9a5c5d2e8f05be2345fdfe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 176048 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 ln%=GiRnG{D$8(Nf_II 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 UyyVW6J3RlG|BwHdC-Bh!1G;ep+yDRo diff --git a/env/lib/python3.7/site-packages/pip/_vendor/idna/codec.py b/env/lib/python3.7/site-packages/pip/_vendor/idna/codec.py deleted file mode 100644 index 98c65ea..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/idna/codec.py +++ /dev/null @@ -1,118 +0,0 @@ -from .core import encode, decode, alabel, ulabel, IDNAError -import codecs -import re - -_unicode_dots_re = re.compile(u'[\u002e\u3002\uff0e\uff61]') - -class Codec(codecs.Codec): - - def encode(self, data, errors='strict'): - - if errors != 'strict': - raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) - - if not data: - return "", 0 - - return encode(data), len(data) - - def decode(self, data, errors='strict'): - - if errors != 'strict': - raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) - - if not data: - return u"", 0 - - return decode(data), len(data) - -class IncrementalEncoder(codecs.BufferedIncrementalEncoder): - def _buffer_encode(self, data, errors, final): - if errors != 'strict': - raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) - - if not data: - return ("", 0) - - labels = _unicode_dots_re.split(data) - trailing_dot = u'' - if labels: - if not labels[-1]: - trailing_dot = '.' - del labels[-1] - elif not final: - # Keep potentially unfinished label until the next call - del labels[-1] - if labels: - trailing_dot = '.' - - result = [] - size = 0 - for label in labels: - result.append(alabel(label)) - if size: - size += 1 - size += len(label) - - # Join with U+002E - result = ".".join(result) + trailing_dot - size += len(trailing_dot) - return (result, size) - -class IncrementalDecoder(codecs.BufferedIncrementalDecoder): - def _buffer_decode(self, data, errors, final): - if errors != 'strict': - raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) - - if not data: - return (u"", 0) - - # IDNA allows decoding to operate on Unicode strings, too. - if isinstance(data, unicode): - labels = _unicode_dots_re.split(data) - else: - # Must be ASCII string - data = str(data) - unicode(data, "ascii") - labels = data.split(".") - - trailing_dot = u'' - if labels: - if not labels[-1]: - trailing_dot = u'.' - del labels[-1] - elif not final: - # Keep potentially unfinished label until the next call - del labels[-1] - if labels: - trailing_dot = u'.' - - result = [] - size = 0 - for label in labels: - result.append(ulabel(label)) - if size: - size += 1 - size += len(label) - - result = u".".join(result) + trailing_dot - size += len(trailing_dot) - return (result, size) - - -class StreamWriter(Codec, codecs.StreamWriter): - pass - -class StreamReader(Codec, codecs.StreamReader): - pass - -def getregentry(): - return codecs.CodecInfo( - name='idna', - encode=Codec().encode, - decode=Codec().decode, - incrementalencoder=IncrementalEncoder, - incrementaldecoder=IncrementalDecoder, - streamwriter=StreamWriter, - streamreader=StreamReader, - ) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/idna/compat.py b/env/lib/python3.7/site-packages/pip/_vendor/idna/compat.py deleted file mode 100644 index 4d47f33..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/idna/compat.py +++ /dev/null @@ -1,12 +0,0 @@ -from .core import * -from .codec import * - -def ToASCII(label): - return encode(label) - -def ToUnicode(label): - return decode(label) - -def nameprep(s): - raise NotImplementedError("IDNA 2008 does not utilise nameprep protocol") - diff --git a/env/lib/python3.7/site-packages/pip/_vendor/idna/core.py b/env/lib/python3.7/site-packages/pip/_vendor/idna/core.py deleted file mode 100644 index 104624a..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/idna/core.py +++ /dev/null @@ -1,396 +0,0 @@ -from . import idnadata -import bisect -import unicodedata -import re -import sys -from .intranges import intranges_contain - -_virama_combining_class = 9 -_alabel_prefix = b'xn--' -_unicode_dots_re = re.compile(u'[\u002e\u3002\uff0e\uff61]') - -if sys.version_info[0] == 3: - unicode = str - unichr = chr - -class IDNAError(UnicodeError): - """ Base exception for all IDNA-encoding related problems """ - pass - - -class IDNABidiError(IDNAError): - """ Exception when bidirectional requirements are not satisfied """ - pass - - -class InvalidCodepoint(IDNAError): - """ Exception when a disallowed or unallocated codepoint is used """ - pass - - -class InvalidCodepointContext(IDNAError): - """ Exception when the codepoint is not valid in the context it is used """ - pass - - -def _combining_class(cp): - v = unicodedata.combining(unichr(cp)) - if v == 0: - if not unicodedata.name(unichr(cp)): - raise ValueError("Unknown character in unicodedata") - return v - -def _is_script(cp, script): - return intranges_contain(ord(cp), idnadata.scripts[script]) - -def _punycode(s): - return s.encode('punycode') - -def _unot(s): - return 'U+{0:04X}'.format(s) - - -def valid_label_length(label): - - if len(label) > 63: - return False - return True - - -def valid_string_length(label, trailing_dot): - - if len(label) > (254 if trailing_dot else 253): - return False - return True - - -def check_bidi(label, check_ltr=False): - - # Bidi rules should only be applied if string contains RTL characters - bidi_label = False - for (idx, cp) in enumerate(label, 1): - direction = unicodedata.bidirectional(cp) - if direction == '': - # String likely comes from a newer version of Unicode - raise IDNABidiError('Unknown directionality in label {0} at position {1}'.format(repr(label), idx)) - if direction in ['R', 'AL', 'AN']: - bidi_label = True - if not bidi_label and not check_ltr: - return True - - # Bidi rule 1 - direction = unicodedata.bidirectional(label[0]) - if direction in ['R', 'AL']: - rtl = True - elif direction == 'L': - rtl = False - else: - raise IDNABidiError('First codepoint in label {0} must be directionality L, R or AL'.format(repr(label))) - - valid_ending = False - number_type = False - for (idx, cp) in enumerate(label, 1): - direction = unicodedata.bidirectional(cp) - - if rtl: - # Bidi rule 2 - if not direction in ['R', 'AL', 'AN', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']: - raise IDNABidiError('Invalid direction for codepoint at position {0} in a right-to-left label'.format(idx)) - # Bidi rule 3 - if direction in ['R', 'AL', 'EN', 'AN']: - valid_ending = True - elif direction != 'NSM': - valid_ending = False - # Bidi rule 4 - if direction in ['AN', 'EN']: - if not number_type: - number_type = direction - else: - if number_type != direction: - raise IDNABidiError('Can not mix numeral types in a right-to-left label') - else: - # Bidi rule 5 - if not direction in ['L', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']: - raise IDNABidiError('Invalid direction for codepoint at position {0} in a left-to-right label'.format(idx)) - # Bidi rule 6 - if direction in ['L', 'EN']: - valid_ending = True - elif direction != 'NSM': - valid_ending = False - - if not valid_ending: - raise IDNABidiError('Label ends with illegal codepoint directionality') - - return True - - -def check_initial_combiner(label): - - if unicodedata.category(label[0])[0] == 'M': - raise IDNAError('Label begins with an illegal combining character') - return True - - -def check_hyphen_ok(label): - - if label[2:4] == '--': - raise IDNAError('Label has disallowed hyphens in 3rd and 4th position') - if label[0] == '-' or label[-1] == '-': - raise IDNAError('Label must not start or end with a hyphen') - return True - - -def check_nfc(label): - - if unicodedata.normalize('NFC', label) != label: - raise IDNAError('Label must be in Normalization Form C') - - -def valid_contextj(label, pos): - - cp_value = ord(label[pos]) - - if cp_value == 0x200c: - - if pos > 0: - if _combining_class(ord(label[pos - 1])) == _virama_combining_class: - return True - - ok = False - for i in range(pos-1, -1, -1): - joining_type = idnadata.joining_types.get(ord(label[i])) - if joining_type == ord('T'): - continue - if joining_type in [ord('L'), ord('D')]: - ok = True - break - - if not ok: - return False - - ok = False - for i in range(pos+1, len(label)): - joining_type = idnadata.joining_types.get(ord(label[i])) - if joining_type == ord('T'): - continue - if joining_type in [ord('R'), ord('D')]: - ok = True - break - return ok - - if cp_value == 0x200d: - - if pos > 0: - if _combining_class(ord(label[pos - 1])) == _virama_combining_class: - return True - return False - - else: - - return False - - -def valid_contexto(label, pos, exception=False): - - cp_value = ord(label[pos]) - - if cp_value == 0x00b7: - if 0 < pos < len(label)-1: - if ord(label[pos - 1]) == 0x006c and ord(label[pos + 1]) == 0x006c: - return True - return False - - elif cp_value == 0x0375: - if pos < len(label)-1 and len(label) > 1: - return _is_script(label[pos + 1], 'Greek') - return False - - elif cp_value == 0x05f3 or cp_value == 0x05f4: - if pos > 0: - return _is_script(label[pos - 1], 'Hebrew') - return False - - elif cp_value == 0x30fb: - for cp in label: - if cp == u'\u30fb': - continue - if _is_script(cp, 'Hiragana') or _is_script(cp, 'Katakana') or _is_script(cp, 'Han'): - return True - return False - - elif 0x660 <= cp_value <= 0x669: - for cp in label: - if 0x6f0 <= ord(cp) <= 0x06f9: - return False - return True - - elif 0x6f0 <= cp_value <= 0x6f9: - for cp in label: - if 0x660 <= ord(cp) <= 0x0669: - return False - return True - - -def check_label(label): - - if isinstance(label, (bytes, bytearray)): - label = label.decode('utf-8') - if len(label) == 0: - raise IDNAError('Empty Label') - - check_nfc(label) - check_hyphen_ok(label) - check_initial_combiner(label) - - for (pos, cp) in enumerate(label): - cp_value = ord(cp) - if intranges_contain(cp_value, idnadata.codepoint_classes['PVALID']): - continue - elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTJ']): - try: - if not valid_contextj(label, pos): - raise InvalidCodepointContext('Joiner {0} not allowed at position {1} in {2}'.format( - _unot(cp_value), pos+1, repr(label))) - except ValueError: - raise IDNAError('Unknown codepoint adjacent to joiner {0} at position {1} in {2}'.format( - _unot(cp_value), pos+1, repr(label))) - elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTO']): - if not valid_contexto(label, pos): - raise InvalidCodepointContext('Codepoint {0} not allowed at position {1} in {2}'.format(_unot(cp_value), pos+1, repr(label))) - else: - raise InvalidCodepoint('Codepoint {0} at position {1} of {2} not allowed'.format(_unot(cp_value), pos+1, repr(label))) - - check_bidi(label) - - -def alabel(label): - - try: - label = label.encode('ascii') - ulabel(label) - if not valid_label_length(label): - raise IDNAError('Label too long') - return label - except UnicodeEncodeError: - pass - - if not label: - raise IDNAError('No Input') - - label = unicode(label) - check_label(label) - label = _punycode(label) - label = _alabel_prefix + label - - if not valid_label_length(label): - raise IDNAError('Label too long') - - return label - - -def ulabel(label): - - if not isinstance(label, (bytes, bytearray)): - try: - label = label.encode('ascii') - except UnicodeEncodeError: - check_label(label) - return label - - label = label.lower() - if label.startswith(_alabel_prefix): - label = label[len(_alabel_prefix):] - else: - check_label(label) - return label.decode('ascii') - - label = label.decode('punycode') - check_label(label) - return label - - -def uts46_remap(domain, std3_rules=True, transitional=False): - """Re-map the characters in the string according to UTS46 processing.""" - from .uts46data import uts46data - output = u"" - try: - for pos, char in enumerate(domain): - code_point = ord(char) - uts46row = uts46data[code_point if code_point < 256 else - bisect.bisect_left(uts46data, (code_point, "Z")) - 1] - status = uts46row[1] - replacement = uts46row[2] if len(uts46row) == 3 else None - if (status == "V" or - (status == "D" and not transitional) or - (status == "3" and not std3_rules and replacement is None)): - output += char - elif replacement is not None and (status == "M" or - (status == "3" and not std3_rules) or - (status == "D" and transitional)): - output += replacement - elif status != "I": - raise IndexError() - return unicodedata.normalize("NFC", output) - except IndexError: - raise InvalidCodepoint( - "Codepoint {0} not allowed at position {1} in {2}".format( - _unot(code_point), pos + 1, repr(domain))) - - -def encode(s, strict=False, uts46=False, std3_rules=False, transitional=False): - - if isinstance(s, (bytes, bytearray)): - s = s.decode("ascii") - if uts46: - s = uts46_remap(s, std3_rules, transitional) - trailing_dot = False - result = [] - if strict: - labels = s.split('.') - else: - labels = _unicode_dots_re.split(s) - if not labels or labels == ['']: - raise IDNAError('Empty domain') - if labels[-1] == '': - del labels[-1] - trailing_dot = True - for label in labels: - s = alabel(label) - if s: - result.append(s) - else: - raise IDNAError('Empty label') - if trailing_dot: - result.append(b'') - s = b'.'.join(result) - if not valid_string_length(s, trailing_dot): - raise IDNAError('Domain too long') - return s - - -def decode(s, strict=False, uts46=False, std3_rules=False): - - if isinstance(s, (bytes, bytearray)): - s = s.decode("ascii") - if uts46: - s = uts46_remap(s, std3_rules, False) - trailing_dot = False - result = [] - if not strict: - labels = _unicode_dots_re.split(s) - else: - labels = s.split(u'.') - if not labels or labels == ['']: - raise IDNAError('Empty domain') - if not labels[-1]: - del labels[-1] - trailing_dot = True - for label in labels: - s = ulabel(label) - if s: - result.append(s) - else: - raise IDNAError('Empty label') - if trailing_dot: - result.append(u'') - return u'.'.join(result) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/idna/idnadata.py b/env/lib/python3.7/site-packages/pip/_vendor/idna/idnadata.py deleted file mode 100644 index a80c959..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/idna/idnadata.py +++ /dev/null @@ -1,1979 +0,0 @@ -# This file is automatically generated by tools/idna-data - -__version__ = "11.0.0" -scripts = { - 'Greek': ( - 0x37000000374, - 0x37500000378, - 0x37a0000037e, - 0x37f00000380, - 0x38400000385, - 0x38600000387, - 0x3880000038b, - 0x38c0000038d, - 0x38e000003a2, - 0x3a3000003e2, - 0x3f000000400, - 0x1d2600001d2b, - 0x1d5d00001d62, - 0x1d6600001d6b, - 0x1dbf00001dc0, - 0x1f0000001f16, - 0x1f1800001f1e, - 0x1f2000001f46, - 0x1f4800001f4e, - 0x1f5000001f58, - 0x1f5900001f5a, - 0x1f5b00001f5c, - 0x1f5d00001f5e, - 0x1f5f00001f7e, - 0x1f8000001fb5, - 0x1fb600001fc5, - 0x1fc600001fd4, - 0x1fd600001fdc, - 0x1fdd00001ff0, - 0x1ff200001ff5, - 0x1ff600001fff, - 0x212600002127, - 0xab650000ab66, - 0x101400001018f, - 0x101a0000101a1, - 0x1d2000001d246, - ), - 'Han': ( - 0x2e8000002e9a, - 0x2e9b00002ef4, - 0x2f0000002fd6, - 0x300500003006, - 0x300700003008, - 0x30210000302a, - 0x30380000303c, - 0x340000004db6, - 0x4e0000009ff0, - 0xf9000000fa6e, - 0xfa700000fada, - 0x200000002a6d7, - 0x2a7000002b735, - 0x2b7400002b81e, - 0x2b8200002cea2, - 0x2ceb00002ebe1, - 0x2f8000002fa1e, - ), - 'Hebrew': ( - 0x591000005c8, - 0x5d0000005eb, - 0x5ef000005f5, - 0xfb1d0000fb37, - 0xfb380000fb3d, - 0xfb3e0000fb3f, - 0xfb400000fb42, - 0xfb430000fb45, - 0xfb460000fb50, - ), - 'Hiragana': ( - 0x304100003097, - 0x309d000030a0, - 0x1b0010001b11f, - 0x1f2000001f201, - ), - 'Katakana': ( - 0x30a1000030fb, - 0x30fd00003100, - 0x31f000003200, - 0x32d0000032ff, - 0x330000003358, - 0xff660000ff70, - 0xff710000ff9e, - 0x1b0000001b001, - ), -} -joining_types = { - 0x600: 85, - 0x601: 85, - 0x602: 85, - 0x603: 85, - 0x604: 85, - 0x605: 85, - 0x608: 85, - 0x60b: 85, - 0x620: 68, - 0x621: 85, - 0x622: 82, - 0x623: 82, - 0x624: 82, - 0x625: 82, - 0x626: 68, - 0x627: 82, - 0x628: 68, - 0x629: 82, - 0x62a: 68, - 0x62b: 68, - 0x62c: 68, - 0x62d: 68, - 0x62e: 68, - 0x62f: 82, - 0x630: 82, - 0x631: 82, - 0x632: 82, - 0x633: 68, - 0x634: 68, - 0x635: 68, - 0x636: 68, - 0x637: 68, - 0x638: 68, - 0x639: 68, - 0x63a: 68, - 0x63b: 68, - 0x63c: 68, - 0x63d: 68, - 0x63e: 68, - 0x63f: 68, - 0x640: 67, - 0x641: 68, - 0x642: 68, - 0x643: 68, - 0x644: 68, - 0x645: 68, - 0x646: 68, - 0x647: 68, - 0x648: 82, - 0x649: 68, - 0x64a: 68, - 0x66e: 68, - 0x66f: 68, - 0x671: 82, - 0x672: 82, - 0x673: 82, - 0x674: 85, - 0x675: 82, - 0x676: 82, - 0x677: 82, - 0x678: 68, - 0x679: 68, - 0x67a: 68, - 0x67b: 68, - 0x67c: 68, - 0x67d: 68, - 0x67e: 68, - 0x67f: 68, - 0x680: 68, - 0x681: 68, - 0x682: 68, - 0x683: 68, - 0x684: 68, - 0x685: 68, - 0x686: 68, - 0x687: 68, - 0x688: 82, - 0x689: 82, - 0x68a: 82, - 0x68b: 82, - 0x68c: 82, - 0x68d: 82, - 0x68e: 82, - 0x68f: 82, - 0x690: 82, - 0x691: 82, - 0x692: 82, - 0x693: 82, - 0x694: 82, - 0x695: 82, - 0x696: 82, - 0x697: 82, - 0x698: 82, - 0x699: 82, - 0x69a: 68, - 0x69b: 68, - 0x69c: 68, - 0x69d: 68, - 0x69e: 68, - 0x69f: 68, - 0x6a0: 68, - 0x6a1: 68, - 0x6a2: 68, - 0x6a3: 68, - 0x6a4: 68, - 0x6a5: 68, - 0x6a6: 68, - 0x6a7: 68, - 0x6a8: 68, - 0x6a9: 68, - 0x6aa: 68, - 0x6ab: 68, - 0x6ac: 68, - 0x6ad: 68, - 0x6ae: 68, - 0x6af: 68, - 0x6b0: 68, - 0x6b1: 68, - 0x6b2: 68, - 0x6b3: 68, - 0x6b4: 68, - 0x6b5: 68, - 0x6b6: 68, - 0x6b7: 68, - 0x6b8: 68, - 0x6b9: 68, - 0x6ba: 68, - 0x6bb: 68, - 0x6bc: 68, - 0x6bd: 68, - 0x6be: 68, - 0x6bf: 68, - 0x6c0: 82, - 0x6c1: 68, - 0x6c2: 68, - 0x6c3: 82, - 0x6c4: 82, - 0x6c5: 82, - 0x6c6: 82, - 0x6c7: 82, - 0x6c8: 82, - 0x6c9: 82, - 0x6ca: 82, - 0x6cb: 82, - 0x6cc: 68, - 0x6cd: 82, - 0x6ce: 68, - 0x6cf: 82, - 0x6d0: 68, - 0x6d1: 68, - 0x6d2: 82, - 0x6d3: 82, - 0x6d5: 82, - 0x6dd: 85, - 0x6ee: 82, - 0x6ef: 82, - 0x6fa: 68, - 0x6fb: 68, - 0x6fc: 68, - 0x6ff: 68, - 0x70f: 84, - 0x710: 82, - 0x712: 68, - 0x713: 68, - 0x714: 68, - 0x715: 82, - 0x716: 82, - 0x717: 82, - 0x718: 82, - 0x719: 82, - 0x71a: 68, - 0x71b: 68, - 0x71c: 68, - 0x71d: 68, - 0x71e: 82, - 0x71f: 68, - 0x720: 68, - 0x721: 68, - 0x722: 68, - 0x723: 68, - 0x724: 68, - 0x725: 68, - 0x726: 68, - 0x727: 68, - 0x728: 82, - 0x729: 68, - 0x72a: 82, - 0x72b: 68, - 0x72c: 82, - 0x72d: 68, - 0x72e: 68, - 0x72f: 82, - 0x74d: 82, - 0x74e: 68, - 0x74f: 68, - 0x750: 68, - 0x751: 68, - 0x752: 68, - 0x753: 68, - 0x754: 68, - 0x755: 68, - 0x756: 68, - 0x757: 68, - 0x758: 68, - 0x759: 82, - 0x75a: 82, - 0x75b: 82, - 0x75c: 68, - 0x75d: 68, - 0x75e: 68, - 0x75f: 68, - 0x760: 68, - 0x761: 68, - 0x762: 68, - 0x763: 68, - 0x764: 68, - 0x765: 68, - 0x766: 68, - 0x767: 68, - 0x768: 68, - 0x769: 68, - 0x76a: 68, - 0x76b: 82, - 0x76c: 82, - 0x76d: 68, - 0x76e: 68, - 0x76f: 68, - 0x770: 68, - 0x771: 82, - 0x772: 68, - 0x773: 82, - 0x774: 82, - 0x775: 68, - 0x776: 68, - 0x777: 68, - 0x778: 82, - 0x779: 82, - 0x77a: 68, - 0x77b: 68, - 0x77c: 68, - 0x77d: 68, - 0x77e: 68, - 0x77f: 68, - 0x7ca: 68, - 0x7cb: 68, - 0x7cc: 68, - 0x7cd: 68, - 0x7ce: 68, - 0x7cf: 68, - 0x7d0: 68, - 0x7d1: 68, - 0x7d2: 68, - 0x7d3: 68, - 0x7d4: 68, - 0x7d5: 68, - 0x7d6: 68, - 0x7d7: 68, - 0x7d8: 68, - 0x7d9: 68, - 0x7da: 68, - 0x7db: 68, - 0x7dc: 68, - 0x7dd: 68, - 0x7de: 68, - 0x7df: 68, - 0x7e0: 68, - 0x7e1: 68, - 0x7e2: 68, - 0x7e3: 68, - 0x7e4: 68, - 0x7e5: 68, - 0x7e6: 68, - 0x7e7: 68, - 0x7e8: 68, - 0x7e9: 68, - 0x7ea: 68, - 0x7fa: 67, - 0x840: 82, - 0x841: 68, - 0x842: 68, - 0x843: 68, - 0x844: 68, - 0x845: 68, - 0x846: 82, - 0x847: 82, - 0x848: 68, - 0x849: 82, - 0x84a: 68, - 0x84b: 68, - 0x84c: 68, - 0x84d: 68, - 0x84e: 68, - 0x84f: 68, - 0x850: 68, - 0x851: 68, - 0x852: 68, - 0x853: 68, - 0x854: 82, - 0x855: 68, - 0x856: 85, - 0x857: 85, - 0x858: 85, - 0x860: 68, - 0x861: 85, - 0x862: 68, - 0x863: 68, - 0x864: 68, - 0x865: 68, - 0x866: 85, - 0x867: 82, - 0x868: 68, - 0x869: 82, - 0x86a: 82, - 0x8a0: 68, - 0x8a1: 68, - 0x8a2: 68, - 0x8a3: 68, - 0x8a4: 68, - 0x8a5: 68, - 0x8a6: 68, - 0x8a7: 68, - 0x8a8: 68, - 0x8a9: 68, - 0x8aa: 82, - 0x8ab: 82, - 0x8ac: 82, - 0x8ad: 85, - 0x8ae: 82, - 0x8af: 68, - 0x8b0: 68, - 0x8b1: 82, - 0x8b2: 82, - 0x8b3: 68, - 0x8b4: 68, - 0x8b6: 68, - 0x8b7: 68, - 0x8b8: 68, - 0x8b9: 82, - 0x8ba: 68, - 0x8bb: 68, - 0x8bc: 68, - 0x8bd: 68, - 0x8e2: 85, - 0x1806: 85, - 0x1807: 68, - 0x180a: 67, - 0x180e: 85, - 0x1820: 68, - 0x1821: 68, - 0x1822: 68, - 0x1823: 68, - 0x1824: 68, - 0x1825: 68, - 0x1826: 68, - 0x1827: 68, - 0x1828: 68, - 0x1829: 68, - 0x182a: 68, - 0x182b: 68, - 0x182c: 68, - 0x182d: 68, - 0x182e: 68, - 0x182f: 68, - 0x1830: 68, - 0x1831: 68, - 0x1832: 68, - 0x1833: 68, - 0x1834: 68, - 0x1835: 68, - 0x1836: 68, - 0x1837: 68, - 0x1838: 68, - 0x1839: 68, - 0x183a: 68, - 0x183b: 68, - 0x183c: 68, - 0x183d: 68, - 0x183e: 68, - 0x183f: 68, - 0x1840: 68, - 0x1841: 68, - 0x1842: 68, - 0x1843: 68, - 0x1844: 68, - 0x1845: 68, - 0x1846: 68, - 0x1847: 68, - 0x1848: 68, - 0x1849: 68, - 0x184a: 68, - 0x184b: 68, - 0x184c: 68, - 0x184d: 68, - 0x184e: 68, - 0x184f: 68, - 0x1850: 68, - 0x1851: 68, - 0x1852: 68, - 0x1853: 68, - 0x1854: 68, - 0x1855: 68, - 0x1856: 68, - 0x1857: 68, - 0x1858: 68, - 0x1859: 68, - 0x185a: 68, - 0x185b: 68, - 0x185c: 68, - 0x185d: 68, - 0x185e: 68, - 0x185f: 68, - 0x1860: 68, - 0x1861: 68, - 0x1862: 68, - 0x1863: 68, - 0x1864: 68, - 0x1865: 68, - 0x1866: 68, - 0x1867: 68, - 0x1868: 68, - 0x1869: 68, - 0x186a: 68, - 0x186b: 68, - 0x186c: 68, - 0x186d: 68, - 0x186e: 68, - 0x186f: 68, - 0x1870: 68, - 0x1871: 68, - 0x1872: 68, - 0x1873: 68, - 0x1874: 68, - 0x1875: 68, - 0x1876: 68, - 0x1877: 68, - 0x1878: 68, - 0x1880: 85, - 0x1881: 85, - 0x1882: 85, - 0x1883: 85, - 0x1884: 85, - 0x1885: 84, - 0x1886: 84, - 0x1887: 68, - 0x1888: 68, - 0x1889: 68, - 0x188a: 68, - 0x188b: 68, - 0x188c: 68, - 0x188d: 68, - 0x188e: 68, - 0x188f: 68, - 0x1890: 68, - 0x1891: 68, - 0x1892: 68, - 0x1893: 68, - 0x1894: 68, - 0x1895: 68, - 0x1896: 68, - 0x1897: 68, - 0x1898: 68, - 0x1899: 68, - 0x189a: 68, - 0x189b: 68, - 0x189c: 68, - 0x189d: 68, - 0x189e: 68, - 0x189f: 68, - 0x18a0: 68, - 0x18a1: 68, - 0x18a2: 68, - 0x18a3: 68, - 0x18a4: 68, - 0x18a5: 68, - 0x18a6: 68, - 0x18a7: 68, - 0x18a8: 68, - 0x18aa: 68, - 0x200c: 85, - 0x200d: 67, - 0x202f: 85, - 0x2066: 85, - 0x2067: 85, - 0x2068: 85, - 0x2069: 85, - 0xa840: 68, - 0xa841: 68, - 0xa842: 68, - 0xa843: 68, - 0xa844: 68, - 0xa845: 68, - 0xa846: 68, - 0xa847: 68, - 0xa848: 68, - 0xa849: 68, - 0xa84a: 68, - 0xa84b: 68, - 0xa84c: 68, - 0xa84d: 68, - 0xa84e: 68, - 0xa84f: 68, - 0xa850: 68, - 0xa851: 68, - 0xa852: 68, - 0xa853: 68, - 0xa854: 68, - 0xa855: 68, - 0xa856: 68, - 0xa857: 68, - 0xa858: 68, - 0xa859: 68, - 0xa85a: 68, - 0xa85b: 68, - 0xa85c: 68, - 0xa85d: 68, - 0xa85e: 68, - 0xa85f: 68, - 0xa860: 68, - 0xa861: 68, - 0xa862: 68, - 0xa863: 68, - 0xa864: 68, - 0xa865: 68, - 0xa866: 68, - 0xa867: 68, - 0xa868: 68, - 0xa869: 68, - 0xa86a: 68, - 0xa86b: 68, - 0xa86c: 68, - 0xa86d: 68, - 0xa86e: 68, - 0xa86f: 68, - 0xa870: 68, - 0xa871: 68, - 0xa872: 76, - 0xa873: 85, - 0x10ac0: 68, - 0x10ac1: 68, - 0x10ac2: 68, - 0x10ac3: 68, - 0x10ac4: 68, - 0x10ac5: 82, - 0x10ac6: 85, - 0x10ac7: 82, - 0x10ac8: 85, - 0x10ac9: 82, - 0x10aca: 82, - 0x10acb: 85, - 0x10acc: 85, - 0x10acd: 76, - 0x10ace: 82, - 0x10acf: 82, - 0x10ad0: 82, - 0x10ad1: 82, - 0x10ad2: 82, - 0x10ad3: 68, - 0x10ad4: 68, - 0x10ad5: 68, - 0x10ad6: 68, - 0x10ad7: 76, - 0x10ad8: 68, - 0x10ad9: 68, - 0x10ada: 68, - 0x10adb: 68, - 0x10adc: 68, - 0x10add: 82, - 0x10ade: 68, - 0x10adf: 68, - 0x10ae0: 68, - 0x10ae1: 82, - 0x10ae2: 85, - 0x10ae3: 85, - 0x10ae4: 82, - 0x10aeb: 68, - 0x10aec: 68, - 0x10aed: 68, - 0x10aee: 68, - 0x10aef: 82, - 0x10b80: 68, - 0x10b81: 82, - 0x10b82: 68, - 0x10b83: 82, - 0x10b84: 82, - 0x10b85: 82, - 0x10b86: 68, - 0x10b87: 68, - 0x10b88: 68, - 0x10b89: 82, - 0x10b8a: 68, - 0x10b8b: 68, - 0x10b8c: 82, - 0x10b8d: 68, - 0x10b8e: 82, - 0x10b8f: 82, - 0x10b90: 68, - 0x10b91: 82, - 0x10ba9: 82, - 0x10baa: 82, - 0x10bab: 82, - 0x10bac: 82, - 0x10bad: 68, - 0x10bae: 68, - 0x10baf: 85, - 0x10d00: 76, - 0x10d01: 68, - 0x10d02: 68, - 0x10d03: 68, - 0x10d04: 68, - 0x10d05: 68, - 0x10d06: 68, - 0x10d07: 68, - 0x10d08: 68, - 0x10d09: 68, - 0x10d0a: 68, - 0x10d0b: 68, - 0x10d0c: 68, - 0x10d0d: 68, - 0x10d0e: 68, - 0x10d0f: 68, - 0x10d10: 68, - 0x10d11: 68, - 0x10d12: 68, - 0x10d13: 68, - 0x10d14: 68, - 0x10d15: 68, - 0x10d16: 68, - 0x10d17: 68, - 0x10d18: 68, - 0x10d19: 68, - 0x10d1a: 68, - 0x10d1b: 68, - 0x10d1c: 68, - 0x10d1d: 68, - 0x10d1e: 68, - 0x10d1f: 68, - 0x10d20: 68, - 0x10d21: 68, - 0x10d22: 82, - 0x10d23: 68, - 0x10f30: 68, - 0x10f31: 68, - 0x10f32: 68, - 0x10f33: 82, - 0x10f34: 68, - 0x10f35: 68, - 0x10f36: 68, - 0x10f37: 68, - 0x10f38: 68, - 0x10f39: 68, - 0x10f3a: 68, - 0x10f3b: 68, - 0x10f3c: 68, - 0x10f3d: 68, - 0x10f3e: 68, - 0x10f3f: 68, - 0x10f40: 68, - 0x10f41: 68, - 0x10f42: 68, - 0x10f43: 68, - 0x10f44: 68, - 0x10f45: 85, - 0x10f51: 68, - 0x10f52: 68, - 0x10f53: 68, - 0x10f54: 82, - 0x110bd: 85, - 0x110cd: 85, - 0x1e900: 68, - 0x1e901: 68, - 0x1e902: 68, - 0x1e903: 68, - 0x1e904: 68, - 0x1e905: 68, - 0x1e906: 68, - 0x1e907: 68, - 0x1e908: 68, - 0x1e909: 68, - 0x1e90a: 68, - 0x1e90b: 68, - 0x1e90c: 68, - 0x1e90d: 68, - 0x1e90e: 68, - 0x1e90f: 68, - 0x1e910: 68, - 0x1e911: 68, - 0x1e912: 68, - 0x1e913: 68, - 0x1e914: 68, - 0x1e915: 68, - 0x1e916: 68, - 0x1e917: 68, - 0x1e918: 68, - 0x1e919: 68, - 0x1e91a: 68, - 0x1e91b: 68, - 0x1e91c: 68, - 0x1e91d: 68, - 0x1e91e: 68, - 0x1e91f: 68, - 0x1e920: 68, - 0x1e921: 68, - 0x1e922: 68, - 0x1e923: 68, - 0x1e924: 68, - 0x1e925: 68, - 0x1e926: 68, - 0x1e927: 68, - 0x1e928: 68, - 0x1e929: 68, - 0x1e92a: 68, - 0x1e92b: 68, - 0x1e92c: 68, - 0x1e92d: 68, - 0x1e92e: 68, - 0x1e92f: 68, - 0x1e930: 68, - 0x1e931: 68, - 0x1e932: 68, - 0x1e933: 68, - 0x1e934: 68, - 0x1e935: 68, - 0x1e936: 68, - 0x1e937: 68, - 0x1e938: 68, - 0x1e939: 68, - 0x1e93a: 68, - 0x1e93b: 68, - 0x1e93c: 68, - 0x1e93d: 68, - 0x1e93e: 68, - 0x1e93f: 68, - 0x1e940: 68, - 0x1e941: 68, - 0x1e942: 68, - 0x1e943: 68, -} -codepoint_classes = { - 'PVALID': ( - 0x2d0000002e, - 0x300000003a, - 0x610000007b, - 0xdf000000f7, - 0xf800000100, - 0x10100000102, - 0x10300000104, - 0x10500000106, - 0x10700000108, - 0x1090000010a, - 0x10b0000010c, - 0x10d0000010e, - 0x10f00000110, - 0x11100000112, - 0x11300000114, - 0x11500000116, - 0x11700000118, - 0x1190000011a, - 0x11b0000011c, - 0x11d0000011e, - 0x11f00000120, - 0x12100000122, - 0x12300000124, - 0x12500000126, - 0x12700000128, - 0x1290000012a, - 0x12b0000012c, - 0x12d0000012e, - 0x12f00000130, - 0x13100000132, - 0x13500000136, - 0x13700000139, - 0x13a0000013b, - 0x13c0000013d, - 0x13e0000013f, - 0x14200000143, - 0x14400000145, - 0x14600000147, - 0x14800000149, - 0x14b0000014c, - 0x14d0000014e, - 0x14f00000150, - 0x15100000152, - 0x15300000154, - 0x15500000156, - 0x15700000158, - 0x1590000015a, - 0x15b0000015c, - 0x15d0000015e, - 0x15f00000160, - 0x16100000162, - 0x16300000164, - 0x16500000166, - 0x16700000168, - 0x1690000016a, - 0x16b0000016c, - 0x16d0000016e, - 0x16f00000170, - 0x17100000172, - 0x17300000174, - 0x17500000176, - 0x17700000178, - 0x17a0000017b, - 0x17c0000017d, - 0x17e0000017f, - 0x18000000181, - 0x18300000184, - 0x18500000186, - 0x18800000189, - 0x18c0000018e, - 0x19200000193, - 0x19500000196, - 0x1990000019c, - 0x19e0000019f, - 0x1a1000001a2, - 0x1a3000001a4, - 0x1a5000001a6, - 0x1a8000001a9, - 0x1aa000001ac, - 0x1ad000001ae, - 0x1b0000001b1, - 0x1b4000001b5, - 0x1b6000001b7, - 0x1b9000001bc, - 0x1bd000001c4, - 0x1ce000001cf, - 0x1d0000001d1, - 0x1d2000001d3, - 0x1d4000001d5, - 0x1d6000001d7, - 0x1d8000001d9, - 0x1da000001db, - 0x1dc000001de, - 0x1df000001e0, - 0x1e1000001e2, - 0x1e3000001e4, - 0x1e5000001e6, - 0x1e7000001e8, - 0x1e9000001ea, - 0x1eb000001ec, - 0x1ed000001ee, - 0x1ef000001f1, - 0x1f5000001f6, - 0x1f9000001fa, - 0x1fb000001fc, - 0x1fd000001fe, - 0x1ff00000200, - 0x20100000202, - 0x20300000204, - 0x20500000206, - 0x20700000208, - 0x2090000020a, - 0x20b0000020c, - 0x20d0000020e, - 0x20f00000210, - 0x21100000212, - 0x21300000214, - 0x21500000216, - 0x21700000218, - 0x2190000021a, - 0x21b0000021c, - 0x21d0000021e, - 0x21f00000220, - 0x22100000222, - 0x22300000224, - 0x22500000226, - 0x22700000228, - 0x2290000022a, - 0x22b0000022c, - 0x22d0000022e, - 0x22f00000230, - 0x23100000232, - 0x2330000023a, - 0x23c0000023d, - 0x23f00000241, - 0x24200000243, - 0x24700000248, - 0x2490000024a, - 0x24b0000024c, - 0x24d0000024e, - 0x24f000002b0, - 0x2b9000002c2, - 0x2c6000002d2, - 0x2ec000002ed, - 0x2ee000002ef, - 0x30000000340, - 0x34200000343, - 0x3460000034f, - 0x35000000370, - 0x37100000372, - 0x37300000374, - 0x37700000378, - 0x37b0000037e, - 0x39000000391, - 0x3ac000003cf, - 0x3d7000003d8, - 0x3d9000003da, - 0x3db000003dc, - 0x3dd000003de, - 0x3df000003e0, - 0x3e1000003e2, - 0x3e3000003e4, - 0x3e5000003e6, - 0x3e7000003e8, - 0x3e9000003ea, - 0x3eb000003ec, - 0x3ed000003ee, - 0x3ef000003f0, - 0x3f3000003f4, - 0x3f8000003f9, - 0x3fb000003fd, - 0x43000000460, - 0x46100000462, - 0x46300000464, - 0x46500000466, - 0x46700000468, - 0x4690000046a, - 0x46b0000046c, - 0x46d0000046e, - 0x46f00000470, - 0x47100000472, - 0x47300000474, - 0x47500000476, - 0x47700000478, - 0x4790000047a, - 0x47b0000047c, - 0x47d0000047e, - 0x47f00000480, - 0x48100000482, - 0x48300000488, - 0x48b0000048c, - 0x48d0000048e, - 0x48f00000490, - 0x49100000492, - 0x49300000494, - 0x49500000496, - 0x49700000498, - 0x4990000049a, - 0x49b0000049c, - 0x49d0000049e, - 0x49f000004a0, - 0x4a1000004a2, - 0x4a3000004a4, - 0x4a5000004a6, - 0x4a7000004a8, - 0x4a9000004aa, - 0x4ab000004ac, - 0x4ad000004ae, - 0x4af000004b0, - 0x4b1000004b2, - 0x4b3000004b4, - 0x4b5000004b6, - 0x4b7000004b8, - 0x4b9000004ba, - 0x4bb000004bc, - 0x4bd000004be, - 0x4bf000004c0, - 0x4c2000004c3, - 0x4c4000004c5, - 0x4c6000004c7, - 0x4c8000004c9, - 0x4ca000004cb, - 0x4cc000004cd, - 0x4ce000004d0, - 0x4d1000004d2, - 0x4d3000004d4, - 0x4d5000004d6, - 0x4d7000004d8, - 0x4d9000004da, - 0x4db000004dc, - 0x4dd000004de, - 0x4df000004e0, - 0x4e1000004e2, - 0x4e3000004e4, - 0x4e5000004e6, - 0x4e7000004e8, - 0x4e9000004ea, - 0x4eb000004ec, - 0x4ed000004ee, - 0x4ef000004f0, - 0x4f1000004f2, - 0x4f3000004f4, - 0x4f5000004f6, - 0x4f7000004f8, - 0x4f9000004fa, - 0x4fb000004fc, - 0x4fd000004fe, - 0x4ff00000500, - 0x50100000502, - 0x50300000504, - 0x50500000506, - 0x50700000508, - 0x5090000050a, - 0x50b0000050c, - 0x50d0000050e, - 0x50f00000510, - 0x51100000512, - 0x51300000514, - 0x51500000516, - 0x51700000518, - 0x5190000051a, - 0x51b0000051c, - 0x51d0000051e, - 0x51f00000520, - 0x52100000522, - 0x52300000524, - 0x52500000526, - 0x52700000528, - 0x5290000052a, - 0x52b0000052c, - 0x52d0000052e, - 0x52f00000530, - 0x5590000055a, - 0x56000000587, - 0x58800000589, - 0x591000005be, - 0x5bf000005c0, - 0x5c1000005c3, - 0x5c4000005c6, - 0x5c7000005c8, - 0x5d0000005eb, - 0x5ef000005f3, - 0x6100000061b, - 0x62000000640, - 0x64100000660, - 0x66e00000675, - 0x679000006d4, - 0x6d5000006dd, - 0x6df000006e9, - 0x6ea000006f0, - 0x6fa00000700, - 0x7100000074b, - 0x74d000007b2, - 0x7c0000007f6, - 0x7fd000007fe, - 0x8000000082e, - 0x8400000085c, - 0x8600000086b, - 0x8a0000008b5, - 0x8b6000008be, - 0x8d3000008e2, - 0x8e300000958, - 0x96000000964, - 0x96600000970, - 0x97100000984, - 0x9850000098d, - 0x98f00000991, - 0x993000009a9, - 0x9aa000009b1, - 0x9b2000009b3, - 0x9b6000009ba, - 0x9bc000009c5, - 0x9c7000009c9, - 0x9cb000009cf, - 0x9d7000009d8, - 0x9e0000009e4, - 0x9e6000009f2, - 0x9fc000009fd, - 0x9fe000009ff, - 0xa0100000a04, - 0xa0500000a0b, - 0xa0f00000a11, - 0xa1300000a29, - 0xa2a00000a31, - 0xa3200000a33, - 0xa3500000a36, - 0xa3800000a3a, - 0xa3c00000a3d, - 0xa3e00000a43, - 0xa4700000a49, - 0xa4b00000a4e, - 0xa5100000a52, - 0xa5c00000a5d, - 0xa6600000a76, - 0xa8100000a84, - 0xa8500000a8e, - 0xa8f00000a92, - 0xa9300000aa9, - 0xaaa00000ab1, - 0xab200000ab4, - 0xab500000aba, - 0xabc00000ac6, - 0xac700000aca, - 0xacb00000ace, - 0xad000000ad1, - 0xae000000ae4, - 0xae600000af0, - 0xaf900000b00, - 0xb0100000b04, - 0xb0500000b0d, - 0xb0f00000b11, - 0xb1300000b29, - 0xb2a00000b31, - 0xb3200000b34, - 0xb3500000b3a, - 0xb3c00000b45, - 0xb4700000b49, - 0xb4b00000b4e, - 0xb5600000b58, - 0xb5f00000b64, - 0xb6600000b70, - 0xb7100000b72, - 0xb8200000b84, - 0xb8500000b8b, - 0xb8e00000b91, - 0xb9200000b96, - 0xb9900000b9b, - 0xb9c00000b9d, - 0xb9e00000ba0, - 0xba300000ba5, - 0xba800000bab, - 0xbae00000bba, - 0xbbe00000bc3, - 0xbc600000bc9, - 0xbca00000bce, - 0xbd000000bd1, - 0xbd700000bd8, - 0xbe600000bf0, - 0xc0000000c0d, - 0xc0e00000c11, - 0xc1200000c29, - 0xc2a00000c3a, - 0xc3d00000c45, - 0xc4600000c49, - 0xc4a00000c4e, - 0xc5500000c57, - 0xc5800000c5b, - 0xc6000000c64, - 0xc6600000c70, - 0xc8000000c84, - 0xc8500000c8d, - 0xc8e00000c91, - 0xc9200000ca9, - 0xcaa00000cb4, - 0xcb500000cba, - 0xcbc00000cc5, - 0xcc600000cc9, - 0xcca00000cce, - 0xcd500000cd7, - 0xcde00000cdf, - 0xce000000ce4, - 0xce600000cf0, - 0xcf100000cf3, - 0xd0000000d04, - 0xd0500000d0d, - 0xd0e00000d11, - 0xd1200000d45, - 0xd4600000d49, - 0xd4a00000d4f, - 0xd5400000d58, - 0xd5f00000d64, - 0xd6600000d70, - 0xd7a00000d80, - 0xd8200000d84, - 0xd8500000d97, - 0xd9a00000db2, - 0xdb300000dbc, - 0xdbd00000dbe, - 0xdc000000dc7, - 0xdca00000dcb, - 0xdcf00000dd5, - 0xdd600000dd7, - 0xdd800000de0, - 0xde600000df0, - 0xdf200000df4, - 0xe0100000e33, - 0xe3400000e3b, - 0xe4000000e4f, - 0xe5000000e5a, - 0xe8100000e83, - 0xe8400000e85, - 0xe8700000e89, - 0xe8a00000e8b, - 0xe8d00000e8e, - 0xe9400000e98, - 0xe9900000ea0, - 0xea100000ea4, - 0xea500000ea6, - 0xea700000ea8, - 0xeaa00000eac, - 0xead00000eb3, - 0xeb400000eba, - 0xebb00000ebe, - 0xec000000ec5, - 0xec600000ec7, - 0xec800000ece, - 0xed000000eda, - 0xede00000ee0, - 0xf0000000f01, - 0xf0b00000f0c, - 0xf1800000f1a, - 0xf2000000f2a, - 0xf3500000f36, - 0xf3700000f38, - 0xf3900000f3a, - 0xf3e00000f43, - 0xf4400000f48, - 0xf4900000f4d, - 0xf4e00000f52, - 0xf5300000f57, - 0xf5800000f5c, - 0xf5d00000f69, - 0xf6a00000f6d, - 0xf7100000f73, - 0xf7400000f75, - 0xf7a00000f81, - 0xf8200000f85, - 0xf8600000f93, - 0xf9400000f98, - 0xf9900000f9d, - 0xf9e00000fa2, - 0xfa300000fa7, - 0xfa800000fac, - 0xfad00000fb9, - 0xfba00000fbd, - 0xfc600000fc7, - 0x10000000104a, - 0x10500000109e, - 0x10d0000010fb, - 0x10fd00001100, - 0x120000001249, - 0x124a0000124e, - 0x125000001257, - 0x125800001259, - 0x125a0000125e, - 0x126000001289, - 0x128a0000128e, - 0x1290000012b1, - 0x12b2000012b6, - 0x12b8000012bf, - 0x12c0000012c1, - 0x12c2000012c6, - 0x12c8000012d7, - 0x12d800001311, - 0x131200001316, - 0x13180000135b, - 0x135d00001360, - 0x138000001390, - 0x13a0000013f6, - 0x14010000166d, - 0x166f00001680, - 0x16810000169b, - 0x16a0000016eb, - 0x16f1000016f9, - 0x17000000170d, - 0x170e00001715, - 0x172000001735, - 0x174000001754, - 0x17600000176d, - 0x176e00001771, - 0x177200001774, - 0x1780000017b4, - 0x17b6000017d4, - 0x17d7000017d8, - 0x17dc000017de, - 0x17e0000017ea, - 0x18100000181a, - 0x182000001879, - 0x1880000018ab, - 0x18b0000018f6, - 0x19000000191f, - 0x19200000192c, - 0x19300000193c, - 0x19460000196e, - 0x197000001975, - 0x1980000019ac, - 0x19b0000019ca, - 0x19d0000019da, - 0x1a0000001a1c, - 0x1a2000001a5f, - 0x1a6000001a7d, - 0x1a7f00001a8a, - 0x1a9000001a9a, - 0x1aa700001aa8, - 0x1ab000001abe, - 0x1b0000001b4c, - 0x1b5000001b5a, - 0x1b6b00001b74, - 0x1b8000001bf4, - 0x1c0000001c38, - 0x1c4000001c4a, - 0x1c4d00001c7e, - 0x1cd000001cd3, - 0x1cd400001cfa, - 0x1d0000001d2c, - 0x1d2f00001d30, - 0x1d3b00001d3c, - 0x1d4e00001d4f, - 0x1d6b00001d78, - 0x1d7900001d9b, - 0x1dc000001dfa, - 0x1dfb00001e00, - 0x1e0100001e02, - 0x1e0300001e04, - 0x1e0500001e06, - 0x1e0700001e08, - 0x1e0900001e0a, - 0x1e0b00001e0c, - 0x1e0d00001e0e, - 0x1e0f00001e10, - 0x1e1100001e12, - 0x1e1300001e14, - 0x1e1500001e16, - 0x1e1700001e18, - 0x1e1900001e1a, - 0x1e1b00001e1c, - 0x1e1d00001e1e, - 0x1e1f00001e20, - 0x1e2100001e22, - 0x1e2300001e24, - 0x1e2500001e26, - 0x1e2700001e28, - 0x1e2900001e2a, - 0x1e2b00001e2c, - 0x1e2d00001e2e, - 0x1e2f00001e30, - 0x1e3100001e32, - 0x1e3300001e34, - 0x1e3500001e36, - 0x1e3700001e38, - 0x1e3900001e3a, - 0x1e3b00001e3c, - 0x1e3d00001e3e, - 0x1e3f00001e40, - 0x1e4100001e42, - 0x1e4300001e44, - 0x1e4500001e46, - 0x1e4700001e48, - 0x1e4900001e4a, - 0x1e4b00001e4c, - 0x1e4d00001e4e, - 0x1e4f00001e50, - 0x1e5100001e52, - 0x1e5300001e54, - 0x1e5500001e56, - 0x1e5700001e58, - 0x1e5900001e5a, - 0x1e5b00001e5c, - 0x1e5d00001e5e, - 0x1e5f00001e60, - 0x1e6100001e62, - 0x1e6300001e64, - 0x1e6500001e66, - 0x1e6700001e68, - 0x1e6900001e6a, - 0x1e6b00001e6c, - 0x1e6d00001e6e, - 0x1e6f00001e70, - 0x1e7100001e72, - 0x1e7300001e74, - 0x1e7500001e76, - 0x1e7700001e78, - 0x1e7900001e7a, - 0x1e7b00001e7c, - 0x1e7d00001e7e, - 0x1e7f00001e80, - 0x1e8100001e82, - 0x1e8300001e84, - 0x1e8500001e86, - 0x1e8700001e88, - 0x1e8900001e8a, - 0x1e8b00001e8c, - 0x1e8d00001e8e, - 0x1e8f00001e90, - 0x1e9100001e92, - 0x1e9300001e94, - 0x1e9500001e9a, - 0x1e9c00001e9e, - 0x1e9f00001ea0, - 0x1ea100001ea2, - 0x1ea300001ea4, - 0x1ea500001ea6, - 0x1ea700001ea8, - 0x1ea900001eaa, - 0x1eab00001eac, - 0x1ead00001eae, - 0x1eaf00001eb0, - 0x1eb100001eb2, - 0x1eb300001eb4, - 0x1eb500001eb6, - 0x1eb700001eb8, - 0x1eb900001eba, - 0x1ebb00001ebc, - 0x1ebd00001ebe, - 0x1ebf00001ec0, - 0x1ec100001ec2, - 0x1ec300001ec4, - 0x1ec500001ec6, - 0x1ec700001ec8, - 0x1ec900001eca, - 0x1ecb00001ecc, - 0x1ecd00001ece, - 0x1ecf00001ed0, - 0x1ed100001ed2, - 0x1ed300001ed4, - 0x1ed500001ed6, - 0x1ed700001ed8, - 0x1ed900001eda, - 0x1edb00001edc, - 0x1edd00001ede, - 0x1edf00001ee0, - 0x1ee100001ee2, - 0x1ee300001ee4, - 0x1ee500001ee6, - 0x1ee700001ee8, - 0x1ee900001eea, - 0x1eeb00001eec, - 0x1eed00001eee, - 0x1eef00001ef0, - 0x1ef100001ef2, - 0x1ef300001ef4, - 0x1ef500001ef6, - 0x1ef700001ef8, - 0x1ef900001efa, - 0x1efb00001efc, - 0x1efd00001efe, - 0x1eff00001f08, - 0x1f1000001f16, - 0x1f2000001f28, - 0x1f3000001f38, - 0x1f4000001f46, - 0x1f5000001f58, - 0x1f6000001f68, - 0x1f7000001f71, - 0x1f7200001f73, - 0x1f7400001f75, - 0x1f7600001f77, - 0x1f7800001f79, - 0x1f7a00001f7b, - 0x1f7c00001f7d, - 0x1fb000001fb2, - 0x1fb600001fb7, - 0x1fc600001fc7, - 0x1fd000001fd3, - 0x1fd600001fd8, - 0x1fe000001fe3, - 0x1fe400001fe8, - 0x1ff600001ff7, - 0x214e0000214f, - 0x218400002185, - 0x2c3000002c5f, - 0x2c6100002c62, - 0x2c6500002c67, - 0x2c6800002c69, - 0x2c6a00002c6b, - 0x2c6c00002c6d, - 0x2c7100002c72, - 0x2c7300002c75, - 0x2c7600002c7c, - 0x2c8100002c82, - 0x2c8300002c84, - 0x2c8500002c86, - 0x2c8700002c88, - 0x2c8900002c8a, - 0x2c8b00002c8c, - 0x2c8d00002c8e, - 0x2c8f00002c90, - 0x2c9100002c92, - 0x2c9300002c94, - 0x2c9500002c96, - 0x2c9700002c98, - 0x2c9900002c9a, - 0x2c9b00002c9c, - 0x2c9d00002c9e, - 0x2c9f00002ca0, - 0x2ca100002ca2, - 0x2ca300002ca4, - 0x2ca500002ca6, - 0x2ca700002ca8, - 0x2ca900002caa, - 0x2cab00002cac, - 0x2cad00002cae, - 0x2caf00002cb0, - 0x2cb100002cb2, - 0x2cb300002cb4, - 0x2cb500002cb6, - 0x2cb700002cb8, - 0x2cb900002cba, - 0x2cbb00002cbc, - 0x2cbd00002cbe, - 0x2cbf00002cc0, - 0x2cc100002cc2, - 0x2cc300002cc4, - 0x2cc500002cc6, - 0x2cc700002cc8, - 0x2cc900002cca, - 0x2ccb00002ccc, - 0x2ccd00002cce, - 0x2ccf00002cd0, - 0x2cd100002cd2, - 0x2cd300002cd4, - 0x2cd500002cd6, - 0x2cd700002cd8, - 0x2cd900002cda, - 0x2cdb00002cdc, - 0x2cdd00002cde, - 0x2cdf00002ce0, - 0x2ce100002ce2, - 0x2ce300002ce5, - 0x2cec00002ced, - 0x2cee00002cf2, - 0x2cf300002cf4, - 0x2d0000002d26, - 0x2d2700002d28, - 0x2d2d00002d2e, - 0x2d3000002d68, - 0x2d7f00002d97, - 0x2da000002da7, - 0x2da800002daf, - 0x2db000002db7, - 0x2db800002dbf, - 0x2dc000002dc7, - 0x2dc800002dcf, - 0x2dd000002dd7, - 0x2dd800002ddf, - 0x2de000002e00, - 0x2e2f00002e30, - 0x300500003008, - 0x302a0000302e, - 0x303c0000303d, - 0x304100003097, - 0x30990000309b, - 0x309d0000309f, - 0x30a1000030fb, - 0x30fc000030ff, - 0x310500003130, - 0x31a0000031bb, - 0x31f000003200, - 0x340000004db6, - 0x4e0000009ff0, - 0xa0000000a48d, - 0xa4d00000a4fe, - 0xa5000000a60d, - 0xa6100000a62c, - 0xa6410000a642, - 0xa6430000a644, - 0xa6450000a646, - 0xa6470000a648, - 0xa6490000a64a, - 0xa64b0000a64c, - 0xa64d0000a64e, - 0xa64f0000a650, - 0xa6510000a652, - 0xa6530000a654, - 0xa6550000a656, - 0xa6570000a658, - 0xa6590000a65a, - 0xa65b0000a65c, - 0xa65d0000a65e, - 0xa65f0000a660, - 0xa6610000a662, - 0xa6630000a664, - 0xa6650000a666, - 0xa6670000a668, - 0xa6690000a66a, - 0xa66b0000a66c, - 0xa66d0000a670, - 0xa6740000a67e, - 0xa67f0000a680, - 0xa6810000a682, - 0xa6830000a684, - 0xa6850000a686, - 0xa6870000a688, - 0xa6890000a68a, - 0xa68b0000a68c, - 0xa68d0000a68e, - 0xa68f0000a690, - 0xa6910000a692, - 0xa6930000a694, - 0xa6950000a696, - 0xa6970000a698, - 0xa6990000a69a, - 0xa69b0000a69c, - 0xa69e0000a6e6, - 0xa6f00000a6f2, - 0xa7170000a720, - 0xa7230000a724, - 0xa7250000a726, - 0xa7270000a728, - 0xa7290000a72a, - 0xa72b0000a72c, - 0xa72d0000a72e, - 0xa72f0000a732, - 0xa7330000a734, - 0xa7350000a736, - 0xa7370000a738, - 0xa7390000a73a, - 0xa73b0000a73c, - 0xa73d0000a73e, - 0xa73f0000a740, - 0xa7410000a742, - 0xa7430000a744, - 0xa7450000a746, - 0xa7470000a748, - 0xa7490000a74a, - 0xa74b0000a74c, - 0xa74d0000a74e, - 0xa74f0000a750, - 0xa7510000a752, - 0xa7530000a754, - 0xa7550000a756, - 0xa7570000a758, - 0xa7590000a75a, - 0xa75b0000a75c, - 0xa75d0000a75e, - 0xa75f0000a760, - 0xa7610000a762, - 0xa7630000a764, - 0xa7650000a766, - 0xa7670000a768, - 0xa7690000a76a, - 0xa76b0000a76c, - 0xa76d0000a76e, - 0xa76f0000a770, - 0xa7710000a779, - 0xa77a0000a77b, - 0xa77c0000a77d, - 0xa77f0000a780, - 0xa7810000a782, - 0xa7830000a784, - 0xa7850000a786, - 0xa7870000a789, - 0xa78c0000a78d, - 0xa78e0000a790, - 0xa7910000a792, - 0xa7930000a796, - 0xa7970000a798, - 0xa7990000a79a, - 0xa79b0000a79c, - 0xa79d0000a79e, - 0xa79f0000a7a0, - 0xa7a10000a7a2, - 0xa7a30000a7a4, - 0xa7a50000a7a6, - 0xa7a70000a7a8, - 0xa7a90000a7aa, - 0xa7af0000a7b0, - 0xa7b50000a7b6, - 0xa7b70000a7b8, - 0xa7b90000a7ba, - 0xa7f70000a7f8, - 0xa7fa0000a828, - 0xa8400000a874, - 0xa8800000a8c6, - 0xa8d00000a8da, - 0xa8e00000a8f8, - 0xa8fb0000a8fc, - 0xa8fd0000a92e, - 0xa9300000a954, - 0xa9800000a9c1, - 0xa9cf0000a9da, - 0xa9e00000a9ff, - 0xaa000000aa37, - 0xaa400000aa4e, - 0xaa500000aa5a, - 0xaa600000aa77, - 0xaa7a0000aac3, - 0xaadb0000aade, - 0xaae00000aaf0, - 0xaaf20000aaf7, - 0xab010000ab07, - 0xab090000ab0f, - 0xab110000ab17, - 0xab200000ab27, - 0xab280000ab2f, - 0xab300000ab5b, - 0xab600000ab66, - 0xabc00000abeb, - 0xabec0000abee, - 0xabf00000abfa, - 0xac000000d7a4, - 0xfa0e0000fa10, - 0xfa110000fa12, - 0xfa130000fa15, - 0xfa1f0000fa20, - 0xfa210000fa22, - 0xfa230000fa25, - 0xfa270000fa2a, - 0xfb1e0000fb1f, - 0xfe200000fe30, - 0xfe730000fe74, - 0x100000001000c, - 0x1000d00010027, - 0x100280001003b, - 0x1003c0001003e, - 0x1003f0001004e, - 0x100500001005e, - 0x10080000100fb, - 0x101fd000101fe, - 0x102800001029d, - 0x102a0000102d1, - 0x102e0000102e1, - 0x1030000010320, - 0x1032d00010341, - 0x103420001034a, - 0x103500001037b, - 0x103800001039e, - 0x103a0000103c4, - 0x103c8000103d0, - 0x104280001049e, - 0x104a0000104aa, - 0x104d8000104fc, - 0x1050000010528, - 0x1053000010564, - 0x1060000010737, - 0x1074000010756, - 0x1076000010768, - 0x1080000010806, - 0x1080800010809, - 0x1080a00010836, - 0x1083700010839, - 0x1083c0001083d, - 0x1083f00010856, - 0x1086000010877, - 0x108800001089f, - 0x108e0000108f3, - 0x108f4000108f6, - 0x1090000010916, - 0x109200001093a, - 0x10980000109b8, - 0x109be000109c0, - 0x10a0000010a04, - 0x10a0500010a07, - 0x10a0c00010a14, - 0x10a1500010a18, - 0x10a1900010a36, - 0x10a3800010a3b, - 0x10a3f00010a40, - 0x10a6000010a7d, - 0x10a8000010a9d, - 0x10ac000010ac8, - 0x10ac900010ae7, - 0x10b0000010b36, - 0x10b4000010b56, - 0x10b6000010b73, - 0x10b8000010b92, - 0x10c0000010c49, - 0x10cc000010cf3, - 0x10d0000010d28, - 0x10d3000010d3a, - 0x10f0000010f1d, - 0x10f2700010f28, - 0x10f3000010f51, - 0x1100000011047, - 0x1106600011070, - 0x1107f000110bb, - 0x110d0000110e9, - 0x110f0000110fa, - 0x1110000011135, - 0x1113600011140, - 0x1114400011147, - 0x1115000011174, - 0x1117600011177, - 0x11180000111c5, - 0x111c9000111cd, - 0x111d0000111db, - 0x111dc000111dd, - 0x1120000011212, - 0x1121300011238, - 0x1123e0001123f, - 0x1128000011287, - 0x1128800011289, - 0x1128a0001128e, - 0x1128f0001129e, - 0x1129f000112a9, - 0x112b0000112eb, - 0x112f0000112fa, - 0x1130000011304, - 0x113050001130d, - 0x1130f00011311, - 0x1131300011329, - 0x1132a00011331, - 0x1133200011334, - 0x113350001133a, - 0x1133b00011345, - 0x1134700011349, - 0x1134b0001134e, - 0x1135000011351, - 0x1135700011358, - 0x1135d00011364, - 0x113660001136d, - 0x1137000011375, - 0x114000001144b, - 0x114500001145a, - 0x1145e0001145f, - 0x11480000114c6, - 0x114c7000114c8, - 0x114d0000114da, - 0x11580000115b6, - 0x115b8000115c1, - 0x115d8000115de, - 0x1160000011641, - 0x1164400011645, - 0x116500001165a, - 0x11680000116b8, - 0x116c0000116ca, - 0x117000001171b, - 0x1171d0001172c, - 0x117300001173a, - 0x118000001183b, - 0x118c0000118ea, - 0x118ff00011900, - 0x11a0000011a3f, - 0x11a4700011a48, - 0x11a5000011a84, - 0x11a8600011a9a, - 0x11a9d00011a9e, - 0x11ac000011af9, - 0x11c0000011c09, - 0x11c0a00011c37, - 0x11c3800011c41, - 0x11c5000011c5a, - 0x11c7200011c90, - 0x11c9200011ca8, - 0x11ca900011cb7, - 0x11d0000011d07, - 0x11d0800011d0a, - 0x11d0b00011d37, - 0x11d3a00011d3b, - 0x11d3c00011d3e, - 0x11d3f00011d48, - 0x11d5000011d5a, - 0x11d6000011d66, - 0x11d6700011d69, - 0x11d6a00011d8f, - 0x11d9000011d92, - 0x11d9300011d99, - 0x11da000011daa, - 0x11ee000011ef7, - 0x120000001239a, - 0x1248000012544, - 0x130000001342f, - 0x1440000014647, - 0x1680000016a39, - 0x16a4000016a5f, - 0x16a6000016a6a, - 0x16ad000016aee, - 0x16af000016af5, - 0x16b0000016b37, - 0x16b4000016b44, - 0x16b5000016b5a, - 0x16b6300016b78, - 0x16b7d00016b90, - 0x16e6000016e80, - 0x16f0000016f45, - 0x16f5000016f7f, - 0x16f8f00016fa0, - 0x16fe000016fe2, - 0x17000000187f2, - 0x1880000018af3, - 0x1b0000001b11f, - 0x1b1700001b2fc, - 0x1bc000001bc6b, - 0x1bc700001bc7d, - 0x1bc800001bc89, - 0x1bc900001bc9a, - 0x1bc9d0001bc9f, - 0x1da000001da37, - 0x1da3b0001da6d, - 0x1da750001da76, - 0x1da840001da85, - 0x1da9b0001daa0, - 0x1daa10001dab0, - 0x1e0000001e007, - 0x1e0080001e019, - 0x1e01b0001e022, - 0x1e0230001e025, - 0x1e0260001e02b, - 0x1e8000001e8c5, - 0x1e8d00001e8d7, - 0x1e9220001e94b, - 0x1e9500001e95a, - 0x200000002a6d7, - 0x2a7000002b735, - 0x2b7400002b81e, - 0x2b8200002cea2, - 0x2ceb00002ebe1, - ), - 'CONTEXTJ': ( - 0x200c0000200e, - ), - 'CONTEXTO': ( - 0xb7000000b8, - 0x37500000376, - 0x5f3000005f5, - 0x6600000066a, - 0x6f0000006fa, - 0x30fb000030fc, - ), -} diff --git a/env/lib/python3.7/site-packages/pip/_vendor/idna/intranges.py b/env/lib/python3.7/site-packages/pip/_vendor/idna/intranges.py deleted file mode 100644 index fa8a735..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/idna/intranges.py +++ /dev/null @@ -1,53 +0,0 @@ -""" -Given a list of integers, made up of (hopefully) a small number of long runs -of consecutive integers, compute a representation of the form -((start1, end1), (start2, end2) ...). Then answer the question "was x present -in the original list?" in time O(log(# runs)). -""" - -import bisect - -def intranges_from_list(list_): - """Represent a list of integers as a sequence of ranges: - ((start_0, end_0), (start_1, end_1), ...), such that the original - integers are exactly those x such that start_i <= x < end_i for some i. - - Ranges are encoded as single integers (start << 32 | end), not as tuples. - """ - - sorted_list = sorted(list_) - ranges = [] - last_write = -1 - for i in range(len(sorted_list)): - if i+1 < len(sorted_list): - if sorted_list[i] == sorted_list[i+1]-1: - continue - current_range = sorted_list[last_write+1:i+1] - ranges.append(_encode_range(current_range[0], current_range[-1] + 1)) - last_write = i - - return tuple(ranges) - -def _encode_range(start, end): - return (start << 32) | end - -def _decode_range(r): - return (r >> 32), (r & ((1 << 32) - 1)) - - -def intranges_contain(int_, ranges): - """Determine if `int_` falls into one of the ranges in `ranges`.""" - tuple_ = _encode_range(int_, 0) - pos = bisect.bisect_left(ranges, tuple_) - # we could be immediately ahead of a tuple (start, end) - # with start < int_ <= end - if pos > 0: - left, right = _decode_range(ranges[pos-1]) - if left <= int_ < right: - return True - # or we could be immediately behind a tuple (int_, end) - if pos < len(ranges): - left, _ = _decode_range(ranges[pos]) - if left == int_: - return True - return False diff --git a/env/lib/python3.7/site-packages/pip/_vendor/idna/package_data.py b/env/lib/python3.7/site-packages/pip/_vendor/idna/package_data.py deleted file mode 100644 index 257e898..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/idna/package_data.py +++ /dev/null @@ -1,2 +0,0 @@ -__version__ = '2.8' - diff --git a/env/lib/python3.7/site-packages/pip/_vendor/idna/uts46data.py b/env/lib/python3.7/site-packages/pip/_vendor/idna/uts46data.py deleted file mode 100644 index a68ed4c..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/idna/uts46data.py +++ /dev/null @@ -1,8205 +0,0 @@ -# This file is automatically generated by tools/idna-data -# vim: set fileencoding=utf-8 : - -"""IDNA Mapping Table from UTS46.""" - - -__version__ = "11.0.0" -def _seg_0(): - return [ - (0x0, '3'), - (0x1, '3'), - (0x2, '3'), - (0x3, '3'), - (0x4, '3'), - (0x5, '3'), - (0x6, '3'), - (0x7, '3'), - (0x8, '3'), - (0x9, '3'), - (0xA, '3'), - (0xB, '3'), - (0xC, '3'), - (0xD, '3'), - (0xE, '3'), - (0xF, '3'), - (0x10, '3'), - (0x11, '3'), - (0x12, '3'), - (0x13, '3'), - (0x14, '3'), - (0x15, '3'), - (0x16, '3'), - (0x17, '3'), - (0x18, '3'), - (0x19, '3'), - (0x1A, '3'), - (0x1B, '3'), - (0x1C, '3'), - (0x1D, '3'), - (0x1E, '3'), - (0x1F, '3'), - (0x20, '3'), - (0x21, '3'), - (0x22, '3'), - (0x23, '3'), - (0x24, '3'), - (0x25, '3'), - (0x26, '3'), - (0x27, '3'), - (0x28, '3'), - (0x29, '3'), - (0x2A, '3'), - (0x2B, '3'), - (0x2C, '3'), - (0x2D, 'V'), - (0x2E, 'V'), - (0x2F, '3'), - (0x30, 'V'), - (0x31, 'V'), - (0x32, 'V'), - (0x33, 'V'), - (0x34, 'V'), - (0x35, 'V'), - (0x36, 'V'), - (0x37, 'V'), - (0x38, 'V'), - (0x39, 'V'), - (0x3A, '3'), - (0x3B, '3'), - (0x3C, '3'), - (0x3D, '3'), - (0x3E, '3'), - (0x3F, '3'), - (0x40, '3'), - (0x41, 'M', u'a'), - (0x42, 'M', u'b'), - (0x43, 'M', u'c'), - (0x44, 'M', u'd'), - (0x45, 'M', u'e'), - (0x46, 'M', u'f'), - (0x47, 'M', u'g'), - (0x48, 'M', u'h'), - (0x49, 'M', u'i'), - (0x4A, 'M', u'j'), - (0x4B, 'M', u'k'), - (0x4C, 'M', u'l'), - (0x4D, 'M', u'm'), - (0x4E, 'M', u'n'), - (0x4F, 'M', u'o'), - (0x50, 'M', u'p'), - (0x51, 'M', u'q'), - (0x52, 'M', u'r'), - (0x53, 'M', u's'), - (0x54, 'M', u't'), - (0x55, 'M', u'u'), - (0x56, 'M', u'v'), - (0x57, 'M', u'w'), - (0x58, 'M', u'x'), - (0x59, 'M', u'y'), - (0x5A, 'M', u'z'), - (0x5B, '3'), - (0x5C, '3'), - (0x5D, '3'), - (0x5E, '3'), - (0x5F, '3'), - (0x60, '3'), - (0x61, 'V'), - (0x62, 'V'), - (0x63, 'V'), - ] - -def _seg_1(): - return [ - (0x64, 'V'), - (0x65, 'V'), - (0x66, 'V'), - (0x67, 'V'), - (0x68, 'V'), - (0x69, 'V'), - (0x6A, 'V'), - (0x6B, 'V'), - (0x6C, 'V'), - (0x6D, 'V'), - (0x6E, 'V'), - (0x6F, 'V'), - (0x70, 'V'), - (0x71, 'V'), - (0x72, 'V'), - (0x73, 'V'), - (0x74, 'V'), - (0x75, 'V'), - (0x76, 'V'), - (0x77, 'V'), - (0x78, 'V'), - (0x79, 'V'), - (0x7A, 'V'), - (0x7B, '3'), - (0x7C, '3'), - (0x7D, '3'), - (0x7E, '3'), - (0x7F, '3'), - (0x80, 'X'), - (0x81, 'X'), - (0x82, 'X'), - (0x83, 'X'), - (0x84, 'X'), - (0x85, 'X'), - (0x86, 'X'), - (0x87, 'X'), - (0x88, 'X'), - (0x89, 'X'), - (0x8A, 'X'), - (0x8B, 'X'), - (0x8C, 'X'), - (0x8D, 'X'), - (0x8E, 'X'), - (0x8F, 'X'), - (0x90, 'X'), - (0x91, 'X'), - (0x92, 'X'), - (0x93, 'X'), - (0x94, 'X'), - (0x95, 'X'), - (0x96, 'X'), - (0x97, 'X'), - (0x98, 'X'), - (0x99, 'X'), - (0x9A, 'X'), - (0x9B, 'X'), - (0x9C, 'X'), - (0x9D, 'X'), - (0x9E, 'X'), - (0x9F, 'X'), - (0xA0, '3', u' '), - (0xA1, 'V'), - (0xA2, 'V'), - (0xA3, 'V'), - (0xA4, 'V'), - (0xA5, 'V'), - (0xA6, 'V'), - (0xA7, 'V'), - (0xA8, '3', u' ̈'), - (0xA9, 'V'), - (0xAA, 'M', u'a'), - (0xAB, 'V'), - (0xAC, 'V'), - (0xAD, 'I'), - (0xAE, 'V'), - (0xAF, '3', u' ̄'), - (0xB0, 'V'), - (0xB1, 'V'), - (0xB2, 'M', u'2'), - (0xB3, 'M', u'3'), - (0xB4, '3', u' ́'), - (0xB5, 'M', u'μ'), - (0xB6, 'V'), - (0xB7, 'V'), - (0xB8, '3', u' ̧'), - (0xB9, 'M', u'1'), - (0xBA, 'M', u'o'), - (0xBB, 'V'), - (0xBC, 'M', u'1⁄4'), - (0xBD, 'M', u'1⁄2'), - (0xBE, 'M', u'3⁄4'), - (0xBF, 'V'), - (0xC0, 'M', u'à'), - (0xC1, 'M', u'á'), - (0xC2, 'M', u'â'), - (0xC3, 'M', u'ã'), - (0xC4, 'M', u'ä'), - (0xC5, 'M', u'å'), - (0xC6, 'M', u'æ'), - (0xC7, 'M', u'ç'), - ] - -def _seg_2(): - return [ - (0xC8, 'M', u'è'), - (0xC9, 'M', u'é'), - (0xCA, 'M', u'ê'), - (0xCB, 'M', u'ë'), - (0xCC, 'M', u'ì'), - (0xCD, 'M', u'í'), - (0xCE, 'M', u'î'), - (0xCF, 'M', u'ï'), - (0xD0, 'M', u'ð'), - (0xD1, 'M', u'ñ'), - (0xD2, 'M', u'ò'), - (0xD3, 'M', u'ó'), - (0xD4, 'M', u'ô'), - (0xD5, 'M', u'õ'), - (0xD6, 'M', u'ö'), - (0xD7, 'V'), - (0xD8, 'M', u'ø'), - (0xD9, 'M', u'ù'), - (0xDA, 'M', u'ú'), - (0xDB, 'M', u'û'), - (0xDC, 'M', u'ü'), - (0xDD, 'M', u'ý'), - (0xDE, 'M', u'þ'), - (0xDF, 'D', u'ss'), - (0xE0, 'V'), - (0xE1, 'V'), - (0xE2, 'V'), - (0xE3, 'V'), - (0xE4, 'V'), - (0xE5, 'V'), - (0xE6, 'V'), - (0xE7, 'V'), - (0xE8, 'V'), - (0xE9, 'V'), - (0xEA, 'V'), - (0xEB, 'V'), - (0xEC, 'V'), - (0xED, 'V'), - (0xEE, 'V'), - (0xEF, 'V'), - (0xF0, 'V'), - (0xF1, 'V'), - (0xF2, 'V'), - (0xF3, 'V'), - (0xF4, 'V'), - (0xF5, 'V'), - (0xF6, 'V'), - (0xF7, 'V'), - (0xF8, 'V'), - (0xF9, 'V'), - (0xFA, 'V'), - (0xFB, 'V'), - (0xFC, 'V'), - (0xFD, 'V'), - (0xFE, 'V'), - (0xFF, 'V'), - (0x100, 'M', u'ā'), - (0x101, 'V'), - (0x102, 'M', u'ă'), - (0x103, 'V'), - (0x104, 'M', u'ą'), - (0x105, 'V'), - (0x106, 'M', u'ć'), - (0x107, 'V'), - (0x108, 'M', u'ĉ'), - (0x109, 'V'), - (0x10A, 'M', u'ċ'), - (0x10B, 'V'), - (0x10C, 'M', u'č'), - (0x10D, 'V'), - (0x10E, 'M', u'ď'), - (0x10F, 'V'), - (0x110, 'M', u'đ'), - (0x111, 'V'), - (0x112, 'M', u'ē'), - (0x113, 'V'), - (0x114, 'M', u'ĕ'), - (0x115, 'V'), - (0x116, 'M', u'ė'), - (0x117, 'V'), - (0x118, 'M', u'ę'), - (0x119, 'V'), - (0x11A, 'M', u'ě'), - (0x11B, 'V'), - (0x11C, 'M', u'ĝ'), - (0x11D, 'V'), - (0x11E, 'M', u'ğ'), - (0x11F, 'V'), - (0x120, 'M', u'ġ'), - (0x121, 'V'), - (0x122, 'M', u'ģ'), - (0x123, 'V'), - (0x124, 'M', u'ĥ'), - (0x125, 'V'), - (0x126, 'M', u'ħ'), - (0x127, 'V'), - (0x128, 'M', u'ĩ'), - (0x129, 'V'), - (0x12A, 'M', u'ī'), - (0x12B, 'V'), - ] - -def _seg_3(): - return [ - (0x12C, 'M', u'ĭ'), - (0x12D, 'V'), - (0x12E, 'M', u'į'), - (0x12F, 'V'), - (0x130, 'M', u'i̇'), - (0x131, 'V'), - (0x132, 'M', u'ij'), - (0x134, 'M', u'ĵ'), - (0x135, 'V'), - (0x136, 'M', u'ķ'), - (0x137, 'V'), - (0x139, 'M', u'ĺ'), - (0x13A, 'V'), - (0x13B, 'M', u'ļ'), - (0x13C, 'V'), - (0x13D, 'M', u'ľ'), - (0x13E, 'V'), - (0x13F, 'M', u'l·'), - (0x141, 'M', u'ł'), - (0x142, 'V'), - (0x143, 'M', u'ń'), - (0x144, 'V'), - (0x145, 'M', u'ņ'), - (0x146, 'V'), - (0x147, 'M', u'ň'), - (0x148, 'V'), - (0x149, 'M', u'ʼn'), - (0x14A, 'M', u'ŋ'), - (0x14B, 'V'), - (0x14C, 'M', u'ō'), - (0x14D, 'V'), - (0x14E, 'M', u'ŏ'), - (0x14F, 'V'), - (0x150, 'M', u'ő'), - (0x151, 'V'), - (0x152, 'M', u'œ'), - (0x153, 'V'), - (0x154, 'M', u'ŕ'), - (0x155, 'V'), - (0x156, 'M', u'ŗ'), - (0x157, 'V'), - (0x158, 'M', u'ř'), - (0x159, 'V'), - (0x15A, 'M', u'ś'), - (0x15B, 'V'), - (0x15C, 'M', u'ŝ'), - (0x15D, 'V'), - (0x15E, 'M', u'ş'), - (0x15F, 'V'), - (0x160, 'M', u'š'), - (0x161, 'V'), - (0x162, 'M', u'ţ'), - (0x163, 'V'), - (0x164, 'M', u'ť'), - (0x165, 'V'), - (0x166, 'M', u'ŧ'), - (0x167, 'V'), - (0x168, 'M', u'ũ'), - (0x169, 'V'), - (0x16A, 'M', u'ū'), - (0x16B, 'V'), - (0x16C, 'M', u'ŭ'), - (0x16D, 'V'), - (0x16E, 'M', u'ů'), - (0x16F, 'V'), - (0x170, 'M', u'ű'), - (0x171, 'V'), - (0x172, 'M', u'ų'), - (0x173, 'V'), - (0x174, 'M', u'ŵ'), - (0x175, 'V'), - (0x176, 'M', u'ŷ'), - (0x177, 'V'), - (0x178, 'M', u'ÿ'), - (0x179, 'M', u'ź'), - (0x17A, 'V'), - (0x17B, 'M', u'ż'), - (0x17C, 'V'), - (0x17D, 'M', u'ž'), - (0x17E, 'V'), - (0x17F, 'M', u's'), - (0x180, 'V'), - (0x181, 'M', u'ɓ'), - (0x182, 'M', u'ƃ'), - (0x183, 'V'), - (0x184, 'M', u'ƅ'), - (0x185, 'V'), - (0x186, 'M', u'ɔ'), - (0x187, 'M', u'ƈ'), - (0x188, 'V'), - (0x189, 'M', u'ɖ'), - (0x18A, 'M', u'ɗ'), - (0x18B, 'M', u'ƌ'), - (0x18C, 'V'), - (0x18E, 'M', u'ǝ'), - (0x18F, 'M', u'ə'), - (0x190, 'M', u'ɛ'), - (0x191, 'M', u'ƒ'), - (0x192, 'V'), - (0x193, 'M', u'ɠ'), - ] - -def _seg_4(): - return [ - (0x194, 'M', u'ɣ'), - (0x195, 'V'), - (0x196, 'M', u'ɩ'), - (0x197, 'M', u'ɨ'), - (0x198, 'M', u'ƙ'), - (0x199, 'V'), - (0x19C, 'M', u'ɯ'), - (0x19D, 'M', u'ɲ'), - (0x19E, 'V'), - (0x19F, 'M', u'ɵ'), - (0x1A0, 'M', u'ơ'), - (0x1A1, 'V'), - (0x1A2, 'M', u'ƣ'), - (0x1A3, 'V'), - (0x1A4, 'M', u'ƥ'), - (0x1A5, 'V'), - (0x1A6, 'M', u'ʀ'), - (0x1A7, 'M', u'ƨ'), - (0x1A8, 'V'), - (0x1A9, 'M', u'ʃ'), - (0x1AA, 'V'), - (0x1AC, 'M', u'ƭ'), - (0x1AD, 'V'), - (0x1AE, 'M', u'ʈ'), - (0x1AF, 'M', u'ư'), - (0x1B0, 'V'), - (0x1B1, 'M', u'ʊ'), - (0x1B2, 'M', u'ʋ'), - (0x1B3, 'M', u'ƴ'), - (0x1B4, 'V'), - (0x1B5, 'M', u'ƶ'), - (0x1B6, 'V'), - (0x1B7, 'M', u'ʒ'), - (0x1B8, 'M', u'ƹ'), - (0x1B9, 'V'), - (0x1BC, 'M', u'ƽ'), - (0x1BD, 'V'), - (0x1C4, 'M', u'dž'), - (0x1C7, 'M', u'lj'), - (0x1CA, 'M', u'nj'), - (0x1CD, 'M', u'ǎ'), - (0x1CE, 'V'), - (0x1CF, 'M', u'ǐ'), - (0x1D0, 'V'), - (0x1D1, 'M', u'ǒ'), - (0x1D2, 'V'), - (0x1D3, 'M', u'ǔ'), - (0x1D4, 'V'), - (0x1D5, 'M', u'ǖ'), - (0x1D6, 'V'), - (0x1D7, 'M', u'ǘ'), - (0x1D8, 'V'), - (0x1D9, 'M', u'ǚ'), - (0x1DA, 'V'), - (0x1DB, 'M', u'ǜ'), - (0x1DC, 'V'), - (0x1DE, 'M', u'ǟ'), - (0x1DF, 'V'), - (0x1E0, 'M', u'ǡ'), - (0x1E1, 'V'), - (0x1E2, 'M', u'ǣ'), - (0x1E3, 'V'), - (0x1E4, 'M', u'ǥ'), - (0x1E5, 'V'), - (0x1E6, 'M', u'ǧ'), - (0x1E7, 'V'), - (0x1E8, 'M', u'ǩ'), - (0x1E9, 'V'), - (0x1EA, 'M', u'ǫ'), - (0x1EB, 'V'), - (0x1EC, 'M', u'ǭ'), - (0x1ED, 'V'), - (0x1EE, 'M', u'ǯ'), - (0x1EF, 'V'), - (0x1F1, 'M', u'dz'), - (0x1F4, 'M', u'ǵ'), - (0x1F5, 'V'), - (0x1F6, 'M', u'ƕ'), - (0x1F7, 'M', u'ƿ'), - (0x1F8, 'M', u'ǹ'), - (0x1F9, 'V'), - (0x1FA, 'M', u'ǻ'), - (0x1FB, 'V'), - (0x1FC, 'M', u'ǽ'), - (0x1FD, 'V'), - (0x1FE, 'M', u'ǿ'), - (0x1FF, 'V'), - (0x200, 'M', u'ȁ'), - (0x201, 'V'), - (0x202, 'M', u'ȃ'), - (0x203, 'V'), - (0x204, 'M', u'ȅ'), - (0x205, 'V'), - (0x206, 'M', u'ȇ'), - (0x207, 'V'), - (0x208, 'M', u'ȉ'), - (0x209, 'V'), - (0x20A, 'M', u'ȋ'), - (0x20B, 'V'), - (0x20C, 'M', u'ȍ'), - ] - -def _seg_5(): - return [ - (0x20D, 'V'), - (0x20E, 'M', u'ȏ'), - (0x20F, 'V'), - (0x210, 'M', u'ȑ'), - (0x211, 'V'), - (0x212, 'M', u'ȓ'), - (0x213, 'V'), - (0x214, 'M', u'ȕ'), - (0x215, 'V'), - (0x216, 'M', u'ȗ'), - (0x217, 'V'), - (0x218, 'M', u'ș'), - (0x219, 'V'), - (0x21A, 'M', u'ț'), - (0x21B, 'V'), - (0x21C, 'M', u'ȝ'), - (0x21D, 'V'), - (0x21E, 'M', u'ȟ'), - (0x21F, 'V'), - (0x220, 'M', u'ƞ'), - (0x221, 'V'), - (0x222, 'M', u'ȣ'), - (0x223, 'V'), - (0x224, 'M', u'ȥ'), - (0x225, 'V'), - (0x226, 'M', u'ȧ'), - (0x227, 'V'), - (0x228, 'M', u'ȩ'), - (0x229, 'V'), - (0x22A, 'M', u'ȫ'), - (0x22B, 'V'), - (0x22C, 'M', u'ȭ'), - (0x22D, 'V'), - (0x22E, 'M', u'ȯ'), - (0x22F, 'V'), - (0x230, 'M', u'ȱ'), - (0x231, 'V'), - (0x232, 'M', u'ȳ'), - (0x233, 'V'), - (0x23A, 'M', u'ⱥ'), - (0x23B, 'M', u'ȼ'), - (0x23C, 'V'), - (0x23D, 'M', u'ƚ'), - (0x23E, 'M', u'ⱦ'), - (0x23F, 'V'), - (0x241, 'M', u'ɂ'), - (0x242, 'V'), - (0x243, 'M', u'ƀ'), - (0x244, 'M', u'ʉ'), - (0x245, 'M', u'ʌ'), - (0x246, 'M', u'ɇ'), - (0x247, 'V'), - (0x248, 'M', u'ɉ'), - (0x249, 'V'), - (0x24A, 'M', u'ɋ'), - (0x24B, 'V'), - (0x24C, 'M', u'ɍ'), - (0x24D, 'V'), - (0x24E, 'M', u'ɏ'), - (0x24F, 'V'), - (0x2B0, 'M', u'h'), - (0x2B1, 'M', u'ɦ'), - (0x2B2, 'M', u'j'), - (0x2B3, 'M', u'r'), - (0x2B4, 'M', u'ɹ'), - (0x2B5, 'M', u'ɻ'), - (0x2B6, 'M', u'ʁ'), - (0x2B7, 'M', u'w'), - (0x2B8, 'M', u'y'), - (0x2B9, 'V'), - (0x2D8, '3', u' ̆'), - (0x2D9, '3', u' ̇'), - (0x2DA, '3', u' ̊'), - (0x2DB, '3', u' ̨'), - (0x2DC, '3', u' ̃'), - (0x2DD, '3', u' ̋'), - (0x2DE, 'V'), - (0x2E0, 'M', u'ɣ'), - (0x2E1, 'M', u'l'), - (0x2E2, 'M', u's'), - (0x2E3, 'M', u'x'), - (0x2E4, 'M', u'ʕ'), - (0x2E5, 'V'), - (0x340, 'M', u'̀'), - (0x341, 'M', u'́'), - (0x342, 'V'), - (0x343, 'M', u'̓'), - (0x344, 'M', u'̈́'), - (0x345, 'M', u'ι'), - (0x346, 'V'), - (0x34F, 'I'), - (0x350, 'V'), - (0x370, 'M', u'ͱ'), - (0x371, 'V'), - (0x372, 'M', u'ͳ'), - (0x373, 'V'), - (0x374, 'M', u'ʹ'), - (0x375, 'V'), - (0x376, 'M', u'ͷ'), - (0x377, 'V'), - ] - -def _seg_6(): - return [ - (0x378, 'X'), - (0x37A, '3', u' ι'), - (0x37B, 'V'), - (0x37E, '3', u';'), - (0x37F, 'M', u'ϳ'), - (0x380, 'X'), - (0x384, '3', u' ́'), - (0x385, '3', u' ̈́'), - (0x386, 'M', u'ά'), - (0x387, 'M', u'·'), - (0x388, 'M', u'έ'), - (0x389, 'M', u'ή'), - (0x38A, 'M', u'ί'), - (0x38B, 'X'), - (0x38C, 'M', u'ό'), - (0x38D, 'X'), - (0x38E, 'M', u'ύ'), - (0x38F, 'M', u'ώ'), - (0x390, 'V'), - (0x391, 'M', u'α'), - (0x392, 'M', u'β'), - (0x393, 'M', u'γ'), - (0x394, 'M', u'δ'), - (0x395, 'M', u'ε'), - (0x396, 'M', u'ζ'), - (0x397, 'M', u'η'), - (0x398, 'M', u'θ'), - (0x399, 'M', u'ι'), - (0x39A, 'M', u'κ'), - (0x39B, 'M', u'λ'), - (0x39C, 'M', u'μ'), - (0x39D, 'M', u'ν'), - (0x39E, 'M', u'ξ'), - (0x39F, 'M', u'ο'), - (0x3A0, 'M', u'π'), - (0x3A1, 'M', u'ρ'), - (0x3A2, 'X'), - (0x3A3, 'M', u'σ'), - (0x3A4, 'M', u'τ'), - (0x3A5, 'M', u'υ'), - (0x3A6, 'M', u'φ'), - (0x3A7, 'M', u'χ'), - (0x3A8, 'M', u'ψ'), - (0x3A9, 'M', u'ω'), - (0x3AA, 'M', u'ϊ'), - (0x3AB, 'M', u'ϋ'), - (0x3AC, 'V'), - (0x3C2, 'D', u'σ'), - (0x3C3, 'V'), - (0x3CF, 'M', u'ϗ'), - (0x3D0, 'M', u'β'), - (0x3D1, 'M', u'θ'), - (0x3D2, 'M', u'υ'), - (0x3D3, 'M', u'ύ'), - (0x3D4, 'M', u'ϋ'), - (0x3D5, 'M', u'φ'), - (0x3D6, 'M', u'π'), - (0x3D7, 'V'), - (0x3D8, 'M', u'ϙ'), - (0x3D9, 'V'), - (0x3DA, 'M', u'ϛ'), - (0x3DB, 'V'), - (0x3DC, 'M', u'ϝ'), - (0x3DD, 'V'), - (0x3DE, 'M', u'ϟ'), - (0x3DF, 'V'), - (0x3E0, 'M', u'ϡ'), - (0x3E1, 'V'), - (0x3E2, 'M', u'ϣ'), - (0x3E3, 'V'), - (0x3E4, 'M', u'ϥ'), - (0x3E5, 'V'), - (0x3E6, 'M', u'ϧ'), - (0x3E7, 'V'), - (0x3E8, 'M', u'ϩ'), - (0x3E9, 'V'), - (0x3EA, 'M', u'ϫ'), - (0x3EB, 'V'), - (0x3EC, 'M', u'ϭ'), - (0x3ED, 'V'), - (0x3EE, 'M', u'ϯ'), - (0x3EF, 'V'), - (0x3F0, 'M', u'κ'), - (0x3F1, 'M', u'ρ'), - (0x3F2, 'M', u'σ'), - (0x3F3, 'V'), - (0x3F4, 'M', u'θ'), - (0x3F5, 'M', u'ε'), - (0x3F6, 'V'), - (0x3F7, 'M', u'ϸ'), - (0x3F8, 'V'), - (0x3F9, 'M', u'σ'), - (0x3FA, 'M', u'ϻ'), - (0x3FB, 'V'), - (0x3FD, 'M', u'ͻ'), - (0x3FE, 'M', u'ͼ'), - (0x3FF, 'M', u'ͽ'), - (0x400, 'M', u'ѐ'), - (0x401, 'M', u'ё'), - (0x402, 'M', u'ђ'), - ] - -def _seg_7(): - return [ - (0x403, 'M', u'ѓ'), - (0x404, 'M', u'є'), - (0x405, 'M', u'ѕ'), - (0x406, 'M', u'і'), - (0x407, 'M', u'ї'), - (0x408, 'M', u'ј'), - (0x409, 'M', u'љ'), - (0x40A, 'M', u'њ'), - (0x40B, 'M', u'ћ'), - (0x40C, 'M', u'ќ'), - (0x40D, 'M', u'ѝ'), - (0x40E, 'M', u'ў'), - (0x40F, 'M', u'џ'), - (0x410, 'M', u'а'), - (0x411, 'M', u'б'), - (0x412, 'M', u'в'), - (0x413, 'M', u'г'), - (0x414, 'M', u'д'), - (0x415, 'M', u'е'), - (0x416, 'M', u'ж'), - (0x417, 'M', u'з'), - (0x418, 'M', u'и'), - (0x419, 'M', u'й'), - (0x41A, 'M', u'к'), - (0x41B, 'M', u'л'), - (0x41C, 'M', u'м'), - (0x41D, 'M', u'н'), - (0x41E, 'M', u'о'), - (0x41F, 'M', u'п'), - (0x420, 'M', u'р'), - (0x421, 'M', u'с'), - (0x422, 'M', u'т'), - (0x423, 'M', u'у'), - (0x424, 'M', u'ф'), - (0x425, 'M', u'х'), - (0x426, 'M', u'ц'), - (0x427, 'M', u'ч'), - (0x428, 'M', u'ш'), - (0x429, 'M', u'щ'), - (0x42A, 'M', u'ъ'), - (0x42B, 'M', u'ы'), - (0x42C, 'M', u'ь'), - (0x42D, 'M', u'э'), - (0x42E, 'M', u'ю'), - (0x42F, 'M', u'я'), - (0x430, 'V'), - (0x460, 'M', u'ѡ'), - (0x461, 'V'), - (0x462, 'M', u'ѣ'), - (0x463, 'V'), - (0x464, 'M', u'ѥ'), - (0x465, 'V'), - (0x466, 'M', u'ѧ'), - (0x467, 'V'), - (0x468, 'M', u'ѩ'), - (0x469, 'V'), - (0x46A, 'M', u'ѫ'), - (0x46B, 'V'), - (0x46C, 'M', u'ѭ'), - (0x46D, 'V'), - (0x46E, 'M', u'ѯ'), - (0x46F, 'V'), - (0x470, 'M', u'ѱ'), - (0x471, 'V'), - (0x472, 'M', u'ѳ'), - (0x473, 'V'), - (0x474, 'M', u'ѵ'), - (0x475, 'V'), - (0x476, 'M', u'ѷ'), - (0x477, 'V'), - (0x478, 'M', u'ѹ'), - (0x479, 'V'), - (0x47A, 'M', u'ѻ'), - (0x47B, 'V'), - (0x47C, 'M', u'ѽ'), - (0x47D, 'V'), - (0x47E, 'M', u'ѿ'), - (0x47F, 'V'), - (0x480, 'M', u'ҁ'), - (0x481, 'V'), - (0x48A, 'M', u'ҋ'), - (0x48B, 'V'), - (0x48C, 'M', u'ҍ'), - (0x48D, 'V'), - (0x48E, 'M', u'ҏ'), - (0x48F, 'V'), - (0x490, 'M', u'ґ'), - (0x491, 'V'), - (0x492, 'M', u'ғ'), - (0x493, 'V'), - (0x494, 'M', u'ҕ'), - (0x495, 'V'), - (0x496, 'M', u'җ'), - (0x497, 'V'), - (0x498, 'M', u'ҙ'), - (0x499, 'V'), - (0x49A, 'M', u'қ'), - (0x49B, 'V'), - (0x49C, 'M', u'ҝ'), - (0x49D, 'V'), - ] - -def _seg_8(): - return [ - (0x49E, 'M', u'ҟ'), - (0x49F, 'V'), - (0x4A0, 'M', u'ҡ'), - (0x4A1, 'V'), - (0x4A2, 'M', u'ң'), - (0x4A3, 'V'), - (0x4A4, 'M', u'ҥ'), - (0x4A5, 'V'), - (0x4A6, 'M', u'ҧ'), - (0x4A7, 'V'), - (0x4A8, 'M', u'ҩ'), - (0x4A9, 'V'), - (0x4AA, 'M', u'ҫ'), - (0x4AB, 'V'), - (0x4AC, 'M', u'ҭ'), - (0x4AD, 'V'), - (0x4AE, 'M', u'ү'), - (0x4AF, 'V'), - (0x4B0, 'M', u'ұ'), - (0x4B1, 'V'), - (0x4B2, 'M', u'ҳ'), - (0x4B3, 'V'), - (0x4B4, 'M', u'ҵ'), - (0x4B5, 'V'), - (0x4B6, 'M', u'ҷ'), - (0x4B7, 'V'), - (0x4B8, 'M', u'ҹ'), - (0x4B9, 'V'), - (0x4BA, 'M', u'һ'), - (0x4BB, 'V'), - (0x4BC, 'M', u'ҽ'), - (0x4BD, 'V'), - (0x4BE, 'M', u'ҿ'), - (0x4BF, 'V'), - (0x4C0, 'X'), - (0x4C1, 'M', u'ӂ'), - (0x4C2, 'V'), - (0x4C3, 'M', u'ӄ'), - (0x4C4, 'V'), - (0x4C5, 'M', u'ӆ'), - (0x4C6, 'V'), - (0x4C7, 'M', u'ӈ'), - (0x4C8, 'V'), - (0x4C9, 'M', u'ӊ'), - (0x4CA, 'V'), - (0x4CB, 'M', u'ӌ'), - (0x4CC, 'V'), - (0x4CD, 'M', u'ӎ'), - (0x4CE, 'V'), - (0x4D0, 'M', u'ӑ'), - (0x4D1, 'V'), - (0x4D2, 'M', u'ӓ'), - (0x4D3, 'V'), - (0x4D4, 'M', u'ӕ'), - (0x4D5, 'V'), - (0x4D6, 'M', u'ӗ'), - (0x4D7, 'V'), - (0x4D8, 'M', u'ә'), - (0x4D9, 'V'), - (0x4DA, 'M', u'ӛ'), - (0x4DB, 'V'), - (0x4DC, 'M', u'ӝ'), - (0x4DD, 'V'), - (0x4DE, 'M', u'ӟ'), - (0x4DF, 'V'), - (0x4E0, 'M', u'ӡ'), - (0x4E1, 'V'), - (0x4E2, 'M', u'ӣ'), - (0x4E3, 'V'), - (0x4E4, 'M', u'ӥ'), - (0x4E5, 'V'), - (0x4E6, 'M', u'ӧ'), - (0x4E7, 'V'), - (0x4E8, 'M', u'ө'), - (0x4E9, 'V'), - (0x4EA, 'M', u'ӫ'), - (0x4EB, 'V'), - (0x4EC, 'M', u'ӭ'), - (0x4ED, 'V'), - (0x4EE, 'M', u'ӯ'), - (0x4EF, 'V'), - (0x4F0, 'M', u'ӱ'), - (0x4F1, 'V'), - (0x4F2, 'M', u'ӳ'), - (0x4F3, 'V'), - (0x4F4, 'M', u'ӵ'), - (0x4F5, 'V'), - (0x4F6, 'M', u'ӷ'), - (0x4F7, 'V'), - (0x4F8, 'M', u'ӹ'), - (0x4F9, 'V'), - (0x4FA, 'M', u'ӻ'), - (0x4FB, 'V'), - (0x4FC, 'M', u'ӽ'), - (0x4FD, 'V'), - (0x4FE, 'M', u'ӿ'), - (0x4FF, 'V'), - (0x500, 'M', u'ԁ'), - (0x501, 'V'), - (0x502, 'M', u'ԃ'), - ] - -def _seg_9(): - return [ - (0x503, 'V'), - (0x504, 'M', u'ԅ'), - (0x505, 'V'), - (0x506, 'M', u'ԇ'), - (0x507, 'V'), - (0x508, 'M', u'ԉ'), - (0x509, 'V'), - (0x50A, 'M', u'ԋ'), - (0x50B, 'V'), - (0x50C, 'M', u'ԍ'), - (0x50D, 'V'), - (0x50E, 'M', u'ԏ'), - (0x50F, 'V'), - (0x510, 'M', u'ԑ'), - (0x511, 'V'), - (0x512, 'M', u'ԓ'), - (0x513, 'V'), - (0x514, 'M', u'ԕ'), - (0x515, 'V'), - (0x516, 'M', u'ԗ'), - (0x517, 'V'), - (0x518, 'M', u'ԙ'), - (0x519, 'V'), - (0x51A, 'M', u'ԛ'), - (0x51B, 'V'), - (0x51C, 'M', u'ԝ'), - (0x51D, 'V'), - (0x51E, 'M', u'ԟ'), - (0x51F, 'V'), - (0x520, 'M', u'ԡ'), - (0x521, 'V'), - (0x522, 'M', u'ԣ'), - (0x523, 'V'), - (0x524, 'M', u'ԥ'), - (0x525, 'V'), - (0x526, 'M', u'ԧ'), - (0x527, 'V'), - (0x528, 'M', u'ԩ'), - (0x529, 'V'), - (0x52A, 'M', u'ԫ'), - (0x52B, 'V'), - (0x52C, 'M', u'ԭ'), - (0x52D, 'V'), - (0x52E, 'M', u'ԯ'), - (0x52F, 'V'), - (0x530, 'X'), - (0x531, 'M', u'ա'), - (0x532, 'M', u'բ'), - (0x533, 'M', u'գ'), - (0x534, 'M', u'դ'), - (0x535, 'M', u'ե'), - (0x536, 'M', u'զ'), - (0x537, 'M', u'է'), - (0x538, 'M', u'ը'), - (0x539, 'M', u'թ'), - (0x53A, 'M', u'ժ'), - (0x53B, 'M', u'ի'), - (0x53C, 'M', u'լ'), - (0x53D, 'M', u'խ'), - (0x53E, 'M', u'ծ'), - (0x53F, 'M', u'կ'), - (0x540, 'M', u'հ'), - (0x541, 'M', u'ձ'), - (0x542, 'M', u'ղ'), - (0x543, 'M', u'ճ'), - (0x544, 'M', u'մ'), - (0x545, 'M', u'յ'), - (0x546, 'M', u'ն'), - (0x547, 'M', u'շ'), - (0x548, 'M', u'ո'), - (0x549, 'M', u'չ'), - (0x54A, 'M', u'պ'), - (0x54B, 'M', u'ջ'), - (0x54C, 'M', u'ռ'), - (0x54D, 'M', u'ս'), - (0x54E, 'M', u'վ'), - (0x54F, 'M', u'տ'), - (0x550, 'M', u'ր'), - (0x551, 'M', u'ց'), - (0x552, 'M', u'ւ'), - (0x553, 'M', u'փ'), - (0x554, 'M', u'ք'), - (0x555, 'M', u'օ'), - (0x556, 'M', u'ֆ'), - (0x557, 'X'), - (0x559, 'V'), - (0x587, 'M', u'եւ'), - (0x588, 'V'), - (0x58B, 'X'), - (0x58D, 'V'), - (0x590, 'X'), - (0x591, 'V'), - (0x5C8, 'X'), - (0x5D0, 'V'), - (0x5EB, 'X'), - (0x5EF, 'V'), - (0x5F5, 'X'), - (0x606, 'V'), - (0x61C, 'X'), - (0x61E, 'V'), - ] - -def _seg_10(): - return [ - (0x675, 'M', u'اٴ'), - (0x676, 'M', u'وٴ'), - (0x677, 'M', u'ۇٴ'), - (0x678, 'M', u'يٴ'), - (0x679, 'V'), - (0x6DD, 'X'), - (0x6DE, 'V'), - (0x70E, 'X'), - (0x710, 'V'), - (0x74B, 'X'), - (0x74D, 'V'), - (0x7B2, 'X'), - (0x7C0, 'V'), - (0x7FB, 'X'), - (0x7FD, 'V'), - (0x82E, 'X'), - (0x830, 'V'), - (0x83F, 'X'), - (0x840, 'V'), - (0x85C, 'X'), - (0x85E, 'V'), - (0x85F, 'X'), - (0x860, 'V'), - (0x86B, 'X'), - (0x8A0, 'V'), - (0x8B5, 'X'), - (0x8B6, 'V'), - (0x8BE, 'X'), - (0x8D3, 'V'), - (0x8E2, 'X'), - (0x8E3, 'V'), - (0x958, 'M', u'क़'), - (0x959, 'M', u'ख़'), - (0x95A, 'M', u'ग़'), - (0x95B, 'M', u'ज़'), - (0x95C, 'M', u'ड़'), - (0x95D, 'M', u'ढ़'), - (0x95E, 'M', u'फ़'), - (0x95F, 'M', u'य़'), - (0x960, 'V'), - (0x984, 'X'), - (0x985, 'V'), - (0x98D, 'X'), - (0x98F, 'V'), - (0x991, 'X'), - (0x993, 'V'), - (0x9A9, 'X'), - (0x9AA, 'V'), - (0x9B1, 'X'), - (0x9B2, 'V'), - (0x9B3, 'X'), - (0x9B6, 'V'), - (0x9BA, 'X'), - (0x9BC, 'V'), - (0x9C5, 'X'), - (0x9C7, 'V'), - (0x9C9, 'X'), - (0x9CB, 'V'), - (0x9CF, 'X'), - (0x9D7, 'V'), - (0x9D8, 'X'), - (0x9DC, 'M', u'ড়'), - (0x9DD, 'M', u'ঢ়'), - (0x9DE, 'X'), - (0x9DF, 'M', u'য়'), - (0x9E0, 'V'), - (0x9E4, 'X'), - (0x9E6, 'V'), - (0x9FF, 'X'), - (0xA01, 'V'), - (0xA04, 'X'), - (0xA05, 'V'), - (0xA0B, 'X'), - (0xA0F, 'V'), - (0xA11, 'X'), - (0xA13, 'V'), - (0xA29, 'X'), - (0xA2A, 'V'), - (0xA31, 'X'), - (0xA32, 'V'), - (0xA33, 'M', u'ਲ਼'), - (0xA34, 'X'), - (0xA35, 'V'), - (0xA36, 'M', u'ਸ਼'), - (0xA37, 'X'), - (0xA38, 'V'), - (0xA3A, 'X'), - (0xA3C, 'V'), - (0xA3D, 'X'), - (0xA3E, 'V'), - (0xA43, 'X'), - (0xA47, 'V'), - (0xA49, 'X'), - (0xA4B, 'V'), - (0xA4E, 'X'), - (0xA51, 'V'), - (0xA52, 'X'), - (0xA59, 'M', u'ਖ਼'), - (0xA5A, 'M', u'ਗ਼'), - (0xA5B, 'M', u'ਜ਼'), - ] - -def _seg_11(): - return [ - (0xA5C, 'V'), - (0xA5D, 'X'), - (0xA5E, 'M', u'ਫ਼'), - (0xA5F, 'X'), - (0xA66, 'V'), - (0xA77, 'X'), - (0xA81, 'V'), - (0xA84, 'X'), - (0xA85, 'V'), - (0xA8E, 'X'), - (0xA8F, 'V'), - (0xA92, 'X'), - (0xA93, 'V'), - (0xAA9, 'X'), - (0xAAA, 'V'), - (0xAB1, 'X'), - (0xAB2, 'V'), - (0xAB4, 'X'), - (0xAB5, 'V'), - (0xABA, 'X'), - (0xABC, 'V'), - (0xAC6, 'X'), - (0xAC7, 'V'), - (0xACA, 'X'), - (0xACB, 'V'), - (0xACE, 'X'), - (0xAD0, 'V'), - (0xAD1, 'X'), - (0xAE0, 'V'), - (0xAE4, 'X'), - (0xAE6, 'V'), - (0xAF2, 'X'), - (0xAF9, 'V'), - (0xB00, 'X'), - (0xB01, 'V'), - (0xB04, 'X'), - (0xB05, 'V'), - (0xB0D, 'X'), - (0xB0F, 'V'), - (0xB11, 'X'), - (0xB13, 'V'), - (0xB29, 'X'), - (0xB2A, 'V'), - (0xB31, 'X'), - (0xB32, 'V'), - (0xB34, 'X'), - (0xB35, 'V'), - (0xB3A, 'X'), - (0xB3C, 'V'), - (0xB45, 'X'), - (0xB47, 'V'), - (0xB49, 'X'), - (0xB4B, 'V'), - (0xB4E, 'X'), - (0xB56, 'V'), - (0xB58, 'X'), - (0xB5C, 'M', u'ଡ଼'), - (0xB5D, 'M', u'ଢ଼'), - (0xB5E, 'X'), - (0xB5F, 'V'), - (0xB64, 'X'), - (0xB66, 'V'), - (0xB78, 'X'), - (0xB82, 'V'), - (0xB84, 'X'), - (0xB85, 'V'), - (0xB8B, 'X'), - (0xB8E, 'V'), - (0xB91, 'X'), - (0xB92, 'V'), - (0xB96, 'X'), - (0xB99, 'V'), - (0xB9B, 'X'), - (0xB9C, 'V'), - (0xB9D, 'X'), - (0xB9E, 'V'), - (0xBA0, 'X'), - (0xBA3, 'V'), - (0xBA5, 'X'), - (0xBA8, 'V'), - (0xBAB, 'X'), - (0xBAE, 'V'), - (0xBBA, 'X'), - (0xBBE, 'V'), - (0xBC3, 'X'), - (0xBC6, 'V'), - (0xBC9, 'X'), - (0xBCA, 'V'), - (0xBCE, 'X'), - (0xBD0, 'V'), - (0xBD1, 'X'), - (0xBD7, 'V'), - (0xBD8, 'X'), - (0xBE6, 'V'), - (0xBFB, 'X'), - (0xC00, 'V'), - (0xC0D, 'X'), - (0xC0E, 'V'), - (0xC11, 'X'), - (0xC12, 'V'), - ] - -def _seg_12(): - return [ - (0xC29, 'X'), - (0xC2A, 'V'), - (0xC3A, 'X'), - (0xC3D, 'V'), - (0xC45, 'X'), - (0xC46, 'V'), - (0xC49, 'X'), - (0xC4A, 'V'), - (0xC4E, 'X'), - (0xC55, 'V'), - (0xC57, 'X'), - (0xC58, 'V'), - (0xC5B, 'X'), - (0xC60, 'V'), - (0xC64, 'X'), - (0xC66, 'V'), - (0xC70, 'X'), - (0xC78, 'V'), - (0xC8D, 'X'), - (0xC8E, 'V'), - (0xC91, 'X'), - (0xC92, 'V'), - (0xCA9, 'X'), - (0xCAA, 'V'), - (0xCB4, 'X'), - (0xCB5, 'V'), - (0xCBA, 'X'), - (0xCBC, 'V'), - (0xCC5, 'X'), - (0xCC6, 'V'), - (0xCC9, 'X'), - (0xCCA, 'V'), - (0xCCE, 'X'), - (0xCD5, 'V'), - (0xCD7, 'X'), - (0xCDE, 'V'), - (0xCDF, 'X'), - (0xCE0, 'V'), - (0xCE4, 'X'), - (0xCE6, 'V'), - (0xCF0, 'X'), - (0xCF1, 'V'), - (0xCF3, 'X'), - (0xD00, 'V'), - (0xD04, 'X'), - (0xD05, 'V'), - (0xD0D, 'X'), - (0xD0E, 'V'), - (0xD11, 'X'), - (0xD12, 'V'), - (0xD45, 'X'), - (0xD46, 'V'), - (0xD49, 'X'), - (0xD4A, 'V'), - (0xD50, 'X'), - (0xD54, 'V'), - (0xD64, 'X'), - (0xD66, 'V'), - (0xD80, 'X'), - (0xD82, 'V'), - (0xD84, 'X'), - (0xD85, 'V'), - (0xD97, 'X'), - (0xD9A, 'V'), - (0xDB2, 'X'), - (0xDB3, 'V'), - (0xDBC, 'X'), - (0xDBD, 'V'), - (0xDBE, 'X'), - (0xDC0, 'V'), - (0xDC7, 'X'), - (0xDCA, 'V'), - (0xDCB, 'X'), - (0xDCF, 'V'), - (0xDD5, 'X'), - (0xDD6, 'V'), - (0xDD7, 'X'), - (0xDD8, 'V'), - (0xDE0, 'X'), - (0xDE6, 'V'), - (0xDF0, 'X'), - (0xDF2, 'V'), - (0xDF5, 'X'), - (0xE01, 'V'), - (0xE33, 'M', u'ํา'), - (0xE34, 'V'), - (0xE3B, 'X'), - (0xE3F, 'V'), - (0xE5C, 'X'), - (0xE81, 'V'), - (0xE83, 'X'), - (0xE84, 'V'), - (0xE85, 'X'), - (0xE87, 'V'), - (0xE89, 'X'), - (0xE8A, 'V'), - (0xE8B, 'X'), - (0xE8D, 'V'), - (0xE8E, 'X'), - (0xE94, 'V'), - ] - -def _seg_13(): - return [ - (0xE98, 'X'), - (0xE99, 'V'), - (0xEA0, 'X'), - (0xEA1, 'V'), - (0xEA4, 'X'), - (0xEA5, 'V'), - (0xEA6, 'X'), - (0xEA7, 'V'), - (0xEA8, 'X'), - (0xEAA, 'V'), - (0xEAC, 'X'), - (0xEAD, 'V'), - (0xEB3, 'M', u'ໍາ'), - (0xEB4, 'V'), - (0xEBA, 'X'), - (0xEBB, 'V'), - (0xEBE, 'X'), - (0xEC0, 'V'), - (0xEC5, 'X'), - (0xEC6, 'V'), - (0xEC7, 'X'), - (0xEC8, 'V'), - (0xECE, 'X'), - (0xED0, 'V'), - (0xEDA, 'X'), - (0xEDC, 'M', u'ຫນ'), - (0xEDD, 'M', u'ຫມ'), - (0xEDE, 'V'), - (0xEE0, 'X'), - (0xF00, 'V'), - (0xF0C, 'M', u'་'), - (0xF0D, 'V'), - (0xF43, 'M', u'གྷ'), - (0xF44, 'V'), - (0xF48, 'X'), - (0xF49, 'V'), - (0xF4D, 'M', u'ཌྷ'), - (0xF4E, 'V'), - (0xF52, 'M', u'དྷ'), - (0xF53, 'V'), - (0xF57, 'M', u'བྷ'), - (0xF58, 'V'), - (0xF5C, 'M', u'ཛྷ'), - (0xF5D, 'V'), - (0xF69, 'M', u'ཀྵ'), - (0xF6A, 'V'), - (0xF6D, 'X'), - (0xF71, 'V'), - (0xF73, 'M', u'ཱི'), - (0xF74, 'V'), - (0xF75, 'M', u'ཱུ'), - (0xF76, 'M', u'ྲྀ'), - (0xF77, 'M', u'ྲཱྀ'), - (0xF78, 'M', u'ླྀ'), - (0xF79, 'M', u'ླཱྀ'), - (0xF7A, 'V'), - (0xF81, 'M', u'ཱྀ'), - (0xF82, 'V'), - (0xF93, 'M', u'ྒྷ'), - (0xF94, 'V'), - (0xF98, 'X'), - (0xF99, 'V'), - (0xF9D, 'M', u'ྜྷ'), - (0xF9E, 'V'), - (0xFA2, 'M', u'ྡྷ'), - (0xFA3, 'V'), - (0xFA7, 'M', u'ྦྷ'), - (0xFA8, 'V'), - (0xFAC, 'M', u'ྫྷ'), - (0xFAD, 'V'), - (0xFB9, 'M', u'ྐྵ'), - (0xFBA, 'V'), - (0xFBD, 'X'), - (0xFBE, 'V'), - (0xFCD, 'X'), - (0xFCE, 'V'), - (0xFDB, 'X'), - (0x1000, 'V'), - (0x10A0, 'X'), - (0x10C7, 'M', u'ⴧ'), - (0x10C8, 'X'), - (0x10CD, 'M', u'ⴭ'), - (0x10CE, 'X'), - (0x10D0, 'V'), - (0x10FC, 'M', u'ნ'), - (0x10FD, 'V'), - (0x115F, 'X'), - (0x1161, 'V'), - (0x1249, 'X'), - (0x124A, 'V'), - (0x124E, 'X'), - (0x1250, 'V'), - (0x1257, 'X'), - (0x1258, 'V'), - (0x1259, 'X'), - (0x125A, 'V'), - (0x125E, 'X'), - (0x1260, 'V'), - (0x1289, 'X'), - (0x128A, 'V'), - ] - -def _seg_14(): - return [ - (0x128E, 'X'), - (0x1290, 'V'), - (0x12B1, 'X'), - (0x12B2, 'V'), - (0x12B6, 'X'), - (0x12B8, 'V'), - (0x12BF, 'X'), - (0x12C0, 'V'), - (0x12C1, 'X'), - (0x12C2, 'V'), - (0x12C6, 'X'), - (0x12C8, 'V'), - (0x12D7, 'X'), - (0x12D8, 'V'), - (0x1311, 'X'), - (0x1312, 'V'), - (0x1316, 'X'), - (0x1318, 'V'), - (0x135B, 'X'), - (0x135D, 'V'), - (0x137D, 'X'), - (0x1380, 'V'), - (0x139A, 'X'), - (0x13A0, 'V'), - (0x13F6, 'X'), - (0x13F8, 'M', u'Ᏸ'), - (0x13F9, 'M', u'Ᏹ'), - (0x13FA, 'M', u'Ᏺ'), - (0x13FB, 'M', u'Ᏻ'), - (0x13FC, 'M', u'Ᏼ'), - (0x13FD, 'M', u'Ᏽ'), - (0x13FE, 'X'), - (0x1400, 'V'), - (0x1680, 'X'), - (0x1681, 'V'), - (0x169D, 'X'), - (0x16A0, 'V'), - (0x16F9, 'X'), - (0x1700, 'V'), - (0x170D, 'X'), - (0x170E, 'V'), - (0x1715, 'X'), - (0x1720, 'V'), - (0x1737, 'X'), - (0x1740, 'V'), - (0x1754, 'X'), - (0x1760, 'V'), - (0x176D, 'X'), - (0x176E, 'V'), - (0x1771, 'X'), - (0x1772, 'V'), - (0x1774, 'X'), - (0x1780, 'V'), - (0x17B4, 'X'), - (0x17B6, 'V'), - (0x17DE, 'X'), - (0x17E0, 'V'), - (0x17EA, 'X'), - (0x17F0, 'V'), - (0x17FA, 'X'), - (0x1800, 'V'), - (0x1806, 'X'), - (0x1807, 'V'), - (0x180B, 'I'), - (0x180E, 'X'), - (0x1810, 'V'), - (0x181A, 'X'), - (0x1820, 'V'), - (0x1879, 'X'), - (0x1880, 'V'), - (0x18AB, 'X'), - (0x18B0, 'V'), - (0x18F6, 'X'), - (0x1900, 'V'), - (0x191F, 'X'), - (0x1920, 'V'), - (0x192C, 'X'), - (0x1930, 'V'), - (0x193C, 'X'), - (0x1940, 'V'), - (0x1941, 'X'), - (0x1944, 'V'), - (0x196E, 'X'), - (0x1970, 'V'), - (0x1975, 'X'), - (0x1980, 'V'), - (0x19AC, 'X'), - (0x19B0, 'V'), - (0x19CA, 'X'), - (0x19D0, 'V'), - (0x19DB, 'X'), - (0x19DE, 'V'), - (0x1A1C, 'X'), - (0x1A1E, 'V'), - (0x1A5F, 'X'), - (0x1A60, 'V'), - (0x1A7D, 'X'), - (0x1A7F, 'V'), - (0x1A8A, 'X'), - (0x1A90, 'V'), - ] - -def _seg_15(): - return [ - (0x1A9A, 'X'), - (0x1AA0, 'V'), - (0x1AAE, 'X'), - (0x1AB0, 'V'), - (0x1ABF, 'X'), - (0x1B00, 'V'), - (0x1B4C, 'X'), - (0x1B50, 'V'), - (0x1B7D, 'X'), - (0x1B80, 'V'), - (0x1BF4, 'X'), - (0x1BFC, 'V'), - (0x1C38, 'X'), - (0x1C3B, 'V'), - (0x1C4A, 'X'), - (0x1C4D, 'V'), - (0x1C80, 'M', u'в'), - (0x1C81, 'M', u'д'), - (0x1C82, 'M', u'о'), - (0x1C83, 'M', u'с'), - (0x1C84, 'M', u'т'), - (0x1C86, 'M', u'ъ'), - (0x1C87, 'M', u'ѣ'), - (0x1C88, 'M', u'ꙋ'), - (0x1C89, 'X'), - (0x1CC0, 'V'), - (0x1CC8, 'X'), - (0x1CD0, 'V'), - (0x1CFA, 'X'), - (0x1D00, 'V'), - (0x1D2C, 'M', u'a'), - (0x1D2D, 'M', u'æ'), - (0x1D2E, 'M', u'b'), - (0x1D2F, 'V'), - (0x1D30, 'M', u'd'), - (0x1D31, 'M', u'e'), - (0x1D32, 'M', u'ǝ'), - (0x1D33, 'M', u'g'), - (0x1D34, 'M', u'h'), - (0x1D35, 'M', u'i'), - (0x1D36, 'M', u'j'), - (0x1D37, 'M', u'k'), - (0x1D38, 'M', u'l'), - (0x1D39, 'M', u'm'), - (0x1D3A, 'M', u'n'), - (0x1D3B, 'V'), - (0x1D3C, 'M', u'o'), - (0x1D3D, 'M', u'ȣ'), - (0x1D3E, 'M', u'p'), - (0x1D3F, 'M', u'r'), - (0x1D40, 'M', u't'), - (0x1D41, 'M', u'u'), - (0x1D42, 'M', u'w'), - (0x1D43, 'M', u'a'), - (0x1D44, 'M', u'ɐ'), - (0x1D45, 'M', u'ɑ'), - (0x1D46, 'M', u'ᴂ'), - (0x1D47, 'M', u'b'), - (0x1D48, 'M', u'd'), - (0x1D49, 'M', u'e'), - (0x1D4A, 'M', u'ə'), - (0x1D4B, 'M', u'ɛ'), - (0x1D4C, 'M', u'ɜ'), - (0x1D4D, 'M', u'g'), - (0x1D4E, 'V'), - (0x1D4F, 'M', u'k'), - (0x1D50, 'M', u'm'), - (0x1D51, 'M', u'ŋ'), - (0x1D52, 'M', u'o'), - (0x1D53, 'M', u'ɔ'), - (0x1D54, 'M', u'ᴖ'), - (0x1D55, 'M', u'ᴗ'), - (0x1D56, 'M', u'p'), - (0x1D57, 'M', u't'), - (0x1D58, 'M', u'u'), - (0x1D59, 'M', u'ᴝ'), - (0x1D5A, 'M', u'ɯ'), - (0x1D5B, 'M', u'v'), - (0x1D5C, 'M', u'ᴥ'), - (0x1D5D, 'M', u'β'), - (0x1D5E, 'M', u'γ'), - (0x1D5F, 'M', u'δ'), - (0x1D60, 'M', u'φ'), - (0x1D61, 'M', u'χ'), - (0x1D62, 'M', u'i'), - (0x1D63, 'M', u'r'), - (0x1D64, 'M', u'u'), - (0x1D65, 'M', u'v'), - (0x1D66, 'M', u'β'), - (0x1D67, 'M', u'γ'), - (0x1D68, 'M', u'ρ'), - (0x1D69, 'M', u'φ'), - (0x1D6A, 'M', u'χ'), - (0x1D6B, 'V'), - (0x1D78, 'M', u'н'), - (0x1D79, 'V'), - (0x1D9B, 'M', u'ɒ'), - (0x1D9C, 'M', u'c'), - (0x1D9D, 'M', u'ɕ'), - (0x1D9E, 'M', u'ð'), - ] - -def _seg_16(): - return [ - (0x1D9F, 'M', u'ɜ'), - (0x1DA0, 'M', u'f'), - (0x1DA1, 'M', u'ɟ'), - (0x1DA2, 'M', u'ɡ'), - (0x1DA3, 'M', u'ɥ'), - (0x1DA4, 'M', u'ɨ'), - (0x1DA5, 'M', u'ɩ'), - (0x1DA6, 'M', u'ɪ'), - (0x1DA7, 'M', u'ᵻ'), - (0x1DA8, 'M', u'ʝ'), - (0x1DA9, 'M', u'ɭ'), - (0x1DAA, 'M', u'ᶅ'), - (0x1DAB, 'M', u'ʟ'), - (0x1DAC, 'M', u'ɱ'), - (0x1DAD, 'M', u'ɰ'), - (0x1DAE, 'M', u'ɲ'), - (0x1DAF, 'M', u'ɳ'), - (0x1DB0, 'M', u'ɴ'), - (0x1DB1, 'M', u'ɵ'), - (0x1DB2, 'M', u'ɸ'), - (0x1DB3, 'M', u'ʂ'), - (0x1DB4, 'M', u'ʃ'), - (0x1DB5, 'M', u'ƫ'), - (0x1DB6, 'M', u'ʉ'), - (0x1DB7, 'M', u'ʊ'), - (0x1DB8, 'M', u'ᴜ'), - (0x1DB9, 'M', u'ʋ'), - (0x1DBA, 'M', u'ʌ'), - (0x1DBB, 'M', u'z'), - (0x1DBC, 'M', u'ʐ'), - (0x1DBD, 'M', u'ʑ'), - (0x1DBE, 'M', u'ʒ'), - (0x1DBF, 'M', u'θ'), - (0x1DC0, 'V'), - (0x1DFA, 'X'), - (0x1DFB, 'V'), - (0x1E00, 'M', u'ḁ'), - (0x1E01, 'V'), - (0x1E02, 'M', u'ḃ'), - (0x1E03, 'V'), - (0x1E04, 'M', u'ḅ'), - (0x1E05, 'V'), - (0x1E06, 'M', u'ḇ'), - (0x1E07, 'V'), - (0x1E08, 'M', u'ḉ'), - (0x1E09, 'V'), - (0x1E0A, 'M', u'ḋ'), - (0x1E0B, 'V'), - (0x1E0C, 'M', u'ḍ'), - (0x1E0D, 'V'), - (0x1E0E, 'M', u'ḏ'), - (0x1E0F, 'V'), - (0x1E10, 'M', u'ḑ'), - (0x1E11, 'V'), - (0x1E12, 'M', u'ḓ'), - (0x1E13, 'V'), - (0x1E14, 'M', u'ḕ'), - (0x1E15, 'V'), - (0x1E16, 'M', u'ḗ'), - (0x1E17, 'V'), - (0x1E18, 'M', u'ḙ'), - (0x1E19, 'V'), - (0x1E1A, 'M', u'ḛ'), - (0x1E1B, 'V'), - (0x1E1C, 'M', u'ḝ'), - (0x1E1D, 'V'), - (0x1E1E, 'M', u'ḟ'), - (0x1E1F, 'V'), - (0x1E20, 'M', u'ḡ'), - (0x1E21, 'V'), - (0x1E22, 'M', u'ḣ'), - (0x1E23, 'V'), - (0x1E24, 'M', u'ḥ'), - (0x1E25, 'V'), - (0x1E26, 'M', u'ḧ'), - (0x1E27, 'V'), - (0x1E28, 'M', u'ḩ'), - (0x1E29, 'V'), - (0x1E2A, 'M', u'ḫ'), - (0x1E2B, 'V'), - (0x1E2C, 'M', u'ḭ'), - (0x1E2D, 'V'), - (0x1E2E, 'M', u'ḯ'), - (0x1E2F, 'V'), - (0x1E30, 'M', u'ḱ'), - (0x1E31, 'V'), - (0x1E32, 'M', u'ḳ'), - (0x1E33, 'V'), - (0x1E34, 'M', u'ḵ'), - (0x1E35, 'V'), - (0x1E36, 'M', u'ḷ'), - (0x1E37, 'V'), - (0x1E38, 'M', u'ḹ'), - (0x1E39, 'V'), - (0x1E3A, 'M', u'ḻ'), - (0x1E3B, 'V'), - (0x1E3C, 'M', u'ḽ'), - (0x1E3D, 'V'), - (0x1E3E, 'M', u'ḿ'), - (0x1E3F, 'V'), - ] - -def _seg_17(): - return [ - (0x1E40, 'M', u'ṁ'), - (0x1E41, 'V'), - (0x1E42, 'M', u'ṃ'), - (0x1E43, 'V'), - (0x1E44, 'M', u'ṅ'), - (0x1E45, 'V'), - (0x1E46, 'M', u'ṇ'), - (0x1E47, 'V'), - (0x1E48, 'M', u'ṉ'), - (0x1E49, 'V'), - (0x1E4A, 'M', u'ṋ'), - (0x1E4B, 'V'), - (0x1E4C, 'M', u'ṍ'), - (0x1E4D, 'V'), - (0x1E4E, 'M', u'ṏ'), - (0x1E4F, 'V'), - (0x1E50, 'M', u'ṑ'), - (0x1E51, 'V'), - (0x1E52, 'M', u'ṓ'), - (0x1E53, 'V'), - (0x1E54, 'M', u'ṕ'), - (0x1E55, 'V'), - (0x1E56, 'M', u'ṗ'), - (0x1E57, 'V'), - (0x1E58, 'M', u'ṙ'), - (0x1E59, 'V'), - (0x1E5A, 'M', u'ṛ'), - (0x1E5B, 'V'), - (0x1E5C, 'M', u'ṝ'), - (0x1E5D, 'V'), - (0x1E5E, 'M', u'ṟ'), - (0x1E5F, 'V'), - (0x1E60, 'M', u'ṡ'), - (0x1E61, 'V'), - (0x1E62, 'M', u'ṣ'), - (0x1E63, 'V'), - (0x1E64, 'M', u'ṥ'), - (0x1E65, 'V'), - (0x1E66, 'M', u'ṧ'), - (0x1E67, 'V'), - (0x1E68, 'M', u'ṩ'), - (0x1E69, 'V'), - (0x1E6A, 'M', u'ṫ'), - (0x1E6B, 'V'), - (0x1E6C, 'M', u'ṭ'), - (0x1E6D, 'V'), - (0x1E6E, 'M', u'ṯ'), - (0x1E6F, 'V'), - (0x1E70, 'M', u'ṱ'), - (0x1E71, 'V'), - (0x1E72, 'M', u'ṳ'), - (0x1E73, 'V'), - (0x1E74, 'M', u'ṵ'), - (0x1E75, 'V'), - (0x1E76, 'M', u'ṷ'), - (0x1E77, 'V'), - (0x1E78, 'M', u'ṹ'), - (0x1E79, 'V'), - (0x1E7A, 'M', u'ṻ'), - (0x1E7B, 'V'), - (0x1E7C, 'M', u'ṽ'), - (0x1E7D, 'V'), - (0x1E7E, 'M', u'ṿ'), - (0x1E7F, 'V'), - (0x1E80, 'M', u'ẁ'), - (0x1E81, 'V'), - (0x1E82, 'M', u'ẃ'), - (0x1E83, 'V'), - (0x1E84, 'M', u'ẅ'), - (0x1E85, 'V'), - (0x1E86, 'M', u'ẇ'), - (0x1E87, 'V'), - (0x1E88, 'M', u'ẉ'), - (0x1E89, 'V'), - (0x1E8A, 'M', u'ẋ'), - (0x1E8B, 'V'), - (0x1E8C, 'M', u'ẍ'), - (0x1E8D, 'V'), - (0x1E8E, 'M', u'ẏ'), - (0x1E8F, 'V'), - (0x1E90, 'M', u'ẑ'), - (0x1E91, 'V'), - (0x1E92, 'M', u'ẓ'), - (0x1E93, 'V'), - (0x1E94, 'M', u'ẕ'), - (0x1E95, 'V'), - (0x1E9A, 'M', u'aʾ'), - (0x1E9B, 'M', u'ṡ'), - (0x1E9C, 'V'), - (0x1E9E, 'M', u'ss'), - (0x1E9F, 'V'), - (0x1EA0, 'M', u'ạ'), - (0x1EA1, 'V'), - (0x1EA2, 'M', u'ả'), - (0x1EA3, 'V'), - (0x1EA4, 'M', u'ấ'), - (0x1EA5, 'V'), - (0x1EA6, 'M', u'ầ'), - (0x1EA7, 'V'), - (0x1EA8, 'M', u'ẩ'), - ] - -def _seg_18(): - return [ - (0x1EA9, 'V'), - (0x1EAA, 'M', u'ẫ'), - (0x1EAB, 'V'), - (0x1EAC, 'M', u'ậ'), - (0x1EAD, 'V'), - (0x1EAE, 'M', u'ắ'), - (0x1EAF, 'V'), - (0x1EB0, 'M', u'ằ'), - (0x1EB1, 'V'), - (0x1EB2, 'M', u'ẳ'), - (0x1EB3, 'V'), - (0x1EB4, 'M', u'ẵ'), - (0x1EB5, 'V'), - (0x1EB6, 'M', u'ặ'), - (0x1EB7, 'V'), - (0x1EB8, 'M', u'ẹ'), - (0x1EB9, 'V'), - (0x1EBA, 'M', u'ẻ'), - (0x1EBB, 'V'), - (0x1EBC, 'M', u'ẽ'), - (0x1EBD, 'V'), - (0x1EBE, 'M', u'ế'), - (0x1EBF, 'V'), - (0x1EC0, 'M', u'ề'), - (0x1EC1, 'V'), - (0x1EC2, 'M', u'ể'), - (0x1EC3, 'V'), - (0x1EC4, 'M', u'ễ'), - (0x1EC5, 'V'), - (0x1EC6, 'M', u'ệ'), - (0x1EC7, 'V'), - (0x1EC8, 'M', u'ỉ'), - (0x1EC9, 'V'), - (0x1ECA, 'M', u'ị'), - (0x1ECB, 'V'), - (0x1ECC, 'M', u'ọ'), - (0x1ECD, 'V'), - (0x1ECE, 'M', u'ỏ'), - (0x1ECF, 'V'), - (0x1ED0, 'M', u'ố'), - (0x1ED1, 'V'), - (0x1ED2, 'M', u'ồ'), - (0x1ED3, 'V'), - (0x1ED4, 'M', u'ổ'), - (0x1ED5, 'V'), - (0x1ED6, 'M', u'ỗ'), - (0x1ED7, 'V'), - (0x1ED8, 'M', u'ộ'), - (0x1ED9, 'V'), - (0x1EDA, 'M', u'ớ'), - (0x1EDB, 'V'), - (0x1EDC, 'M', u'ờ'), - (0x1EDD, 'V'), - (0x1EDE, 'M', u'ở'), - (0x1EDF, 'V'), - (0x1EE0, 'M', u'ỡ'), - (0x1EE1, 'V'), - (0x1EE2, 'M', u'ợ'), - (0x1EE3, 'V'), - (0x1EE4, 'M', u'ụ'), - (0x1EE5, 'V'), - (0x1EE6, 'M', u'ủ'), - (0x1EE7, 'V'), - (0x1EE8, 'M', u'ứ'), - (0x1EE9, 'V'), - (0x1EEA, 'M', u'ừ'), - (0x1EEB, 'V'), - (0x1EEC, 'M', u'ử'), - (0x1EED, 'V'), - (0x1EEE, 'M', u'ữ'), - (0x1EEF, 'V'), - (0x1EF0, 'M', u'ự'), - (0x1EF1, 'V'), - (0x1EF2, 'M', u'ỳ'), - (0x1EF3, 'V'), - (0x1EF4, 'M', u'ỵ'), - (0x1EF5, 'V'), - (0x1EF6, 'M', u'ỷ'), - (0x1EF7, 'V'), - (0x1EF8, 'M', u'ỹ'), - (0x1EF9, 'V'), - (0x1EFA, 'M', u'ỻ'), - (0x1EFB, 'V'), - (0x1EFC, 'M', u'ỽ'), - (0x1EFD, 'V'), - (0x1EFE, 'M', u'ỿ'), - (0x1EFF, 'V'), - (0x1F08, 'M', u'ἀ'), - (0x1F09, 'M', u'ἁ'), - (0x1F0A, 'M', u'ἂ'), - (0x1F0B, 'M', u'ἃ'), - (0x1F0C, 'M', u'ἄ'), - (0x1F0D, 'M', u'ἅ'), - (0x1F0E, 'M', u'ἆ'), - (0x1F0F, 'M', u'ἇ'), - (0x1F10, 'V'), - (0x1F16, 'X'), - (0x1F18, 'M', u'ἐ'), - (0x1F19, 'M', u'ἑ'), - (0x1F1A, 'M', u'ἒ'), - ] - -def _seg_19(): - return [ - (0x1F1B, 'M', u'ἓ'), - (0x1F1C, 'M', u'ἔ'), - (0x1F1D, 'M', u'ἕ'), - (0x1F1E, 'X'), - (0x1F20, 'V'), - (0x1F28, 'M', u'ἠ'), - (0x1F29, 'M', u'ἡ'), - (0x1F2A, 'M', u'ἢ'), - (0x1F2B, 'M', u'ἣ'), - (0x1F2C, 'M', u'ἤ'), - (0x1F2D, 'M', u'ἥ'), - (0x1F2E, 'M', u'ἦ'), - (0x1F2F, 'M', u'ἧ'), - (0x1F30, 'V'), - (0x1F38, 'M', u'ἰ'), - (0x1F39, 'M', u'ἱ'), - (0x1F3A, 'M', u'ἲ'), - (0x1F3B, 'M', u'ἳ'), - (0x1F3C, 'M', u'ἴ'), - (0x1F3D, 'M', u'ἵ'), - (0x1F3E, 'M', u'ἶ'), - (0x1F3F, 'M', u'ἷ'), - (0x1F40, 'V'), - (0x1F46, 'X'), - (0x1F48, 'M', u'ὀ'), - (0x1F49, 'M', u'ὁ'), - (0x1F4A, 'M', u'ὂ'), - (0x1F4B, 'M', u'ὃ'), - (0x1F4C, 'M', u'ὄ'), - (0x1F4D, 'M', u'ὅ'), - (0x1F4E, 'X'), - (0x1F50, 'V'), - (0x1F58, 'X'), - (0x1F59, 'M', u'ὑ'), - (0x1F5A, 'X'), - (0x1F5B, 'M', u'ὓ'), - (0x1F5C, 'X'), - (0x1F5D, 'M', u'ὕ'), - (0x1F5E, 'X'), - (0x1F5F, 'M', u'ὗ'), - (0x1F60, 'V'), - (0x1F68, 'M', u'ὠ'), - (0x1F69, 'M', u'ὡ'), - (0x1F6A, 'M', u'ὢ'), - (0x1F6B, 'M', u'ὣ'), - (0x1F6C, 'M', u'ὤ'), - (0x1F6D, 'M', u'ὥ'), - (0x1F6E, 'M', u'ὦ'), - (0x1F6F, 'M', u'ὧ'), - (0x1F70, 'V'), - (0x1F71, 'M', u'ά'), - (0x1F72, 'V'), - (0x1F73, 'M', u'έ'), - (0x1F74, 'V'), - (0x1F75, 'M', u'ή'), - (0x1F76, 'V'), - (0x1F77, 'M', u'ί'), - (0x1F78, 'V'), - (0x1F79, 'M', u'ό'), - (0x1F7A, 'V'), - (0x1F7B, 'M', u'ύ'), - (0x1F7C, 'V'), - (0x1F7D, 'M', u'ώ'), - (0x1F7E, 'X'), - (0x1F80, 'M', u'ἀι'), - (0x1F81, 'M', u'ἁι'), - (0x1F82, 'M', u'ἂι'), - (0x1F83, 'M', u'ἃι'), - (0x1F84, 'M', u'ἄι'), - (0x1F85, 'M', u'ἅι'), - (0x1F86, 'M', u'ἆι'), - (0x1F87, 'M', u'ἇι'), - (0x1F88, 'M', u'ἀι'), - (0x1F89, 'M', u'ἁι'), - (0x1F8A, 'M', u'ἂι'), - (0x1F8B, 'M', u'ἃι'), - (0x1F8C, 'M', u'ἄι'), - (0x1F8D, 'M', u'ἅι'), - (0x1F8E, 'M', u'ἆι'), - (0x1F8F, 'M', u'ἇι'), - (0x1F90, 'M', u'ἠι'), - (0x1F91, 'M', u'ἡι'), - (0x1F92, 'M', u'ἢι'), - (0x1F93, 'M', u'ἣι'), - (0x1F94, 'M', u'ἤι'), - (0x1F95, 'M', u'ἥι'), - (0x1F96, 'M', u'ἦι'), - (0x1F97, 'M', u'ἧι'), - (0x1F98, 'M', u'ἠι'), - (0x1F99, 'M', u'ἡι'), - (0x1F9A, 'M', u'ἢι'), - (0x1F9B, 'M', u'ἣι'), - (0x1F9C, 'M', u'ἤι'), - (0x1F9D, 'M', u'ἥι'), - (0x1F9E, 'M', u'ἦι'), - (0x1F9F, 'M', u'ἧι'), - (0x1FA0, 'M', u'ὠι'), - (0x1FA1, 'M', u'ὡι'), - (0x1FA2, 'M', u'ὢι'), - (0x1FA3, 'M', u'ὣι'), - ] - -def _seg_20(): - return [ - (0x1FA4, 'M', u'ὤι'), - (0x1FA5, 'M', u'ὥι'), - (0x1FA6, 'M', u'ὦι'), - (0x1FA7, 'M', u'ὧι'), - (0x1FA8, 'M', u'ὠι'), - (0x1FA9, 'M', u'ὡι'), - (0x1FAA, 'M', u'ὢι'), - (0x1FAB, 'M', u'ὣι'), - (0x1FAC, 'M', u'ὤι'), - (0x1FAD, 'M', u'ὥι'), - (0x1FAE, 'M', u'ὦι'), - (0x1FAF, 'M', u'ὧι'), - (0x1FB0, 'V'), - (0x1FB2, 'M', u'ὰι'), - (0x1FB3, 'M', u'αι'), - (0x1FB4, 'M', u'άι'), - (0x1FB5, 'X'), - (0x1FB6, 'V'), - (0x1FB7, 'M', u'ᾶι'), - (0x1FB8, 'M', u'ᾰ'), - (0x1FB9, 'M', u'ᾱ'), - (0x1FBA, 'M', u'ὰ'), - (0x1FBB, 'M', u'ά'), - (0x1FBC, 'M', u'αι'), - (0x1FBD, '3', u' ̓'), - (0x1FBE, 'M', u'ι'), - (0x1FBF, '3', u' ̓'), - (0x1FC0, '3', u' ͂'), - (0x1FC1, '3', u' ̈͂'), - (0x1FC2, 'M', u'ὴι'), - (0x1FC3, 'M', u'ηι'), - (0x1FC4, 'M', u'ήι'), - (0x1FC5, 'X'), - (0x1FC6, 'V'), - (0x1FC7, 'M', u'ῆι'), - (0x1FC8, 'M', u'ὲ'), - (0x1FC9, 'M', u'έ'), - (0x1FCA, 'M', u'ὴ'), - (0x1FCB, 'M', u'ή'), - (0x1FCC, 'M', u'ηι'), - (0x1FCD, '3', u' ̓̀'), - (0x1FCE, '3', u' ̓́'), - (0x1FCF, '3', u' ̓͂'), - (0x1FD0, 'V'), - (0x1FD3, 'M', u'ΐ'), - (0x1FD4, 'X'), - (0x1FD6, 'V'), - (0x1FD8, 'M', u'ῐ'), - (0x1FD9, 'M', u'ῑ'), - (0x1FDA, 'M', u'ὶ'), - (0x1FDB, 'M', u'ί'), - (0x1FDC, 'X'), - (0x1FDD, '3', u' ̔̀'), - (0x1FDE, '3', u' ̔́'), - (0x1FDF, '3', u' ̔͂'), - (0x1FE0, 'V'), - (0x1FE3, 'M', u'ΰ'), - (0x1FE4, 'V'), - (0x1FE8, 'M', u'ῠ'), - (0x1FE9, 'M', u'ῡ'), - (0x1FEA, 'M', u'ὺ'), - (0x1FEB, 'M', u'ύ'), - (0x1FEC, 'M', u'ῥ'), - (0x1FED, '3', u' ̈̀'), - (0x1FEE, '3', u' ̈́'), - (0x1FEF, '3', u'`'), - (0x1FF0, 'X'), - (0x1FF2, 'M', u'ὼι'), - (0x1FF3, 'M', u'ωι'), - (0x1FF4, 'M', u'ώι'), - (0x1FF5, 'X'), - (0x1FF6, 'V'), - (0x1FF7, 'M', u'ῶι'), - (0x1FF8, 'M', u'ὸ'), - (0x1FF9, 'M', u'ό'), - (0x1FFA, 'M', u'ὼ'), - (0x1FFB, 'M', u'ώ'), - (0x1FFC, 'M', u'ωι'), - (0x1FFD, '3', u' ́'), - (0x1FFE, '3', u' ̔'), - (0x1FFF, 'X'), - (0x2000, '3', u' '), - (0x200B, 'I'), - (0x200C, 'D', u''), - (0x200E, 'X'), - (0x2010, 'V'), - (0x2011, 'M', u'‐'), - (0x2012, 'V'), - (0x2017, '3', u' ̳'), - (0x2018, 'V'), - (0x2024, 'X'), - (0x2027, 'V'), - (0x2028, 'X'), - (0x202F, '3', u' '), - (0x2030, 'V'), - (0x2033, 'M', u'′′'), - (0x2034, 'M', u'′′′'), - (0x2035, 'V'), - (0x2036, 'M', u'‵‵'), - (0x2037, 'M', u'‵‵‵'), - ] - -def _seg_21(): - return [ - (0x2038, 'V'), - (0x203C, '3', u'!!'), - (0x203D, 'V'), - (0x203E, '3', u' ̅'), - (0x203F, 'V'), - (0x2047, '3', u'??'), - (0x2048, '3', u'?!'), - (0x2049, '3', u'!?'), - (0x204A, 'V'), - (0x2057, 'M', u'′′′′'), - (0x2058, 'V'), - (0x205F, '3', u' '), - (0x2060, 'I'), - (0x2061, 'X'), - (0x2064, 'I'), - (0x2065, 'X'), - (0x2070, 'M', u'0'), - (0x2071, 'M', u'i'), - (0x2072, 'X'), - (0x2074, 'M', u'4'), - (0x2075, 'M', u'5'), - (0x2076, 'M', u'6'), - (0x2077, 'M', u'7'), - (0x2078, 'M', u'8'), - (0x2079, 'M', u'9'), - (0x207A, '3', u'+'), - (0x207B, 'M', u'−'), - (0x207C, '3', u'='), - (0x207D, '3', u'('), - (0x207E, '3', u')'), - (0x207F, 'M', u'n'), - (0x2080, 'M', u'0'), - (0x2081, 'M', u'1'), - (0x2082, 'M', u'2'), - (0x2083, 'M', u'3'), - (0x2084, 'M', u'4'), - (0x2085, 'M', u'5'), - (0x2086, 'M', u'6'), - (0x2087, 'M', u'7'), - (0x2088, 'M', u'8'), - (0x2089, 'M', u'9'), - (0x208A, '3', u'+'), - (0x208B, 'M', u'−'), - (0x208C, '3', u'='), - (0x208D, '3', u'('), - (0x208E, '3', u')'), - (0x208F, 'X'), - (0x2090, 'M', u'a'), - (0x2091, 'M', u'e'), - (0x2092, 'M', u'o'), - (0x2093, 'M', u'x'), - (0x2094, 'M', u'ə'), - (0x2095, 'M', u'h'), - (0x2096, 'M', u'k'), - (0x2097, 'M', u'l'), - (0x2098, 'M', u'm'), - (0x2099, 'M', u'n'), - (0x209A, 'M', u'p'), - (0x209B, 'M', u's'), - (0x209C, 'M', u't'), - (0x209D, 'X'), - (0x20A0, 'V'), - (0x20A8, 'M', u'rs'), - (0x20A9, 'V'), - (0x20C0, 'X'), - (0x20D0, 'V'), - (0x20F1, 'X'), - (0x2100, '3', u'a/c'), - (0x2101, '3', u'a/s'), - (0x2102, 'M', u'c'), - (0x2103, 'M', u'°c'), - (0x2104, 'V'), - (0x2105, '3', u'c/o'), - (0x2106, '3', u'c/u'), - (0x2107, 'M', u'ɛ'), - (0x2108, 'V'), - (0x2109, 'M', u'°f'), - (0x210A, 'M', u'g'), - (0x210B, 'M', u'h'), - (0x210F, 'M', u'ħ'), - (0x2110, 'M', u'i'), - (0x2112, 'M', u'l'), - (0x2114, 'V'), - (0x2115, 'M', u'n'), - (0x2116, 'M', u'no'), - (0x2117, 'V'), - (0x2119, 'M', u'p'), - (0x211A, 'M', u'q'), - (0x211B, 'M', u'r'), - (0x211E, 'V'), - (0x2120, 'M', u'sm'), - (0x2121, 'M', u'tel'), - (0x2122, 'M', u'tm'), - (0x2123, 'V'), - (0x2124, 'M', u'z'), - (0x2125, 'V'), - (0x2126, 'M', u'ω'), - (0x2127, 'V'), - (0x2128, 'M', u'z'), - (0x2129, 'V'), - ] - -def _seg_22(): - return [ - (0x212A, 'M', u'k'), - (0x212B, 'M', u'å'), - (0x212C, 'M', u'b'), - (0x212D, 'M', u'c'), - (0x212E, 'V'), - (0x212F, 'M', u'e'), - (0x2131, 'M', u'f'), - (0x2132, 'X'), - (0x2133, 'M', u'm'), - (0x2134, 'M', u'o'), - (0x2135, 'M', u'א'), - (0x2136, 'M', u'ב'), - (0x2137, 'M', u'ג'), - (0x2138, 'M', u'ד'), - (0x2139, 'M', u'i'), - (0x213A, 'V'), - (0x213B, 'M', u'fax'), - (0x213C, 'M', u'π'), - (0x213D, 'M', u'γ'), - (0x213F, 'M', u'π'), - (0x2140, 'M', u'∑'), - (0x2141, 'V'), - (0x2145, 'M', u'd'), - (0x2147, 'M', u'e'), - (0x2148, 'M', u'i'), - (0x2149, 'M', u'j'), - (0x214A, 'V'), - (0x2150, 'M', u'1⁄7'), - (0x2151, 'M', u'1⁄9'), - (0x2152, 'M', u'1⁄10'), - (0x2153, 'M', u'1⁄3'), - (0x2154, 'M', u'2⁄3'), - (0x2155, 'M', u'1⁄5'), - (0x2156, 'M', u'2⁄5'), - (0x2157, 'M', u'3⁄5'), - (0x2158, 'M', u'4⁄5'), - (0x2159, 'M', u'1⁄6'), - (0x215A, 'M', u'5⁄6'), - (0x215B, 'M', u'1⁄8'), - (0x215C, 'M', u'3⁄8'), - (0x215D, 'M', u'5⁄8'), - (0x215E, 'M', u'7⁄8'), - (0x215F, 'M', u'1⁄'), - (0x2160, 'M', u'i'), - (0x2161, 'M', u'ii'), - (0x2162, 'M', u'iii'), - (0x2163, 'M', u'iv'), - (0x2164, 'M', u'v'), - (0x2165, 'M', u'vi'), - (0x2166, 'M', u'vii'), - (0x2167, 'M', u'viii'), - (0x2168, 'M', u'ix'), - (0x2169, 'M', u'x'), - (0x216A, 'M', u'xi'), - (0x216B, 'M', u'xii'), - (0x216C, 'M', u'l'), - (0x216D, 'M', u'c'), - (0x216E, 'M', u'd'), - (0x216F, 'M', u'm'), - (0x2170, 'M', u'i'), - (0x2171, 'M', u'ii'), - (0x2172, 'M', u'iii'), - (0x2173, 'M', u'iv'), - (0x2174, 'M', u'v'), - (0x2175, 'M', u'vi'), - (0x2176, 'M', u'vii'), - (0x2177, 'M', u'viii'), - (0x2178, 'M', u'ix'), - (0x2179, 'M', u'x'), - (0x217A, 'M', u'xi'), - (0x217B, 'M', u'xii'), - (0x217C, 'M', u'l'), - (0x217D, 'M', u'c'), - (0x217E, 'M', u'd'), - (0x217F, 'M', u'm'), - (0x2180, 'V'), - (0x2183, 'X'), - (0x2184, 'V'), - (0x2189, 'M', u'0⁄3'), - (0x218A, 'V'), - (0x218C, 'X'), - (0x2190, 'V'), - (0x222C, 'M', u'∫∫'), - (0x222D, 'M', u'∫∫∫'), - (0x222E, 'V'), - (0x222F, 'M', u'∮∮'), - (0x2230, 'M', u'∮∮∮'), - (0x2231, 'V'), - (0x2260, '3'), - (0x2261, 'V'), - (0x226E, '3'), - (0x2270, 'V'), - (0x2329, 'M', u'〈'), - (0x232A, 'M', u'〉'), - (0x232B, 'V'), - (0x2427, 'X'), - (0x2440, 'V'), - (0x244B, 'X'), - (0x2460, 'M', u'1'), - (0x2461, 'M', u'2'), - ] - -def _seg_23(): - return [ - (0x2462, 'M', u'3'), - (0x2463, 'M', u'4'), - (0x2464, 'M', u'5'), - (0x2465, 'M', u'6'), - (0x2466, 'M', u'7'), - (0x2467, 'M', u'8'), - (0x2468, 'M', u'9'), - (0x2469, 'M', u'10'), - (0x246A, 'M', u'11'), - (0x246B, 'M', u'12'), - (0x246C, 'M', u'13'), - (0x246D, 'M', u'14'), - (0x246E, 'M', u'15'), - (0x246F, 'M', u'16'), - (0x2470, 'M', u'17'), - (0x2471, 'M', u'18'), - (0x2472, 'M', u'19'), - (0x2473, 'M', u'20'), - (0x2474, '3', u'(1)'), - (0x2475, '3', u'(2)'), - (0x2476, '3', u'(3)'), - (0x2477, '3', u'(4)'), - (0x2478, '3', u'(5)'), - (0x2479, '3', u'(6)'), - (0x247A, '3', u'(7)'), - (0x247B, '3', u'(8)'), - (0x247C, '3', u'(9)'), - (0x247D, '3', u'(10)'), - (0x247E, '3', u'(11)'), - (0x247F, '3', u'(12)'), - (0x2480, '3', u'(13)'), - (0x2481, '3', u'(14)'), - (0x2482, '3', u'(15)'), - (0x2483, '3', u'(16)'), - (0x2484, '3', u'(17)'), - (0x2485, '3', u'(18)'), - (0x2486, '3', u'(19)'), - (0x2487, '3', u'(20)'), - (0x2488, 'X'), - (0x249C, '3', u'(a)'), - (0x249D, '3', u'(b)'), - (0x249E, '3', u'(c)'), - (0x249F, '3', u'(d)'), - (0x24A0, '3', u'(e)'), - (0x24A1, '3', u'(f)'), - (0x24A2, '3', u'(g)'), - (0x24A3, '3', u'(h)'), - (0x24A4, '3', u'(i)'), - (0x24A5, '3', u'(j)'), - (0x24A6, '3', u'(k)'), - (0x24A7, '3', u'(l)'), - (0x24A8, '3', u'(m)'), - (0x24A9, '3', u'(n)'), - (0x24AA, '3', u'(o)'), - (0x24AB, '3', u'(p)'), - (0x24AC, '3', u'(q)'), - (0x24AD, '3', u'(r)'), - (0x24AE, '3', u'(s)'), - (0x24AF, '3', u'(t)'), - (0x24B0, '3', u'(u)'), - (0x24B1, '3', u'(v)'), - (0x24B2, '3', u'(w)'), - (0x24B3, '3', u'(x)'), - (0x24B4, '3', u'(y)'), - (0x24B5, '3', u'(z)'), - (0x24B6, 'M', u'a'), - (0x24B7, 'M', u'b'), - (0x24B8, 'M', u'c'), - (0x24B9, 'M', u'd'), - (0x24BA, 'M', u'e'), - (0x24BB, 'M', u'f'), - (0x24BC, 'M', u'g'), - (0x24BD, 'M', u'h'), - (0x24BE, 'M', u'i'), - (0x24BF, 'M', u'j'), - (0x24C0, 'M', u'k'), - (0x24C1, 'M', u'l'), - (0x24C2, 'M', u'm'), - (0x24C3, 'M', u'n'), - (0x24C4, 'M', u'o'), - (0x24C5, 'M', u'p'), - (0x24C6, 'M', u'q'), - (0x24C7, 'M', u'r'), - (0x24C8, 'M', u's'), - (0x24C9, 'M', u't'), - (0x24CA, 'M', u'u'), - (0x24CB, 'M', u'v'), - (0x24CC, 'M', u'w'), - (0x24CD, 'M', u'x'), - (0x24CE, 'M', u'y'), - (0x24CF, 'M', u'z'), - (0x24D0, 'M', u'a'), - (0x24D1, 'M', u'b'), - (0x24D2, 'M', u'c'), - (0x24D3, 'M', u'd'), - (0x24D4, 'M', u'e'), - (0x24D5, 'M', u'f'), - (0x24D6, 'M', u'g'), - (0x24D7, 'M', u'h'), - (0x24D8, 'M', u'i'), - ] - -def _seg_24(): - return [ - (0x24D9, 'M', u'j'), - (0x24DA, 'M', u'k'), - (0x24DB, 'M', u'l'), - (0x24DC, 'M', u'm'), - (0x24DD, 'M', u'n'), - (0x24DE, 'M', u'o'), - (0x24DF, 'M', u'p'), - (0x24E0, 'M', u'q'), - (0x24E1, 'M', u'r'), - (0x24E2, 'M', u's'), - (0x24E3, 'M', u't'), - (0x24E4, 'M', u'u'), - (0x24E5, 'M', u'v'), - (0x24E6, 'M', u'w'), - (0x24E7, 'M', u'x'), - (0x24E8, 'M', u'y'), - (0x24E9, 'M', u'z'), - (0x24EA, 'M', u'0'), - (0x24EB, 'V'), - (0x2A0C, 'M', u'∫∫∫∫'), - (0x2A0D, 'V'), - (0x2A74, '3', u'::='), - (0x2A75, '3', u'=='), - (0x2A76, '3', u'==='), - (0x2A77, 'V'), - (0x2ADC, 'M', u'⫝̸'), - (0x2ADD, 'V'), - (0x2B74, 'X'), - (0x2B76, 'V'), - (0x2B96, 'X'), - (0x2B98, 'V'), - (0x2BC9, 'X'), - (0x2BCA, 'V'), - (0x2BFF, 'X'), - (0x2C00, 'M', u'ⰰ'), - (0x2C01, 'M', u'ⰱ'), - (0x2C02, 'M', u'ⰲ'), - (0x2C03, 'M', u'ⰳ'), - (0x2C04, 'M', u'ⰴ'), - (0x2C05, 'M', u'ⰵ'), - (0x2C06, 'M', u'ⰶ'), - (0x2C07, 'M', u'ⰷ'), - (0x2C08, 'M', u'ⰸ'), - (0x2C09, 'M', u'ⰹ'), - (0x2C0A, 'M', u'ⰺ'), - (0x2C0B, 'M', u'ⰻ'), - (0x2C0C, 'M', u'ⰼ'), - (0x2C0D, 'M', u'ⰽ'), - (0x2C0E, 'M', u'ⰾ'), - (0x2C0F, 'M', u'ⰿ'), - (0x2C10, 'M', u'ⱀ'), - (0x2C11, 'M', u'ⱁ'), - (0x2C12, 'M', u'ⱂ'), - (0x2C13, 'M', u'ⱃ'), - (0x2C14, 'M', u'ⱄ'), - (0x2C15, 'M', u'ⱅ'), - (0x2C16, 'M', u'ⱆ'), - (0x2C17, 'M', u'ⱇ'), - (0x2C18, 'M', u'ⱈ'), - (0x2C19, 'M', u'ⱉ'), - (0x2C1A, 'M', u'ⱊ'), - (0x2C1B, 'M', u'ⱋ'), - (0x2C1C, 'M', u'ⱌ'), - (0x2C1D, 'M', u'ⱍ'), - (0x2C1E, 'M', u'ⱎ'), - (0x2C1F, 'M', u'ⱏ'), - (0x2C20, 'M', u'ⱐ'), - (0x2C21, 'M', u'ⱑ'), - (0x2C22, 'M', u'ⱒ'), - (0x2C23, 'M', u'ⱓ'), - (0x2C24, 'M', u'ⱔ'), - (0x2C25, 'M', u'ⱕ'), - (0x2C26, 'M', u'ⱖ'), - (0x2C27, 'M', u'ⱗ'), - (0x2C28, 'M', u'ⱘ'), - (0x2C29, 'M', u'ⱙ'), - (0x2C2A, 'M', u'ⱚ'), - (0x2C2B, 'M', u'ⱛ'), - (0x2C2C, 'M', u'ⱜ'), - (0x2C2D, 'M', u'ⱝ'), - (0x2C2E, 'M', u'ⱞ'), - (0x2C2F, 'X'), - (0x2C30, 'V'), - (0x2C5F, 'X'), - (0x2C60, 'M', u'ⱡ'), - (0x2C61, 'V'), - (0x2C62, 'M', u'ɫ'), - (0x2C63, 'M', u'ᵽ'), - (0x2C64, 'M', u'ɽ'), - (0x2C65, 'V'), - (0x2C67, 'M', u'ⱨ'), - (0x2C68, 'V'), - (0x2C69, 'M', u'ⱪ'), - (0x2C6A, 'V'), - (0x2C6B, 'M', u'ⱬ'), - (0x2C6C, 'V'), - (0x2C6D, 'M', u'ɑ'), - (0x2C6E, 'M', u'ɱ'), - (0x2C6F, 'M', u'ɐ'), - (0x2C70, 'M', u'ɒ'), - ] - -def _seg_25(): - return [ - (0x2C71, 'V'), - (0x2C72, 'M', u'ⱳ'), - (0x2C73, 'V'), - (0x2C75, 'M', u'ⱶ'), - (0x2C76, 'V'), - (0x2C7C, 'M', u'j'), - (0x2C7D, 'M', u'v'), - (0x2C7E, 'M', u'ȿ'), - (0x2C7F, 'M', u'ɀ'), - (0x2C80, 'M', u'ⲁ'), - (0x2C81, 'V'), - (0x2C82, 'M', u'ⲃ'), - (0x2C83, 'V'), - (0x2C84, 'M', u'ⲅ'), - (0x2C85, 'V'), - (0x2C86, 'M', u'ⲇ'), - (0x2C87, 'V'), - (0x2C88, 'M', u'ⲉ'), - (0x2C89, 'V'), - (0x2C8A, 'M', u'ⲋ'), - (0x2C8B, 'V'), - (0x2C8C, 'M', u'ⲍ'), - (0x2C8D, 'V'), - (0x2C8E, 'M', u'ⲏ'), - (0x2C8F, 'V'), - (0x2C90, 'M', u'ⲑ'), - (0x2C91, 'V'), - (0x2C92, 'M', u'ⲓ'), - (0x2C93, 'V'), - (0x2C94, 'M', u'ⲕ'), - (0x2C95, 'V'), - (0x2C96, 'M', u'ⲗ'), - (0x2C97, 'V'), - (0x2C98, 'M', u'ⲙ'), - (0x2C99, 'V'), - (0x2C9A, 'M', u'ⲛ'), - (0x2C9B, 'V'), - (0x2C9C, 'M', u'ⲝ'), - (0x2C9D, 'V'), - (0x2C9E, 'M', u'ⲟ'), - (0x2C9F, 'V'), - (0x2CA0, 'M', u'ⲡ'), - (0x2CA1, 'V'), - (0x2CA2, 'M', u'ⲣ'), - (0x2CA3, 'V'), - (0x2CA4, 'M', u'ⲥ'), - (0x2CA5, 'V'), - (0x2CA6, 'M', u'ⲧ'), - (0x2CA7, 'V'), - (0x2CA8, 'M', u'ⲩ'), - (0x2CA9, 'V'), - (0x2CAA, 'M', u'ⲫ'), - (0x2CAB, 'V'), - (0x2CAC, 'M', u'ⲭ'), - (0x2CAD, 'V'), - (0x2CAE, 'M', u'ⲯ'), - (0x2CAF, 'V'), - (0x2CB0, 'M', u'ⲱ'), - (0x2CB1, 'V'), - (0x2CB2, 'M', u'ⲳ'), - (0x2CB3, 'V'), - (0x2CB4, 'M', u'ⲵ'), - (0x2CB5, 'V'), - (0x2CB6, 'M', u'ⲷ'), - (0x2CB7, 'V'), - (0x2CB8, 'M', u'ⲹ'), - (0x2CB9, 'V'), - (0x2CBA, 'M', u'ⲻ'), - (0x2CBB, 'V'), - (0x2CBC, 'M', u'ⲽ'), - (0x2CBD, 'V'), - (0x2CBE, 'M', u'ⲿ'), - (0x2CBF, 'V'), - (0x2CC0, 'M', u'ⳁ'), - (0x2CC1, 'V'), - (0x2CC2, 'M', u'ⳃ'), - (0x2CC3, 'V'), - (0x2CC4, 'M', u'ⳅ'), - (0x2CC5, 'V'), - (0x2CC6, 'M', u'ⳇ'), - (0x2CC7, 'V'), - (0x2CC8, 'M', u'ⳉ'), - (0x2CC9, 'V'), - (0x2CCA, 'M', u'ⳋ'), - (0x2CCB, 'V'), - (0x2CCC, 'M', u'ⳍ'), - (0x2CCD, 'V'), - (0x2CCE, 'M', u'ⳏ'), - (0x2CCF, 'V'), - (0x2CD0, 'M', u'ⳑ'), - (0x2CD1, 'V'), - (0x2CD2, 'M', u'ⳓ'), - (0x2CD3, 'V'), - (0x2CD4, 'M', u'ⳕ'), - (0x2CD5, 'V'), - (0x2CD6, 'M', u'ⳗ'), - (0x2CD7, 'V'), - (0x2CD8, 'M', u'ⳙ'), - (0x2CD9, 'V'), - (0x2CDA, 'M', u'ⳛ'), - ] - -def _seg_26(): - return [ - (0x2CDB, 'V'), - (0x2CDC, 'M', u'ⳝ'), - (0x2CDD, 'V'), - (0x2CDE, 'M', u'ⳟ'), - (0x2CDF, 'V'), - (0x2CE0, 'M', u'ⳡ'), - (0x2CE1, 'V'), - (0x2CE2, 'M', u'ⳣ'), - (0x2CE3, 'V'), - (0x2CEB, 'M', u'ⳬ'), - (0x2CEC, 'V'), - (0x2CED, 'M', u'ⳮ'), - (0x2CEE, 'V'), - (0x2CF2, 'M', u'ⳳ'), - (0x2CF3, 'V'), - (0x2CF4, 'X'), - (0x2CF9, 'V'), - (0x2D26, 'X'), - (0x2D27, 'V'), - (0x2D28, 'X'), - (0x2D2D, 'V'), - (0x2D2E, 'X'), - (0x2D30, 'V'), - (0x2D68, 'X'), - (0x2D6F, 'M', u'ⵡ'), - (0x2D70, 'V'), - (0x2D71, 'X'), - (0x2D7F, 'V'), - (0x2D97, 'X'), - (0x2DA0, 'V'), - (0x2DA7, 'X'), - (0x2DA8, 'V'), - (0x2DAF, 'X'), - (0x2DB0, 'V'), - (0x2DB7, 'X'), - (0x2DB8, 'V'), - (0x2DBF, 'X'), - (0x2DC0, 'V'), - (0x2DC7, 'X'), - (0x2DC8, 'V'), - (0x2DCF, 'X'), - (0x2DD0, 'V'), - (0x2DD7, 'X'), - (0x2DD8, 'V'), - (0x2DDF, 'X'), - (0x2DE0, 'V'), - (0x2E4F, 'X'), - (0x2E80, 'V'), - (0x2E9A, 'X'), - (0x2E9B, 'V'), - (0x2E9F, 'M', u'母'), - (0x2EA0, 'V'), - (0x2EF3, 'M', u'龟'), - (0x2EF4, 'X'), - (0x2F00, 'M', u'一'), - (0x2F01, 'M', u'丨'), - (0x2F02, 'M', u'丶'), - (0x2F03, 'M', u'丿'), - (0x2F04, 'M', u'乙'), - (0x2F05, 'M', u'亅'), - (0x2F06, 'M', u'二'), - (0x2F07, 'M', u'亠'), - (0x2F08, 'M', u'人'), - (0x2F09, 'M', u'儿'), - (0x2F0A, 'M', u'入'), - (0x2F0B, 'M', u'八'), - (0x2F0C, 'M', u'冂'), - (0x2F0D, 'M', u'冖'), - (0x2F0E, 'M', u'冫'), - (0x2F0F, 'M', u'几'), - (0x2F10, 'M', u'凵'), - (0x2F11, 'M', u'刀'), - (0x2F12, 'M', u'力'), - (0x2F13, 'M', u'勹'), - (0x2F14, 'M', u'匕'), - (0x2F15, 'M', u'匚'), - (0x2F16, 'M', u'匸'), - (0x2F17, 'M', u'十'), - (0x2F18, 'M', u'卜'), - (0x2F19, 'M', u'卩'), - (0x2F1A, 'M', u'厂'), - (0x2F1B, 'M', u'厶'), - (0x2F1C, 'M', u'又'), - (0x2F1D, 'M', u'口'), - (0x2F1E, 'M', u'囗'), - (0x2F1F, 'M', u'土'), - (0x2F20, 'M', u'士'), - (0x2F21, 'M', u'夂'), - (0x2F22, 'M', u'夊'), - (0x2F23, 'M', u'夕'), - (0x2F24, 'M', u'大'), - (0x2F25, 'M', u'女'), - (0x2F26, 'M', u'子'), - (0x2F27, 'M', u'宀'), - (0x2F28, 'M', u'寸'), - (0x2F29, 'M', u'小'), - (0x2F2A, 'M', u'尢'), - (0x2F2B, 'M', u'尸'), - (0x2F2C, 'M', u'屮'), - (0x2F2D, 'M', u'山'), - ] - -def _seg_27(): - return [ - (0x2F2E, 'M', u'巛'), - (0x2F2F, 'M', u'工'), - (0x2F30, 'M', u'己'), - (0x2F31, 'M', u'巾'), - (0x2F32, 'M', u'干'), - (0x2F33, 'M', u'幺'), - (0x2F34, 'M', u'广'), - (0x2F35, 'M', u'廴'), - (0x2F36, 'M', u'廾'), - (0x2F37, 'M', u'弋'), - (0x2F38, 'M', u'弓'), - (0x2F39, 'M', u'彐'), - (0x2F3A, 'M', u'彡'), - (0x2F3B, 'M', u'彳'), - (0x2F3C, 'M', u'心'), - (0x2F3D, 'M', u'戈'), - (0x2F3E, 'M', u'戶'), - (0x2F3F, 'M', u'手'), - (0x2F40, 'M', u'支'), - (0x2F41, 'M', u'攴'), - (0x2F42, 'M', u'文'), - (0x2F43, 'M', u'斗'), - (0x2F44, 'M', u'斤'), - (0x2F45, 'M', u'方'), - (0x2F46, 'M', u'无'), - (0x2F47, 'M', u'日'), - (0x2F48, 'M', u'曰'), - (0x2F49, 'M', u'月'), - (0x2F4A, 'M', u'木'), - (0x2F4B, 'M', u'欠'), - (0x2F4C, 'M', u'止'), - (0x2F4D, 'M', u'歹'), - (0x2F4E, 'M', u'殳'), - (0x2F4F, 'M', u'毋'), - (0x2F50, 'M', u'比'), - (0x2F51, 'M', u'毛'), - (0x2F52, 'M', u'氏'), - (0x2F53, 'M', u'气'), - (0x2F54, 'M', u'水'), - (0x2F55, 'M', u'火'), - (0x2F56, 'M', u'爪'), - (0x2F57, 'M', u'父'), - (0x2F58, 'M', u'爻'), - (0x2F59, 'M', u'爿'), - (0x2F5A, 'M', u'片'), - (0x2F5B, 'M', u'牙'), - (0x2F5C, 'M', u'牛'), - (0x2F5D, 'M', u'犬'), - (0x2F5E, 'M', u'玄'), - (0x2F5F, 'M', u'玉'), - (0x2F60, 'M', u'瓜'), - (0x2F61, 'M', u'瓦'), - (0x2F62, 'M', u'甘'), - (0x2F63, 'M', u'生'), - (0x2F64, 'M', u'用'), - (0x2F65, 'M', u'田'), - (0x2F66, 'M', u'疋'), - (0x2F67, 'M', u'疒'), - (0x2F68, 'M', u'癶'), - (0x2F69, 'M', u'白'), - (0x2F6A, 'M', u'皮'), - (0x2F6B, 'M', u'皿'), - (0x2F6C, 'M', u'目'), - (0x2F6D, 'M', u'矛'), - (0x2F6E, 'M', u'矢'), - (0x2F6F, 'M', u'石'), - (0x2F70, 'M', u'示'), - (0x2F71, 'M', u'禸'), - (0x2F72, 'M', u'禾'), - (0x2F73, 'M', u'穴'), - (0x2F74, 'M', u'立'), - (0x2F75, 'M', u'竹'), - (0x2F76, 'M', u'米'), - (0x2F77, 'M', u'糸'), - (0x2F78, 'M', u'缶'), - (0x2F79, 'M', u'网'), - (0x2F7A, 'M', u'羊'), - (0x2F7B, 'M', u'羽'), - (0x2F7C, 'M', u'老'), - (0x2F7D, 'M', u'而'), - (0x2F7E, 'M', u'耒'), - (0x2F7F, 'M', u'耳'), - (0x2F80, 'M', u'聿'), - (0x2F81, 'M', u'肉'), - (0x2F82, 'M', u'臣'), - (0x2F83, 'M', u'自'), - (0x2F84, 'M', u'至'), - (0x2F85, 'M', u'臼'), - (0x2F86, 'M', u'舌'), - (0x2F87, 'M', u'舛'), - (0x2F88, 'M', u'舟'), - (0x2F89, 'M', u'艮'), - (0x2F8A, 'M', u'色'), - (0x2F8B, 'M', u'艸'), - (0x2F8C, 'M', u'虍'), - (0x2F8D, 'M', u'虫'), - (0x2F8E, 'M', u'血'), - (0x2F8F, 'M', u'行'), - (0x2F90, 'M', u'衣'), - (0x2F91, 'M', u'襾'), - ] - -def _seg_28(): - return [ - (0x2F92, 'M', u'見'), - (0x2F93, 'M', u'角'), - (0x2F94, 'M', u'言'), - (0x2F95, 'M', u'谷'), - (0x2F96, 'M', u'豆'), - (0x2F97, 'M', u'豕'), - (0x2F98, 'M', u'豸'), - (0x2F99, 'M', u'貝'), - (0x2F9A, 'M', u'赤'), - (0x2F9B, 'M', u'走'), - (0x2F9C, 'M', u'足'), - (0x2F9D, 'M', u'身'), - (0x2F9E, 'M', u'車'), - (0x2F9F, 'M', u'辛'), - (0x2FA0, 'M', u'辰'), - (0x2FA1, 'M', u'辵'), - (0x2FA2, 'M', u'邑'), - (0x2FA3, 'M', u'酉'), - (0x2FA4, 'M', u'釆'), - (0x2FA5, 'M', u'里'), - (0x2FA6, 'M', u'金'), - (0x2FA7, 'M', u'長'), - (0x2FA8, 'M', u'門'), - (0x2FA9, 'M', u'阜'), - (0x2FAA, 'M', u'隶'), - (0x2FAB, 'M', u'隹'), - (0x2FAC, 'M', u'雨'), - (0x2FAD, 'M', u'靑'), - (0x2FAE, 'M', u'非'), - (0x2FAF, 'M', u'面'), - (0x2FB0, 'M', u'革'), - (0x2FB1, 'M', u'韋'), - (0x2FB2, 'M', u'韭'), - (0x2FB3, 'M', u'音'), - (0x2FB4, 'M', u'頁'), - (0x2FB5, 'M', u'風'), - (0x2FB6, 'M', u'飛'), - (0x2FB7, 'M', u'食'), - (0x2FB8, 'M', u'首'), - (0x2FB9, 'M', u'香'), - (0x2FBA, 'M', u'馬'), - (0x2FBB, 'M', u'骨'), - (0x2FBC, 'M', u'高'), - (0x2FBD, 'M', u'髟'), - (0x2FBE, 'M', u'鬥'), - (0x2FBF, 'M', u'鬯'), - (0x2FC0, 'M', u'鬲'), - (0x2FC1, 'M', u'鬼'), - (0x2FC2, 'M', u'魚'), - (0x2FC3, 'M', u'鳥'), - (0x2FC4, 'M', u'鹵'), - (0x2FC5, 'M', u'鹿'), - (0x2FC6, 'M', u'麥'), - (0x2FC7, 'M', u'麻'), - (0x2FC8, 'M', u'黃'), - (0x2FC9, 'M', u'黍'), - (0x2FCA, 'M', u'黑'), - (0x2FCB, 'M', u'黹'), - (0x2FCC, 'M', u'黽'), - (0x2FCD, 'M', u'鼎'), - (0x2FCE, 'M', u'鼓'), - (0x2FCF, 'M', u'鼠'), - (0x2FD0, 'M', u'鼻'), - (0x2FD1, 'M', u'齊'), - (0x2FD2, 'M', u'齒'), - (0x2FD3, 'M', u'龍'), - (0x2FD4, 'M', u'龜'), - (0x2FD5, 'M', u'龠'), - (0x2FD6, 'X'), - (0x3000, '3', u' '), - (0x3001, 'V'), - (0x3002, 'M', u'.'), - (0x3003, 'V'), - (0x3036, 'M', u'〒'), - (0x3037, 'V'), - (0x3038, 'M', u'十'), - (0x3039, 'M', u'卄'), - (0x303A, 'M', u'卅'), - (0x303B, 'V'), - (0x3040, 'X'), - (0x3041, 'V'), - (0x3097, 'X'), - (0x3099, 'V'), - (0x309B, '3', u' ゙'), - (0x309C, '3', u' ゚'), - (0x309D, 'V'), - (0x309F, 'M', u'より'), - (0x30A0, 'V'), - (0x30FF, 'M', u'コト'), - (0x3100, 'X'), - (0x3105, 'V'), - (0x3130, 'X'), - (0x3131, 'M', u'ᄀ'), - (0x3132, 'M', u'ᄁ'), - (0x3133, 'M', u'ᆪ'), - (0x3134, 'M', u'ᄂ'), - (0x3135, 'M', u'ᆬ'), - (0x3136, 'M', u'ᆭ'), - (0x3137, 'M', u'ᄃ'), - (0x3138, 'M', u'ᄄ'), - ] - -def _seg_29(): - return [ - (0x3139, 'M', u'ᄅ'), - (0x313A, 'M', u'ᆰ'), - (0x313B, 'M', u'ᆱ'), - (0x313C, 'M', u'ᆲ'), - (0x313D, 'M', u'ᆳ'), - (0x313E, 'M', u'ᆴ'), - (0x313F, 'M', u'ᆵ'), - (0x3140, 'M', u'ᄚ'), - (0x3141, 'M', u'ᄆ'), - (0x3142, 'M', u'ᄇ'), - (0x3143, 'M', u'ᄈ'), - (0x3144, 'M', u'ᄡ'), - (0x3145, 'M', u'ᄉ'), - (0x3146, 'M', u'ᄊ'), - (0x3147, 'M', u'ᄋ'), - (0x3148, 'M', u'ᄌ'), - (0x3149, 'M', u'ᄍ'), - (0x314A, 'M', u'ᄎ'), - (0x314B, 'M', u'ᄏ'), - (0x314C, 'M', u'ᄐ'), - (0x314D, 'M', u'ᄑ'), - (0x314E, 'M', u'ᄒ'), - (0x314F, 'M', u'ᅡ'), - (0x3150, 'M', u'ᅢ'), - (0x3151, 'M', u'ᅣ'), - (0x3152, 'M', u'ᅤ'), - (0x3153, 'M', u'ᅥ'), - (0x3154, 'M', u'ᅦ'), - (0x3155, 'M', u'ᅧ'), - (0x3156, 'M', u'ᅨ'), - (0x3157, 'M', u'ᅩ'), - (0x3158, 'M', u'ᅪ'), - (0x3159, 'M', u'ᅫ'), - (0x315A, 'M', u'ᅬ'), - (0x315B, 'M', u'ᅭ'), - (0x315C, 'M', u'ᅮ'), - (0x315D, 'M', u'ᅯ'), - (0x315E, 'M', u'ᅰ'), - (0x315F, 'M', u'ᅱ'), - (0x3160, 'M', u'ᅲ'), - (0x3161, 'M', u'ᅳ'), - (0x3162, 'M', u'ᅴ'), - (0x3163, 'M', u'ᅵ'), - (0x3164, 'X'), - (0x3165, 'M', u'ᄔ'), - (0x3166, 'M', u'ᄕ'), - (0x3167, 'M', u'ᇇ'), - (0x3168, 'M', u'ᇈ'), - (0x3169, 'M', u'ᇌ'), - (0x316A, 'M', u'ᇎ'), - (0x316B, 'M', u'ᇓ'), - (0x316C, 'M', u'ᇗ'), - (0x316D, 'M', u'ᇙ'), - (0x316E, 'M', u'ᄜ'), - (0x316F, 'M', u'ᇝ'), - (0x3170, 'M', u'ᇟ'), - (0x3171, 'M', u'ᄝ'), - (0x3172, 'M', u'ᄞ'), - (0x3173, 'M', u'ᄠ'), - (0x3174, 'M', u'ᄢ'), - (0x3175, 'M', u'ᄣ'), - (0x3176, 'M', u'ᄧ'), - (0x3177, 'M', u'ᄩ'), - (0x3178, 'M', u'ᄫ'), - (0x3179, 'M', u'ᄬ'), - (0x317A, 'M', u'ᄭ'), - (0x317B, 'M', u'ᄮ'), - (0x317C, 'M', u'ᄯ'), - (0x317D, 'M', u'ᄲ'), - (0x317E, 'M', u'ᄶ'), - (0x317F, 'M', u'ᅀ'), - (0x3180, 'M', u'ᅇ'), - (0x3181, 'M', u'ᅌ'), - (0x3182, 'M', u'ᇱ'), - (0x3183, 'M', u'ᇲ'), - (0x3184, 'M', u'ᅗ'), - (0x3185, 'M', u'ᅘ'), - (0x3186, 'M', u'ᅙ'), - (0x3187, 'M', u'ᆄ'), - (0x3188, 'M', u'ᆅ'), - (0x3189, 'M', u'ᆈ'), - (0x318A, 'M', u'ᆑ'), - (0x318B, 'M', u'ᆒ'), - (0x318C, 'M', u'ᆔ'), - (0x318D, 'M', u'ᆞ'), - (0x318E, 'M', u'ᆡ'), - (0x318F, 'X'), - (0x3190, 'V'), - (0x3192, 'M', u'一'), - (0x3193, 'M', u'二'), - (0x3194, 'M', u'三'), - (0x3195, 'M', u'四'), - (0x3196, 'M', u'上'), - (0x3197, 'M', u'中'), - (0x3198, 'M', u'下'), - (0x3199, 'M', u'甲'), - (0x319A, 'M', u'乙'), - (0x319B, 'M', u'丙'), - (0x319C, 'M', u'丁'), - (0x319D, 'M', u'天'), - ] - -def _seg_30(): - return [ - (0x319E, 'M', u'地'), - (0x319F, 'M', u'人'), - (0x31A0, 'V'), - (0x31BB, 'X'), - (0x31C0, 'V'), - (0x31E4, 'X'), - (0x31F0, 'V'), - (0x3200, '3', u'(ᄀ)'), - (0x3201, '3', u'(ᄂ)'), - (0x3202, '3', u'(ᄃ)'), - (0x3203, '3', u'(ᄅ)'), - (0x3204, '3', u'(ᄆ)'), - (0x3205, '3', u'(ᄇ)'), - (0x3206, '3', u'(ᄉ)'), - (0x3207, '3', u'(ᄋ)'), - (0x3208, '3', u'(ᄌ)'), - (0x3209, '3', u'(ᄎ)'), - (0x320A, '3', u'(ᄏ)'), - (0x320B, '3', u'(ᄐ)'), - (0x320C, '3', u'(ᄑ)'), - (0x320D, '3', u'(ᄒ)'), - (0x320E, '3', u'(가)'), - (0x320F, '3', u'(나)'), - (0x3210, '3', u'(다)'), - (0x3211, '3', u'(라)'), - (0x3212, '3', u'(마)'), - (0x3213, '3', u'(바)'), - (0x3214, '3', u'(사)'), - (0x3215, '3', u'(아)'), - (0x3216, '3', u'(자)'), - (0x3217, '3', u'(차)'), - (0x3218, '3', u'(카)'), - (0x3219, '3', u'(타)'), - (0x321A, '3', u'(파)'), - (0x321B, '3', u'(하)'), - (0x321C, '3', u'(주)'), - (0x321D, '3', u'(오전)'), - (0x321E, '3', u'(오후)'), - (0x321F, 'X'), - (0x3220, '3', u'(一)'), - (0x3221, '3', u'(二)'), - (0x3222, '3', u'(三)'), - (0x3223, '3', u'(四)'), - (0x3224, '3', u'(五)'), - (0x3225, '3', u'(六)'), - (0x3226, '3', u'(七)'), - (0x3227, '3', u'(八)'), - (0x3228, '3', u'(九)'), - (0x3229, '3', u'(十)'), - (0x322A, '3', u'(月)'), - (0x322B, '3', u'(火)'), - (0x322C, '3', u'(水)'), - (0x322D, '3', u'(木)'), - (0x322E, '3', u'(金)'), - (0x322F, '3', u'(土)'), - (0x3230, '3', u'(日)'), - (0x3231, '3', u'(株)'), - (0x3232, '3', u'(有)'), - (0x3233, '3', u'(社)'), - (0x3234, '3', u'(名)'), - (0x3235, '3', u'(特)'), - (0x3236, '3', u'(財)'), - (0x3237, '3', u'(祝)'), - (0x3238, '3', u'(労)'), - (0x3239, '3', u'(代)'), - (0x323A, '3', u'(呼)'), - (0x323B, '3', u'(学)'), - (0x323C, '3', u'(監)'), - (0x323D, '3', u'(企)'), - (0x323E, '3', u'(資)'), - (0x323F, '3', u'(協)'), - (0x3240, '3', u'(祭)'), - (0x3241, '3', u'(休)'), - (0x3242, '3', u'(自)'), - (0x3243, '3', u'(至)'), - (0x3244, 'M', u'問'), - (0x3245, 'M', u'幼'), - (0x3246, 'M', u'文'), - (0x3247, 'M', u'箏'), - (0x3248, 'V'), - (0x3250, 'M', u'pte'), - (0x3251, 'M', u'21'), - (0x3252, 'M', u'22'), - (0x3253, 'M', u'23'), - (0x3254, 'M', u'24'), - (0x3255, 'M', u'25'), - (0x3256, 'M', u'26'), - (0x3257, 'M', u'27'), - (0x3258, 'M', u'28'), - (0x3259, 'M', u'29'), - (0x325A, 'M', u'30'), - (0x325B, 'M', u'31'), - (0x325C, 'M', u'32'), - (0x325D, 'M', u'33'), - (0x325E, 'M', u'34'), - (0x325F, 'M', u'35'), - (0x3260, 'M', u'ᄀ'), - (0x3261, 'M', u'ᄂ'), - (0x3262, 'M', u'ᄃ'), - (0x3263, 'M', u'ᄅ'), - ] - -def _seg_31(): - return [ - (0x3264, 'M', u'ᄆ'), - (0x3265, 'M', u'ᄇ'), - (0x3266, 'M', u'ᄉ'), - (0x3267, 'M', u'ᄋ'), - (0x3268, 'M', u'ᄌ'), - (0x3269, 'M', u'ᄎ'), - (0x326A, 'M', u'ᄏ'), - (0x326B, 'M', u'ᄐ'), - (0x326C, 'M', u'ᄑ'), - (0x326D, 'M', u'ᄒ'), - (0x326E, 'M', u'가'), - (0x326F, 'M', u'나'), - (0x3270, 'M', u'다'), - (0x3271, 'M', u'라'), - (0x3272, 'M', u'마'), - (0x3273, 'M', u'바'), - (0x3274, 'M', u'사'), - (0x3275, 'M', u'아'), - (0x3276, 'M', u'자'), - (0x3277, 'M', u'차'), - (0x3278, 'M', u'카'), - (0x3279, 'M', u'타'), - (0x327A, 'M', u'파'), - (0x327B, 'M', u'하'), - (0x327C, 'M', u'참고'), - (0x327D, 'M', u'주의'), - (0x327E, 'M', u'우'), - (0x327F, 'V'), - (0x3280, 'M', u'一'), - (0x3281, 'M', u'二'), - (0x3282, 'M', u'三'), - (0x3283, 'M', u'四'), - (0x3284, 'M', u'五'), - (0x3285, 'M', u'六'), - (0x3286, 'M', u'七'), - (0x3287, 'M', u'八'), - (0x3288, 'M', u'九'), - (0x3289, 'M', u'十'), - (0x328A, 'M', u'月'), - (0x328B, 'M', u'火'), - (0x328C, 'M', u'水'), - (0x328D, 'M', u'木'), - (0x328E, 'M', u'金'), - (0x328F, 'M', u'土'), - (0x3290, 'M', u'日'), - (0x3291, 'M', u'株'), - (0x3292, 'M', u'有'), - (0x3293, 'M', u'社'), - (0x3294, 'M', u'名'), - (0x3295, 'M', u'特'), - (0x3296, 'M', u'財'), - (0x3297, 'M', u'祝'), - (0x3298, 'M', u'労'), - (0x3299, 'M', u'秘'), - (0x329A, 'M', u'男'), - (0x329B, 'M', u'女'), - (0x329C, 'M', u'適'), - (0x329D, 'M', u'優'), - (0x329E, 'M', u'印'), - (0x329F, 'M', u'注'), - (0x32A0, 'M', u'項'), - (0x32A1, 'M', u'休'), - (0x32A2, 'M', u'写'), - (0x32A3, 'M', u'正'), - (0x32A4, 'M', u'上'), - (0x32A5, 'M', u'中'), - (0x32A6, 'M', u'下'), - (0x32A7, 'M', u'左'), - (0x32A8, 'M', u'右'), - (0x32A9, 'M', u'医'), - (0x32AA, 'M', u'宗'), - (0x32AB, 'M', u'学'), - (0x32AC, 'M', u'監'), - (0x32AD, 'M', u'企'), - (0x32AE, 'M', u'資'), - (0x32AF, 'M', u'協'), - (0x32B0, 'M', u'夜'), - (0x32B1, 'M', u'36'), - (0x32B2, 'M', u'37'), - (0x32B3, 'M', u'38'), - (0x32B4, 'M', u'39'), - (0x32B5, 'M', u'40'), - (0x32B6, 'M', u'41'), - (0x32B7, 'M', u'42'), - (0x32B8, 'M', u'43'), - (0x32B9, 'M', u'44'), - (0x32BA, 'M', u'45'), - (0x32BB, 'M', u'46'), - (0x32BC, 'M', u'47'), - (0x32BD, 'M', u'48'), - (0x32BE, 'M', u'49'), - (0x32BF, 'M', u'50'), - (0x32C0, 'M', u'1月'), - (0x32C1, 'M', u'2月'), - (0x32C2, 'M', u'3月'), - (0x32C3, 'M', u'4月'), - (0x32C4, 'M', u'5月'), - (0x32C5, 'M', u'6月'), - (0x32C6, 'M', u'7月'), - (0x32C7, 'M', u'8月'), - ] - -def _seg_32(): - return [ - (0x32C8, 'M', u'9月'), - (0x32C9, 'M', u'10月'), - (0x32CA, 'M', u'11月'), - (0x32CB, 'M', u'12月'), - (0x32CC, 'M', u'hg'), - (0x32CD, 'M', u'erg'), - (0x32CE, 'M', u'ev'), - (0x32CF, 'M', u'ltd'), - (0x32D0, 'M', u'ア'), - (0x32D1, 'M', u'イ'), - (0x32D2, 'M', u'ウ'), - (0x32D3, 'M', u'エ'), - (0x32D4, 'M', u'オ'), - (0x32D5, 'M', u'カ'), - (0x32D6, 'M', u'キ'), - (0x32D7, 'M', u'ク'), - (0x32D8, 'M', u'ケ'), - (0x32D9, 'M', u'コ'), - (0x32DA, 'M', u'サ'), - (0x32DB, 'M', u'シ'), - (0x32DC, 'M', u'ス'), - (0x32DD, 'M', u'セ'), - (0x32DE, 'M', u'ソ'), - (0x32DF, 'M', u'タ'), - (0x32E0, 'M', u'チ'), - (0x32E1, 'M', u'ツ'), - (0x32E2, 'M', u'テ'), - (0x32E3, 'M', u'ト'), - (0x32E4, 'M', u'ナ'), - (0x32E5, 'M', u'ニ'), - (0x32E6, 'M', u'ヌ'), - (0x32E7, 'M', u'ネ'), - (0x32E8, 'M', u'ノ'), - (0x32E9, 'M', u'ハ'), - (0x32EA, 'M', u'ヒ'), - (0x32EB, 'M', u'フ'), - (0x32EC, 'M', u'ヘ'), - (0x32ED, 'M', u'ホ'), - (0x32EE, 'M', u'マ'), - (0x32EF, 'M', u'ミ'), - (0x32F0, 'M', u'ム'), - (0x32F1, 'M', u'メ'), - (0x32F2, 'M', u'モ'), - (0x32F3, 'M', u'ヤ'), - (0x32F4, 'M', u'ユ'), - (0x32F5, 'M', u'ヨ'), - (0x32F6, 'M', u'ラ'), - (0x32F7, 'M', u'リ'), - (0x32F8, 'M', u'ル'), - (0x32F9, 'M', u'レ'), - (0x32FA, 'M', u'ロ'), - (0x32FB, 'M', u'ワ'), - (0x32FC, 'M', u'ヰ'), - (0x32FD, 'M', u'ヱ'), - (0x32FE, 'M', u'ヲ'), - (0x32FF, 'X'), - (0x3300, 'M', u'アパート'), - (0x3301, 'M', u'アルファ'), - (0x3302, 'M', u'アンペア'), - (0x3303, 'M', u'アール'), - (0x3304, 'M', u'イニング'), - (0x3305, 'M', u'インチ'), - (0x3306, 'M', u'ウォン'), - (0x3307, 'M', u'エスクード'), - (0x3308, 'M', u'エーカー'), - (0x3309, 'M', u'オンス'), - (0x330A, 'M', u'オーム'), - (0x330B, 'M', u'カイリ'), - (0x330C, 'M', u'カラット'), - (0x330D, 'M', u'カロリー'), - (0x330E, 'M', u'ガロン'), - (0x330F, 'M', u'ガンマ'), - (0x3310, 'M', u'ギガ'), - (0x3311, 'M', u'ギニー'), - (0x3312, 'M', u'キュリー'), - (0x3313, 'M', u'ギルダー'), - (0x3314, 'M', u'キロ'), - (0x3315, 'M', u'キログラム'), - (0x3316, 'M', u'キロメートル'), - (0x3317, 'M', u'キロワット'), - (0x3318, 'M', u'グラム'), - (0x3319, 'M', u'グラムトン'), - (0x331A, 'M', u'クルゼイロ'), - (0x331B, 'M', u'クローネ'), - (0x331C, 'M', u'ケース'), - (0x331D, 'M', u'コルナ'), - (0x331E, 'M', u'コーポ'), - (0x331F, 'M', u'サイクル'), - (0x3320, 'M', u'サンチーム'), - (0x3321, 'M', u'シリング'), - (0x3322, 'M', u'センチ'), - (0x3323, 'M', u'セント'), - (0x3324, 'M', u'ダース'), - (0x3325, 'M', u'デシ'), - (0x3326, 'M', u'ドル'), - (0x3327, 'M', u'トン'), - (0x3328, 'M', u'ナノ'), - (0x3329, 'M', u'ノット'), - (0x332A, 'M', u'ハイツ'), - (0x332B, 'M', u'パーセント'), - ] - -def _seg_33(): - return [ - (0x332C, 'M', u'パーツ'), - (0x332D, 'M', u'バーレル'), - (0x332E, 'M', u'ピアストル'), - (0x332F, 'M', u'ピクル'), - (0x3330, 'M', u'ピコ'), - (0x3331, 'M', u'ビル'), - (0x3332, 'M', u'ファラッド'), - (0x3333, 'M', u'フィート'), - (0x3334, 'M', u'ブッシェル'), - (0x3335, 'M', u'フラン'), - (0x3336, 'M', u'ヘクタール'), - (0x3337, 'M', u'ペソ'), - (0x3338, 'M', u'ペニヒ'), - (0x3339, 'M', u'ヘルツ'), - (0x333A, 'M', u'ペンス'), - (0x333B, 'M', u'ページ'), - (0x333C, 'M', u'ベータ'), - (0x333D, 'M', u'ポイント'), - (0x333E, 'M', u'ボルト'), - (0x333F, 'M', u'ホン'), - (0x3340, 'M', u'ポンド'), - (0x3341, 'M', u'ホール'), - (0x3342, 'M', u'ホーン'), - (0x3343, 'M', u'マイクロ'), - (0x3344, 'M', u'マイル'), - (0x3345, 'M', u'マッハ'), - (0x3346, 'M', u'マルク'), - (0x3347, 'M', u'マンション'), - (0x3348, 'M', u'ミクロン'), - (0x3349, 'M', u'ミリ'), - (0x334A, 'M', u'ミリバール'), - (0x334B, 'M', u'メガ'), - (0x334C, 'M', u'メガトン'), - (0x334D, 'M', u'メートル'), - (0x334E, 'M', u'ヤード'), - (0x334F, 'M', u'ヤール'), - (0x3350, 'M', u'ユアン'), - (0x3351, 'M', u'リットル'), - (0x3352, 'M', u'リラ'), - (0x3353, 'M', u'ルピー'), - (0x3354, 'M', u'ルーブル'), - (0x3355, 'M', u'レム'), - (0x3356, 'M', u'レントゲン'), - (0x3357, 'M', u'ワット'), - (0x3358, 'M', u'0点'), - (0x3359, 'M', u'1点'), - (0x335A, 'M', u'2点'), - (0x335B, 'M', u'3点'), - (0x335C, 'M', u'4点'), - (0x335D, 'M', u'5点'), - (0x335E, 'M', u'6点'), - (0x335F, 'M', u'7点'), - (0x3360, 'M', u'8点'), - (0x3361, 'M', u'9点'), - (0x3362, 'M', u'10点'), - (0x3363, 'M', u'11点'), - (0x3364, 'M', u'12点'), - (0x3365, 'M', u'13点'), - (0x3366, 'M', u'14点'), - (0x3367, 'M', u'15点'), - (0x3368, 'M', u'16点'), - (0x3369, 'M', u'17点'), - (0x336A, 'M', u'18点'), - (0x336B, 'M', u'19点'), - (0x336C, 'M', u'20点'), - (0x336D, 'M', u'21点'), - (0x336E, 'M', u'22点'), - (0x336F, 'M', u'23点'), - (0x3370, 'M', u'24点'), - (0x3371, 'M', u'hpa'), - (0x3372, 'M', u'da'), - (0x3373, 'M', u'au'), - (0x3374, 'M', u'bar'), - (0x3375, 'M', u'ov'), - (0x3376, 'M', u'pc'), - (0x3377, 'M', u'dm'), - (0x3378, 'M', u'dm2'), - (0x3379, 'M', u'dm3'), - (0x337A, 'M', u'iu'), - (0x337B, 'M', u'平成'), - (0x337C, 'M', u'昭和'), - (0x337D, 'M', u'大正'), - (0x337E, 'M', u'明治'), - (0x337F, 'M', u'株式会社'), - (0x3380, 'M', u'pa'), - (0x3381, 'M', u'na'), - (0x3382, 'M', u'μa'), - (0x3383, 'M', u'ma'), - (0x3384, 'M', u'ka'), - (0x3385, 'M', u'kb'), - (0x3386, 'M', u'mb'), - (0x3387, 'M', u'gb'), - (0x3388, 'M', u'cal'), - (0x3389, 'M', u'kcal'), - (0x338A, 'M', u'pf'), - (0x338B, 'M', u'nf'), - (0x338C, 'M', u'μf'), - (0x338D, 'M', u'μg'), - (0x338E, 'M', u'mg'), - (0x338F, 'M', u'kg'), - ] - -def _seg_34(): - return [ - (0x3390, 'M', u'hz'), - (0x3391, 'M', u'khz'), - (0x3392, 'M', u'mhz'), - (0x3393, 'M', u'ghz'), - (0x3394, 'M', u'thz'), - (0x3395, 'M', u'μl'), - (0x3396, 'M', u'ml'), - (0x3397, 'M', u'dl'), - (0x3398, 'M', u'kl'), - (0x3399, 'M', u'fm'), - (0x339A, 'M', u'nm'), - (0x339B, 'M', u'μm'), - (0x339C, 'M', u'mm'), - (0x339D, 'M', u'cm'), - (0x339E, 'M', u'km'), - (0x339F, 'M', u'mm2'), - (0x33A0, 'M', u'cm2'), - (0x33A1, 'M', u'm2'), - (0x33A2, 'M', u'km2'), - (0x33A3, 'M', u'mm3'), - (0x33A4, 'M', u'cm3'), - (0x33A5, 'M', u'm3'), - (0x33A6, 'M', u'km3'), - (0x33A7, 'M', u'm∕s'), - (0x33A8, 'M', u'm∕s2'), - (0x33A9, 'M', u'pa'), - (0x33AA, 'M', u'kpa'), - (0x33AB, 'M', u'mpa'), - (0x33AC, 'M', u'gpa'), - (0x33AD, 'M', u'rad'), - (0x33AE, 'M', u'rad∕s'), - (0x33AF, 'M', u'rad∕s2'), - (0x33B0, 'M', u'ps'), - (0x33B1, 'M', u'ns'), - (0x33B2, 'M', u'μs'), - (0x33B3, 'M', u'ms'), - (0x33B4, 'M', u'pv'), - (0x33B5, 'M', u'nv'), - (0x33B6, 'M', u'μv'), - (0x33B7, 'M', u'mv'), - (0x33B8, 'M', u'kv'), - (0x33B9, 'M', u'mv'), - (0x33BA, 'M', u'pw'), - (0x33BB, 'M', u'nw'), - (0x33BC, 'M', u'μw'), - (0x33BD, 'M', u'mw'), - (0x33BE, 'M', u'kw'), - (0x33BF, 'M', u'mw'), - (0x33C0, 'M', u'kω'), - (0x33C1, 'M', u'mω'), - (0x33C2, 'X'), - (0x33C3, 'M', u'bq'), - (0x33C4, 'M', u'cc'), - (0x33C5, 'M', u'cd'), - (0x33C6, 'M', u'c∕kg'), - (0x33C7, 'X'), - (0x33C8, 'M', u'db'), - (0x33C9, 'M', u'gy'), - (0x33CA, 'M', u'ha'), - (0x33CB, 'M', u'hp'), - (0x33CC, 'M', u'in'), - (0x33CD, 'M', u'kk'), - (0x33CE, 'M', u'km'), - (0x33CF, 'M', u'kt'), - (0x33D0, 'M', u'lm'), - (0x33D1, 'M', u'ln'), - (0x33D2, 'M', u'log'), - (0x33D3, 'M', u'lx'), - (0x33D4, 'M', u'mb'), - (0x33D5, 'M', u'mil'), - (0x33D6, 'M', u'mol'), - (0x33D7, 'M', u'ph'), - (0x33D8, 'X'), - (0x33D9, 'M', u'ppm'), - (0x33DA, 'M', u'pr'), - (0x33DB, 'M', u'sr'), - (0x33DC, 'M', u'sv'), - (0x33DD, 'M', u'wb'), - (0x33DE, 'M', u'v∕m'), - (0x33DF, 'M', u'a∕m'), - (0x33E0, 'M', u'1日'), - (0x33E1, 'M', u'2日'), - (0x33E2, 'M', u'3日'), - (0x33E3, 'M', u'4日'), - (0x33E4, 'M', u'5日'), - (0x33E5, 'M', u'6日'), - (0x33E6, 'M', u'7日'), - (0x33E7, 'M', u'8日'), - (0x33E8, 'M', u'9日'), - (0x33E9, 'M', u'10日'), - (0x33EA, 'M', u'11日'), - (0x33EB, 'M', u'12日'), - (0x33EC, 'M', u'13日'), - (0x33ED, 'M', u'14日'), - (0x33EE, 'M', u'15日'), - (0x33EF, 'M', u'16日'), - (0x33F0, 'M', u'17日'), - (0x33F1, 'M', u'18日'), - (0x33F2, 'M', u'19日'), - (0x33F3, 'M', u'20日'), - ] - -def _seg_35(): - return [ - (0x33F4, 'M', u'21日'), - (0x33F5, 'M', u'22日'), - (0x33F6, 'M', u'23日'), - (0x33F7, 'M', u'24日'), - (0x33F8, 'M', u'25日'), - (0x33F9, 'M', u'26日'), - (0x33FA, 'M', u'27日'), - (0x33FB, 'M', u'28日'), - (0x33FC, 'M', u'29日'), - (0x33FD, 'M', u'30日'), - (0x33FE, 'M', u'31日'), - (0x33FF, 'M', u'gal'), - (0x3400, 'V'), - (0x4DB6, 'X'), - (0x4DC0, 'V'), - (0x9FF0, 'X'), - (0xA000, 'V'), - (0xA48D, 'X'), - (0xA490, 'V'), - (0xA4C7, 'X'), - (0xA4D0, 'V'), - (0xA62C, 'X'), - (0xA640, 'M', u'ꙁ'), - (0xA641, 'V'), - (0xA642, 'M', u'ꙃ'), - (0xA643, 'V'), - (0xA644, 'M', u'ꙅ'), - (0xA645, 'V'), - (0xA646, 'M', u'ꙇ'), - (0xA647, 'V'), - (0xA648, 'M', u'ꙉ'), - (0xA649, 'V'), - (0xA64A, 'M', u'ꙋ'), - (0xA64B, 'V'), - (0xA64C, 'M', u'ꙍ'), - (0xA64D, 'V'), - (0xA64E, 'M', u'ꙏ'), - (0xA64F, 'V'), - (0xA650, 'M', u'ꙑ'), - (0xA651, 'V'), - (0xA652, 'M', u'ꙓ'), - (0xA653, 'V'), - (0xA654, 'M', u'ꙕ'), - (0xA655, 'V'), - (0xA656, 'M', u'ꙗ'), - (0xA657, 'V'), - (0xA658, 'M', u'ꙙ'), - (0xA659, 'V'), - (0xA65A, 'M', u'ꙛ'), - (0xA65B, 'V'), - (0xA65C, 'M', u'ꙝ'), - (0xA65D, 'V'), - (0xA65E, 'M', u'ꙟ'), - (0xA65F, 'V'), - (0xA660, 'M', u'ꙡ'), - (0xA661, 'V'), - (0xA662, 'M', u'ꙣ'), - (0xA663, 'V'), - (0xA664, 'M', u'ꙥ'), - (0xA665, 'V'), - (0xA666, 'M', u'ꙧ'), - (0xA667, 'V'), - (0xA668, 'M', u'ꙩ'), - (0xA669, 'V'), - (0xA66A, 'M', u'ꙫ'), - (0xA66B, 'V'), - (0xA66C, 'M', u'ꙭ'), - (0xA66D, 'V'), - (0xA680, 'M', u'ꚁ'), - (0xA681, 'V'), - (0xA682, 'M', u'ꚃ'), - (0xA683, 'V'), - (0xA684, 'M', u'ꚅ'), - (0xA685, 'V'), - (0xA686, 'M', u'ꚇ'), - (0xA687, 'V'), - (0xA688, 'M', u'ꚉ'), - (0xA689, 'V'), - (0xA68A, 'M', u'ꚋ'), - (0xA68B, 'V'), - (0xA68C, 'M', u'ꚍ'), - (0xA68D, 'V'), - (0xA68E, 'M', u'ꚏ'), - (0xA68F, 'V'), - (0xA690, 'M', u'ꚑ'), - (0xA691, 'V'), - (0xA692, 'M', u'ꚓ'), - (0xA693, 'V'), - (0xA694, 'M', u'ꚕ'), - (0xA695, 'V'), - (0xA696, 'M', u'ꚗ'), - (0xA697, 'V'), - (0xA698, 'M', u'ꚙ'), - (0xA699, 'V'), - (0xA69A, 'M', u'ꚛ'), - (0xA69B, 'V'), - (0xA69C, 'M', u'ъ'), - (0xA69D, 'M', u'ь'), - (0xA69E, 'V'), - (0xA6F8, 'X'), - ] - -def _seg_36(): - return [ - (0xA700, 'V'), - (0xA722, 'M', u'ꜣ'), - (0xA723, 'V'), - (0xA724, 'M', u'ꜥ'), - (0xA725, 'V'), - (0xA726, 'M', u'ꜧ'), - (0xA727, 'V'), - (0xA728, 'M', u'ꜩ'), - (0xA729, 'V'), - (0xA72A, 'M', u'ꜫ'), - (0xA72B, 'V'), - (0xA72C, 'M', u'ꜭ'), - (0xA72D, 'V'), - (0xA72E, 'M', u'ꜯ'), - (0xA72F, 'V'), - (0xA732, 'M', u'ꜳ'), - (0xA733, 'V'), - (0xA734, 'M', u'ꜵ'), - (0xA735, 'V'), - (0xA736, 'M', u'ꜷ'), - (0xA737, 'V'), - (0xA738, 'M', u'ꜹ'), - (0xA739, 'V'), - (0xA73A, 'M', u'ꜻ'), - (0xA73B, 'V'), - (0xA73C, 'M', u'ꜽ'), - (0xA73D, 'V'), - (0xA73E, 'M', u'ꜿ'), - (0xA73F, 'V'), - (0xA740, 'M', u'ꝁ'), - (0xA741, 'V'), - (0xA742, 'M', u'ꝃ'), - (0xA743, 'V'), - (0xA744, 'M', u'ꝅ'), - (0xA745, 'V'), - (0xA746, 'M', u'ꝇ'), - (0xA747, 'V'), - (0xA748, 'M', u'ꝉ'), - (0xA749, 'V'), - (0xA74A, 'M', u'ꝋ'), - (0xA74B, 'V'), - (0xA74C, 'M', u'ꝍ'), - (0xA74D, 'V'), - (0xA74E, 'M', u'ꝏ'), - (0xA74F, 'V'), - (0xA750, 'M', u'ꝑ'), - (0xA751, 'V'), - (0xA752, 'M', u'ꝓ'), - (0xA753, 'V'), - (0xA754, 'M', u'ꝕ'), - (0xA755, 'V'), - (0xA756, 'M', u'ꝗ'), - (0xA757, 'V'), - (0xA758, 'M', u'ꝙ'), - (0xA759, 'V'), - (0xA75A, 'M', u'ꝛ'), - (0xA75B, 'V'), - (0xA75C, 'M', u'ꝝ'), - (0xA75D, 'V'), - (0xA75E, 'M', u'ꝟ'), - (0xA75F, 'V'), - (0xA760, 'M', u'ꝡ'), - (0xA761, 'V'), - (0xA762, 'M', u'ꝣ'), - (0xA763, 'V'), - (0xA764, 'M', u'ꝥ'), - (0xA765, 'V'), - (0xA766, 'M', u'ꝧ'), - (0xA767, 'V'), - (0xA768, 'M', u'ꝩ'), - (0xA769, 'V'), - (0xA76A, 'M', u'ꝫ'), - (0xA76B, 'V'), - (0xA76C, 'M', u'ꝭ'), - (0xA76D, 'V'), - (0xA76E, 'M', u'ꝯ'), - (0xA76F, 'V'), - (0xA770, 'M', u'ꝯ'), - (0xA771, 'V'), - (0xA779, 'M', u'ꝺ'), - (0xA77A, 'V'), - (0xA77B, 'M', u'ꝼ'), - (0xA77C, 'V'), - (0xA77D, 'M', u'ᵹ'), - (0xA77E, 'M', u'ꝿ'), - (0xA77F, 'V'), - (0xA780, 'M', u'ꞁ'), - (0xA781, 'V'), - (0xA782, 'M', u'ꞃ'), - (0xA783, 'V'), - (0xA784, 'M', u'ꞅ'), - (0xA785, 'V'), - (0xA786, 'M', u'ꞇ'), - (0xA787, 'V'), - (0xA78B, 'M', u'ꞌ'), - (0xA78C, 'V'), - (0xA78D, 'M', u'ɥ'), - (0xA78E, 'V'), - (0xA790, 'M', u'ꞑ'), - (0xA791, 'V'), - ] - -def _seg_37(): - return [ - (0xA792, 'M', u'ꞓ'), - (0xA793, 'V'), - (0xA796, 'M', u'ꞗ'), - (0xA797, 'V'), - (0xA798, 'M', u'ꞙ'), - (0xA799, 'V'), - (0xA79A, 'M', u'ꞛ'), - (0xA79B, 'V'), - (0xA79C, 'M', u'ꞝ'), - (0xA79D, 'V'), - (0xA79E, 'M', u'ꞟ'), - (0xA79F, 'V'), - (0xA7A0, 'M', u'ꞡ'), - (0xA7A1, 'V'), - (0xA7A2, 'M', u'ꞣ'), - (0xA7A3, 'V'), - (0xA7A4, 'M', u'ꞥ'), - (0xA7A5, 'V'), - (0xA7A6, 'M', u'ꞧ'), - (0xA7A7, 'V'), - (0xA7A8, 'M', u'ꞩ'), - (0xA7A9, 'V'), - (0xA7AA, 'M', u'ɦ'), - (0xA7AB, 'M', u'ɜ'), - (0xA7AC, 'M', u'ɡ'), - (0xA7AD, 'M', u'ɬ'), - (0xA7AE, 'M', u'ɪ'), - (0xA7AF, 'V'), - (0xA7B0, 'M', u'ʞ'), - (0xA7B1, 'M', u'ʇ'), - (0xA7B2, 'M', u'ʝ'), - (0xA7B3, 'M', u'ꭓ'), - (0xA7B4, 'M', u'ꞵ'), - (0xA7B5, 'V'), - (0xA7B6, 'M', u'ꞷ'), - (0xA7B7, 'V'), - (0xA7B8, 'X'), - (0xA7B9, 'V'), - (0xA7BA, 'X'), - (0xA7F7, 'V'), - (0xA7F8, 'M', u'ħ'), - (0xA7F9, 'M', u'œ'), - (0xA7FA, 'V'), - (0xA82C, 'X'), - (0xA830, 'V'), - (0xA83A, 'X'), - (0xA840, 'V'), - (0xA878, 'X'), - (0xA880, 'V'), - (0xA8C6, 'X'), - (0xA8CE, 'V'), - (0xA8DA, 'X'), - (0xA8E0, 'V'), - (0xA954, 'X'), - (0xA95F, 'V'), - (0xA97D, 'X'), - (0xA980, 'V'), - (0xA9CE, 'X'), - (0xA9CF, 'V'), - (0xA9DA, 'X'), - (0xA9DE, 'V'), - (0xA9FF, 'X'), - (0xAA00, 'V'), - (0xAA37, 'X'), - (0xAA40, 'V'), - (0xAA4E, 'X'), - (0xAA50, 'V'), - (0xAA5A, 'X'), - (0xAA5C, 'V'), - (0xAAC3, 'X'), - (0xAADB, 'V'), - (0xAAF7, 'X'), - (0xAB01, 'V'), - (0xAB07, 'X'), - (0xAB09, 'V'), - (0xAB0F, 'X'), - (0xAB11, 'V'), - (0xAB17, 'X'), - (0xAB20, 'V'), - (0xAB27, 'X'), - (0xAB28, 'V'), - (0xAB2F, 'X'), - (0xAB30, 'V'), - (0xAB5C, 'M', u'ꜧ'), - (0xAB5D, 'M', u'ꬷ'), - (0xAB5E, 'M', u'ɫ'), - (0xAB5F, 'M', u'ꭒ'), - (0xAB60, 'V'), - (0xAB66, 'X'), - (0xAB70, 'M', u'Ꭰ'), - (0xAB71, 'M', u'Ꭱ'), - (0xAB72, 'M', u'Ꭲ'), - (0xAB73, 'M', u'Ꭳ'), - (0xAB74, 'M', u'Ꭴ'), - (0xAB75, 'M', u'Ꭵ'), - (0xAB76, 'M', u'Ꭶ'), - (0xAB77, 'M', u'Ꭷ'), - (0xAB78, 'M', u'Ꭸ'), - (0xAB79, 'M', u'Ꭹ'), - (0xAB7A, 'M', u'Ꭺ'), - ] - -def _seg_38(): - return [ - (0xAB7B, 'M', u'Ꭻ'), - (0xAB7C, 'M', u'Ꭼ'), - (0xAB7D, 'M', u'Ꭽ'), - (0xAB7E, 'M', u'Ꭾ'), - (0xAB7F, 'M', u'Ꭿ'), - (0xAB80, 'M', u'Ꮀ'), - (0xAB81, 'M', u'Ꮁ'), - (0xAB82, 'M', u'Ꮂ'), - (0xAB83, 'M', u'Ꮃ'), - (0xAB84, 'M', u'Ꮄ'), - (0xAB85, 'M', u'Ꮅ'), - (0xAB86, 'M', u'Ꮆ'), - (0xAB87, 'M', u'Ꮇ'), - (0xAB88, 'M', u'Ꮈ'), - (0xAB89, 'M', u'Ꮉ'), - (0xAB8A, 'M', u'Ꮊ'), - (0xAB8B, 'M', u'Ꮋ'), - (0xAB8C, 'M', u'Ꮌ'), - (0xAB8D, 'M', u'Ꮍ'), - (0xAB8E, 'M', u'Ꮎ'), - (0xAB8F, 'M', u'Ꮏ'), - (0xAB90, 'M', u'Ꮐ'), - (0xAB91, 'M', u'Ꮑ'), - (0xAB92, 'M', u'Ꮒ'), - (0xAB93, 'M', u'Ꮓ'), - (0xAB94, 'M', u'Ꮔ'), - (0xAB95, 'M', u'Ꮕ'), - (0xAB96, 'M', u'Ꮖ'), - (0xAB97, 'M', u'Ꮗ'), - (0xAB98, 'M', u'Ꮘ'), - (0xAB99, 'M', u'Ꮙ'), - (0xAB9A, 'M', u'Ꮚ'), - (0xAB9B, 'M', u'Ꮛ'), - (0xAB9C, 'M', u'Ꮜ'), - (0xAB9D, 'M', u'Ꮝ'), - (0xAB9E, 'M', u'Ꮞ'), - (0xAB9F, 'M', u'Ꮟ'), - (0xABA0, 'M', u'Ꮠ'), - (0xABA1, 'M', u'Ꮡ'), - (0xABA2, 'M', u'Ꮢ'), - (0xABA3, 'M', u'Ꮣ'), - (0xABA4, 'M', u'Ꮤ'), - (0xABA5, 'M', u'Ꮥ'), - (0xABA6, 'M', u'Ꮦ'), - (0xABA7, 'M', u'Ꮧ'), - (0xABA8, 'M', u'Ꮨ'), - (0xABA9, 'M', u'Ꮩ'), - (0xABAA, 'M', u'Ꮪ'), - (0xABAB, 'M', u'Ꮫ'), - (0xABAC, 'M', u'Ꮬ'), - (0xABAD, 'M', u'Ꮭ'), - (0xABAE, 'M', u'Ꮮ'), - (0xABAF, 'M', u'Ꮯ'), - (0xABB0, 'M', u'Ꮰ'), - (0xABB1, 'M', u'Ꮱ'), - (0xABB2, 'M', u'Ꮲ'), - (0xABB3, 'M', u'Ꮳ'), - (0xABB4, 'M', u'Ꮴ'), - (0xABB5, 'M', u'Ꮵ'), - (0xABB6, 'M', u'Ꮶ'), - (0xABB7, 'M', u'Ꮷ'), - (0xABB8, 'M', u'Ꮸ'), - (0xABB9, 'M', u'Ꮹ'), - (0xABBA, 'M', u'Ꮺ'), - (0xABBB, 'M', u'Ꮻ'), - (0xABBC, 'M', u'Ꮼ'), - (0xABBD, 'M', u'Ꮽ'), - (0xABBE, 'M', u'Ꮾ'), - (0xABBF, 'M', u'Ꮿ'), - (0xABC0, 'V'), - (0xABEE, 'X'), - (0xABF0, 'V'), - (0xABFA, 'X'), - (0xAC00, 'V'), - (0xD7A4, 'X'), - (0xD7B0, 'V'), - (0xD7C7, 'X'), - (0xD7CB, 'V'), - (0xD7FC, 'X'), - (0xF900, 'M', u'豈'), - (0xF901, 'M', u'更'), - (0xF902, 'M', u'車'), - (0xF903, 'M', u'賈'), - (0xF904, 'M', u'滑'), - (0xF905, 'M', u'串'), - (0xF906, 'M', u'句'), - (0xF907, 'M', u'龜'), - (0xF909, 'M', u'契'), - (0xF90A, 'M', u'金'), - (0xF90B, 'M', u'喇'), - (0xF90C, 'M', u'奈'), - (0xF90D, 'M', u'懶'), - (0xF90E, 'M', u'癩'), - (0xF90F, 'M', u'羅'), - (0xF910, 'M', u'蘿'), - (0xF911, 'M', u'螺'), - (0xF912, 'M', u'裸'), - (0xF913, 'M', u'邏'), - (0xF914, 'M', u'樂'), - (0xF915, 'M', u'洛'), - ] - -def _seg_39(): - return [ - (0xF916, 'M', u'烙'), - (0xF917, 'M', u'珞'), - (0xF918, 'M', u'落'), - (0xF919, 'M', u'酪'), - (0xF91A, 'M', u'駱'), - (0xF91B, 'M', u'亂'), - (0xF91C, 'M', u'卵'), - (0xF91D, 'M', u'欄'), - (0xF91E, 'M', u'爛'), - (0xF91F, 'M', u'蘭'), - (0xF920, 'M', u'鸞'), - (0xF921, 'M', u'嵐'), - (0xF922, 'M', u'濫'), - (0xF923, 'M', u'藍'), - (0xF924, 'M', u'襤'), - (0xF925, 'M', u'拉'), - (0xF926, 'M', u'臘'), - (0xF927, 'M', u'蠟'), - (0xF928, 'M', u'廊'), - (0xF929, 'M', u'朗'), - (0xF92A, 'M', u'浪'), - (0xF92B, 'M', u'狼'), - (0xF92C, 'M', u'郎'), - (0xF92D, 'M', u'來'), - (0xF92E, 'M', u'冷'), - (0xF92F, 'M', u'勞'), - (0xF930, 'M', u'擄'), - (0xF931, 'M', u'櫓'), - (0xF932, 'M', u'爐'), - (0xF933, 'M', u'盧'), - (0xF934, 'M', u'老'), - (0xF935, 'M', u'蘆'), - (0xF936, 'M', u'虜'), - (0xF937, 'M', u'路'), - (0xF938, 'M', u'露'), - (0xF939, 'M', u'魯'), - (0xF93A, 'M', u'鷺'), - (0xF93B, 'M', u'碌'), - (0xF93C, 'M', u'祿'), - (0xF93D, 'M', u'綠'), - (0xF93E, 'M', u'菉'), - (0xF93F, 'M', u'錄'), - (0xF940, 'M', u'鹿'), - (0xF941, 'M', u'論'), - (0xF942, 'M', u'壟'), - (0xF943, 'M', u'弄'), - (0xF944, 'M', u'籠'), - (0xF945, 'M', u'聾'), - (0xF946, 'M', u'牢'), - (0xF947, 'M', u'磊'), - (0xF948, 'M', u'賂'), - (0xF949, 'M', u'雷'), - (0xF94A, 'M', u'壘'), - (0xF94B, 'M', u'屢'), - (0xF94C, 'M', u'樓'), - (0xF94D, 'M', u'淚'), - (0xF94E, 'M', u'漏'), - (0xF94F, 'M', u'累'), - (0xF950, 'M', u'縷'), - (0xF951, 'M', u'陋'), - (0xF952, 'M', u'勒'), - (0xF953, 'M', u'肋'), - (0xF954, 'M', u'凜'), - (0xF955, 'M', u'凌'), - (0xF956, 'M', u'稜'), - (0xF957, 'M', u'綾'), - (0xF958, 'M', u'菱'), - (0xF959, 'M', u'陵'), - (0xF95A, 'M', u'讀'), - (0xF95B, 'M', u'拏'), - (0xF95C, 'M', u'樂'), - (0xF95D, 'M', u'諾'), - (0xF95E, 'M', u'丹'), - (0xF95F, 'M', u'寧'), - (0xF960, 'M', u'怒'), - (0xF961, 'M', u'率'), - (0xF962, 'M', u'異'), - (0xF963, 'M', u'北'), - (0xF964, 'M', u'磻'), - (0xF965, 'M', u'便'), - (0xF966, 'M', u'復'), - (0xF967, 'M', u'不'), - (0xF968, 'M', u'泌'), - (0xF969, 'M', u'數'), - (0xF96A, 'M', u'索'), - (0xF96B, 'M', u'參'), - (0xF96C, 'M', u'塞'), - (0xF96D, 'M', u'省'), - (0xF96E, 'M', u'葉'), - (0xF96F, 'M', u'說'), - (0xF970, 'M', u'殺'), - (0xF971, 'M', u'辰'), - (0xF972, 'M', u'沈'), - (0xF973, 'M', u'拾'), - (0xF974, 'M', u'若'), - (0xF975, 'M', u'掠'), - (0xF976, 'M', u'略'), - (0xF977, 'M', u'亮'), - (0xF978, 'M', u'兩'), - (0xF979, 'M', u'凉'), - ] - -def _seg_40(): - return [ - (0xF97A, 'M', u'梁'), - (0xF97B, 'M', u'糧'), - (0xF97C, 'M', u'良'), - (0xF97D, 'M', u'諒'), - (0xF97E, 'M', u'量'), - (0xF97F, 'M', u'勵'), - (0xF980, 'M', u'呂'), - (0xF981, 'M', u'女'), - (0xF982, 'M', u'廬'), - (0xF983, 'M', u'旅'), - (0xF984, 'M', u'濾'), - (0xF985, 'M', u'礪'), - (0xF986, 'M', u'閭'), - (0xF987, 'M', u'驪'), - (0xF988, 'M', u'麗'), - (0xF989, 'M', u'黎'), - (0xF98A, 'M', u'力'), - (0xF98B, 'M', u'曆'), - (0xF98C, 'M', u'歷'), - (0xF98D, 'M', u'轢'), - (0xF98E, 'M', u'年'), - (0xF98F, 'M', u'憐'), - (0xF990, 'M', u'戀'), - (0xF991, 'M', u'撚'), - (0xF992, 'M', u'漣'), - (0xF993, 'M', u'煉'), - (0xF994, 'M', u'璉'), - (0xF995, 'M', u'秊'), - (0xF996, 'M', u'練'), - (0xF997, 'M', u'聯'), - (0xF998, 'M', u'輦'), - (0xF999, 'M', u'蓮'), - (0xF99A, 'M', u'連'), - (0xF99B, 'M', u'鍊'), - (0xF99C, 'M', u'列'), - (0xF99D, 'M', u'劣'), - (0xF99E, 'M', u'咽'), - (0xF99F, 'M', u'烈'), - (0xF9A0, 'M', u'裂'), - (0xF9A1, 'M', u'說'), - (0xF9A2, 'M', u'廉'), - (0xF9A3, 'M', u'念'), - (0xF9A4, 'M', u'捻'), - (0xF9A5, 'M', u'殮'), - (0xF9A6, 'M', u'簾'), - (0xF9A7, 'M', u'獵'), - (0xF9A8, 'M', u'令'), - (0xF9A9, 'M', u'囹'), - (0xF9AA, 'M', u'寧'), - (0xF9AB, 'M', u'嶺'), - (0xF9AC, 'M', u'怜'), - (0xF9AD, 'M', u'玲'), - (0xF9AE, 'M', u'瑩'), - (0xF9AF, 'M', u'羚'), - (0xF9B0, 'M', u'聆'), - (0xF9B1, 'M', u'鈴'), - (0xF9B2, 'M', u'零'), - (0xF9B3, 'M', u'靈'), - (0xF9B4, 'M', u'領'), - (0xF9B5, 'M', u'例'), - (0xF9B6, 'M', u'禮'), - (0xF9B7, 'M', u'醴'), - (0xF9B8, 'M', u'隸'), - (0xF9B9, 'M', u'惡'), - (0xF9BA, 'M', u'了'), - (0xF9BB, 'M', u'僚'), - (0xF9BC, 'M', u'寮'), - (0xF9BD, 'M', u'尿'), - (0xF9BE, 'M', u'料'), - (0xF9BF, 'M', u'樂'), - (0xF9C0, 'M', u'燎'), - (0xF9C1, 'M', u'療'), - (0xF9C2, 'M', u'蓼'), - (0xF9C3, 'M', u'遼'), - (0xF9C4, 'M', u'龍'), - (0xF9C5, 'M', u'暈'), - (0xF9C6, 'M', u'阮'), - (0xF9C7, 'M', u'劉'), - (0xF9C8, 'M', u'杻'), - (0xF9C9, 'M', u'柳'), - (0xF9CA, 'M', u'流'), - (0xF9CB, 'M', u'溜'), - (0xF9CC, 'M', u'琉'), - (0xF9CD, 'M', u'留'), - (0xF9CE, 'M', u'硫'), - (0xF9CF, 'M', u'紐'), - (0xF9D0, 'M', u'類'), - (0xF9D1, 'M', u'六'), - (0xF9D2, 'M', u'戮'), - (0xF9D3, 'M', u'陸'), - (0xF9D4, 'M', u'倫'), - (0xF9D5, 'M', u'崙'), - (0xF9D6, 'M', u'淪'), - (0xF9D7, 'M', u'輪'), - (0xF9D8, 'M', u'律'), - (0xF9D9, 'M', u'慄'), - (0xF9DA, 'M', u'栗'), - (0xF9DB, 'M', u'率'), - (0xF9DC, 'M', u'隆'), - (0xF9DD, 'M', u'利'), - ] - -def _seg_41(): - return [ - (0xF9DE, 'M', u'吏'), - (0xF9DF, 'M', u'履'), - (0xF9E0, 'M', u'易'), - (0xF9E1, 'M', u'李'), - (0xF9E2, 'M', u'梨'), - (0xF9E3, 'M', u'泥'), - (0xF9E4, 'M', u'理'), - (0xF9E5, 'M', u'痢'), - (0xF9E6, 'M', u'罹'), - (0xF9E7, 'M', u'裏'), - (0xF9E8, 'M', u'裡'), - (0xF9E9, 'M', u'里'), - (0xF9EA, 'M', u'離'), - (0xF9EB, 'M', u'匿'), - (0xF9EC, 'M', u'溺'), - (0xF9ED, 'M', u'吝'), - (0xF9EE, 'M', u'燐'), - (0xF9EF, 'M', u'璘'), - (0xF9F0, 'M', u'藺'), - (0xF9F1, 'M', u'隣'), - (0xF9F2, 'M', u'鱗'), - (0xF9F3, 'M', u'麟'), - (0xF9F4, 'M', u'林'), - (0xF9F5, 'M', u'淋'), - (0xF9F6, 'M', u'臨'), - (0xF9F7, 'M', u'立'), - (0xF9F8, 'M', u'笠'), - (0xF9F9, 'M', u'粒'), - (0xF9FA, 'M', u'狀'), - (0xF9FB, 'M', u'炙'), - (0xF9FC, 'M', u'識'), - (0xF9FD, 'M', u'什'), - (0xF9FE, 'M', u'茶'), - (0xF9FF, 'M', u'刺'), - (0xFA00, 'M', u'切'), - (0xFA01, 'M', u'度'), - (0xFA02, 'M', u'拓'), - (0xFA03, 'M', u'糖'), - (0xFA04, 'M', u'宅'), - (0xFA05, 'M', u'洞'), - (0xFA06, 'M', u'暴'), - (0xFA07, 'M', u'輻'), - (0xFA08, 'M', u'行'), - (0xFA09, 'M', u'降'), - (0xFA0A, 'M', u'見'), - (0xFA0B, 'M', u'廓'), - (0xFA0C, 'M', u'兀'), - (0xFA0D, 'M', u'嗀'), - (0xFA0E, 'V'), - (0xFA10, 'M', u'塚'), - (0xFA11, 'V'), - (0xFA12, 'M', u'晴'), - (0xFA13, 'V'), - (0xFA15, 'M', u'凞'), - (0xFA16, 'M', u'猪'), - (0xFA17, 'M', u'益'), - (0xFA18, 'M', u'礼'), - (0xFA19, 'M', u'神'), - (0xFA1A, 'M', u'祥'), - (0xFA1B, 'M', u'福'), - (0xFA1C, 'M', u'靖'), - (0xFA1D, 'M', u'精'), - (0xFA1E, 'M', u'羽'), - (0xFA1F, 'V'), - (0xFA20, 'M', u'蘒'), - (0xFA21, 'V'), - (0xFA22, 'M', u'諸'), - (0xFA23, 'V'), - (0xFA25, 'M', u'逸'), - (0xFA26, 'M', u'都'), - (0xFA27, 'V'), - (0xFA2A, 'M', u'飯'), - (0xFA2B, 'M', u'飼'), - (0xFA2C, 'M', u'館'), - (0xFA2D, 'M', u'鶴'), - (0xFA2E, 'M', u'郞'), - (0xFA2F, 'M', u'隷'), - (0xFA30, 'M', u'侮'), - (0xFA31, 'M', u'僧'), - (0xFA32, 'M', u'免'), - (0xFA33, 'M', u'勉'), - (0xFA34, 'M', u'勤'), - (0xFA35, 'M', u'卑'), - (0xFA36, 'M', u'喝'), - (0xFA37, 'M', u'嘆'), - (0xFA38, 'M', u'器'), - (0xFA39, 'M', u'塀'), - (0xFA3A, 'M', u'墨'), - (0xFA3B, 'M', u'層'), - (0xFA3C, 'M', u'屮'), - (0xFA3D, 'M', u'悔'), - (0xFA3E, 'M', u'慨'), - (0xFA3F, 'M', u'憎'), - (0xFA40, 'M', u'懲'), - (0xFA41, 'M', u'敏'), - (0xFA42, 'M', u'既'), - (0xFA43, 'M', u'暑'), - (0xFA44, 'M', u'梅'), - (0xFA45, 'M', u'海'), - (0xFA46, 'M', u'渚'), - ] - -def _seg_42(): - return [ - (0xFA47, 'M', u'漢'), - (0xFA48, 'M', u'煮'), - (0xFA49, 'M', u'爫'), - (0xFA4A, 'M', u'琢'), - (0xFA4B, 'M', u'碑'), - (0xFA4C, 'M', u'社'), - (0xFA4D, 'M', u'祉'), - (0xFA4E, 'M', u'祈'), - (0xFA4F, 'M', u'祐'), - (0xFA50, 'M', u'祖'), - (0xFA51, 'M', u'祝'), - (0xFA52, 'M', u'禍'), - (0xFA53, 'M', u'禎'), - (0xFA54, 'M', u'穀'), - (0xFA55, 'M', u'突'), - (0xFA56, 'M', u'節'), - (0xFA57, 'M', u'練'), - (0xFA58, 'M', u'縉'), - (0xFA59, 'M', u'繁'), - (0xFA5A, 'M', u'署'), - (0xFA5B, 'M', u'者'), - (0xFA5C, 'M', u'臭'), - (0xFA5D, 'M', u'艹'), - (0xFA5F, 'M', u'著'), - (0xFA60, 'M', u'褐'), - (0xFA61, 'M', u'視'), - (0xFA62, 'M', u'謁'), - (0xFA63, 'M', u'謹'), - (0xFA64, 'M', u'賓'), - (0xFA65, 'M', u'贈'), - (0xFA66, 'M', u'辶'), - (0xFA67, 'M', u'逸'), - (0xFA68, 'M', u'難'), - (0xFA69, 'M', u'響'), - (0xFA6A, 'M', u'頻'), - (0xFA6B, 'M', u'恵'), - (0xFA6C, 'M', u'𤋮'), - (0xFA6D, 'M', u'舘'), - (0xFA6E, 'X'), - (0xFA70, 'M', u'並'), - (0xFA71, 'M', u'况'), - (0xFA72, 'M', u'全'), - (0xFA73, 'M', u'侀'), - (0xFA74, 'M', u'充'), - (0xFA75, 'M', u'冀'), - (0xFA76, 'M', u'勇'), - (0xFA77, 'M', u'勺'), - (0xFA78, 'M', u'喝'), - (0xFA79, 'M', u'啕'), - (0xFA7A, 'M', u'喙'), - (0xFA7B, 'M', u'嗢'), - (0xFA7C, 'M', u'塚'), - (0xFA7D, 'M', u'墳'), - (0xFA7E, 'M', u'奄'), - (0xFA7F, 'M', u'奔'), - (0xFA80, 'M', u'婢'), - (0xFA81, 'M', u'嬨'), - (0xFA82, 'M', u'廒'), - (0xFA83, 'M', u'廙'), - (0xFA84, 'M', u'彩'), - (0xFA85, 'M', u'徭'), - (0xFA86, 'M', u'惘'), - (0xFA87, 'M', u'慎'), - (0xFA88, 'M', u'愈'), - (0xFA89, 'M', u'憎'), - (0xFA8A, 'M', u'慠'), - (0xFA8B, 'M', u'懲'), - (0xFA8C, 'M', u'戴'), - (0xFA8D, 'M', u'揄'), - (0xFA8E, 'M', u'搜'), - (0xFA8F, 'M', u'摒'), - (0xFA90, 'M', u'敖'), - (0xFA91, 'M', u'晴'), - (0xFA92, 'M', u'朗'), - (0xFA93, 'M', u'望'), - (0xFA94, 'M', u'杖'), - (0xFA95, 'M', u'歹'), - (0xFA96, 'M', u'殺'), - (0xFA97, 'M', u'流'), - (0xFA98, 'M', u'滛'), - (0xFA99, 'M', u'滋'), - (0xFA9A, 'M', u'漢'), - (0xFA9B, 'M', u'瀞'), - (0xFA9C, 'M', u'煮'), - (0xFA9D, 'M', u'瞧'), - (0xFA9E, 'M', u'爵'), - (0xFA9F, 'M', u'犯'), - (0xFAA0, 'M', u'猪'), - (0xFAA1, 'M', u'瑱'), - (0xFAA2, 'M', u'甆'), - (0xFAA3, 'M', u'画'), - (0xFAA4, 'M', u'瘝'), - (0xFAA5, 'M', u'瘟'), - (0xFAA6, 'M', u'益'), - (0xFAA7, 'M', u'盛'), - (0xFAA8, 'M', u'直'), - (0xFAA9, 'M', u'睊'), - (0xFAAA, 'M', u'着'), - (0xFAAB, 'M', u'磌'), - (0xFAAC, 'M', u'窱'), - ] - -def _seg_43(): - return [ - (0xFAAD, 'M', u'節'), - (0xFAAE, 'M', u'类'), - (0xFAAF, 'M', u'絛'), - (0xFAB0, 'M', u'練'), - (0xFAB1, 'M', u'缾'), - (0xFAB2, 'M', u'者'), - (0xFAB3, 'M', u'荒'), - (0xFAB4, 'M', u'華'), - (0xFAB5, 'M', u'蝹'), - (0xFAB6, 'M', u'襁'), - (0xFAB7, 'M', u'覆'), - (0xFAB8, 'M', u'視'), - (0xFAB9, 'M', u'調'), - (0xFABA, 'M', u'諸'), - (0xFABB, 'M', u'請'), - (0xFABC, 'M', u'謁'), - (0xFABD, 'M', u'諾'), - (0xFABE, 'M', u'諭'), - (0xFABF, 'M', u'謹'), - (0xFAC0, 'M', u'變'), - (0xFAC1, 'M', u'贈'), - (0xFAC2, 'M', u'輸'), - (0xFAC3, 'M', u'遲'), - (0xFAC4, 'M', u'醙'), - (0xFAC5, 'M', u'鉶'), - (0xFAC6, 'M', u'陼'), - (0xFAC7, 'M', u'難'), - (0xFAC8, 'M', u'靖'), - (0xFAC9, 'M', u'韛'), - (0xFACA, 'M', u'響'), - (0xFACB, 'M', u'頋'), - (0xFACC, 'M', u'頻'), - (0xFACD, 'M', u'鬒'), - (0xFACE, 'M', u'龜'), - (0xFACF, 'M', u'𢡊'), - (0xFAD0, 'M', u'𢡄'), - (0xFAD1, 'M', u'𣏕'), - (0xFAD2, 'M', u'㮝'), - (0xFAD3, 'M', u'䀘'), - (0xFAD4, 'M', u'䀹'), - (0xFAD5, 'M', u'𥉉'), - (0xFAD6, 'M', u'𥳐'), - (0xFAD7, 'M', u'𧻓'), - (0xFAD8, 'M', u'齃'), - (0xFAD9, 'M', u'龎'), - (0xFADA, 'X'), - (0xFB00, 'M', u'ff'), - (0xFB01, 'M', u'fi'), - (0xFB02, 'M', u'fl'), - (0xFB03, 'M', u'ffi'), - (0xFB04, 'M', u'ffl'), - (0xFB05, 'M', u'st'), - (0xFB07, 'X'), - (0xFB13, 'M', u'մն'), - (0xFB14, 'M', u'մե'), - (0xFB15, 'M', u'մի'), - (0xFB16, 'M', u'վն'), - (0xFB17, 'M', u'մխ'), - (0xFB18, 'X'), - (0xFB1D, 'M', u'יִ'), - (0xFB1E, 'V'), - (0xFB1F, 'M', u'ײַ'), - (0xFB20, 'M', u'ע'), - (0xFB21, 'M', u'א'), - (0xFB22, 'M', u'ד'), - (0xFB23, 'M', u'ה'), - (0xFB24, 'M', u'כ'), - (0xFB25, 'M', u'ל'), - (0xFB26, 'M', u'ם'), - (0xFB27, 'M', u'ר'), - (0xFB28, 'M', u'ת'), - (0xFB29, '3', u'+'), - (0xFB2A, 'M', u'שׁ'), - (0xFB2B, 'M', u'שׂ'), - (0xFB2C, 'M', u'שּׁ'), - (0xFB2D, 'M', u'שּׂ'), - (0xFB2E, 'M', u'אַ'), - (0xFB2F, 'M', u'אָ'), - (0xFB30, 'M', u'אּ'), - (0xFB31, 'M', u'בּ'), - (0xFB32, 'M', u'גּ'), - (0xFB33, 'M', u'דּ'), - (0xFB34, 'M', u'הּ'), - (0xFB35, 'M', u'וּ'), - (0xFB36, 'M', u'זּ'), - (0xFB37, 'X'), - (0xFB38, 'M', u'טּ'), - (0xFB39, 'M', u'יּ'), - (0xFB3A, 'M', u'ךּ'), - (0xFB3B, 'M', u'כּ'), - (0xFB3C, 'M', u'לּ'), - (0xFB3D, 'X'), - (0xFB3E, 'M', u'מּ'), - (0xFB3F, 'X'), - (0xFB40, 'M', u'נּ'), - (0xFB41, 'M', u'סּ'), - (0xFB42, 'X'), - (0xFB43, 'M', u'ףּ'), - (0xFB44, 'M', u'פּ'), - (0xFB45, 'X'), - ] - -def _seg_44(): - return [ - (0xFB46, 'M', u'צּ'), - (0xFB47, 'M', u'קּ'), - (0xFB48, 'M', u'רּ'), - (0xFB49, 'M', u'שּ'), - (0xFB4A, 'M', u'תּ'), - (0xFB4B, 'M', u'וֹ'), - (0xFB4C, 'M', u'בֿ'), - (0xFB4D, 'M', u'כֿ'), - (0xFB4E, 'M', u'פֿ'), - (0xFB4F, 'M', u'אל'), - (0xFB50, 'M', u'ٱ'), - (0xFB52, 'M', u'ٻ'), - (0xFB56, 'M', u'پ'), - (0xFB5A, 'M', u'ڀ'), - (0xFB5E, 'M', u'ٺ'), - (0xFB62, 'M', u'ٿ'), - (0xFB66, 'M', u'ٹ'), - (0xFB6A, 'M', u'ڤ'), - (0xFB6E, 'M', u'ڦ'), - (0xFB72, 'M', u'ڄ'), - (0xFB76, 'M', u'ڃ'), - (0xFB7A, 'M', u'چ'), - (0xFB7E, 'M', u'ڇ'), - (0xFB82, 'M', u'ڍ'), - (0xFB84, 'M', u'ڌ'), - (0xFB86, 'M', u'ڎ'), - (0xFB88, 'M', u'ڈ'), - (0xFB8A, 'M', u'ژ'), - (0xFB8C, 'M', u'ڑ'), - (0xFB8E, 'M', u'ک'), - (0xFB92, 'M', u'گ'), - (0xFB96, 'M', u'ڳ'), - (0xFB9A, 'M', u'ڱ'), - (0xFB9E, 'M', u'ں'), - (0xFBA0, 'M', u'ڻ'), - (0xFBA4, 'M', u'ۀ'), - (0xFBA6, 'M', u'ہ'), - (0xFBAA, 'M', u'ھ'), - (0xFBAE, 'M', u'ے'), - (0xFBB0, 'M', u'ۓ'), - (0xFBB2, 'V'), - (0xFBC2, 'X'), - (0xFBD3, 'M', u'ڭ'), - (0xFBD7, 'M', u'ۇ'), - (0xFBD9, 'M', u'ۆ'), - (0xFBDB, 'M', u'ۈ'), - (0xFBDD, 'M', u'ۇٴ'), - (0xFBDE, 'M', u'ۋ'), - (0xFBE0, 'M', u'ۅ'), - (0xFBE2, 'M', u'ۉ'), - (0xFBE4, 'M', u'ې'), - (0xFBE8, 'M', u'ى'), - (0xFBEA, 'M', u'ئا'), - (0xFBEC, 'M', u'ئە'), - (0xFBEE, 'M', u'ئو'), - (0xFBF0, 'M', u'ئۇ'), - (0xFBF2, 'M', u'ئۆ'), - (0xFBF4, 'M', u'ئۈ'), - (0xFBF6, 'M', u'ئې'), - (0xFBF9, 'M', u'ئى'), - (0xFBFC, 'M', u'ی'), - (0xFC00, 'M', u'ئج'), - (0xFC01, 'M', u'ئح'), - (0xFC02, 'M', u'ئم'), - (0xFC03, 'M', u'ئى'), - (0xFC04, 'M', u'ئي'), - (0xFC05, 'M', u'بج'), - (0xFC06, 'M', u'بح'), - (0xFC07, 'M', u'بخ'), - (0xFC08, 'M', u'بم'), - (0xFC09, 'M', u'بى'), - (0xFC0A, 'M', u'بي'), - (0xFC0B, 'M', u'تج'), - (0xFC0C, 'M', u'تح'), - (0xFC0D, 'M', u'تخ'), - (0xFC0E, 'M', u'تم'), - (0xFC0F, 'M', u'تى'), - (0xFC10, 'M', u'تي'), - (0xFC11, 'M', u'ثج'), - (0xFC12, 'M', u'ثم'), - (0xFC13, 'M', u'ثى'), - (0xFC14, 'M', u'ثي'), - (0xFC15, 'M', u'جح'), - (0xFC16, 'M', u'جم'), - (0xFC17, 'M', u'حج'), - (0xFC18, 'M', u'حم'), - (0xFC19, 'M', u'خج'), - (0xFC1A, 'M', u'خح'), - (0xFC1B, 'M', u'خم'), - (0xFC1C, 'M', u'سج'), - (0xFC1D, 'M', u'سح'), - (0xFC1E, 'M', u'سخ'), - (0xFC1F, 'M', u'سم'), - (0xFC20, 'M', u'صح'), - (0xFC21, 'M', u'صم'), - (0xFC22, 'M', u'ضج'), - (0xFC23, 'M', u'ضح'), - (0xFC24, 'M', u'ضخ'), - (0xFC25, 'M', u'ضم'), - (0xFC26, 'M', u'طح'), - ] - -def _seg_45(): - return [ - (0xFC27, 'M', u'طم'), - (0xFC28, 'M', u'ظم'), - (0xFC29, 'M', u'عج'), - (0xFC2A, 'M', u'عم'), - (0xFC2B, 'M', u'غج'), - (0xFC2C, 'M', u'غم'), - (0xFC2D, 'M', u'فج'), - (0xFC2E, 'M', u'فح'), - (0xFC2F, 'M', u'فخ'), - (0xFC30, 'M', u'فم'), - (0xFC31, 'M', u'فى'), - (0xFC32, 'M', u'في'), - (0xFC33, 'M', u'قح'), - (0xFC34, 'M', u'قم'), - (0xFC35, 'M', u'قى'), - (0xFC36, 'M', u'قي'), - (0xFC37, 'M', u'كا'), - (0xFC38, 'M', u'كج'), - (0xFC39, 'M', u'كح'), - (0xFC3A, 'M', u'كخ'), - (0xFC3B, 'M', u'كل'), - (0xFC3C, 'M', u'كم'), - (0xFC3D, 'M', u'كى'), - (0xFC3E, 'M', u'كي'), - (0xFC3F, 'M', u'لج'), - (0xFC40, 'M', u'لح'), - (0xFC41, 'M', u'لخ'), - (0xFC42, 'M', u'لم'), - (0xFC43, 'M', u'لى'), - (0xFC44, 'M', u'لي'), - (0xFC45, 'M', u'مج'), - (0xFC46, 'M', u'مح'), - (0xFC47, 'M', u'مخ'), - (0xFC48, 'M', u'مم'), - (0xFC49, 'M', u'مى'), - (0xFC4A, 'M', u'مي'), - (0xFC4B, 'M', u'نج'), - (0xFC4C, 'M', u'نح'), - (0xFC4D, 'M', u'نخ'), - (0xFC4E, 'M', u'نم'), - (0xFC4F, 'M', u'نى'), - (0xFC50, 'M', u'ني'), - (0xFC51, 'M', u'هج'), - (0xFC52, 'M', u'هم'), - (0xFC53, 'M', u'هى'), - (0xFC54, 'M', u'هي'), - (0xFC55, 'M', u'يج'), - (0xFC56, 'M', u'يح'), - (0xFC57, 'M', u'يخ'), - (0xFC58, 'M', u'يم'), - (0xFC59, 'M', u'يى'), - (0xFC5A, 'M', u'يي'), - (0xFC5B, 'M', u'ذٰ'), - (0xFC5C, 'M', u'رٰ'), - (0xFC5D, 'M', u'ىٰ'), - (0xFC5E, '3', u' ٌّ'), - (0xFC5F, '3', u' ٍّ'), - (0xFC60, '3', u' َّ'), - (0xFC61, '3', u' ُّ'), - (0xFC62, '3', u' ِّ'), - (0xFC63, '3', u' ّٰ'), - (0xFC64, 'M', u'ئر'), - (0xFC65, 'M', u'ئز'), - (0xFC66, 'M', u'ئم'), - (0xFC67, 'M', u'ئن'), - (0xFC68, 'M', u'ئى'), - (0xFC69, 'M', u'ئي'), - (0xFC6A, 'M', u'بر'), - (0xFC6B, 'M', u'بز'), - (0xFC6C, 'M', u'بم'), - (0xFC6D, 'M', u'بن'), - (0xFC6E, 'M', u'بى'), - (0xFC6F, 'M', u'بي'), - (0xFC70, 'M', u'تر'), - (0xFC71, 'M', u'تز'), - (0xFC72, 'M', u'تم'), - (0xFC73, 'M', u'تن'), - (0xFC74, 'M', u'تى'), - (0xFC75, 'M', u'تي'), - (0xFC76, 'M', u'ثر'), - (0xFC77, 'M', u'ثز'), - (0xFC78, 'M', u'ثم'), - (0xFC79, 'M', u'ثن'), - (0xFC7A, 'M', u'ثى'), - (0xFC7B, 'M', u'ثي'), - (0xFC7C, 'M', u'فى'), - (0xFC7D, 'M', u'في'), - (0xFC7E, 'M', u'قى'), - (0xFC7F, 'M', u'قي'), - (0xFC80, 'M', u'كا'), - (0xFC81, 'M', u'كل'), - (0xFC82, 'M', u'كم'), - (0xFC83, 'M', u'كى'), - (0xFC84, 'M', u'كي'), - (0xFC85, 'M', u'لم'), - (0xFC86, 'M', u'لى'), - (0xFC87, 'M', u'لي'), - (0xFC88, 'M', u'ما'), - (0xFC89, 'M', u'مم'), - (0xFC8A, 'M', u'نر'), - ] - -def _seg_46(): - return [ - (0xFC8B, 'M', u'نز'), - (0xFC8C, 'M', u'نم'), - (0xFC8D, 'M', u'نن'), - (0xFC8E, 'M', u'نى'), - (0xFC8F, 'M', u'ني'), - (0xFC90, 'M', u'ىٰ'), - (0xFC91, 'M', u'ير'), - (0xFC92, 'M', u'يز'), - (0xFC93, 'M', u'يم'), - (0xFC94, 'M', u'ين'), - (0xFC95, 'M', u'يى'), - (0xFC96, 'M', u'يي'), - (0xFC97, 'M', u'ئج'), - (0xFC98, 'M', u'ئح'), - (0xFC99, 'M', u'ئخ'), - (0xFC9A, 'M', u'ئم'), - (0xFC9B, 'M', u'ئه'), - (0xFC9C, 'M', u'بج'), - (0xFC9D, 'M', u'بح'), - (0xFC9E, 'M', u'بخ'), - (0xFC9F, 'M', u'بم'), - (0xFCA0, 'M', u'به'), - (0xFCA1, 'M', u'تج'), - (0xFCA2, 'M', u'تح'), - (0xFCA3, 'M', u'تخ'), - (0xFCA4, 'M', u'تم'), - (0xFCA5, 'M', u'ته'), - (0xFCA6, 'M', u'ثم'), - (0xFCA7, 'M', u'جح'), - (0xFCA8, 'M', u'جم'), - (0xFCA9, 'M', u'حج'), - (0xFCAA, 'M', u'حم'), - (0xFCAB, 'M', u'خج'), - (0xFCAC, 'M', u'خم'), - (0xFCAD, 'M', u'سج'), - (0xFCAE, 'M', u'سح'), - (0xFCAF, 'M', u'سخ'), - (0xFCB0, 'M', u'سم'), - (0xFCB1, 'M', u'صح'), - (0xFCB2, 'M', u'صخ'), - (0xFCB3, 'M', u'صم'), - (0xFCB4, 'M', u'ضج'), - (0xFCB5, 'M', u'ضح'), - (0xFCB6, 'M', u'ضخ'), - (0xFCB7, 'M', u'ضم'), - (0xFCB8, 'M', u'طح'), - (0xFCB9, 'M', u'ظم'), - (0xFCBA, 'M', u'عج'), - (0xFCBB, 'M', u'عم'), - (0xFCBC, 'M', u'غج'), - (0xFCBD, 'M', u'غم'), - (0xFCBE, 'M', u'فج'), - (0xFCBF, 'M', u'فح'), - (0xFCC0, 'M', u'فخ'), - (0xFCC1, 'M', u'فم'), - (0xFCC2, 'M', u'قح'), - (0xFCC3, 'M', u'قم'), - (0xFCC4, 'M', u'كج'), - (0xFCC5, 'M', u'كح'), - (0xFCC6, 'M', u'كخ'), - (0xFCC7, 'M', u'كل'), - (0xFCC8, 'M', u'كم'), - (0xFCC9, 'M', u'لج'), - (0xFCCA, 'M', u'لح'), - (0xFCCB, 'M', u'لخ'), - (0xFCCC, 'M', u'لم'), - (0xFCCD, 'M', u'له'), - (0xFCCE, 'M', u'مج'), - (0xFCCF, 'M', u'مح'), - (0xFCD0, 'M', u'مخ'), - (0xFCD1, 'M', u'مم'), - (0xFCD2, 'M', u'نج'), - (0xFCD3, 'M', u'نح'), - (0xFCD4, 'M', u'نخ'), - (0xFCD5, 'M', u'نم'), - (0xFCD6, 'M', u'نه'), - (0xFCD7, 'M', u'هج'), - (0xFCD8, 'M', u'هم'), - (0xFCD9, 'M', u'هٰ'), - (0xFCDA, 'M', u'يج'), - (0xFCDB, 'M', u'يح'), - (0xFCDC, 'M', u'يخ'), - (0xFCDD, 'M', u'يم'), - (0xFCDE, 'M', u'يه'), - (0xFCDF, 'M', u'ئم'), - (0xFCE0, 'M', u'ئه'), - (0xFCE1, 'M', u'بم'), - (0xFCE2, 'M', u'به'), - (0xFCE3, 'M', u'تم'), - (0xFCE4, 'M', u'ته'), - (0xFCE5, 'M', u'ثم'), - (0xFCE6, 'M', u'ثه'), - (0xFCE7, 'M', u'سم'), - (0xFCE8, 'M', u'سه'), - (0xFCE9, 'M', u'شم'), - (0xFCEA, 'M', u'شه'), - (0xFCEB, 'M', u'كل'), - (0xFCEC, 'M', u'كم'), - (0xFCED, 'M', u'لم'), - (0xFCEE, 'M', u'نم'), - ] - -def _seg_47(): - return [ - (0xFCEF, 'M', u'نه'), - (0xFCF0, 'M', u'يم'), - (0xFCF1, 'M', u'يه'), - (0xFCF2, 'M', u'ـَّ'), - (0xFCF3, 'M', u'ـُّ'), - (0xFCF4, 'M', u'ـِّ'), - (0xFCF5, 'M', u'طى'), - (0xFCF6, 'M', u'طي'), - (0xFCF7, 'M', u'عى'), - (0xFCF8, 'M', u'عي'), - (0xFCF9, 'M', u'غى'), - (0xFCFA, 'M', u'غي'), - (0xFCFB, 'M', u'سى'), - (0xFCFC, 'M', u'سي'), - (0xFCFD, 'M', u'شى'), - (0xFCFE, 'M', u'شي'), - (0xFCFF, 'M', u'حى'), - (0xFD00, 'M', u'حي'), - (0xFD01, 'M', u'جى'), - (0xFD02, 'M', u'جي'), - (0xFD03, 'M', u'خى'), - (0xFD04, 'M', u'خي'), - (0xFD05, 'M', u'صى'), - (0xFD06, 'M', u'صي'), - (0xFD07, 'M', u'ضى'), - (0xFD08, 'M', u'ضي'), - (0xFD09, 'M', u'شج'), - (0xFD0A, 'M', u'شح'), - (0xFD0B, 'M', u'شخ'), - (0xFD0C, 'M', u'شم'), - (0xFD0D, 'M', u'شر'), - (0xFD0E, 'M', u'سر'), - (0xFD0F, 'M', u'صر'), - (0xFD10, 'M', u'ضر'), - (0xFD11, 'M', u'طى'), - (0xFD12, 'M', u'طي'), - (0xFD13, 'M', u'عى'), - (0xFD14, 'M', u'عي'), - (0xFD15, 'M', u'غى'), - (0xFD16, 'M', u'غي'), - (0xFD17, 'M', u'سى'), - (0xFD18, 'M', u'سي'), - (0xFD19, 'M', u'شى'), - (0xFD1A, 'M', u'شي'), - (0xFD1B, 'M', u'حى'), - (0xFD1C, 'M', u'حي'), - (0xFD1D, 'M', u'جى'), - (0xFD1E, 'M', u'جي'), - (0xFD1F, 'M', u'خى'), - (0xFD20, 'M', u'خي'), - (0xFD21, 'M', u'صى'), - (0xFD22, 'M', u'صي'), - (0xFD23, 'M', u'ضى'), - (0xFD24, 'M', u'ضي'), - (0xFD25, 'M', u'شج'), - (0xFD26, 'M', u'شح'), - (0xFD27, 'M', u'شخ'), - (0xFD28, 'M', u'شم'), - (0xFD29, 'M', u'شر'), - (0xFD2A, 'M', u'سر'), - (0xFD2B, 'M', u'صر'), - (0xFD2C, 'M', u'ضر'), - (0xFD2D, 'M', u'شج'), - (0xFD2E, 'M', u'شح'), - (0xFD2F, 'M', u'شخ'), - (0xFD30, 'M', u'شم'), - (0xFD31, 'M', u'سه'), - (0xFD32, 'M', u'شه'), - (0xFD33, 'M', u'طم'), - (0xFD34, 'M', u'سج'), - (0xFD35, 'M', u'سح'), - (0xFD36, 'M', u'سخ'), - (0xFD37, 'M', u'شج'), - (0xFD38, 'M', u'شح'), - (0xFD39, 'M', u'شخ'), - (0xFD3A, 'M', u'طم'), - (0xFD3B, 'M', u'ظم'), - (0xFD3C, 'M', u'اً'), - (0xFD3E, 'V'), - (0xFD40, 'X'), - (0xFD50, 'M', u'تجم'), - (0xFD51, 'M', u'تحج'), - (0xFD53, 'M', u'تحم'), - (0xFD54, 'M', u'تخم'), - (0xFD55, 'M', u'تمج'), - (0xFD56, 'M', u'تمح'), - (0xFD57, 'M', u'تمخ'), - (0xFD58, 'M', u'جمح'), - (0xFD5A, 'M', u'حمي'), - (0xFD5B, 'M', u'حمى'), - (0xFD5C, 'M', u'سحج'), - (0xFD5D, 'M', u'سجح'), - (0xFD5E, 'M', u'سجى'), - (0xFD5F, 'M', u'سمح'), - (0xFD61, 'M', u'سمج'), - (0xFD62, 'M', u'سمم'), - (0xFD64, 'M', u'صحح'), - (0xFD66, 'M', u'صمم'), - (0xFD67, 'M', u'شحم'), - (0xFD69, 'M', u'شجي'), - ] - -def _seg_48(): - return [ - (0xFD6A, 'M', u'شمخ'), - (0xFD6C, 'M', u'شمم'), - (0xFD6E, 'M', u'ضحى'), - (0xFD6F, 'M', u'ضخم'), - (0xFD71, 'M', u'طمح'), - (0xFD73, 'M', u'طمم'), - (0xFD74, 'M', u'طمي'), - (0xFD75, 'M', u'عجم'), - (0xFD76, 'M', u'عمم'), - (0xFD78, 'M', u'عمى'), - (0xFD79, 'M', u'غمم'), - (0xFD7A, 'M', u'غمي'), - (0xFD7B, 'M', u'غمى'), - (0xFD7C, 'M', u'فخم'), - (0xFD7E, 'M', u'قمح'), - (0xFD7F, 'M', u'قمم'), - (0xFD80, 'M', u'لحم'), - (0xFD81, 'M', u'لحي'), - (0xFD82, 'M', u'لحى'), - (0xFD83, 'M', u'لجج'), - (0xFD85, 'M', u'لخم'), - (0xFD87, 'M', u'لمح'), - (0xFD89, 'M', u'محج'), - (0xFD8A, 'M', u'محم'), - (0xFD8B, 'M', u'محي'), - (0xFD8C, 'M', u'مجح'), - (0xFD8D, 'M', u'مجم'), - (0xFD8E, 'M', u'مخج'), - (0xFD8F, 'M', u'مخم'), - (0xFD90, 'X'), - (0xFD92, 'M', u'مجخ'), - (0xFD93, 'M', u'همج'), - (0xFD94, 'M', u'همم'), - (0xFD95, 'M', u'نحم'), - (0xFD96, 'M', u'نحى'), - (0xFD97, 'M', u'نجم'), - (0xFD99, 'M', u'نجى'), - (0xFD9A, 'M', u'نمي'), - (0xFD9B, 'M', u'نمى'), - (0xFD9C, 'M', u'يمم'), - (0xFD9E, 'M', u'بخي'), - (0xFD9F, 'M', u'تجي'), - (0xFDA0, 'M', u'تجى'), - (0xFDA1, 'M', u'تخي'), - (0xFDA2, 'M', u'تخى'), - (0xFDA3, 'M', u'تمي'), - (0xFDA4, 'M', u'تمى'), - (0xFDA5, 'M', u'جمي'), - (0xFDA6, 'M', u'جحى'), - (0xFDA7, 'M', u'جمى'), - (0xFDA8, 'M', u'سخى'), - (0xFDA9, 'M', u'صحي'), - (0xFDAA, 'M', u'شحي'), - (0xFDAB, 'M', u'ضحي'), - (0xFDAC, 'M', u'لجي'), - (0xFDAD, 'M', u'لمي'), - (0xFDAE, 'M', u'يحي'), - (0xFDAF, 'M', u'يجي'), - (0xFDB0, 'M', u'يمي'), - (0xFDB1, 'M', u'ممي'), - (0xFDB2, 'M', u'قمي'), - (0xFDB3, 'M', u'نحي'), - (0xFDB4, 'M', u'قمح'), - (0xFDB5, 'M', u'لحم'), - (0xFDB6, 'M', u'عمي'), - (0xFDB7, 'M', u'كمي'), - (0xFDB8, 'M', u'نجح'), - (0xFDB9, 'M', u'مخي'), - (0xFDBA, 'M', u'لجم'), - (0xFDBB, 'M', u'كمم'), - (0xFDBC, 'M', u'لجم'), - (0xFDBD, 'M', u'نجح'), - (0xFDBE, 'M', u'جحي'), - (0xFDBF, 'M', u'حجي'), - (0xFDC0, 'M', u'مجي'), - (0xFDC1, 'M', u'فمي'), - (0xFDC2, 'M', u'بحي'), - (0xFDC3, 'M', u'كمم'), - (0xFDC4, 'M', u'عجم'), - (0xFDC5, 'M', u'صمم'), - (0xFDC6, 'M', u'سخي'), - (0xFDC7, 'M', u'نجي'), - (0xFDC8, 'X'), - (0xFDF0, 'M', u'صلے'), - (0xFDF1, 'M', u'قلے'), - (0xFDF2, 'M', u'الله'), - (0xFDF3, 'M', u'اكبر'), - (0xFDF4, 'M', u'محمد'), - (0xFDF5, 'M', u'صلعم'), - (0xFDF6, 'M', u'رسول'), - (0xFDF7, 'M', u'عليه'), - (0xFDF8, 'M', u'وسلم'), - (0xFDF9, 'M', u'صلى'), - (0xFDFA, '3', u'صلى الله عليه وسلم'), - (0xFDFB, '3', u'جل جلاله'), - (0xFDFC, 'M', u'ریال'), - (0xFDFD, 'V'), - (0xFDFE, 'X'), - (0xFE00, 'I'), - (0xFE10, '3', u','), - ] - -def _seg_49(): - return [ - (0xFE11, 'M', u'、'), - (0xFE12, 'X'), - (0xFE13, '3', u':'), - (0xFE14, '3', u';'), - (0xFE15, '3', u'!'), - (0xFE16, '3', u'?'), - (0xFE17, 'M', u'〖'), - (0xFE18, 'M', u'〗'), - (0xFE19, 'X'), - (0xFE20, 'V'), - (0xFE30, 'X'), - (0xFE31, 'M', u'—'), - (0xFE32, 'M', u'–'), - (0xFE33, '3', u'_'), - (0xFE35, '3', u'('), - (0xFE36, '3', u')'), - (0xFE37, '3', u'{'), - (0xFE38, '3', u'}'), - (0xFE39, 'M', u'〔'), - (0xFE3A, 'M', u'〕'), - (0xFE3B, 'M', u'【'), - (0xFE3C, 'M', u'】'), - (0xFE3D, 'M', u'《'), - (0xFE3E, 'M', u'》'), - (0xFE3F, 'M', u'〈'), - (0xFE40, 'M', u'〉'), - (0xFE41, 'M', u'「'), - (0xFE42, 'M', u'」'), - (0xFE43, 'M', u'『'), - (0xFE44, 'M', u'』'), - (0xFE45, 'V'), - (0xFE47, '3', u'['), - (0xFE48, '3', u']'), - (0xFE49, '3', u' ̅'), - (0xFE4D, '3', u'_'), - (0xFE50, '3', u','), - (0xFE51, 'M', u'、'), - (0xFE52, 'X'), - (0xFE54, '3', u';'), - (0xFE55, '3', u':'), - (0xFE56, '3', u'?'), - (0xFE57, '3', u'!'), - (0xFE58, 'M', u'—'), - (0xFE59, '3', u'('), - (0xFE5A, '3', u')'), - (0xFE5B, '3', u'{'), - (0xFE5C, '3', u'}'), - (0xFE5D, 'M', u'〔'), - (0xFE5E, 'M', u'〕'), - (0xFE5F, '3', u'#'), - (0xFE60, '3', u'&'), - (0xFE61, '3', u'*'), - (0xFE62, '3', u'+'), - (0xFE63, 'M', u'-'), - (0xFE64, '3', u'<'), - (0xFE65, '3', u'>'), - (0xFE66, '3', u'='), - (0xFE67, 'X'), - (0xFE68, '3', u'\\'), - (0xFE69, '3', u'$'), - (0xFE6A, '3', u'%'), - (0xFE6B, '3', u'@'), - (0xFE6C, 'X'), - (0xFE70, '3', u' ً'), - (0xFE71, 'M', u'ـً'), - (0xFE72, '3', u' ٌ'), - (0xFE73, 'V'), - (0xFE74, '3', u' ٍ'), - (0xFE75, 'X'), - (0xFE76, '3', u' َ'), - (0xFE77, 'M', u'ـَ'), - (0xFE78, '3', u' ُ'), - (0xFE79, 'M', u'ـُ'), - (0xFE7A, '3', u' ِ'), - (0xFE7B, 'M', u'ـِ'), - (0xFE7C, '3', u' ّ'), - (0xFE7D, 'M', u'ـّ'), - (0xFE7E, '3', u' ْ'), - (0xFE7F, 'M', u'ـْ'), - (0xFE80, 'M', u'ء'), - (0xFE81, 'M', u'آ'), - (0xFE83, 'M', u'أ'), - (0xFE85, 'M', u'ؤ'), - (0xFE87, 'M', u'إ'), - (0xFE89, 'M', u'ئ'), - (0xFE8D, 'M', u'ا'), - (0xFE8F, 'M', u'ب'), - (0xFE93, 'M', u'ة'), - (0xFE95, 'M', u'ت'), - (0xFE99, 'M', u'ث'), - (0xFE9D, 'M', u'ج'), - (0xFEA1, 'M', u'ح'), - (0xFEA5, 'M', u'خ'), - (0xFEA9, 'M', u'د'), - (0xFEAB, 'M', u'ذ'), - (0xFEAD, 'M', u'ر'), - (0xFEAF, 'M', u'ز'), - (0xFEB1, 'M', u'س'), - (0xFEB5, 'M', u'ش'), - (0xFEB9, 'M', u'ص'), - ] - -def _seg_50(): - return [ - (0xFEBD, 'M', u'ض'), - (0xFEC1, 'M', u'ط'), - (0xFEC5, 'M', u'ظ'), - (0xFEC9, 'M', u'ع'), - (0xFECD, 'M', u'غ'), - (0xFED1, 'M', u'ف'), - (0xFED5, 'M', u'ق'), - (0xFED9, 'M', u'ك'), - (0xFEDD, 'M', u'ل'), - (0xFEE1, 'M', u'م'), - (0xFEE5, 'M', u'ن'), - (0xFEE9, 'M', u'ه'), - (0xFEED, 'M', u'و'), - (0xFEEF, 'M', u'ى'), - (0xFEF1, 'M', u'ي'), - (0xFEF5, 'M', u'لآ'), - (0xFEF7, 'M', u'لأ'), - (0xFEF9, 'M', u'لإ'), - (0xFEFB, 'M', u'لا'), - (0xFEFD, 'X'), - (0xFEFF, 'I'), - (0xFF00, 'X'), - (0xFF01, '3', u'!'), - (0xFF02, '3', u'"'), - (0xFF03, '3', u'#'), - (0xFF04, '3', u'$'), - (0xFF05, '3', u'%'), - (0xFF06, '3', u'&'), - (0xFF07, '3', u'\''), - (0xFF08, '3', u'('), - (0xFF09, '3', u')'), - (0xFF0A, '3', u'*'), - (0xFF0B, '3', u'+'), - (0xFF0C, '3', u','), - (0xFF0D, 'M', u'-'), - (0xFF0E, 'M', u'.'), - (0xFF0F, '3', u'/'), - (0xFF10, 'M', u'0'), - (0xFF11, 'M', u'1'), - (0xFF12, 'M', u'2'), - (0xFF13, 'M', u'3'), - (0xFF14, 'M', u'4'), - (0xFF15, 'M', u'5'), - (0xFF16, 'M', u'6'), - (0xFF17, 'M', u'7'), - (0xFF18, 'M', u'8'), - (0xFF19, 'M', u'9'), - (0xFF1A, '3', u':'), - (0xFF1B, '3', u';'), - (0xFF1C, '3', u'<'), - (0xFF1D, '3', u'='), - (0xFF1E, '3', u'>'), - (0xFF1F, '3', u'?'), - (0xFF20, '3', u'@'), - (0xFF21, 'M', u'a'), - (0xFF22, 'M', u'b'), - (0xFF23, 'M', u'c'), - (0xFF24, 'M', u'd'), - (0xFF25, 'M', u'e'), - (0xFF26, 'M', u'f'), - (0xFF27, 'M', u'g'), - (0xFF28, 'M', u'h'), - (0xFF29, 'M', u'i'), - (0xFF2A, 'M', u'j'), - (0xFF2B, 'M', u'k'), - (0xFF2C, 'M', u'l'), - (0xFF2D, 'M', u'm'), - (0xFF2E, 'M', u'n'), - (0xFF2F, 'M', u'o'), - (0xFF30, 'M', u'p'), - (0xFF31, 'M', u'q'), - (0xFF32, 'M', u'r'), - (0xFF33, 'M', u's'), - (0xFF34, 'M', u't'), - (0xFF35, 'M', u'u'), - (0xFF36, 'M', u'v'), - (0xFF37, 'M', u'w'), - (0xFF38, 'M', u'x'), - (0xFF39, 'M', u'y'), - (0xFF3A, 'M', u'z'), - (0xFF3B, '3', u'['), - (0xFF3C, '3', u'\\'), - (0xFF3D, '3', u']'), - (0xFF3E, '3', u'^'), - (0xFF3F, '3', u'_'), - (0xFF40, '3', u'`'), - (0xFF41, 'M', u'a'), - (0xFF42, 'M', u'b'), - (0xFF43, 'M', u'c'), - (0xFF44, 'M', u'd'), - (0xFF45, 'M', u'e'), - (0xFF46, 'M', u'f'), - (0xFF47, 'M', u'g'), - (0xFF48, 'M', u'h'), - (0xFF49, 'M', u'i'), - (0xFF4A, 'M', u'j'), - (0xFF4B, 'M', u'k'), - (0xFF4C, 'M', u'l'), - (0xFF4D, 'M', u'm'), - (0xFF4E, 'M', u'n'), - ] - -def _seg_51(): - return [ - (0xFF4F, 'M', u'o'), - (0xFF50, 'M', u'p'), - (0xFF51, 'M', u'q'), - (0xFF52, 'M', u'r'), - (0xFF53, 'M', u's'), - (0xFF54, 'M', u't'), - (0xFF55, 'M', u'u'), - (0xFF56, 'M', u'v'), - (0xFF57, 'M', u'w'), - (0xFF58, 'M', u'x'), - (0xFF59, 'M', u'y'), - (0xFF5A, 'M', u'z'), - (0xFF5B, '3', u'{'), - (0xFF5C, '3', u'|'), - (0xFF5D, '3', u'}'), - (0xFF5E, '3', u'~'), - (0xFF5F, 'M', u'⦅'), - (0xFF60, 'M', u'⦆'), - (0xFF61, 'M', u'.'), - (0xFF62, 'M', u'「'), - (0xFF63, 'M', u'」'), - (0xFF64, 'M', u'、'), - (0xFF65, 'M', u'・'), - (0xFF66, 'M', u'ヲ'), - (0xFF67, 'M', u'ァ'), - (0xFF68, 'M', u'ィ'), - (0xFF69, 'M', u'ゥ'), - (0xFF6A, 'M', u'ェ'), - (0xFF6B, 'M', u'ォ'), - (0xFF6C, 'M', u'ャ'), - (0xFF6D, 'M', u'ュ'), - (0xFF6E, 'M', u'ョ'), - (0xFF6F, 'M', u'ッ'), - (0xFF70, 'M', u'ー'), - (0xFF71, 'M', u'ア'), - (0xFF72, 'M', u'イ'), - (0xFF73, 'M', u'ウ'), - (0xFF74, 'M', u'エ'), - (0xFF75, 'M', u'オ'), - (0xFF76, 'M', u'カ'), - (0xFF77, 'M', u'キ'), - (0xFF78, 'M', u'ク'), - (0xFF79, 'M', u'ケ'), - (0xFF7A, 'M', u'コ'), - (0xFF7B, 'M', u'サ'), - (0xFF7C, 'M', u'シ'), - (0xFF7D, 'M', u'ス'), - (0xFF7E, 'M', u'セ'), - (0xFF7F, 'M', u'ソ'), - (0xFF80, 'M', u'タ'), - (0xFF81, 'M', u'チ'), - (0xFF82, 'M', u'ツ'), - (0xFF83, 'M', u'テ'), - (0xFF84, 'M', u'ト'), - (0xFF85, 'M', u'ナ'), - (0xFF86, 'M', u'ニ'), - (0xFF87, 'M', u'ヌ'), - (0xFF88, 'M', u'ネ'), - (0xFF89, 'M', u'ノ'), - (0xFF8A, 'M', u'ハ'), - (0xFF8B, 'M', u'ヒ'), - (0xFF8C, 'M', u'フ'), - (0xFF8D, 'M', u'ヘ'), - (0xFF8E, 'M', u'ホ'), - (0xFF8F, 'M', u'マ'), - (0xFF90, 'M', u'ミ'), - (0xFF91, 'M', u'ム'), - (0xFF92, 'M', u'メ'), - (0xFF93, 'M', u'モ'), - (0xFF94, 'M', u'ヤ'), - (0xFF95, 'M', u'ユ'), - (0xFF96, 'M', u'ヨ'), - (0xFF97, 'M', u'ラ'), - (0xFF98, 'M', u'リ'), - (0xFF99, 'M', u'ル'), - (0xFF9A, 'M', u'レ'), - (0xFF9B, 'M', u'ロ'), - (0xFF9C, 'M', u'ワ'), - (0xFF9D, 'M', u'ン'), - (0xFF9E, 'M', u'゙'), - (0xFF9F, 'M', u'゚'), - (0xFFA0, 'X'), - (0xFFA1, 'M', u'ᄀ'), - (0xFFA2, 'M', u'ᄁ'), - (0xFFA3, 'M', u'ᆪ'), - (0xFFA4, 'M', u'ᄂ'), - (0xFFA5, 'M', u'ᆬ'), - (0xFFA6, 'M', u'ᆭ'), - (0xFFA7, 'M', u'ᄃ'), - (0xFFA8, 'M', u'ᄄ'), - (0xFFA9, 'M', u'ᄅ'), - (0xFFAA, 'M', u'ᆰ'), - (0xFFAB, 'M', u'ᆱ'), - (0xFFAC, 'M', u'ᆲ'), - (0xFFAD, 'M', u'ᆳ'), - (0xFFAE, 'M', u'ᆴ'), - (0xFFAF, 'M', u'ᆵ'), - (0xFFB0, 'M', u'ᄚ'), - (0xFFB1, 'M', u'ᄆ'), - (0xFFB2, 'M', u'ᄇ'), - ] - -def _seg_52(): - return [ - (0xFFB3, 'M', u'ᄈ'), - (0xFFB4, 'M', u'ᄡ'), - (0xFFB5, 'M', u'ᄉ'), - (0xFFB6, 'M', u'ᄊ'), - (0xFFB7, 'M', u'ᄋ'), - (0xFFB8, 'M', u'ᄌ'), - (0xFFB9, 'M', u'ᄍ'), - (0xFFBA, 'M', u'ᄎ'), - (0xFFBB, 'M', u'ᄏ'), - (0xFFBC, 'M', u'ᄐ'), - (0xFFBD, 'M', u'ᄑ'), - (0xFFBE, 'M', u'ᄒ'), - (0xFFBF, 'X'), - (0xFFC2, 'M', u'ᅡ'), - (0xFFC3, 'M', u'ᅢ'), - (0xFFC4, 'M', u'ᅣ'), - (0xFFC5, 'M', u'ᅤ'), - (0xFFC6, 'M', u'ᅥ'), - (0xFFC7, 'M', u'ᅦ'), - (0xFFC8, 'X'), - (0xFFCA, 'M', u'ᅧ'), - (0xFFCB, 'M', u'ᅨ'), - (0xFFCC, 'M', u'ᅩ'), - (0xFFCD, 'M', u'ᅪ'), - (0xFFCE, 'M', u'ᅫ'), - (0xFFCF, 'M', u'ᅬ'), - (0xFFD0, 'X'), - (0xFFD2, 'M', u'ᅭ'), - (0xFFD3, 'M', u'ᅮ'), - (0xFFD4, 'M', u'ᅯ'), - (0xFFD5, 'M', u'ᅰ'), - (0xFFD6, 'M', u'ᅱ'), - (0xFFD7, 'M', u'ᅲ'), - (0xFFD8, 'X'), - (0xFFDA, 'M', u'ᅳ'), - (0xFFDB, 'M', u'ᅴ'), - (0xFFDC, 'M', u'ᅵ'), - (0xFFDD, 'X'), - (0xFFE0, 'M', u'¢'), - (0xFFE1, 'M', u'£'), - (0xFFE2, 'M', u'¬'), - (0xFFE3, '3', u' ̄'), - (0xFFE4, 'M', u'¦'), - (0xFFE5, 'M', u'¥'), - (0xFFE6, 'M', u'₩'), - (0xFFE7, 'X'), - (0xFFE8, 'M', u'│'), - (0xFFE9, 'M', u'←'), - (0xFFEA, 'M', u'↑'), - (0xFFEB, 'M', u'→'), - (0xFFEC, 'M', u'↓'), - (0xFFED, 'M', u'■'), - (0xFFEE, 'M', u'○'), - (0xFFEF, 'X'), - (0x10000, 'V'), - (0x1000C, 'X'), - (0x1000D, 'V'), - (0x10027, 'X'), - (0x10028, 'V'), - (0x1003B, 'X'), - (0x1003C, 'V'), - (0x1003E, 'X'), - (0x1003F, 'V'), - (0x1004E, 'X'), - (0x10050, 'V'), - (0x1005E, 'X'), - (0x10080, 'V'), - (0x100FB, 'X'), - (0x10100, 'V'), - (0x10103, 'X'), - (0x10107, 'V'), - (0x10134, 'X'), - (0x10137, 'V'), - (0x1018F, 'X'), - (0x10190, 'V'), - (0x1019C, 'X'), - (0x101A0, 'V'), - (0x101A1, 'X'), - (0x101D0, 'V'), - (0x101FE, 'X'), - (0x10280, 'V'), - (0x1029D, 'X'), - (0x102A0, 'V'), - (0x102D1, 'X'), - (0x102E0, 'V'), - (0x102FC, 'X'), - (0x10300, 'V'), - (0x10324, 'X'), - (0x1032D, 'V'), - (0x1034B, 'X'), - (0x10350, 'V'), - (0x1037B, 'X'), - (0x10380, 'V'), - (0x1039E, 'X'), - (0x1039F, 'V'), - (0x103C4, 'X'), - (0x103C8, 'V'), - (0x103D6, 'X'), - (0x10400, 'M', u'𐐨'), - (0x10401, 'M', u'𐐩'), - ] - -def _seg_53(): - return [ - (0x10402, 'M', u'𐐪'), - (0x10403, 'M', u'𐐫'), - (0x10404, 'M', u'𐐬'), - (0x10405, 'M', u'𐐭'), - (0x10406, 'M', u'𐐮'), - (0x10407, 'M', u'𐐯'), - (0x10408, 'M', u'𐐰'), - (0x10409, 'M', u'𐐱'), - (0x1040A, 'M', u'𐐲'), - (0x1040B, 'M', u'𐐳'), - (0x1040C, 'M', u'𐐴'), - (0x1040D, 'M', u'𐐵'), - (0x1040E, 'M', u'𐐶'), - (0x1040F, 'M', u'𐐷'), - (0x10410, 'M', u'𐐸'), - (0x10411, 'M', u'𐐹'), - (0x10412, 'M', u'𐐺'), - (0x10413, 'M', u'𐐻'), - (0x10414, 'M', u'𐐼'), - (0x10415, 'M', u'𐐽'), - (0x10416, 'M', u'𐐾'), - (0x10417, 'M', u'𐐿'), - (0x10418, 'M', u'𐑀'), - (0x10419, 'M', u'𐑁'), - (0x1041A, 'M', u'𐑂'), - (0x1041B, 'M', u'𐑃'), - (0x1041C, 'M', u'𐑄'), - (0x1041D, 'M', u'𐑅'), - (0x1041E, 'M', u'𐑆'), - (0x1041F, 'M', u'𐑇'), - (0x10420, 'M', u'𐑈'), - (0x10421, 'M', u'𐑉'), - (0x10422, 'M', u'𐑊'), - (0x10423, 'M', u'𐑋'), - (0x10424, 'M', u'𐑌'), - (0x10425, 'M', u'𐑍'), - (0x10426, 'M', u'𐑎'), - (0x10427, 'M', u'𐑏'), - (0x10428, 'V'), - (0x1049E, 'X'), - (0x104A0, 'V'), - (0x104AA, 'X'), - (0x104B0, 'M', u'𐓘'), - (0x104B1, 'M', u'𐓙'), - (0x104B2, 'M', u'𐓚'), - (0x104B3, 'M', u'𐓛'), - (0x104B4, 'M', u'𐓜'), - (0x104B5, 'M', u'𐓝'), - (0x104B6, 'M', u'𐓞'), - (0x104B7, 'M', u'𐓟'), - (0x104B8, 'M', u'𐓠'), - (0x104B9, 'M', u'𐓡'), - (0x104BA, 'M', u'𐓢'), - (0x104BB, 'M', u'𐓣'), - (0x104BC, 'M', u'𐓤'), - (0x104BD, 'M', u'𐓥'), - (0x104BE, 'M', u'𐓦'), - (0x104BF, 'M', u'𐓧'), - (0x104C0, 'M', u'𐓨'), - (0x104C1, 'M', u'𐓩'), - (0x104C2, 'M', u'𐓪'), - (0x104C3, 'M', u'𐓫'), - (0x104C4, 'M', u'𐓬'), - (0x104C5, 'M', u'𐓭'), - (0x104C6, 'M', u'𐓮'), - (0x104C7, 'M', u'𐓯'), - (0x104C8, 'M', u'𐓰'), - (0x104C9, 'M', u'𐓱'), - (0x104CA, 'M', u'𐓲'), - (0x104CB, 'M', u'𐓳'), - (0x104CC, 'M', u'𐓴'), - (0x104CD, 'M', u'𐓵'), - (0x104CE, 'M', u'𐓶'), - (0x104CF, 'M', u'𐓷'), - (0x104D0, 'M', u'𐓸'), - (0x104D1, 'M', u'𐓹'), - (0x104D2, 'M', u'𐓺'), - (0x104D3, 'M', u'𐓻'), - (0x104D4, 'X'), - (0x104D8, 'V'), - (0x104FC, 'X'), - (0x10500, 'V'), - (0x10528, 'X'), - (0x10530, 'V'), - (0x10564, 'X'), - (0x1056F, 'V'), - (0x10570, 'X'), - (0x10600, 'V'), - (0x10737, 'X'), - (0x10740, 'V'), - (0x10756, 'X'), - (0x10760, 'V'), - (0x10768, 'X'), - (0x10800, 'V'), - (0x10806, 'X'), - (0x10808, 'V'), - (0x10809, 'X'), - (0x1080A, 'V'), - (0x10836, 'X'), - (0x10837, 'V'), - ] - -def _seg_54(): - return [ - (0x10839, 'X'), - (0x1083C, 'V'), - (0x1083D, 'X'), - (0x1083F, 'V'), - (0x10856, 'X'), - (0x10857, 'V'), - (0x1089F, 'X'), - (0x108A7, 'V'), - (0x108B0, 'X'), - (0x108E0, 'V'), - (0x108F3, 'X'), - (0x108F4, 'V'), - (0x108F6, 'X'), - (0x108FB, 'V'), - (0x1091C, 'X'), - (0x1091F, 'V'), - (0x1093A, 'X'), - (0x1093F, 'V'), - (0x10940, 'X'), - (0x10980, 'V'), - (0x109B8, 'X'), - (0x109BC, 'V'), - (0x109D0, 'X'), - (0x109D2, 'V'), - (0x10A04, 'X'), - (0x10A05, 'V'), - (0x10A07, 'X'), - (0x10A0C, 'V'), - (0x10A14, 'X'), - (0x10A15, 'V'), - (0x10A18, 'X'), - (0x10A19, 'V'), - (0x10A36, 'X'), - (0x10A38, 'V'), - (0x10A3B, 'X'), - (0x10A3F, 'V'), - (0x10A49, 'X'), - (0x10A50, 'V'), - (0x10A59, 'X'), - (0x10A60, 'V'), - (0x10AA0, 'X'), - (0x10AC0, 'V'), - (0x10AE7, 'X'), - (0x10AEB, 'V'), - (0x10AF7, 'X'), - (0x10B00, 'V'), - (0x10B36, 'X'), - (0x10B39, 'V'), - (0x10B56, 'X'), - (0x10B58, 'V'), - (0x10B73, 'X'), - (0x10B78, 'V'), - (0x10B92, 'X'), - (0x10B99, 'V'), - (0x10B9D, 'X'), - (0x10BA9, 'V'), - (0x10BB0, 'X'), - (0x10C00, 'V'), - (0x10C49, 'X'), - (0x10C80, 'M', u'𐳀'), - (0x10C81, 'M', u'𐳁'), - (0x10C82, 'M', u'𐳂'), - (0x10C83, 'M', u'𐳃'), - (0x10C84, 'M', u'𐳄'), - (0x10C85, 'M', u'𐳅'), - (0x10C86, 'M', u'𐳆'), - (0x10C87, 'M', u'𐳇'), - (0x10C88, 'M', u'𐳈'), - (0x10C89, 'M', u'𐳉'), - (0x10C8A, 'M', u'𐳊'), - (0x10C8B, 'M', u'𐳋'), - (0x10C8C, 'M', u'𐳌'), - (0x10C8D, 'M', u'𐳍'), - (0x10C8E, 'M', u'𐳎'), - (0x10C8F, 'M', u'𐳏'), - (0x10C90, 'M', u'𐳐'), - (0x10C91, 'M', u'𐳑'), - (0x10C92, 'M', u'𐳒'), - (0x10C93, 'M', u'𐳓'), - (0x10C94, 'M', u'𐳔'), - (0x10C95, 'M', u'𐳕'), - (0x10C96, 'M', u'𐳖'), - (0x10C97, 'M', u'𐳗'), - (0x10C98, 'M', u'𐳘'), - (0x10C99, 'M', u'𐳙'), - (0x10C9A, 'M', u'𐳚'), - (0x10C9B, 'M', u'𐳛'), - (0x10C9C, 'M', u'𐳜'), - (0x10C9D, 'M', u'𐳝'), - (0x10C9E, 'M', u'𐳞'), - (0x10C9F, 'M', u'𐳟'), - (0x10CA0, 'M', u'𐳠'), - (0x10CA1, 'M', u'𐳡'), - (0x10CA2, 'M', u'𐳢'), - (0x10CA3, 'M', u'𐳣'), - (0x10CA4, 'M', u'𐳤'), - (0x10CA5, 'M', u'𐳥'), - (0x10CA6, 'M', u'𐳦'), - (0x10CA7, 'M', u'𐳧'), - (0x10CA8, 'M', u'𐳨'), - ] - -def _seg_55(): - return [ - (0x10CA9, 'M', u'𐳩'), - (0x10CAA, 'M', u'𐳪'), - (0x10CAB, 'M', u'𐳫'), - (0x10CAC, 'M', u'𐳬'), - (0x10CAD, 'M', u'𐳭'), - (0x10CAE, 'M', u'𐳮'), - (0x10CAF, 'M', u'𐳯'), - (0x10CB0, 'M', u'𐳰'), - (0x10CB1, 'M', u'𐳱'), - (0x10CB2, 'M', u'𐳲'), - (0x10CB3, 'X'), - (0x10CC0, 'V'), - (0x10CF3, 'X'), - (0x10CFA, 'V'), - (0x10D28, 'X'), - (0x10D30, 'V'), - (0x10D3A, 'X'), - (0x10E60, 'V'), - (0x10E7F, 'X'), - (0x10F00, 'V'), - (0x10F28, 'X'), - (0x10F30, 'V'), - (0x10F5A, 'X'), - (0x11000, 'V'), - (0x1104E, 'X'), - (0x11052, 'V'), - (0x11070, 'X'), - (0x1107F, 'V'), - (0x110BD, 'X'), - (0x110BE, 'V'), - (0x110C2, 'X'), - (0x110D0, 'V'), - (0x110E9, 'X'), - (0x110F0, 'V'), - (0x110FA, 'X'), - (0x11100, 'V'), - (0x11135, 'X'), - (0x11136, 'V'), - (0x11147, 'X'), - (0x11150, 'V'), - (0x11177, 'X'), - (0x11180, 'V'), - (0x111CE, 'X'), - (0x111D0, 'V'), - (0x111E0, 'X'), - (0x111E1, 'V'), - (0x111F5, 'X'), - (0x11200, 'V'), - (0x11212, 'X'), - (0x11213, 'V'), - (0x1123F, 'X'), - (0x11280, 'V'), - (0x11287, 'X'), - (0x11288, 'V'), - (0x11289, 'X'), - (0x1128A, 'V'), - (0x1128E, 'X'), - (0x1128F, 'V'), - (0x1129E, 'X'), - (0x1129F, 'V'), - (0x112AA, 'X'), - (0x112B0, 'V'), - (0x112EB, 'X'), - (0x112F0, 'V'), - (0x112FA, 'X'), - (0x11300, 'V'), - (0x11304, 'X'), - (0x11305, 'V'), - (0x1130D, 'X'), - (0x1130F, 'V'), - (0x11311, 'X'), - (0x11313, 'V'), - (0x11329, 'X'), - (0x1132A, 'V'), - (0x11331, 'X'), - (0x11332, 'V'), - (0x11334, 'X'), - (0x11335, 'V'), - (0x1133A, 'X'), - (0x1133B, 'V'), - (0x11345, 'X'), - (0x11347, 'V'), - (0x11349, 'X'), - (0x1134B, 'V'), - (0x1134E, 'X'), - (0x11350, 'V'), - (0x11351, 'X'), - (0x11357, 'V'), - (0x11358, 'X'), - (0x1135D, 'V'), - (0x11364, 'X'), - (0x11366, 'V'), - (0x1136D, 'X'), - (0x11370, 'V'), - (0x11375, 'X'), - (0x11400, 'V'), - (0x1145A, 'X'), - (0x1145B, 'V'), - (0x1145C, 'X'), - (0x1145D, 'V'), - ] - -def _seg_56(): - return [ - (0x1145F, 'X'), - (0x11480, 'V'), - (0x114C8, 'X'), - (0x114D0, 'V'), - (0x114DA, 'X'), - (0x11580, 'V'), - (0x115B6, 'X'), - (0x115B8, 'V'), - (0x115DE, 'X'), - (0x11600, 'V'), - (0x11645, 'X'), - (0x11650, 'V'), - (0x1165A, 'X'), - (0x11660, 'V'), - (0x1166D, 'X'), - (0x11680, 'V'), - (0x116B8, 'X'), - (0x116C0, 'V'), - (0x116CA, 'X'), - (0x11700, 'V'), - (0x1171B, 'X'), - (0x1171D, 'V'), - (0x1172C, 'X'), - (0x11730, 'V'), - (0x11740, 'X'), - (0x11800, 'V'), - (0x1183C, 'X'), - (0x118A0, 'M', u'𑣀'), - (0x118A1, 'M', u'𑣁'), - (0x118A2, 'M', u'𑣂'), - (0x118A3, 'M', u'𑣃'), - (0x118A4, 'M', u'𑣄'), - (0x118A5, 'M', u'𑣅'), - (0x118A6, 'M', u'𑣆'), - (0x118A7, 'M', u'𑣇'), - (0x118A8, 'M', u'𑣈'), - (0x118A9, 'M', u'𑣉'), - (0x118AA, 'M', u'𑣊'), - (0x118AB, 'M', u'𑣋'), - (0x118AC, 'M', u'𑣌'), - (0x118AD, 'M', u'𑣍'), - (0x118AE, 'M', u'𑣎'), - (0x118AF, 'M', u'𑣏'), - (0x118B0, 'M', u'𑣐'), - (0x118B1, 'M', u'𑣑'), - (0x118B2, 'M', u'𑣒'), - (0x118B3, 'M', u'𑣓'), - (0x118B4, 'M', u'𑣔'), - (0x118B5, 'M', u'𑣕'), - (0x118B6, 'M', u'𑣖'), - (0x118B7, 'M', u'𑣗'), - (0x118B8, 'M', u'𑣘'), - (0x118B9, 'M', u'𑣙'), - (0x118BA, 'M', u'𑣚'), - (0x118BB, 'M', u'𑣛'), - (0x118BC, 'M', u'𑣜'), - (0x118BD, 'M', u'𑣝'), - (0x118BE, 'M', u'𑣞'), - (0x118BF, 'M', u'𑣟'), - (0x118C0, 'V'), - (0x118F3, 'X'), - (0x118FF, 'V'), - (0x11900, 'X'), - (0x11A00, 'V'), - (0x11A48, 'X'), - (0x11A50, 'V'), - (0x11A84, 'X'), - (0x11A86, 'V'), - (0x11AA3, 'X'), - (0x11AC0, 'V'), - (0x11AF9, 'X'), - (0x11C00, 'V'), - (0x11C09, 'X'), - (0x11C0A, 'V'), - (0x11C37, 'X'), - (0x11C38, 'V'), - (0x11C46, 'X'), - (0x11C50, 'V'), - (0x11C6D, 'X'), - (0x11C70, 'V'), - (0x11C90, 'X'), - (0x11C92, 'V'), - (0x11CA8, 'X'), - (0x11CA9, 'V'), - (0x11CB7, 'X'), - (0x11D00, 'V'), - (0x11D07, 'X'), - (0x11D08, 'V'), - (0x11D0A, 'X'), - (0x11D0B, 'V'), - (0x11D37, 'X'), - (0x11D3A, 'V'), - (0x11D3B, 'X'), - (0x11D3C, 'V'), - (0x11D3E, 'X'), - (0x11D3F, 'V'), - (0x11D48, 'X'), - (0x11D50, 'V'), - (0x11D5A, 'X'), - (0x11D60, 'V'), - ] - -def _seg_57(): - return [ - (0x11D66, 'X'), - (0x11D67, 'V'), - (0x11D69, 'X'), - (0x11D6A, 'V'), - (0x11D8F, 'X'), - (0x11D90, 'V'), - (0x11D92, 'X'), - (0x11D93, 'V'), - (0x11D99, 'X'), - (0x11DA0, 'V'), - (0x11DAA, 'X'), - (0x11EE0, 'V'), - (0x11EF9, 'X'), - (0x12000, 'V'), - (0x1239A, 'X'), - (0x12400, 'V'), - (0x1246F, 'X'), - (0x12470, 'V'), - (0x12475, 'X'), - (0x12480, 'V'), - (0x12544, 'X'), - (0x13000, 'V'), - (0x1342F, 'X'), - (0x14400, 'V'), - (0x14647, 'X'), - (0x16800, 'V'), - (0x16A39, 'X'), - (0x16A40, 'V'), - (0x16A5F, 'X'), - (0x16A60, 'V'), - (0x16A6A, 'X'), - (0x16A6E, 'V'), - (0x16A70, 'X'), - (0x16AD0, 'V'), - (0x16AEE, 'X'), - (0x16AF0, 'V'), - (0x16AF6, 'X'), - (0x16B00, 'V'), - (0x16B46, 'X'), - (0x16B50, 'V'), - (0x16B5A, 'X'), - (0x16B5B, 'V'), - (0x16B62, 'X'), - (0x16B63, 'V'), - (0x16B78, 'X'), - (0x16B7D, 'V'), - (0x16B90, 'X'), - (0x16E60, 'V'), - (0x16E9B, 'X'), - (0x16F00, 'V'), - (0x16F45, 'X'), - (0x16F50, 'V'), - (0x16F7F, 'X'), - (0x16F8F, 'V'), - (0x16FA0, 'X'), - (0x16FE0, 'V'), - (0x16FE2, 'X'), - (0x17000, 'V'), - (0x187F2, 'X'), - (0x18800, 'V'), - (0x18AF3, 'X'), - (0x1B000, 'V'), - (0x1B11F, 'X'), - (0x1B170, 'V'), - (0x1B2FC, 'X'), - (0x1BC00, 'V'), - (0x1BC6B, 'X'), - (0x1BC70, 'V'), - (0x1BC7D, 'X'), - (0x1BC80, 'V'), - (0x1BC89, 'X'), - (0x1BC90, 'V'), - (0x1BC9A, 'X'), - (0x1BC9C, 'V'), - (0x1BCA0, 'I'), - (0x1BCA4, 'X'), - (0x1D000, 'V'), - (0x1D0F6, 'X'), - (0x1D100, 'V'), - (0x1D127, 'X'), - (0x1D129, 'V'), - (0x1D15E, 'M', u'𝅗𝅥'), - (0x1D15F, 'M', u'𝅘𝅥'), - (0x1D160, 'M', u'𝅘𝅥𝅮'), - (0x1D161, 'M', u'𝅘𝅥𝅯'), - (0x1D162, 'M', u'𝅘𝅥𝅰'), - (0x1D163, 'M', u'𝅘𝅥𝅱'), - (0x1D164, 'M', u'𝅘𝅥𝅲'), - (0x1D165, 'V'), - (0x1D173, 'X'), - (0x1D17B, 'V'), - (0x1D1BB, 'M', u'𝆹𝅥'), - (0x1D1BC, 'M', u'𝆺𝅥'), - (0x1D1BD, 'M', u'𝆹𝅥𝅮'), - (0x1D1BE, 'M', u'𝆺𝅥𝅮'), - (0x1D1BF, 'M', u'𝆹𝅥𝅯'), - (0x1D1C0, 'M', u'𝆺𝅥𝅯'), - (0x1D1C1, 'V'), - (0x1D1E9, 'X'), - (0x1D200, 'V'), - ] - -def _seg_58(): - return [ - (0x1D246, 'X'), - (0x1D2E0, 'V'), - (0x1D2F4, 'X'), - (0x1D300, 'V'), - (0x1D357, 'X'), - (0x1D360, 'V'), - (0x1D379, 'X'), - (0x1D400, 'M', u'a'), - (0x1D401, 'M', u'b'), - (0x1D402, 'M', u'c'), - (0x1D403, 'M', u'd'), - (0x1D404, 'M', u'e'), - (0x1D405, 'M', u'f'), - (0x1D406, 'M', u'g'), - (0x1D407, 'M', u'h'), - (0x1D408, 'M', u'i'), - (0x1D409, 'M', u'j'), - (0x1D40A, 'M', u'k'), - (0x1D40B, 'M', u'l'), - (0x1D40C, 'M', u'm'), - (0x1D40D, 'M', u'n'), - (0x1D40E, 'M', u'o'), - (0x1D40F, 'M', u'p'), - (0x1D410, 'M', u'q'), - (0x1D411, 'M', u'r'), - (0x1D412, 'M', u's'), - (0x1D413, 'M', u't'), - (0x1D414, 'M', u'u'), - (0x1D415, 'M', u'v'), - (0x1D416, 'M', u'w'), - (0x1D417, 'M', u'x'), - (0x1D418, 'M', u'y'), - (0x1D419, 'M', u'z'), - (0x1D41A, 'M', u'a'), - (0x1D41B, 'M', u'b'), - (0x1D41C, 'M', u'c'), - (0x1D41D, 'M', u'd'), - (0x1D41E, 'M', u'e'), - (0x1D41F, 'M', u'f'), - (0x1D420, 'M', u'g'), - (0x1D421, 'M', u'h'), - (0x1D422, 'M', u'i'), - (0x1D423, 'M', u'j'), - (0x1D424, 'M', u'k'), - (0x1D425, 'M', u'l'), - (0x1D426, 'M', u'm'), - (0x1D427, 'M', u'n'), - (0x1D428, 'M', u'o'), - (0x1D429, 'M', u'p'), - (0x1D42A, 'M', u'q'), - (0x1D42B, 'M', u'r'), - (0x1D42C, 'M', u's'), - (0x1D42D, 'M', u't'), - (0x1D42E, 'M', u'u'), - (0x1D42F, 'M', u'v'), - (0x1D430, 'M', u'w'), - (0x1D431, 'M', u'x'), - (0x1D432, 'M', u'y'), - (0x1D433, 'M', u'z'), - (0x1D434, 'M', u'a'), - (0x1D435, 'M', u'b'), - (0x1D436, 'M', u'c'), - (0x1D437, 'M', u'd'), - (0x1D438, 'M', u'e'), - (0x1D439, 'M', u'f'), - (0x1D43A, 'M', u'g'), - (0x1D43B, 'M', u'h'), - (0x1D43C, 'M', u'i'), - (0x1D43D, 'M', u'j'), - (0x1D43E, 'M', u'k'), - (0x1D43F, 'M', u'l'), - (0x1D440, 'M', u'm'), - (0x1D441, 'M', u'n'), - (0x1D442, 'M', u'o'), - (0x1D443, 'M', u'p'), - (0x1D444, 'M', u'q'), - (0x1D445, 'M', u'r'), - (0x1D446, 'M', u's'), - (0x1D447, 'M', u't'), - (0x1D448, 'M', u'u'), - (0x1D449, 'M', u'v'), - (0x1D44A, 'M', u'w'), - (0x1D44B, 'M', u'x'), - (0x1D44C, 'M', u'y'), - (0x1D44D, 'M', u'z'), - (0x1D44E, 'M', u'a'), - (0x1D44F, 'M', u'b'), - (0x1D450, 'M', u'c'), - (0x1D451, 'M', u'd'), - (0x1D452, 'M', u'e'), - (0x1D453, 'M', u'f'), - (0x1D454, 'M', u'g'), - (0x1D455, 'X'), - (0x1D456, 'M', u'i'), - (0x1D457, 'M', u'j'), - (0x1D458, 'M', u'k'), - (0x1D459, 'M', u'l'), - (0x1D45A, 'M', u'm'), - (0x1D45B, 'M', u'n'), - (0x1D45C, 'M', u'o'), - ] - -def _seg_59(): - return [ - (0x1D45D, 'M', u'p'), - (0x1D45E, 'M', u'q'), - (0x1D45F, 'M', u'r'), - (0x1D460, 'M', u's'), - (0x1D461, 'M', u't'), - (0x1D462, 'M', u'u'), - (0x1D463, 'M', u'v'), - (0x1D464, 'M', u'w'), - (0x1D465, 'M', u'x'), - (0x1D466, 'M', u'y'), - (0x1D467, 'M', u'z'), - (0x1D468, 'M', u'a'), - (0x1D469, 'M', u'b'), - (0x1D46A, 'M', u'c'), - (0x1D46B, 'M', u'd'), - (0x1D46C, 'M', u'e'), - (0x1D46D, 'M', u'f'), - (0x1D46E, 'M', u'g'), - (0x1D46F, 'M', u'h'), - (0x1D470, 'M', u'i'), - (0x1D471, 'M', u'j'), - (0x1D472, 'M', u'k'), - (0x1D473, 'M', u'l'), - (0x1D474, 'M', u'm'), - (0x1D475, 'M', u'n'), - (0x1D476, 'M', u'o'), - (0x1D477, 'M', u'p'), - (0x1D478, 'M', u'q'), - (0x1D479, 'M', u'r'), - (0x1D47A, 'M', u's'), - (0x1D47B, 'M', u't'), - (0x1D47C, 'M', u'u'), - (0x1D47D, 'M', u'v'), - (0x1D47E, 'M', u'w'), - (0x1D47F, 'M', u'x'), - (0x1D480, 'M', u'y'), - (0x1D481, 'M', u'z'), - (0x1D482, 'M', u'a'), - (0x1D483, 'M', u'b'), - (0x1D484, 'M', u'c'), - (0x1D485, 'M', u'd'), - (0x1D486, 'M', u'e'), - (0x1D487, 'M', u'f'), - (0x1D488, 'M', u'g'), - (0x1D489, 'M', u'h'), - (0x1D48A, 'M', u'i'), - (0x1D48B, 'M', u'j'), - (0x1D48C, 'M', u'k'), - (0x1D48D, 'M', u'l'), - (0x1D48E, 'M', u'm'), - (0x1D48F, 'M', u'n'), - (0x1D490, 'M', u'o'), - (0x1D491, 'M', u'p'), - (0x1D492, 'M', u'q'), - (0x1D493, 'M', u'r'), - (0x1D494, 'M', u's'), - (0x1D495, 'M', u't'), - (0x1D496, 'M', u'u'), - (0x1D497, 'M', u'v'), - (0x1D498, 'M', u'w'), - (0x1D499, 'M', u'x'), - (0x1D49A, 'M', u'y'), - (0x1D49B, 'M', u'z'), - (0x1D49C, 'M', u'a'), - (0x1D49D, 'X'), - (0x1D49E, 'M', u'c'), - (0x1D49F, 'M', u'd'), - (0x1D4A0, 'X'), - (0x1D4A2, 'M', u'g'), - (0x1D4A3, 'X'), - (0x1D4A5, 'M', u'j'), - (0x1D4A6, 'M', u'k'), - (0x1D4A7, 'X'), - (0x1D4A9, 'M', u'n'), - (0x1D4AA, 'M', u'o'), - (0x1D4AB, 'M', u'p'), - (0x1D4AC, 'M', u'q'), - (0x1D4AD, 'X'), - (0x1D4AE, 'M', u's'), - (0x1D4AF, 'M', u't'), - (0x1D4B0, 'M', u'u'), - (0x1D4B1, 'M', u'v'), - (0x1D4B2, 'M', u'w'), - (0x1D4B3, 'M', u'x'), - (0x1D4B4, 'M', u'y'), - (0x1D4B5, 'M', u'z'), - (0x1D4B6, 'M', u'a'), - (0x1D4B7, 'M', u'b'), - (0x1D4B8, 'M', u'c'), - (0x1D4B9, 'M', u'd'), - (0x1D4BA, 'X'), - (0x1D4BB, 'M', u'f'), - (0x1D4BC, 'X'), - (0x1D4BD, 'M', u'h'), - (0x1D4BE, 'M', u'i'), - (0x1D4BF, 'M', u'j'), - (0x1D4C0, 'M', u'k'), - (0x1D4C1, 'M', u'l'), - (0x1D4C2, 'M', u'm'), - (0x1D4C3, 'M', u'n'), - ] - -def _seg_60(): - return [ - (0x1D4C4, 'X'), - (0x1D4C5, 'M', u'p'), - (0x1D4C6, 'M', u'q'), - (0x1D4C7, 'M', u'r'), - (0x1D4C8, 'M', u's'), - (0x1D4C9, 'M', u't'), - (0x1D4CA, 'M', u'u'), - (0x1D4CB, 'M', u'v'), - (0x1D4CC, 'M', u'w'), - (0x1D4CD, 'M', u'x'), - (0x1D4CE, 'M', u'y'), - (0x1D4CF, 'M', u'z'), - (0x1D4D0, 'M', u'a'), - (0x1D4D1, 'M', u'b'), - (0x1D4D2, 'M', u'c'), - (0x1D4D3, 'M', u'd'), - (0x1D4D4, 'M', u'e'), - (0x1D4D5, 'M', u'f'), - (0x1D4D6, 'M', u'g'), - (0x1D4D7, 'M', u'h'), - (0x1D4D8, 'M', u'i'), - (0x1D4D9, 'M', u'j'), - (0x1D4DA, 'M', u'k'), - (0x1D4DB, 'M', u'l'), - (0x1D4DC, 'M', u'm'), - (0x1D4DD, 'M', u'n'), - (0x1D4DE, 'M', u'o'), - (0x1D4DF, 'M', u'p'), - (0x1D4E0, 'M', u'q'), - (0x1D4E1, 'M', u'r'), - (0x1D4E2, 'M', u's'), - (0x1D4E3, 'M', u't'), - (0x1D4E4, 'M', u'u'), - (0x1D4E5, 'M', u'v'), - (0x1D4E6, 'M', u'w'), - (0x1D4E7, 'M', u'x'), - (0x1D4E8, 'M', u'y'), - (0x1D4E9, 'M', u'z'), - (0x1D4EA, 'M', u'a'), - (0x1D4EB, 'M', u'b'), - (0x1D4EC, 'M', u'c'), - (0x1D4ED, 'M', u'd'), - (0x1D4EE, 'M', u'e'), - (0x1D4EF, 'M', u'f'), - (0x1D4F0, 'M', u'g'), - (0x1D4F1, 'M', u'h'), - (0x1D4F2, 'M', u'i'), - (0x1D4F3, 'M', u'j'), - (0x1D4F4, 'M', u'k'), - (0x1D4F5, 'M', u'l'), - (0x1D4F6, 'M', u'm'), - (0x1D4F7, 'M', u'n'), - (0x1D4F8, 'M', u'o'), - (0x1D4F9, 'M', u'p'), - (0x1D4FA, 'M', u'q'), - (0x1D4FB, 'M', u'r'), - (0x1D4FC, 'M', u's'), - (0x1D4FD, 'M', u't'), - (0x1D4FE, 'M', u'u'), - (0x1D4FF, 'M', u'v'), - (0x1D500, 'M', u'w'), - (0x1D501, 'M', u'x'), - (0x1D502, 'M', u'y'), - (0x1D503, 'M', u'z'), - (0x1D504, 'M', u'a'), - (0x1D505, 'M', u'b'), - (0x1D506, 'X'), - (0x1D507, 'M', u'd'), - (0x1D508, 'M', u'e'), - (0x1D509, 'M', u'f'), - (0x1D50A, 'M', u'g'), - (0x1D50B, 'X'), - (0x1D50D, 'M', u'j'), - (0x1D50E, 'M', u'k'), - (0x1D50F, 'M', u'l'), - (0x1D510, 'M', u'm'), - (0x1D511, 'M', u'n'), - (0x1D512, 'M', u'o'), - (0x1D513, 'M', u'p'), - (0x1D514, 'M', u'q'), - (0x1D515, 'X'), - (0x1D516, 'M', u's'), - (0x1D517, 'M', u't'), - (0x1D518, 'M', u'u'), - (0x1D519, 'M', u'v'), - (0x1D51A, 'M', u'w'), - (0x1D51B, 'M', u'x'), - (0x1D51C, 'M', u'y'), - (0x1D51D, 'X'), - (0x1D51E, 'M', u'a'), - (0x1D51F, 'M', u'b'), - (0x1D520, 'M', u'c'), - (0x1D521, 'M', u'd'), - (0x1D522, 'M', u'e'), - (0x1D523, 'M', u'f'), - (0x1D524, 'M', u'g'), - (0x1D525, 'M', u'h'), - (0x1D526, 'M', u'i'), - (0x1D527, 'M', u'j'), - (0x1D528, 'M', u'k'), - ] - -def _seg_61(): - return [ - (0x1D529, 'M', u'l'), - (0x1D52A, 'M', u'm'), - (0x1D52B, 'M', u'n'), - (0x1D52C, 'M', u'o'), - (0x1D52D, 'M', u'p'), - (0x1D52E, 'M', u'q'), - (0x1D52F, 'M', u'r'), - (0x1D530, 'M', u's'), - (0x1D531, 'M', u't'), - (0x1D532, 'M', u'u'), - (0x1D533, 'M', u'v'), - (0x1D534, 'M', u'w'), - (0x1D535, 'M', u'x'), - (0x1D536, 'M', u'y'), - (0x1D537, 'M', u'z'), - (0x1D538, 'M', u'a'), - (0x1D539, 'M', u'b'), - (0x1D53A, 'X'), - (0x1D53B, 'M', u'd'), - (0x1D53C, 'M', u'e'), - (0x1D53D, 'M', u'f'), - (0x1D53E, 'M', u'g'), - (0x1D53F, 'X'), - (0x1D540, 'M', u'i'), - (0x1D541, 'M', u'j'), - (0x1D542, 'M', u'k'), - (0x1D543, 'M', u'l'), - (0x1D544, 'M', u'm'), - (0x1D545, 'X'), - (0x1D546, 'M', u'o'), - (0x1D547, 'X'), - (0x1D54A, 'M', u's'), - (0x1D54B, 'M', u't'), - (0x1D54C, 'M', u'u'), - (0x1D54D, 'M', u'v'), - (0x1D54E, 'M', u'w'), - (0x1D54F, 'M', u'x'), - (0x1D550, 'M', u'y'), - (0x1D551, 'X'), - (0x1D552, 'M', u'a'), - (0x1D553, 'M', u'b'), - (0x1D554, 'M', u'c'), - (0x1D555, 'M', u'd'), - (0x1D556, 'M', u'e'), - (0x1D557, 'M', u'f'), - (0x1D558, 'M', u'g'), - (0x1D559, 'M', u'h'), - (0x1D55A, 'M', u'i'), - (0x1D55B, 'M', u'j'), - (0x1D55C, 'M', u'k'), - (0x1D55D, 'M', u'l'), - (0x1D55E, 'M', u'm'), - (0x1D55F, 'M', u'n'), - (0x1D560, 'M', u'o'), - (0x1D561, 'M', u'p'), - (0x1D562, 'M', u'q'), - (0x1D563, 'M', u'r'), - (0x1D564, 'M', u's'), - (0x1D565, 'M', u't'), - (0x1D566, 'M', u'u'), - (0x1D567, 'M', u'v'), - (0x1D568, 'M', u'w'), - (0x1D569, 'M', u'x'), - (0x1D56A, 'M', u'y'), - (0x1D56B, 'M', u'z'), - (0x1D56C, 'M', u'a'), - (0x1D56D, 'M', u'b'), - (0x1D56E, 'M', u'c'), - (0x1D56F, 'M', u'd'), - (0x1D570, 'M', u'e'), - (0x1D571, 'M', u'f'), - (0x1D572, 'M', u'g'), - (0x1D573, 'M', u'h'), - (0x1D574, 'M', u'i'), - (0x1D575, 'M', u'j'), - (0x1D576, 'M', u'k'), - (0x1D577, 'M', u'l'), - (0x1D578, 'M', u'm'), - (0x1D579, 'M', u'n'), - (0x1D57A, 'M', u'o'), - (0x1D57B, 'M', u'p'), - (0x1D57C, 'M', u'q'), - (0x1D57D, 'M', u'r'), - (0x1D57E, 'M', u's'), - (0x1D57F, 'M', u't'), - (0x1D580, 'M', u'u'), - (0x1D581, 'M', u'v'), - (0x1D582, 'M', u'w'), - (0x1D583, 'M', u'x'), - (0x1D584, 'M', u'y'), - (0x1D585, 'M', u'z'), - (0x1D586, 'M', u'a'), - (0x1D587, 'M', u'b'), - (0x1D588, 'M', u'c'), - (0x1D589, 'M', u'd'), - (0x1D58A, 'M', u'e'), - (0x1D58B, 'M', u'f'), - (0x1D58C, 'M', u'g'), - (0x1D58D, 'M', u'h'), - (0x1D58E, 'M', u'i'), - ] - -def _seg_62(): - return [ - (0x1D58F, 'M', u'j'), - (0x1D590, 'M', u'k'), - (0x1D591, 'M', u'l'), - (0x1D592, 'M', u'm'), - (0x1D593, 'M', u'n'), - (0x1D594, 'M', u'o'), - (0x1D595, 'M', u'p'), - (0x1D596, 'M', u'q'), - (0x1D597, 'M', u'r'), - (0x1D598, 'M', u's'), - (0x1D599, 'M', u't'), - (0x1D59A, 'M', u'u'), - (0x1D59B, 'M', u'v'), - (0x1D59C, 'M', u'w'), - (0x1D59D, 'M', u'x'), - (0x1D59E, 'M', u'y'), - (0x1D59F, 'M', u'z'), - (0x1D5A0, 'M', u'a'), - (0x1D5A1, 'M', u'b'), - (0x1D5A2, 'M', u'c'), - (0x1D5A3, 'M', u'd'), - (0x1D5A4, 'M', u'e'), - (0x1D5A5, 'M', u'f'), - (0x1D5A6, 'M', u'g'), - (0x1D5A7, 'M', u'h'), - (0x1D5A8, 'M', u'i'), - (0x1D5A9, 'M', u'j'), - (0x1D5AA, 'M', u'k'), - (0x1D5AB, 'M', u'l'), - (0x1D5AC, 'M', u'm'), - (0x1D5AD, 'M', u'n'), - (0x1D5AE, 'M', u'o'), - (0x1D5AF, 'M', u'p'), - (0x1D5B0, 'M', u'q'), - (0x1D5B1, 'M', u'r'), - (0x1D5B2, 'M', u's'), - (0x1D5B3, 'M', u't'), - (0x1D5B4, 'M', u'u'), - (0x1D5B5, 'M', u'v'), - (0x1D5B6, 'M', u'w'), - (0x1D5B7, 'M', u'x'), - (0x1D5B8, 'M', u'y'), - (0x1D5B9, 'M', u'z'), - (0x1D5BA, 'M', u'a'), - (0x1D5BB, 'M', u'b'), - (0x1D5BC, 'M', u'c'), - (0x1D5BD, 'M', u'd'), - (0x1D5BE, 'M', u'e'), - (0x1D5BF, 'M', u'f'), - (0x1D5C0, 'M', u'g'), - (0x1D5C1, 'M', u'h'), - (0x1D5C2, 'M', u'i'), - (0x1D5C3, 'M', u'j'), - (0x1D5C4, 'M', u'k'), - (0x1D5C5, 'M', u'l'), - (0x1D5C6, 'M', u'm'), - (0x1D5C7, 'M', u'n'), - (0x1D5C8, 'M', u'o'), - (0x1D5C9, 'M', u'p'), - (0x1D5CA, 'M', u'q'), - (0x1D5CB, 'M', u'r'), - (0x1D5CC, 'M', u's'), - (0x1D5CD, 'M', u't'), - (0x1D5CE, 'M', u'u'), - (0x1D5CF, 'M', u'v'), - (0x1D5D0, 'M', u'w'), - (0x1D5D1, 'M', u'x'), - (0x1D5D2, 'M', u'y'), - (0x1D5D3, 'M', u'z'), - (0x1D5D4, 'M', u'a'), - (0x1D5D5, 'M', u'b'), - (0x1D5D6, 'M', u'c'), - (0x1D5D7, 'M', u'd'), - (0x1D5D8, 'M', u'e'), - (0x1D5D9, 'M', u'f'), - (0x1D5DA, 'M', u'g'), - (0x1D5DB, 'M', u'h'), - (0x1D5DC, 'M', u'i'), - (0x1D5DD, 'M', u'j'), - (0x1D5DE, 'M', u'k'), - (0x1D5DF, 'M', u'l'), - (0x1D5E0, 'M', u'm'), - (0x1D5E1, 'M', u'n'), - (0x1D5E2, 'M', u'o'), - (0x1D5E3, 'M', u'p'), - (0x1D5E4, 'M', u'q'), - (0x1D5E5, 'M', u'r'), - (0x1D5E6, 'M', u's'), - (0x1D5E7, 'M', u't'), - (0x1D5E8, 'M', u'u'), - (0x1D5E9, 'M', u'v'), - (0x1D5EA, 'M', u'w'), - (0x1D5EB, 'M', u'x'), - (0x1D5EC, 'M', u'y'), - (0x1D5ED, 'M', u'z'), - (0x1D5EE, 'M', u'a'), - (0x1D5EF, 'M', u'b'), - (0x1D5F0, 'M', u'c'), - (0x1D5F1, 'M', u'd'), - (0x1D5F2, 'M', u'e'), - ] - -def _seg_63(): - return [ - (0x1D5F3, 'M', u'f'), - (0x1D5F4, 'M', u'g'), - (0x1D5F5, 'M', u'h'), - (0x1D5F6, 'M', u'i'), - (0x1D5F7, 'M', u'j'), - (0x1D5F8, 'M', u'k'), - (0x1D5F9, 'M', u'l'), - (0x1D5FA, 'M', u'm'), - (0x1D5FB, 'M', u'n'), - (0x1D5FC, 'M', u'o'), - (0x1D5FD, 'M', u'p'), - (0x1D5FE, 'M', u'q'), - (0x1D5FF, 'M', u'r'), - (0x1D600, 'M', u's'), - (0x1D601, 'M', u't'), - (0x1D602, 'M', u'u'), - (0x1D603, 'M', u'v'), - (0x1D604, 'M', u'w'), - (0x1D605, 'M', u'x'), - (0x1D606, 'M', u'y'), - (0x1D607, 'M', u'z'), - (0x1D608, 'M', u'a'), - (0x1D609, 'M', u'b'), - (0x1D60A, 'M', u'c'), - (0x1D60B, 'M', u'd'), - (0x1D60C, 'M', u'e'), - (0x1D60D, 'M', u'f'), - (0x1D60E, 'M', u'g'), - (0x1D60F, 'M', u'h'), - (0x1D610, 'M', u'i'), - (0x1D611, 'M', u'j'), - (0x1D612, 'M', u'k'), - (0x1D613, 'M', u'l'), - (0x1D614, 'M', u'm'), - (0x1D615, 'M', u'n'), - (0x1D616, 'M', u'o'), - (0x1D617, 'M', u'p'), - (0x1D618, 'M', u'q'), - (0x1D619, 'M', u'r'), - (0x1D61A, 'M', u's'), - (0x1D61B, 'M', u't'), - (0x1D61C, 'M', u'u'), - (0x1D61D, 'M', u'v'), - (0x1D61E, 'M', u'w'), - (0x1D61F, 'M', u'x'), - (0x1D620, 'M', u'y'), - (0x1D621, 'M', u'z'), - (0x1D622, 'M', u'a'), - (0x1D623, 'M', u'b'), - (0x1D624, 'M', u'c'), - (0x1D625, 'M', u'd'), - (0x1D626, 'M', u'e'), - (0x1D627, 'M', u'f'), - (0x1D628, 'M', u'g'), - (0x1D629, 'M', u'h'), - (0x1D62A, 'M', u'i'), - (0x1D62B, 'M', u'j'), - (0x1D62C, 'M', u'k'), - (0x1D62D, 'M', u'l'), - (0x1D62E, 'M', u'm'), - (0x1D62F, 'M', u'n'), - (0x1D630, 'M', u'o'), - (0x1D631, 'M', u'p'), - (0x1D632, 'M', u'q'), - (0x1D633, 'M', u'r'), - (0x1D634, 'M', u's'), - (0x1D635, 'M', u't'), - (0x1D636, 'M', u'u'), - (0x1D637, 'M', u'v'), - (0x1D638, 'M', u'w'), - (0x1D639, 'M', u'x'), - (0x1D63A, 'M', u'y'), - (0x1D63B, 'M', u'z'), - (0x1D63C, 'M', u'a'), - (0x1D63D, 'M', u'b'), - (0x1D63E, 'M', u'c'), - (0x1D63F, 'M', u'd'), - (0x1D640, 'M', u'e'), - (0x1D641, 'M', u'f'), - (0x1D642, 'M', u'g'), - (0x1D643, 'M', u'h'), - (0x1D644, 'M', u'i'), - (0x1D645, 'M', u'j'), - (0x1D646, 'M', u'k'), - (0x1D647, 'M', u'l'), - (0x1D648, 'M', u'm'), - (0x1D649, 'M', u'n'), - (0x1D64A, 'M', u'o'), - (0x1D64B, 'M', u'p'), - (0x1D64C, 'M', u'q'), - (0x1D64D, 'M', u'r'), - (0x1D64E, 'M', u's'), - (0x1D64F, 'M', u't'), - (0x1D650, 'M', u'u'), - (0x1D651, 'M', u'v'), - (0x1D652, 'M', u'w'), - (0x1D653, 'M', u'x'), - (0x1D654, 'M', u'y'), - (0x1D655, 'M', u'z'), - (0x1D656, 'M', u'a'), - ] - -def _seg_64(): - return [ - (0x1D657, 'M', u'b'), - (0x1D658, 'M', u'c'), - (0x1D659, 'M', u'd'), - (0x1D65A, 'M', u'e'), - (0x1D65B, 'M', u'f'), - (0x1D65C, 'M', u'g'), - (0x1D65D, 'M', u'h'), - (0x1D65E, 'M', u'i'), - (0x1D65F, 'M', u'j'), - (0x1D660, 'M', u'k'), - (0x1D661, 'M', u'l'), - (0x1D662, 'M', u'm'), - (0x1D663, 'M', u'n'), - (0x1D664, 'M', u'o'), - (0x1D665, 'M', u'p'), - (0x1D666, 'M', u'q'), - (0x1D667, 'M', u'r'), - (0x1D668, 'M', u's'), - (0x1D669, 'M', u't'), - (0x1D66A, 'M', u'u'), - (0x1D66B, 'M', u'v'), - (0x1D66C, 'M', u'w'), - (0x1D66D, 'M', u'x'), - (0x1D66E, 'M', u'y'), - (0x1D66F, 'M', u'z'), - (0x1D670, 'M', u'a'), - (0x1D671, 'M', u'b'), - (0x1D672, 'M', u'c'), - (0x1D673, 'M', u'd'), - (0x1D674, 'M', u'e'), - (0x1D675, 'M', u'f'), - (0x1D676, 'M', u'g'), - (0x1D677, 'M', u'h'), - (0x1D678, 'M', u'i'), - (0x1D679, 'M', u'j'), - (0x1D67A, 'M', u'k'), - (0x1D67B, 'M', u'l'), - (0x1D67C, 'M', u'm'), - (0x1D67D, 'M', u'n'), - (0x1D67E, 'M', u'o'), - (0x1D67F, 'M', u'p'), - (0x1D680, 'M', u'q'), - (0x1D681, 'M', u'r'), - (0x1D682, 'M', u's'), - (0x1D683, 'M', u't'), - (0x1D684, 'M', u'u'), - (0x1D685, 'M', u'v'), - (0x1D686, 'M', u'w'), - (0x1D687, 'M', u'x'), - (0x1D688, 'M', u'y'), - (0x1D689, 'M', u'z'), - (0x1D68A, 'M', u'a'), - (0x1D68B, 'M', u'b'), - (0x1D68C, 'M', u'c'), - (0x1D68D, 'M', u'd'), - (0x1D68E, 'M', u'e'), - (0x1D68F, 'M', u'f'), - (0x1D690, 'M', u'g'), - (0x1D691, 'M', u'h'), - (0x1D692, 'M', u'i'), - (0x1D693, 'M', u'j'), - (0x1D694, 'M', u'k'), - (0x1D695, 'M', u'l'), - (0x1D696, 'M', u'm'), - (0x1D697, 'M', u'n'), - (0x1D698, 'M', u'o'), - (0x1D699, 'M', u'p'), - (0x1D69A, 'M', u'q'), - (0x1D69B, 'M', u'r'), - (0x1D69C, 'M', u's'), - (0x1D69D, 'M', u't'), - (0x1D69E, 'M', u'u'), - (0x1D69F, 'M', u'v'), - (0x1D6A0, 'M', u'w'), - (0x1D6A1, 'M', u'x'), - (0x1D6A2, 'M', u'y'), - (0x1D6A3, 'M', u'z'), - (0x1D6A4, 'M', u'ı'), - (0x1D6A5, 'M', u'ȷ'), - (0x1D6A6, 'X'), - (0x1D6A8, 'M', u'α'), - (0x1D6A9, 'M', u'β'), - (0x1D6AA, 'M', u'γ'), - (0x1D6AB, 'M', u'δ'), - (0x1D6AC, 'M', u'ε'), - (0x1D6AD, 'M', u'ζ'), - (0x1D6AE, 'M', u'η'), - (0x1D6AF, 'M', u'θ'), - (0x1D6B0, 'M', u'ι'), - (0x1D6B1, 'M', u'κ'), - (0x1D6B2, 'M', u'λ'), - (0x1D6B3, 'M', u'μ'), - (0x1D6B4, 'M', u'ν'), - (0x1D6B5, 'M', u'ξ'), - (0x1D6B6, 'M', u'ο'), - (0x1D6B7, 'M', u'π'), - (0x1D6B8, 'M', u'ρ'), - (0x1D6B9, 'M', u'θ'), - (0x1D6BA, 'M', u'σ'), - (0x1D6BB, 'M', u'τ'), - ] - -def _seg_65(): - return [ - (0x1D6BC, 'M', u'υ'), - (0x1D6BD, 'M', u'φ'), - (0x1D6BE, 'M', u'χ'), - (0x1D6BF, 'M', u'ψ'), - (0x1D6C0, 'M', u'ω'), - (0x1D6C1, 'M', u'∇'), - (0x1D6C2, 'M', u'α'), - (0x1D6C3, 'M', u'β'), - (0x1D6C4, 'M', u'γ'), - (0x1D6C5, 'M', u'δ'), - (0x1D6C6, 'M', u'ε'), - (0x1D6C7, 'M', u'ζ'), - (0x1D6C8, 'M', u'η'), - (0x1D6C9, 'M', u'θ'), - (0x1D6CA, 'M', u'ι'), - (0x1D6CB, 'M', u'κ'), - (0x1D6CC, 'M', u'λ'), - (0x1D6CD, 'M', u'μ'), - (0x1D6CE, 'M', u'ν'), - (0x1D6CF, 'M', u'ξ'), - (0x1D6D0, 'M', u'ο'), - (0x1D6D1, 'M', u'π'), - (0x1D6D2, 'M', u'ρ'), - (0x1D6D3, 'M', u'σ'), - (0x1D6D5, 'M', u'τ'), - (0x1D6D6, 'M', u'υ'), - (0x1D6D7, 'M', u'φ'), - (0x1D6D8, 'M', u'χ'), - (0x1D6D9, 'M', u'ψ'), - (0x1D6DA, 'M', u'ω'), - (0x1D6DB, 'M', u'∂'), - (0x1D6DC, 'M', u'ε'), - (0x1D6DD, 'M', u'θ'), - (0x1D6DE, 'M', u'κ'), - (0x1D6DF, 'M', u'φ'), - (0x1D6E0, 'M', u'ρ'), - (0x1D6E1, 'M', u'π'), - (0x1D6E2, 'M', u'α'), - (0x1D6E3, 'M', u'β'), - (0x1D6E4, 'M', u'γ'), - (0x1D6E5, 'M', u'δ'), - (0x1D6E6, 'M', u'ε'), - (0x1D6E7, 'M', u'ζ'), - (0x1D6E8, 'M', u'η'), - (0x1D6E9, 'M', u'θ'), - (0x1D6EA, 'M', u'ι'), - (0x1D6EB, 'M', u'κ'), - (0x1D6EC, 'M', u'λ'), - (0x1D6ED, 'M', u'μ'), - (0x1D6EE, 'M', u'ν'), - (0x1D6EF, 'M', u'ξ'), - (0x1D6F0, 'M', u'ο'), - (0x1D6F1, 'M', u'π'), - (0x1D6F2, 'M', u'ρ'), - (0x1D6F3, 'M', u'θ'), - (0x1D6F4, 'M', u'σ'), - (0x1D6F5, 'M', u'τ'), - (0x1D6F6, 'M', u'υ'), - (0x1D6F7, 'M', u'φ'), - (0x1D6F8, 'M', u'χ'), - (0x1D6F9, 'M', u'ψ'), - (0x1D6FA, 'M', u'ω'), - (0x1D6FB, 'M', u'∇'), - (0x1D6FC, 'M', u'α'), - (0x1D6FD, 'M', u'β'), - (0x1D6FE, 'M', u'γ'), - (0x1D6FF, 'M', u'δ'), - (0x1D700, 'M', u'ε'), - (0x1D701, 'M', u'ζ'), - (0x1D702, 'M', u'η'), - (0x1D703, 'M', u'θ'), - (0x1D704, 'M', u'ι'), - (0x1D705, 'M', u'κ'), - (0x1D706, 'M', u'λ'), - (0x1D707, 'M', u'μ'), - (0x1D708, 'M', u'ν'), - (0x1D709, 'M', u'ξ'), - (0x1D70A, 'M', u'ο'), - (0x1D70B, 'M', u'π'), - (0x1D70C, 'M', u'ρ'), - (0x1D70D, 'M', u'σ'), - (0x1D70F, 'M', u'τ'), - (0x1D710, 'M', u'υ'), - (0x1D711, 'M', u'φ'), - (0x1D712, 'M', u'χ'), - (0x1D713, 'M', u'ψ'), - (0x1D714, 'M', u'ω'), - (0x1D715, 'M', u'∂'), - (0x1D716, 'M', u'ε'), - (0x1D717, 'M', u'θ'), - (0x1D718, 'M', u'κ'), - (0x1D719, 'M', u'φ'), - (0x1D71A, 'M', u'ρ'), - (0x1D71B, 'M', u'π'), - (0x1D71C, 'M', u'α'), - (0x1D71D, 'M', u'β'), - (0x1D71E, 'M', u'γ'), - (0x1D71F, 'M', u'δ'), - (0x1D720, 'M', u'ε'), - (0x1D721, 'M', u'ζ'), - ] - -def _seg_66(): - return [ - (0x1D722, 'M', u'η'), - (0x1D723, 'M', u'θ'), - (0x1D724, 'M', u'ι'), - (0x1D725, 'M', u'κ'), - (0x1D726, 'M', u'λ'), - (0x1D727, 'M', u'μ'), - (0x1D728, 'M', u'ν'), - (0x1D729, 'M', u'ξ'), - (0x1D72A, 'M', u'ο'), - (0x1D72B, 'M', u'π'), - (0x1D72C, 'M', u'ρ'), - (0x1D72D, 'M', u'θ'), - (0x1D72E, 'M', u'σ'), - (0x1D72F, 'M', u'τ'), - (0x1D730, 'M', u'υ'), - (0x1D731, 'M', u'φ'), - (0x1D732, 'M', u'χ'), - (0x1D733, 'M', u'ψ'), - (0x1D734, 'M', u'ω'), - (0x1D735, 'M', u'∇'), - (0x1D736, 'M', u'α'), - (0x1D737, 'M', u'β'), - (0x1D738, 'M', u'γ'), - (0x1D739, 'M', u'δ'), - (0x1D73A, 'M', u'ε'), - (0x1D73B, 'M', u'ζ'), - (0x1D73C, 'M', u'η'), - (0x1D73D, 'M', u'θ'), - (0x1D73E, 'M', u'ι'), - (0x1D73F, 'M', u'κ'), - (0x1D740, 'M', u'λ'), - (0x1D741, 'M', u'μ'), - (0x1D742, 'M', u'ν'), - (0x1D743, 'M', u'ξ'), - (0x1D744, 'M', u'ο'), - (0x1D745, 'M', u'π'), - (0x1D746, 'M', u'ρ'), - (0x1D747, 'M', u'σ'), - (0x1D749, 'M', u'τ'), - (0x1D74A, 'M', u'υ'), - (0x1D74B, 'M', u'φ'), - (0x1D74C, 'M', u'χ'), - (0x1D74D, 'M', u'ψ'), - (0x1D74E, 'M', u'ω'), - (0x1D74F, 'M', u'∂'), - (0x1D750, 'M', u'ε'), - (0x1D751, 'M', u'θ'), - (0x1D752, 'M', u'κ'), - (0x1D753, 'M', u'φ'), - (0x1D754, 'M', u'ρ'), - (0x1D755, 'M', u'π'), - (0x1D756, 'M', u'α'), - (0x1D757, 'M', u'β'), - (0x1D758, 'M', u'γ'), - (0x1D759, 'M', u'δ'), - (0x1D75A, 'M', u'ε'), - (0x1D75B, 'M', u'ζ'), - (0x1D75C, 'M', u'η'), - (0x1D75D, 'M', u'θ'), - (0x1D75E, 'M', u'ι'), - (0x1D75F, 'M', u'κ'), - (0x1D760, 'M', u'λ'), - (0x1D761, 'M', u'μ'), - (0x1D762, 'M', u'ν'), - (0x1D763, 'M', u'ξ'), - (0x1D764, 'M', u'ο'), - (0x1D765, 'M', u'π'), - (0x1D766, 'M', u'ρ'), - (0x1D767, 'M', u'θ'), - (0x1D768, 'M', u'σ'), - (0x1D769, 'M', u'τ'), - (0x1D76A, 'M', u'υ'), - (0x1D76B, 'M', u'φ'), - (0x1D76C, 'M', u'χ'), - (0x1D76D, 'M', u'ψ'), - (0x1D76E, 'M', u'ω'), - (0x1D76F, 'M', u'∇'), - (0x1D770, 'M', u'α'), - (0x1D771, 'M', u'β'), - (0x1D772, 'M', u'γ'), - (0x1D773, 'M', u'δ'), - (0x1D774, 'M', u'ε'), - (0x1D775, 'M', u'ζ'), - (0x1D776, 'M', u'η'), - (0x1D777, 'M', u'θ'), - (0x1D778, 'M', u'ι'), - (0x1D779, 'M', u'κ'), - (0x1D77A, 'M', u'λ'), - (0x1D77B, 'M', u'μ'), - (0x1D77C, 'M', u'ν'), - (0x1D77D, 'M', u'ξ'), - (0x1D77E, 'M', u'ο'), - (0x1D77F, 'M', u'π'), - (0x1D780, 'M', u'ρ'), - (0x1D781, 'M', u'σ'), - (0x1D783, 'M', u'τ'), - (0x1D784, 'M', u'υ'), - (0x1D785, 'M', u'φ'), - (0x1D786, 'M', u'χ'), - (0x1D787, 'M', u'ψ'), - ] - -def _seg_67(): - return [ - (0x1D788, 'M', u'ω'), - (0x1D789, 'M', u'∂'), - (0x1D78A, 'M', u'ε'), - (0x1D78B, 'M', u'θ'), - (0x1D78C, 'M', u'κ'), - (0x1D78D, 'M', u'φ'), - (0x1D78E, 'M', u'ρ'), - (0x1D78F, 'M', u'π'), - (0x1D790, 'M', u'α'), - (0x1D791, 'M', u'β'), - (0x1D792, 'M', u'γ'), - (0x1D793, 'M', u'δ'), - (0x1D794, 'M', u'ε'), - (0x1D795, 'M', u'ζ'), - (0x1D796, 'M', u'η'), - (0x1D797, 'M', u'θ'), - (0x1D798, 'M', u'ι'), - (0x1D799, 'M', u'κ'), - (0x1D79A, 'M', u'λ'), - (0x1D79B, 'M', u'μ'), - (0x1D79C, 'M', u'ν'), - (0x1D79D, 'M', u'ξ'), - (0x1D79E, 'M', u'ο'), - (0x1D79F, 'M', u'π'), - (0x1D7A0, 'M', u'ρ'), - (0x1D7A1, 'M', u'θ'), - (0x1D7A2, 'M', u'σ'), - (0x1D7A3, 'M', u'τ'), - (0x1D7A4, 'M', u'υ'), - (0x1D7A5, 'M', u'φ'), - (0x1D7A6, 'M', u'χ'), - (0x1D7A7, 'M', u'ψ'), - (0x1D7A8, 'M', u'ω'), - (0x1D7A9, 'M', u'∇'), - (0x1D7AA, 'M', u'α'), - (0x1D7AB, 'M', u'β'), - (0x1D7AC, 'M', u'γ'), - (0x1D7AD, 'M', u'δ'), - (0x1D7AE, 'M', u'ε'), - (0x1D7AF, 'M', u'ζ'), - (0x1D7B0, 'M', u'η'), - (0x1D7B1, 'M', u'θ'), - (0x1D7B2, 'M', u'ι'), - (0x1D7B3, 'M', u'κ'), - (0x1D7B4, 'M', u'λ'), - (0x1D7B5, 'M', u'μ'), - (0x1D7B6, 'M', u'ν'), - (0x1D7B7, 'M', u'ξ'), - (0x1D7B8, 'M', u'ο'), - (0x1D7B9, 'M', u'π'), - (0x1D7BA, 'M', u'ρ'), - (0x1D7BB, 'M', u'σ'), - (0x1D7BD, 'M', u'τ'), - (0x1D7BE, 'M', u'υ'), - (0x1D7BF, 'M', u'φ'), - (0x1D7C0, 'M', u'χ'), - (0x1D7C1, 'M', u'ψ'), - (0x1D7C2, 'M', u'ω'), - (0x1D7C3, 'M', u'∂'), - (0x1D7C4, 'M', u'ε'), - (0x1D7C5, 'M', u'θ'), - (0x1D7C6, 'M', u'κ'), - (0x1D7C7, 'M', u'φ'), - (0x1D7C8, 'M', u'ρ'), - (0x1D7C9, 'M', u'π'), - (0x1D7CA, 'M', u'ϝ'), - (0x1D7CC, 'X'), - (0x1D7CE, 'M', u'0'), - (0x1D7CF, 'M', u'1'), - (0x1D7D0, 'M', u'2'), - (0x1D7D1, 'M', u'3'), - (0x1D7D2, 'M', u'4'), - (0x1D7D3, 'M', u'5'), - (0x1D7D4, 'M', u'6'), - (0x1D7D5, 'M', u'7'), - (0x1D7D6, 'M', u'8'), - (0x1D7D7, 'M', u'9'), - (0x1D7D8, 'M', u'0'), - (0x1D7D9, 'M', u'1'), - (0x1D7DA, 'M', u'2'), - (0x1D7DB, 'M', u'3'), - (0x1D7DC, 'M', u'4'), - (0x1D7DD, 'M', u'5'), - (0x1D7DE, 'M', u'6'), - (0x1D7DF, 'M', u'7'), - (0x1D7E0, 'M', u'8'), - (0x1D7E1, 'M', u'9'), - (0x1D7E2, 'M', u'0'), - (0x1D7E3, 'M', u'1'), - (0x1D7E4, 'M', u'2'), - (0x1D7E5, 'M', u'3'), - (0x1D7E6, 'M', u'4'), - (0x1D7E7, 'M', u'5'), - (0x1D7E8, 'M', u'6'), - (0x1D7E9, 'M', u'7'), - (0x1D7EA, 'M', u'8'), - (0x1D7EB, 'M', u'9'), - (0x1D7EC, 'M', u'0'), - (0x1D7ED, 'M', u'1'), - (0x1D7EE, 'M', u'2'), - ] - -def _seg_68(): - return [ - (0x1D7EF, 'M', u'3'), - (0x1D7F0, 'M', u'4'), - (0x1D7F1, 'M', u'5'), - (0x1D7F2, 'M', u'6'), - (0x1D7F3, 'M', u'7'), - (0x1D7F4, 'M', u'8'), - (0x1D7F5, 'M', u'9'), - (0x1D7F6, 'M', u'0'), - (0x1D7F7, 'M', u'1'), - (0x1D7F8, 'M', u'2'), - (0x1D7F9, 'M', u'3'), - (0x1D7FA, 'M', u'4'), - (0x1D7FB, 'M', u'5'), - (0x1D7FC, 'M', u'6'), - (0x1D7FD, 'M', u'7'), - (0x1D7FE, 'M', u'8'), - (0x1D7FF, 'M', u'9'), - (0x1D800, 'V'), - (0x1DA8C, 'X'), - (0x1DA9B, 'V'), - (0x1DAA0, 'X'), - (0x1DAA1, 'V'), - (0x1DAB0, 'X'), - (0x1E000, 'V'), - (0x1E007, 'X'), - (0x1E008, 'V'), - (0x1E019, 'X'), - (0x1E01B, 'V'), - (0x1E022, 'X'), - (0x1E023, 'V'), - (0x1E025, 'X'), - (0x1E026, 'V'), - (0x1E02B, 'X'), - (0x1E800, 'V'), - (0x1E8C5, 'X'), - (0x1E8C7, 'V'), - (0x1E8D7, 'X'), - (0x1E900, 'M', u'𞤢'), - (0x1E901, 'M', u'𞤣'), - (0x1E902, 'M', u'𞤤'), - (0x1E903, 'M', u'𞤥'), - (0x1E904, 'M', u'𞤦'), - (0x1E905, 'M', u'𞤧'), - (0x1E906, 'M', u'𞤨'), - (0x1E907, 'M', u'𞤩'), - (0x1E908, 'M', u'𞤪'), - (0x1E909, 'M', u'𞤫'), - (0x1E90A, 'M', u'𞤬'), - (0x1E90B, 'M', u'𞤭'), - (0x1E90C, 'M', u'𞤮'), - (0x1E90D, 'M', u'𞤯'), - (0x1E90E, 'M', u'𞤰'), - (0x1E90F, 'M', u'𞤱'), - (0x1E910, 'M', u'𞤲'), - (0x1E911, 'M', u'𞤳'), - (0x1E912, 'M', u'𞤴'), - (0x1E913, 'M', u'𞤵'), - (0x1E914, 'M', u'𞤶'), - (0x1E915, 'M', u'𞤷'), - (0x1E916, 'M', u'𞤸'), - (0x1E917, 'M', u'𞤹'), - (0x1E918, 'M', u'𞤺'), - (0x1E919, 'M', u'𞤻'), - (0x1E91A, 'M', u'𞤼'), - (0x1E91B, 'M', u'𞤽'), - (0x1E91C, 'M', u'𞤾'), - (0x1E91D, 'M', u'𞤿'), - (0x1E91E, 'M', u'𞥀'), - (0x1E91F, 'M', u'𞥁'), - (0x1E920, 'M', u'𞥂'), - (0x1E921, 'M', u'𞥃'), - (0x1E922, 'V'), - (0x1E94B, 'X'), - (0x1E950, 'V'), - (0x1E95A, 'X'), - (0x1E95E, 'V'), - (0x1E960, 'X'), - (0x1EC71, 'V'), - (0x1ECB5, 'X'), - (0x1EE00, 'M', u'ا'), - (0x1EE01, 'M', u'ب'), - (0x1EE02, 'M', u'ج'), - (0x1EE03, 'M', u'د'), - (0x1EE04, 'X'), - (0x1EE05, 'M', u'و'), - (0x1EE06, 'M', u'ز'), - (0x1EE07, 'M', u'ح'), - (0x1EE08, 'M', u'ط'), - (0x1EE09, 'M', u'ي'), - (0x1EE0A, 'M', u'ك'), - (0x1EE0B, 'M', u'ل'), - (0x1EE0C, 'M', u'م'), - (0x1EE0D, 'M', u'ن'), - (0x1EE0E, 'M', u'س'), - (0x1EE0F, 'M', u'ع'), - (0x1EE10, 'M', u'ف'), - (0x1EE11, 'M', u'ص'), - (0x1EE12, 'M', u'ق'), - (0x1EE13, 'M', u'ر'), - (0x1EE14, 'M', u'ش'), - ] - -def _seg_69(): - return [ - (0x1EE15, 'M', u'ت'), - (0x1EE16, 'M', u'ث'), - (0x1EE17, 'M', u'خ'), - (0x1EE18, 'M', u'ذ'), - (0x1EE19, 'M', u'ض'), - (0x1EE1A, 'M', u'ظ'), - (0x1EE1B, 'M', u'غ'), - (0x1EE1C, 'M', u'ٮ'), - (0x1EE1D, 'M', u'ں'), - (0x1EE1E, 'M', u'ڡ'), - (0x1EE1F, 'M', u'ٯ'), - (0x1EE20, 'X'), - (0x1EE21, 'M', u'ب'), - (0x1EE22, 'M', u'ج'), - (0x1EE23, 'X'), - (0x1EE24, 'M', u'ه'), - (0x1EE25, 'X'), - (0x1EE27, 'M', u'ح'), - (0x1EE28, 'X'), - (0x1EE29, 'M', u'ي'), - (0x1EE2A, 'M', u'ك'), - (0x1EE2B, 'M', u'ل'), - (0x1EE2C, 'M', u'م'), - (0x1EE2D, 'M', u'ن'), - (0x1EE2E, 'M', u'س'), - (0x1EE2F, 'M', u'ع'), - (0x1EE30, 'M', u'ف'), - (0x1EE31, 'M', u'ص'), - (0x1EE32, 'M', u'ق'), - (0x1EE33, 'X'), - (0x1EE34, 'M', u'ش'), - (0x1EE35, 'M', u'ت'), - (0x1EE36, 'M', u'ث'), - (0x1EE37, 'M', u'خ'), - (0x1EE38, 'X'), - (0x1EE39, 'M', u'ض'), - (0x1EE3A, 'X'), - (0x1EE3B, 'M', u'غ'), - (0x1EE3C, 'X'), - (0x1EE42, 'M', u'ج'), - (0x1EE43, 'X'), - (0x1EE47, 'M', u'ح'), - (0x1EE48, 'X'), - (0x1EE49, 'M', u'ي'), - (0x1EE4A, 'X'), - (0x1EE4B, 'M', u'ل'), - (0x1EE4C, 'X'), - (0x1EE4D, 'M', u'ن'), - (0x1EE4E, 'M', u'س'), - (0x1EE4F, 'M', u'ع'), - (0x1EE50, 'X'), - (0x1EE51, 'M', u'ص'), - (0x1EE52, 'M', u'ق'), - (0x1EE53, 'X'), - (0x1EE54, 'M', u'ش'), - (0x1EE55, 'X'), - (0x1EE57, 'M', u'خ'), - (0x1EE58, 'X'), - (0x1EE59, 'M', u'ض'), - (0x1EE5A, 'X'), - (0x1EE5B, 'M', u'غ'), - (0x1EE5C, 'X'), - (0x1EE5D, 'M', u'ں'), - (0x1EE5E, 'X'), - (0x1EE5F, 'M', u'ٯ'), - (0x1EE60, 'X'), - (0x1EE61, 'M', u'ب'), - (0x1EE62, 'M', u'ج'), - (0x1EE63, 'X'), - (0x1EE64, 'M', u'ه'), - (0x1EE65, 'X'), - (0x1EE67, 'M', u'ح'), - (0x1EE68, 'M', u'ط'), - (0x1EE69, 'M', u'ي'), - (0x1EE6A, 'M', u'ك'), - (0x1EE6B, 'X'), - (0x1EE6C, 'M', u'م'), - (0x1EE6D, 'M', u'ن'), - (0x1EE6E, 'M', u'س'), - (0x1EE6F, 'M', u'ع'), - (0x1EE70, 'M', u'ف'), - (0x1EE71, 'M', u'ص'), - (0x1EE72, 'M', u'ق'), - (0x1EE73, 'X'), - (0x1EE74, 'M', u'ش'), - (0x1EE75, 'M', u'ت'), - (0x1EE76, 'M', u'ث'), - (0x1EE77, 'M', u'خ'), - (0x1EE78, 'X'), - (0x1EE79, 'M', u'ض'), - (0x1EE7A, 'M', u'ظ'), - (0x1EE7B, 'M', u'غ'), - (0x1EE7C, 'M', u'ٮ'), - (0x1EE7D, 'X'), - (0x1EE7E, 'M', u'ڡ'), - (0x1EE7F, 'X'), - (0x1EE80, 'M', u'ا'), - (0x1EE81, 'M', u'ب'), - (0x1EE82, 'M', u'ج'), - (0x1EE83, 'M', u'د'), - ] - -def _seg_70(): - return [ - (0x1EE84, 'M', u'ه'), - (0x1EE85, 'M', u'و'), - (0x1EE86, 'M', u'ز'), - (0x1EE87, 'M', u'ح'), - (0x1EE88, 'M', u'ط'), - (0x1EE89, 'M', u'ي'), - (0x1EE8A, 'X'), - (0x1EE8B, 'M', u'ل'), - (0x1EE8C, 'M', u'م'), - (0x1EE8D, 'M', u'ن'), - (0x1EE8E, 'M', u'س'), - (0x1EE8F, 'M', u'ع'), - (0x1EE90, 'M', u'ف'), - (0x1EE91, 'M', u'ص'), - (0x1EE92, 'M', u'ق'), - (0x1EE93, 'M', u'ر'), - (0x1EE94, 'M', u'ش'), - (0x1EE95, 'M', u'ت'), - (0x1EE96, 'M', u'ث'), - (0x1EE97, 'M', u'خ'), - (0x1EE98, 'M', u'ذ'), - (0x1EE99, 'M', u'ض'), - (0x1EE9A, 'M', u'ظ'), - (0x1EE9B, 'M', u'غ'), - (0x1EE9C, 'X'), - (0x1EEA1, 'M', u'ب'), - (0x1EEA2, 'M', u'ج'), - (0x1EEA3, 'M', u'د'), - (0x1EEA4, 'X'), - (0x1EEA5, 'M', u'و'), - (0x1EEA6, 'M', u'ز'), - (0x1EEA7, 'M', u'ح'), - (0x1EEA8, 'M', u'ط'), - (0x1EEA9, 'M', u'ي'), - (0x1EEAA, 'X'), - (0x1EEAB, 'M', u'ل'), - (0x1EEAC, 'M', u'م'), - (0x1EEAD, 'M', u'ن'), - (0x1EEAE, 'M', u'س'), - (0x1EEAF, 'M', u'ع'), - (0x1EEB0, 'M', u'ف'), - (0x1EEB1, 'M', u'ص'), - (0x1EEB2, 'M', u'ق'), - (0x1EEB3, 'M', u'ر'), - (0x1EEB4, 'M', u'ش'), - (0x1EEB5, 'M', u'ت'), - (0x1EEB6, 'M', u'ث'), - (0x1EEB7, 'M', u'خ'), - (0x1EEB8, 'M', u'ذ'), - (0x1EEB9, 'M', u'ض'), - (0x1EEBA, 'M', u'ظ'), - (0x1EEBB, 'M', u'غ'), - (0x1EEBC, 'X'), - (0x1EEF0, 'V'), - (0x1EEF2, 'X'), - (0x1F000, 'V'), - (0x1F02C, 'X'), - (0x1F030, 'V'), - (0x1F094, 'X'), - (0x1F0A0, 'V'), - (0x1F0AF, 'X'), - (0x1F0B1, 'V'), - (0x1F0C0, 'X'), - (0x1F0C1, 'V'), - (0x1F0D0, 'X'), - (0x1F0D1, 'V'), - (0x1F0F6, 'X'), - (0x1F101, '3', u'0,'), - (0x1F102, '3', u'1,'), - (0x1F103, '3', u'2,'), - (0x1F104, '3', u'3,'), - (0x1F105, '3', u'4,'), - (0x1F106, '3', u'5,'), - (0x1F107, '3', u'6,'), - (0x1F108, '3', u'7,'), - (0x1F109, '3', u'8,'), - (0x1F10A, '3', u'9,'), - (0x1F10B, 'V'), - (0x1F10D, 'X'), - (0x1F110, '3', u'(a)'), - (0x1F111, '3', u'(b)'), - (0x1F112, '3', u'(c)'), - (0x1F113, '3', u'(d)'), - (0x1F114, '3', u'(e)'), - (0x1F115, '3', u'(f)'), - (0x1F116, '3', u'(g)'), - (0x1F117, '3', u'(h)'), - (0x1F118, '3', u'(i)'), - (0x1F119, '3', u'(j)'), - (0x1F11A, '3', u'(k)'), - (0x1F11B, '3', u'(l)'), - (0x1F11C, '3', u'(m)'), - (0x1F11D, '3', u'(n)'), - (0x1F11E, '3', u'(o)'), - (0x1F11F, '3', u'(p)'), - (0x1F120, '3', u'(q)'), - (0x1F121, '3', u'(r)'), - (0x1F122, '3', u'(s)'), - (0x1F123, '3', u'(t)'), - (0x1F124, '3', u'(u)'), - ] - -def _seg_71(): - return [ - (0x1F125, '3', u'(v)'), - (0x1F126, '3', u'(w)'), - (0x1F127, '3', u'(x)'), - (0x1F128, '3', u'(y)'), - (0x1F129, '3', u'(z)'), - (0x1F12A, 'M', u'〔s〕'), - (0x1F12B, 'M', u'c'), - (0x1F12C, 'M', u'r'), - (0x1F12D, 'M', u'cd'), - (0x1F12E, 'M', u'wz'), - (0x1F12F, 'V'), - (0x1F130, 'M', u'a'), - (0x1F131, 'M', u'b'), - (0x1F132, 'M', u'c'), - (0x1F133, 'M', u'd'), - (0x1F134, 'M', u'e'), - (0x1F135, 'M', u'f'), - (0x1F136, 'M', u'g'), - (0x1F137, 'M', u'h'), - (0x1F138, 'M', u'i'), - (0x1F139, 'M', u'j'), - (0x1F13A, 'M', u'k'), - (0x1F13B, 'M', u'l'), - (0x1F13C, 'M', u'm'), - (0x1F13D, 'M', u'n'), - (0x1F13E, 'M', u'o'), - (0x1F13F, 'M', u'p'), - (0x1F140, 'M', u'q'), - (0x1F141, 'M', u'r'), - (0x1F142, 'M', u's'), - (0x1F143, 'M', u't'), - (0x1F144, 'M', u'u'), - (0x1F145, 'M', u'v'), - (0x1F146, 'M', u'w'), - (0x1F147, 'M', u'x'), - (0x1F148, 'M', u'y'), - (0x1F149, 'M', u'z'), - (0x1F14A, 'M', u'hv'), - (0x1F14B, 'M', u'mv'), - (0x1F14C, 'M', u'sd'), - (0x1F14D, 'M', u'ss'), - (0x1F14E, 'M', u'ppv'), - (0x1F14F, 'M', u'wc'), - (0x1F150, 'V'), - (0x1F16A, 'M', u'mc'), - (0x1F16B, 'M', u'md'), - (0x1F16C, 'X'), - (0x1F170, 'V'), - (0x1F190, 'M', u'dj'), - (0x1F191, 'V'), - (0x1F1AD, 'X'), - (0x1F1E6, 'V'), - (0x1F200, 'M', u'ほか'), - (0x1F201, 'M', u'ココ'), - (0x1F202, 'M', u'サ'), - (0x1F203, 'X'), - (0x1F210, 'M', u'手'), - (0x1F211, 'M', u'字'), - (0x1F212, 'M', u'双'), - (0x1F213, 'M', u'デ'), - (0x1F214, 'M', u'二'), - (0x1F215, 'M', u'多'), - (0x1F216, 'M', u'解'), - (0x1F217, 'M', u'天'), - (0x1F218, 'M', u'交'), - (0x1F219, 'M', u'映'), - (0x1F21A, 'M', u'無'), - (0x1F21B, 'M', u'料'), - (0x1F21C, 'M', u'前'), - (0x1F21D, 'M', u'後'), - (0x1F21E, 'M', u'再'), - (0x1F21F, 'M', u'新'), - (0x1F220, 'M', u'初'), - (0x1F221, 'M', u'終'), - (0x1F222, 'M', u'生'), - (0x1F223, 'M', u'販'), - (0x1F224, 'M', u'声'), - (0x1F225, 'M', u'吹'), - (0x1F226, 'M', u'演'), - (0x1F227, 'M', u'投'), - (0x1F228, 'M', u'捕'), - (0x1F229, 'M', u'一'), - (0x1F22A, 'M', u'三'), - (0x1F22B, 'M', u'遊'), - (0x1F22C, 'M', u'左'), - (0x1F22D, 'M', u'中'), - (0x1F22E, 'M', u'右'), - (0x1F22F, 'M', u'指'), - (0x1F230, 'M', u'走'), - (0x1F231, 'M', u'打'), - (0x1F232, 'M', u'禁'), - (0x1F233, 'M', u'空'), - (0x1F234, 'M', u'合'), - (0x1F235, 'M', u'満'), - (0x1F236, 'M', u'有'), - (0x1F237, 'M', u'月'), - (0x1F238, 'M', u'申'), - (0x1F239, 'M', u'割'), - (0x1F23A, 'M', u'営'), - (0x1F23B, 'M', u'配'), - ] - -def _seg_72(): - return [ - (0x1F23C, 'X'), - (0x1F240, 'M', u'〔本〕'), - (0x1F241, 'M', u'〔三〕'), - (0x1F242, 'M', u'〔二〕'), - (0x1F243, 'M', u'〔安〕'), - (0x1F244, 'M', u'〔点〕'), - (0x1F245, 'M', u'〔打〕'), - (0x1F246, 'M', u'〔盗〕'), - (0x1F247, 'M', u'〔勝〕'), - (0x1F248, 'M', u'〔敗〕'), - (0x1F249, 'X'), - (0x1F250, 'M', u'得'), - (0x1F251, 'M', u'可'), - (0x1F252, 'X'), - (0x1F260, 'V'), - (0x1F266, 'X'), - (0x1F300, 'V'), - (0x1F6D5, 'X'), - (0x1F6E0, 'V'), - (0x1F6ED, 'X'), - (0x1F6F0, 'V'), - (0x1F6FA, 'X'), - (0x1F700, 'V'), - (0x1F774, 'X'), - (0x1F780, 'V'), - (0x1F7D9, 'X'), - (0x1F800, 'V'), - (0x1F80C, 'X'), - (0x1F810, 'V'), - (0x1F848, 'X'), - (0x1F850, 'V'), - (0x1F85A, 'X'), - (0x1F860, 'V'), - (0x1F888, 'X'), - (0x1F890, 'V'), - (0x1F8AE, 'X'), - (0x1F900, 'V'), - (0x1F90C, 'X'), - (0x1F910, 'V'), - (0x1F93F, 'X'), - (0x1F940, 'V'), - (0x1F971, 'X'), - (0x1F973, 'V'), - (0x1F977, 'X'), - (0x1F97A, 'V'), - (0x1F97B, 'X'), - (0x1F97C, 'V'), - (0x1F9A3, 'X'), - (0x1F9B0, 'V'), - (0x1F9BA, 'X'), - (0x1F9C0, 'V'), - (0x1F9C3, 'X'), - (0x1F9D0, 'V'), - (0x1FA00, 'X'), - (0x1FA60, 'V'), - (0x1FA6E, 'X'), - (0x20000, 'V'), - (0x2A6D7, 'X'), - (0x2A700, 'V'), - (0x2B735, 'X'), - (0x2B740, 'V'), - (0x2B81E, 'X'), - (0x2B820, 'V'), - (0x2CEA2, 'X'), - (0x2CEB0, 'V'), - (0x2EBE1, 'X'), - (0x2F800, 'M', u'丽'), - (0x2F801, 'M', u'丸'), - (0x2F802, 'M', u'乁'), - (0x2F803, 'M', u'𠄢'), - (0x2F804, 'M', u'你'), - (0x2F805, 'M', u'侮'), - (0x2F806, 'M', u'侻'), - (0x2F807, 'M', u'倂'), - (0x2F808, 'M', u'偺'), - (0x2F809, 'M', u'備'), - (0x2F80A, 'M', u'僧'), - (0x2F80B, 'M', u'像'), - (0x2F80C, 'M', u'㒞'), - (0x2F80D, 'M', u'𠘺'), - (0x2F80E, 'M', u'免'), - (0x2F80F, 'M', u'兔'), - (0x2F810, 'M', u'兤'), - (0x2F811, 'M', u'具'), - (0x2F812, 'M', u'𠔜'), - (0x2F813, 'M', u'㒹'), - (0x2F814, 'M', u'內'), - (0x2F815, 'M', u'再'), - (0x2F816, 'M', u'𠕋'), - (0x2F817, 'M', u'冗'), - (0x2F818, 'M', u'冤'), - (0x2F819, 'M', u'仌'), - (0x2F81A, 'M', u'冬'), - (0x2F81B, 'M', u'况'), - (0x2F81C, 'M', u'𩇟'), - (0x2F81D, 'M', u'凵'), - (0x2F81E, 'M', u'刃'), - (0x2F81F, 'M', u'㓟'), - (0x2F820, 'M', u'刻'), - (0x2F821, 'M', u'剆'), - ] - -def _seg_73(): - return [ - (0x2F822, 'M', u'割'), - (0x2F823, 'M', u'剷'), - (0x2F824, 'M', u'㔕'), - (0x2F825, 'M', u'勇'), - (0x2F826, 'M', u'勉'), - (0x2F827, 'M', u'勤'), - (0x2F828, 'M', u'勺'), - (0x2F829, 'M', u'包'), - (0x2F82A, 'M', u'匆'), - (0x2F82B, 'M', u'北'), - (0x2F82C, 'M', u'卉'), - (0x2F82D, 'M', u'卑'), - (0x2F82E, 'M', u'博'), - (0x2F82F, 'M', u'即'), - (0x2F830, 'M', u'卽'), - (0x2F831, 'M', u'卿'), - (0x2F834, 'M', u'𠨬'), - (0x2F835, 'M', u'灰'), - (0x2F836, 'M', u'及'), - (0x2F837, 'M', u'叟'), - (0x2F838, 'M', u'𠭣'), - (0x2F839, 'M', u'叫'), - (0x2F83A, 'M', u'叱'), - (0x2F83B, 'M', u'吆'), - (0x2F83C, 'M', u'咞'), - (0x2F83D, 'M', u'吸'), - (0x2F83E, 'M', u'呈'), - (0x2F83F, 'M', u'周'), - (0x2F840, 'M', u'咢'), - (0x2F841, 'M', u'哶'), - (0x2F842, 'M', u'唐'), - (0x2F843, 'M', u'啓'), - (0x2F844, 'M', u'啣'), - (0x2F845, 'M', u'善'), - (0x2F847, 'M', u'喙'), - (0x2F848, 'M', u'喫'), - (0x2F849, 'M', u'喳'), - (0x2F84A, 'M', u'嗂'), - (0x2F84B, 'M', u'圖'), - (0x2F84C, 'M', u'嘆'), - (0x2F84D, 'M', u'圗'), - (0x2F84E, 'M', u'噑'), - (0x2F84F, 'M', u'噴'), - (0x2F850, 'M', u'切'), - (0x2F851, 'M', u'壮'), - (0x2F852, 'M', u'城'), - (0x2F853, 'M', u'埴'), - (0x2F854, 'M', u'堍'), - (0x2F855, 'M', u'型'), - (0x2F856, 'M', u'堲'), - (0x2F857, 'M', u'報'), - (0x2F858, 'M', u'墬'), - (0x2F859, 'M', u'𡓤'), - (0x2F85A, 'M', u'売'), - (0x2F85B, 'M', u'壷'), - (0x2F85C, 'M', u'夆'), - (0x2F85D, 'M', u'多'), - (0x2F85E, 'M', u'夢'), - (0x2F85F, 'M', u'奢'), - (0x2F860, 'M', u'𡚨'), - (0x2F861, 'M', u'𡛪'), - (0x2F862, 'M', u'姬'), - (0x2F863, 'M', u'娛'), - (0x2F864, 'M', u'娧'), - (0x2F865, 'M', u'姘'), - (0x2F866, 'M', u'婦'), - (0x2F867, 'M', u'㛮'), - (0x2F868, 'X'), - (0x2F869, 'M', u'嬈'), - (0x2F86A, 'M', u'嬾'), - (0x2F86C, 'M', u'𡧈'), - (0x2F86D, 'M', u'寃'), - (0x2F86E, 'M', u'寘'), - (0x2F86F, 'M', u'寧'), - (0x2F870, 'M', u'寳'), - (0x2F871, 'M', u'𡬘'), - (0x2F872, 'M', u'寿'), - (0x2F873, 'M', u'将'), - (0x2F874, 'X'), - (0x2F875, 'M', u'尢'), - (0x2F876, 'M', u'㞁'), - (0x2F877, 'M', u'屠'), - (0x2F878, 'M', u'屮'), - (0x2F879, 'M', u'峀'), - (0x2F87A, 'M', u'岍'), - (0x2F87B, 'M', u'𡷤'), - (0x2F87C, 'M', u'嵃'), - (0x2F87D, 'M', u'𡷦'), - (0x2F87E, 'M', u'嵮'), - (0x2F87F, 'M', u'嵫'), - (0x2F880, 'M', u'嵼'), - (0x2F881, 'M', u'巡'), - (0x2F882, 'M', u'巢'), - (0x2F883, 'M', u'㠯'), - (0x2F884, 'M', u'巽'), - (0x2F885, 'M', u'帨'), - (0x2F886, 'M', u'帽'), - (0x2F887, 'M', u'幩'), - (0x2F888, 'M', u'㡢'), - (0x2F889, 'M', u'𢆃'), - ] - -def _seg_74(): - return [ - (0x2F88A, 'M', u'㡼'), - (0x2F88B, 'M', u'庰'), - (0x2F88C, 'M', u'庳'), - (0x2F88D, 'M', u'庶'), - (0x2F88E, 'M', u'廊'), - (0x2F88F, 'M', u'𪎒'), - (0x2F890, 'M', u'廾'), - (0x2F891, 'M', u'𢌱'), - (0x2F893, 'M', u'舁'), - (0x2F894, 'M', u'弢'), - (0x2F896, 'M', u'㣇'), - (0x2F897, 'M', u'𣊸'), - (0x2F898, 'M', u'𦇚'), - (0x2F899, 'M', u'形'), - (0x2F89A, 'M', u'彫'), - (0x2F89B, 'M', u'㣣'), - (0x2F89C, 'M', u'徚'), - (0x2F89D, 'M', u'忍'), - (0x2F89E, 'M', u'志'), - (0x2F89F, 'M', u'忹'), - (0x2F8A0, 'M', u'悁'), - (0x2F8A1, 'M', u'㤺'), - (0x2F8A2, 'M', u'㤜'), - (0x2F8A3, 'M', u'悔'), - (0x2F8A4, 'M', u'𢛔'), - (0x2F8A5, 'M', u'惇'), - (0x2F8A6, 'M', u'慈'), - (0x2F8A7, 'M', u'慌'), - (0x2F8A8, 'M', u'慎'), - (0x2F8A9, 'M', u'慌'), - (0x2F8AA, 'M', u'慺'), - (0x2F8AB, 'M', u'憎'), - (0x2F8AC, 'M', u'憲'), - (0x2F8AD, 'M', u'憤'), - (0x2F8AE, 'M', u'憯'), - (0x2F8AF, 'M', u'懞'), - (0x2F8B0, 'M', u'懲'), - (0x2F8B1, 'M', u'懶'), - (0x2F8B2, 'M', u'成'), - (0x2F8B3, 'M', u'戛'), - (0x2F8B4, 'M', u'扝'), - (0x2F8B5, 'M', u'抱'), - (0x2F8B6, 'M', u'拔'), - (0x2F8B7, 'M', u'捐'), - (0x2F8B8, 'M', u'𢬌'), - (0x2F8B9, 'M', u'挽'), - (0x2F8BA, 'M', u'拼'), - (0x2F8BB, 'M', u'捨'), - (0x2F8BC, 'M', u'掃'), - (0x2F8BD, 'M', u'揤'), - (0x2F8BE, 'M', u'𢯱'), - (0x2F8BF, 'M', u'搢'), - (0x2F8C0, 'M', u'揅'), - (0x2F8C1, 'M', u'掩'), - (0x2F8C2, 'M', u'㨮'), - (0x2F8C3, 'M', u'摩'), - (0x2F8C4, 'M', u'摾'), - (0x2F8C5, 'M', u'撝'), - (0x2F8C6, 'M', u'摷'), - (0x2F8C7, 'M', u'㩬'), - (0x2F8C8, 'M', u'敏'), - (0x2F8C9, 'M', u'敬'), - (0x2F8CA, 'M', u'𣀊'), - (0x2F8CB, 'M', u'旣'), - (0x2F8CC, 'M', u'書'), - (0x2F8CD, 'M', u'晉'), - (0x2F8CE, 'M', u'㬙'), - (0x2F8CF, 'M', u'暑'), - (0x2F8D0, 'M', u'㬈'), - (0x2F8D1, 'M', u'㫤'), - (0x2F8D2, 'M', u'冒'), - (0x2F8D3, 'M', u'冕'), - (0x2F8D4, 'M', u'最'), - (0x2F8D5, 'M', u'暜'), - (0x2F8D6, 'M', u'肭'), - (0x2F8D7, 'M', u'䏙'), - (0x2F8D8, 'M', u'朗'), - (0x2F8D9, 'M', u'望'), - (0x2F8DA, 'M', u'朡'), - (0x2F8DB, 'M', u'杞'), - (0x2F8DC, 'M', u'杓'), - (0x2F8DD, 'M', u'𣏃'), - (0x2F8DE, 'M', u'㭉'), - (0x2F8DF, 'M', u'柺'), - (0x2F8E0, 'M', u'枅'), - (0x2F8E1, 'M', u'桒'), - (0x2F8E2, 'M', u'梅'), - (0x2F8E3, 'M', u'𣑭'), - (0x2F8E4, 'M', u'梎'), - (0x2F8E5, 'M', u'栟'), - (0x2F8E6, 'M', u'椔'), - (0x2F8E7, 'M', u'㮝'), - (0x2F8E8, 'M', u'楂'), - (0x2F8E9, 'M', u'榣'), - (0x2F8EA, 'M', u'槪'), - (0x2F8EB, 'M', u'檨'), - (0x2F8EC, 'M', u'𣚣'), - (0x2F8ED, 'M', u'櫛'), - (0x2F8EE, 'M', u'㰘'), - (0x2F8EF, 'M', u'次'), - ] - -def _seg_75(): - return [ - (0x2F8F0, 'M', u'𣢧'), - (0x2F8F1, 'M', u'歔'), - (0x2F8F2, 'M', u'㱎'), - (0x2F8F3, 'M', u'歲'), - (0x2F8F4, 'M', u'殟'), - (0x2F8F5, 'M', u'殺'), - (0x2F8F6, 'M', u'殻'), - (0x2F8F7, 'M', u'𣪍'), - (0x2F8F8, 'M', u'𡴋'), - (0x2F8F9, 'M', u'𣫺'), - (0x2F8FA, 'M', u'汎'), - (0x2F8FB, 'M', u'𣲼'), - (0x2F8FC, 'M', u'沿'), - (0x2F8FD, 'M', u'泍'), - (0x2F8FE, 'M', u'汧'), - (0x2F8FF, 'M', u'洖'), - (0x2F900, 'M', u'派'), - (0x2F901, 'M', u'海'), - (0x2F902, 'M', u'流'), - (0x2F903, 'M', u'浩'), - (0x2F904, 'M', u'浸'), - (0x2F905, 'M', u'涅'), - (0x2F906, 'M', u'𣴞'), - (0x2F907, 'M', u'洴'), - (0x2F908, 'M', u'港'), - (0x2F909, 'M', u'湮'), - (0x2F90A, 'M', u'㴳'), - (0x2F90B, 'M', u'滋'), - (0x2F90C, 'M', u'滇'), - (0x2F90D, 'M', u'𣻑'), - (0x2F90E, 'M', u'淹'), - (0x2F90F, 'M', u'潮'), - (0x2F910, 'M', u'𣽞'), - (0x2F911, 'M', u'𣾎'), - (0x2F912, 'M', u'濆'), - (0x2F913, 'M', u'瀹'), - (0x2F914, 'M', u'瀞'), - (0x2F915, 'M', u'瀛'), - (0x2F916, 'M', u'㶖'), - (0x2F917, 'M', u'灊'), - (0x2F918, 'M', u'災'), - (0x2F919, 'M', u'灷'), - (0x2F91A, 'M', u'炭'), - (0x2F91B, 'M', u'𠔥'), - (0x2F91C, 'M', u'煅'), - (0x2F91D, 'M', u'𤉣'), - (0x2F91E, 'M', u'熜'), - (0x2F91F, 'X'), - (0x2F920, 'M', u'爨'), - (0x2F921, 'M', u'爵'), - (0x2F922, 'M', u'牐'), - (0x2F923, 'M', u'𤘈'), - (0x2F924, 'M', u'犀'), - (0x2F925, 'M', u'犕'), - (0x2F926, 'M', u'𤜵'), - (0x2F927, 'M', u'𤠔'), - (0x2F928, 'M', u'獺'), - (0x2F929, 'M', u'王'), - (0x2F92A, 'M', u'㺬'), - (0x2F92B, 'M', u'玥'), - (0x2F92C, 'M', u'㺸'), - (0x2F92E, 'M', u'瑇'), - (0x2F92F, 'M', u'瑜'), - (0x2F930, 'M', u'瑱'), - (0x2F931, 'M', u'璅'), - (0x2F932, 'M', u'瓊'), - (0x2F933, 'M', u'㼛'), - (0x2F934, 'M', u'甤'), - (0x2F935, 'M', u'𤰶'), - (0x2F936, 'M', u'甾'), - (0x2F937, 'M', u'𤲒'), - (0x2F938, 'M', u'異'), - (0x2F939, 'M', u'𢆟'), - (0x2F93A, 'M', u'瘐'), - (0x2F93B, 'M', u'𤾡'), - (0x2F93C, 'M', u'𤾸'), - (0x2F93D, 'M', u'𥁄'), - (0x2F93E, 'M', u'㿼'), - (0x2F93F, 'M', u'䀈'), - (0x2F940, 'M', u'直'), - (0x2F941, 'M', u'𥃳'), - (0x2F942, 'M', u'𥃲'), - (0x2F943, 'M', u'𥄙'), - (0x2F944, 'M', u'𥄳'), - (0x2F945, 'M', u'眞'), - (0x2F946, 'M', u'真'), - (0x2F948, 'M', u'睊'), - (0x2F949, 'M', u'䀹'), - (0x2F94A, 'M', u'瞋'), - (0x2F94B, 'M', u'䁆'), - (0x2F94C, 'M', u'䂖'), - (0x2F94D, 'M', u'𥐝'), - (0x2F94E, 'M', u'硎'), - (0x2F94F, 'M', u'碌'), - (0x2F950, 'M', u'磌'), - (0x2F951, 'M', u'䃣'), - (0x2F952, 'M', u'𥘦'), - (0x2F953, 'M', u'祖'), - (0x2F954, 'M', u'𥚚'), - (0x2F955, 'M', u'𥛅'), - ] - -def _seg_76(): - return [ - (0x2F956, 'M', u'福'), - (0x2F957, 'M', u'秫'), - (0x2F958, 'M', u'䄯'), - (0x2F959, 'M', u'穀'), - (0x2F95A, 'M', u'穊'), - (0x2F95B, 'M', u'穏'), - (0x2F95C, 'M', u'𥥼'), - (0x2F95D, 'M', u'𥪧'), - (0x2F95F, 'X'), - (0x2F960, 'M', u'䈂'), - (0x2F961, 'M', u'𥮫'), - (0x2F962, 'M', u'篆'), - (0x2F963, 'M', u'築'), - (0x2F964, 'M', u'䈧'), - (0x2F965, 'M', u'𥲀'), - (0x2F966, 'M', u'糒'), - (0x2F967, 'M', u'䊠'), - (0x2F968, 'M', u'糨'), - (0x2F969, 'M', u'糣'), - (0x2F96A, 'M', u'紀'), - (0x2F96B, 'M', u'𥾆'), - (0x2F96C, 'M', u'絣'), - (0x2F96D, 'M', u'䌁'), - (0x2F96E, 'M', u'緇'), - (0x2F96F, 'M', u'縂'), - (0x2F970, 'M', u'繅'), - (0x2F971, 'M', u'䌴'), - (0x2F972, 'M', u'𦈨'), - (0x2F973, 'M', u'𦉇'), - (0x2F974, 'M', u'䍙'), - (0x2F975, 'M', u'𦋙'), - (0x2F976, 'M', u'罺'), - (0x2F977, 'M', u'𦌾'), - (0x2F978, 'M', u'羕'), - (0x2F979, 'M', u'翺'), - (0x2F97A, 'M', u'者'), - (0x2F97B, 'M', u'𦓚'), - (0x2F97C, 'M', u'𦔣'), - (0x2F97D, 'M', u'聠'), - (0x2F97E, 'M', u'𦖨'), - (0x2F97F, 'M', u'聰'), - (0x2F980, 'M', u'𣍟'), - (0x2F981, 'M', u'䏕'), - (0x2F982, 'M', u'育'), - (0x2F983, 'M', u'脃'), - (0x2F984, 'M', u'䐋'), - (0x2F985, 'M', u'脾'), - (0x2F986, 'M', u'媵'), - (0x2F987, 'M', u'𦞧'), - (0x2F988, 'M', u'𦞵'), - (0x2F989, 'M', u'𣎓'), - (0x2F98A, 'M', u'𣎜'), - (0x2F98B, 'M', u'舁'), - (0x2F98C, 'M', u'舄'), - (0x2F98D, 'M', u'辞'), - (0x2F98E, 'M', u'䑫'), - (0x2F98F, 'M', u'芑'), - (0x2F990, 'M', u'芋'), - (0x2F991, 'M', u'芝'), - (0x2F992, 'M', u'劳'), - (0x2F993, 'M', u'花'), - (0x2F994, 'M', u'芳'), - (0x2F995, 'M', u'芽'), - (0x2F996, 'M', u'苦'), - (0x2F997, 'M', u'𦬼'), - (0x2F998, 'M', u'若'), - (0x2F999, 'M', u'茝'), - (0x2F99A, 'M', u'荣'), - (0x2F99B, 'M', u'莭'), - (0x2F99C, 'M', u'茣'), - (0x2F99D, 'M', u'莽'), - (0x2F99E, 'M', u'菧'), - (0x2F99F, 'M', u'著'), - (0x2F9A0, 'M', u'荓'), - (0x2F9A1, 'M', u'菊'), - (0x2F9A2, 'M', u'菌'), - (0x2F9A3, 'M', u'菜'), - (0x2F9A4, 'M', u'𦰶'), - (0x2F9A5, 'M', u'𦵫'), - (0x2F9A6, 'M', u'𦳕'), - (0x2F9A7, 'M', u'䔫'), - (0x2F9A8, 'M', u'蓱'), - (0x2F9A9, 'M', u'蓳'), - (0x2F9AA, 'M', u'蔖'), - (0x2F9AB, 'M', u'𧏊'), - (0x2F9AC, 'M', u'蕤'), - (0x2F9AD, 'M', u'𦼬'), - (0x2F9AE, 'M', u'䕝'), - (0x2F9AF, 'M', u'䕡'), - (0x2F9B0, 'M', u'𦾱'), - (0x2F9B1, 'M', u'𧃒'), - (0x2F9B2, 'M', u'䕫'), - (0x2F9B3, 'M', u'虐'), - (0x2F9B4, 'M', u'虜'), - (0x2F9B5, 'M', u'虧'), - (0x2F9B6, 'M', u'虩'), - (0x2F9B7, 'M', u'蚩'), - (0x2F9B8, 'M', u'蚈'), - (0x2F9B9, 'M', u'蜎'), - (0x2F9BA, 'M', u'蛢'), - ] - -def _seg_77(): - return [ - (0x2F9BB, 'M', u'蝹'), - (0x2F9BC, 'M', u'蜨'), - (0x2F9BD, 'M', u'蝫'), - (0x2F9BE, 'M', u'螆'), - (0x2F9BF, 'X'), - (0x2F9C0, 'M', u'蟡'), - (0x2F9C1, 'M', u'蠁'), - (0x2F9C2, 'M', u'䗹'), - (0x2F9C3, 'M', u'衠'), - (0x2F9C4, 'M', u'衣'), - (0x2F9C5, 'M', u'𧙧'), - (0x2F9C6, 'M', u'裗'), - (0x2F9C7, 'M', u'裞'), - (0x2F9C8, 'M', u'䘵'), - (0x2F9C9, 'M', u'裺'), - (0x2F9CA, 'M', u'㒻'), - (0x2F9CB, 'M', u'𧢮'), - (0x2F9CC, 'M', u'𧥦'), - (0x2F9CD, 'M', u'䚾'), - (0x2F9CE, 'M', u'䛇'), - (0x2F9CF, 'M', u'誠'), - (0x2F9D0, 'M', u'諭'), - (0x2F9D1, 'M', u'變'), - (0x2F9D2, 'M', u'豕'), - (0x2F9D3, 'M', u'𧲨'), - (0x2F9D4, 'M', u'貫'), - (0x2F9D5, 'M', u'賁'), - (0x2F9D6, 'M', u'贛'), - (0x2F9D7, 'M', u'起'), - (0x2F9D8, 'M', u'𧼯'), - (0x2F9D9, 'M', u'𠠄'), - (0x2F9DA, 'M', u'跋'), - (0x2F9DB, 'M', u'趼'), - (0x2F9DC, 'M', u'跰'), - (0x2F9DD, 'M', u'𠣞'), - (0x2F9DE, 'M', u'軔'), - (0x2F9DF, 'M', u'輸'), - (0x2F9E0, 'M', u'𨗒'), - (0x2F9E1, 'M', u'𨗭'), - (0x2F9E2, 'M', u'邔'), - (0x2F9E3, 'M', u'郱'), - (0x2F9E4, 'M', u'鄑'), - (0x2F9E5, 'M', u'𨜮'), - (0x2F9E6, 'M', u'鄛'), - (0x2F9E7, 'M', u'鈸'), - (0x2F9E8, 'M', u'鋗'), - (0x2F9E9, 'M', u'鋘'), - (0x2F9EA, 'M', u'鉼'), - (0x2F9EB, 'M', u'鏹'), - (0x2F9EC, 'M', u'鐕'), - (0x2F9ED, 'M', u'𨯺'), - (0x2F9EE, 'M', u'開'), - (0x2F9EF, 'M', u'䦕'), - (0x2F9F0, 'M', u'閷'), - (0x2F9F1, 'M', u'𨵷'), - (0x2F9F2, 'M', u'䧦'), - (0x2F9F3, 'M', u'雃'), - (0x2F9F4, 'M', u'嶲'), - (0x2F9F5, 'M', u'霣'), - (0x2F9F6, 'M', u'𩅅'), - (0x2F9F7, 'M', u'𩈚'), - (0x2F9F8, 'M', u'䩮'), - (0x2F9F9, 'M', u'䩶'), - (0x2F9FA, 'M', u'韠'), - (0x2F9FB, 'M', u'𩐊'), - (0x2F9FC, 'M', u'䪲'), - (0x2F9FD, 'M', u'𩒖'), - (0x2F9FE, 'M', u'頋'), - (0x2FA00, 'M', u'頩'), - (0x2FA01, 'M', u'𩖶'), - (0x2FA02, 'M', u'飢'), - (0x2FA03, 'M', u'䬳'), - (0x2FA04, 'M', u'餩'), - (0x2FA05, 'M', u'馧'), - (0x2FA06, 'M', u'駂'), - (0x2FA07, 'M', u'駾'), - (0x2FA08, 'M', u'䯎'), - (0x2FA09, 'M', u'𩬰'), - (0x2FA0A, 'M', u'鬒'), - (0x2FA0B, 'M', u'鱀'), - (0x2FA0C, 'M', u'鳽'), - (0x2FA0D, 'M', u'䳎'), - (0x2FA0E, 'M', u'䳭'), - (0x2FA0F, 'M', u'鵧'), - (0x2FA10, 'M', u'𪃎'), - (0x2FA11, 'M', u'䳸'), - (0x2FA12, 'M', u'𪄅'), - (0x2FA13, 'M', u'𪈎'), - (0x2FA14, 'M', u'𪊑'), - (0x2FA15, 'M', u'麻'), - (0x2FA16, 'M', u'䵖'), - (0x2FA17, 'M', u'黹'), - (0x2FA18, 'M', u'黾'), - (0x2FA19, 'M', u'鼅'), - (0x2FA1A, 'M', u'鼏'), - (0x2FA1B, 'M', u'鼖'), - (0x2FA1C, 'M', u'鼻'), - (0x2FA1D, 'M', u'𪘀'), - (0x2FA1E, 'X'), - (0xE0100, 'I'), - ] - -def _seg_78(): - return [ - (0xE01F0, 'X'), - ] - -uts46data = tuple( - _seg_0() - + _seg_1() - + _seg_2() - + _seg_3() - + _seg_4() - + _seg_5() - + _seg_6() - + _seg_7() - + _seg_8() - + _seg_9() - + _seg_10() - + _seg_11() - + _seg_12() - + _seg_13() - + _seg_14() - + _seg_15() - + _seg_16() - + _seg_17() - + _seg_18() - + _seg_19() - + _seg_20() - + _seg_21() - + _seg_22() - + _seg_23() - + _seg_24() - + _seg_25() - + _seg_26() - + _seg_27() - + _seg_28() - + _seg_29() - + _seg_30() - + _seg_31() - + _seg_32() - + _seg_33() - + _seg_34() - + _seg_35() - + _seg_36() - + _seg_37() - + _seg_38() - + _seg_39() - + _seg_40() - + _seg_41() - + _seg_42() - + _seg_43() - + _seg_44() - + _seg_45() - + _seg_46() - + _seg_47() - + _seg_48() - + _seg_49() - + _seg_50() - + _seg_51() - + _seg_52() - + _seg_53() - + _seg_54() - + _seg_55() - + _seg_56() - + _seg_57() - + _seg_58() - + _seg_59() - + _seg_60() - + _seg_61() - + _seg_62() - + _seg_63() - + _seg_64() - + _seg_65() - + _seg_66() - + _seg_67() - + _seg_68() - + _seg_69() - + _seg_70() - + _seg_71() - + _seg_72() - + _seg_73() - + _seg_74() - + _seg_75() - + _seg_76() - + _seg_77() - + _seg_78() -) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/ipaddress.py b/env/lib/python3.7/site-packages/pip/_vendor/ipaddress.py deleted file mode 100644 index f2d0766..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/ipaddress.py +++ /dev/null @@ -1,2419 +0,0 @@ -# Copyright 2007 Google Inc. -# Licensed to PSF under a Contributor Agreement. - -"""A fast, lightweight IPv4/IPv6 manipulation library in Python. - -This library is used to create/poke/manipulate IPv4 and IPv6 addresses -and networks. - -""" - -from __future__ import unicode_literals - - -import itertools -import struct - -__version__ = '1.0.22' - -# Compatibility functions -_compat_int_types = (int,) -try: - _compat_int_types = (int, long) -except NameError: - pass -try: - _compat_str = unicode -except NameError: - _compat_str = str - assert bytes != str -if b'\0'[0] == 0: # Python 3 semantics - def _compat_bytes_to_byte_vals(byt): - return byt -else: - def _compat_bytes_to_byte_vals(byt): - return [struct.unpack(b'!B', b)[0] for b in byt] -try: - _compat_int_from_byte_vals = int.from_bytes -except AttributeError: - def _compat_int_from_byte_vals(bytvals, endianess): - assert endianess == 'big' - res = 0 - for bv in bytvals: - assert isinstance(bv, _compat_int_types) - res = (res << 8) + bv - return res - - -def _compat_to_bytes(intval, length, endianess): - assert isinstance(intval, _compat_int_types) - assert endianess == 'big' - if length == 4: - if intval < 0 or intval >= 2 ** 32: - raise struct.error("integer out of range for 'I' format code") - return struct.pack(b'!I', intval) - elif length == 16: - if intval < 0 or intval >= 2 ** 128: - raise struct.error("integer out of range for 'QQ' format code") - return struct.pack(b'!QQ', intval >> 64, intval & 0xffffffffffffffff) - else: - raise NotImplementedError() - - -if hasattr(int, 'bit_length'): - # Not int.bit_length , since that won't work in 2.7 where long exists - def _compat_bit_length(i): - return i.bit_length() -else: - def _compat_bit_length(i): - for res in itertools.count(): - if i >> res == 0: - return res - - -def _compat_range(start, end, step=1): - assert step > 0 - i = start - while i < end: - yield i - i += step - - -class _TotalOrderingMixin(object): - __slots__ = () - - # Helper that derives the other comparison operations from - # __lt__ and __eq__ - # We avoid functools.total_ordering because it doesn't handle - # NotImplemented correctly yet (http://bugs.python.org/issue10042) - def __eq__(self, other): - raise NotImplementedError - - def __ne__(self, other): - equal = self.__eq__(other) - if equal is NotImplemented: - return NotImplemented - return not equal - - def __lt__(self, other): - raise NotImplementedError - - def __le__(self, other): - less = self.__lt__(other) - if less is NotImplemented or not less: - return self.__eq__(other) - return less - - def __gt__(self, other): - less = self.__lt__(other) - if less is NotImplemented: - return NotImplemented - equal = self.__eq__(other) - if equal is NotImplemented: - return NotImplemented - return not (less or equal) - - def __ge__(self, other): - less = self.__lt__(other) - if less is NotImplemented: - return NotImplemented - return not less - - -IPV4LENGTH = 32 -IPV6LENGTH = 128 - - -class AddressValueError(ValueError): - """A Value Error related to the address.""" - - -class NetmaskValueError(ValueError): - """A Value Error related to the netmask.""" - - -def ip_address(address): - """Take an IP string/int and return an object of the correct type. - - Args: - address: A string or integer, the IP address. Either IPv4 or - IPv6 addresses may be supplied; integers less than 2**32 will - be considered to be IPv4 by default. - - Returns: - An IPv4Address or IPv6Address object. - - Raises: - ValueError: if the *address* passed isn't either a v4 or a v6 - address - - """ - try: - return IPv4Address(address) - except (AddressValueError, NetmaskValueError): - pass - - try: - return IPv6Address(address) - except (AddressValueError, NetmaskValueError): - pass - - if isinstance(address, bytes): - raise AddressValueError( - '%r does not appear to be an IPv4 or IPv6 address. ' - 'Did you pass in a bytes (str in Python 2) instead of' - ' a unicode object?' % address) - - raise ValueError('%r does not appear to be an IPv4 or IPv6 address' % - address) - - -def ip_network(address, strict=True): - """Take an IP string/int and return an object of the correct type. - - Args: - address: A string or integer, the IP network. Either IPv4 or - IPv6 networks may be supplied; integers less than 2**32 will - be considered to be IPv4 by default. - - Returns: - An IPv4Network or IPv6Network object. - - Raises: - ValueError: if the string passed isn't either a v4 or a v6 - address. Or if the network has host bits set. - - """ - try: - return IPv4Network(address, strict) - except (AddressValueError, NetmaskValueError): - pass - - try: - return IPv6Network(address, strict) - except (AddressValueError, NetmaskValueError): - pass - - if isinstance(address, bytes): - raise AddressValueError( - '%r does not appear to be an IPv4 or IPv6 network. ' - 'Did you pass in a bytes (str in Python 2) instead of' - ' a unicode object?' % address) - - raise ValueError('%r does not appear to be an IPv4 or IPv6 network' % - address) - - -def ip_interface(address): - """Take an IP string/int and return an object of the correct type. - - Args: - address: A string or integer, the IP address. Either IPv4 or - IPv6 addresses may be supplied; integers less than 2**32 will - be considered to be IPv4 by default. - - Returns: - An IPv4Interface or IPv6Interface object. - - Raises: - ValueError: if the string passed isn't either a v4 or a v6 - address. - - Notes: - The IPv?Interface classes describe an Address on a particular - Network, so they're basically a combination of both the Address - and Network classes. - - """ - try: - return IPv4Interface(address) - except (AddressValueError, NetmaskValueError): - pass - - try: - return IPv6Interface(address) - except (AddressValueError, NetmaskValueError): - pass - - raise ValueError('%r does not appear to be an IPv4 or IPv6 interface' % - address) - - -def v4_int_to_packed(address): - """Represent an address as 4 packed bytes in network (big-endian) order. - - Args: - address: An integer representation of an IPv4 IP address. - - Returns: - The integer address packed as 4 bytes in network (big-endian) order. - - Raises: - ValueError: If the integer is negative or too large to be an - IPv4 IP address. - - """ - try: - return _compat_to_bytes(address, 4, 'big') - except (struct.error, OverflowError): - raise ValueError("Address negative or too large for IPv4") - - -def v6_int_to_packed(address): - """Represent an address as 16 packed bytes in network (big-endian) order. - - Args: - address: An integer representation of an IPv6 IP address. - - Returns: - The integer address packed as 16 bytes in network (big-endian) order. - - """ - try: - return _compat_to_bytes(address, 16, 'big') - except (struct.error, OverflowError): - raise ValueError("Address negative or too large for IPv6") - - -def _split_optional_netmask(address): - """Helper to split the netmask and raise AddressValueError if needed""" - addr = _compat_str(address).split('/') - if len(addr) > 2: - raise AddressValueError("Only one '/' permitted in %r" % address) - return addr - - -def _find_address_range(addresses): - """Find a sequence of sorted deduplicated IPv#Address. - - Args: - addresses: a list of IPv#Address objects. - - Yields: - A tuple containing the first and last IP addresses in the sequence. - - """ - it = iter(addresses) - first = last = next(it) - for ip in it: - if ip._ip != last._ip + 1: - yield first, last - first = ip - last = ip - yield first, last - - -def _count_righthand_zero_bits(number, bits): - """Count the number of zero bits on the right hand side. - - Args: - number: an integer. - bits: maximum number of bits to count. - - Returns: - The number of zero bits on the right hand side of the number. - - """ - if number == 0: - return bits - return min(bits, _compat_bit_length(~number & (number - 1))) - - -def summarize_address_range(first, last): - """Summarize a network range given the first and last IP addresses. - - Example: - >>> list(summarize_address_range(IPv4Address('192.0.2.0'), - ... IPv4Address('192.0.2.130'))) - ... #doctest: +NORMALIZE_WHITESPACE - [IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/31'), - IPv4Network('192.0.2.130/32')] - - Args: - first: the first IPv4Address or IPv6Address in the range. - last: the last IPv4Address or IPv6Address in the range. - - Returns: - An iterator of the summarized IPv(4|6) network objects. - - Raise: - TypeError: - If the first and last objects are not IP addresses. - If the first and last objects are not the same version. - ValueError: - If the last object is not greater than the first. - If the version of the first address is not 4 or 6. - - """ - if (not (isinstance(first, _BaseAddress) and - isinstance(last, _BaseAddress))): - raise TypeError('first and last must be IP addresses, not networks') - if first.version != last.version: - raise TypeError("%s and %s are not of the same version" % ( - first, last)) - if first > last: - raise ValueError('last IP address must be greater than first') - - if first.version == 4: - ip = IPv4Network - elif first.version == 6: - ip = IPv6Network - else: - raise ValueError('unknown IP version') - - ip_bits = first._max_prefixlen - first_int = first._ip - last_int = last._ip - while first_int <= last_int: - nbits = min(_count_righthand_zero_bits(first_int, ip_bits), - _compat_bit_length(last_int - first_int + 1) - 1) - net = ip((first_int, ip_bits - nbits)) - yield net - first_int += 1 << nbits - if first_int - 1 == ip._ALL_ONES: - break - - -def _collapse_addresses_internal(addresses): - """Loops through the addresses, collapsing concurrent netblocks. - - Example: - - ip1 = IPv4Network('192.0.2.0/26') - ip2 = IPv4Network('192.0.2.64/26') - ip3 = IPv4Network('192.0.2.128/26') - ip4 = IPv4Network('192.0.2.192/26') - - _collapse_addresses_internal([ip1, ip2, ip3, ip4]) -> - [IPv4Network('192.0.2.0/24')] - - This shouldn't be called directly; it is called via - collapse_addresses([]). - - Args: - addresses: A list of IPv4Network's or IPv6Network's - - Returns: - A list of IPv4Network's or IPv6Network's depending on what we were - passed. - - """ - # First merge - to_merge = list(addresses) - subnets = {} - while to_merge: - net = to_merge.pop() - supernet = net.supernet() - existing = subnets.get(supernet) - if existing is None: - subnets[supernet] = net - elif existing != net: - # Merge consecutive subnets - del subnets[supernet] - to_merge.append(supernet) - # Then iterate over resulting networks, skipping subsumed subnets - last = None - for net in sorted(subnets.values()): - if last is not None: - # Since they are sorted, - # last.network_address <= net.network_address is a given. - if last.broadcast_address >= net.broadcast_address: - continue - yield net - last = net - - -def collapse_addresses(addresses): - """Collapse a list of IP objects. - - Example: - collapse_addresses([IPv4Network('192.0.2.0/25'), - IPv4Network('192.0.2.128/25')]) -> - [IPv4Network('192.0.2.0/24')] - - Args: - addresses: An iterator of IPv4Network or IPv6Network objects. - - Returns: - An iterator of the collapsed IPv(4|6)Network objects. - - Raises: - TypeError: If passed a list of mixed version objects. - - """ - addrs = [] - ips = [] - nets = [] - - # split IP addresses and networks - for ip in addresses: - if isinstance(ip, _BaseAddress): - if ips and ips[-1]._version != ip._version: - raise TypeError("%s and %s are not of the same version" % ( - ip, ips[-1])) - ips.append(ip) - elif ip._prefixlen == ip._max_prefixlen: - if ips and ips[-1]._version != ip._version: - raise TypeError("%s and %s are not of the same version" % ( - ip, ips[-1])) - try: - ips.append(ip.ip) - except AttributeError: - ips.append(ip.network_address) - else: - if nets and nets[-1]._version != ip._version: - raise TypeError("%s and %s are not of the same version" % ( - ip, nets[-1])) - nets.append(ip) - - # sort and dedup - ips = sorted(set(ips)) - - # find consecutive address ranges in the sorted sequence and summarize them - if ips: - for first, last in _find_address_range(ips): - addrs.extend(summarize_address_range(first, last)) - - return _collapse_addresses_internal(addrs + nets) - - -def get_mixed_type_key(obj): - """Return a key suitable for sorting between networks and addresses. - - Address and Network objects are not sortable by default; they're - fundamentally different so the expression - - IPv4Address('192.0.2.0') <= IPv4Network('192.0.2.0/24') - - doesn't make any sense. There are some times however, where you may wish - to have ipaddress sort these for you anyway. If you need to do this, you - can use this function as the key= argument to sorted(). - - Args: - obj: either a Network or Address object. - Returns: - appropriate key. - - """ - if isinstance(obj, _BaseNetwork): - return obj._get_networks_key() - elif isinstance(obj, _BaseAddress): - return obj._get_address_key() - return NotImplemented - - -class _IPAddressBase(_TotalOrderingMixin): - - """The mother class.""" - - __slots__ = () - - @property - def exploded(self): - """Return the longhand version of the IP address as a string.""" - return self._explode_shorthand_ip_string() - - @property - def compressed(self): - """Return the shorthand version of the IP address as a string.""" - return _compat_str(self) - - @property - def reverse_pointer(self): - """The name of the reverse DNS pointer for the IP address, e.g.: - >>> ipaddress.ip_address("127.0.0.1").reverse_pointer - '1.0.0.127.in-addr.arpa' - >>> ipaddress.ip_address("2001:db8::1").reverse_pointer - '1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa' - - """ - return self._reverse_pointer() - - @property - def version(self): - msg = '%200s has no version specified' % (type(self),) - raise NotImplementedError(msg) - - def _check_int_address(self, address): - if address < 0: - msg = "%d (< 0) is not permitted as an IPv%d address" - raise AddressValueError(msg % (address, self._version)) - if address > self._ALL_ONES: - msg = "%d (>= 2**%d) is not permitted as an IPv%d address" - raise AddressValueError(msg % (address, self._max_prefixlen, - self._version)) - - def _check_packed_address(self, address, expected_len): - address_len = len(address) - if address_len != expected_len: - msg = ( - '%r (len %d != %d) is not permitted as an IPv%d address. ' - 'Did you pass in a bytes (str in Python 2) instead of' - ' a unicode object?') - raise AddressValueError(msg % (address, address_len, - expected_len, self._version)) - - @classmethod - def _ip_int_from_prefix(cls, prefixlen): - """Turn the prefix length into a bitwise netmask - - Args: - prefixlen: An integer, the prefix length. - - Returns: - An integer. - - """ - return cls._ALL_ONES ^ (cls._ALL_ONES >> prefixlen) - - @classmethod - def _prefix_from_ip_int(cls, ip_int): - """Return prefix length from the bitwise netmask. - - Args: - ip_int: An integer, the netmask in expanded bitwise format - - Returns: - An integer, the prefix length. - - Raises: - ValueError: If the input intermingles zeroes & ones - """ - trailing_zeroes = _count_righthand_zero_bits(ip_int, - cls._max_prefixlen) - prefixlen = cls._max_prefixlen - trailing_zeroes - leading_ones = ip_int >> trailing_zeroes - all_ones = (1 << prefixlen) - 1 - if leading_ones != all_ones: - byteslen = cls._max_prefixlen // 8 - details = _compat_to_bytes(ip_int, byteslen, 'big') - msg = 'Netmask pattern %r mixes zeroes & ones' - raise ValueError(msg % details) - return prefixlen - - @classmethod - def _report_invalid_netmask(cls, netmask_str): - msg = '%r is not a valid netmask' % netmask_str - raise NetmaskValueError(msg) - - @classmethod - def _prefix_from_prefix_string(cls, prefixlen_str): - """Return prefix length from a numeric string - - Args: - prefixlen_str: The string to be converted - - Returns: - An integer, the prefix length. - - Raises: - NetmaskValueError: If the input is not a valid netmask - """ - # int allows a leading +/- as well as surrounding whitespace, - # so we ensure that isn't the case - if not _BaseV4._DECIMAL_DIGITS.issuperset(prefixlen_str): - cls._report_invalid_netmask(prefixlen_str) - try: - prefixlen = int(prefixlen_str) - except ValueError: - cls._report_invalid_netmask(prefixlen_str) - if not (0 <= prefixlen <= cls._max_prefixlen): - cls._report_invalid_netmask(prefixlen_str) - return prefixlen - - @classmethod - def _prefix_from_ip_string(cls, ip_str): - """Turn a netmask/hostmask string into a prefix length - - Args: - ip_str: The netmask/hostmask to be converted - - Returns: - An integer, the prefix length. - - Raises: - NetmaskValueError: If the input is not a valid netmask/hostmask - """ - # Parse the netmask/hostmask like an IP address. - try: - ip_int = cls._ip_int_from_string(ip_str) - except AddressValueError: - cls._report_invalid_netmask(ip_str) - - # Try matching a netmask (this would be /1*0*/ as a bitwise regexp). - # Note that the two ambiguous cases (all-ones and all-zeroes) are - # treated as netmasks. - try: - return cls._prefix_from_ip_int(ip_int) - except ValueError: - pass - - # Invert the bits, and try matching a /0+1+/ hostmask instead. - ip_int ^= cls._ALL_ONES - try: - return cls._prefix_from_ip_int(ip_int) - except ValueError: - cls._report_invalid_netmask(ip_str) - - def __reduce__(self): - return self.__class__, (_compat_str(self),) - - -class _BaseAddress(_IPAddressBase): - - """A generic IP object. - - This IP class contains the version independent methods which are - used by single IP addresses. - """ - - __slots__ = () - - def __int__(self): - return self._ip - - def __eq__(self, other): - try: - return (self._ip == other._ip and - self._version == other._version) - except AttributeError: - return NotImplemented - - def __lt__(self, other): - if not isinstance(other, _IPAddressBase): - return NotImplemented - if not isinstance(other, _BaseAddress): - raise TypeError('%s and %s are not of the same type' % ( - self, other)) - if self._version != other._version: - raise TypeError('%s and %s are not of the same version' % ( - self, other)) - if self._ip != other._ip: - return self._ip < other._ip - return False - - # Shorthand for Integer addition and subtraction. This is not - # meant to ever support addition/subtraction of addresses. - def __add__(self, other): - if not isinstance(other, _compat_int_types): - return NotImplemented - return self.__class__(int(self) + other) - - def __sub__(self, other): - if not isinstance(other, _compat_int_types): - return NotImplemented - return self.__class__(int(self) - other) - - def __repr__(self): - return '%s(%r)' % (self.__class__.__name__, _compat_str(self)) - - def __str__(self): - return _compat_str(self._string_from_ip_int(self._ip)) - - def __hash__(self): - return hash(hex(int(self._ip))) - - def _get_address_key(self): - return (self._version, self) - - def __reduce__(self): - return self.__class__, (self._ip,) - - -class _BaseNetwork(_IPAddressBase): - - """A generic IP network object. - - This IP class contains the version independent methods which are - used by networks. - - """ - def __init__(self, address): - self._cache = {} - - def __repr__(self): - return '%s(%r)' % (self.__class__.__name__, _compat_str(self)) - - def __str__(self): - return '%s/%d' % (self.network_address, self.prefixlen) - - def hosts(self): - """Generate Iterator over usable hosts in a network. - - This is like __iter__ except it doesn't return the network - or broadcast addresses. - - """ - network = int(self.network_address) - broadcast = int(self.broadcast_address) - for x in _compat_range(network + 1, broadcast): - yield self._address_class(x) - - def __iter__(self): - network = int(self.network_address) - broadcast = int(self.broadcast_address) - for x in _compat_range(network, broadcast + 1): - yield self._address_class(x) - - def __getitem__(self, n): - network = int(self.network_address) - broadcast = int(self.broadcast_address) - if n >= 0: - if network + n > broadcast: - raise IndexError('address out of range') - return self._address_class(network + n) - else: - n += 1 - if broadcast + n < network: - raise IndexError('address out of range') - return self._address_class(broadcast + n) - - def __lt__(self, other): - if not isinstance(other, _IPAddressBase): - return NotImplemented - if not isinstance(other, _BaseNetwork): - raise TypeError('%s and %s are not of the same type' % ( - self, other)) - if self._version != other._version: - raise TypeError('%s and %s are not of the same version' % ( - self, other)) - if self.network_address != other.network_address: - return self.network_address < other.network_address - if self.netmask != other.netmask: - return self.netmask < other.netmask - return False - - def __eq__(self, other): - try: - return (self._version == other._version and - self.network_address == other.network_address and - int(self.netmask) == int(other.netmask)) - except AttributeError: - return NotImplemented - - def __hash__(self): - return hash(int(self.network_address) ^ int(self.netmask)) - - def __contains__(self, other): - # always false if one is v4 and the other is v6. - if self._version != other._version: - return False - # dealing with another network. - if isinstance(other, _BaseNetwork): - return False - # dealing with another address - else: - # address - return (int(self.network_address) <= int(other._ip) <= - int(self.broadcast_address)) - - def overlaps(self, other): - """Tell if self is partly contained in other.""" - return self.network_address in other or ( - self.broadcast_address in other or ( - other.network_address in self or ( - other.broadcast_address in self))) - - @property - def broadcast_address(self): - x = self._cache.get('broadcast_address') - if x is None: - x = self._address_class(int(self.network_address) | - int(self.hostmask)) - self._cache['broadcast_address'] = x - return x - - @property - def hostmask(self): - x = self._cache.get('hostmask') - if x is None: - x = self._address_class(int(self.netmask) ^ self._ALL_ONES) - self._cache['hostmask'] = x - return x - - @property - def with_prefixlen(self): - return '%s/%d' % (self.network_address, self._prefixlen) - - @property - def with_netmask(self): - return '%s/%s' % (self.network_address, self.netmask) - - @property - def with_hostmask(self): - return '%s/%s' % (self.network_address, self.hostmask) - - @property - def num_addresses(self): - """Number of hosts in the current subnet.""" - return int(self.broadcast_address) - int(self.network_address) + 1 - - @property - def _address_class(self): - # Returning bare address objects (rather than interfaces) allows for - # more consistent behaviour across the network address, broadcast - # address and individual host addresses. - msg = '%200s has no associated address class' % (type(self),) - raise NotImplementedError(msg) - - @property - def prefixlen(self): - return self._prefixlen - - def address_exclude(self, other): - """Remove an address from a larger block. - - For example: - - addr1 = ip_network('192.0.2.0/28') - addr2 = ip_network('192.0.2.1/32') - list(addr1.address_exclude(addr2)) = - [IPv4Network('192.0.2.0/32'), IPv4Network('192.0.2.2/31'), - IPv4Network('192.0.2.4/30'), IPv4Network('192.0.2.8/29')] - - or IPv6: - - addr1 = ip_network('2001:db8::1/32') - addr2 = ip_network('2001:db8::1/128') - list(addr1.address_exclude(addr2)) = - [ip_network('2001:db8::1/128'), - ip_network('2001:db8::2/127'), - ip_network('2001:db8::4/126'), - ip_network('2001:db8::8/125'), - ... - ip_network('2001:db8:8000::/33')] - - Args: - other: An IPv4Network or IPv6Network object of the same type. - - Returns: - An iterator of the IPv(4|6)Network objects which is self - minus other. - - Raises: - TypeError: If self and other are of differing address - versions, or if other is not a network object. - ValueError: If other is not completely contained by self. - - """ - if not self._version == other._version: - raise TypeError("%s and %s are not of the same version" % ( - self, other)) - - if not isinstance(other, _BaseNetwork): - raise TypeError("%s is not a network object" % other) - - if not other.subnet_of(self): - raise ValueError('%s not contained in %s' % (other, self)) - if other == self: - return - - # Make sure we're comparing the network of other. - other = other.__class__('%s/%s' % (other.network_address, - other.prefixlen)) - - s1, s2 = self.subnets() - while s1 != other and s2 != other: - if other.subnet_of(s1): - yield s2 - s1, s2 = s1.subnets() - elif other.subnet_of(s2): - yield s1 - s1, s2 = s2.subnets() - else: - # If we got here, there's a bug somewhere. - raise AssertionError('Error performing exclusion: ' - 's1: %s s2: %s other: %s' % - (s1, s2, other)) - if s1 == other: - yield s2 - elif s2 == other: - yield s1 - else: - # If we got here, there's a bug somewhere. - raise AssertionError('Error performing exclusion: ' - 's1: %s s2: %s other: %s' % - (s1, s2, other)) - - def compare_networks(self, other): - """Compare two IP objects. - - This is only concerned about the comparison of the integer - representation of the network addresses. This means that the - host bits aren't considered at all in this method. If you want - to compare host bits, you can easily enough do a - 'HostA._ip < HostB._ip' - - Args: - other: An IP object. - - Returns: - If the IP versions of self and other are the same, returns: - - -1 if self < other: - eg: IPv4Network('192.0.2.0/25') < IPv4Network('192.0.2.128/25') - IPv6Network('2001:db8::1000/124') < - IPv6Network('2001:db8::2000/124') - 0 if self == other - eg: IPv4Network('192.0.2.0/24') == IPv4Network('192.0.2.0/24') - IPv6Network('2001:db8::1000/124') == - IPv6Network('2001:db8::1000/124') - 1 if self > other - eg: IPv4Network('192.0.2.128/25') > IPv4Network('192.0.2.0/25') - IPv6Network('2001:db8::2000/124') > - IPv6Network('2001:db8::1000/124') - - Raises: - TypeError if the IP versions are different. - - """ - # does this need to raise a ValueError? - if self._version != other._version: - raise TypeError('%s and %s are not of the same type' % ( - self, other)) - # self._version == other._version below here: - if self.network_address < other.network_address: - return -1 - if self.network_address > other.network_address: - return 1 - # self.network_address == other.network_address below here: - if self.netmask < other.netmask: - return -1 - if self.netmask > other.netmask: - return 1 - return 0 - - def _get_networks_key(self): - """Network-only key function. - - Returns an object that identifies this address' network and - netmask. This function is a suitable "key" argument for sorted() - and list.sort(). - - """ - return (self._version, self.network_address, self.netmask) - - def subnets(self, prefixlen_diff=1, new_prefix=None): - """The subnets which join to make the current subnet. - - In the case that self contains only one IP - (self._prefixlen == 32 for IPv4 or self._prefixlen == 128 - for IPv6), yield an iterator with just ourself. - - Args: - prefixlen_diff: An integer, the amount the prefix length - should be increased by. This should not be set if - new_prefix is also set. - new_prefix: The desired new prefix length. This must be a - larger number (smaller prefix) than the existing prefix. - This should not be set if prefixlen_diff is also set. - - Returns: - An iterator of IPv(4|6) objects. - - Raises: - ValueError: The prefixlen_diff is too small or too large. - OR - prefixlen_diff and new_prefix are both set or new_prefix - is a smaller number than the current prefix (smaller - number means a larger network) - - """ - if self._prefixlen == self._max_prefixlen: - yield self - return - - if new_prefix is not None: - if new_prefix < self._prefixlen: - raise ValueError('new prefix must be longer') - if prefixlen_diff != 1: - raise ValueError('cannot set prefixlen_diff and new_prefix') - prefixlen_diff = new_prefix - self._prefixlen - - if prefixlen_diff < 0: - raise ValueError('prefix length diff must be > 0') - new_prefixlen = self._prefixlen + prefixlen_diff - - if new_prefixlen > self._max_prefixlen: - raise ValueError( - 'prefix length diff %d is invalid for netblock %s' % ( - new_prefixlen, self)) - - start = int(self.network_address) - end = int(self.broadcast_address) + 1 - step = (int(self.hostmask) + 1) >> prefixlen_diff - for new_addr in _compat_range(start, end, step): - current = self.__class__((new_addr, new_prefixlen)) - yield current - - def supernet(self, prefixlen_diff=1, new_prefix=None): - """The supernet containing the current network. - - Args: - prefixlen_diff: An integer, the amount the prefix length of - the network should be decreased by. For example, given a - /24 network and a prefixlen_diff of 3, a supernet with a - /21 netmask is returned. - - Returns: - An IPv4 network object. - - Raises: - ValueError: If self.prefixlen - prefixlen_diff < 0. I.e., you have - a negative prefix length. - OR - If prefixlen_diff and new_prefix are both set or new_prefix is a - larger number than the current prefix (larger number means a - smaller network) - - """ - if self._prefixlen == 0: - return self - - if new_prefix is not None: - if new_prefix > self._prefixlen: - raise ValueError('new prefix must be shorter') - if prefixlen_diff != 1: - raise ValueError('cannot set prefixlen_diff and new_prefix') - prefixlen_diff = self._prefixlen - new_prefix - - new_prefixlen = self.prefixlen - prefixlen_diff - if new_prefixlen < 0: - raise ValueError( - 'current prefixlen is %d, cannot have a prefixlen_diff of %d' % - (self.prefixlen, prefixlen_diff)) - return self.__class__(( - int(self.network_address) & (int(self.netmask) << prefixlen_diff), - new_prefixlen)) - - @property - def is_multicast(self): - """Test if the address is reserved for multicast use. - - Returns: - A boolean, True if the address is a multicast address. - See RFC 2373 2.7 for details. - - """ - return (self.network_address.is_multicast and - self.broadcast_address.is_multicast) - - @staticmethod - def _is_subnet_of(a, b): - try: - # Always false if one is v4 and the other is v6. - if a._version != b._version: - raise TypeError("%s and %s are not of the same version" (a, b)) - return (b.network_address <= a.network_address and - b.broadcast_address >= a.broadcast_address) - except AttributeError: - raise TypeError("Unable to test subnet containment " - "between %s and %s" % (a, b)) - - def subnet_of(self, other): - """Return True if this network is a subnet of other.""" - return self._is_subnet_of(self, other) - - def supernet_of(self, other): - """Return True if this network is a supernet of other.""" - return self._is_subnet_of(other, self) - - @property - def is_reserved(self): - """Test if the address is otherwise IETF reserved. - - Returns: - A boolean, True if the address is within one of the - reserved IPv6 Network ranges. - - """ - return (self.network_address.is_reserved and - self.broadcast_address.is_reserved) - - @property - def is_link_local(self): - """Test if the address is reserved for link-local. - - Returns: - A boolean, True if the address is reserved per RFC 4291. - - """ - return (self.network_address.is_link_local and - self.broadcast_address.is_link_local) - - @property - def is_private(self): - """Test if this address is allocated for private networks. - - Returns: - A boolean, True if the address is reserved per - iana-ipv4-special-registry or iana-ipv6-special-registry. - - """ - return (self.network_address.is_private and - self.broadcast_address.is_private) - - @property - def is_global(self): - """Test if this address is allocated for public networks. - - Returns: - A boolean, True if the address is not reserved per - iana-ipv4-special-registry or iana-ipv6-special-registry. - - """ - return not self.is_private - - @property - def is_unspecified(self): - """Test if the address is unspecified. - - Returns: - A boolean, True if this is the unspecified address as defined in - RFC 2373 2.5.2. - - """ - return (self.network_address.is_unspecified and - self.broadcast_address.is_unspecified) - - @property - def is_loopback(self): - """Test if the address is a loopback address. - - Returns: - A boolean, True if the address is a loopback address as defined in - RFC 2373 2.5.3. - - """ - return (self.network_address.is_loopback and - self.broadcast_address.is_loopback) - - -class _BaseV4(object): - - """Base IPv4 object. - - The following methods are used by IPv4 objects in both single IP - addresses and networks. - - """ - - __slots__ = () - _version = 4 - # Equivalent to 255.255.255.255 or 32 bits of 1's. - _ALL_ONES = (2 ** IPV4LENGTH) - 1 - _DECIMAL_DIGITS = frozenset('0123456789') - - # the valid octets for host and netmasks. only useful for IPv4. - _valid_mask_octets = frozenset([255, 254, 252, 248, 240, 224, 192, 128, 0]) - - _max_prefixlen = IPV4LENGTH - # There are only a handful of valid v4 netmasks, so we cache them all - # when constructed (see _make_netmask()). - _netmask_cache = {} - - def _explode_shorthand_ip_string(self): - return _compat_str(self) - - @classmethod - def _make_netmask(cls, arg): - """Make a (netmask, prefix_len) tuple from the given argument. - - Argument can be: - - an integer (the prefix length) - - a string representing the prefix length (e.g. "24") - - a string representing the prefix netmask (e.g. "255.255.255.0") - """ - if arg not in cls._netmask_cache: - if isinstance(arg, _compat_int_types): - prefixlen = arg - else: - try: - # Check for a netmask in prefix length form - prefixlen = cls._prefix_from_prefix_string(arg) - except NetmaskValueError: - # Check for a netmask or hostmask in dotted-quad form. - # This may raise NetmaskValueError. - prefixlen = cls._prefix_from_ip_string(arg) - netmask = IPv4Address(cls._ip_int_from_prefix(prefixlen)) - cls._netmask_cache[arg] = netmask, prefixlen - return cls._netmask_cache[arg] - - @classmethod - def _ip_int_from_string(cls, ip_str): - """Turn the given IP string into an integer for comparison. - - Args: - ip_str: A string, the IP ip_str. - - Returns: - The IP ip_str as an integer. - - Raises: - AddressValueError: if ip_str isn't a valid IPv4 Address. - - """ - if not ip_str: - raise AddressValueError('Address cannot be empty') - - octets = ip_str.split('.') - if len(octets) != 4: - raise AddressValueError("Expected 4 octets in %r" % ip_str) - - try: - return _compat_int_from_byte_vals( - map(cls._parse_octet, octets), 'big') - except ValueError as exc: - raise AddressValueError("%s in %r" % (exc, ip_str)) - - @classmethod - def _parse_octet(cls, octet_str): - """Convert a decimal octet into an integer. - - Args: - octet_str: A string, the number to parse. - - Returns: - The octet as an integer. - - Raises: - ValueError: if the octet isn't strictly a decimal from [0..255]. - - """ - if not octet_str: - raise ValueError("Empty octet not permitted") - # Whitelist the characters, since int() allows a lot of bizarre stuff. - if not cls._DECIMAL_DIGITS.issuperset(octet_str): - msg = "Only decimal digits permitted in %r" - raise ValueError(msg % octet_str) - # We do the length check second, since the invalid character error - # is likely to be more informative for the user - if len(octet_str) > 3: - msg = "At most 3 characters permitted in %r" - raise ValueError(msg % octet_str) - # Convert to integer (we know digits are legal) - octet_int = int(octet_str, 10) - # Any octets that look like they *might* be written in octal, - # and which don't look exactly the same in both octal and - # decimal are rejected as ambiguous - if octet_int > 7 and octet_str[0] == '0': - msg = "Ambiguous (octal/decimal) value in %r not permitted" - raise ValueError(msg % octet_str) - if octet_int > 255: - raise ValueError("Octet %d (> 255) not permitted" % octet_int) - return octet_int - - @classmethod - def _string_from_ip_int(cls, ip_int): - """Turns a 32-bit integer into dotted decimal notation. - - Args: - ip_int: An integer, the IP address. - - Returns: - The IP address as a string in dotted decimal notation. - - """ - return '.'.join(_compat_str(struct.unpack(b'!B', b)[0] - if isinstance(b, bytes) - else b) - for b in _compat_to_bytes(ip_int, 4, 'big')) - - def _is_hostmask(self, ip_str): - """Test if the IP string is a hostmask (rather than a netmask). - - Args: - ip_str: A string, the potential hostmask. - - Returns: - A boolean, True if the IP string is a hostmask. - - """ - bits = ip_str.split('.') - try: - parts = [x for x in map(int, bits) if x in self._valid_mask_octets] - except ValueError: - return False - if len(parts) != len(bits): - return False - if parts[0] < parts[-1]: - return True - return False - - def _reverse_pointer(self): - """Return the reverse DNS pointer name for the IPv4 address. - - This implements the method described in RFC1035 3.5. - - """ - reverse_octets = _compat_str(self).split('.')[::-1] - return '.'.join(reverse_octets) + '.in-addr.arpa' - - @property - def max_prefixlen(self): - return self._max_prefixlen - - @property - def version(self): - return self._version - - -class IPv4Address(_BaseV4, _BaseAddress): - - """Represent and manipulate single IPv4 Addresses.""" - - __slots__ = ('_ip', '__weakref__') - - def __init__(self, address): - - """ - Args: - address: A string or integer representing the IP - - Additionally, an integer can be passed, so - IPv4Address('192.0.2.1') == IPv4Address(3221225985). - or, more generally - IPv4Address(int(IPv4Address('192.0.2.1'))) == - IPv4Address('192.0.2.1') - - Raises: - AddressValueError: If ipaddress isn't a valid IPv4 address. - - """ - # Efficient constructor from integer. - if isinstance(address, _compat_int_types): - self._check_int_address(address) - self._ip = address - return - - # Constructing from a packed address - if isinstance(address, bytes): - self._check_packed_address(address, 4) - bvs = _compat_bytes_to_byte_vals(address) - self._ip = _compat_int_from_byte_vals(bvs, 'big') - return - - # Assume input argument to be string or any object representation - # which converts into a formatted IP string. - addr_str = _compat_str(address) - if '/' in addr_str: - raise AddressValueError("Unexpected '/' in %r" % address) - self._ip = self._ip_int_from_string(addr_str) - - @property - def packed(self): - """The binary representation of this address.""" - return v4_int_to_packed(self._ip) - - @property - def is_reserved(self): - """Test if the address is otherwise IETF reserved. - - Returns: - A boolean, True if the address is within the - reserved IPv4 Network range. - - """ - return self in self._constants._reserved_network - - @property - def is_private(self): - """Test if this address is allocated for private networks. - - Returns: - A boolean, True if the address is reserved per - iana-ipv4-special-registry. - - """ - return any(self in net for net in self._constants._private_networks) - - @property - def is_global(self): - return ( - self not in self._constants._public_network and - not self.is_private) - - @property - def is_multicast(self): - """Test if the address is reserved for multicast use. - - Returns: - A boolean, True if the address is multicast. - See RFC 3171 for details. - - """ - return self in self._constants._multicast_network - - @property - def is_unspecified(self): - """Test if the address is unspecified. - - Returns: - A boolean, True if this is the unspecified address as defined in - RFC 5735 3. - - """ - return self == self._constants._unspecified_address - - @property - def is_loopback(self): - """Test if the address is a loopback address. - - Returns: - A boolean, True if the address is a loopback per RFC 3330. - - """ - return self in self._constants._loopback_network - - @property - def is_link_local(self): - """Test if the address is reserved for link-local. - - Returns: - A boolean, True if the address is link-local per RFC 3927. - - """ - return self in self._constants._linklocal_network - - -class IPv4Interface(IPv4Address): - - def __init__(self, address): - if isinstance(address, (bytes, _compat_int_types)): - IPv4Address.__init__(self, address) - self.network = IPv4Network(self._ip) - self._prefixlen = self._max_prefixlen - return - - if isinstance(address, tuple): - IPv4Address.__init__(self, address[0]) - if len(address) > 1: - self._prefixlen = int(address[1]) - else: - self._prefixlen = self._max_prefixlen - - self.network = IPv4Network(address, strict=False) - self.netmask = self.network.netmask - self.hostmask = self.network.hostmask - return - - addr = _split_optional_netmask(address) - IPv4Address.__init__(self, addr[0]) - - self.network = IPv4Network(address, strict=False) - self._prefixlen = self.network._prefixlen - - self.netmask = self.network.netmask - self.hostmask = self.network.hostmask - - def __str__(self): - return '%s/%d' % (self._string_from_ip_int(self._ip), - self.network.prefixlen) - - def __eq__(self, other): - address_equal = IPv4Address.__eq__(self, other) - if not address_equal or address_equal is NotImplemented: - return address_equal - try: - return self.network == other.network - except AttributeError: - # An interface with an associated network is NOT the - # same as an unassociated address. That's why the hash - # takes the extra info into account. - return False - - def __lt__(self, other): - address_less = IPv4Address.__lt__(self, other) - if address_less is NotImplemented: - return NotImplemented - try: - return (self.network < other.network or - self.network == other.network and address_less) - except AttributeError: - # We *do* allow addresses and interfaces to be sorted. The - # unassociated address is considered less than all interfaces. - return False - - def __hash__(self): - return self._ip ^ self._prefixlen ^ int(self.network.network_address) - - __reduce__ = _IPAddressBase.__reduce__ - - @property - def ip(self): - return IPv4Address(self._ip) - - @property - def with_prefixlen(self): - return '%s/%s' % (self._string_from_ip_int(self._ip), - self._prefixlen) - - @property - def with_netmask(self): - return '%s/%s' % (self._string_from_ip_int(self._ip), - self.netmask) - - @property - def with_hostmask(self): - return '%s/%s' % (self._string_from_ip_int(self._ip), - self.hostmask) - - -class IPv4Network(_BaseV4, _BaseNetwork): - - """This class represents and manipulates 32-bit IPv4 network + addresses.. - - Attributes: [examples for IPv4Network('192.0.2.0/27')] - .network_address: IPv4Address('192.0.2.0') - .hostmask: IPv4Address('0.0.0.31') - .broadcast_address: IPv4Address('192.0.2.32') - .netmask: IPv4Address('255.255.255.224') - .prefixlen: 27 - - """ - # Class to use when creating address objects - _address_class = IPv4Address - - def __init__(self, address, strict=True): - - """Instantiate a new IPv4 network object. - - Args: - address: A string or integer representing the IP [& network]. - '192.0.2.0/24' - '192.0.2.0/255.255.255.0' - '192.0.0.2/0.0.0.255' - are all functionally the same in IPv4. Similarly, - '192.0.2.1' - '192.0.2.1/255.255.255.255' - '192.0.2.1/32' - are also functionally equivalent. That is to say, failing to - provide a subnetmask will create an object with a mask of /32. - - If the mask (portion after the / in the argument) is given in - dotted quad form, it is treated as a netmask if it starts with a - non-zero field (e.g. /255.0.0.0 == /8) and as a hostmask if it - starts with a zero field (e.g. 0.255.255.255 == /8), with the - single exception of an all-zero mask which is treated as a - netmask == /0. If no mask is given, a default of /32 is used. - - Additionally, an integer can be passed, so - IPv4Network('192.0.2.1') == IPv4Network(3221225985) - or, more generally - IPv4Interface(int(IPv4Interface('192.0.2.1'))) == - IPv4Interface('192.0.2.1') - - Raises: - AddressValueError: If ipaddress isn't a valid IPv4 address. - NetmaskValueError: If the netmask isn't valid for - an IPv4 address. - ValueError: If strict is True and a network address is not - supplied. - - """ - _BaseNetwork.__init__(self, address) - - # Constructing from a packed address or integer - if isinstance(address, (_compat_int_types, bytes)): - self.network_address = IPv4Address(address) - self.netmask, self._prefixlen = self._make_netmask( - self._max_prefixlen) - # fixme: address/network test here. - return - - if isinstance(address, tuple): - if len(address) > 1: - arg = address[1] - else: - # We weren't given an address[1] - arg = self._max_prefixlen - self.network_address = IPv4Address(address[0]) - self.netmask, self._prefixlen = self._make_netmask(arg) - packed = int(self.network_address) - if packed & int(self.netmask) != packed: - if strict: - raise ValueError('%s has host bits set' % self) - else: - self.network_address = IPv4Address(packed & - int(self.netmask)) - return - - # Assume input argument to be string or any object representation - # which converts into a formatted IP prefix string. - addr = _split_optional_netmask(address) - self.network_address = IPv4Address(self._ip_int_from_string(addr[0])) - - if len(addr) == 2: - arg = addr[1] - else: - arg = self._max_prefixlen - self.netmask, self._prefixlen = self._make_netmask(arg) - - if strict: - if (IPv4Address(int(self.network_address) & int(self.netmask)) != - self.network_address): - raise ValueError('%s has host bits set' % self) - self.network_address = IPv4Address(int(self.network_address) & - int(self.netmask)) - - if self._prefixlen == (self._max_prefixlen - 1): - self.hosts = self.__iter__ - - @property - def is_global(self): - """Test if this address is allocated for public networks. - - Returns: - A boolean, True if the address is not reserved per - iana-ipv4-special-registry. - - """ - return (not (self.network_address in IPv4Network('100.64.0.0/10') and - self.broadcast_address in IPv4Network('100.64.0.0/10')) and - not self.is_private) - - -class _IPv4Constants(object): - - _linklocal_network = IPv4Network('169.254.0.0/16') - - _loopback_network = IPv4Network('127.0.0.0/8') - - _multicast_network = IPv4Network('224.0.0.0/4') - - _public_network = IPv4Network('100.64.0.0/10') - - _private_networks = [ - IPv4Network('0.0.0.0/8'), - IPv4Network('10.0.0.0/8'), - IPv4Network('127.0.0.0/8'), - IPv4Network('169.254.0.0/16'), - IPv4Network('172.16.0.0/12'), - IPv4Network('192.0.0.0/29'), - IPv4Network('192.0.0.170/31'), - IPv4Network('192.0.2.0/24'), - IPv4Network('192.168.0.0/16'), - IPv4Network('198.18.0.0/15'), - IPv4Network('198.51.100.0/24'), - IPv4Network('203.0.113.0/24'), - IPv4Network('240.0.0.0/4'), - IPv4Network('255.255.255.255/32'), - ] - - _reserved_network = IPv4Network('240.0.0.0/4') - - _unspecified_address = IPv4Address('0.0.0.0') - - -IPv4Address._constants = _IPv4Constants - - -class _BaseV6(object): - - """Base IPv6 object. - - The following methods are used by IPv6 objects in both single IP - addresses and networks. - - """ - - __slots__ = () - _version = 6 - _ALL_ONES = (2 ** IPV6LENGTH) - 1 - _HEXTET_COUNT = 8 - _HEX_DIGITS = frozenset('0123456789ABCDEFabcdef') - _max_prefixlen = IPV6LENGTH - - # There are only a bunch of valid v6 netmasks, so we cache them all - # when constructed (see _make_netmask()). - _netmask_cache = {} - - @classmethod - def _make_netmask(cls, arg): - """Make a (netmask, prefix_len) tuple from the given argument. - - Argument can be: - - an integer (the prefix length) - - a string representing the prefix length (e.g. "24") - - a string representing the prefix netmask (e.g. "255.255.255.0") - """ - if arg not in cls._netmask_cache: - if isinstance(arg, _compat_int_types): - prefixlen = arg - else: - prefixlen = cls._prefix_from_prefix_string(arg) - netmask = IPv6Address(cls._ip_int_from_prefix(prefixlen)) - cls._netmask_cache[arg] = netmask, prefixlen - return cls._netmask_cache[arg] - - @classmethod - def _ip_int_from_string(cls, ip_str): - """Turn an IPv6 ip_str into an integer. - - Args: - ip_str: A string, the IPv6 ip_str. - - Returns: - An int, the IPv6 address - - Raises: - AddressValueError: if ip_str isn't a valid IPv6 Address. - - """ - if not ip_str: - raise AddressValueError('Address cannot be empty') - - parts = ip_str.split(':') - - # An IPv6 address needs at least 2 colons (3 parts). - _min_parts = 3 - if len(parts) < _min_parts: - msg = "At least %d parts expected in %r" % (_min_parts, ip_str) - raise AddressValueError(msg) - - # If the address has an IPv4-style suffix, convert it to hexadecimal. - if '.' in parts[-1]: - try: - ipv4_int = IPv4Address(parts.pop())._ip - except AddressValueError as exc: - raise AddressValueError("%s in %r" % (exc, ip_str)) - parts.append('%x' % ((ipv4_int >> 16) & 0xFFFF)) - parts.append('%x' % (ipv4_int & 0xFFFF)) - - # An IPv6 address can't have more than 8 colons (9 parts). - # The extra colon comes from using the "::" notation for a single - # leading or trailing zero part. - _max_parts = cls._HEXTET_COUNT + 1 - if len(parts) > _max_parts: - msg = "At most %d colons permitted in %r" % ( - _max_parts - 1, ip_str) - raise AddressValueError(msg) - - # Disregarding the endpoints, find '::' with nothing in between. - # This indicates that a run of zeroes has been skipped. - skip_index = None - for i in _compat_range(1, len(parts) - 1): - if not parts[i]: - if skip_index is not None: - # Can't have more than one '::' - msg = "At most one '::' permitted in %r" % ip_str - raise AddressValueError(msg) - skip_index = i - - # parts_hi is the number of parts to copy from above/before the '::' - # parts_lo is the number of parts to copy from below/after the '::' - if skip_index is not None: - # If we found a '::', then check if it also covers the endpoints. - parts_hi = skip_index - parts_lo = len(parts) - skip_index - 1 - if not parts[0]: - parts_hi -= 1 - if parts_hi: - msg = "Leading ':' only permitted as part of '::' in %r" - raise AddressValueError(msg % ip_str) # ^: requires ^:: - if not parts[-1]: - parts_lo -= 1 - if parts_lo: - msg = "Trailing ':' only permitted as part of '::' in %r" - raise AddressValueError(msg % ip_str) # :$ requires ::$ - parts_skipped = cls._HEXTET_COUNT - (parts_hi + parts_lo) - if parts_skipped < 1: - msg = "Expected at most %d other parts with '::' in %r" - raise AddressValueError(msg % (cls._HEXTET_COUNT - 1, ip_str)) - else: - # Otherwise, allocate the entire address to parts_hi. The - # endpoints could still be empty, but _parse_hextet() will check - # for that. - if len(parts) != cls._HEXTET_COUNT: - msg = "Exactly %d parts expected without '::' in %r" - raise AddressValueError(msg % (cls._HEXTET_COUNT, ip_str)) - if not parts[0]: - msg = "Leading ':' only permitted as part of '::' in %r" - raise AddressValueError(msg % ip_str) # ^: requires ^:: - if not parts[-1]: - msg = "Trailing ':' only permitted as part of '::' in %r" - raise AddressValueError(msg % ip_str) # :$ requires ::$ - parts_hi = len(parts) - parts_lo = 0 - parts_skipped = 0 - - try: - # Now, parse the hextets into a 128-bit integer. - ip_int = 0 - for i in range(parts_hi): - ip_int <<= 16 - ip_int |= cls._parse_hextet(parts[i]) - ip_int <<= 16 * parts_skipped - for i in range(-parts_lo, 0): - ip_int <<= 16 - ip_int |= cls._parse_hextet(parts[i]) - return ip_int - except ValueError as exc: - raise AddressValueError("%s in %r" % (exc, ip_str)) - - @classmethod - def _parse_hextet(cls, hextet_str): - """Convert an IPv6 hextet string into an integer. - - Args: - hextet_str: A string, the number to parse. - - Returns: - The hextet as an integer. - - Raises: - ValueError: if the input isn't strictly a hex number from - [0..FFFF]. - - """ - # Whitelist the characters, since int() allows a lot of bizarre stuff. - if not cls._HEX_DIGITS.issuperset(hextet_str): - raise ValueError("Only hex digits permitted in %r" % hextet_str) - # We do the length check second, since the invalid character error - # is likely to be more informative for the user - if len(hextet_str) > 4: - msg = "At most 4 characters permitted in %r" - raise ValueError(msg % hextet_str) - # Length check means we can skip checking the integer value - return int(hextet_str, 16) - - @classmethod - def _compress_hextets(cls, hextets): - """Compresses a list of hextets. - - Compresses a list of strings, replacing the longest continuous - sequence of "0" in the list with "" and adding empty strings at - the beginning or at the end of the string such that subsequently - calling ":".join(hextets) will produce the compressed version of - the IPv6 address. - - Args: - hextets: A list of strings, the hextets to compress. - - Returns: - A list of strings. - - """ - best_doublecolon_start = -1 - best_doublecolon_len = 0 - doublecolon_start = -1 - doublecolon_len = 0 - for index, hextet in enumerate(hextets): - if hextet == '0': - doublecolon_len += 1 - if doublecolon_start == -1: - # Start of a sequence of zeros. - doublecolon_start = index - if doublecolon_len > best_doublecolon_len: - # This is the longest sequence of zeros so far. - best_doublecolon_len = doublecolon_len - best_doublecolon_start = doublecolon_start - else: - doublecolon_len = 0 - doublecolon_start = -1 - - if best_doublecolon_len > 1: - best_doublecolon_end = (best_doublecolon_start + - best_doublecolon_len) - # For zeros at the end of the address. - if best_doublecolon_end == len(hextets): - hextets += [''] - hextets[best_doublecolon_start:best_doublecolon_end] = [''] - # For zeros at the beginning of the address. - if best_doublecolon_start == 0: - hextets = [''] + hextets - - return hextets - - @classmethod - def _string_from_ip_int(cls, ip_int=None): - """Turns a 128-bit integer into hexadecimal notation. - - Args: - ip_int: An integer, the IP address. - - Returns: - A string, the hexadecimal representation of the address. - - Raises: - ValueError: The address is bigger than 128 bits of all ones. - - """ - if ip_int is None: - ip_int = int(cls._ip) - - if ip_int > cls._ALL_ONES: - raise ValueError('IPv6 address is too large') - - hex_str = '%032x' % ip_int - hextets = ['%x' % int(hex_str[x:x + 4], 16) for x in range(0, 32, 4)] - - hextets = cls._compress_hextets(hextets) - return ':'.join(hextets) - - def _explode_shorthand_ip_string(self): - """Expand a shortened IPv6 address. - - Args: - ip_str: A string, the IPv6 address. - - Returns: - A string, the expanded IPv6 address. - - """ - if isinstance(self, IPv6Network): - ip_str = _compat_str(self.network_address) - elif isinstance(self, IPv6Interface): - ip_str = _compat_str(self.ip) - else: - ip_str = _compat_str(self) - - ip_int = self._ip_int_from_string(ip_str) - hex_str = '%032x' % ip_int - parts = [hex_str[x:x + 4] for x in range(0, 32, 4)] - if isinstance(self, (_BaseNetwork, IPv6Interface)): - return '%s/%d' % (':'.join(parts), self._prefixlen) - return ':'.join(parts) - - def _reverse_pointer(self): - """Return the reverse DNS pointer name for the IPv6 address. - - This implements the method described in RFC3596 2.5. - - """ - reverse_chars = self.exploded[::-1].replace(':', '') - return '.'.join(reverse_chars) + '.ip6.arpa' - - @property - def max_prefixlen(self): - return self._max_prefixlen - - @property - def version(self): - return self._version - - -class IPv6Address(_BaseV6, _BaseAddress): - - """Represent and manipulate single IPv6 Addresses.""" - - __slots__ = ('_ip', '__weakref__') - - def __init__(self, address): - """Instantiate a new IPv6 address object. - - Args: - address: A string or integer representing the IP - - Additionally, an integer can be passed, so - IPv6Address('2001:db8::') == - IPv6Address(42540766411282592856903984951653826560) - or, more generally - IPv6Address(int(IPv6Address('2001:db8::'))) == - IPv6Address('2001:db8::') - - Raises: - AddressValueError: If address isn't a valid IPv6 address. - - """ - # Efficient constructor from integer. - if isinstance(address, _compat_int_types): - self._check_int_address(address) - self._ip = address - return - - # Constructing from a packed address - if isinstance(address, bytes): - self._check_packed_address(address, 16) - bvs = _compat_bytes_to_byte_vals(address) - self._ip = _compat_int_from_byte_vals(bvs, 'big') - return - - # Assume input argument to be string or any object representation - # which converts into a formatted IP string. - addr_str = _compat_str(address) - if '/' in addr_str: - raise AddressValueError("Unexpected '/' in %r" % address) - self._ip = self._ip_int_from_string(addr_str) - - @property - def packed(self): - """The binary representation of this address.""" - return v6_int_to_packed(self._ip) - - @property - def is_multicast(self): - """Test if the address is reserved for multicast use. - - Returns: - A boolean, True if the address is a multicast address. - See RFC 2373 2.7 for details. - - """ - return self in self._constants._multicast_network - - @property - def is_reserved(self): - """Test if the address is otherwise IETF reserved. - - Returns: - A boolean, True if the address is within one of the - reserved IPv6 Network ranges. - - """ - return any(self in x for x in self._constants._reserved_networks) - - @property - def is_link_local(self): - """Test if the address is reserved for link-local. - - Returns: - A boolean, True if the address is reserved per RFC 4291. - - """ - return self in self._constants._linklocal_network - - @property - def is_site_local(self): - """Test if the address is reserved for site-local. - - Note that the site-local address space has been deprecated by RFC 3879. - Use is_private to test if this address is in the space of unique local - addresses as defined by RFC 4193. - - Returns: - A boolean, True if the address is reserved per RFC 3513 2.5.6. - - """ - return self in self._constants._sitelocal_network - - @property - def is_private(self): - """Test if this address is allocated for private networks. - - Returns: - A boolean, True if the address is reserved per - iana-ipv6-special-registry. - - """ - return any(self in net for net in self._constants._private_networks) - - @property - def is_global(self): - """Test if this address is allocated for public networks. - - Returns: - A boolean, true if the address is not reserved per - iana-ipv6-special-registry. - - """ - return not self.is_private - - @property - def is_unspecified(self): - """Test if the address is unspecified. - - Returns: - A boolean, True if this is the unspecified address as defined in - RFC 2373 2.5.2. - - """ - return self._ip == 0 - - @property - def is_loopback(self): - """Test if the address is a loopback address. - - Returns: - A boolean, True if the address is a loopback address as defined in - RFC 2373 2.5.3. - - """ - return self._ip == 1 - - @property - def ipv4_mapped(self): - """Return the IPv4 mapped address. - - Returns: - If the IPv6 address is a v4 mapped address, return the - IPv4 mapped address. Return None otherwise. - - """ - if (self._ip >> 32) != 0xFFFF: - return None - return IPv4Address(self._ip & 0xFFFFFFFF) - - @property - def teredo(self): - """Tuple of embedded teredo IPs. - - Returns: - Tuple of the (server, client) IPs or None if the address - doesn't appear to be a teredo address (doesn't start with - 2001::/32) - - """ - if (self._ip >> 96) != 0x20010000: - return None - return (IPv4Address((self._ip >> 64) & 0xFFFFFFFF), - IPv4Address(~self._ip & 0xFFFFFFFF)) - - @property - def sixtofour(self): - """Return the IPv4 6to4 embedded address. - - Returns: - The IPv4 6to4-embedded address if present or None if the - address doesn't appear to contain a 6to4 embedded address. - - """ - if (self._ip >> 112) != 0x2002: - return None - return IPv4Address((self._ip >> 80) & 0xFFFFFFFF) - - -class IPv6Interface(IPv6Address): - - def __init__(self, address): - if isinstance(address, (bytes, _compat_int_types)): - IPv6Address.__init__(self, address) - self.network = IPv6Network(self._ip) - self._prefixlen = self._max_prefixlen - return - if isinstance(address, tuple): - IPv6Address.__init__(self, address[0]) - if len(address) > 1: - self._prefixlen = int(address[1]) - else: - self._prefixlen = self._max_prefixlen - self.network = IPv6Network(address, strict=False) - self.netmask = self.network.netmask - self.hostmask = self.network.hostmask - return - - addr = _split_optional_netmask(address) - IPv6Address.__init__(self, addr[0]) - self.network = IPv6Network(address, strict=False) - self.netmask = self.network.netmask - self._prefixlen = self.network._prefixlen - self.hostmask = self.network.hostmask - - def __str__(self): - return '%s/%d' % (self._string_from_ip_int(self._ip), - self.network.prefixlen) - - def __eq__(self, other): - address_equal = IPv6Address.__eq__(self, other) - if not address_equal or address_equal is NotImplemented: - return address_equal - try: - return self.network == other.network - except AttributeError: - # An interface with an associated network is NOT the - # same as an unassociated address. That's why the hash - # takes the extra info into account. - return False - - def __lt__(self, other): - address_less = IPv6Address.__lt__(self, other) - if address_less is NotImplemented: - return NotImplemented - try: - return (self.network < other.network or - self.network == other.network and address_less) - except AttributeError: - # We *do* allow addresses and interfaces to be sorted. The - # unassociated address is considered less than all interfaces. - return False - - def __hash__(self): - return self._ip ^ self._prefixlen ^ int(self.network.network_address) - - __reduce__ = _IPAddressBase.__reduce__ - - @property - def ip(self): - return IPv6Address(self._ip) - - @property - def with_prefixlen(self): - return '%s/%s' % (self._string_from_ip_int(self._ip), - self._prefixlen) - - @property - def with_netmask(self): - return '%s/%s' % (self._string_from_ip_int(self._ip), - self.netmask) - - @property - def with_hostmask(self): - return '%s/%s' % (self._string_from_ip_int(self._ip), - self.hostmask) - - @property - def is_unspecified(self): - return self._ip == 0 and self.network.is_unspecified - - @property - def is_loopback(self): - return self._ip == 1 and self.network.is_loopback - - -class IPv6Network(_BaseV6, _BaseNetwork): - - """This class represents and manipulates 128-bit IPv6 networks. - - Attributes: [examples for IPv6('2001:db8::1000/124')] - .network_address: IPv6Address('2001:db8::1000') - .hostmask: IPv6Address('::f') - .broadcast_address: IPv6Address('2001:db8::100f') - .netmask: IPv6Address('ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff0') - .prefixlen: 124 - - """ - - # Class to use when creating address objects - _address_class = IPv6Address - - def __init__(self, address, strict=True): - """Instantiate a new IPv6 Network object. - - Args: - address: A string or integer representing the IPv6 network or the - IP and prefix/netmask. - '2001:db8::/128' - '2001:db8:0000:0000:0000:0000:0000:0000/128' - '2001:db8::' - are all functionally the same in IPv6. That is to say, - failing to provide a subnetmask will create an object with - a mask of /128. - - Additionally, an integer can be passed, so - IPv6Network('2001:db8::') == - IPv6Network(42540766411282592856903984951653826560) - or, more generally - IPv6Network(int(IPv6Network('2001:db8::'))) == - IPv6Network('2001:db8::') - - strict: A boolean. If true, ensure that we have been passed - A true network address, eg, 2001:db8::1000/124 and not an - IP address on a network, eg, 2001:db8::1/124. - - Raises: - AddressValueError: If address isn't a valid IPv6 address. - NetmaskValueError: If the netmask isn't valid for - an IPv6 address. - ValueError: If strict was True and a network address was not - supplied. - - """ - _BaseNetwork.__init__(self, address) - - # Efficient constructor from integer or packed address - if isinstance(address, (bytes, _compat_int_types)): - self.network_address = IPv6Address(address) - self.netmask, self._prefixlen = self._make_netmask( - self._max_prefixlen) - return - - if isinstance(address, tuple): - if len(address) > 1: - arg = address[1] - else: - arg = self._max_prefixlen - self.netmask, self._prefixlen = self._make_netmask(arg) - self.network_address = IPv6Address(address[0]) - packed = int(self.network_address) - if packed & int(self.netmask) != packed: - if strict: - raise ValueError('%s has host bits set' % self) - else: - self.network_address = IPv6Address(packed & - int(self.netmask)) - return - - # Assume input argument to be string or any object representation - # which converts into a formatted IP prefix string. - addr = _split_optional_netmask(address) - - self.network_address = IPv6Address(self._ip_int_from_string(addr[0])) - - if len(addr) == 2: - arg = addr[1] - else: - arg = self._max_prefixlen - self.netmask, self._prefixlen = self._make_netmask(arg) - - if strict: - if (IPv6Address(int(self.network_address) & int(self.netmask)) != - self.network_address): - raise ValueError('%s has host bits set' % self) - self.network_address = IPv6Address(int(self.network_address) & - int(self.netmask)) - - if self._prefixlen == (self._max_prefixlen - 1): - self.hosts = self.__iter__ - - def hosts(self): - """Generate Iterator over usable hosts in a network. - - This is like __iter__ except it doesn't return the - Subnet-Router anycast address. - - """ - network = int(self.network_address) - broadcast = int(self.broadcast_address) - for x in _compat_range(network + 1, broadcast + 1): - yield self._address_class(x) - - @property - def is_site_local(self): - """Test if the address is reserved for site-local. - - Note that the site-local address space has been deprecated by RFC 3879. - Use is_private to test if this address is in the space of unique local - addresses as defined by RFC 4193. - - Returns: - A boolean, True if the address is reserved per RFC 3513 2.5.6. - - """ - return (self.network_address.is_site_local and - self.broadcast_address.is_site_local) - - -class _IPv6Constants(object): - - _linklocal_network = IPv6Network('fe80::/10') - - _multicast_network = IPv6Network('ff00::/8') - - _private_networks = [ - IPv6Network('::1/128'), - IPv6Network('::/128'), - IPv6Network('::ffff:0:0/96'), - IPv6Network('100::/64'), - IPv6Network('2001::/23'), - IPv6Network('2001:2::/48'), - IPv6Network('2001:db8::/32'), - IPv6Network('2001:10::/28'), - IPv6Network('fc00::/7'), - IPv6Network('fe80::/10'), - ] - - _reserved_networks = [ - IPv6Network('::/8'), IPv6Network('100::/8'), - IPv6Network('200::/7'), IPv6Network('400::/6'), - IPv6Network('800::/5'), IPv6Network('1000::/4'), - IPv6Network('4000::/3'), IPv6Network('6000::/3'), - IPv6Network('8000::/3'), IPv6Network('A000::/3'), - IPv6Network('C000::/3'), IPv6Network('E000::/4'), - IPv6Network('F000::/5'), IPv6Network('F800::/6'), - IPv6Network('FE00::/9'), - ] - - _sitelocal_network = IPv6Network('fec0::/10') - - -IPv6Address._constants = _IPv6Constants diff --git a/env/lib/python3.7/site-packages/pip/_vendor/lockfile/__init__.py b/env/lib/python3.7/site-packages/pip/_vendor/lockfile/__init__.py deleted file mode 100644 index a6f44a5..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/lockfile/__init__.py +++ /dev/null @@ -1,347 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -lockfile.py - Platform-independent advisory file locks. - -Requires Python 2.5 unless you apply 2.4.diff -Locking is done on a per-thread basis instead of a per-process basis. - -Usage: - ->>> lock = LockFile('somefile') ->>> try: -... lock.acquire() -... except AlreadyLocked: -... print 'somefile', 'is locked already.' -... except LockFailed: -... print 'somefile', 'can\\'t be locked.' -... else: -... print 'got lock' -got lock ->>> print lock.is_locked() -True ->>> lock.release() - ->>> lock = LockFile('somefile') ->>> print lock.is_locked() -False ->>> with lock: -... print lock.is_locked() -True ->>> print lock.is_locked() -False - ->>> lock = LockFile('somefile') ->>> # It is okay to lock twice from the same thread... ->>> with lock: -... lock.acquire() -... ->>> # Though no counter is kept, so you can't unlock multiple times... ->>> print lock.is_locked() -False - -Exceptions: - - Error - base class for other exceptions - LockError - base class for all locking exceptions - AlreadyLocked - Another thread or process already holds the lock - LockFailed - Lock failed for some other reason - UnlockError - base class for all unlocking exceptions - AlreadyUnlocked - File was not locked. - NotMyLock - File was locked but not by the current thread/process -""" - -from __future__ import absolute_import - -import functools -import os -import socket -import threading -import warnings - -# Work with PEP8 and non-PEP8 versions of threading module. -if not hasattr(threading, "current_thread"): - threading.current_thread = threading.currentThread -if not hasattr(threading.Thread, "get_name"): - threading.Thread.get_name = threading.Thread.getName - -__all__ = ['Error', 'LockError', 'LockTimeout', 'AlreadyLocked', - 'LockFailed', 'UnlockError', 'NotLocked', 'NotMyLock', - 'LinkFileLock', 'MkdirFileLock', 'SQLiteFileLock', - 'LockBase', 'locked'] - - -class Error(Exception): - """ - Base class for other exceptions. - - >>> try: - ... raise Error - ... except Exception: - ... pass - """ - pass - - -class LockError(Error): - """ - Base class for error arising from attempts to acquire the lock. - - >>> try: - ... raise LockError - ... except Error: - ... pass - """ - pass - - -class LockTimeout(LockError): - """Raised when lock creation fails within a user-defined period of time. - - >>> try: - ... raise LockTimeout - ... except LockError: - ... pass - """ - pass - - -class AlreadyLocked(LockError): - """Some other thread/process is locking the file. - - >>> try: - ... raise AlreadyLocked - ... except LockError: - ... pass - """ - pass - - -class LockFailed(LockError): - """Lock file creation failed for some other reason. - - >>> try: - ... raise LockFailed - ... except LockError: - ... pass - """ - pass - - -class UnlockError(Error): - """ - Base class for errors arising from attempts to release the lock. - - >>> try: - ... raise UnlockError - ... except Error: - ... pass - """ - pass - - -class NotLocked(UnlockError): - """Raised when an attempt is made to unlock an unlocked file. - - >>> try: - ... raise NotLocked - ... except UnlockError: - ... pass - """ - pass - - -class NotMyLock(UnlockError): - """Raised when an attempt is made to unlock a file someone else locked. - - >>> try: - ... raise NotMyLock - ... except UnlockError: - ... pass - """ - pass - - -class _SharedBase(object): - def __init__(self, path): - self.path = path - - def acquire(self, timeout=None): - """ - Acquire the lock. - - * If timeout is omitted (or None), wait forever trying to lock the - file. - - * If timeout > 0, try to acquire the lock for that many seconds. If - the lock period expires and the file is still locked, raise - LockTimeout. - - * If timeout <= 0, raise AlreadyLocked immediately if the file is - already locked. - """ - raise NotImplemented("implement in subclass") - - def release(self): - """ - Release the lock. - - If the file is not locked, raise NotLocked. - """ - raise NotImplemented("implement in subclass") - - def __enter__(self): - """ - Context manager support. - """ - self.acquire() - return self - - def __exit__(self, *_exc): - """ - Context manager support. - """ - self.release() - - def __repr__(self): - return "<%s: %r>" % (self.__class__.__name__, self.path) - - -class LockBase(_SharedBase): - """Base class for platform-specific lock classes.""" - def __init__(self, path, threaded=True, timeout=None): - """ - >>> lock = LockBase('somefile') - >>> lock = LockBase('somefile', threaded=False) - """ - super(LockBase, self).__init__(path) - self.lock_file = os.path.abspath(path) + ".lock" - self.hostname = socket.gethostname() - self.pid = os.getpid() - if threaded: - t = threading.current_thread() - # Thread objects in Python 2.4 and earlier do not have ident - # attrs. Worm around that. - ident = getattr(t, "ident", hash(t)) - self.tname = "-%x" % (ident & 0xffffffff) - else: - self.tname = "" - dirname = os.path.dirname(self.lock_file) - - # unique name is mostly about the current process, but must - # also contain the path -- otherwise, two adjacent locked - # files conflict (one file gets locked, creating lock-file and - # unique file, the other one gets locked, creating lock-file - # and overwriting the already existing lock-file, then one - # gets unlocked, deleting both lock-file and unique file, - # finally the last lock errors out upon releasing. - self.unique_name = os.path.join(dirname, - "%s%s.%s%s" % (self.hostname, - self.tname, - self.pid, - hash(self.path))) - self.timeout = timeout - - def is_locked(self): - """ - Tell whether or not the file is locked. - """ - raise NotImplemented("implement in subclass") - - def i_am_locking(self): - """ - Return True if this object is locking the file. - """ - raise NotImplemented("implement in subclass") - - def break_lock(self): - """ - Remove a lock. Useful if a locking thread failed to unlock. - """ - raise NotImplemented("implement in subclass") - - def __repr__(self): - return "<%s: %r -- %r>" % (self.__class__.__name__, self.unique_name, - self.path) - - -def _fl_helper(cls, mod, *args, **kwds): - warnings.warn("Import from %s module instead of lockfile package" % mod, - DeprecationWarning, stacklevel=2) - # This is a bit funky, but it's only for awhile. The way the unit tests - # are constructed this function winds up as an unbound method, so it - # actually takes three args, not two. We want to toss out self. - if not isinstance(args[0], str): - # We are testing, avoid the first arg - args = args[1:] - if len(args) == 1 and not kwds: - kwds["threaded"] = True - return cls(*args, **kwds) - - -def LinkFileLock(*args, **kwds): - """Factory function provided for backwards compatibility. - - Do not use in new code. Instead, import LinkLockFile from the - lockfile.linklockfile module. - """ - from . import linklockfile - return _fl_helper(linklockfile.LinkLockFile, "lockfile.linklockfile", - *args, **kwds) - - -def MkdirFileLock(*args, **kwds): - """Factory function provided for backwards compatibility. - - Do not use in new code. Instead, import MkdirLockFile from the - lockfile.mkdirlockfile module. - """ - from . import mkdirlockfile - return _fl_helper(mkdirlockfile.MkdirLockFile, "lockfile.mkdirlockfile", - *args, **kwds) - - -def SQLiteFileLock(*args, **kwds): - """Factory function provided for backwards compatibility. - - Do not use in new code. Instead, import SQLiteLockFile from the - lockfile.mkdirlockfile module. - """ - from . import sqlitelockfile - return _fl_helper(sqlitelockfile.SQLiteLockFile, "lockfile.sqlitelockfile", - *args, **kwds) - - -def locked(path, timeout=None): - """Decorator which enables locks for decorated function. - - Arguments: - - path: path for lockfile. - - timeout (optional): Timeout for acquiring lock. - - Usage: - @locked('/var/run/myname', timeout=0) - def myname(...): - ... - """ - def decor(func): - @functools.wraps(func) - def wrapper(*args, **kwargs): - lock = FileLock(path, timeout=timeout) - lock.acquire() - try: - return func(*args, **kwargs) - finally: - lock.release() - return wrapper - return decor - - -if hasattr(os, "link"): - from . import linklockfile as _llf - LockFile = _llf.LinkLockFile -else: - from . import mkdirlockfile as _mlf - LockFile = _mlf.MkdirLockFile - -FileLock = LockFile diff --git a/env/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index abbfa854a831f9c3e01792c5c0834ac050edc086..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9864 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%0ACxX$CpIY$%(lO@fqoVd4|!9FbN@UXw;49N?o` zv@coIjXF=v=Crn}@DCwUeUI3L0(Tm;ime-Z!x*2>P;6hp8~<&v-sXLtWb>|w>eYGQ zqX_z}LZvbM@=coPGbH#Xb3R+Po|Us|tMGUq(9D@-a>mX?I^spMbMk^gTse;VoJM40 zV`}tFeji8GcgjJV3k|>ky^^aCRto@;#1eVgExu@@o6Oz_#xU+K745J3Ate_m`2$Mc zrsOJ;v<82M9h>?5rg@WHv&`$MW*PQ=Ho$O-2&2nTTz2ACv|e7W@?9oh<tcJ>6)}Y( zcURFSC<<;X3X!DM%pPZlJ@ea0;IfiZBt{h-az!*xv|eht0ivuQqA=yVX5tj4xMR5k z)ND}mA5b!p82rWiVqeLuqjmDM;_FB(qiG;~ko}nryqkJfQYHVYiN87i%ie2?m+b|6 Qj{X{_(Ned;R8`~u07mPN<NyEw diff --git a/env/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/linklockfile.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/linklockfile.cpython-37.pyc deleted file mode 100644 index 5ffeff996db43c7882ca1b669fb5a4e6fb89259c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2245 zcma)7-H#MS5bvJvo!eUu*dQNj#uE-U0ZxsP#K?iCLP&5iITK)_napkX!racsUU#o> zo8?9L19<R76O-NeWa5)={ww{eFZar$PgeEp!5uk`lXP`;S5;Sa)vs&T7Z*bUU-`?) zZ@&TVPh9MM4lvhY$ghAf!e~wk8dHkAm0Pi8W;?c-&79mR+}JI=*em?lFM>EI8gZit z<B*b@gt^RnMwrLlr*^!+tPRrfci~jhq54R=DXV;>c#;*vN~rEGMS-V-+f{F{o=UDm z<Zh%{&Y5m>D}~EB`{fQU^a9eavw~M6r58WV1y7lgaMnXVd!G%=br|wvAe_XM5x571 zJ1pWYp3&H;V~t(rv)~ztJ=S0$%syLSO_&1{eM>iQXXU`e1!0YUMlMQwJuYRWswj>6 zupNzLRz8SQRTWt;8j5Pjh1!X#ew2gpg%3KH!!UwxZEY>e@qnw*{!=fUmsP>>p!1#o zsdq6_5Ap7tUA>X!lGk?Ko(0#%4{I90_zZ?zhD7hQ6`7DN%IH&TYRw2GcS*VI5M>WS z@ezeJCCXtI>YN}?>G$+LDXn{C0+|~$#OD)QIv{hOP~}a%8F^yOC0j7t14nF4VCM?# zKmHwj`O^STg3*{+#@7$vD;$K+sc6r=`O^i|nbEE06MF(x8Cc>sMmF|*zNkG-EI9oI zoVZwPQ<S5}zf_C4uy>@6w`{2;=Dk{j_0c*;@EHQ<pCQlbu*rfMVEaDV&hG)jH(<VN z=1!xltw)>V<9!1_tZoldtax-z3WVw|CU?9tM_=?P%@kH0QPA5SWrEkW?N<UU#_e-5 z%4C$*5H%vscJUQH_~}Rd{<zjTrX7GvsTW3NwmsrWnHF5Ty}W|A;NQCQg%FhxE|_Rv z%`xvFqpeD62eG9ah^GXxqy0M@#zH$%rAh}<C8g2vMrIZW2<;40fKCHhSLU1#I}RA| zyf2R7UcgJ17$2T7lD`rWf#C1;RaFdEhuQE_R>Jvteu-`Gl#k!<Kg3NllJCH{5~~;z zMzo6F_ZF9jJKCQo>L?s2-vdIZMccGR+tx7}&?OpJ@WIZK)uMsz*lpT`eaC8A4h`v9 zd)(gtZZ6M{>tS{9!x>+`K|OY}37L`^ktY@49*|+pk@BXpx2&nb^Nh+5m1l52mnwVe zgRYAxnezrQh?S1r9WT{|Eh{xI>iA5(gE!^uVzfC@5lT0AqJnoCx{=AGmI)7H5@(RK zfoP9E&ZLs!2=4euP9r%1q(jA9$VV^9JHTmQ@SH=dyaEf^1VT*ST9CsgeJwk4)x)#X z0#gOAZ;CJ8o>90P?RFd!R~_M5(D;u~#JeEB21A;jL&ql$l;-7~4|jh74C~@lD~duf zYzV`dQCv;&Q3Jo_F*?9sh}9K%)sAm`z8<1U-bs*)Q>b)!-kMpG7N!dDWY<AYVkt0r zEjm7RF!FtxhX?;QSnkiAIIW056XX&9nsqMS*8|0}ngahzjNvA<n}G@PCa6m6;RNG* z<3N0`w6J0g9VDi2B#91_q^Q^^=fF3UWP6n6*im5RCkd;1Ng|dphI2@;d}0O3c_h(6 zf?yNatZ*2h1+HU-D?t$0fomk4COYho)JT8}fhZ8ikr-$bf#I9xRioa(8#|EcJ?4bN Woa*3{`VMROm?auCtpFNB<op9q^%TDV diff --git a/env/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/mkdirlockfile.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/mkdirlockfile.cpython-37.pyc deleted file mode 100644 index 0ce2eca220b9efe765c8d7ae3627d34f03c6b61f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2607 zcmb7FOK%%D5GMDf)#_ozaUADySOj%awTa!PMSE%7yo(fx8o&mU3J4Z!aTTw$51FJA zTaYhxenD@|NkUKk2?cuYFUX0f0zKv0V^5voN=a<^QZ6_g?r?Wr-wbcpY94`+{krmO zrAo-(xS0<Nn42&K1HuTS2}x<2rbgSKxHl5BZR*u(TY9zIwqBjK!%Su+rPOV^X}Mia zy|$ND+Lg50uBNqijgs#OvzhaXFeh>k&32s`o1|HK3z|sNPz&L<$djRrf;b)ITq>8v zFJckrS?evuBaU((=AHiSP(;c@?tU025mV(>E^#|!AMN8tRgiAQX_OD8s@+O>6f!M| zSO+!EhY8G0nBp#wh_opqZG%zpvcW87zoOvhDdw;ea5i&U`4s_AJywCW#Hy?YtIO(a z0oF1z!J|c0d(>w!*Cv96qf5y7U10s~eZK>i$T)lMhdvyNIx^?`Yg?@jh8_p5C75?$ zim!l3GNEHKrekAlPAy8L(K9F3nDlH0?|Tl+5=^&iE|aM-CP7&T)*K1XpN)-;4L?C6 zZumz``}m5;(+DlQ()>S%uljNa0~)a#_rpX)?>`=uR>j(?SQV|N$8E4)xj_(Tu?zxb z<U(14Q0^$Jm&chZqe%g3SME+OWEQ58vWvwW#7tF&S-d-p0u(eYWr-;1^1A-%T)!&G zBFDcGz5<ee@2tyous(<f*WygbFiEbl-TiFu^X?A5)H8SyWi03Gs2;Vir<kt!Zf&s7 zp)3gM5xP?BhUrm<T6DC0BzkLe&pHO2#eojHFm>)4fZ8#@sbA*RG0iYz<bX;#p;K~T z%p})grG1NEhwRd?=kHy9lNkqQR+j)pIALBOhp^xKW4|G1xt~%>o{;Qki%6&M@qZ}6 zN0uh;lrZZYIk3i7uPn<wuW#_bq}i)Xs$fBFO8IL>Hs_YTDeM^=V8ff4Eq}^7v*B!I znH<ueC|I$;5M{GHe9-_Tf_{*kVu(GvIQb*lef*TjMbyLGLt}D!3O1p(-N#S#+AOy? z7W4Dhzu@@&+qW2Dj+h@^o>i;=GK_VB$lMP*yF)0F0=(Uv`>SHKv?}~q_+e4fS`@L- z>8|buK76DrEP|uTc)8tN;%DLS%0iqdGY$864fnQAI&UCf`eE}P=Q&rV*cZx;_BsIB zZm#Tz^DI}+y?aj|Y;G0EbE3UiNWqujLtaLL9w=KRQ8eHV@>V{GGG%v?94f=+XYi1= z!3Ep}+71hSR3`jiqqZRD@Z-|V<qNP8*MShaNL|{XuHjP0s2c_~U{|MAT7{iOmq2P6 zRnwv#t(r?lgO1J|h3V{%9Sl4UT(RwGls*P#OeSPX#EJwgLhg)N-Y)`bjH1&_srXVl z47$r)3OLl6M;rj}f~1T*X1i&&MvWp%SuW=px=_5qI*Zs<e|so>ltN2{>h@GQ7C|B7 z*#301b*lJBxYhB-+EUIiOX94rY@R~d>I^n%5oPQEAI6eLNd(u$EqE=kriqSZT}SVD zlxAm7juJKlNqTgG5diFikF?da3j0u47>Q^)*%p2kL=RvJ-7Dzm?9m*(bN*!g%kX89 zrF=<J$chPeSaUmU{rBU>V8l)~Mpfe=Om(#3B6^5c>DvdQGdh3Ft`82rGYwsMcSU^< zn-4?7@9%vAR~EKA2-IEj>^w9*GO_g;Y$N8FP7Q?0?!_l~xgm^nJJHaAu)4=RDT*|K zy2FHD1BHA6$r_NRp;NCcyd;hnleZ1GR9`!aI2VW?0@+`r=jmwWsHg9bHjS+orq{!} z3x5lDmlp(S&V~u{)gag%hRIA)3IdjQf<Rvy{8LcC*O6et`DaMJK=K}%n!{S>6(9&p zfe3;sre4jv?7FV$T3XgzK)v0e9CFahG3*=*mtRDJZH)U!E&)+QU$?pg6$OOOzVA@_ ZhbLK~+;0lcHn1<~GHF1o(U0L<{{fD`XkGvS diff --git a/env/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/pidlockfile.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/pidlockfile.cpython-37.pyc deleted file mode 100644 index 3e32b6d88745cf234db755d54dec9541a462d24c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4807 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 TsFU(gpFNwqi=TP#co+TyOB%(c diff --git a/env/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/sqlitelockfile.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/sqlitelockfile.cpython-37.pyc deleted file mode 100644 index 2a36825fdb0dafe8a98d8ca73194180411d5c800..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3706 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 bdOxbHy-o2Vr}yFp?jVou9t1ew_@?<kB3gn$ diff --git a/env/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/symlinklockfile.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/symlinklockfile.cpython-37.pyc deleted file mode 100644 index 7fec0bf8049e5fa7eb1e1a9997599352e75a95ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2130 zcmah~%WfP+6s@X$&clxwlh{cJEg+DVh%GDxEFhSWz$Od}TMD#<TJ5QJ+@5}ntEwS0 znrw(a0I`EbG$U4Q*&*=-d_r$o`4?DmZ*?1o$w<_ws%|~{*16|C=I+u`n?TEd+4$xI zkp9BOc{4%Sg)Se!zzL@*$!I_+$}D98)3Xs6+~8(vW>#Qjc3@{t;AC##X04z_$>)Sy z+&(4Tj;*Ig(B^E9_|6$<BtETHq61l^rHaEO8x}(K&L|#OmHVLR5AH@Xu3Ei9;UeZ* z{9=TQs)OTxlEp=-s-;g-5l38~#JrEX&zk|lE_8VhhL{AD6TnRY^C~yFbxH%1U*a}* zK(e^YTc;$jd7F1&c6gUB!R+#7z5;WL8-RVSTG<<AX_5~R!e>bukKaPci~9XoN>3GD z<Q>AcSIQ)R<jMN-tsQ@Bzt=}jvEgh({}j5s1%o0}Iw2D}VH0C!Qli+gF*PUT*qTvJ zH_3#A7ANpN>j^Z<w*~5`+%Qb?M1^6+3R#)MNF7y{9Hxn?I%S@mlyR6xS?rsYDdY4| zboEE-2nhp99aVGqD-mmO^7s91l?}It$?$fPOBJQ*ZGJM!AHQ>WgqymD-^MvF#C8fs zqn+E0h3D(7;YeUmEkT#sUbf1{8*`*>o#XB^xQ7j`a-nNV{sdtH&Kk5tcS3U{f;^#$ zPU(z1Va>@7%yeLi9UzUq5BraQ9IY!hHQ;tl9i!wS$(2czJ!p$RD8b)^Or04K9O-N{ zJ*zcO7-)OeX#GLCoPnm+W%87MPxEEf=BT+@!xx?A>)&8DuaTT_a26$BlaqJ9f+X34 z`JtYDyC*QP$8R<v>wOm`3Zny~rGHW;BKD9!@30WwO*vk_DZNB`Q61O%DCTF#>Z6~3 z!uI>eepg(Ab!DOlMF&Nv@q}2$RSOk{=%LE_a__zng{Zno7-b<Iz~jP!YdRnV@(y8> z#_`ZM#0u_f<u157)DK{E=nxSv;a#UejSKk(48&feE?uQAgGSfsGIN<}tiztky3C|) z>KWrJ^Fh#P=_5JVaK<>$F>nV2@D-U6xuL+*z&&exaT)dv*xyp7_EEF1tf>vR9Q1-t z7Na*_t*Oil)zCP;R_`DSF@M`TD3yn&2O|&i#I0J1)C|R3Sb(4=XcHw&*qUj(%&`K9 zE3o6!ny`6>M4ZM@z}|x^5<N$1e&{lNk%#8)Vjj?&iX77^Mx!yKPy}etH#L$vpY25c z4;=9dDESDw)agdYoAa*t*XqR}yg3lX4X9X{WB>?8Yk+kfVA&V21b(9_s$48L8X_9A zm@$DI??SJO2J&?M1(45$?_!)cK*955iK`blo1g%c)*_Swzg>*2Y9D|F105Il{sZyq zJj9EOKHKjhC2cIyScIWSx5F?ic$uQy4a1W%N}CfW40+KHLtQ(?b$CR)iUT@MQzKqO z=_1Osg!w00Fkpm9Bo`B|ZMR={9oKM8edc%Y-NRCq0^SuE0k!=vgH#dyM^eYSj&NNT bup;P>7rj`yAJ$gf!Gx7~x653}{p;pGm|W*I diff --git a/env/lib/python3.7/site-packages/pip/_vendor/lockfile/linklockfile.py b/env/lib/python3.7/site-packages/pip/_vendor/lockfile/linklockfile.py deleted file mode 100644 index 2ca9be0..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/lockfile/linklockfile.py +++ /dev/null @@ -1,73 +0,0 @@ -from __future__ import absolute_import - -import time -import os - -from . import (LockBase, LockFailed, NotLocked, NotMyLock, LockTimeout, - AlreadyLocked) - - -class LinkLockFile(LockBase): - """Lock access to a file using atomic property of link(2). - - >>> lock = LinkLockFile('somefile') - >>> lock = LinkLockFile('somefile', threaded=False) - """ - - def acquire(self, timeout=None): - try: - open(self.unique_name, "wb").close() - except IOError: - raise LockFailed("failed to create %s" % self.unique_name) - - timeout = timeout if timeout is not None else self.timeout - end_time = time.time() - if timeout is not None and timeout > 0: - end_time += timeout - - while True: - # Try and create a hard link to it. - try: - os.link(self.unique_name, self.lock_file) - except OSError: - # Link creation failed. Maybe we've double-locked? - nlinks = os.stat(self.unique_name).st_nlink - if nlinks == 2: - # The original link plus the one I created == 2. We're - # good to go. - return - else: - # Otherwise the lock creation failed. - if timeout is not None and time.time() > end_time: - os.unlink(self.unique_name) - if timeout > 0: - raise LockTimeout("Timeout waiting to acquire" - " lock for %s" % - self.path) - else: - raise AlreadyLocked("%s is already locked" % - self.path) - time.sleep(timeout is not None and timeout / 10 or 0.1) - else: - # Link creation succeeded. We're good to go. - return - - def release(self): - if not self.is_locked(): - raise NotLocked("%s is not locked" % self.path) - elif not os.path.exists(self.unique_name): - raise NotMyLock("%s is locked, but not by me" % self.path) - os.unlink(self.unique_name) - os.unlink(self.lock_file) - - def is_locked(self): - return os.path.exists(self.lock_file) - - def i_am_locking(self): - return (self.is_locked() and - os.path.exists(self.unique_name) and - os.stat(self.unique_name).st_nlink == 2) - - def break_lock(self): - if os.path.exists(self.lock_file): - os.unlink(self.lock_file) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/lockfile/mkdirlockfile.py b/env/lib/python3.7/site-packages/pip/_vendor/lockfile/mkdirlockfile.py deleted file mode 100644 index 05a8c96..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/lockfile/mkdirlockfile.py +++ /dev/null @@ -1,84 +0,0 @@ -from __future__ import absolute_import, division - -import time -import os -import sys -import errno - -from . import (LockBase, LockFailed, NotLocked, NotMyLock, LockTimeout, - AlreadyLocked) - - -class MkdirLockFile(LockBase): - """Lock file by creating a directory.""" - def __init__(self, path, threaded=True, timeout=None): - """ - >>> lock = MkdirLockFile('somefile') - >>> lock = MkdirLockFile('somefile', threaded=False) - """ - LockBase.__init__(self, path, threaded, timeout) - # Lock file itself is a directory. Place the unique file name into - # it. - self.unique_name = os.path.join(self.lock_file, - "%s.%s%s" % (self.hostname, - self.tname, - self.pid)) - - def acquire(self, timeout=None): - timeout = timeout if timeout is not None else self.timeout - end_time = time.time() - if timeout is not None and timeout > 0: - end_time += timeout - - if timeout is None: - wait = 0.1 - else: - wait = max(0, timeout / 10) - - while True: - try: - os.mkdir(self.lock_file) - except OSError: - err = sys.exc_info()[1] - if err.errno == errno.EEXIST: - # Already locked. - if os.path.exists(self.unique_name): - # Already locked by me. - return - if timeout is not None and time.time() > end_time: - if timeout > 0: - raise LockTimeout("Timeout waiting to acquire" - " lock for %s" % - self.path) - else: - # Someone else has the lock. - raise AlreadyLocked("%s is already locked" % - self.path) - time.sleep(wait) - else: - # Couldn't create the lock for some other reason - raise LockFailed("failed to create %s" % self.lock_file) - else: - open(self.unique_name, "wb").close() - return - - def release(self): - if not self.is_locked(): - raise NotLocked("%s is not locked" % self.path) - elif not os.path.exists(self.unique_name): - raise NotMyLock("%s is locked, but not by me" % self.path) - os.unlink(self.unique_name) - os.rmdir(self.lock_file) - - def is_locked(self): - return os.path.exists(self.lock_file) - - def i_am_locking(self): - return (self.is_locked() and - os.path.exists(self.unique_name)) - - def break_lock(self): - if os.path.exists(self.lock_file): - for name in os.listdir(self.lock_file): - os.unlink(os.path.join(self.lock_file, name)) - os.rmdir(self.lock_file) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/lockfile/pidlockfile.py b/env/lib/python3.7/site-packages/pip/_vendor/lockfile/pidlockfile.py deleted file mode 100644 index 069e85b..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/lockfile/pidlockfile.py +++ /dev/null @@ -1,190 +0,0 @@ -# -*- coding: utf-8 -*- - -# pidlockfile.py -# -# Copyright © 2008–2009 Ben Finney <ben+python@benfinney.id.au> -# -# This is free software: you may copy, modify, and/or distribute this work -# under the terms of the Python Software Foundation License, version 2 or -# later as published by the Python Software Foundation. -# No warranty expressed or implied. See the file LICENSE.PSF-2 for details. - -""" Lockfile behaviour implemented via Unix PID files. - """ - -from __future__ import absolute_import - -import errno -import os -import time - -from . import (LockBase, AlreadyLocked, LockFailed, NotLocked, NotMyLock, - LockTimeout) - - -class PIDLockFile(LockBase): - """ Lockfile implemented as a Unix PID file. - - The lock file is a normal file named by the attribute `path`. - A lock's PID file contains a single line of text, containing - the process ID (PID) of the process that acquired the lock. - - >>> lock = PIDLockFile('somefile') - >>> lock = PIDLockFile('somefile') - """ - - def __init__(self, path, threaded=False, timeout=None): - # pid lockfiles don't support threaded operation, so always force - # False as the threaded arg. - LockBase.__init__(self, path, False, timeout) - self.unique_name = self.path - - def read_pid(self): - """ Get the PID from the lock file. - """ - return read_pid_from_pidfile(self.path) - - def is_locked(self): - """ Test if the lock is currently held. - - The lock is held if the PID file for this lock exists. - - """ - return os.path.exists(self.path) - - def i_am_locking(self): - """ Test if the lock is held by the current process. - - Returns ``True`` if the current process ID matches the - number stored in the PID file. - """ - return self.is_locked() and os.getpid() == self.read_pid() - - def acquire(self, timeout=None): - """ Acquire the lock. - - Creates the PID file for this lock, or raises an error if - the lock could not be acquired. - """ - - timeout = timeout if timeout is not None else self.timeout - end_time = time.time() - if timeout is not None and timeout > 0: - end_time += timeout - - while True: - try: - write_pid_to_pidfile(self.path) - except OSError as exc: - if exc.errno == errno.EEXIST: - # The lock creation failed. Maybe sleep a bit. - if time.time() > end_time: - if timeout is not None and timeout > 0: - raise LockTimeout("Timeout waiting to acquire" - " lock for %s" % - self.path) - else: - raise AlreadyLocked("%s is already locked" % - self.path) - time.sleep(timeout is not None and timeout / 10 or 0.1) - else: - raise LockFailed("failed to create %s" % self.path) - else: - return - - def release(self): - """ Release the lock. - - Removes the PID file to release the lock, or raises an - error if the current process does not hold the lock. - - """ - if not self.is_locked(): - raise NotLocked("%s is not locked" % self.path) - if not self.i_am_locking(): - raise NotMyLock("%s is locked, but not by me" % self.path) - remove_existing_pidfile(self.path) - - def break_lock(self): - """ Break an existing lock. - - Removes the PID file if it already exists, otherwise does - nothing. - - """ - remove_existing_pidfile(self.path) - - -def read_pid_from_pidfile(pidfile_path): - """ Read the PID recorded in the named PID file. - - Read and return the numeric PID recorded as text in the named - PID file. If the PID file cannot be read, or if the content is - not a valid PID, return ``None``. - - """ - pid = None - try: - pidfile = open(pidfile_path, 'r') - except IOError: - pass - else: - # According to the FHS 2.3 section on PID files in /var/run: - # - # The file must consist of the process identifier in - # ASCII-encoded decimal, followed by a newline character. - # - # Programs that read PID files should be somewhat flexible - # in what they accept; i.e., they should ignore extra - # whitespace, leading zeroes, absence of the trailing - # newline, or additional lines in the PID file. - - line = pidfile.readline().strip() - try: - pid = int(line) - except ValueError: - pass - pidfile.close() - - return pid - - -def write_pid_to_pidfile(pidfile_path): - """ Write the PID in the named PID file. - - Get the numeric process ID (“PID”) of the current process - and write it to the named file as a line of text. - - """ - open_flags = (os.O_CREAT | os.O_EXCL | os.O_WRONLY) - open_mode = 0o644 - pidfile_fd = os.open(pidfile_path, open_flags, open_mode) - pidfile = os.fdopen(pidfile_fd, 'w') - - # According to the FHS 2.3 section on PID files in /var/run: - # - # The file must consist of the process identifier in - # ASCII-encoded decimal, followed by a newline character. For - # example, if crond was process number 25, /var/run/crond.pid - # would contain three characters: two, five, and newline. - - pid = os.getpid() - pidfile.write("%s\n" % pid) - pidfile.close() - - -def remove_existing_pidfile(pidfile_path): - """ Remove the named PID file if it exists. - - Removing a PID file that doesn't already exist puts us in the - desired state, so we ignore the condition if the file does not - exist. - - """ - try: - os.remove(pidfile_path) - except OSError as exc: - if exc.errno == errno.ENOENT: - pass - else: - raise diff --git a/env/lib/python3.7/site-packages/pip/_vendor/lockfile/sqlitelockfile.py b/env/lib/python3.7/site-packages/pip/_vendor/lockfile/sqlitelockfile.py deleted file mode 100644 index f997e24..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/lockfile/sqlitelockfile.py +++ /dev/null @@ -1,156 +0,0 @@ -from __future__ import absolute_import, division - -import time -import os - -try: - unicode -except NameError: - unicode = str - -from . import LockBase, NotLocked, NotMyLock, LockTimeout, AlreadyLocked - - -class SQLiteLockFile(LockBase): - "Demonstrate SQL-based locking." - - testdb = None - - def __init__(self, path, threaded=True, timeout=None): - """ - >>> lock = SQLiteLockFile('somefile') - >>> lock = SQLiteLockFile('somefile', threaded=False) - """ - LockBase.__init__(self, path, threaded, timeout) - self.lock_file = unicode(self.lock_file) - self.unique_name = unicode(self.unique_name) - - if SQLiteLockFile.testdb is None: - import tempfile - _fd, testdb = tempfile.mkstemp() - os.close(_fd) - os.unlink(testdb) - del _fd, tempfile - SQLiteLockFile.testdb = testdb - - import sqlite3 - self.connection = sqlite3.connect(SQLiteLockFile.testdb) - - c = self.connection.cursor() - try: - c.execute("create table locks" - "(" - " lock_file varchar(32)," - " unique_name varchar(32)" - ")") - except sqlite3.OperationalError: - pass - else: - self.connection.commit() - import atexit - atexit.register(os.unlink, SQLiteLockFile.testdb) - - def acquire(self, timeout=None): - timeout = timeout if timeout is not None else self.timeout - end_time = time.time() - if timeout is not None and timeout > 0: - end_time += timeout - - if timeout is None: - wait = 0.1 - elif timeout <= 0: - wait = 0 - else: - wait = timeout / 10 - - cursor = self.connection.cursor() - - while True: - if not self.is_locked(): - # Not locked. Try to lock it. - cursor.execute("insert into locks" - " (lock_file, unique_name)" - " values" - " (?, ?)", - (self.lock_file, self.unique_name)) - self.connection.commit() - - # Check to see if we are the only lock holder. - cursor.execute("select * from locks" - " where unique_name = ?", - (self.unique_name,)) - rows = cursor.fetchall() - if len(rows) > 1: - # Nope. Someone else got there. Remove our lock. - cursor.execute("delete from locks" - " where unique_name = ?", - (self.unique_name,)) - self.connection.commit() - else: - # Yup. We're done, so go home. - return - else: - # Check to see if we are the only lock holder. - cursor.execute("select * from locks" - " where unique_name = ?", - (self.unique_name,)) - rows = cursor.fetchall() - if len(rows) == 1: - # We're the locker, so go home. - return - - # Maybe we should wait a bit longer. - if timeout is not None and time.time() > end_time: - if timeout > 0: - # No more waiting. - raise LockTimeout("Timeout waiting to acquire" - " lock for %s" % - self.path) - else: - # Someone else has the lock and we are impatient.. - raise AlreadyLocked("%s is already locked" % self.path) - - # Well, okay. We'll give it a bit longer. - time.sleep(wait) - - def release(self): - if not self.is_locked(): - raise NotLocked("%s is not locked" % self.path) - if not self.i_am_locking(): - raise NotMyLock("%s is locked, but not by me (by %s)" % - (self.unique_name, self._who_is_locking())) - cursor = self.connection.cursor() - cursor.execute("delete from locks" - " where unique_name = ?", - (self.unique_name,)) - self.connection.commit() - - def _who_is_locking(self): - cursor = self.connection.cursor() - cursor.execute("select unique_name from locks" - " where lock_file = ?", - (self.lock_file,)) - return cursor.fetchone()[0] - - def is_locked(self): - cursor = self.connection.cursor() - cursor.execute("select * from locks" - " where lock_file = ?", - (self.lock_file,)) - rows = cursor.fetchall() - return not not rows - - def i_am_locking(self): - cursor = self.connection.cursor() - cursor.execute("select * from locks" - " where lock_file = ?" - " and unique_name = ?", - (self.lock_file, self.unique_name)) - return not not cursor.fetchall() - - def break_lock(self): - cursor = self.connection.cursor() - cursor.execute("delete from locks" - " where lock_file = ?", - (self.lock_file,)) - self.connection.commit() diff --git a/env/lib/python3.7/site-packages/pip/_vendor/lockfile/symlinklockfile.py b/env/lib/python3.7/site-packages/pip/_vendor/lockfile/symlinklockfile.py deleted file mode 100644 index 23b41f5..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/lockfile/symlinklockfile.py +++ /dev/null @@ -1,70 +0,0 @@ -from __future__ import absolute_import - -import os -import time - -from . import (LockBase, NotLocked, NotMyLock, LockTimeout, - AlreadyLocked) - - -class SymlinkLockFile(LockBase): - """Lock access to a file using symlink(2).""" - - def __init__(self, path, threaded=True, timeout=None): - # super(SymlinkLockFile).__init(...) - LockBase.__init__(self, path, threaded, timeout) - # split it back! - self.unique_name = os.path.split(self.unique_name)[1] - - def acquire(self, timeout=None): - # Hopefully unnecessary for symlink. - # try: - # open(self.unique_name, "wb").close() - # except IOError: - # raise LockFailed("failed to create %s" % self.unique_name) - timeout = timeout if timeout is not None else self.timeout - end_time = time.time() - if timeout is not None and timeout > 0: - end_time += timeout - - while True: - # Try and create a symbolic link to it. - try: - os.symlink(self.unique_name, self.lock_file) - except OSError: - # Link creation failed. Maybe we've double-locked? - if self.i_am_locking(): - # Linked to out unique name. Proceed. - return - else: - # Otherwise the lock creation failed. - if timeout is not None and time.time() > end_time: - if timeout > 0: - raise LockTimeout("Timeout waiting to acquire" - " lock for %s" % - self.path) - else: - raise AlreadyLocked("%s is already locked" % - self.path) - time.sleep(timeout / 10 if timeout is not None else 0.1) - else: - # Link creation succeeded. We're good to go. - return - - def release(self): - if not self.is_locked(): - raise NotLocked("%s is not locked" % self.path) - elif not self.i_am_locking(): - raise NotMyLock("%s is locked, but not by me" % self.path) - os.unlink(self.lock_file) - - def is_locked(self): - return os.path.islink(self.lock_file) - - def i_am_locking(self): - return (os.path.islink(self.lock_file) - and os.readlink(self.lock_file) == self.unique_name) - - def break_lock(self): - if os.path.islink(self.lock_file): # exists && link - os.unlink(self.lock_file) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/msgpack/__init__.py b/env/lib/python3.7/site-packages/pip/_vendor/msgpack/__init__.py deleted file mode 100644 index 2afca5a..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/msgpack/__init__.py +++ /dev/null @@ -1,66 +0,0 @@ -# coding: utf-8 -from pip._vendor.msgpack._version import version -from pip._vendor.msgpack.exceptions import * - -from collections import namedtuple - - -class ExtType(namedtuple('ExtType', 'code data')): - """ExtType represents ext type in msgpack.""" - def __new__(cls, code, data): - if not isinstance(code, int): - raise TypeError("code must be int") - if not isinstance(data, bytes): - raise TypeError("data must be bytes") - if not 0 <= code <= 127: - raise ValueError("code must be 0~127") - return super(ExtType, cls).__new__(cls, code, data) - - -import os -if os.environ.get('MSGPACK_PUREPYTHON'): - from pip._vendor.msgpack.fallback import Packer, unpackb, Unpacker -else: - try: - from pip._vendor.msgpack._packer import Packer - from pip._vendor.msgpack._unpacker import unpackb, Unpacker - except ImportError: - from pip._vendor.msgpack.fallback import Packer, unpackb, Unpacker - - -def pack(o, stream, **kwargs): - """ - Pack object `o` and write it to `stream` - - See :class:`Packer` for options. - """ - packer = Packer(**kwargs) - stream.write(packer.pack(o)) - - -def packb(o, **kwargs): - """ - Pack object `o` and return packed bytes - - See :class:`Packer` for options. - """ - return Packer(**kwargs).pack(o) - - -def unpack(stream, **kwargs): - """ - Unpack an object from `stream`. - - Raises `ExtraData` when `stream` contains extra bytes. - See :class:`Unpacker` for options. - """ - data = stream.read() - return unpackb(data, **kwargs) - - -# alias for compatibility to simplejson/marshal/pickle. -load = unpack -loads = unpackb - -dump = pack -dumps = packb diff --git a/env/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 231781ba2759ce8bfa28bca855358eed496d9266..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2026 zcmb7E-ESL35Z}E!pU-DIP23QmrR9VwfsyLazJMw~P>2dtgs4fsPD1DN?K*XHAMWlt zAC?OeiPRV9-;jtG_=kAdSDyMW@WjlXZCYd=SZinJX4gCOoB7S&Y&LxYBmeb{?|*R# z`4c~8!vp0rnDP%0j4+y#jE0n=Zl%@^u6Al?PUui_i!g^(P6(@TSebil9ou0APE=Dj zbh-Pudg?LnjEXMUYH2O=LqDsB^{f##D9OJ$3c&8CO|%;i^>pc<{re<;&msKWo-cl* z1b>Tec}Q~W0bvc+JR#vSTVm&6U17^?1=bdCh39!aT;<E*YkVbKW7TcaZoL3(q)l~o zp9?uCa!~2}ApAVeI8&ox$`d>?8}?L@0Vte=l#$S4G_;?QK4liOPrT51MjR4W;Ce?_ zHxAX#(U6bdohpIgL%}7_l??cy3KVPxgFMLO?l4aFI?2oft`(TL%6lLbnNUTKE!k4w z@tFQZ!D1;JELXr{p@rEK>cC(2sQ8FEdsN=cElL!W#GJ1vcS4S>)9M87npkHx#OQ90 zmy?3=AR9>)^e`ATZn0R!b4%|?aVaRo@Zv`h<JK$ZKltI=^$**g_6Ks1OBLq{*EU?D zYY2Qph(hR!xkCH*;&e1K$<dGtfe>{yigJDsMQvN#Nh-C24zz<oKrL!fl%%ngQS>|c z>yver4cCW*;Z@@-O|P;iNBQBk{v$M+8SV3&6=Hpw()B1B<O3B&o#Byaf;*(VTmnI; zPdzi&U>%>EmZ&p}#?>CEK!hmLeiUT|8>Of>qUgyePNzE%JS&nYGI#6dG}wfvDcD-z z#fUZ)E2y7GfuOOyq=O1|sIiP|Ca;KkGi-gkeQWFUFK$O$ckgU$J>2=~yG_WBy9FHK zLRUvQvZbfJyGG#x?tc?5Yg^(1EaD=F!~%f>y`an6Fy&<siu8dx&*@X3%PF1Mr`Cj= z(KGCA3Y4(M5BvZIItz;4W1gs>TXcgsXTgCODBuVXw+OmY2_9!%-<;m&Jh)*Bb)#E` z*$w)I2#TSC#*!U#2tb%Pb;Vqy9fSdWLJRGdw`q6pAQrn)ySN1mnWwPK-6e?sZ3Kd- zi0e~<mIT>}12JRE7_7^n7_9U;;slI<j*jpDCpy8^NaTU>%mPE&{{aq?k2Np>fsUCL z0g6{4=nCH7Yr~E-C33|(pwA&-_;U!W@G&8$<cvJE6!dJLP5_L7@w0(Z5&&v5t5jbU z*}OEJGW<L7Kyn#$f#D+l5(w4}4j%D*ek@3eT*c5)_$G<CL|#_x<+9GmwxF<WOFKXY zX6Oe+#uAm_u?YXpfLrqSI&777ta?;jfv@)K`Yq_=&a{U+vu6>$&HF4cVfyl-Bm6Mo zCDn92DN=a24etc<q<m(qLh35d_XncLwY|&LVqg6@O?yzGvY7LB3NJ458kH;!FD=|G zVM4>!zs`n*Q06r>{4gaqkhPN*G1C>4@bs}!Hq;fA@};a92I1SGy^qUx=u^yu#GEy# eXEp4#hDRH8&9XqQ(j|Jq_I$7AH5}?#4*eTe1qfXL diff --git a/env/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/_version.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/_version.cpython-37.pyc deleted file mode 100644 index ba40d59fae1b2187fd0697e2907b3cd430ab30f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 175 zcmZ?b<>g`kg1p5Nu_8eFF^B^Lj6jA15EpX*i4=w?h7`tN22CbS=9fS|!%J2W!3HG! zG#PKPm!%dJXXfXvWGDiOgNa|Z`X#vq`URN<x|w;!C5bsXx+#T~c@>6f86ZJ0jxS5i oOUW<N&n-?bNKDSw2lBz@=oM7n;;_lhPbtkwwF5ciGY~TX0M?!>egFUf diff --git a/env/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-37.pyc deleted file mode 100644 index bf051050abe27cf3057aae43ebe97f780f3e69dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2131 zcmcIlPfrs;6yNP`+ijuHVq%OjWDXiFkrMD~lptt~Nii{as4<geX9^pa-DP&SK*J4A zdh#=P@+<AtZ{f+`o6<iNNZ{Z!Go9a?nfL#_-Kf>721fYn!B=J*#vcO1QN(5)Gx?6? zogoZio?}Ym%<7oH1z`bO(gZF5+oA|u)Yt+pi863mn$kYAJ4H|&Q30hQi+E82u8JAp z8O^Z_JS%FzHCfg#98l)OJSg+hkrnW$iuxy`+3=vxXqecoV<vSh(&(7N=oEz6u|xrP zt$cnbj9u^B*0Cq!)Q`gchfNtP>A9&CEyi{d$wp_)50g~7f~66|1#h3ZLBQnjDHECU z!#$R1j@Y%@O*?lu58VUFd0yrGAQD+X`&rHpGdH+6DRV9&kMrM#DnU)X{C&NW9>goL zA1{+wNLm($C*kpGcb|xQ@}3Muq*e}+Ju+ftq)O6?PZXI>GbvzkOpUMi%`7gAeFMJ~ z^6Ey`?Mn4F3xamjQp7@8v>**8v>fPLCYpnVa$+cs@U6vFwzG7*yXmIxEu~e!o#s#) z?XQ=1L*VO!z<+jwOl~O^ss7_DkslupLr)={b_N+ej@yJssCH@-IugF5BYAb5E<D0A z4uB|}8%R(~*!V};ARwi@vUQv)mptTA9B9x#v3P^2^ZV31HMntFz=}M_Gqa6QI)j9i zA}>nffvmR^8FUqeU6Fzl+EXYgXZ_GmIbR^o6mi2Wnf-;43a#M<j}nZ=Fxj*&^g@`F zNA3RNK>D-YCPP_Czb6Gs25K+?TUuIl(^PYKGOY&6B1skJ_i?7<Y?%GVqz?MD-7HQ= zWS*E&+$T8d!qSO4gM$XKBsCq=u@zA~%+Vlg)-iAD8nus?ddB-JnRC~kLFIeVF{X{V zF}=u!homIs0P36YovfH6E5<qA|8W^JKVi!C69nvNUxq9_i6x7=D1|snb@b>)lErbP z&@I_6sDAo1VLhrTI?KY*X{%ag7*`xM7C$O6eeo`JMp?Qza)hl2-^mdTGJLxyRX2!^ z2F>8-71Fdj{4kY!QjM*RU_acW+;C6(>7pwSJ;c5&uPrUTSbfguZ>{-1J#r5ocrxJ; z!tLe^HIa+&oc<c<o~@{L=GAc^6!j@x6FQ}|JM-El_b6g`U2)~k%fUD9mHzTjRo89$ KE!g!6*784*FvlnW diff --git a/env/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-37.pyc deleted file mode 100644 index 4c62af9a5ca2015c05cac6bf6aeb564b9dd735e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24503 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 H+y8$7Sr(Ps diff --git a/env/lib/python3.7/site-packages/pip/_vendor/msgpack/_version.py b/env/lib/python3.7/site-packages/pip/_vendor/msgpack/_version.py deleted file mode 100644 index d28f0de..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/msgpack/_version.py +++ /dev/null @@ -1 +0,0 @@ -version = (0, 5, 6) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/msgpack/exceptions.py b/env/lib/python3.7/site-packages/pip/_vendor/msgpack/exceptions.py deleted file mode 100644 index 9766881..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/msgpack/exceptions.py +++ /dev/null @@ -1,41 +0,0 @@ -class UnpackException(Exception): - """Deprecated. Use Exception instead to catch all exception during unpacking.""" - - -class BufferFull(UnpackException): - pass - - -class OutOfData(UnpackException): - pass - - -class UnpackValueError(UnpackException, ValueError): - """Deprecated. Use ValueError instead.""" - - -class ExtraData(UnpackValueError): - def __init__(self, unpacked, extra): - self.unpacked = unpacked - self.extra = extra - - def __str__(self): - return "unpack(b) received extra data." - - -class PackException(Exception): - """Deprecated. Use Exception instead to catch all exception during packing.""" - - -class PackValueError(PackException, ValueError): - """PackValueError is raised when type of input data is supported but it's value is unsupported. - - Deprecated. Use ValueError instead. - """ - - -class PackOverflowError(PackValueError, OverflowError): - """PackOverflowError is raised when integer value is out of range of msgpack support [-2**31, 2**32). - - Deprecated. Use ValueError instead. - """ diff --git a/env/lib/python3.7/site-packages/pip/_vendor/msgpack/fallback.py b/env/lib/python3.7/site-packages/pip/_vendor/msgpack/fallback.py deleted file mode 100644 index 9418421..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/msgpack/fallback.py +++ /dev/null @@ -1,977 +0,0 @@ -"""Fallback pure Python implementation of msgpack""" - -import sys -import struct -import warnings - -if sys.version_info[0] == 3: - PY3 = True - int_types = int - Unicode = str - xrange = range - def dict_iteritems(d): - return d.items() -else: - PY3 = False - int_types = (int, long) - Unicode = unicode - def dict_iteritems(d): - return d.iteritems() - - -if hasattr(sys, 'pypy_version_info'): - # cStringIO is slow on PyPy, StringIO is faster. However: PyPy's own - # StringBuilder is fastest. - from __pypy__ import newlist_hint - try: - from __pypy__.builders import BytesBuilder as StringBuilder - except ImportError: - from __pypy__.builders import StringBuilder - USING_STRINGBUILDER = True - class StringIO(object): - def __init__(self, s=b''): - if s: - self.builder = StringBuilder(len(s)) - self.builder.append(s) - else: - self.builder = StringBuilder() - def write(self, s): - if isinstance(s, memoryview): - s = s.tobytes() - elif isinstance(s, bytearray): - s = bytes(s) - self.builder.append(s) - def getvalue(self): - return self.builder.build() -else: - USING_STRINGBUILDER = False - from io import BytesIO as StringIO - newlist_hint = lambda size: [] - - -from pip._vendor.msgpack.exceptions import ( - BufferFull, - OutOfData, - UnpackValueError, - PackValueError, - PackOverflowError, - ExtraData) - -from pip._vendor.msgpack import ExtType - - -EX_SKIP = 0 -EX_CONSTRUCT = 1 -EX_READ_ARRAY_HEADER = 2 -EX_READ_MAP_HEADER = 3 - -TYPE_IMMEDIATE = 0 -TYPE_ARRAY = 1 -TYPE_MAP = 2 -TYPE_RAW = 3 -TYPE_BIN = 4 -TYPE_EXT = 5 - -DEFAULT_RECURSE_LIMIT = 511 - - -def _check_type_strict(obj, t, type=type, tuple=tuple): - if type(t) is tuple: - return type(obj) in t - else: - return type(obj) is t - - -def _get_data_from_buffer(obj): - try: - view = memoryview(obj) - except TypeError: - # try to use legacy buffer protocol if 2.7, otherwise re-raise - if not PY3: - view = memoryview(buffer(obj)) - warnings.warn("using old buffer interface to unpack %s; " - "this leads to unpacking errors if slicing is used and " - "will be removed in a future version" % type(obj), - RuntimeWarning) - else: - raise - if view.itemsize != 1: - raise ValueError("cannot unpack from multi-byte object") - return view - - -def unpack(stream, **kwargs): - warnings.warn( - "Direct calling implementation's unpack() is deprecated, Use msgpack.unpack() or unpackb() instead.", - PendingDeprecationWarning) - data = stream.read() - return unpackb(data, **kwargs) - - -def unpackb(packed, **kwargs): - """ - Unpack an object from `packed`. - - Raises `ExtraData` when `packed` contains extra bytes. - See :class:`Unpacker` for options. - """ - unpacker = Unpacker(None, **kwargs) - unpacker.feed(packed) - try: - ret = unpacker._unpack() - except OutOfData: - raise UnpackValueError("Data is not enough.") - if unpacker._got_extradata(): - raise ExtraData(ret, unpacker._get_extradata()) - return ret - - -class Unpacker(object): - """Streaming unpacker. - - arguments: - - :param file_like: - File-like object having `.read(n)` method. - If specified, unpacker reads serialized data from it and :meth:`feed()` is not usable. - - :param int read_size: - Used as `file_like.read(read_size)`. (default: `min(16*1024, max_buffer_size)`) - - :param bool use_list: - If true, unpack msgpack array to Python list. - Otherwise, unpack to Python tuple. (default: True) - - :param bool raw: - If true, unpack msgpack raw to Python bytes (default). - Otherwise, unpack to Python str (or unicode on Python 2) by decoding - with UTF-8 encoding (recommended). - Currently, the default is true, but it will be changed to false in - near future. So you must specify it explicitly for keeping backward - compatibility. - - *encoding* option which is deprecated overrides this option. - - :param callable object_hook: - When specified, it should be callable. - Unpacker calls it with a dict argument after unpacking msgpack map. - (See also simplejson) - - :param callable object_pairs_hook: - When specified, it should be callable. - Unpacker calls it with a list of key-value pairs after unpacking msgpack map. - (See also simplejson) - - :param str encoding: - Encoding used for decoding msgpack raw. - If it is None (default), msgpack raw is deserialized to Python bytes. - - :param str unicode_errors: - (deprecated) Used for decoding msgpack raw with *encoding*. - (default: `'strict'`) - - :param int max_buffer_size: - Limits size of data waiting unpacked. 0 means system's INT_MAX (default). - Raises `BufferFull` exception when it is insufficient. - You should set this parameter when unpacking data from untrusted source. - - :param int max_str_len: - Limits max length of str. (default: 2**31-1) - - :param int max_bin_len: - Limits max length of bin. (default: 2**31-1) - - :param int max_array_len: - Limits max length of array. (default: 2**31-1) - - :param int max_map_len: - Limits max length of map. (default: 2**31-1) - - - example of streaming deserialize from file-like object:: - - unpacker = Unpacker(file_like, raw=False) - for o in unpacker: - process(o) - - example of streaming deserialize from socket:: - - unpacker = Unpacker(raw=False) - while True: - buf = sock.recv(1024**2) - if not buf: - break - unpacker.feed(buf) - for o in unpacker: - process(o) - """ - - def __init__(self, file_like=None, read_size=0, use_list=True, raw=True, - object_hook=None, object_pairs_hook=None, list_hook=None, - encoding=None, unicode_errors=None, max_buffer_size=0, - ext_hook=ExtType, - max_str_len=2147483647, # 2**32-1 - max_bin_len=2147483647, - max_array_len=2147483647, - max_map_len=2147483647, - max_ext_len=2147483647): - - if encoding is not None: - warnings.warn( - "encoding is deprecated, Use raw=False instead.", - PendingDeprecationWarning) - - if unicode_errors is None: - unicode_errors = 'strict' - - if file_like is None: - self._feeding = True - else: - if not callable(file_like.read): - raise TypeError("`file_like.read` must be callable") - self.file_like = file_like - self._feeding = False - - #: array of bytes fed. - self._buffer = bytearray() - # Some very old pythons don't support `struct.unpack_from()` with a - # `bytearray`. So we wrap it in a `buffer()` there. - if sys.version_info < (2, 7, 6): - self._buffer_view = buffer(self._buffer) - else: - self._buffer_view = self._buffer - #: Which position we currently reads - self._buff_i = 0 - - # When Unpacker is used as an iterable, between the calls to next(), - # the buffer is not "consumed" completely, for efficiency sake. - # Instead, it is done sloppily. To make sure we raise BufferFull at - # the correct moments, we have to keep track of how sloppy we were. - # Furthermore, when the buffer is incomplete (that is: in the case - # we raise an OutOfData) we need to rollback the buffer to the correct - # state, which _buf_checkpoint records. - self._buf_checkpoint = 0 - - self._max_buffer_size = max_buffer_size or 2**31-1 - if read_size > self._max_buffer_size: - raise ValueError("read_size must be smaller than max_buffer_size") - self._read_size = read_size or min(self._max_buffer_size, 16*1024) - self._raw = bool(raw) - self._encoding = encoding - self._unicode_errors = unicode_errors - self._use_list = use_list - self._list_hook = list_hook - self._object_hook = object_hook - self._object_pairs_hook = object_pairs_hook - self._ext_hook = ext_hook - self._max_str_len = max_str_len - self._max_bin_len = max_bin_len - self._max_array_len = max_array_len - self._max_map_len = max_map_len - self._max_ext_len = max_ext_len - self._stream_offset = 0 - - if list_hook is not None and not callable(list_hook): - raise TypeError('`list_hook` is not callable') - if object_hook is not None and not callable(object_hook): - raise TypeError('`object_hook` is not callable') - if object_pairs_hook is not None and not callable(object_pairs_hook): - raise TypeError('`object_pairs_hook` is not callable') - if object_hook is not None and object_pairs_hook is not None: - raise TypeError("object_pairs_hook and object_hook are mutually " - "exclusive") - if not callable(ext_hook): - raise TypeError("`ext_hook` is not callable") - - def feed(self, next_bytes): - assert self._feeding - view = _get_data_from_buffer(next_bytes) - if (len(self._buffer) - self._buff_i + len(view) > self._max_buffer_size): - raise BufferFull - - # Strip buffer before checkpoint before reading file. - if self._buf_checkpoint > 0: - del self._buffer[:self._buf_checkpoint] - self._buff_i -= self._buf_checkpoint - self._buf_checkpoint = 0 - - self._buffer += view - - def _consume(self): - """ Gets rid of the used parts of the buffer. """ - self._stream_offset += self._buff_i - self._buf_checkpoint - self._buf_checkpoint = self._buff_i - - def _got_extradata(self): - return self._buff_i < len(self._buffer) - - def _get_extradata(self): - return self._buffer[self._buff_i:] - - def read_bytes(self, n): - return self._read(n) - - def _read(self, n): - # (int) -> bytearray - self._reserve(n) - i = self._buff_i - self._buff_i = i+n - return self._buffer[i:i+n] - - def _reserve(self, n): - remain_bytes = len(self._buffer) - self._buff_i - n - - # Fast path: buffer has n bytes already - if remain_bytes >= 0: - return - - if self._feeding: - self._buff_i = self._buf_checkpoint - raise OutOfData - - # Strip buffer before checkpoint before reading file. - if self._buf_checkpoint > 0: - del self._buffer[:self._buf_checkpoint] - self._buff_i -= self._buf_checkpoint - self._buf_checkpoint = 0 - - # Read from file - remain_bytes = -remain_bytes - while remain_bytes > 0: - to_read_bytes = max(self._read_size, remain_bytes) - read_data = self.file_like.read(to_read_bytes) - if not read_data: - break - assert isinstance(read_data, bytes) - self._buffer += read_data - remain_bytes -= len(read_data) - - if len(self._buffer) < n + self._buff_i: - self._buff_i = 0 # rollback - raise OutOfData - - def _read_header(self, execute=EX_CONSTRUCT): - typ = TYPE_IMMEDIATE - n = 0 - obj = None - self._reserve(1) - b = self._buffer[self._buff_i] - self._buff_i += 1 - if b & 0b10000000 == 0: - obj = b - elif b & 0b11100000 == 0b11100000: - obj = -1 - (b ^ 0xff) - elif b & 0b11100000 == 0b10100000: - n = b & 0b00011111 - typ = TYPE_RAW - if n > self._max_str_len: - raise UnpackValueError("%s exceeds max_str_len(%s)", n, self._max_str_len) - obj = self._read(n) - elif b & 0b11110000 == 0b10010000: - n = b & 0b00001111 - typ = TYPE_ARRAY - if n > self._max_array_len: - raise UnpackValueError("%s exceeds max_array_len(%s)", n, self._max_array_len) - elif b & 0b11110000 == 0b10000000: - n = b & 0b00001111 - typ = TYPE_MAP - if n > self._max_map_len: - raise UnpackValueError("%s exceeds max_map_len(%s)", n, self._max_map_len) - elif b == 0xc0: - obj = None - elif b == 0xc2: - obj = False - elif b == 0xc3: - obj = True - elif b == 0xc4: - typ = TYPE_BIN - self._reserve(1) - n = self._buffer[self._buff_i] - self._buff_i += 1 - if n > self._max_bin_len: - raise UnpackValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len)) - obj = self._read(n) - elif b == 0xc5: - typ = TYPE_BIN - self._reserve(2) - n = struct.unpack_from(">H", self._buffer_view, self._buff_i)[0] - self._buff_i += 2 - if n > self._max_bin_len: - raise UnpackValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len)) - obj = self._read(n) - elif b == 0xc6: - typ = TYPE_BIN - self._reserve(4) - n = struct.unpack_from(">I", self._buffer_view, self._buff_i)[0] - self._buff_i += 4 - if n > self._max_bin_len: - raise UnpackValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len)) - obj = self._read(n) - elif b == 0xc7: # ext 8 - typ = TYPE_EXT - self._reserve(2) - L, n = struct.unpack_from('Bb', self._buffer_view, self._buff_i) - self._buff_i += 2 - if L > self._max_ext_len: - raise UnpackValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len)) - obj = self._read(L) - elif b == 0xc8: # ext 16 - typ = TYPE_EXT - self._reserve(3) - L, n = struct.unpack_from('>Hb', self._buffer_view, self._buff_i) - self._buff_i += 3 - if L > self._max_ext_len: - raise UnpackValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len)) - obj = self._read(L) - elif b == 0xc9: # ext 32 - typ = TYPE_EXT - self._reserve(5) - L, n = struct.unpack_from('>Ib', self._buffer_view, self._buff_i) - self._buff_i += 5 - if L > self._max_ext_len: - raise UnpackValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len)) - obj = self._read(L) - elif b == 0xca: - self._reserve(4) - obj = struct.unpack_from(">f", self._buffer_view, self._buff_i)[0] - self._buff_i += 4 - elif b == 0xcb: - self._reserve(8) - obj = struct.unpack_from(">d", self._buffer_view, self._buff_i)[0] - self._buff_i += 8 - elif b == 0xcc: - self._reserve(1) - obj = self._buffer[self._buff_i] - self._buff_i += 1 - elif b == 0xcd: - self._reserve(2) - obj = struct.unpack_from(">H", self._buffer_view, self._buff_i)[0] - self._buff_i += 2 - elif b == 0xce: - self._reserve(4) - obj = struct.unpack_from(">I", self._buffer_view, self._buff_i)[0] - self._buff_i += 4 - elif b == 0xcf: - self._reserve(8) - obj = struct.unpack_from(">Q", self._buffer_view, self._buff_i)[0] - self._buff_i += 8 - elif b == 0xd0: - self._reserve(1) - obj = struct.unpack_from("b", self._buffer_view, self._buff_i)[0] - self._buff_i += 1 - elif b == 0xd1: - self._reserve(2) - obj = struct.unpack_from(">h", self._buffer_view, self._buff_i)[0] - self._buff_i += 2 - elif b == 0xd2: - self._reserve(4) - obj = struct.unpack_from(">i", self._buffer_view, self._buff_i)[0] - self._buff_i += 4 - elif b == 0xd3: - self._reserve(8) - obj = struct.unpack_from(">q", self._buffer_view, self._buff_i)[0] - self._buff_i += 8 - elif b == 0xd4: # fixext 1 - typ = TYPE_EXT - if self._max_ext_len < 1: - raise UnpackValueError("%s exceeds max_ext_len(%s)" % (1, self._max_ext_len)) - self._reserve(2) - n, obj = struct.unpack_from("b1s", self._buffer_view, self._buff_i) - self._buff_i += 2 - elif b == 0xd5: # fixext 2 - typ = TYPE_EXT - if self._max_ext_len < 2: - raise UnpackValueError("%s exceeds max_ext_len(%s)" % (2, self._max_ext_len)) - self._reserve(3) - n, obj = struct.unpack_from("b2s", self._buffer_view, self._buff_i) - self._buff_i += 3 - elif b == 0xd6: # fixext 4 - typ = TYPE_EXT - if self._max_ext_len < 4: - raise UnpackValueError("%s exceeds max_ext_len(%s)" % (4, self._max_ext_len)) - self._reserve(5) - n, obj = struct.unpack_from("b4s", self._buffer_view, self._buff_i) - self._buff_i += 5 - elif b == 0xd7: # fixext 8 - typ = TYPE_EXT - if self._max_ext_len < 8: - raise UnpackValueError("%s exceeds max_ext_len(%s)" % (8, self._max_ext_len)) - self._reserve(9) - n, obj = struct.unpack_from("b8s", self._buffer_view, self._buff_i) - self._buff_i += 9 - elif b == 0xd8: # fixext 16 - typ = TYPE_EXT - if self._max_ext_len < 16: - raise UnpackValueError("%s exceeds max_ext_len(%s)" % (16, self._max_ext_len)) - self._reserve(17) - n, obj = struct.unpack_from("b16s", self._buffer_view, self._buff_i) - self._buff_i += 17 - elif b == 0xd9: - typ = TYPE_RAW - self._reserve(1) - n = self._buffer[self._buff_i] - self._buff_i += 1 - if n > self._max_str_len: - raise UnpackValueError("%s exceeds max_str_len(%s)", n, self._max_str_len) - obj = self._read(n) - elif b == 0xda: - typ = TYPE_RAW - self._reserve(2) - n, = struct.unpack_from(">H", self._buffer_view, self._buff_i) - self._buff_i += 2 - if n > self._max_str_len: - raise UnpackValueError("%s exceeds max_str_len(%s)", n, self._max_str_len) - obj = self._read(n) - elif b == 0xdb: - typ = TYPE_RAW - self._reserve(4) - n, = struct.unpack_from(">I", self._buffer_view, self._buff_i) - self._buff_i += 4 - if n > self._max_str_len: - raise UnpackValueError("%s exceeds max_str_len(%s)", n, self._max_str_len) - obj = self._read(n) - elif b == 0xdc: - typ = TYPE_ARRAY - self._reserve(2) - n, = struct.unpack_from(">H", self._buffer_view, self._buff_i) - self._buff_i += 2 - if n > self._max_array_len: - raise UnpackValueError("%s exceeds max_array_len(%s)", n, self._max_array_len) - elif b == 0xdd: - typ = TYPE_ARRAY - self._reserve(4) - n, = struct.unpack_from(">I", self._buffer_view, self._buff_i) - self._buff_i += 4 - if n > self._max_array_len: - raise UnpackValueError("%s exceeds max_array_len(%s)", n, self._max_array_len) - elif b == 0xde: - self._reserve(2) - n, = struct.unpack_from(">H", self._buffer_view, self._buff_i) - self._buff_i += 2 - if n > self._max_map_len: - raise UnpackValueError("%s exceeds max_map_len(%s)", n, self._max_map_len) - typ = TYPE_MAP - elif b == 0xdf: - self._reserve(4) - n, = struct.unpack_from(">I", self._buffer_view, self._buff_i) - self._buff_i += 4 - if n > self._max_map_len: - raise UnpackValueError("%s exceeds max_map_len(%s)", n, self._max_map_len) - typ = TYPE_MAP - else: - raise UnpackValueError("Unknown header: 0x%x" % b) - return typ, n, obj - - def _unpack(self, execute=EX_CONSTRUCT): - typ, n, obj = self._read_header(execute) - - if execute == EX_READ_ARRAY_HEADER: - if typ != TYPE_ARRAY: - raise UnpackValueError("Expected array") - return n - if execute == EX_READ_MAP_HEADER: - if typ != TYPE_MAP: - raise UnpackValueError("Expected map") - return n - # TODO should we eliminate the recursion? - if typ == TYPE_ARRAY: - if execute == EX_SKIP: - for i in xrange(n): - # TODO check whether we need to call `list_hook` - self._unpack(EX_SKIP) - return - ret = newlist_hint(n) - for i in xrange(n): - ret.append(self._unpack(EX_CONSTRUCT)) - if self._list_hook is not None: - ret = self._list_hook(ret) - # TODO is the interaction between `list_hook` and `use_list` ok? - return ret if self._use_list else tuple(ret) - if typ == TYPE_MAP: - if execute == EX_SKIP: - for i in xrange(n): - # TODO check whether we need to call hooks - self._unpack(EX_SKIP) - self._unpack(EX_SKIP) - return - if self._object_pairs_hook is not None: - ret = self._object_pairs_hook( - (self._unpack(EX_CONSTRUCT), - self._unpack(EX_CONSTRUCT)) - for _ in xrange(n)) - else: - ret = {} - for _ in xrange(n): - key = self._unpack(EX_CONSTRUCT) - ret[key] = self._unpack(EX_CONSTRUCT) - if self._object_hook is not None: - ret = self._object_hook(ret) - return ret - if execute == EX_SKIP: - return - if typ == TYPE_RAW: - if self._encoding is not None: - obj = obj.decode(self._encoding, self._unicode_errors) - elif self._raw: - obj = bytes(obj) - else: - obj = obj.decode('utf_8') - return obj - if typ == TYPE_EXT: - return self._ext_hook(n, bytes(obj)) - if typ == TYPE_BIN: - return bytes(obj) - assert typ == TYPE_IMMEDIATE - return obj - - def __iter__(self): - return self - - def __next__(self): - try: - ret = self._unpack(EX_CONSTRUCT) - self._consume() - return ret - except OutOfData: - self._consume() - raise StopIteration - - next = __next__ - - def skip(self, write_bytes=None): - self._unpack(EX_SKIP) - if write_bytes is not None: - warnings.warn("`write_bytes` option is deprecated. Use `.tell()` instead.", DeprecationWarning) - write_bytes(self._buffer[self._buf_checkpoint:self._buff_i]) - self._consume() - - def unpack(self, write_bytes=None): - ret = self._unpack(EX_CONSTRUCT) - if write_bytes is not None: - warnings.warn("`write_bytes` option is deprecated. Use `.tell()` instead.", DeprecationWarning) - write_bytes(self._buffer[self._buf_checkpoint:self._buff_i]) - self._consume() - return ret - - def read_array_header(self, write_bytes=None): - ret = self._unpack(EX_READ_ARRAY_HEADER) - if write_bytes is not None: - warnings.warn("`write_bytes` option is deprecated. Use `.tell()` instead.", DeprecationWarning) - write_bytes(self._buffer[self._buf_checkpoint:self._buff_i]) - self._consume() - return ret - - def read_map_header(self, write_bytes=None): - ret = self._unpack(EX_READ_MAP_HEADER) - if write_bytes is not None: - warnings.warn("`write_bytes` option is deprecated. Use `.tell()` instead.", DeprecationWarning) - write_bytes(self._buffer[self._buf_checkpoint:self._buff_i]) - self._consume() - return ret - - def tell(self): - return self._stream_offset - - -class Packer(object): - """ - MessagePack Packer - - usage: - - packer = Packer() - astream.write(packer.pack(a)) - astream.write(packer.pack(b)) - - Packer's constructor has some keyword arguments: - - :param callable default: - Convert user type to builtin type that Packer supports. - See also simplejson's document. - - :param bool use_single_float: - Use single precision float type for float. (default: False) - - :param bool autoreset: - Reset buffer after each pack and return its content as `bytes`. (default: True). - If set this to false, use `bytes()` to get content and `.reset()` to clear buffer. - - :param bool use_bin_type: - Use bin type introduced in msgpack spec 2.0 for bytes. - It also enables str8 type for unicode. - - :param bool strict_types: - If set to true, types will be checked to be exact. Derived classes - from serializeable types will not be serialized and will be - treated as unsupported type and forwarded to default. - Additionally tuples will not be serialized as lists. - This is useful when trying to implement accurate serialization - for python types. - - :param str encoding: - (deprecated) Convert unicode to bytes with this encoding. (default: 'utf-8') - - :param str unicode_errors: - Error handler for encoding unicode. (default: 'strict') - """ - def __init__(self, default=None, encoding=None, unicode_errors=None, - use_single_float=False, autoreset=True, use_bin_type=False, - strict_types=False): - if encoding is None: - encoding = 'utf_8' - else: - warnings.warn( - "encoding is deprecated, Use raw=False instead.", - PendingDeprecationWarning) - - if unicode_errors is None: - unicode_errors = 'strict' - - self._strict_types = strict_types - self._use_float = use_single_float - self._autoreset = autoreset - self._use_bin_type = use_bin_type - self._encoding = encoding - self._unicode_errors = unicode_errors - self._buffer = StringIO() - if default is not None: - if not callable(default): - raise TypeError("default must be callable") - self._default = default - - def _pack(self, obj, nest_limit=DEFAULT_RECURSE_LIMIT, - check=isinstance, check_type_strict=_check_type_strict): - default_used = False - if self._strict_types: - check = check_type_strict - list_types = list - else: - list_types = (list, tuple) - while True: - if nest_limit < 0: - raise PackValueError("recursion limit exceeded") - if obj is None: - return self._buffer.write(b"\xc0") - if check(obj, bool): - if obj: - return self._buffer.write(b"\xc3") - return self._buffer.write(b"\xc2") - if check(obj, int_types): - if 0 <= obj < 0x80: - return self._buffer.write(struct.pack("B", obj)) - if -0x20 <= obj < 0: - return self._buffer.write(struct.pack("b", obj)) - if 0x80 <= obj <= 0xff: - return self._buffer.write(struct.pack("BB", 0xcc, obj)) - if -0x80 <= obj < 0: - return self._buffer.write(struct.pack(">Bb", 0xd0, obj)) - if 0xff < obj <= 0xffff: - return self._buffer.write(struct.pack(">BH", 0xcd, obj)) - if -0x8000 <= obj < -0x80: - return self._buffer.write(struct.pack(">Bh", 0xd1, obj)) - if 0xffff < obj <= 0xffffffff: - return self._buffer.write(struct.pack(">BI", 0xce, obj)) - if -0x80000000 <= obj < -0x8000: - return self._buffer.write(struct.pack(">Bi", 0xd2, obj)) - if 0xffffffff < obj <= 0xffffffffffffffff: - return self._buffer.write(struct.pack(">BQ", 0xcf, obj)) - if -0x8000000000000000 <= obj < -0x80000000: - return self._buffer.write(struct.pack(">Bq", 0xd3, obj)) - if not default_used and self._default is not None: - obj = self._default(obj) - default_used = True - continue - raise PackOverflowError("Integer value out of range") - if check(obj, (bytes, bytearray)): - n = len(obj) - if n >= 2**32: - raise PackValueError("%s is too large" % type(obj).__name__) - self._pack_bin_header(n) - return self._buffer.write(obj) - if check(obj, Unicode): - if self._encoding is None: - raise TypeError( - "Can't encode unicode string: " - "no encoding is specified") - obj = obj.encode(self._encoding, self._unicode_errors) - n = len(obj) - if n >= 2**32: - raise PackValueError("String is too large") - self._pack_raw_header(n) - return self._buffer.write(obj) - if check(obj, memoryview): - n = len(obj) * obj.itemsize - if n >= 2**32: - raise PackValueError("Memoryview is too large") - self._pack_bin_header(n) - return self._buffer.write(obj) - if check(obj, float): - if self._use_float: - return self._buffer.write(struct.pack(">Bf", 0xca, obj)) - return self._buffer.write(struct.pack(">Bd", 0xcb, obj)) - if check(obj, ExtType): - code = obj.code - data = obj.data - assert isinstance(code, int) - assert isinstance(data, bytes) - L = len(data) - if L == 1: - self._buffer.write(b'\xd4') - elif L == 2: - self._buffer.write(b'\xd5') - elif L == 4: - self._buffer.write(b'\xd6') - elif L == 8: - self._buffer.write(b'\xd7') - elif L == 16: - self._buffer.write(b'\xd8') - elif L <= 0xff: - self._buffer.write(struct.pack(">BB", 0xc7, L)) - elif L <= 0xffff: - self._buffer.write(struct.pack(">BH", 0xc8, L)) - else: - self._buffer.write(struct.pack(">BI", 0xc9, L)) - self._buffer.write(struct.pack("b", code)) - self._buffer.write(data) - return - if check(obj, list_types): - n = len(obj) - self._pack_array_header(n) - for i in xrange(n): - self._pack(obj[i], nest_limit - 1) - return - if check(obj, dict): - return self._pack_map_pairs(len(obj), dict_iteritems(obj), - nest_limit - 1) - if not default_used and self._default is not None: - obj = self._default(obj) - default_used = 1 - continue - raise TypeError("Cannot serialize %r" % (obj, )) - - def pack(self, obj): - try: - self._pack(obj) - except: - self._buffer = StringIO() # force reset - raise - ret = self._buffer.getvalue() - if self._autoreset: - self._buffer = StringIO() - elif USING_STRINGBUILDER: - self._buffer = StringIO(ret) - return ret - - def pack_map_pairs(self, pairs): - self._pack_map_pairs(len(pairs), pairs) - ret = self._buffer.getvalue() - if self._autoreset: - self._buffer = StringIO() - elif USING_STRINGBUILDER: - self._buffer = StringIO(ret) - return ret - - def pack_array_header(self, n): - if n >= 2**32: - raise PackValueError - self._pack_array_header(n) - ret = self._buffer.getvalue() - if self._autoreset: - self._buffer = StringIO() - elif USING_STRINGBUILDER: - self._buffer = StringIO(ret) - return ret - - def pack_map_header(self, n): - if n >= 2**32: - raise PackValueError - self._pack_map_header(n) - ret = self._buffer.getvalue() - if self._autoreset: - self._buffer = StringIO() - elif USING_STRINGBUILDER: - self._buffer = StringIO(ret) - return ret - - def pack_ext_type(self, typecode, data): - if not isinstance(typecode, int): - raise TypeError("typecode must have int type.") - if not 0 <= typecode <= 127: - raise ValueError("typecode should be 0-127") - if not isinstance(data, bytes): - raise TypeError("data must have bytes type") - L = len(data) - if L > 0xffffffff: - raise PackValueError("Too large data") - if L == 1: - self._buffer.write(b'\xd4') - elif L == 2: - self._buffer.write(b'\xd5') - elif L == 4: - self._buffer.write(b'\xd6') - elif L == 8: - self._buffer.write(b'\xd7') - elif L == 16: - self._buffer.write(b'\xd8') - elif L <= 0xff: - self._buffer.write(b'\xc7' + struct.pack('B', L)) - elif L <= 0xffff: - self._buffer.write(b'\xc8' + struct.pack('>H', L)) - else: - self._buffer.write(b'\xc9' + struct.pack('>I', L)) - self._buffer.write(struct.pack('B', typecode)) - self._buffer.write(data) - - def _pack_array_header(self, n): - if n <= 0x0f: - return self._buffer.write(struct.pack('B', 0x90 + n)) - if n <= 0xffff: - return self._buffer.write(struct.pack(">BH", 0xdc, n)) - if n <= 0xffffffff: - return self._buffer.write(struct.pack(">BI", 0xdd, n)) - raise PackValueError("Array is too large") - - def _pack_map_header(self, n): - if n <= 0x0f: - return self._buffer.write(struct.pack('B', 0x80 + n)) - if n <= 0xffff: - return self._buffer.write(struct.pack(">BH", 0xde, n)) - if n <= 0xffffffff: - return self._buffer.write(struct.pack(">BI", 0xdf, n)) - raise PackValueError("Dict is too large") - - def _pack_map_pairs(self, n, pairs, nest_limit=DEFAULT_RECURSE_LIMIT): - self._pack_map_header(n) - for (k, v) in pairs: - self._pack(k, nest_limit - 1) - self._pack(v, nest_limit - 1) - - def _pack_raw_header(self, n): - if n <= 0x1f: - self._buffer.write(struct.pack('B', 0xa0 + n)) - elif self._use_bin_type and n <= 0xff: - self._buffer.write(struct.pack('>BB', 0xd9, n)) - elif n <= 0xffff: - self._buffer.write(struct.pack(">BH", 0xda, n)) - elif n <= 0xffffffff: - self._buffer.write(struct.pack(">BI", 0xdb, n)) - else: - raise PackValueError('Raw is too large') - - def _pack_bin_header(self, n): - if not self._use_bin_type: - return self._pack_raw_header(n) - elif n <= 0xff: - return self._buffer.write(struct.pack('>BB', 0xc4, n)) - elif n <= 0xffff: - return self._buffer.write(struct.pack(">BH", 0xc5, n)) - elif n <= 0xffffffff: - return self._buffer.write(struct.pack(">BI", 0xc6, n)) - else: - raise PackValueError('Bin is too large') - - def bytes(self): - return self._buffer.getvalue() - - def reset(self): - self._buffer = StringIO() diff --git a/env/lib/python3.7/site-packages/pip/_vendor/packaging/__about__.py b/env/lib/python3.7/site-packages/pip/_vendor/packaging/__about__.py deleted file mode 100644 index 7481c9e..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/packaging/__about__.py +++ /dev/null @@ -1,27 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -__all__ = [ - "__title__", - "__summary__", - "__uri__", - "__version__", - "__author__", - "__email__", - "__license__", - "__copyright__", -] - -__title__ = "packaging" -__summary__ = "Core utilities for Python packages" -__uri__ = "https://github.com/pypa/packaging" - -__version__ = "19.0" - -__author__ = "Donald Stufft and individual contributors" -__email__ = "donald@stufft.io" - -__license__ = "BSD or Apache License, Version 2.0" -__copyright__ = "Copyright 2014-2019 %s" % __author__ diff --git a/env/lib/python3.7/site-packages/pip/_vendor/packaging/__init__.py b/env/lib/python3.7/site-packages/pip/_vendor/packaging/__init__.py deleted file mode 100644 index a0cf67d..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/packaging/__init__.py +++ /dev/null @@ -1,26 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -from .__about__ import ( - __author__, - __copyright__, - __email__, - __license__, - __summary__, - __title__, - __uri__, - __version__, -) - -__all__ = [ - "__title__", - "__summary__", - "__uri__", - "__version__", - "__author__", - "__email__", - "__license__", - "__copyright__", -] diff --git a/env/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-37.pyc deleted file mode 100644 index d578a5a760537e007e9f748a2a4c7375f58c8cd9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 688 zcmYk4OKTf35P<jL$NH7H4?>S>pa(<ajYBUfrMO9sr34H;2#Q$mXuYDl(pC@C_222K zf63Qg+P~0KM>ZkVppThhG@}{mW-=KDxa5x)Uw%hH@XH$yD?w$6+uS1{fUpYckcM?c zqdKN>7(fIubf618=tBa7O+q^`q+J-%9*k)pCNzN)I)GC;gee`t6FxW#=op@^g4we_ zm^GNi`_pV~ROKvZqHdJ7`vk;R7@_3;q|riJRydhkZx0x=!d9HI{fIH+>N?Xc8hyr` z7Dw-vYkwAvA!C`drP8S5NnU57I>uBY=hFBz6UK7Yv|4OR>%*EX|C()t-0aS8mFC1* zQ3)%!A%)W9zQuHs9D}&oy)3P5%-b~G2wS@KJXdwvv`v;irs*uM=a;+LoswAvWMy4Z zSdvK~Li#qrWfjSlv|6m4Rod*Pa0p$RL+D(n-TBSxj$ri<n6>2O<MHyZ$>(FI<O&O% z-9B_dt}YjEE)dt`mH9NA_%RgDI*sjWeBwaI9vy_ATUOyrbl1Cj9(@o0@_OLme}^7< zj1fNrJ@vZB-(_m+CT&D>A*8XG=K{X9^82DFz4NfymP=6jaU3ZYTq}p8o;U42c~>iN Y6@Tw9V+i7T9EJZ&FYbgW5sGK{54eZOaR2}S diff --git a/env/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 8ff90c3e0c9dfb3520f8d66ded91189934afb264..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 526 zcmYk2O-{ow5QUwjZT>+Z794>tpn^35!~xjA$`TrdI&Cd7PH^mso`)4z%9d5Hz>1kx zAZ+=Q$DWz@H1}nh30mgk^!X|j;){ddmC)smPX9zuLIsV$Kn57f5F;4{LWL@7MmUyZ zoX82rGR8zEn93A0nPDz-EM!4>BQ;hN6{|$0DpUC~k)<jg#kAZ~XEBY2!|J7P8}Dk+ z*tOOTiPCG`>(&ehoz=#{!kf9HcpGp<GGqXicdOO{3?;z4?KV~~SB}CIpvFo!bj<-8 zJ+Dn)?}OeWR(7*ba@sZg9s_u*_X+FTvMPYhNyqYVY{4iQ69$jPri_^IFg;)|3-7$8 zW|oF1Y{VE5*h}@&da|`I=8}IMcKvrse<EzBYRLSjut%KD_`aPv>}H+r&b8?s{hzD1 zjd{OZtoU(vU|k#4+F4i4U#q1y%Nc++nxrqf&5&GUt9(=6u&w@>a1x#sVeo(d02Bj< AZvX%Q diff --git a/env/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/_compat.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/_compat.cpython-37.pyc deleted file mode 100644 index 0cb896495ab12ec21c6b7b3edd9f2d4ff5b62a11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 966 zcmah{OK%e~5cVs{Hl*o+s^WDB7o<Hj5pb<41W4Q}BqStOLYBLB+NJxd?X;vSr&elz z28a`X$yZMO3!Ip7+EB!Sk!CzIw!isi?3b&neF9Q{zxPpbLVjX!BMh7upzb{wO*Ab@ zMKfBlj8#126mzT;nK0s0N0a+R^8=Q3myv*|XL|OvNv1Sgsk^3+tM2ITImzy5_Ku{z zE5Ifx4{K`IHRa43SyXLfeMoe1RJfw4!?3kQ?d5b<=N{snD<pOWY)MY>HV6h?&>pCJ z0_F|5AQyDXG}Y`p(d?3*@h{Aiuk@5@u0=t<2`Jw=ne;~>udGqtjMQjXIWx*j<=p7F z@cWRdj8`!+jwf>fUka8*aSy;4l2J`EcDr!KHHR|d<T0YjKUiC3ldIBgkC&-jL?}XV zMZF8^24F7fDZM18{0yP!&JVx~JTF}kwW>_$`~AX6B<=#$DGQy2FA&<|M1E~geAQ0c zqTMWN=T%v5>ce^c`RQ~YlTqc7sdZx~t;!G7UQzE&WZqP*^5b?MdQ#TrSjtC838zo! zN&4T8#@DxYfNugmkd-p@rK}n~E72cFc{o$$V#lrlZseOXi+$VGn}i*L7gm<DdI(|U zkx+|c3TxiruTgd`<6B+B1mWkciNGmez(ruZ^KYeCWcYVm>sTqiOm9Qj4T#bKwlJOf znS~ZCPQ&6quy`tPH+NxhWGwz%S=7@e@V6hHp?MCQ-i84f7_UTTF7)GD#Y{wxtZtde YDcM>~Y#U2BOs%to59v?{ny@ba4G0PF=l}o! diff --git a/env/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-37.pyc deleted file mode 100644 index 97a26ecf808f787fb5a0a3c0316f3f25656423d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2818 zcmcIm&2Q5%6t|NmO}lRGK42TtByLclt(t^{gaB0ofw=U-PLYt6#crFCrk&$XY}&0m z@PBaPU&@se{{ko8a~o)<gp`lDvR~q7`}aQle$CP9YL!5XKJUE$WD)WeU(!~Bhc@*1 z6%3qk8j=BZ>A-M}f$5r*ydm7+<~8A_C{0Y)64r#c7R;8o1+$i(wS^6{Hn-oAX89YO zM4Dz&_fFzrI97rMgV9i`#Nokt5C_93SsTe9Qmi|Ud<E}5?ns*f4{hl2F${vZloQwB zlpEK?HMz-4AOV}(AT3_z4oI6<cok%sukad3hp+NAkQH9%4Ukp7&No1=@J+CAD{<aN z-5?6og--zl8%pdip~n~$PGP0dkq|KQg*0hWibdF!HoWTL`%y~`My*jW+7F^wd11KE z&n}{mhuuC->dwwZ#D}sq^8628FNk_A7AraS)mV!7V04i<j7c$)j5!F4o)dbxo*H+M zY8R|DVUf171`moTdPOF5g4WVb(@08vFYYHLJhn+?8P@!=St1OA;u^+Q;4KSus`a%w zumojRXkP1sn}!BStfA@)c@xWKEL4oG%^}t2+(X@;;mB1uDhow0ww{Lqx&@RQA-sYR zp3;ethOi2k6jK`cBB{XE(2HZnW{&0=AkG-u$}s?S*#=->6iE%Jk(mjyfnK6N1*j3Y zww;5Dx&_p%Bp%NvG0(Rir0HG`3hMq73fQ}shl0MK{n$`0_@ZWUqe-J9dY%f-MS96{ zYM{(mBzlb9hojOGXrz0f?zFPgtYNW4-T=^(Dr18oABXr{W9)3~g;R~Jz#$T=QDQn} z9fu7ZHgUj9A@AUTiJH5*no6)DHOFA3#<<I&j=A{LdLL9j8<u1n`Ym##ybI^&hkQnl zmzDiAYSW99NjW+~57A!DDfDvpW}5zn>LmWFNhGoCB<qwsDnMP5>k7+6r~Y6LY&*ln zrRc603NP4U5fm1Tjy5br`FqY=ig5I$ep~>2J6xwr=}7_fQiQkgua!l3x?rCcKrO|3 z#ZX8K&x@dzqdrX%Ifa14)1HIb$+(*-<H;RZD0gu{%KvwALmqhmJ&)W_-)WYSU%O-c tGJ>xjys#2)ti(^T#2%iU3SVg#H7{kcXyQDZ^79Ma6C<&1nT<Ug`VWMd?vnrj diff --git a/env/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-37.pyc deleted file mode 100644 index 29ebeff30a3fecd20e022f5d14c9c3df98168f86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8821 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 C>A%nb diff --git a/env/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-37.pyc deleted file mode 100644 index 3993a9cd081febbd3e0451831761448c31e450bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3939 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc deleted file mode 100644 index f80886b15647e9ccc46ae9e32d8a0c0483b2c2e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19716 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 Vzh>Bz&lXGg{+cma;$E+*{|3Wz&|&}p diff --git a/env/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-37.pyc deleted file mode 100644 index 099d1419ca200694f39194be85dc9ddda169b252..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1404 zcmbVML2n~96t+E+naMQCF1rPR#9=^)-Kcb0?p1{rE^z2&(SiciXc{}oq%)pb+ew>{ zURcijhD4m;hwvkOgwskKIQPVRZdxefgf;Kke((ADz4txOvu-ygFyv2fpZ?h*<agZM z4i6Te0O>D)al&ayDmtJQ8?ee7cob!<^anooxL>xaU=UQ{Af!b2>xj2DbkODj4}Tzo zm`A(~^A2avNk4uK{z%`m5Arizmop=>qH1boY{ZLsp^IADUZV<Wve8Tq4eU=|Q#`_K z?{hiN%YwfU%Grh6#WMJ2KTA*dhG>TaXCLTOApH=SA#2L%ifq`LZ3u+HPOj-bMDaKq z=CYQ>5d1Dhro>oWT2If;Y^$s<gz8i4%e)dl6V(Mj*GC7YY7UyB*)OCvd0FoBmkW9M z@o0iVN7-CRUaNy9AD-vqLXHn+rYLpVEbJTiE<?XPjF15%Og#X8mjcQV9hbr%uvl~q zS&>)tihM=nu1^d-k5xh;R|@jy<ZCh}SCHbAaeD5lXDhn)I9vND+0YFIE0CDhIzYsD zYaQO;1N!JQ@C!Dcvm(<rkIvibN9Vx@yEftocI~Yl`XW=n6|8=7R<XM$-rhr|J5Kkj z)9pCj&YiB~biX-W$LTsZIu3WOAP#`1yZk;*V0<|#bOPU8s70cSswi`nm^#@4pJtgh zD$71f&SoZ=<T|OPNB})kii8)Vkx)Vog?7F!3NuN}L?jpaA}P>Z@=|CgQlb>OhNEI! z329PyKw%p#{qGL1-dl!GzfBMOdmmV0X?hPNd?*^}Enq8h+Pk6v6n#Zs05C5Z$8Mu1 z&_^DG3Qf$?LrX7RH{CF7f$R3sSV(c%sN*N-3(@z<^2xn^fg)hrr$=QC?W&K{yE7;M zD<bs>Zs{}i7$&ug3|su~pwyeN-2=J}CrX=I8>q)JOu3lj!ruel@2U__2Ec4fH1%*| zgS=_r9oS%0t135^DWR~Rtv{^`X~S*Bt=A}Fee`QR@QKe3l7l*h+jMQK$(7Onip}o+ zS7|U4{XQ@fFxsI#7BJt7=_CI`;P2w<mY71be#gcc{AbKei7ZoCb%l5;{CTK%kR`}4 vF_)qZhjrByrBH1Y;fr;S{t=z4A!2HyqpIe!QXHc<jmht_h&}XTFKYb-0Z>>x diff --git a/env/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-37.pyc deleted file mode 100644 index 73487e9e27ba6c0650daf2cc89da7163f9877963..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11908 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/packaging/_compat.py b/env/lib/python3.7/site-packages/pip/_vendor/packaging/_compat.py deleted file mode 100644 index 25da473..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/packaging/_compat.py +++ /dev/null @@ -1,31 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -import sys - - -PY2 = sys.version_info[0] == 2 -PY3 = sys.version_info[0] == 3 - -# flake8: noqa - -if PY3: - string_types = (str,) -else: - string_types = (basestring,) - - -def with_metaclass(meta, *bases): - """ - Create a base class with a metaclass. - """ - # This requires a bit of explanation: the basic idea is to make a dummy - # metaclass for one level of class instantiation that replaces itself with - # the actual metaclass. - class metaclass(meta): - def __new__(cls, name, this_bases, d): - return meta(name, bases, d) - - return type.__new__(metaclass, "temporary_class", (), {}) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/packaging/_structures.py b/env/lib/python3.7/site-packages/pip/_vendor/packaging/_structures.py deleted file mode 100644 index 68dcca6..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/packaging/_structures.py +++ /dev/null @@ -1,68 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - - -class Infinity(object): - def __repr__(self): - return "Infinity" - - def __hash__(self): - return hash(repr(self)) - - def __lt__(self, other): - return False - - def __le__(self, other): - return False - - def __eq__(self, other): - return isinstance(other, self.__class__) - - def __ne__(self, other): - return not isinstance(other, self.__class__) - - def __gt__(self, other): - return True - - def __ge__(self, other): - return True - - def __neg__(self): - return NegativeInfinity - - -Infinity = Infinity() - - -class NegativeInfinity(object): - def __repr__(self): - return "-Infinity" - - def __hash__(self): - return hash(repr(self)) - - def __lt__(self, other): - return True - - def __le__(self, other): - return True - - def __eq__(self, other): - return isinstance(other, self.__class__) - - def __ne__(self, other): - return not isinstance(other, self.__class__) - - def __gt__(self, other): - return False - - def __ge__(self, other): - return False - - def __neg__(self): - return Infinity - - -NegativeInfinity = NegativeInfinity() diff --git a/env/lib/python3.7/site-packages/pip/_vendor/packaging/markers.py b/env/lib/python3.7/site-packages/pip/_vendor/packaging/markers.py deleted file mode 100644 index 5482476..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/packaging/markers.py +++ /dev/null @@ -1,296 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -import operator -import os -import platform -import sys - -from pip._vendor.pyparsing import ParseException, ParseResults, stringStart, stringEnd -from pip._vendor.pyparsing import ZeroOrMore, Group, Forward, QuotedString -from pip._vendor.pyparsing import Literal as L # noqa - -from ._compat import string_types -from .specifiers import Specifier, InvalidSpecifier - - -__all__ = [ - "InvalidMarker", - "UndefinedComparison", - "UndefinedEnvironmentName", - "Marker", - "default_environment", -] - - -class InvalidMarker(ValueError): - """ - An invalid marker was found, users should refer to PEP 508. - """ - - -class UndefinedComparison(ValueError): - """ - An invalid operation was attempted on a value that doesn't support it. - """ - - -class UndefinedEnvironmentName(ValueError): - """ - A name was attempted to be used that does not exist inside of the - environment. - """ - - -class Node(object): - def __init__(self, value): - self.value = value - - def __str__(self): - return str(self.value) - - def __repr__(self): - return "<{0}({1!r})>".format(self.__class__.__name__, str(self)) - - def serialize(self): - raise NotImplementedError - - -class Variable(Node): - def serialize(self): - return str(self) - - -class Value(Node): - def serialize(self): - return '"{0}"'.format(self) - - -class Op(Node): - def serialize(self): - return str(self) - - -VARIABLE = ( - L("implementation_version") - | L("platform_python_implementation") - | L("implementation_name") - | L("python_full_version") - | L("platform_release") - | L("platform_version") - | L("platform_machine") - | L("platform_system") - | L("python_version") - | L("sys_platform") - | L("os_name") - | L("os.name") - | L("sys.platform") # PEP-345 - | L("platform.version") # PEP-345 - | L("platform.machine") # PEP-345 - | L("platform.python_implementation") # PEP-345 - | L("python_implementation") # PEP-345 - | L("extra") # undocumented setuptools legacy -) -ALIASES = { - "os.name": "os_name", - "sys.platform": "sys_platform", - "platform.version": "platform_version", - "platform.machine": "platform_machine", - "platform.python_implementation": "platform_python_implementation", - "python_implementation": "platform_python_implementation", -} -VARIABLE.setParseAction(lambda s, l, t: Variable(ALIASES.get(t[0], t[0]))) - -VERSION_CMP = ( - L("===") | L("==") | L(">=") | L("<=") | L("!=") | L("~=") | L(">") | L("<") -) - -MARKER_OP = VERSION_CMP | L("not in") | L("in") -MARKER_OP.setParseAction(lambda s, l, t: Op(t[0])) - -MARKER_VALUE = QuotedString("'") | QuotedString('"') -MARKER_VALUE.setParseAction(lambda s, l, t: Value(t[0])) - -BOOLOP = L("and") | L("or") - -MARKER_VAR = VARIABLE | MARKER_VALUE - -MARKER_ITEM = Group(MARKER_VAR + MARKER_OP + MARKER_VAR) -MARKER_ITEM.setParseAction(lambda s, l, t: tuple(t[0])) - -LPAREN = L("(").suppress() -RPAREN = L(")").suppress() - -MARKER_EXPR = Forward() -MARKER_ATOM = MARKER_ITEM | Group(LPAREN + MARKER_EXPR + RPAREN) -MARKER_EXPR << MARKER_ATOM + ZeroOrMore(BOOLOP + MARKER_EXPR) - -MARKER = stringStart + MARKER_EXPR + stringEnd - - -def _coerce_parse_result(results): - if isinstance(results, ParseResults): - return [_coerce_parse_result(i) for i in results] - else: - return results - - -def _format_marker(marker, first=True): - assert isinstance(marker, (list, tuple, string_types)) - - # Sometimes we have a structure like [[...]] which is a single item list - # where the single item is itself it's own list. In that case we want skip - # the rest of this function so that we don't get extraneous () on the - # outside. - if ( - isinstance(marker, list) - and len(marker) == 1 - and isinstance(marker[0], (list, tuple)) - ): - return _format_marker(marker[0]) - - if isinstance(marker, list): - inner = (_format_marker(m, first=False) for m in marker) - if first: - return " ".join(inner) - else: - return "(" + " ".join(inner) + ")" - elif isinstance(marker, tuple): - return " ".join([m.serialize() for m in marker]) - else: - return marker - - -_operators = { - "in": lambda lhs, rhs: lhs in rhs, - "not in": lambda lhs, rhs: lhs not in rhs, - "<": operator.lt, - "<=": operator.le, - "==": operator.eq, - "!=": operator.ne, - ">=": operator.ge, - ">": operator.gt, -} - - -def _eval_op(lhs, op, rhs): - try: - spec = Specifier("".join([op.serialize(), rhs])) - except InvalidSpecifier: - pass - else: - return spec.contains(lhs) - - oper = _operators.get(op.serialize()) - if oper is None: - raise UndefinedComparison( - "Undefined {0!r} on {1!r} and {2!r}.".format(op, lhs, rhs) - ) - - return oper(lhs, rhs) - - -_undefined = object() - - -def _get_env(environment, name): - value = environment.get(name, _undefined) - - if value is _undefined: - raise UndefinedEnvironmentName( - "{0!r} does not exist in evaluation environment.".format(name) - ) - - return value - - -def _evaluate_markers(markers, environment): - groups = [[]] - - for marker in markers: - assert isinstance(marker, (list, tuple, string_types)) - - if isinstance(marker, list): - groups[-1].append(_evaluate_markers(marker, environment)) - elif isinstance(marker, tuple): - lhs, op, rhs = marker - - if isinstance(lhs, Variable): - lhs_value = _get_env(environment, lhs.value) - rhs_value = rhs.value - else: - lhs_value = lhs.value - rhs_value = _get_env(environment, rhs.value) - - groups[-1].append(_eval_op(lhs_value, op, rhs_value)) - else: - assert marker in ["and", "or"] - if marker == "or": - groups.append([]) - - return any(all(item) for item in groups) - - -def format_full_version(info): - version = "{0.major}.{0.minor}.{0.micro}".format(info) - kind = info.releaselevel - if kind != "final": - version += kind[0] + str(info.serial) - return version - - -def default_environment(): - if hasattr(sys, "implementation"): - iver = format_full_version(sys.implementation.version) - implementation_name = sys.implementation.name - else: - iver = "0" - implementation_name = "" - - return { - "implementation_name": implementation_name, - "implementation_version": iver, - "os_name": os.name, - "platform_machine": platform.machine(), - "platform_release": platform.release(), - "platform_system": platform.system(), - "platform_version": platform.version(), - "python_full_version": platform.python_version(), - "platform_python_implementation": platform.python_implementation(), - "python_version": platform.python_version()[:3], - "sys_platform": sys.platform, - } - - -class Marker(object): - def __init__(self, marker): - try: - self._markers = _coerce_parse_result(MARKER.parseString(marker)) - except ParseException as e: - err_str = "Invalid marker: {0!r}, parse error at {1!r}".format( - marker, marker[e.loc : e.loc + 8] - ) - raise InvalidMarker(err_str) - - def __str__(self): - return _format_marker(self._markers) - - def __repr__(self): - return "<Marker({0!r})>".format(str(self)) - - def evaluate(self, environment=None): - """Evaluate a marker. - - Return the boolean from evaluating the given marker against the - environment. environment is an optional argument to override all or - part of the determined environment. - - The environment is determined from the current Python process. - """ - current_environment = default_environment() - if environment is not None: - current_environment.update(environment) - - return _evaluate_markers(self._markers, current_environment) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/packaging/requirements.py b/env/lib/python3.7/site-packages/pip/_vendor/packaging/requirements.py deleted file mode 100644 index dbc5f11..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/packaging/requirements.py +++ /dev/null @@ -1,138 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -import string -import re - -from pip._vendor.pyparsing import stringStart, stringEnd, originalTextFor, ParseException -from pip._vendor.pyparsing import ZeroOrMore, Word, Optional, Regex, Combine -from pip._vendor.pyparsing import Literal as L # noqa -from pip._vendor.six.moves.urllib import parse as urlparse - -from .markers import MARKER_EXPR, Marker -from .specifiers import LegacySpecifier, Specifier, SpecifierSet - - -class InvalidRequirement(ValueError): - """ - An invalid requirement was found, users should refer to PEP 508. - """ - - -ALPHANUM = Word(string.ascii_letters + string.digits) - -LBRACKET = L("[").suppress() -RBRACKET = L("]").suppress() -LPAREN = L("(").suppress() -RPAREN = L(")").suppress() -COMMA = L(",").suppress() -SEMICOLON = L(";").suppress() -AT = L("@").suppress() - -PUNCTUATION = Word("-_.") -IDENTIFIER_END = ALPHANUM | (ZeroOrMore(PUNCTUATION) + ALPHANUM) -IDENTIFIER = Combine(ALPHANUM + ZeroOrMore(IDENTIFIER_END)) - -NAME = IDENTIFIER("name") -EXTRA = IDENTIFIER - -URI = Regex(r"[^ ]+")("url") -URL = AT + URI - -EXTRAS_LIST = EXTRA + ZeroOrMore(COMMA + EXTRA) -EXTRAS = (LBRACKET + Optional(EXTRAS_LIST) + RBRACKET)("extras") - -VERSION_PEP440 = Regex(Specifier._regex_str, re.VERBOSE | re.IGNORECASE) -VERSION_LEGACY = Regex(LegacySpecifier._regex_str, re.VERBOSE | re.IGNORECASE) - -VERSION_ONE = VERSION_PEP440 ^ VERSION_LEGACY -VERSION_MANY = Combine( - VERSION_ONE + ZeroOrMore(COMMA + VERSION_ONE), joinString=",", adjacent=False -)("_raw_spec") -_VERSION_SPEC = Optional(((LPAREN + VERSION_MANY + RPAREN) | VERSION_MANY)) -_VERSION_SPEC.setParseAction(lambda s, l, t: t._raw_spec or "") - -VERSION_SPEC = originalTextFor(_VERSION_SPEC)("specifier") -VERSION_SPEC.setParseAction(lambda s, l, t: t[1]) - -MARKER_EXPR = originalTextFor(MARKER_EXPR())("marker") -MARKER_EXPR.setParseAction( - lambda s, l, t: Marker(s[t._original_start : t._original_end]) -) -MARKER_SEPARATOR = SEMICOLON -MARKER = MARKER_SEPARATOR + MARKER_EXPR - -VERSION_AND_MARKER = VERSION_SPEC + Optional(MARKER) -URL_AND_MARKER = URL + Optional(MARKER) - -NAMED_REQUIREMENT = NAME + Optional(EXTRAS) + (URL_AND_MARKER | VERSION_AND_MARKER) - -REQUIREMENT = stringStart + NAMED_REQUIREMENT + stringEnd -# pyparsing isn't thread safe during initialization, so we do it eagerly, see -# issue #104 -REQUIREMENT.parseString("x[]") - - -class Requirement(object): - """Parse a requirement. - - Parse a given requirement string into its parts, such as name, specifier, - URL, and extras. Raises InvalidRequirement on a badly-formed requirement - string. - """ - - # TODO: Can we test whether something is contained within a requirement? - # If so how do we do that? Do we need to test against the _name_ of - # the thing as well as the version? What about the markers? - # TODO: Can we normalize the name and extra name? - - def __init__(self, requirement_string): - try: - req = REQUIREMENT.parseString(requirement_string) - except ParseException as e: - raise InvalidRequirement( - 'Parse error at "{0!r}": {1}'.format( - requirement_string[e.loc : e.loc + 8], e.msg - ) - ) - - self.name = req.name - if req.url: - parsed_url = urlparse.urlparse(req.url) - if parsed_url.scheme == "file": - if urlparse.urlunparse(parsed_url) != req.url: - raise InvalidRequirement("Invalid URL given") - elif not (parsed_url.scheme and parsed_url.netloc) or ( - not parsed_url.scheme and not parsed_url.netloc - ): - raise InvalidRequirement("Invalid URL: {0}".format(req.url)) - self.url = req.url - else: - self.url = None - self.extras = set(req.extras.asList() if req.extras else []) - self.specifier = SpecifierSet(req.specifier) - self.marker = req.marker if req.marker else None - - def __str__(self): - parts = [self.name] - - if self.extras: - parts.append("[{0}]".format(",".join(sorted(self.extras)))) - - if self.specifier: - parts.append(str(self.specifier)) - - if self.url: - parts.append("@ {0}".format(self.url)) - if self.marker: - parts.append(" ") - - if self.marker: - parts.append("; {0}".format(self.marker)) - - return "".join(parts) - - def __repr__(self): - return "<Requirement({0!r})>".format(str(self)) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/packaging/specifiers.py b/env/lib/python3.7/site-packages/pip/_vendor/packaging/specifiers.py deleted file mode 100644 index 743576a..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/packaging/specifiers.py +++ /dev/null @@ -1,749 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -import abc -import functools -import itertools -import re - -from ._compat import string_types, with_metaclass -from .version import Version, LegacyVersion, parse - - -class InvalidSpecifier(ValueError): - """ - An invalid specifier was found, users should refer to PEP 440. - """ - - -class BaseSpecifier(with_metaclass(abc.ABCMeta, object)): - @abc.abstractmethod - def __str__(self): - """ - Returns the str representation of this Specifier like object. This - should be representative of the Specifier itself. - """ - - @abc.abstractmethod - def __hash__(self): - """ - Returns a hash value for this Specifier like object. - """ - - @abc.abstractmethod - def __eq__(self, other): - """ - Returns a boolean representing whether or not the two Specifier like - objects are equal. - """ - - @abc.abstractmethod - def __ne__(self, other): - """ - Returns a boolean representing whether or not the two Specifier like - objects are not equal. - """ - - @abc.abstractproperty - def prereleases(self): - """ - Returns whether or not pre-releases as a whole are allowed by this - specifier. - """ - - @prereleases.setter - def prereleases(self, value): - """ - Sets whether or not pre-releases as a whole are allowed by this - specifier. - """ - - @abc.abstractmethod - def contains(self, item, prereleases=None): - """ - Determines if the given item is contained within this specifier. - """ - - @abc.abstractmethod - def filter(self, iterable, prereleases=None): - """ - Takes an iterable of items and filters them so that only items which - are contained within this specifier are allowed in it. - """ - - -class _IndividualSpecifier(BaseSpecifier): - - _operators = {} - - def __init__(self, spec="", prereleases=None): - match = self._regex.search(spec) - if not match: - raise InvalidSpecifier("Invalid specifier: '{0}'".format(spec)) - - self._spec = (match.group("operator").strip(), match.group("version").strip()) - - # Store whether or not this Specifier should accept prereleases - self._prereleases = prereleases - - def __repr__(self): - pre = ( - ", prereleases={0!r}".format(self.prereleases) - if self._prereleases is not None - else "" - ) - - return "<{0}({1!r}{2})>".format(self.__class__.__name__, str(self), pre) - - def __str__(self): - return "{0}{1}".format(*self._spec) - - def __hash__(self): - return hash(self._spec) - - def __eq__(self, other): - if isinstance(other, string_types): - try: - other = self.__class__(other) - except InvalidSpecifier: - return NotImplemented - elif not isinstance(other, self.__class__): - return NotImplemented - - return self._spec == other._spec - - def __ne__(self, other): - if isinstance(other, string_types): - try: - other = self.__class__(other) - except InvalidSpecifier: - return NotImplemented - elif not isinstance(other, self.__class__): - return NotImplemented - - return self._spec != other._spec - - def _get_operator(self, op): - return getattr(self, "_compare_{0}".format(self._operators[op])) - - def _coerce_version(self, version): - if not isinstance(version, (LegacyVersion, Version)): - version = parse(version) - return version - - @property - def operator(self): - return self._spec[0] - - @property - def version(self): - return self._spec[1] - - @property - def prereleases(self): - return self._prereleases - - @prereleases.setter - def prereleases(self, value): - self._prereleases = value - - def __contains__(self, item): - return self.contains(item) - - def contains(self, item, prereleases=None): - # Determine if prereleases are to be allowed or not. - if prereleases is None: - prereleases = self.prereleases - - # Normalize item to a Version or LegacyVersion, this allows us to have - # a shortcut for ``"2.0" in Specifier(">=2") - item = self._coerce_version(item) - - # Determine if we should be supporting prereleases in this specifier - # or not, if we do not support prereleases than we can short circuit - # logic if this version is a prereleases. - if item.is_prerelease and not prereleases: - return False - - # Actually do the comparison to determine if this item is contained - # within this Specifier or not. - return self._get_operator(self.operator)(item, self.version) - - def filter(self, iterable, prereleases=None): - yielded = False - found_prereleases = [] - - kw = {"prereleases": prereleases if prereleases is not None else True} - - # Attempt to iterate over all the values in the iterable and if any of - # them match, yield them. - for version in iterable: - parsed_version = self._coerce_version(version) - - if self.contains(parsed_version, **kw): - # If our version is a prerelease, and we were not set to allow - # prereleases, then we'll store it for later incase nothing - # else matches this specifier. - if parsed_version.is_prerelease and not ( - prereleases or self.prereleases - ): - found_prereleases.append(version) - # Either this is not a prerelease, or we should have been - # accepting prereleases from the beginning. - else: - yielded = True - yield version - - # Now that we've iterated over everything, determine if we've yielded - # any values, and if we have not and we have any prereleases stored up - # then we will go ahead and yield the prereleases. - if not yielded and found_prereleases: - for version in found_prereleases: - yield version - - -class LegacySpecifier(_IndividualSpecifier): - - _regex_str = r""" - (?P<operator>(==|!=|<=|>=|<|>)) - \s* - (?P<version> - [^,;\s)]* # Since this is a "legacy" specifier, and the version - # string can be just about anything, we match everything - # except for whitespace, a semi-colon for marker support, - # a closing paren since versions can be enclosed in - # them, and a comma since it's a version separator. - ) - """ - - _regex = re.compile(r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) - - _operators = { - "==": "equal", - "!=": "not_equal", - "<=": "less_than_equal", - ">=": "greater_than_equal", - "<": "less_than", - ">": "greater_than", - } - - def _coerce_version(self, version): - if not isinstance(version, LegacyVersion): - version = LegacyVersion(str(version)) - return version - - def _compare_equal(self, prospective, spec): - return prospective == self._coerce_version(spec) - - def _compare_not_equal(self, prospective, spec): - return prospective != self._coerce_version(spec) - - def _compare_less_than_equal(self, prospective, spec): - return prospective <= self._coerce_version(spec) - - def _compare_greater_than_equal(self, prospective, spec): - return prospective >= self._coerce_version(spec) - - def _compare_less_than(self, prospective, spec): - return prospective < self._coerce_version(spec) - - def _compare_greater_than(self, prospective, spec): - return prospective > self._coerce_version(spec) - - -def _require_version_compare(fn): - @functools.wraps(fn) - def wrapped(self, prospective, spec): - if not isinstance(prospective, Version): - return False - return fn(self, prospective, spec) - - return wrapped - - -class Specifier(_IndividualSpecifier): - - _regex_str = r""" - (?P<operator>(~=|==|!=|<=|>=|<|>|===)) - (?P<version> - (?: - # The identity operators allow for an escape hatch that will - # do an exact string match of the version you wish to install. - # This will not be parsed by PEP 440 and we cannot determine - # any semantic meaning from it. This operator is discouraged - # but included entirely as an escape hatch. - (?<====) # Only match for the identity operator - \s* - [^\s]* # We just match everything, except for whitespace - # since we are only testing for strict identity. - ) - | - (?: - # The (non)equality operators allow for wild card and local - # versions to be specified so we have to define these two - # operators separately to enable that. - (?<===|!=) # Only match for equals and not equals - - \s* - v? - (?:[0-9]+!)? # epoch - [0-9]+(?:\.[0-9]+)* # release - (?: # pre release - [-_\.]? - (a|b|c|rc|alpha|beta|pre|preview) - [-_\.]? - [0-9]* - )? - (?: # post release - (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) - )? - - # You cannot use a wild card and a dev or local version - # together so group them with a | and make them optional. - (?: - (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release - (?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local - | - \.\* # Wild card syntax of .* - )? - ) - | - (?: - # The compatible operator requires at least two digits in the - # release segment. - (?<=~=) # Only match for the compatible operator - - \s* - v? - (?:[0-9]+!)? # epoch - [0-9]+(?:\.[0-9]+)+ # release (We have a + instead of a *) - (?: # pre release - [-_\.]? - (a|b|c|rc|alpha|beta|pre|preview) - [-_\.]? - [0-9]* - )? - (?: # post release - (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) - )? - (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release - ) - | - (?: - # All other operators only allow a sub set of what the - # (non)equality operators do. Specifically they do not allow - # local versions to be specified nor do they allow the prefix - # matching wild cards. - (?<!==|!=|~=) # We have special cases for these - # operators so we want to make sure they - # don't match here. - - \s* - v? - (?:[0-9]+!)? # epoch - [0-9]+(?:\.[0-9]+)* # release - (?: # pre release - [-_\.]? - (a|b|c|rc|alpha|beta|pre|preview) - [-_\.]? - [0-9]* - )? - (?: # post release - (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) - )? - (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release - ) - ) - """ - - _regex = re.compile(r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) - - _operators = { - "~=": "compatible", - "==": "equal", - "!=": "not_equal", - "<=": "less_than_equal", - ">=": "greater_than_equal", - "<": "less_than", - ">": "greater_than", - "===": "arbitrary", - } - - @_require_version_compare - def _compare_compatible(self, prospective, spec): - # Compatible releases have an equivalent combination of >= and ==. That - # is that ~=2.2 is equivalent to >=2.2,==2.*. This allows us to - # implement this in terms of the other specifiers instead of - # implementing it ourselves. The only thing we need to do is construct - # the other specifiers. - - # We want everything but the last item in the version, but we want to - # ignore post and dev releases and we want to treat the pre-release as - # it's own separate segment. - prefix = ".".join( - list( - itertools.takewhile( - lambda x: (not x.startswith("post") and not x.startswith("dev")), - _version_split(spec), - ) - )[:-1] - ) - - # Add the prefix notation to the end of our string - prefix += ".*" - - return self._get_operator(">=")(prospective, spec) and self._get_operator("==")( - prospective, prefix - ) - - @_require_version_compare - def _compare_equal(self, prospective, spec): - # We need special logic to handle prefix matching - if spec.endswith(".*"): - # In the case of prefix matching we want to ignore local segment. - prospective = Version(prospective.public) - # Split the spec out by dots, and pretend that there is an implicit - # dot in between a release segment and a pre-release segment. - spec = _version_split(spec[:-2]) # Remove the trailing .* - - # Split the prospective version out by dots, and pretend that there - # is an implicit dot in between a release segment and a pre-release - # segment. - prospective = _version_split(str(prospective)) - - # Shorten the prospective version to be the same length as the spec - # so that we can determine if the specifier is a prefix of the - # prospective version or not. - prospective = prospective[: len(spec)] - - # Pad out our two sides with zeros so that they both equal the same - # length. - spec, prospective = _pad_version(spec, prospective) - else: - # Convert our spec string into a Version - spec = Version(spec) - - # If the specifier does not have a local segment, then we want to - # act as if the prospective version also does not have a local - # segment. - if not spec.local: - prospective = Version(prospective.public) - - return prospective == spec - - @_require_version_compare - def _compare_not_equal(self, prospective, spec): - return not self._compare_equal(prospective, spec) - - @_require_version_compare - def _compare_less_than_equal(self, prospective, spec): - return prospective <= Version(spec) - - @_require_version_compare - def _compare_greater_than_equal(self, prospective, spec): - return prospective >= Version(spec) - - @_require_version_compare - def _compare_less_than(self, prospective, spec): - # Convert our spec to a Version instance, since we'll want to work with - # it as a version. - spec = Version(spec) - - # Check to see if the prospective version is less than the spec - # version. If it's not we can short circuit and just return False now - # instead of doing extra unneeded work. - if not prospective < spec: - return False - - # This special case is here so that, unless the specifier itself - # includes is a pre-release version, that we do not accept pre-release - # versions for the version mentioned in the specifier (e.g. <3.1 should - # not match 3.1.dev0, but should match 3.0.dev0). - if not spec.is_prerelease and prospective.is_prerelease: - if Version(prospective.base_version) == Version(spec.base_version): - return False - - # If we've gotten to here, it means that prospective version is both - # less than the spec version *and* it's not a pre-release of the same - # version in the spec. - return True - - @_require_version_compare - def _compare_greater_than(self, prospective, spec): - # Convert our spec to a Version instance, since we'll want to work with - # it as a version. - spec = Version(spec) - - # Check to see if the prospective version is greater than the spec - # version. If it's not we can short circuit and just return False now - # instead of doing extra unneeded work. - if not prospective > spec: - return False - - # This special case is here so that, unless the specifier itself - # includes is a post-release version, that we do not accept - # post-release versions for the version mentioned in the specifier - # (e.g. >3.1 should not match 3.0.post0, but should match 3.2.post0). - if not spec.is_postrelease and prospective.is_postrelease: - if Version(prospective.base_version) == Version(spec.base_version): - return False - - # Ensure that we do not allow a local version of the version mentioned - # in the specifier, which is technically greater than, to match. - if prospective.local is not None: - if Version(prospective.base_version) == Version(spec.base_version): - return False - - # If we've gotten to here, it means that prospective version is both - # greater than the spec version *and* it's not a pre-release of the - # same version in the spec. - return True - - def _compare_arbitrary(self, prospective, spec): - return str(prospective).lower() == str(spec).lower() - - @property - def prereleases(self): - # If there is an explicit prereleases set for this, then we'll just - # blindly use that. - if self._prereleases is not None: - return self._prereleases - - # Look at all of our specifiers and determine if they are inclusive - # operators, and if they are if they are including an explicit - # prerelease. - operator, version = self._spec - if operator in ["==", ">=", "<=", "~=", "==="]: - # The == specifier can include a trailing .*, if it does we - # want to remove before parsing. - if operator == "==" and version.endswith(".*"): - version = version[:-2] - - # Parse the version, and if it is a pre-release than this - # specifier allows pre-releases. - if parse(version).is_prerelease: - return True - - return False - - @prereleases.setter - def prereleases(self, value): - self._prereleases = value - - -_prefix_regex = re.compile(r"^([0-9]+)((?:a|b|c|rc)[0-9]+)$") - - -def _version_split(version): - result = [] - for item in version.split("."): - match = _prefix_regex.search(item) - if match: - result.extend(match.groups()) - else: - result.append(item) - return result - - -def _pad_version(left, right): - left_split, right_split = [], [] - - # Get the release segment of our versions - left_split.append(list(itertools.takewhile(lambda x: x.isdigit(), left))) - right_split.append(list(itertools.takewhile(lambda x: x.isdigit(), right))) - - # Get the rest of our versions - left_split.append(left[len(left_split[0]) :]) - right_split.append(right[len(right_split[0]) :]) - - # Insert our padding - left_split.insert(1, ["0"] * max(0, len(right_split[0]) - len(left_split[0]))) - right_split.insert(1, ["0"] * max(0, len(left_split[0]) - len(right_split[0]))) - - return (list(itertools.chain(*left_split)), list(itertools.chain(*right_split))) - - -class SpecifierSet(BaseSpecifier): - def __init__(self, specifiers="", prereleases=None): - # Split on , to break each indidivual specifier into it's own item, and - # strip each item to remove leading/trailing whitespace. - specifiers = [s.strip() for s in specifiers.split(",") if s.strip()] - - # Parsed each individual specifier, attempting first to make it a - # Specifier and falling back to a LegacySpecifier. - parsed = set() - for specifier in specifiers: - try: - parsed.add(Specifier(specifier)) - except InvalidSpecifier: - parsed.add(LegacySpecifier(specifier)) - - # Turn our parsed specifiers into a frozen set and save them for later. - self._specs = frozenset(parsed) - - # Store our prereleases value so we can use it later to determine if - # we accept prereleases or not. - self._prereleases = prereleases - - def __repr__(self): - pre = ( - ", prereleases={0!r}".format(self.prereleases) - if self._prereleases is not None - else "" - ) - - return "<SpecifierSet({0!r}{1})>".format(str(self), pre) - - def __str__(self): - return ",".join(sorted(str(s) for s in self._specs)) - - def __hash__(self): - return hash(self._specs) - - def __and__(self, other): - if isinstance(other, string_types): - other = SpecifierSet(other) - elif not isinstance(other, SpecifierSet): - return NotImplemented - - specifier = SpecifierSet() - specifier._specs = frozenset(self._specs | other._specs) - - if self._prereleases is None and other._prereleases is not None: - specifier._prereleases = other._prereleases - elif self._prereleases is not None and other._prereleases is None: - specifier._prereleases = self._prereleases - elif self._prereleases == other._prereleases: - specifier._prereleases = self._prereleases - else: - raise ValueError( - "Cannot combine SpecifierSets with True and False prerelease " - "overrides." - ) - - return specifier - - def __eq__(self, other): - if isinstance(other, string_types): - other = SpecifierSet(other) - elif isinstance(other, _IndividualSpecifier): - other = SpecifierSet(str(other)) - elif not isinstance(other, SpecifierSet): - return NotImplemented - - return self._specs == other._specs - - def __ne__(self, other): - if isinstance(other, string_types): - other = SpecifierSet(other) - elif isinstance(other, _IndividualSpecifier): - other = SpecifierSet(str(other)) - elif not isinstance(other, SpecifierSet): - return NotImplemented - - return self._specs != other._specs - - def __len__(self): - return len(self._specs) - - def __iter__(self): - return iter(self._specs) - - @property - def prereleases(self): - # If we have been given an explicit prerelease modifier, then we'll - # pass that through here. - if self._prereleases is not None: - return self._prereleases - - # If we don't have any specifiers, and we don't have a forced value, - # then we'll just return None since we don't know if this should have - # pre-releases or not. - if not self._specs: - return None - - # Otherwise we'll see if any of the given specifiers accept - # prereleases, if any of them do we'll return True, otherwise False. - return any(s.prereleases for s in self._specs) - - @prereleases.setter - def prereleases(self, value): - self._prereleases = value - - def __contains__(self, item): - return self.contains(item) - - def contains(self, item, prereleases=None): - # Ensure that our item is a Version or LegacyVersion instance. - if not isinstance(item, (LegacyVersion, Version)): - item = parse(item) - - # Determine if we're forcing a prerelease or not, if we're not forcing - # one for this particular filter call, then we'll use whatever the - # SpecifierSet thinks for whether or not we should support prereleases. - if prereleases is None: - prereleases = self.prereleases - - # We can determine if we're going to allow pre-releases by looking to - # see if any of the underlying items supports them. If none of them do - # and this item is a pre-release then we do not allow it and we can - # short circuit that here. - # Note: This means that 1.0.dev1 would not be contained in something - # like >=1.0.devabc however it would be in >=1.0.debabc,>0.0.dev0 - if not prereleases and item.is_prerelease: - return False - - # We simply dispatch to the underlying specs here to make sure that the - # given version is contained within all of them. - # Note: This use of all() here means that an empty set of specifiers - # will always return True, this is an explicit design decision. - return all(s.contains(item, prereleases=prereleases) for s in self._specs) - - def filter(self, iterable, prereleases=None): - # Determine if we're forcing a prerelease or not, if we're not forcing - # one for this particular filter call, then we'll use whatever the - # SpecifierSet thinks for whether or not we should support prereleases. - if prereleases is None: - prereleases = self.prereleases - - # If we have any specifiers, then we want to wrap our iterable in the - # filter method for each one, this will act as a logical AND amongst - # each specifier. - if self._specs: - for spec in self._specs: - iterable = spec.filter(iterable, prereleases=bool(prereleases)) - return iterable - # If we do not have any specifiers, then we need to have a rough filter - # which will filter out any pre-releases, unless there are no final - # releases, and which will filter out LegacyVersion in general. - else: - filtered = [] - found_prereleases = [] - - for item in iterable: - # Ensure that we some kind of Version class for this item. - if not isinstance(item, (LegacyVersion, Version)): - parsed_version = parse(item) - else: - parsed_version = item - - # Filter out any item which is parsed as a LegacyVersion - if isinstance(parsed_version, LegacyVersion): - continue - - # Store any item which is a pre-release for later unless we've - # already found a final version or we are accepting prereleases - if parsed_version.is_prerelease and not prereleases: - if not filtered: - found_prereleases.append(item) - else: - filtered.append(item) - - # If we've found no items except for pre-releases, then we'll go - # ahead and use the pre-releases - if not filtered and found_prereleases and prereleases is None: - return found_prereleases - - return filtered diff --git a/env/lib/python3.7/site-packages/pip/_vendor/packaging/utils.py b/env/lib/python3.7/site-packages/pip/_vendor/packaging/utils.py deleted file mode 100644 index 8841878..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/packaging/utils.py +++ /dev/null @@ -1,57 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -import re - -from .version import InvalidVersion, Version - - -_canonicalize_regex = re.compile(r"[-_.]+") - - -def canonicalize_name(name): - # This is taken from PEP 503. - return _canonicalize_regex.sub("-", name).lower() - - -def canonicalize_version(version): - """ - This is very similar to Version.__str__, but has one subtle differences - with the way it handles the release segment. - """ - - try: - version = Version(version) - except InvalidVersion: - # Legacy versions cannot be normalized - return version - - parts = [] - - # Epoch - if version.epoch != 0: - parts.append("{0}!".format(version.epoch)) - - # Release segment - # NB: This strips trailing '.0's to normalize - parts.append(re.sub(r"(\.0)+$", "", ".".join(str(x) for x in version.release))) - - # Pre-release - if version.pre is not None: - parts.append("".join(str(x) for x in version.pre)) - - # Post-release - if version.post is not None: - parts.append(".post{0}".format(version.post)) - - # Development release - if version.dev is not None: - parts.append(".dev{0}".format(version.dev)) - - # Local version segment - if version.local is not None: - parts.append("+{0}".format(version.local)) - - return "".join(parts) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/packaging/version.py b/env/lib/python3.7/site-packages/pip/_vendor/packaging/version.py deleted file mode 100644 index 95157a1..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/packaging/version.py +++ /dev/null @@ -1,420 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -import collections -import itertools -import re - -from ._structures import Infinity - - -__all__ = ["parse", "Version", "LegacyVersion", "InvalidVersion", "VERSION_PATTERN"] - - -_Version = collections.namedtuple( - "_Version", ["epoch", "release", "dev", "pre", "post", "local"] -) - - -def parse(version): - """ - Parse the given version string and return either a :class:`Version` object - or a :class:`LegacyVersion` object depending on if the given version is - a valid PEP 440 version or a legacy version. - """ - try: - return Version(version) - except InvalidVersion: - return LegacyVersion(version) - - -class InvalidVersion(ValueError): - """ - An invalid version was found, users should refer to PEP 440. - """ - - -class _BaseVersion(object): - def __hash__(self): - return hash(self._key) - - def __lt__(self, other): - return self._compare(other, lambda s, o: s < o) - - def __le__(self, other): - return self._compare(other, lambda s, o: s <= o) - - def __eq__(self, other): - return self._compare(other, lambda s, o: s == o) - - def __ge__(self, other): - return self._compare(other, lambda s, o: s >= o) - - def __gt__(self, other): - return self._compare(other, lambda s, o: s > o) - - def __ne__(self, other): - return self._compare(other, lambda s, o: s != o) - - def _compare(self, other, method): - if not isinstance(other, _BaseVersion): - return NotImplemented - - return method(self._key, other._key) - - -class LegacyVersion(_BaseVersion): - def __init__(self, version): - self._version = str(version) - self._key = _legacy_cmpkey(self._version) - - def __str__(self): - return self._version - - def __repr__(self): - return "<LegacyVersion({0})>".format(repr(str(self))) - - @property - def public(self): - return self._version - - @property - def base_version(self): - return self._version - - @property - def epoch(self): - return -1 - - @property - def release(self): - return None - - @property - def pre(self): - return None - - @property - def post(self): - return None - - @property - def dev(self): - return None - - @property - def local(self): - return None - - @property - def is_prerelease(self): - return False - - @property - def is_postrelease(self): - return False - - @property - def is_devrelease(self): - return False - - -_legacy_version_component_re = re.compile(r"(\d+ | [a-z]+ | \.| -)", re.VERBOSE) - -_legacy_version_replacement_map = { - "pre": "c", - "preview": "c", - "-": "final-", - "rc": "c", - "dev": "@", -} - - -def _parse_version_parts(s): - for part in _legacy_version_component_re.split(s): - part = _legacy_version_replacement_map.get(part, part) - - if not part or part == ".": - continue - - if part[:1] in "0123456789": - # pad for numeric comparison - yield part.zfill(8) - else: - yield "*" + part - - # ensure that alpha/beta/candidate are before final - yield "*final" - - -def _legacy_cmpkey(version): - # We hardcode an epoch of -1 here. A PEP 440 version can only have a epoch - # greater than or equal to 0. This will effectively put the LegacyVersion, - # which uses the defacto standard originally implemented by setuptools, - # as before all PEP 440 versions. - epoch = -1 - - # This scheme is taken from pkg_resources.parse_version setuptools prior to - # it's adoption of the packaging library. - parts = [] - for part in _parse_version_parts(version.lower()): - if part.startswith("*"): - # remove "-" before a prerelease tag - if part < "*final": - while parts and parts[-1] == "*final-": - parts.pop() - - # remove trailing zeros from each series of numeric parts - while parts and parts[-1] == "00000000": - parts.pop() - - parts.append(part) - parts = tuple(parts) - - return epoch, parts - - -# Deliberately not anchored to the start and end of the string, to make it -# easier for 3rd party code to reuse -VERSION_PATTERN = r""" - v? - (?: - (?:(?P<epoch>[0-9]+)!)? # epoch - (?P<release>[0-9]+(?:\.[0-9]+)*) # release segment - (?P<pre> # pre-release - [-_\.]? - (?P<pre_l>(a|b|c|rc|alpha|beta|pre|preview)) - [-_\.]? - (?P<pre_n>[0-9]+)? - )? - (?P<post> # post release - (?:-(?P<post_n1>[0-9]+)) - | - (?: - [-_\.]? - (?P<post_l>post|rev|r) - [-_\.]? - (?P<post_n2>[0-9]+)? - ) - )? - (?P<dev> # dev release - [-_\.]? - (?P<dev_l>dev) - [-_\.]? - (?P<dev_n>[0-9]+)? - )? - ) - (?:\+(?P<local>[a-z0-9]+(?:[-_\.][a-z0-9]+)*))? # local version -""" - - -class Version(_BaseVersion): - - _regex = re.compile(r"^\s*" + VERSION_PATTERN + r"\s*$", re.VERBOSE | re.IGNORECASE) - - def __init__(self, version): - # Validate the version and parse it into pieces - match = self._regex.search(version) - if not match: - raise InvalidVersion("Invalid version: '{0}'".format(version)) - - # Store the parsed out pieces of the version - self._version = _Version( - epoch=int(match.group("epoch")) if match.group("epoch") else 0, - release=tuple(int(i) for i in match.group("release").split(".")), - pre=_parse_letter_version(match.group("pre_l"), match.group("pre_n")), - post=_parse_letter_version( - match.group("post_l"), match.group("post_n1") or match.group("post_n2") - ), - dev=_parse_letter_version(match.group("dev_l"), match.group("dev_n")), - local=_parse_local_version(match.group("local")), - ) - - # Generate a key which will be used for sorting - self._key = _cmpkey( - self._version.epoch, - self._version.release, - self._version.pre, - self._version.post, - self._version.dev, - self._version.local, - ) - - def __repr__(self): - return "<Version({0})>".format(repr(str(self))) - - def __str__(self): - parts = [] - - # Epoch - if self.epoch != 0: - parts.append("{0}!".format(self.epoch)) - - # Release segment - parts.append(".".join(str(x) for x in self.release)) - - # Pre-release - if self.pre is not None: - parts.append("".join(str(x) for x in self.pre)) - - # Post-release - if self.post is not None: - parts.append(".post{0}".format(self.post)) - - # Development release - if self.dev is not None: - parts.append(".dev{0}".format(self.dev)) - - # Local version segment - if self.local is not None: - parts.append("+{0}".format(self.local)) - - return "".join(parts) - - @property - def epoch(self): - return self._version.epoch - - @property - def release(self): - return self._version.release - - @property - def pre(self): - return self._version.pre - - @property - def post(self): - return self._version.post[1] if self._version.post else None - - @property - def dev(self): - return self._version.dev[1] if self._version.dev else None - - @property - def local(self): - if self._version.local: - return ".".join(str(x) for x in self._version.local) - else: - return None - - @property - def public(self): - return str(self).split("+", 1)[0] - - @property - def base_version(self): - parts = [] - - # Epoch - if self.epoch != 0: - parts.append("{0}!".format(self.epoch)) - - # Release segment - parts.append(".".join(str(x) for x in self.release)) - - return "".join(parts) - - @property - def is_prerelease(self): - return self.dev is not None or self.pre is not None - - @property - def is_postrelease(self): - return self.post is not None - - @property - def is_devrelease(self): - return self.dev is not None - - -def _parse_letter_version(letter, number): - if letter: - # We consider there to be an implicit 0 in a pre-release if there is - # not a numeral associated with it. - if number is None: - number = 0 - - # We normalize any letters to their lower case form - letter = letter.lower() - - # We consider some words to be alternate spellings of other words and - # in those cases we want to normalize the spellings to our preferred - # spelling. - if letter == "alpha": - letter = "a" - elif letter == "beta": - letter = "b" - elif letter in ["c", "pre", "preview"]: - letter = "rc" - elif letter in ["rev", "r"]: - letter = "post" - - return letter, int(number) - if not letter and number: - # We assume if we are given a number, but we are not given a letter - # then this is using the implicit post release syntax (e.g. 1.0-1) - letter = "post" - - return letter, int(number) - - -_local_version_separators = re.compile(r"[\._-]") - - -def _parse_local_version(local): - """ - Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve"). - """ - if local is not None: - return tuple( - part.lower() if not part.isdigit() else int(part) - for part in _local_version_separators.split(local) - ) - - -def _cmpkey(epoch, release, pre, post, dev, local): - # When we compare a release version, we want to compare it with all of the - # trailing zeros removed. So we'll use a reverse the list, drop all the now - # leading zeros until we come to something non zero, then take the rest - # re-reverse it back into the correct order and make it a tuple and use - # that for our sorting key. - release = tuple( - reversed(list(itertools.dropwhile(lambda x: x == 0, reversed(release)))) - ) - - # We need to "trick" the sorting algorithm to put 1.0.dev0 before 1.0a0. - # We'll do this by abusing the pre segment, but we _only_ want to do this - # if there is not a pre or a post segment. If we have one of those then - # the normal sorting rules will handle this case correctly. - if pre is None and post is None and dev is not None: - pre = -Infinity - # Versions without a pre-release (except as noted above) should sort after - # those with one. - elif pre is None: - pre = Infinity - - # Versions without a post segment should sort before those with one. - if post is None: - post = -Infinity - - # Versions without a development segment should sort after those with one. - if dev is None: - dev = Infinity - - if local is None: - # Versions without a local segment should sort before those with one. - local = -Infinity - else: - # Versions with a local segment need that segment parsed to implement - # the sorting rules in PEP440. - # - Alpha numeric segments sort before numeric segments - # - Alpha numeric segments sort lexicographically - # - Numeric segments sort numerically - # - Shorter versions sort before longer versions when the prefixes - # match exactly - local = tuple((i, "") if isinstance(i, int) else (-Infinity, i) for i in local) - - return epoch, release, pre, post, dev, local diff --git a/env/lib/python3.7/site-packages/pip/_vendor/pep517/__init__.py b/env/lib/python3.7/site-packages/pip/_vendor/pep517/__init__.py deleted file mode 100644 index 9c1a098..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/pep517/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -"""Wrappers to build Python packages using PEP 517 hooks -""" - -__version__ = '0.5.0' diff --git a/env/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 8318882b2408b93af9b087e8959cb8b69a573893..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 239 zcmXv}y~@Hs5WGZ1@u#=E*1|*!wGk1)_9LJm2(m;kn!|Xv<}UKZ*Rk@I()t!wZUhHr z_6KH%U35B4Mo^FLZcX)74nH{5%!#H=BG{G*XX^-e#d?+dc$0>RQEIr=e4oig@F2Ib zRvg2_IXp#%XGW?M50(KR4JSO-`fQr_+Q1umgTJ0z)B%J(02D2N8y%8b0X$h+p|G#K zr@p<Qj}rS*85<@^UtDwbKRm|e@=J0mp;I3tq!1rKDro^c%!|hKqD7WOGq-%9l&bpy Dh0#Ip diff --git a/env/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/_in_process.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/_in_process.cpython-37.pyc deleted file mode 100644 index 78d7abb940d6b4f7430afb0f3f0be9bd0b011795..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5582 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 M9`si<tvQSR4~~D6(EtDd diff --git a/env/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/check.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/check.cpython-37.pyc deleted file mode 100644 index 4bdd71adb978e640922827b6cb34e1bf83940423..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4765 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 HHL(8;eH{6| diff --git a/env/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/colorlog.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/colorlog.cpython-37.pyc deleted file mode 100644 index 4d836f42dd61728258d795d554598621ebdb385d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2871 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/compat.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/compat.cpython-37.pyc deleted file mode 100644 index 0dfd8abcbedbf1c7d3dc102358ab08804dff4f54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 975 zcmaJ<O>fgc5ZzsG5+@{8IDp`SeBfe<Bx(zyLKQ+Fp$eq%5fCU6vfQlGICXZ-+G$AT zp5O{Sas_eXFYT36{{kmwHf@Pe%1ATg*<J6v_huh98Z`nYe_VSvV}$&|;>@5X55Th> z2!iy9pn@f|Pi<y>7O}A-=yf8T{gS>dxF~%heJ;wP0=Xoc!aZH7E>;BV5x;i0y%S22 zM4pa95z9RfDsQIa9KWCRo^`!gdaqwSZf)K2l=Pm@^AV&?du*e90$51*#DO?KfM^`N z3jP#4YeUFMVL=M#vvYj)$jRxL6{K*6tYBX#C2xSv3-Xe@g$$5**U;HvX_^mPTRt^z zBnJwS`HtZ#jilk@OhFXWN$PXssNJ#QX_${pd4Cq_z0A<zPonG4`S-m}K1n-ioVH?_ z<zbSv#QVAYus$5&qV?b)l0xZD8l`vE?{)@i0(Z63xv8NFQGm@VNCkNj+N637@_=Fm zhOCk8Bk=4d1Ym1NW7*b^XimSef_|sHe>v)NjvBA_9bJN?%Mc7tR49C=@n(Gq1JYT9 z1|F#5xGXl@{fq4~RI4Yk0XvIHd}PNrmZu<?aAI1puNO>%&2}xqGrUVcH7etC?Lu0B z#Rt3!u~iMxono!i)e?GeWFaBIyhuLQHB9d=E2f+9-+u(t*!l|id3(QXDnTIBAP5$k zJJ~!l^@B)fv64Y7hst8Me=f;y2VrO6Zcmh$CeeL-3mLu&PF?D<HRkeK+2wx#G84fk diff --git a/env/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/envbuild.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/envbuild.cpython-37.pyc deleted file mode 100644 index 737a5ddb3f0852f57bd7fb6cf410ea445b9bff28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4159 zcmds4TW{RP73K`NOD?sN<x8X}Fi--m(Qc8IkOFB7!$=*wX=Joj+*&}>MOuR5%u1BF zBt65mrNyc*GSC7=koTewGWyhi(BCqzeG1TDkf(fS$W=Cu^B$DDb2#_QneTk(@WJY8 z=-?^-_2!>0HXP@_R9HM7GWU`6KOlrNas(4RXCr3ce8ll~b9ds6Jl3>zMjh07d3WNE z{I)I_1*q%fy-7F<ZCy8Cne<0}<b4t3tCO|S8gnGSye8LQve9+X6X6SIbmK!utcd;# zNA%^*3wLx&To<ci?FAdXA#R9kVjZ~+!JjyTo3lp`rdckc=SNcJdPj>)*E%{li?Tx3 zNuFoLVRT@72wCZ<E~6x><)kWAqRt{&Jj+yBOk`1Sho9r9&fb8TZgp0dlN`A)J(B53 zoMIxBdWW)(tE4{CDEN~TK@)w>Fbd`M$Fh3&ouBQN<;g>Imnx+OdPtW&q=!iQK1A)* z?3iD=b7<}*zhIxOpR?M#?9ACqcFz9*egDq+z4Ng%=YnrJ=kDAU?v?}TZ8>8)b!Tt3 zR-IL<JeFy_O?#d7?IDNyOk-0fQ1a<CQ&P`XoBD$!J&}bNbd6V5vM{{V#-pPc@3_ng z#j!2p<z*rUo(Xk1RjG_crVJa8zFI04Nu7)WJ0({7x1-iE?u&an^`zRVvTE2WeJGxu z6{qivkEqh7_!(9&)lOxVv;)1{Nw%vqb1kN2<E!)Bz?3?GaM&&U0;Z@YrHaMlB6A-} z{}e(xK&3;79JzvzJkb}P=l~%d(G@<>)D?l~;q8l1tl%A3<gA+Y2ZW0czJkE)uMf+j zmZx<zNs8o9DuPRUq-79g1wf>;NtMgjV<`+HJP#5rMN}41S_&CGik_>omeIIW5w!9) z5Syh(QKqBcKH87+ER_YiZ`+Z3`zc)rJ@lqz!9(^sXLBb8L;wRuU=89lmq{_L2HbdB z=40cx74~u(aUBEEGtP>vj^lSx(slth+j><A+lyXT`0b!OCA)<$kg2W3e@Yu+HE=9| z<YOS2Ikk7(x$Hv!&P$F~zb$v#a)5GAbWgb272SdhAGi<cK*u(T;GbOdKIP{e$PX>@ zonv49ZSG>+%BF*U{-#|+c=w!QV^NRR{#W%Fy8>(BqQB)}rT;YLa}WJ(OFNfs-*nDB z%o?cw&AqENf_APB)(CBVM<72Zm9Os2t~VGSS^y7$<RNaMTPZotPG{fSzv33#zRWOp zqdPFV$M5g&n(*--_jf<qvw2?BreBphJB^!3=pqk*9TQY}Qd15Kc+V20jjvOcRW&lz zRLML$Kn8t~8LTS0Beeoy+`K$AURD5W1R3MEJZD@mnCa={nY27+t~J@S`lu`#HYk#b zRK!@AnV3#i#usu-`9Vj$K@DrINyHlLIFY8mD1$Gwil|F~9T9!#S25U&V{olhar|@i z(?5oASf8!&b+*oLFb}^qH(*`%Cf`6^$onirDL`w;XK%d*tnGAPGZ<nIi`Kiy%$bH4 zdIHp5!iRxl38%bvk39iK6_zD{fzF{{cjxSaZ8{f>d=+jxn7#j~aU&7D2N+BiX(lx| z0mM)r!FHioayH~3$kV{E(MaqtJpetYQtQ3h7Wsok>k^~f(K9}r7#D+#-|BF7V>rwX zi&Du2mr5}UhQk&azWP2+q<%ocg)lB?*o5*_rqen(fY-72@8$4<1KwPh2Vd}wdsxAu zU<2zSKgLA558-gqf1h!r+3j!WdTB^X2%(2CM|rF5zaRrmI^}IhaPmp7yj}BSMxGA* zz+h{h+P0p~mKpW#qF<nP(a*o6XaUT@oT5)HR3{i&9$15V6>TrR)T?KE@p}y=x_fF1 zyHIaI3_^8_@}!c+4mug)17*7UXj*5v>8eSsq*Ono4tF4M7iFb>gxmt_fjmv)`mB<$ zA>^JV7-g#tMyrLCLND0&RiJ}x<tdSEg4r~}D`>Y1EU!VweI5eOjeIQuHzNmZf6yb= zCYy|76UOnR6w{pY{WyL)P4c$Ik7H4$aoikr6Kkm*667A$dnCwDFA4Go>Lvs!%iew9 zc^e)N-5?5jwk0Ke(L=^`6~6o#1<)wNW%M)WoY%OV3-$>=ch9{VBtG{p_<5)17tUvI zpLge7T)q1e<}~kIdUFm4__oe(>k#sw79mX&@K~ec$pn#;MPHOOaa}Z4<phN$E{Sl5 zh<i%JZ&OWn_4tFw5kjx%2(g#mZk+GkDpAQK(zR+w5gpx)p4iA{X@(RYKY?2$<NaDh zWgYR-EH=PwCfQFEcywtJ7<H;-0`G2nfdZCCi!7}X0~F)zFxIlJv6j9YeN@$1S=flQ zO0<199-|G_nq%w}$>5(v2YH#E&^E`@BBh~i0P#G_^GHpL*KyBM{9-rMEYQY=6!bz{ z6shbDx;DsCKCai^zJ-ptO#$yBl#Jm`Vmm`@Pia<`3WGqcVXWz0smWY><;aSFWc>Dc zrekl*xL{C40m-ZA{3Yt9NSdNQCk!kzg*<=_(N9tPcLSqEWWPGT3m~-{`F4;ZR!C*L z+y8frT2(ACY6~q!N4+a8sb2v^7MJQn%I%VPMB;Ub{52Z>j`VGaq;?yV?+rH91Dd4? zz7UKZ!f*}w-0k*5$bN7sih=O8brmaEpRRsFwLLiY#(<h=ETC`AaRv`hF4qLlRZ>+F z0T!98{WARxmXS*R0_7%3Aj2`;@_;@P8>1$hQMAn^W3!&2`98SUxR>|n(?H*b@L+BM Rf`LWqlhbkofBlni<4d%!Vfp|7 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/wrappers.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/wrappers.cpython-37.pyc deleted file mode 100644 index 43ad030ba6111f2299ce9019fd9488dd6cfbe905..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5440 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/pep517/_in_process.py b/env/lib/python3.7/site-packages/pip/_vendor/pep517/_in_process.py deleted file mode 100644 index d6524b6..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/pep517/_in_process.py +++ /dev/null @@ -1,207 +0,0 @@ -"""This is invoked in a subprocess to call the build backend hooks. - -It expects: -- Command line args: hook_name, control_dir -- Environment variable: PEP517_BUILD_BACKEND=entry.point:spec -- control_dir/input.json: - - {"kwargs": {...}} - -Results: -- control_dir/output.json - - {"return_val": ...} -""" -from glob import glob -from importlib import import_module -import os -from os.path import join as pjoin -import re -import shutil -import sys - -# This is run as a script, not a module, so it can't do a relative import -import compat - - -class BackendUnavailable(Exception): - """Raised if we cannot import the backend""" - - -def _build_backend(): - """Find and load the build backend""" - ep = os.environ['PEP517_BUILD_BACKEND'] - mod_path, _, obj_path = ep.partition(':') - try: - obj = import_module(mod_path) - except ImportError: - raise BackendUnavailable - if obj_path: - for path_part in obj_path.split('.'): - obj = getattr(obj, path_part) - return obj - - -def get_requires_for_build_wheel(config_settings): - """Invoke the optional get_requires_for_build_wheel hook - - Returns [] if the hook is not defined. - """ - backend = _build_backend() - try: - hook = backend.get_requires_for_build_wheel - except AttributeError: - return [] - else: - return hook(config_settings) - - -def prepare_metadata_for_build_wheel(metadata_directory, config_settings): - """Invoke optional prepare_metadata_for_build_wheel - - Implements a fallback by building a wheel if the hook isn't defined. - """ - backend = _build_backend() - try: - hook = backend.prepare_metadata_for_build_wheel - except AttributeError: - return _get_wheel_metadata_from_wheel(backend, metadata_directory, - config_settings) - else: - return hook(metadata_directory, config_settings) - - -WHEEL_BUILT_MARKER = 'PEP517_ALREADY_BUILT_WHEEL' - - -def _dist_info_files(whl_zip): - """Identify the .dist-info folder inside a wheel ZipFile.""" - res = [] - for path in whl_zip.namelist(): - m = re.match(r'[^/\\]+-[^/\\]+\.dist-info/', path) - if m: - res.append(path) - if res: - return res - raise Exception("No .dist-info folder found in wheel") - - -def _get_wheel_metadata_from_wheel( - backend, metadata_directory, config_settings): - """Build a wheel and extract the metadata from it. - - Fallback for when the build backend does not - define the 'get_wheel_metadata' hook. - """ - from zipfile import ZipFile - whl_basename = backend.build_wheel(metadata_directory, config_settings) - with open(os.path.join(metadata_directory, WHEEL_BUILT_MARKER), 'wb'): - pass # Touch marker file - - whl_file = os.path.join(metadata_directory, whl_basename) - with ZipFile(whl_file) as zipf: - dist_info = _dist_info_files(zipf) - zipf.extractall(path=metadata_directory, members=dist_info) - return dist_info[0].split('/')[0] - - -def _find_already_built_wheel(metadata_directory): - """Check for a wheel already built during the get_wheel_metadata hook. - """ - if not metadata_directory: - return None - metadata_parent = os.path.dirname(metadata_directory) - if not os.path.isfile(pjoin(metadata_parent, WHEEL_BUILT_MARKER)): - return None - - whl_files = glob(os.path.join(metadata_parent, '*.whl')) - if not whl_files: - print('Found wheel built marker, but no .whl files') - return None - if len(whl_files) > 1: - print('Found multiple .whl files; unspecified behaviour. ' - 'Will call build_wheel.') - return None - - # Exactly one .whl file - return whl_files[0] - - -def build_wheel(wheel_directory, config_settings, metadata_directory=None): - """Invoke the mandatory build_wheel hook. - - If a wheel was already built in the - prepare_metadata_for_build_wheel fallback, this - will copy it rather than rebuilding the wheel. - """ - prebuilt_whl = _find_already_built_wheel(metadata_directory) - if prebuilt_whl: - shutil.copy2(prebuilt_whl, wheel_directory) - return os.path.basename(prebuilt_whl) - - return _build_backend().build_wheel(wheel_directory, config_settings, - metadata_directory) - - -def get_requires_for_build_sdist(config_settings): - """Invoke the optional get_requires_for_build_wheel hook - - Returns [] if the hook is not defined. - """ - backend = _build_backend() - try: - hook = backend.get_requires_for_build_sdist - except AttributeError: - return [] - else: - return hook(config_settings) - - -class _DummyException(Exception): - """Nothing should ever raise this exception""" - - -class GotUnsupportedOperation(Exception): - """For internal use when backend raises UnsupportedOperation""" - - -def build_sdist(sdist_directory, config_settings): - """Invoke the mandatory build_sdist hook.""" - backend = _build_backend() - try: - return backend.build_sdist(sdist_directory, config_settings) - except getattr(backend, 'UnsupportedOperation', _DummyException): - raise GotUnsupportedOperation - - -HOOK_NAMES = { - 'get_requires_for_build_wheel', - 'prepare_metadata_for_build_wheel', - 'build_wheel', - 'get_requires_for_build_sdist', - 'build_sdist', -} - - -def main(): - if len(sys.argv) < 3: - sys.exit("Needs args: hook_name, control_dir") - hook_name = sys.argv[1] - control_dir = sys.argv[2] - if hook_name not in HOOK_NAMES: - sys.exit("Unknown hook: %s" % hook_name) - hook = globals()[hook_name] - - hook_input = compat.read_json(pjoin(control_dir, 'input.json')) - - json_out = {'unsupported': False, 'return_val': None} - try: - json_out['return_val'] = hook(**hook_input['kwargs']) - except BackendUnavailable: - json_out['no_backend'] = True - except GotUnsupportedOperation: - json_out['unsupported'] = True - - compat.write_json(json_out, pjoin(control_dir, 'output.json'), indent=2) - - -if __name__ == '__main__': - main() diff --git a/env/lib/python3.7/site-packages/pip/_vendor/pep517/check.py b/env/lib/python3.7/site-packages/pip/_vendor/pep517/check.py deleted file mode 100644 index f4cdc6b..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/pep517/check.py +++ /dev/null @@ -1,202 +0,0 @@ -"""Check a project and backend by attempting to build using PEP 517 hooks. -""" -import argparse -import logging -import os -from os.path import isfile, join as pjoin -from pip._vendor.pytoml import TomlError, load as toml_load -import shutil -from subprocess import CalledProcessError -import sys -import tarfile -from tempfile import mkdtemp -import zipfile - -from .colorlog import enable_colourful_output -from .envbuild import BuildEnvironment -from .wrappers import Pep517HookCaller - -log = logging.getLogger(__name__) - - -def check_build_sdist(hooks, build_sys_requires): - with BuildEnvironment() as env: - try: - env.pip_install(build_sys_requires) - log.info('Installed static build dependencies') - except CalledProcessError: - log.error('Failed to install static build dependencies') - return False - - try: - reqs = hooks.get_requires_for_build_sdist({}) - log.info('Got build requires: %s', reqs) - except Exception: - log.error('Failure in get_requires_for_build_sdist', exc_info=True) - return False - - try: - env.pip_install(reqs) - log.info('Installed dynamic build dependencies') - except CalledProcessError: - log.error('Failed to install dynamic build dependencies') - return False - - td = mkdtemp() - log.info('Trying to build sdist in %s', td) - try: - try: - filename = hooks.build_sdist(td, {}) - log.info('build_sdist returned %r', filename) - except Exception: - log.info('Failure in build_sdist', exc_info=True) - return False - - if not filename.endswith('.tar.gz'): - log.error( - "Filename %s doesn't have .tar.gz extension", filename) - return False - - path = pjoin(td, filename) - if isfile(path): - log.info("Output file %s exists", path) - else: - log.error("Output file %s does not exist", path) - return False - - if tarfile.is_tarfile(path): - log.info("Output file is a tar file") - else: - log.error("Output file is not a tar file") - return False - - finally: - shutil.rmtree(td) - - return True - - -def check_build_wheel(hooks, build_sys_requires): - with BuildEnvironment() as env: - try: - env.pip_install(build_sys_requires) - log.info('Installed static build dependencies') - except CalledProcessError: - log.error('Failed to install static build dependencies') - return False - - try: - reqs = hooks.get_requires_for_build_wheel({}) - log.info('Got build requires: %s', reqs) - except Exception: - log.error('Failure in get_requires_for_build_sdist', exc_info=True) - return False - - try: - env.pip_install(reqs) - log.info('Installed dynamic build dependencies') - except CalledProcessError: - log.error('Failed to install dynamic build dependencies') - return False - - td = mkdtemp() - log.info('Trying to build wheel in %s', td) - try: - try: - filename = hooks.build_wheel(td, {}) - log.info('build_wheel returned %r', filename) - except Exception: - log.info('Failure in build_wheel', exc_info=True) - return False - - if not filename.endswith('.whl'): - log.error("Filename %s doesn't have .whl extension", filename) - return False - - path = pjoin(td, filename) - if isfile(path): - log.info("Output file %s exists", path) - else: - log.error("Output file %s does not exist", path) - return False - - if zipfile.is_zipfile(path): - log.info("Output file is a zip file") - else: - log.error("Output file is not a zip file") - return False - - finally: - shutil.rmtree(td) - - return True - - -def check(source_dir): - pyproject = pjoin(source_dir, 'pyproject.toml') - if isfile(pyproject): - log.info('Found pyproject.toml') - else: - log.error('Missing pyproject.toml') - return False - - try: - with open(pyproject) as f: - pyproject_data = toml_load(f) - # Ensure the mandatory data can be loaded - buildsys = pyproject_data['build-system'] - requires = buildsys['requires'] - backend = buildsys['build-backend'] - log.info('Loaded pyproject.toml') - except (TomlError, KeyError): - log.error("Invalid pyproject.toml", exc_info=True) - return False - - hooks = Pep517HookCaller(source_dir, backend) - - sdist_ok = check_build_sdist(hooks, requires) - wheel_ok = check_build_wheel(hooks, requires) - - if not sdist_ok: - log.warning('Sdist checks failed; scroll up to see') - if not wheel_ok: - log.warning('Wheel checks failed') - - return sdist_ok - - -def main(argv=None): - ap = argparse.ArgumentParser() - ap.add_argument( - 'source_dir', - help="A directory containing pyproject.toml") - args = ap.parse_args(argv) - - enable_colourful_output() - - ok = check(args.source_dir) - - if ok: - print(ansi('Checks passed', 'green')) - else: - print(ansi('Checks failed', 'red')) - sys.exit(1) - - -ansi_codes = { - 'reset': '\x1b[0m', - 'bold': '\x1b[1m', - 'red': '\x1b[31m', - 'green': '\x1b[32m', -} - - -def ansi(s, attr): - if os.name != 'nt' and sys.stdout.isatty(): - return ansi_codes[attr] + str(s) + ansi_codes['reset'] - else: - return str(s) - - -if __name__ == '__main__': - main() diff --git a/env/lib/python3.7/site-packages/pip/_vendor/pep517/colorlog.py b/env/lib/python3.7/site-packages/pip/_vendor/pep517/colorlog.py deleted file mode 100644 index 69c8a59..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/pep517/colorlog.py +++ /dev/null @@ -1,115 +0,0 @@ -"""Nicer log formatting with colours. - -Code copied from Tornado, Apache licensed. -""" -# Copyright 2012 Facebook -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging -import sys - -try: - import curses -except ImportError: - curses = None - - -def _stderr_supports_color(): - color = False - if curses and hasattr(sys.stderr, 'isatty') and sys.stderr.isatty(): - try: - curses.setupterm() - if curses.tigetnum("colors") > 0: - color = True - except Exception: - pass - return color - - -class LogFormatter(logging.Formatter): - """Log formatter with colour support - """ - DEFAULT_COLORS = { - logging.INFO: 2, # Green - logging.WARNING: 3, # Yellow - logging.ERROR: 1, # Red - logging.CRITICAL: 1, - } - - def __init__(self, color=True, datefmt=None): - r""" - :arg bool color: Enables color support. - :arg string fmt: Log message format. - It will be applied to the attributes dict of log records. The - text between ``%(color)s`` and ``%(end_color)s`` will be colored - depending on the level if color support is on. - :arg dict colors: color mappings from logging level to terminal color - code - :arg string datefmt: Datetime format. - Used for formatting ``(asctime)`` placeholder in ``prefix_fmt``. - .. versionchanged:: 3.2 - Added ``fmt`` and ``datefmt`` arguments. - """ - logging.Formatter.__init__(self, datefmt=datefmt) - self._colors = {} - if color and _stderr_supports_color(): - # The curses module has some str/bytes confusion in - # python3. Until version 3.2.3, most methods return - # bytes, but only accept strings. In addition, we want to - # output these strings with the logging module, which - # works with unicode strings. The explicit calls to - # unicode() below are harmless in python2 but will do the - # right conversion in python 3. - fg_color = (curses.tigetstr("setaf") or - curses.tigetstr("setf") or "") - if (3, 0) < sys.version_info < (3, 2, 3): - fg_color = str(fg_color, "ascii") - - for levelno, code in self.DEFAULT_COLORS.items(): - self._colors[levelno] = str( - curses.tparm(fg_color, code), "ascii") - self._normal = str(curses.tigetstr("sgr0"), "ascii") - - scr = curses.initscr() - self.termwidth = scr.getmaxyx()[1] - curses.endwin() - else: - self._normal = '' - # Default width is usually 80, but too wide is - # worse than too narrow - self.termwidth = 70 - - def formatMessage(self, record): - mlen = len(record.message) - right_text = '{initial}-{name}'.format(initial=record.levelname[0], - name=record.name) - if mlen + len(right_text) < self.termwidth: - space = ' ' * (self.termwidth - (mlen + len(right_text))) - else: - space = ' ' - - if record.levelno in self._colors: - start_color = self._colors[record.levelno] - end_color = self._normal - else: - start_color = end_color = '' - - return record.message + space + start_color + right_text + end_color - - -def enable_colourful_output(level=logging.INFO): - handler = logging.StreamHandler() - handler.setFormatter(LogFormatter()) - logging.root.addHandler(handler) - logging.root.setLevel(level) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/pep517/compat.py b/env/lib/python3.7/site-packages/pip/_vendor/pep517/compat.py deleted file mode 100644 index 01c66fc..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/pep517/compat.py +++ /dev/null @@ -1,23 +0,0 @@ -"""Handle reading and writing JSON in UTF-8, on Python 3 and 2.""" -import json -import sys - -if sys.version_info[0] >= 3: - # Python 3 - def write_json(obj, path, **kwargs): - with open(path, 'w', encoding='utf-8') as f: - json.dump(obj, f, **kwargs) - - def read_json(path): - with open(path, 'r', encoding='utf-8') as f: - return json.load(f) - -else: - # Python 2 - def write_json(obj, path, **kwargs): - with open(path, 'wb') as f: - json.dump(obj, f, encoding='utf-8', **kwargs) - - def read_json(path): - with open(path, 'rb') as f: - return json.load(f) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/pep517/envbuild.py b/env/lib/python3.7/site-packages/pip/_vendor/pep517/envbuild.py deleted file mode 100644 index f7ac5f4..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/pep517/envbuild.py +++ /dev/null @@ -1,158 +0,0 @@ -"""Build wheels/sdists by installing build deps to a temporary environment. -""" - -import os -import logging -from pip._vendor import pytoml -import shutil -from subprocess import check_call -import sys -from sysconfig import get_paths -from tempfile import mkdtemp - -from .wrappers import Pep517HookCaller - -log = logging.getLogger(__name__) - - -def _load_pyproject(source_dir): - with open(os.path.join(source_dir, 'pyproject.toml')) as f: - pyproject_data = pytoml.load(f) - buildsys = pyproject_data['build-system'] - return buildsys['requires'], buildsys['build-backend'] - - -class BuildEnvironment(object): - """Context manager to install build deps in a simple temporary environment - - Based on code I wrote for pip, which is MIT licensed. - """ - # Copyright (c) 2008-2016 The pip developers (see AUTHORS.txt file) - # - # Permission is hereby granted, free of charge, to any person obtaining - # a copy of this software and associated documentation files (the - # "Software"), to deal in the Software without restriction, including - # without limitation the rights to use, copy, modify, merge, publish, - # distribute, sublicense, and/or sell copies of the Software, and to - # permit persons to whom the Software is furnished to do so, subject to - # the following conditions: - # - # The above copyright notice and this permission notice shall be - # included in all copies or substantial portions of the Software. - # - # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - path = None - - def __init__(self, cleanup=True): - self._cleanup = cleanup - - def __enter__(self): - self.path = mkdtemp(prefix='pep517-build-env-') - log.info('Temporary build environment: %s', self.path) - - self.save_path = os.environ.get('PATH', None) - self.save_pythonpath = os.environ.get('PYTHONPATH', None) - - install_scheme = 'nt' if (os.name == 'nt') else 'posix_prefix' - install_dirs = get_paths(install_scheme, vars={ - 'base': self.path, - 'platbase': self.path, - }) - - scripts = install_dirs['scripts'] - if self.save_path: - os.environ['PATH'] = scripts + os.pathsep + self.save_path - else: - os.environ['PATH'] = scripts + os.pathsep + os.defpath - - if install_dirs['purelib'] == install_dirs['platlib']: - lib_dirs = install_dirs['purelib'] - else: - lib_dirs = install_dirs['purelib'] + os.pathsep + \ - install_dirs['platlib'] - if self.save_pythonpath: - os.environ['PYTHONPATH'] = lib_dirs + os.pathsep + \ - self.save_pythonpath - else: - os.environ['PYTHONPATH'] = lib_dirs - - return self - - def pip_install(self, reqs): - """Install dependencies into this env by calling pip in a subprocess""" - if not reqs: - return - log.info('Calling pip to install %s', reqs) - check_call([ - sys.executable, '-m', 'pip', 'install', '--ignore-installed', - '--prefix', self.path] + list(reqs)) - - def __exit__(self, exc_type, exc_val, exc_tb): - needs_cleanup = ( - self._cleanup and - self.path is not None and - os.path.isdir(self.path) - ) - if needs_cleanup: - shutil.rmtree(self.path) - - if self.save_path is None: - os.environ.pop('PATH', None) - else: - os.environ['PATH'] = self.save_path - - if self.save_pythonpath is None: - os.environ.pop('PYTHONPATH', None) - else: - os.environ['PYTHONPATH'] = self.save_pythonpath - - -def build_wheel(source_dir, wheel_dir, config_settings=None): - """Build a wheel from a source directory using PEP 517 hooks. - - :param str source_dir: Source directory containing pyproject.toml - :param str wheel_dir: Target directory to create wheel in - :param dict config_settings: Options to pass to build backend - - This is a blocking function which will run pip in a subprocess to install - build requirements. - """ - if config_settings is None: - config_settings = {} - requires, backend = _load_pyproject(source_dir) - hooks = Pep517HookCaller(source_dir, backend) - - with BuildEnvironment() as env: - env.pip_install(requires) - reqs = hooks.get_requires_for_build_wheel(config_settings) - env.pip_install(reqs) - return hooks.build_wheel(wheel_dir, config_settings) - - -def build_sdist(source_dir, sdist_dir, config_settings=None): - """Build an sdist from a source directory using PEP 517 hooks. - - :param str source_dir: Source directory containing pyproject.toml - :param str sdist_dir: Target directory to place sdist in - :param dict config_settings: Options to pass to build backend - - This is a blocking function which will run pip in a subprocess to install - build requirements. - """ - if config_settings is None: - config_settings = {} - requires, backend = _load_pyproject(source_dir) - hooks = Pep517HookCaller(source_dir, backend) - - with BuildEnvironment() as env: - env.pip_install(requires) - reqs = hooks.get_requires_for_build_sdist(config_settings) - env.pip_install(reqs) - return hooks.build_sdist(sdist_dir, config_settings) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/pep517/wrappers.py b/env/lib/python3.7/site-packages/pip/_vendor/pep517/wrappers.py deleted file mode 100644 index b14b899..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/pep517/wrappers.py +++ /dev/null @@ -1,163 +0,0 @@ -from contextlib import contextmanager -import os -from os.path import dirname, abspath, join as pjoin -import shutil -from subprocess import check_call -import sys -from tempfile import mkdtemp - -from . import compat - -_in_proc_script = pjoin(dirname(abspath(__file__)), '_in_process.py') - - -@contextmanager -def tempdir(): - td = mkdtemp() - try: - yield td - finally: - shutil.rmtree(td) - - -class BackendUnavailable(Exception): - """Will be raised if the backend cannot be imported in the hook process.""" - - -class UnsupportedOperation(Exception): - """May be raised by build_sdist if the backend indicates that it can't.""" - - -def default_subprocess_runner(cmd, cwd=None, extra_environ=None): - """The default method of calling the wrapper subprocess.""" - env = os.environ.copy() - if extra_environ: - env.update(extra_environ) - - check_call(cmd, cwd=cwd, env=env) - - -class Pep517HookCaller(object): - """A wrapper around a source directory to be built with a PEP 517 backend. - - source_dir : The path to the source directory, containing pyproject.toml. - backend : The build backend spec, as per PEP 517, from pyproject.toml. - """ - def __init__(self, source_dir, build_backend): - self.source_dir = abspath(source_dir) - self.build_backend = build_backend - self._subprocess_runner = default_subprocess_runner - - # TODO: Is this over-engineered? Maybe frontends only need to - # set this when creating the wrapper, not on every call. - @contextmanager - def subprocess_runner(self, runner): - prev = self._subprocess_runner - self._subprocess_runner = runner - yield - self._subprocess_runner = prev - - def get_requires_for_build_wheel(self, config_settings=None): - """Identify packages required for building a wheel - - Returns a list of dependency specifications, e.g.: - ["wheel >= 0.25", "setuptools"] - - This does not include requirements specified in pyproject.toml. - It returns the result of calling the equivalently named hook in a - subprocess. - """ - return self._call_hook('get_requires_for_build_wheel', { - 'config_settings': config_settings - }) - - def prepare_metadata_for_build_wheel( - self, metadata_directory, config_settings=None): - """Prepare a *.dist-info folder with metadata for this project. - - Returns the name of the newly created folder. - - If the build backend defines a hook with this name, it will be called - in a subprocess. If not, the backend will be asked to build a wheel, - and the dist-info extracted from that. - """ - return self._call_hook('prepare_metadata_for_build_wheel', { - 'metadata_directory': abspath(metadata_directory), - 'config_settings': config_settings, - }) - - def build_wheel( - self, wheel_directory, config_settings=None, - metadata_directory=None): - """Build a wheel from this project. - - Returns the name of the newly created file. - - In general, this will call the 'build_wheel' hook in the backend. - However, if that was previously called by - 'prepare_metadata_for_build_wheel', and the same metadata_directory is - used, the previously built wheel will be copied to wheel_directory. - """ - if metadata_directory is not None: - metadata_directory = abspath(metadata_directory) - return self._call_hook('build_wheel', { - 'wheel_directory': abspath(wheel_directory), - 'config_settings': config_settings, - 'metadata_directory': metadata_directory, - }) - - def get_requires_for_build_sdist(self, config_settings=None): - """Identify packages required for building a wheel - - Returns a list of dependency specifications, e.g.: - ["setuptools >= 26"] - - This does not include requirements specified in pyproject.toml. - It returns the result of calling the equivalently named hook in a - subprocess. - """ - return self._call_hook('get_requires_for_build_sdist', { - 'config_settings': config_settings - }) - - def build_sdist(self, sdist_directory, config_settings=None): - """Build an sdist from this project. - - Returns the name of the newly created file. - - This calls the 'build_sdist' backend hook in a subprocess. - """ - return self._call_hook('build_sdist', { - 'sdist_directory': abspath(sdist_directory), - 'config_settings': config_settings, - }) - - def _call_hook(self, hook_name, kwargs): - # On Python 2, pytoml returns Unicode values (which is correct) but the - # environment passed to check_call needs to contain string values. We - # convert here by encoding using ASCII (the backend can only contain - # letters, digits and _, . and : characters, and will be used as a - # Python identifier, so non-ASCII content is wrong on Python 2 in - # any case). - if sys.version_info[0] == 2: - build_backend = self.build_backend.encode('ASCII') - else: - build_backend = self.build_backend - - with tempdir() as td: - compat.write_json({'kwargs': kwargs}, pjoin(td, 'input.json'), - indent=2) - - # Run the hook in a subprocess - self._subprocess_runner( - [sys.executable, _in_proc_script, hook_name, td], - cwd=self.source_dir, - extra_environ={'PEP517_BUILD_BACKEND': build_backend} - ) - - data = compat.read_json(pjoin(td, 'output.json')) - if data.get('unsupported'): - raise UnsupportedOperation - if data.get('no_backend'): - raise BackendUnavailable - return data['return_val'] diff --git a/env/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__init__.py b/env/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__init__.py deleted file mode 100644 index fdd40de..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__init__.py +++ /dev/null @@ -1,3286 +0,0 @@ -# coding: utf-8 -""" -Package resource API --------------------- - -A resource is a logical file contained within a package, or a logical -subdirectory thereof. The package resource API expects resource names -to have their path parts separated with ``/``, *not* whatever the local -path separator is. Do not use os.path operations to manipulate resource -names being passed into the API. - -The package resource API is designed to work with normal filesystem packages, -.egg files, and unpacked .egg files. It can also work in a limited way with -.zip files and with custom PEP 302 loaders that support the ``get_data()`` -method. -""" - -from __future__ import absolute_import - -import sys -import os -import io -import time -import re -import types -import zipfile -import zipimport -import warnings -import stat -import functools -import pkgutil -import operator -import platform -import collections -import plistlib -import email.parser -import errno -import tempfile -import textwrap -import itertools -import inspect -import ntpath -import posixpath -from pkgutil import get_importer - -try: - import _imp -except ImportError: - # Python 3.2 compatibility - import imp as _imp - -try: - FileExistsError -except NameError: - FileExistsError = OSError - -from pip._vendor import six -from pip._vendor.six.moves import urllib, map, filter - -# capture these to bypass sandboxing -from os import utime -try: - from os import mkdir, rename, unlink - WRITE_SUPPORT = True -except ImportError: - # no write support, probably under GAE - WRITE_SUPPORT = False - -from os import open as os_open -from os.path import isdir, split - -try: - import importlib.machinery as importlib_machinery - # access attribute to force import under delayed import mechanisms. - importlib_machinery.__name__ -except ImportError: - importlib_machinery = None - -from . import py31compat -from pip._vendor import appdirs -from pip._vendor import packaging -__import__('pip._vendor.packaging.version') -__import__('pip._vendor.packaging.specifiers') -__import__('pip._vendor.packaging.requirements') -__import__('pip._vendor.packaging.markers') - - -__metaclass__ = type - - -if (3, 0) < sys.version_info < (3, 4): - raise RuntimeError("Python 3.4 or later is required") - -if six.PY2: - # Those builtin exceptions are only defined in Python 3 - PermissionError = None - NotADirectoryError = None - -# declare some globals that will be defined later to -# satisfy the linters. -require = None -working_set = None -add_activation_listener = None -resources_stream = None -cleanup_resources = None -resource_dir = None -resource_stream = None -set_extraction_path = None -resource_isdir = None -resource_string = None -iter_entry_points = None -resource_listdir = None -resource_filename = None -resource_exists = None -_distribution_finders = None -_namespace_handlers = None -_namespace_packages = None - - -class PEP440Warning(RuntimeWarning): - """ - Used when there is an issue with a version or specifier not complying with - PEP 440. - """ - - -def parse_version(v): - try: - return packaging.version.Version(v) - except packaging.version.InvalidVersion: - return packaging.version.LegacyVersion(v) - - -_state_vars = {} - - -def _declare_state(vartype, **kw): - globals().update(kw) - _state_vars.update(dict.fromkeys(kw, vartype)) - - -def __getstate__(): - state = {} - g = globals() - for k, v in _state_vars.items(): - state[k] = g['_sget_' + v](g[k]) - return state - - -def __setstate__(state): - g = globals() - for k, v in state.items(): - g['_sset_' + _state_vars[k]](k, g[k], v) - return state - - -def _sget_dict(val): - return val.copy() - - -def _sset_dict(key, ob, state): - ob.clear() - ob.update(state) - - -def _sget_object(val): - return val.__getstate__() - - -def _sset_object(key, ob, state): - ob.__setstate__(state) - - -_sget_none = _sset_none = lambda *args: None - - -def get_supported_platform(): - """Return this platform's maximum compatible version. - - distutils.util.get_platform() normally reports the minimum version - of Mac OS X that would be required to *use* extensions produced by - distutils. But what we want when checking compatibility is to know the - version of Mac OS X that we are *running*. To allow usage of packages that - explicitly require a newer version of Mac OS X, we must also know the - current version of the OS. - - If this condition occurs for any other platform with a version in its - platform strings, this function should be extended accordingly. - """ - plat = get_build_platform() - m = macosVersionString.match(plat) - if m is not None and sys.platform == "darwin": - try: - plat = 'macosx-%s-%s' % ('.'.join(_macosx_vers()[:2]), m.group(3)) - except ValueError: - # not Mac OS X - pass - return plat - - -__all__ = [ - # Basic resource access and distribution/entry point discovery - 'require', 'run_script', 'get_provider', 'get_distribution', - 'load_entry_point', 'get_entry_map', 'get_entry_info', - 'iter_entry_points', - 'resource_string', 'resource_stream', 'resource_filename', - 'resource_listdir', 'resource_exists', 'resource_isdir', - - # Environmental control - 'declare_namespace', 'working_set', 'add_activation_listener', - 'find_distributions', 'set_extraction_path', 'cleanup_resources', - 'get_default_cache', - - # Primary implementation classes - 'Environment', 'WorkingSet', 'ResourceManager', - 'Distribution', 'Requirement', 'EntryPoint', - - # Exceptions - 'ResolutionError', 'VersionConflict', 'DistributionNotFound', - 'UnknownExtra', 'ExtractionError', - - # Warnings - 'PEP440Warning', - - # Parsing functions and string utilities - 'parse_requirements', 'parse_version', 'safe_name', 'safe_version', - 'get_platform', 'compatible_platforms', 'yield_lines', 'split_sections', - 'safe_extra', 'to_filename', 'invalid_marker', 'evaluate_marker', - - # filesystem utilities - 'ensure_directory', 'normalize_path', - - # Distribution "precedence" constants - 'EGG_DIST', 'BINARY_DIST', 'SOURCE_DIST', 'CHECKOUT_DIST', 'DEVELOP_DIST', - - # "Provider" interfaces, implementations, and registration/lookup APIs - 'IMetadataProvider', 'IResourceProvider', 'FileMetadata', - 'PathMetadata', 'EggMetadata', 'EmptyProvider', 'empty_provider', - 'NullProvider', 'EggProvider', 'DefaultProvider', 'ZipProvider', - 'register_finder', 'register_namespace_handler', 'register_loader_type', - 'fixup_namespace_packages', 'get_importer', - - # Warnings - 'PkgResourcesDeprecationWarning', - - # Deprecated/backward compatibility only - 'run_main', 'AvailableDistributions', -] - - -class ResolutionError(Exception): - """Abstract base for dependency resolution errors""" - - def __repr__(self): - return self.__class__.__name__ + repr(self.args) - - -class VersionConflict(ResolutionError): - """ - An already-installed version conflicts with the requested version. - - Should be initialized with the installed Distribution and the requested - Requirement. - """ - - _template = "{self.dist} is installed but {self.req} is required" - - @property - def dist(self): - return self.args[0] - - @property - def req(self): - return self.args[1] - - def report(self): - return self._template.format(**locals()) - - def with_context(self, required_by): - """ - If required_by is non-empty, return a version of self that is a - ContextualVersionConflict. - """ - if not required_by: - return self - args = self.args + (required_by,) - return ContextualVersionConflict(*args) - - -class ContextualVersionConflict(VersionConflict): - """ - A VersionConflict that accepts a third parameter, the set of the - requirements that required the installed Distribution. - """ - - _template = VersionConflict._template + ' by {self.required_by}' - - @property - def required_by(self): - return self.args[2] - - -class DistributionNotFound(ResolutionError): - """A requested distribution was not found""" - - _template = ("The '{self.req}' distribution was not found " - "and is required by {self.requirers_str}") - - @property - def req(self): - return self.args[0] - - @property - def requirers(self): - return self.args[1] - - @property - def requirers_str(self): - if not self.requirers: - return 'the application' - return ', '.join(self.requirers) - - def report(self): - return self._template.format(**locals()) - - def __str__(self): - return self.report() - - -class UnknownExtra(ResolutionError): - """Distribution doesn't have an "extra feature" of the given name""" - - -_provider_factories = {} - -PY_MAJOR = sys.version[:3] -EGG_DIST = 3 -BINARY_DIST = 2 -SOURCE_DIST = 1 -CHECKOUT_DIST = 0 -DEVELOP_DIST = -1 - - -def register_loader_type(loader_type, provider_factory): - """Register `provider_factory` to make providers for `loader_type` - - `loader_type` is the type or class of a PEP 302 ``module.__loader__``, - and `provider_factory` is a function that, passed a *module* object, - returns an ``IResourceProvider`` for that module. - """ - _provider_factories[loader_type] = provider_factory - - -def get_provider(moduleOrReq): - """Return an IResourceProvider for the named module or requirement""" - if isinstance(moduleOrReq, Requirement): - return working_set.find(moduleOrReq) or require(str(moduleOrReq))[0] - try: - module = sys.modules[moduleOrReq] - except KeyError: - __import__(moduleOrReq) - module = sys.modules[moduleOrReq] - loader = getattr(module, '__loader__', None) - return _find_adapter(_provider_factories, loader)(module) - - -def _macosx_vers(_cache=[]): - if not _cache: - version = platform.mac_ver()[0] - # fallback for MacPorts - if version == '': - plist = '/System/Library/CoreServices/SystemVersion.plist' - if os.path.exists(plist): - if hasattr(plistlib, 'readPlist'): - plist_content = plistlib.readPlist(plist) - if 'ProductVersion' in plist_content: - version = plist_content['ProductVersion'] - - _cache.append(version.split('.')) - return _cache[0] - - -def _macosx_arch(machine): - return {'PowerPC': 'ppc', 'Power_Macintosh': 'ppc'}.get(machine, machine) - - -def get_build_platform(): - """Return this platform's string for platform-specific distributions - - XXX Currently this is the same as ``distutils.util.get_platform()``, but it - needs some hacks for Linux and Mac OS X. - """ - from sysconfig import get_platform - - plat = get_platform() - if sys.platform == "darwin" and not plat.startswith('macosx-'): - try: - version = _macosx_vers() - machine = os.uname()[4].replace(" ", "_") - return "macosx-%d.%d-%s" % ( - int(version[0]), int(version[1]), - _macosx_arch(machine), - ) - except ValueError: - # if someone is running a non-Mac darwin system, this will fall - # through to the default implementation - pass - return plat - - -macosVersionString = re.compile(r"macosx-(\d+)\.(\d+)-(.*)") -darwinVersionString = re.compile(r"darwin-(\d+)\.(\d+)\.(\d+)-(.*)") -# XXX backward compat -get_platform = get_build_platform - - -def compatible_platforms(provided, required): - """Can code for the `provided` platform run on the `required` platform? - - Returns true if either platform is ``None``, or the platforms are equal. - - XXX Needs compatibility checks for Linux and other unixy OSes. - """ - if provided is None or required is None or provided == required: - # easy case - return True - - # Mac OS X special cases - reqMac = macosVersionString.match(required) - if reqMac: - provMac = macosVersionString.match(provided) - - # is this a Mac package? - if not provMac: - # this is backwards compatibility for packages built before - # setuptools 0.6. All packages built after this point will - # use the new macosx designation. - provDarwin = darwinVersionString.match(provided) - if provDarwin: - dversion = int(provDarwin.group(1)) - macosversion = "%s.%s" % (reqMac.group(1), reqMac.group(2)) - if dversion == 7 and macosversion >= "10.3" or \ - dversion == 8 and macosversion >= "10.4": - return True - # egg isn't macosx or legacy darwin - return False - - # are they the same major version and machine type? - if provMac.group(1) != reqMac.group(1) or \ - provMac.group(3) != reqMac.group(3): - return False - - # is the required OS major update >= the provided one? - if int(provMac.group(2)) > int(reqMac.group(2)): - return False - - return True - - # XXX Linux and other platforms' special cases should go here - return False - - -def run_script(dist_spec, script_name): - """Locate distribution `dist_spec` and run its `script_name` script""" - ns = sys._getframe(1).f_globals - name = ns['__name__'] - ns.clear() - ns['__name__'] = name - require(dist_spec)[0].run_script(script_name, ns) - - -# backward compatibility -run_main = run_script - - -def get_distribution(dist): - """Return a current distribution object for a Requirement or string""" - if isinstance(dist, six.string_types): - dist = Requirement.parse(dist) - if isinstance(dist, Requirement): - dist = get_provider(dist) - if not isinstance(dist, Distribution): - raise TypeError("Expected string, Requirement, or Distribution", dist) - return dist - - -def load_entry_point(dist, group, name): - """Return `name` entry point of `group` for `dist` or raise ImportError""" - return get_distribution(dist).load_entry_point(group, name) - - -def get_entry_map(dist, group=None): - """Return the entry point map for `group`, or the full entry map""" - return get_distribution(dist).get_entry_map(group) - - -def get_entry_info(dist, group, name): - """Return the EntryPoint object for `group`+`name`, or ``None``""" - return get_distribution(dist).get_entry_info(group, name) - - -class IMetadataProvider: - def has_metadata(name): - """Does the package's distribution contain the named metadata?""" - - def get_metadata(name): - """The named metadata resource as a string""" - - def get_metadata_lines(name): - """Yield named metadata resource as list of non-blank non-comment lines - - Leading and trailing whitespace is stripped from each line, and lines - with ``#`` as the first non-blank character are omitted.""" - - def metadata_isdir(name): - """Is the named metadata a directory? (like ``os.path.isdir()``)""" - - def metadata_listdir(name): - """List of metadata names in the directory (like ``os.listdir()``)""" - - def run_script(script_name, namespace): - """Execute the named script in the supplied namespace dictionary""" - - -class IResourceProvider(IMetadataProvider): - """An object that provides access to package resources""" - - def get_resource_filename(manager, resource_name): - """Return a true filesystem path for `resource_name` - - `manager` must be an ``IResourceManager``""" - - def get_resource_stream(manager, resource_name): - """Return a readable file-like object for `resource_name` - - `manager` must be an ``IResourceManager``""" - - def get_resource_string(manager, resource_name): - """Return a string containing the contents of `resource_name` - - `manager` must be an ``IResourceManager``""" - - def has_resource(resource_name): - """Does the package contain the named resource?""" - - def resource_isdir(resource_name): - """Is the named resource a directory? (like ``os.path.isdir()``)""" - - def resource_listdir(resource_name): - """List of resource names in the directory (like ``os.listdir()``)""" - - -class WorkingSet: - """A collection of active distributions on sys.path (or a similar list)""" - - def __init__(self, entries=None): - """Create working set from list of path entries (default=sys.path)""" - self.entries = [] - self.entry_keys = {} - self.by_key = {} - self.callbacks = [] - - if entries is None: - entries = sys.path - - for entry in entries: - self.add_entry(entry) - - @classmethod - def _build_master(cls): - """ - Prepare the master working set. - """ - ws = cls() - try: - from __main__ import __requires__ - except ImportError: - # The main program does not list any requirements - return ws - - # ensure the requirements are met - try: - ws.require(__requires__) - except VersionConflict: - return cls._build_from_requirements(__requires__) - - return ws - - @classmethod - def _build_from_requirements(cls, req_spec): - """ - Build a working set from a requirement spec. Rewrites sys.path. - """ - # try it without defaults already on sys.path - # by starting with an empty path - ws = cls([]) - reqs = parse_requirements(req_spec) - dists = ws.resolve(reqs, Environment()) - for dist in dists: - ws.add(dist) - - # add any missing entries from sys.path - for entry in sys.path: - if entry not in ws.entries: - ws.add_entry(entry) - - # then copy back to sys.path - sys.path[:] = ws.entries - return ws - - def add_entry(self, entry): - """Add a path item to ``.entries``, finding any distributions on it - - ``find_distributions(entry, True)`` is used to find distributions - corresponding to the path entry, and they are added. `entry` is - always appended to ``.entries``, even if it is already present. - (This is because ``sys.path`` can contain the same value more than - once, and the ``.entries`` of the ``sys.path`` WorkingSet should always - equal ``sys.path``.) - """ - self.entry_keys.setdefault(entry, []) - self.entries.append(entry) - for dist in find_distributions(entry, True): - self.add(dist, entry, False) - - def __contains__(self, dist): - """True if `dist` is the active distribution for its project""" - return self.by_key.get(dist.key) == dist - - def find(self, req): - """Find a distribution matching requirement `req` - - If there is an active distribution for the requested project, this - returns it as long as it meets the version requirement specified by - `req`. But, if there is an active distribution for the project and it - does *not* meet the `req` requirement, ``VersionConflict`` is raised. - If there is no active distribution for the requested project, ``None`` - is returned. - """ - dist = self.by_key.get(req.key) - if dist is not None and dist not in req: - # XXX add more info - raise VersionConflict(dist, req) - return dist - - def iter_entry_points(self, group, name=None): - """Yield entry point objects from `group` matching `name` - - If `name` is None, yields all entry points in `group` from all - distributions in the working set, otherwise only ones matching - both `group` and `name` are yielded (in distribution order). - """ - return ( - entry - for dist in self - for entry in dist.get_entry_map(group).values() - if name is None or name == entry.name - ) - - def run_script(self, requires, script_name): - """Locate distribution for `requires` and run `script_name` script""" - ns = sys._getframe(1).f_globals - name = ns['__name__'] - ns.clear() - ns['__name__'] = name - self.require(requires)[0].run_script(script_name, ns) - - def __iter__(self): - """Yield distributions for non-duplicate projects in the working set - - The yield order is the order in which the items' path entries were - added to the working set. - """ - seen = {} - for item in self.entries: - if item not in self.entry_keys: - # workaround a cache issue - continue - - for key in self.entry_keys[item]: - if key not in seen: - seen[key] = 1 - yield self.by_key[key] - - def add(self, dist, entry=None, insert=True, replace=False): - """Add `dist` to working set, associated with `entry` - - If `entry` is unspecified, it defaults to the ``.location`` of `dist`. - On exit from this routine, `entry` is added to the end of the working - set's ``.entries`` (if it wasn't already present). - - `dist` is only added to the working set if it's for a project that - doesn't already have a distribution in the set, unless `replace=True`. - If it's added, any callbacks registered with the ``subscribe()`` method - will be called. - """ - if insert: - dist.insert_on(self.entries, entry, replace=replace) - - if entry is None: - entry = dist.location - keys = self.entry_keys.setdefault(entry, []) - keys2 = self.entry_keys.setdefault(dist.location, []) - if not replace and dist.key in self.by_key: - # ignore hidden distros - return - - self.by_key[dist.key] = dist - if dist.key not in keys: - keys.append(dist.key) - if dist.key not in keys2: - keys2.append(dist.key) - self._added_new(dist) - - def resolve(self, requirements, env=None, installer=None, - replace_conflicting=False, extras=None): - """List all distributions needed to (recursively) meet `requirements` - - `requirements` must be a sequence of ``Requirement`` objects. `env`, - if supplied, should be an ``Environment`` instance. If - not supplied, it defaults to all distributions available within any - entry or distribution in the working set. `installer`, if supplied, - will be invoked with each requirement that cannot be met by an - already-installed distribution; it should return a ``Distribution`` or - ``None``. - - Unless `replace_conflicting=True`, raises a VersionConflict exception - if - any requirements are found on the path that have the correct name but - the wrong version. Otherwise, if an `installer` is supplied it will be - invoked to obtain the correct version of the requirement and activate - it. - - `extras` is a list of the extras to be used with these requirements. - This is important because extra requirements may look like `my_req; - extra = "my_extra"`, which would otherwise be interpreted as a purely - optional requirement. Instead, we want to be able to assert that these - requirements are truly required. - """ - - # set up the stack - requirements = list(requirements)[::-1] - # set of processed requirements - processed = {} - # key -> dist - best = {} - to_activate = [] - - req_extras = _ReqExtras() - - # Mapping of requirement to set of distributions that required it; - # useful for reporting info about conflicts. - required_by = collections.defaultdict(set) - - while requirements: - # process dependencies breadth-first - req = requirements.pop(0) - if req in processed: - # Ignore cyclic or redundant dependencies - continue - - if not req_extras.markers_pass(req, extras): - continue - - dist = best.get(req.key) - if dist is None: - # Find the best distribution and add it to the map - dist = self.by_key.get(req.key) - if dist is None or (dist not in req and replace_conflicting): - ws = self - if env is None: - if dist is None: - env = Environment(self.entries) - else: - # Use an empty environment and workingset to avoid - # any further conflicts with the conflicting - # distribution - env = Environment([]) - ws = WorkingSet([]) - dist = best[req.key] = env.best_match( - req, ws, installer, - replace_conflicting=replace_conflicting - ) - if dist is None: - requirers = required_by.get(req, None) - raise DistributionNotFound(req, requirers) - to_activate.append(dist) - if dist not in req: - # Oops, the "best" so far conflicts with a dependency - dependent_req = required_by[req] - raise VersionConflict(dist, req).with_context(dependent_req) - - # push the new requirements onto the stack - new_requirements = dist.requires(req.extras)[::-1] - requirements.extend(new_requirements) - - # Register the new requirements needed by req - for new_requirement in new_requirements: - required_by[new_requirement].add(req.project_name) - req_extras[new_requirement] = req.extras - - processed[req] = True - - # return list of distros to activate - return to_activate - - def find_plugins( - self, plugin_env, full_env=None, installer=None, fallback=True): - """Find all activatable distributions in `plugin_env` - - Example usage:: - - distributions, errors = working_set.find_plugins( - Environment(plugin_dirlist) - ) - # add plugins+libs to sys.path - map(working_set.add, distributions) - # display errors - print('Could not load', errors) - - The `plugin_env` should be an ``Environment`` instance that contains - only distributions that are in the project's "plugin directory" or - directories. The `full_env`, if supplied, should be an ``Environment`` - contains all currently-available distributions. If `full_env` is not - supplied, one is created automatically from the ``WorkingSet`` this - method is called on, which will typically mean that every directory on - ``sys.path`` will be scanned for distributions. - - `installer` is a standard installer callback as used by the - ``resolve()`` method. The `fallback` flag indicates whether we should - attempt to resolve older versions of a plugin if the newest version - cannot be resolved. - - This method returns a 2-tuple: (`distributions`, `error_info`), where - `distributions` is a list of the distributions found in `plugin_env` - that were loadable, along with any other distributions that are needed - to resolve their dependencies. `error_info` is a dictionary mapping - unloadable plugin distributions to an exception instance describing the - error that occurred. Usually this will be a ``DistributionNotFound`` or - ``VersionConflict`` instance. - """ - - plugin_projects = list(plugin_env) - # scan project names in alphabetic order - plugin_projects.sort() - - error_info = {} - distributions = {} - - if full_env is None: - env = Environment(self.entries) - env += plugin_env - else: - env = full_env + plugin_env - - shadow_set = self.__class__([]) - # put all our entries in shadow_set - list(map(shadow_set.add, self)) - - for project_name in plugin_projects: - - for dist in plugin_env[project_name]: - - req = [dist.as_requirement()] - - try: - resolvees = shadow_set.resolve(req, env, installer) - - except ResolutionError as v: - # save error info - error_info[dist] = v - if fallback: - # try the next older version of project - continue - else: - # give up on this project, keep going - break - - else: - list(map(shadow_set.add, resolvees)) - distributions.update(dict.fromkeys(resolvees)) - - # success, no need to try any more versions of this project - break - - distributions = list(distributions) - distributions.sort() - - return distributions, error_info - - def require(self, *requirements): - """Ensure that distributions matching `requirements` are activated - - `requirements` must be a string or a (possibly-nested) sequence - thereof, specifying the distributions and versions required. The - return value is a sequence of the distributions that needed to be - activated to fulfill the requirements; all relevant distributions are - included, even if they were already activated in this working set. - """ - needed = self.resolve(parse_requirements(requirements)) - - for dist in needed: - self.add(dist) - - return needed - - def subscribe(self, callback, existing=True): - """Invoke `callback` for all distributions - - If `existing=True` (default), - call on all existing ones, as well. - """ - if callback in self.callbacks: - return - self.callbacks.append(callback) - if not existing: - return - for dist in self: - callback(dist) - - def _added_new(self, dist): - for callback in self.callbacks: - callback(dist) - - def __getstate__(self): - return ( - self.entries[:], self.entry_keys.copy(), self.by_key.copy(), - self.callbacks[:] - ) - - def __setstate__(self, e_k_b_c): - entries, keys, by_key, callbacks = e_k_b_c - self.entries = entries[:] - self.entry_keys = keys.copy() - self.by_key = by_key.copy() - self.callbacks = callbacks[:] - - -class _ReqExtras(dict): - """ - Map each requirement to the extras that demanded it. - """ - - def markers_pass(self, req, extras=None): - """ - Evaluate markers for req against each extra that - demanded it. - - Return False if the req has a marker and fails - evaluation. Otherwise, return True. - """ - extra_evals = ( - req.marker.evaluate({'extra': extra}) - for extra in self.get(req, ()) + (extras or (None,)) - ) - return not req.marker or any(extra_evals) - - -class Environment: - """Searchable snapshot of distributions on a search path""" - - def __init__( - self, search_path=None, platform=get_supported_platform(), - python=PY_MAJOR): - """Snapshot distributions available on a search path - - Any distributions found on `search_path` are added to the environment. - `search_path` should be a sequence of ``sys.path`` items. If not - supplied, ``sys.path`` is used. - - `platform` is an optional string specifying the name of the platform - that platform-specific distributions must be compatible with. If - unspecified, it defaults to the current platform. `python` is an - optional string naming the desired version of Python (e.g. ``'3.6'``); - it defaults to the current version. - - You may explicitly set `platform` (and/or `python`) to ``None`` if you - wish to map *all* distributions, not just those compatible with the - running platform or Python version. - """ - self._distmap = {} - self.platform = platform - self.python = python - self.scan(search_path) - - def can_add(self, dist): - """Is distribution `dist` acceptable for this environment? - - The distribution must match the platform and python version - requirements specified when this environment was created, or False - is returned. - """ - py_compat = ( - self.python is None - or dist.py_version is None - or dist.py_version == self.python - ) - return py_compat and compatible_platforms(dist.platform, self.platform) - - def remove(self, dist): - """Remove `dist` from the environment""" - self._distmap[dist.key].remove(dist) - - def scan(self, search_path=None): - """Scan `search_path` for distributions usable in this environment - - Any distributions found are added to the environment. - `search_path` should be a sequence of ``sys.path`` items. If not - supplied, ``sys.path`` is used. Only distributions conforming to - the platform/python version defined at initialization are added. - """ - if search_path is None: - search_path = sys.path - - for item in search_path: - for dist in find_distributions(item): - self.add(dist) - - def __getitem__(self, project_name): - """Return a newest-to-oldest list of distributions for `project_name` - - Uses case-insensitive `project_name` comparison, assuming all the - project's distributions use their project's name converted to all - lowercase as their key. - - """ - distribution_key = project_name.lower() - return self._distmap.get(distribution_key, []) - - def add(self, dist): - """Add `dist` if we ``can_add()`` it and it has not already been added - """ - if self.can_add(dist) and dist.has_version(): - dists = self._distmap.setdefault(dist.key, []) - if dist not in dists: - dists.append(dist) - dists.sort(key=operator.attrgetter('hashcmp'), reverse=True) - - def best_match( - self, req, working_set, installer=None, replace_conflicting=False): - """Find distribution best matching `req` and usable on `working_set` - - This calls the ``find(req)`` method of the `working_set` to see if a - suitable distribution is already active. (This may raise - ``VersionConflict`` if an unsuitable version of the project is already - active in the specified `working_set`.) If a suitable distribution - isn't active, this method returns the newest distribution in the - environment that meets the ``Requirement`` in `req`. If no suitable - distribution is found, and `installer` is supplied, then the result of - calling the environment's ``obtain(req, installer)`` method will be - returned. - """ - try: - dist = working_set.find(req) - except VersionConflict: - if not replace_conflicting: - raise - dist = None - if dist is not None: - return dist - for dist in self[req.key]: - if dist in req: - return dist - # try to download/install - return self.obtain(req, installer) - - def obtain(self, requirement, installer=None): - """Obtain a distribution matching `requirement` (e.g. via download) - - Obtain a distro that matches requirement (e.g. via download). In the - base ``Environment`` class, this routine just returns - ``installer(requirement)``, unless `installer` is None, in which case - None is returned instead. This method is a hook that allows subclasses - to attempt other ways of obtaining a distribution before falling back - to the `installer` argument.""" - if installer is not None: - return installer(requirement) - - def __iter__(self): - """Yield the unique project names of the available distributions""" - for key in self._distmap.keys(): - if self[key]: - yield key - - def __iadd__(self, other): - """In-place addition of a distribution or environment""" - if isinstance(other, Distribution): - self.add(other) - elif isinstance(other, Environment): - for project in other: - for dist in other[project]: - self.add(dist) - else: - raise TypeError("Can't add %r to environment" % (other,)) - return self - - def __add__(self, other): - """Add an environment or distribution to an environment""" - new = self.__class__([], platform=None, python=None) - for env in self, other: - new += env - return new - - -# XXX backward compatibility -AvailableDistributions = Environment - - -class ExtractionError(RuntimeError): - """An error occurred extracting a resource - - The following attributes are available from instances of this exception: - - manager - The resource manager that raised this exception - - cache_path - The base directory for resource extraction - - original_error - The exception instance that caused extraction to fail - """ - - -class ResourceManager: - """Manage resource extraction and packages""" - extraction_path = None - - def __init__(self): - self.cached_files = {} - - def resource_exists(self, package_or_requirement, resource_name): - """Does the named resource exist?""" - return get_provider(package_or_requirement).has_resource(resource_name) - - def resource_isdir(self, package_or_requirement, resource_name): - """Is the named resource an existing directory?""" - return get_provider(package_or_requirement).resource_isdir( - resource_name - ) - - def resource_filename(self, package_or_requirement, resource_name): - """Return a true filesystem path for specified resource""" - return get_provider(package_or_requirement).get_resource_filename( - self, resource_name - ) - - def resource_stream(self, package_or_requirement, resource_name): - """Return a readable file-like object for specified resource""" - return get_provider(package_or_requirement).get_resource_stream( - self, resource_name - ) - - def resource_string(self, package_or_requirement, resource_name): - """Return specified resource as a string""" - return get_provider(package_or_requirement).get_resource_string( - self, resource_name - ) - - def resource_listdir(self, package_or_requirement, resource_name): - """List the contents of the named resource directory""" - return get_provider(package_or_requirement).resource_listdir( - resource_name - ) - - def extraction_error(self): - """Give an error message for problems extracting file(s)""" - - old_exc = sys.exc_info()[1] - cache_path = self.extraction_path or get_default_cache() - - tmpl = textwrap.dedent(""" - Can't extract file(s) to egg cache - - The following error occurred while trying to extract file(s) - to the Python egg cache: - - {old_exc} - - The Python egg cache directory is currently set to: - - {cache_path} - - Perhaps your account does not have write access to this directory? - You can change the cache directory by setting the PYTHON_EGG_CACHE - environment variable to point to an accessible directory. - """).lstrip() - err = ExtractionError(tmpl.format(**locals())) - err.manager = self - err.cache_path = cache_path - err.original_error = old_exc - raise err - - def get_cache_path(self, archive_name, names=()): - """Return absolute location in cache for `archive_name` and `names` - - The parent directory of the resulting path will be created if it does - not already exist. `archive_name` should be the base filename of the - enclosing egg (which may not be the name of the enclosing zipfile!), - including its ".egg" extension. `names`, if provided, should be a - sequence of path name parts "under" the egg's extraction location. - - This method should only be called by resource providers that need to - obtain an extraction location, and only for names they intend to - extract, as it tracks the generated names for possible cleanup later. - """ - extract_path = self.extraction_path or get_default_cache() - target_path = os.path.join(extract_path, archive_name + '-tmp', *names) - try: - _bypass_ensure_directory(target_path) - except Exception: - self.extraction_error() - - self._warn_unsafe_extraction_path(extract_path) - - self.cached_files[target_path] = 1 - return target_path - - @staticmethod - def _warn_unsafe_extraction_path(path): - """ - If the default extraction path is overridden and set to an insecure - location, such as /tmp, it opens up an opportunity for an attacker to - replace an extracted file with an unauthorized payload. Warn the user - if a known insecure location is used. - - See Distribute #375 for more details. - """ - if os.name == 'nt' and not path.startswith(os.environ['windir']): - # On Windows, permissions are generally restrictive by default - # and temp directories are not writable by other users, so - # bypass the warning. - return - mode = os.stat(path).st_mode - if mode & stat.S_IWOTH or mode & stat.S_IWGRP: - msg = ( - "%s is writable by group/others and vulnerable to attack " - "when " - "used with get_resource_filename. Consider a more secure " - "location (set with .set_extraction_path or the " - "PYTHON_EGG_CACHE environment variable)." % path - ) - warnings.warn(msg, UserWarning) - - def postprocess(self, tempname, filename): - """Perform any platform-specific postprocessing of `tempname` - - This is where Mac header rewrites should be done; other platforms don't - have anything special they should do. - - Resource providers should call this method ONLY after successfully - extracting a compressed resource. They must NOT call it on resources - that are already in the filesystem. - - `tempname` is the current (temporary) name of the file, and `filename` - is the name it will be renamed to by the caller after this routine - returns. - """ - - if os.name == 'posix': - # Make the resource executable - mode = ((os.stat(tempname).st_mode) | 0o555) & 0o7777 - os.chmod(tempname, mode) - - def set_extraction_path(self, path): - """Set the base path where resources will be extracted to, if needed. - - If you do not call this routine before any extractions take place, the - path defaults to the return value of ``get_default_cache()``. (Which - is based on the ``PYTHON_EGG_CACHE`` environment variable, with various - platform-specific fallbacks. See that routine's documentation for more - details.) - - Resources are extracted to subdirectories of this path based upon - information given by the ``IResourceProvider``. You may set this to a - temporary directory, but then you must call ``cleanup_resources()`` to - delete the extracted files when done. There is no guarantee that - ``cleanup_resources()`` will be able to remove all extracted files. - - (Note: you may not change the extraction path for a given resource - manager once resources have been extracted, unless you first call - ``cleanup_resources()``.) - """ - if self.cached_files: - raise ValueError( - "Can't change extraction path, files already extracted" - ) - - self.extraction_path = path - - def cleanup_resources(self, force=False): - """ - Delete all extracted resource files and directories, returning a list - of the file and directory names that could not be successfully removed. - This function does not have any concurrency protection, so it should - generally only be called when the extraction path is a temporary - directory exclusive to a single process. This method is not - automatically called; you must call it explicitly or register it as an - ``atexit`` function if you wish to ensure cleanup of a temporary - directory used for extractions. - """ - # XXX - - -def get_default_cache(): - """ - Return the ``PYTHON_EGG_CACHE`` environment variable - or a platform-relevant user cache dir for an app - named "Python-Eggs". - """ - return ( - os.environ.get('PYTHON_EGG_CACHE') - or appdirs.user_cache_dir(appname='Python-Eggs') - ) - - -def safe_name(name): - """Convert an arbitrary string to a standard distribution name - - Any runs of non-alphanumeric/. characters are replaced with a single '-'. - """ - return re.sub('[^A-Za-z0-9.]+', '-', name) - - -def safe_version(version): - """ - Convert an arbitrary string to a standard version string - """ - try: - # normalize the version - return str(packaging.version.Version(version)) - except packaging.version.InvalidVersion: - version = version.replace(' ', '.') - return re.sub('[^A-Za-z0-9.]+', '-', version) - - -def safe_extra(extra): - """Convert an arbitrary string to a standard 'extra' name - - Any runs of non-alphanumeric characters are replaced with a single '_', - and the result is always lowercased. - """ - return re.sub('[^A-Za-z0-9.-]+', '_', extra).lower() - - -def to_filename(name): - """Convert a project or version name to its filename-escaped form - - Any '-' characters are currently replaced with '_'. - """ - return name.replace('-', '_') - - -def invalid_marker(text): - """ - Validate text as a PEP 508 environment marker; return an exception - if invalid or False otherwise. - """ - try: - evaluate_marker(text) - except SyntaxError as e: - e.filename = None - e.lineno = None - return e - return False - - -def evaluate_marker(text, extra=None): - """ - Evaluate a PEP 508 environment marker. - Return a boolean indicating the marker result in this environment. - Raise SyntaxError if marker is invalid. - - This implementation uses the 'pyparsing' module. - """ - try: - marker = packaging.markers.Marker(text) - return marker.evaluate() - except packaging.markers.InvalidMarker as e: - raise SyntaxError(e) - - -class NullProvider: - """Try to implement resources and metadata for arbitrary PEP 302 loaders""" - - egg_name = None - egg_info = None - loader = None - - def __init__(self, module): - self.loader = getattr(module, '__loader__', None) - self.module_path = os.path.dirname(getattr(module, '__file__', '')) - - def get_resource_filename(self, manager, resource_name): - return self._fn(self.module_path, resource_name) - - def get_resource_stream(self, manager, resource_name): - return io.BytesIO(self.get_resource_string(manager, resource_name)) - - def get_resource_string(self, manager, resource_name): - return self._get(self._fn(self.module_path, resource_name)) - - def has_resource(self, resource_name): - return self._has(self._fn(self.module_path, resource_name)) - - def _get_metadata_path(self, name): - return self._fn(self.egg_info, name) - - def has_metadata(self, name): - if not self.egg_info: - return self.egg_info - - path = self._get_metadata_path(name) - return self._has(path) - - def get_metadata(self, name): - if not self.egg_info: - return "" - value = self._get(self._fn(self.egg_info, name)) - return value.decode('utf-8') if six.PY3 else value - - def get_metadata_lines(self, name): - return yield_lines(self.get_metadata(name)) - - def resource_isdir(self, resource_name): - return self._isdir(self._fn(self.module_path, resource_name)) - - def metadata_isdir(self, name): - return self.egg_info and self._isdir(self._fn(self.egg_info, name)) - - def resource_listdir(self, resource_name): - return self._listdir(self._fn(self.module_path, resource_name)) - - def metadata_listdir(self, name): - if self.egg_info: - return self._listdir(self._fn(self.egg_info, name)) - return [] - - def run_script(self, script_name, namespace): - script = 'scripts/' + script_name - if not self.has_metadata(script): - raise ResolutionError( - "Script {script!r} not found in metadata at {self.egg_info!r}" - .format(**locals()), - ) - script_text = self.get_metadata(script).replace('\r\n', '\n') - script_text = script_text.replace('\r', '\n') - script_filename = self._fn(self.egg_info, script) - namespace['__file__'] = script_filename - if os.path.exists(script_filename): - source = open(script_filename).read() - code = compile(source, script_filename, 'exec') - exec(code, namespace, namespace) - else: - from linecache import cache - cache[script_filename] = ( - len(script_text), 0, script_text.split('\n'), script_filename - ) - script_code = compile(script_text, script_filename, 'exec') - exec(script_code, namespace, namespace) - - def _has(self, path): - raise NotImplementedError( - "Can't perform this operation for unregistered loader type" - ) - - def _isdir(self, path): - raise NotImplementedError( - "Can't perform this operation for unregistered loader type" - ) - - def _listdir(self, path): - raise NotImplementedError( - "Can't perform this operation for unregistered loader type" - ) - - def _fn(self, base, resource_name): - self._validate_resource_path(resource_name) - if resource_name: - return os.path.join(base, *resource_name.split('/')) - return base - - @staticmethod - def _validate_resource_path(path): - """ - Validate the resource paths according to the docs. - https://setuptools.readthedocs.io/en/latest/pkg_resources.html#basic-resource-access - - >>> warned = getfixture('recwarn') - >>> warnings.simplefilter('always') - >>> vrp = NullProvider._validate_resource_path - >>> vrp('foo/bar.txt') - >>> bool(warned) - False - >>> vrp('../foo/bar.txt') - >>> bool(warned) - True - >>> warned.clear() - >>> vrp('/foo/bar.txt') - >>> bool(warned) - True - >>> vrp('foo/../../bar.txt') - >>> bool(warned) - True - >>> warned.clear() - >>> vrp('foo/f../bar.txt') - >>> bool(warned) - False - - Windows path separators are straight-up disallowed. - >>> vrp(r'\\foo/bar.txt') - Traceback (most recent call last): - ... - ValueError: Use of .. or absolute path in a resource path \ -is not allowed. - - >>> vrp(r'C:\\foo/bar.txt') - Traceback (most recent call last): - ... - ValueError: Use of .. or absolute path in a resource path \ -is not allowed. - - Blank values are allowed - - >>> vrp('') - >>> bool(warned) - False - - Non-string values are not. - - >>> vrp(None) - Traceback (most recent call last): - ... - AttributeError: ... - """ - invalid = ( - os.path.pardir in path.split(posixpath.sep) or - posixpath.isabs(path) or - ntpath.isabs(path) - ) - if not invalid: - return - - msg = "Use of .. or absolute path in a resource path is not allowed." - - # Aggressively disallow Windows absolute paths - if ntpath.isabs(path) and not posixpath.isabs(path): - raise ValueError(msg) - - # for compatibility, warn; in future - # raise ValueError(msg) - warnings.warn( - msg[:-1] + " and will raise exceptions in a future release.", - DeprecationWarning, - stacklevel=4, - ) - - def _get(self, path): - if hasattr(self.loader, 'get_data'): - return self.loader.get_data(path) - raise NotImplementedError( - "Can't perform this operation for loaders without 'get_data()'" - ) - - -register_loader_type(object, NullProvider) - - -class EggProvider(NullProvider): - """Provider based on a virtual filesystem""" - - def __init__(self, module): - NullProvider.__init__(self, module) - self._setup_prefix() - - def _setup_prefix(self): - # we assume here that our metadata may be nested inside a "basket" - # of multiple eggs; that's why we use module_path instead of .archive - path = self.module_path - old = None - while path != old: - if _is_egg_path(path): - self.egg_name = os.path.basename(path) - self.egg_info = os.path.join(path, 'EGG-INFO') - self.egg_root = path - break - old = path - path, base = os.path.split(path) - - -class DefaultProvider(EggProvider): - """Provides access to package resources in the filesystem""" - - def _has(self, path): - return os.path.exists(path) - - def _isdir(self, path): - return os.path.isdir(path) - - def _listdir(self, path): - return os.listdir(path) - - def get_resource_stream(self, manager, resource_name): - return open(self._fn(self.module_path, resource_name), 'rb') - - def _get(self, path): - with open(path, 'rb') as stream: - return stream.read() - - @classmethod - def _register(cls): - loader_names = 'SourceFileLoader', 'SourcelessFileLoader', - for name in loader_names: - loader_cls = getattr(importlib_machinery, name, type(None)) - register_loader_type(loader_cls, cls) - - -DefaultProvider._register() - - -class EmptyProvider(NullProvider): - """Provider that returns nothing for all requests""" - - module_path = None - - _isdir = _has = lambda self, path: False - - def _get(self, path): - return '' - - def _listdir(self, path): - return [] - - def __init__(self): - pass - - -empty_provider = EmptyProvider() - - -class ZipManifests(dict): - """ - zip manifest builder - """ - - @classmethod - def build(cls, path): - """ - Build a dictionary similar to the zipimport directory - caches, except instead of tuples, store ZipInfo objects. - - Use a platform-specific path separator (os.sep) for the path keys - for compatibility with pypy on Windows. - """ - with zipfile.ZipFile(path) as zfile: - items = ( - ( - name.replace('/', os.sep), - zfile.getinfo(name), - ) - for name in zfile.namelist() - ) - return dict(items) - - load = build - - -class MemoizedZipManifests(ZipManifests): - """ - Memoized zipfile manifests. - """ - manifest_mod = collections.namedtuple('manifest_mod', 'manifest mtime') - - def load(self, path): - """ - Load a manifest at path or return a suitable manifest already loaded. - """ - path = os.path.normpath(path) - mtime = os.stat(path).st_mtime - - if path not in self or self[path].mtime != mtime: - manifest = self.build(path) - self[path] = self.manifest_mod(manifest, mtime) - - return self[path].manifest - - -class ZipProvider(EggProvider): - """Resource support for zips and eggs""" - - eagers = None - _zip_manifests = MemoizedZipManifests() - - def __init__(self, module): - EggProvider.__init__(self, module) - self.zip_pre = self.loader.archive + os.sep - - def _zipinfo_name(self, fspath): - # Convert a virtual filename (full path to file) into a zipfile subpath - # usable with the zipimport directory cache for our target archive - fspath = fspath.rstrip(os.sep) - if fspath == self.loader.archive: - return '' - if fspath.startswith(self.zip_pre): - return fspath[len(self.zip_pre):] - raise AssertionError( - "%s is not a subpath of %s" % (fspath, self.zip_pre) - ) - - def _parts(self, zip_path): - # Convert a zipfile subpath into an egg-relative path part list. - # pseudo-fs path - fspath = self.zip_pre + zip_path - if fspath.startswith(self.egg_root + os.sep): - return fspath[len(self.egg_root) + 1:].split(os.sep) - raise AssertionError( - "%s is not a subpath of %s" % (fspath, self.egg_root) - ) - - @property - def zipinfo(self): - return self._zip_manifests.load(self.loader.archive) - - def get_resource_filename(self, manager, resource_name): - if not self.egg_name: - raise NotImplementedError( - "resource_filename() only supported for .egg, not .zip" - ) - # no need to lock for extraction, since we use temp names - zip_path = self._resource_to_zip(resource_name) - eagers = self._get_eager_resources() - if '/'.join(self._parts(zip_path)) in eagers: - for name in eagers: - self._extract_resource(manager, self._eager_to_zip(name)) - return self._extract_resource(manager, zip_path) - - @staticmethod - def _get_date_and_size(zip_stat): - size = zip_stat.file_size - # ymdhms+wday, yday, dst - date_time = zip_stat.date_time + (0, 0, -1) - # 1980 offset already done - timestamp = time.mktime(date_time) - return timestamp, size - - def _extract_resource(self, manager, zip_path): - - if zip_path in self._index(): - for name in self._index()[zip_path]: - last = self._extract_resource( - manager, os.path.join(zip_path, name) - ) - # return the extracted directory name - return os.path.dirname(last) - - timestamp, size = self._get_date_and_size(self.zipinfo[zip_path]) - - if not WRITE_SUPPORT: - raise IOError('"os.rename" and "os.unlink" are not supported ' - 'on this platform') - try: - - real_path = manager.get_cache_path( - self.egg_name, self._parts(zip_path) - ) - - if self._is_current(real_path, zip_path): - return real_path - - outf, tmpnam = _mkstemp( - ".$extract", - dir=os.path.dirname(real_path), - ) - os.write(outf, self.loader.get_data(zip_path)) - os.close(outf) - utime(tmpnam, (timestamp, timestamp)) - manager.postprocess(tmpnam, real_path) - - try: - rename(tmpnam, real_path) - - except os.error: - if os.path.isfile(real_path): - if self._is_current(real_path, zip_path): - # the file became current since it was checked above, - # so proceed. - return real_path - # Windows, del old file and retry - elif os.name == 'nt': - unlink(real_path) - rename(tmpnam, real_path) - return real_path - raise - - except os.error: - # report a user-friendly error - manager.extraction_error() - - return real_path - - def _is_current(self, file_path, zip_path): - """ - Return True if the file_path is current for this zip_path - """ - timestamp, size = self._get_date_and_size(self.zipinfo[zip_path]) - if not os.path.isfile(file_path): - return False - stat = os.stat(file_path) - if stat.st_size != size or stat.st_mtime != timestamp: - return False - # check that the contents match - zip_contents = self.loader.get_data(zip_path) - with open(file_path, 'rb') as f: - file_contents = f.read() - return zip_contents == file_contents - - def _get_eager_resources(self): - if self.eagers is None: - eagers = [] - for name in ('native_libs.txt', 'eager_resources.txt'): - if self.has_metadata(name): - eagers.extend(self.get_metadata_lines(name)) - self.eagers = eagers - return self.eagers - - def _index(self): - try: - return self._dirindex - except AttributeError: - ind = {} - for path in self.zipinfo: - parts = path.split(os.sep) - while parts: - parent = os.sep.join(parts[:-1]) - if parent in ind: - ind[parent].append(parts[-1]) - break - else: - ind[parent] = [parts.pop()] - self._dirindex = ind - return ind - - def _has(self, fspath): - zip_path = self._zipinfo_name(fspath) - return zip_path in self.zipinfo or zip_path in self._index() - - def _isdir(self, fspath): - return self._zipinfo_name(fspath) in self._index() - - def _listdir(self, fspath): - return list(self._index().get(self._zipinfo_name(fspath), ())) - - def _eager_to_zip(self, resource_name): - return self._zipinfo_name(self._fn(self.egg_root, resource_name)) - - def _resource_to_zip(self, resource_name): - return self._zipinfo_name(self._fn(self.module_path, resource_name)) - - -register_loader_type(zipimport.zipimporter, ZipProvider) - - -class FileMetadata(EmptyProvider): - """Metadata handler for standalone PKG-INFO files - - Usage:: - - metadata = FileMetadata("/path/to/PKG-INFO") - - This provider rejects all data and metadata requests except for PKG-INFO, - which is treated as existing, and will be the contents of the file at - the provided location. - """ - - def __init__(self, path): - self.path = path - - def _get_metadata_path(self, name): - return self.path - - def has_metadata(self, name): - return name == 'PKG-INFO' and os.path.isfile(self.path) - - def get_metadata(self, name): - if name != 'PKG-INFO': - raise KeyError("No metadata except PKG-INFO is available") - - with io.open(self.path, encoding='utf-8', errors="replace") as f: - metadata = f.read() - self._warn_on_replacement(metadata) - return metadata - - def _warn_on_replacement(self, metadata): - # Python 2.7 compat for: replacement_char = '�' - replacement_char = b'\xef\xbf\xbd'.decode('utf-8') - if replacement_char in metadata: - tmpl = "{self.path} could not be properly decoded in UTF-8" - msg = tmpl.format(**locals()) - warnings.warn(msg) - - def get_metadata_lines(self, name): - return yield_lines(self.get_metadata(name)) - - -class PathMetadata(DefaultProvider): - """Metadata provider for egg directories - - Usage:: - - # Development eggs: - - egg_info = "/path/to/PackageName.egg-info" - base_dir = os.path.dirname(egg_info) - metadata = PathMetadata(base_dir, egg_info) - dist_name = os.path.splitext(os.path.basename(egg_info))[0] - dist = Distribution(basedir, project_name=dist_name, metadata=metadata) - - # Unpacked egg directories: - - egg_path = "/path/to/PackageName-ver-pyver-etc.egg" - metadata = PathMetadata(egg_path, os.path.join(egg_path,'EGG-INFO')) - dist = Distribution.from_filename(egg_path, metadata=metadata) - """ - - def __init__(self, path, egg_info): - self.module_path = path - self.egg_info = egg_info - - -class EggMetadata(ZipProvider): - """Metadata provider for .egg files""" - - def __init__(self, importer): - """Create a metadata provider from a zipimporter""" - - self.zip_pre = importer.archive + os.sep - self.loader = importer - if importer.prefix: - self.module_path = os.path.join(importer.archive, importer.prefix) - else: - self.module_path = importer.archive - self._setup_prefix() - - -_declare_state('dict', _distribution_finders={}) - - -def register_finder(importer_type, distribution_finder): - """Register `distribution_finder` to find distributions in sys.path items - - `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item - handler), and `distribution_finder` is a callable that, passed a path - item and the importer instance, yields ``Distribution`` instances found on - that path item. See ``pkg_resources.find_on_path`` for an example.""" - _distribution_finders[importer_type] = distribution_finder - - -def find_distributions(path_item, only=False): - """Yield distributions accessible via `path_item`""" - importer = get_importer(path_item) - finder = _find_adapter(_distribution_finders, importer) - return finder(importer, path_item, only) - - -def find_eggs_in_zip(importer, path_item, only=False): - """ - Find eggs in zip files; possibly multiple nested eggs. - """ - if importer.archive.endswith('.whl'): - # wheels are not supported with this finder - # they don't have PKG-INFO metadata, and won't ever contain eggs - return - metadata = EggMetadata(importer) - if metadata.has_metadata('PKG-INFO'): - yield Distribution.from_filename(path_item, metadata=metadata) - if only: - # don't yield nested distros - return - for subitem in metadata.resource_listdir(''): - if _is_egg_path(subitem): - subpath = os.path.join(path_item, subitem) - dists = find_eggs_in_zip(zipimport.zipimporter(subpath), subpath) - for dist in dists: - yield dist - elif subitem.lower().endswith('.dist-info'): - subpath = os.path.join(path_item, subitem) - submeta = EggMetadata(zipimport.zipimporter(subpath)) - submeta.egg_info = subpath - yield Distribution.from_location(path_item, subitem, submeta) - - -register_finder(zipimport.zipimporter, find_eggs_in_zip) - - -def find_nothing(importer, path_item, only=False): - return () - - -register_finder(object, find_nothing) - - -def _by_version_descending(names): - """ - Given a list of filenames, return them in descending order - by version number. - - >>> names = 'bar', 'foo', 'Python-2.7.10.egg', 'Python-2.7.2.egg' - >>> _by_version_descending(names) - ['Python-2.7.10.egg', 'Python-2.7.2.egg', 'foo', 'bar'] - >>> names = 'Setuptools-1.2.3b1.egg', 'Setuptools-1.2.3.egg' - >>> _by_version_descending(names) - ['Setuptools-1.2.3.egg', 'Setuptools-1.2.3b1.egg'] - >>> names = 'Setuptools-1.2.3b1.egg', 'Setuptools-1.2.3.post1.egg' - >>> _by_version_descending(names) - ['Setuptools-1.2.3.post1.egg', 'Setuptools-1.2.3b1.egg'] - """ - def _by_version(name): - """ - Parse each component of the filename - """ - name, ext = os.path.splitext(name) - parts = itertools.chain(name.split('-'), [ext]) - return [packaging.version.parse(part) for part in parts] - - return sorted(names, key=_by_version, reverse=True) - - -def find_on_path(importer, path_item, only=False): - """Yield distributions accessible on a sys.path directory""" - path_item = _normalize_cached(path_item) - - if _is_unpacked_egg(path_item): - yield Distribution.from_filename( - path_item, metadata=PathMetadata( - path_item, os.path.join(path_item, 'EGG-INFO') - ) - ) - return - - entries = safe_listdir(path_item) - - # for performance, before sorting by version, - # screen entries for only those that will yield - # distributions - filtered = ( - entry - for entry in entries - if dist_factory(path_item, entry, only) - ) - - # scan for .egg and .egg-info in directory - path_item_entries = _by_version_descending(filtered) - for entry in path_item_entries: - fullpath = os.path.join(path_item, entry) - factory = dist_factory(path_item, entry, only) - for dist in factory(fullpath): - yield dist - - -def dist_factory(path_item, entry, only): - """ - Return a dist_factory for a path_item and entry - """ - lower = entry.lower() - is_meta = any(map(lower.endswith, ('.egg-info', '.dist-info'))) - return ( - distributions_from_metadata - if is_meta else - find_distributions - if not only and _is_egg_path(entry) else - resolve_egg_link - if not only and lower.endswith('.egg-link') else - NoDists() - ) - - -class NoDists: - """ - >>> bool(NoDists()) - False - - >>> list(NoDists()('anything')) - [] - """ - def __bool__(self): - return False - if six.PY2: - __nonzero__ = __bool__ - - def __call__(self, fullpath): - return iter(()) - - -def safe_listdir(path): - """ - Attempt to list contents of path, but suppress some exceptions. - """ - try: - return os.listdir(path) - except (PermissionError, NotADirectoryError): - pass - except OSError as e: - # Ignore the directory if does not exist, not a directory or - # permission denied - ignorable = ( - e.errno in (errno.ENOTDIR, errno.EACCES, errno.ENOENT) - # Python 2 on Windows needs to be handled this way :( - or getattr(e, "winerror", None) == 267 - ) - if not ignorable: - raise - return () - - -def distributions_from_metadata(path): - root = os.path.dirname(path) - if os.path.isdir(path): - if len(os.listdir(path)) == 0: - # empty metadata dir; skip - return - metadata = PathMetadata(root, path) - else: - metadata = FileMetadata(path) - entry = os.path.basename(path) - yield Distribution.from_location( - root, entry, metadata, precedence=DEVELOP_DIST, - ) - - -def non_empty_lines(path): - """ - Yield non-empty lines from file at path - """ - with open(path) as f: - for line in f: - line = line.strip() - if line: - yield line - - -def resolve_egg_link(path): - """ - Given a path to an .egg-link, resolve distributions - present in the referenced path. - """ - referenced_paths = non_empty_lines(path) - resolved_paths = ( - os.path.join(os.path.dirname(path), ref) - for ref in referenced_paths - ) - dist_groups = map(find_distributions, resolved_paths) - return next(dist_groups, ()) - - -register_finder(pkgutil.ImpImporter, find_on_path) - -if hasattr(importlib_machinery, 'FileFinder'): - register_finder(importlib_machinery.FileFinder, find_on_path) - -_declare_state('dict', _namespace_handlers={}) -_declare_state('dict', _namespace_packages={}) - - -def register_namespace_handler(importer_type, namespace_handler): - """Register `namespace_handler` to declare namespace packages - - `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item - handler), and `namespace_handler` is a callable like this:: - - def namespace_handler(importer, path_entry, moduleName, module): - # return a path_entry to use for child packages - - Namespace handlers are only called if the importer object has already - agreed that it can handle the relevant path item, and they should only - return a subpath if the module __path__ does not already contain an - equivalent subpath. For an example namespace handler, see - ``pkg_resources.file_ns_handler``. - """ - _namespace_handlers[importer_type] = namespace_handler - - -def _handle_ns(packageName, path_item): - """Ensure that named package includes a subpath of path_item (if needed)""" - - importer = get_importer(path_item) - if importer is None: - return None - - # capture warnings due to #1111 - with warnings.catch_warnings(): - warnings.simplefilter("ignore") - loader = importer.find_module(packageName) - - if loader is None: - return None - module = sys.modules.get(packageName) - if module is None: - module = sys.modules[packageName] = types.ModuleType(packageName) - module.__path__ = [] - _set_parent_ns(packageName) - elif not hasattr(module, '__path__'): - raise TypeError("Not a package:", packageName) - handler = _find_adapter(_namespace_handlers, importer) - subpath = handler(importer, path_item, packageName, module) - if subpath is not None: - path = module.__path__ - path.append(subpath) - loader.load_module(packageName) - _rebuild_mod_path(path, packageName, module) - return subpath - - -def _rebuild_mod_path(orig_path, package_name, module): - """ - Rebuild module.__path__ ensuring that all entries are ordered - corresponding to their sys.path order - """ - sys_path = [_normalize_cached(p) for p in sys.path] - - def safe_sys_path_index(entry): - """ - Workaround for #520 and #513. - """ - try: - return sys_path.index(entry) - except ValueError: - return float('inf') - - def position_in_sys_path(path): - """ - Return the ordinal of the path based on its position in sys.path - """ - path_parts = path.split(os.sep) - module_parts = package_name.count('.') + 1 - parts = path_parts[:-module_parts] - return safe_sys_path_index(_normalize_cached(os.sep.join(parts))) - - new_path = sorted(orig_path, key=position_in_sys_path) - new_path = [_normalize_cached(p) for p in new_path] - - if isinstance(module.__path__, list): - module.__path__[:] = new_path - else: - module.__path__ = new_path - - -def declare_namespace(packageName): - """Declare that package 'packageName' is a namespace package""" - - _imp.acquire_lock() - try: - if packageName in _namespace_packages: - return - - path = sys.path - parent, _, _ = packageName.rpartition('.') - - if parent: - declare_namespace(parent) - if parent not in _namespace_packages: - __import__(parent) - try: - path = sys.modules[parent].__path__ - except AttributeError: - raise TypeError("Not a package:", parent) - - # Track what packages are namespaces, so when new path items are added, - # they can be updated - _namespace_packages.setdefault(parent or None, []).append(packageName) - _namespace_packages.setdefault(packageName, []) - - for path_item in path: - # Ensure all the parent's path items are reflected in the child, - # if they apply - _handle_ns(packageName, path_item) - - finally: - _imp.release_lock() - - -def fixup_namespace_packages(path_item, parent=None): - """Ensure that previously-declared namespace packages include path_item""" - _imp.acquire_lock() - try: - for package in _namespace_packages.get(parent, ()): - subpath = _handle_ns(package, path_item) - if subpath: - fixup_namespace_packages(subpath, package) - finally: - _imp.release_lock() - - -def file_ns_handler(importer, path_item, packageName, module): - """Compute an ns-package subpath for a filesystem or zipfile importer""" - - subpath = os.path.join(path_item, packageName.split('.')[-1]) - normalized = _normalize_cached(subpath) - for item in module.__path__: - if _normalize_cached(item) == normalized: - break - else: - # Only return the path if it's not already there - return subpath - - -register_namespace_handler(pkgutil.ImpImporter, file_ns_handler) -register_namespace_handler(zipimport.zipimporter, file_ns_handler) - -if hasattr(importlib_machinery, 'FileFinder'): - register_namespace_handler(importlib_machinery.FileFinder, file_ns_handler) - - -def null_ns_handler(importer, path_item, packageName, module): - return None - - -register_namespace_handler(object, null_ns_handler) - - -def normalize_path(filename): - """Normalize a file/dir name for comparison purposes""" - return os.path.normcase(os.path.realpath(os.path.normpath(_cygwin_patch(filename)))) - - -def _cygwin_patch(filename): # pragma: nocover - """ - Contrary to POSIX 2008, on Cygwin, getcwd (3) contains - symlink components. Using - os.path.abspath() works around this limitation. A fix in os.getcwd() - would probably better, in Cygwin even more so, except - that this seems to be by design... - """ - return os.path.abspath(filename) if sys.platform == 'cygwin' else filename - - -def _normalize_cached(filename, _cache={}): - try: - return _cache[filename] - except KeyError: - _cache[filename] = result = normalize_path(filename) - return result - - -def _is_egg_path(path): - """ - Determine if given path appears to be an egg. - """ - return path.lower().endswith('.egg') - - -def _is_unpacked_egg(path): - """ - Determine if given path appears to be an unpacked egg. - """ - return ( - _is_egg_path(path) and - os.path.isfile(os.path.join(path, 'EGG-INFO', 'PKG-INFO')) - ) - - -def _set_parent_ns(packageName): - parts = packageName.split('.') - name = parts.pop() - if parts: - parent = '.'.join(parts) - setattr(sys.modules[parent], name, sys.modules[packageName]) - - -def yield_lines(strs): - """Yield non-empty/non-comment lines of a string or sequence""" - if isinstance(strs, six.string_types): - for s in strs.splitlines(): - s = s.strip() - # skip blank lines/comments - if s and not s.startswith('#'): - yield s - else: - for ss in strs: - for s in yield_lines(ss): - yield s - - -MODULE = re.compile(r"\w+(\.\w+)*$").match -EGG_NAME = re.compile( - r""" - (?P<name>[^-]+) ( - -(?P<ver>[^-]+) ( - -py(?P<pyver>[^-]+) ( - -(?P<plat>.+) - )? - )? - )? - """, - re.VERBOSE | re.IGNORECASE, -).match - - -class EntryPoint: - """Object representing an advertised importable object""" - - def __init__(self, name, module_name, attrs=(), extras=(), dist=None): - if not MODULE(module_name): - raise ValueError("Invalid module name", module_name) - self.name = name - self.module_name = module_name - self.attrs = tuple(attrs) - self.extras = tuple(extras) - self.dist = dist - - def __str__(self): - s = "%s = %s" % (self.name, self.module_name) - if self.attrs: - s += ':' + '.'.join(self.attrs) - if self.extras: - s += ' [%s]' % ','.join(self.extras) - return s - - def __repr__(self): - return "EntryPoint.parse(%r)" % str(self) - - def load(self, require=True, *args, **kwargs): - """ - Require packages for this EntryPoint, then resolve it. - """ - if not require or args or kwargs: - warnings.warn( - "Parameters to load are deprecated. Call .resolve and " - ".require separately.", - PkgResourcesDeprecationWarning, - stacklevel=2, - ) - if require: - self.require(*args, **kwargs) - return self.resolve() - - def resolve(self): - """ - Resolve the entry point from its module and attrs. - """ - module = __import__(self.module_name, fromlist=['__name__'], level=0) - try: - return functools.reduce(getattr, self.attrs, module) - except AttributeError as exc: - raise ImportError(str(exc)) - - def require(self, env=None, installer=None): - if self.extras and not self.dist: - raise UnknownExtra("Can't require() without a distribution", self) - - # Get the requirements for this entry point with all its extras and - # then resolve them. We have to pass `extras` along when resolving so - # that the working set knows what extras we want. Otherwise, for - # dist-info distributions, the working set will assume that the - # requirements for that extra are purely optional and skip over them. - reqs = self.dist.requires(self.extras) - items = working_set.resolve(reqs, env, installer, extras=self.extras) - list(map(working_set.add, items)) - - pattern = re.compile( - r'\s*' - r'(?P<name>.+?)\s*' - r'=\s*' - r'(?P<module>[\w.]+)\s*' - r'(:\s*(?P<attr>[\w.]+))?\s*' - r'(?P<extras>\[.*\])?\s*$' - ) - - @classmethod - def parse(cls, src, dist=None): - """Parse a single entry point from string `src` - - Entry point syntax follows the form:: - - name = some.module:some.attr [extra1, extra2] - - The entry name and module name are required, but the ``:attrs`` and - ``[extras]`` parts are optional - """ - m = cls.pattern.match(src) - if not m: - msg = "EntryPoint must be in 'name=module:attrs [extras]' format" - raise ValueError(msg, src) - res = m.groupdict() - extras = cls._parse_extras(res['extras']) - attrs = res['attr'].split('.') if res['attr'] else () - return cls(res['name'], res['module'], attrs, extras, dist) - - @classmethod - def _parse_extras(cls, extras_spec): - if not extras_spec: - return () - req = Requirement.parse('x' + extras_spec) - if req.specs: - raise ValueError() - return req.extras - - @classmethod - def parse_group(cls, group, lines, dist=None): - """Parse an entry point group""" - if not MODULE(group): - raise ValueError("Invalid group name", group) - this = {} - for line in yield_lines(lines): - ep = cls.parse(line, dist) - if ep.name in this: - raise ValueError("Duplicate entry point", group, ep.name) - this[ep.name] = ep - return this - - @classmethod - def parse_map(cls, data, dist=None): - """Parse a map of entry point groups""" - if isinstance(data, dict): - data = data.items() - else: - data = split_sections(data) - maps = {} - for group, lines in data: - if group is None: - if not lines: - continue - raise ValueError("Entry points must be listed in groups") - group = group.strip() - if group in maps: - raise ValueError("Duplicate group name", group) - maps[group] = cls.parse_group(group, lines, dist) - return maps - - -def _remove_md5_fragment(location): - if not location: - return '' - parsed = urllib.parse.urlparse(location) - if parsed[-1].startswith('md5='): - return urllib.parse.urlunparse(parsed[:-1] + ('',)) - return location - - -def _version_from_file(lines): - """ - Given an iterable of lines from a Metadata file, return - the value of the Version field, if present, or None otherwise. - """ - def is_version_line(line): - return line.lower().startswith('version:') - version_lines = filter(is_version_line, lines) - line = next(iter(version_lines), '') - _, _, value = line.partition(':') - return safe_version(value.strip()) or None - - -class Distribution: - """Wrap an actual or potential sys.path entry w/metadata""" - PKG_INFO = 'PKG-INFO' - - def __init__( - self, location=None, metadata=None, project_name=None, - version=None, py_version=PY_MAJOR, platform=None, - precedence=EGG_DIST): - self.project_name = safe_name(project_name or 'Unknown') - if version is not None: - self._version = safe_version(version) - self.py_version = py_version - self.platform = platform - self.location = location - self.precedence = precedence - self._provider = metadata or empty_provider - - @classmethod - def from_location(cls, location, basename, metadata=None, **kw): - project_name, version, py_version, platform = [None] * 4 - basename, ext = os.path.splitext(basename) - if ext.lower() in _distributionImpl: - cls = _distributionImpl[ext.lower()] - - match = EGG_NAME(basename) - if match: - project_name, version, py_version, platform = match.group( - 'name', 'ver', 'pyver', 'plat' - ) - return cls( - location, metadata, project_name=project_name, version=version, - py_version=py_version, platform=platform, **kw - )._reload_version() - - def _reload_version(self): - return self - - @property - def hashcmp(self): - return ( - self.parsed_version, - self.precedence, - self.key, - _remove_md5_fragment(self.location), - self.py_version or '', - self.platform or '', - ) - - def __hash__(self): - return hash(self.hashcmp) - - def __lt__(self, other): - return self.hashcmp < other.hashcmp - - def __le__(self, other): - return self.hashcmp <= other.hashcmp - - def __gt__(self, other): - return self.hashcmp > other.hashcmp - - def __ge__(self, other): - return self.hashcmp >= other.hashcmp - - def __eq__(self, other): - if not isinstance(other, self.__class__): - # It's not a Distribution, so they are not equal - return False - return self.hashcmp == other.hashcmp - - def __ne__(self, other): - return not self == other - - # These properties have to be lazy so that we don't have to load any - # metadata until/unless it's actually needed. (i.e., some distributions - # may not know their name or version without loading PKG-INFO) - - @property - def key(self): - try: - return self._key - except AttributeError: - self._key = key = self.project_name.lower() - return key - - @property - def parsed_version(self): - if not hasattr(self, "_parsed_version"): - self._parsed_version = parse_version(self.version) - - return self._parsed_version - - def _warn_legacy_version(self): - LV = packaging.version.LegacyVersion - is_legacy = isinstance(self._parsed_version, LV) - if not is_legacy: - return - - # While an empty version is technically a legacy version and - # is not a valid PEP 440 version, it's also unlikely to - # actually come from someone and instead it is more likely that - # it comes from setuptools attempting to parse a filename and - # including it in the list. So for that we'll gate this warning - # on if the version is anything at all or not. - if not self.version: - return - - tmpl = textwrap.dedent(""" - '{project_name} ({version})' is being parsed as a legacy, - non PEP 440, - version. You may find odd behavior and sort order. - In particular it will be sorted as less than 0.0. It - is recommended to migrate to PEP 440 compatible - versions. - """).strip().replace('\n', ' ') - - warnings.warn(tmpl.format(**vars(self)), PEP440Warning) - - @property - def version(self): - try: - return self._version - except AttributeError: - version = self._get_version() - if version is None: - path = self._get_metadata_path_for_display(self.PKG_INFO) - msg = ( - "Missing 'Version:' header and/or {} file at path: {}" - ).format(self.PKG_INFO, path) - raise ValueError(msg, self) - - return version - - @property - def _dep_map(self): - """ - A map of extra to its list of (direct) requirements - for this distribution, including the null extra. - """ - try: - return self.__dep_map - except AttributeError: - self.__dep_map = self._filter_extras(self._build_dep_map()) - return self.__dep_map - - @staticmethod - def _filter_extras(dm): - """ - Given a mapping of extras to dependencies, strip off - environment markers and filter out any dependencies - not matching the markers. - """ - for extra in list(filter(None, dm)): - new_extra = extra - reqs = dm.pop(extra) - new_extra, _, marker = extra.partition(':') - fails_marker = marker and ( - invalid_marker(marker) - or not evaluate_marker(marker) - ) - if fails_marker: - reqs = [] - new_extra = safe_extra(new_extra) or None - - dm.setdefault(new_extra, []).extend(reqs) - return dm - - def _build_dep_map(self): - dm = {} - for name in 'requires.txt', 'depends.txt': - for extra, reqs in split_sections(self._get_metadata(name)): - dm.setdefault(extra, []).extend(parse_requirements(reqs)) - return dm - - def requires(self, extras=()): - """List of Requirements needed for this distro if `extras` are used""" - dm = self._dep_map - deps = [] - deps.extend(dm.get(None, ())) - for ext in extras: - try: - deps.extend(dm[safe_extra(ext)]) - except KeyError: - raise UnknownExtra( - "%s has no such extra feature %r" % (self, ext) - ) - return deps - - def _get_metadata_path_for_display(self, name): - """ - Return the path to the given metadata file, if available. - """ - try: - # We need to access _get_metadata_path() on the provider object - # directly rather than through this class's __getattr__() - # since _get_metadata_path() is marked private. - path = self._provider._get_metadata_path(name) - - # Handle exceptions e.g. in case the distribution's metadata - # provider doesn't support _get_metadata_path(). - except Exception: - return '[could not detect]' - - return path - - def _get_metadata(self, name): - if self.has_metadata(name): - for line in self.get_metadata_lines(name): - yield line - - def _get_version(self): - lines = self._get_metadata(self.PKG_INFO) - version = _version_from_file(lines) - - return version - - def activate(self, path=None, replace=False): - """Ensure distribution is importable on `path` (default=sys.path)""" - if path is None: - path = sys.path - self.insert_on(path, replace=replace) - if path is sys.path: - fixup_namespace_packages(self.location) - for pkg in self._get_metadata('namespace_packages.txt'): - if pkg in sys.modules: - declare_namespace(pkg) - - def egg_name(self): - """Return what this distribution's standard .egg filename should be""" - filename = "%s-%s-py%s" % ( - to_filename(self.project_name), to_filename(self.version), - self.py_version or PY_MAJOR - ) - - if self.platform: - filename += '-' + self.platform - return filename - - def __repr__(self): - if self.location: - return "%s (%s)" % (self, self.location) - else: - return str(self) - - def __str__(self): - try: - version = getattr(self, 'version', None) - except ValueError: - version = None - version = version or "[unknown version]" - return "%s %s" % (self.project_name, version) - - def __getattr__(self, attr): - """Delegate all unrecognized public attributes to .metadata provider""" - if attr.startswith('_'): - raise AttributeError(attr) - return getattr(self._provider, attr) - - def __dir__(self): - return list( - set(super(Distribution, self).__dir__()) - | set( - attr for attr in self._provider.__dir__() - if not attr.startswith('_') - ) - ) - - if not hasattr(object, '__dir__'): - # python 2.7 not supported - del __dir__ - - @classmethod - def from_filename(cls, filename, metadata=None, **kw): - return cls.from_location( - _normalize_cached(filename), os.path.basename(filename), metadata, - **kw - ) - - def as_requirement(self): - """Return a ``Requirement`` that matches this distribution exactly""" - if isinstance(self.parsed_version, packaging.version.Version): - spec = "%s==%s" % (self.project_name, self.parsed_version) - else: - spec = "%s===%s" % (self.project_name, self.parsed_version) - - return Requirement.parse(spec) - - def load_entry_point(self, group, name): - """Return the `name` entry point of `group` or raise ImportError""" - ep = self.get_entry_info(group, name) - if ep is None: - raise ImportError("Entry point %r not found" % ((group, name),)) - return ep.load() - - def get_entry_map(self, group=None): - """Return the entry point map for `group`, or the full entry map""" - try: - ep_map = self._ep_map - except AttributeError: - ep_map = self._ep_map = EntryPoint.parse_map( - self._get_metadata('entry_points.txt'), self - ) - if group is not None: - return ep_map.get(group, {}) - return ep_map - - def get_entry_info(self, group, name): - """Return the EntryPoint object for `group`+`name`, or ``None``""" - return self.get_entry_map(group).get(name) - - def insert_on(self, path, loc=None, replace=False): - """Ensure self.location is on path - - If replace=False (default): - - If location is already in path anywhere, do nothing. - - Else: - - If it's an egg and its parent directory is on path, - insert just ahead of the parent. - - Else: add to the end of path. - If replace=True: - - If location is already on path anywhere (not eggs) - or higher priority than its parent (eggs) - do nothing. - - Else: - - If it's an egg and its parent directory is on path, - insert just ahead of the parent, - removing any lower-priority entries. - - Else: add it to the front of path. - """ - - loc = loc or self.location - if not loc: - return - - nloc = _normalize_cached(loc) - bdir = os.path.dirname(nloc) - npath = [(p and _normalize_cached(p) or p) for p in path] - - for p, item in enumerate(npath): - if item == nloc: - if replace: - break - else: - # don't modify path (even removing duplicates) if - # found and not replace - return - elif item == bdir and self.precedence == EGG_DIST: - # if it's an .egg, give it precedence over its directory - # UNLESS it's already been added to sys.path and replace=False - if (not replace) and nloc in npath[p:]: - return - if path is sys.path: - self.check_version_conflict() - path.insert(p, loc) - npath.insert(p, nloc) - break - else: - if path is sys.path: - self.check_version_conflict() - if replace: - path.insert(0, loc) - else: - path.append(loc) - return - - # p is the spot where we found or inserted loc; now remove duplicates - while True: - try: - np = npath.index(nloc, p + 1) - except ValueError: - break - else: - del npath[np], path[np] - # ha! - p = np - - return - - def check_version_conflict(self): - if self.key == 'setuptools': - # ignore the inevitable setuptools self-conflicts :( - return - - nsp = dict.fromkeys(self._get_metadata('namespace_packages.txt')) - loc = normalize_path(self.location) - for modname in self._get_metadata('top_level.txt'): - if (modname not in sys.modules or modname in nsp - or modname in _namespace_packages): - continue - if modname in ('pkg_resources', 'setuptools', 'site'): - continue - fn = getattr(sys.modules[modname], '__file__', None) - if fn and (normalize_path(fn).startswith(loc) or - fn.startswith(self.location)): - continue - issue_warning( - "Module %s was already imported from %s, but %s is being added" - " to sys.path" % (modname, fn, self.location), - ) - - def has_version(self): - try: - self.version - except ValueError: - issue_warning("Unbuilt egg for " + repr(self)) - return False - return True - - def clone(self, **kw): - """Copy this distribution, substituting in any changed keyword args""" - names = 'project_name version py_version platform location precedence' - for attr in names.split(): - kw.setdefault(attr, getattr(self, attr, None)) - kw.setdefault('metadata', self._provider) - return self.__class__(**kw) - - @property - def extras(self): - return [dep for dep in self._dep_map if dep] - - -class EggInfoDistribution(Distribution): - def _reload_version(self): - """ - Packages installed by distutils (e.g. numpy or scipy), - which uses an old safe_version, and so - their version numbers can get mangled when - converted to filenames (e.g., 1.11.0.dev0+2329eae to - 1.11.0.dev0_2329eae). These distributions will not be - parsed properly - downstream by Distribution and safe_version, so - take an extra step and try to get the version number from - the metadata file itself instead of the filename. - """ - md_version = self._get_version() - if md_version: - self._version = md_version - return self - - -class DistInfoDistribution(Distribution): - """ - Wrap an actual or potential sys.path entry - w/metadata, .dist-info style. - """ - PKG_INFO = 'METADATA' - EQEQ = re.compile(r"([\(,])\s*(\d.*?)\s*([,\)])") - - @property - def _parsed_pkg_info(self): - """Parse and cache metadata""" - try: - return self._pkg_info - except AttributeError: - metadata = self.get_metadata(self.PKG_INFO) - self._pkg_info = email.parser.Parser().parsestr(metadata) - return self._pkg_info - - @property - def _dep_map(self): - try: - return self.__dep_map - except AttributeError: - self.__dep_map = self._compute_dependencies() - return self.__dep_map - - def _compute_dependencies(self): - """Recompute this distribution's dependencies.""" - dm = self.__dep_map = {None: []} - - reqs = [] - # Including any condition expressions - for req in self._parsed_pkg_info.get_all('Requires-Dist') or []: - reqs.extend(parse_requirements(req)) - - def reqs_for_extra(extra): - for req in reqs: - if not req.marker or req.marker.evaluate({'extra': extra}): - yield req - - common = frozenset(reqs_for_extra(None)) - dm[None].extend(common) - - for extra in self._parsed_pkg_info.get_all('Provides-Extra') or []: - s_extra = safe_extra(extra.strip()) - dm[s_extra] = list(frozenset(reqs_for_extra(extra)) - common) - - return dm - - -_distributionImpl = { - '.egg': Distribution, - '.egg-info': EggInfoDistribution, - '.dist-info': DistInfoDistribution, -} - - -def issue_warning(*args, **kw): - level = 1 - g = globals() - try: - # find the first stack frame that is *not* code in - # the pkg_resources module, to use for the warning - while sys._getframe(level).f_globals is g: - level += 1 - except ValueError: - pass - warnings.warn(stacklevel=level + 1, *args, **kw) - - -class RequirementParseError(ValueError): - def __str__(self): - return ' '.join(self.args) - - -def parse_requirements(strs): - """Yield ``Requirement`` objects for each specification in `strs` - - `strs` must be a string, or a (possibly-nested) iterable thereof. - """ - # create a steppable iterator, so we can handle \-continuations - lines = iter(yield_lines(strs)) - - for line in lines: - # Drop comments -- a hash without a space may be in a URL. - if ' #' in line: - line = line[:line.find(' #')] - # If there is a line continuation, drop it, and append the next line. - if line.endswith('\\'): - line = line[:-2].strip() - try: - line += next(lines) - except StopIteration: - return - yield Requirement(line) - - -class Requirement(packaging.requirements.Requirement): - def __init__(self, requirement_string): - """DO NOT CALL THIS UNDOCUMENTED METHOD; use Requirement.parse()!""" - try: - super(Requirement, self).__init__(requirement_string) - except packaging.requirements.InvalidRequirement as e: - raise RequirementParseError(str(e)) - self.unsafe_name = self.name - project_name = safe_name(self.name) - self.project_name, self.key = project_name, project_name.lower() - self.specs = [ - (spec.operator, spec.version) for spec in self.specifier] - self.extras = tuple(map(safe_extra, self.extras)) - self.hashCmp = ( - self.key, - self.specifier, - frozenset(self.extras), - str(self.marker) if self.marker else None, - ) - self.__hash = hash(self.hashCmp) - - def __eq__(self, other): - return ( - isinstance(other, Requirement) and - self.hashCmp == other.hashCmp - ) - - def __ne__(self, other): - return not self == other - - def __contains__(self, item): - if isinstance(item, Distribution): - if item.key != self.key: - return False - - item = item.version - - # Allow prereleases always in order to match the previous behavior of - # this method. In the future this should be smarter and follow PEP 440 - # more accurately. - return self.specifier.contains(item, prereleases=True) - - def __hash__(self): - return self.__hash - - def __repr__(self): - return "Requirement.parse(%r)" % str(self) - - @staticmethod - def parse(s): - req, = parse_requirements(s) - return req - - -def _always_object(classes): - """ - Ensure object appears in the mro even - for old-style classes. - """ - if object not in classes: - return classes + (object,) - return classes - - -def _find_adapter(registry, ob): - """Return an adapter factory for `ob` from `registry`""" - types = _always_object(inspect.getmro(getattr(ob, '__class__', type(ob)))) - for t in types: - if t in registry: - return registry[t] - - -def ensure_directory(path): - """Ensure that the parent directory of `path` exists""" - dirname = os.path.dirname(path) - py31compat.makedirs(dirname, exist_ok=True) - - -def _bypass_ensure_directory(path): - """Sandbox-bypassing version of ensure_directory()""" - if not WRITE_SUPPORT: - raise IOError('"os.mkdir" not supported on this platform.') - dirname, filename = split(path) - if dirname and filename and not isdir(dirname): - _bypass_ensure_directory(dirname) - try: - mkdir(dirname, 0o755) - except FileExistsError: - pass - - -def split_sections(s): - """Split a string or iterable thereof into (section, content) pairs - - Each ``section`` is a stripped version of the section header ("[section]") - and each ``content`` is a list of stripped lines excluding blank lines and - comment-only lines. If there are any such lines before the first section - header, they're returned in a first ``section`` of ``None``. - """ - section = None - content = [] - for line in yield_lines(s): - if line.startswith("["): - if line.endswith("]"): - if section or content: - yield section, content - section = line[1:-1].strip() - content = [] - else: - raise ValueError("Invalid section heading", line) - else: - content.append(line) - - # wrap up last segment - yield section, content - - -def _mkstemp(*args, **kw): - old_open = os.open - try: - # temporarily bypass sandboxing - os.open = os_open - return tempfile.mkstemp(*args, **kw) - finally: - # and then put it back - os.open = old_open - - -# Silence the PEP440Warning by default, so that end users don't get hit by it -# randomly just because they use pkg_resources. We want to append the rule -# because we want earlier uses of filterwarnings to take precedence over this -# one. -warnings.filterwarnings("ignore", category=PEP440Warning, append=True) - - -# from jaraco.functools 1.3 -def _call_aside(f, *args, **kwargs): - f(*args, **kwargs) - return f - - -@_call_aside -def _initialize(g=globals()): - "Set up global resource manager (deliberately not state-saved)" - manager = ResourceManager() - g['_manager'] = manager - g.update( - (name, getattr(manager, name)) - for name in dir(manager) - if not name.startswith('_') - ) - - -@_call_aside -def _initialize_master_working_set(): - """ - Prepare the master working set and make the ``require()`` - API available. - - This function has explicit effects on the global state - of pkg_resources. It is intended to be invoked once at - the initialization of this module. - - Invocation by other packages is unsupported and done - at their own risk. - """ - working_set = WorkingSet._build_master() - _declare_state('object', working_set=working_set) - - require = working_set.require - iter_entry_points = working_set.iter_entry_points - add_activation_listener = working_set.subscribe - run_script = working_set.run_script - # backward compatibility - run_main = run_script - # Activate all distributions already on sys.path with replace=False and - # ensure that all distributions added to the working set in the future - # (e.g. by calling ``require()``) will get activated as well, - # with higher priority (replace=True). - tuple( - dist.activate(replace=False) - for dist in working_set - ) - add_activation_listener( - lambda dist: dist.activate(replace=True), - existing=False, - ) - working_set.entries = [] - # match order - list(map(working_set.add_entry, sys.path)) - globals().update(locals()) - -class PkgResourcesDeprecationWarning(Warning): - """ - Base class for warning about deprecations in ``pkg_resources`` - - This class is not derived from ``DeprecationWarning``, and as such is - visible by default. - """ diff --git a/env/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 9f2c47942bd7a89bc34457d4b50c9e382e1f5d3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 99535 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-37.pyc deleted file mode 100644 index 8fad86198135b0ec615d2504895ec554993d2fbe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 599 zcmYjO!EO^V5S_6%$tFz#CxrNeJ+vVyM}$yOsv@C+6a?)`Xo+H%ZZ>N#<876ozya|g zAWr;}ublD=oER?@G1k1XXRLY8<D<c#2W;m1-8T~f@G~54O!DS2yL-!^K;a6~KM_-G z&LR~Y#Y&b@8X>4yMXL1$)0U2w?dq9oYq9J^AfZ5eqB;ebNB}|_>zH2YmWebhyJ=V9 z43h4SS>QB5FI~PqUa*?Rf{LK=3A;OC*bHm<id*=G2(Q6Bh@cilkB$&N3WN`Lwn+E4 zVkv96j0#DU&wPtja`lrqgL5#93YZa3la?3O`M8`HTIJ+?=lN_(WXZQQk+Hr#ot{0N zy-cK!s(F3sW4+E@o!P=my<YqP+G9b#rlY#7Mpa(z=f>6Z)oNe8-<b9I;xZ%~&#tvm zmPS?aE+g&i6)m(IRhz@{!j|0npxXF;cB3OZ9LM3g&EKHFA>QUi1I{I47bdcc!d}vl z1KkP<3<*3=dKBu^X5dL~oZn*&2Y>k~OttCb<%{!)?_X<jxiwjCF03CKt(E(yf&xeL f!vCNj`o<4StFBi1Q6P0eLyWvcU-tTKyeEDGT&#;d diff --git a/env/lib/python3.7/site-packages/pip/_vendor/pkg_resources/py31compat.py b/env/lib/python3.7/site-packages/pip/_vendor/pkg_resources/py31compat.py deleted file mode 100644 index a2d3007..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/pkg_resources/py31compat.py +++ /dev/null @@ -1,23 +0,0 @@ -import os -import errno -import sys - -from pip._vendor import six - - -def _makedirs_31(path, exist_ok=False): - try: - os.makedirs(path) - except OSError as exc: - if not exist_ok or exc.errno != errno.EEXIST: - raise - - -# rely on compatibility behavior until mode considerations -# and exists_ok considerations are disentangled. -# See https://github.com/pypa/setuptools/pull/1083#issuecomment-315168663 -needs_makedirs = ( - six.PY2 or - (3, 4) <= sys.version_info < (3, 4, 1) -) -makedirs = _makedirs_31 if needs_makedirs else os.makedirs diff --git a/env/lib/python3.7/site-packages/pip/_vendor/progress/__init__.py b/env/lib/python3.7/site-packages/pip/_vendor/progress/__init__.py deleted file mode 100644 index e434c25..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/progress/__init__.py +++ /dev/null @@ -1,177 +0,0 @@ -# Copyright (c) 2012 Giorgos Verigakis <verigak@gmail.com> -# -# Permission to use, copy, modify, and distribute this software for any -# purpose with or without fee is hereby granted, provided that the above -# copyright notice and this permission notice appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -from __future__ import division, print_function - -from collections import deque -from datetime import timedelta -from math import ceil -from sys import stderr -try: - from time import monotonic -except ImportError: - from time import time as monotonic - - -__version__ = '1.5' - -HIDE_CURSOR = '\x1b[?25l' -SHOW_CURSOR = '\x1b[?25h' - - -class Infinite(object): - file = stderr - sma_window = 10 # Simple Moving Average window - check_tty = True - hide_cursor = True - - def __init__(self, message='', **kwargs): - self.index = 0 - self.start_ts = monotonic() - self.avg = 0 - self._avg_update_ts = self.start_ts - self._ts = self.start_ts - self._xput = deque(maxlen=self.sma_window) - for key, val in kwargs.items(): - setattr(self, key, val) - - self._width = 0 - self.message = message - - if self.file and self.is_tty(): - if self.hide_cursor: - print(HIDE_CURSOR, end='', file=self.file) - print(self.message, end='', file=self.file) - self.file.flush() - - def __getitem__(self, key): - if key.startswith('_'): - return None - return getattr(self, key, None) - - @property - def elapsed(self): - return int(monotonic() - self.start_ts) - - @property - def elapsed_td(self): - return timedelta(seconds=self.elapsed) - - def update_avg(self, n, dt): - if n > 0: - xput_len = len(self._xput) - self._xput.append(dt / n) - now = monotonic() - # update when we're still filling _xput, then after every second - if (xput_len < self.sma_window or - now - self._avg_update_ts > 1): - self.avg = sum(self._xput) / len(self._xput) - self._avg_update_ts = now - - def update(self): - pass - - def start(self): - pass - - def clearln(self): - if self.file and self.is_tty(): - print('\r\x1b[K', end='', file=self.file) - - def write(self, s): - if self.file and self.is_tty(): - line = self.message + s.ljust(self._width) - print('\r' + line, end='', file=self.file) - self._width = max(self._width, len(s)) - self.file.flush() - - def writeln(self, line): - if self.file and self.is_tty(): - self.clearln() - print(line, end='', file=self.file) - self.file.flush() - - def finish(self): - if self.file and self.is_tty(): - print(file=self.file) - if self.hide_cursor: - print(SHOW_CURSOR, end='', file=self.file) - - def is_tty(self): - return self.file.isatty() if self.check_tty else True - - def next(self, n=1): - now = monotonic() - dt = now - self._ts - self.update_avg(n, dt) - self._ts = now - self.index = self.index + n - self.update() - - def iter(self, it): - with self: - for x in it: - yield x - self.next() - - def __enter__(self): - self.start() - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - self.finish() - - -class Progress(Infinite): - def __init__(self, *args, **kwargs): - super(Progress, self).__init__(*args, **kwargs) - self.max = kwargs.get('max', 100) - - @property - def eta(self): - return int(ceil(self.avg * self.remaining)) - - @property - def eta_td(self): - return timedelta(seconds=self.eta) - - @property - def percent(self): - return self.progress * 100 - - @property - def progress(self): - return min(1, self.index / self.max) - - @property - def remaining(self): - return max(self.max - self.index, 0) - - def start(self): - self.update() - - def goto(self, index): - incr = index - self.index - self.next(incr) - - def iter(self, it): - try: - self.max = len(it) - except TypeError: - pass - - with self: - for x in it: - yield x - self.next() diff --git a/env/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 661ee849c6b4c0366ae68b4c4113bc3139769522..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5515 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 E4-K44`~Uy| diff --git a/env/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/bar.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/bar.cpython-37.pyc deleted file mode 100644 index d63f55189bb34c21079210a8a4bc682162a7886b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2607 zcmbVNTW=dh6rS0;*LLcp7t(SIl%Oo44G4GuA&43Q;>D^|i3dx_ax-gZ!+PV+uE|Af z2`Lq{T*XDLcuVL5;t7ct9{C^h2v7M7eSz=Hu4AVS5@nq^XTCF&+3(Dr`Q}Q!?lU~e zz4;HHuQK)*f$?LZvx1iX03(>-G3)ad=hQc1qh$zFSh3l+S{7&TF<}emCKFC*?U^kb z*cBeI7uvuMa7FmQe&_(Zz*SKLu4(K6*ToF*jGkWsJ|!B!jj)3GKJcuV1D?~kDvWC^ zIDH6aEa0j!Oro_-5w_zf3uPxxn}@s@@vh3vo($7;ji!zt1DzGL^hKDEwYXqNhqp{& zv@8Mo!fH9fZn?r~c|{_vim2d~zA~?L<lzGTZ+CWaDN01R9f;+{rG5u~*I3ARjeOxg z$KS;@;y{mAwpI9a114iR+u&%%8Menq)Z;myXCnhWGiT@62zJBD`588{(6e*Q9NFkO zdejko-_2=`ms>f-E4kBi4*1B;*}k8<2l_jKu+da3s46o`GG%W?B3oD9pxhJX_OUaa zUZ|{Y6vxUB`-5z!t@}<o>~^DVWo>LmiSn;^WP2b(is*hh>TXHwc$@^DveGc_syh91 zDB5wD^zf=$v0{N_9jPl5ODS8&WrG4%93|l|Og;{9|MlgpKUf|_gG*78W}P^`ByQ{^ z+b?(5DX3ff<1i7Ma(SG^G8Vi%*ip`KAUavNfMwD-7{(jiH+)|F=D5dqeSEvi#k3|q zrPppJoqpJEE5F_DZ;D||{aU+yW7vs{5s6d5G*3xu%F|>{k(nX$BpD(;Wu72t!_1?l zG|l7I<Y(xyW93M7vO<#=U>+(*1LcSlgpzcHjW6n`>gsw&_M)VRbav~DOM_6Zg-I5O z#YO32iJ=Me=dB+Lf9F;+@Z?hn$*0LIkfEJFF{6``c?Od&p`|1ilVl{tPfp|vMjlGU z1bIu%zKaS0_iNZ>989E8()_9P_nLwIAl=E1pTzH3yzMo#lq8GzNs9b$W~-50i>H{~ z{k33r_x2+*y9gd{9Aie2W6VqhR%pr#FylQ7%?)ec7W{zA3(zDdAyq;N2>T`@Rl-iX zYUcf9O@@7Z`A&>&ROVKc1m;u)-1%}`0YPOt{7o7Dy7XU_emwn)5`SL$+oivCq-Zs8 zt)Q(E@!wzyMJu&Ts~Ggk$gJEz%p{+i^NjQim=sN8t!Pj$=pA%zgA0D1<tF~q%`IVk zWXbCk&8_n+!EH10fSk+~MsDMM-X0Wlk94tuIL5GwFU)-?Auu#B_i`Gk=6(-)II2P! zYkBoZ8Lj5w-*_aQK1s<0b!9@SlrvcGq+wbdeaci)-D~yIM_-u``{D%6(!fL*sO*E9 zJPW7Xq*zAz6G>Ed(j7u*Z9Sx%q>w?<MM-L*+_j;U_@MGUh4dl4K)p%TYjq*nc?T_} zK?a4ZLEQ?qo8jm9JR%LmcF!KKkR$1PP!5!t?xeUE;!f7xlzrtxdS#YwMcKMs!W;fw z=bppp+i0o2<M2+$unbAjV?}<XaFo)x$cqaXrEDtiYP20v5eHsTYX_f{{$}YvE&XSO zzc=<jm-zS6|IrMr2h~HTFxf)g)BE@e*nB|j4H%D0!jH!L+ImOq5N~_>fPGt#x$|A= zzb`$M_`j2T6=Ygd<Ol~fx~jUvY$$P6Nun)ZB182nN&fWhqLo>Tpu9*i`W`wtNsCNX h)6rHa@6F-@e2Yq2-=8(ZGiqkzY{P5V_&wIJ{sFtm9|HgY diff --git a/env/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/counter.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/counter.cpython-37.pyc deleted file mode 100644 index 9bdc438a26c7c9545dcda954b5298584fbcd39db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1419 zcmbVLOK;Oa5Z>|Hv6ChcL_y&pfjHqq8*$+TsG<kNC92e01Tt23(;Dney0+;<=>bw6 z5(k9D;|k)$U)m#_`WJd)#&Obz+5@aLGoGED-FbZTu+gY7T<T}*=@W;sKcq~TjXz6B z=`&=435Zz&T>vI5!DB1oU7pxo8`vWzY~k!N;YdE_T?h4wa8Y-qjd}%jPgGH_7P^ai zP0XP_Ctb9AqQ1)f#y-Bnd@#*iMZJNLK^$dLhjF?OWU!3)SoI@?o5owwgEcMFv`0SE zW#P{fQaX=JvMvbLwFC%jk9E1=_=auV<w36S+8*6WizFqwj8r&|*mst}h&{K)@Pm?N z=m;I38)s9~<2=o@aUvz;7Dj8QGVcFkdJg>$?zgjK*d9j1g-E4Y7{?1@V_R+A>95mf zLBUI@#6Y))Wd`luB%sCNwyESp5oYo-g+j?N*g03myErj*Fa<9NRG7#hFts2^1|pB? zza9h|c^FSDx`EC`NJm(m_A1COAr<#~Q0V_$#A*?g7;LKlD5G{M4iA~BYMF%CQMKlS zCLErOmeRO}G_6K+_V8gn^f_`oPpnDo%+xQS^(xXdb<$5yy@i%T{2+D^?}#B=*a!v3 zIICIMd*N3P;AYP8=<lzuO8L5!<5KRG@=Yn<mhxRG-_Pnt_u%|ZV0agQGKLU@G3-KS zjX*$)WgK_x5zMnOjICV@f$Gqik#&X5fNFI#UFBB{kEJq|;d+?L)bJ!yhDRzh-V}I6 zAADZa-MFee2+?UhxP@1y1RVx7Xu(dssKBfT&dDASg3oTmMYP^PN@?yquq{nH$67&C zxrCHbOOLk#TfhxpiKOpLs`%|gDL<F;Qz^fc@*_^osS(o5o=o>T?%k%BX#jCRNbmSn znzeqO<r-&AlgThm;cIGIF-4m2RAf^49J#l6hNjPW_a^iDfX=3b_&PLs)4{L$7cuh~ AumAu6 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/spinner.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/spinner.cpython-37.pyc deleted file mode 100644 index e895c4e4d956b7657269192c416098b14fcfa080..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1384 zcmbVMOK%e~5VrS~%?rZ2MF=5;kb=}k+yO;!KuAzkDyJ1_6~#`vXye`5S!hu?wdab* zfg_ZhIC0@2@%$e?!l{2DCuVlt(nVZ~BhUC7d+pEPjB~x&tPyBpGIO7~g#1FV+Z-5l zp{p1SBaFsmL<33*vzQ%QBRjAuxk;GA+)ct<Zg1Fu1K48~z!mNQb^-gW3b>kM4{(ju z0oQX}0o-6sz|9={?9dWvAKrlzNt^0cCZc}Aco;`xE_<=sp~ZxMOAI0b!9K3sZ59l= z(A60*oCK7Sz+yD8nH4z9X3i!FT;{?Fo~|sVkq}(AohhB0(tA_7KBb+zeLMgg?u826 zfUYipStk$3n1Z!7=t=SfMz3u|>vWcEqbdaUr3-CGyOCggRogKa+Dn&viYx6tlEAiY zX-DyRplS4$$QJB6z1kU%(oPzsbCFQvUL4P{l{K+?d9aMZyoV3DV2SLcG8sy)R7Vxm z=hHRqWhv{8`7E+Tx`ejq<3r|d^Tp%>T-Ogn(HrqF)U_}iB`k|^+z7*!tQQwEvH_p# z`f>z%_cN&yDUU)Vr@7A@!5GvEIRRaHV0`LO$I4@+bnF$-3@rMS4lEz$3>`>Ik&4=4 z#0}%jhNVAWelq@}@gIzT5Aw=mutXk5gA8)k`{<#lGUs>-MrWZbOr=jH;{W1Tzmp`Q zOz@c@^xXKT#=kfSL6qhEK7xo#1X0{BE-2S?As~oo4ZS@P>$f9OR&ncdL2B!Z@n4Pq zb`X+SSr?ImQ4w*8qz{2EE;t9~?<_MH{|=Zx^nqv<9!O0$7Nb=jm*kv$FPKeC-Y4%2 zepUGGABBHo{KVX7a-f@>27Z^2sJRK^g?1Gm#2_1I5*~!aDNQ6+ZeGuM(MU{;#EVP( b=3m98{VT<zx`w5v@Fg{9!){eu4*q@vgLE9! diff --git a/env/lib/python3.7/site-packages/pip/_vendor/progress/bar.py b/env/lib/python3.7/site-packages/pip/_vendor/progress/bar.py deleted file mode 100644 index 8819efd..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/progress/bar.py +++ /dev/null @@ -1,91 +0,0 @@ -# -*- coding: utf-8 -*- - -# Copyright (c) 2012 Giorgos Verigakis <verigak@gmail.com> -# -# Permission to use, copy, modify, and distribute this software for any -# purpose with or without fee is hereby granted, provided that the above -# copyright notice and this permission notice appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -from __future__ import unicode_literals - -import sys - -from . import Progress - - -class Bar(Progress): - width = 32 - suffix = '%(index)d/%(max)d' - bar_prefix = ' |' - bar_suffix = '| ' - empty_fill = ' ' - fill = '#' - - def update(self): - filled_length = int(self.width * self.progress) - empty_length = self.width - filled_length - - message = self.message % self - bar = self.fill * filled_length - empty = self.empty_fill * empty_length - suffix = self.suffix % self - line = ''.join([message, self.bar_prefix, bar, empty, self.bar_suffix, - suffix]) - self.writeln(line) - - -class ChargingBar(Bar): - suffix = '%(percent)d%%' - bar_prefix = ' ' - bar_suffix = ' ' - empty_fill = '∙' - fill = '█' - - -class FillingSquaresBar(ChargingBar): - empty_fill = '▢' - fill = '▣' - - -class FillingCirclesBar(ChargingBar): - empty_fill = '◯' - fill = '◉' - - -class IncrementalBar(Bar): - if sys.platform.startswith('win'): - phases = (u' ', u'▌', u'█') - else: - phases = (' ', '▏', '▎', '▍', '▌', '▋', '▊', '▉', '█') - - def update(self): - nphases = len(self.phases) - filled_len = self.width * self.progress - nfull = int(filled_len) # Number of full chars - phase = int((filled_len - nfull) * nphases) # Phase of last char - nempty = self.width - nfull # Number of empty chars - - message = self.message % self - bar = self.phases[-1] * nfull - current = self.phases[phase] if phase > 0 else '' - empty = self.empty_fill * max(0, nempty - len(current)) - suffix = self.suffix % self - line = ''.join([message, self.bar_prefix, bar, current, empty, - self.bar_suffix, suffix]) - self.writeln(line) - - -class PixelBar(IncrementalBar): - phases = ('⡀', '⡄', '⡆', '⡇', '⣇', '⣧', '⣷', '⣿') - - -class ShadyBar(IncrementalBar): - phases = (' ', '░', '▒', '▓', '█') diff --git a/env/lib/python3.7/site-packages/pip/_vendor/progress/counter.py b/env/lib/python3.7/site-packages/pip/_vendor/progress/counter.py deleted file mode 100644 index d955ca4..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/progress/counter.py +++ /dev/null @@ -1,41 +0,0 @@ -# -*- coding: utf-8 -*- - -# Copyright (c) 2012 Giorgos Verigakis <verigak@gmail.com> -# -# Permission to use, copy, modify, and distribute this software for any -# purpose with or without fee is hereby granted, provided that the above -# copyright notice and this permission notice appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -from __future__ import unicode_literals -from . import Infinite, Progress - - -class Counter(Infinite): - def update(self): - self.write(str(self.index)) - - -class Countdown(Progress): - def update(self): - self.write(str(self.remaining)) - - -class Stack(Progress): - phases = (' ', '▁', '▂', '▃', '▄', '▅', '▆', '▇', '█') - - def update(self): - nphases = len(self.phases) - i = min(nphases - 1, int(self.progress * nphases)) - self.write(self.phases[i]) - - -class Pie(Stack): - phases = ('○', '◔', '◑', '◕', '●') diff --git a/env/lib/python3.7/site-packages/pip/_vendor/progress/spinner.py b/env/lib/python3.7/site-packages/pip/_vendor/progress/spinner.py deleted file mode 100644 index 4e100ca..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/progress/spinner.py +++ /dev/null @@ -1,43 +0,0 @@ -# -*- coding: utf-8 -*- - -# Copyright (c) 2012 Giorgos Verigakis <verigak@gmail.com> -# -# Permission to use, copy, modify, and distribute this software for any -# purpose with or without fee is hereby granted, provided that the above -# copyright notice and this permission notice appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -from __future__ import unicode_literals -from . import Infinite - - -class Spinner(Infinite): - phases = ('-', '\\', '|', '/') - hide_cursor = True - - def update(self): - i = self.index % len(self.phases) - self.write(self.phases[i]) - - -class PieSpinner(Spinner): - phases = ['◷', '◶', '◵', '◴'] - - -class MoonSpinner(Spinner): - phases = ['◑', '◒', '◐', '◓'] - - -class LineSpinner(Spinner): - phases = ['⎺', '⎻', '⎼', '⎽', '⎼', '⎻'] - - -class PixelSpinner(Spinner): - phases = ['⣾', '⣷', '⣯', '⣟', '⡿', '⢿', '⣻', '⣽'] diff --git a/env/lib/python3.7/site-packages/pip/_vendor/pyparsing.py b/env/lib/python3.7/site-packages/pip/_vendor/pyparsing.py deleted file mode 100644 index 9d6a01d..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/pyparsing.py +++ /dev/null @@ -1,6493 +0,0 @@ -#-*- coding: utf-8 -*- -# module pyparsing.py -# -# Copyright (c) 2003-2019 Paul T. McGuire -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be -# included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__doc__ = \ -""" -pyparsing module - Classes and methods to define and execute parsing grammars -============================================================================= - -The pyparsing module is an alternative approach to creating and -executing simple grammars, vs. the traditional lex/yacc approach, or the -use of regular expressions. With pyparsing, you don't need to learn -a new syntax for defining grammars or matching expressions - the parsing -module provides a library of classes that you use to construct the -grammar directly in Python. - -Here is a program to parse "Hello, World!" (or any greeting of the form -``"<salutation>, <addressee>!"``), built up using :class:`Word`, -:class:`Literal`, and :class:`And` elements -(the :class:`'+'<ParserElement.__add__>` operators create :class:`And` expressions, -and the strings are auto-converted to :class:`Literal` expressions):: - - from pip._vendor.pyparsing import Word, alphas - - # define grammar of a greeting - greet = Word(alphas) + "," + Word(alphas) + "!" - - hello = "Hello, World!" - print (hello, "->", greet.parseString(hello)) - -The program outputs the following:: - - Hello, World! -> ['Hello', ',', 'World', '!'] - -The Python representation of the grammar is quite readable, owing to the -self-explanatory class names, and the use of '+', '|' and '^' operators. - -The :class:`ParseResults` object returned from -:class:`ParserElement.parseString` can be -accessed as a nested list, a dictionary, or an object with named -attributes. - -The pyparsing module handles some of the problems that are typically -vexing when writing text parsers: - - - extra or missing whitespace (the above program will also handle - "Hello,World!", "Hello , World !", etc.) - - quoted strings - - embedded comments - - -Getting Started - ------------------ -Visit the classes :class:`ParserElement` and :class:`ParseResults` to -see the base classes that most other pyparsing -classes inherit from. Use the docstrings for examples of how to: - - - construct literal match expressions from :class:`Literal` and - :class:`CaselessLiteral` classes - - construct character word-group expressions using the :class:`Word` - class - - see how to create repetitive expressions using :class:`ZeroOrMore` - and :class:`OneOrMore` classes - - use :class:`'+'<And>`, :class:`'|'<MatchFirst>`, :class:`'^'<Or>`, - and :class:`'&'<Each>` operators to combine simple expressions into - more complex ones - - associate names with your parsed results using - :class:`ParserElement.setResultsName` - - find some helpful expression short-cuts like :class:`delimitedList` - and :class:`oneOf` - - find more useful common expressions in the :class:`pyparsing_common` - namespace class -""" - -__version__ = "2.4.0" -__versionTime__ = "07 Apr 2019 18:28 UTC" -__author__ = "Paul McGuire <ptmcg@users.sourceforge.net>" - -import string -from weakref import ref as wkref -import copy -import sys -import warnings -import re -import sre_constants -import collections -import pprint -import traceback -import types -from datetime import datetime - -try: - # Python 3 - from itertools import filterfalse -except ImportError: - from itertools import ifilterfalse as filterfalse - -try: - from _thread import RLock -except ImportError: - from threading import RLock - -try: - # Python 3 - from collections.abc import Iterable - from collections.abc import MutableMapping -except ImportError: - # Python 2.7 - from collections import Iterable - from collections import MutableMapping - -try: - from collections import OrderedDict as _OrderedDict -except ImportError: - try: - from ordereddict import OrderedDict as _OrderedDict - except ImportError: - _OrderedDict = None - -try: - from types import SimpleNamespace -except ImportError: - class SimpleNamespace: pass - -# version compatibility configuration -__compat__ = SimpleNamespace() -__compat__.__doc__ = """ - A cross-version compatibility configuration for pyparsing features that will be - released in a future version. By setting values in this configuration to True, - those features can be enabled in prior versions for compatibility development - and testing. - - - collect_all_And_tokens - flag to enable fix for Issue #63 that fixes erroneous grouping - of results names when an And expression is nested within an Or or MatchFirst; set to - True to enable bugfix to be released in pyparsing 2.4 -""" -__compat__.collect_all_And_tokens = True - - -#~ sys.stderr.write( "testing pyparsing module, version %s, %s\n" % (__version__,__versionTime__ ) ) - -__all__ = [ '__version__', '__versionTime__', '__author__', '__compat__', -'And', 'CaselessKeyword', 'CaselessLiteral', 'CharsNotIn', 'Combine', 'Dict', 'Each', 'Empty', -'FollowedBy', 'Forward', 'GoToColumn', 'Group', 'Keyword', 'LineEnd', 'LineStart', 'Literal', -'PrecededBy', 'MatchFirst', 'NoMatch', 'NotAny', 'OneOrMore', 'OnlyOnce', 'Optional', 'Or', -'ParseBaseException', 'ParseElementEnhance', 'ParseException', 'ParseExpression', 'ParseFatalException', -'ParseResults', 'ParseSyntaxException', 'ParserElement', 'QuotedString', 'RecursiveGrammarException', -'Regex', 'SkipTo', 'StringEnd', 'StringStart', 'Suppress', 'Token', 'TokenConverter', -'White', 'Word', 'WordEnd', 'WordStart', 'ZeroOrMore', 'Char', -'alphanums', 'alphas', 'alphas8bit', 'anyCloseTag', 'anyOpenTag', 'cStyleComment', 'col', -'commaSeparatedList', 'commonHTMLEntity', 'countedArray', 'cppStyleComment', 'dblQuotedString', -'dblSlashComment', 'delimitedList', 'dictOf', 'downcaseTokens', 'empty', 'hexnums', -'htmlComment', 'javaStyleComment', 'line', 'lineEnd', 'lineStart', 'lineno', -'makeHTMLTags', 'makeXMLTags', 'matchOnlyAtCol', 'matchPreviousExpr', 'matchPreviousLiteral', -'nestedExpr', 'nullDebugAction', 'nums', 'oneOf', 'opAssoc', 'operatorPrecedence', 'printables', -'punc8bit', 'pythonStyleComment', 'quotedString', 'removeQuotes', 'replaceHTMLEntity', -'replaceWith', 'restOfLine', 'sglQuotedString', 'srange', 'stringEnd', -'stringStart', 'traceParseAction', 'unicodeString', 'upcaseTokens', 'withAttribute', -'indentedBlock', 'originalTextFor', 'ungroup', 'infixNotation','locatedExpr', 'withClass', -'CloseMatch', 'tokenMap', 'pyparsing_common', 'pyparsing_unicode', 'unicode_set', -] - -system_version = tuple(sys.version_info)[:3] -PY_3 = system_version[0] == 3 -if PY_3: - _MAX_INT = sys.maxsize - basestring = str - unichr = chr - unicode = str - _ustr = str - - # build list of single arg builtins, that can be used as parse actions - singleArgBuiltins = [sum, len, sorted, reversed, list, tuple, set, any, all, min, max] - -else: - _MAX_INT = sys.maxint - range = xrange - - def _ustr(obj): - """Drop-in replacement for str(obj) that tries to be Unicode - friendly. It first tries str(obj). If that fails with - a UnicodeEncodeError, then it tries unicode(obj). It then - < returns the unicode object | encodes it with the default - encoding | ... >. - """ - if isinstance(obj,unicode): - return obj - - try: - # If this works, then _ustr(obj) has the same behaviour as str(obj), so - # it won't break any existing code. - return str(obj) - - except UnicodeEncodeError: - # Else encode it - ret = unicode(obj).encode(sys.getdefaultencoding(), 'xmlcharrefreplace') - xmlcharref = Regex(r'&#\d+;') - xmlcharref.setParseAction(lambda t: '\\u' + hex(int(t[0][2:-1]))[2:]) - return xmlcharref.transformString(ret) - - # build list of single arg builtins, tolerant of Python version, that can be used as parse actions - singleArgBuiltins = [] - import __builtin__ - for fname in "sum len sorted reversed list tuple set any all min max".split(): - try: - singleArgBuiltins.append(getattr(__builtin__,fname)) - except AttributeError: - continue - -_generatorType = type((y for y in range(1))) - -def _xml_escape(data): - """Escape &, <, >, ", ', etc. in a string of data.""" - - # ampersand must be replaced first - from_symbols = '&><"\'' - to_symbols = ('&'+s+';' for s in "amp gt lt quot apos".split()) - for from_,to_ in zip(from_symbols, to_symbols): - data = data.replace(from_, to_) - return data - -alphas = string.ascii_uppercase + string.ascii_lowercase -nums = "0123456789" -hexnums = nums + "ABCDEFabcdef" -alphanums = alphas + nums -_bslash = chr(92) -printables = "".join(c for c in string.printable if c not in string.whitespace) - -class ParseBaseException(Exception): - """base exception class for all parsing runtime exceptions""" - # Performance tuning: we construct a *lot* of these, so keep this - # constructor as small and fast as possible - def __init__( self, pstr, loc=0, msg=None, elem=None ): - self.loc = loc - if msg is None: - self.msg = pstr - self.pstr = "" - else: - self.msg = msg - self.pstr = pstr - self.parserElement = elem - self.args = (pstr, loc, msg) - - @classmethod - def _from_exception(cls, pe): - """ - internal factory method to simplify creating one type of ParseException - from another - avoids having __init__ signature conflicts among subclasses - """ - return cls(pe.pstr, pe.loc, pe.msg, pe.parserElement) - - def __getattr__( self, aname ): - """supported attributes by name are: - - lineno - returns the line number of the exception text - - col - returns the column number of the exception text - - line - returns the line containing the exception text - """ - if( aname == "lineno" ): - return lineno( self.loc, self.pstr ) - elif( aname in ("col", "column") ): - return col( self.loc, self.pstr ) - elif( aname == "line" ): - return line( self.loc, self.pstr ) - else: - raise AttributeError(aname) - - def __str__( self ): - return "%s (at char %d), (line:%d, col:%d)" % \ - ( self.msg, self.loc, self.lineno, self.column ) - def __repr__( self ): - return _ustr(self) - def markInputline( self, markerString = ">!<" ): - """Extracts the exception line from the input string, and marks - the location of the exception with a special symbol. - """ - line_str = self.line - line_column = self.column - 1 - if markerString: - line_str = "".join((line_str[:line_column], - markerString, line_str[line_column:])) - return line_str.strip() - def __dir__(self): - return "lineno col line".split() + dir(type(self)) - -class ParseException(ParseBaseException): - """ - Exception thrown when parse expressions don't match class; - supported attributes by name are: - - lineno - returns the line number of the exception text - - col - returns the column number of the exception text - - line - returns the line containing the exception text - - Example:: - - try: - Word(nums).setName("integer").parseString("ABC") - except ParseException as pe: - print(pe) - print("column: {}".format(pe.col)) - - prints:: - - Expected integer (at char 0), (line:1, col:1) - column: 1 - - """ - - @staticmethod - def explain(exc, depth=16): - """ - Method to take an exception and translate the Python internal traceback into a list - of the pyparsing expressions that caused the exception to be raised. - - Parameters: - - - exc - exception raised during parsing (need not be a ParseException, in support - of Python exceptions that might be raised in a parse action) - - depth (default=16) - number of levels back in the stack trace to list expression - and function names; if None, the full stack trace names will be listed; if 0, only - the failing input line, marker, and exception string will be shown - - Returns a multi-line string listing the ParserElements and/or function names in the - exception's stack trace. - - Note: the diagnostic output will include string representations of the expressions - that failed to parse. These representations will be more helpful if you use `setName` to - give identifiable names to your expressions. Otherwise they will use the default string - forms, which may be cryptic to read. - - explain() is only supported under Python 3. - """ - import inspect - - if depth is None: - depth = sys.getrecursionlimit() - ret = [] - if isinstance(exc, ParseBaseException): - ret.append(exc.line) - ret.append(' ' * (exc.col - 1) + '^') - ret.append("{0}: {1}".format(type(exc).__name__, exc)) - - if depth > 0: - callers = inspect.getinnerframes(exc.__traceback__, context=depth) - seen = set() - for i, ff in enumerate(callers[-depth:]): - frm = ff[0] - - f_self = frm.f_locals.get('self', None) - if isinstance(f_self, ParserElement): - if frm.f_code.co_name not in ('parseImpl', '_parseNoCache'): - continue - if f_self in seen: - continue - seen.add(f_self) - - self_type = type(f_self) - ret.append("{0}.{1} - {2}".format(self_type.__module__, - self_type.__name__, - f_self)) - elif f_self is not None: - self_type = type(f_self) - ret.append("{0}.{1}".format(self_type.__module__, - self_type.__name__)) - else: - code = frm.f_code - if code.co_name in ('wrapper', '<module>'): - continue - - ret.append("{0}".format(code.co_name)) - - depth -= 1 - if not depth: - break - - return '\n'.join(ret) - - -class ParseFatalException(ParseBaseException): - """user-throwable exception thrown when inconsistent parse content - is found; stops all parsing immediately""" - pass - -class ParseSyntaxException(ParseFatalException): - """just like :class:`ParseFatalException`, but thrown internally - when an :class:`ErrorStop<And._ErrorStop>` ('-' operator) indicates - that parsing is to stop immediately because an unbacktrackable - syntax error has been found. - """ - pass - -#~ class ReparseException(ParseBaseException): - #~ """Experimental class - parse actions can raise this exception to cause - #~ pyparsing to reparse the input string: - #~ - with a modified input string, and/or - #~ - with a modified start location - #~ Set the values of the ReparseException in the constructor, and raise the - #~ exception in a parse action to cause pyparsing to use the new string/location. - #~ Setting the values as None causes no change to be made. - #~ """ - #~ def __init_( self, newstring, restartLoc ): - #~ self.newParseText = newstring - #~ self.reparseLoc = restartLoc - -class RecursiveGrammarException(Exception): - """exception thrown by :class:`ParserElement.validate` if the - grammar could be improperly recursive - """ - def __init__( self, parseElementList ): - self.parseElementTrace = parseElementList - - def __str__( self ): - return "RecursiveGrammarException: %s" % self.parseElementTrace - -class _ParseResultsWithOffset(object): - def __init__(self,p1,p2): - self.tup = (p1,p2) - def __getitem__(self,i): - return self.tup[i] - def __repr__(self): - return repr(self.tup[0]) - def setOffset(self,i): - self.tup = (self.tup[0],i) - -class ParseResults(object): - """Structured parse results, to provide multiple means of access to - the parsed data: - - - as a list (``len(results)``) - - by list index (``results[0], results[1]``, etc.) - - by attribute (``results.<resultsName>`` - see :class:`ParserElement.setResultsName`) - - Example:: - - integer = Word(nums) - date_str = (integer.setResultsName("year") + '/' - + integer.setResultsName("month") + '/' - + integer.setResultsName("day")) - # equivalent form: - # date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - # parseString returns a ParseResults object - result = date_str.parseString("1999/12/31") - - def test(s, fn=repr): - print("%s -> %s" % (s, fn(eval(s)))) - test("list(result)") - test("result[0]") - test("result['month']") - test("result.day") - test("'month' in result") - test("'minutes' in result") - test("result.dump()", str) - - prints:: - - list(result) -> ['1999', '/', '12', '/', '31'] - result[0] -> '1999' - result['month'] -> '12' - result.day -> '31' - 'month' in result -> True - 'minutes' in result -> False - result.dump() -> ['1999', '/', '12', '/', '31'] - - day: 31 - - month: 12 - - year: 1999 - """ - def __new__(cls, toklist=None, name=None, asList=True, modal=True ): - if isinstance(toklist, cls): - return toklist - retobj = object.__new__(cls) - retobj.__doinit = True - return retobj - - # Performance tuning: we construct a *lot* of these, so keep this - # constructor as small and fast as possible - def __init__( self, toklist=None, name=None, asList=True, modal=True, isinstance=isinstance ): - if self.__doinit: - self.__doinit = False - self.__name = None - self.__parent = None - self.__accumNames = {} - self.__asList = asList - self.__modal = modal - if toklist is None: - toklist = [] - if isinstance(toklist, list): - self.__toklist = toklist[:] - elif isinstance(toklist, _generatorType): - self.__toklist = list(toklist) - else: - self.__toklist = [toklist] - self.__tokdict = dict() - - if name is not None and name: - if not modal: - self.__accumNames[name] = 0 - if isinstance(name,int): - name = _ustr(name) # will always return a str, but use _ustr for consistency - self.__name = name - if not (isinstance(toklist, (type(None), basestring, list)) and toklist in (None,'',[])): - if isinstance(toklist,basestring): - toklist = [ toklist ] - if asList: - if isinstance(toklist,ParseResults): - self[name] = _ParseResultsWithOffset(ParseResults(toklist.__toklist), 0) - else: - self[name] = _ParseResultsWithOffset(ParseResults(toklist[0]),0) - self[name].__name = name - else: - try: - self[name] = toklist[0] - except (KeyError,TypeError,IndexError): - self[name] = toklist - - def __getitem__( self, i ): - if isinstance( i, (int,slice) ): - return self.__toklist[i] - else: - if i not in self.__accumNames: - return self.__tokdict[i][-1][0] - else: - return ParseResults([ v[0] for v in self.__tokdict[i] ]) - - def __setitem__( self, k, v, isinstance=isinstance ): - if isinstance(v,_ParseResultsWithOffset): - self.__tokdict[k] = self.__tokdict.get(k,list()) + [v] - sub = v[0] - elif isinstance(k,(int,slice)): - self.__toklist[k] = v - sub = v - else: - self.__tokdict[k] = self.__tokdict.get(k,list()) + [_ParseResultsWithOffset(v,0)] - sub = v - if isinstance(sub,ParseResults): - sub.__parent = wkref(self) - - def __delitem__( self, i ): - if isinstance(i,(int,slice)): - mylen = len( self.__toklist ) - del self.__toklist[i] - - # convert int to slice - if isinstance(i, int): - if i < 0: - i += mylen - i = slice(i, i+1) - # get removed indices - removed = list(range(*i.indices(mylen))) - removed.reverse() - # fixup indices in token dictionary - for name,occurrences in self.__tokdict.items(): - for j in removed: - for k, (value, position) in enumerate(occurrences): - occurrences[k] = _ParseResultsWithOffset(value, position - (position > j)) - else: - del self.__tokdict[i] - - def __contains__( self, k ): - return k in self.__tokdict - - def __len__( self ): return len( self.__toklist ) - def __bool__(self): return ( not not self.__toklist ) - __nonzero__ = __bool__ - def __iter__( self ): return iter( self.__toklist ) - def __reversed__( self ): return iter( self.__toklist[::-1] ) - def _iterkeys( self ): - if hasattr(self.__tokdict, "iterkeys"): - return self.__tokdict.iterkeys() - else: - return iter(self.__tokdict) - - def _itervalues( self ): - return (self[k] for k in self._iterkeys()) - - def _iteritems( self ): - return ((k, self[k]) for k in self._iterkeys()) - - if PY_3: - keys = _iterkeys - """Returns an iterator of all named result keys.""" - - values = _itervalues - """Returns an iterator of all named result values.""" - - items = _iteritems - """Returns an iterator of all named result key-value tuples.""" - - else: - iterkeys = _iterkeys - """Returns an iterator of all named result keys (Python 2.x only).""" - - itervalues = _itervalues - """Returns an iterator of all named result values (Python 2.x only).""" - - iteritems = _iteritems - """Returns an iterator of all named result key-value tuples (Python 2.x only).""" - - def keys( self ): - """Returns all named result keys (as a list in Python 2.x, as an iterator in Python 3.x).""" - return list(self.iterkeys()) - - def values( self ): - """Returns all named result values (as a list in Python 2.x, as an iterator in Python 3.x).""" - return list(self.itervalues()) - - def items( self ): - """Returns all named result key-values (as a list of tuples in Python 2.x, as an iterator in Python 3.x).""" - return list(self.iteritems()) - - def haskeys( self ): - """Since keys() returns an iterator, this method is helpful in bypassing - code that looks for the existence of any defined results names.""" - return bool(self.__tokdict) - - def pop( self, *args, **kwargs): - """ - Removes and returns item at specified index (default= ``last``). - Supports both ``list`` and ``dict`` semantics for ``pop()``. If - passed no argument or an integer argument, it will use ``list`` - semantics and pop tokens from the list of parsed tokens. If passed - a non-integer argument (most likely a string), it will use ``dict`` - semantics and pop the corresponding value from any defined results - names. A second default return value argument is supported, just as in - ``dict.pop()``. - - Example:: - - def remove_first(tokens): - tokens.pop(0) - print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] - print(OneOrMore(Word(nums)).addParseAction(remove_first).parseString("0 123 321")) # -> ['123', '321'] - - label = Word(alphas) - patt = label("LABEL") + OneOrMore(Word(nums)) - print(patt.parseString("AAB 123 321").dump()) - - # Use pop() in a parse action to remove named result (note that corresponding value is not - # removed from list form of results) - def remove_LABEL(tokens): - tokens.pop("LABEL") - return tokens - patt.addParseAction(remove_LABEL) - print(patt.parseString("AAB 123 321").dump()) - - prints:: - - ['AAB', '123', '321'] - - LABEL: AAB - - ['AAB', '123', '321'] - """ - if not args: - args = [-1] - for k,v in kwargs.items(): - if k == 'default': - args = (args[0], v) - else: - raise TypeError("pop() got an unexpected keyword argument '%s'" % k) - if (isinstance(args[0], int) or - len(args) == 1 or - args[0] in self): - index = args[0] - ret = self[index] - del self[index] - return ret - else: - defaultvalue = args[1] - return defaultvalue - - def get(self, key, defaultValue=None): - """ - Returns named result matching the given key, or if there is no - such name, then returns the given ``defaultValue`` or ``None`` if no - ``defaultValue`` is specified. - - Similar to ``dict.get()``. - - Example:: - - integer = Word(nums) - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - result = date_str.parseString("1999/12/31") - print(result.get("year")) # -> '1999' - print(result.get("hour", "not specified")) # -> 'not specified' - print(result.get("hour")) # -> None - """ - if key in self: - return self[key] - else: - return defaultValue - - def insert( self, index, insStr ): - """ - Inserts new element at location index in the list of parsed tokens. - - Similar to ``list.insert()``. - - Example:: - - print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] - - # use a parse action to insert the parse location in the front of the parsed results - def insert_locn(locn, tokens): - tokens.insert(0, locn) - print(OneOrMore(Word(nums)).addParseAction(insert_locn).parseString("0 123 321")) # -> [0, '0', '123', '321'] - """ - self.__toklist.insert(index, insStr) - # fixup indices in token dictionary - for name,occurrences in self.__tokdict.items(): - for k, (value, position) in enumerate(occurrences): - occurrences[k] = _ParseResultsWithOffset(value, position + (position > index)) - - def append( self, item ): - """ - Add single element to end of ParseResults list of elements. - - Example:: - - print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] - - # use a parse action to compute the sum of the parsed integers, and add it to the end - def append_sum(tokens): - tokens.append(sum(map(int, tokens))) - print(OneOrMore(Word(nums)).addParseAction(append_sum).parseString("0 123 321")) # -> ['0', '123', '321', 444] - """ - self.__toklist.append(item) - - def extend( self, itemseq ): - """ - Add sequence of elements to end of ParseResults list of elements. - - Example:: - - patt = OneOrMore(Word(alphas)) - - # use a parse action to append the reverse of the matched strings, to make a palindrome - def make_palindrome(tokens): - tokens.extend(reversed([t[::-1] for t in tokens])) - return ''.join(tokens) - print(patt.addParseAction(make_palindrome).parseString("lskdj sdlkjf lksd")) # -> 'lskdjsdlkjflksddsklfjkldsjdksl' - """ - if isinstance(itemseq, ParseResults): - self.__iadd__(itemseq) - else: - self.__toklist.extend(itemseq) - - def clear( self ): - """ - Clear all elements and results names. - """ - del self.__toklist[:] - self.__tokdict.clear() - - def __getattr__( self, name ): - try: - return self[name] - except KeyError: - return "" - - if name in self.__tokdict: - if name not in self.__accumNames: - return self.__tokdict[name][-1][0] - else: - return ParseResults([ v[0] for v in self.__tokdict[name] ]) - else: - return "" - - def __add__( self, other ): - ret = self.copy() - ret += other - return ret - - def __iadd__( self, other ): - if other.__tokdict: - offset = len(self.__toklist) - addoffset = lambda a: offset if a<0 else a+offset - otheritems = other.__tokdict.items() - otherdictitems = [(k, _ParseResultsWithOffset(v[0],addoffset(v[1])) ) - for (k,vlist) in otheritems for v in vlist] - for k,v in otherdictitems: - self[k] = v - if isinstance(v[0],ParseResults): - v[0].__parent = wkref(self) - - self.__toklist += other.__toklist - self.__accumNames.update( other.__accumNames ) - return self - - def __radd__(self, other): - if isinstance(other,int) and other == 0: - # useful for merging many ParseResults using sum() builtin - return self.copy() - else: - # this may raise a TypeError - so be it - return other + self - - def __repr__( self ): - return "(%s, %s)" % ( repr( self.__toklist ), repr( self.__tokdict ) ) - - def __str__( self ): - return '[' + ', '.join(_ustr(i) if isinstance(i, ParseResults) else repr(i) for i in self.__toklist) + ']' - - def _asStringList( self, sep='' ): - out = [] - for item in self.__toklist: - if out and sep: - out.append(sep) - if isinstance( item, ParseResults ): - out += item._asStringList() - else: - out.append( _ustr(item) ) - return out - - def asList( self ): - """ - Returns the parse results as a nested list of matching tokens, all converted to strings. - - Example:: - - patt = OneOrMore(Word(alphas)) - result = patt.parseString("sldkj lsdkj sldkj") - # even though the result prints in string-like form, it is actually a pyparsing ParseResults - print(type(result), result) # -> <class 'pyparsing.ParseResults'> ['sldkj', 'lsdkj', 'sldkj'] - - # Use asList() to create an actual list - result_list = result.asList() - print(type(result_list), result_list) # -> <class 'list'> ['sldkj', 'lsdkj', 'sldkj'] - """ - return [res.asList() if isinstance(res,ParseResults) else res for res in self.__toklist] - - def asDict( self ): - """ - Returns the named parse results as a nested dictionary. - - Example:: - - integer = Word(nums) - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - result = date_str.parseString('12/31/1999') - print(type(result), repr(result)) # -> <class 'pyparsing.ParseResults'> (['12', '/', '31', '/', '1999'], {'day': [('1999', 4)], 'year': [('12', 0)], 'month': [('31', 2)]}) - - result_dict = result.asDict() - print(type(result_dict), repr(result_dict)) # -> <class 'dict'> {'day': '1999', 'year': '12', 'month': '31'} - - # even though a ParseResults supports dict-like access, sometime you just need to have a dict - import json - print(json.dumps(result)) # -> Exception: TypeError: ... is not JSON serializable - print(json.dumps(result.asDict())) # -> {"month": "31", "day": "1999", "year": "12"} - """ - if PY_3: - item_fn = self.items - else: - item_fn = self.iteritems - - def toItem(obj): - if isinstance(obj, ParseResults): - if obj.haskeys(): - return obj.asDict() - else: - return [toItem(v) for v in obj] - else: - return obj - - return dict((k,toItem(v)) for k,v in item_fn()) - - def copy( self ): - """ - Returns a new copy of a :class:`ParseResults` object. - """ - ret = ParseResults( self.__toklist ) - ret.__tokdict = dict(self.__tokdict.items()) - ret.__parent = self.__parent - ret.__accumNames.update( self.__accumNames ) - ret.__name = self.__name - return ret - - def asXML( self, doctag=None, namedItemsOnly=False, indent="", formatted=True ): - """ - (Deprecated) Returns the parse results as XML. Tags are created for tokens and lists that have defined results names. - """ - nl = "\n" - out = [] - namedItems = dict((v[1],k) for (k,vlist) in self.__tokdict.items() - for v in vlist) - nextLevelIndent = indent + " " - - # collapse out indents if formatting is not desired - if not formatted: - indent = "" - nextLevelIndent = "" - nl = "" - - selfTag = None - if doctag is not None: - selfTag = doctag - else: - if self.__name: - selfTag = self.__name - - if not selfTag: - if namedItemsOnly: - return "" - else: - selfTag = "ITEM" - - out += [ nl, indent, "<", selfTag, ">" ] - - for i,res in enumerate(self.__toklist): - if isinstance(res,ParseResults): - if i in namedItems: - out += [ res.asXML(namedItems[i], - namedItemsOnly and doctag is None, - nextLevelIndent, - formatted)] - else: - out += [ res.asXML(None, - namedItemsOnly and doctag is None, - nextLevelIndent, - formatted)] - else: - # individual token, see if there is a name for it - resTag = None - if i in namedItems: - resTag = namedItems[i] - if not resTag: - if namedItemsOnly: - continue - else: - resTag = "ITEM" - xmlBodyText = _xml_escape(_ustr(res)) - out += [ nl, nextLevelIndent, "<", resTag, ">", - xmlBodyText, - "</", resTag, ">" ] - - out += [ nl, indent, "</", selfTag, ">" ] - return "".join(out) - - def __lookup(self,sub): - for k,vlist in self.__tokdict.items(): - for v,loc in vlist: - if sub is v: - return k - return None - - def getName(self): - r""" - Returns the results name for this token expression. Useful when several - different expressions might match at a particular location. - - Example:: - - integer = Word(nums) - ssn_expr = Regex(r"\d\d\d-\d\d-\d\d\d\d") - house_number_expr = Suppress('#') + Word(nums, alphanums) - user_data = (Group(house_number_expr)("house_number") - | Group(ssn_expr)("ssn") - | Group(integer)("age")) - user_info = OneOrMore(user_data) - - result = user_info.parseString("22 111-22-3333 #221B") - for item in result: - print(item.getName(), ':', item[0]) - - prints:: - - age : 22 - ssn : 111-22-3333 - house_number : 221B - """ - if self.__name: - return self.__name - elif self.__parent: - par = self.__parent() - if par: - return par.__lookup(self) - else: - return None - elif (len(self) == 1 and - len(self.__tokdict) == 1 and - next(iter(self.__tokdict.values()))[0][1] in (0,-1)): - return next(iter(self.__tokdict.keys())) - else: - return None - - def dump(self, indent='', depth=0, full=True): - """ - Diagnostic method for listing out the contents of - a :class:`ParseResults`. Accepts an optional ``indent`` argument so - that this string can be embedded in a nested display of other data. - - Example:: - - integer = Word(nums) - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - result = date_str.parseString('12/31/1999') - print(result.dump()) - - prints:: - - ['12', '/', '31', '/', '1999'] - - day: 1999 - - month: 31 - - year: 12 - """ - out = [] - NL = '\n' - out.append( indent+_ustr(self.asList()) ) - if full: - if self.haskeys(): - items = sorted((str(k), v) for k,v in self.items()) - for k,v in items: - if out: - out.append(NL) - out.append( "%s%s- %s: " % (indent,(' '*depth), k) ) - if isinstance(v,ParseResults): - if v: - out.append( v.dump(indent,depth+1) ) - else: - out.append(_ustr(v)) - else: - out.append(repr(v)) - elif any(isinstance(vv,ParseResults) for vv in self): - v = self - for i,vv in enumerate(v): - if isinstance(vv,ParseResults): - out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth)),i,indent,(' '*(depth+1)),vv.dump(indent,depth+1) )) - else: - out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth)),i,indent,(' '*(depth+1)),_ustr(vv))) - - return "".join(out) - - def pprint(self, *args, **kwargs): - """ - Pretty-printer for parsed results as a list, using the - `pprint <https://docs.python.org/3/library/pprint.html>`_ module. - Accepts additional positional or keyword args as defined for - `pprint.pprint <https://docs.python.org/3/library/pprint.html#pprint.pprint>`_ . - - Example:: - - ident = Word(alphas, alphanums) - num = Word(nums) - func = Forward() - term = ident | num | Group('(' + func + ')') - func <<= ident + Group(Optional(delimitedList(term))) - result = func.parseString("fna a,b,(fnb c,d,200),100") - result.pprint(width=40) - - prints:: - - ['fna', - ['a', - 'b', - ['(', 'fnb', ['c', 'd', '200'], ')'], - '100']] - """ - pprint.pprint(self.asList(), *args, **kwargs) - - # add support for pickle protocol - def __getstate__(self): - return ( self.__toklist, - ( self.__tokdict.copy(), - self.__parent is not None and self.__parent() or None, - self.__accumNames, - self.__name ) ) - - def __setstate__(self,state): - self.__toklist = state[0] - (self.__tokdict, - par, - inAccumNames, - self.__name) = state[1] - self.__accumNames = {} - self.__accumNames.update(inAccumNames) - if par is not None: - self.__parent = wkref(par) - else: - self.__parent = None - - def __getnewargs__(self): - return self.__toklist, self.__name, self.__asList, self.__modal - - def __dir__(self): - return (dir(type(self)) + list(self.keys())) - -MutableMapping.register(ParseResults) - -def col (loc,strg): - """Returns current column within a string, counting newlines as line separators. - The first column is number 1. - - Note: the default parsing behavior is to expand tabs in the input string - before starting the parsing process. See - :class:`ParserElement.parseString` for more - information on parsing strings containing ``<TAB>`` s, and suggested - methods to maintain a consistent view of the parsed string, the parse - location, and line and column positions within the parsed string. - """ - s = strg - return 1 if 0<loc<len(s) and s[loc-1] == '\n' else loc - s.rfind("\n", 0, loc) - -def lineno(loc,strg): - """Returns current line number within a string, counting newlines as line separators. - The first line is number 1. - - Note - the default parsing behavior is to expand tabs in the input string - before starting the parsing process. See :class:`ParserElement.parseString` - for more information on parsing strings containing ``<TAB>`` s, and - suggested methods to maintain a consistent view of the parsed string, the - parse location, and line and column positions within the parsed string. - """ - return strg.count("\n",0,loc) + 1 - -def line( loc, strg ): - """Returns the line of text containing loc within a string, counting newlines as line separators. - """ - lastCR = strg.rfind("\n", 0, loc) - nextCR = strg.find("\n", loc) - if nextCR >= 0: - return strg[lastCR+1:nextCR] - else: - return strg[lastCR+1:] - -def _defaultStartDebugAction( instring, loc, expr ): - print (("Match " + _ustr(expr) + " at loc " + _ustr(loc) + "(%d,%d)" % ( lineno(loc,instring), col(loc,instring) ))) - -def _defaultSuccessDebugAction( instring, startloc, endloc, expr, toks ): - print ("Matched " + _ustr(expr) + " -> " + str(toks.asList())) - -def _defaultExceptionDebugAction( instring, loc, expr, exc ): - print ("Exception raised:" + _ustr(exc)) - -def nullDebugAction(*args): - """'Do-nothing' debug action, to suppress debugging output during parsing.""" - pass - -# Only works on Python 3.x - nonlocal is toxic to Python 2 installs -#~ 'decorator to trim function calls to match the arity of the target' -#~ def _trim_arity(func, maxargs=3): - #~ if func in singleArgBuiltins: - #~ return lambda s,l,t: func(t) - #~ limit = 0 - #~ foundArity = False - #~ def wrapper(*args): - #~ nonlocal limit,foundArity - #~ while 1: - #~ try: - #~ ret = func(*args[limit:]) - #~ foundArity = True - #~ return ret - #~ except TypeError: - #~ if limit == maxargs or foundArity: - #~ raise - #~ limit += 1 - #~ continue - #~ return wrapper - -# this version is Python 2.x-3.x cross-compatible -'decorator to trim function calls to match the arity of the target' -def _trim_arity(func, maxargs=2): - if func in singleArgBuiltins: - return lambda s,l,t: func(t) - limit = [0] - foundArity = [False] - - # traceback return data structure changed in Py3.5 - normalize back to plain tuples - if system_version[:2] >= (3,5): - def extract_stack(limit=0): - # special handling for Python 3.5.0 - extra deep call stack by 1 - offset = -3 if system_version == (3,5,0) else -2 - frame_summary = traceback.extract_stack(limit=-offset+limit-1)[offset] - return [frame_summary[:2]] - def extract_tb(tb, limit=0): - frames = traceback.extract_tb(tb, limit=limit) - frame_summary = frames[-1] - return [frame_summary[:2]] - else: - extract_stack = traceback.extract_stack - extract_tb = traceback.extract_tb - - # synthesize what would be returned by traceback.extract_stack at the call to - # user's parse action 'func', so that we don't incur call penalty at parse time - - LINE_DIFF = 6 - # IF ANY CODE CHANGES, EVEN JUST COMMENTS OR BLANK LINES, BETWEEN THE NEXT LINE AND - # THE CALL TO FUNC INSIDE WRAPPER, LINE_DIFF MUST BE MODIFIED!!!! - this_line = extract_stack(limit=2)[-1] - pa_call_line_synth = (this_line[0], this_line[1]+LINE_DIFF) - - def wrapper(*args): - while 1: - try: - ret = func(*args[limit[0]:]) - foundArity[0] = True - return ret - except TypeError: - # re-raise TypeErrors if they did not come from our arity testing - if foundArity[0]: - raise - else: - try: - tb = sys.exc_info()[-1] - if not extract_tb(tb, limit=2)[-1][:2] == pa_call_line_synth: - raise - finally: - del tb - - if limit[0] <= maxargs: - limit[0] += 1 - continue - raise - - # copy func name to wrapper for sensible debug output - func_name = "<parse action>" - try: - func_name = getattr(func, '__name__', - getattr(func, '__class__').__name__) - except Exception: - func_name = str(func) - wrapper.__name__ = func_name - - return wrapper - -class ParserElement(object): - """Abstract base level parser element class.""" - DEFAULT_WHITE_CHARS = " \n\t\r" - verbose_stacktrace = False - - @staticmethod - def setDefaultWhitespaceChars( chars ): - r""" - Overrides the default whitespace chars - - Example:: - - # default whitespace chars are space, <TAB> and newline - OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def', 'ghi', 'jkl'] - - # change to just treat newline as significant - ParserElement.setDefaultWhitespaceChars(" \t") - OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def'] - """ - ParserElement.DEFAULT_WHITE_CHARS = chars - - @staticmethod - def inlineLiteralsUsing(cls): - """ - Set class to be used for inclusion of string literals into a parser. - - Example:: - - # default literal class used is Literal - integer = Word(nums) - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] - - - # change to Suppress - ParserElement.inlineLiteralsUsing(Suppress) - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - date_str.parseString("1999/12/31") # -> ['1999', '12', '31'] - """ - ParserElement._literalStringClass = cls - - def __init__( self, savelist=False ): - self.parseAction = list() - self.failAction = None - #~ self.name = "<unknown>" # don't define self.name, let subclasses try/except upcall - self.strRepr = None - self.resultsName = None - self.saveAsList = savelist - self.skipWhitespace = True - self.whiteChars = set(ParserElement.DEFAULT_WHITE_CHARS) - self.copyDefaultWhiteChars = True - self.mayReturnEmpty = False # used when checking for left-recursion - self.keepTabs = False - self.ignoreExprs = list() - self.debug = False - self.streamlined = False - self.mayIndexError = True # used to optimize exception handling for subclasses that don't advance parse index - self.errmsg = "" - self.modalResults = True # used to mark results names as modal (report only last) or cumulative (list all) - self.debugActions = ( None, None, None ) #custom debug actions - self.re = None - self.callPreparse = True # used to avoid redundant calls to preParse - self.callDuringTry = False - - def copy( self ): - """ - Make a copy of this :class:`ParserElement`. Useful for defining - different parse actions for the same parsing pattern, using copies of - the original parse element. - - Example:: - - integer = Word(nums).setParseAction(lambda toks: int(toks[0])) - integerK = integer.copy().addParseAction(lambda toks: toks[0]*1024) + Suppress("K") - integerM = integer.copy().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") - - print(OneOrMore(integerK | integerM | integer).parseString("5K 100 640K 256M")) - - prints:: - - [5120, 100, 655360, 268435456] - - Equivalent form of ``expr.copy()`` is just ``expr()``:: - - integerM = integer().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") - """ - cpy = copy.copy( self ) - cpy.parseAction = self.parseAction[:] - cpy.ignoreExprs = self.ignoreExprs[:] - if self.copyDefaultWhiteChars: - cpy.whiteChars = ParserElement.DEFAULT_WHITE_CHARS - return cpy - - def setName( self, name ): - """ - Define name for this expression, makes debugging and exception messages clearer. - - Example:: - - Word(nums).parseString("ABC") # -> Exception: Expected W:(0123...) (at char 0), (line:1, col:1) - Word(nums).setName("integer").parseString("ABC") # -> Exception: Expected integer (at char 0), (line:1, col:1) - """ - self.name = name - self.errmsg = "Expected " + self.name - if hasattr(self,"exception"): - self.exception.msg = self.errmsg - return self - - def setResultsName( self, name, listAllMatches=False ): - """ - Define name for referencing matching tokens as a nested attribute - of the returned parse results. - NOTE: this returns a *copy* of the original :class:`ParserElement` object; - this is so that the client can define a basic element, such as an - integer, and reference it in multiple places with different names. - - You can also set results names using the abbreviated syntax, - ``expr("name")`` in place of ``expr.setResultsName("name")`` - - see :class:`__call__`. - - Example:: - - date_str = (integer.setResultsName("year") + '/' - + integer.setResultsName("month") + '/' - + integer.setResultsName("day")) - - # equivalent form: - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - """ - newself = self.copy() - if name.endswith("*"): - name = name[:-1] - listAllMatches=True - newself.resultsName = name - newself.modalResults = not listAllMatches - return newself - - def setBreak(self,breakFlag = True): - """Method to invoke the Python pdb debugger when this element is - about to be parsed. Set ``breakFlag`` to True to enable, False to - disable. - """ - if breakFlag: - _parseMethod = self._parse - def breaker(instring, loc, doActions=True, callPreParse=True): - import pdb - pdb.set_trace() - return _parseMethod( instring, loc, doActions, callPreParse ) - breaker._originalParseMethod = _parseMethod - self._parse = breaker - else: - if hasattr(self._parse,"_originalParseMethod"): - self._parse = self._parse._originalParseMethod - return self - - def setParseAction( self, *fns, **kwargs ): - """ - Define one or more actions to perform when successfully matching parse element definition. - Parse action fn is a callable method with 0-3 arguments, called as ``fn(s,loc,toks)`` , - ``fn(loc,toks)`` , ``fn(toks)`` , or just ``fn()`` , where: - - - s = the original string being parsed (see note below) - - loc = the location of the matching substring - - toks = a list of the matched tokens, packaged as a :class:`ParseResults` object - - If the functions in fns modify the tokens, they can return them as the return - value from fn, and the modified list of tokens will replace the original. - Otherwise, fn does not need to return any value. - - Optional keyword arguments: - - callDuringTry = (default= ``False`` ) indicate if parse action should be run during lookaheads and alternate testing - - Note: the default parsing behavior is to expand tabs in the input string - before starting the parsing process. See :class:`parseString for more - information on parsing strings containing ``<TAB>`` s, and suggested - methods to maintain a consistent view of the parsed string, the parse - location, and line and column positions within the parsed string. - - Example:: - - integer = Word(nums) - date_str = integer + '/' + integer + '/' + integer - - date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] - - # use parse action to convert to ints at parse time - integer = Word(nums).setParseAction(lambda toks: int(toks[0])) - date_str = integer + '/' + integer + '/' + integer - - # note that integer fields are now ints, not strings - date_str.parseString("1999/12/31") # -> [1999, '/', 12, '/', 31] - """ - self.parseAction = list(map(_trim_arity, list(fns))) - self.callDuringTry = kwargs.get("callDuringTry", False) - return self - - def addParseAction( self, *fns, **kwargs ): - """ - Add one or more parse actions to expression's list of parse actions. See :class:`setParseAction`. - - See examples in :class:`copy`. - """ - self.parseAction += list(map(_trim_arity, list(fns))) - self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False) - return self - - def addCondition(self, *fns, **kwargs): - """Add a boolean predicate function to expression's list of parse actions. See - :class:`setParseAction` for function call signatures. Unlike ``setParseAction``, - functions passed to ``addCondition`` need to return boolean success/fail of the condition. - - Optional keyword arguments: - - message = define a custom message to be used in the raised exception - - fatal = if True, will raise ParseFatalException to stop parsing immediately; otherwise will raise ParseException - - Example:: - - integer = Word(nums).setParseAction(lambda toks: int(toks[0])) - year_int = integer.copy() - year_int.addCondition(lambda toks: toks[0] >= 2000, message="Only support years 2000 and later") - date_str = year_int + '/' + integer + '/' + integer - - result = date_str.parseString("1999/12/31") # -> Exception: Only support years 2000 and later (at char 0), (line:1, col:1) - """ - msg = kwargs.get("message", "failed user-defined condition") - exc_type = ParseFatalException if kwargs.get("fatal", False) else ParseException - for fn in fns: - fn = _trim_arity(fn) - def pa(s,l,t): - if not bool(fn(s,l,t)): - raise exc_type(s,l,msg) - self.parseAction.append(pa) - self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False) - return self - - def setFailAction( self, fn ): - """Define action to perform if parsing fails at this expression. - Fail acton fn is a callable function that takes the arguments - ``fn(s,loc,expr,err)`` where: - - s = string being parsed - - loc = location where expression match was attempted and failed - - expr = the parse expression that failed - - err = the exception thrown - The function returns no value. It may throw :class:`ParseFatalException` - if it is desired to stop parsing immediately.""" - self.failAction = fn - return self - - def _skipIgnorables( self, instring, loc ): - exprsFound = True - while exprsFound: - exprsFound = False - for e in self.ignoreExprs: - try: - while 1: - loc,dummy = e._parse( instring, loc ) - exprsFound = True - except ParseException: - pass - return loc - - def preParse( self, instring, loc ): - if self.ignoreExprs: - loc = self._skipIgnorables( instring, loc ) - - if self.skipWhitespace: - wt = self.whiteChars - instrlen = len(instring) - while loc < instrlen and instring[loc] in wt: - loc += 1 - - return loc - - def parseImpl( self, instring, loc, doActions=True ): - return loc, [] - - def postParse( self, instring, loc, tokenlist ): - return tokenlist - - #~ @profile - def _parseNoCache( self, instring, loc, doActions=True, callPreParse=True ): - debugging = ( self.debug ) #and doActions ) - - if debugging or self.failAction: - #~ print ("Match",self,"at loc",loc,"(%d,%d)" % ( lineno(loc,instring), col(loc,instring) )) - if (self.debugActions[0] ): - self.debugActions[0]( instring, loc, self ) - if callPreParse and self.callPreparse: - preloc = self.preParse( instring, loc ) - else: - preloc = loc - tokensStart = preloc - try: - try: - loc,tokens = self.parseImpl( instring, preloc, doActions ) - except IndexError: - raise ParseException( instring, len(instring), self.errmsg, self ) - except ParseBaseException as err: - #~ print ("Exception raised:", err) - if self.debugActions[2]: - self.debugActions[2]( instring, tokensStart, self, err ) - if self.failAction: - self.failAction( instring, tokensStart, self, err ) - raise - else: - if callPreParse and self.callPreparse: - preloc = self.preParse( instring, loc ) - else: - preloc = loc - tokensStart = preloc - if self.mayIndexError or preloc >= len(instring): - try: - loc,tokens = self.parseImpl( instring, preloc, doActions ) - except IndexError: - raise ParseException( instring, len(instring), self.errmsg, self ) - else: - loc,tokens = self.parseImpl( instring, preloc, doActions ) - - tokens = self.postParse( instring, loc, tokens ) - - retTokens = ParseResults( tokens, self.resultsName, asList=self.saveAsList, modal=self.modalResults ) - if self.parseAction and (doActions or self.callDuringTry): - if debugging: - try: - for fn in self.parseAction: - try: - tokens = fn( instring, tokensStart, retTokens ) - except IndexError as parse_action_exc: - exc = ParseException("exception raised in parse action") - exc.__cause__ = parse_action_exc - raise exc - - if tokens is not None and tokens is not retTokens: - retTokens = ParseResults( tokens, - self.resultsName, - asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), - modal=self.modalResults ) - except ParseBaseException as err: - #~ print "Exception raised in user parse action:", err - if (self.debugActions[2] ): - self.debugActions[2]( instring, tokensStart, self, err ) - raise - else: - for fn in self.parseAction: - try: - tokens = fn( instring, tokensStart, retTokens ) - except IndexError as parse_action_exc: - exc = ParseException("exception raised in parse action") - exc.__cause__ = parse_action_exc - raise exc - - if tokens is not None and tokens is not retTokens: - retTokens = ParseResults( tokens, - self.resultsName, - asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), - modal=self.modalResults ) - if debugging: - #~ print ("Matched",self,"->",retTokens.asList()) - if (self.debugActions[1] ): - self.debugActions[1]( instring, tokensStart, loc, self, retTokens ) - - return loc, retTokens - - def tryParse( self, instring, loc ): - try: - return self._parse( instring, loc, doActions=False )[0] - except ParseFatalException: - raise ParseException( instring, loc, self.errmsg, self) - - def canParseNext(self, instring, loc): - try: - self.tryParse(instring, loc) - except (ParseException, IndexError): - return False - else: - return True - - class _UnboundedCache(object): - def __init__(self): - cache = {} - self.not_in_cache = not_in_cache = object() - - def get(self, key): - return cache.get(key, not_in_cache) - - def set(self, key, value): - cache[key] = value - - def clear(self): - cache.clear() - - def cache_len(self): - return len(cache) - - self.get = types.MethodType(get, self) - self.set = types.MethodType(set, self) - self.clear = types.MethodType(clear, self) - self.__len__ = types.MethodType(cache_len, self) - - if _OrderedDict is not None: - class _FifoCache(object): - def __init__(self, size): - self.not_in_cache = not_in_cache = object() - - cache = _OrderedDict() - - def get(self, key): - return cache.get(key, not_in_cache) - - def set(self, key, value): - cache[key] = value - while len(cache) > size: - try: - cache.popitem(False) - except KeyError: - pass - - def clear(self): - cache.clear() - - def cache_len(self): - return len(cache) - - self.get = types.MethodType(get, self) - self.set = types.MethodType(set, self) - self.clear = types.MethodType(clear, self) - self.__len__ = types.MethodType(cache_len, self) - - else: - class _FifoCache(object): - def __init__(self, size): - self.not_in_cache = not_in_cache = object() - - cache = {} - key_fifo = collections.deque([], size) - - def get(self, key): - return cache.get(key, not_in_cache) - - def set(self, key, value): - cache[key] = value - while len(key_fifo) > size: - cache.pop(key_fifo.popleft(), None) - key_fifo.append(key) - - def clear(self): - cache.clear() - key_fifo.clear() - - def cache_len(self): - return len(cache) - - self.get = types.MethodType(get, self) - self.set = types.MethodType(set, self) - self.clear = types.MethodType(clear, self) - self.__len__ = types.MethodType(cache_len, self) - - # argument cache for optimizing repeated calls when backtracking through recursive expressions - packrat_cache = {} # this is set later by enabledPackrat(); this is here so that resetCache() doesn't fail - packrat_cache_lock = RLock() - packrat_cache_stats = [0, 0] - - # this method gets repeatedly called during backtracking with the same arguments - - # we can cache these arguments and save ourselves the trouble of re-parsing the contained expression - def _parseCache( self, instring, loc, doActions=True, callPreParse=True ): - HIT, MISS = 0, 1 - lookup = (self, instring, loc, callPreParse, doActions) - with ParserElement.packrat_cache_lock: - cache = ParserElement.packrat_cache - value = cache.get(lookup) - if value is cache.not_in_cache: - ParserElement.packrat_cache_stats[MISS] += 1 - try: - value = self._parseNoCache(instring, loc, doActions, callPreParse) - except ParseBaseException as pe: - # cache a copy of the exception, without the traceback - cache.set(lookup, pe.__class__(*pe.args)) - raise - else: - cache.set(lookup, (value[0], value[1].copy())) - return value - else: - ParserElement.packrat_cache_stats[HIT] += 1 - if isinstance(value, Exception): - raise value - return (value[0], value[1].copy()) - - _parse = _parseNoCache - - @staticmethod - def resetCache(): - ParserElement.packrat_cache.clear() - ParserElement.packrat_cache_stats[:] = [0] * len(ParserElement.packrat_cache_stats) - - _packratEnabled = False - @staticmethod - def enablePackrat(cache_size_limit=128): - """Enables "packrat" parsing, which adds memoizing to the parsing logic. - Repeated parse attempts at the same string location (which happens - often in many complex grammars) can immediately return a cached value, - instead of re-executing parsing/validating code. Memoizing is done of - both valid results and parsing exceptions. - - Parameters: - - - cache_size_limit - (default= ``128``) - if an integer value is provided - will limit the size of the packrat cache; if None is passed, then - the cache size will be unbounded; if 0 is passed, the cache will - be effectively disabled. - - This speedup may break existing programs that use parse actions that - have side-effects. For this reason, packrat parsing is disabled when - you first import pyparsing. To activate the packrat feature, your - program must call the class method :class:`ParserElement.enablePackrat`. - For best results, call ``enablePackrat()`` immediately after - importing pyparsing. - - Example:: - - from pip._vendor import pyparsing - pyparsing.ParserElement.enablePackrat() - """ - if not ParserElement._packratEnabled: - ParserElement._packratEnabled = True - if cache_size_limit is None: - ParserElement.packrat_cache = ParserElement._UnboundedCache() - else: - ParserElement.packrat_cache = ParserElement._FifoCache(cache_size_limit) - ParserElement._parse = ParserElement._parseCache - - def parseString( self, instring, parseAll=False ): - """ - Execute the parse expression with the given string. - This is the main interface to the client code, once the complete - expression has been built. - - If you want the grammar to require that the entire input string be - successfully parsed, then set ``parseAll`` to True (equivalent to ending - the grammar with ``StringEnd()``). - - Note: ``parseString`` implicitly calls ``expandtabs()`` on the input string, - in order to report proper column numbers in parse actions. - If the input string contains tabs and - the grammar uses parse actions that use the ``loc`` argument to index into the - string being parsed, you can ensure you have a consistent view of the input - string by: - - - calling ``parseWithTabs`` on your grammar before calling ``parseString`` - (see :class:`parseWithTabs`) - - define your parse action using the full ``(s,loc,toks)`` signature, and - reference the input string using the parse action's ``s`` argument - - explictly expand the tabs in your input string before calling - ``parseString`` - - Example:: - - Word('a').parseString('aaaaabaaa') # -> ['aaaaa'] - Word('a').parseString('aaaaabaaa', parseAll=True) # -> Exception: Expected end of text - """ - ParserElement.resetCache() - if not self.streamlined: - self.streamline() - #~ self.saveAsList = True - for e in self.ignoreExprs: - e.streamline() - if not self.keepTabs: - instring = instring.expandtabs() - try: - loc, tokens = self._parse( instring, 0 ) - if parseAll: - loc = self.preParse( instring, loc ) - se = Empty() + StringEnd() - se._parse( instring, loc ) - except ParseBaseException as exc: - if ParserElement.verbose_stacktrace: - raise - else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace - raise exc - else: - return tokens - - def scanString( self, instring, maxMatches=_MAX_INT, overlap=False ): - """ - Scan the input string for expression matches. Each match will return the - matching tokens, start location, and end location. May be called with optional - ``maxMatches`` argument, to clip scanning after 'n' matches are found. If - ``overlap`` is specified, then overlapping matches will be reported. - - Note that the start and end locations are reported relative to the string - being parsed. See :class:`parseString` for more information on parsing - strings with embedded tabs. - - Example:: - - source = "sldjf123lsdjjkf345sldkjf879lkjsfd987" - print(source) - for tokens,start,end in Word(alphas).scanString(source): - print(' '*start + '^'*(end-start)) - print(' '*start + tokens[0]) - - prints:: - - sldjf123lsdjjkf345sldkjf879lkjsfd987 - ^^^^^ - sldjf - ^^^^^^^ - lsdjjkf - ^^^^^^ - sldkjf - ^^^^^^ - lkjsfd - """ - if not self.streamlined: - self.streamline() - for e in self.ignoreExprs: - e.streamline() - - if not self.keepTabs: - instring = _ustr(instring).expandtabs() - instrlen = len(instring) - loc = 0 - preparseFn = self.preParse - parseFn = self._parse - ParserElement.resetCache() - matches = 0 - try: - while loc <= instrlen and matches < maxMatches: - try: - preloc = preparseFn( instring, loc ) - nextLoc,tokens = parseFn( instring, preloc, callPreParse=False ) - except ParseException: - loc = preloc+1 - else: - if nextLoc > loc: - matches += 1 - yield tokens, preloc, nextLoc - if overlap: - nextloc = preparseFn( instring, loc ) - if nextloc > loc: - loc = nextLoc - else: - loc += 1 - else: - loc = nextLoc - else: - loc = preloc+1 - except ParseBaseException as exc: - if ParserElement.verbose_stacktrace: - raise - else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace - raise exc - - def transformString( self, instring ): - """ - Extension to :class:`scanString`, to modify matching text with modified tokens that may - be returned from a parse action. To use ``transformString``, define a grammar and - attach a parse action to it that modifies the returned token list. - Invoking ``transformString()`` on a target string will then scan for matches, - and replace the matched text patterns according to the logic in the parse - action. ``transformString()`` returns the resulting transformed string. - - Example:: - - wd = Word(alphas) - wd.setParseAction(lambda toks: toks[0].title()) - - print(wd.transformString("now is the winter of our discontent made glorious summer by this sun of york.")) - - prints:: - - Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York. - """ - out = [] - lastE = 0 - # force preservation of <TAB>s, to minimize unwanted transformation of string, and to - # keep string locs straight between transformString and scanString - self.keepTabs = True - try: - for t,s,e in self.scanString( instring ): - out.append( instring[lastE:s] ) - if t: - if isinstance(t,ParseResults): - out += t.asList() - elif isinstance(t,list): - out += t - else: - out.append(t) - lastE = e - out.append(instring[lastE:]) - out = [o for o in out if o] - return "".join(map(_ustr,_flatten(out))) - except ParseBaseException as exc: - if ParserElement.verbose_stacktrace: - raise - else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace - raise exc - - def searchString( self, instring, maxMatches=_MAX_INT ): - """ - Another extension to :class:`scanString`, simplifying the access to the tokens found - to match the given parse expression. May be called with optional - ``maxMatches`` argument, to clip searching after 'n' matches are found. - - Example:: - - # a capitalized word starts with an uppercase letter, followed by zero or more lowercase letters - cap_word = Word(alphas.upper(), alphas.lower()) - - print(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity")) - - # the sum() builtin can be used to merge results into a single ParseResults object - print(sum(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity"))) - - prints:: - - [['More'], ['Iron'], ['Lead'], ['Gold'], ['I'], ['Electricity']] - ['More', 'Iron', 'Lead', 'Gold', 'I', 'Electricity'] - """ - try: - return ParseResults([ t for t,s,e in self.scanString( instring, maxMatches ) ]) - except ParseBaseException as exc: - if ParserElement.verbose_stacktrace: - raise - else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace - raise exc - - def split(self, instring, maxsplit=_MAX_INT, includeSeparators=False): - """ - Generator method to split a string using the given expression as a separator. - May be called with optional ``maxsplit`` argument, to limit the number of splits; - and the optional ``includeSeparators`` argument (default= ``False``), if the separating - matching text should be included in the split results. - - Example:: - - punc = oneOf(list(".,;:/-!?")) - print(list(punc.split("This, this?, this sentence, is badly punctuated!"))) - - prints:: - - ['This', ' this', '', ' this sentence', ' is badly punctuated', ''] - """ - splits = 0 - last = 0 - for t,s,e in self.scanString(instring, maxMatches=maxsplit): - yield instring[last:s] - if includeSeparators: - yield t[0] - last = e - yield instring[last:] - - def __add__(self, other ): - """ - Implementation of + operator - returns :class:`And`. Adding strings to a ParserElement - converts them to :class:`Literal`s by default. - - Example:: - - greet = Word(alphas) + "," + Word(alphas) + "!" - hello = "Hello, World!" - print (hello, "->", greet.parseString(hello)) - - prints:: - - Hello, World! -> ['Hello', ',', 'World', '!'] - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return And( [ self, other ] ) - - def __radd__(self, other ): - """ - Implementation of + operator when left operand is not a :class:`ParserElement` - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return other + self - - def __sub__(self, other): - """ - Implementation of - operator, returns :class:`And` with error stop - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return self + And._ErrorStop() + other - - def __rsub__(self, other ): - """ - Implementation of - operator when left operand is not a :class:`ParserElement` - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return other - self - - def __mul__(self,other): - """ - Implementation of * operator, allows use of ``expr * 3`` in place of - ``expr + expr + expr``. Expressions may also me multiplied by a 2-integer - tuple, similar to ``{min,max}`` multipliers in regular expressions. Tuples - may also include ``None`` as in: - - ``expr*(n,None)`` or ``expr*(n,)`` is equivalent - to ``expr*n + ZeroOrMore(expr)`` - (read as "at least n instances of ``expr``") - - ``expr*(None,n)`` is equivalent to ``expr*(0,n)`` - (read as "0 to n instances of ``expr``") - - ``expr*(None,None)`` is equivalent to ``ZeroOrMore(expr)`` - - ``expr*(1,None)`` is equivalent to ``OneOrMore(expr)`` - - Note that ``expr*(None,n)`` does not raise an exception if - more than n exprs exist in the input stream; that is, - ``expr*(None,n)`` does not enforce a maximum number of expr - occurrences. If this behavior is desired, then write - ``expr*(None,n) + ~expr`` - """ - if isinstance(other,int): - minElements, optElements = other,0 - elif isinstance(other,tuple): - other = (other + (None, None))[:2] - if other[0] is None: - other = (0, other[1]) - if isinstance(other[0],int) and other[1] is None: - if other[0] == 0: - return ZeroOrMore(self) - if other[0] == 1: - return OneOrMore(self) - else: - return self*other[0] + ZeroOrMore(self) - elif isinstance(other[0],int) and isinstance(other[1],int): - minElements, optElements = other - optElements -= minElements - else: - raise TypeError("cannot multiply 'ParserElement' and ('%s','%s') objects", type(other[0]),type(other[1])) - else: - raise TypeError("cannot multiply 'ParserElement' and '%s' objects", type(other)) - - if minElements < 0: - raise ValueError("cannot multiply ParserElement by negative value") - if optElements < 0: - raise ValueError("second tuple value must be greater or equal to first tuple value") - if minElements == optElements == 0: - raise ValueError("cannot multiply ParserElement by 0 or (0,0)") - - if (optElements): - def makeOptionalList(n): - if n>1: - return Optional(self + makeOptionalList(n-1)) - else: - return Optional(self) - if minElements: - if minElements == 1: - ret = self + makeOptionalList(optElements) - else: - ret = And([self]*minElements) + makeOptionalList(optElements) - else: - ret = makeOptionalList(optElements) - else: - if minElements == 1: - ret = self - else: - ret = And([self]*minElements) - return ret - - def __rmul__(self, other): - return self.__mul__(other) - - def __or__(self, other ): - """ - Implementation of | operator - returns :class:`MatchFirst` - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return MatchFirst( [ self, other ] ) - - def __ror__(self, other ): - """ - Implementation of | operator when left operand is not a :class:`ParserElement` - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return other | self - - def __xor__(self, other ): - """ - Implementation of ^ operator - returns :class:`Or` - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return Or( [ self, other ] ) - - def __rxor__(self, other ): - """ - Implementation of ^ operator when left operand is not a :class:`ParserElement` - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return other ^ self - - def __and__(self, other ): - """ - Implementation of & operator - returns :class:`Each` - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return Each( [ self, other ] ) - - def __rand__(self, other ): - """ - Implementation of & operator when left operand is not a :class:`ParserElement` - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return other & self - - def __invert__( self ): - """ - Implementation of ~ operator - returns :class:`NotAny` - """ - return NotAny( self ) - - def __call__(self, name=None): - """ - Shortcut for :class:`setResultsName`, with ``listAllMatches=False``. - - If ``name`` is given with a trailing ``'*'`` character, then ``listAllMatches`` will be - passed as ``True``. - - If ``name` is omitted, same as calling :class:`copy`. - - Example:: - - # these are equivalent - userdata = Word(alphas).setResultsName("name") + Word(nums+"-").setResultsName("socsecno") - userdata = Word(alphas)("name") + Word(nums+"-")("socsecno") - """ - if name is not None: - return self.setResultsName(name) - else: - return self.copy() - - def suppress( self ): - """ - Suppresses the output of this :class:`ParserElement`; useful to keep punctuation from - cluttering up returned output. - """ - return Suppress( self ) - - def leaveWhitespace( self ): - """ - Disables the skipping of whitespace before matching the characters in the - :class:`ParserElement`'s defined pattern. This is normally only used internally by - the pyparsing module, but may be needed in some whitespace-sensitive grammars. - """ - self.skipWhitespace = False - return self - - def setWhitespaceChars( self, chars ): - """ - Overrides the default whitespace chars - """ - self.skipWhitespace = True - self.whiteChars = chars - self.copyDefaultWhiteChars = False - return self - - def parseWithTabs( self ): - """ - Overrides default behavior to expand ``<TAB>``s to spaces before parsing the input string. - Must be called before ``parseString`` when the input grammar contains elements that - match ``<TAB>`` characters. - """ - self.keepTabs = True - return self - - def ignore( self, other ): - """ - Define expression to be ignored (e.g., comments) while doing pattern - matching; may be called repeatedly, to define multiple comment or other - ignorable patterns. - - Example:: - - patt = OneOrMore(Word(alphas)) - patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj'] - - patt.ignore(cStyleComment) - patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj', 'lskjd'] - """ - if isinstance(other, basestring): - other = Suppress(other) - - if isinstance( other, Suppress ): - if other not in self.ignoreExprs: - self.ignoreExprs.append(other) - else: - self.ignoreExprs.append( Suppress( other.copy() ) ) - return self - - def setDebugActions( self, startAction, successAction, exceptionAction ): - """ - Enable display of debugging messages while doing pattern matching. - """ - self.debugActions = (startAction or _defaultStartDebugAction, - successAction or _defaultSuccessDebugAction, - exceptionAction or _defaultExceptionDebugAction) - self.debug = True - return self - - def setDebug( self, flag=True ): - """ - Enable display of debugging messages while doing pattern matching. - Set ``flag`` to True to enable, False to disable. - - Example:: - - wd = Word(alphas).setName("alphaword") - integer = Word(nums).setName("numword") - term = wd | integer - - # turn on debugging for wd - wd.setDebug() - - OneOrMore(term).parseString("abc 123 xyz 890") - - prints:: - - Match alphaword at loc 0(1,1) - Matched alphaword -> ['abc'] - Match alphaword at loc 3(1,4) - Exception raised:Expected alphaword (at char 4), (line:1, col:5) - Match alphaword at loc 7(1,8) - Matched alphaword -> ['xyz'] - Match alphaword at loc 11(1,12) - Exception raised:Expected alphaword (at char 12), (line:1, col:13) - Match alphaword at loc 15(1,16) - Exception raised:Expected alphaword (at char 15), (line:1, col:16) - - The output shown is that produced by the default debug actions - custom debug actions can be - specified using :class:`setDebugActions`. Prior to attempting - to match the ``wd`` expression, the debugging message ``"Match <exprname> at loc <n>(<line>,<col>)"`` - is shown. Then if the parse succeeds, a ``"Matched"`` message is shown, or an ``"Exception raised"`` - message is shown. Also note the use of :class:`setName` to assign a human-readable name to the expression, - which makes debugging and exception messages easier to understand - for instance, the default - name created for the :class:`Word` expression without calling ``setName`` is ``"W:(ABCD...)"``. - """ - if flag: - self.setDebugActions( _defaultStartDebugAction, _defaultSuccessDebugAction, _defaultExceptionDebugAction ) - else: - self.debug = False - return self - - def __str__( self ): - return self.name - - def __repr__( self ): - return _ustr(self) - - def streamline( self ): - self.streamlined = True - self.strRepr = None - return self - - def checkRecursion( self, parseElementList ): - pass - - def validate( self, validateTrace=[] ): - """ - Check defined expressions for valid structure, check for infinite recursive definitions. - """ - self.checkRecursion( [] ) - - def parseFile( self, file_or_filename, parseAll=False ): - """ - Execute the parse expression on the given file or filename. - If a filename is specified (instead of a file object), - the entire file is opened, read, and closed before parsing. - """ - try: - file_contents = file_or_filename.read() - except AttributeError: - with open(file_or_filename, "r") as f: - file_contents = f.read() - try: - return self.parseString(file_contents, parseAll) - except ParseBaseException as exc: - if ParserElement.verbose_stacktrace: - raise - else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace - raise exc - - def __eq__(self,other): - if isinstance(other, ParserElement): - return self is other or vars(self) == vars(other) - elif isinstance(other, basestring): - return self.matches(other) - else: - return super(ParserElement,self)==other - - def __ne__(self,other): - return not (self == other) - - def __hash__(self): - return hash(id(self)) - - def __req__(self,other): - return self == other - - def __rne__(self,other): - return not (self == other) - - def matches(self, testString, parseAll=True): - """ - Method for quick testing of a parser against a test string. Good for simple - inline microtests of sub expressions while building up larger parser. - - Parameters: - - testString - to test against this expression for a match - - parseAll - (default= ``True``) - flag to pass to :class:`parseString` when running tests - - Example:: - - expr = Word(nums) - assert expr.matches("100") - """ - try: - self.parseString(_ustr(testString), parseAll=parseAll) - return True - except ParseBaseException: - return False - - def runTests(self, tests, parseAll=True, comment='#', - fullDump=True, printResults=True, failureTests=False, postParse=None): - """ - Execute the parse expression on a series of test strings, showing each - test, the parsed results or where the parse failed. Quick and easy way to - run a parse expression against a list of sample strings. - - Parameters: - - tests - a list of separate test strings, or a multiline string of test strings - - parseAll - (default= ``True``) - flag to pass to :class:`parseString` when running tests - - comment - (default= ``'#'``) - expression for indicating embedded comments in the test - string; pass None to disable comment filtering - - fullDump - (default= ``True``) - dump results as list followed by results names in nested outline; - if False, only dump nested list - - printResults - (default= ``True``) prints test output to stdout - - failureTests - (default= ``False``) indicates if these tests are expected to fail parsing - - postParse - (default= ``None``) optional callback for successful parse results; called as - `fn(test_string, parse_results)` and returns a string to be added to the test output - - Returns: a (success, results) tuple, where success indicates that all tests succeeded - (or failed if ``failureTests`` is True), and the results contain a list of lines of each - test's output - - Example:: - - number_expr = pyparsing_common.number.copy() - - result = number_expr.runTests(''' - # unsigned integer - 100 - # negative integer - -100 - # float with scientific notation - 6.02e23 - # integer with scientific notation - 1e-12 - ''') - print("Success" if result[0] else "Failed!") - - result = number_expr.runTests(''' - # stray character - 100Z - # missing leading digit before '.' - -.100 - # too many '.' - 3.14.159 - ''', failureTests=True) - print("Success" if result[0] else "Failed!") - - prints:: - - # unsigned integer - 100 - [100] - - # negative integer - -100 - [-100] - - # float with scientific notation - 6.02e23 - [6.02e+23] - - # integer with scientific notation - 1e-12 - [1e-12] - - Success - - # stray character - 100Z - ^ - FAIL: Expected end of text (at char 3), (line:1, col:4) - - # missing leading digit before '.' - -.100 - ^ - FAIL: Expected {real number with scientific notation | real number | signed integer} (at char 0), (line:1, col:1) - - # too many '.' - 3.14.159 - ^ - FAIL: Expected end of text (at char 4), (line:1, col:5) - - Success - - Each test string must be on a single line. If you want to test a string that spans multiple - lines, create a test like this:: - - expr.runTest(r"this is a test\\n of strings that spans \\n 3 lines") - - (Note that this is a raw string literal, you must include the leading 'r'.) - """ - if isinstance(tests, basestring): - tests = list(map(str.strip, tests.rstrip().splitlines())) - if isinstance(comment, basestring): - comment = Literal(comment) - allResults = [] - comments = [] - success = True - for t in tests: - if comment is not None and comment.matches(t, False) or comments and not t: - comments.append(t) - continue - if not t: - continue - out = ['\n'.join(comments), t] - comments = [] - try: - # convert newline marks to actual newlines, and strip leading BOM if present - NL = Literal(r'\n').addParseAction(replaceWith('\n')).ignore(quotedString) - BOM = '\ufeff' - t = NL.transformString(t.lstrip(BOM)) - result = self.parseString(t, parseAll=parseAll) - out.append(result.dump(full=fullDump)) - success = success and not failureTests - if postParse is not None: - try: - pp_value = postParse(t, result) - if pp_value is not None: - out.append(str(pp_value)) - except Exception as e: - out.append("{0} failed: {1}: {2}".format(postParse.__name__, type(e).__name__, e)) - except ParseBaseException as pe: - fatal = "(FATAL)" if isinstance(pe, ParseFatalException) else "" - if '\n' in t: - out.append(line(pe.loc, t)) - out.append(' '*(col(pe.loc,t)-1) + '^' + fatal) - else: - out.append(' '*pe.loc + '^' + fatal) - out.append("FAIL: " + str(pe)) - success = success and failureTests - result = pe - except Exception as exc: - out.append("FAIL-EXCEPTION: " + str(exc)) - success = success and failureTests - result = exc - - if printResults: - if fullDump: - out.append('') - print('\n'.join(out)) - - allResults.append((t, result)) - - return success, allResults - - -class Token(ParserElement): - """Abstract :class:`ParserElement` subclass, for defining atomic - matching patterns. - """ - def __init__( self ): - super(Token,self).__init__( savelist=False ) - - -class Empty(Token): - """An empty token, will always match. - """ - def __init__( self ): - super(Empty,self).__init__() - self.name = "Empty" - self.mayReturnEmpty = True - self.mayIndexError = False - - -class NoMatch(Token): - """A token that will never match. - """ - def __init__( self ): - super(NoMatch,self).__init__() - self.name = "NoMatch" - self.mayReturnEmpty = True - self.mayIndexError = False - self.errmsg = "Unmatchable token" - - def parseImpl( self, instring, loc, doActions=True ): - raise ParseException(instring, loc, self.errmsg, self) - - -class Literal(Token): - """Token to exactly match a specified string. - - Example:: - - Literal('blah').parseString('blah') # -> ['blah'] - Literal('blah').parseString('blahfooblah') # -> ['blah'] - Literal('blah').parseString('bla') # -> Exception: Expected "blah" - - For case-insensitive matching, use :class:`CaselessLiteral`. - - For keyword matching (force word break before and after the matched string), - use :class:`Keyword` or :class:`CaselessKeyword`. - """ - def __init__( self, matchString ): - super(Literal,self).__init__() - self.match = matchString - self.matchLen = len(matchString) - try: - self.firstMatchChar = matchString[0] - except IndexError: - warnings.warn("null string passed to Literal; use Empty() instead", - SyntaxWarning, stacklevel=2) - self.__class__ = Empty - self.name = '"%s"' % _ustr(self.match) - self.errmsg = "Expected " + self.name - self.mayReturnEmpty = False - self.mayIndexError = False - - # Performance tuning: this routine gets called a *lot* - # if this is a single character match string and the first character matches, - # short-circuit as quickly as possible, and avoid calling startswith - #~ @profile - def parseImpl( self, instring, loc, doActions=True ): - if (instring[loc] == self.firstMatchChar and - (self.matchLen==1 or instring.startswith(self.match,loc)) ): - return loc+self.matchLen, self.match - raise ParseException(instring, loc, self.errmsg, self) -_L = Literal -ParserElement._literalStringClass = Literal - -class Keyword(Token): - """Token to exactly match a specified string as a keyword, that is, - it must be immediately followed by a non-keyword character. Compare - with :class:`Literal`: - - - ``Literal("if")`` will match the leading ``'if'`` in - ``'ifAndOnlyIf'``. - - ``Keyword("if")`` will not; it will only match the leading - ``'if'`` in ``'if x=1'``, or ``'if(y==2)'`` - - Accepts two optional constructor arguments in addition to the - keyword string: - - - ``identChars`` is a string of characters that would be valid - identifier characters, defaulting to all alphanumerics + "_" and - "$" - - ``caseless`` allows case-insensitive matching, default is ``False``. - - Example:: - - Keyword("start").parseString("start") # -> ['start'] - Keyword("start").parseString("starting") # -> Exception - - For case-insensitive matching, use :class:`CaselessKeyword`. - """ - DEFAULT_KEYWORD_CHARS = alphanums+"_$" - - def __init__( self, matchString, identChars=None, caseless=False ): - super(Keyword,self).__init__() - if identChars is None: - identChars = Keyword.DEFAULT_KEYWORD_CHARS - self.match = matchString - self.matchLen = len(matchString) - try: - self.firstMatchChar = matchString[0] - except IndexError: - warnings.warn("null string passed to Keyword; use Empty() instead", - SyntaxWarning, stacklevel=2) - self.name = '"%s"' % self.match - self.errmsg = "Expected " + self.name - self.mayReturnEmpty = False - self.mayIndexError = False - self.caseless = caseless - if caseless: - self.caselessmatch = matchString.upper() - identChars = identChars.upper() - self.identChars = set(identChars) - - def parseImpl( self, instring, loc, doActions=True ): - if self.caseless: - if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and - (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) and - (loc == 0 or instring[loc-1].upper() not in self.identChars) ): - return loc+self.matchLen, self.match - else: - if (instring[loc] == self.firstMatchChar and - (self.matchLen==1 or instring.startswith(self.match,loc)) and - (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen] not in self.identChars) and - (loc == 0 or instring[loc-1] not in self.identChars) ): - return loc+self.matchLen, self.match - raise ParseException(instring, loc, self.errmsg, self) - - def copy(self): - c = super(Keyword,self).copy() - c.identChars = Keyword.DEFAULT_KEYWORD_CHARS - return c - - @staticmethod - def setDefaultKeywordChars( chars ): - """Overrides the default Keyword chars - """ - Keyword.DEFAULT_KEYWORD_CHARS = chars - -class CaselessLiteral(Literal): - """Token to match a specified string, ignoring case of letters. - Note: the matched results will always be in the case of the given - match string, NOT the case of the input text. - - Example:: - - OneOrMore(CaselessLiteral("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD', 'CMD'] - - (Contrast with example for :class:`CaselessKeyword`.) - """ - def __init__( self, matchString ): - super(CaselessLiteral,self).__init__( matchString.upper() ) - # Preserve the defining literal. - self.returnString = matchString - self.name = "'%s'" % self.returnString - self.errmsg = "Expected " + self.name - - def parseImpl( self, instring, loc, doActions=True ): - if instring[ loc:loc+self.matchLen ].upper() == self.match: - return loc+self.matchLen, self.returnString - raise ParseException(instring, loc, self.errmsg, self) - -class CaselessKeyword(Keyword): - """ - Caseless version of :class:`Keyword`. - - Example:: - - OneOrMore(CaselessKeyword("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD'] - - (Contrast with example for :class:`CaselessLiteral`.) - """ - def __init__( self, matchString, identChars=None ): - super(CaselessKeyword,self).__init__( matchString, identChars, caseless=True ) - -class CloseMatch(Token): - """A variation on :class:`Literal` which matches "close" matches, - that is, strings with at most 'n' mismatching characters. - :class:`CloseMatch` takes parameters: - - - ``match_string`` - string to be matched - - ``maxMismatches`` - (``default=1``) maximum number of - mismatches allowed to count as a match - - The results from a successful parse will contain the matched text - from the input string and the following named results: - - - ``mismatches`` - a list of the positions within the - match_string where mismatches were found - - ``original`` - the original match_string used to compare - against the input string - - If ``mismatches`` is an empty list, then the match was an exact - match. - - Example:: - - patt = CloseMatch("ATCATCGAATGGA") - patt.parseString("ATCATCGAAXGGA") # -> (['ATCATCGAAXGGA'], {'mismatches': [[9]], 'original': ['ATCATCGAATGGA']}) - patt.parseString("ATCAXCGAAXGGA") # -> Exception: Expected 'ATCATCGAATGGA' (with up to 1 mismatches) (at char 0), (line:1, col:1) - - # exact match - patt.parseString("ATCATCGAATGGA") # -> (['ATCATCGAATGGA'], {'mismatches': [[]], 'original': ['ATCATCGAATGGA']}) - - # close match allowing up to 2 mismatches - patt = CloseMatch("ATCATCGAATGGA", maxMismatches=2) - patt.parseString("ATCAXCGAAXGGA") # -> (['ATCAXCGAAXGGA'], {'mismatches': [[4, 9]], 'original': ['ATCATCGAATGGA']}) - """ - def __init__(self, match_string, maxMismatches=1): - super(CloseMatch,self).__init__() - self.name = match_string - self.match_string = match_string - self.maxMismatches = maxMismatches - self.errmsg = "Expected %r (with up to %d mismatches)" % (self.match_string, self.maxMismatches) - self.mayIndexError = False - self.mayReturnEmpty = False - - def parseImpl( self, instring, loc, doActions=True ): - start = loc - instrlen = len(instring) - maxloc = start + len(self.match_string) - - if maxloc <= instrlen: - match_string = self.match_string - match_stringloc = 0 - mismatches = [] - maxMismatches = self.maxMismatches - - for match_stringloc,s_m in enumerate(zip(instring[loc:maxloc], self.match_string)): - src,mat = s_m - if src != mat: - mismatches.append(match_stringloc) - if len(mismatches) > maxMismatches: - break - else: - loc = match_stringloc + 1 - results = ParseResults([instring[start:loc]]) - results['original'] = self.match_string - results['mismatches'] = mismatches - return loc, results - - raise ParseException(instring, loc, self.errmsg, self) - - -class Word(Token): - """Token for matching words composed of allowed character sets. - Defined with string containing all allowed initial characters, an - optional string containing allowed body characters (if omitted, - defaults to the initial character set), and an optional minimum, - maximum, and/or exact length. The default value for ``min`` is - 1 (a minimum value < 1 is not valid); the default values for - ``max`` and ``exact`` are 0, meaning no maximum or exact - length restriction. An optional ``excludeChars`` parameter can - list characters that might be found in the input ``bodyChars`` - string; useful to define a word of all printables except for one or - two characters, for instance. - - :class:`srange` is useful for defining custom character set strings - for defining ``Word`` expressions, using range notation from - regular expression character sets. - - A common mistake is to use :class:`Word` to match a specific literal - string, as in ``Word("Address")``. Remember that :class:`Word` - uses the string argument to define *sets* of matchable characters. - This expression would match "Add", "AAA", "dAred", or any other word - made up of the characters 'A', 'd', 'r', 'e', and 's'. To match an - exact literal string, use :class:`Literal` or :class:`Keyword`. - - pyparsing includes helper strings for building Words: - - - :class:`alphas` - - :class:`nums` - - :class:`alphanums` - - :class:`hexnums` - - :class:`alphas8bit` (alphabetic characters in ASCII range 128-255 - - accented, tilded, umlauted, etc.) - - :class:`punc8bit` (non-alphabetic characters in ASCII range - 128-255 - currency, symbols, superscripts, diacriticals, etc.) - - :class:`printables` (any non-whitespace character) - - Example:: - - # a word composed of digits - integer = Word(nums) # equivalent to Word("0123456789") or Word(srange("0-9")) - - # a word with a leading capital, and zero or more lowercase - capital_word = Word(alphas.upper(), alphas.lower()) - - # hostnames are alphanumeric, with leading alpha, and '-' - hostname = Word(alphas, alphanums+'-') - - # roman numeral (not a strict parser, accepts invalid mix of characters) - roman = Word("IVXLCDM") - - # any string of non-whitespace characters, except for ',' - csv_value = Word(printables, excludeChars=",") - """ - def __init__( self, initChars, bodyChars=None, min=1, max=0, exact=0, asKeyword=False, excludeChars=None ): - super(Word,self).__init__() - if excludeChars: - excludeChars = set(excludeChars) - initChars = ''.join(c for c in initChars if c not in excludeChars) - if bodyChars: - bodyChars = ''.join(c for c in bodyChars if c not in excludeChars) - self.initCharsOrig = initChars - self.initChars = set(initChars) - if bodyChars : - self.bodyCharsOrig = bodyChars - self.bodyChars = set(bodyChars) - else: - self.bodyCharsOrig = initChars - self.bodyChars = set(initChars) - - self.maxSpecified = max > 0 - - if min < 1: - raise ValueError("cannot specify a minimum length < 1; use Optional(Word()) if zero-length word is permitted") - - self.minLen = min - - if max > 0: - self.maxLen = max - else: - self.maxLen = _MAX_INT - - if exact > 0: - self.maxLen = exact - self.minLen = exact - - self.name = _ustr(self) - self.errmsg = "Expected " + self.name - self.mayIndexError = False - self.asKeyword = asKeyword - - if ' ' not in self.initCharsOrig+self.bodyCharsOrig and (min==1 and max==0 and exact==0): - if self.bodyCharsOrig == self.initCharsOrig: - self.reString = "[%s]+" % _escapeRegexRangeChars(self.initCharsOrig) - elif len(self.initCharsOrig) == 1: - self.reString = "%s[%s]*" % \ - (re.escape(self.initCharsOrig), - _escapeRegexRangeChars(self.bodyCharsOrig),) - else: - self.reString = "[%s][%s]*" % \ - (_escapeRegexRangeChars(self.initCharsOrig), - _escapeRegexRangeChars(self.bodyCharsOrig),) - if self.asKeyword: - self.reString = r"\b"+self.reString+r"\b" - try: - self.re = re.compile( self.reString ) - except Exception: - self.re = None - - def parseImpl( self, instring, loc, doActions=True ): - if self.re: - result = self.re.match(instring,loc) - if not result: - raise ParseException(instring, loc, self.errmsg, self) - - loc = result.end() - return loc, result.group() - - if instring[loc] not in self.initChars: - raise ParseException(instring, loc, self.errmsg, self) - - start = loc - loc += 1 - instrlen = len(instring) - bodychars = self.bodyChars - maxloc = start + self.maxLen - maxloc = min( maxloc, instrlen ) - while loc < maxloc and instring[loc] in bodychars: - loc += 1 - - throwException = False - if loc - start < self.minLen: - throwException = True - elif self.maxSpecified and loc < instrlen and instring[loc] in bodychars: - throwException = True - elif self.asKeyword: - if (start>0 and instring[start-1] in bodychars) or (loc<instrlen and instring[loc] in bodychars): - throwException = True - - if throwException: - raise ParseException(instring, loc, self.errmsg, self) - - return loc, instring[start:loc] - - def __str__( self ): - try: - return super(Word,self).__str__() - except Exception: - pass - - - if self.strRepr is None: - - def charsAsStr(s): - if len(s)>4: - return s[:4]+"..." - else: - return s - - if ( self.initCharsOrig != self.bodyCharsOrig ): - self.strRepr = "W:(%s,%s)" % ( charsAsStr(self.initCharsOrig), charsAsStr(self.bodyCharsOrig) ) - else: - self.strRepr = "W:(%s)" % charsAsStr(self.initCharsOrig) - - return self.strRepr - - -class Char(Word): - """A short-cut class for defining ``Word(characters, exact=1)``, - when defining a match of any single character in a string of - characters. - """ - def __init__(self, charset, asKeyword=False, excludeChars=None): - super(Char, self).__init__(charset, exact=1, asKeyword=asKeyword, excludeChars=excludeChars) - self.reString = "[%s]" % _escapeRegexRangeChars(self.initCharsOrig) - self.re = re.compile( self.reString ) - - -class Regex(Token): - r"""Token for matching strings that match a given regular - expression. Defined with string specifying the regular expression in - a form recognized by the stdlib Python `re module <https://docs.python.org/3/library/re.html>`_. - If the given regex contains named groups (defined using ``(?P<name>...)``), - these will be preserved as named parse results. - - Example:: - - realnum = Regex(r"[+-]?\d+\.\d*") - date = Regex(r'(?P<year>\d{4})-(?P<month>\d\d?)-(?P<day>\d\d?)') - # ref: https://stackoverflow.com/questions/267399/how-do-you-match-only-valid-roman-numerals-with-a-regular-expression - roman = Regex(r"M{0,4}(CM|CD|D?{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})") - """ - compiledREtype = type(re.compile("[A-Z]")) - def __init__( self, pattern, flags=0, asGroupList=False, asMatch=False): - """The parameters ``pattern`` and ``flags`` are passed - to the ``re.compile()`` function as-is. See the Python - `re module <https://docs.python.org/3/library/re.html>`_ module for an - explanation of the acceptable patterns and flags. - """ - super(Regex,self).__init__() - - if isinstance(pattern, basestring): - if not pattern: - warnings.warn("null string passed to Regex; use Empty() instead", - SyntaxWarning, stacklevel=2) - - self.pattern = pattern - self.flags = flags - - try: - self.re = re.compile(self.pattern, self.flags) - self.reString = self.pattern - except sre_constants.error: - warnings.warn("invalid pattern (%s) passed to Regex" % pattern, - SyntaxWarning, stacklevel=2) - raise - - elif isinstance(pattern, Regex.compiledREtype): - self.re = pattern - self.pattern = \ - self.reString = str(pattern) - self.flags = flags - - else: - raise ValueError("Regex may only be constructed with a string or a compiled RE object") - - self.name = _ustr(self) - self.errmsg = "Expected " + self.name - self.mayIndexError = False - self.mayReturnEmpty = True - self.asGroupList = asGroupList - self.asMatch = asMatch - if self.asGroupList: - self.parseImpl = self.parseImplAsGroupList - if self.asMatch: - self.parseImpl = self.parseImplAsMatch - - def parseImpl(self, instring, loc, doActions=True): - result = self.re.match(instring,loc) - if not result: - raise ParseException(instring, loc, self.errmsg, self) - - loc = result.end() - ret = ParseResults(result.group()) - d = result.groupdict() - if d: - for k, v in d.items(): - ret[k] = v - return loc, ret - - def parseImplAsGroupList(self, instring, loc, doActions=True): - result = self.re.match(instring,loc) - if not result: - raise ParseException(instring, loc, self.errmsg, self) - - loc = result.end() - ret = result.groups() - return loc, ret - - def parseImplAsMatch(self, instring, loc, doActions=True): - result = self.re.match(instring,loc) - if not result: - raise ParseException(instring, loc, self.errmsg, self) - - loc = result.end() - ret = result - return loc, ret - - def __str__( self ): - try: - return super(Regex,self).__str__() - except Exception: - pass - - if self.strRepr is None: - self.strRepr = "Re:(%s)" % repr(self.pattern) - - return self.strRepr - - def sub(self, repl): - r""" - Return Regex with an attached parse action to transform the parsed - result as if called using `re.sub(expr, repl, string) <https://docs.python.org/3/library/re.html#re.sub>`_. - - Example:: - - make_html = Regex(r"(\w+):(.*?):").sub(r"<\1>\2</\1>") - print(make_html.transformString("h1:main title:")) - # prints "<h1>main title</h1>" - """ - if self.asGroupList: - warnings.warn("cannot use sub() with Regex(asGroupList=True)", - SyntaxWarning, stacklevel=2) - raise SyntaxError() - - if self.asMatch and callable(repl): - warnings.warn("cannot use sub() with a callable with Regex(asMatch=True)", - SyntaxWarning, stacklevel=2) - raise SyntaxError() - - if self.asMatch: - def pa(tokens): - return tokens[0].expand(repl) - else: - def pa(tokens): - return self.re.sub(repl, tokens[0]) - return self.addParseAction(pa) - -class QuotedString(Token): - r""" - Token for matching strings that are delimited by quoting characters. - - Defined with the following parameters: - - - quoteChar - string of one or more characters defining the - quote delimiting string - - escChar - character to escape quotes, typically backslash - (default= ``None`` ) - - escQuote - special quote sequence to escape an embedded quote - string (such as SQL's ``""`` to escape an embedded ``"``) - (default= ``None`` ) - - multiline - boolean indicating whether quotes can span - multiple lines (default= ``False`` ) - - unquoteResults - boolean indicating whether the matched text - should be unquoted (default= ``True`` ) - - endQuoteChar - string of one or more characters defining the - end of the quote delimited string (default= ``None`` => same as - quoteChar) - - convertWhitespaceEscapes - convert escaped whitespace - (``'\t'``, ``'\n'``, etc.) to actual whitespace - (default= ``True`` ) - - Example:: - - qs = QuotedString('"') - print(qs.searchString('lsjdf "This is the quote" sldjf')) - complex_qs = QuotedString('{{', endQuoteChar='}}') - print(complex_qs.searchString('lsjdf {{This is the "quote"}} sldjf')) - sql_qs = QuotedString('"', escQuote='""') - print(sql_qs.searchString('lsjdf "This is the quote with ""embedded"" quotes" sldjf')) - - prints:: - - [['This is the quote']] - [['This is the "quote"']] - [['This is the quote with "embedded" quotes']] - """ - def __init__( self, quoteChar, escChar=None, escQuote=None, multiline=False, unquoteResults=True, endQuoteChar=None, convertWhitespaceEscapes=True): - super(QuotedString,self).__init__() - - # remove white space from quote chars - wont work anyway - quoteChar = quoteChar.strip() - if not quoteChar: - warnings.warn("quoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) - raise SyntaxError() - - if endQuoteChar is None: - endQuoteChar = quoteChar - else: - endQuoteChar = endQuoteChar.strip() - if not endQuoteChar: - warnings.warn("endQuoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) - raise SyntaxError() - - self.quoteChar = quoteChar - self.quoteCharLen = len(quoteChar) - self.firstQuoteChar = quoteChar[0] - self.endQuoteChar = endQuoteChar - self.endQuoteCharLen = len(endQuoteChar) - self.escChar = escChar - self.escQuote = escQuote - self.unquoteResults = unquoteResults - self.convertWhitespaceEscapes = convertWhitespaceEscapes - - if multiline: - self.flags = re.MULTILINE | re.DOTALL - self.pattern = r'%s(?:[^%s%s]' % \ - ( re.escape(self.quoteChar), - _escapeRegexRangeChars(self.endQuoteChar[0]), - (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) - else: - self.flags = 0 - self.pattern = r'%s(?:[^%s\n\r%s]' % \ - ( re.escape(self.quoteChar), - _escapeRegexRangeChars(self.endQuoteChar[0]), - (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) - if len(self.endQuoteChar) > 1: - self.pattern += ( - '|(?:' + ')|(?:'.join("%s[^%s]" % (re.escape(self.endQuoteChar[:i]), - _escapeRegexRangeChars(self.endQuoteChar[i])) - for i in range(len(self.endQuoteChar)-1,0,-1)) + ')' - ) - if escQuote: - self.pattern += (r'|(?:%s)' % re.escape(escQuote)) - if escChar: - self.pattern += (r'|(?:%s.)' % re.escape(escChar)) - self.escCharReplacePattern = re.escape(self.escChar)+"(.)" - self.pattern += (r')*%s' % re.escape(self.endQuoteChar)) - - try: - self.re = re.compile(self.pattern, self.flags) - self.reString = self.pattern - except sre_constants.error: - warnings.warn("invalid pattern (%s) passed to Regex" % self.pattern, - SyntaxWarning, stacklevel=2) - raise - - self.name = _ustr(self) - self.errmsg = "Expected " + self.name - self.mayIndexError = False - self.mayReturnEmpty = True - - def parseImpl( self, instring, loc, doActions=True ): - result = instring[loc] == self.firstQuoteChar and self.re.match(instring,loc) or None - if not result: - raise ParseException(instring, loc, self.errmsg, self) - - loc = result.end() - ret = result.group() - - if self.unquoteResults: - - # strip off quotes - ret = ret[self.quoteCharLen:-self.endQuoteCharLen] - - if isinstance(ret,basestring): - # replace escaped whitespace - if '\\' in ret and self.convertWhitespaceEscapes: - ws_map = { - r'\t' : '\t', - r'\n' : '\n', - r'\f' : '\f', - r'\r' : '\r', - } - for wslit,wschar in ws_map.items(): - ret = ret.replace(wslit, wschar) - - # replace escaped characters - if self.escChar: - ret = re.sub(self.escCharReplacePattern, r"\g<1>", ret) - - # replace escaped quotes - if self.escQuote: - ret = ret.replace(self.escQuote, self.endQuoteChar) - - return loc, ret - - def __str__( self ): - try: - return super(QuotedString,self).__str__() - except Exception: - pass - - if self.strRepr is None: - self.strRepr = "quoted string, starting with %s ending with %s" % (self.quoteChar, self.endQuoteChar) - - return self.strRepr - - -class CharsNotIn(Token): - """Token for matching words composed of characters *not* in a given - set (will include whitespace in matched characters if not listed in - the provided exclusion set - see example). Defined with string - containing all disallowed characters, and an optional minimum, - maximum, and/or exact length. The default value for ``min`` is - 1 (a minimum value < 1 is not valid); the default values for - ``max`` and ``exact`` are 0, meaning no maximum or exact - length restriction. - - Example:: - - # define a comma-separated-value as anything that is not a ',' - csv_value = CharsNotIn(',') - print(delimitedList(csv_value).parseString("dkls,lsdkjf,s12 34,@!#,213")) - - prints:: - - ['dkls', 'lsdkjf', 's12 34', '@!#', '213'] - """ - def __init__( self, notChars, min=1, max=0, exact=0 ): - super(CharsNotIn,self).__init__() - self.skipWhitespace = False - self.notChars = notChars - - if min < 1: - raise ValueError( - "cannot specify a minimum length < 1; use " + - "Optional(CharsNotIn()) if zero-length char group is permitted") - - self.minLen = min - - if max > 0: - self.maxLen = max - else: - self.maxLen = _MAX_INT - - if exact > 0: - self.maxLen = exact - self.minLen = exact - - self.name = _ustr(self) - self.errmsg = "Expected " + self.name - self.mayReturnEmpty = ( self.minLen == 0 ) - self.mayIndexError = False - - def parseImpl( self, instring, loc, doActions=True ): - if instring[loc] in self.notChars: - raise ParseException(instring, loc, self.errmsg, self) - - start = loc - loc += 1 - notchars = self.notChars - maxlen = min( start+self.maxLen, len(instring) ) - while loc < maxlen and \ - (instring[loc] not in notchars): - loc += 1 - - if loc - start < self.minLen: - raise ParseException(instring, loc, self.errmsg, self) - - return loc, instring[start:loc] - - def __str__( self ): - try: - return super(CharsNotIn, self).__str__() - except Exception: - pass - - if self.strRepr is None: - if len(self.notChars) > 4: - self.strRepr = "!W:(%s...)" % self.notChars[:4] - else: - self.strRepr = "!W:(%s)" % self.notChars - - return self.strRepr - -class White(Token): - """Special matching class for matching whitespace. Normally, - whitespace is ignored by pyparsing grammars. This class is included - when some whitespace structures are significant. Define with - a string containing the whitespace characters to be matched; default - is ``" \\t\\r\\n"``. Also takes optional ``min``, - ``max``, and ``exact`` arguments, as defined for the - :class:`Word` class. - """ - whiteStrs = { - ' ' : '<SP>', - '\t': '<TAB>', - '\n': '<LF>', - '\r': '<CR>', - '\f': '<FF>', - 'u\00A0': '<NBSP>', - 'u\1680': '<OGHAM_SPACE_MARK>', - 'u\180E': '<MONGOLIAN_VOWEL_SEPARATOR>', - 'u\2000': '<EN_QUAD>', - 'u\2001': '<EM_QUAD>', - 'u\2002': '<EN_SPACE>', - 'u\2003': '<EM_SPACE>', - 'u\2004': '<THREE-PER-EM_SPACE>', - 'u\2005': '<FOUR-PER-EM_SPACE>', - 'u\2006': '<SIX-PER-EM_SPACE>', - 'u\2007': '<FIGURE_SPACE>', - 'u\2008': '<PUNCTUATION_SPACE>', - 'u\2009': '<THIN_SPACE>', - 'u\200A': '<HAIR_SPACE>', - 'u\200B': '<ZERO_WIDTH_SPACE>', - 'u\202F': '<NNBSP>', - 'u\205F': '<MMSP>', - 'u\3000': '<IDEOGRAPHIC_SPACE>', - } - def __init__(self, ws=" \t\r\n", min=1, max=0, exact=0): - super(White,self).__init__() - self.matchWhite = ws - self.setWhitespaceChars( "".join(c for c in self.whiteChars if c not in self.matchWhite) ) - #~ self.leaveWhitespace() - self.name = ("".join(White.whiteStrs[c] for c in self.matchWhite)) - self.mayReturnEmpty = True - self.errmsg = "Expected " + self.name - - self.minLen = min - - if max > 0: - self.maxLen = max - else: - self.maxLen = _MAX_INT - - if exact > 0: - self.maxLen = exact - self.minLen = exact - - def parseImpl( self, instring, loc, doActions=True ): - if instring[loc] not in self.matchWhite: - raise ParseException(instring, loc, self.errmsg, self) - start = loc - loc += 1 - maxloc = start + self.maxLen - maxloc = min( maxloc, len(instring) ) - while loc < maxloc and instring[loc] in self.matchWhite: - loc += 1 - - if loc - start < self.minLen: - raise ParseException(instring, loc, self.errmsg, self) - - return loc, instring[start:loc] - - -class _PositionToken(Token): - def __init__( self ): - super(_PositionToken,self).__init__() - self.name=self.__class__.__name__ - self.mayReturnEmpty = True - self.mayIndexError = False - -class GoToColumn(_PositionToken): - """Token to advance to a specific column of input text; useful for - tabular report scraping. - """ - def __init__( self, colno ): - super(GoToColumn,self).__init__() - self.col = colno - - def preParse( self, instring, loc ): - if col(loc,instring) != self.col: - instrlen = len(instring) - if self.ignoreExprs: - loc = self._skipIgnorables( instring, loc ) - while loc < instrlen and instring[loc].isspace() and col( loc, instring ) != self.col : - loc += 1 - return loc - - def parseImpl( self, instring, loc, doActions=True ): - thiscol = col( loc, instring ) - if thiscol > self.col: - raise ParseException( instring, loc, "Text not in expected column", self ) - newloc = loc + self.col - thiscol - ret = instring[ loc: newloc ] - return newloc, ret - - -class LineStart(_PositionToken): - r"""Matches if current position is at the beginning of a line within - the parse string - - Example:: - - test = '''\ - AAA this line - AAA and this line - AAA but not this one - B AAA and definitely not this one - ''' - - for t in (LineStart() + 'AAA' + restOfLine).searchString(test): - print(t) - - prints:: - - ['AAA', ' this line'] - ['AAA', ' and this line'] - - """ - def __init__( self ): - super(LineStart,self).__init__() - self.errmsg = "Expected start of line" - - def parseImpl( self, instring, loc, doActions=True ): - if col(loc, instring) == 1: - return loc, [] - raise ParseException(instring, loc, self.errmsg, self) - -class LineEnd(_PositionToken): - """Matches if current position is at the end of a line within the - parse string - """ - def __init__( self ): - super(LineEnd,self).__init__() - self.setWhitespaceChars( ParserElement.DEFAULT_WHITE_CHARS.replace("\n","") ) - self.errmsg = "Expected end of line" - - def parseImpl( self, instring, loc, doActions=True ): - if loc<len(instring): - if instring[loc] == "\n": - return loc+1, "\n" - else: - raise ParseException(instring, loc, self.errmsg, self) - elif loc == len(instring): - return loc+1, [] - else: - raise ParseException(instring, loc, self.errmsg, self) - -class StringStart(_PositionToken): - """Matches if current position is at the beginning of the parse - string - """ - def __init__( self ): - super(StringStart,self).__init__() - self.errmsg = "Expected start of text" - - def parseImpl( self, instring, loc, doActions=True ): - if loc != 0: - # see if entire string up to here is just whitespace and ignoreables - if loc != self.preParse( instring, 0 ): - raise ParseException(instring, loc, self.errmsg, self) - return loc, [] - -class StringEnd(_PositionToken): - """Matches if current position is at the end of the parse string - """ - def __init__( self ): - super(StringEnd,self).__init__() - self.errmsg = "Expected end of text" - - def parseImpl( self, instring, loc, doActions=True ): - if loc < len(instring): - raise ParseException(instring, loc, self.errmsg, self) - elif loc == len(instring): - return loc+1, [] - elif loc > len(instring): - return loc, [] - else: - raise ParseException(instring, loc, self.errmsg, self) - -class WordStart(_PositionToken): - """Matches if the current position is at the beginning of a Word, - and is not preceded by any character in a given set of - ``wordChars`` (default= ``printables``). To emulate the - ``\b`` behavior of regular expressions, use - ``WordStart(alphanums)``. ``WordStart`` will also match at - the beginning of the string being parsed, or at the beginning of - a line. - """ - def __init__(self, wordChars = printables): - super(WordStart,self).__init__() - self.wordChars = set(wordChars) - self.errmsg = "Not at the start of a word" - - def parseImpl(self, instring, loc, doActions=True ): - if loc != 0: - if (instring[loc-1] in self.wordChars or - instring[loc] not in self.wordChars): - raise ParseException(instring, loc, self.errmsg, self) - return loc, [] - -class WordEnd(_PositionToken): - """Matches if the current position is at the end of a Word, and is - not followed by any character in a given set of ``wordChars`` - (default= ``printables``). To emulate the ``\b`` behavior of - regular expressions, use ``WordEnd(alphanums)``. ``WordEnd`` - will also match at the end of the string being parsed, or at the end - of a line. - """ - def __init__(self, wordChars = printables): - super(WordEnd,self).__init__() - self.wordChars = set(wordChars) - self.skipWhitespace = False - self.errmsg = "Not at the end of a word" - - def parseImpl(self, instring, loc, doActions=True ): - instrlen = len(instring) - if instrlen>0 and loc<instrlen: - if (instring[loc] in self.wordChars or - instring[loc-1] not in self.wordChars): - raise ParseException(instring, loc, self.errmsg, self) - return loc, [] - - -class ParseExpression(ParserElement): - """Abstract subclass of ParserElement, for combining and - post-processing parsed tokens. - """ - def __init__( self, exprs, savelist = False ): - super(ParseExpression,self).__init__(savelist) - if isinstance( exprs, _generatorType ): - exprs = list(exprs) - - if isinstance( exprs, basestring ): - self.exprs = [ ParserElement._literalStringClass( exprs ) ] - elif isinstance( exprs, Iterable ): - exprs = list(exprs) - # if sequence of strings provided, wrap with Literal - if all(isinstance(expr, basestring) for expr in exprs): - exprs = map(ParserElement._literalStringClass, exprs) - self.exprs = list(exprs) - else: - try: - self.exprs = list( exprs ) - except TypeError: - self.exprs = [ exprs ] - self.callPreparse = False - - def __getitem__( self, i ): - return self.exprs[i] - - def append( self, other ): - self.exprs.append( other ) - self.strRepr = None - return self - - def leaveWhitespace( self ): - """Extends ``leaveWhitespace`` defined in base class, and also invokes ``leaveWhitespace`` on - all contained expressions.""" - self.skipWhitespace = False - self.exprs = [ e.copy() for e in self.exprs ] - for e in self.exprs: - e.leaveWhitespace() - return self - - def ignore( self, other ): - if isinstance( other, Suppress ): - if other not in self.ignoreExprs: - super( ParseExpression, self).ignore( other ) - for e in self.exprs: - e.ignore( self.ignoreExprs[-1] ) - else: - super( ParseExpression, self).ignore( other ) - for e in self.exprs: - e.ignore( self.ignoreExprs[-1] ) - return self - - def __str__( self ): - try: - return super(ParseExpression,self).__str__() - except Exception: - pass - - if self.strRepr is None: - self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.exprs) ) - return self.strRepr - - def streamline( self ): - super(ParseExpression,self).streamline() - - for e in self.exprs: - e.streamline() - - # collapse nested And's of the form And( And( And( a,b), c), d) to And( a,b,c,d ) - # but only if there are no parse actions or resultsNames on the nested And's - # (likewise for Or's and MatchFirst's) - if ( len(self.exprs) == 2 ): - other = self.exprs[0] - if ( isinstance( other, self.__class__ ) and - not(other.parseAction) and - other.resultsName is None and - not other.debug ): - self.exprs = other.exprs[:] + [ self.exprs[1] ] - self.strRepr = None - self.mayReturnEmpty |= other.mayReturnEmpty - self.mayIndexError |= other.mayIndexError - - other = self.exprs[-1] - if ( isinstance( other, self.__class__ ) and - not(other.parseAction) and - other.resultsName is None and - not other.debug ): - self.exprs = self.exprs[:-1] + other.exprs[:] - self.strRepr = None - self.mayReturnEmpty |= other.mayReturnEmpty - self.mayIndexError |= other.mayIndexError - - self.errmsg = "Expected " + _ustr(self) - - return self - - def validate( self, validateTrace=[] ): - tmp = validateTrace[:]+[self] - for e in self.exprs: - e.validate(tmp) - self.checkRecursion( [] ) - - def copy(self): - ret = super(ParseExpression,self).copy() - ret.exprs = [e.copy() for e in self.exprs] - return ret - -class And(ParseExpression): - """ - Requires all given :class:`ParseExpression` s to be found in the given order. - Expressions may be separated by whitespace. - May be constructed using the ``'+'`` operator. - May also be constructed using the ``'-'`` operator, which will - suppress backtracking. - - Example:: - - integer = Word(nums) - name_expr = OneOrMore(Word(alphas)) - - expr = And([integer("id"),name_expr("name"),integer("age")]) - # more easily written as: - expr = integer("id") + name_expr("name") + integer("age") - """ - - class _ErrorStop(Empty): - def __init__(self, *args, **kwargs): - super(And._ErrorStop,self).__init__(*args, **kwargs) - self.name = '-' - self.leaveWhitespace() - - def __init__( self, exprs, savelist = True ): - super(And,self).__init__(exprs, savelist) - self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) - self.setWhitespaceChars( self.exprs[0].whiteChars ) - self.skipWhitespace = self.exprs[0].skipWhitespace - self.callPreparse = True - - def streamline(self): - super(And, self).streamline() - self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) - return self - - def parseImpl( self, instring, loc, doActions=True ): - # pass False as last arg to _parse for first element, since we already - # pre-parsed the string as part of our And pre-parsing - loc, resultlist = self.exprs[0]._parse( instring, loc, doActions, callPreParse=False ) - errorStop = False - for e in self.exprs[1:]: - if isinstance(e, And._ErrorStop): - errorStop = True - continue - if errorStop: - try: - loc, exprtokens = e._parse( instring, loc, doActions ) - except ParseSyntaxException: - raise - except ParseBaseException as pe: - pe.__traceback__ = None - raise ParseSyntaxException._from_exception(pe) - except IndexError: - raise ParseSyntaxException(instring, len(instring), self.errmsg, self) - else: - loc, exprtokens = e._parse( instring, loc, doActions ) - if exprtokens or exprtokens.haskeys(): - resultlist += exprtokens - return loc, resultlist - - def __iadd__(self, other ): - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - return self.append( other ) #And( [ self, other ] ) - - def checkRecursion( self, parseElementList ): - subRecCheckList = parseElementList[:] + [ self ] - for e in self.exprs: - e.checkRecursion( subRecCheckList ) - if not e.mayReturnEmpty: - break - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "{" + " ".join(_ustr(e) for e in self.exprs) + "}" - - return self.strRepr - - -class Or(ParseExpression): - """Requires that at least one :class:`ParseExpression` is found. If - two expressions match, the expression that matches the longest - string will be used. May be constructed using the ``'^'`` - operator. - - Example:: - - # construct Or using '^' operator - - number = Word(nums) ^ Combine(Word(nums) + '.' + Word(nums)) - print(number.searchString("123 3.1416 789")) - - prints:: - - [['123'], ['3.1416'], ['789']] - """ - def __init__( self, exprs, savelist = False ): - super(Or,self).__init__(exprs, savelist) - if self.exprs: - self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) - else: - self.mayReturnEmpty = True - - def streamline(self): - super(Or, self).streamline() - if __compat__.collect_all_And_tokens: - self.saveAsList = any(e.saveAsList for e in self.exprs) - return self - - def parseImpl( self, instring, loc, doActions=True ): - maxExcLoc = -1 - maxException = None - matches = [] - for e in self.exprs: - try: - loc2 = e.tryParse( instring, loc ) - except ParseException as err: - err.__traceback__ = None - if err.loc > maxExcLoc: - maxException = err - maxExcLoc = err.loc - except IndexError: - if len(instring) > maxExcLoc: - maxException = ParseException(instring,len(instring),e.errmsg,self) - maxExcLoc = len(instring) - else: - # save match among all matches, to retry longest to shortest - matches.append((loc2, e)) - - if matches: - matches.sort(key=lambda x: -x[0]) - for _,e in matches: - try: - return e._parse( instring, loc, doActions ) - except ParseException as err: - err.__traceback__ = None - if err.loc > maxExcLoc: - maxException = err - maxExcLoc = err.loc - - if maxException is not None: - maxException.msg = self.errmsg - raise maxException - else: - raise ParseException(instring, loc, "no defined alternatives to match", self) - - - def __ixor__(self, other ): - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - return self.append( other ) #Or( [ self, other ] ) - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "{" + " ^ ".join(_ustr(e) for e in self.exprs) + "}" - - return self.strRepr - - def checkRecursion( self, parseElementList ): - subRecCheckList = parseElementList[:] + [ self ] - for e in self.exprs: - e.checkRecursion( subRecCheckList ) - - -class MatchFirst(ParseExpression): - """Requires that at least one :class:`ParseExpression` is found. If - two expressions match, the first one listed is the one that will - match. May be constructed using the ``'|'`` operator. - - Example:: - - # construct MatchFirst using '|' operator - - # watch the order of expressions to match - number = Word(nums) | Combine(Word(nums) + '.' + Word(nums)) - print(number.searchString("123 3.1416 789")) # Fail! -> [['123'], ['3'], ['1416'], ['789']] - - # put more selective expression first - number = Combine(Word(nums) + '.' + Word(nums)) | Word(nums) - print(number.searchString("123 3.1416 789")) # Better -> [['123'], ['3.1416'], ['789']] - """ - def __init__( self, exprs, savelist = False ): - super(MatchFirst,self).__init__(exprs, savelist) - if self.exprs: - self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) - else: - self.mayReturnEmpty = True - - def streamline(self): - super(MatchFirst, self).streamline() - if __compat__.collect_all_And_tokens: - self.saveAsList = any(e.saveAsList for e in self.exprs) - return self - - def parseImpl( self, instring, loc, doActions=True ): - maxExcLoc = -1 - maxException = None - for e in self.exprs: - try: - ret = e._parse( instring, loc, doActions ) - return ret - except ParseException as err: - if err.loc > maxExcLoc: - maxException = err - maxExcLoc = err.loc - except IndexError: - if len(instring) > maxExcLoc: - maxException = ParseException(instring,len(instring),e.errmsg,self) - maxExcLoc = len(instring) - - # only got here if no expression matched, raise exception for match that made it the furthest - else: - if maxException is not None: - maxException.msg = self.errmsg - raise maxException - else: - raise ParseException(instring, loc, "no defined alternatives to match", self) - - def __ior__(self, other ): - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - return self.append( other ) #MatchFirst( [ self, other ] ) - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "{" + " | ".join(_ustr(e) for e in self.exprs) + "}" - - return self.strRepr - - def checkRecursion( self, parseElementList ): - subRecCheckList = parseElementList[:] + [ self ] - for e in self.exprs: - e.checkRecursion( subRecCheckList ) - - -class Each(ParseExpression): - """Requires all given :class:`ParseExpression` s to be found, but in - any order. Expressions may be separated by whitespace. - - May be constructed using the ``'&'`` operator. - - Example:: - - color = oneOf("RED ORANGE YELLOW GREEN BLUE PURPLE BLACK WHITE BROWN") - shape_type = oneOf("SQUARE CIRCLE TRIANGLE STAR HEXAGON OCTAGON") - integer = Word(nums) - shape_attr = "shape:" + shape_type("shape") - posn_attr = "posn:" + Group(integer("x") + ',' + integer("y"))("posn") - color_attr = "color:" + color("color") - size_attr = "size:" + integer("size") - - # use Each (using operator '&') to accept attributes in any order - # (shape and posn are required, color and size are optional) - shape_spec = shape_attr & posn_attr & Optional(color_attr) & Optional(size_attr) - - shape_spec.runTests(''' - shape: SQUARE color: BLACK posn: 100, 120 - shape: CIRCLE size: 50 color: BLUE posn: 50,80 - color:GREEN size:20 shape:TRIANGLE posn:20,40 - ''' - ) - - prints:: - - shape: SQUARE color: BLACK posn: 100, 120 - ['shape:', 'SQUARE', 'color:', 'BLACK', 'posn:', ['100', ',', '120']] - - color: BLACK - - posn: ['100', ',', '120'] - - x: 100 - - y: 120 - - shape: SQUARE - - - shape: CIRCLE size: 50 color: BLUE posn: 50,80 - ['shape:', 'CIRCLE', 'size:', '50', 'color:', 'BLUE', 'posn:', ['50', ',', '80']] - - color: BLUE - - posn: ['50', ',', '80'] - - x: 50 - - y: 80 - - shape: CIRCLE - - size: 50 - - - color: GREEN size: 20 shape: TRIANGLE posn: 20,40 - ['color:', 'GREEN', 'size:', '20', 'shape:', 'TRIANGLE', 'posn:', ['20', ',', '40']] - - color: GREEN - - posn: ['20', ',', '40'] - - x: 20 - - y: 40 - - shape: TRIANGLE - - size: 20 - """ - def __init__( self, exprs, savelist = True ): - super(Each,self).__init__(exprs, savelist) - self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) - self.skipWhitespace = True - self.initExprGroups = True - self.saveAsList = True - - def streamline(self): - super(Each, self).streamline() - self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) - return self - - def parseImpl( self, instring, loc, doActions=True ): - if self.initExprGroups: - self.opt1map = dict((id(e.expr),e) for e in self.exprs if isinstance(e,Optional)) - opt1 = [ e.expr for e in self.exprs if isinstance(e,Optional) ] - opt2 = [ e for e in self.exprs if e.mayReturnEmpty and not isinstance(e,Optional)] - self.optionals = opt1 + opt2 - self.multioptionals = [ e.expr for e in self.exprs if isinstance(e,ZeroOrMore) ] - self.multirequired = [ e.expr for e in self.exprs if isinstance(e,OneOrMore) ] - self.required = [ e for e in self.exprs if not isinstance(e,(Optional,ZeroOrMore,OneOrMore)) ] - self.required += self.multirequired - self.initExprGroups = False - tmpLoc = loc - tmpReqd = self.required[:] - tmpOpt = self.optionals[:] - matchOrder = [] - - keepMatching = True - while keepMatching: - tmpExprs = tmpReqd + tmpOpt + self.multioptionals + self.multirequired - failed = [] - for e in tmpExprs: - try: - tmpLoc = e.tryParse( instring, tmpLoc ) - except ParseException: - failed.append(e) - else: - matchOrder.append(self.opt1map.get(id(e),e)) - if e in tmpReqd: - tmpReqd.remove(e) - elif e in tmpOpt: - tmpOpt.remove(e) - if len(failed) == len(tmpExprs): - keepMatching = False - - if tmpReqd: - missing = ", ".join(_ustr(e) for e in tmpReqd) - raise ParseException(instring,loc,"Missing one or more required elements (%s)" % missing ) - - # add any unmatched Optionals, in case they have default values defined - matchOrder += [e for e in self.exprs if isinstance(e,Optional) and e.expr in tmpOpt] - - resultlist = [] - for e in matchOrder: - loc,results = e._parse(instring,loc,doActions) - resultlist.append(results) - - finalResults = sum(resultlist, ParseResults([])) - return loc, finalResults - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "{" + " & ".join(_ustr(e) for e in self.exprs) + "}" - - return self.strRepr - - def checkRecursion( self, parseElementList ): - subRecCheckList = parseElementList[:] + [ self ] - for e in self.exprs: - e.checkRecursion( subRecCheckList ) - - -class ParseElementEnhance(ParserElement): - """Abstract subclass of :class:`ParserElement`, for combining and - post-processing parsed tokens. - """ - def __init__( self, expr, savelist=False ): - super(ParseElementEnhance,self).__init__(savelist) - if isinstance( expr, basestring ): - if issubclass(ParserElement._literalStringClass, Token): - expr = ParserElement._literalStringClass(expr) - else: - expr = ParserElement._literalStringClass(Literal(expr)) - self.expr = expr - self.strRepr = None - if expr is not None: - self.mayIndexError = expr.mayIndexError - self.mayReturnEmpty = expr.mayReturnEmpty - self.setWhitespaceChars( expr.whiteChars ) - self.skipWhitespace = expr.skipWhitespace - self.saveAsList = expr.saveAsList - self.callPreparse = expr.callPreparse - self.ignoreExprs.extend(expr.ignoreExprs) - - def parseImpl( self, instring, loc, doActions=True ): - if self.expr is not None: - return self.expr._parse( instring, loc, doActions, callPreParse=False ) - else: - raise ParseException("",loc,self.errmsg,self) - - def leaveWhitespace( self ): - self.skipWhitespace = False - self.expr = self.expr.copy() - if self.expr is not None: - self.expr.leaveWhitespace() - return self - - def ignore( self, other ): - if isinstance( other, Suppress ): - if other not in self.ignoreExprs: - super( ParseElementEnhance, self).ignore( other ) - if self.expr is not None: - self.expr.ignore( self.ignoreExprs[-1] ) - else: - super( ParseElementEnhance, self).ignore( other ) - if self.expr is not None: - self.expr.ignore( self.ignoreExprs[-1] ) - return self - - def streamline( self ): - super(ParseElementEnhance,self).streamline() - if self.expr is not None: - self.expr.streamline() - return self - - def checkRecursion( self, parseElementList ): - if self in parseElementList: - raise RecursiveGrammarException( parseElementList+[self] ) - subRecCheckList = parseElementList[:] + [ self ] - if self.expr is not None: - self.expr.checkRecursion( subRecCheckList ) - - def validate( self, validateTrace=[] ): - tmp = validateTrace[:]+[self] - if self.expr is not None: - self.expr.validate(tmp) - self.checkRecursion( [] ) - - def __str__( self ): - try: - return super(ParseElementEnhance,self).__str__() - except Exception: - pass - - if self.strRepr is None and self.expr is not None: - self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.expr) ) - return self.strRepr - - -class FollowedBy(ParseElementEnhance): - """Lookahead matching of the given parse expression. - ``FollowedBy`` does *not* advance the parsing position within - the input string, it only verifies that the specified parse - expression matches at the current position. ``FollowedBy`` - always returns a null token list. If any results names are defined - in the lookahead expression, those *will* be returned for access by - name. - - Example:: - - # use FollowedBy to match a label only if it is followed by a ':' - data_word = Word(alphas) - label = data_word + FollowedBy(':') - attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) - - OneOrMore(attr_expr).parseString("shape: SQUARE color: BLACK posn: upper left").pprint() - - prints:: - - [['shape', 'SQUARE'], ['color', 'BLACK'], ['posn', 'upper left']] - """ - def __init__( self, expr ): - super(FollowedBy,self).__init__(expr) - self.mayReturnEmpty = True - - def parseImpl( self, instring, loc, doActions=True ): - _, ret = self.expr._parse(instring, loc, doActions=doActions) - del ret[:] - return loc, ret - - -class PrecededBy(ParseElementEnhance): - """Lookbehind matching of the given parse expression. - ``PrecededBy`` does not advance the parsing position within the - input string, it only verifies that the specified parse expression - matches prior to the current position. ``PrecededBy`` always - returns a null token list, but if a results name is defined on the - given expression, it is returned. - - Parameters: - - - expr - expression that must match prior to the current parse - location - - retreat - (default= ``None``) - (int) maximum number of characters - to lookbehind prior to the current parse location - - If the lookbehind expression is a string, Literal, Keyword, or - a Word or CharsNotIn with a specified exact or maximum length, then - the retreat parameter is not required. Otherwise, retreat must be - specified to give a maximum number of characters to look back from - the current parse position for a lookbehind match. - - Example:: - - # VB-style variable names with type prefixes - int_var = PrecededBy("#") + pyparsing_common.identifier - str_var = PrecededBy("$") + pyparsing_common.identifier - - """ - def __init__(self, expr, retreat=None): - super(PrecededBy, self).__init__(expr) - self.expr = self.expr().leaveWhitespace() - self.mayReturnEmpty = True - self.mayIndexError = False - self.exact = False - if isinstance(expr, str): - retreat = len(expr) - self.exact = True - elif isinstance(expr, (Literal, Keyword)): - retreat = expr.matchLen - self.exact = True - elif isinstance(expr, (Word, CharsNotIn)) and expr.maxLen != _MAX_INT: - retreat = expr.maxLen - self.exact = True - elif isinstance(expr, _PositionToken): - retreat = 0 - self.exact = True - self.retreat = retreat - self.errmsg = "not preceded by " + str(expr) - self.skipWhitespace = False - - def parseImpl(self, instring, loc=0, doActions=True): - if self.exact: - if loc < self.retreat: - raise ParseException(instring, loc, self.errmsg) - start = loc - self.retreat - _, ret = self.expr._parse(instring, start) - else: - # retreat specified a maximum lookbehind window, iterate - test_expr = self.expr + StringEnd() - instring_slice = instring[:loc] - last_expr = ParseException(instring, loc, self.errmsg) - for offset in range(1, min(loc, self.retreat+1)): - try: - _, ret = test_expr._parse(instring_slice, loc-offset) - except ParseBaseException as pbe: - last_expr = pbe - else: - break - else: - raise last_expr - # return empty list of tokens, but preserve any defined results names - del ret[:] - return loc, ret - - -class NotAny(ParseElementEnhance): - """Lookahead to disallow matching with the given parse expression. - ``NotAny`` does *not* advance the parsing position within the - input string, it only verifies that the specified parse expression - does *not* match at the current position. Also, ``NotAny`` does - *not* skip over leading whitespace. ``NotAny`` always returns - a null token list. May be constructed using the '~' operator. - - Example:: - - AND, OR, NOT = map(CaselessKeyword, "AND OR NOT".split()) - - # take care not to mistake keywords for identifiers - ident = ~(AND | OR | NOT) + Word(alphas) - boolean_term = Optional(NOT) + ident - - # very crude boolean expression - to support parenthesis groups and - # operation hierarchy, use infixNotation - boolean_expr = boolean_term + ZeroOrMore((AND | OR) + boolean_term) - - # integers that are followed by "." are actually floats - integer = Word(nums) + ~Char(".") - """ - def __init__( self, expr ): - super(NotAny,self).__init__(expr) - #~ self.leaveWhitespace() - self.skipWhitespace = False # do NOT use self.leaveWhitespace(), don't want to propagate to exprs - self.mayReturnEmpty = True - self.errmsg = "Found unwanted token, "+_ustr(self.expr) - - def parseImpl( self, instring, loc, doActions=True ): - if self.expr.canParseNext(instring, loc): - raise ParseException(instring, loc, self.errmsg, self) - return loc, [] - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "~{" + _ustr(self.expr) + "}" - - return self.strRepr - -class _MultipleMatch(ParseElementEnhance): - def __init__( self, expr, stopOn=None): - super(_MultipleMatch, self).__init__(expr) - self.saveAsList = True - ender = stopOn - if isinstance(ender, basestring): - ender = ParserElement._literalStringClass(ender) - self.not_ender = ~ender if ender is not None else None - - def parseImpl( self, instring, loc, doActions=True ): - self_expr_parse = self.expr._parse - self_skip_ignorables = self._skipIgnorables - check_ender = self.not_ender is not None - if check_ender: - try_not_ender = self.not_ender.tryParse - - # must be at least one (but first see if we are the stopOn sentinel; - # if so, fail) - if check_ender: - try_not_ender(instring, loc) - loc, tokens = self_expr_parse( instring, loc, doActions, callPreParse=False ) - try: - hasIgnoreExprs = (not not self.ignoreExprs) - while 1: - if check_ender: - try_not_ender(instring, loc) - if hasIgnoreExprs: - preloc = self_skip_ignorables( instring, loc ) - else: - preloc = loc - loc, tmptokens = self_expr_parse( instring, preloc, doActions ) - if tmptokens or tmptokens.haskeys(): - tokens += tmptokens - except (ParseException,IndexError): - pass - - return loc, tokens - -class OneOrMore(_MultipleMatch): - """Repetition of one or more of the given expression. - - Parameters: - - expr - expression that must match one or more times - - stopOn - (default= ``None``) - expression for a terminating sentinel - (only required if the sentinel would ordinarily match the repetition - expression) - - Example:: - - data_word = Word(alphas) - label = data_word + FollowedBy(':') - attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) - - text = "shape: SQUARE posn: upper left color: BLACK" - OneOrMore(attr_expr).parseString(text).pprint() # Fail! read 'color' as data instead of next label -> [['shape', 'SQUARE color']] - - # use stopOn attribute for OneOrMore to avoid reading label string as part of the data - attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) - OneOrMore(attr_expr).parseString(text).pprint() # Better -> [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'BLACK']] - - # could also be written as - (attr_expr * (1,)).parseString(text).pprint() - """ - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "{" + _ustr(self.expr) + "}..." - - return self.strRepr - -class ZeroOrMore(_MultipleMatch): - """Optional repetition of zero or more of the given expression. - - Parameters: - - expr - expression that must match zero or more times - - stopOn - (default= ``None``) - expression for a terminating sentinel - (only required if the sentinel would ordinarily match the repetition - expression) - - Example: similar to :class:`OneOrMore` - """ - def __init__( self, expr, stopOn=None): - super(ZeroOrMore,self).__init__(expr, stopOn=stopOn) - self.mayReturnEmpty = True - - def parseImpl( self, instring, loc, doActions=True ): - try: - return super(ZeroOrMore, self).parseImpl(instring, loc, doActions) - except (ParseException,IndexError): - return loc, [] - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "[" + _ustr(self.expr) + "]..." - - return self.strRepr - -class _NullToken(object): - def __bool__(self): - return False - __nonzero__ = __bool__ - def __str__(self): - return "" - -_optionalNotMatched = _NullToken() -class Optional(ParseElementEnhance): - """Optional matching of the given expression. - - Parameters: - - expr - expression that must match zero or more times - - default (optional) - value to be returned if the optional expression is not found. - - Example:: - - # US postal code can be a 5-digit zip, plus optional 4-digit qualifier - zip = Combine(Word(nums, exact=5) + Optional('-' + Word(nums, exact=4))) - zip.runTests(''' - # traditional ZIP code - 12345 - - # ZIP+4 form - 12101-0001 - - # invalid ZIP - 98765- - ''') - - prints:: - - # traditional ZIP code - 12345 - ['12345'] - - # ZIP+4 form - 12101-0001 - ['12101-0001'] - - # invalid ZIP - 98765- - ^ - FAIL: Expected end of text (at char 5), (line:1, col:6) - """ - def __init__( self, expr, default=_optionalNotMatched ): - super(Optional,self).__init__( expr, savelist=False ) - self.saveAsList = self.expr.saveAsList - self.defaultValue = default - self.mayReturnEmpty = True - - def parseImpl( self, instring, loc, doActions=True ): - try: - loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False ) - except (ParseException,IndexError): - if self.defaultValue is not _optionalNotMatched: - if self.expr.resultsName: - tokens = ParseResults([ self.defaultValue ]) - tokens[self.expr.resultsName] = self.defaultValue - else: - tokens = [ self.defaultValue ] - else: - tokens = [] - return loc, tokens - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "[" + _ustr(self.expr) + "]" - - return self.strRepr - -class SkipTo(ParseElementEnhance): - """Token for skipping over all undefined text until the matched - expression is found. - - Parameters: - - expr - target expression marking the end of the data to be skipped - - include - (default= ``False``) if True, the target expression is also parsed - (the skipped text and target expression are returned as a 2-element list). - - ignore - (default= ``None``) used to define grammars (typically quoted strings and - comments) that might contain false matches to the target expression - - failOn - (default= ``None``) define expressions that are not allowed to be - included in the skipped test; if found before the target expression is found, - the SkipTo is not a match - - Example:: - - report = ''' - Outstanding Issues Report - 1 Jan 2000 - - # | Severity | Description | Days Open - -----+----------+-------------------------------------------+----------- - 101 | Critical | Intermittent system crash | 6 - 94 | Cosmetic | Spelling error on Login ('log|n') | 14 - 79 | Minor | System slow when running too many reports | 47 - ''' - integer = Word(nums) - SEP = Suppress('|') - # use SkipTo to simply match everything up until the next SEP - # - ignore quoted strings, so that a '|' character inside a quoted string does not match - # - parse action will call token.strip() for each matched token, i.e., the description body - string_data = SkipTo(SEP, ignore=quotedString) - string_data.setParseAction(tokenMap(str.strip)) - ticket_expr = (integer("issue_num") + SEP - + string_data("sev") + SEP - + string_data("desc") + SEP - + integer("days_open")) - - for tkt in ticket_expr.searchString(report): - print tkt.dump() - - prints:: - - ['101', 'Critical', 'Intermittent system crash', '6'] - - days_open: 6 - - desc: Intermittent system crash - - issue_num: 101 - - sev: Critical - ['94', 'Cosmetic', "Spelling error on Login ('log|n')", '14'] - - days_open: 14 - - desc: Spelling error on Login ('log|n') - - issue_num: 94 - - sev: Cosmetic - ['79', 'Minor', 'System slow when running too many reports', '47'] - - days_open: 47 - - desc: System slow when running too many reports - - issue_num: 79 - - sev: Minor - """ - def __init__( self, other, include=False, ignore=None, failOn=None ): - super( SkipTo, self ).__init__( other ) - self.ignoreExpr = ignore - self.mayReturnEmpty = True - self.mayIndexError = False - self.includeMatch = include - self.saveAsList = False - if isinstance(failOn, basestring): - self.failOn = ParserElement._literalStringClass(failOn) - else: - self.failOn = failOn - self.errmsg = "No match found for "+_ustr(self.expr) - - def parseImpl( self, instring, loc, doActions=True ): - startloc = loc - instrlen = len(instring) - expr = self.expr - expr_parse = self.expr._parse - self_failOn_canParseNext = self.failOn.canParseNext if self.failOn is not None else None - self_ignoreExpr_tryParse = self.ignoreExpr.tryParse if self.ignoreExpr is not None else None - - tmploc = loc - while tmploc <= instrlen: - if self_failOn_canParseNext is not None: - # break if failOn expression matches - if self_failOn_canParseNext(instring, tmploc): - break - - if self_ignoreExpr_tryParse is not None: - # advance past ignore expressions - while 1: - try: - tmploc = self_ignoreExpr_tryParse(instring, tmploc) - except ParseBaseException: - break - - try: - expr_parse(instring, tmploc, doActions=False, callPreParse=False) - except (ParseException, IndexError): - # no match, advance loc in string - tmploc += 1 - else: - # matched skipto expr, done - break - - else: - # ran off the end of the input string without matching skipto expr, fail - raise ParseException(instring, loc, self.errmsg, self) - - # build up return values - loc = tmploc - skiptext = instring[startloc:loc] - skipresult = ParseResults(skiptext) - - if self.includeMatch: - loc, mat = expr_parse(instring,loc,doActions,callPreParse=False) - skipresult += mat - - return loc, skipresult - -class Forward(ParseElementEnhance): - """Forward declaration of an expression to be defined later - - used for recursive grammars, such as algebraic infix notation. - When the expression is known, it is assigned to the ``Forward`` - variable using the '<<' operator. - - Note: take care when assigning to ``Forward`` not to overlook - precedence of operators. - - Specifically, '|' has a lower precedence than '<<', so that:: - - fwdExpr << a | b | c - - will actually be evaluated as:: - - (fwdExpr << a) | b | c - - thereby leaving b and c out as parseable alternatives. It is recommended that you - explicitly group the values inserted into the ``Forward``:: - - fwdExpr << (a | b | c) - - Converting to use the '<<=' operator instead will avoid this problem. - - See :class:`ParseResults.pprint` for an example of a recursive - parser created using ``Forward``. - """ - def __init__( self, other=None ): - super(Forward,self).__init__( other, savelist=False ) - - def __lshift__( self, other ): - if isinstance( other, basestring ): - other = ParserElement._literalStringClass(other) - self.expr = other - self.strRepr = None - self.mayIndexError = self.expr.mayIndexError - self.mayReturnEmpty = self.expr.mayReturnEmpty - self.setWhitespaceChars( self.expr.whiteChars ) - self.skipWhitespace = self.expr.skipWhitespace - self.saveAsList = self.expr.saveAsList - self.ignoreExprs.extend(self.expr.ignoreExprs) - return self - - def __ilshift__(self, other): - return self << other - - def leaveWhitespace( self ): - self.skipWhitespace = False - return self - - def streamline( self ): - if not self.streamlined: - self.streamlined = True - if self.expr is not None: - self.expr.streamline() - return self - - def validate( self, validateTrace=[] ): - if self not in validateTrace: - tmp = validateTrace[:]+[self] - if self.expr is not None: - self.expr.validate(tmp) - self.checkRecursion([]) - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - # Avoid infinite recursion by setting a temporary name - self.name = self.__class__.__name__ + ": ..." - - # Use the string representation of main expression. - try: - if self.expr is not None: - retString = _ustr(self.expr) - else: - retString = "None" - finally: - del self.name - return self.__class__.__name__ + ": " + retString - - def copy(self): - if self.expr is not None: - return super(Forward,self).copy() - else: - ret = Forward() - ret <<= self - return ret - -class TokenConverter(ParseElementEnhance): - """ - Abstract subclass of :class:`ParseExpression`, for converting parsed results. - """ - def __init__( self, expr, savelist=False ): - super(TokenConverter,self).__init__( expr )#, savelist ) - self.saveAsList = False - -class Combine(TokenConverter): - """Converter to concatenate all matching tokens to a single string. - By default, the matching patterns must also be contiguous in the - input string; this can be disabled by specifying - ``'adjacent=False'`` in the constructor. - - Example:: - - real = Word(nums) + '.' + Word(nums) - print(real.parseString('3.1416')) # -> ['3', '.', '1416'] - # will also erroneously match the following - print(real.parseString('3. 1416')) # -> ['3', '.', '1416'] - - real = Combine(Word(nums) + '.' + Word(nums)) - print(real.parseString('3.1416')) # -> ['3.1416'] - # no match when there are internal spaces - print(real.parseString('3. 1416')) # -> Exception: Expected W:(0123...) - """ - def __init__( self, expr, joinString="", adjacent=True ): - super(Combine,self).__init__( expr ) - # suppress whitespace-stripping in contained parse expressions, but re-enable it on the Combine itself - if adjacent: - self.leaveWhitespace() - self.adjacent = adjacent - self.skipWhitespace = True - self.joinString = joinString - self.callPreparse = True - - def ignore( self, other ): - if self.adjacent: - ParserElement.ignore(self, other) - else: - super( Combine, self).ignore( other ) - return self - - def postParse( self, instring, loc, tokenlist ): - retToks = tokenlist.copy() - del retToks[:] - retToks += ParseResults([ "".join(tokenlist._asStringList(self.joinString)) ], modal=self.modalResults) - - if self.resultsName and retToks.haskeys(): - return [ retToks ] - else: - return retToks - -class Group(TokenConverter): - """Converter to return the matched tokens as a list - useful for - returning tokens of :class:`ZeroOrMore` and :class:`OneOrMore` expressions. - - Example:: - - ident = Word(alphas) - num = Word(nums) - term = ident | num - func = ident + Optional(delimitedList(term)) - print(func.parseString("fn a,b,100")) # -> ['fn', 'a', 'b', '100'] - - func = ident + Group(Optional(delimitedList(term))) - print(func.parseString("fn a,b,100")) # -> ['fn', ['a', 'b', '100']] - """ - def __init__( self, expr ): - super(Group,self).__init__( expr ) - self.saveAsList = True - - def postParse( self, instring, loc, tokenlist ): - return [ tokenlist ] - -class Dict(TokenConverter): - """Converter to return a repetitive expression as a list, but also - as a dictionary. Each element can also be referenced using the first - token in the expression as its key. Useful for tabular report - scraping when the first column can be used as a item key. - - Example:: - - data_word = Word(alphas) - label = data_word + FollowedBy(':') - attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) - - text = "shape: SQUARE posn: upper left color: light blue texture: burlap" - attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) - - # print attributes as plain groups - print(OneOrMore(attr_expr).parseString(text).dump()) - - # instead of OneOrMore(expr), parse using Dict(OneOrMore(Group(expr))) - Dict will auto-assign names - result = Dict(OneOrMore(Group(attr_expr))).parseString(text) - print(result.dump()) - - # access named fields as dict entries, or output as dict - print(result['shape']) - print(result.asDict()) - - prints:: - - ['shape', 'SQUARE', 'posn', 'upper left', 'color', 'light blue', 'texture', 'burlap'] - [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] - - color: light blue - - posn: upper left - - shape: SQUARE - - texture: burlap - SQUARE - {'color': 'light blue', 'posn': 'upper left', 'texture': 'burlap', 'shape': 'SQUARE'} - - See more examples at :class:`ParseResults` of accessing fields by results name. - """ - def __init__( self, expr ): - super(Dict,self).__init__( expr ) - self.saveAsList = True - - def postParse( self, instring, loc, tokenlist ): - for i,tok in enumerate(tokenlist): - if len(tok) == 0: - continue - ikey = tok[0] - if isinstance(ikey,int): - ikey = _ustr(tok[0]).strip() - if len(tok)==1: - tokenlist[ikey] = _ParseResultsWithOffset("",i) - elif len(tok)==2 and not isinstance(tok[1],ParseResults): - tokenlist[ikey] = _ParseResultsWithOffset(tok[1],i) - else: - dictvalue = tok.copy() #ParseResults(i) - del dictvalue[0] - if len(dictvalue)!= 1 or (isinstance(dictvalue,ParseResults) and dictvalue.haskeys()): - tokenlist[ikey] = _ParseResultsWithOffset(dictvalue,i) - else: - tokenlist[ikey] = _ParseResultsWithOffset(dictvalue[0],i) - - if self.resultsName: - return [ tokenlist ] - else: - return tokenlist - - -class Suppress(TokenConverter): - """Converter for ignoring the results of a parsed expression. - - Example:: - - source = "a, b, c,d" - wd = Word(alphas) - wd_list1 = wd + ZeroOrMore(',' + wd) - print(wd_list1.parseString(source)) - - # often, delimiters that are useful during parsing are just in the - # way afterward - use Suppress to keep them out of the parsed output - wd_list2 = wd + ZeroOrMore(Suppress(',') + wd) - print(wd_list2.parseString(source)) - - prints:: - - ['a', ',', 'b', ',', 'c', ',', 'd'] - ['a', 'b', 'c', 'd'] - - (See also :class:`delimitedList`.) - """ - def postParse( self, instring, loc, tokenlist ): - return [] - - def suppress( self ): - return self - - -class OnlyOnce(object): - """Wrapper for parse actions, to ensure they are only called once. - """ - def __init__(self, methodCall): - self.callable = _trim_arity(methodCall) - self.called = False - def __call__(self,s,l,t): - if not self.called: - results = self.callable(s,l,t) - self.called = True - return results - raise ParseException(s,l,"") - def reset(self): - self.called = False - -def traceParseAction(f): - """Decorator for debugging parse actions. - - When the parse action is called, this decorator will print - ``">> entering method-name(line:<current_source_line>, <parse_location>, <matched_tokens>)"``. - When the parse action completes, the decorator will print - ``"<<"`` followed by the returned value, or any exception that the parse action raised. - - Example:: - - wd = Word(alphas) - - @traceParseAction - def remove_duplicate_chars(tokens): - return ''.join(sorted(set(''.join(tokens)))) - - wds = OneOrMore(wd).setParseAction(remove_duplicate_chars) - print(wds.parseString("slkdjs sld sldd sdlf sdljf")) - - prints:: - - >>entering remove_duplicate_chars(line: 'slkdjs sld sldd sdlf sdljf', 0, (['slkdjs', 'sld', 'sldd', 'sdlf', 'sdljf'], {})) - <<leaving remove_duplicate_chars (ret: 'dfjkls') - ['dfjkls'] - """ - f = _trim_arity(f) - def z(*paArgs): - thisFunc = f.__name__ - s,l,t = paArgs[-3:] - if len(paArgs)>3: - thisFunc = paArgs[0].__class__.__name__ + '.' + thisFunc - sys.stderr.write( ">>entering %s(line: '%s', %d, %r)\n" % (thisFunc,line(l,s),l,t) ) - try: - ret = f(*paArgs) - except Exception as exc: - sys.stderr.write( "<<leaving %s (exception: %s)\n" % (thisFunc,exc) ) - raise - sys.stderr.write( "<<leaving %s (ret: %r)\n" % (thisFunc,ret) ) - return ret - try: - z.__name__ = f.__name__ - except AttributeError: - pass - return z - -# -# global helpers -# -def delimitedList( expr, delim=",", combine=False ): - """Helper to define a delimited list of expressions - the delimiter - defaults to ','. By default, the list elements and delimiters can - have intervening whitespace, and comments, but this can be - overridden by passing ``combine=True`` in the constructor. If - ``combine`` is set to ``True``, the matching tokens are - returned as a single token string, with the delimiters included; - otherwise, the matching tokens are returned as a list of tokens, - with the delimiters suppressed. - - Example:: - - delimitedList(Word(alphas)).parseString("aa,bb,cc") # -> ['aa', 'bb', 'cc'] - delimitedList(Word(hexnums), delim=':', combine=True).parseString("AA:BB:CC:DD:EE") # -> ['AA:BB:CC:DD:EE'] - """ - dlName = _ustr(expr)+" ["+_ustr(delim)+" "+_ustr(expr)+"]..." - if combine: - return Combine( expr + ZeroOrMore( delim + expr ) ).setName(dlName) - else: - return ( expr + ZeroOrMore( Suppress( delim ) + expr ) ).setName(dlName) - -def countedArray( expr, intExpr=None ): - """Helper to define a counted list of expressions. - - This helper defines a pattern of the form:: - - integer expr expr expr... - - where the leading integer tells how many expr expressions follow. - The matched tokens returns the array of expr tokens as a list - the - leading count token is suppressed. - - If ``intExpr`` is specified, it should be a pyparsing expression - that produces an integer value. - - Example:: - - countedArray(Word(alphas)).parseString('2 ab cd ef') # -> ['ab', 'cd'] - - # in this parser, the leading integer value is given in binary, - # '10' indicating that 2 values are in the array - binaryConstant = Word('01').setParseAction(lambda t: int(t[0], 2)) - countedArray(Word(alphas), intExpr=binaryConstant).parseString('10 ab cd ef') # -> ['ab', 'cd'] - """ - arrayExpr = Forward() - def countFieldParseAction(s,l,t): - n = t[0] - arrayExpr << (n and Group(And([expr]*n)) or Group(empty)) - return [] - if intExpr is None: - intExpr = Word(nums).setParseAction(lambda t:int(t[0])) - else: - intExpr = intExpr.copy() - intExpr.setName("arrayLen") - intExpr.addParseAction(countFieldParseAction, callDuringTry=True) - return ( intExpr + arrayExpr ).setName('(len) ' + _ustr(expr) + '...') - -def _flatten(L): - ret = [] - for i in L: - if isinstance(i,list): - ret.extend(_flatten(i)) - else: - ret.append(i) - return ret - -def matchPreviousLiteral(expr): - """Helper to define an expression that is indirectly defined from - the tokens matched in a previous expression, that is, it looks for - a 'repeat' of a previous expression. For example:: - - first = Word(nums) - second = matchPreviousLiteral(first) - matchExpr = first + ":" + second - - will match ``"1:1"``, but not ``"1:2"``. Because this - matches a previous literal, will also match the leading - ``"1:1"`` in ``"1:10"``. If this is not desired, use - :class:`matchPreviousExpr`. Do *not* use with packrat parsing - enabled. - """ - rep = Forward() - def copyTokenToRepeater(s,l,t): - if t: - if len(t) == 1: - rep << t[0] - else: - # flatten t tokens - tflat = _flatten(t.asList()) - rep << And(Literal(tt) for tt in tflat) - else: - rep << Empty() - expr.addParseAction(copyTokenToRepeater, callDuringTry=True) - rep.setName('(prev) ' + _ustr(expr)) - return rep - -def matchPreviousExpr(expr): - """Helper to define an expression that is indirectly defined from - the tokens matched in a previous expression, that is, it looks for - a 'repeat' of a previous expression. For example:: - - first = Word(nums) - second = matchPreviousExpr(first) - matchExpr = first + ":" + second - - will match ``"1:1"``, but not ``"1:2"``. Because this - matches by expressions, will *not* match the leading ``"1:1"`` - in ``"1:10"``; the expressions are evaluated first, and then - compared, so ``"1"`` is compared with ``"10"``. Do *not* use - with packrat parsing enabled. - """ - rep = Forward() - e2 = expr.copy() - rep <<= e2 - def copyTokenToRepeater(s,l,t): - matchTokens = _flatten(t.asList()) - def mustMatchTheseTokens(s,l,t): - theseTokens = _flatten(t.asList()) - if theseTokens != matchTokens: - raise ParseException("",0,"") - rep.setParseAction( mustMatchTheseTokens, callDuringTry=True ) - expr.addParseAction(copyTokenToRepeater, callDuringTry=True) - rep.setName('(prev) ' + _ustr(expr)) - return rep - -def _escapeRegexRangeChars(s): - #~ escape these chars: ^-] - for c in r"\^-]": - s = s.replace(c,_bslash+c) - s = s.replace("\n",r"\n") - s = s.replace("\t",r"\t") - return _ustr(s) - -def oneOf( strs, caseless=False, useRegex=True ): - """Helper to quickly define a set of alternative Literals, and makes - sure to do longest-first testing when there is a conflict, - regardless of the input order, but returns - a :class:`MatchFirst` for best performance. - - Parameters: - - - strs - a string of space-delimited literals, or a collection of - string literals - - caseless - (default= ``False``) - treat all literals as - caseless - - useRegex - (default= ``True``) - as an optimization, will - generate a Regex object; otherwise, will generate - a :class:`MatchFirst` object (if ``caseless=True``, or if - creating a :class:`Regex` raises an exception) - - Example:: - - comp_oper = oneOf("< = > <= >= !=") - var = Word(alphas) - number = Word(nums) - term = var | number - comparison_expr = term + comp_oper + term - print(comparison_expr.searchString("B = 12 AA=23 B<=AA AA>12")) - - prints:: - - [['B', '=', '12'], ['AA', '=', '23'], ['B', '<=', 'AA'], ['AA', '>', '12']] - """ - if caseless: - isequal = ( lambda a,b: a.upper() == b.upper() ) - masks = ( lambda a,b: b.upper().startswith(a.upper()) ) - parseElementClass = CaselessLiteral - else: - isequal = ( lambda a,b: a == b ) - masks = ( lambda a,b: b.startswith(a) ) - parseElementClass = Literal - - symbols = [] - if isinstance(strs,basestring): - symbols = strs.split() - elif isinstance(strs, Iterable): - symbols = list(strs) - else: - warnings.warn("Invalid argument to oneOf, expected string or iterable", - SyntaxWarning, stacklevel=2) - if not symbols: - return NoMatch() - - i = 0 - while i < len(symbols)-1: - cur = symbols[i] - for j,other in enumerate(symbols[i+1:]): - if ( isequal(other, cur) ): - del symbols[i+j+1] - break - elif ( masks(cur, other) ): - del symbols[i+j+1] - symbols.insert(i,other) - cur = other - break - else: - i += 1 - - if not caseless and useRegex: - #~ print (strs,"->", "|".join( [ _escapeRegexChars(sym) for sym in symbols] )) - try: - if len(symbols)==len("".join(symbols)): - return Regex( "[%s]" % "".join(_escapeRegexRangeChars(sym) for sym in symbols) ).setName(' | '.join(symbols)) - else: - return Regex( "|".join(re.escape(sym) for sym in symbols) ).setName(' | '.join(symbols)) - except Exception: - warnings.warn("Exception creating Regex for oneOf, building MatchFirst", - SyntaxWarning, stacklevel=2) - - - # last resort, just use MatchFirst - return MatchFirst(parseElementClass(sym) for sym in symbols).setName(' | '.join(symbols)) - -def dictOf( key, value ): - """Helper to easily and clearly define a dictionary by specifying - the respective patterns for the key and value. Takes care of - defining the :class:`Dict`, :class:`ZeroOrMore`, and - :class:`Group` tokens in the proper order. The key pattern - can include delimiting markers or punctuation, as long as they are - suppressed, thereby leaving the significant key text. The value - pattern can include named results, so that the :class:`Dict` results - can include named token fields. - - Example:: - - text = "shape: SQUARE posn: upper left color: light blue texture: burlap" - attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) - print(OneOrMore(attr_expr).parseString(text).dump()) - - attr_label = label - attr_value = Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join) - - # similar to Dict, but simpler call format - result = dictOf(attr_label, attr_value).parseString(text) - print(result.dump()) - print(result['shape']) - print(result.shape) # object attribute access works too - print(result.asDict()) - - prints:: - - [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] - - color: light blue - - posn: upper left - - shape: SQUARE - - texture: burlap - SQUARE - SQUARE - {'color': 'light blue', 'shape': 'SQUARE', 'posn': 'upper left', 'texture': 'burlap'} - """ - return Dict(OneOrMore(Group(key + value))) - -def originalTextFor(expr, asString=True): - """Helper to return the original, untokenized text for a given - expression. Useful to restore the parsed fields of an HTML start - tag into the raw tag text itself, or to revert separate tokens with - intervening whitespace back to the original matching input text. By - default, returns astring containing the original parsed text. - - If the optional ``asString`` argument is passed as - ``False``, then the return value is - a :class:`ParseResults` containing any results names that - were originally matched, and a single token containing the original - matched text from the input string. So if the expression passed to - :class:`originalTextFor` contains expressions with defined - results names, you must set ``asString`` to ``False`` if you - want to preserve those results name values. - - Example:: - - src = "this is test <b> bold <i>text</i> </b> normal text " - for tag in ("b","i"): - opener,closer = makeHTMLTags(tag) - patt = originalTextFor(opener + SkipTo(closer) + closer) - print(patt.searchString(src)[0]) - - prints:: - - ['<b> bold <i>text</i> </b>'] - ['<i>text</i>'] - """ - locMarker = Empty().setParseAction(lambda s,loc,t: loc) - endlocMarker = locMarker.copy() - endlocMarker.callPreparse = False - matchExpr = locMarker("_original_start") + expr + endlocMarker("_original_end") - if asString: - extractText = lambda s,l,t: s[t._original_start:t._original_end] - else: - def extractText(s,l,t): - t[:] = [s[t.pop('_original_start'):t.pop('_original_end')]] - matchExpr.setParseAction(extractText) - matchExpr.ignoreExprs = expr.ignoreExprs - return matchExpr - -def ungroup(expr): - """Helper to undo pyparsing's default grouping of And expressions, - even if all but one are non-empty. - """ - return TokenConverter(expr).addParseAction(lambda t:t[0]) - -def locatedExpr(expr): - """Helper to decorate a returned token with its starting and ending - locations in the input string. - - This helper adds the following results names: - - - locn_start = location where matched expression begins - - locn_end = location where matched expression ends - - value = the actual parsed results - - Be careful if the input text contains ``<TAB>`` characters, you - may want to call :class:`ParserElement.parseWithTabs` - - Example:: - - wd = Word(alphas) - for match in locatedExpr(wd).searchString("ljsdf123lksdjjf123lkkjj1222"): - print(match) - - prints:: - - [[0, 'ljsdf', 5]] - [[8, 'lksdjjf', 15]] - [[18, 'lkkjj', 23]] - """ - locator = Empty().setParseAction(lambda s,l,t: l) - return Group(locator("locn_start") + expr("value") + locator.copy().leaveWhitespace()("locn_end")) - - -# convenience constants for positional expressions -empty = Empty().setName("empty") -lineStart = LineStart().setName("lineStart") -lineEnd = LineEnd().setName("lineEnd") -stringStart = StringStart().setName("stringStart") -stringEnd = StringEnd().setName("stringEnd") - -_escapedPunc = Word( _bslash, r"\[]-*.$+^?()~ ", exact=2 ).setParseAction(lambda s,l,t:t[0][1]) -_escapedHexChar = Regex(r"\\0?[xX][0-9a-fA-F]+").setParseAction(lambda s,l,t:unichr(int(t[0].lstrip(r'\0x'),16))) -_escapedOctChar = Regex(r"\\0[0-7]+").setParseAction(lambda s,l,t:unichr(int(t[0][1:],8))) -_singleChar = _escapedPunc | _escapedHexChar | _escapedOctChar | CharsNotIn(r'\]', exact=1) -_charRange = Group(_singleChar + Suppress("-") + _singleChar) -_reBracketExpr = Literal("[") + Optional("^").setResultsName("negate") + Group( OneOrMore( _charRange | _singleChar ) ).setResultsName("body") + "]" - -def srange(s): - r"""Helper to easily define string ranges for use in Word - construction. Borrows syntax from regexp '[]' string range - definitions:: - - srange("[0-9]") -> "0123456789" - srange("[a-z]") -> "abcdefghijklmnopqrstuvwxyz" - srange("[a-z$_]") -> "abcdefghijklmnopqrstuvwxyz$_" - - The input string must be enclosed in []'s, and the returned string - is the expanded character set joined into a single string. The - values enclosed in the []'s may be: - - - a single character - - an escaped character with a leading backslash (such as ``\-`` - or ``\]``) - - an escaped hex character with a leading ``'\x'`` - (``\x21``, which is a ``'!'`` character) (``\0x##`` - is also supported for backwards compatibility) - - an escaped octal character with a leading ``'\0'`` - (``\041``, which is a ``'!'`` character) - - a range of any of the above, separated by a dash (``'a-z'``, - etc.) - - any combination of the above (``'aeiouy'``, - ``'a-zA-Z0-9_$'``, etc.) - """ - _expanded = lambda p: p if not isinstance(p,ParseResults) else ''.join(unichr(c) for c in range(ord(p[0]),ord(p[1])+1)) - try: - return "".join(_expanded(part) for part in _reBracketExpr.parseString(s).body) - except Exception: - return "" - -def matchOnlyAtCol(n): - """Helper method for defining parse actions that require matching at - a specific column in the input text. - """ - def verifyCol(strg,locn,toks): - if col(locn,strg) != n: - raise ParseException(strg,locn,"matched token not at column %d" % n) - return verifyCol - -def replaceWith(replStr): - """Helper method for common parse actions that simply return - a literal value. Especially useful when used with - :class:`transformString<ParserElement.transformString>` (). - - Example:: - - num = Word(nums).setParseAction(lambda toks: int(toks[0])) - na = oneOf("N/A NA").setParseAction(replaceWith(math.nan)) - term = na | num - - OneOrMore(term).parseString("324 234 N/A 234") # -> [324, 234, nan, 234] - """ - return lambda s,l,t: [replStr] - -def removeQuotes(s,l,t): - """Helper parse action for removing quotation marks from parsed - quoted strings. - - Example:: - - # by default, quotation marks are included in parsed results - quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["'Now is the Winter of our Discontent'"] - - # use removeQuotes to strip quotation marks from parsed results - quotedString.setParseAction(removeQuotes) - quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["Now is the Winter of our Discontent"] - """ - return t[0][1:-1] - -def tokenMap(func, *args): - """Helper to define a parse action by mapping a function to all - elements of a ParseResults list. If any additional args are passed, - they are forwarded to the given function as additional arguments - after the token, as in - ``hex_integer = Word(hexnums).setParseAction(tokenMap(int, 16))``, - which will convert the parsed data to an integer using base 16. - - Example (compare the last to example in :class:`ParserElement.transformString`:: - - hex_ints = OneOrMore(Word(hexnums)).setParseAction(tokenMap(int, 16)) - hex_ints.runTests(''' - 00 11 22 aa FF 0a 0d 1a - ''') - - upperword = Word(alphas).setParseAction(tokenMap(str.upper)) - OneOrMore(upperword).runTests(''' - my kingdom for a horse - ''') - - wd = Word(alphas).setParseAction(tokenMap(str.title)) - OneOrMore(wd).setParseAction(' '.join).runTests(''' - now is the winter of our discontent made glorious summer by this sun of york - ''') - - prints:: - - 00 11 22 aa FF 0a 0d 1a - [0, 17, 34, 170, 255, 10, 13, 26] - - my kingdom for a horse - ['MY', 'KINGDOM', 'FOR', 'A', 'HORSE'] - - now is the winter of our discontent made glorious summer by this sun of york - ['Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York'] - """ - def pa(s,l,t): - return [func(tokn, *args) for tokn in t] - - try: - func_name = getattr(func, '__name__', - getattr(func, '__class__').__name__) - except Exception: - func_name = str(func) - pa.__name__ = func_name - - return pa - -upcaseTokens = tokenMap(lambda t: _ustr(t).upper()) -"""(Deprecated) Helper parse action to convert tokens to upper case. -Deprecated in favor of :class:`pyparsing_common.upcaseTokens`""" - -downcaseTokens = tokenMap(lambda t: _ustr(t).lower()) -"""(Deprecated) Helper parse action to convert tokens to lower case. -Deprecated in favor of :class:`pyparsing_common.downcaseTokens`""" - -def _makeTags(tagStr, xml, - suppress_LT=Suppress("<"), - suppress_GT=Suppress(">")): - """Internal helper to construct opening and closing tag expressions, given a tag name""" - if isinstance(tagStr,basestring): - resname = tagStr - tagStr = Keyword(tagStr, caseless=not xml) - else: - resname = tagStr.name - - tagAttrName = Word(alphas,alphanums+"_-:") - if (xml): - tagAttrValue = dblQuotedString.copy().setParseAction( removeQuotes ) - openTag = (suppress_LT - + tagStr("tag") - + Dict(ZeroOrMore(Group(tagAttrName + Suppress("=") + tagAttrValue ))) - + Optional("/", default=[False])("empty").setParseAction(lambda s,l,t:t[0]=='/') - + suppress_GT) - else: - tagAttrValue = quotedString.copy().setParseAction( removeQuotes ) | Word(printables, excludeChars=">") - openTag = (suppress_LT - + tagStr("tag") - + Dict(ZeroOrMore(Group(tagAttrName.setParseAction(downcaseTokens) - + Optional(Suppress("=") + tagAttrValue)))) - + Optional("/",default=[False])("empty").setParseAction(lambda s,l,t:t[0]=='/') - + suppress_GT) - closeTag = Combine(_L("</") + tagStr + ">", adjacent=False) - - openTag.setName("<%s>" % resname) - # add start<tagname> results name in parse action now that ungrouped names are not reported at two levels - openTag.addParseAction(lambda t: t.__setitem__("start"+"".join(resname.replace(":"," ").title().split()), t.copy())) - closeTag = closeTag("end"+"".join(resname.replace(":"," ").title().split())).setName("</%s>" % resname) - openTag.tag = resname - closeTag.tag = resname - openTag.tag_body = SkipTo(closeTag()) - return openTag, closeTag - -def makeHTMLTags(tagStr): - """Helper to construct opening and closing tag expressions for HTML, - given a tag name. Matches tags in either upper or lower case, - attributes with namespaces and with quoted or unquoted values. - - Example:: - - text = '<td>More info at the <a href="https://github.com/pyparsing/pyparsing/wiki">pyparsing</a> wiki page</td>' - # makeHTMLTags returns pyparsing expressions for the opening and - # closing tags as a 2-tuple - a,a_end = makeHTMLTags("A") - link_expr = a + SkipTo(a_end)("link_text") + a_end - - for link in link_expr.searchString(text): - # attributes in the <A> tag (like "href" shown here) are - # also accessible as named results - print(link.link_text, '->', link.href) - - prints:: - - pyparsing -> https://github.com/pyparsing/pyparsing/wiki - """ - return _makeTags( tagStr, False ) - -def makeXMLTags(tagStr): - """Helper to construct opening and closing tag expressions for XML, - given a tag name. Matches tags only in the given upper/lower case. - - Example: similar to :class:`makeHTMLTags` - """ - return _makeTags( tagStr, True ) - -def withAttribute(*args,**attrDict): - """Helper to create a validating parse action to be used with start - tags created with :class:`makeXMLTags` or - :class:`makeHTMLTags`. Use ``withAttribute`` to qualify - a starting tag with a required attribute value, to avoid false - matches on common tags such as ``<TD>`` or ``<DIV>``. - - Call ``withAttribute`` with a series of attribute names and - values. Specify the list of filter attributes names and values as: - - - keyword arguments, as in ``(align="right")``, or - - as an explicit dict with ``**`` operator, when an attribute - name is also a Python reserved word, as in ``**{"class":"Customer", "align":"right"}`` - - a list of name-value tuples, as in ``(("ns1:class", "Customer"), ("ns2:align","right"))`` - - For attribute names with a namespace prefix, you must use the second - form. Attribute names are matched insensitive to upper/lower case. - - If just testing for ``class`` (with or without a namespace), use - :class:`withClass`. - - To verify that the attribute exists, but without specifying a value, - pass ``withAttribute.ANY_VALUE`` as the value. - - Example:: - - html = ''' - <div> - Some text - <div type="grid">1 4 0 1 0</div> - <div type="graph">1,3 2,3 1,1</div> - <div>this has no type</div> - </div> - - ''' - div,div_end = makeHTMLTags("div") - - # only match div tag having a type attribute with value "grid" - div_grid = div().setParseAction(withAttribute(type="grid")) - grid_expr = div_grid + SkipTo(div | div_end)("body") - for grid_header in grid_expr.searchString(html): - print(grid_header.body) - - # construct a match with any div tag having a type attribute, regardless of the value - div_any_type = div().setParseAction(withAttribute(type=withAttribute.ANY_VALUE)) - div_expr = div_any_type + SkipTo(div | div_end)("body") - for div_header in div_expr.searchString(html): - print(div_header.body) - - prints:: - - 1 4 0 1 0 - - 1 4 0 1 0 - 1,3 2,3 1,1 - """ - if args: - attrs = args[:] - else: - attrs = attrDict.items() - attrs = [(k,v) for k,v in attrs] - def pa(s,l,tokens): - for attrName,attrValue in attrs: - if attrName not in tokens: - raise ParseException(s,l,"no matching attribute " + attrName) - if attrValue != withAttribute.ANY_VALUE and tokens[attrName] != attrValue: - raise ParseException(s,l,"attribute '%s' has value '%s', must be '%s'" % - (attrName, tokens[attrName], attrValue)) - return pa -withAttribute.ANY_VALUE = object() - -def withClass(classname, namespace=''): - """Simplified version of :class:`withAttribute` when - matching on a div class - made difficult because ``class`` is - a reserved word in Python. - - Example:: - - html = ''' - <div> - Some text - <div class="grid">1 4 0 1 0</div> - <div class="graph">1,3 2,3 1,1</div> - <div>this <div> has no class</div> - </div> - - ''' - div,div_end = makeHTMLTags("div") - div_grid = div().setParseAction(withClass("grid")) - - grid_expr = div_grid + SkipTo(div | div_end)("body") - for grid_header in grid_expr.searchString(html): - print(grid_header.body) - - div_any_type = div().setParseAction(withClass(withAttribute.ANY_VALUE)) - div_expr = div_any_type + SkipTo(div | div_end)("body") - for div_header in div_expr.searchString(html): - print(div_header.body) - - prints:: - - 1 4 0 1 0 - - 1 4 0 1 0 - 1,3 2,3 1,1 - """ - classattr = "%s:class" % namespace if namespace else "class" - return withAttribute(**{classattr : classname}) - -opAssoc = SimpleNamespace() -opAssoc.LEFT = object() -opAssoc.RIGHT = object() - -def infixNotation( baseExpr, opList, lpar=Suppress('('), rpar=Suppress(')') ): - """Helper method for constructing grammars of expressions made up of - operators working in a precedence hierarchy. Operators may be unary - or binary, left- or right-associative. Parse actions can also be - attached to operator expressions. The generated parser will also - recognize the use of parentheses to override operator precedences - (see example below). - - Note: if you define a deep operator list, you may see performance - issues when using infixNotation. See - :class:`ParserElement.enablePackrat` for a mechanism to potentially - improve your parser performance. - - Parameters: - - baseExpr - expression representing the most basic element for the - nested - - opList - list of tuples, one for each operator precedence level - in the expression grammar; each tuple is of the form ``(opExpr, - numTerms, rightLeftAssoc, parseAction)``, where: - - - opExpr is the pyparsing expression for the operator; may also - be a string, which will be converted to a Literal; if numTerms - is 3, opExpr is a tuple of two expressions, for the two - operators separating the 3 terms - - numTerms is the number of terms for this operator (must be 1, - 2, or 3) - - rightLeftAssoc is the indicator whether the operator is right - or left associative, using the pyparsing-defined constants - ``opAssoc.RIGHT`` and ``opAssoc.LEFT``. - - parseAction is the parse action to be associated with - expressions matching this operator expression (the parse action - tuple member may be omitted); if the parse action is passed - a tuple or list of functions, this is equivalent to calling - ``setParseAction(*fn)`` - (:class:`ParserElement.setParseAction`) - - lpar - expression for matching left-parentheses - (default= ``Suppress('(')``) - - rpar - expression for matching right-parentheses - (default= ``Suppress(')')``) - - Example:: - - # simple example of four-function arithmetic with ints and - # variable names - integer = pyparsing_common.signed_integer - varname = pyparsing_common.identifier - - arith_expr = infixNotation(integer | varname, - [ - ('-', 1, opAssoc.RIGHT), - (oneOf('* /'), 2, opAssoc.LEFT), - (oneOf('+ -'), 2, opAssoc.LEFT), - ]) - - arith_expr.runTests(''' - 5+3*6 - (5+3)*6 - -2--11 - ''', fullDump=False) - - prints:: - - 5+3*6 - [[5, '+', [3, '*', 6]]] - - (5+3)*6 - [[[5, '+', 3], '*', 6]] - - -2--11 - [[['-', 2], '-', ['-', 11]]] - """ - # captive version of FollowedBy that does not do parse actions or capture results names - class _FB(FollowedBy): - def parseImpl(self, instring, loc, doActions=True): - self.expr.tryParse(instring, loc) - return loc, [] - - ret = Forward() - lastExpr = baseExpr | ( lpar + ret + rpar ) - for i,operDef in enumerate(opList): - opExpr,arity,rightLeftAssoc,pa = (operDef + (None,))[:4] - termName = "%s term" % opExpr if arity < 3 else "%s%s term" % opExpr - if arity == 3: - if opExpr is None or len(opExpr) != 2: - raise ValueError( - "if numterms=3, opExpr must be a tuple or list of two expressions") - opExpr1, opExpr2 = opExpr - thisExpr = Forward().setName(termName) - if rightLeftAssoc == opAssoc.LEFT: - if arity == 1: - matchExpr = _FB(lastExpr + opExpr) + Group( lastExpr + OneOrMore( opExpr ) ) - elif arity == 2: - if opExpr is not None: - matchExpr = _FB(lastExpr + opExpr + lastExpr) + Group( lastExpr + OneOrMore( opExpr + lastExpr ) ) - else: - matchExpr = _FB(lastExpr+lastExpr) + Group( lastExpr + OneOrMore(lastExpr) ) - elif arity == 3: - matchExpr = _FB(lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr) + \ - Group( lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr ) - else: - raise ValueError("operator must be unary (1), binary (2), or ternary (3)") - elif rightLeftAssoc == opAssoc.RIGHT: - if arity == 1: - # try to avoid LR with this extra test - if not isinstance(opExpr, Optional): - opExpr = Optional(opExpr) - matchExpr = _FB(opExpr.expr + thisExpr) + Group( opExpr + thisExpr ) - elif arity == 2: - if opExpr is not None: - matchExpr = _FB(lastExpr + opExpr + thisExpr) + Group( lastExpr + OneOrMore( opExpr + thisExpr ) ) - else: - matchExpr = _FB(lastExpr + thisExpr) + Group( lastExpr + OneOrMore( thisExpr ) ) - elif arity == 3: - matchExpr = _FB(lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr) + \ - Group( lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr ) - else: - raise ValueError("operator must be unary (1), binary (2), or ternary (3)") - else: - raise ValueError("operator must indicate right or left associativity") - if pa: - if isinstance(pa, (tuple, list)): - matchExpr.setParseAction(*pa) - else: - matchExpr.setParseAction(pa) - thisExpr <<= ( matchExpr.setName(termName) | lastExpr ) - lastExpr = thisExpr - ret <<= lastExpr - return ret - -operatorPrecedence = infixNotation -"""(Deprecated) Former name of :class:`infixNotation`, will be -dropped in a future release.""" - -dblQuotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"').setName("string enclosed in double quotes") -sglQuotedString = Combine(Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("string enclosed in single quotes") -quotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"'| - Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("quotedString using single or double quotes") -unicodeString = Combine(_L('u') + quotedString.copy()).setName("unicode string literal") - -def nestedExpr(opener="(", closer=")", content=None, ignoreExpr=quotedString.copy()): - """Helper method for defining nested lists enclosed in opening and - closing delimiters ("(" and ")" are the default). - - Parameters: - - opener - opening character for a nested list - (default= ``"("``); can also be a pyparsing expression - - closer - closing character for a nested list - (default= ``")"``); can also be a pyparsing expression - - content - expression for items within the nested lists - (default= ``None``) - - ignoreExpr - expression for ignoring opening and closing - delimiters (default= :class:`quotedString`) - - If an expression is not provided for the content argument, the - nested expression will capture all whitespace-delimited content - between delimiters as a list of separate values. - - Use the ``ignoreExpr`` argument to define expressions that may - contain opening or closing characters that should not be treated as - opening or closing characters for nesting, such as quotedString or - a comment expression. Specify multiple expressions using an - :class:`Or` or :class:`MatchFirst`. The default is - :class:`quotedString`, but if no expressions are to be ignored, then - pass ``None`` for this argument. - - Example:: - - data_type = oneOf("void int short long char float double") - decl_data_type = Combine(data_type + Optional(Word('*'))) - ident = Word(alphas+'_', alphanums+'_') - number = pyparsing_common.number - arg = Group(decl_data_type + ident) - LPAR,RPAR = map(Suppress, "()") - - code_body = nestedExpr('{', '}', ignoreExpr=(quotedString | cStyleComment)) - - c_function = (decl_data_type("type") - + ident("name") - + LPAR + Optional(delimitedList(arg), [])("args") + RPAR - + code_body("body")) - c_function.ignore(cStyleComment) - - source_code = ''' - int is_odd(int x) { - return (x%2); - } - - int dec_to_hex(char hchar) { - if (hchar >= '0' && hchar <= '9') { - return (ord(hchar)-ord('0')); - } else { - return (10+ord(hchar)-ord('A')); - } - } - ''' - for func in c_function.searchString(source_code): - print("%(name)s (%(type)s) args: %(args)s" % func) - - - prints:: - - is_odd (int) args: [['int', 'x']] - dec_to_hex (int) args: [['char', 'hchar']] - """ - if opener == closer: - raise ValueError("opening and closing strings cannot be the same") - if content is None: - if isinstance(opener,basestring) and isinstance(closer,basestring): - if len(opener) == 1 and len(closer)==1: - if ignoreExpr is not None: - content = (Combine(OneOrMore(~ignoreExpr + - CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS,exact=1)) - ).setParseAction(lambda t:t[0].strip())) - else: - content = (empty.copy()+CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS - ).setParseAction(lambda t:t[0].strip())) - else: - if ignoreExpr is not None: - content = (Combine(OneOrMore(~ignoreExpr + - ~Literal(opener) + ~Literal(closer) + - CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) - ).setParseAction(lambda t:t[0].strip())) - else: - content = (Combine(OneOrMore(~Literal(opener) + ~Literal(closer) + - CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) - ).setParseAction(lambda t:t[0].strip())) - else: - raise ValueError("opening and closing arguments must be strings if no content expression is given") - ret = Forward() - if ignoreExpr is not None: - ret <<= Group( Suppress(opener) + ZeroOrMore( ignoreExpr | ret | content ) + Suppress(closer) ) - else: - ret <<= Group( Suppress(opener) + ZeroOrMore( ret | content ) + Suppress(closer) ) - ret.setName('nested %s%s expression' % (opener,closer)) - return ret - -def indentedBlock(blockStatementExpr, indentStack, indent=True): - """Helper method for defining space-delimited indentation blocks, - such as those used to define block statements in Python source code. - - Parameters: - - - blockStatementExpr - expression defining syntax of statement that - is repeated within the indented block - - indentStack - list created by caller to manage indentation stack - (multiple statementWithIndentedBlock expressions within a single - grammar should share a common indentStack) - - indent - boolean indicating whether block must be indented beyond - the the current level; set to False for block of left-most - statements (default= ``True``) - - A valid block must contain at least one ``blockStatement``. - - Example:: - - data = ''' - def A(z): - A1 - B = 100 - G = A2 - A2 - A3 - B - def BB(a,b,c): - BB1 - def BBA(): - bba1 - bba2 - bba3 - C - D - def spam(x,y): - def eggs(z): - pass - ''' - - - indentStack = [1] - stmt = Forward() - - identifier = Word(alphas, alphanums) - funcDecl = ("def" + identifier + Group( "(" + Optional( delimitedList(identifier) ) + ")" ) + ":") - func_body = indentedBlock(stmt, indentStack) - funcDef = Group( funcDecl + func_body ) - - rvalue = Forward() - funcCall = Group(identifier + "(" + Optional(delimitedList(rvalue)) + ")") - rvalue << (funcCall | identifier | Word(nums)) - assignment = Group(identifier + "=" + rvalue) - stmt << ( funcDef | assignment | identifier ) - - module_body = OneOrMore(stmt) - - parseTree = module_body.parseString(data) - parseTree.pprint() - - prints:: - - [['def', - 'A', - ['(', 'z', ')'], - ':', - [['A1'], [['B', '=', '100']], [['G', '=', 'A2']], ['A2'], ['A3']]], - 'B', - ['def', - 'BB', - ['(', 'a', 'b', 'c', ')'], - ':', - [['BB1'], [['def', 'BBA', ['(', ')'], ':', [['bba1'], ['bba2'], ['bba3']]]]]], - 'C', - 'D', - ['def', - 'spam', - ['(', 'x', 'y', ')'], - ':', - [[['def', 'eggs', ['(', 'z', ')'], ':', [['pass']]]]]]] - """ - backup_stack = indentStack[:] - - def reset_stack(): - indentStack[:] = backup_stack - - def checkPeerIndent(s,l,t): - if l >= len(s): return - curCol = col(l,s) - if curCol != indentStack[-1]: - if curCol > indentStack[-1]: - raise ParseException(s,l,"illegal nesting") - raise ParseException(s,l,"not a peer entry") - - def checkSubIndent(s,l,t): - curCol = col(l,s) - if curCol > indentStack[-1]: - indentStack.append( curCol ) - else: - raise ParseException(s,l,"not a subentry") - - def checkUnindent(s,l,t): - if l >= len(s): return - curCol = col(l,s) - if not(indentStack and curCol < indentStack[-1] and curCol <= indentStack[-2]): - raise ParseException(s,l,"not an unindent") - indentStack.pop() - - NL = OneOrMore(LineEnd().setWhitespaceChars("\t ").suppress()) - INDENT = (Empty() + Empty().setParseAction(checkSubIndent)).setName('INDENT') - PEER = Empty().setParseAction(checkPeerIndent).setName('') - UNDENT = Empty().setParseAction(checkUnindent).setName('UNINDENT') - if indent: - smExpr = Group( Optional(NL) + - #~ FollowedBy(blockStatementExpr) + - INDENT + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) + UNDENT) - else: - smExpr = Group( Optional(NL) + - (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) ) - smExpr.setFailAction(lambda a, b, c, d: reset_stack()) - blockStatementExpr.ignore(_bslash + LineEnd()) - return smExpr.setName('indented block') - -alphas8bit = srange(r"[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]") -punc8bit = srange(r"[\0xa1-\0xbf\0xd7\0xf7]") - -anyOpenTag,anyCloseTag = makeHTMLTags(Word(alphas,alphanums+"_:").setName('any tag')) -_htmlEntityMap = dict(zip("gt lt amp nbsp quot apos".split(),'><& "\'')) -commonHTMLEntity = Regex('&(?P<entity>' + '|'.join(_htmlEntityMap.keys()) +");").setName("common HTML entity") -def replaceHTMLEntity(t): - """Helper parser action to replace common HTML entities with their special characters""" - return _htmlEntityMap.get(t.entity) - -# it's easy to get these comment structures wrong - they're very common, so may as well make them available -cStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/').setName("C style comment") -"Comment of the form ``/* ... */``" - -htmlComment = Regex(r"<!--[\s\S]*?-->").setName("HTML comment") -"Comment of the form ``<!-- ... -->``" - -restOfLine = Regex(r".*").leaveWhitespace().setName("rest of line") -dblSlashComment = Regex(r"//(?:\\\n|[^\n])*").setName("// comment") -"Comment of the form ``// ... (to end of line)``" - -cppStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/'| dblSlashComment).setName("C++ style comment") -"Comment of either form :class:`cStyleComment` or :class:`dblSlashComment`" - -javaStyleComment = cppStyleComment -"Same as :class:`cppStyleComment`" - -pythonStyleComment = Regex(r"#.*").setName("Python style comment") -"Comment of the form ``# ... (to end of line)``" - -_commasepitem = Combine(OneOrMore(Word(printables, excludeChars=',') + - Optional( Word(" \t") + - ~Literal(",") + ~LineEnd() ) ) ).streamline().setName("commaItem") -commaSeparatedList = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("commaSeparatedList") -"""(Deprecated) Predefined expression of 1 or more printable words or -quoted strings, separated by commas. - -This expression is deprecated in favor of :class:`pyparsing_common.comma_separated_list`. -""" - -# some other useful expressions - using lower-case class name since we are really using this as a namespace -class pyparsing_common: - """Here are some common low-level expressions that may be useful in - jump-starting parser development: - - - numeric forms (:class:`integers<integer>`, :class:`reals<real>`, - :class:`scientific notation<sci_real>`) - - common :class:`programming identifiers<identifier>` - - network addresses (:class:`MAC<mac_address>`, - :class:`IPv4<ipv4_address>`, :class:`IPv6<ipv6_address>`) - - ISO8601 :class:`dates<iso8601_date>` and - :class:`datetime<iso8601_datetime>` - - :class:`UUID<uuid>` - - :class:`comma-separated list<comma_separated_list>` - - Parse actions: - - - :class:`convertToInteger` - - :class:`convertToFloat` - - :class:`convertToDate` - - :class:`convertToDatetime` - - :class:`stripHTMLTags` - - :class:`upcaseTokens` - - :class:`downcaseTokens` - - Example:: - - pyparsing_common.number.runTests(''' - # any int or real number, returned as the appropriate type - 100 - -100 - +100 - 3.14159 - 6.02e23 - 1e-12 - ''') - - pyparsing_common.fnumber.runTests(''' - # any int or real number, returned as float - 100 - -100 - +100 - 3.14159 - 6.02e23 - 1e-12 - ''') - - pyparsing_common.hex_integer.runTests(''' - # hex numbers - 100 - FF - ''') - - pyparsing_common.fraction.runTests(''' - # fractions - 1/2 - -3/4 - ''') - - pyparsing_common.mixed_integer.runTests(''' - # mixed fractions - 1 - 1/2 - -3/4 - 1-3/4 - ''') - - import uuid - pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) - pyparsing_common.uuid.runTests(''' - # uuid - 12345678-1234-5678-1234-567812345678 - ''') - - prints:: - - # any int or real number, returned as the appropriate type - 100 - [100] - - -100 - [-100] - - +100 - [100] - - 3.14159 - [3.14159] - - 6.02e23 - [6.02e+23] - - 1e-12 - [1e-12] - - # any int or real number, returned as float - 100 - [100.0] - - -100 - [-100.0] - - +100 - [100.0] - - 3.14159 - [3.14159] - - 6.02e23 - [6.02e+23] - - 1e-12 - [1e-12] - - # hex numbers - 100 - [256] - - FF - [255] - - # fractions - 1/2 - [0.5] - - -3/4 - [-0.75] - - # mixed fractions - 1 - [1] - - 1/2 - [0.5] - - -3/4 - [-0.75] - - 1-3/4 - [1.75] - - # uuid - 12345678-1234-5678-1234-567812345678 - [UUID('12345678-1234-5678-1234-567812345678')] - """ - - convertToInteger = tokenMap(int) - """ - Parse action for converting parsed integers to Python int - """ - - convertToFloat = tokenMap(float) - """ - Parse action for converting parsed numbers to Python float - """ - - integer = Word(nums).setName("integer").setParseAction(convertToInteger) - """expression that parses an unsigned integer, returns an int""" - - hex_integer = Word(hexnums).setName("hex integer").setParseAction(tokenMap(int,16)) - """expression that parses a hexadecimal integer, returns an int""" - - signed_integer = Regex(r'[+-]?\d+').setName("signed integer").setParseAction(convertToInteger) - """expression that parses an integer with optional leading sign, returns an int""" - - fraction = (signed_integer().setParseAction(convertToFloat) + '/' + signed_integer().setParseAction(convertToFloat)).setName("fraction") - """fractional expression of an integer divided by an integer, returns a float""" - fraction.addParseAction(lambda t: t[0]/t[-1]) - - mixed_integer = (fraction | signed_integer + Optional(Optional('-').suppress() + fraction)).setName("fraction or mixed integer-fraction") - """mixed integer of the form 'integer - fraction', with optional leading integer, returns float""" - mixed_integer.addParseAction(sum) - - real = Regex(r'[+-]?\d+\.\d*').setName("real number").setParseAction(convertToFloat) - """expression that parses a floating point number and returns a float""" - - sci_real = Regex(r'[+-]?\d+([eE][+-]?\d+|\.\d*([eE][+-]?\d+)?)').setName("real number with scientific notation").setParseAction(convertToFloat) - """expression that parses a floating point number with optional - scientific notation and returns a float""" - - # streamlining this expression makes the docs nicer-looking - number = (sci_real | real | signed_integer).streamline() - """any numeric expression, returns the corresponding Python type""" - - fnumber = Regex(r'[+-]?\d+\.?\d*([eE][+-]?\d+)?').setName("fnumber").setParseAction(convertToFloat) - """any int or real number, returned as float""" - - identifier = Word(alphas+'_', alphanums+'_').setName("identifier") - """typical code identifier (leading alpha or '_', followed by 0 or more alphas, nums, or '_')""" - - ipv4_address = Regex(r'(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})){3}').setName("IPv4 address") - "IPv4 address (``0.0.0.0 - 255.255.255.255``)" - - _ipv6_part = Regex(r'[0-9a-fA-F]{1,4}').setName("hex_integer") - _full_ipv6_address = (_ipv6_part + (':' + _ipv6_part)*7).setName("full IPv6 address") - _short_ipv6_address = (Optional(_ipv6_part + (':' + _ipv6_part)*(0,6)) + "::" + Optional(_ipv6_part + (':' + _ipv6_part)*(0,6))).setName("short IPv6 address") - _short_ipv6_address.addCondition(lambda t: sum(1 for tt in t if pyparsing_common._ipv6_part.matches(tt)) < 8) - _mixed_ipv6_address = ("::ffff:" + ipv4_address).setName("mixed IPv6 address") - ipv6_address = Combine((_full_ipv6_address | _mixed_ipv6_address | _short_ipv6_address).setName("IPv6 address")).setName("IPv6 address") - "IPv6 address (long, short, or mixed form)" - - mac_address = Regex(r'[0-9a-fA-F]{2}([:.-])[0-9a-fA-F]{2}(?:\1[0-9a-fA-F]{2}){4}').setName("MAC address") - "MAC address xx:xx:xx:xx:xx (may also have '-' or '.' delimiters)" - - @staticmethod - def convertToDate(fmt="%Y-%m-%d"): - """ - Helper to create a parse action for converting parsed date string to Python datetime.date - - Params - - - fmt - format to be passed to datetime.strptime (default= ``"%Y-%m-%d"``) - - Example:: - - date_expr = pyparsing_common.iso8601_date.copy() - date_expr.setParseAction(pyparsing_common.convertToDate()) - print(date_expr.parseString("1999-12-31")) - - prints:: - - [datetime.date(1999, 12, 31)] - """ - def cvt_fn(s,l,t): - try: - return datetime.strptime(t[0], fmt).date() - except ValueError as ve: - raise ParseException(s, l, str(ve)) - return cvt_fn - - @staticmethod - def convertToDatetime(fmt="%Y-%m-%dT%H:%M:%S.%f"): - """Helper to create a parse action for converting parsed - datetime string to Python datetime.datetime - - Params - - - fmt - format to be passed to datetime.strptime (default= ``"%Y-%m-%dT%H:%M:%S.%f"``) - - Example:: - - dt_expr = pyparsing_common.iso8601_datetime.copy() - dt_expr.setParseAction(pyparsing_common.convertToDatetime()) - print(dt_expr.parseString("1999-12-31T23:59:59.999")) - - prints:: - - [datetime.datetime(1999, 12, 31, 23, 59, 59, 999000)] - """ - def cvt_fn(s,l,t): - try: - return datetime.strptime(t[0], fmt) - except ValueError as ve: - raise ParseException(s, l, str(ve)) - return cvt_fn - - iso8601_date = Regex(r'(?P<year>\d{4})(?:-(?P<month>\d\d)(?:-(?P<day>\d\d))?)?').setName("ISO8601 date") - "ISO8601 date (``yyyy-mm-dd``)" - - iso8601_datetime = Regex(r'(?P<year>\d{4})-(?P<month>\d\d)-(?P<day>\d\d)[T ](?P<hour>\d\d):(?P<minute>\d\d)(:(?P<second>\d\d(\.\d*)?)?)?(?P<tz>Z|[+-]\d\d:?\d\d)?').setName("ISO8601 datetime") - "ISO8601 datetime (``yyyy-mm-ddThh:mm:ss.s(Z|+-00:00)``) - trailing seconds, milliseconds, and timezone optional; accepts separating ``'T'`` or ``' '``" - - uuid = Regex(r'[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}').setName("UUID") - "UUID (``xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx``)" - - _html_stripper = anyOpenTag.suppress() | anyCloseTag.suppress() - @staticmethod - def stripHTMLTags(s, l, tokens): - """Parse action to remove HTML tags from web page HTML source - - Example:: - - # strip HTML links from normal text - text = '<td>More info at the <a href="https://github.com/pyparsing/pyparsing/wiki">pyparsing</a> wiki page</td>' - td,td_end = makeHTMLTags("TD") - table_text = td + SkipTo(td_end).setParseAction(pyparsing_common.stripHTMLTags)("body") + td_end - print(table_text.parseString(text).body) - - Prints:: - - More info at the pyparsing wiki page - """ - return pyparsing_common._html_stripper.transformString(tokens[0]) - - _commasepitem = Combine(OneOrMore(~Literal(",") + ~LineEnd() + Word(printables, excludeChars=',') - + Optional( White(" \t") ) ) ).streamline().setName("commaItem") - comma_separated_list = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("comma separated list") - """Predefined expression of 1 or more printable words or quoted strings, separated by commas.""" - - upcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).upper())) - """Parse action to convert tokens to upper case.""" - - downcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).lower())) - """Parse action to convert tokens to lower case.""" - - -class _lazyclassproperty(object): - def __init__(self, fn): - self.fn = fn - self.__doc__ = fn.__doc__ - self.__name__ = fn.__name__ - - def __get__(self, obj, cls): - if cls is None: - cls = type(obj) - if not hasattr(cls, '_intern') or any(cls._intern is getattr(superclass, '_intern', []) for superclass in cls.__mro__[1:]): - cls._intern = {} - attrname = self.fn.__name__ - if attrname not in cls._intern: - cls._intern[attrname] = self.fn(cls) - return cls._intern[attrname] - - -class unicode_set(object): - """ - A set of Unicode characters, for language-specific strings for - ``alphas``, ``nums``, ``alphanums``, and ``printables``. - A unicode_set is defined by a list of ranges in the Unicode character - set, in a class attribute ``_ranges``, such as:: - - _ranges = [(0x0020, 0x007e), (0x00a0, 0x00ff),] - - A unicode set can also be defined using multiple inheritance of other unicode sets:: - - class CJK(Chinese, Japanese, Korean): - pass - """ - _ranges = [] - - @classmethod - def _get_chars_for_ranges(cls): - ret = [] - for cc in cls.__mro__: - if cc is unicode_set: - break - for rr in cc._ranges: - ret.extend(range(rr[0], rr[-1]+1)) - return [unichr(c) for c in sorted(set(ret))] - - @_lazyclassproperty - def printables(cls): - "all non-whitespace characters in this range" - return u''.join(filterfalse(unicode.isspace, cls._get_chars_for_ranges())) - - @_lazyclassproperty - def alphas(cls): - "all alphabetic characters in this range" - return u''.join(filter(unicode.isalpha, cls._get_chars_for_ranges())) - - @_lazyclassproperty - def nums(cls): - "all numeric digit characters in this range" - return u''.join(filter(unicode.isdigit, cls._get_chars_for_ranges())) - - @_lazyclassproperty - def alphanums(cls): - "all alphanumeric characters in this range" - return cls.alphas + cls.nums - - -class pyparsing_unicode(unicode_set): - """ - A namespace class for defining common language unicode_sets. - """ - _ranges = [(32, sys.maxunicode)] - - class Latin1(unicode_set): - "Unicode set for Latin-1 Unicode Character Range" - _ranges = [(0x0020, 0x007e), (0x00a0, 0x00ff),] - - class LatinA(unicode_set): - "Unicode set for Latin-A Unicode Character Range" - _ranges = [(0x0100, 0x017f),] - - class LatinB(unicode_set): - "Unicode set for Latin-B Unicode Character Range" - _ranges = [(0x0180, 0x024f),] - - class Greek(unicode_set): - "Unicode set for Greek Unicode Character Ranges" - _ranges = [ - (0x0370, 0x03ff), (0x1f00, 0x1f15), (0x1f18, 0x1f1d), (0x1f20, 0x1f45), (0x1f48, 0x1f4d), - (0x1f50, 0x1f57), (0x1f59,), (0x1f5b,), (0x1f5d,), (0x1f5f, 0x1f7d), (0x1f80, 0x1fb4), (0x1fb6, 0x1fc4), - (0x1fc6, 0x1fd3), (0x1fd6, 0x1fdb), (0x1fdd, 0x1fef), (0x1ff2, 0x1ff4), (0x1ff6, 0x1ffe), - ] - - class Cyrillic(unicode_set): - "Unicode set for Cyrillic Unicode Character Range" - _ranges = [(0x0400, 0x04ff)] - - class Chinese(unicode_set): - "Unicode set for Chinese Unicode Character Range" - _ranges = [(0x4e00, 0x9fff), (0x3000, 0x303f), ] - - class Japanese(unicode_set): - "Unicode set for Japanese Unicode Character Range, combining Kanji, Hiragana, and Katakana ranges" - _ranges = [ ] - - class Kanji(unicode_set): - "Unicode set for Kanji Unicode Character Range" - _ranges = [(0x4E00, 0x9Fbf), (0x3000, 0x303f), ] - - class Hiragana(unicode_set): - "Unicode set for Hiragana Unicode Character Range" - _ranges = [(0x3040, 0x309f), ] - - class Katakana(unicode_set): - "Unicode set for Katakana Unicode Character Range" - _ranges = [(0x30a0, 0x30ff), ] - - class Korean(unicode_set): - "Unicode set for Korean Unicode Character Range" - _ranges = [(0xac00, 0xd7af), (0x1100, 0x11ff), (0x3130, 0x318f), (0xa960, 0xa97f), (0xd7b0, 0xd7ff), (0x3000, 0x303f), ] - - class CJK(Chinese, Japanese, Korean): - "Unicode set for combined Chinese, Japanese, and Korean (CJK) Unicode Character Range" - pass - - class Thai(unicode_set): - "Unicode set for Thai Unicode Character Range" - _ranges = [(0x0e01, 0x0e3a), (0x0e3f, 0x0e5b), ] - - class Arabic(unicode_set): - "Unicode set for Arabic Unicode Character Range" - _ranges = [(0x0600, 0x061b), (0x061e, 0x06ff), (0x0700, 0x077f), ] - - class Hebrew(unicode_set): - "Unicode set for Hebrew Unicode Character Range" - _ranges = [(0x0590, 0x05ff), ] - - class Devanagari(unicode_set): - "Unicode set for Devanagari Unicode Character Range" - _ranges = [(0x0900, 0x097f), (0xa8e0, 0xa8ff)] - -pyparsing_unicode.Japanese._ranges = (pyparsing_unicode.Japanese.Kanji._ranges - + pyparsing_unicode.Japanese.Hiragana._ranges - + pyparsing_unicode.Japanese.Katakana._ranges) - -# define ranges in language character sets -if PY_3: - setattr(pyparsing_unicode, "العربية", pyparsing_unicode.Arabic) - setattr(pyparsing_unicode, "中文", pyparsing_unicode.Chinese) - setattr(pyparsing_unicode, "кириллица", pyparsing_unicode.Cyrillic) - setattr(pyparsing_unicode, "Ελληνικά", pyparsing_unicode.Greek) - setattr(pyparsing_unicode, "עִברִית", pyparsing_unicode.Hebrew) - setattr(pyparsing_unicode, "日本語", pyparsing_unicode.Japanese) - setattr(pyparsing_unicode.Japanese, "漢字", pyparsing_unicode.Japanese.Kanji) - setattr(pyparsing_unicode.Japanese, "カタカナ", pyparsing_unicode.Japanese.Katakana) - setattr(pyparsing_unicode.Japanese, "ひらがな", pyparsing_unicode.Japanese.Hiragana) - setattr(pyparsing_unicode, "한국어", pyparsing_unicode.Korean) - setattr(pyparsing_unicode, "ไทย", pyparsing_unicode.Thai) - setattr(pyparsing_unicode, "देवनागरी", pyparsing_unicode.Devanagari) - - -if __name__ == "__main__": - - selectToken = CaselessLiteral("select") - fromToken = CaselessLiteral("from") - - ident = Word(alphas, alphanums + "_$") - - columnName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) - columnNameList = Group(delimitedList(columnName)).setName("columns") - columnSpec = ('*' | columnNameList) - - tableName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) - tableNameList = Group(delimitedList(tableName)).setName("tables") - - simpleSQL = selectToken("command") + columnSpec("columns") + fromToken + tableNameList("tables") - - # demo runTests method, including embedded comments in test string - simpleSQL.runTests(""" - # '*' as column list and dotted table name - select * from SYS.XYZZY - - # caseless match on "SELECT", and casts back to "select" - SELECT * from XYZZY, ABC - - # list of column names, and mixed case SELECT keyword - Select AA,BB,CC from Sys.dual - - # multiple tables - Select A, B, C from Sys.dual, Table2 - - # invalid SELECT keyword - should fail - Xelect A, B, C from Sys.dual - - # incomplete command - should fail - Select - - # invalid column name - should fail - Select ^^^ frox Sys.dual - - """) - - pyparsing_common.number.runTests(""" - 100 - -100 - +100 - 3.14159 - 6.02e23 - 1e-12 - """) - - # any int or real number, returned as float - pyparsing_common.fnumber.runTests(""" - 100 - -100 - +100 - 3.14159 - 6.02e23 - 1e-12 - """) - - pyparsing_common.hex_integer.runTests(""" - 100 - FF - """) - - import uuid - pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) - pyparsing_common.uuid.runTests(""" - 12345678-1234-5678-1234-567812345678 - """) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/pytoml/__init__.py b/env/lib/python3.7/site-packages/pip/_vendor/pytoml/__init__.py deleted file mode 100644 index 8ed060f..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/pytoml/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from .core import TomlError -from .parser import load, loads -from .test import translate_to_test -from .writer import dump, dumps \ No newline at end of file diff --git a/env/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index f94683bfc4bbc47fe33bcdb655fc93c4f9540409..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 333 zcmXv}O-sZu5N+DD+b+AHH~&HpYw=!01g~E76p&C%#6rHDWYwPhF`oQOxq9+1cygxT zz`VRSFEg23@AumR!+oATeBk*_;y+3xSD0}`P=#WquuL#Uyfme)L}j_)tFBCK8_}$s zn~iNnYdg`QuJ4Mz`C&MsXSuug*4zMi=*!HFpH!|1BYLL^CKt_=v`k(m9TVMAM;mfY z7;pP+=8qmU&}O*_6GRPAp#V-5PEAm+<{Qij&4$bk!dC%1;sn3rkZc&j91gRKX)@-Z vUKaO$@$^i^HRY>z%EJ(rgewnH&TdXpo`)s3qxI@&^d)^N(hECw!glNrg`ri= diff --git a/env/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/core.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/core.cpython-37.pyc deleted file mode 100644 index fb123aacb1ec6bfbb6463d72bdd1e481d02a38b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 896 zcmbVKON-P%5Ux%-lk7SpxOmv33m!J$&frZ%WKqQ19Msc*G$Gxi8S>id%;L;sPVNuc z#gl(2SAT*xL9nWa9ir&P3iaqmRlcvPUyMeFKvI4=e*aSdeB;HfND9tL?R_$@L4y`o zqy|3wGoih=5c?^e?8T$#oYX!fV}S0!%+qx93TD3cwInZfpa<jw9a4VO9lWcG{1sw_ zX+T*l>_gI*q;^cEfosu1D_XDhTX_=*jzM{}2IbQpDA`J~fd(onrtzQ~zFC${Rv1^h zi<HXBtWl~93uA5a!E`duO4Ipim3PrR%T1XSCJs7jO+H6vj*J5bY#7Z~zyoqWo=lpe zp43@=mX)?i^88F+tjbT1=O1~~sk$_!u5ePX8X`AID>UPJg+8Toi>&LoI1&T*t&jFC z7~jH7X%tS_GX&R*V+ypmh87mYe?jaQ#C;)eB(e6U>${un>1O-r!DbsjWfOFRd4)yN zI08LBOfMD~k#nSWhGBJ~Qno>*n5$*9AlCQ#0Nv^T;XB#aIo+Hf1O3Csae#N|mw)U3 zKk(9I(bNQZ*aQ4qM|a2kCg?6tnO?!6QbnbgImbh#E|y8YJ8?rou7x8u+=iav79r1s j)$(8>5rvWO_NK9i+%dQ4CAk`|xzV%TU!QaOcT)HT%y7Lk diff --git a/env/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/parser.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/parser.cpython-37.pyc deleted file mode 100644 index 834ed90d560026be32c11a3ca7b660c7214bb29f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10013 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 F{{h;oQ4;_F diff --git a/env/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/writer.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/writer.cpython-37.pyc deleted file mode 100644 index e22a1d99d356f5b2c24703c72deea6f559ae8777..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3530 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 K#VUBNH~(J^k{cWV diff --git a/env/lib/python3.7/site-packages/pip/_vendor/pytoml/core.py b/env/lib/python3.7/site-packages/pip/_vendor/pytoml/core.py deleted file mode 100644 index c182734..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/pytoml/core.py +++ /dev/null @@ -1,13 +0,0 @@ -class TomlError(RuntimeError): - def __init__(self, message, line, col, filename): - RuntimeError.__init__(self, message, line, col, filename) - self.message = message - self.line = line - self.col = col - self.filename = filename - - def __str__(self): - return '{}({}, {}): {}'.format(self.filename, self.line, self.col, self.message) - - def __repr__(self): - return 'TomlError({!r}, {!r}, {!r}, {!r})'.format(self.message, self.line, self.col, self.filename) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/pytoml/parser.py b/env/lib/python3.7/site-packages/pip/_vendor/pytoml/parser.py deleted file mode 100644 index 3493aa6..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/pytoml/parser.py +++ /dev/null @@ -1,341 +0,0 @@ -import string, re, sys, datetime -from .core import TomlError -from .utils import rfc3339_re, parse_rfc3339_re - -if sys.version_info[0] == 2: - _chr = unichr -else: - _chr = chr - -def load(fin, translate=lambda t, x, v: v, object_pairs_hook=dict): - return loads(fin.read(), translate=translate, object_pairs_hook=object_pairs_hook, filename=getattr(fin, 'name', repr(fin))) - -def loads(s, filename='<string>', translate=lambda t, x, v: v, object_pairs_hook=dict): - if isinstance(s, bytes): - s = s.decode('utf-8') - - s = s.replace('\r\n', '\n') - - root = object_pairs_hook() - tables = object_pairs_hook() - scope = root - - src = _Source(s, filename=filename) - ast = _p_toml(src, object_pairs_hook=object_pairs_hook) - - def error(msg): - raise TomlError(msg, pos[0], pos[1], filename) - - def process_value(v, object_pairs_hook): - kind, text, value, pos = v - if kind == 'str' and value.startswith('\n'): - value = value[1:] - if kind == 'array': - if value and any(k != value[0][0] for k, t, v, p in value[1:]): - error('array-type-mismatch') - value = [process_value(item, object_pairs_hook=object_pairs_hook) for item in value] - elif kind == 'table': - value = object_pairs_hook([(k, process_value(value[k], object_pairs_hook=object_pairs_hook)) for k in value]) - return translate(kind, text, value) - - for kind, value, pos in ast: - if kind == 'kv': - k, v = value - if k in scope: - error('duplicate_keys. Key "{0}" was used more than once.'.format(k)) - scope[k] = process_value(v, object_pairs_hook=object_pairs_hook) - else: - is_table_array = (kind == 'table_array') - cur = tables - for name in value[:-1]: - if isinstance(cur.get(name), list): - d, cur = cur[name][-1] - else: - d, cur = cur.setdefault(name, (None, object_pairs_hook())) - - scope = object_pairs_hook() - name = value[-1] - if name not in cur: - if is_table_array: - cur[name] = [(scope, object_pairs_hook())] - else: - cur[name] = (scope, object_pairs_hook()) - elif isinstance(cur[name], list): - if not is_table_array: - error('table_type_mismatch') - cur[name].append((scope, object_pairs_hook())) - else: - if is_table_array: - error('table_type_mismatch') - old_scope, next_table = cur[name] - if old_scope is not None: - error('duplicate_tables') - cur[name] = (scope, next_table) - - def merge_tables(scope, tables): - if scope is None: - scope = object_pairs_hook() - for k in tables: - if k in scope: - error('key_table_conflict') - v = tables[k] - if isinstance(v, list): - scope[k] = [merge_tables(sc, tbl) for sc, tbl in v] - else: - scope[k] = merge_tables(v[0], v[1]) - return scope - - return merge_tables(root, tables) - -class _Source: - def __init__(self, s, filename=None): - self.s = s - self._pos = (1, 1) - self._last = None - self._filename = filename - self.backtrack_stack = [] - - def last(self): - return self._last - - def pos(self): - return self._pos - - def fail(self): - return self._expect(None) - - def consume_dot(self): - if self.s: - self._last = self.s[0] - self.s = self[1:] - self._advance(self._last) - return self._last - return None - - def expect_dot(self): - return self._expect(self.consume_dot()) - - def consume_eof(self): - if not self.s: - self._last = '' - return True - return False - - def expect_eof(self): - return self._expect(self.consume_eof()) - - def consume(self, s): - if self.s.startswith(s): - self.s = self.s[len(s):] - self._last = s - self._advance(s) - return True - return False - - def expect(self, s): - return self._expect(self.consume(s)) - - def consume_re(self, re): - m = re.match(self.s) - if m: - self.s = self.s[len(m.group(0)):] - self._last = m - self._advance(m.group(0)) - return m - return None - - def expect_re(self, re): - return self._expect(self.consume_re(re)) - - def __enter__(self): - self.backtrack_stack.append((self.s, self._pos)) - - def __exit__(self, type, value, traceback): - if type is None: - self.backtrack_stack.pop() - else: - self.s, self._pos = self.backtrack_stack.pop() - return type == TomlError - - def commit(self): - self.backtrack_stack[-1] = (self.s, self._pos) - - def _expect(self, r): - if not r: - raise TomlError('msg', self._pos[0], self._pos[1], self._filename) - return r - - def _advance(self, s): - suffix_pos = s.rfind('\n') - if suffix_pos == -1: - self._pos = (self._pos[0], self._pos[1] + len(s)) - else: - self._pos = (self._pos[0] + s.count('\n'), len(s) - suffix_pos) - -_ews_re = re.compile(r'(?:[ \t]|#[^\n]*\n|#[^\n]*\Z|\n)*') -def _p_ews(s): - s.expect_re(_ews_re) - -_ws_re = re.compile(r'[ \t]*') -def _p_ws(s): - s.expect_re(_ws_re) - -_escapes = { 'b': '\b', 'n': '\n', 'r': '\r', 't': '\t', '"': '"', - '\\': '\\', 'f': '\f' } - -_basicstr_re = re.compile(r'[^"\\\000-\037]*') -_short_uni_re = re.compile(r'u([0-9a-fA-F]{4})') -_long_uni_re = re.compile(r'U([0-9a-fA-F]{8})') -_escapes_re = re.compile(r'[btnfr\"\\]') -_newline_esc_re = re.compile('\n[ \t\n]*') -def _p_basicstr_content(s, content=_basicstr_re): - res = [] - while True: - res.append(s.expect_re(content).group(0)) - if not s.consume('\\'): - break - if s.consume_re(_newline_esc_re): - pass - elif s.consume_re(_short_uni_re) or s.consume_re(_long_uni_re): - v = int(s.last().group(1), 16) - if 0xd800 <= v < 0xe000: - s.fail() - res.append(_chr(v)) - else: - s.expect_re(_escapes_re) - res.append(_escapes[s.last().group(0)]) - return ''.join(res) - -_key_re = re.compile(r'[0-9a-zA-Z-_]+') -def _p_key(s): - with s: - s.expect('"') - r = _p_basicstr_content(s, _basicstr_re) - s.expect('"') - return r - if s.consume('\''): - if s.consume('\'\''): - r = s.expect_re(_litstr_ml_re).group(0) - s.expect('\'\'\'') - else: - r = s.expect_re(_litstr_re).group(0) - s.expect('\'') - return r - return s.expect_re(_key_re).group(0) - -_float_re = re.compile(r'[+-]?(?:0|[1-9](?:_?\d)*)(?:\.\d(?:_?\d)*)?(?:[eE][+-]?(?:\d(?:_?\d)*))?') - -_basicstr_ml_re = re.compile(r'(?:""?(?!")|[^"\\\000-\011\013-\037])*') -_litstr_re = re.compile(r"[^'\000\010\012-\037]*") -_litstr_ml_re = re.compile(r"(?:(?:|'|'')(?:[^'\000-\010\013-\037]))*") -def _p_value(s, object_pairs_hook): - pos = s.pos() - - if s.consume('true'): - return 'bool', s.last(), True, pos - if s.consume('false'): - return 'bool', s.last(), False, pos - - if s.consume('"'): - if s.consume('""'): - r = _p_basicstr_content(s, _basicstr_ml_re) - s.expect('"""') - else: - r = _p_basicstr_content(s, _basicstr_re) - s.expect('"') - return 'str', r, r, pos - - if s.consume('\''): - if s.consume('\'\''): - r = s.expect_re(_litstr_ml_re).group(0) - s.expect('\'\'\'') - else: - r = s.expect_re(_litstr_re).group(0) - s.expect('\'') - return 'str', r, r, pos - - if s.consume_re(rfc3339_re): - m = s.last() - return 'datetime', m.group(0), parse_rfc3339_re(m), pos - - if s.consume_re(_float_re): - m = s.last().group(0) - r = m.replace('_','') - if '.' in m or 'e' in m or 'E' in m: - return 'float', m, float(r), pos - else: - return 'int', m, int(r, 10), pos - - if s.consume('['): - items = [] - with s: - while True: - _p_ews(s) - items.append(_p_value(s, object_pairs_hook=object_pairs_hook)) - s.commit() - _p_ews(s) - s.expect(',') - s.commit() - _p_ews(s) - s.expect(']') - return 'array', None, items, pos - - if s.consume('{'): - _p_ws(s) - items = object_pairs_hook() - if not s.consume('}'): - k = _p_key(s) - _p_ws(s) - s.expect('=') - _p_ws(s) - items[k] = _p_value(s, object_pairs_hook=object_pairs_hook) - _p_ws(s) - while s.consume(','): - _p_ws(s) - k = _p_key(s) - _p_ws(s) - s.expect('=') - _p_ws(s) - items[k] = _p_value(s, object_pairs_hook=object_pairs_hook) - _p_ws(s) - s.expect('}') - return 'table', None, items, pos - - s.fail() - -def _p_stmt(s, object_pairs_hook): - pos = s.pos() - if s.consume( '['): - is_array = s.consume('[') - _p_ws(s) - keys = [_p_key(s)] - _p_ws(s) - while s.consume('.'): - _p_ws(s) - keys.append(_p_key(s)) - _p_ws(s) - s.expect(']') - if is_array: - s.expect(']') - return 'table_array' if is_array else 'table', keys, pos - - key = _p_key(s) - _p_ws(s) - s.expect('=') - _p_ws(s) - value = _p_value(s, object_pairs_hook=object_pairs_hook) - return 'kv', (key, value), pos - -_stmtsep_re = re.compile(r'(?:[ \t]*(?:#[^\n]*)?\n)+[ \t]*') -def _p_toml(s, object_pairs_hook): - stmts = [] - _p_ews(s) - with s: - stmts.append(_p_stmt(s, object_pairs_hook=object_pairs_hook)) - while True: - s.commit() - s.expect_re(_stmtsep_re) - stmts.append(_p_stmt(s, object_pairs_hook=object_pairs_hook)) - _p_ews(s) - s.expect_eof() - return stmts diff --git a/env/lib/python3.7/site-packages/pip/_vendor/pytoml/writer.py b/env/lib/python3.7/site-packages/pip/_vendor/pytoml/writer.py deleted file mode 100644 index 73b5089..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/pytoml/writer.py +++ /dev/null @@ -1,106 +0,0 @@ -from __future__ import unicode_literals -import io, datetime, math, string, sys - -from .utils import format_rfc3339 - -if sys.version_info[0] == 3: - long = int - unicode = str - - -def dumps(obj, sort_keys=False): - fout = io.StringIO() - dump(obj, fout, sort_keys=sort_keys) - return fout.getvalue() - - -_escapes = {'\n': 'n', '\r': 'r', '\\': '\\', '\t': 't', '\b': 'b', '\f': 'f', '"': '"'} - - -def _escape_string(s): - res = [] - start = 0 - - def flush(): - if start != i: - res.append(s[start:i]) - return i + 1 - - i = 0 - while i < len(s): - c = s[i] - if c in '"\\\n\r\t\b\f': - start = flush() - res.append('\\' + _escapes[c]) - elif ord(c) < 0x20: - start = flush() - res.append('\\u%04x' % ord(c)) - i += 1 - - flush() - return '"' + ''.join(res) + '"' - - -_key_chars = string.digits + string.ascii_letters + '-_' -def _escape_id(s): - if any(c not in _key_chars for c in s): - return _escape_string(s) - return s - - -def _format_value(v): - if isinstance(v, bool): - return 'true' if v else 'false' - if isinstance(v, int) or isinstance(v, long): - return unicode(v) - if isinstance(v, float): - if math.isnan(v) or math.isinf(v): - raise ValueError("{0} is not a valid TOML value".format(v)) - else: - return repr(v) - elif isinstance(v, unicode) or isinstance(v, bytes): - return _escape_string(v) - elif isinstance(v, datetime.datetime): - return format_rfc3339(v) - elif isinstance(v, list): - return '[{0}]'.format(', '.join(_format_value(obj) for obj in v)) - elif isinstance(v, dict): - return '{{{0}}}'.format(', '.join('{} = {}'.format(_escape_id(k), _format_value(obj)) for k, obj in v.items())) - else: - raise RuntimeError(v) - - -def dump(obj, fout, sort_keys=False): - tables = [((), obj, False)] - - while tables: - name, table, is_array = tables.pop() - if name: - section_name = '.'.join(_escape_id(c) for c in name) - if is_array: - fout.write('[[{0}]]\n'.format(section_name)) - else: - fout.write('[{0}]\n'.format(section_name)) - - table_keys = sorted(table.keys()) if sort_keys else table.keys() - new_tables = [] - has_kv = False - for k in table_keys: - v = table[k] - if isinstance(v, dict): - new_tables.append((name + (k,), v, False)) - elif isinstance(v, list) and v and all(isinstance(o, dict) for o in v): - new_tables.extend((name + (k,), d, True) for d in v) - elif v is None: - # based on mojombo's comment: https://github.com/toml-lang/toml/issues/146#issuecomment-25019344 - fout.write( - '#{} = null # To use: uncomment and replace null with value\n'.format(_escape_id(k))) - has_kv = True - else: - fout.write('{0} = {1}\n'.format(_escape_id(k), _format_value(v))) - has_kv = True - - tables.extend(reversed(new_tables)) - - if (name or has_kv) and tables: - fout.write('\n') diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/__init__.py b/env/lib/python3.7/site-packages/pip/_vendor/requests/__init__.py deleted file mode 100644 index 80c4ce1..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/requests/__init__.py +++ /dev/null @@ -1,133 +0,0 @@ -# -*- coding: utf-8 -*- - -# __ -# /__) _ _ _ _ _/ _ -# / ( (- (/ (/ (- _) / _) -# / - -""" -Requests HTTP Library -~~~~~~~~~~~~~~~~~~~~~ - -Requests is an HTTP library, written in Python, for human beings. Basic GET -usage: - - >>> import requests - >>> r = requests.get('https://www.python.org') - >>> r.status_code - 200 - >>> 'Python is a programming language' in r.content - True - -... or POST: - - >>> payload = dict(key1='value1', key2='value2') - >>> r = requests.post('https://httpbin.org/post', data=payload) - >>> print(r.text) - { - ... - "form": { - "key2": "value2", - "key1": "value1" - }, - ... - } - -The other HTTP methods are supported - see `requests.api`. Full documentation -is at <http://python-requests.org>. - -:copyright: (c) 2017 by Kenneth Reitz. -:license: Apache 2.0, see LICENSE for more details. -""" - -from pip._vendor import urllib3 -from pip._vendor import chardet -import warnings -from .exceptions import RequestsDependencyWarning - - -def check_compatibility(urllib3_version, chardet_version): - urllib3_version = urllib3_version.split('.') - assert urllib3_version != ['dev'] # Verify urllib3 isn't installed from git. - - # Sometimes, urllib3 only reports its version as 16.1. - if len(urllib3_version) == 2: - urllib3_version.append('0') - - # Check urllib3 for compatibility. - major, minor, patch = urllib3_version # noqa: F811 - major, minor, patch = int(major), int(minor), int(patch) - # urllib3 >= 1.21.1, <= 1.24 - assert major == 1 - assert minor >= 21 - assert minor <= 24 - - # Check chardet for compatibility. - major, minor, patch = chardet_version.split('.')[:3] - major, minor, patch = int(major), int(minor), int(patch) - # chardet >= 3.0.2, < 3.1.0 - assert major == 3 - assert minor < 1 - assert patch >= 2 - - -def _check_cryptography(cryptography_version): - # cryptography < 1.3.4 - try: - cryptography_version = list(map(int, cryptography_version.split('.'))) - except ValueError: - return - - if cryptography_version < [1, 3, 4]: - warning = 'Old version of cryptography ({}) may cause slowdown.'.format(cryptography_version) - warnings.warn(warning, RequestsDependencyWarning) - -# Check imported dependencies for compatibility. -try: - check_compatibility(urllib3.__version__, chardet.__version__) -except (AssertionError, ValueError): - warnings.warn("urllib3 ({}) or chardet ({}) doesn't match a supported " - "version!".format(urllib3.__version__, chardet.__version__), - RequestsDependencyWarning) - -# Attempt to enable urllib3's SNI support, if possible -from pip._internal.utils.compat import WINDOWS -if not WINDOWS: - try: - from pip._vendor.urllib3.contrib import pyopenssl - pyopenssl.inject_into_urllib3() - - # Check cryptography version - from cryptography import __version__ as cryptography_version - _check_cryptography(cryptography_version) - except ImportError: - pass - -# urllib3's DependencyWarnings should be silenced. -from pip._vendor.urllib3.exceptions import DependencyWarning -warnings.simplefilter('ignore', DependencyWarning) - -from .__version__ import __title__, __description__, __url__, __version__ -from .__version__ import __build__, __author__, __author_email__, __license__ -from .__version__ import __copyright__, __cake__ - -from . import utils -from . import packages -from .models import Request, Response, PreparedRequest -from .api import request, get, head, post, patch, put, delete, options -from .sessions import session, Session -from .status_codes import codes -from .exceptions import ( - RequestException, Timeout, URLRequired, - TooManyRedirects, HTTPError, ConnectionError, - FileModeWarning, ConnectTimeout, ReadTimeout -) - -# Set default logging handler to avoid "No handler found" warnings. -import logging -from logging import NullHandler - -logging.getLogger(__name__).addHandler(NullHandler()) - -# FileModeWarnings go off per the default. -warnings.simplefilter('default', FileModeWarning, append=True) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 9a03bfb9155e8faba3248658fb6fc446f7a7245a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3444 zcma)8OLG*-5$@N#T5k{_@hk+3G$6Geusj435+D|ARuDp7))jU%t*O$enXc~Msv5+w zk`F8I(f>gTpZpK}1NH~(VZ(>M`h?Fu`Q*%=mQaNE;GXE5tgNi8eAQR|sISj8;EDe_ z^2dJ-7{)(waQM`KS%OzNmSHf18q8!?WD1K~Ch|7$Hnnr!i5%*%5-Ud~QKn^(Rao`U z2Cc9fbK$?*Il(L3dROE2yV@SCe`CZmj=^2tvuU+l`GaZTk30LltY^RPQ1igz<pa?E zy%AgA;-0-xzZjqcpgExa(U}BEUo<F&=nzPT_D>vu4UqLmCq<18gRIJj_so2^Vc6{y z?DR`_rz494(P?ppp2_zfVT1e(?gx<!MKv)>N5xrsR-B{fz+Nqvp8)xJdR|<h7sN$+ zQCy;za`{P+6H3HodO05tM`Pj&y^`~%fWJzw=KSgC3vrEJ6XSGTOwfs3b|$Ke>-4&~ zL2rmjIw_{;l<=r0rs=epp)+EZ&gOa}(VVzRZ;D&=Rz4n$z7)6V?VLXgnZHBth`aQz zxJU1ac{(rd)BEB9eIOR-f>@-B;vszqx+Zg?CAtLv=b|OCOqU_{rTs_z@qxMjgfH(I z2aqxDyc=QX`2xGZF8&2;?7TMWmx6yoE4XX?yEa!^k!S1cugHsVLk6<r{^{2q_p@@S zNDz0IMBOEmWLt(>^O%G&dDYQdNjyn56G^t(0#rA67&nzi9tA3FkgrzO-L?vveBN~l zA&ZNPBot{PHIaoohhj+<j$~ew>xuC#ty48WJ-xlX?WOrXULu?0^`jM@(t&O(zmYJG z!nv85!@2RUV+7qNsZ5$O5CR+{Q4lxV;LkXEFTF+*LnIoPt;;rdUC;9f#PaIp>-Enr zr$Hx50tOzku%RbfyfeEn{yvD>e0F@2z;Lb@&K>jacsyyMjs=8)ZG<sKGmSG~g9SQR zD7HBYFqL7fC#0wO2b~MQM?VPxAG^#Lq+N{7lR{3&82SQ&vD~@2vB|DpcVhNvVs@-6 z-!0|~gS)P~zQswRx47(<TyQ8agB(guR6E7OaYm+y;+(uate_X9;aiV9ZATGdNuw<w zp@9yQ*v0H?@&Mz7I(BO~b+in^U-VpezLBII88)}{Jeg?Jp^CG2$VP|!md7z{Pu6&- zKYH$b6gGIQ_&ixog9f-c=gmy!j=XsOcxCnVO5TGa0Z$p%K^Q5|{e+-cH?vAxM$o-C zk!@@R5)@WHnccb3!*lV3r#xmnZgk!RGKOAhz^Tcf5>N-;$MC9Ofb1Cia3BxNUErA2 zG+VYB(dG}Pwswp?fY_ELJ<ze4gNJg*_=CM`?b^GJc6O{i6R4e2XV0_^%jnMSSgh2t z)LXQ(W3zIrq@seav`qCO=gscE%wW|Yt<nG2ZWZkQy|7hk8S1B;cfik*`Wbm<08G?Y zGt<j##@~O!z%z43V$h#XAsInp1F4s?l1igcXZ_1cafx+akus5)9q~9T2PtMTv!QcA zb)ZPR|DH<)n%O{+{v$z21n*#R2@WUzrGaj2{mqbPV5|QuPHT})r(rr3#&Fc5Xo`K; zi9gJ4ZlN%L!A{H)Iepkv)4m_Zq4s@1jO-+|NuveuAi!+65rWs9Sum{512Ih3?6-SO z*LKbGR<8*^d!*pxD9ksoLGZzBRN>9b{|zvm5pC$a*id3<gFPtfF5ZoBTWJSwtI6(d zg=zgZZxIHq(6n2ITw|sE(hgwtuBprWl^s)8^P39`P+pZ~u%2gK_5$|_^Z)VI%ZQO8 ze<ax?4cSRG0$RG&Ars&4)`<u@q!F|goY5%RX32K!)oYm(g-U0(2vRwOX8V9-?l*{9 z-GY@7Jp!Fox4ZqWG6y+{?OwOC;o}<})vHn{=N0M_?2YWCUnKjOcfWxN)epq5EOW%{ zH_KK(WL;hX$;XF9Yji^Z$SpdfJ7x)2@wkT2pdUzZ419`AT*kBf=K1QAmv3GJTT43$ zG@eos40`-ScYPm*L;rKKvvSykcH?y?tNFeTb;Nx?8}NO`RYQg;HZ=$;z7J0NzPttw zcXc<~VZ>m{_5Gj?*eHP?JmR?k+yMzVP@ok!U}b$i^k9K;Fk6LT(1IPow^CaJQUOy1 zP;0@xr0RB7DIh7Uu5pzn0D9TLE6GzpVOC7lt68P!`OJpfGIO?gz%mD~6L}ik&Fr+T zvohlm*F38vc}xnNsVJ`UqgZ*}WzY+}K^64OU}1jcLxbllvdVfWcmk$+ez*1lXG3rz z8(dG4uY<U=#u<zoT4go-s_6FBz~cmvyYU$r2A+ly{~ER^fHmtcG>&Yqf%C-x-04|` ztK?Y_vxv*A!uV#;j`Vunl!I7@6|4)~Gni+90k41niN{nTM9E7SzsnC}P<cn^XF6}a zyqpsIQeHqpkX!_koz3k5ba5F6k(bv7J`oT;<W*EScWgtiXyE)CLc+Jv7ob5;hVeUy z9Z*Oo*gbgd(B9)mNnS=vJ<s#cpgd#r;;)%K=KnaZ=vDCL6!Fb40{3JcMDjY48%QRR zOd;`*Oe2{=f_Rr1at`^M$d?5aB2w}eO1?yL8^tzU;_?m-?;^Q}WF84Nle~}Q0g?qE zS+(dPB^Ocl5M{l`KE{+>LisY1M@SGl<r5?;NS-433du7h&w*r>C}}p~)|H4FSq*yn z1qh%4;JCzrzys<Aj1_Hh41VyckU0ibA3$vFh%aJt6xwleV6OtSS4XS8mU#kxRe+#g k0Di}`0Q9TC^&&Lkzcm6dHJGm%HYdzMn3=4=YU_mkUv)9fGXMYp diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-37.pyc deleted file mode 100644 index bfd8d898080e25e857a0ef308634062f6e9649cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 507 zcmZ8eO-lnY5KX_gTZ^IxMLfh~!S1#_iHKOe6a*>SQ$WJnq}||dHfFP8_doa#1P@;H z=D}anqy7QUo}6v1s1s&*?+q`^BuDkSjUeRX#>Hz6q4$g|0ysK^jCY_gL=el79LtkD zE06*!k|HaS5-XE3tB?w_h{dX;%ItI0s7)=+uM-}dI9=~gj2}td8w~n*6lvT`LQlp{ zy6GFE_FPxZ`pt#GiS#%vcbrb!X$iEQM``_pOUaFo&$uvYx)$=otGS{xVP>$q${YF| zcbrzbbsVXQ7GvMwPOH6(|JaiySmy2i34c7?y<h;R4SQOp)Cd!BN~g<|G9C}LP)0-& zgbJmJ4gl0Bz2Q2ZtKhgyM8H6|DfJRqQ3GE2!94WDw<{1sF5~R-I;F$KY(Oob-W4>S zk<P}NmCvqgLggx<nnK3L3xX!Qp2*ww$j`)C!XT1G+FiVv`)f2uO{Ug<7_lVa2c_)$ KR-qJg|IZh7nV<{+ diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-37.pyc deleted file mode 100644 index 9daf03f290002c2729c2acf986ad14db2ef123ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1265 zcmZ8h&5j&35VpH}eqyqtRg?qbfP7>mG7C9ySVd7nSRe<Yhz$}N33YnfHEEM>yJNd| z)2ktekOu*A;=+ly;0^l9iC5r6m3sz3EZJjMm+R;IKF_B|M}pxnzr6e1ml<P!(%~>t z+}y+ISGXv)W{Rt%=1sCrnsl8u**fD)T~nEwyy5GKnyT3www|i_Ia`XW--Lq~9r)l^ zxi$fuDeAlny7uDL|Ar8coxRWsyrj=M^m5yoGH7eO3{??i;Xsyn>Kah;5UcLxrk7vu zbBN1Imz7k|f>F{M2`__#2GDB@mvo8+$O`HfoR=T?4&4inahtXXOYs-SCYR|j)jn_g z+rvAXPS-)3+y^(Lv`h+LYF#GiM}yFz`2c4`D6kz1{Kv!{@7NECc`qbR?$}T1j{nT@ zEO4KV`(1(v@vA?+&=+82Au+l(&!pXa4`ujJI(Sw%RfG4^Ze{3OAY14h;!)tPb>P8- zf)GLvA#p^U_HneqBS?b|7jOtZh5=JrMY#$@Nx}YbS%HHX#z2W_3)ipYlS*ScPoR5w z|NOzjhq5!Vs9<Y^7*n`Q?O_!!E+>P~UK<|@Q-UL493eGKV@epNF&hxVW0}MJP|T3p zF8s>eb@c!H>?AbpNvqpiF<4#SQZIV*^5bnq#yE3CO<8wx(AUXZ`dYR9a2#wt0zd>} z#|xr~GO&r@(<I~96OlNwmc%>_`kmv9jDCWf1EYQslGnUn5St3wMAajM84KBS;XdMc z5iRLC`<AH;nVnqy{u!X&8f`%8EyAV|=zp2821SW-4h43&N4BgASCn|iuSCT2v_(Th z<jHQ|!Rgz9f|X?j<@1&Ns`Ei^;NTD=kSd5}V}pF$hYGcFTRz2rPe;a19ZBL;Zmg~2 z1vkN#pM3skIdN0mIs7|d!{Wa8;7Dm_&ROSXWW4ds*wGoO3F3z(ALfTbBa!2BMDE9X z0CId<@eRF?){%?Zf+t+?j4!ymf!0S$9?MwHhFP8~Tju#N9iM2F(<m&eEK(Qm{3jjp Y>tfFNoyMxJhP&4&7xj}RH&b!^55UT6s{jB1 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-37.pyc deleted file mode 100644 index 73d100fc9d151cbaa811aaa7804da48d4b90ca48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16842 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 bM5lQiNzbBrGDR*1ubSg2@;LrerNjRYm2kh1 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/api.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/api.cpython-37.pyc deleted file mode 100644 index 03417d60771c15aef35d48c2df9d0369ac6af49f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6448 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 OEvzoCEUpw*>F;~&1$=}6 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-37.pyc deleted file mode 100644 index 3c136909c9d86f8bc4f0d259823f50261ca20ddb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8299 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-37.pyc deleted file mode 100644 index 9e09ed669f093bb9bcf7307bfac221173376e819..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 590 zcmY*W&1w`u5bmDr>e3i5UOW~a#D&c)o)z&2gn)R^oC4BxrfYVZ%v4YMC&^qy$SdRx zJoz|Y=cp%N!IM3`lY<3aR2BVwRbSQH!$ZN6(f7w+esacsPsyDXDR`Zpf0~?Tr%ZEQ zw7e@$3(oLBADkEN2`;d>VK<yJz4*-5%lJOg2!|IDeeh+4E_m_vKNI4lF&;XrV~gN0 zL`NP%gU~yy(K*zhu~xAS@a_#v6s9(n3J7PBbc-dNH0ThF7na%qEFt{*cAF`txOTS7 z$qa>FRp)Alr4Yw83^syF=zY=94nED(ZUD<&xq;d`Q1HP}yasK2aONxqV+nG-Q<S*0 zK)N)}Qil{anY2;_RikK!xp|Uc$n0@7Tul={TSKt3;?%)ouUwMV4q~2APl9KW;!j#T zTk~<5vExe0P8pK&<9a#Xmr~nG%JETe`chsZY3uT~)2iHbx#>Tt4%44y?+k?>%&k&A zyT32Cq3gE^dt}H5)wW0aVxa5ibu$(7n@P8Kx7_Aimi;iUUhZ%A>S5yZ_mW%i2gQp2 E148t?g#Z8m diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-37.pyc deleted file mode 100644 index be7ffce2ff3ec5d914510598796f44c886268918..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1569 zcmZuw&2!sC6xW9>%d%|eJ5ETb+E9v1;<O0|4jqP}y>JNaOgZfgqmiw3yy<=@yQ@%h z;BVl<U%&|tocUY!$|+ZloOmnQ#gs_1Prvte_v!cBeebJoH*(<NzYM<nx#c*2T4(wA z0KSBwes>)wcaW32xkp{*A<wngr#|wrf7L)u+|1oQCvUv*P_V#Fz^!Ukh(a95zW@ic z%_0=B4(hNN#jK0EtcQB6kNRv4t+92q&Nk3SmAyqb*(Ta#TWE`Iqiwc>cGxc3t>!{H zV0&n9!D1inL+&>HfE}QNDi+a0c8Cru+@T+`d*~iZP{Qt``|JUF;5zsSeFWnn{umwM zN9Ym$1P}4!sgFLjXzHP3{s(UT<jUV5b4*YE$HcOJU&)ePmyRsEJ5}}QDSLwUD`su_ zbcONRJH~xrT(N|IuhH{W_V1V<;fKH;EO52#AHx^8PhE7J`>&nh`VZHU#MdQOT8$=x z6`78H{O=P*-_D3in8-_tlUc@did8~bA*4>~Eo4k6(es2T1(}jD*56~ylUH*+6FfOf zU{ADg&PUO$Eu5iiT9a8ObF9C)^&oI-%V^j(&FfNVY+5C+K~#Oxf|km}i(u`wOGz=G zh#Z^f66->Ww*<o?3+Cx~USvv{!K#;HenX_-40COE{@t@0A2v-0iHl4s$P1|CHEsdE z5`<UNssO>pGRW~%W|ttRUoA^#S{ErLN<%2P5Rioe3SVnU_~q9xhYb@x&nV5t6hvNR zMFC;cyC}7dEd9<)I2eiZ7i6M`k?g_I$i6je)~s98wx(%KU=1{-BSUL8zzmym(_-7S zvSUqbO&1K1X-|ZBL-185hpybSF<<W3`CV%UHt?BgrD-lEX=*wJDMslH=DCp4-jwmx z9FF-0OGN}v37-nnfCbV7M5V?2Z1FuejVmR%3E-3{8Q)2^QgH{%J0)9XP#9IVvr6Dn z3Zyr|^GcQ6vLd$a(#}LsiYFRas`ms|vO$QJrZX-H)r6<kX^!U_Y6z;2)P*(96!eC@ zJL40mng$gBn^P(>ZMwW<SdvMq=LPKQ!UBAW<-(0?rlY!idJAvSZKh!hMebXkv4zlm z_EMDbh%o&X=A&#p`PGr1TUplp{p?h;;uLP>gm9&ymQM2PIe+_fI<vuQEUxQx+1jUd zpN@*T37^%S{DnPw^#V-8i@mTF_^}_i!=T|F`v-39hA?7x;5Xd*joio!+$XM`tKTiJ Io(W;?KalLXkN^Mx diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-37.pyc deleted file mode 100644 index ec71d31dda49cbbfa0e834b992318dbc6cc3c00f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18744 zcmds9TW}=TS?->mn`TE^t@iF+JDtt0z1nDJZO1r?ya~3~acsw{IJWGyg`H7rPD>hT zW_tE?YgZbyNs)CC3a}vos(_+WT0$NOP(>bjAjJbO@CZD06;F8~1y2+_;7S4C_n+>b zi$?1>l?RGZ_37I=r_cHC|9}3YXD25s7Ji-Yo_goMzi3%M;!XN1<Kk%?;Rh&`wPYz< z<y!WVE$7@)PR`Dfqa2lQ<=cg&f^Fft&?>e|OQm*ssob7enrK&+D(yo{hiq%7DlMu@ z)f-mlY~J!GH!HejTl|wZQ%lvitWNGt>x-5us?xibD*1=+I!n{IFRKaMPssfdRZ)lD zwU%a7RZZf2RDDcMsl)HuOUF=iS{*^nBmQx;Jc0WebrknU{nExs|Ipq1(kXRJ9Y?Fv z>V!Ip^8@OXI*s!g<*GC4EP6Ss9#jwE$%88Qnl=0J-d|L-e{;(Zqp;Qpg3YEMR=zg! zt5mK9?XDL!SDLM6wBt4c<-1YfuK2FE(vr)q(07+j`&M(Mc1?PE$<xd3?Pj#@W}m3^ zzqS=MTcO)*cLN=T?y3&j?z*r2IX9G^8=m%8w_2usQma<^G0<f#{Mbf0Ysb@3Q14(| zxBPk->1Jnbwh&Kbqln8}y4Ce`=*JaYZFS6b@p^zqt$6DCR>a|7_qts)ZLsI`=iuUL z9O3&Yd<$e@kt9G4IpqL&d6icMoC^k(OGSgirBZ^ta)P`GL7lZ!0TPd>8G!$gI;xJL zWmO$lCvcurC)FvOr~Jd}w0huO>#n^tjcX!{*GF(I2*dS^ng+_;_|WyBvH7aOn)mO3 z#SQIsL)UYcGdL%2mx-o!v)yd)Er0;zJYGv*)+!Yjzr}UmptRXJ0Ehl|*KYtx(RvdY z>qNd@^%_2|+(0W|^COKwYt(7&NSAG|<E^n*5|rBwTFnLsYtC)f{MwwWeDu(6c6|5t zx*q}Q7+g}d;dMw>p&!k;Yrty<-}I$R6|}u(Cv<~VK1wOd^*T!KP5Xfv1-iM`?0BuL zX0Wn>0lJuh_C0ku=(KifX6~(~-$`DC-JlaTNz|)>#-Lg)v;lR<5cu7We;Z`#Vb-C0 zs|ld4`B5DY>&e55v&%9jfl^odY|H_+U67d$y1MB_KEM1{uqB=1;R?ub$Gz=g5YnBQ zOVZ;q;k622DFCJw+^$KhMh=9@AJ06l;Rsz6yY{YCx0)78JId`^8`g$%*WSqEzMw47 zkG(KkjB|AzR|m(f3uqfVAd$EjHZWd4&PO|4e>NBA!7ZzCDWR=Dwe%5G{or#~qIUO6 zx7oc6tVCX`by?lq>1;o?y3U7k)PX-0=qo8zUNI93Yu%l=T(37f&8S|#fX>1q3d=6y zuXk*KxNB*p1{t0|o_WZ0*@_c1ld|;`?q_X%7$+H{DQ0jRmx(6M=MwHh0p7@`(h5VL z${@?GBYw=@$N`#;`D9+8rm1Fhm7ghg{HPT)?l*|_AdD{GZxF07eh^ezyVjm{FPrfR zJUQTFM>!$G1a%;w&Tbza`0mFB;XI~pHUtNaN;m}Mi?|S)viBel@7duALt(F35hx6_ z1_gTBqLh3ucgKzj=IvekPA)3$<~B;8&fG>B#{`ZFjzeq3yEdSiUx@QBV2HiKR<wHg zGZ5}&zXL@>p<WdT$EAeDVh6(&cx#T$;DEHCCsD+CXsY$N2x0HF!?*z5ra^A2+FNUb z&1W5<k2p_wNUhLUqtsF*JfM79b@0Qd&}m5gTh5eS&K<L>xtu*?_fCxhFl~@QZira( z=s<C%xrIgf-T`<!+zjhmom;+ct~RNjp5f;cf;}_%$&q^FB?1YA5`mc6EOw8{b#Ak0 z=+`l%`v5BGLnvl*32-`I+aCo=W!(!Cne^Pim`)6isb6KGLEP{+L_hqL8O>f!#^T61 zcMpFlPYFB8n9iWK8JNMEK92`+3G&d}YDN17NURwefw`9fZD@e~DnsMT_?%oE0Z(`B zZ@?hLh@9SaBekG8T};pI1a8Y;YevmB1i4GQhnhk(V;jmWP*1s@Qf@PHSG>li+gx>b zf-M&UT)9EVuk}86%_zlGiG=IHR*SNo%^>8(Ucx1aK>MmmrRu9>S{G**z!*mtg6PF| zw*?suRjj_Cb)ZwSb~gQ;*tzAk_5p`ons2_80VmfR0#3im5O9dVYivU%*cFwsYhQ)c zY!GJe$4~(S0NYVdm_lUm$pdD!z`hd-|HL3Q9Z-Kfe~l^wq37|+;4rCRKxcntU;slb zHd1fs!x_o!m&%_&e+O`Pb&$0wOwGh|!_s81(og%*lLvqF@Q50CbKtu}^Bt-8(|-D3 zEu>w1>g|EgO%LLiBADjLQCb5OIrVy6sn^?q+G_E-TCd;S@><E8QoXK%M!l|&qCb6% z1wX7gaea;j;jU><=to$5k_A<*uAzv_G{1Zu?dU6fMqMbw8z565SkkJVKyeyJ_z;S6 zC7&x7%8vX^v8*`dJkQm9H7|7=sFwXm8c*X0FQWMAya%w-L|iq%5gXL+{Y_@ouSZdr zUeybWi?3Yw!w{zRIK#dMera}A1L&;f#1O94YPZ+D=oj5*y|CGUk+w7E!k7;rwP?(W zL!?~xn;Es@i1B6UYiJ=D%Vs>81$^7v8E_Mp*&k#SoPz*Oq~G@aY*b2jO8$DH4ST<O z-P?rla|b6cGIco<yfRx_?a8$0waklxPlr8^4#t29{t2vcuNABXTcHb=Qtu@8c-l~= z#r`N+%ZY>x6Gf;+3k{1gA-{EEmuR*Mz2k!e|A-drr_sX!k|Ix32HAJ)-jSj2@a>Sw zcTn{jt52h#iruq!VW1)UkjUwr=GWp1gj%9|(pgfg4sd}mz-RdkM=F?44t>4f$HHt$ zKgPO`v!Jb{pI{+O`WaqHPkk8ndF)BN^>BogpydL1tW<V1pJwWZP6-VsnHYP64Gz2W zZcb0bcC^D|)Y0&Aps(*Zk;7*jd0fL5-7D<ocb$7V0Kn++fBV9Aq&;|mB<{o$F<}Qj zNXeY;Z2)32TKXkVCnT4U+lHs-lg2}F4)<awh~OMH$ey|hcg}MYH#^L_niXP8dP<z4 zc^CZZ2Ddw@pBkp_xoaHO;WmaB=UwB<e@aBcs|kk=Hi%~u+uv)!`ZulU_myD6cu}PF zJb)>ZO8_1_?QktV>>CKx6X+nC;$Xs>6cv}#Zej;RXAzFjOnhRbeI4N$w7-SsAq^|5 zRDp*FJm;#meiru`0Xw+iaScc4q5z(WQy3c{;~dF&H@BC&XYD!kIv_1`y$ylPD;nAY zu?WNs1{~}JeF>AhCODLYtU@~bVr4BSIDm@{Ik7<V%tS=yp(VQhJln}f;-bOftP%F{ z5n3h&NQuM{6{Bgd!V>#DP6lYU9)-~n+7v@gzlqw$0WOy9imji=eS<{LAFUc50+?^$ zV$Hgf-+p7)dd_-h;Z9+<umM1AI{JZ|aHf>KIiYK?&<Zg29bLmSfD6x_-F5IRhiA{? zS$>aqHlN_IRvm)(X61&p?e6B$@2R()JGnc~9SG^YJbH5=M;z2xxsi(O&DT4K&@kd; zX5y~wxYW{fyhyBbH=y=_%5l@k4MR2b&B6rAM!y-zlF=G1-_sXo5hV)UFJJ7;8ZELg zTQFvS(e$Iw0t#^v$VPA>E=VH~b`tg@xr#WW2VkmJqzYZBFfN+$jw0o__S+b4ikFog zu|~d)E<&0ZRv{0>RBXC^=6E1CZR_iJ)8Om$M}O~W93p~;^*%j`_^6rdwV<<#fLJ7k zd+)o8jC#6=cDm7R#?d4O3nAr2Zrk@0aiyCGnKeB(gsz2S2tNVAx4s~AF>eE|*P+^L zpfL$T)qtfW8r5iRA!utrD36E<e07Zhy?z)EZb&=8P?GO7QXJ&R3i)wTo!0#K2n4D} z$aCHgLCL`b{=$DjF$ASgG1!h6DPpUtDACoDD&t&K6RLu9NgYyEoXcubP2oJD4y$RL zD-v6^4vwv=CnUCNFCG4-wQ5UjwY)T)1j3IXHtV978TD~>4(Fp%=M(DuyXB>0a(zKP zjO*j-7t|x_BF1+@J*j5ZC0w0UpHy>bb4p!SHJneYE9z04A5f2}$8kRMO{lM>v%vnR z<0Jd@f%gNzXe6}W^1|>bazM&kLuv*LwiP879IGghkw~a4D4X!sqC{#LvGx0^%)Jf8 z2QvzO>j0n9eN6-*x&)7g&|yu4L4^jTcNKIVi4vOFp&N@JeX|3p8wPE3De=?LZNo4$ z#$cvR(<KG=D?KHBXU}OgZgsf?AaikPp(CJ=uO|~pfd<m`>3m1xa&uaoJGFHdjK&pA zz19xE7d;ZX8(U#SJ5s*e7+Sy(=?`Tk4U+ML^ORq6pMk*2pdkw#iGzMS(3{d#01PBS z=#^mGXp*!q=zVw@x0-b1B`gXcNyvJ6Ig@kCP&a;U&2ZN8^2;|~8F(cKSYCd<+42XT zCa`$D(`t&Tto^mEmZ$reodd2wGYwJ?iKp9aY(kns<|R#QHN=;72gdLGyg&{h_B3#r z!CSB`VyF}7HsJ^%{Mf8u6;fe9AU9~0@y9c5w`(}W*V&nZ%Aj@c?B?$wMw+)G8_Qtl z%re+6?65ae74oC!fWFHzA4sc<v&rXMSo}!{0&we+5)i^aKx_#*V7m9k7mSjibqi5? z56cT{Kq(eH3@wXWvjwVMBmJg&3u06BRMt})aiu0gE2+{-z{igafiQzxs;uUOHVH9< zShiR|@cd|<p`UsusH-hFaSbqE7?;1~@0hSn!9=S?Wjzcq>P&Bq=qRx*{+fU$#H~`! zp2A=6c*-9cwNUsE+0P|Z{}LP0?H41VtS>T_O+4)(%5~42VFsxDdwDKbicOu19N5`c z5!Xe;`%b<yg=j8pu~irZ?;8ud2rS#M%<_<Lh2CHGF$%Twe;A`g4Sx%LV8av201t<T znq2@MS3o{o-T)tK0y3V4dc=ANP1}a3>Uh$K)bzH3$tTyaTx2amusg@r#Z7SGS{U1n z5%k6mn*ANBi0xp(5<Ck-8AeBL3WmoxG^2hNpP{Pd(O?IRSZtpng74a}=Blvc><#-3 zESu2ABXVIp|85^yv@8%c3{#9@&1y?S`op5;D=&h6fV`u9C!)+uJIq)n3mAwEl062y zAROR<p&@bDk;DY~73vr<XCl9i`(b{`^NpBrsdxG^<}(VdGHY?rF=s5sauM9{z<zE> zD`v2wk>=nKp=H9obTaM%T7Zn*yW5A%Sg5#=D53yH0h0NW83^tJkWpX^1A>cg{ES}0 zKxfAXG4mYVk2rl|-YWJ^?4LZVWE21BMDlxmP!NpSn8h|dfJ{s!63ov^CkfQ=M<x0# z%vh77?nfk*{-FOARr_Rec0Z*0RWo>f7@@q|ht2_z$w*}%P(Bi^3<G48QuHqo7Vi)i z;|Zl`zWyHsK|(60_5;9F$|lc><dOzkQGRVdlu48sBT*n#pbSRj$_U8-tQ@aV?gvl| z`RKBI-i@Flk$+;uvzr0QcsJSOeUfDuKpCA53KqwZOeTr%M>i8B1{wKJIQvYxoY@bx ztY!wd52Kp@>{HEn;ABLz4=x!zGDuLs&|(d4)AnN)!{szLhrwQVd0D~Ay0~xLv&$w) zLHxw5w_9GP*=l)icL&Q@ox~nrbpc)1pr`9Kb!wLrM?;7hK!TyALCFqq3z^md&;!V{ zAmBijRYIku-pPIAu1TE?)+A73=Ni$(cs_z7_V&XWp+124Q4WC)d$XjccClj3I|+77 z-GKEY;{Ng1k%q*iCbM|Q7?B8gf=|4RB<&<|w+V4Xctrk)#qa_?n=ZbUl1PUhr?RT- z7AqK%#WKZdG7@g(@-X8n_O#u5X#aEvoBUj7{pg3xTEaAGh+%Nf48G{WITxhr*cn%3 z`11b5nE8&8!u<y0XUo8v;P{CQ#}^HbCCqgx!FEw!V$63G<BC}u`QEKp69Z>aZy|?C z(utA)%&7H02!V`E(&o>@w(;EnM51pu!_?6tU!>u~l^|$k%@!7)KZtO&N2rb?n(1^z zDd9XsK+<ZliX@z4cAlhjZa?XaHXL#ZGN$2DaMQZuY(Jd=^a%vdk;JiC4$trAg?Vyd z9>x~S;gfg*Cfeka{Dwm}ZzF%zx=D5-aC5yME@CkUwxgJjFm<=MMom-lU|$Z_V5S+| zZVO3X8O#DKjK4B0jRvHmh@$~Z!)Tc_W|noLktl~{bPi-tc%?|9gv{zP*x2W7A$D3B z#vV<q`OHy>D{N~V>9N?8q$Ae(WQMg8u$G nOeXRSgY*V!Noj8hNO;iISvFQM3( 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-37.pyc deleted file mode 100644 index 09931aa541a1cf1560621fdf7f2985b1d3a30402..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5462 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/help.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/help.cpython-37.pyc deleted file mode 100644 index 922b6ff817df7737110358b93d02314d2e6cd947..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2643 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 G_5T2De%fFF diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-37.pyc deleted file mode 100644 index 82e25d55d0a1d18ca263f5ea8354fd5aebbd229a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 937 zcmY*YO>fgM7`F4(%%VsjBsd^sB!pCHOX0#{OcNhFAPsGZPC}YArC#i|R?{T4y|GRy zm+j1jKLFyyk-w8Gzk$n6y!KkQz0vc=dHwoHp2yCccAFrG;^%{dzaBz=?87qP8NCAN zN02z$M;s6FKIR_x&(Xfe10KTN=TQ%JTBpB>64N80jZQ{oIo9OMjUZ%iBsHCs{3sW+ zQsuGaLQ^vmG-DMzl({q#3WHL);>QIUb!1e}v=Nhpkk`jd=IjtS+{8K|{k{^qDhn<8 z{dGbi_JDL*qeD>$#f;!|pvnnlbitgECSEpWAn<=!*>3^*HY5&m&yhh}=nR8Qe<#C> zM%xwudH{VFl0-E+AaguKHU8#JgC6>Yl<n$xjh8%YLUAk#<0>v)yzH7u)vaW;CJSv? zp0DxgtT=f-7}=sj3QKsYx=U-jPIOYuF31L#naRpYwP|0j?TaFG`k0FWJIYOZ*|?FH z8O!x%a@F0zP55qice{7>C6}WR7@GEt^>>!c2&)*znGeZE1hC?_0r~@^8ds4-b6n%^ zV8ah=N9w(S%<-A0p4M=5=J@1EjknOj!+B5#wKu@E{}s=}I^^DXMXlE1+?%d`LbYd| zK7Fwzb;V3Jf>XiVZc{5+mIYHYS{6_oO7MqPQe=Xb1In3UNfW0jXwK7g2aNZJ!ZfWB z)65vvi5h<_W=-hKX;$nlwTqf){F$ktZUS3sh;z@)Tr+9m&*Gz8%Y7^V9wg+&nBV{q w0dC<KE@k&+rxP@-H05QMrm6)6=cAjtMr}7wIsSO#@(<Z;LrFWEapcF*KS)0GqyPW_ diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/models.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/models.cpython-37.pyc deleted file mode 100644 index 64e33b4518be8337eaada6fc6d715e742e05fe81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24065 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 W9NGvX$<@fdkrzh4V0^(i^M3&AWa4xH diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-37.pyc deleted file mode 100644 index 701ba2c89069dd670ff78699aadf7f01c882507a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 467 zcmYjMJx>Bb5S_gR?mUHHBhuJYaKuPSh%uIi#)9M$ayi*SR+jtNy;GpDA^s1ImA}CM zvaOYW!OA^8jFZfp*_U}UZ?CFV7feL&r=w2`;H!A-qhgv%lj_+314ab+ut=D74Wp?~ z7)8<m-$IJknqX-SNP4ii!7{=_WlhXf-?!05Yi6kd+OG~;tki%vBD;n?V029wd9j+{ zyM+SnCKQ#G(QQBv((Vw_+R)s+g;wR;cz{8RYCD%g@Vg6L;w%caJ)VY=VYWI-c;W?* z7_nG-ns}?T|AfReN0lir3CFYW9+lTR)Ko2%ws(xKZ?(vRJ>v!epC_@*f<RY9JPw7@ zCBapu?Rm^{fl5=;Xjf&S%+wRlrkV<jbS;k(i4(ps%gn$B$YbMv13&#vHcvXnTboBl vCq$d2%V=>vnHJ<GcfaWDO?UoGCrj=0wzvDltW-4vPT3_6snI$)A$9T#w-AX1 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-37.pyc deleted file mode 100644 index 8c51a56ac7134ed710e15ba3d5de8d22c3699948..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19385 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 AK>z>% diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-37.pyc deleted file mode 100644 index 1ab9b4fe5603a8071c565f92eb0d3f1e256f6d69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4123 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 Q-)(FsPs}P8DqeZ~e?u27jQ{`u diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-37.pyc deleted file mode 100644 index 5a23ace032a2816e8d12cab52a99629508d828f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4336 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 QfVxUeEr92&xpzMO5803!j{pDw diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-37.pyc deleted file mode 100644 index 07aa93db857626f3c84ab17b3a796bec362d8d66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21996 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/__version__.py b/env/lib/python3.7/site-packages/pip/_vendor/requests/__version__.py deleted file mode 100644 index f5b5d03..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/requests/__version__.py +++ /dev/null @@ -1,14 +0,0 @@ -# .-. .-. .-. . . .-. .-. .-. .-. -# |( |- |.| | | |- `-. | `-. -# ' ' `-' `-`.`-' `-' `-' ' `-' - -__title__ = 'requests' -__description__ = 'Python HTTP for Humans.' -__url__ = 'http://python-requests.org' -__version__ = '2.21.0' -__build__ = 0x022100 -__author__ = 'Kenneth Reitz' -__author_email__ = 'me@kennethreitz.org' -__license__ = 'Apache 2.0' -__copyright__ = 'Copyright 2018 Kenneth Reitz' -__cake__ = u'\u2728 \U0001f370 \u2728' diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/_internal_utils.py b/env/lib/python3.7/site-packages/pip/_vendor/requests/_internal_utils.py deleted file mode 100644 index 759d9a5..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/requests/_internal_utils.py +++ /dev/null @@ -1,42 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests._internal_utils -~~~~~~~~~~~~~~ - -Provides utility functions that are consumed internally by Requests -which depend on extremely few external helpers (such as compat) -""" - -from .compat import is_py2, builtin_str, str - - -def to_native_string(string, encoding='ascii'): - """Given a string object, regardless of type, returns a representation of - that string in the native string type, encoding and decoding where - necessary. This assumes ASCII unless told otherwise. - """ - if isinstance(string, builtin_str): - out = string - else: - if is_py2: - out = string.encode(encoding) - else: - out = string.decode(encoding) - - return out - - -def unicode_is_ascii(u_string): - """Determine if unicode string only contains ASCII characters. - - :param str u_string: unicode string to check. Must be unicode - and not Python 2 `str`. - :rtype: bool - """ - assert isinstance(u_string, str) - try: - u_string.encode('ascii') - return True - except UnicodeEncodeError: - return False diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/adapters.py b/env/lib/python3.7/site-packages/pip/_vendor/requests/adapters.py deleted file mode 100644 index c30e7c9..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/requests/adapters.py +++ /dev/null @@ -1,533 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.adapters -~~~~~~~~~~~~~~~~~ - -This module contains the transport adapters that Requests uses to define -and maintain connections. -""" - -import os.path -import socket - -from pip._vendor.urllib3.poolmanager import PoolManager, proxy_from_url -from pip._vendor.urllib3.response import HTTPResponse -from pip._vendor.urllib3.util import parse_url -from pip._vendor.urllib3.util import Timeout as TimeoutSauce -from pip._vendor.urllib3.util.retry import Retry -from pip._vendor.urllib3.exceptions import ClosedPoolError -from pip._vendor.urllib3.exceptions import ConnectTimeoutError -from pip._vendor.urllib3.exceptions import HTTPError as _HTTPError -from pip._vendor.urllib3.exceptions import MaxRetryError -from pip._vendor.urllib3.exceptions import NewConnectionError -from pip._vendor.urllib3.exceptions import ProxyError as _ProxyError -from pip._vendor.urllib3.exceptions import ProtocolError -from pip._vendor.urllib3.exceptions import ReadTimeoutError -from pip._vendor.urllib3.exceptions import SSLError as _SSLError -from pip._vendor.urllib3.exceptions import ResponseError -from pip._vendor.urllib3.exceptions import LocationValueError - -from .models import Response -from .compat import urlparse, basestring -from .utils import (DEFAULT_CA_BUNDLE_PATH, extract_zipped_paths, - get_encoding_from_headers, prepend_scheme_if_needed, - get_auth_from_url, urldefragauth, select_proxy) -from .structures import CaseInsensitiveDict -from .cookies import extract_cookies_to_jar -from .exceptions import (ConnectionError, ConnectTimeout, ReadTimeout, SSLError, - ProxyError, RetryError, InvalidSchema, InvalidProxyURL, - InvalidURL) -from .auth import _basic_auth_str - -try: - from pip._vendor.urllib3.contrib.socks import SOCKSProxyManager -except ImportError: - def SOCKSProxyManager(*args, **kwargs): - raise InvalidSchema("Missing dependencies for SOCKS support.") - -DEFAULT_POOLBLOCK = False -DEFAULT_POOLSIZE = 10 -DEFAULT_RETRIES = 0 -DEFAULT_POOL_TIMEOUT = None - - -class BaseAdapter(object): - """The Base Transport Adapter""" - - def __init__(self): - super(BaseAdapter, self).__init__() - - def send(self, request, stream=False, timeout=None, verify=True, - cert=None, proxies=None): - """Sends PreparedRequest object. Returns Response object. - - :param request: The :class:`PreparedRequest <PreparedRequest>` being sent. - :param stream: (optional) Whether to stream the request content. - :param timeout: (optional) How long to wait for the server to send - data before giving up, as a float, or a :ref:`(connect timeout, - read timeout) <timeouts>` tuple. - :type timeout: float or tuple - :param verify: (optional) Either a boolean, in which case it controls whether we verify - the server's TLS certificate, or a string, in which case it must be a path - to a CA bundle to use - :param cert: (optional) Any user-provided SSL certificate to be trusted. - :param proxies: (optional) The proxies dictionary to apply to the request. - """ - raise NotImplementedError - - def close(self): - """Cleans up adapter specific items.""" - raise NotImplementedError - - -class HTTPAdapter(BaseAdapter): - """The built-in HTTP Adapter for urllib3. - - Provides a general-case interface for Requests sessions to contact HTTP and - HTTPS urls by implementing the Transport Adapter interface. This class will - usually be created by the :class:`Session <Session>` class under the - covers. - - :param pool_connections: The number of urllib3 connection pools to cache. - :param pool_maxsize: The maximum number of connections to save in the pool. - :param max_retries: The maximum number of retries each connection - should attempt. Note, this applies only to failed DNS lookups, socket - connections and connection timeouts, never to requests where data has - made it to the server. By default, Requests does not retry failed - connections. If you need granular control over the conditions under - which we retry a request, import urllib3's ``Retry`` class and pass - that instead. - :param pool_block: Whether the connection pool should block for connections. - - Usage:: - - >>> import requests - >>> s = requests.Session() - >>> a = requests.adapters.HTTPAdapter(max_retries=3) - >>> s.mount('http://', a) - """ - __attrs__ = ['max_retries', 'config', '_pool_connections', '_pool_maxsize', - '_pool_block'] - - def __init__(self, pool_connections=DEFAULT_POOLSIZE, - pool_maxsize=DEFAULT_POOLSIZE, max_retries=DEFAULT_RETRIES, - pool_block=DEFAULT_POOLBLOCK): - if max_retries == DEFAULT_RETRIES: - self.max_retries = Retry(0, read=False) - else: - self.max_retries = Retry.from_int(max_retries) - self.config = {} - self.proxy_manager = {} - - super(HTTPAdapter, self).__init__() - - self._pool_connections = pool_connections - self._pool_maxsize = pool_maxsize - self._pool_block = pool_block - - self.init_poolmanager(pool_connections, pool_maxsize, block=pool_block) - - def __getstate__(self): - return {attr: getattr(self, attr, None) for attr in self.__attrs__} - - def __setstate__(self, state): - # Can't handle by adding 'proxy_manager' to self.__attrs__ because - # self.poolmanager uses a lambda function, which isn't pickleable. - self.proxy_manager = {} - self.config = {} - - for attr, value in state.items(): - setattr(self, attr, value) - - self.init_poolmanager(self._pool_connections, self._pool_maxsize, - block=self._pool_block) - - def init_poolmanager(self, connections, maxsize, block=DEFAULT_POOLBLOCK, **pool_kwargs): - """Initializes a urllib3 PoolManager. - - This method should not be called from user code, and is only - exposed for use when subclassing the - :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. - - :param connections: The number of urllib3 connection pools to cache. - :param maxsize: The maximum number of connections to save in the pool. - :param block: Block when no free connections are available. - :param pool_kwargs: Extra keyword arguments used to initialize the Pool Manager. - """ - # save these values for pickling - self._pool_connections = connections - self._pool_maxsize = maxsize - self._pool_block = block - - self.poolmanager = PoolManager(num_pools=connections, maxsize=maxsize, - block=block, strict=True, **pool_kwargs) - - def proxy_manager_for(self, proxy, **proxy_kwargs): - """Return urllib3 ProxyManager for the given proxy. - - This method should not be called from user code, and is only - exposed for use when subclassing the - :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. - - :param proxy: The proxy to return a urllib3 ProxyManager for. - :param proxy_kwargs: Extra keyword arguments used to configure the Proxy Manager. - :returns: ProxyManager - :rtype: urllib3.ProxyManager - """ - if proxy in self.proxy_manager: - manager = self.proxy_manager[proxy] - elif proxy.lower().startswith('socks'): - username, password = get_auth_from_url(proxy) - manager = self.proxy_manager[proxy] = SOCKSProxyManager( - proxy, - username=username, - password=password, - num_pools=self._pool_connections, - maxsize=self._pool_maxsize, - block=self._pool_block, - **proxy_kwargs - ) - else: - proxy_headers = self.proxy_headers(proxy) - manager = self.proxy_manager[proxy] = proxy_from_url( - proxy, - proxy_headers=proxy_headers, - num_pools=self._pool_connections, - maxsize=self._pool_maxsize, - block=self._pool_block, - **proxy_kwargs) - - return manager - - def cert_verify(self, conn, url, verify, cert): - """Verify a SSL certificate. This method should not be called from user - code, and is only exposed for use when subclassing the - :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. - - :param conn: The urllib3 connection object associated with the cert. - :param url: The requested URL. - :param verify: Either a boolean, in which case it controls whether we verify - the server's TLS certificate, or a string, in which case it must be a path - to a CA bundle to use - :param cert: The SSL certificate to verify. - """ - if url.lower().startswith('https') and verify: - - cert_loc = None - - # Allow self-specified cert location. - if verify is not True: - cert_loc = verify - - if not cert_loc: - cert_loc = extract_zipped_paths(DEFAULT_CA_BUNDLE_PATH) - - if not cert_loc or not os.path.exists(cert_loc): - raise IOError("Could not find a suitable TLS CA certificate bundle, " - "invalid path: {}".format(cert_loc)) - - conn.cert_reqs = 'CERT_REQUIRED' - - if not os.path.isdir(cert_loc): - conn.ca_certs = cert_loc - else: - conn.ca_cert_dir = cert_loc - else: - conn.cert_reqs = 'CERT_NONE' - conn.ca_certs = None - conn.ca_cert_dir = None - - if cert: - if not isinstance(cert, basestring): - conn.cert_file = cert[0] - conn.key_file = cert[1] - else: - conn.cert_file = cert - conn.key_file = None - if conn.cert_file and not os.path.exists(conn.cert_file): - raise IOError("Could not find the TLS certificate file, " - "invalid path: {}".format(conn.cert_file)) - if conn.key_file and not os.path.exists(conn.key_file): - raise IOError("Could not find the TLS key file, " - "invalid path: {}".format(conn.key_file)) - - def build_response(self, req, resp): - """Builds a :class:`Response <requests.Response>` object from a urllib3 - response. This should not be called from user code, and is only exposed - for use when subclassing the - :class:`HTTPAdapter <requests.adapters.HTTPAdapter>` - - :param req: The :class:`PreparedRequest <PreparedRequest>` used to generate the response. - :param resp: The urllib3 response object. - :rtype: requests.Response - """ - response = Response() - - # Fallback to None if there's no status_code, for whatever reason. - response.status_code = getattr(resp, 'status', None) - - # Make headers case-insensitive. - response.headers = CaseInsensitiveDict(getattr(resp, 'headers', {})) - - # Set encoding. - response.encoding = get_encoding_from_headers(response.headers) - response.raw = resp - response.reason = response.raw.reason - - if isinstance(req.url, bytes): - response.url = req.url.decode('utf-8') - else: - response.url = req.url - - # Add new cookies from the server. - extract_cookies_to_jar(response.cookies, req, resp) - - # Give the Response some context. - response.request = req - response.connection = self - - return response - - def get_connection(self, url, proxies=None): - """Returns a urllib3 connection for the given URL. This should not be - called from user code, and is only exposed for use when subclassing the - :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. - - :param url: The URL to connect to. - :param proxies: (optional) A Requests-style dictionary of proxies used on this request. - :rtype: urllib3.ConnectionPool - """ - proxy = select_proxy(url, proxies) - - if proxy: - proxy = prepend_scheme_if_needed(proxy, 'http') - proxy_url = parse_url(proxy) - if not proxy_url.host: - raise InvalidProxyURL("Please check proxy URL. It is malformed" - " and could be missing the host.") - proxy_manager = self.proxy_manager_for(proxy) - conn = proxy_manager.connection_from_url(url) - else: - # Only scheme should be lower case - parsed = urlparse(url) - url = parsed.geturl() - conn = self.poolmanager.connection_from_url(url) - - return conn - - def close(self): - """Disposes of any internal state. - - Currently, this closes the PoolManager and any active ProxyManager, - which closes any pooled connections. - """ - self.poolmanager.clear() - for proxy in self.proxy_manager.values(): - proxy.clear() - - def request_url(self, request, proxies): - """Obtain the url to use when making the final request. - - If the message is being sent through a HTTP proxy, the full URL has to - be used. Otherwise, we should only use the path portion of the URL. - - This should not be called from user code, and is only exposed for use - when subclassing the - :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. - - :param request: The :class:`PreparedRequest <PreparedRequest>` being sent. - :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs. - :rtype: str - """ - proxy = select_proxy(request.url, proxies) - scheme = urlparse(request.url).scheme - - is_proxied_http_request = (proxy and scheme != 'https') - using_socks_proxy = False - if proxy: - proxy_scheme = urlparse(proxy).scheme.lower() - using_socks_proxy = proxy_scheme.startswith('socks') - - url = request.path_url - if is_proxied_http_request and not using_socks_proxy: - url = urldefragauth(request.url) - - return url - - def add_headers(self, request, **kwargs): - """Add any headers needed by the connection. As of v2.0 this does - nothing by default, but is left for overriding by users that subclass - the :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. - - This should not be called from user code, and is only exposed for use - when subclassing the - :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. - - :param request: The :class:`PreparedRequest <PreparedRequest>` to add headers to. - :param kwargs: The keyword arguments from the call to send(). - """ - pass - - def proxy_headers(self, proxy): - """Returns a dictionary of the headers to add to any request sent - through a proxy. This works with urllib3 magic to ensure that they are - correctly sent to the proxy, rather than in a tunnelled request if - CONNECT is being used. - - This should not be called from user code, and is only exposed for use - when subclassing the - :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. - - :param proxy: The url of the proxy being used for this request. - :rtype: dict - """ - headers = {} - username, password = get_auth_from_url(proxy) - - if username: - headers['Proxy-Authorization'] = _basic_auth_str(username, - password) - - return headers - - def send(self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None): - """Sends PreparedRequest object. Returns Response object. - - :param request: The :class:`PreparedRequest <PreparedRequest>` being sent. - :param stream: (optional) Whether to stream the request content. - :param timeout: (optional) How long to wait for the server to send - data before giving up, as a float, or a :ref:`(connect timeout, - read timeout) <timeouts>` tuple. - :type timeout: float or tuple or urllib3 Timeout object - :param verify: (optional) Either a boolean, in which case it controls whether - we verify the server's TLS certificate, or a string, in which case it - must be a path to a CA bundle to use - :param cert: (optional) Any user-provided SSL certificate to be trusted. - :param proxies: (optional) The proxies dictionary to apply to the request. - :rtype: requests.Response - """ - - try: - conn = self.get_connection(request.url, proxies) - except LocationValueError as e: - raise InvalidURL(e, request=request) - - self.cert_verify(conn, request.url, verify, cert) - url = self.request_url(request, proxies) - self.add_headers(request, stream=stream, timeout=timeout, verify=verify, cert=cert, proxies=proxies) - - chunked = not (request.body is None or 'Content-Length' in request.headers) - - if isinstance(timeout, tuple): - try: - connect, read = timeout - timeout = TimeoutSauce(connect=connect, read=read) - except ValueError as e: - # this may raise a string formatting error. - err = ("Invalid timeout {}. Pass a (connect, read) " - "timeout tuple, or a single float to set " - "both timeouts to the same value".format(timeout)) - raise ValueError(err) - elif isinstance(timeout, TimeoutSauce): - pass - else: - timeout = TimeoutSauce(connect=timeout, read=timeout) - - try: - if not chunked: - resp = conn.urlopen( - method=request.method, - url=url, - body=request.body, - headers=request.headers, - redirect=False, - assert_same_host=False, - preload_content=False, - decode_content=False, - retries=self.max_retries, - timeout=timeout - ) - - # Send the request. - else: - if hasattr(conn, 'proxy_pool'): - conn = conn.proxy_pool - - low_conn = conn._get_conn(timeout=DEFAULT_POOL_TIMEOUT) - - try: - low_conn.putrequest(request.method, - url, - skip_accept_encoding=True) - - for header, value in request.headers.items(): - low_conn.putheader(header, value) - - low_conn.endheaders() - - for i in request.body: - low_conn.send(hex(len(i))[2:].encode('utf-8')) - low_conn.send(b'\r\n') - low_conn.send(i) - low_conn.send(b'\r\n') - low_conn.send(b'0\r\n\r\n') - - # Receive the response from the server - try: - # For Python 2.7, use buffering of HTTP responses - r = low_conn.getresponse(buffering=True) - except TypeError: - # For compatibility with Python 3.3+ - r = low_conn.getresponse() - - resp = HTTPResponse.from_httplib( - r, - pool=conn, - connection=low_conn, - preload_content=False, - decode_content=False - ) - except: - # If we hit any problems here, clean up the connection. - # Then, reraise so that we can handle the actual exception. - low_conn.close() - raise - - except (ProtocolError, socket.error) as err: - raise ConnectionError(err, request=request) - - except MaxRetryError as e: - if isinstance(e.reason, ConnectTimeoutError): - # TODO: Remove this in 3.0.0: see #2811 - if not isinstance(e.reason, NewConnectionError): - raise ConnectTimeout(e, request=request) - - if isinstance(e.reason, ResponseError): - raise RetryError(e, request=request) - - if isinstance(e.reason, _ProxyError): - raise ProxyError(e, request=request) - - if isinstance(e.reason, _SSLError): - # This branch is for urllib3 v1.22 and later. - raise SSLError(e, request=request) - - raise ConnectionError(e, request=request) - - except ClosedPoolError as e: - raise ConnectionError(e, request=request) - - except _ProxyError as e: - raise ProxyError(e) - - except (_SSLError, _HTTPError) as e: - if isinstance(e, _SSLError): - # This branch is for urllib3 versions earlier than v1.22 - raise SSLError(e, request=request) - elif isinstance(e, ReadTimeoutError): - raise ReadTimeout(e, request=request) - else: - raise - - return self.build_response(request, resp) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/api.py b/env/lib/python3.7/site-packages/pip/_vendor/requests/api.py deleted file mode 100644 index abada96..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/requests/api.py +++ /dev/null @@ -1,158 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.api -~~~~~~~~~~~~ - -This module implements the Requests API. - -:copyright: (c) 2012 by Kenneth Reitz. -:license: Apache2, see LICENSE for more details. -""" - -from . import sessions - - -def request(method, url, **kwargs): - """Constructs and sends a :class:`Request <Request>`. - - :param method: method for the new :class:`Request` object. - :param url: URL for the new :class:`Request` object. - :param params: (optional) Dictionary, list of tuples or bytes to send - in the body of the :class:`Request`. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`. - :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`. - :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`. - :param files: (optional) Dictionary of ``'name': file-like-objects`` (or ``{'name': file-tuple}``) for multipart encoding upload. - ``file-tuple`` can be a 2-tuple ``('filename', fileobj)``, 3-tuple ``('filename', fileobj, 'content_type')`` - or a 4-tuple ``('filename', fileobj, 'content_type', custom_headers)``, where ``'content-type'`` is a string - defining the content type of the given file and ``custom_headers`` a dict-like object containing additional headers - to add for the file. - :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth. - :param timeout: (optional) How many seconds to wait for the server to send data - before giving up, as a float, or a :ref:`(connect timeout, read - timeout) <timeouts>` tuple. - :type timeout: float or tuple - :param allow_redirects: (optional) Boolean. Enable/disable GET/OPTIONS/POST/PUT/PATCH/DELETE/HEAD redirection. Defaults to ``True``. - :type allow_redirects: bool - :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy. - :param verify: (optional) Either a boolean, in which case it controls whether we verify - the server's TLS certificate, or a string, in which case it must be a path - to a CA bundle to use. Defaults to ``True``. - :param stream: (optional) if ``False``, the response content will be immediately downloaded. - :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. - :return: :class:`Response <Response>` object - :rtype: requests.Response - - Usage:: - - >>> import requests - >>> req = requests.request('GET', 'https://httpbin.org/get') - <Response [200]> - """ - - # By using the 'with' statement we are sure the session is closed, thus we - # avoid leaving sockets open which can trigger a ResourceWarning in some - # cases, and look like a memory leak in others. - with sessions.Session() as session: - return session.request(method=method, url=url, **kwargs) - - -def get(url, params=None, **kwargs): - r"""Sends a GET request. - - :param url: URL for the new :class:`Request` object. - :param params: (optional) Dictionary, list of tuples or bytes to send - in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response <Response>` object - :rtype: requests.Response - """ - - kwargs.setdefault('allow_redirects', True) - return request('get', url, params=params, **kwargs) - - -def options(url, **kwargs): - r"""Sends an OPTIONS request. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response <Response>` object - :rtype: requests.Response - """ - - kwargs.setdefault('allow_redirects', True) - return request('options', url, **kwargs) - - -def head(url, **kwargs): - r"""Sends a HEAD request. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response <Response>` object - :rtype: requests.Response - """ - - kwargs.setdefault('allow_redirects', False) - return request('head', url, **kwargs) - - -def post(url, data=None, json=None, **kwargs): - r"""Sends a POST request. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param json: (optional) json data to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response <Response>` object - :rtype: requests.Response - """ - - return request('post', url, data=data, json=json, **kwargs) - - -def put(url, data=None, **kwargs): - r"""Sends a PUT request. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param json: (optional) json data to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response <Response>` object - :rtype: requests.Response - """ - - return request('put', url, data=data, **kwargs) - - -def patch(url, data=None, **kwargs): - r"""Sends a PATCH request. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param json: (optional) json data to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response <Response>` object - :rtype: requests.Response - """ - - return request('patch', url, data=data, **kwargs) - - -def delete(url, **kwargs): - r"""Sends a DELETE request. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response <Response>` object - :rtype: requests.Response - """ - - return request('delete', url, **kwargs) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/auth.py b/env/lib/python3.7/site-packages/pip/_vendor/requests/auth.py deleted file mode 100644 index bdde51c..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/requests/auth.py +++ /dev/null @@ -1,305 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.auth -~~~~~~~~~~~~~ - -This module contains the authentication handlers for Requests. -""" - -import os -import re -import time -import hashlib -import threading -import warnings - -from base64 import b64encode - -from .compat import urlparse, str, basestring -from .cookies import extract_cookies_to_jar -from ._internal_utils import to_native_string -from .utils import parse_dict_header - -CONTENT_TYPE_FORM_URLENCODED = 'application/x-www-form-urlencoded' -CONTENT_TYPE_MULTI_PART = 'multipart/form-data' - - -def _basic_auth_str(username, password): - """Returns a Basic Auth string.""" - - # "I want us to put a big-ol' comment on top of it that - # says that this behaviour is dumb but we need to preserve - # it because people are relying on it." - # - Lukasa - # - # These are here solely to maintain backwards compatibility - # for things like ints. This will be removed in 3.0.0. - if not isinstance(username, basestring): - warnings.warn( - "Non-string usernames will no longer be supported in Requests " - "3.0.0. Please convert the object you've passed in ({!r}) to " - "a string or bytes object in the near future to avoid " - "problems.".format(username), - category=DeprecationWarning, - ) - username = str(username) - - if not isinstance(password, basestring): - warnings.warn( - "Non-string passwords will no longer be supported in Requests " - "3.0.0. Please convert the object you've passed in ({!r}) to " - "a string or bytes object in the near future to avoid " - "problems.".format(password), - category=DeprecationWarning, - ) - password = str(password) - # -- End Removal -- - - if isinstance(username, str): - username = username.encode('latin1') - - if isinstance(password, str): - password = password.encode('latin1') - - authstr = 'Basic ' + to_native_string( - b64encode(b':'.join((username, password))).strip() - ) - - return authstr - - -class AuthBase(object): - """Base class that all auth implementations derive from""" - - def __call__(self, r): - raise NotImplementedError('Auth hooks must be callable.') - - -class HTTPBasicAuth(AuthBase): - """Attaches HTTP Basic Authentication to the given Request object.""" - - def __init__(self, username, password): - self.username = username - self.password = password - - def __eq__(self, other): - return all([ - self.username == getattr(other, 'username', None), - self.password == getattr(other, 'password', None) - ]) - - def __ne__(self, other): - return not self == other - - def __call__(self, r): - r.headers['Authorization'] = _basic_auth_str(self.username, self.password) - return r - - -class HTTPProxyAuth(HTTPBasicAuth): - """Attaches HTTP Proxy Authentication to a given Request object.""" - - def __call__(self, r): - r.headers['Proxy-Authorization'] = _basic_auth_str(self.username, self.password) - return r - - -class HTTPDigestAuth(AuthBase): - """Attaches HTTP Digest Authentication to the given Request object.""" - - def __init__(self, username, password): - self.username = username - self.password = password - # Keep state in per-thread local storage - self._thread_local = threading.local() - - def init_per_thread_state(self): - # Ensure state is initialized just once per-thread - if not hasattr(self._thread_local, 'init'): - self._thread_local.init = True - self._thread_local.last_nonce = '' - self._thread_local.nonce_count = 0 - self._thread_local.chal = {} - self._thread_local.pos = None - self._thread_local.num_401_calls = None - - def build_digest_header(self, method, url): - """ - :rtype: str - """ - - realm = self._thread_local.chal['realm'] - nonce = self._thread_local.chal['nonce'] - qop = self._thread_local.chal.get('qop') - algorithm = self._thread_local.chal.get('algorithm') - opaque = self._thread_local.chal.get('opaque') - hash_utf8 = None - - if algorithm is None: - _algorithm = 'MD5' - else: - _algorithm = algorithm.upper() - # lambdas assume digest modules are imported at the top level - if _algorithm == 'MD5' or _algorithm == 'MD5-SESS': - def md5_utf8(x): - if isinstance(x, str): - x = x.encode('utf-8') - return hashlib.md5(x).hexdigest() - hash_utf8 = md5_utf8 - elif _algorithm == 'SHA': - def sha_utf8(x): - if isinstance(x, str): - x = x.encode('utf-8') - return hashlib.sha1(x).hexdigest() - hash_utf8 = sha_utf8 - elif _algorithm == 'SHA-256': - def sha256_utf8(x): - if isinstance(x, str): - x = x.encode('utf-8') - return hashlib.sha256(x).hexdigest() - hash_utf8 = sha256_utf8 - elif _algorithm == 'SHA-512': - def sha512_utf8(x): - if isinstance(x, str): - x = x.encode('utf-8') - return hashlib.sha512(x).hexdigest() - hash_utf8 = sha512_utf8 - - KD = lambda s, d: hash_utf8("%s:%s" % (s, d)) - - if hash_utf8 is None: - return None - - # XXX not implemented yet - entdig = None - p_parsed = urlparse(url) - #: path is request-uri defined in RFC 2616 which should not be empty - path = p_parsed.path or "/" - if p_parsed.query: - path += '?' + p_parsed.query - - A1 = '%s:%s:%s' % (self.username, realm, self.password) - A2 = '%s:%s' % (method, path) - - HA1 = hash_utf8(A1) - HA2 = hash_utf8(A2) - - if nonce == self._thread_local.last_nonce: - self._thread_local.nonce_count += 1 - else: - self._thread_local.nonce_count = 1 - ncvalue = '%08x' % self._thread_local.nonce_count - s = str(self._thread_local.nonce_count).encode('utf-8') - s += nonce.encode('utf-8') - s += time.ctime().encode('utf-8') - s += os.urandom(8) - - cnonce = (hashlib.sha1(s).hexdigest()[:16]) - if _algorithm == 'MD5-SESS': - HA1 = hash_utf8('%s:%s:%s' % (HA1, nonce, cnonce)) - - if not qop: - respdig = KD(HA1, "%s:%s" % (nonce, HA2)) - elif qop == 'auth' or 'auth' in qop.split(','): - noncebit = "%s:%s:%s:%s:%s" % ( - nonce, ncvalue, cnonce, 'auth', HA2 - ) - respdig = KD(HA1, noncebit) - else: - # XXX handle auth-int. - return None - - self._thread_local.last_nonce = nonce - - # XXX should the partial digests be encoded too? - base = 'username="%s", realm="%s", nonce="%s", uri="%s", ' \ - 'response="%s"' % (self.username, realm, nonce, path, respdig) - if opaque: - base += ', opaque="%s"' % opaque - if algorithm: - base += ', algorithm="%s"' % algorithm - if entdig: - base += ', digest="%s"' % entdig - if qop: - base += ', qop="auth", nc=%s, cnonce="%s"' % (ncvalue, cnonce) - - return 'Digest %s' % (base) - - def handle_redirect(self, r, **kwargs): - """Reset num_401_calls counter on redirects.""" - if r.is_redirect: - self._thread_local.num_401_calls = 1 - - def handle_401(self, r, **kwargs): - """ - Takes the given response and tries digest-auth, if needed. - - :rtype: requests.Response - """ - - # If response is not 4xx, do not auth - # See https://github.com/requests/requests/issues/3772 - if not 400 <= r.status_code < 500: - self._thread_local.num_401_calls = 1 - return r - - if self._thread_local.pos is not None: - # Rewind the file position indicator of the body to where - # it was to resend the request. - r.request.body.seek(self._thread_local.pos) - s_auth = r.headers.get('www-authenticate', '') - - if 'digest' in s_auth.lower() and self._thread_local.num_401_calls < 2: - - self._thread_local.num_401_calls += 1 - pat = re.compile(r'digest ', flags=re.IGNORECASE) - self._thread_local.chal = parse_dict_header(pat.sub('', s_auth, count=1)) - - # Consume content and release the original connection - # to allow our new request to reuse the same one. - r.content - r.close() - prep = r.request.copy() - extract_cookies_to_jar(prep._cookies, r.request, r.raw) - prep.prepare_cookies(prep._cookies) - - prep.headers['Authorization'] = self.build_digest_header( - prep.method, prep.url) - _r = r.connection.send(prep, **kwargs) - _r.history.append(r) - _r.request = prep - - return _r - - self._thread_local.num_401_calls = 1 - return r - - def __call__(self, r): - # Initialize per-thread state, if needed - self.init_per_thread_state() - # If we have a saved nonce, skip the 401 - if self._thread_local.last_nonce: - r.headers['Authorization'] = self.build_digest_header(r.method, r.url) - try: - self._thread_local.pos = r.body.tell() - except AttributeError: - # In the case of HTTPDigestAuth being reused and the body of - # the previous request was a file-like object, pos has the - # file position of the previous body. Ensure it's set to - # None. - self._thread_local.pos = None - r.register_hook('response', self.handle_401) - r.register_hook('response', self.handle_redirect) - self._thread_local.num_401_calls = 1 - - return r - - def __eq__(self, other): - return all([ - self.username == getattr(other, 'username', None), - self.password == getattr(other, 'password', None) - ]) - - def __ne__(self, other): - return not self == other diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/certs.py b/env/lib/python3.7/site-packages/pip/_vendor/requests/certs.py deleted file mode 100644 index 06a594e..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/requests/certs.py +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -""" -requests.certs -~~~~~~~~~~~~~~ - -This module returns the preferred default CA certificate bundle. There is -only one — the one from the certifi package. - -If you are packaging Requests, e.g., for a Linux distribution or a managed -environment, you can change the definition of where() to return a separately -packaged CA bundle. -""" -from pip._vendor.certifi import where - -if __name__ == '__main__': - print(where()) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/compat.py b/env/lib/python3.7/site-packages/pip/_vendor/requests/compat.py deleted file mode 100644 index 6a86893..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/requests/compat.py +++ /dev/null @@ -1,74 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.compat -~~~~~~~~~~~~~~~ - -This module handles import compatibility issues between Python 2 and -Python 3. -""" - -from pip._vendor import chardet - -import sys - -# ------- -# Pythons -# ------- - -# Syntax sugar. -_ver = sys.version_info - -#: Python 2.x? -is_py2 = (_ver[0] == 2) - -#: Python 3.x? -is_py3 = (_ver[0] == 3) - -# Note: We've patched out simplejson support in pip because it prevents -# upgrading simplejson on Windows. -# try: -# import simplejson as json -# except (ImportError, SyntaxError): -# # simplejson does not support Python 3.2, it throws a SyntaxError -# # because of u'...' Unicode literals. -import json - -# --------- -# Specifics -# --------- - -if is_py2: - from urllib import ( - quote, unquote, quote_plus, unquote_plus, urlencode, getproxies, - proxy_bypass, proxy_bypass_environment, getproxies_environment) - from urlparse import urlparse, urlunparse, urljoin, urlsplit, urldefrag - from urllib2 import parse_http_list - import cookielib - from Cookie import Morsel - from StringIO import StringIO - from collections import Callable, Mapping, MutableMapping, OrderedDict - - - builtin_str = str - bytes = str - str = unicode - basestring = basestring - numeric_types = (int, long, float) - integer_types = (int, long) - -elif is_py3: - from urllib.parse import urlparse, urlunparse, urljoin, urlsplit, urlencode, quote, unquote, quote_plus, unquote_plus, urldefrag - from urllib.request import parse_http_list, getproxies, proxy_bypass, proxy_bypass_environment, getproxies_environment - from http import cookiejar as cookielib - from http.cookies import Morsel - from io import StringIO - from collections import OrderedDict - from collections.abc import Callable, Mapping, MutableMapping - - builtin_str = str - str = str - bytes = bytes - basestring = (str, bytes) - numeric_types = (int, float) - integer_types = (int,) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/cookies.py b/env/lib/python3.7/site-packages/pip/_vendor/requests/cookies.py deleted file mode 100644 index 56fccd9..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/requests/cookies.py +++ /dev/null @@ -1,549 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.cookies -~~~~~~~~~~~~~~~~ - -Compatibility code to be able to use `cookielib.CookieJar` with requests. - -requests.utils imports from here, so be careful with imports. -""" - -import copy -import time -import calendar - -from ._internal_utils import to_native_string -from .compat import cookielib, urlparse, urlunparse, Morsel, MutableMapping - -try: - import threading -except ImportError: - import dummy_threading as threading - - -class MockRequest(object): - """Wraps a `requests.Request` to mimic a `urllib2.Request`. - - The code in `cookielib.CookieJar` expects this interface in order to correctly - manage cookie policies, i.e., determine whether a cookie can be set, given the - domains of the request and the cookie. - - The original request object is read-only. The client is responsible for collecting - the new headers via `get_new_headers()` and interpreting them appropriately. You - probably want `get_cookie_header`, defined below. - """ - - def __init__(self, request): - self._r = request - self._new_headers = {} - self.type = urlparse(self._r.url).scheme - - def get_type(self): - return self.type - - def get_host(self): - return urlparse(self._r.url).netloc - - def get_origin_req_host(self): - return self.get_host() - - def get_full_url(self): - # Only return the response's URL if the user hadn't set the Host - # header - if not self._r.headers.get('Host'): - return self._r.url - # If they did set it, retrieve it and reconstruct the expected domain - host = to_native_string(self._r.headers['Host'], encoding='utf-8') - parsed = urlparse(self._r.url) - # Reconstruct the URL as we expect it - return urlunparse([ - parsed.scheme, host, parsed.path, parsed.params, parsed.query, - parsed.fragment - ]) - - def is_unverifiable(self): - return True - - def has_header(self, name): - return name in self._r.headers or name in self._new_headers - - def get_header(self, name, default=None): - return self._r.headers.get(name, self._new_headers.get(name, default)) - - def add_header(self, key, val): - """cookielib has no legitimate use for this method; add it back if you find one.""" - raise NotImplementedError("Cookie headers should be added with add_unredirected_header()") - - def add_unredirected_header(self, name, value): - self._new_headers[name] = value - - def get_new_headers(self): - return self._new_headers - - @property - def unverifiable(self): - return self.is_unverifiable() - - @property - def origin_req_host(self): - return self.get_origin_req_host() - - @property - def host(self): - return self.get_host() - - -class MockResponse(object): - """Wraps a `httplib.HTTPMessage` to mimic a `urllib.addinfourl`. - - ...what? Basically, expose the parsed HTTP headers from the server response - the way `cookielib` expects to see them. - """ - - def __init__(self, headers): - """Make a MockResponse for `cookielib` to read. - - :param headers: a httplib.HTTPMessage or analogous carrying the headers - """ - self._headers = headers - - def info(self): - return self._headers - - def getheaders(self, name): - self._headers.getheaders(name) - - -def extract_cookies_to_jar(jar, request, response): - """Extract the cookies from the response into a CookieJar. - - :param jar: cookielib.CookieJar (not necessarily a RequestsCookieJar) - :param request: our own requests.Request object - :param response: urllib3.HTTPResponse object - """ - if not (hasattr(response, '_original_response') and - response._original_response): - return - # the _original_response field is the wrapped httplib.HTTPResponse object, - req = MockRequest(request) - # pull out the HTTPMessage with the headers and put it in the mock: - res = MockResponse(response._original_response.msg) - jar.extract_cookies(res, req) - - -def get_cookie_header(jar, request): - """ - Produce an appropriate Cookie header string to be sent with `request`, or None. - - :rtype: str - """ - r = MockRequest(request) - jar.add_cookie_header(r) - return r.get_new_headers().get('Cookie') - - -def remove_cookie_by_name(cookiejar, name, domain=None, path=None): - """Unsets a cookie by name, by default over all domains and paths. - - Wraps CookieJar.clear(), is O(n). - """ - clearables = [] - for cookie in cookiejar: - if cookie.name != name: - continue - if domain is not None and domain != cookie.domain: - continue - if path is not None and path != cookie.path: - continue - clearables.append((cookie.domain, cookie.path, cookie.name)) - - for domain, path, name in clearables: - cookiejar.clear(domain, path, name) - - -class CookieConflictError(RuntimeError): - """There are two cookies that meet the criteria specified in the cookie jar. - Use .get and .set and include domain and path args in order to be more specific. - """ - - -class RequestsCookieJar(cookielib.CookieJar, MutableMapping): - """Compatibility class; is a cookielib.CookieJar, but exposes a dict - interface. - - This is the CookieJar we create by default for requests and sessions that - don't specify one, since some clients may expect response.cookies and - session.cookies to support dict operations. - - Requests does not use the dict interface internally; it's just for - compatibility with external client code. All requests code should work - out of the box with externally provided instances of ``CookieJar``, e.g. - ``LWPCookieJar`` and ``FileCookieJar``. - - Unlike a regular CookieJar, this class is pickleable. - - .. warning:: dictionary operations that are normally O(1) may be O(n). - """ - - def get(self, name, default=None, domain=None, path=None): - """Dict-like get() that also supports optional domain and path args in - order to resolve naming collisions from using one cookie jar over - multiple domains. - - .. warning:: operation is O(n), not O(1). - """ - try: - return self._find_no_duplicates(name, domain, path) - except KeyError: - return default - - def set(self, name, value, **kwargs): - """Dict-like set() that also supports optional domain and path args in - order to resolve naming collisions from using one cookie jar over - multiple domains. - """ - # support client code that unsets cookies by assignment of a None value: - if value is None: - remove_cookie_by_name(self, name, domain=kwargs.get('domain'), path=kwargs.get('path')) - return - - if isinstance(value, Morsel): - c = morsel_to_cookie(value) - else: - c = create_cookie(name, value, **kwargs) - self.set_cookie(c) - return c - - def iterkeys(self): - """Dict-like iterkeys() that returns an iterator of names of cookies - from the jar. - - .. seealso:: itervalues() and iteritems(). - """ - for cookie in iter(self): - yield cookie.name - - def keys(self): - """Dict-like keys() that returns a list of names of cookies from the - jar. - - .. seealso:: values() and items(). - """ - return list(self.iterkeys()) - - def itervalues(self): - """Dict-like itervalues() that returns an iterator of values of cookies - from the jar. - - .. seealso:: iterkeys() and iteritems(). - """ - for cookie in iter(self): - yield cookie.value - - def values(self): - """Dict-like values() that returns a list of values of cookies from the - jar. - - .. seealso:: keys() and items(). - """ - return list(self.itervalues()) - - def iteritems(self): - """Dict-like iteritems() that returns an iterator of name-value tuples - from the jar. - - .. seealso:: iterkeys() and itervalues(). - """ - for cookie in iter(self): - yield cookie.name, cookie.value - - def items(self): - """Dict-like items() that returns a list of name-value tuples from the - jar. Allows client-code to call ``dict(RequestsCookieJar)`` and get a - vanilla python dict of key value pairs. - - .. seealso:: keys() and values(). - """ - return list(self.iteritems()) - - def list_domains(self): - """Utility method to list all the domains in the jar.""" - domains = [] - for cookie in iter(self): - if cookie.domain not in domains: - domains.append(cookie.domain) - return domains - - def list_paths(self): - """Utility method to list all the paths in the jar.""" - paths = [] - for cookie in iter(self): - if cookie.path not in paths: - paths.append(cookie.path) - return paths - - def multiple_domains(self): - """Returns True if there are multiple domains in the jar. - Returns False otherwise. - - :rtype: bool - """ - domains = [] - for cookie in iter(self): - if cookie.domain is not None and cookie.domain in domains: - return True - domains.append(cookie.domain) - return False # there is only one domain in jar - - def get_dict(self, domain=None, path=None): - """Takes as an argument an optional domain and path and returns a plain - old Python dict of name-value pairs of cookies that meet the - requirements. - - :rtype: dict - """ - dictionary = {} - for cookie in iter(self): - if ( - (domain is None or cookie.domain == domain) and - (path is None or cookie.path == path) - ): - dictionary[cookie.name] = cookie.value - return dictionary - - def __contains__(self, name): - try: - return super(RequestsCookieJar, self).__contains__(name) - except CookieConflictError: - return True - - def __getitem__(self, name): - """Dict-like __getitem__() for compatibility with client code. Throws - exception if there are more than one cookie with name. In that case, - use the more explicit get() method instead. - - .. warning:: operation is O(n), not O(1). - """ - return self._find_no_duplicates(name) - - def __setitem__(self, name, value): - """Dict-like __setitem__ for compatibility with client code. Throws - exception if there is already a cookie of that name in the jar. In that - case, use the more explicit set() method instead. - """ - self.set(name, value) - - def __delitem__(self, name): - """Deletes a cookie given a name. Wraps ``cookielib.CookieJar``'s - ``remove_cookie_by_name()``. - """ - remove_cookie_by_name(self, name) - - def set_cookie(self, cookie, *args, **kwargs): - if hasattr(cookie.value, 'startswith') and cookie.value.startswith('"') and cookie.value.endswith('"'): - cookie.value = cookie.value.replace('\\"', '') - return super(RequestsCookieJar, self).set_cookie(cookie, *args, **kwargs) - - def update(self, other): - """Updates this jar with cookies from another CookieJar or dict-like""" - if isinstance(other, cookielib.CookieJar): - for cookie in other: - self.set_cookie(copy.copy(cookie)) - else: - super(RequestsCookieJar, self).update(other) - - def _find(self, name, domain=None, path=None): - """Requests uses this method internally to get cookie values. - - If there are conflicting cookies, _find arbitrarily chooses one. - See _find_no_duplicates if you want an exception thrown if there are - conflicting cookies. - - :param name: a string containing name of cookie - :param domain: (optional) string containing domain of cookie - :param path: (optional) string containing path of cookie - :return: cookie.value - """ - for cookie in iter(self): - if cookie.name == name: - if domain is None or cookie.domain == domain: - if path is None or cookie.path == path: - return cookie.value - - raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path)) - - def _find_no_duplicates(self, name, domain=None, path=None): - """Both ``__get_item__`` and ``get`` call this function: it's never - used elsewhere in Requests. - - :param name: a string containing name of cookie - :param domain: (optional) string containing domain of cookie - :param path: (optional) string containing path of cookie - :raises KeyError: if cookie is not found - :raises CookieConflictError: if there are multiple cookies - that match name and optionally domain and path - :return: cookie.value - """ - toReturn = None - for cookie in iter(self): - if cookie.name == name: - if domain is None or cookie.domain == domain: - if path is None or cookie.path == path: - if toReturn is not None: # if there are multiple cookies that meet passed in criteria - raise CookieConflictError('There are multiple cookies with name, %r' % (name)) - toReturn = cookie.value # we will eventually return this as long as no cookie conflict - - if toReturn: - return toReturn - raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path)) - - def __getstate__(self): - """Unlike a normal CookieJar, this class is pickleable.""" - state = self.__dict__.copy() - # remove the unpickleable RLock object - state.pop('_cookies_lock') - return state - - def __setstate__(self, state): - """Unlike a normal CookieJar, this class is pickleable.""" - self.__dict__.update(state) - if '_cookies_lock' not in self.__dict__: - self._cookies_lock = threading.RLock() - - def copy(self): - """Return a copy of this RequestsCookieJar.""" - new_cj = RequestsCookieJar() - new_cj.set_policy(self.get_policy()) - new_cj.update(self) - return new_cj - - def get_policy(self): - """Return the CookiePolicy instance used.""" - return self._policy - - -def _copy_cookie_jar(jar): - if jar is None: - return None - - if hasattr(jar, 'copy'): - # We're dealing with an instance of RequestsCookieJar - return jar.copy() - # We're dealing with a generic CookieJar instance - new_jar = copy.copy(jar) - new_jar.clear() - for cookie in jar: - new_jar.set_cookie(copy.copy(cookie)) - return new_jar - - -def create_cookie(name, value, **kwargs): - """Make a cookie from underspecified parameters. - - By default, the pair of `name` and `value` will be set for the domain '' - and sent on every request (this is sometimes called a "supercookie"). - """ - result = { - 'version': 0, - 'name': name, - 'value': value, - 'port': None, - 'domain': '', - 'path': '/', - 'secure': False, - 'expires': None, - 'discard': True, - 'comment': None, - 'comment_url': None, - 'rest': {'HttpOnly': None}, - 'rfc2109': False, - } - - badargs = set(kwargs) - set(result) - if badargs: - err = 'create_cookie() got unexpected keyword arguments: %s' - raise TypeError(err % list(badargs)) - - result.update(kwargs) - result['port_specified'] = bool(result['port']) - result['domain_specified'] = bool(result['domain']) - result['domain_initial_dot'] = result['domain'].startswith('.') - result['path_specified'] = bool(result['path']) - - return cookielib.Cookie(**result) - - -def morsel_to_cookie(morsel): - """Convert a Morsel object into a Cookie containing the one k/v pair.""" - - expires = None - if morsel['max-age']: - try: - expires = int(time.time() + int(morsel['max-age'])) - except ValueError: - raise TypeError('max-age: %s must be integer' % morsel['max-age']) - elif morsel['expires']: - time_template = '%a, %d-%b-%Y %H:%M:%S GMT' - expires = calendar.timegm( - time.strptime(morsel['expires'], time_template) - ) - return create_cookie( - comment=morsel['comment'], - comment_url=bool(morsel['comment']), - discard=False, - domain=morsel['domain'], - expires=expires, - name=morsel.key, - path=morsel['path'], - port=None, - rest={'HttpOnly': morsel['httponly']}, - rfc2109=False, - secure=bool(morsel['secure']), - value=morsel.value, - version=morsel['version'] or 0, - ) - - -def cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True): - """Returns a CookieJar from a key/value dictionary. - - :param cookie_dict: Dict of key/values to insert into CookieJar. - :param cookiejar: (optional) A cookiejar to add the cookies to. - :param overwrite: (optional) If False, will not replace cookies - already in the jar with new ones. - :rtype: CookieJar - """ - if cookiejar is None: - cookiejar = RequestsCookieJar() - - if cookie_dict is not None: - names_from_jar = [cookie.name for cookie in cookiejar] - for name in cookie_dict: - if overwrite or (name not in names_from_jar): - cookiejar.set_cookie(create_cookie(name, cookie_dict[name])) - - return cookiejar - - -def merge_cookies(cookiejar, cookies): - """Add cookies to cookiejar and returns a merged CookieJar. - - :param cookiejar: CookieJar object to add the cookies to. - :param cookies: Dictionary or CookieJar object to be added. - :rtype: CookieJar - """ - if not isinstance(cookiejar, cookielib.CookieJar): - raise ValueError('You can only merge into CookieJar') - - if isinstance(cookies, dict): - cookiejar = cookiejar_from_dict( - cookies, cookiejar=cookiejar, overwrite=False) - elif isinstance(cookies, cookielib.CookieJar): - try: - cookiejar.update(cookies) - except AttributeError: - for cookie_in_jar in cookies: - cookiejar.set_cookie(cookie_in_jar) - - return cookiejar diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/exceptions.py b/env/lib/python3.7/site-packages/pip/_vendor/requests/exceptions.py deleted file mode 100644 index a91e1fd..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/requests/exceptions.py +++ /dev/null @@ -1,126 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.exceptions -~~~~~~~~~~~~~~~~~~~ - -This module contains the set of Requests' exceptions. -""" -from pip._vendor.urllib3.exceptions import HTTPError as BaseHTTPError - - -class RequestException(IOError): - """There was an ambiguous exception that occurred while handling your - request. - """ - - def __init__(self, *args, **kwargs): - """Initialize RequestException with `request` and `response` objects.""" - response = kwargs.pop('response', None) - self.response = response - self.request = kwargs.pop('request', None) - if (response is not None and not self.request and - hasattr(response, 'request')): - self.request = self.response.request - super(RequestException, self).__init__(*args, **kwargs) - - -class HTTPError(RequestException): - """An HTTP error occurred.""" - - -class ConnectionError(RequestException): - """A Connection error occurred.""" - - -class ProxyError(ConnectionError): - """A proxy error occurred.""" - - -class SSLError(ConnectionError): - """An SSL error occurred.""" - - -class Timeout(RequestException): - """The request timed out. - - Catching this error will catch both - :exc:`~requests.exceptions.ConnectTimeout` and - :exc:`~requests.exceptions.ReadTimeout` errors. - """ - - -class ConnectTimeout(ConnectionError, Timeout): - """The request timed out while trying to connect to the remote server. - - Requests that produced this error are safe to retry. - """ - - -class ReadTimeout(Timeout): - """The server did not send any data in the allotted amount of time.""" - - -class URLRequired(RequestException): - """A valid URL is required to make a request.""" - - -class TooManyRedirects(RequestException): - """Too many redirects.""" - - -class MissingSchema(RequestException, ValueError): - """The URL schema (e.g. http or https) is missing.""" - - -class InvalidSchema(RequestException, ValueError): - """See defaults.py for valid schemas.""" - - -class InvalidURL(RequestException, ValueError): - """The URL provided was somehow invalid.""" - - -class InvalidHeader(RequestException, ValueError): - """The header value provided was somehow invalid.""" - - -class InvalidProxyURL(InvalidURL): - """The proxy URL provided is invalid.""" - - -class ChunkedEncodingError(RequestException): - """The server declared chunked encoding but sent an invalid chunk.""" - - -class ContentDecodingError(RequestException, BaseHTTPError): - """Failed to decode response content""" - - -class StreamConsumedError(RequestException, TypeError): - """The content for this response was already consumed""" - - -class RetryError(RequestException): - """Custom retries logic failed""" - - -class UnrewindableBodyError(RequestException): - """Requests encountered an error when trying to rewind a body""" - -# Warnings - - -class RequestsWarning(Warning): - """Base warning for Requests.""" - pass - - -class FileModeWarning(RequestsWarning, DeprecationWarning): - """A file was opened in text mode, but Requests determined its binary length.""" - pass - - -class RequestsDependencyWarning(RequestsWarning): - """An imported dependency doesn't match the expected version range.""" - pass diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/help.py b/env/lib/python3.7/site-packages/pip/_vendor/requests/help.py deleted file mode 100644 index 3c3072b..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/requests/help.py +++ /dev/null @@ -1,119 +0,0 @@ -"""Module containing bug report helper(s).""" -from __future__ import print_function - -import json -import platform -import sys -import ssl - -from pip._vendor import idna -from pip._vendor import urllib3 -from pip._vendor import chardet - -from . import __version__ as requests_version - -try: - from pip._vendor.urllib3.contrib import pyopenssl -except ImportError: - pyopenssl = None - OpenSSL = None - cryptography = None -else: - import OpenSSL - import cryptography - - -def _implementation(): - """Return a dict with the Python implementation and version. - - Provide both the name and the version of the Python implementation - currently running. For example, on CPython 2.7.5 it will return - {'name': 'CPython', 'version': '2.7.5'}. - - This function works best on CPython and PyPy: in particular, it probably - doesn't work for Jython or IronPython. Future investigation should be done - to work out the correct shape of the code for those platforms. - """ - implementation = platform.python_implementation() - - if implementation == 'CPython': - implementation_version = platform.python_version() - elif implementation == 'PyPy': - implementation_version = '%s.%s.%s' % (sys.pypy_version_info.major, - sys.pypy_version_info.minor, - sys.pypy_version_info.micro) - if sys.pypy_version_info.releaselevel != 'final': - implementation_version = ''.join([ - implementation_version, sys.pypy_version_info.releaselevel - ]) - elif implementation == 'Jython': - implementation_version = platform.python_version() # Complete Guess - elif implementation == 'IronPython': - implementation_version = platform.python_version() # Complete Guess - else: - implementation_version = 'Unknown' - - return {'name': implementation, 'version': implementation_version} - - -def info(): - """Generate information for a bug report.""" - try: - platform_info = { - 'system': platform.system(), - 'release': platform.release(), - } - except IOError: - platform_info = { - 'system': 'Unknown', - 'release': 'Unknown', - } - - implementation_info = _implementation() - urllib3_info = {'version': urllib3.__version__} - chardet_info = {'version': chardet.__version__} - - pyopenssl_info = { - 'version': None, - 'openssl_version': '', - } - if OpenSSL: - pyopenssl_info = { - 'version': OpenSSL.__version__, - 'openssl_version': '%x' % OpenSSL.SSL.OPENSSL_VERSION_NUMBER, - } - cryptography_info = { - 'version': getattr(cryptography, '__version__', ''), - } - idna_info = { - 'version': getattr(idna, '__version__', ''), - } - - system_ssl = ssl.OPENSSL_VERSION_NUMBER - system_ssl_info = { - 'version': '%x' % system_ssl if system_ssl is not None else '' - } - - return { - 'platform': platform_info, - 'implementation': implementation_info, - 'system_ssl': system_ssl_info, - 'using_pyopenssl': pyopenssl is not None, - 'pyOpenSSL': pyopenssl_info, - 'urllib3': urllib3_info, - 'chardet': chardet_info, - 'cryptography': cryptography_info, - 'idna': idna_info, - 'requests': { - 'version': requests_version, - }, - } - - -def main(): - """Pretty-print the bug information as JSON.""" - print(json.dumps(info(), sort_keys=True, indent=2)) - - -if __name__ == '__main__': - main() diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/hooks.py b/env/lib/python3.7/site-packages/pip/_vendor/requests/hooks.py deleted file mode 100644 index 7a51f21..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/requests/hooks.py +++ /dev/null @@ -1,34 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.hooks -~~~~~~~~~~~~~~ - -This module provides the capabilities for the Requests hooks system. - -Available hooks: - -``response``: - The response generated from a Request. -""" -HOOKS = ['response'] - - -def default_hooks(): - return {event: [] for event in HOOKS} - -# TODO: response is the only one - - -def dispatch_hook(key, hooks, hook_data, **kwargs): - """Dispatches a hook dictionary on a given piece of data.""" - hooks = hooks or {} - hooks = hooks.get(key) - if hooks: - if hasattr(hooks, '__call__'): - hooks = [hooks] - for hook in hooks: - _hook_data = hook(hook_data, **kwargs) - if _hook_data is not None: - hook_data = _hook_data - return hook_data diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/models.py b/env/lib/python3.7/site-packages/pip/_vendor/requests/models.py deleted file mode 100644 index 0839957..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/requests/models.py +++ /dev/null @@ -1,953 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.models -~~~~~~~~~~~~~~~ - -This module contains the primary objects that power Requests. -""" - -import datetime -import sys - -# Import encoding now, to avoid implicit import later. -# Implicit import within threads may cause LookupError when standard library is in a ZIP, -# such as in Embedded Python. See https://github.com/requests/requests/issues/3578. -import encodings.idna - -from pip._vendor.urllib3.fields import RequestField -from pip._vendor.urllib3.filepost import encode_multipart_formdata -from pip._vendor.urllib3.util import parse_url -from pip._vendor.urllib3.exceptions import ( - DecodeError, ReadTimeoutError, ProtocolError, LocationParseError) - -from io import UnsupportedOperation -from .hooks import default_hooks -from .structures import CaseInsensitiveDict - -from .auth import HTTPBasicAuth -from .cookies import cookiejar_from_dict, get_cookie_header, _copy_cookie_jar -from .exceptions import ( - HTTPError, MissingSchema, InvalidURL, ChunkedEncodingError, - ContentDecodingError, ConnectionError, StreamConsumedError) -from ._internal_utils import to_native_string, unicode_is_ascii -from .utils import ( - guess_filename, get_auth_from_url, requote_uri, - stream_decode_response_unicode, to_key_val_list, parse_header_links, - iter_slices, guess_json_utf, super_len, check_header_validity) -from .compat import ( - Callable, Mapping, - cookielib, urlunparse, urlsplit, urlencode, str, bytes, - is_py2, chardet, builtin_str, basestring) -from .compat import json as complexjson -from .status_codes import codes - -#: The set of HTTP status codes that indicate an automatically -#: processable redirect. -REDIRECT_STATI = ( - codes.moved, # 301 - codes.found, # 302 - codes.other, # 303 - codes.temporary_redirect, # 307 - codes.permanent_redirect, # 308 -) - -DEFAULT_REDIRECT_LIMIT = 30 -CONTENT_CHUNK_SIZE = 10 * 1024 -ITER_CHUNK_SIZE = 512 - - -class RequestEncodingMixin(object): - @property - def path_url(self): - """Build the path URL to use.""" - - url = [] - - p = urlsplit(self.url) - - path = p.path - if not path: - path = '/' - - url.append(path) - - query = p.query - if query: - url.append('?') - url.append(query) - - return ''.join(url) - - @staticmethod - def _encode_params(data): - """Encode parameters in a piece of data. - - Will successfully encode parameters when passed as a dict or a list of - 2-tuples. Order is retained if data is a list of 2-tuples but arbitrary - if parameters are supplied as a dict. - """ - - if isinstance(data, (str, bytes)): - return data - elif hasattr(data, 'read'): - return data - elif hasattr(data, '__iter__'): - result = [] - for k, vs in to_key_val_list(data): - if isinstance(vs, basestring) or not hasattr(vs, '__iter__'): - vs = [vs] - for v in vs: - if v is not None: - result.append( - (k.encode('utf-8') if isinstance(k, str) else k, - v.encode('utf-8') if isinstance(v, str) else v)) - return urlencode(result, doseq=True) - else: - return data - - @staticmethod - def _encode_files(files, data): - """Build the body for a multipart/form-data request. - - Will successfully encode files when passed as a dict or a list of - tuples. Order is retained if data is a list of tuples but arbitrary - if parameters are supplied as a dict. - The tuples may be 2-tuples (filename, fileobj), 3-tuples (filename, fileobj, contentype) - or 4-tuples (filename, fileobj, contentype, custom_headers). - """ - if (not files): - raise ValueError("Files must be provided.") - elif isinstance(data, basestring): - raise ValueError("Data must not be a string.") - - new_fields = [] - fields = to_key_val_list(data or {}) - files = to_key_val_list(files or {}) - - for field, val in fields: - if isinstance(val, basestring) or not hasattr(val, '__iter__'): - val = [val] - for v in val: - if v is not None: - # Don't call str() on bytestrings: in Py3 it all goes wrong. - if not isinstance(v, bytes): - v = str(v) - - new_fields.append( - (field.decode('utf-8') if isinstance(field, bytes) else field, - v.encode('utf-8') if isinstance(v, str) else v)) - - for (k, v) in files: - # support for explicit filename - ft = None - fh = None - if isinstance(v, (tuple, list)): - if len(v) == 2: - fn, fp = v - elif len(v) == 3: - fn, fp, ft = v - else: - fn, fp, ft, fh = v - else: - fn = guess_filename(v) or k - fp = v - - if isinstance(fp, (str, bytes, bytearray)): - fdata = fp - elif hasattr(fp, 'read'): - fdata = fp.read() - elif fp is None: - continue - else: - fdata = fp - - rf = RequestField(name=k, data=fdata, filename=fn, headers=fh) - rf.make_multipart(content_type=ft) - new_fields.append(rf) - - body, content_type = encode_multipart_formdata(new_fields) - - return body, content_type - - -class RequestHooksMixin(object): - def register_hook(self, event, hook): - """Properly register a hook.""" - - if event not in self.hooks: - raise ValueError('Unsupported event specified, with event name "%s"' % (event)) - - if isinstance(hook, Callable): - self.hooks[event].append(hook) - elif hasattr(hook, '__iter__'): - self.hooks[event].extend(h for h in hook if isinstance(h, Callable)) - - def deregister_hook(self, event, hook): - """Deregister a previously registered hook. - Returns True if the hook existed, False if not. - """ - - try: - self.hooks[event].remove(hook) - return True - except ValueError: - return False - - -class Request(RequestHooksMixin): - """A user-created :class:`Request <Request>` object. - - Used to prepare a :class:`PreparedRequest <PreparedRequest>`, which is sent to the server. - - :param method: HTTP method to use. - :param url: URL to send. - :param headers: dictionary of headers to send. - :param files: dictionary of {filename: fileobject} files to multipart upload. - :param data: the body to attach to the request. If a dictionary or - list of tuples ``[(key, value)]`` is provided, form-encoding will - take place. - :param json: json for the body to attach to the request (if files or data is not specified). - :param params: URL parameters to append to the URL. If a dictionary or - list of tuples ``[(key, value)]`` is provided, form-encoding will - take place. - :param auth: Auth handler or (user, pass) tuple. - :param cookies: dictionary or CookieJar of cookies to attach to this request. - :param hooks: dictionary of callback hooks, for internal usage. - - Usage:: - - >>> import requests - >>> req = requests.Request('GET', 'https://httpbin.org/get') - >>> req.prepare() - <PreparedRequest [GET]> - """ - - def __init__(self, - method=None, url=None, headers=None, files=None, data=None, - params=None, auth=None, cookies=None, hooks=None, json=None): - - # Default empty dicts for dict params. - data = [] if data is None else data - files = [] if files is None else files - headers = {} if headers is None else headers - params = {} if params is None else params - hooks = {} if hooks is None else hooks - - self.hooks = default_hooks() - for (k, v) in list(hooks.items()): - self.register_hook(event=k, hook=v) - - self.method = method - self.url = url - self.headers = headers - self.files = files - self.data = data - self.json = json - self.params = params - self.auth = auth - self.cookies = cookies - - def __repr__(self): - return '<Request [%s]>' % (self.method) - - def prepare(self): - """Constructs a :class:`PreparedRequest <PreparedRequest>` for transmission and returns it.""" - p = PreparedRequest() - p.prepare( - method=self.method, - url=self.url, - headers=self.headers, - files=self.files, - data=self.data, - json=self.json, - params=self.params, - auth=self.auth, - cookies=self.cookies, - hooks=self.hooks, - ) - return p - - -class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): - """The fully mutable :class:`PreparedRequest <PreparedRequest>` object, - containing the exact bytes that will be sent to the server. - - Generated from either a :class:`Request <Request>` object or manually. - - Usage:: - - >>> import requests - >>> req = requests.Request('GET', 'https://httpbin.org/get') - >>> r = req.prepare() - <PreparedRequest [GET]> - - >>> s = requests.Session() - >>> s.send(r) - <Response [200]> - """ - - def __init__(self): - #: HTTP verb to send to the server. - self.method = None - #: HTTP URL to send the request to. - self.url = None - #: dictionary of HTTP headers. - self.headers = None - # The `CookieJar` used to create the Cookie header will be stored here - # after prepare_cookies is called - self._cookies = None - #: request body to send to the server. - self.body = None - #: dictionary of callback hooks, for internal usage. - self.hooks = default_hooks() - #: integer denoting starting position of a readable file-like body. - self._body_position = None - - def prepare(self, - method=None, url=None, headers=None, files=None, data=None, - params=None, auth=None, cookies=None, hooks=None, json=None): - """Prepares the entire request with the given parameters.""" - - self.prepare_method(method) - self.prepare_url(url, params) - self.prepare_headers(headers) - self.prepare_cookies(cookies) - self.prepare_body(data, files, json) - self.prepare_auth(auth, url) - - # Note that prepare_auth must be last to enable authentication schemes - # such as OAuth to work on a fully prepared request. - - # This MUST go after prepare_auth. Authenticators could add a hook - self.prepare_hooks(hooks) - - def __repr__(self): - return '<PreparedRequest [%s]>' % (self.method) - - def copy(self): - p = PreparedRequest() - p.method = self.method - p.url = self.url - p.headers = self.headers.copy() if self.headers is not None else None - p._cookies = _copy_cookie_jar(self._cookies) - p.body = self.body - p.hooks = self.hooks - p._body_position = self._body_position - return p - - def prepare_method(self, method): - """Prepares the given HTTP method.""" - self.method = method - if self.method is not None: - self.method = to_native_string(self.method.upper()) - - @staticmethod - def _get_idna_encoded_host(host): - from pip._vendor import idna - - try: - host = idna.encode(host, uts46=True).decode('utf-8') - except idna.IDNAError: - raise UnicodeError - return host - - def prepare_url(self, url, params): - """Prepares the given HTTP URL.""" - #: Accept objects that have string representations. - #: We're unable to blindly call unicode/str functions - #: as this will include the bytestring indicator (b'') - #: on python 3.x. - #: https://github.com/requests/requests/pull/2238 - if isinstance(url, bytes): - url = url.decode('utf8') - else: - url = unicode(url) if is_py2 else str(url) - - # Remove leading whitespaces from url - url = url.lstrip() - - # Don't do any URL preparation for non-HTTP schemes like `mailto`, - # `data` etc to work around exceptions from `url_parse`, which - # handles RFC 3986 only. - if ':' in url and not url.lower().startswith('http'): - self.url = url - return - - # Support for unicode domain names and paths. - try: - scheme, auth, host, port, path, query, fragment = parse_url(url) - except LocationParseError as e: - raise InvalidURL(*e.args) - - if not scheme: - error = ("Invalid URL {0!r}: No schema supplied. Perhaps you meant http://{0}?") - error = error.format(to_native_string(url, 'utf8')) - - raise MissingSchema(error) - - if not host: - raise InvalidURL("Invalid URL %r: No host supplied" % url) - - # In general, we want to try IDNA encoding the hostname if the string contains - # non-ASCII characters. This allows users to automatically get the correct IDNA - # behaviour. For strings containing only ASCII characters, we need to also verify - # it doesn't start with a wildcard (*), before allowing the unencoded hostname. - if not unicode_is_ascii(host): - try: - host = self._get_idna_encoded_host(host) - except UnicodeError: - raise InvalidURL('URL has an invalid label.') - elif host.startswith(u'*'): - raise InvalidURL('URL has an invalid label.') - - # Carefully reconstruct the network location - netloc = auth or '' - if netloc: - netloc += '@' - netloc += host - if port: - netloc += ':' + str(port) - - # Bare domains aren't valid URLs. - if not path: - path = '/' - - if is_py2: - if isinstance(scheme, str): - scheme = scheme.encode('utf-8') - if isinstance(netloc, str): - netloc = netloc.encode('utf-8') - if isinstance(path, str): - path = path.encode('utf-8') - if isinstance(query, str): - query = query.encode('utf-8') - if isinstance(fragment, str): - fragment = fragment.encode('utf-8') - - if isinstance(params, (str, bytes)): - params = to_native_string(params) - - enc_params = self._encode_params(params) - if enc_params: - if query: - query = '%s&%s' % (query, enc_params) - else: - query = enc_params - - url = requote_uri(urlunparse([scheme, netloc, path, None, query, fragment])) - self.url = url - - def prepare_headers(self, headers): - """Prepares the given HTTP headers.""" - - self.headers = CaseInsensitiveDict() - if headers: - for header in headers.items(): - # Raise exception on invalid header value. - check_header_validity(header) - name, value = header - self.headers[to_native_string(name)] = value - - def prepare_body(self, data, files, json=None): - """Prepares the given HTTP body data.""" - - # Check if file, fo, generator, iterator. - # If not, run through normal process. - - # Nottin' on you. - body = None - content_type = None - - if not data and json is not None: - # urllib3 requires a bytes-like body. Python 2's json.dumps - # provides this natively, but Python 3 gives a Unicode string. - content_type = 'application/json' - body = complexjson.dumps(json) - if not isinstance(body, bytes): - body = body.encode('utf-8') - - is_stream = all([ - hasattr(data, '__iter__'), - not isinstance(data, (basestring, list, tuple, Mapping)) - ]) - - try: - length = super_len(data) - except (TypeError, AttributeError, UnsupportedOperation): - length = None - - if is_stream: - body = data - - if getattr(body, 'tell', None) is not None: - # Record the current file position before reading. - # This will allow us to rewind a file in the event - # of a redirect. - try: - self._body_position = body.tell() - except (IOError, OSError): - # This differentiates from None, allowing us to catch - # a failed `tell()` later when trying to rewind the body - self._body_position = object() - - if files: - raise NotImplementedError('Streamed bodies and files are mutually exclusive.') - - if length: - self.headers['Content-Length'] = builtin_str(length) - else: - self.headers['Transfer-Encoding'] = 'chunked' - else: - # Multi-part file uploads. - if files: - (body, content_type) = self._encode_files(files, data) - else: - if data: - body = self._encode_params(data) - if isinstance(data, basestring) or hasattr(data, 'read'): - content_type = None - else: - content_type = 'application/x-www-form-urlencoded' - - self.prepare_content_length(body) - - # Add content-type if it wasn't explicitly provided. - if content_type and ('content-type' not in self.headers): - self.headers['Content-Type'] = content_type - - self.body = body - - def prepare_content_length(self, body): - """Prepare Content-Length header based on request method and body""" - if body is not None: - length = super_len(body) - if length: - # If length exists, set it. Otherwise, we fallback - # to Transfer-Encoding: chunked. - self.headers['Content-Length'] = builtin_str(length) - elif self.method not in ('GET', 'HEAD') and self.headers.get('Content-Length') is None: - # Set Content-Length to 0 for methods that can have a body - # but don't provide one. (i.e. not GET or HEAD) - self.headers['Content-Length'] = '0' - - def prepare_auth(self, auth, url=''): - """Prepares the given HTTP auth data.""" - - # If no Auth is explicitly provided, extract it from the URL first. - if auth is None: - url_auth = get_auth_from_url(self.url) - auth = url_auth if any(url_auth) else None - - if auth: - if isinstance(auth, tuple) and len(auth) == 2: - # special-case basic HTTP auth - auth = HTTPBasicAuth(*auth) - - # Allow auth to make its changes. - r = auth(self) - - # Update self to reflect the auth changes. - self.__dict__.update(r.__dict__) - - # Recompute Content-Length - self.prepare_content_length(self.body) - - def prepare_cookies(self, cookies): - """Prepares the given HTTP cookie data. - - This function eventually generates a ``Cookie`` header from the - given cookies using cookielib. Due to cookielib's design, the header - will not be regenerated if it already exists, meaning this function - can only be called once for the life of the - :class:`PreparedRequest <PreparedRequest>` object. Any subsequent calls - to ``prepare_cookies`` will have no actual effect, unless the "Cookie" - header is removed beforehand. - """ - if isinstance(cookies, cookielib.CookieJar): - self._cookies = cookies - else: - self._cookies = cookiejar_from_dict(cookies) - - cookie_header = get_cookie_header(self._cookies, self) - if cookie_header is not None: - self.headers['Cookie'] = cookie_header - - def prepare_hooks(self, hooks): - """Prepares the given hooks.""" - # hooks can be passed as None to the prepare method and to this - # method. To prevent iterating over None, simply use an empty list - # if hooks is False-y - hooks = hooks or [] - for event in hooks: - self.register_hook(event, hooks[event]) - - -class Response(object): - """The :class:`Response <Response>` object, which contains a - server's response to an HTTP request. - """ - - __attrs__ = [ - '_content', 'status_code', 'headers', 'url', 'history', - 'encoding', 'reason', 'cookies', 'elapsed', 'request' - ] - - def __init__(self): - self._content = False - self._content_consumed = False - self._next = None - - #: Integer Code of responded HTTP Status, e.g. 404 or 200. - self.status_code = None - - #: Case-insensitive Dictionary of Response Headers. - #: For example, ``headers['content-encoding']`` will return the - #: value of a ``'Content-Encoding'`` response header. - self.headers = CaseInsensitiveDict() - - #: File-like object representation of response (for advanced usage). - #: Use of ``raw`` requires that ``stream=True`` be set on the request. - # This requirement does not apply for use internally to Requests. - self.raw = None - - #: Final URL location of Response. - self.url = None - - #: Encoding to decode with when accessing r.text. - self.encoding = None - - #: A list of :class:`Response <Response>` objects from - #: the history of the Request. Any redirect responses will end - #: up here. The list is sorted from the oldest to the most recent request. - self.history = [] - - #: Textual reason of responded HTTP Status, e.g. "Not Found" or "OK". - self.reason = None - - #: A CookieJar of Cookies the server sent back. - self.cookies = cookiejar_from_dict({}) - - #: The amount of time elapsed between sending the request - #: and the arrival of the response (as a timedelta). - #: This property specifically measures the time taken between sending - #: the first byte of the request and finishing parsing the headers. It - #: is therefore unaffected by consuming the response content or the - #: value of the ``stream`` keyword argument. - self.elapsed = datetime.timedelta(0) - - #: The :class:`PreparedRequest <PreparedRequest>` object to which this - #: is a response. - self.request = None - - def __enter__(self): - return self - - def __exit__(self, *args): - self.close() - - def __getstate__(self): - # Consume everything; accessing the content attribute makes - # sure the content has been fully read. - if not self._content_consumed: - self.content - - return {attr: getattr(self, attr, None) for attr in self.__attrs__} - - def __setstate__(self, state): - for name, value in state.items(): - setattr(self, name, value) - - # pickled objects do not have .raw - setattr(self, '_content_consumed', True) - setattr(self, 'raw', None) - - def __repr__(self): - return '<Response [%s]>' % (self.status_code) - - def __bool__(self): - """Returns True if :attr:`status_code` is less than 400. - - This attribute checks if the status code of the response is between - 400 and 600 to see if there was a client error or a server error. If - the status code, is between 200 and 400, this will return True. This - is **not** a check to see if the response code is ``200 OK``. - """ - return self.ok - - def __nonzero__(self): - """Returns True if :attr:`status_code` is less than 400. - - This attribute checks if the status code of the response is between - 400 and 600 to see if there was a client error or a server error. If - the status code, is between 200 and 400, this will return True. This - is **not** a check to see if the response code is ``200 OK``. - """ - return self.ok - - def __iter__(self): - """Allows you to use a response as an iterator.""" - return self.iter_content(128) - - @property - def ok(self): - """Returns True if :attr:`status_code` is less than 400, False if not. - - This attribute checks if the status code of the response is between - 400 and 600 to see if there was a client error or a server error. If - the status code is between 200 and 400, this will return True. This - is **not** a check to see if the response code is ``200 OK``. - """ - try: - self.raise_for_status() - except HTTPError: - return False - return True - - @property - def is_redirect(self): - """True if this Response is a well-formed HTTP redirect that could have - been processed automatically (by :meth:`Session.resolve_redirects`). - """ - return ('location' in self.headers and self.status_code in REDIRECT_STATI) - - @property - def is_permanent_redirect(self): - """True if this Response one of the permanent versions of redirect.""" - return ('location' in self.headers and self.status_code in (codes.moved_permanently, codes.permanent_redirect)) - - @property - def next(self): - """Returns a PreparedRequest for the next request in a redirect chain, if there is one.""" - return self._next - - @property - def apparent_encoding(self): - """The apparent encoding, provided by the chardet library.""" - return chardet.detect(self.content)['encoding'] - - def iter_content(self, chunk_size=1, decode_unicode=False): - """Iterates over the response data. When stream=True is set on the - request, this avoids reading the content at once into memory for - large responses. The chunk size is the number of bytes it should - read into memory. This is not necessarily the length of each item - returned as decoding can take place. - - chunk_size must be of type int or None. A value of None will - function differently depending on the value of `stream`. - stream=True will read data as it arrives in whatever size the - chunks are received. If stream=False, data is returned as - a single chunk. - - If decode_unicode is True, content will be decoded using the best - available encoding based on the response. - """ - - def generate(): - # Special case for urllib3. - if hasattr(self.raw, 'stream'): - try: - for chunk in self.raw.stream(chunk_size, decode_content=True): - yield chunk - except ProtocolError as e: - raise ChunkedEncodingError(e) - except DecodeError as e: - raise ContentDecodingError(e) - except ReadTimeoutError as e: - raise ConnectionError(e) - else: - # Standard file-like object. - while True: - chunk = self.raw.read(chunk_size) - if not chunk: - break - yield chunk - - self._content_consumed = True - - if self._content_consumed and isinstance(self._content, bool): - raise StreamConsumedError() - elif chunk_size is not None and not isinstance(chunk_size, int): - raise TypeError("chunk_size must be an int, it is instead a %s." % type(chunk_size)) - # simulate reading small chunks of the content - reused_chunks = iter_slices(self._content, chunk_size) - - stream_chunks = generate() - - chunks = reused_chunks if self._content_consumed else stream_chunks - - if decode_unicode: - chunks = stream_decode_response_unicode(chunks, self) - - return chunks - - def iter_lines(self, chunk_size=ITER_CHUNK_SIZE, decode_unicode=False, delimiter=None): - """Iterates over the response data, one line at a time. When - stream=True is set on the request, this avoids reading the - content at once into memory for large responses. - - .. note:: This method is not reentrant safe. - """ - - pending = None - - for chunk in self.iter_content(chunk_size=chunk_size, decode_unicode=decode_unicode): - - if pending is not None: - chunk = pending + chunk - - if delimiter: - lines = chunk.split(delimiter) - else: - lines = chunk.splitlines() - - if lines and lines[-1] and chunk and lines[-1][-1] == chunk[-1]: - pending = lines.pop() - else: - pending = None - - for line in lines: - yield line - - if pending is not None: - yield pending - - @property - def content(self): - """Content of the response, in bytes.""" - - if self._content is False: - # Read the contents. - if self._content_consumed: - raise RuntimeError( - 'The content for this response was already consumed') - - if self.status_code == 0 or self.raw is None: - self._content = None - else: - self._content = b''.join(self.iter_content(CONTENT_CHUNK_SIZE)) or b'' - - self._content_consumed = True - # don't need to release the connection; that's been handled by urllib3 - # since we exhausted the data. - return self._content - - @property - def text(self): - """Content of the response, in unicode. - - If Response.encoding is None, encoding will be guessed using - ``chardet``. - - The encoding of the response content is determined based solely on HTTP - headers, following RFC 2616 to the letter. If you can take advantage of - non-HTTP knowledge to make a better guess at the encoding, you should - set ``r.encoding`` appropriately before accessing this property. - """ - - # Try charset from content-type - content = None - encoding = self.encoding - - if not self.content: - return str('') - - # Fallback to auto-detected encoding. - if self.encoding is None: - encoding = self.apparent_encoding - - # Decode unicode from given encoding. - try: - content = str(self.content, encoding, errors='replace') - except (LookupError, TypeError): - # A LookupError is raised if the encoding was not found which could - # indicate a misspelling or similar mistake. - # - # A TypeError can be raised if encoding is None - # - # So we try blindly encoding. - content = str(self.content, errors='replace') - - return content - - def json(self, **kwargs): - r"""Returns the json-encoded content of a response, if any. - - :param \*\*kwargs: Optional arguments that ``json.loads`` takes. - :raises ValueError: If the response body does not contain valid json. - """ - - if not self.encoding and self.content and len(self.content) > 3: - # No encoding set. JSON RFC 4627 section 3 states we should expect - # UTF-8, -16 or -32. Detect which one to use; If the detection or - # decoding fails, fall back to `self.text` (using chardet to make - # a best guess). - encoding = guess_json_utf(self.content) - if encoding is not None: - try: - return complexjson.loads( - self.content.decode(encoding), **kwargs - ) - except UnicodeDecodeError: - # Wrong UTF codec detected; usually because it's not UTF-8 - # but some other 8-bit codec. This is an RFC violation, - # and the server didn't bother to tell us what codec *was* - # used. - pass - return complexjson.loads(self.text, **kwargs) - - @property - def links(self): - """Returns the parsed header links of the response, if any.""" - - header = self.headers.get('link') - - # l = MultiDict() - l = {} - - if header: - links = parse_header_links(header) - - for link in links: - key = link.get('rel') or link.get('url') - l[key] = link - - return l - - def raise_for_status(self): - """Raises stored :class:`HTTPError`, if one occurred.""" - - http_error_msg = '' - if isinstance(self.reason, bytes): - # We attempt to decode utf-8 first because some servers - # choose to localize their reason strings. If the string - # isn't utf-8, we fall back to iso-8859-1 for all other - # encodings. (See PR #3538) - try: - reason = self.reason.decode('utf-8') - except UnicodeDecodeError: - reason = self.reason.decode('iso-8859-1') - else: - reason = self.reason - - if 400 <= self.status_code < 500: - http_error_msg = u'%s Client Error: %s for url: %s' % (self.status_code, reason, self.url) - - elif 500 <= self.status_code < 600: - http_error_msg = u'%s Server Error: %s for url: %s' % (self.status_code, reason, self.url) - - if http_error_msg: - raise HTTPError(http_error_msg, response=self) - - def close(self): - """Releases the connection back to the pool. Once this method has been - called the underlying ``raw`` object must not be accessed again. - - *Note: Should not normally need to be called explicitly.* - """ - if not self._content_consumed: - self.raw.close() - - release_conn = getattr(self.raw, 'release_conn', None) - if release_conn is not None: - release_conn() diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/packages.py b/env/lib/python3.7/site-packages/pip/_vendor/requests/packages.py deleted file mode 100644 index 9582fa7..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/requests/packages.py +++ /dev/null @@ -1,16 +0,0 @@ -import sys - -# This code exists for backwards compatibility reasons. -# I don't like it either. Just look the other way. :) - -for package in ('urllib3', 'idna', 'chardet'): - vendored_package = "pip._vendor." + package - locals()[package] = __import__(vendored_package) - # This traversal is apparently necessary such that the identities are - # preserved (requests.packages.urllib3.* is urllib3.*) - for mod in list(sys.modules): - if mod == vendored_package or mod.startswith(vendored_package + '.'): - unprefixed_mod = mod[len("pip._vendor."):] - sys.modules['pip._vendor.requests.packages.' + unprefixed_mod] = sys.modules[mod] - -# Kinda cool, though, right? diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/sessions.py b/env/lib/python3.7/site-packages/pip/_vendor/requests/sessions.py deleted file mode 100644 index d73d700..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/requests/sessions.py +++ /dev/null @@ -1,770 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.session -~~~~~~~~~~~~~~~~ - -This module provides a Session object to manage and persist settings across -requests (cookies, auth, proxies). -""" -import os -import sys -import time -from datetime import timedelta - -from .auth import _basic_auth_str -from .compat import cookielib, is_py3, OrderedDict, urljoin, urlparse, Mapping -from .cookies import ( - cookiejar_from_dict, extract_cookies_to_jar, RequestsCookieJar, merge_cookies) -from .models import Request, PreparedRequest, DEFAULT_REDIRECT_LIMIT -from .hooks import default_hooks, dispatch_hook -from ._internal_utils import to_native_string -from .utils import to_key_val_list, default_headers, DEFAULT_PORTS -from .exceptions import ( - TooManyRedirects, InvalidSchema, ChunkedEncodingError, ContentDecodingError) - -from .structures import CaseInsensitiveDict -from .adapters import HTTPAdapter - -from .utils import ( - requote_uri, get_environ_proxies, get_netrc_auth, should_bypass_proxies, - get_auth_from_url, rewind_body -) - -from .status_codes import codes - -# formerly defined here, reexposed here for backward compatibility -from .models import REDIRECT_STATI - -# Preferred clock, based on which one is more accurate on a given system. -if sys.platform == 'win32': - try: # Python 3.4+ - preferred_clock = time.perf_counter - except AttributeError: # Earlier than Python 3. - preferred_clock = time.clock -else: - preferred_clock = time.time - - -def merge_setting(request_setting, session_setting, dict_class=OrderedDict): - """Determines appropriate setting for a given request, taking into account - the explicit setting on that request, and the setting in the session. If a - setting is a dictionary, they will be merged together using `dict_class` - """ - - if session_setting is None: - return request_setting - - if request_setting is None: - return session_setting - - # Bypass if not a dictionary (e.g. verify) - if not ( - isinstance(session_setting, Mapping) and - isinstance(request_setting, Mapping) - ): - return request_setting - - merged_setting = dict_class(to_key_val_list(session_setting)) - merged_setting.update(to_key_val_list(request_setting)) - - # Remove keys that are set to None. Extract keys first to avoid altering - # the dictionary during iteration. - none_keys = [k for (k, v) in merged_setting.items() if v is None] - for key in none_keys: - del merged_setting[key] - - return merged_setting - - -def merge_hooks(request_hooks, session_hooks, dict_class=OrderedDict): - """Properly merges both requests and session hooks. - - This is necessary because when request_hooks == {'response': []}, the - merge breaks Session hooks entirely. - """ - if session_hooks is None or session_hooks.get('response') == []: - return request_hooks - - if request_hooks is None or request_hooks.get('response') == []: - return session_hooks - - return merge_setting(request_hooks, session_hooks, dict_class) - - -class SessionRedirectMixin(object): - - def get_redirect_target(self, resp): - """Receives a Response. Returns a redirect URI or ``None``""" - # Due to the nature of how requests processes redirects this method will - # be called at least once upon the original response and at least twice - # on each subsequent redirect response (if any). - # If a custom mixin is used to handle this logic, it may be advantageous - # to cache the redirect location onto the response object as a private - # attribute. - if resp.is_redirect: - location = resp.headers['location'] - # Currently the underlying http module on py3 decode headers - # in latin1, but empirical evidence suggests that latin1 is very - # rarely used with non-ASCII characters in HTTP headers. - # It is more likely to get UTF8 header rather than latin1. - # This causes incorrect handling of UTF8 encoded location headers. - # To solve this, we re-encode the location in latin1. - if is_py3: - location = location.encode('latin1') - return to_native_string(location, 'utf8') - return None - - def should_strip_auth(self, old_url, new_url): - """Decide whether Authorization header should be removed when redirecting""" - old_parsed = urlparse(old_url) - new_parsed = urlparse(new_url) - if old_parsed.hostname != new_parsed.hostname: - return True - # Special case: allow http -> https redirect when using the standard - # ports. This isn't specified by RFC 7235, but is kept to avoid - # breaking backwards compatibility with older versions of requests - # that allowed any redirects on the same host. - if (old_parsed.scheme == 'http' and old_parsed.port in (80, None) - and new_parsed.scheme == 'https' and new_parsed.port in (443, None)): - return False - - # Handle default port usage corresponding to scheme. - changed_port = old_parsed.port != new_parsed.port - changed_scheme = old_parsed.scheme != new_parsed.scheme - default_port = (DEFAULT_PORTS.get(old_parsed.scheme, None), None) - if (not changed_scheme and old_parsed.port in default_port - and new_parsed.port in default_port): - return False - - # Standard case: root URI must match - return changed_port or changed_scheme - - def resolve_redirects(self, resp, req, stream=False, timeout=None, - verify=True, cert=None, proxies=None, yield_requests=False, **adapter_kwargs): - """Receives a Response. Returns a generator of Responses or Requests.""" - - hist = [] # keep track of history - - url = self.get_redirect_target(resp) - previous_fragment = urlparse(req.url).fragment - while url: - prepared_request = req.copy() - - # Update history and keep track of redirects. - # resp.history must ignore the original request in this loop - hist.append(resp) - resp.history = hist[1:] - - try: - resp.content # Consume socket so it can be released - except (ChunkedEncodingError, ContentDecodingError, RuntimeError): - resp.raw.read(decode_content=False) - - if len(resp.history) >= self.max_redirects: - raise TooManyRedirects('Exceeded %s redirects.' % self.max_redirects, response=resp) - - # Release the connection back into the pool. - resp.close() - - # Handle redirection without scheme (see: RFC 1808 Section 4) - if url.startswith('//'): - parsed_rurl = urlparse(resp.url) - url = '%s:%s' % (to_native_string(parsed_rurl.scheme), url) - - # Normalize url case and attach previous fragment if needed (RFC 7231 7.1.2) - parsed = urlparse(url) - if parsed.fragment == '' and previous_fragment: - parsed = parsed._replace(fragment=previous_fragment) - elif parsed.fragment: - previous_fragment = parsed.fragment - url = parsed.geturl() - - # Facilitate relative 'location' headers, as allowed by RFC 7231. - # (e.g. '/path/to/resource' instead of 'http://domain.tld/path/to/resource') - # Compliant with RFC3986, we percent encode the url. - if not parsed.netloc: - url = urljoin(resp.url, requote_uri(url)) - else: - url = requote_uri(url) - - prepared_request.url = to_native_string(url) - - self.rebuild_method(prepared_request, resp) - - # https://github.com/requests/requests/issues/1084 - if resp.status_code not in (codes.temporary_redirect, codes.permanent_redirect): - # https://github.com/requests/requests/issues/3490 - purged_headers = ('Content-Length', 'Content-Type', 'Transfer-Encoding') - for header in purged_headers: - prepared_request.headers.pop(header, None) - prepared_request.body = None - - headers = prepared_request.headers - try: - del headers['Cookie'] - except KeyError: - pass - - # Extract any cookies sent on the response to the cookiejar - # in the new request. Because we've mutated our copied prepared - # request, use the old one that we haven't yet touched. - extract_cookies_to_jar(prepared_request._cookies, req, resp.raw) - merge_cookies(prepared_request._cookies, self.cookies) - prepared_request.prepare_cookies(prepared_request._cookies) - - # Rebuild auth and proxy information. - proxies = self.rebuild_proxies(prepared_request, proxies) - self.rebuild_auth(prepared_request, resp) - - # A failed tell() sets `_body_position` to `object()`. This non-None - # value ensures `rewindable` will be True, allowing us to raise an - # UnrewindableBodyError, instead of hanging the connection. - rewindable = ( - prepared_request._body_position is not None and - ('Content-Length' in headers or 'Transfer-Encoding' in headers) - ) - - # Attempt to rewind consumed file-like object. - if rewindable: - rewind_body(prepared_request) - - # Override the original request. - req = prepared_request - - if yield_requests: - yield req - else: - - resp = self.send( - req, - stream=stream, - timeout=timeout, - verify=verify, - cert=cert, - proxies=proxies, - allow_redirects=False, - **adapter_kwargs - ) - - extract_cookies_to_jar(self.cookies, prepared_request, resp.raw) - - # extract redirect url, if any, for the next loop - url = self.get_redirect_target(resp) - yield resp - - def rebuild_auth(self, prepared_request, response): - """When being redirected we may want to strip authentication from the - request to avoid leaking credentials. This method intelligently removes - and reapplies authentication where possible to avoid credential loss. - """ - headers = prepared_request.headers - url = prepared_request.url - - if 'Authorization' in headers and self.should_strip_auth(response.request.url, url): - # If we get redirected to a new host, we should strip out any - # authentication headers. - del headers['Authorization'] - - # .netrc might have more auth for us on our new host. - new_auth = get_netrc_auth(url) if self.trust_env else None - if new_auth is not None: - prepared_request.prepare_auth(new_auth) - - return - - def rebuild_proxies(self, prepared_request, proxies): - """This method re-evaluates the proxy configuration by considering the - environment variables. If we are redirected to a URL covered by - NO_PROXY, we strip the proxy configuration. Otherwise, we set missing - proxy keys for this URL (in case they were stripped by a previous - redirect). - - This method also replaces the Proxy-Authorization header where - necessary. - - :rtype: dict - """ - proxies = proxies if proxies is not None else {} - headers = prepared_request.headers - url = prepared_request.url - scheme = urlparse(url).scheme - new_proxies = proxies.copy() - no_proxy = proxies.get('no_proxy') - - bypass_proxy = should_bypass_proxies(url, no_proxy=no_proxy) - if self.trust_env and not bypass_proxy: - environ_proxies = get_environ_proxies(url, no_proxy=no_proxy) - - proxy = environ_proxies.get(scheme, environ_proxies.get('all')) - - if proxy: - new_proxies.setdefault(scheme, proxy) - - if 'Proxy-Authorization' in headers: - del headers['Proxy-Authorization'] - - try: - username, password = get_auth_from_url(new_proxies[scheme]) - except KeyError: - username, password = None, None - - if username and password: - headers['Proxy-Authorization'] = _basic_auth_str(username, password) - - return new_proxies - - def rebuild_method(self, prepared_request, response): - """When being redirected we may want to change the method of the request - based on certain specs or browser behavior. - """ - method = prepared_request.method - - # https://tools.ietf.org/html/rfc7231#section-6.4.4 - if response.status_code == codes.see_other and method != 'HEAD': - method = 'GET' - - # Do what the browsers do, despite standards... - # First, turn 302s into GETs. - if response.status_code == codes.found and method != 'HEAD': - method = 'GET' - - # Second, if a POST is responded to with a 301, turn it into a GET. - # This bizarre behaviour is explained in Issue 1704. - if response.status_code == codes.moved and method == 'POST': - method = 'GET' - - prepared_request.method = method - - -class Session(SessionRedirectMixin): - """A Requests session. - - Provides cookie persistence, connection-pooling, and configuration. - - Basic Usage:: - - >>> import requests - >>> s = requests.Session() - >>> s.get('https://httpbin.org/get') - <Response [200]> - - Or as a context manager:: - - >>> with requests.Session() as s: - >>> s.get('https://httpbin.org/get') - <Response [200]> - """ - - __attrs__ = [ - 'headers', 'cookies', 'auth', 'proxies', 'hooks', 'params', 'verify', - 'cert', 'prefetch', 'adapters', 'stream', 'trust_env', - 'max_redirects', - ] - - def __init__(self): - - #: A case-insensitive dictionary of headers to be sent on each - #: :class:`Request <Request>` sent from this - #: :class:`Session <Session>`. - self.headers = default_headers() - - #: Default Authentication tuple or object to attach to - #: :class:`Request <Request>`. - self.auth = None - - #: Dictionary mapping protocol or protocol and host to the URL of the proxy - #: (e.g. {'http': 'foo.bar:3128', 'http://host.name': 'foo.bar:4012'}) to - #: be used on each :class:`Request <Request>`. - self.proxies = {} - - #: Event-handling hooks. - self.hooks = default_hooks() - - #: Dictionary of querystring data to attach to each - #: :class:`Request <Request>`. The dictionary values may be lists for - #: representing multivalued query parameters. - self.params = {} - - #: Stream response content default. - self.stream = False - - #: SSL Verification default. - self.verify = True - - #: SSL client certificate default, if String, path to ssl client - #: cert file (.pem). If Tuple, ('cert', 'key') pair. - self.cert = None - - #: Maximum number of redirects allowed. If the request exceeds this - #: limit, a :class:`TooManyRedirects` exception is raised. - #: This defaults to requests.models.DEFAULT_REDIRECT_LIMIT, which is - #: 30. - self.max_redirects = DEFAULT_REDIRECT_LIMIT - - #: Trust environment settings for proxy configuration, default - #: authentication and similar. - self.trust_env = True - - #: A CookieJar containing all currently outstanding cookies set on this - #: session. By default it is a - #: :class:`RequestsCookieJar <requests.cookies.RequestsCookieJar>`, but - #: may be any other ``cookielib.CookieJar`` compatible object. - self.cookies = cookiejar_from_dict({}) - - # Default connection adapters. - self.adapters = OrderedDict() - self.mount('https://', HTTPAdapter()) - self.mount('http://', HTTPAdapter()) - - def __enter__(self): - return self - - def __exit__(self, *args): - self.close() - - def prepare_request(self, request): - """Constructs a :class:`PreparedRequest <PreparedRequest>` for - transmission and returns it. The :class:`PreparedRequest` has settings - merged from the :class:`Request <Request>` instance and those of the - :class:`Session`. - - :param request: :class:`Request` instance to prepare with this - session's settings. - :rtype: requests.PreparedRequest - """ - cookies = request.cookies or {} - - # Bootstrap CookieJar. - if not isinstance(cookies, cookielib.CookieJar): - cookies = cookiejar_from_dict(cookies) - - # Merge with session cookies - merged_cookies = merge_cookies( - merge_cookies(RequestsCookieJar(), self.cookies), cookies) - - # Set environment's basic authentication if not explicitly set. - auth = request.auth - if self.trust_env and not auth and not self.auth: - auth = get_netrc_auth(request.url) - - p = PreparedRequest() - p.prepare( - method=request.method.upper(), - url=request.url, - files=request.files, - data=request.data, - json=request.json, - headers=merge_setting(request.headers, self.headers, dict_class=CaseInsensitiveDict), - params=merge_setting(request.params, self.params), - auth=merge_setting(auth, self.auth), - cookies=merged_cookies, - hooks=merge_hooks(request.hooks, self.hooks), - ) - return p - - def request(self, method, url, - params=None, data=None, headers=None, cookies=None, files=None, - auth=None, timeout=None, allow_redirects=True, proxies=None, - hooks=None, stream=None, verify=None, cert=None, json=None): - """Constructs a :class:`Request <Request>`, prepares it and sends it. - Returns :class:`Response <Response>` object. - - :param method: method for the new :class:`Request` object. - :param url: URL for the new :class:`Request` object. - :param params: (optional) Dictionary or bytes to be sent in the query - string for the :class:`Request`. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param json: (optional) json to send in the body of the - :class:`Request`. - :param headers: (optional) Dictionary of HTTP Headers to send with the - :class:`Request`. - :param cookies: (optional) Dict or CookieJar object to send with the - :class:`Request`. - :param files: (optional) Dictionary of ``'filename': file-like-objects`` - for multipart encoding upload. - :param auth: (optional) Auth tuple or callable to enable - Basic/Digest/Custom HTTP Auth. - :param timeout: (optional) How long to wait for the server to send - data before giving up, as a float, or a :ref:`(connect timeout, - read timeout) <timeouts>` tuple. - :type timeout: float or tuple - :param allow_redirects: (optional) Set to True by default. - :type allow_redirects: bool - :param proxies: (optional) Dictionary mapping protocol or protocol and - hostname to the URL of the proxy. - :param stream: (optional) whether to immediately download the response - content. Defaults to ``False``. - :param verify: (optional) Either a boolean, in which case it controls whether we verify - the server's TLS certificate, or a string, in which case it must be a path - to a CA bundle to use. Defaults to ``True``. - :param cert: (optional) if String, path to ssl client cert file (.pem). - If Tuple, ('cert', 'key') pair. - :rtype: requests.Response - """ - # Create the Request. - req = Request( - method=method.upper(), - url=url, - headers=headers, - files=files, - data=data or {}, - json=json, - params=params or {}, - auth=auth, - cookies=cookies, - hooks=hooks, - ) - prep = self.prepare_request(req) - - proxies = proxies or {} - - settings = self.merge_environment_settings( - prep.url, proxies, stream, verify, cert - ) - - # Send the request. - send_kwargs = { - 'timeout': timeout, - 'allow_redirects': allow_redirects, - } - send_kwargs.update(settings) - resp = self.send(prep, **send_kwargs) - - return resp - - def get(self, url, **kwargs): - r"""Sends a GET request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - kwargs.setdefault('allow_redirects', True) - return self.request('GET', url, **kwargs) - - def options(self, url, **kwargs): - r"""Sends a OPTIONS request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - kwargs.setdefault('allow_redirects', True) - return self.request('OPTIONS', url, **kwargs) - - def head(self, url, **kwargs): - r"""Sends a HEAD request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - kwargs.setdefault('allow_redirects', False) - return self.request('HEAD', url, **kwargs) - - def post(self, url, data=None, json=None, **kwargs): - r"""Sends a POST request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param json: (optional) json to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - return self.request('POST', url, data=data, json=json, **kwargs) - - def put(self, url, data=None, **kwargs): - r"""Sends a PUT request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - return self.request('PUT', url, data=data, **kwargs) - - def patch(self, url, data=None, **kwargs): - r"""Sends a PATCH request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - return self.request('PATCH', url, data=data, **kwargs) - - def delete(self, url, **kwargs): - r"""Sends a DELETE request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - return self.request('DELETE', url, **kwargs) - - def send(self, request, **kwargs): - """Send a given PreparedRequest. - - :rtype: requests.Response - """ - # Set defaults that the hooks can utilize to ensure they always have - # the correct parameters to reproduce the previous request. - kwargs.setdefault('stream', self.stream) - kwargs.setdefault('verify', self.verify) - kwargs.setdefault('cert', self.cert) - kwargs.setdefault('proxies', self.proxies) - - # It's possible that users might accidentally send a Request object. - # Guard against that specific failure case. - if isinstance(request, Request): - raise ValueError('You can only send PreparedRequests.') - - # Set up variables needed for resolve_redirects and dispatching of hooks - allow_redirects = kwargs.pop('allow_redirects', True) - stream = kwargs.get('stream') - hooks = request.hooks - - # Get the appropriate adapter to use - adapter = self.get_adapter(url=request.url) - - # Start time (approximately) of the request - start = preferred_clock() - - # Send the request - r = adapter.send(request, **kwargs) - - # Total elapsed time of the request (approximately) - elapsed = preferred_clock() - start - r.elapsed = timedelta(seconds=elapsed) - - # Response manipulation hooks - r = dispatch_hook('response', hooks, r, **kwargs) - - # Persist cookies - if r.history: - - # If the hooks create history then we want those cookies too - for resp in r.history: - extract_cookies_to_jar(self.cookies, resp.request, resp.raw) - - extract_cookies_to_jar(self.cookies, request, r.raw) - - # Redirect resolving generator. - gen = self.resolve_redirects(r, request, **kwargs) - - # Resolve redirects if allowed. - history = [resp for resp in gen] if allow_redirects else [] - - # Shuffle things around if there's history. - if history: - # Insert the first (original) request at the start - history.insert(0, r) - # Get the last request made - r = history.pop() - r.history = history - - # If redirects aren't being followed, store the response on the Request for Response.next(). - if not allow_redirects: - try: - r._next = next(self.resolve_redirects(r, request, yield_requests=True, **kwargs)) - except StopIteration: - pass - - if not stream: - r.content - - return r - - def merge_environment_settings(self, url, proxies, stream, verify, cert): - """ - Check the environment and merge it with some settings. - - :rtype: dict - """ - # Gather clues from the surrounding environment. - if self.trust_env: - # Set environment's proxies. - no_proxy = proxies.get('no_proxy') if proxies is not None else None - env_proxies = get_environ_proxies(url, no_proxy=no_proxy) - for (k, v) in env_proxies.items(): - proxies.setdefault(k, v) - - # Look for requests environment configuration and be compatible - # with cURL. - if verify is True or verify is None: - verify = (os.environ.get('REQUESTS_CA_BUNDLE') or - os.environ.get('CURL_CA_BUNDLE')) - - # Merge all the kwargs. - proxies = merge_setting(proxies, self.proxies) - stream = merge_setting(stream, self.stream) - verify = merge_setting(verify, self.verify) - cert = merge_setting(cert, self.cert) - - return {'verify': verify, 'proxies': proxies, 'stream': stream, - 'cert': cert} - - def get_adapter(self, url): - """ - Returns the appropriate connection adapter for the given URL. - - :rtype: requests.adapters.BaseAdapter - """ - for (prefix, adapter) in self.adapters.items(): - - if url.lower().startswith(prefix.lower()): - return adapter - - # Nothing matches :-/ - raise InvalidSchema("No connection adapters were found for '%s'" % url) - - def close(self): - """Closes all adapters and as such the session""" - for v in self.adapters.values(): - v.close() - - def mount(self, prefix, adapter): - """Registers a connection adapter to a prefix. - - Adapters are sorted in descending order by prefix length. - """ - self.adapters[prefix] = adapter - keys_to_move = [k for k in self.adapters if len(k) < len(prefix)] - - for key in keys_to_move: - self.adapters[key] = self.adapters.pop(key) - - def __getstate__(self): - state = {attr: getattr(self, attr, None) for attr in self.__attrs__} - return state - - def __setstate__(self, state): - for attr, value in state.items(): - setattr(self, attr, value) - - -def session(): - """ - Returns a :class:`Session` for context-management. - - .. deprecated:: 1.0.0 - - This method has been deprecated since version 1.0.0 and is only kept for - backwards compatibility. New code should use :class:`~requests.sessions.Session` - to create a session. This may be removed at a future date. - - :rtype: Session - """ - return Session() diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/status_codes.py b/env/lib/python3.7/site-packages/pip/_vendor/requests/status_codes.py deleted file mode 100644 index 813e8c4..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/requests/status_codes.py +++ /dev/null @@ -1,120 +0,0 @@ -# -*- coding: utf-8 -*- - -r""" -The ``codes`` object defines a mapping from common names for HTTP statuses -to their numerical codes, accessible either as attributes or as dictionary -items. - ->>> requests.codes['temporary_redirect'] -307 ->>> requests.codes.teapot -418 ->>> requests.codes['\o/'] -200 - -Some codes have multiple names, and both upper- and lower-case versions of -the names are allowed. For example, ``codes.ok``, ``codes.OK``, and -``codes.okay`` all correspond to the HTTP status code 200. -""" - -from .structures import LookupDict - -_codes = { - - # Informational. - 100: ('continue',), - 101: ('switching_protocols',), - 102: ('processing',), - 103: ('checkpoint',), - 122: ('uri_too_long', 'request_uri_too_long'), - 200: ('ok', 'okay', 'all_ok', 'all_okay', 'all_good', '\\o/', '✓'), - 201: ('created',), - 202: ('accepted',), - 203: ('non_authoritative_info', 'non_authoritative_information'), - 204: ('no_content',), - 205: ('reset_content', 'reset'), - 206: ('partial_content', 'partial'), - 207: ('multi_status', 'multiple_status', 'multi_stati', 'multiple_stati'), - 208: ('already_reported',), - 226: ('im_used',), - - # Redirection. - 300: ('multiple_choices',), - 301: ('moved_permanently', 'moved', '\\o-'), - 302: ('found',), - 303: ('see_other', 'other'), - 304: ('not_modified',), - 305: ('use_proxy',), - 306: ('switch_proxy',), - 307: ('temporary_redirect', 'temporary_moved', 'temporary'), - 308: ('permanent_redirect', - 'resume_incomplete', 'resume',), # These 2 to be removed in 3.0 - - # Client Error. - 400: ('bad_request', 'bad'), - 401: ('unauthorized',), - 402: ('payment_required', 'payment'), - 403: ('forbidden',), - 404: ('not_found', '-o-'), - 405: ('method_not_allowed', 'not_allowed'), - 406: ('not_acceptable',), - 407: ('proxy_authentication_required', 'proxy_auth', 'proxy_authentication'), - 408: ('request_timeout', 'timeout'), - 409: ('conflict',), - 410: ('gone',), - 411: ('length_required',), - 412: ('precondition_failed', 'precondition'), - 413: ('request_entity_too_large',), - 414: ('request_uri_too_large',), - 415: ('unsupported_media_type', 'unsupported_media', 'media_type'), - 416: ('requested_range_not_satisfiable', 'requested_range', 'range_not_satisfiable'), - 417: ('expectation_failed',), - 418: ('im_a_teapot', 'teapot', 'i_am_a_teapot'), - 421: ('misdirected_request',), - 422: ('unprocessable_entity', 'unprocessable'), - 423: ('locked',), - 424: ('failed_dependency', 'dependency'), - 425: ('unordered_collection', 'unordered'), - 426: ('upgrade_required', 'upgrade'), - 428: ('precondition_required', 'precondition'), - 429: ('too_many_requests', 'too_many'), - 431: ('header_fields_too_large', 'fields_too_large'), - 444: ('no_response', 'none'), - 449: ('retry_with', 'retry'), - 450: ('blocked_by_windows_parental_controls', 'parental_controls'), - 451: ('unavailable_for_legal_reasons', 'legal_reasons'), - 499: ('client_closed_request',), - - # Server Error. - 500: ('internal_server_error', 'server_error', '/o\\', '✗'), - 501: ('not_implemented',), - 502: ('bad_gateway',), - 503: ('service_unavailable', 'unavailable'), - 504: ('gateway_timeout',), - 505: ('http_version_not_supported', 'http_version'), - 506: ('variant_also_negotiates',), - 507: ('insufficient_storage',), - 509: ('bandwidth_limit_exceeded', 'bandwidth'), - 510: ('not_extended',), - 511: ('network_authentication_required', 'network_auth', 'network_authentication'), -} - -codes = LookupDict(name='status_codes') - -def _init(): - for code, titles in _codes.items(): - for title in titles: - setattr(codes, title, code) - if not title.startswith(('\\', '/')): - setattr(codes, title.upper(), code) - - def doc(code): - names = ', '.join('``%s``' % n for n in _codes[code]) - return '* %d: %s' % (code, names) - - global __doc__ - __doc__ = (__doc__ + '\n' + - '\n'.join(doc(code) for code in sorted(_codes)) - if __doc__ is not None else None) - -_init() diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/structures.py b/env/lib/python3.7/site-packages/pip/_vendor/requests/structures.py deleted file mode 100644 index da930e2..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/requests/structures.py +++ /dev/null @@ -1,103 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.structures -~~~~~~~~~~~~~~~~~~~ - -Data structures that power Requests. -""" - -from .compat import OrderedDict, Mapping, MutableMapping - - -class CaseInsensitiveDict(MutableMapping): - """A case-insensitive ``dict``-like object. - - Implements all methods and operations of - ``MutableMapping`` as well as dict's ``copy``. Also - provides ``lower_items``. - - All keys are expected to be strings. The structure remembers the - case of the last key to be set, and ``iter(instance)``, - ``keys()``, ``items()``, ``iterkeys()``, and ``iteritems()`` - will contain case-sensitive keys. However, querying and contains - testing is case insensitive:: - - cid = CaseInsensitiveDict() - cid['Accept'] = 'application/json' - cid['aCCEPT'] == 'application/json' # True - list(cid) == ['Accept'] # True - - For example, ``headers['content-encoding']`` will return the - value of a ``'Content-Encoding'`` response header, regardless - of how the header name was originally stored. - - If the constructor, ``.update``, or equality comparison - operations are given keys that have equal ``.lower()``s, the - behavior is undefined. - """ - - def __init__(self, data=None, **kwargs): - self._store = OrderedDict() - if data is None: - data = {} - self.update(data, **kwargs) - - def __setitem__(self, key, value): - # Use the lowercased key for lookups, but store the actual - # key alongside the value. - self._store[key.lower()] = (key, value) - - def __getitem__(self, key): - return self._store[key.lower()][1] - - def __delitem__(self, key): - del self._store[key.lower()] - - def __iter__(self): - return (casedkey for casedkey, mappedvalue in self._store.values()) - - def __len__(self): - return len(self._store) - - def lower_items(self): - """Like iteritems(), but with all lowercase keys.""" - return ( - (lowerkey, keyval[1]) - for (lowerkey, keyval) - in self._store.items() - ) - - def __eq__(self, other): - if isinstance(other, Mapping): - other = CaseInsensitiveDict(other) - else: - return NotImplemented - # Compare insensitively - return dict(self.lower_items()) == dict(other.lower_items()) - - # Copy is required - def copy(self): - return CaseInsensitiveDict(self._store.values()) - - def __repr__(self): - return str(dict(self.items())) - - -class LookupDict(dict): - """Dictionary lookup object.""" - - def __init__(self, name=None): - self.name = name - super(LookupDict, self).__init__() - - def __repr__(self): - return '<lookup \'%s\'>' % (self.name) - - def __getitem__(self, key): - # We allow fall-through here, so values default to None - - return self.__dict__.get(key, None) - - def get(self, key, default=None): - return self.__dict__.get(key, default) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/utils.py b/env/lib/python3.7/site-packages/pip/_vendor/requests/utils.py deleted file mode 100644 index 8170a8d..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/requests/utils.py +++ /dev/null @@ -1,977 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.utils -~~~~~~~~~~~~~~ - -This module provides utility functions that are used within Requests -that are also useful for external consumption. -""" - -import codecs -import contextlib -import io -import os -import re -import socket -import struct -import sys -import tempfile -import warnings -import zipfile - -from .__version__ import __version__ -from . import certs -# to_native_string is unused here, but imported here for backwards compatibility -from ._internal_utils import to_native_string -from .compat import parse_http_list as _parse_list_header -from .compat import ( - quote, urlparse, bytes, str, OrderedDict, unquote, getproxies, - proxy_bypass, urlunparse, basestring, integer_types, is_py3, - proxy_bypass_environment, getproxies_environment, Mapping) -from .cookies import cookiejar_from_dict -from .structures import CaseInsensitiveDict -from .exceptions import ( - InvalidURL, InvalidHeader, FileModeWarning, UnrewindableBodyError) - -NETRC_FILES = ('.netrc', '_netrc') - -DEFAULT_CA_BUNDLE_PATH = certs.where() - -DEFAULT_PORTS = {'http': 80, 'https': 443} - - -if sys.platform == 'win32': - # provide a proxy_bypass version on Windows without DNS lookups - - def proxy_bypass_registry(host): - try: - if is_py3: - import winreg - else: - import _winreg as winreg - except ImportError: - return False - - try: - internetSettings = winreg.OpenKey(winreg.HKEY_CURRENT_USER, - r'Software\Microsoft\Windows\CurrentVersion\Internet Settings') - # ProxyEnable could be REG_SZ or REG_DWORD, normalizing it - proxyEnable = int(winreg.QueryValueEx(internetSettings, - 'ProxyEnable')[0]) - # ProxyOverride is almost always a string - proxyOverride = winreg.QueryValueEx(internetSettings, - 'ProxyOverride')[0] - except OSError: - return False - if not proxyEnable or not proxyOverride: - return False - - # make a check value list from the registry entry: replace the - # '<local>' string by the localhost entry and the corresponding - # canonical entry. - proxyOverride = proxyOverride.split(';') - # now check if we match one of the registry values. - for test in proxyOverride: - if test == '<local>': - if '.' not in host: - return True - test = test.replace(".", r"\.") # mask dots - test = test.replace("*", r".*") # change glob sequence - test = test.replace("?", r".") # change glob char - if re.match(test, host, re.I): - return True - return False - - def proxy_bypass(host): # noqa - """Return True, if the host should be bypassed. - - Checks proxy settings gathered from the environment, if specified, - or the registry. - """ - if getproxies_environment(): - return proxy_bypass_environment(host) - else: - return proxy_bypass_registry(host) - - -def dict_to_sequence(d): - """Returns an internal sequence dictionary update.""" - - if hasattr(d, 'items'): - d = d.items() - - return d - - -def super_len(o): - total_length = None - current_position = 0 - - if hasattr(o, '__len__'): - total_length = len(o) - - elif hasattr(o, 'len'): - total_length = o.len - - elif hasattr(o, 'fileno'): - try: - fileno = o.fileno() - except io.UnsupportedOperation: - pass - else: - total_length = os.fstat(fileno).st_size - - # Having used fstat to determine the file length, we need to - # confirm that this file was opened up in binary mode. - if 'b' not in o.mode: - warnings.warn(( - "Requests has determined the content-length for this " - "request using the binary size of the file: however, the " - "file has been opened in text mode (i.e. without the 'b' " - "flag in the mode). This may lead to an incorrect " - "content-length. In Requests 3.0, support will be removed " - "for files in text mode."), - FileModeWarning - ) - - if hasattr(o, 'tell'): - try: - current_position = o.tell() - except (OSError, IOError): - # This can happen in some weird situations, such as when the file - # is actually a special file descriptor like stdin. In this - # instance, we don't know what the length is, so set it to zero and - # let requests chunk it instead. - if total_length is not None: - current_position = total_length - else: - if hasattr(o, 'seek') and total_length is None: - # StringIO and BytesIO have seek but no useable fileno - try: - # seek to end of file - o.seek(0, 2) - total_length = o.tell() - - # seek back to current position to support - # partially read file-like objects - o.seek(current_position or 0) - except (OSError, IOError): - total_length = 0 - - if total_length is None: - total_length = 0 - - return max(0, total_length - current_position) - - -def get_netrc_auth(url, raise_errors=False): - """Returns the Requests tuple auth for a given url from netrc.""" - - try: - from netrc import netrc, NetrcParseError - - netrc_path = None - - for f in NETRC_FILES: - try: - loc = os.path.expanduser('~/{}'.format(f)) - except KeyError: - # os.path.expanduser can fail when $HOME is undefined and - # getpwuid fails. See https://bugs.python.org/issue20164 & - # https://github.com/requests/requests/issues/1846 - return - - if os.path.exists(loc): - netrc_path = loc - break - - # Abort early if there isn't one. - if netrc_path is None: - return - - ri = urlparse(url) - - # Strip port numbers from netloc. This weird `if...encode`` dance is - # used for Python 3.2, which doesn't support unicode literals. - splitstr = b':' - if isinstance(url, str): - splitstr = splitstr.decode('ascii') - host = ri.netloc.split(splitstr)[0] - - try: - _netrc = netrc(netrc_path).authenticators(host) - if _netrc: - # Return with login / password - login_i = (0 if _netrc[0] else 1) - return (_netrc[login_i], _netrc[2]) - except (NetrcParseError, IOError): - # If there was a parsing error or a permissions issue reading the file, - # we'll just skip netrc auth unless explicitly asked to raise errors. - if raise_errors: - raise - - # AppEngine hackiness. - except (ImportError, AttributeError): - pass - - -def guess_filename(obj): - """Tries to guess the filename of the given object.""" - name = getattr(obj, 'name', None) - if (name and isinstance(name, basestring) and name[0] != '<' and - name[-1] != '>'): - return os.path.basename(name) - - -def extract_zipped_paths(path): - """Replace nonexistent paths that look like they refer to a member of a zip - archive with the location of an extracted copy of the target, or else - just return the provided path unchanged. - """ - if os.path.exists(path): - # this is already a valid path, no need to do anything further - return path - - # find the first valid part of the provided path and treat that as a zip archive - # assume the rest of the path is the name of a member in the archive - archive, member = os.path.split(path) - while archive and not os.path.exists(archive): - archive, prefix = os.path.split(archive) - member = '/'.join([prefix, member]) - - if not zipfile.is_zipfile(archive): - return path - - zip_file = zipfile.ZipFile(archive) - if member not in zip_file.namelist(): - return path - - # we have a valid zip archive and a valid member of that archive - tmp = tempfile.gettempdir() - extracted_path = os.path.join(tmp, *member.split('/')) - if not os.path.exists(extracted_path): - extracted_path = zip_file.extract(member, path=tmp) - - return extracted_path - - -def from_key_val_list(value): - """Take an object and test to see if it can be represented as a - dictionary. Unless it can not be represented as such, return an - OrderedDict, e.g., - - :: - - >>> from_key_val_list([('key', 'val')]) - OrderedDict([('key', 'val')]) - >>> from_key_val_list('string') - ValueError: cannot encode objects that are not 2-tuples - >>> from_key_val_list({'key': 'val'}) - OrderedDict([('key', 'val')]) - - :rtype: OrderedDict - """ - if value is None: - return None - - if isinstance(value, (str, bytes, bool, int)): - raise ValueError('cannot encode objects that are not 2-tuples') - - return OrderedDict(value) - - -def to_key_val_list(value): - """Take an object and test to see if it can be represented as a - dictionary. If it can be, return a list of tuples, e.g., - - :: - - >>> to_key_val_list([('key', 'val')]) - [('key', 'val')] - >>> to_key_val_list({'key': 'val'}) - [('key', 'val')] - >>> to_key_val_list('string') - ValueError: cannot encode objects that are not 2-tuples. - - :rtype: list - """ - if value is None: - return None - - if isinstance(value, (str, bytes, bool, int)): - raise ValueError('cannot encode objects that are not 2-tuples') - - if isinstance(value, Mapping): - value = value.items() - - return list(value) - - -# From mitsuhiko/werkzeug (used with permission). -def parse_list_header(value): - """Parse lists as described by RFC 2068 Section 2. - - In particular, parse comma-separated lists where the elements of - the list may include quoted-strings. A quoted-string could - contain a comma. A non-quoted string could have quotes in the - middle. Quotes are removed automatically after parsing. - - It basically works like :func:`parse_set_header` just that items - may appear multiple times and case sensitivity is preserved. - - The return value is a standard :class:`list`: - - >>> parse_list_header('token, "quoted value"') - ['token', 'quoted value'] - - To create a header from the :class:`list` again, use the - :func:`dump_header` function. - - :param value: a string with a list header. - :return: :class:`list` - :rtype: list - """ - result = [] - for item in _parse_list_header(value): - if item[:1] == item[-1:] == '"': - item = unquote_header_value(item[1:-1]) - result.append(item) - return result - - -# From mitsuhiko/werkzeug (used with permission). -def parse_dict_header(value): - """Parse lists of key, value pairs as described by RFC 2068 Section 2 and - convert them into a python dict: - - >>> d = parse_dict_header('foo="is a fish", bar="as well"') - >>> type(d) is dict - True - >>> sorted(d.items()) - [('bar', 'as well'), ('foo', 'is a fish')] - - If there is no value for a key it will be `None`: - - >>> parse_dict_header('key_without_value') - {'key_without_value': None} - - To create a header from the :class:`dict` again, use the - :func:`dump_header` function. - - :param value: a string with a dict header. - :return: :class:`dict` - :rtype: dict - """ - result = {} - for item in _parse_list_header(value): - if '=' not in item: - result[item] = None - continue - name, value = item.split('=', 1) - if value[:1] == value[-1:] == '"': - value = unquote_header_value(value[1:-1]) - result[name] = value - return result - - -# From mitsuhiko/werkzeug (used with permission). -def unquote_header_value(value, is_filename=False): - r"""Unquotes a header value. (Reversal of :func:`quote_header_value`). - This does not use the real unquoting but what browsers are actually - using for quoting. - - :param value: the header value to unquote. - :rtype: str - """ - if value and value[0] == value[-1] == '"': - # this is not the real unquoting, but fixing this so that the - # RFC is met will result in bugs with internet explorer and - # probably some other browsers as well. IE for example is - # uploading files with "C:\foo\bar.txt" as filename - value = value[1:-1] - - # if this is a filename and the starting characters look like - # a UNC path, then just return the value without quotes. Using the - # replace sequence below on a UNC path has the effect of turning - # the leading double slash into a single slash and then - # _fix_ie_filename() doesn't work correctly. See #458. - if not is_filename or value[:2] != '\\\\': - return value.replace('\\\\', '\\').replace('\\"', '"') - return value - - -def dict_from_cookiejar(cj): - """Returns a key/value dictionary from a CookieJar. - - :param cj: CookieJar object to extract cookies from. - :rtype: dict - """ - - cookie_dict = {} - - for cookie in cj: - cookie_dict[cookie.name] = cookie.value - - return cookie_dict - - -def add_dict_to_cookiejar(cj, cookie_dict): - """Returns a CookieJar from a key/value dictionary. - - :param cj: CookieJar to insert cookies into. - :param cookie_dict: Dict of key/values to insert into CookieJar. - :rtype: CookieJar - """ - - return cookiejar_from_dict(cookie_dict, cj) - - -def get_encodings_from_content(content): - """Returns encodings from given content string. - - :param content: bytestring to extract encodings from. - """ - warnings.warn(( - 'In requests 3.0, get_encodings_from_content will be removed. For ' - 'more information, please see the discussion on issue #2266. (This' - ' warning should only appear once.)'), - DeprecationWarning) - - charset_re = re.compile(r'<meta.*?charset=["\']*(.+?)["\'>]', flags=re.I) - pragma_re = re.compile(r'<meta.*?content=["\']*;?charset=(.+?)["\'>]', flags=re.I) - xml_re = re.compile(r'^<\?xml.*?encoding=["\']*(.+?)["\'>]') - - return (charset_re.findall(content) + - pragma_re.findall(content) + - xml_re.findall(content)) - - -def _parse_content_type_header(header): - """Returns content type and parameters from given header - - :param header: string - :return: tuple containing content type and dictionary of - parameters - """ - - tokens = header.split(';') - content_type, params = tokens[0].strip(), tokens[1:] - params_dict = {} - items_to_strip = "\"' " - - for param in params: - param = param.strip() - if param: - key, value = param, True - index_of_equals = param.find("=") - if index_of_equals != -1: - key = param[:index_of_equals].strip(items_to_strip) - value = param[index_of_equals + 1:].strip(items_to_strip) - params_dict[key.lower()] = value - return content_type, params_dict - - -def get_encoding_from_headers(headers): - """Returns encodings from given HTTP Header Dict. - - :param headers: dictionary to extract encoding from. - :rtype: str - """ - - content_type = headers.get('content-type') - - if not content_type: - return None - - content_type, params = _parse_content_type_header(content_type) - - if 'charset' in params: - return params['charset'].strip("'\"") - - if 'text' in content_type: - return 'ISO-8859-1' - - -def stream_decode_response_unicode(iterator, r): - """Stream decodes a iterator.""" - - if r.encoding is None: - for item in iterator: - yield item - return - - decoder = codecs.getincrementaldecoder(r.encoding)(errors='replace') - for chunk in iterator: - rv = decoder.decode(chunk) - if rv: - yield rv - rv = decoder.decode(b'', final=True) - if rv: - yield rv - - -def iter_slices(string, slice_length): - """Iterate over slices of a string.""" - pos = 0 - if slice_length is None or slice_length <= 0: - slice_length = len(string) - while pos < len(string): - yield string[pos:pos + slice_length] - pos += slice_length - - -def get_unicode_from_response(r): - """Returns the requested content back in unicode. - - :param r: Response object to get unicode content from. - - Tried: - - 1. charset from content-type - 2. fall back and replace all unicode characters - - :rtype: str - """ - warnings.warn(( - 'In requests 3.0, get_unicode_from_response will be removed. For ' - 'more information, please see the discussion on issue #2266. (This' - ' warning should only appear once.)'), - DeprecationWarning) - - tried_encodings = [] - - # Try charset from content-type - encoding = get_encoding_from_headers(r.headers) - - if encoding: - try: - return str(r.content, encoding) - except UnicodeError: - tried_encodings.append(encoding) - - # Fall back: - try: - return str(r.content, encoding, errors='replace') - except TypeError: - return r.content - - -# The unreserved URI characters (RFC 3986) -UNRESERVED_SET = frozenset( - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + "0123456789-._~") - - -def unquote_unreserved(uri): - """Un-escape any percent-escape sequences in a URI that are unreserved - characters. This leaves all reserved, illegal and non-ASCII bytes encoded. - - :rtype: str - """ - parts = uri.split('%') - for i in range(1, len(parts)): - h = parts[i][0:2] - if len(h) == 2 and h.isalnum(): - try: - c = chr(int(h, 16)) - except ValueError: - raise InvalidURL("Invalid percent-escape sequence: '%s'" % h) - - if c in UNRESERVED_SET: - parts[i] = c + parts[i][2:] - else: - parts[i] = '%' + parts[i] - else: - parts[i] = '%' + parts[i] - return ''.join(parts) - - -def requote_uri(uri): - """Re-quote the given URI. - - This function passes the given URI through an unquote/quote cycle to - ensure that it is fully and consistently quoted. - - :rtype: str - """ - safe_with_percent = "!#$%&'()*+,/:;=?@[]~" - safe_without_percent = "!#$&'()*+,/:;=?@[]~" - try: - # Unquote only the unreserved characters - # Then quote only illegal characters (do not quote reserved, - # unreserved, or '%') - return quote(unquote_unreserved(uri), safe=safe_with_percent) - except InvalidURL: - # We couldn't unquote the given URI, so let's try quoting it, but - # there may be unquoted '%'s in the URI. We need to make sure they're - # properly quoted so they do not cause issues elsewhere. - return quote(uri, safe=safe_without_percent) - - -def address_in_network(ip, net): - """This function allows you to check if an IP belongs to a network subnet - - Example: returns True if ip = 192.168.1.1 and net = 192.168.1.0/24 - returns False if ip = 192.168.1.1 and net = 192.168.100.0/24 - - :rtype: bool - """ - ipaddr = struct.unpack('=L', socket.inet_aton(ip))[0] - netaddr, bits = net.split('/') - netmask = struct.unpack('=L', socket.inet_aton(dotted_netmask(int(bits))))[0] - network = struct.unpack('=L', socket.inet_aton(netaddr))[0] & netmask - return (ipaddr & netmask) == (network & netmask) - - -def dotted_netmask(mask): - """Converts mask from /xx format to xxx.xxx.xxx.xxx - - Example: if mask is 24 function returns 255.255.255.0 - - :rtype: str - """ - bits = 0xffffffff ^ (1 << 32 - mask) - 1 - return socket.inet_ntoa(struct.pack('>I', bits)) - - -def is_ipv4_address(string_ip): - """ - :rtype: bool - """ - try: - socket.inet_aton(string_ip) - except socket.error: - return False - return True - - -def is_valid_cidr(string_network): - """ - Very simple check of the cidr format in no_proxy variable. - - :rtype: bool - """ - if string_network.count('/') == 1: - try: - mask = int(string_network.split('/')[1]) - except ValueError: - return False - - if mask < 1 or mask > 32: - return False - - try: - socket.inet_aton(string_network.split('/')[0]) - except socket.error: - return False - else: - return False - return True - - -@contextlib.contextmanager -def set_environ(env_name, value): - """Set the environment variable 'env_name' to 'value' - - Save previous value, yield, and then restore the previous value stored in - the environment variable 'env_name'. - - If 'value' is None, do nothing""" - value_changed = value is not None - if value_changed: - old_value = os.environ.get(env_name) - os.environ[env_name] = value - try: - yield - finally: - if value_changed: - if old_value is None: - del os.environ[env_name] - else: - os.environ[env_name] = old_value - - -def should_bypass_proxies(url, no_proxy): - """ - Returns whether we should bypass proxies or not. - - :rtype: bool - """ - # Prioritize lowercase environment variables over uppercase - # to keep a consistent behaviour with other http projects (curl, wget). - get_proxy = lambda k: os.environ.get(k) or os.environ.get(k.upper()) - - # First check whether no_proxy is defined. If it is, check that the URL - # we're getting isn't in the no_proxy list. - no_proxy_arg = no_proxy - if no_proxy is None: - no_proxy = get_proxy('no_proxy') - parsed = urlparse(url) - - if parsed.hostname is None: - # URLs don't always have hostnames, e.g. file:/// urls. - return True - - if no_proxy: - # We need to check whether we match here. We need to see if we match - # the end of the hostname, both with and without the port. - no_proxy = ( - host for host in no_proxy.replace(' ', '').split(',') if host - ) - - if is_ipv4_address(parsed.hostname): - for proxy_ip in no_proxy: - if is_valid_cidr(proxy_ip): - if address_in_network(parsed.hostname, proxy_ip): - return True - elif parsed.hostname == proxy_ip: - # If no_proxy ip was defined in plain IP notation instead of cidr notation & - # matches the IP of the index - return True - else: - host_with_port = parsed.hostname - if parsed.port: - host_with_port += ':{}'.format(parsed.port) - - for host in no_proxy: - if parsed.hostname.endswith(host) or host_with_port.endswith(host): - # The URL does match something in no_proxy, so we don't want - # to apply the proxies on this URL. - return True - - with set_environ('no_proxy', no_proxy_arg): - # parsed.hostname can be `None` in cases such as a file URI. - try: - bypass = proxy_bypass(parsed.hostname) - except (TypeError, socket.gaierror): - bypass = False - - if bypass: - return True - - return False - - -def get_environ_proxies(url, no_proxy=None): - """ - Return a dict of environment proxies. - - :rtype: dict - """ - if should_bypass_proxies(url, no_proxy=no_proxy): - return {} - else: - return getproxies() - - -def select_proxy(url, proxies): - """Select a proxy for the url, if applicable. - - :param url: The url being for the request - :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs - """ - proxies = proxies or {} - urlparts = urlparse(url) - if urlparts.hostname is None: - return proxies.get(urlparts.scheme, proxies.get('all')) - - proxy_keys = [ - urlparts.scheme + '://' + urlparts.hostname, - urlparts.scheme, - 'all://' + urlparts.hostname, - 'all', - ] - proxy = None - for proxy_key in proxy_keys: - if proxy_key in proxies: - proxy = proxies[proxy_key] - break - - return proxy - - -def default_user_agent(name="python-requests"): - """ - Return a string representing the default user agent. - - :rtype: str - """ - return '%s/%s' % (name, __version__) - - -def default_headers(): - """ - :rtype: requests.structures.CaseInsensitiveDict - """ - return CaseInsensitiveDict({ - 'User-Agent': default_user_agent(), - 'Accept-Encoding': ', '.join(('gzip', 'deflate')), - 'Accept': '*/*', - 'Connection': 'keep-alive', - }) - - -def parse_header_links(value): - """Return a list of parsed link headers proxies. - - i.e. Link: <http:/.../front.jpeg>; rel=front; type="image/jpeg",<http://.../back.jpeg>; rel=back;type="image/jpeg" - - :rtype: list - """ - - links = [] - - replace_chars = ' \'"' - - value = value.strip(replace_chars) - if not value: - return links - - for val in re.split(', *<', value): - try: - url, params = val.split(';', 1) - except ValueError: - url, params = val, '' - - link = {'url': url.strip('<> \'"')} - - for param in params.split(';'): - try: - key, value = param.split('=') - except ValueError: - break - - link[key.strip(replace_chars)] = value.strip(replace_chars) - - links.append(link) - - return links - - -# Null bytes; no need to recreate these on each call to guess_json_utf -_null = '\x00'.encode('ascii') # encoding to ASCII for Python 3 -_null2 = _null * 2 -_null3 = _null * 3 - - -def guess_json_utf(data): - """ - :rtype: str - """ - # JSON always starts with two ASCII characters, so detection is as - # easy as counting the nulls and from their location and count - # determine the encoding. Also detect a BOM, if present. - sample = data[:4] - if sample in (codecs.BOM_UTF32_LE, codecs.BOM_UTF32_BE): - return 'utf-32' # BOM included - if sample[:3] == codecs.BOM_UTF8: - return 'utf-8-sig' # BOM included, MS style (discouraged) - if sample[:2] in (codecs.BOM_UTF16_LE, codecs.BOM_UTF16_BE): - return 'utf-16' # BOM included - nullcount = sample.count(_null) - if nullcount == 0: - return 'utf-8' - if nullcount == 2: - if sample[::2] == _null2: # 1st and 3rd are null - return 'utf-16-be' - if sample[1::2] == _null2: # 2nd and 4th are null - return 'utf-16-le' - # Did not detect 2 valid UTF-16 ascii-range characters - if nullcount == 3: - if sample[:3] == _null3: - return 'utf-32-be' - if sample[1:] == _null3: - return 'utf-32-le' - # Did not detect a valid UTF-32 ascii-range character - return None - - -def prepend_scheme_if_needed(url, new_scheme): - """Given a URL that may or may not have a scheme, prepend the given scheme. - Does not replace a present scheme with the one provided as an argument. - - :rtype: str - """ - scheme, netloc, path, params, query, fragment = urlparse(url, new_scheme) - - # urlparse is a finicky beast, and sometimes decides that there isn't a - # netloc present. Assume that it's being over-cautious, and switch netloc - # and path if urlparse decided there was no netloc. - if not netloc: - netloc, path = path, netloc - - return urlunparse((scheme, netloc, path, params, query, fragment)) - - -def get_auth_from_url(url): - """Given a url with authentication components, extract them into a tuple of - username,password. - - :rtype: (str,str) - """ - parsed = urlparse(url) - - try: - auth = (unquote(parsed.username), unquote(parsed.password)) - except (AttributeError, TypeError): - auth = ('', '') - - return auth - - -# Moved outside of function to avoid recompile every call -_CLEAN_HEADER_REGEX_BYTE = re.compile(b'^\\S[^\\r\\n]*$|^$') -_CLEAN_HEADER_REGEX_STR = re.compile(r'^\S[^\r\n]*$|^$') - - -def check_header_validity(header): - """Verifies that header value is a string which doesn't contain - leading whitespace or return characters. This prevents unintended - header injection. - - :param header: tuple, in the format (name, value). - """ - name, value = header - - if isinstance(value, bytes): - pat = _CLEAN_HEADER_REGEX_BYTE - else: - pat = _CLEAN_HEADER_REGEX_STR - try: - if not pat.match(value): - raise InvalidHeader("Invalid return character or leading space in header: %s" % name) - except TypeError: - raise InvalidHeader("Value for header {%s: %s} must be of type str or " - "bytes, not %s" % (name, value, type(value))) - - -def urldefragauth(url): - """ - Given a url remove the fragment and the authentication part. - - :rtype: str - """ - scheme, netloc, path, params, query, fragment = urlparse(url) - - # see func:`prepend_scheme_if_needed` - if not netloc: - netloc, path = path, netloc - - netloc = netloc.rsplit('@', 1)[-1] - - return urlunparse((scheme, netloc, path, params, query, '')) - - -def rewind_body(prepared_request): - """Move file pointer back to its recorded starting position - so it can be read again on redirect. - """ - body_seek = getattr(prepared_request.body, 'seek', None) - if body_seek is not None and isinstance(prepared_request._body_position, integer_types): - try: - body_seek(prepared_request._body_position) - except (IOError, OSError): - raise UnrewindableBodyError("An error occurred when rewinding request " - "body for redirect.") - else: - raise UnrewindableBodyError("Unable to rewind request body for redirect.") diff --git a/env/lib/python3.7/site-packages/pip/_vendor/retrying.py b/env/lib/python3.7/site-packages/pip/_vendor/retrying.py deleted file mode 100644 index 6d1e627..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/retrying.py +++ /dev/null @@ -1,267 +0,0 @@ -## Copyright 2013-2014 Ray Holder -## -## Licensed under the Apache License, Version 2.0 (the "License"); -## you may not use this file except in compliance with the License. -## You may obtain a copy of the License at -## -## http://www.apache.org/licenses/LICENSE-2.0 -## -## Unless required by applicable law or agreed to in writing, software -## distributed under the License is distributed on an "AS IS" BASIS, -## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -## See the License for the specific language governing permissions and -## limitations under the License. - -import random -from pip._vendor import six -import sys -import time -import traceback - - -# sys.maxint / 2, since Python 3.2 doesn't have a sys.maxint... -MAX_WAIT = 1073741823 - - -def retry(*dargs, **dkw): - """ - Decorator function that instantiates the Retrying object - @param *dargs: positional arguments passed to Retrying object - @param **dkw: keyword arguments passed to the Retrying object - """ - # support both @retry and @retry() as valid syntax - if len(dargs) == 1 and callable(dargs[0]): - def wrap_simple(f): - - @six.wraps(f) - def wrapped_f(*args, **kw): - return Retrying().call(f, *args, **kw) - - return wrapped_f - - return wrap_simple(dargs[0]) - - else: - def wrap(f): - - @six.wraps(f) - def wrapped_f(*args, **kw): - return Retrying(*dargs, **dkw).call(f, *args, **kw) - - return wrapped_f - - return wrap - - -class Retrying(object): - - def __init__(self, - stop=None, wait=None, - stop_max_attempt_number=None, - stop_max_delay=None, - wait_fixed=None, - wait_random_min=None, wait_random_max=None, - wait_incrementing_start=None, wait_incrementing_increment=None, - wait_exponential_multiplier=None, wait_exponential_max=None, - retry_on_exception=None, - retry_on_result=None, - wrap_exception=False, - stop_func=None, - wait_func=None, - wait_jitter_max=None): - - self._stop_max_attempt_number = 5 if stop_max_attempt_number is None else stop_max_attempt_number - self._stop_max_delay = 100 if stop_max_delay is None else stop_max_delay - self._wait_fixed = 1000 if wait_fixed is None else wait_fixed - self._wait_random_min = 0 if wait_random_min is None else wait_random_min - self._wait_random_max = 1000 if wait_random_max is None else wait_random_max - self._wait_incrementing_start = 0 if wait_incrementing_start is None else wait_incrementing_start - self._wait_incrementing_increment = 100 if wait_incrementing_increment is None else wait_incrementing_increment - self._wait_exponential_multiplier = 1 if wait_exponential_multiplier is None else wait_exponential_multiplier - self._wait_exponential_max = MAX_WAIT if wait_exponential_max is None else wait_exponential_max - self._wait_jitter_max = 0 if wait_jitter_max is None else wait_jitter_max - - # TODO add chaining of stop behaviors - # stop behavior - stop_funcs = [] - if stop_max_attempt_number is not None: - stop_funcs.append(self.stop_after_attempt) - - if stop_max_delay is not None: - stop_funcs.append(self.stop_after_delay) - - if stop_func is not None: - self.stop = stop_func - - elif stop is None: - self.stop = lambda attempts, delay: any(f(attempts, delay) for f in stop_funcs) - - else: - self.stop = getattr(self, stop) - - # TODO add chaining of wait behaviors - # wait behavior - wait_funcs = [lambda *args, **kwargs: 0] - if wait_fixed is not None: - wait_funcs.append(self.fixed_sleep) - - if wait_random_min is not None or wait_random_max is not None: - wait_funcs.append(self.random_sleep) - - if wait_incrementing_start is not None or wait_incrementing_increment is not None: - wait_funcs.append(self.incrementing_sleep) - - if wait_exponential_multiplier is not None or wait_exponential_max is not None: - wait_funcs.append(self.exponential_sleep) - - if wait_func is not None: - self.wait = wait_func - - elif wait is None: - self.wait = lambda attempts, delay: max(f(attempts, delay) for f in wait_funcs) - - else: - self.wait = getattr(self, wait) - - # retry on exception filter - if retry_on_exception is None: - self._retry_on_exception = self.always_reject - else: - self._retry_on_exception = retry_on_exception - - # TODO simplify retrying by Exception types - # retry on result filter - if retry_on_result is None: - self._retry_on_result = self.never_reject - else: - self._retry_on_result = retry_on_result - - self._wrap_exception = wrap_exception - - def stop_after_attempt(self, previous_attempt_number, delay_since_first_attempt_ms): - """Stop after the previous attempt >= stop_max_attempt_number.""" - return previous_attempt_number >= self._stop_max_attempt_number - - def stop_after_delay(self, previous_attempt_number, delay_since_first_attempt_ms): - """Stop after the time from the first attempt >= stop_max_delay.""" - return delay_since_first_attempt_ms >= self._stop_max_delay - - def no_sleep(self, previous_attempt_number, delay_since_first_attempt_ms): - """Don't sleep at all before retrying.""" - return 0 - - def fixed_sleep(self, previous_attempt_number, delay_since_first_attempt_ms): - """Sleep a fixed amount of time between each retry.""" - return self._wait_fixed - - def random_sleep(self, previous_attempt_number, delay_since_first_attempt_ms): - """Sleep a random amount of time between wait_random_min and wait_random_max""" - return random.randint(self._wait_random_min, self._wait_random_max) - - def incrementing_sleep(self, previous_attempt_number, delay_since_first_attempt_ms): - """ - Sleep an incremental amount of time after each attempt, starting at - wait_incrementing_start and incrementing by wait_incrementing_increment - """ - result = self._wait_incrementing_start + (self._wait_incrementing_increment * (previous_attempt_number - 1)) - if result < 0: - result = 0 - return result - - def exponential_sleep(self, previous_attempt_number, delay_since_first_attempt_ms): - exp = 2 ** previous_attempt_number - result = self._wait_exponential_multiplier * exp - if result > self._wait_exponential_max: - result = self._wait_exponential_max - if result < 0: - result = 0 - return result - - def never_reject(self, result): - return False - - def always_reject(self, result): - return True - - def should_reject(self, attempt): - reject = False - if attempt.has_exception: - reject |= self._retry_on_exception(attempt.value[1]) - else: - reject |= self._retry_on_result(attempt.value) - - return reject - - def call(self, fn, *args, **kwargs): - start_time = int(round(time.time() * 1000)) - attempt_number = 1 - while True: - try: - attempt = Attempt(fn(*args, **kwargs), attempt_number, False) - except: - tb = sys.exc_info() - attempt = Attempt(tb, attempt_number, True) - - if not self.should_reject(attempt): - return attempt.get(self._wrap_exception) - - delay_since_first_attempt_ms = int(round(time.time() * 1000)) - start_time - if self.stop(attempt_number, delay_since_first_attempt_ms): - if not self._wrap_exception and attempt.has_exception: - # get() on an attempt with an exception should cause it to be raised, but raise just in case - raise attempt.get() - else: - raise RetryError(attempt) - else: - sleep = self.wait(attempt_number, delay_since_first_attempt_ms) - if self._wait_jitter_max: - jitter = random.random() * self._wait_jitter_max - sleep = sleep + max(0, jitter) - time.sleep(sleep / 1000.0) - - attempt_number += 1 - - -class Attempt(object): - """ - An Attempt encapsulates a call to a target function that may end as a - normal return value from the function or an Exception depending on what - occurred during the execution. - """ - - def __init__(self, value, attempt_number, has_exception): - self.value = value - self.attempt_number = attempt_number - self.has_exception = has_exception - - def get(self, wrap_exception=False): - """ - Return the return value of this Attempt instance or raise an Exception. - If wrap_exception is true, this Attempt is wrapped inside of a - RetryError before being raised. - """ - if self.has_exception: - if wrap_exception: - raise RetryError(self) - else: - six.reraise(self.value[0], self.value[1], self.value[2]) - else: - return self.value - - def __repr__(self): - if self.has_exception: - return "Attempts: {0}, Error:\n{1}".format(self.attempt_number, "".join(traceback.format_tb(self.value[2]))) - else: - return "Attempts: {0}, Value: {1}".format(self.attempt_number, self.value) - - -class RetryError(Exception): - """ - A RetryError encapsulates the last Attempt instance right before giving up. - """ - - def __init__(self, last_attempt): - self.last_attempt = last_attempt - - def __str__(self): - return "RetryError[{0}]".format(self.last_attempt) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/six.py b/env/lib/python3.7/site-packages/pip/_vendor/six.py deleted file mode 100644 index 89b2188..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/six.py +++ /dev/null @@ -1,952 +0,0 @@ -# Copyright (c) 2010-2018 Benjamin Peterson -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -"""Utilities for writing code that runs on Python 2 and 3""" - -from __future__ import absolute_import - -import functools -import itertools -import operator -import sys -import types - -__author__ = "Benjamin Peterson <benjamin@python.org>" -__version__ = "1.12.0" - - -# Useful for very coarse version differentiation. -PY2 = sys.version_info[0] == 2 -PY3 = sys.version_info[0] == 3 -PY34 = sys.version_info[0:2] >= (3, 4) - -if PY3: - string_types = str, - integer_types = int, - class_types = type, - text_type = str - binary_type = bytes - - MAXSIZE = sys.maxsize -else: - string_types = basestring, - integer_types = (int, long) - class_types = (type, types.ClassType) - text_type = unicode - binary_type = str - - if sys.platform.startswith("java"): - # Jython always uses 32 bits. - MAXSIZE = int((1 << 31) - 1) - else: - # It's possible to have sizeof(long) != sizeof(Py_ssize_t). - class X(object): - - def __len__(self): - return 1 << 31 - try: - len(X()) - except OverflowError: - # 32-bit - MAXSIZE = int((1 << 31) - 1) - else: - # 64-bit - MAXSIZE = int((1 << 63) - 1) - del X - - -def _add_doc(func, doc): - """Add documentation to a function.""" - func.__doc__ = doc - - -def _import_module(name): - """Import module, returning the module after the last dot.""" - __import__(name) - return sys.modules[name] - - -class _LazyDescr(object): - - def __init__(self, name): - self.name = name - - def __get__(self, obj, tp): - result = self._resolve() - setattr(obj, self.name, result) # Invokes __set__. - try: - # This is a bit ugly, but it avoids running this again by - # removing this descriptor. - delattr(obj.__class__, self.name) - except AttributeError: - pass - return result - - -class MovedModule(_LazyDescr): - - def __init__(self, name, old, new=None): - super(MovedModule, self).__init__(name) - if PY3: - if new is None: - new = name - self.mod = new - else: - self.mod = old - - def _resolve(self): - return _import_module(self.mod) - - def __getattr__(self, attr): - _module = self._resolve() - value = getattr(_module, attr) - setattr(self, attr, value) - return value - - -class _LazyModule(types.ModuleType): - - def __init__(self, name): - super(_LazyModule, self).__init__(name) - self.__doc__ = self.__class__.__doc__ - - def __dir__(self): - attrs = ["__doc__", "__name__"] - attrs += [attr.name for attr in self._moved_attributes] - return attrs - - # Subclasses should override this - _moved_attributes = [] - - -class MovedAttribute(_LazyDescr): - - def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): - super(MovedAttribute, self).__init__(name) - if PY3: - if new_mod is None: - new_mod = name - self.mod = new_mod - if new_attr is None: - if old_attr is None: - new_attr = name - else: - new_attr = old_attr - self.attr = new_attr - else: - self.mod = old_mod - if old_attr is None: - old_attr = name - self.attr = old_attr - - def _resolve(self): - module = _import_module(self.mod) - return getattr(module, self.attr) - - -class _SixMetaPathImporter(object): - - """ - A meta path importer to import six.moves and its submodules. - - This class implements a PEP302 finder and loader. It should be compatible - with Python 2.5 and all existing versions of Python3 - """ - - def __init__(self, six_module_name): - self.name = six_module_name - self.known_modules = {} - - def _add_module(self, mod, *fullnames): - for fullname in fullnames: - self.known_modules[self.name + "." + fullname] = mod - - def _get_module(self, fullname): - return self.known_modules[self.name + "." + fullname] - - def find_module(self, fullname, path=None): - if fullname in self.known_modules: - return self - return None - - def __get_module(self, fullname): - try: - return self.known_modules[fullname] - except KeyError: - raise ImportError("This loader does not know module " + fullname) - - def load_module(self, fullname): - try: - # in case of a reload - return sys.modules[fullname] - except KeyError: - pass - mod = self.__get_module(fullname) - if isinstance(mod, MovedModule): - mod = mod._resolve() - else: - mod.__loader__ = self - sys.modules[fullname] = mod - return mod - - def is_package(self, fullname): - """ - Return true, if the named module is a package. - - We need this method to get correct spec objects with - Python 3.4 (see PEP451) - """ - return hasattr(self.__get_module(fullname), "__path__") - - def get_code(self, fullname): - """Return None - - Required, if is_package is implemented""" - self.__get_module(fullname) # eventually raises ImportError - return None - get_source = get_code # same as get_code - -_importer = _SixMetaPathImporter(__name__) - - -class _MovedItems(_LazyModule): - - """Lazy loading of moved objects""" - __path__ = [] # mark as package - - -_moved_attributes = [ - MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), - MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), - MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), - MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), - MovedAttribute("intern", "__builtin__", "sys"), - MovedAttribute("map", "itertools", "builtins", "imap", "map"), - MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), - MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), - MovedAttribute("getoutput", "commands", "subprocess"), - MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), - MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), - MovedAttribute("reduce", "__builtin__", "functools"), - MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), - MovedAttribute("StringIO", "StringIO", "io"), - MovedAttribute("UserDict", "UserDict", "collections"), - MovedAttribute("UserList", "UserList", "collections"), - MovedAttribute("UserString", "UserString", "collections"), - MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), - MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), - MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), - MovedModule("builtins", "__builtin__"), - MovedModule("configparser", "ConfigParser"), - MovedModule("copyreg", "copy_reg"), - MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), - MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), - MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), - MovedModule("http_cookies", "Cookie", "http.cookies"), - MovedModule("html_entities", "htmlentitydefs", "html.entities"), - MovedModule("html_parser", "HTMLParser", "html.parser"), - MovedModule("http_client", "httplib", "http.client"), - MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), - MovedModule("email_mime_image", "email.MIMEImage", "email.mime.image"), - MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), - MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), - MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), - MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), - MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), - MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), - MovedModule("cPickle", "cPickle", "pickle"), - MovedModule("queue", "Queue"), - MovedModule("reprlib", "repr"), - MovedModule("socketserver", "SocketServer"), - MovedModule("_thread", "thread", "_thread"), - MovedModule("tkinter", "Tkinter"), - MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), - MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), - MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), - MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), - MovedModule("tkinter_tix", "Tix", "tkinter.tix"), - MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), - MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), - MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), - MovedModule("tkinter_colorchooser", "tkColorChooser", - "tkinter.colorchooser"), - MovedModule("tkinter_commondialog", "tkCommonDialog", - "tkinter.commondialog"), - MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), - MovedModule("tkinter_font", "tkFont", "tkinter.font"), - MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), - MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", - "tkinter.simpledialog"), - MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), - MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), - MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), - MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), - MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), - MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), -] -# Add windows specific modules. -if sys.platform == "win32": - _moved_attributes += [ - MovedModule("winreg", "_winreg"), - ] - -for attr in _moved_attributes: - setattr(_MovedItems, attr.name, attr) - if isinstance(attr, MovedModule): - _importer._add_module(attr, "moves." + attr.name) -del attr - -_MovedItems._moved_attributes = _moved_attributes - -moves = _MovedItems(__name__ + ".moves") -_importer._add_module(moves, "moves") - - -class Module_six_moves_urllib_parse(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_parse""" - - -_urllib_parse_moved_attributes = [ - MovedAttribute("ParseResult", "urlparse", "urllib.parse"), - MovedAttribute("SplitResult", "urlparse", "urllib.parse"), - MovedAttribute("parse_qs", "urlparse", "urllib.parse"), - MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), - MovedAttribute("urldefrag", "urlparse", "urllib.parse"), - MovedAttribute("urljoin", "urlparse", "urllib.parse"), - MovedAttribute("urlparse", "urlparse", "urllib.parse"), - MovedAttribute("urlsplit", "urlparse", "urllib.parse"), - MovedAttribute("urlunparse", "urlparse", "urllib.parse"), - MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), - MovedAttribute("quote", "urllib", "urllib.parse"), - MovedAttribute("quote_plus", "urllib", "urllib.parse"), - MovedAttribute("unquote", "urllib", "urllib.parse"), - MovedAttribute("unquote_plus", "urllib", "urllib.parse"), - MovedAttribute("unquote_to_bytes", "urllib", "urllib.parse", "unquote", "unquote_to_bytes"), - MovedAttribute("urlencode", "urllib", "urllib.parse"), - MovedAttribute("splitquery", "urllib", "urllib.parse"), - MovedAttribute("splittag", "urllib", "urllib.parse"), - MovedAttribute("splituser", "urllib", "urllib.parse"), - MovedAttribute("splitvalue", "urllib", "urllib.parse"), - MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), - MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), - MovedAttribute("uses_params", "urlparse", "urllib.parse"), - MovedAttribute("uses_query", "urlparse", "urllib.parse"), - MovedAttribute("uses_relative", "urlparse", "urllib.parse"), -] -for attr in _urllib_parse_moved_attributes: - setattr(Module_six_moves_urllib_parse, attr.name, attr) -del attr - -Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes - -_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), - "moves.urllib_parse", "moves.urllib.parse") - - -class Module_six_moves_urllib_error(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_error""" - - -_urllib_error_moved_attributes = [ - MovedAttribute("URLError", "urllib2", "urllib.error"), - MovedAttribute("HTTPError", "urllib2", "urllib.error"), - MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), -] -for attr in _urllib_error_moved_attributes: - setattr(Module_six_moves_urllib_error, attr.name, attr) -del attr - -Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes - -_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), - "moves.urllib_error", "moves.urllib.error") - - -class Module_six_moves_urllib_request(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_request""" - - -_urllib_request_moved_attributes = [ - MovedAttribute("urlopen", "urllib2", "urllib.request"), - MovedAttribute("install_opener", "urllib2", "urllib.request"), - MovedAttribute("build_opener", "urllib2", "urllib.request"), - MovedAttribute("pathname2url", "urllib", "urllib.request"), - MovedAttribute("url2pathname", "urllib", "urllib.request"), - MovedAttribute("getproxies", "urllib", "urllib.request"), - MovedAttribute("Request", "urllib2", "urllib.request"), - MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), - MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), - MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), - MovedAttribute("BaseHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), - MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), - MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), - MovedAttribute("FileHandler", "urllib2", "urllib.request"), - MovedAttribute("FTPHandler", "urllib2", "urllib.request"), - MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), - MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), - MovedAttribute("urlretrieve", "urllib", "urllib.request"), - MovedAttribute("urlcleanup", "urllib", "urllib.request"), - MovedAttribute("URLopener", "urllib", "urllib.request"), - MovedAttribute("FancyURLopener", "urllib", "urllib.request"), - MovedAttribute("proxy_bypass", "urllib", "urllib.request"), - MovedAttribute("parse_http_list", "urllib2", "urllib.request"), - MovedAttribute("parse_keqv_list", "urllib2", "urllib.request"), -] -for attr in _urllib_request_moved_attributes: - setattr(Module_six_moves_urllib_request, attr.name, attr) -del attr - -Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes - -_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), - "moves.urllib_request", "moves.urllib.request") - - -class Module_six_moves_urllib_response(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_response""" - - -_urllib_response_moved_attributes = [ - MovedAttribute("addbase", "urllib", "urllib.response"), - MovedAttribute("addclosehook", "urllib", "urllib.response"), - MovedAttribute("addinfo", "urllib", "urllib.response"), - MovedAttribute("addinfourl", "urllib", "urllib.response"), -] -for attr in _urllib_response_moved_attributes: - setattr(Module_six_moves_urllib_response, attr.name, attr) -del attr - -Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes - -_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), - "moves.urllib_response", "moves.urllib.response") - - -class Module_six_moves_urllib_robotparser(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_robotparser""" - - -_urllib_robotparser_moved_attributes = [ - MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), -] -for attr in _urllib_robotparser_moved_attributes: - setattr(Module_six_moves_urllib_robotparser, attr.name, attr) -del attr - -Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes - -_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), - "moves.urllib_robotparser", "moves.urllib.robotparser") - - -class Module_six_moves_urllib(types.ModuleType): - - """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" - __path__ = [] # mark as package - parse = _importer._get_module("moves.urllib_parse") - error = _importer._get_module("moves.urllib_error") - request = _importer._get_module("moves.urllib_request") - response = _importer._get_module("moves.urllib_response") - robotparser = _importer._get_module("moves.urllib_robotparser") - - def __dir__(self): - return ['parse', 'error', 'request', 'response', 'robotparser'] - -_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), - "moves.urllib") - - -def add_move(move): - """Add an item to six.moves.""" - setattr(_MovedItems, move.name, move) - - -def remove_move(name): - """Remove item from six.moves.""" - try: - delattr(_MovedItems, name) - except AttributeError: - try: - del moves.__dict__[name] - except KeyError: - raise AttributeError("no such move, %r" % (name,)) - - -if PY3: - _meth_func = "__func__" - _meth_self = "__self__" - - _func_closure = "__closure__" - _func_code = "__code__" - _func_defaults = "__defaults__" - _func_globals = "__globals__" -else: - _meth_func = "im_func" - _meth_self = "im_self" - - _func_closure = "func_closure" - _func_code = "func_code" - _func_defaults = "func_defaults" - _func_globals = "func_globals" - - -try: - advance_iterator = next -except NameError: - def advance_iterator(it): - return it.next() -next = advance_iterator - - -try: - callable = callable -except NameError: - def callable(obj): - return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) - - -if PY3: - def get_unbound_function(unbound): - return unbound - - create_bound_method = types.MethodType - - def create_unbound_method(func, cls): - return func - - Iterator = object -else: - def get_unbound_function(unbound): - return unbound.im_func - - def create_bound_method(func, obj): - return types.MethodType(func, obj, obj.__class__) - - def create_unbound_method(func, cls): - return types.MethodType(func, None, cls) - - class Iterator(object): - - def next(self): - return type(self).__next__(self) - - callable = callable -_add_doc(get_unbound_function, - """Get the function out of a possibly unbound function""") - - -get_method_function = operator.attrgetter(_meth_func) -get_method_self = operator.attrgetter(_meth_self) -get_function_closure = operator.attrgetter(_func_closure) -get_function_code = operator.attrgetter(_func_code) -get_function_defaults = operator.attrgetter(_func_defaults) -get_function_globals = operator.attrgetter(_func_globals) - - -if PY3: - def iterkeys(d, **kw): - return iter(d.keys(**kw)) - - def itervalues(d, **kw): - return iter(d.values(**kw)) - - def iteritems(d, **kw): - return iter(d.items(**kw)) - - def iterlists(d, **kw): - return iter(d.lists(**kw)) - - viewkeys = operator.methodcaller("keys") - - viewvalues = operator.methodcaller("values") - - viewitems = operator.methodcaller("items") -else: - def iterkeys(d, **kw): - return d.iterkeys(**kw) - - def itervalues(d, **kw): - return d.itervalues(**kw) - - def iteritems(d, **kw): - return d.iteritems(**kw) - - def iterlists(d, **kw): - return d.iterlists(**kw) - - viewkeys = operator.methodcaller("viewkeys") - - viewvalues = operator.methodcaller("viewvalues") - - viewitems = operator.methodcaller("viewitems") - -_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") -_add_doc(itervalues, "Return an iterator over the values of a dictionary.") -_add_doc(iteritems, - "Return an iterator over the (key, value) pairs of a dictionary.") -_add_doc(iterlists, - "Return an iterator over the (key, [values]) pairs of a dictionary.") - - -if PY3: - def b(s): - return s.encode("latin-1") - - def u(s): - return s - unichr = chr - import struct - int2byte = struct.Struct(">B").pack - del struct - byte2int = operator.itemgetter(0) - indexbytes = operator.getitem - iterbytes = iter - import io - StringIO = io.StringIO - BytesIO = io.BytesIO - _assertCountEqual = "assertCountEqual" - if sys.version_info[1] <= 1: - _assertRaisesRegex = "assertRaisesRegexp" - _assertRegex = "assertRegexpMatches" - else: - _assertRaisesRegex = "assertRaisesRegex" - _assertRegex = "assertRegex" -else: - def b(s): - return s - # Workaround for standalone backslash - - def u(s): - return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") - unichr = unichr - int2byte = chr - - def byte2int(bs): - return ord(bs[0]) - - def indexbytes(buf, i): - return ord(buf[i]) - iterbytes = functools.partial(itertools.imap, ord) - import StringIO - StringIO = BytesIO = StringIO.StringIO - _assertCountEqual = "assertItemsEqual" - _assertRaisesRegex = "assertRaisesRegexp" - _assertRegex = "assertRegexpMatches" -_add_doc(b, """Byte literal""") -_add_doc(u, """Text literal""") - - -def assertCountEqual(self, *args, **kwargs): - return getattr(self, _assertCountEqual)(*args, **kwargs) - - -def assertRaisesRegex(self, *args, **kwargs): - return getattr(self, _assertRaisesRegex)(*args, **kwargs) - - -def assertRegex(self, *args, **kwargs): - return getattr(self, _assertRegex)(*args, **kwargs) - - -if PY3: - exec_ = getattr(moves.builtins, "exec") - - def reraise(tp, value, tb=None): - try: - if value is None: - value = tp() - if value.__traceback__ is not tb: - raise value.with_traceback(tb) - raise value - finally: - value = None - tb = None - -else: - def exec_(_code_, _globs_=None, _locs_=None): - """Execute code in a namespace.""" - if _globs_ is None: - frame = sys._getframe(1) - _globs_ = frame.f_globals - if _locs_ is None: - _locs_ = frame.f_locals - del frame - elif _locs_ is None: - _locs_ = _globs_ - exec("""exec _code_ in _globs_, _locs_""") - - exec_("""def reraise(tp, value, tb=None): - try: - raise tp, value, tb - finally: - tb = None -""") - - -if sys.version_info[:2] == (3, 2): - exec_("""def raise_from(value, from_value): - try: - if from_value is None: - raise value - raise value from from_value - finally: - value = None -""") -elif sys.version_info[:2] > (3, 2): - exec_("""def raise_from(value, from_value): - try: - raise value from from_value - finally: - value = None -""") -else: - def raise_from(value, from_value): - raise value - - -print_ = getattr(moves.builtins, "print", None) -if print_ is None: - def print_(*args, **kwargs): - """The new-style print function for Python 2.4 and 2.5.""" - fp = kwargs.pop("file", sys.stdout) - if fp is None: - return - - def write(data): - if not isinstance(data, basestring): - data = str(data) - # If the file has an encoding, encode unicode with it. - if (isinstance(fp, file) and - isinstance(data, unicode) and - fp.encoding is not None): - errors = getattr(fp, "errors", None) - if errors is None: - errors = "strict" - data = data.encode(fp.encoding, errors) - fp.write(data) - want_unicode = False - sep = kwargs.pop("sep", None) - if sep is not None: - if isinstance(sep, unicode): - want_unicode = True - elif not isinstance(sep, str): - raise TypeError("sep must be None or a string") - end = kwargs.pop("end", None) - if end is not None: - if isinstance(end, unicode): - want_unicode = True - elif not isinstance(end, str): - raise TypeError("end must be None or a string") - if kwargs: - raise TypeError("invalid keyword arguments to print()") - if not want_unicode: - for arg in args: - if isinstance(arg, unicode): - want_unicode = True - break - if want_unicode: - newline = unicode("\n") - space = unicode(" ") - else: - newline = "\n" - space = " " - if sep is None: - sep = space - if end is None: - end = newline - for i, arg in enumerate(args): - if i: - write(sep) - write(arg) - write(end) -if sys.version_info[:2] < (3, 3): - _print = print_ - - def print_(*args, **kwargs): - fp = kwargs.get("file", sys.stdout) - flush = kwargs.pop("flush", False) - _print(*args, **kwargs) - if flush and fp is not None: - fp.flush() - -_add_doc(reraise, """Reraise an exception.""") - -if sys.version_info[0:2] < (3, 4): - def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, - updated=functools.WRAPPER_UPDATES): - def wrapper(f): - f = functools.wraps(wrapped, assigned, updated)(f) - f.__wrapped__ = wrapped - return f - return wrapper -else: - wraps = functools.wraps - - -def with_metaclass(meta, *bases): - """Create a base class with a metaclass.""" - # This requires a bit of explanation: the basic idea is to make a dummy - # metaclass for one level of class instantiation that replaces itself with - # the actual metaclass. - class metaclass(type): - - def __new__(cls, name, this_bases, d): - return meta(name, bases, d) - - @classmethod - def __prepare__(cls, name, this_bases): - return meta.__prepare__(name, bases) - return type.__new__(metaclass, 'temporary_class', (), {}) - - -def add_metaclass(metaclass): - """Class decorator for creating a class with a metaclass.""" - def wrapper(cls): - orig_vars = cls.__dict__.copy() - slots = orig_vars.get('__slots__') - if slots is not None: - if isinstance(slots, str): - slots = [slots] - for slots_var in slots: - orig_vars.pop(slots_var) - orig_vars.pop('__dict__', None) - orig_vars.pop('__weakref__', None) - if hasattr(cls, '__qualname__'): - orig_vars['__qualname__'] = cls.__qualname__ - return metaclass(cls.__name__, cls.__bases__, orig_vars) - return wrapper - - -def ensure_binary(s, encoding='utf-8', errors='strict'): - """Coerce **s** to six.binary_type. - - For Python 2: - - `unicode` -> encoded to `str` - - `str` -> `str` - - For Python 3: - - `str` -> encoded to `bytes` - - `bytes` -> `bytes` - """ - if isinstance(s, text_type): - return s.encode(encoding, errors) - elif isinstance(s, binary_type): - return s - else: - raise TypeError("not expecting type '%s'" % type(s)) - - -def ensure_str(s, encoding='utf-8', errors='strict'): - """Coerce *s* to `str`. - - For Python 2: - - `unicode` -> encoded to `str` - - `str` -> `str` - - For Python 3: - - `str` -> `str` - - `bytes` -> decoded to `str` - """ - if not isinstance(s, (text_type, binary_type)): - raise TypeError("not expecting type '%s'" % type(s)) - if PY2 and isinstance(s, text_type): - s = s.encode(encoding, errors) - elif PY3 and isinstance(s, binary_type): - s = s.decode(encoding, errors) - return s - - -def ensure_text(s, encoding='utf-8', errors='strict'): - """Coerce *s* to six.text_type. - - For Python 2: - - `unicode` -> `unicode` - - `str` -> `unicode` - - For Python 3: - - `str` -> `str` - - `bytes` -> decoded to `str` - """ - if isinstance(s, binary_type): - return s.decode(encoding, errors) - elif isinstance(s, text_type): - return s - else: - raise TypeError("not expecting type '%s'" % type(s)) - - - -def python_2_unicode_compatible(klass): - """ - A decorator that defines __unicode__ and __str__ methods under Python 2. - Under Python 3 it does nothing. - - To support Python 2 and 3 with a single code base, define a __str__ method - returning text and apply this decorator to the class. - """ - if PY2: - if '__str__' not in klass.__dict__: - raise ValueError("@python_2_unicode_compatible cannot be applied " - "to %s because it doesn't define __str__()." % - klass.__name__) - klass.__unicode__ = klass.__str__ - klass.__str__ = lambda self: self.__unicode__().encode('utf-8') - return klass - - -# Complete the moves implementation. -# This code is at the end of this module to speed up module loading. -# Turn this module into a package. -__path__ = [] # required for PEP 302 and PEP 451 -__package__ = __name__ # see PEP 366 @ReservedAssignment -if globals().get("__spec__") is not None: - __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable -# Remove other six meta path importers, since they cause problems. This can -# happen if six is removed from sys.modules and then reloaded. (Setuptools does -# this for some reason.) -if sys.meta_path: - for i, importer in enumerate(sys.meta_path): - # Here's some real nastiness: Another "instance" of the six module might - # be floating around. Therefore, we can't use isinstance() to check for - # the six meta path importer, since the other six instance will have - # inserted an importer with different class. - if (type(importer).__name__ == "_SixMetaPathImporter" and - importer.name == __name__): - del sys.meta_path[i] - break - del i, importer -# Finally, add the importer to the meta path import hook. -sys.meta_path.append(_importer) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/__init__.py b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/__init__.py deleted file mode 100644 index 148a9c3..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/__init__.py +++ /dev/null @@ -1,92 +0,0 @@ -""" -urllib3 - Thread-safe connection pooling and re-using. -""" - -from __future__ import absolute_import -import warnings - -from .connectionpool import ( - HTTPConnectionPool, - HTTPSConnectionPool, - connection_from_url -) - -from . import exceptions -from .filepost import encode_multipart_formdata -from .poolmanager import PoolManager, ProxyManager, proxy_from_url -from .response import HTTPResponse -from .util.request import make_headers -from .util.url import get_host -from .util.timeout import Timeout -from .util.retry import Retry - - -# Set default logging handler to avoid "No handler found" warnings. -import logging -from logging import NullHandler - -__author__ = 'Andrey Petrov (andrey.petrov@shazow.net)' -__license__ = 'MIT' -__version__ = '1.24.1' - -__all__ = ( - 'HTTPConnectionPool', - 'HTTPSConnectionPool', - 'PoolManager', - 'ProxyManager', - 'HTTPResponse', - 'Retry', - 'Timeout', - 'add_stderr_logger', - 'connection_from_url', - 'disable_warnings', - 'encode_multipart_formdata', - 'get_host', - 'make_headers', - 'proxy_from_url', -) - -logging.getLogger(__name__).addHandler(NullHandler()) - - -def add_stderr_logger(level=logging.DEBUG): - """ - Helper for quickly adding a StreamHandler to the logger. Useful for - debugging. - - Returns the handler after adding it. - """ - # This method needs to be in this __init__.py to get the __name__ correct - # even if urllib3 is vendored within another package. - logger = logging.getLogger(__name__) - handler = logging.StreamHandler() - handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(message)s')) - logger.addHandler(handler) - logger.setLevel(level) - logger.debug('Added a stderr logging handler to logger: %s', __name__) - return handler - - -# ... Clean up. -del NullHandler - - -# All warning filters *must* be appended unless you're really certain that they -# shouldn't be: otherwise, it's very hard for users to use most Python -# mechanisms to silence them. -# SecurityWarning's always go off by default. -warnings.simplefilter('always', exceptions.SecurityWarning, append=True) -# SubjectAltNameWarning's should go off once per host -warnings.simplefilter('default', exceptions.SubjectAltNameWarning, append=True) -# InsecurePlatformWarning's don't vary between requests, so we keep it default. -warnings.simplefilter('default', exceptions.InsecurePlatformWarning, - append=True) -# SNIMissingWarnings should go off only once. -warnings.simplefilter('default', exceptions.SNIMissingWarning, append=True) - - -def disable_warnings(category=exceptions.HTTPWarning): - """ - Helper for quickly disabling all urllib3 warnings. - """ - warnings.simplefilter('ignore', category) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 6e8126050ba4b17e7ffb6b29eb9571987ad28bf0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2072 zcmZ`)-ESL35Wf$9oIjH|Nz){JTnnKwG>!^=K&YU$Kxw5mikeiQMd-BguI)>A@2-1$ zX>FxXAl~>N5_sZY+E<?XFYv_7+HM0CciQpH-0bY^%x}hbTdleSPx8m*pMD4KFBIla z8JOF!@|&*XFo!tIWu9=QM?4pKU--mlB~}(CStey!Ar)CARrpq76%oi9sad`%>asx^ zmJdWzwn$61Nn0+E1*@xxMY%+lEMFHLxlEQV-w-Qum8@F6DK5!1vS#^~xGdMnI`A07 z2HAk$w%CxHWD|4?<Q=w1-epVVJ=P)b^Nq8RUpaTruJX;FopaZ9_{Q-E1D7qcm0w)) z;g6f#Ki*=iymtH%yTsOh^T7f&mqBywEzR~@n(k{&?f7HxyUsSi?<dSZaJrk5&+CN} zB0l;o+zAgyic_|e(*Y0rX_D~1j?*N}(p1FBFr*0!72hdx5PJ1jScR@@7U)r)ibC@! zmRYLw-YY1E)Adc~{^8;N*RS2|gBP=mx`Y2J-<%Z<R4OBg2pre>i$2dVf*hoEp7c}3 zBUuO?XH@BEkSfWjrf^gPoj;-p9dc!w`zn1go=fcvrHg)>7{g<pXW*EF=cc4jc{GBX zbA=}bL$0Gynrq;zhq2^ofo%CP*J=z*W3Le6J|shMHQBzCFvZ8=K7341!fjB4*vqVV zJ0H<W`n;EL-8KHB2Zxi&jozm>dpEjmRe~fb1hA?hL6EB^l0_s7K+F<lEXp;6r6Q3I z;clve`b8G!^hogNIaLYNB3A+KX(MSNX#nYC74Y$4;W=N!%I^Wu&Y7#dbN8hSoPX}T z^iI9A67Xf_p2O=pr|wzh6f7)PJ++_&UBEop2d#DL0d)Myuk{d~`&?vPg;0&~SrPZ2 zig5^WTfBq^8UQ6{xe9d}>Jbm8SLuaMay}>oZnS<FKPrYp3oR={x(k)$cFSm*?T`*M z95r(v>z*~7Y;A4R9H1(BHxIYA1wY{;p)*PHJO@~G^U3u)jBysyaGFvZ2ZlL!4&hBh z`y$-RyERiq2@FgP0P)b~-vm*Fo}<XL{&hFg%(=b?fTS8CG_^Nu9ip8jzyx6Q5Ti3? zds{$m*+y$B)00hg7R;ZHx&o#8`^#M|v)wGtcH$)0REQn+Y@EEfF&LrJuIPj(ELFR+ zHr|b*IEi%>^|G;A1|K)E?uZSiR(At;(XGSVbnQ1&q2f6m=Z6663e7U`WU7o0C^Xq? z03nbNtrkFtP6QBh0TwuAr%<@{e^8i0)uKU&a6W40z?~M*RN`ThD!$kCOfdfh8HITw z_#hULQHU?-Q_Y8|8r#fF$yJC(tpND}R_+0DN>=V(H`OR&X&)+8kD@^VSc0l4G*Q=p znD(2YgY)e|KiVF1R28iPIG$%P3v7#-2Aaz0oVn1q*l#9Kvyo!km^2F=i=N`o3J$xm zElFTikOSMQGYf<*3>e$-q(0jOgJwDhR$-r7LicbBTIf-#;6{xo5^<ly_?ikQFt}h$ zf&iBWkibPR;l?#2o4C9D&9`@-d}nK}wo$Qg!25-Y_4xbg3^A(*#nCYg{5wML0mA3% zwFhttSn_>AHMFXne^@%$d+;dE@xNfMYT#g<3APFsDurlPSS}OXk|`?${|X0Fj_53T mO*imXDoudp3ar^%3f!hwa^dw$iygnc>{UBn#{&?19seIv<4Y9) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-37.pyc deleted file mode 100644 index 751d323d1c855b8477ff9fde5afeec0109fc13dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10636 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 R4)^(DnOP&qC2!At^nb~1#%%xq diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-37.pyc deleted file mode 100644 index 385b2997222928b9418da795ce18c2fa384be6f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10105 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-37.pyc deleted file mode 100644 index 0b1835baa7f1bf38b4497c324fce1164f379e077..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23610 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 AJOBUy diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-37.pyc deleted file mode 100644 index 6bfa69f8edd07604b1d2f4517f6201be04342883..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10357 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-37.pyc deleted file mode 100644 index c77907bb8daf90720d35608a0b69b4475ad3b297..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5825 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 F?f*ykFFpVO diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-37.pyc deleted file mode 100644 index b65eb00a0fd956c610c07cde3bdf37add6783b3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2717 zcmbtWTW{P%6!wh0j^k`D-G<U4C_~jE7G*b7l@MCef=Y{&2U4JjiWOzo>zPfQ__CQ9 zr`gEiB@yC@-;jtW{sX_nuRP^1^oeuEn+pM?BD|X8Gvm3O`OZ1t*@v^Uz6DSE>-Fb{ z)0XuIc1|A~lux0lpFwbolh{f~mk`uxOuN*)?XGR!PS=6A9oG`K>%ts|*W#(f>v~3a z<LSij`bM9MXOeoiPAp*`&2sOU@aY>?caHmf=FsZS^E#h}_X3~e^YFgH8+?IZIV9Z% zr%$cs)f2GBYLaq37^p1Hwdh63D3f{(#-<*QwNR^1PDnM!R?#jDlL3hO*J3*tN`D@S znD5ncJ#2k+f_DsYLws;i4cceW)NK&jIwG1L*_<51Z{O0+W=*ofI&wM1eqn(@_THM$ z;CYfuCXzuQWuR1)uE*n+0?T5-q!`6PC=!usHq0bTqD1H{i&Z<^$TB5*gDg*ZAjfU9 z(a8cFUDg5>Mp1LB^afFC^m1xL?8eb>T+&RHQ@IRMo+T13F6}SByH~nggc%obSMPMk z-z?dH?=SB!>twV%ibky{RXT{{7T+GHyLX2hIA~gLN5Fn^IhS!94el)uqgaeGrQ4%% zIe*E}dDv5VAS`ErxWp%N5%drN#0ODzpdqqq4TJ`$G&!L18p2sv03Jy_?G)AlXuIzh z<dOCK);@)KRM%i$r=Z`0Kelh{+NN93U#zP445APqr+Yscq*k?%ffg*=5t0qjud3~v zFHiFk#)M*Vq%_Nh?7giew$o%f2ZtyI$T1#;S}hqBCn=a^mUhAz9N6jqI02$P+4y4k z^e4xxfq(o6ybYM9p(q{PwDQPw1ja#2ROz59rvQg?W+=0yS6R`tOSjs)BvDy2s_|AO zuHyU#F7265y=<^4z~mbU>Kq8m^GTh0)Cc@MD&K;UGY_CA&;urvmq0o5z)em#J+w~! z@CZEc6!I3w3ajchouCC97&O{##>GgA5OC(54!hg_utIqCU$OsYL$HAJNJm+U(7zI( zED5&2F?u6XY?!AZE;a^anB_u?Hd_UhMZlL>t_17gq)z|u@bs71i;XDUfUMKGOx3IV zluZEsk0Deg?HTeI``8q=H$W8D^TzjdpX}3u6m(d{HE<`yF<CRNhCrb04@$CClATKd z@N#-(U8G`nBp-BeLkhyN_HLfvTeVl>EDU1xpnW#={~051!Xff)6buCt$azT0cc8lh zZDLE)k+0!|YbcP5<m(`sMB?2qtu1FR*xiEf$^~K7eX>a9Ezm-|A3iva&BX8TplIvB zLIgS4^5i0Li3Pk-Xo?I1+%ej>3t$%QaF}xq#*U#*=~_V#2=I-4<Q@a(5Ua2^r}iD~ z6^@<;mia;Zg#!#!jm&J;VQlYgm4ho%ANMVcjvBXdbo=HrU@CK-bKyLn*Q(w=oP0EU zY!$U3)+{&p>NKAor%2H(F!Td44y=zk((hMH(C<TZL-Bw_5G=`K9gPC1m!WDTEgtBA zeX;t*V=N*`peJ$Kff+$Ep}&p^cLvWRV50N=tKAtCpL0SK<E2;2&E{WEI;}0|XRQud znrWs+B8=c9NKr69g-cc?ik+@tFQPbR1Hmw+k-2$w+cTplS$)pDlM-~P`~dyp71#FM zR_l(M^-U<w`g<OBTP@K33A>Na?6`kNHRmK|si|9rI?LJ%q-%*$SGtv6&Pk|=K)@To zJ3<1JqYq5Hmv)ru(pFkd=w6Fm-P7ZdD7|%|cY-(<O}9#dE4ZaI$oN>kiD$lx{d$<C z8vYTOHJ9_`hA?5$JBxrGx*QMx1lB4B!kTf3M_f8b8ngj#tO0ehKz%w#8?;U(<`*zb z^J?k$dcz#ZQ1p5d6HLy4C|wN1P{~>B&?qx_l-?)^w}N${%(c4p({3C7Nf~UaE16>E z##y$Nk0kz8ItS7uvN`?2tqg~lisr2(8P8+!085m*4x$eCfFIagC-9?lw�`UgJ-! CCcGg4 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-37.pyc deleted file mode 100644 index d2bb28b98e284eec8e325ee5cccaebad84a32cbd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12677 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 I?k(Q^A0v?A#Q*>R diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-37.pyc deleted file mode 100644 index 3a7766fb4e3114ce3163f9c0f5332a55d4c94238..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5539 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 GrGEl49a*3N diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-37.pyc deleted file mode 100644 index e0f1e0581b33da312f6c7282c28b0370326c9427..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18704 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/_collections.py b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/_collections.py deleted file mode 100644 index 34f2381..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/_collections.py +++ /dev/null @@ -1,329 +0,0 @@ -from __future__ import absolute_import -try: - from collections.abc import Mapping, MutableMapping -except ImportError: - from collections import Mapping, MutableMapping -try: - from threading import RLock -except ImportError: # Platform-specific: No threads available - class RLock: - def __enter__(self): - pass - - def __exit__(self, exc_type, exc_value, traceback): - pass - - -from collections import OrderedDict -from .exceptions import InvalidHeader -from .packages.six import iterkeys, itervalues, PY3 - - -__all__ = ['RecentlyUsedContainer', 'HTTPHeaderDict'] - - -_Null = object() - - -class RecentlyUsedContainer(MutableMapping): - """ - Provides a thread-safe dict-like container which maintains up to - ``maxsize`` keys while throwing away the least-recently-used keys beyond - ``maxsize``. - - :param maxsize: - Maximum number of recent elements to retain. - - :param dispose_func: - Every time an item is evicted from the container, - ``dispose_func(value)`` is called. Callback which will get called - """ - - ContainerCls = OrderedDict - - def __init__(self, maxsize=10, dispose_func=None): - self._maxsize = maxsize - self.dispose_func = dispose_func - - self._container = self.ContainerCls() - self.lock = RLock() - - def __getitem__(self, key): - # Re-insert the item, moving it to the end of the eviction line. - with self.lock: - item = self._container.pop(key) - self._container[key] = item - return item - - def __setitem__(self, key, value): - evicted_value = _Null - with self.lock: - # Possibly evict the existing value of 'key' - evicted_value = self._container.get(key, _Null) - self._container[key] = value - - # If we didn't evict an existing value, we might have to evict the - # least recently used item from the beginning of the container. - if len(self._container) > self._maxsize: - _key, evicted_value = self._container.popitem(last=False) - - if self.dispose_func and evicted_value is not _Null: - self.dispose_func(evicted_value) - - def __delitem__(self, key): - with self.lock: - value = self._container.pop(key) - - if self.dispose_func: - self.dispose_func(value) - - def __len__(self): - with self.lock: - return len(self._container) - - def __iter__(self): - raise NotImplementedError('Iteration over this class is unlikely to be threadsafe.') - - def clear(self): - with self.lock: - # Copy pointers to all values, then wipe the mapping - values = list(itervalues(self._container)) - self._container.clear() - - if self.dispose_func: - for value in values: - self.dispose_func(value) - - def keys(self): - with self.lock: - return list(iterkeys(self._container)) - - -class HTTPHeaderDict(MutableMapping): - """ - :param headers: - An iterable of field-value pairs. Must not contain multiple field names - when compared case-insensitively. - - :param kwargs: - Additional field-value pairs to pass in to ``dict.update``. - - A ``dict`` like container for storing HTTP Headers. - - Field names are stored and compared case-insensitively in compliance with - RFC 7230. Iteration provides the first case-sensitive key seen for each - case-insensitive pair. - - Using ``__setitem__`` syntax overwrites fields that compare equal - case-insensitively in order to maintain ``dict``'s api. For fields that - compare equal, instead create a new ``HTTPHeaderDict`` and use ``.add`` - in a loop. - - If multiple fields that are equal case-insensitively are passed to the - constructor or ``.update``, the behavior is undefined and some will be - lost. - - >>> headers = HTTPHeaderDict() - >>> headers.add('Set-Cookie', 'foo=bar') - >>> headers.add('set-cookie', 'baz=quxx') - >>> headers['content-length'] = '7' - >>> headers['SET-cookie'] - 'foo=bar, baz=quxx' - >>> headers['Content-Length'] - '7' - """ - - def __init__(self, headers=None, **kwargs): - super(HTTPHeaderDict, self).__init__() - self._container = OrderedDict() - if headers is not None: - if isinstance(headers, HTTPHeaderDict): - self._copy_from(headers) - else: - self.extend(headers) - if kwargs: - self.extend(kwargs) - - def __setitem__(self, key, val): - self._container[key.lower()] = [key, val] - return self._container[key.lower()] - - def __getitem__(self, key): - val = self._container[key.lower()] - return ', '.join(val[1:]) - - def __delitem__(self, key): - del self._container[key.lower()] - - def __contains__(self, key): - return key.lower() in self._container - - def __eq__(self, other): - if not isinstance(other, Mapping) and not hasattr(other, 'keys'): - return False - if not isinstance(other, type(self)): - other = type(self)(other) - return (dict((k.lower(), v) for k, v in self.itermerged()) == - dict((k.lower(), v) for k, v in other.itermerged())) - - def __ne__(self, other): - return not self.__eq__(other) - - if not PY3: # Python 2 - iterkeys = MutableMapping.iterkeys - itervalues = MutableMapping.itervalues - - __marker = object() - - def __len__(self): - return len(self._container) - - def __iter__(self): - # Only provide the originally cased names - for vals in self._container.values(): - yield vals[0] - - def pop(self, key, default=__marker): - '''D.pop(k[,d]) -> v, remove specified key and return the corresponding value. - If key is not found, d is returned if given, otherwise KeyError is raised. - ''' - # Using the MutableMapping function directly fails due to the private marker. - # Using ordinary dict.pop would expose the internal structures. - # So let's reinvent the wheel. - try: - value = self[key] - except KeyError: - if default is self.__marker: - raise - return default - else: - del self[key] - return value - - def discard(self, key): - try: - del self[key] - except KeyError: - pass - - def add(self, key, val): - """Adds a (name, value) pair, doesn't overwrite the value if it already - exists. - - >>> headers = HTTPHeaderDict(foo='bar') - >>> headers.add('Foo', 'baz') - >>> headers['foo'] - 'bar, baz' - """ - key_lower = key.lower() - new_vals = [key, val] - # Keep the common case aka no item present as fast as possible - vals = self._container.setdefault(key_lower, new_vals) - if new_vals is not vals: - vals.append(val) - - def extend(self, *args, **kwargs): - """Generic import function for any type of header-like object. - Adapted version of MutableMapping.update in order to insert items - with self.add instead of self.__setitem__ - """ - if len(args) > 1: - raise TypeError("extend() takes at most 1 positional " - "arguments ({0} given)".format(len(args))) - other = args[0] if len(args) >= 1 else () - - if isinstance(other, HTTPHeaderDict): - for key, val in other.iteritems(): - self.add(key, val) - elif isinstance(other, Mapping): - for key in other: - self.add(key, other[key]) - elif hasattr(other, "keys"): - for key in other.keys(): - self.add(key, other[key]) - else: - for key, value in other: - self.add(key, value) - - for key, value in kwargs.items(): - self.add(key, value) - - def getlist(self, key, default=__marker): - """Returns a list of all the values for the named field. Returns an - empty list if the key doesn't exist.""" - try: - vals = self._container[key.lower()] - except KeyError: - if default is self.__marker: - return [] - return default - else: - return vals[1:] - - # Backwards compatibility for httplib - getheaders = getlist - getallmatchingheaders = getlist - iget = getlist - - # Backwards compatibility for http.cookiejar - get_all = getlist - - def __repr__(self): - return "%s(%s)" % (type(self).__name__, dict(self.itermerged())) - - def _copy_from(self, other): - for key in other: - val = other.getlist(key) - if isinstance(val, list): - # Don't need to convert tuples - val = list(val) - self._container[key.lower()] = [key] + val - - def copy(self): - clone = type(self)() - clone._copy_from(self) - return clone - - def iteritems(self): - """Iterate over all header lines, including duplicate ones.""" - for key in self: - vals = self._container[key.lower()] - for val in vals[1:]: - yield vals[0], val - - def itermerged(self): - """Iterate over all headers, merging duplicate ones together.""" - for key in self: - val = self._container[key.lower()] - yield val[0], ', '.join(val[1:]) - - def items(self): - return list(self.iteritems()) - - @classmethod - def from_httplib(cls, message): # Python 2 - """Read headers from a Python 2 httplib message object.""" - # python2.7 does not expose a proper API for exporting multiheaders - # efficiently. This function re-reads raw lines from the message - # object and extracts the multiheaders properly. - obs_fold_continued_leaders = (' ', '\t') - headers = [] - - for line in message.headers: - if line.startswith(obs_fold_continued_leaders): - if not headers: - # We received a header line that starts with OWS as described - # in RFC-7230 S3.2.4. This indicates a multiline header, but - # there exists no previous header to which we can attach it. - raise InvalidHeader( - 'Header continuation with no previous header: %s' % line - ) - else: - key, value = headers[-1] - headers[-1] = (key, value + ' ' + line.strip()) - continue - - key, value = line.split(':', 1) - headers.append((key, value.strip())) - - return cls(headers) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/connection.py b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/connection.py deleted file mode 100644 index 02b3665..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/connection.py +++ /dev/null @@ -1,391 +0,0 @@ -from __future__ import absolute_import -import datetime -import logging -import os -import socket -from socket import error as SocketError, timeout as SocketTimeout -import warnings -from .packages import six -from .packages.six.moves.http_client import HTTPConnection as _HTTPConnection -from .packages.six.moves.http_client import HTTPException # noqa: F401 - -try: # Compiled with SSL? - import ssl - BaseSSLError = ssl.SSLError -except (ImportError, AttributeError): # Platform-specific: No SSL. - ssl = None - - class BaseSSLError(BaseException): - pass - - -try: # Python 3: - # Not a no-op, we're adding this to the namespace so it can be imported. - ConnectionError = ConnectionError -except NameError: # Python 2: - class ConnectionError(Exception): - pass - - -from .exceptions import ( - NewConnectionError, - ConnectTimeoutError, - SubjectAltNameWarning, - SystemTimeWarning, -) -from .packages.ssl_match_hostname import match_hostname, CertificateError - -from .util.ssl_ import ( - resolve_cert_reqs, - resolve_ssl_version, - assert_fingerprint, - create_urllib3_context, - ssl_wrap_socket -) - - -from .util import connection - -from ._collections import HTTPHeaderDict - -log = logging.getLogger(__name__) - -port_by_scheme = { - 'http': 80, - 'https': 443, -} - -# When updating RECENT_DATE, move it to within two years of the current date, -# and not less than 6 months ago. -# Example: if Today is 2018-01-01, then RECENT_DATE should be any date on or -# after 2016-01-01 (today - 2 years) AND before 2017-07-01 (today - 6 months) -RECENT_DATE = datetime.date(2017, 6, 30) - - -class DummyConnection(object): - """Used to detect a failed ConnectionCls import.""" - pass - - -class HTTPConnection(_HTTPConnection, object): - """ - Based on httplib.HTTPConnection but provides an extra constructor - backwards-compatibility layer between older and newer Pythons. - - Additional keyword parameters are used to configure attributes of the connection. - Accepted parameters include: - - - ``strict``: See the documentation on :class:`urllib3.connectionpool.HTTPConnectionPool` - - ``source_address``: Set the source address for the current connection. - - ``socket_options``: Set specific options on the underlying socket. If not specified, then - defaults are loaded from ``HTTPConnection.default_socket_options`` which includes disabling - Nagle's algorithm (sets TCP_NODELAY to 1) unless the connection is behind a proxy. - - For example, if you wish to enable TCP Keep Alive in addition to the defaults, - you might pass:: - - HTTPConnection.default_socket_options + [ - (socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1), - ] - - Or you may want to disable the defaults by passing an empty list (e.g., ``[]``). - """ - - default_port = port_by_scheme['http'] - - #: Disable Nagle's algorithm by default. - #: ``[(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)]`` - default_socket_options = [(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)] - - #: Whether this connection verifies the host's certificate. - is_verified = False - - def __init__(self, *args, **kw): - if six.PY3: # Python 3 - kw.pop('strict', None) - - # Pre-set source_address. - self.source_address = kw.get('source_address') - - #: The socket options provided by the user. If no options are - #: provided, we use the default options. - self.socket_options = kw.pop('socket_options', self.default_socket_options) - - _HTTPConnection.__init__(self, *args, **kw) - - @property - def host(self): - """ - Getter method to remove any trailing dots that indicate the hostname is an FQDN. - - In general, SSL certificates don't include the trailing dot indicating a - fully-qualified domain name, and thus, they don't validate properly when - checked against a domain name that includes the dot. In addition, some - servers may not expect to receive the trailing dot when provided. - - However, the hostname with trailing dot is critical to DNS resolution; doing a - lookup with the trailing dot will properly only resolve the appropriate FQDN, - whereas a lookup without a trailing dot will search the system's search domain - list. Thus, it's important to keep the original host around for use only in - those cases where it's appropriate (i.e., when doing DNS lookup to establish the - actual TCP connection across which we're going to send HTTP requests). - """ - return self._dns_host.rstrip('.') - - @host.setter - def host(self, value): - """ - Setter for the `host` property. - - We assume that only urllib3 uses the _dns_host attribute; httplib itself - only uses `host`, and it seems reasonable that other libraries follow suit. - """ - self._dns_host = value - - def _new_conn(self): - """ Establish a socket connection and set nodelay settings on it. - - :return: New socket connection. - """ - extra_kw = {} - if self.source_address: - extra_kw['source_address'] = self.source_address - - if self.socket_options: - extra_kw['socket_options'] = self.socket_options - - try: - conn = connection.create_connection( - (self._dns_host, self.port), self.timeout, **extra_kw) - - except SocketTimeout as e: - raise ConnectTimeoutError( - self, "Connection to %s timed out. (connect timeout=%s)" % - (self.host, self.timeout)) - - except SocketError as e: - raise NewConnectionError( - self, "Failed to establish a new connection: %s" % e) - - return conn - - def _prepare_conn(self, conn): - self.sock = conn - if self._tunnel_host: - # TODO: Fix tunnel so it doesn't depend on self.sock state. - self._tunnel() - # Mark this connection as not reusable - self.auto_open = 0 - - def connect(self): - conn = self._new_conn() - self._prepare_conn(conn) - - def request_chunked(self, method, url, body=None, headers=None): - """ - Alternative to the common request method, which sends the - body with chunked encoding and not as one block - """ - headers = HTTPHeaderDict(headers if headers is not None else {}) - skip_accept_encoding = 'accept-encoding' in headers - skip_host = 'host' in headers - self.putrequest( - method, - url, - skip_accept_encoding=skip_accept_encoding, - skip_host=skip_host - ) - for header, value in headers.items(): - self.putheader(header, value) - if 'transfer-encoding' not in headers: - self.putheader('Transfer-Encoding', 'chunked') - self.endheaders() - - if body is not None: - stringish_types = six.string_types + (bytes,) - if isinstance(body, stringish_types): - body = (body,) - for chunk in body: - if not chunk: - continue - if not isinstance(chunk, bytes): - chunk = chunk.encode('utf8') - len_str = hex(len(chunk))[2:] - self.send(len_str.encode('utf-8')) - self.send(b'\r\n') - self.send(chunk) - self.send(b'\r\n') - - # After the if clause, to always have a closed body - self.send(b'0\r\n\r\n') - - -class HTTPSConnection(HTTPConnection): - default_port = port_by_scheme['https'] - - ssl_version = None - - def __init__(self, host, port=None, key_file=None, cert_file=None, - strict=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, - ssl_context=None, server_hostname=None, **kw): - - HTTPConnection.__init__(self, host, port, strict=strict, - timeout=timeout, **kw) - - self.key_file = key_file - self.cert_file = cert_file - self.ssl_context = ssl_context - self.server_hostname = server_hostname - - # Required property for Google AppEngine 1.9.0 which otherwise causes - # HTTPS requests to go out as HTTP. (See Issue #356) - self._protocol = 'https' - - def connect(self): - conn = self._new_conn() - self._prepare_conn(conn) - - if self.ssl_context is None: - self.ssl_context = create_urllib3_context( - ssl_version=resolve_ssl_version(None), - cert_reqs=resolve_cert_reqs(None), - ) - - self.sock = ssl_wrap_socket( - sock=conn, - keyfile=self.key_file, - certfile=self.cert_file, - ssl_context=self.ssl_context, - server_hostname=self.server_hostname - ) - - -class VerifiedHTTPSConnection(HTTPSConnection): - """ - Based on httplib.HTTPSConnection but wraps the socket with - SSL certification. - """ - cert_reqs = None - ca_certs = None - ca_cert_dir = None - ssl_version = None - assert_fingerprint = None - - def set_cert(self, key_file=None, cert_file=None, - cert_reqs=None, ca_certs=None, - assert_hostname=None, assert_fingerprint=None, - ca_cert_dir=None): - """ - This method should only be called once, before the connection is used. - """ - # If cert_reqs is not provided, we can try to guess. If the user gave - # us a cert database, we assume they want to use it: otherwise, if - # they gave us an SSL Context object we should use whatever is set for - # it. - if cert_reqs is None: - if ca_certs or ca_cert_dir: - cert_reqs = 'CERT_REQUIRED' - elif self.ssl_context is not None: - cert_reqs = self.ssl_context.verify_mode - - self.key_file = key_file - self.cert_file = cert_file - self.cert_reqs = cert_reqs - self.assert_hostname = assert_hostname - self.assert_fingerprint = assert_fingerprint - self.ca_certs = ca_certs and os.path.expanduser(ca_certs) - self.ca_cert_dir = ca_cert_dir and os.path.expanduser(ca_cert_dir) - - def connect(self): - # Add certificate verification - conn = self._new_conn() - hostname = self.host - - if self._tunnel_host: - self.sock = conn - # Calls self._set_hostport(), so self.host is - # self._tunnel_host below. - self._tunnel() - # Mark this connection as not reusable - self.auto_open = 0 - - # Override the host with the one we're requesting data from. - hostname = self._tunnel_host - - server_hostname = hostname - if self.server_hostname is not None: - server_hostname = self.server_hostname - - is_time_off = datetime.date.today() < RECENT_DATE - if is_time_off: - warnings.warn(( - 'System time is way off (before {0}). This will probably ' - 'lead to SSL verification errors').format(RECENT_DATE), - SystemTimeWarning - ) - - # Wrap socket using verification with the root certs in - # trusted_root_certs - if self.ssl_context is None: - self.ssl_context = create_urllib3_context( - ssl_version=resolve_ssl_version(self.ssl_version), - cert_reqs=resolve_cert_reqs(self.cert_reqs), - ) - - context = self.ssl_context - context.verify_mode = resolve_cert_reqs(self.cert_reqs) - self.sock = ssl_wrap_socket( - sock=conn, - keyfile=self.key_file, - certfile=self.cert_file, - ca_certs=self.ca_certs, - ca_cert_dir=self.ca_cert_dir, - server_hostname=server_hostname, - ssl_context=context) - - if self.assert_fingerprint: - assert_fingerprint(self.sock.getpeercert(binary_form=True), - self.assert_fingerprint) - elif context.verify_mode != ssl.CERT_NONE \ - and not getattr(context, 'check_hostname', False) \ - and self.assert_hostname is not False: - # While urllib3 attempts to always turn off hostname matching from - # the TLS library, this cannot always be done. So we check whether - # the TLS Library still thinks it's matching hostnames. - cert = self.sock.getpeercert() - if not cert.get('subjectAltName', ()): - warnings.warn(( - 'Certificate for {0} has no `subjectAltName`, falling back to check for a ' - '`commonName` for now. This feature is being removed by major browsers and ' - 'deprecated by RFC 2818. (See https://github.com/shazow/urllib3/issues/497 ' - 'for details.)'.format(hostname)), - SubjectAltNameWarning - ) - _match_hostname(cert, self.assert_hostname or server_hostname) - - self.is_verified = ( - context.verify_mode == ssl.CERT_REQUIRED or - self.assert_fingerprint is not None - ) - - -def _match_hostname(cert, asserted_hostname): - try: - match_hostname(cert, asserted_hostname) - except CertificateError as e: - log.error( - 'Certificate did not match expected hostname: %s. ' - 'Certificate: %s', asserted_hostname, cert - ) - # Add cert to exception and reraise so client code can inspect - # the cert when catching the exception, if they want to - e._peer_cert = cert - raise - - -if ssl: - # Make a copy for testing. - UnverifiedHTTPSConnection = HTTPSConnection - HTTPSConnection = VerifiedHTTPSConnection -else: - HTTPSConnection = DummyConnection diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/connectionpool.py b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/connectionpool.py deleted file mode 100644 index f7a8f19..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/connectionpool.py +++ /dev/null @@ -1,896 +0,0 @@ -from __future__ import absolute_import -import errno -import logging -import sys -import warnings - -from socket import error as SocketError, timeout as SocketTimeout -import socket - - -from .exceptions import ( - ClosedPoolError, - ProtocolError, - EmptyPoolError, - HeaderParsingError, - HostChangedError, - LocationValueError, - MaxRetryError, - ProxyError, - ReadTimeoutError, - SSLError, - TimeoutError, - InsecureRequestWarning, - NewConnectionError, -) -from .packages.ssl_match_hostname import CertificateError -from .packages import six -from .packages.six.moves import queue -from .connection import ( - port_by_scheme, - DummyConnection, - HTTPConnection, HTTPSConnection, VerifiedHTTPSConnection, - HTTPException, BaseSSLError, -) -from .request import RequestMethods -from .response import HTTPResponse - -from .util.connection import is_connection_dropped -from .util.request import set_file_position -from .util.response import assert_header_parsing -from .util.retry import Retry -from .util.timeout import Timeout -from .util.url import get_host, Url, NORMALIZABLE_SCHEMES -from .util.queue import LifoQueue - - -xrange = six.moves.xrange - -log = logging.getLogger(__name__) - -_Default = object() - - -# Pool objects -class ConnectionPool(object): - """ - Base class for all connection pools, such as - :class:`.HTTPConnectionPool` and :class:`.HTTPSConnectionPool`. - """ - - scheme = None - QueueCls = LifoQueue - - def __init__(self, host, port=None): - if not host: - raise LocationValueError("No host specified.") - - self.host = _ipv6_host(host, self.scheme) - self._proxy_host = host.lower() - self.port = port - - def __str__(self): - return '%s(host=%r, port=%r)' % (type(self).__name__, - self.host, self.port) - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - self.close() - # Return False to re-raise any potential exceptions - return False - - def close(self): - """ - Close all pooled connections and disable the pool. - """ - pass - - -# This is taken from http://hg.python.org/cpython/file/7aaba721ebc0/Lib/socket.py#l252 -_blocking_errnos = {errno.EAGAIN, errno.EWOULDBLOCK} - - -class HTTPConnectionPool(ConnectionPool, RequestMethods): - """ - Thread-safe connection pool for one host. - - :param host: - Host used for this HTTP Connection (e.g. "localhost"), passed into - :class:`httplib.HTTPConnection`. - - :param port: - Port used for this HTTP Connection (None is equivalent to 80), passed - into :class:`httplib.HTTPConnection`. - - :param strict: - Causes BadStatusLine to be raised if the status line can't be parsed - as a valid HTTP/1.0 or 1.1 status line, passed into - :class:`httplib.HTTPConnection`. - - .. note:: - Only works in Python 2. This parameter is ignored in Python 3. - - :param timeout: - Socket timeout in seconds for each individual connection. This can - be a float or integer, which sets the timeout for the HTTP request, - or an instance of :class:`urllib3.util.Timeout` which gives you more - fine-grained control over request timeouts. After the constructor has - been parsed, this is always a `urllib3.util.Timeout` object. - - :param maxsize: - Number of connections to save that can be reused. More than 1 is useful - in multithreaded situations. If ``block`` is set to False, more - connections will be created but they will not be saved once they've - been used. - - :param block: - If set to True, no more than ``maxsize`` connections will be used at - a time. When no free connections are available, the call will block - until a connection has been released. This is a useful side effect for - particular multithreaded situations where one does not want to use more - than maxsize connections per host to prevent flooding. - - :param headers: - Headers to include with all requests, unless other headers are given - explicitly. - - :param retries: - Retry configuration to use by default with requests in this pool. - - :param _proxy: - Parsed proxy URL, should not be used directly, instead, see - :class:`urllib3.connectionpool.ProxyManager`" - - :param _proxy_headers: - A dictionary with proxy headers, should not be used directly, - instead, see :class:`urllib3.connectionpool.ProxyManager`" - - :param \\**conn_kw: - Additional parameters are used to create fresh :class:`urllib3.connection.HTTPConnection`, - :class:`urllib3.connection.HTTPSConnection` instances. - """ - - scheme = 'http' - ConnectionCls = HTTPConnection - ResponseCls = HTTPResponse - - def __init__(self, host, port=None, strict=False, - timeout=Timeout.DEFAULT_TIMEOUT, maxsize=1, block=False, - headers=None, retries=None, - _proxy=None, _proxy_headers=None, - **conn_kw): - ConnectionPool.__init__(self, host, port) - RequestMethods.__init__(self, headers) - - self.strict = strict - - if not isinstance(timeout, Timeout): - timeout = Timeout.from_float(timeout) - - if retries is None: - retries = Retry.DEFAULT - - self.timeout = timeout - self.retries = retries - - self.pool = self.QueueCls(maxsize) - self.block = block - - self.proxy = _proxy - self.proxy_headers = _proxy_headers or {} - - # Fill the queue up so that doing get() on it will block properly - for _ in xrange(maxsize): - self.pool.put(None) - - # These are mostly for testing and debugging purposes. - self.num_connections = 0 - self.num_requests = 0 - self.conn_kw = conn_kw - - if self.proxy: - # Enable Nagle's algorithm for proxies, to avoid packet fragmentation. - # We cannot know if the user has added default socket options, so we cannot replace the - # list. - self.conn_kw.setdefault('socket_options', []) - - def _new_conn(self): - """ - Return a fresh :class:`HTTPConnection`. - """ - self.num_connections += 1 - log.debug("Starting new HTTP connection (%d): %s:%s", - self.num_connections, self.host, self.port or "80") - - conn = self.ConnectionCls(host=self.host, port=self.port, - timeout=self.timeout.connect_timeout, - strict=self.strict, **self.conn_kw) - return conn - - def _get_conn(self, timeout=None): - """ - Get a connection. Will return a pooled connection if one is available. - - If no connections are available and :prop:`.block` is ``False``, then a - fresh connection is returned. - - :param timeout: - Seconds to wait before giving up and raising - :class:`urllib3.exceptions.EmptyPoolError` if the pool is empty and - :prop:`.block` is ``True``. - """ - conn = None - try: - conn = self.pool.get(block=self.block, timeout=timeout) - - except AttributeError: # self.pool is None - raise ClosedPoolError(self, "Pool is closed.") - - except queue.Empty: - if self.block: - raise EmptyPoolError(self, - "Pool reached maximum size and no more " - "connections are allowed.") - pass # Oh well, we'll create a new connection then - - # If this is a persistent connection, check if it got disconnected - if conn and is_connection_dropped(conn): - log.debug("Resetting dropped connection: %s", self.host) - conn.close() - if getattr(conn, 'auto_open', 1) == 0: - # This is a proxied connection that has been mutated by - # httplib._tunnel() and cannot be reused (since it would - # attempt to bypass the proxy) - conn = None - - return conn or self._new_conn() - - def _put_conn(self, conn): - """ - Put a connection back into the pool. - - :param conn: - Connection object for the current host and port as returned by - :meth:`._new_conn` or :meth:`._get_conn`. - - If the pool is already full, the connection is closed and discarded - because we exceeded maxsize. If connections are discarded frequently, - then maxsize should be increased. - - If the pool is closed, then the connection will be closed and discarded. - """ - try: - self.pool.put(conn, block=False) - return # Everything is dandy, done. - except AttributeError: - # self.pool is None. - pass - except queue.Full: - # This should never happen if self.block == True - log.warning( - "Connection pool is full, discarding connection: %s", - self.host) - - # Connection never got put back into the pool, close it. - if conn: - conn.close() - - def _validate_conn(self, conn): - """ - Called right before a request is made, after the socket is created. - """ - pass - - def _prepare_proxy(self, conn): - # Nothing to do for HTTP connections. - pass - - def _get_timeout(self, timeout): - """ Helper that always returns a :class:`urllib3.util.Timeout` """ - if timeout is _Default: - return self.timeout.clone() - - if isinstance(timeout, Timeout): - return timeout.clone() - else: - # User passed us an int/float. This is for backwards compatibility, - # can be removed later - return Timeout.from_float(timeout) - - def _raise_timeout(self, err, url, timeout_value): - """Is the error actually a timeout? Will raise a ReadTimeout or pass""" - - if isinstance(err, SocketTimeout): - raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) - - # See the above comment about EAGAIN in Python 3. In Python 2 we have - # to specifically catch it and throw the timeout error - if hasattr(err, 'errno') and err.errno in _blocking_errnos: - raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) - - # Catch possible read timeouts thrown as SSL errors. If not the - # case, rethrow the original. We need to do this because of: - # http://bugs.python.org/issue10272 - if 'timed out' in str(err) or 'did not complete (read)' in str(err): # Python < 2.7.4 - raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) - - def _make_request(self, conn, method, url, timeout=_Default, chunked=False, - **httplib_request_kw): - """ - Perform a request on a given urllib connection object taken from our - pool. - - :param conn: - a connection from one of our connection pools - - :param timeout: - Socket timeout in seconds for the request. This can be a - float or integer, which will set the same timeout value for - the socket connect and the socket read, or an instance of - :class:`urllib3.util.Timeout`, which gives you more fine-grained - control over your timeouts. - """ - self.num_requests += 1 - - timeout_obj = self._get_timeout(timeout) - timeout_obj.start_connect() - conn.timeout = timeout_obj.connect_timeout - - # Trigger any extra validation we need to do. - try: - self._validate_conn(conn) - except (SocketTimeout, BaseSSLError) as e: - # Py2 raises this as a BaseSSLError, Py3 raises it as socket timeout. - self._raise_timeout(err=e, url=url, timeout_value=conn.timeout) - raise - - # conn.request() calls httplib.*.request, not the method in - # urllib3.request. It also calls makefile (recv) on the socket. - if chunked: - conn.request_chunked(method, url, **httplib_request_kw) - else: - conn.request(method, url, **httplib_request_kw) - - # Reset the timeout for the recv() on the socket - read_timeout = timeout_obj.read_timeout - - # App Engine doesn't have a sock attr - if getattr(conn, 'sock', None): - # In Python 3 socket.py will catch EAGAIN and return None when you - # try and read into the file pointer created by http.client, which - # instead raises a BadStatusLine exception. Instead of catching - # the exception and assuming all BadStatusLine exceptions are read - # timeouts, check for a zero timeout before making the request. - if read_timeout == 0: - raise ReadTimeoutError( - self, url, "Read timed out. (read timeout=%s)" % read_timeout) - if read_timeout is Timeout.DEFAULT_TIMEOUT: - conn.sock.settimeout(socket.getdefaulttimeout()) - else: # None or a value - conn.sock.settimeout(read_timeout) - - # Receive the response from the server - try: - try: # Python 2.7, use buffering of HTTP responses - httplib_response = conn.getresponse(buffering=True) - except TypeError: # Python 3 - try: - httplib_response = conn.getresponse() - except Exception as e: - # Remove the TypeError from the exception chain in Python 3; - # otherwise it looks like a programming error was the cause. - six.raise_from(e, None) - except (SocketTimeout, BaseSSLError, SocketError) as e: - self._raise_timeout(err=e, url=url, timeout_value=read_timeout) - raise - - # AppEngine doesn't have a version attr. - http_version = getattr(conn, '_http_vsn_str', 'HTTP/?') - log.debug("%s://%s:%s \"%s %s %s\" %s %s", self.scheme, self.host, self.port, - method, url, http_version, httplib_response.status, - httplib_response.length) - - try: - assert_header_parsing(httplib_response.msg) - except (HeaderParsingError, TypeError) as hpe: # Platform-specific: Python 3 - log.warning( - 'Failed to parse headers (url=%s): %s', - self._absolute_url(url), hpe, exc_info=True) - - return httplib_response - - def _absolute_url(self, path): - return Url(scheme=self.scheme, host=self.host, port=self.port, path=path).url - - def close(self): - """ - Close all pooled connections and disable the pool. - """ - if self.pool is None: - return - # Disable access to the pool - old_pool, self.pool = self.pool, None - - try: - while True: - conn = old_pool.get(block=False) - if conn: - conn.close() - - except queue.Empty: - pass # Done. - - def is_same_host(self, url): - """ - Check if the given ``url`` is a member of the same host as this - connection pool. - """ - if url.startswith('/'): - return True - - # TODO: Add optional support for socket.gethostbyname checking. - scheme, host, port = get_host(url) - - host = _ipv6_host(host, self.scheme) - - # Use explicit default port for comparison when none is given - if self.port and not port: - port = port_by_scheme.get(scheme) - elif not self.port and port == port_by_scheme.get(scheme): - port = None - - return (scheme, host, port) == (self.scheme, self.host, self.port) - - def urlopen(self, method, url, body=None, headers=None, retries=None, - redirect=True, assert_same_host=True, timeout=_Default, - pool_timeout=None, release_conn=None, chunked=False, - body_pos=None, **response_kw): - """ - Get a connection from the pool and perform an HTTP request. This is the - lowest level call for making a request, so you'll need to specify all - the raw details. - - .. note:: - - More commonly, it's appropriate to use a convenience method provided - by :class:`.RequestMethods`, such as :meth:`request`. - - .. note:: - - `release_conn` will only behave as expected if - `preload_content=False` because we want to make - `preload_content=False` the default behaviour someday soon without - breaking backwards compatibility. - - :param method: - HTTP request method (such as GET, POST, PUT, etc.) - - :param body: - Data to send in the request body (useful for creating - POST requests, see HTTPConnectionPool.post_url for - more convenience). - - :param headers: - Dictionary of custom headers to send, such as User-Agent, - If-None-Match, etc. If None, pool headers are used. If provided, - these headers completely replace any pool-specific headers. - - :param retries: - Configure the number of retries to allow before raising a - :class:`~urllib3.exceptions.MaxRetryError` exception. - - Pass ``None`` to retry until you receive a response. Pass a - :class:`~urllib3.util.retry.Retry` object for fine-grained control - over different types of retries. - Pass an integer number to retry connection errors that many times, - but no other types of errors. Pass zero to never retry. - - If ``False``, then retries are disabled and any exception is raised - immediately. Also, instead of raising a MaxRetryError on redirects, - the redirect response will be returned. - - :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int. - - :param redirect: - If True, automatically handle redirects (status codes 301, 302, - 303, 307, 308). Each redirect counts as a retry. Disabling retries - will disable redirect, too. - - :param assert_same_host: - If ``True``, will make sure that the host of the pool requests is - consistent else will raise HostChangedError. When False, you can - use the pool on an HTTP proxy and request foreign hosts. - - :param timeout: - If specified, overrides the default timeout for this one - request. It may be a float (in seconds) or an instance of - :class:`urllib3.util.Timeout`. - - :param pool_timeout: - If set and the pool is set to block=True, then this method will - block for ``pool_timeout`` seconds and raise EmptyPoolError if no - connection is available within the time period. - - :param release_conn: - If False, then the urlopen call will not release the connection - back into the pool once a response is received (but will release if - you read the entire contents of the response such as when - `preload_content=True`). This is useful if you're not preloading - the response's content immediately. You will need to call - ``r.release_conn()`` on the response ``r`` to return the connection - back into the pool. If None, it takes the value of - ``response_kw.get('preload_content', True)``. - - :param chunked: - If True, urllib3 will send the body using chunked transfer - encoding. Otherwise, urllib3 will send the body using the standard - content-length form. Defaults to False. - - :param int body_pos: - Position to seek to in file-like body in the event of a retry or - redirect. Typically this won't need to be set because urllib3 will - auto-populate the value when needed. - - :param \\**response_kw: - Additional parameters are passed to - :meth:`urllib3.response.HTTPResponse.from_httplib` - """ - if headers is None: - headers = self.headers - - if not isinstance(retries, Retry): - retries = Retry.from_int(retries, redirect=redirect, default=self.retries) - - if release_conn is None: - release_conn = response_kw.get('preload_content', True) - - # Check host - if assert_same_host and not self.is_same_host(url): - raise HostChangedError(self, url, retries) - - conn = None - - # Track whether `conn` needs to be released before - # returning/raising/recursing. Update this variable if necessary, and - # leave `release_conn` constant throughout the function. That way, if - # the function recurses, the original value of `release_conn` will be - # passed down into the recursive call, and its value will be respected. - # - # See issue #651 [1] for details. - # - # [1] <https://github.com/shazow/urllib3/issues/651> - release_this_conn = release_conn - - # Merge the proxy headers. Only do this in HTTP. We have to copy the - # headers dict so we can safely change it without those changes being - # reflected in anyone else's copy. - if self.scheme == 'http': - headers = headers.copy() - headers.update(self.proxy_headers) - - # Must keep the exception bound to a separate variable or else Python 3 - # complains about UnboundLocalError. - err = None - - # Keep track of whether we cleanly exited the except block. This - # ensures we do proper cleanup in finally. - clean_exit = False - - # Rewind body position, if needed. Record current position - # for future rewinds in the event of a redirect/retry. - body_pos = set_file_position(body, body_pos) - - try: - # Request a connection from the queue. - timeout_obj = self._get_timeout(timeout) - conn = self._get_conn(timeout=pool_timeout) - - conn.timeout = timeout_obj.connect_timeout - - is_new_proxy_conn = self.proxy is not None and not getattr(conn, 'sock', None) - if is_new_proxy_conn: - self._prepare_proxy(conn) - - # Make the request on the httplib connection object. - httplib_response = self._make_request(conn, method, url, - timeout=timeout_obj, - body=body, headers=headers, - chunked=chunked) - - # If we're going to release the connection in ``finally:``, then - # the response doesn't need to know about the connection. Otherwise - # it will also try to release it and we'll have a double-release - # mess. - response_conn = conn if not release_conn else None - - # Pass method to Response for length checking - response_kw['request_method'] = method - - # Import httplib's response into our own wrapper object - response = self.ResponseCls.from_httplib(httplib_response, - pool=self, - connection=response_conn, - retries=retries, - **response_kw) - - # Everything went great! - clean_exit = True - - except queue.Empty: - # Timed out by queue. - raise EmptyPoolError(self, "No pool connections are available.") - - except (TimeoutError, HTTPException, SocketError, ProtocolError, - BaseSSLError, SSLError, CertificateError) as e: - # Discard the connection for these exceptions. It will be - # replaced during the next _get_conn() call. - clean_exit = False - if isinstance(e, (BaseSSLError, CertificateError)): - e = SSLError(e) - elif isinstance(e, (SocketError, NewConnectionError)) and self.proxy: - e = ProxyError('Cannot connect to proxy.', e) - elif isinstance(e, (SocketError, HTTPException)): - e = ProtocolError('Connection aborted.', e) - - retries = retries.increment(method, url, error=e, _pool=self, - _stacktrace=sys.exc_info()[2]) - retries.sleep() - - # Keep track of the error for the retry warning. - err = e - - finally: - if not clean_exit: - # We hit some kind of exception, handled or otherwise. We need - # to throw the connection away unless explicitly told not to. - # Close the connection, set the variable to None, and make sure - # we put the None back in the pool to avoid leaking it. - conn = conn and conn.close() - release_this_conn = True - - if release_this_conn: - # Put the connection back to be reused. If the connection is - # expired then it will be None, which will get replaced with a - # fresh connection during _get_conn. - self._put_conn(conn) - - if not conn: - # Try again - log.warning("Retrying (%r) after connection " - "broken by '%r': %s", retries, err, url) - return self.urlopen(method, url, body, headers, retries, - redirect, assert_same_host, - timeout=timeout, pool_timeout=pool_timeout, - release_conn=release_conn, body_pos=body_pos, - **response_kw) - - def drain_and_release_conn(response): - try: - # discard any remaining response body, the connection will be - # released back to the pool once the entire response is read - response.read() - except (TimeoutError, HTTPException, SocketError, ProtocolError, - BaseSSLError, SSLError) as e: - pass - - # Handle redirect? - redirect_location = redirect and response.get_redirect_location() - if redirect_location: - if response.status == 303: - method = 'GET' - - try: - retries = retries.increment(method, url, response=response, _pool=self) - except MaxRetryError: - if retries.raise_on_redirect: - # Drain and release the connection for this response, since - # we're not returning it to be released manually. - drain_and_release_conn(response) - raise - return response - - # drain and return the connection to the pool before recursing - drain_and_release_conn(response) - - retries.sleep_for_retry(response) - log.debug("Redirecting %s -> %s", url, redirect_location) - return self.urlopen( - method, redirect_location, body, headers, - retries=retries, redirect=redirect, - assert_same_host=assert_same_host, - timeout=timeout, pool_timeout=pool_timeout, - release_conn=release_conn, body_pos=body_pos, - **response_kw) - - # Check if we should retry the HTTP response. - has_retry_after = bool(response.getheader('Retry-After')) - if retries.is_retry(method, response.status, has_retry_after): - try: - retries = retries.increment(method, url, response=response, _pool=self) - except MaxRetryError: - if retries.raise_on_status: - # Drain and release the connection for this response, since - # we're not returning it to be released manually. - drain_and_release_conn(response) - raise - return response - - # drain and return the connection to the pool before recursing - drain_and_release_conn(response) - - retries.sleep(response) - log.debug("Retry: %s", url) - return self.urlopen( - method, url, body, headers, - retries=retries, redirect=redirect, - assert_same_host=assert_same_host, - timeout=timeout, pool_timeout=pool_timeout, - release_conn=release_conn, - body_pos=body_pos, **response_kw) - - return response - - -class HTTPSConnectionPool(HTTPConnectionPool): - """ - Same as :class:`.HTTPConnectionPool`, but HTTPS. - - When Python is compiled with the :mod:`ssl` module, then - :class:`.VerifiedHTTPSConnection` is used, which *can* verify certificates, - instead of :class:`.HTTPSConnection`. - - :class:`.VerifiedHTTPSConnection` uses one of ``assert_fingerprint``, - ``assert_hostname`` and ``host`` in this order to verify connections. - If ``assert_hostname`` is False, no verification is done. - - The ``key_file``, ``cert_file``, ``cert_reqs``, ``ca_certs``, - ``ca_cert_dir``, and ``ssl_version`` are only used if :mod:`ssl` is - available and are fed into :meth:`urllib3.util.ssl_wrap_socket` to upgrade - the connection socket into an SSL socket. - """ - - scheme = 'https' - ConnectionCls = HTTPSConnection - - def __init__(self, host, port=None, - strict=False, timeout=Timeout.DEFAULT_TIMEOUT, maxsize=1, - block=False, headers=None, retries=None, - _proxy=None, _proxy_headers=None, - key_file=None, cert_file=None, cert_reqs=None, - ca_certs=None, ssl_version=None, - assert_hostname=None, assert_fingerprint=None, - ca_cert_dir=None, **conn_kw): - - HTTPConnectionPool.__init__(self, host, port, strict, timeout, maxsize, - block, headers, retries, _proxy, _proxy_headers, - **conn_kw) - - if ca_certs and cert_reqs is None: - cert_reqs = 'CERT_REQUIRED' - - self.key_file = key_file - self.cert_file = cert_file - self.cert_reqs = cert_reqs - self.ca_certs = ca_certs - self.ca_cert_dir = ca_cert_dir - self.ssl_version = ssl_version - self.assert_hostname = assert_hostname - self.assert_fingerprint = assert_fingerprint - - def _prepare_conn(self, conn): - """ - Prepare the ``connection`` for :meth:`urllib3.util.ssl_wrap_socket` - and establish the tunnel if proxy is used. - """ - - if isinstance(conn, VerifiedHTTPSConnection): - conn.set_cert(key_file=self.key_file, - cert_file=self.cert_file, - cert_reqs=self.cert_reqs, - ca_certs=self.ca_certs, - ca_cert_dir=self.ca_cert_dir, - assert_hostname=self.assert_hostname, - assert_fingerprint=self.assert_fingerprint) - conn.ssl_version = self.ssl_version - return conn - - def _prepare_proxy(self, conn): - """ - Establish tunnel connection early, because otherwise httplib - would improperly set Host: header to proxy's IP:port. - """ - conn.set_tunnel(self._proxy_host, self.port, self.proxy_headers) - conn.connect() - - def _new_conn(self): - """ - Return a fresh :class:`httplib.HTTPSConnection`. - """ - self.num_connections += 1 - log.debug("Starting new HTTPS connection (%d): %s:%s", - self.num_connections, self.host, self.port or "443") - - if not self.ConnectionCls or self.ConnectionCls is DummyConnection: - raise SSLError("Can't connect to HTTPS URL because the SSL " - "module is not available.") - - actual_host = self.host - actual_port = self.port - if self.proxy is not None: - actual_host = self.proxy.host - actual_port = self.proxy.port - - conn = self.ConnectionCls(host=actual_host, port=actual_port, - timeout=self.timeout.connect_timeout, - strict=self.strict, **self.conn_kw) - - return self._prepare_conn(conn) - - def _validate_conn(self, conn): - """ - Called right before a request is made, after the socket is created. - """ - super(HTTPSConnectionPool, self)._validate_conn(conn) - - # Force connect early to allow us to validate the connection. - if not getattr(conn, 'sock', None): # AppEngine might not have `.sock` - conn.connect() - - if not conn.is_verified: - warnings.warn(( - 'Unverified HTTPS request is being made. ' - 'Adding certificate verification is strongly advised. See: ' - 'https://urllib3.readthedocs.io/en/latest/advanced-usage.html' - '#ssl-warnings'), - InsecureRequestWarning) - - -def connection_from_url(url, **kw): - """ - Given a url, return an :class:`.ConnectionPool` instance of its host. - - This is a shortcut for not having to parse out the scheme, host, and port - of the url before creating an :class:`.ConnectionPool` instance. - - :param url: - Absolute URL string that must include the scheme. Port is optional. - - :param \\**kw: - Passes additional parameters to the constructor of the appropriate - :class:`.ConnectionPool`. Useful for specifying things like - timeout, maxsize, headers, etc. - - Example:: - - >>> conn = connection_from_url('http://google.com/') - >>> r = conn.request('GET', '/') - """ - scheme, host, port = get_host(url) - port = port or port_by_scheme.get(scheme, 80) - if scheme == 'https': - return HTTPSConnectionPool(host, port=port, **kw) - else: - return HTTPConnectionPool(host, port=port, **kw) - - -def _ipv6_host(host, scheme): - """ - Process IPv6 address literals - """ - - # httplib doesn't like it when we include brackets in IPv6 addresses - # Specifically, if we include brackets but also pass the port then - # httplib crazily doubles up the square brackets on the Host header. - # Instead, we need to make sure we never pass ``None`` as the port. - # However, for backward compatibility reasons we can't actually - # *assert* that. See http://bugs.python.org/issue28539 - # - # Also if an IPv6 address literal has a zone identifier, the - # percent sign might be URIencoded, convert it back into ASCII - if host.startswith('[') and host.endswith(']'): - host = host.replace('%25', '%').strip('[]') - if scheme in NORMALIZABLE_SCHEMES: - host = host.lower() - return host diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__init__.py b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 278aa271318ffd26314f0c1439aef43da62f187e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 156 zcmZ?b<>g`kg1p5Nu^{>}h=2h`Aj1KOi&=m~3PUi1CZpd<h9ZzKg81dCUy@s(Uyxa# zo0(T!l9-dDn^IVrS7Dfz0TKk`__EZzl>8$7(xRN4%p_y|<ovvnqRb@y`1s7c%#!$c Xy@JYH95%W6DWy57b|B+F12F>tYG@|d diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-37.pyc deleted file mode 100644 index 6a9731f7ca44d4dc0b87c2e100f5c6d4901aa255..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8271 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 K+EY5f^#5-YEKA@3 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-37.pyc deleted file mode 100644 index 434df5aedb5fc1dc76d67ee4b713dea13502e980..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3198 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 IsaTc&0&PKUe*gdg diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-37.pyc deleted file mode 100644 index 22869170e4527626eb5c4363c953f15d61a6c7fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14434 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-37.pyc deleted file mode 100644 index cf2355a1f0211394c669ae3b869fb847f179f471..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17853 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 KNn6=$>i+=rv`oDK diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-37.pyc deleted file mode 100644 index 881d9f511d451db11b08e14d685545b3b325dd00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4862 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 F{{dQX5q|&x diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index fff771397003157ee61c3f3f49afa03023a82be2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 173 zcmZ?b<>g`kg1p5Nu^{>}h=2h`Aj1KOi&=m~3PUi1CZpd<h9ZzKg7_7tUy@s(Uyxa# zo0(T!l9-dDn^IVrS7Dfz0TKk`__EZzl>8$7(xRN4%p_y|<ovvnqRb@y_~O*$(xTLo oqQt!7g8ZTq{rLFIyv&mLc)fzkTO2mI`6;D2sdgayJ_9iW0DW04>i_@% diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-37.pyc deleted file mode 100644 index 2862f0123df4e4df7d85ac313a9757f4c95a80ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10268 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-37.pyc deleted file mode 100644 index eafeefe6f13e61acc5382816e0f24c7a02030a49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7449 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 S?p60q?~1$O((k7G!T$k{sN-7z diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py deleted file mode 100644 index bcf41c0..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py +++ /dev/null @@ -1,593 +0,0 @@ -""" -This module uses ctypes to bind a whole bunch of functions and constants from -SecureTransport. The goal here is to provide the low-level API to -SecureTransport. These are essentially the C-level functions and constants, and -they're pretty gross to work with. - -This code is a bastardised version of the code found in Will Bond's oscrypto -library. An enormous debt is owed to him for blazing this trail for us. For -that reason, this code should be considered to be covered both by urllib3's -license and by oscrypto's: - - Copyright (c) 2015-2016 Will Bond <will@wbond.net> - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the "Software"), - to deal in the Software without restriction, including without limitation - the rights to use, copy, modify, merge, publish, distribute, sublicense, - and/or sell copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. -""" -from __future__ import absolute_import - -import platform -from ctypes.util import find_library -from ctypes import ( - c_void_p, c_int32, c_char_p, c_size_t, c_byte, c_uint32, c_ulong, c_long, - c_bool -) -from ctypes import CDLL, POINTER, CFUNCTYPE - - -security_path = find_library('Security') -if not security_path: - raise ImportError('The library Security could not be found') - - -core_foundation_path = find_library('CoreFoundation') -if not core_foundation_path: - raise ImportError('The library CoreFoundation could not be found') - - -version = platform.mac_ver()[0] -version_info = tuple(map(int, version.split('.'))) -if version_info < (10, 8): - raise OSError( - 'Only OS X 10.8 and newer are supported, not %s.%s' % ( - version_info[0], version_info[1] - ) - ) - -Security = CDLL(security_path, use_errno=True) -CoreFoundation = CDLL(core_foundation_path, use_errno=True) - -Boolean = c_bool -CFIndex = c_long -CFStringEncoding = c_uint32 -CFData = c_void_p -CFString = c_void_p -CFArray = c_void_p -CFMutableArray = c_void_p -CFDictionary = c_void_p -CFError = c_void_p -CFType = c_void_p -CFTypeID = c_ulong - -CFTypeRef = POINTER(CFType) -CFAllocatorRef = c_void_p - -OSStatus = c_int32 - -CFDataRef = POINTER(CFData) -CFStringRef = POINTER(CFString) -CFArrayRef = POINTER(CFArray) -CFMutableArrayRef = POINTER(CFMutableArray) -CFDictionaryRef = POINTER(CFDictionary) -CFArrayCallBacks = c_void_p -CFDictionaryKeyCallBacks = c_void_p -CFDictionaryValueCallBacks = c_void_p - -SecCertificateRef = POINTER(c_void_p) -SecExternalFormat = c_uint32 -SecExternalItemType = c_uint32 -SecIdentityRef = POINTER(c_void_p) -SecItemImportExportFlags = c_uint32 -SecItemImportExportKeyParameters = c_void_p -SecKeychainRef = POINTER(c_void_p) -SSLProtocol = c_uint32 -SSLCipherSuite = c_uint32 -SSLContextRef = POINTER(c_void_p) -SecTrustRef = POINTER(c_void_p) -SSLConnectionRef = c_uint32 -SecTrustResultType = c_uint32 -SecTrustOptionFlags = c_uint32 -SSLProtocolSide = c_uint32 -SSLConnectionType = c_uint32 -SSLSessionOption = c_uint32 - - -try: - Security.SecItemImport.argtypes = [ - CFDataRef, - CFStringRef, - POINTER(SecExternalFormat), - POINTER(SecExternalItemType), - SecItemImportExportFlags, - POINTER(SecItemImportExportKeyParameters), - SecKeychainRef, - POINTER(CFArrayRef), - ] - Security.SecItemImport.restype = OSStatus - - Security.SecCertificateGetTypeID.argtypes = [] - Security.SecCertificateGetTypeID.restype = CFTypeID - - Security.SecIdentityGetTypeID.argtypes = [] - Security.SecIdentityGetTypeID.restype = CFTypeID - - Security.SecKeyGetTypeID.argtypes = [] - Security.SecKeyGetTypeID.restype = CFTypeID - - Security.SecCertificateCreateWithData.argtypes = [ - CFAllocatorRef, - CFDataRef - ] - Security.SecCertificateCreateWithData.restype = SecCertificateRef - - Security.SecCertificateCopyData.argtypes = [ - SecCertificateRef - ] - Security.SecCertificateCopyData.restype = CFDataRef - - Security.SecCopyErrorMessageString.argtypes = [ - OSStatus, - c_void_p - ] - Security.SecCopyErrorMessageString.restype = CFStringRef - - Security.SecIdentityCreateWithCertificate.argtypes = [ - CFTypeRef, - SecCertificateRef, - POINTER(SecIdentityRef) - ] - Security.SecIdentityCreateWithCertificate.restype = OSStatus - - Security.SecKeychainCreate.argtypes = [ - c_char_p, - c_uint32, - c_void_p, - Boolean, - c_void_p, - POINTER(SecKeychainRef) - ] - Security.SecKeychainCreate.restype = OSStatus - - Security.SecKeychainDelete.argtypes = [ - SecKeychainRef - ] - Security.SecKeychainDelete.restype = OSStatus - - Security.SecPKCS12Import.argtypes = [ - CFDataRef, - CFDictionaryRef, - POINTER(CFArrayRef) - ] - Security.SecPKCS12Import.restype = OSStatus - - SSLReadFunc = CFUNCTYPE(OSStatus, SSLConnectionRef, c_void_p, POINTER(c_size_t)) - SSLWriteFunc = CFUNCTYPE(OSStatus, SSLConnectionRef, POINTER(c_byte), POINTER(c_size_t)) - - Security.SSLSetIOFuncs.argtypes = [ - SSLContextRef, - SSLReadFunc, - SSLWriteFunc - ] - Security.SSLSetIOFuncs.restype = OSStatus - - Security.SSLSetPeerID.argtypes = [ - SSLContextRef, - c_char_p, - c_size_t - ] - Security.SSLSetPeerID.restype = OSStatus - - Security.SSLSetCertificate.argtypes = [ - SSLContextRef, - CFArrayRef - ] - Security.SSLSetCertificate.restype = OSStatus - - Security.SSLSetCertificateAuthorities.argtypes = [ - SSLContextRef, - CFTypeRef, - Boolean - ] - Security.SSLSetCertificateAuthorities.restype = OSStatus - - Security.SSLSetConnection.argtypes = [ - SSLContextRef, - SSLConnectionRef - ] - Security.SSLSetConnection.restype = OSStatus - - Security.SSLSetPeerDomainName.argtypes = [ - SSLContextRef, - c_char_p, - c_size_t - ] - Security.SSLSetPeerDomainName.restype = OSStatus - - Security.SSLHandshake.argtypes = [ - SSLContextRef - ] - Security.SSLHandshake.restype = OSStatus - - Security.SSLRead.argtypes = [ - SSLContextRef, - c_char_p, - c_size_t, - POINTER(c_size_t) - ] - Security.SSLRead.restype = OSStatus - - Security.SSLWrite.argtypes = [ - SSLContextRef, - c_char_p, - c_size_t, - POINTER(c_size_t) - ] - Security.SSLWrite.restype = OSStatus - - Security.SSLClose.argtypes = [ - SSLContextRef - ] - Security.SSLClose.restype = OSStatus - - Security.SSLGetNumberSupportedCiphers.argtypes = [ - SSLContextRef, - POINTER(c_size_t) - ] - Security.SSLGetNumberSupportedCiphers.restype = OSStatus - - Security.SSLGetSupportedCiphers.argtypes = [ - SSLContextRef, - POINTER(SSLCipherSuite), - POINTER(c_size_t) - ] - Security.SSLGetSupportedCiphers.restype = OSStatus - - Security.SSLSetEnabledCiphers.argtypes = [ - SSLContextRef, - POINTER(SSLCipherSuite), - c_size_t - ] - Security.SSLSetEnabledCiphers.restype = OSStatus - - Security.SSLGetNumberEnabledCiphers.argtype = [ - SSLContextRef, - POINTER(c_size_t) - ] - Security.SSLGetNumberEnabledCiphers.restype = OSStatus - - Security.SSLGetEnabledCiphers.argtypes = [ - SSLContextRef, - POINTER(SSLCipherSuite), - POINTER(c_size_t) - ] - Security.SSLGetEnabledCiphers.restype = OSStatus - - Security.SSLGetNegotiatedCipher.argtypes = [ - SSLContextRef, - POINTER(SSLCipherSuite) - ] - Security.SSLGetNegotiatedCipher.restype = OSStatus - - Security.SSLGetNegotiatedProtocolVersion.argtypes = [ - SSLContextRef, - POINTER(SSLProtocol) - ] - Security.SSLGetNegotiatedProtocolVersion.restype = OSStatus - - Security.SSLCopyPeerTrust.argtypes = [ - SSLContextRef, - POINTER(SecTrustRef) - ] - Security.SSLCopyPeerTrust.restype = OSStatus - - Security.SecTrustSetAnchorCertificates.argtypes = [ - SecTrustRef, - CFArrayRef - ] - Security.SecTrustSetAnchorCertificates.restype = OSStatus - - Security.SecTrustSetAnchorCertificatesOnly.argstypes = [ - SecTrustRef, - Boolean - ] - Security.SecTrustSetAnchorCertificatesOnly.restype = OSStatus - - Security.SecTrustEvaluate.argtypes = [ - SecTrustRef, - POINTER(SecTrustResultType) - ] - Security.SecTrustEvaluate.restype = OSStatus - - Security.SecTrustGetCertificateCount.argtypes = [ - SecTrustRef - ] - Security.SecTrustGetCertificateCount.restype = CFIndex - - Security.SecTrustGetCertificateAtIndex.argtypes = [ - SecTrustRef, - CFIndex - ] - Security.SecTrustGetCertificateAtIndex.restype = SecCertificateRef - - Security.SSLCreateContext.argtypes = [ - CFAllocatorRef, - SSLProtocolSide, - SSLConnectionType - ] - Security.SSLCreateContext.restype = SSLContextRef - - Security.SSLSetSessionOption.argtypes = [ - SSLContextRef, - SSLSessionOption, - Boolean - ] - Security.SSLSetSessionOption.restype = OSStatus - - Security.SSLSetProtocolVersionMin.argtypes = [ - SSLContextRef, - SSLProtocol - ] - Security.SSLSetProtocolVersionMin.restype = OSStatus - - Security.SSLSetProtocolVersionMax.argtypes = [ - SSLContextRef, - SSLProtocol - ] - Security.SSLSetProtocolVersionMax.restype = OSStatus - - Security.SecCopyErrorMessageString.argtypes = [ - OSStatus, - c_void_p - ] - Security.SecCopyErrorMessageString.restype = CFStringRef - - Security.SSLReadFunc = SSLReadFunc - Security.SSLWriteFunc = SSLWriteFunc - Security.SSLContextRef = SSLContextRef - Security.SSLProtocol = SSLProtocol - Security.SSLCipherSuite = SSLCipherSuite - Security.SecIdentityRef = SecIdentityRef - Security.SecKeychainRef = SecKeychainRef - Security.SecTrustRef = SecTrustRef - Security.SecTrustResultType = SecTrustResultType - Security.SecExternalFormat = SecExternalFormat - Security.OSStatus = OSStatus - - Security.kSecImportExportPassphrase = CFStringRef.in_dll( - Security, 'kSecImportExportPassphrase' - ) - Security.kSecImportItemIdentity = CFStringRef.in_dll( - Security, 'kSecImportItemIdentity' - ) - - # CoreFoundation time! - CoreFoundation.CFRetain.argtypes = [ - CFTypeRef - ] - CoreFoundation.CFRetain.restype = CFTypeRef - - CoreFoundation.CFRelease.argtypes = [ - CFTypeRef - ] - CoreFoundation.CFRelease.restype = None - - CoreFoundation.CFGetTypeID.argtypes = [ - CFTypeRef - ] - CoreFoundation.CFGetTypeID.restype = CFTypeID - - CoreFoundation.CFStringCreateWithCString.argtypes = [ - CFAllocatorRef, - c_char_p, - CFStringEncoding - ] - CoreFoundation.CFStringCreateWithCString.restype = CFStringRef - - CoreFoundation.CFStringGetCStringPtr.argtypes = [ - CFStringRef, - CFStringEncoding - ] - CoreFoundation.CFStringGetCStringPtr.restype = c_char_p - - CoreFoundation.CFStringGetCString.argtypes = [ - CFStringRef, - c_char_p, - CFIndex, - CFStringEncoding - ] - CoreFoundation.CFStringGetCString.restype = c_bool - - CoreFoundation.CFDataCreate.argtypes = [ - CFAllocatorRef, - c_char_p, - CFIndex - ] - CoreFoundation.CFDataCreate.restype = CFDataRef - - CoreFoundation.CFDataGetLength.argtypes = [ - CFDataRef - ] - CoreFoundation.CFDataGetLength.restype = CFIndex - - CoreFoundation.CFDataGetBytePtr.argtypes = [ - CFDataRef - ] - CoreFoundation.CFDataGetBytePtr.restype = c_void_p - - CoreFoundation.CFDictionaryCreate.argtypes = [ - CFAllocatorRef, - POINTER(CFTypeRef), - POINTER(CFTypeRef), - CFIndex, - CFDictionaryKeyCallBacks, - CFDictionaryValueCallBacks - ] - CoreFoundation.CFDictionaryCreate.restype = CFDictionaryRef - - CoreFoundation.CFDictionaryGetValue.argtypes = [ - CFDictionaryRef, - CFTypeRef - ] - CoreFoundation.CFDictionaryGetValue.restype = CFTypeRef - - CoreFoundation.CFArrayCreate.argtypes = [ - CFAllocatorRef, - POINTER(CFTypeRef), - CFIndex, - CFArrayCallBacks, - ] - CoreFoundation.CFArrayCreate.restype = CFArrayRef - - CoreFoundation.CFArrayCreateMutable.argtypes = [ - CFAllocatorRef, - CFIndex, - CFArrayCallBacks - ] - CoreFoundation.CFArrayCreateMutable.restype = CFMutableArrayRef - - CoreFoundation.CFArrayAppendValue.argtypes = [ - CFMutableArrayRef, - c_void_p - ] - CoreFoundation.CFArrayAppendValue.restype = None - - CoreFoundation.CFArrayGetCount.argtypes = [ - CFArrayRef - ] - CoreFoundation.CFArrayGetCount.restype = CFIndex - - CoreFoundation.CFArrayGetValueAtIndex.argtypes = [ - CFArrayRef, - CFIndex - ] - CoreFoundation.CFArrayGetValueAtIndex.restype = c_void_p - - CoreFoundation.kCFAllocatorDefault = CFAllocatorRef.in_dll( - CoreFoundation, 'kCFAllocatorDefault' - ) - CoreFoundation.kCFTypeArrayCallBacks = c_void_p.in_dll(CoreFoundation, 'kCFTypeArrayCallBacks') - CoreFoundation.kCFTypeDictionaryKeyCallBacks = c_void_p.in_dll( - CoreFoundation, 'kCFTypeDictionaryKeyCallBacks' - ) - CoreFoundation.kCFTypeDictionaryValueCallBacks = c_void_p.in_dll( - CoreFoundation, 'kCFTypeDictionaryValueCallBacks' - ) - - CoreFoundation.CFTypeRef = CFTypeRef - CoreFoundation.CFArrayRef = CFArrayRef - CoreFoundation.CFStringRef = CFStringRef - CoreFoundation.CFDictionaryRef = CFDictionaryRef - -except (AttributeError): - raise ImportError('Error initializing ctypes') - - -class CFConst(object): - """ - A class object that acts as essentially a namespace for CoreFoundation - constants. - """ - kCFStringEncodingUTF8 = CFStringEncoding(0x08000100) - - -class SecurityConst(object): - """ - A class object that acts as essentially a namespace for Security constants. - """ - kSSLSessionOptionBreakOnServerAuth = 0 - - kSSLProtocol2 = 1 - kSSLProtocol3 = 2 - kTLSProtocol1 = 4 - kTLSProtocol11 = 7 - kTLSProtocol12 = 8 - - kSSLClientSide = 1 - kSSLStreamType = 0 - - kSecFormatPEMSequence = 10 - - kSecTrustResultInvalid = 0 - kSecTrustResultProceed = 1 - # This gap is present on purpose: this was kSecTrustResultConfirm, which - # is deprecated. - kSecTrustResultDeny = 3 - kSecTrustResultUnspecified = 4 - kSecTrustResultRecoverableTrustFailure = 5 - kSecTrustResultFatalTrustFailure = 6 - kSecTrustResultOtherError = 7 - - errSSLProtocol = -9800 - errSSLWouldBlock = -9803 - errSSLClosedGraceful = -9805 - errSSLClosedNoNotify = -9816 - errSSLClosedAbort = -9806 - - errSSLXCertChainInvalid = -9807 - errSSLCrypto = -9809 - errSSLInternal = -9810 - errSSLCertExpired = -9814 - errSSLCertNotYetValid = -9815 - errSSLUnknownRootCert = -9812 - errSSLNoRootCert = -9813 - errSSLHostNameMismatch = -9843 - errSSLPeerHandshakeFail = -9824 - errSSLPeerUserCancelled = -9839 - errSSLWeakPeerEphemeralDHKey = -9850 - errSSLServerAuthCompleted = -9841 - errSSLRecordOverflow = -9847 - - errSecVerifyFailed = -67808 - errSecNoTrustSettings = -25263 - errSecItemNotFound = -25300 - errSecInvalidTrustSettings = -25262 - - # Cipher suites. We only pick the ones our default cipher string allows. - TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 = 0xC02C - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 = 0xC030 - TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 = 0xC02B - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 = 0xC02F - TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 = 0x00A3 - TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 = 0x009F - TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 = 0x00A2 - TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 = 0x009E - TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 = 0xC024 - TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 = 0xC028 - TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA = 0xC00A - TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA = 0xC014 - TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 = 0x006B - TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 = 0x006A - TLS_DHE_RSA_WITH_AES_256_CBC_SHA = 0x0039 - TLS_DHE_DSS_WITH_AES_256_CBC_SHA = 0x0038 - TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 = 0xC023 - TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 = 0xC027 - TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA = 0xC009 - TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA = 0xC013 - TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 = 0x0067 - TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 = 0x0040 - TLS_DHE_RSA_WITH_AES_128_CBC_SHA = 0x0033 - TLS_DHE_DSS_WITH_AES_128_CBC_SHA = 0x0032 - TLS_RSA_WITH_AES_256_GCM_SHA384 = 0x009D - TLS_RSA_WITH_AES_128_GCM_SHA256 = 0x009C - TLS_RSA_WITH_AES_256_CBC_SHA256 = 0x003D - TLS_RSA_WITH_AES_128_CBC_SHA256 = 0x003C - TLS_RSA_WITH_AES_256_CBC_SHA = 0x0035 - TLS_RSA_WITH_AES_128_CBC_SHA = 0x002F - TLS_AES_128_GCM_SHA256 = 0x1301 - TLS_AES_256_GCM_SHA384 = 0x1302 - TLS_CHACHA20_POLY1305_SHA256 = 0x1303 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py deleted file mode 100644 index b13cd9e..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py +++ /dev/null @@ -1,346 +0,0 @@ -""" -Low-level helpers for the SecureTransport bindings. - -These are Python functions that are not directly related to the high-level APIs -but are necessary to get them to work. They include a whole bunch of low-level -CoreFoundation messing about and memory management. The concerns in this module -are almost entirely about trying to avoid memory leaks and providing -appropriate and useful assistance to the higher-level code. -""" -import base64 -import ctypes -import itertools -import re -import os -import ssl -import tempfile - -from .bindings import Security, CoreFoundation, CFConst - - -# This regular expression is used to grab PEM data out of a PEM bundle. -_PEM_CERTS_RE = re.compile( - b"-----BEGIN CERTIFICATE-----\n(.*?)\n-----END CERTIFICATE-----", re.DOTALL -) - - -def _cf_data_from_bytes(bytestring): - """ - Given a bytestring, create a CFData object from it. This CFData object must - be CFReleased by the caller. - """ - return CoreFoundation.CFDataCreate( - CoreFoundation.kCFAllocatorDefault, bytestring, len(bytestring) - ) - - -def _cf_dictionary_from_tuples(tuples): - """ - Given a list of Python tuples, create an associated CFDictionary. - """ - dictionary_size = len(tuples) - - # We need to get the dictionary keys and values out in the same order. - keys = (t[0] for t in tuples) - values = (t[1] for t in tuples) - cf_keys = (CoreFoundation.CFTypeRef * dictionary_size)(*keys) - cf_values = (CoreFoundation.CFTypeRef * dictionary_size)(*values) - - return CoreFoundation.CFDictionaryCreate( - CoreFoundation.kCFAllocatorDefault, - cf_keys, - cf_values, - dictionary_size, - CoreFoundation.kCFTypeDictionaryKeyCallBacks, - CoreFoundation.kCFTypeDictionaryValueCallBacks, - ) - - -def _cf_string_to_unicode(value): - """ - Creates a Unicode string from a CFString object. Used entirely for error - reporting. - - Yes, it annoys me quite a lot that this function is this complex. - """ - value_as_void_p = ctypes.cast(value, ctypes.POINTER(ctypes.c_void_p)) - - string = CoreFoundation.CFStringGetCStringPtr( - value_as_void_p, - CFConst.kCFStringEncodingUTF8 - ) - if string is None: - buffer = ctypes.create_string_buffer(1024) - result = CoreFoundation.CFStringGetCString( - value_as_void_p, - buffer, - 1024, - CFConst.kCFStringEncodingUTF8 - ) - if not result: - raise OSError('Error copying C string from CFStringRef') - string = buffer.value - if string is not None: - string = string.decode('utf-8') - return string - - -def _assert_no_error(error, exception_class=None): - """ - Checks the return code and throws an exception if there is an error to - report - """ - if error == 0: - return - - cf_error_string = Security.SecCopyErrorMessageString(error, None) - output = _cf_string_to_unicode(cf_error_string) - CoreFoundation.CFRelease(cf_error_string) - - if output is None or output == u'': - output = u'OSStatus %s' % error - - if exception_class is None: - exception_class = ssl.SSLError - - raise exception_class(output) - - -def _cert_array_from_pem(pem_bundle): - """ - Given a bundle of certs in PEM format, turns them into a CFArray of certs - that can be used to validate a cert chain. - """ - # Normalize the PEM bundle's line endings. - pem_bundle = pem_bundle.replace(b"\r\n", b"\n") - - der_certs = [ - base64.b64decode(match.group(1)) - for match in _PEM_CERTS_RE.finditer(pem_bundle) - ] - if not der_certs: - raise ssl.SSLError("No root certificates specified") - - cert_array = CoreFoundation.CFArrayCreateMutable( - CoreFoundation.kCFAllocatorDefault, - 0, - ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks) - ) - if not cert_array: - raise ssl.SSLError("Unable to allocate memory!") - - try: - for der_bytes in der_certs: - certdata = _cf_data_from_bytes(der_bytes) - if not certdata: - raise ssl.SSLError("Unable to allocate memory!") - cert = Security.SecCertificateCreateWithData( - CoreFoundation.kCFAllocatorDefault, certdata - ) - CoreFoundation.CFRelease(certdata) - if not cert: - raise ssl.SSLError("Unable to build cert object!") - - CoreFoundation.CFArrayAppendValue(cert_array, cert) - CoreFoundation.CFRelease(cert) - except Exception: - # We need to free the array before the exception bubbles further. - # We only want to do that if an error occurs: otherwise, the caller - # should free. - CoreFoundation.CFRelease(cert_array) - - return cert_array - - -def _is_cert(item): - """ - Returns True if a given CFTypeRef is a certificate. - """ - expected = Security.SecCertificateGetTypeID() - return CoreFoundation.CFGetTypeID(item) == expected - - -def _is_identity(item): - """ - Returns True if a given CFTypeRef is an identity. - """ - expected = Security.SecIdentityGetTypeID() - return CoreFoundation.CFGetTypeID(item) == expected - - -def _temporary_keychain(): - """ - This function creates a temporary Mac keychain that we can use to work with - credentials. This keychain uses a one-time password and a temporary file to - store the data. We expect to have one keychain per socket. The returned - SecKeychainRef must be freed by the caller, including calling - SecKeychainDelete. - - Returns a tuple of the SecKeychainRef and the path to the temporary - directory that contains it. - """ - # Unfortunately, SecKeychainCreate requires a path to a keychain. This - # means we cannot use mkstemp to use a generic temporary file. Instead, - # we're going to create a temporary directory and a filename to use there. - # This filename will be 8 random bytes expanded into base64. We also need - # some random bytes to password-protect the keychain we're creating, so we - # ask for 40 random bytes. - random_bytes = os.urandom(40) - filename = base64.b16encode(random_bytes[:8]).decode('utf-8') - password = base64.b16encode(random_bytes[8:]) # Must be valid UTF-8 - tempdirectory = tempfile.mkdtemp() - - keychain_path = os.path.join(tempdirectory, filename).encode('utf-8') - - # We now want to create the keychain itself. - keychain = Security.SecKeychainRef() - status = Security.SecKeychainCreate( - keychain_path, - len(password), - password, - False, - None, - ctypes.byref(keychain) - ) - _assert_no_error(status) - - # Having created the keychain, we want to pass it off to the caller. - return keychain, tempdirectory - - -def _load_items_from_file(keychain, path): - """ - Given a single file, loads all the trust objects from it into arrays and - the keychain. - Returns a tuple of lists: the first list is a list of identities, the - second a list of certs. - """ - certificates = [] - identities = [] - result_array = None - - with open(path, 'rb') as f: - raw_filedata = f.read() - - try: - filedata = CoreFoundation.CFDataCreate( - CoreFoundation.kCFAllocatorDefault, - raw_filedata, - len(raw_filedata) - ) - result_array = CoreFoundation.CFArrayRef() - result = Security.SecItemImport( - filedata, # cert data - None, # Filename, leaving it out for now - None, # What the type of the file is, we don't care - None, # what's in the file, we don't care - 0, # import flags - None, # key params, can include passphrase in the future - keychain, # The keychain to insert into - ctypes.byref(result_array) # Results - ) - _assert_no_error(result) - - # A CFArray is not very useful to us as an intermediary - # representation, so we are going to extract the objects we want - # and then free the array. We don't need to keep hold of keys: the - # keychain already has them! - result_count = CoreFoundation.CFArrayGetCount(result_array) - for index in range(result_count): - item = CoreFoundation.CFArrayGetValueAtIndex( - result_array, index - ) - item = ctypes.cast(item, CoreFoundation.CFTypeRef) - - if _is_cert(item): - CoreFoundation.CFRetain(item) - certificates.append(item) - elif _is_identity(item): - CoreFoundation.CFRetain(item) - identities.append(item) - finally: - if result_array: - CoreFoundation.CFRelease(result_array) - - CoreFoundation.CFRelease(filedata) - - return (identities, certificates) - - -def _load_client_cert_chain(keychain, *paths): - """ - Load certificates and maybe keys from a number of files. Has the end goal - of returning a CFArray containing one SecIdentityRef, and then zero or more - SecCertificateRef objects, suitable for use as a client certificate trust - chain. - """ - # Ok, the strategy. - # - # This relies on knowing that macOS will not give you a SecIdentityRef - # unless you have imported a key into a keychain. This is a somewhat - # artificial limitation of macOS (for example, it doesn't necessarily - # affect iOS), but there is nothing inside Security.framework that lets you - # get a SecIdentityRef without having a key in a keychain. - # - # So the policy here is we take all the files and iterate them in order. - # Each one will use SecItemImport to have one or more objects loaded from - # it. We will also point at a keychain that macOS can use to work with the - # private key. - # - # Once we have all the objects, we'll check what we actually have. If we - # already have a SecIdentityRef in hand, fab: we'll use that. Otherwise, - # we'll take the first certificate (which we assume to be our leaf) and - # ask the keychain to give us a SecIdentityRef with that cert's associated - # key. - # - # We'll then return a CFArray containing the trust chain: one - # SecIdentityRef and then zero-or-more SecCertificateRef objects. The - # responsibility for freeing this CFArray will be with the caller. This - # CFArray must remain alive for the entire connection, so in practice it - # will be stored with a single SSLSocket, along with the reference to the - # keychain. - certificates = [] - identities = [] - - # Filter out bad paths. - paths = (path for path in paths if path) - - try: - for file_path in paths: - new_identities, new_certs = _load_items_from_file( - keychain, file_path - ) - identities.extend(new_identities) - certificates.extend(new_certs) - - # Ok, we have everything. The question is: do we have an identity? If - # not, we want to grab one from the first cert we have. - if not identities: - new_identity = Security.SecIdentityRef() - status = Security.SecIdentityCreateWithCertificate( - keychain, - certificates[0], - ctypes.byref(new_identity) - ) - _assert_no_error(status) - identities.append(new_identity) - - # We now want to release the original certificate, as we no longer - # need it. - CoreFoundation.CFRelease(certificates.pop(0)) - - # We now need to build a new CFArray that holds the trust chain. - trust_chain = CoreFoundation.CFArrayCreateMutable( - CoreFoundation.kCFAllocatorDefault, - 0, - ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks), - ) - for item in itertools.chain(identities, certificates): - # ArrayAppendValue does a CFRetain on the item. That's fine, - # because the finally block will release our other refs to them. - CoreFoundation.CFArrayAppendValue(trust_chain, item) - - return trust_chain - finally: - for obj in itertools.chain(identities, certificates): - CoreFoundation.CFRelease(obj) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/appengine.py b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/appengine.py deleted file mode 100644 index 9b42952..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/appengine.py +++ /dev/null @@ -1,289 +0,0 @@ -""" -This module provides a pool manager that uses Google App Engine's -`URLFetch Service <https://cloud.google.com/appengine/docs/python/urlfetch>`_. - -Example usage:: - - from pip._vendor.urllib3 import PoolManager - from pip._vendor.urllib3.contrib.appengine import AppEngineManager, is_appengine_sandbox - - if is_appengine_sandbox(): - # AppEngineManager uses AppEngine's URLFetch API behind the scenes - http = AppEngineManager() - else: - # PoolManager uses a socket-level API behind the scenes - http = PoolManager() - - r = http.request('GET', 'https://google.com/') - -There are `limitations <https://cloud.google.com/appengine/docs/python/\ -urlfetch/#Python_Quotas_and_limits>`_ to the URLFetch service and it may not be -the best choice for your application. There are three options for using -urllib3 on Google App Engine: - -1. You can use :class:`AppEngineManager` with URLFetch. URLFetch is - cost-effective in many circumstances as long as your usage is within the - limitations. -2. You can use a normal :class:`~urllib3.PoolManager` by enabling sockets. - Sockets also have `limitations and restrictions - <https://cloud.google.com/appengine/docs/python/sockets/\ - #limitations-and-restrictions>`_ and have a lower free quota than URLFetch. - To use sockets, be sure to specify the following in your ``app.yaml``:: - - env_variables: - GAE_USE_SOCKETS_HTTPLIB : 'true' - -3. If you are using `App Engine Flexible -<https://cloud.google.com/appengine/docs/flexible/>`_, you can use the standard -:class:`PoolManager` without any configuration or special environment variables. -""" - -from __future__ import absolute_import -import io -import logging -import warnings -from ..packages.six.moves.urllib.parse import urljoin - -from ..exceptions import ( - HTTPError, - HTTPWarning, - MaxRetryError, - ProtocolError, - TimeoutError, - SSLError -) - -from ..request import RequestMethods -from ..response import HTTPResponse -from ..util.timeout import Timeout -from ..util.retry import Retry -from . import _appengine_environ - -try: - from google.appengine.api import urlfetch -except ImportError: - urlfetch = None - - -log = logging.getLogger(__name__) - - -class AppEnginePlatformWarning(HTTPWarning): - pass - - -class AppEnginePlatformError(HTTPError): - pass - - -class AppEngineManager(RequestMethods): - """ - Connection manager for Google App Engine sandbox applications. - - This manager uses the URLFetch service directly instead of using the - emulated httplib, and is subject to URLFetch limitations as described in - the App Engine documentation `here - <https://cloud.google.com/appengine/docs/python/urlfetch>`_. - - Notably it will raise an :class:`AppEnginePlatformError` if: - * URLFetch is not available. - * If you attempt to use this on App Engine Flexible, as full socket - support is available. - * If a request size is more than 10 megabytes. - * If a response size is more than 32 megabtyes. - * If you use an unsupported request method such as OPTIONS. - - Beyond those cases, it will raise normal urllib3 errors. - """ - - def __init__(self, headers=None, retries=None, validate_certificate=True, - urlfetch_retries=True): - if not urlfetch: - raise AppEnginePlatformError( - "URLFetch is not available in this environment.") - - if is_prod_appengine_mvms(): - raise AppEnginePlatformError( - "Use normal urllib3.PoolManager instead of AppEngineManager" - "on Managed VMs, as using URLFetch is not necessary in " - "this environment.") - - warnings.warn( - "urllib3 is using URLFetch on Google App Engine sandbox instead " - "of sockets. To use sockets directly instead of URLFetch see " - "https://urllib3.readthedocs.io/en/latest/reference/urllib3.contrib.html.", - AppEnginePlatformWarning) - - RequestMethods.__init__(self, headers) - self.validate_certificate = validate_certificate - self.urlfetch_retries = urlfetch_retries - - self.retries = retries or Retry.DEFAULT - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - # Return False to re-raise any potential exceptions - return False - - def urlopen(self, method, url, body=None, headers=None, - retries=None, redirect=True, timeout=Timeout.DEFAULT_TIMEOUT, - **response_kw): - - retries = self._get_retries(retries, redirect) - - try: - follow_redirects = ( - redirect and - retries.redirect != 0 and - retries.total) - response = urlfetch.fetch( - url, - payload=body, - method=method, - headers=headers or {}, - allow_truncated=False, - follow_redirects=self.urlfetch_retries and follow_redirects, - deadline=self._get_absolute_timeout(timeout), - validate_certificate=self.validate_certificate, - ) - except urlfetch.DeadlineExceededError as e: - raise TimeoutError(self, e) - - except urlfetch.InvalidURLError as e: - if 'too large' in str(e): - raise AppEnginePlatformError( - "URLFetch request too large, URLFetch only " - "supports requests up to 10mb in size.", e) - raise ProtocolError(e) - - except urlfetch.DownloadError as e: - if 'Too many redirects' in str(e): - raise MaxRetryError(self, url, reason=e) - raise ProtocolError(e) - - except urlfetch.ResponseTooLargeError as e: - raise AppEnginePlatformError( - "URLFetch response too large, URLFetch only supports" - "responses up to 32mb in size.", e) - - except urlfetch.SSLCertificateError as e: - raise SSLError(e) - - except urlfetch.InvalidMethodError as e: - raise AppEnginePlatformError( - "URLFetch does not support method: %s" % method, e) - - http_response = self._urlfetch_response_to_http_response( - response, retries=retries, **response_kw) - - # Handle redirect? - redirect_location = redirect and http_response.get_redirect_location() - if redirect_location: - # Check for redirect response - if (self.urlfetch_retries and retries.raise_on_redirect): - raise MaxRetryError(self, url, "too many redirects") - else: - if http_response.status == 303: - method = 'GET' - - try: - retries = retries.increment(method, url, response=http_response, _pool=self) - except MaxRetryError: - if retries.raise_on_redirect: - raise MaxRetryError(self, url, "too many redirects") - return http_response - - retries.sleep_for_retry(http_response) - log.debug("Redirecting %s -> %s", url, redirect_location) - redirect_url = urljoin(url, redirect_location) - return self.urlopen( - method, redirect_url, body, headers, - retries=retries, redirect=redirect, - timeout=timeout, **response_kw) - - # Check if we should retry the HTTP response. - has_retry_after = bool(http_response.getheader('Retry-After')) - if retries.is_retry(method, http_response.status, has_retry_after): - retries = retries.increment( - method, url, response=http_response, _pool=self) - log.debug("Retry: %s", url) - retries.sleep(http_response) - return self.urlopen( - method, url, - body=body, headers=headers, - retries=retries, redirect=redirect, - timeout=timeout, **response_kw) - - return http_response - - def _urlfetch_response_to_http_response(self, urlfetch_resp, **response_kw): - - if is_prod_appengine(): - # Production GAE handles deflate encoding automatically, but does - # not remove the encoding header. - content_encoding = urlfetch_resp.headers.get('content-encoding') - - if content_encoding == 'deflate': - del urlfetch_resp.headers['content-encoding'] - - transfer_encoding = urlfetch_resp.headers.get('transfer-encoding') - # We have a full response's content, - # so let's make sure we don't report ourselves as chunked data. - if transfer_encoding == 'chunked': - encodings = transfer_encoding.split(",") - encodings.remove('chunked') - urlfetch_resp.headers['transfer-encoding'] = ','.join(encodings) - - original_response = HTTPResponse( - # In order for decoding to work, we must present the content as - # a file-like object. - body=io.BytesIO(urlfetch_resp.content), - msg=urlfetch_resp.header_msg, - headers=urlfetch_resp.headers, - status=urlfetch_resp.status_code, - **response_kw - ) - - return HTTPResponse( - body=io.BytesIO(urlfetch_resp.content), - headers=urlfetch_resp.headers, - status=urlfetch_resp.status_code, - original_response=original_response, - **response_kw - ) - - def _get_absolute_timeout(self, timeout): - if timeout is Timeout.DEFAULT_TIMEOUT: - return None # Defer to URLFetch's default. - if isinstance(timeout, Timeout): - if timeout._read is not None or timeout._connect is not None: - warnings.warn( - "URLFetch does not support granular timeout settings, " - "reverting to total or default URLFetch timeout.", - AppEnginePlatformWarning) - return timeout.total - return timeout - - def _get_retries(self, retries, redirect): - if not isinstance(retries, Retry): - retries = Retry.from_int( - retries, redirect=redirect, default=self.retries) - - if retries.connect or retries.read or retries.redirect: - warnings.warn( - "URLFetch only supports total retries and does not " - "recognize connect, read, or redirect retry parameters.", - AppEnginePlatformWarning) - - return retries - - -# Alias methods from _appengine_environ to maintain public API interface. - -is_appengine = _appengine_environ.is_appengine -is_appengine_sandbox = _appengine_environ.is_appengine_sandbox -is_local_appengine = _appengine_environ.is_local_appengine -is_prod_appengine = _appengine_environ.is_prod_appengine -is_prod_appengine_mvms = _appengine_environ.is_prod_appengine_mvms diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py deleted file mode 100644 index 8ea127c..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py +++ /dev/null @@ -1,111 +0,0 @@ -""" -NTLM authenticating pool, contributed by erikcederstran - -Issue #10, see: http://code.google.com/p/urllib3/issues/detail?id=10 -""" -from __future__ import absolute_import - -from logging import getLogger -from ntlm import ntlm - -from .. import HTTPSConnectionPool -from ..packages.six.moves.http_client import HTTPSConnection - - -log = getLogger(__name__) - - -class NTLMConnectionPool(HTTPSConnectionPool): - """ - Implements an NTLM authentication version of an urllib3 connection pool - """ - - scheme = 'https' - - def __init__(self, user, pw, authurl, *args, **kwargs): - """ - authurl is a random URL on the server that is protected by NTLM. - user is the Windows user, probably in the DOMAIN\\username format. - pw is the password for the user. - """ - super(NTLMConnectionPool, self).__init__(*args, **kwargs) - self.authurl = authurl - self.rawuser = user - user_parts = user.split('\\', 1) - self.domain = user_parts[0].upper() - self.user = user_parts[1] - self.pw = pw - - def _new_conn(self): - # Performs the NTLM handshake that secures the connection. The socket - # must be kept open while requests are performed. - self.num_connections += 1 - log.debug('Starting NTLM HTTPS connection no. %d: https://%s%s', - self.num_connections, self.host, self.authurl) - - headers = {'Connection': 'Keep-Alive'} - req_header = 'Authorization' - resp_header = 'www-authenticate' - - conn = HTTPSConnection(host=self.host, port=self.port) - - # Send negotiation message - headers[req_header] = ( - 'NTLM %s' % ntlm.create_NTLM_NEGOTIATE_MESSAGE(self.rawuser)) - log.debug('Request headers: %s', headers) - conn.request('GET', self.authurl, None, headers) - res = conn.getresponse() - reshdr = dict(res.getheaders()) - log.debug('Response status: %s %s', res.status, res.reason) - log.debug('Response headers: %s', reshdr) - log.debug('Response data: %s [...]', res.read(100)) - - # Remove the reference to the socket, so that it can not be closed by - # the response object (we want to keep the socket open) - res.fp = None - - # Server should respond with a challenge message - auth_header_values = reshdr[resp_header].split(', ') - auth_header_value = None - for s in auth_header_values: - if s[:5] == 'NTLM ': - auth_header_value = s[5:] - if auth_header_value is None: - raise Exception('Unexpected %s response header: %s' % - (resp_header, reshdr[resp_header])) - - # Send authentication message - ServerChallenge, NegotiateFlags = \ - ntlm.parse_NTLM_CHALLENGE_MESSAGE(auth_header_value) - auth_msg = ntlm.create_NTLM_AUTHENTICATE_MESSAGE(ServerChallenge, - self.user, - self.domain, - self.pw, - NegotiateFlags) - headers[req_header] = 'NTLM %s' % auth_msg - log.debug('Request headers: %s', headers) - conn.request('GET', self.authurl, None, headers) - res = conn.getresponse() - log.debug('Response status: %s %s', res.status, res.reason) - log.debug('Response headers: %s', dict(res.getheaders())) - log.debug('Response data: %s [...]', res.read()[:100]) - if res.status != 200: - if res.status == 401: - raise Exception('Server rejected request: wrong ' - 'username or password') - raise Exception('Wrong server response: %s %s' % - (res.status, res.reason)) - - res.fp = None - log.debug('Connection established') - return conn - - def urlopen(self, method, url, body=None, headers=None, retries=3, - redirect=True, assert_same_host=True): - if headers is None: - headers = {} - headers['Connection'] = 'Keep-Alive' - return super(NTLMConnectionPool, self).urlopen(method, url, body, - headers, retries, - redirect, - assert_same_host) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py deleted file mode 100644 index 363667c..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py +++ /dev/null @@ -1,466 +0,0 @@ -""" -SSL with SNI_-support for Python 2. Follow these instructions if you would -like to verify SSL certificates in Python 2. Note, the default libraries do -*not* do certificate checking; you need to do additional work to validate -certificates yourself. - -This needs the following packages installed: - -* pyOpenSSL (tested with 16.0.0) -* cryptography (minimum 1.3.4, from pyopenssl) -* idna (minimum 2.0, from cryptography) - -However, pyopenssl depends on cryptography, which depends on idna, so while we -use all three directly here we end up having relatively few packages required. - -You can install them with the following command: - - pip install pyopenssl cryptography idna - -To activate certificate checking, call -:func:`~urllib3.contrib.pyopenssl.inject_into_urllib3` from your Python code -before you begin making HTTP requests. This can be done in a ``sitecustomize`` -module, or at any other time before your application begins using ``urllib3``, -like this:: - - try: - import urllib3.contrib.pyopenssl - urllib3.contrib.pyopenssl.inject_into_urllib3() - except ImportError: - pass - -Now you can use :mod:`urllib3` as you normally would, and it will support SNI -when the required modules are installed. - -Activating this module also has the positive side effect of disabling SSL/TLS -compression in Python 2 (see `CRIME attack`_). - -If you want to configure the default list of supported cipher suites, you can -set the ``urllib3.contrib.pyopenssl.DEFAULT_SSL_CIPHER_LIST`` variable. - -.. _sni: https://en.wikipedia.org/wiki/Server_Name_Indication -.. _crime attack: https://en.wikipedia.org/wiki/CRIME_(security_exploit) -""" -from __future__ import absolute_import - -import OpenSSL.SSL -from cryptography import x509 -from cryptography.hazmat.backends.openssl import backend as openssl_backend -from cryptography.hazmat.backends.openssl.x509 import _Certificate -try: - from cryptography.x509 import UnsupportedExtension -except ImportError: - # UnsupportedExtension is gone in cryptography >= 2.1.0 - class UnsupportedExtension(Exception): - pass - -from socket import timeout, error as SocketError -from io import BytesIO - -try: # Platform-specific: Python 2 - from socket import _fileobject -except ImportError: # Platform-specific: Python 3 - _fileobject = None - from ..packages.backports.makefile import backport_makefile - -import logging -import ssl -from ..packages import six -import sys - -from .. import util - -__all__ = ['inject_into_urllib3', 'extract_from_urllib3'] - -# SNI always works. -HAS_SNI = True - -# Map from urllib3 to PyOpenSSL compatible parameter-values. -_openssl_versions = { - ssl.PROTOCOL_SSLv23: OpenSSL.SSL.SSLv23_METHOD, - ssl.PROTOCOL_TLSv1: OpenSSL.SSL.TLSv1_METHOD, -} - -if hasattr(ssl, 'PROTOCOL_TLSv1_1') and hasattr(OpenSSL.SSL, 'TLSv1_1_METHOD'): - _openssl_versions[ssl.PROTOCOL_TLSv1_1] = OpenSSL.SSL.TLSv1_1_METHOD - -if hasattr(ssl, 'PROTOCOL_TLSv1_2') and hasattr(OpenSSL.SSL, 'TLSv1_2_METHOD'): - _openssl_versions[ssl.PROTOCOL_TLSv1_2] = OpenSSL.SSL.TLSv1_2_METHOD - -try: - _openssl_versions.update({ssl.PROTOCOL_SSLv3: OpenSSL.SSL.SSLv3_METHOD}) -except AttributeError: - pass - -_stdlib_to_openssl_verify = { - ssl.CERT_NONE: OpenSSL.SSL.VERIFY_NONE, - ssl.CERT_OPTIONAL: OpenSSL.SSL.VERIFY_PEER, - ssl.CERT_REQUIRED: - OpenSSL.SSL.VERIFY_PEER + OpenSSL.SSL.VERIFY_FAIL_IF_NO_PEER_CERT, -} -_openssl_to_stdlib_verify = dict( - (v, k) for k, v in _stdlib_to_openssl_verify.items() -) - -# OpenSSL will only write 16K at a time -SSL_WRITE_BLOCKSIZE = 16384 - -orig_util_HAS_SNI = util.HAS_SNI -orig_util_SSLContext = util.ssl_.SSLContext - - -log = logging.getLogger(__name__) - - -def inject_into_urllib3(): - 'Monkey-patch urllib3 with PyOpenSSL-backed SSL-support.' - - _validate_dependencies_met() - - util.ssl_.SSLContext = PyOpenSSLContext - util.HAS_SNI = HAS_SNI - util.ssl_.HAS_SNI = HAS_SNI - util.IS_PYOPENSSL = True - util.ssl_.IS_PYOPENSSL = True - - -def extract_from_urllib3(): - 'Undo monkey-patching by :func:`inject_into_urllib3`.' - - util.ssl_.SSLContext = orig_util_SSLContext - util.HAS_SNI = orig_util_HAS_SNI - util.ssl_.HAS_SNI = orig_util_HAS_SNI - util.IS_PYOPENSSL = False - util.ssl_.IS_PYOPENSSL = False - - -def _validate_dependencies_met(): - """ - Verifies that PyOpenSSL's package-level dependencies have been met. - Throws `ImportError` if they are not met. - """ - # Method added in `cryptography==1.1`; not available in older versions - from cryptography.x509.extensions import Extensions - if getattr(Extensions, "get_extension_for_class", None) is None: - raise ImportError("'cryptography' module missing required functionality. " - "Try upgrading to v1.3.4 or newer.") - - # pyOpenSSL 0.14 and above use cryptography for OpenSSL bindings. The _x509 - # attribute is only present on those versions. - from OpenSSL.crypto import X509 - x509 = X509() - if getattr(x509, "_x509", None) is None: - raise ImportError("'pyOpenSSL' module missing required functionality. " - "Try upgrading to v0.14 or newer.") - - -def _dnsname_to_stdlib(name): - """ - Converts a dNSName SubjectAlternativeName field to the form used by the - standard library on the given Python version. - - Cryptography produces a dNSName as a unicode string that was idna-decoded - from ASCII bytes. We need to idna-encode that string to get it back, and - then on Python 3 we also need to convert to unicode via UTF-8 (the stdlib - uses PyUnicode_FromStringAndSize on it, which decodes via UTF-8). - - If the name cannot be idna-encoded then we return None signalling that - the name given should be skipped. - """ - def idna_encode(name): - """ - Borrowed wholesale from the Python Cryptography Project. It turns out - that we can't just safely call `idna.encode`: it can explode for - wildcard names. This avoids that problem. - """ - from pip._vendor import idna - - try: - for prefix in [u'*.', u'.']: - if name.startswith(prefix): - name = name[len(prefix):] - return prefix.encode('ascii') + idna.encode(name) - return idna.encode(name) - except idna.core.IDNAError: - return None - - name = idna_encode(name) - if name is None: - return None - elif sys.version_info >= (3, 0): - name = name.decode('utf-8') - return name - - -def get_subj_alt_name(peer_cert): - """ - Given an PyOpenSSL certificate, provides all the subject alternative names. - """ - # Pass the cert to cryptography, which has much better APIs for this. - if hasattr(peer_cert, "to_cryptography"): - cert = peer_cert.to_cryptography() - else: - # This is technically using private APIs, but should work across all - # relevant versions before PyOpenSSL got a proper API for this. - cert = _Certificate(openssl_backend, peer_cert._x509) - - # We want to find the SAN extension. Ask Cryptography to locate it (it's - # faster than looping in Python) - try: - ext = cert.extensions.get_extension_for_class( - x509.SubjectAlternativeName - ).value - except x509.ExtensionNotFound: - # No such extension, return the empty list. - return [] - except (x509.DuplicateExtension, UnsupportedExtension, - x509.UnsupportedGeneralNameType, UnicodeError) as e: - # A problem has been found with the quality of the certificate. Assume - # no SAN field is present. - log.warning( - "A problem was encountered with the certificate that prevented " - "urllib3 from finding the SubjectAlternativeName field. This can " - "affect certificate validation. The error was %s", - e, - ) - return [] - - # We want to return dNSName and iPAddress fields. We need to cast the IPs - # back to strings because the match_hostname function wants them as - # strings. - # Sadly the DNS names need to be idna encoded and then, on Python 3, UTF-8 - # decoded. This is pretty frustrating, but that's what the standard library - # does with certificates, and so we need to attempt to do the same. - # We also want to skip over names which cannot be idna encoded. - names = [ - ('DNS', name) for name in map(_dnsname_to_stdlib, ext.get_values_for_type(x509.DNSName)) - if name is not None - ] - names.extend( - ('IP Address', str(name)) - for name in ext.get_values_for_type(x509.IPAddress) - ) - - return names - - -class WrappedSocket(object): - '''API-compatibility wrapper for Python OpenSSL's Connection-class. - - Note: _makefile_refs, _drop() and _reuse() are needed for the garbage - collector of pypy. - ''' - - def __init__(self, connection, socket, suppress_ragged_eofs=True): - self.connection = connection - self.socket = socket - self.suppress_ragged_eofs = suppress_ragged_eofs - self._makefile_refs = 0 - self._closed = False - - def fileno(self): - return self.socket.fileno() - - # Copy-pasted from Python 3.5 source code - def _decref_socketios(self): - if self._makefile_refs > 0: - self._makefile_refs -= 1 - if self._closed: - self.close() - - def recv(self, *args, **kwargs): - try: - data = self.connection.recv(*args, **kwargs) - except OpenSSL.SSL.SysCallError as e: - if self.suppress_ragged_eofs and e.args == (-1, 'Unexpected EOF'): - return b'' - else: - raise SocketError(str(e)) - except OpenSSL.SSL.ZeroReturnError as e: - if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN: - return b'' - else: - raise - except OpenSSL.SSL.WantReadError: - if not util.wait_for_read(self.socket, self.socket.gettimeout()): - raise timeout('The read operation timed out') - else: - return self.recv(*args, **kwargs) - else: - return data - - def recv_into(self, *args, **kwargs): - try: - return self.connection.recv_into(*args, **kwargs) - except OpenSSL.SSL.SysCallError as e: - if self.suppress_ragged_eofs and e.args == (-1, 'Unexpected EOF'): - return 0 - else: - raise SocketError(str(e)) - except OpenSSL.SSL.ZeroReturnError as e: - if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN: - return 0 - else: - raise - except OpenSSL.SSL.WantReadError: - if not util.wait_for_read(self.socket, self.socket.gettimeout()): - raise timeout('The read operation timed out') - else: - return self.recv_into(*args, **kwargs) - - def settimeout(self, timeout): - return self.socket.settimeout(timeout) - - def _send_until_done(self, data): - while True: - try: - return self.connection.send(data) - except OpenSSL.SSL.WantWriteError: - if not util.wait_for_write(self.socket, self.socket.gettimeout()): - raise timeout() - continue - except OpenSSL.SSL.SysCallError as e: - raise SocketError(str(e)) - - def sendall(self, data): - total_sent = 0 - while total_sent < len(data): - sent = self._send_until_done(data[total_sent:total_sent + SSL_WRITE_BLOCKSIZE]) - total_sent += sent - - def shutdown(self): - # FIXME rethrow compatible exceptions should we ever use this - self.connection.shutdown() - - def close(self): - if self._makefile_refs < 1: - try: - self._closed = True - return self.connection.close() - except OpenSSL.SSL.Error: - return - else: - self._makefile_refs -= 1 - - def getpeercert(self, binary_form=False): - x509 = self.connection.get_peer_certificate() - - if not x509: - return x509 - - if binary_form: - return OpenSSL.crypto.dump_certificate( - OpenSSL.crypto.FILETYPE_ASN1, - x509) - - return { - 'subject': ( - (('commonName', x509.get_subject().CN),), - ), - 'subjectAltName': get_subj_alt_name(x509) - } - - def _reuse(self): - self._makefile_refs += 1 - - def _drop(self): - if self._makefile_refs < 1: - self.close() - else: - self._makefile_refs -= 1 - - -if _fileobject: # Platform-specific: Python 2 - def makefile(self, mode, bufsize=-1): - self._makefile_refs += 1 - return _fileobject(self, mode, bufsize, close=True) -else: # Platform-specific: Python 3 - makefile = backport_makefile - -WrappedSocket.makefile = makefile - - -class PyOpenSSLContext(object): - """ - I am a wrapper class for the PyOpenSSL ``Context`` object. I am responsible - for translating the interface of the standard library ``SSLContext`` object - to calls into PyOpenSSL. - """ - def __init__(self, protocol): - self.protocol = _openssl_versions[protocol] - self._ctx = OpenSSL.SSL.Context(self.protocol) - self._options = 0 - self.check_hostname = False - - @property - def options(self): - return self._options - - @options.setter - def options(self, value): - self._options = value - self._ctx.set_options(value) - - @property - def verify_mode(self): - return _openssl_to_stdlib_verify[self._ctx.get_verify_mode()] - - @verify_mode.setter - def verify_mode(self, value): - self._ctx.set_verify( - _stdlib_to_openssl_verify[value], - _verify_callback - ) - - def set_default_verify_paths(self): - self._ctx.set_default_verify_paths() - - def set_ciphers(self, ciphers): - if isinstance(ciphers, six.text_type): - ciphers = ciphers.encode('utf-8') - self._ctx.set_cipher_list(ciphers) - - def load_verify_locations(self, cafile=None, capath=None, cadata=None): - if cafile is not None: - cafile = cafile.encode('utf-8') - if capath is not None: - capath = capath.encode('utf-8') - self._ctx.load_verify_locations(cafile, capath) - if cadata is not None: - self._ctx.load_verify_locations(BytesIO(cadata)) - - def load_cert_chain(self, certfile, keyfile=None, password=None): - self._ctx.use_certificate_chain_file(certfile) - if password is not None: - self._ctx.set_passwd_cb(lambda max_length, prompt_twice, userdata: password) - self._ctx.use_privatekey_file(keyfile or certfile) - - def wrap_socket(self, sock, server_side=False, - do_handshake_on_connect=True, suppress_ragged_eofs=True, - server_hostname=None): - cnx = OpenSSL.SSL.Connection(self._ctx, sock) - - if isinstance(server_hostname, six.text_type): # Platform-specific: Python 3 - server_hostname = server_hostname.encode('utf-8') - - if server_hostname is not None: - cnx.set_tlsext_host_name(server_hostname) - - cnx.set_connect_state() - - while True: - try: - cnx.do_handshake() - except OpenSSL.SSL.WantReadError: - if not util.wait_for_read(sock, sock.gettimeout()): - raise timeout('select timed out') - continue - except OpenSSL.SSL.Error as e: - raise ssl.SSLError('bad handshake: %r' % e) - break - - return WrappedSocket(cnx, sock) - - -def _verify_callback(cnx, x509, err_no, err_depth, return_code): - return err_no == 0 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/securetransport.py b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/securetransport.py deleted file mode 100644 index 77cb59e..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/securetransport.py +++ /dev/null @@ -1,804 +0,0 @@ -""" -SecureTranport support for urllib3 via ctypes. - -This makes platform-native TLS available to urllib3 users on macOS without the -use of a compiler. This is an important feature because the Python Package -Index is moving to become a TLSv1.2-or-higher server, and the default OpenSSL -that ships with macOS is not capable of doing TLSv1.2. The only way to resolve -this is to give macOS users an alternative solution to the problem, and that -solution is to use SecureTransport. - -We use ctypes here because this solution must not require a compiler. That's -because pip is not allowed to require a compiler either. - -This is not intended to be a seriously long-term solution to this problem. -The hope is that PEP 543 will eventually solve this issue for us, at which -point we can retire this contrib module. But in the short term, we need to -solve the impending tire fire that is Python on Mac without this kind of -contrib module. So...here we are. - -To use this module, simply import and inject it:: - - import urllib3.contrib.securetransport - urllib3.contrib.securetransport.inject_into_urllib3() - -Happy TLSing! -""" -from __future__ import absolute_import - -import contextlib -import ctypes -import errno -import os.path -import shutil -import socket -import ssl -import threading -import weakref - -from .. import util -from ._securetransport.bindings import ( - Security, SecurityConst, CoreFoundation -) -from ._securetransport.low_level import ( - _assert_no_error, _cert_array_from_pem, _temporary_keychain, - _load_client_cert_chain -) - -try: # Platform-specific: Python 2 - from socket import _fileobject -except ImportError: # Platform-specific: Python 3 - _fileobject = None - from ..packages.backports.makefile import backport_makefile - -__all__ = ['inject_into_urllib3', 'extract_from_urllib3'] - -# SNI always works -HAS_SNI = True - -orig_util_HAS_SNI = util.HAS_SNI -orig_util_SSLContext = util.ssl_.SSLContext - -# This dictionary is used by the read callback to obtain a handle to the -# calling wrapped socket. This is a pretty silly approach, but for now it'll -# do. I feel like I should be able to smuggle a handle to the wrapped socket -# directly in the SSLConnectionRef, but for now this approach will work I -# guess. -# -# We need to lock around this structure for inserts, but we don't do it for -# reads/writes in the callbacks. The reasoning here goes as follows: -# -# 1. It is not possible to call into the callbacks before the dictionary is -# populated, so once in the callback the id must be in the dictionary. -# 2. The callbacks don't mutate the dictionary, they only read from it, and -# so cannot conflict with any of the insertions. -# -# This is good: if we had to lock in the callbacks we'd drastically slow down -# the performance of this code. -_connection_refs = weakref.WeakValueDictionary() -_connection_ref_lock = threading.Lock() - -# Limit writes to 16kB. This is OpenSSL's limit, but we'll cargo-cult it over -# for no better reason than we need *a* limit, and this one is right there. -SSL_WRITE_BLOCKSIZE = 16384 - -# This is our equivalent of util.ssl_.DEFAULT_CIPHERS, but expanded out to -# individual cipher suites. We need to do this because this is how -# SecureTransport wants them. -CIPHER_SUITES = [ - SecurityConst.TLS_AES_256_GCM_SHA384, - SecurityConst.TLS_CHACHA20_POLY1305_SHA256, - SecurityConst.TLS_AES_128_GCM_SHA256, - SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, - SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, - SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, - SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, - SecurityConst.TLS_DHE_DSS_WITH_AES_256_GCM_SHA384, - SecurityConst.TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, - SecurityConst.TLS_DHE_DSS_WITH_AES_128_GCM_SHA256, - SecurityConst.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, - SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, - SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, - SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, - SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, - SecurityConst.TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, - SecurityConst.TLS_DHE_DSS_WITH_AES_256_CBC_SHA256, - SecurityConst.TLS_DHE_RSA_WITH_AES_256_CBC_SHA, - SecurityConst.TLS_DHE_DSS_WITH_AES_256_CBC_SHA, - SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, - SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, - SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, - SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, - SecurityConst.TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, - SecurityConst.TLS_DHE_DSS_WITH_AES_128_CBC_SHA256, - SecurityConst.TLS_DHE_RSA_WITH_AES_128_CBC_SHA, - SecurityConst.TLS_DHE_DSS_WITH_AES_128_CBC_SHA, - SecurityConst.TLS_RSA_WITH_AES_256_GCM_SHA384, - SecurityConst.TLS_RSA_WITH_AES_128_GCM_SHA256, - SecurityConst.TLS_RSA_WITH_AES_256_CBC_SHA256, - SecurityConst.TLS_RSA_WITH_AES_128_CBC_SHA256, - SecurityConst.TLS_RSA_WITH_AES_256_CBC_SHA, - SecurityConst.TLS_RSA_WITH_AES_128_CBC_SHA, -] - -# Basically this is simple: for PROTOCOL_SSLv23 we turn it into a low of -# TLSv1 and a high of TLSv1.2. For everything else, we pin to that version. -_protocol_to_min_max = { - ssl.PROTOCOL_SSLv23: (SecurityConst.kTLSProtocol1, SecurityConst.kTLSProtocol12), -} - -if hasattr(ssl, "PROTOCOL_SSLv2"): - _protocol_to_min_max[ssl.PROTOCOL_SSLv2] = ( - SecurityConst.kSSLProtocol2, SecurityConst.kSSLProtocol2 - ) -if hasattr(ssl, "PROTOCOL_SSLv3"): - _protocol_to_min_max[ssl.PROTOCOL_SSLv3] = ( - SecurityConst.kSSLProtocol3, SecurityConst.kSSLProtocol3 - ) -if hasattr(ssl, "PROTOCOL_TLSv1"): - _protocol_to_min_max[ssl.PROTOCOL_TLSv1] = ( - SecurityConst.kTLSProtocol1, SecurityConst.kTLSProtocol1 - ) -if hasattr(ssl, "PROTOCOL_TLSv1_1"): - _protocol_to_min_max[ssl.PROTOCOL_TLSv1_1] = ( - SecurityConst.kTLSProtocol11, SecurityConst.kTLSProtocol11 - ) -if hasattr(ssl, "PROTOCOL_TLSv1_2"): - _protocol_to_min_max[ssl.PROTOCOL_TLSv1_2] = ( - SecurityConst.kTLSProtocol12, SecurityConst.kTLSProtocol12 - ) -if hasattr(ssl, "PROTOCOL_TLS"): - _protocol_to_min_max[ssl.PROTOCOL_TLS] = _protocol_to_min_max[ssl.PROTOCOL_SSLv23] - - -def inject_into_urllib3(): - """ - Monkey-patch urllib3 with SecureTransport-backed SSL-support. - """ - util.ssl_.SSLContext = SecureTransportContext - util.HAS_SNI = HAS_SNI - util.ssl_.HAS_SNI = HAS_SNI - util.IS_SECURETRANSPORT = True - util.ssl_.IS_SECURETRANSPORT = True - - -def extract_from_urllib3(): - """ - Undo monkey-patching by :func:`inject_into_urllib3`. - """ - util.ssl_.SSLContext = orig_util_SSLContext - util.HAS_SNI = orig_util_HAS_SNI - util.ssl_.HAS_SNI = orig_util_HAS_SNI - util.IS_SECURETRANSPORT = False - util.ssl_.IS_SECURETRANSPORT = False - - -def _read_callback(connection_id, data_buffer, data_length_pointer): - """ - SecureTransport read callback. This is called by ST to request that data - be returned from the socket. - """ - wrapped_socket = None - try: - wrapped_socket = _connection_refs.get(connection_id) - if wrapped_socket is None: - return SecurityConst.errSSLInternal - base_socket = wrapped_socket.socket - - requested_length = data_length_pointer[0] - - timeout = wrapped_socket.gettimeout() - error = None - read_count = 0 - - try: - while read_count < requested_length: - if timeout is None or timeout >= 0: - if not util.wait_for_read(base_socket, timeout): - raise socket.error(errno.EAGAIN, 'timed out') - - remaining = requested_length - read_count - buffer = (ctypes.c_char * remaining).from_address( - data_buffer + read_count - ) - chunk_size = base_socket.recv_into(buffer, remaining) - read_count += chunk_size - if not chunk_size: - if not read_count: - return SecurityConst.errSSLClosedGraceful - break - except (socket.error) as e: - error = e.errno - - if error is not None and error != errno.EAGAIN: - data_length_pointer[0] = read_count - if error == errno.ECONNRESET or error == errno.EPIPE: - return SecurityConst.errSSLClosedAbort - raise - - data_length_pointer[0] = read_count - - if read_count != requested_length: - return SecurityConst.errSSLWouldBlock - - return 0 - except Exception as e: - if wrapped_socket is not None: - wrapped_socket._exception = e - return SecurityConst.errSSLInternal - - -def _write_callback(connection_id, data_buffer, data_length_pointer): - """ - SecureTransport write callback. This is called by ST to request that data - actually be sent on the network. - """ - wrapped_socket = None - try: - wrapped_socket = _connection_refs.get(connection_id) - if wrapped_socket is None: - return SecurityConst.errSSLInternal - base_socket = wrapped_socket.socket - - bytes_to_write = data_length_pointer[0] - data = ctypes.string_at(data_buffer, bytes_to_write) - - timeout = wrapped_socket.gettimeout() - error = None - sent = 0 - - try: - while sent < bytes_to_write: - if timeout is None or timeout >= 0: - if not util.wait_for_write(base_socket, timeout): - raise socket.error(errno.EAGAIN, 'timed out') - chunk_sent = base_socket.send(data) - sent += chunk_sent - - # This has some needless copying here, but I'm not sure there's - # much value in optimising this data path. - data = data[chunk_sent:] - except (socket.error) as e: - error = e.errno - - if error is not None and error != errno.EAGAIN: - data_length_pointer[0] = sent - if error == errno.ECONNRESET or error == errno.EPIPE: - return SecurityConst.errSSLClosedAbort - raise - - data_length_pointer[0] = sent - - if sent != bytes_to_write: - return SecurityConst.errSSLWouldBlock - - return 0 - except Exception as e: - if wrapped_socket is not None: - wrapped_socket._exception = e - return SecurityConst.errSSLInternal - - -# We need to keep these two objects references alive: if they get GC'd while -# in use then SecureTransport could attempt to call a function that is in freed -# memory. That would be...uh...bad. Yeah, that's the word. Bad. -_read_callback_pointer = Security.SSLReadFunc(_read_callback) -_write_callback_pointer = Security.SSLWriteFunc(_write_callback) - - -class WrappedSocket(object): - """ - API-compatibility wrapper for Python's OpenSSL wrapped socket object. - - Note: _makefile_refs, _drop(), and _reuse() are needed for the garbage - collector of PyPy. - """ - def __init__(self, socket): - self.socket = socket - self.context = None - self._makefile_refs = 0 - self._closed = False - self._exception = None - self._keychain = None - self._keychain_dir = None - self._client_cert_chain = None - - # We save off the previously-configured timeout and then set it to - # zero. This is done because we use select and friends to handle the - # timeouts, but if we leave the timeout set on the lower socket then - # Python will "kindly" call select on that socket again for us. Avoid - # that by forcing the timeout to zero. - self._timeout = self.socket.gettimeout() - self.socket.settimeout(0) - - @contextlib.contextmanager - def _raise_on_error(self): - """ - A context manager that can be used to wrap calls that do I/O from - SecureTransport. If any of the I/O callbacks hit an exception, this - context manager will correctly propagate the exception after the fact. - This avoids silently swallowing those exceptions. - - It also correctly forces the socket closed. - """ - self._exception = None - - # We explicitly don't catch around this yield because in the unlikely - # event that an exception was hit in the block we don't want to swallow - # it. - yield - if self._exception is not None: - exception, self._exception = self._exception, None - self.close() - raise exception - - def _set_ciphers(self): - """ - Sets up the allowed ciphers. By default this matches the set in - util.ssl_.DEFAULT_CIPHERS, at least as supported by macOS. This is done - custom and doesn't allow changing at this time, mostly because parsing - OpenSSL cipher strings is going to be a freaking nightmare. - """ - ciphers = (Security.SSLCipherSuite * len(CIPHER_SUITES))(*CIPHER_SUITES) - result = Security.SSLSetEnabledCiphers( - self.context, ciphers, len(CIPHER_SUITES) - ) - _assert_no_error(result) - - def _custom_validate(self, verify, trust_bundle): - """ - Called when we have set custom validation. We do this in two cases: - first, when cert validation is entirely disabled; and second, when - using a custom trust DB. - """ - # If we disabled cert validation, just say: cool. - if not verify: - return - - # We want data in memory, so load it up. - if os.path.isfile(trust_bundle): - with open(trust_bundle, 'rb') as f: - trust_bundle = f.read() - - cert_array = None - trust = Security.SecTrustRef() - - try: - # Get a CFArray that contains the certs we want. - cert_array = _cert_array_from_pem(trust_bundle) - - # Ok, now the hard part. We want to get the SecTrustRef that ST has - # created for this connection, shove our CAs into it, tell ST to - # ignore everything else it knows, and then ask if it can build a - # chain. This is a buuuunch of code. - result = Security.SSLCopyPeerTrust( - self.context, ctypes.byref(trust) - ) - _assert_no_error(result) - if not trust: - raise ssl.SSLError("Failed to copy trust reference") - - result = Security.SecTrustSetAnchorCertificates(trust, cert_array) - _assert_no_error(result) - - result = Security.SecTrustSetAnchorCertificatesOnly(trust, True) - _assert_no_error(result) - - trust_result = Security.SecTrustResultType() - result = Security.SecTrustEvaluate( - trust, ctypes.byref(trust_result) - ) - _assert_no_error(result) - finally: - if trust: - CoreFoundation.CFRelease(trust) - - if cert_array is not None: - CoreFoundation.CFRelease(cert_array) - - # Ok, now we can look at what the result was. - successes = ( - SecurityConst.kSecTrustResultUnspecified, - SecurityConst.kSecTrustResultProceed - ) - if trust_result.value not in successes: - raise ssl.SSLError( - "certificate verify failed, error code: %d" % - trust_result.value - ) - - def handshake(self, - server_hostname, - verify, - trust_bundle, - min_version, - max_version, - client_cert, - client_key, - client_key_passphrase): - """ - Actually performs the TLS handshake. This is run automatically by - wrapped socket, and shouldn't be needed in user code. - """ - # First, we do the initial bits of connection setup. We need to create - # a context, set its I/O funcs, and set the connection reference. - self.context = Security.SSLCreateContext( - None, SecurityConst.kSSLClientSide, SecurityConst.kSSLStreamType - ) - result = Security.SSLSetIOFuncs( - self.context, _read_callback_pointer, _write_callback_pointer - ) - _assert_no_error(result) - - # Here we need to compute the handle to use. We do this by taking the - # id of self modulo 2**31 - 1. If this is already in the dictionary, we - # just keep incrementing by one until we find a free space. - with _connection_ref_lock: - handle = id(self) % 2147483647 - while handle in _connection_refs: - handle = (handle + 1) % 2147483647 - _connection_refs[handle] = self - - result = Security.SSLSetConnection(self.context, handle) - _assert_no_error(result) - - # If we have a server hostname, we should set that too. - if server_hostname: - if not isinstance(server_hostname, bytes): - server_hostname = server_hostname.encode('utf-8') - - result = Security.SSLSetPeerDomainName( - self.context, server_hostname, len(server_hostname) - ) - _assert_no_error(result) - - # Setup the ciphers. - self._set_ciphers() - - # Set the minimum and maximum TLS versions. - result = Security.SSLSetProtocolVersionMin(self.context, min_version) - _assert_no_error(result) - result = Security.SSLSetProtocolVersionMax(self.context, max_version) - _assert_no_error(result) - - # If there's a trust DB, we need to use it. We do that by telling - # SecureTransport to break on server auth. We also do that if we don't - # want to validate the certs at all: we just won't actually do any - # authing in that case. - if not verify or trust_bundle is not None: - result = Security.SSLSetSessionOption( - self.context, - SecurityConst.kSSLSessionOptionBreakOnServerAuth, - True - ) - _assert_no_error(result) - - # If there's a client cert, we need to use it. - if client_cert: - self._keychain, self._keychain_dir = _temporary_keychain() - self._client_cert_chain = _load_client_cert_chain( - self._keychain, client_cert, client_key - ) - result = Security.SSLSetCertificate( - self.context, self._client_cert_chain - ) - _assert_no_error(result) - - while True: - with self._raise_on_error(): - result = Security.SSLHandshake(self.context) - - if result == SecurityConst.errSSLWouldBlock: - raise socket.timeout("handshake timed out") - elif result == SecurityConst.errSSLServerAuthCompleted: - self._custom_validate(verify, trust_bundle) - continue - else: - _assert_no_error(result) - break - - def fileno(self): - return self.socket.fileno() - - # Copy-pasted from Python 3.5 source code - def _decref_socketios(self): - if self._makefile_refs > 0: - self._makefile_refs -= 1 - if self._closed: - self.close() - - def recv(self, bufsiz): - buffer = ctypes.create_string_buffer(bufsiz) - bytes_read = self.recv_into(buffer, bufsiz) - data = buffer[:bytes_read] - return data - - def recv_into(self, buffer, nbytes=None): - # Read short on EOF. - if self._closed: - return 0 - - if nbytes is None: - nbytes = len(buffer) - - buffer = (ctypes.c_char * nbytes).from_buffer(buffer) - processed_bytes = ctypes.c_size_t(0) - - with self._raise_on_error(): - result = Security.SSLRead( - self.context, buffer, nbytes, ctypes.byref(processed_bytes) - ) - - # There are some result codes that we want to treat as "not always - # errors". Specifically, those are errSSLWouldBlock, - # errSSLClosedGraceful, and errSSLClosedNoNotify. - if (result == SecurityConst.errSSLWouldBlock): - # If we didn't process any bytes, then this was just a time out. - # However, we can get errSSLWouldBlock in situations when we *did* - # read some data, and in those cases we should just read "short" - # and return. - if processed_bytes.value == 0: - # Timed out, no data read. - raise socket.timeout("recv timed out") - elif result in (SecurityConst.errSSLClosedGraceful, SecurityConst.errSSLClosedNoNotify): - # The remote peer has closed this connection. We should do so as - # well. Note that we don't actually return here because in - # principle this could actually be fired along with return data. - # It's unlikely though. - self.close() - else: - _assert_no_error(result) - - # Ok, we read and probably succeeded. We should return whatever data - # was actually read. - return processed_bytes.value - - def settimeout(self, timeout): - self._timeout = timeout - - def gettimeout(self): - return self._timeout - - def send(self, data): - processed_bytes = ctypes.c_size_t(0) - - with self._raise_on_error(): - result = Security.SSLWrite( - self.context, data, len(data), ctypes.byref(processed_bytes) - ) - - if result == SecurityConst.errSSLWouldBlock and processed_bytes.value == 0: - # Timed out - raise socket.timeout("send timed out") - else: - _assert_no_error(result) - - # We sent, and probably succeeded. Tell them how much we sent. - return processed_bytes.value - - def sendall(self, data): - total_sent = 0 - while total_sent < len(data): - sent = self.send(data[total_sent:total_sent + SSL_WRITE_BLOCKSIZE]) - total_sent += sent - - def shutdown(self): - with self._raise_on_error(): - Security.SSLClose(self.context) - - def close(self): - # TODO: should I do clean shutdown here? Do I have to? - if self._makefile_refs < 1: - self._closed = True - if self.context: - CoreFoundation.CFRelease(self.context) - self.context = None - if self._client_cert_chain: - CoreFoundation.CFRelease(self._client_cert_chain) - self._client_cert_chain = None - if self._keychain: - Security.SecKeychainDelete(self._keychain) - CoreFoundation.CFRelease(self._keychain) - shutil.rmtree(self._keychain_dir) - self._keychain = self._keychain_dir = None - return self.socket.close() - else: - self._makefile_refs -= 1 - - def getpeercert(self, binary_form=False): - # Urgh, annoying. - # - # Here's how we do this: - # - # 1. Call SSLCopyPeerTrust to get hold of the trust object for this - # connection. - # 2. Call SecTrustGetCertificateAtIndex for index 0 to get the leaf. - # 3. To get the CN, call SecCertificateCopyCommonName and process that - # string so that it's of the appropriate type. - # 4. To get the SAN, we need to do something a bit more complex: - # a. Call SecCertificateCopyValues to get the data, requesting - # kSecOIDSubjectAltName. - # b. Mess about with this dictionary to try to get the SANs out. - # - # This is gross. Really gross. It's going to be a few hundred LoC extra - # just to repeat something that SecureTransport can *already do*. So my - # operating assumption at this time is that what we want to do is - # instead to just flag to urllib3 that it shouldn't do its own hostname - # validation when using SecureTransport. - if not binary_form: - raise ValueError( - "SecureTransport only supports dumping binary certs" - ) - trust = Security.SecTrustRef() - certdata = None - der_bytes = None - - try: - # Grab the trust store. - result = Security.SSLCopyPeerTrust( - self.context, ctypes.byref(trust) - ) - _assert_no_error(result) - if not trust: - # Probably we haven't done the handshake yet. No biggie. - return None - - cert_count = Security.SecTrustGetCertificateCount(trust) - if not cert_count: - # Also a case that might happen if we haven't handshaked. - # Handshook? Handshaken? - return None - - leaf = Security.SecTrustGetCertificateAtIndex(trust, 0) - assert leaf - - # Ok, now we want the DER bytes. - certdata = Security.SecCertificateCopyData(leaf) - assert certdata - - data_length = CoreFoundation.CFDataGetLength(certdata) - data_buffer = CoreFoundation.CFDataGetBytePtr(certdata) - der_bytes = ctypes.string_at(data_buffer, data_length) - finally: - if certdata: - CoreFoundation.CFRelease(certdata) - if trust: - CoreFoundation.CFRelease(trust) - - return der_bytes - - def _reuse(self): - self._makefile_refs += 1 - - def _drop(self): - if self._makefile_refs < 1: - self.close() - else: - self._makefile_refs -= 1 - - -if _fileobject: # Platform-specific: Python 2 - def makefile(self, mode, bufsize=-1): - self._makefile_refs += 1 - return _fileobject(self, mode, bufsize, close=True) -else: # Platform-specific: Python 3 - def makefile(self, mode="r", buffering=None, *args, **kwargs): - # We disable buffering with SecureTransport because it conflicts with - # the buffering that ST does internally (see issue #1153 for more). - buffering = 0 - return backport_makefile(self, mode, buffering, *args, **kwargs) - -WrappedSocket.makefile = makefile - - -class SecureTransportContext(object): - """ - I am a wrapper class for the SecureTransport library, to translate the - interface of the standard library ``SSLContext`` object to calls into - SecureTransport. - """ - def __init__(self, protocol): - self._min_version, self._max_version = _protocol_to_min_max[protocol] - self._options = 0 - self._verify = False - self._trust_bundle = None - self._client_cert = None - self._client_key = None - self._client_key_passphrase = None - - @property - def check_hostname(self): - """ - SecureTransport cannot have its hostname checking disabled. For more, - see the comment on getpeercert() in this file. - """ - return True - - @check_hostname.setter - def check_hostname(self, value): - """ - SecureTransport cannot have its hostname checking disabled. For more, - see the comment on getpeercert() in this file. - """ - pass - - @property - def options(self): - # TODO: Well, crap. - # - # So this is the bit of the code that is the most likely to cause us - # trouble. Essentially we need to enumerate all of the SSL options that - # users might want to use and try to see if we can sensibly translate - # them, or whether we should just ignore them. - return self._options - - @options.setter - def options(self, value): - # TODO: Update in line with above. - self._options = value - - @property - def verify_mode(self): - return ssl.CERT_REQUIRED if self._verify else ssl.CERT_NONE - - @verify_mode.setter - def verify_mode(self, value): - self._verify = True if value == ssl.CERT_REQUIRED else False - - def set_default_verify_paths(self): - # So, this has to do something a bit weird. Specifically, what it does - # is nothing. - # - # This means that, if we had previously had load_verify_locations - # called, this does not undo that. We need to do that because it turns - # out that the rest of the urllib3 code will attempt to load the - # default verify paths if it hasn't been told about any paths, even if - # the context itself was sometime earlier. We resolve that by just - # ignoring it. - pass - - def load_default_certs(self): - return self.set_default_verify_paths() - - def set_ciphers(self, ciphers): - # For now, we just require the default cipher string. - if ciphers != util.ssl_.DEFAULT_CIPHERS: - raise ValueError( - "SecureTransport doesn't support custom cipher strings" - ) - - def load_verify_locations(self, cafile=None, capath=None, cadata=None): - # OK, we only really support cadata and cafile. - if capath is not None: - raise ValueError( - "SecureTransport does not support cert directories" - ) - - self._trust_bundle = cafile or cadata - - def load_cert_chain(self, certfile, keyfile=None, password=None): - self._client_cert = certfile - self._client_key = keyfile - self._client_cert_passphrase = password - - def wrap_socket(self, sock, server_side=False, - do_handshake_on_connect=True, suppress_ragged_eofs=True, - server_hostname=None): - # So, what do we do here? Firstly, we assert some properties. This is a - # stripped down shim, so there is some functionality we don't support. - # See PEP 543 for the real deal. - assert not server_side - assert do_handshake_on_connect - assert suppress_ragged_eofs - - # Ok, we're good to go. Now we want to create the wrapped socket object - # and store it in the appropriate place. - wrapped_socket = WrappedSocket(sock) - - # Now we can handshake - wrapped_socket.handshake( - server_hostname, self._verify, self._trust_bundle, - self._min_version, self._max_version, self._client_cert, - self._client_key, self._client_key_passphrase - ) - return wrapped_socket diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/socks.py b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/socks.py deleted file mode 100644 index 811e312..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/socks.py +++ /dev/null @@ -1,192 +0,0 @@ -# -*- coding: utf-8 -*- -""" -This module contains provisional support for SOCKS proxies from within -urllib3. This module supports SOCKS4 (specifically the SOCKS4A variant) and -SOCKS5. To enable its functionality, either install PySocks or install this -module with the ``socks`` extra. - -The SOCKS implementation supports the full range of urllib3 features. It also -supports the following SOCKS features: - -- SOCKS4 -- SOCKS4a -- SOCKS5 -- Usernames and passwords for the SOCKS proxy - -Known Limitations: - -- Currently PySocks does not support contacting remote websites via literal - IPv6 addresses. Any such connection attempt will fail. You must use a domain - name. -- Currently PySocks does not support IPv6 connections to the SOCKS proxy. Any - such connection attempt will fail. -""" -from __future__ import absolute_import - -try: - import socks -except ImportError: - import warnings - from ..exceptions import DependencyWarning - - warnings.warn(( - 'SOCKS support in urllib3 requires the installation of optional ' - 'dependencies: specifically, PySocks. For more information, see ' - 'https://urllib3.readthedocs.io/en/latest/contrib.html#socks-proxies' - ), - DependencyWarning - ) - raise - -from socket import error as SocketError, timeout as SocketTimeout - -from ..connection import ( - HTTPConnection, HTTPSConnection -) -from ..connectionpool import ( - HTTPConnectionPool, HTTPSConnectionPool -) -from ..exceptions import ConnectTimeoutError, NewConnectionError -from ..poolmanager import PoolManager -from ..util.url import parse_url - -try: - import ssl -except ImportError: - ssl = None - - -class SOCKSConnection(HTTPConnection): - """ - A plain-text HTTP connection that connects via a SOCKS proxy. - """ - def __init__(self, *args, **kwargs): - self._socks_options = kwargs.pop('_socks_options') - super(SOCKSConnection, self).__init__(*args, **kwargs) - - def _new_conn(self): - """ - Establish a new connection via the SOCKS proxy. - """ - extra_kw = {} - if self.source_address: - extra_kw['source_address'] = self.source_address - - if self.socket_options: - extra_kw['socket_options'] = self.socket_options - - try: - conn = socks.create_connection( - (self.host, self.port), - proxy_type=self._socks_options['socks_version'], - proxy_addr=self._socks_options['proxy_host'], - proxy_port=self._socks_options['proxy_port'], - proxy_username=self._socks_options['username'], - proxy_password=self._socks_options['password'], - proxy_rdns=self._socks_options['rdns'], - timeout=self.timeout, - **extra_kw - ) - - except SocketTimeout as e: - raise ConnectTimeoutError( - self, "Connection to %s timed out. (connect timeout=%s)" % - (self.host, self.timeout)) - - except socks.ProxyError as e: - # This is fragile as hell, but it seems to be the only way to raise - # useful errors here. - if e.socket_err: - error = e.socket_err - if isinstance(error, SocketTimeout): - raise ConnectTimeoutError( - self, - "Connection to %s timed out. (connect timeout=%s)" % - (self.host, self.timeout) - ) - else: - raise NewConnectionError( - self, - "Failed to establish a new connection: %s" % error - ) - else: - raise NewConnectionError( - self, - "Failed to establish a new connection: %s" % e - ) - - except SocketError as e: # Defensive: PySocks should catch all these. - raise NewConnectionError( - self, "Failed to establish a new connection: %s" % e) - - return conn - - -# We don't need to duplicate the Verified/Unverified distinction from -# urllib3/connection.py here because the HTTPSConnection will already have been -# correctly set to either the Verified or Unverified form by that module. This -# means the SOCKSHTTPSConnection will automatically be the correct type. -class SOCKSHTTPSConnection(SOCKSConnection, HTTPSConnection): - pass - - -class SOCKSHTTPConnectionPool(HTTPConnectionPool): - ConnectionCls = SOCKSConnection - - -class SOCKSHTTPSConnectionPool(HTTPSConnectionPool): - ConnectionCls = SOCKSHTTPSConnection - - -class SOCKSProxyManager(PoolManager): - """ - A version of the urllib3 ProxyManager that routes connections via the - defined SOCKS proxy. - """ - pool_classes_by_scheme = { - 'http': SOCKSHTTPConnectionPool, - 'https': SOCKSHTTPSConnectionPool, - } - - def __init__(self, proxy_url, username=None, password=None, - num_pools=10, headers=None, **connection_pool_kw): - parsed = parse_url(proxy_url) - - if username is None and password is None and parsed.auth is not None: - split = parsed.auth.split(':') - if len(split) == 2: - username, password = split - if parsed.scheme == 'socks5': - socks_version = socks.PROXY_TYPE_SOCKS5 - rdns = False - elif parsed.scheme == 'socks5h': - socks_version = socks.PROXY_TYPE_SOCKS5 - rdns = True - elif parsed.scheme == 'socks4': - socks_version = socks.PROXY_TYPE_SOCKS4 - rdns = False - elif parsed.scheme == 'socks4a': - socks_version = socks.PROXY_TYPE_SOCKS4 - rdns = True - else: - raise ValueError( - "Unable to determine SOCKS version from %s" % proxy_url - ) - - self.proxy_url = proxy_url - - socks_options = { - 'socks_version': socks_version, - 'proxy_host': parsed.host, - 'proxy_port': parsed.port, - 'username': username, - 'password': password, - 'rdns': rdns - } - connection_pool_kw['_socks_options'] = socks_options - - super(SOCKSProxyManager, self).__init__( - num_pools, headers, **connection_pool_kw - ) - - self.pool_classes_by_scheme = SOCKSProxyManager.pool_classes_by_scheme diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/exceptions.py b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/exceptions.py deleted file mode 100644 index 7bbaa98..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/exceptions.py +++ /dev/null @@ -1,246 +0,0 @@ -from __future__ import absolute_import -from .packages.six.moves.http_client import ( - IncompleteRead as httplib_IncompleteRead -) -# Base Exceptions - - -class HTTPError(Exception): - "Base exception used by this module." - pass - - -class HTTPWarning(Warning): - "Base warning used by this module." - pass - - -class PoolError(HTTPError): - "Base exception for errors caused within a pool." - def __init__(self, pool, message): - self.pool = pool - HTTPError.__init__(self, "%s: %s" % (pool, message)) - - def __reduce__(self): - # For pickling purposes. - return self.__class__, (None, None) - - -class RequestError(PoolError): - "Base exception for PoolErrors that have associated URLs." - def __init__(self, pool, url, message): - self.url = url - PoolError.__init__(self, pool, message) - - def __reduce__(self): - # For pickling purposes. - return self.__class__, (None, self.url, None) - - -class SSLError(HTTPError): - "Raised when SSL certificate fails in an HTTPS connection." - pass - - -class ProxyError(HTTPError): - "Raised when the connection to a proxy fails." - pass - - -class DecodeError(HTTPError): - "Raised when automatic decoding based on Content-Type fails." - pass - - -class ProtocolError(HTTPError): - "Raised when something unexpected happens mid-request/response." - pass - - -#: Renamed to ProtocolError but aliased for backwards compatibility. -ConnectionError = ProtocolError - - -# Leaf Exceptions - -class MaxRetryError(RequestError): - """Raised when the maximum number of retries is exceeded. - - :param pool: The connection pool - :type pool: :class:`~urllib3.connectionpool.HTTPConnectionPool` - :param string url: The requested Url - :param exceptions.Exception reason: The underlying error - - """ - - def __init__(self, pool, url, reason=None): - self.reason = reason - - message = "Max retries exceeded with url: %s (Caused by %r)" % ( - url, reason) - - RequestError.__init__(self, pool, url, message) - - -class HostChangedError(RequestError): - "Raised when an existing pool gets a request for a foreign host." - - def __init__(self, pool, url, retries=3): - message = "Tried to open a foreign host with url: %s" % url - RequestError.__init__(self, pool, url, message) - self.retries = retries - - -class TimeoutStateError(HTTPError): - """ Raised when passing an invalid state to a timeout """ - pass - - -class TimeoutError(HTTPError): - """ Raised when a socket timeout error occurs. - - Catching this error will catch both :exc:`ReadTimeoutErrors - <ReadTimeoutError>` and :exc:`ConnectTimeoutErrors <ConnectTimeoutError>`. - """ - pass - - -class ReadTimeoutError(TimeoutError, RequestError): - "Raised when a socket timeout occurs while receiving data from a server" - pass - - -# This timeout error does not have a URL attached and needs to inherit from the -# base HTTPError -class ConnectTimeoutError(TimeoutError): - "Raised when a socket timeout occurs while connecting to a server" - pass - - -class NewConnectionError(ConnectTimeoutError, PoolError): - "Raised when we fail to establish a new connection. Usually ECONNREFUSED." - pass - - -class EmptyPoolError(PoolError): - "Raised when a pool runs out of connections and no more are allowed." - pass - - -class ClosedPoolError(PoolError): - "Raised when a request enters a pool after the pool has been closed." - pass - - -class LocationValueError(ValueError, HTTPError): - "Raised when there is something wrong with a given URL input." - pass - - -class LocationParseError(LocationValueError): - "Raised when get_host or similar fails to parse the URL input." - - def __init__(self, location): - message = "Failed to parse: %s" % location - HTTPError.__init__(self, message) - - self.location = location - - -class ResponseError(HTTPError): - "Used as a container for an error reason supplied in a MaxRetryError." - GENERIC_ERROR = 'too many error responses' - SPECIFIC_ERROR = 'too many {status_code} error responses' - - -class SecurityWarning(HTTPWarning): - "Warned when performing security reducing actions" - pass - - -class SubjectAltNameWarning(SecurityWarning): - "Warned when connecting to a host with a certificate missing a SAN." - pass - - -class InsecureRequestWarning(SecurityWarning): - "Warned when making an unverified HTTPS request." - pass - - -class SystemTimeWarning(SecurityWarning): - "Warned when system time is suspected to be wrong" - pass - - -class InsecurePlatformWarning(SecurityWarning): - "Warned when certain SSL configuration is not available on a platform." - pass - - -class SNIMissingWarning(HTTPWarning): - "Warned when making a HTTPS request without SNI available." - pass - - -class DependencyWarning(HTTPWarning): - """ - Warned when an attempt is made to import a module with missing optional - dependencies. - """ - pass - - -class ResponseNotChunked(ProtocolError, ValueError): - "Response needs to be chunked in order to read it as chunks." - pass - - -class BodyNotHttplibCompatible(HTTPError): - """ - Body should be httplib.HTTPResponse like (have an fp attribute which - returns raw chunks) for read_chunked(). - """ - pass - - -class IncompleteRead(HTTPError, httplib_IncompleteRead): - """ - Response length doesn't match expected Content-Length - - Subclass of http_client.IncompleteRead to allow int value - for `partial` to avoid creating large objects on streamed - reads. - """ - def __init__(self, partial, expected): - super(IncompleteRead, self).__init__(partial, expected) - - def __repr__(self): - return ('IncompleteRead(%i bytes read, ' - '%i more expected)' % (self.partial, self.expected)) - - -class InvalidHeader(HTTPError): - "The header provided was somehow invalid." - pass - - -class ProxySchemeUnknown(AssertionError, ValueError): - "ProxyManager does not support the supplied scheme" - # TODO(t-8ch): Stop inheriting from AssertionError in v2.0. - - def __init__(self, scheme): - message = "Not supported proxy scheme %s" % scheme - super(ProxySchemeUnknown, self).__init__(message) - - -class HeaderParsingError(HTTPError): - "Raised by assert_header_parsing, but we convert it to a log.warning statement." - def __init__(self, defects, unparsed_data): - message = '%s, unparsed data: %r' % (defects or 'Unknown', unparsed_data) - super(HeaderParsingError, self).__init__(message) - - -class UnrewindableBodyError(HTTPError): - "urllib3 encountered an error when trying to rewind a body" - pass diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/fields.py b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/fields.py deleted file mode 100644 index 37fe64a..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/fields.py +++ /dev/null @@ -1,178 +0,0 @@ -from __future__ import absolute_import -import email.utils -import mimetypes - -from .packages import six - - -def guess_content_type(filename, default='application/octet-stream'): - """ - Guess the "Content-Type" of a file. - - :param filename: - The filename to guess the "Content-Type" of using :mod:`mimetypes`. - :param default: - If no "Content-Type" can be guessed, default to `default`. - """ - if filename: - return mimetypes.guess_type(filename)[0] or default - return default - - -def format_header_param(name, value): - """ - Helper function to format and quote a single header parameter. - - Particularly useful for header parameters which might contain - non-ASCII values, like file names. This follows RFC 2231, as - suggested by RFC 2388 Section 4.4. - - :param name: - The name of the parameter, a string expected to be ASCII only. - :param value: - The value of the parameter, provided as a unicode string. - """ - if not any(ch in value for ch in '"\\\r\n'): - result = '%s="%s"' % (name, value) - try: - result.encode('ascii') - except (UnicodeEncodeError, UnicodeDecodeError): - pass - else: - return result - if not six.PY3 and isinstance(value, six.text_type): # Python 2: - value = value.encode('utf-8') - value = email.utils.encode_rfc2231(value, 'utf-8') - value = '%s*=%s' % (name, value) - return value - - -class RequestField(object): - """ - A data container for request body parameters. - - :param name: - The name of this request field. - :param data: - The data/value body. - :param filename: - An optional filename of the request field. - :param headers: - An optional dict-like object of headers to initially use for the field. - """ - def __init__(self, name, data, filename=None, headers=None): - self._name = name - self._filename = filename - self.data = data - self.headers = {} - if headers: - self.headers = dict(headers) - - @classmethod - def from_tuples(cls, fieldname, value): - """ - A :class:`~urllib3.fields.RequestField` factory from old-style tuple parameters. - - Supports constructing :class:`~urllib3.fields.RequestField` from - parameter of key/value strings AND key/filetuple. A filetuple is a - (filename, data, MIME type) tuple where the MIME type is optional. - For example:: - - 'foo': 'bar', - 'fakefile': ('foofile.txt', 'contents of foofile'), - 'realfile': ('barfile.txt', open('realfile').read()), - 'typedfile': ('bazfile.bin', open('bazfile').read(), 'image/jpeg'), - 'nonamefile': 'contents of nonamefile field', - - Field names and filenames must be unicode. - """ - if isinstance(value, tuple): - if len(value) == 3: - filename, data, content_type = value - else: - filename, data = value - content_type = guess_content_type(filename) - else: - filename = None - content_type = None - data = value - - request_param = cls(fieldname, data, filename=filename) - request_param.make_multipart(content_type=content_type) - - return request_param - - def _render_part(self, name, value): - """ - Overridable helper function to format a single header parameter. - - :param name: - The name of the parameter, a string expected to be ASCII only. - :param value: - The value of the parameter, provided as a unicode string. - """ - return format_header_param(name, value) - - def _render_parts(self, header_parts): - """ - Helper function to format and quote a single header. - - Useful for single headers that are composed of multiple items. E.g., - 'Content-Disposition' fields. - - :param header_parts: - A sequence of (k, v) tuples or a :class:`dict` of (k, v) to format - as `k1="v1"; k2="v2"; ...`. - """ - parts = [] - iterable = header_parts - if isinstance(header_parts, dict): - iterable = header_parts.items() - - for name, value in iterable: - if value is not None: - parts.append(self._render_part(name, value)) - - return '; '.join(parts) - - def render_headers(self): - """ - Renders the headers for this request field. - """ - lines = [] - - sort_keys = ['Content-Disposition', 'Content-Type', 'Content-Location'] - for sort_key in sort_keys: - if self.headers.get(sort_key, False): - lines.append('%s: %s' % (sort_key, self.headers[sort_key])) - - for header_name, header_value in self.headers.items(): - if header_name not in sort_keys: - if header_value: - lines.append('%s: %s' % (header_name, header_value)) - - lines.append('\r\n') - return '\r\n'.join(lines) - - def make_multipart(self, content_disposition=None, content_type=None, - content_location=None): - """ - Makes this request field into a multipart request field. - - This method overrides "Content-Disposition", "Content-Type" and - "Content-Location" headers to the request parameter. - - :param content_type: - The 'Content-Type' of the request body. - :param content_location: - The 'Content-Location' of the request body. - - """ - self.headers['Content-Disposition'] = content_disposition or 'form-data' - self.headers['Content-Disposition'] += '; '.join([ - '', self._render_parts( - (('name', self._name), ('filename', self._filename)) - ) - ]) - self.headers['Content-Type'] = content_type - self.headers['Content-Location'] = content_location diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/filepost.py b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/filepost.py deleted file mode 100644 index 78f1e19..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/filepost.py +++ /dev/null @@ -1,98 +0,0 @@ -from __future__ import absolute_import -import binascii -import codecs -import os - -from io import BytesIO - -from .packages import six -from .packages.six import b -from .fields import RequestField - -writer = codecs.lookup('utf-8')[3] - - -def choose_boundary(): - """ - Our embarrassingly-simple replacement for mimetools.choose_boundary. - """ - boundary = binascii.hexlify(os.urandom(16)) - if six.PY3: - boundary = boundary.decode('ascii') - return boundary - - -def iter_field_objects(fields): - """ - Iterate over fields. - - Supports list of (k, v) tuples and dicts, and lists of - :class:`~urllib3.fields.RequestField`. - - """ - if isinstance(fields, dict): - i = six.iteritems(fields) - else: - i = iter(fields) - - for field in i: - if isinstance(field, RequestField): - yield field - else: - yield RequestField.from_tuples(*field) - - -def iter_fields(fields): - """ - .. deprecated:: 1.6 - - Iterate over fields. - - The addition of :class:`~urllib3.fields.RequestField` makes this function - obsolete. Instead, use :func:`iter_field_objects`, which returns - :class:`~urllib3.fields.RequestField` objects. - - Supports list of (k, v) tuples and dicts. - """ - if isinstance(fields, dict): - return ((k, v) for k, v in six.iteritems(fields)) - - return ((k, v) for k, v in fields) - - -def encode_multipart_formdata(fields, boundary=None): - """ - Encode a dictionary of ``fields`` using the multipart/form-data MIME format. - - :param fields: - Dictionary of fields or list of (key, :class:`~urllib3.fields.RequestField`). - - :param boundary: - If not specified, then a random boundary will be generated using - :func:`urllib3.filepost.choose_boundary`. - """ - body = BytesIO() - if boundary is None: - boundary = choose_boundary() - - for field in iter_field_objects(fields): - body.write(b('--%s\r\n' % (boundary))) - - writer(body).write(field.render_headers()) - data = field.data - - if isinstance(data, int): - data = str(data) # Backwards compatibility - - if isinstance(data, six.text_type): - writer(body).write(data) - else: - body.write(data) - - body.write(b'\r\n') - - body.write(b('--%s--\r\n' % (boundary))) - - content_type = str('multipart/form-data; boundary=%s' % boundary) - - return body.getvalue(), content_type diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__init__.py b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__init__.py deleted file mode 100644 index 170e974..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from __future__ import absolute_import - -from . import ssl_match_hostname - -__all__ = ('ssl_match_hostname', ) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index b7b857635fd4873901f8393de3e6e3f1f776cbec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 270 zcmXv|yG{c!5VU<45k-lRs3>W#2o|D6QIvv`hVCS^a$<+GSU=(iBHu&BFI`KOU!cMc zVx`%con2{mvslbXDf@Z-VhVrP;lEfB>w<Vwnk14UF|?<YNG2O(rs<oao4%FpGwCL$ zaz#2iUW#pWn3Do+ybI|>|NN^M5sXN?0R|V76-GUElW_*H&nX855NhH`LR;wqKp+Bq zkuWXux&1uyWIXrUFSU)S?3eOzv>$i-p_*sFyRy;+o&%!Z-g7T@Z{k%&4xp`00Jr`) SP9Kbu8P%%(7Hi&|&Dk$7@kkW_ diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-37.pyc deleted file mode 100644 index bea292662f4af51d62dc73857db02b867f78bfd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24358 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 F{}+Vi>$?B| diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 8b2b24f890adcb48cf9424fa5defcbb073669674..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 167 zcmZ?b<>g`kg1p5Nu^{>}h=2h`Aj1KOi&=m~3PUi1CZpd<h9ZzKg7_7nUy@s(Uyxa# zo0(T!l9-dDn^IVrS7Dfz0TKk`__EZzl>8$7(xRN4%p_y|g2d$P#Prl+{UjixAit=j hSU)~KGcU6wK3=b&@)n0pZhlH>PO2Tqrq4jk002)$D=7c~ diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-37.pyc deleted file mode 100644 index cabc3b0fe5c8abdcf7dbd148348e6e2ce425fe2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1261 zcmZuwQHvWl5SFy--Sv8Hu1P6<s}kr@Lt+!s5GbWIZtvirT#h*DfuZcJEp5E#_3l=Z z<M@#K(CbrwL0<|DeJb=JKO?_EkL}a_fj;!59j(tM(2me(=F@0KGb0V!?GOPKzrO#? z>jpx9T4hV1qt9W=eP9fY5W|e*c!Xhfax!;D4o1vp4d(rTM=m2n)D13v4#&x4R+U1@ z-aMJ{G|PGT-G3+y2U|0$rktLv)U+(<eR_5#%gKzZ-Qlw{I_I#-Xj%%oken_vHKj=b zC$i!>oK94@ObR8bD(OV<L~)wX+bIOUO*hVHIX>qT)eEm66?ELiCK%RHjvgB<CZ0us z+AyvB1x&ez5mHFwOPeoY&eWM<2!WZaaf;tVm-u_YHJ*8Ek72u3A8Ri{YhU|vpglQI z1T37|B4CYmQ~P41n+!ihAbTPOnOIpl8tLXGS%(_A=-g%ALqt&QYQp?kAbw=Qnt<G# zA@P%HoO{<A5wCS1e}@}|_AWXcB8cz?Jik$mUwj?HAg`QttJnwJ02b5;0pwk{-yimV zfHt?N4#Z!&HAH}gx}_cM>c%T~9ciqixTPcLZ|mZdkOFO+N6YkoJC=%azUyi4L9ad} z9H^_oOM}N3`&scK$umahCFAr%K|d;sd_~0_y1YZjG|BUF$ywK+D`*2czWN79Sn=Z4 zq8KmIlnc(NRM76Zr1OPTbj;~ED-yBlM#hm`negi*U+@DVN?|&Wq~t<nWl`&bfU8j_ z-oDUS@KhR-mFDJ`2ZxWIef2aRJUcu*coGkfMhB)dxQ_Vb^d!l^+fL^R<8SGwB2%EZ zpYoUL=<%sYstQ!sCfRKpSMod+H*6J}n;hT)n}8RSl3B^)_O8<S1z+Y_!HvHJe|E=* zJU1qr6ah$<)~j(qFy6+SaTUb<4T%pR#NQ`<HLv<rR^81Csi2~F*|)3W<-K%j!Ft9o zc)?21Ux+-<#`pUb{K@1wm;K!z?r$s9t5)WnExfB+2Lj0fFx0q#364mBJ2=7tc41f^ z;1H0F<Xx{8-GjXjSVy(x9`>-f1zx(1`jH$1bsNTyV^&V$SVXX8yv<*(TUQ&`X}-m% WwF*9kvMh4`Spb@}48oDfLHJ)5^KIh* diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py deleted file mode 100644 index 740db37..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py +++ /dev/null @@ -1,53 +0,0 @@ -# -*- coding: utf-8 -*- -""" -backports.makefile -~~~~~~~~~~~~~~~~~~ - -Backports the Python 3 ``socket.makefile`` method for use with anything that -wants to create a "fake" socket object. -""" -import io - -from socket import SocketIO - - -def backport_makefile(self, mode="r", buffering=None, encoding=None, - errors=None, newline=None): - """ - Backport of ``socket.makefile`` from Python 3.5. - """ - if not set(mode) <= {"r", "w", "b"}: - raise ValueError( - "invalid mode %r (only r, w, b allowed)" % (mode,) - ) - writing = "w" in mode - reading = "r" in mode or not writing - assert reading or writing - binary = "b" in mode - rawmode = "" - if reading: - rawmode += "r" - if writing: - rawmode += "w" - raw = SocketIO(self, rawmode) - self._makefile_refs += 1 - if buffering is None: - buffering = -1 - if buffering < 0: - buffering = io.DEFAULT_BUFFER_SIZE - if buffering == 0: - if not binary: - raise ValueError("unbuffered streams must be binary") - return raw - if reading and writing: - buffer = io.BufferedRWPair(raw, raw, buffering) - elif reading: - buffer = io.BufferedReader(raw, buffering) - else: - assert writing - buffer = io.BufferedWriter(raw, buffering) - if binary: - return buffer - text = io.TextIOWrapper(buffer, encoding, errors, newline) - text.mode = mode - return text diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/six.py b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/six.py deleted file mode 100644 index 190c023..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/six.py +++ /dev/null @@ -1,868 +0,0 @@ -"""Utilities for writing code that runs on Python 2 and 3""" - -# Copyright (c) 2010-2015 Benjamin Peterson -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -from __future__ import absolute_import - -import functools -import itertools -import operator -import sys -import types - -__author__ = "Benjamin Peterson <benjamin@python.org>" -__version__ = "1.10.0" - - -# Useful for very coarse version differentiation. -PY2 = sys.version_info[0] == 2 -PY3 = sys.version_info[0] == 3 -PY34 = sys.version_info[0:2] >= (3, 4) - -if PY3: - string_types = str, - integer_types = int, - class_types = type, - text_type = str - binary_type = bytes - - MAXSIZE = sys.maxsize -else: - string_types = basestring, - integer_types = (int, long) - class_types = (type, types.ClassType) - text_type = unicode - binary_type = str - - if sys.platform.startswith("java"): - # Jython always uses 32 bits. - MAXSIZE = int((1 << 31) - 1) - else: - # It's possible to have sizeof(long) != sizeof(Py_ssize_t). - class X(object): - - def __len__(self): - return 1 << 31 - try: - len(X()) - except OverflowError: - # 32-bit - MAXSIZE = int((1 << 31) - 1) - else: - # 64-bit - MAXSIZE = int((1 << 63) - 1) - del X - - -def _add_doc(func, doc): - """Add documentation to a function.""" - func.__doc__ = doc - - -def _import_module(name): - """Import module, returning the module after the last dot.""" - __import__(name) - return sys.modules[name] - - -class _LazyDescr(object): - - def __init__(self, name): - self.name = name - - def __get__(self, obj, tp): - result = self._resolve() - setattr(obj, self.name, result) # Invokes __set__. - try: - # This is a bit ugly, but it avoids running this again by - # removing this descriptor. - delattr(obj.__class__, self.name) - except AttributeError: - pass - return result - - -class MovedModule(_LazyDescr): - - def __init__(self, name, old, new=None): - super(MovedModule, self).__init__(name) - if PY3: - if new is None: - new = name - self.mod = new - else: - self.mod = old - - def _resolve(self): - return _import_module(self.mod) - - def __getattr__(self, attr): - _module = self._resolve() - value = getattr(_module, attr) - setattr(self, attr, value) - return value - - -class _LazyModule(types.ModuleType): - - def __init__(self, name): - super(_LazyModule, self).__init__(name) - self.__doc__ = self.__class__.__doc__ - - def __dir__(self): - attrs = ["__doc__", "__name__"] - attrs += [attr.name for attr in self._moved_attributes] - return attrs - - # Subclasses should override this - _moved_attributes = [] - - -class MovedAttribute(_LazyDescr): - - def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): - super(MovedAttribute, self).__init__(name) - if PY3: - if new_mod is None: - new_mod = name - self.mod = new_mod - if new_attr is None: - if old_attr is None: - new_attr = name - else: - new_attr = old_attr - self.attr = new_attr - else: - self.mod = old_mod - if old_attr is None: - old_attr = name - self.attr = old_attr - - def _resolve(self): - module = _import_module(self.mod) - return getattr(module, self.attr) - - -class _SixMetaPathImporter(object): - - """ - A meta path importer to import six.moves and its submodules. - - This class implements a PEP302 finder and loader. It should be compatible - with Python 2.5 and all existing versions of Python3 - """ - - def __init__(self, six_module_name): - self.name = six_module_name - self.known_modules = {} - - def _add_module(self, mod, *fullnames): - for fullname in fullnames: - self.known_modules[self.name + "." + fullname] = mod - - def _get_module(self, fullname): - return self.known_modules[self.name + "." + fullname] - - def find_module(self, fullname, path=None): - if fullname in self.known_modules: - return self - return None - - def __get_module(self, fullname): - try: - return self.known_modules[fullname] - except KeyError: - raise ImportError("This loader does not know module " + fullname) - - def load_module(self, fullname): - try: - # in case of a reload - return sys.modules[fullname] - except KeyError: - pass - mod = self.__get_module(fullname) - if isinstance(mod, MovedModule): - mod = mod._resolve() - else: - mod.__loader__ = self - sys.modules[fullname] = mod - return mod - - def is_package(self, fullname): - """ - Return true, if the named module is a package. - - We need this method to get correct spec objects with - Python 3.4 (see PEP451) - """ - return hasattr(self.__get_module(fullname), "__path__") - - def get_code(self, fullname): - """Return None - - Required, if is_package is implemented""" - self.__get_module(fullname) # eventually raises ImportError - return None - get_source = get_code # same as get_code - -_importer = _SixMetaPathImporter(__name__) - - -class _MovedItems(_LazyModule): - - """Lazy loading of moved objects""" - __path__ = [] # mark as package - - -_moved_attributes = [ - MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), - MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), - MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), - MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), - MovedAttribute("intern", "__builtin__", "sys"), - MovedAttribute("map", "itertools", "builtins", "imap", "map"), - MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), - MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), - MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), - MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), - MovedAttribute("reduce", "__builtin__", "functools"), - MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), - MovedAttribute("StringIO", "StringIO", "io"), - MovedAttribute("UserDict", "UserDict", "collections"), - MovedAttribute("UserList", "UserList", "collections"), - MovedAttribute("UserString", "UserString", "collections"), - MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), - MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), - MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), - MovedModule("builtins", "__builtin__"), - MovedModule("configparser", "ConfigParser"), - MovedModule("copyreg", "copy_reg"), - MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), - MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), - MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), - MovedModule("http_cookies", "Cookie", "http.cookies"), - MovedModule("html_entities", "htmlentitydefs", "html.entities"), - MovedModule("html_parser", "HTMLParser", "html.parser"), - MovedModule("http_client", "httplib", "http.client"), - MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), - MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), - MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), - MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), - MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), - MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), - MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), - MovedModule("cPickle", "cPickle", "pickle"), - MovedModule("queue", "Queue"), - MovedModule("reprlib", "repr"), - MovedModule("socketserver", "SocketServer"), - MovedModule("_thread", "thread", "_thread"), - MovedModule("tkinter", "Tkinter"), - MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), - MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), - MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), - MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), - MovedModule("tkinter_tix", "Tix", "tkinter.tix"), - MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), - MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), - MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), - MovedModule("tkinter_colorchooser", "tkColorChooser", - "tkinter.colorchooser"), - MovedModule("tkinter_commondialog", "tkCommonDialog", - "tkinter.commondialog"), - MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), - MovedModule("tkinter_font", "tkFont", "tkinter.font"), - MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), - MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", - "tkinter.simpledialog"), - MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), - MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), - MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), - MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), - MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), - MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), -] -# Add windows specific modules. -if sys.platform == "win32": - _moved_attributes += [ - MovedModule("winreg", "_winreg"), - ] - -for attr in _moved_attributes: - setattr(_MovedItems, attr.name, attr) - if isinstance(attr, MovedModule): - _importer._add_module(attr, "moves." + attr.name) -del attr - -_MovedItems._moved_attributes = _moved_attributes - -moves = _MovedItems(__name__ + ".moves") -_importer._add_module(moves, "moves") - - -class Module_six_moves_urllib_parse(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_parse""" - - -_urllib_parse_moved_attributes = [ - MovedAttribute("ParseResult", "urlparse", "urllib.parse"), - MovedAttribute("SplitResult", "urlparse", "urllib.parse"), - MovedAttribute("parse_qs", "urlparse", "urllib.parse"), - MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), - MovedAttribute("urldefrag", "urlparse", "urllib.parse"), - MovedAttribute("urljoin", "urlparse", "urllib.parse"), - MovedAttribute("urlparse", "urlparse", "urllib.parse"), - MovedAttribute("urlsplit", "urlparse", "urllib.parse"), - MovedAttribute("urlunparse", "urlparse", "urllib.parse"), - MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), - MovedAttribute("quote", "urllib", "urllib.parse"), - MovedAttribute("quote_plus", "urllib", "urllib.parse"), - MovedAttribute("unquote", "urllib", "urllib.parse"), - MovedAttribute("unquote_plus", "urllib", "urllib.parse"), - MovedAttribute("urlencode", "urllib", "urllib.parse"), - MovedAttribute("splitquery", "urllib", "urllib.parse"), - MovedAttribute("splittag", "urllib", "urllib.parse"), - MovedAttribute("splituser", "urllib", "urllib.parse"), - MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), - MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), - MovedAttribute("uses_params", "urlparse", "urllib.parse"), - MovedAttribute("uses_query", "urlparse", "urllib.parse"), - MovedAttribute("uses_relative", "urlparse", "urllib.parse"), -] -for attr in _urllib_parse_moved_attributes: - setattr(Module_six_moves_urllib_parse, attr.name, attr) -del attr - -Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes - -_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), - "moves.urllib_parse", "moves.urllib.parse") - - -class Module_six_moves_urllib_error(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_error""" - - -_urllib_error_moved_attributes = [ - MovedAttribute("URLError", "urllib2", "urllib.error"), - MovedAttribute("HTTPError", "urllib2", "urllib.error"), - MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), -] -for attr in _urllib_error_moved_attributes: - setattr(Module_six_moves_urllib_error, attr.name, attr) -del attr - -Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes - -_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), - "moves.urllib_error", "moves.urllib.error") - - -class Module_six_moves_urllib_request(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_request""" - - -_urllib_request_moved_attributes = [ - MovedAttribute("urlopen", "urllib2", "urllib.request"), - MovedAttribute("install_opener", "urllib2", "urllib.request"), - MovedAttribute("build_opener", "urllib2", "urllib.request"), - MovedAttribute("pathname2url", "urllib", "urllib.request"), - MovedAttribute("url2pathname", "urllib", "urllib.request"), - MovedAttribute("getproxies", "urllib", "urllib.request"), - MovedAttribute("Request", "urllib2", "urllib.request"), - MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), - MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), - MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), - MovedAttribute("BaseHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), - MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), - MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), - MovedAttribute("FileHandler", "urllib2", "urllib.request"), - MovedAttribute("FTPHandler", "urllib2", "urllib.request"), - MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), - MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), - MovedAttribute("urlretrieve", "urllib", "urllib.request"), - MovedAttribute("urlcleanup", "urllib", "urllib.request"), - MovedAttribute("URLopener", "urllib", "urllib.request"), - MovedAttribute("FancyURLopener", "urllib", "urllib.request"), - MovedAttribute("proxy_bypass", "urllib", "urllib.request"), -] -for attr in _urllib_request_moved_attributes: - setattr(Module_six_moves_urllib_request, attr.name, attr) -del attr - -Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes - -_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), - "moves.urllib_request", "moves.urllib.request") - - -class Module_six_moves_urllib_response(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_response""" - - -_urllib_response_moved_attributes = [ - MovedAttribute("addbase", "urllib", "urllib.response"), - MovedAttribute("addclosehook", "urllib", "urllib.response"), - MovedAttribute("addinfo", "urllib", "urllib.response"), - MovedAttribute("addinfourl", "urllib", "urllib.response"), -] -for attr in _urllib_response_moved_attributes: - setattr(Module_six_moves_urllib_response, attr.name, attr) -del attr - -Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes - -_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), - "moves.urllib_response", "moves.urllib.response") - - -class Module_six_moves_urllib_robotparser(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_robotparser""" - - -_urllib_robotparser_moved_attributes = [ - MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), -] -for attr in _urllib_robotparser_moved_attributes: - setattr(Module_six_moves_urllib_robotparser, attr.name, attr) -del attr - -Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes - -_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), - "moves.urllib_robotparser", "moves.urllib.robotparser") - - -class Module_six_moves_urllib(types.ModuleType): - - """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" - __path__ = [] # mark as package - parse = _importer._get_module("moves.urllib_parse") - error = _importer._get_module("moves.urllib_error") - request = _importer._get_module("moves.urllib_request") - response = _importer._get_module("moves.urllib_response") - robotparser = _importer._get_module("moves.urllib_robotparser") - - def __dir__(self): - return ['parse', 'error', 'request', 'response', 'robotparser'] - -_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), - "moves.urllib") - - -def add_move(move): - """Add an item to six.moves.""" - setattr(_MovedItems, move.name, move) - - -def remove_move(name): - """Remove item from six.moves.""" - try: - delattr(_MovedItems, name) - except AttributeError: - try: - del moves.__dict__[name] - except KeyError: - raise AttributeError("no such move, %r" % (name,)) - - -if PY3: - _meth_func = "__func__" - _meth_self = "__self__" - - _func_closure = "__closure__" - _func_code = "__code__" - _func_defaults = "__defaults__" - _func_globals = "__globals__" -else: - _meth_func = "im_func" - _meth_self = "im_self" - - _func_closure = "func_closure" - _func_code = "func_code" - _func_defaults = "func_defaults" - _func_globals = "func_globals" - - -try: - advance_iterator = next -except NameError: - def advance_iterator(it): - return it.next() -next = advance_iterator - - -try: - callable = callable -except NameError: - def callable(obj): - return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) - - -if PY3: - def get_unbound_function(unbound): - return unbound - - create_bound_method = types.MethodType - - def create_unbound_method(func, cls): - return func - - Iterator = object -else: - def get_unbound_function(unbound): - return unbound.im_func - - def create_bound_method(func, obj): - return types.MethodType(func, obj, obj.__class__) - - def create_unbound_method(func, cls): - return types.MethodType(func, None, cls) - - class Iterator(object): - - def next(self): - return type(self).__next__(self) - - callable = callable -_add_doc(get_unbound_function, - """Get the function out of a possibly unbound function""") - - -get_method_function = operator.attrgetter(_meth_func) -get_method_self = operator.attrgetter(_meth_self) -get_function_closure = operator.attrgetter(_func_closure) -get_function_code = operator.attrgetter(_func_code) -get_function_defaults = operator.attrgetter(_func_defaults) -get_function_globals = operator.attrgetter(_func_globals) - - -if PY3: - def iterkeys(d, **kw): - return iter(d.keys(**kw)) - - def itervalues(d, **kw): - return iter(d.values(**kw)) - - def iteritems(d, **kw): - return iter(d.items(**kw)) - - def iterlists(d, **kw): - return iter(d.lists(**kw)) - - viewkeys = operator.methodcaller("keys") - - viewvalues = operator.methodcaller("values") - - viewitems = operator.methodcaller("items") -else: - def iterkeys(d, **kw): - return d.iterkeys(**kw) - - def itervalues(d, **kw): - return d.itervalues(**kw) - - def iteritems(d, **kw): - return d.iteritems(**kw) - - def iterlists(d, **kw): - return d.iterlists(**kw) - - viewkeys = operator.methodcaller("viewkeys") - - viewvalues = operator.methodcaller("viewvalues") - - viewitems = operator.methodcaller("viewitems") - -_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") -_add_doc(itervalues, "Return an iterator over the values of a dictionary.") -_add_doc(iteritems, - "Return an iterator over the (key, value) pairs of a dictionary.") -_add_doc(iterlists, - "Return an iterator over the (key, [values]) pairs of a dictionary.") - - -if PY3: - def b(s): - return s.encode("latin-1") - - def u(s): - return s - unichr = chr - import struct - int2byte = struct.Struct(">B").pack - del struct - byte2int = operator.itemgetter(0) - indexbytes = operator.getitem - iterbytes = iter - import io - StringIO = io.StringIO - BytesIO = io.BytesIO - _assertCountEqual = "assertCountEqual" - if sys.version_info[1] <= 1: - _assertRaisesRegex = "assertRaisesRegexp" - _assertRegex = "assertRegexpMatches" - else: - _assertRaisesRegex = "assertRaisesRegex" - _assertRegex = "assertRegex" -else: - def b(s): - return s - # Workaround for standalone backslash - - def u(s): - return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") - unichr = unichr - int2byte = chr - - def byte2int(bs): - return ord(bs[0]) - - def indexbytes(buf, i): - return ord(buf[i]) - iterbytes = functools.partial(itertools.imap, ord) - import StringIO - StringIO = BytesIO = StringIO.StringIO - _assertCountEqual = "assertItemsEqual" - _assertRaisesRegex = "assertRaisesRegexp" - _assertRegex = "assertRegexpMatches" -_add_doc(b, """Byte literal""") -_add_doc(u, """Text literal""") - - -def assertCountEqual(self, *args, **kwargs): - return getattr(self, _assertCountEqual)(*args, **kwargs) - - -def assertRaisesRegex(self, *args, **kwargs): - return getattr(self, _assertRaisesRegex)(*args, **kwargs) - - -def assertRegex(self, *args, **kwargs): - return getattr(self, _assertRegex)(*args, **kwargs) - - -if PY3: - exec_ = getattr(moves.builtins, "exec") - - def reraise(tp, value, tb=None): - if value is None: - value = tp() - if value.__traceback__ is not tb: - raise value.with_traceback(tb) - raise value - -else: - def exec_(_code_, _globs_=None, _locs_=None): - """Execute code in a namespace.""" - if _globs_ is None: - frame = sys._getframe(1) - _globs_ = frame.f_globals - if _locs_ is None: - _locs_ = frame.f_locals - del frame - elif _locs_ is None: - _locs_ = _globs_ - exec("""exec _code_ in _globs_, _locs_""") - - exec_("""def reraise(tp, value, tb=None): - raise tp, value, tb -""") - - -if sys.version_info[:2] == (3, 2): - exec_("""def raise_from(value, from_value): - if from_value is None: - raise value - raise value from from_value -""") -elif sys.version_info[:2] > (3, 2): - exec_("""def raise_from(value, from_value): - raise value from from_value -""") -else: - def raise_from(value, from_value): - raise value - - -print_ = getattr(moves.builtins, "print", None) -if print_ is None: - def print_(*args, **kwargs): - """The new-style print function for Python 2.4 and 2.5.""" - fp = kwargs.pop("file", sys.stdout) - if fp is None: - return - - def write(data): - if not isinstance(data, basestring): - data = str(data) - # If the file has an encoding, encode unicode with it. - if (isinstance(fp, file) and - isinstance(data, unicode) and - fp.encoding is not None): - errors = getattr(fp, "errors", None) - if errors is None: - errors = "strict" - data = data.encode(fp.encoding, errors) - fp.write(data) - want_unicode = False - sep = kwargs.pop("sep", None) - if sep is not None: - if isinstance(sep, unicode): - want_unicode = True - elif not isinstance(sep, str): - raise TypeError("sep must be None or a string") - end = kwargs.pop("end", None) - if end is not None: - if isinstance(end, unicode): - want_unicode = True - elif not isinstance(end, str): - raise TypeError("end must be None or a string") - if kwargs: - raise TypeError("invalid keyword arguments to print()") - if not want_unicode: - for arg in args: - if isinstance(arg, unicode): - want_unicode = True - break - if want_unicode: - newline = unicode("\n") - space = unicode(" ") - else: - newline = "\n" - space = " " - if sep is None: - sep = space - if end is None: - end = newline - for i, arg in enumerate(args): - if i: - write(sep) - write(arg) - write(end) -if sys.version_info[:2] < (3, 3): - _print = print_ - - def print_(*args, **kwargs): - fp = kwargs.get("file", sys.stdout) - flush = kwargs.pop("flush", False) - _print(*args, **kwargs) - if flush and fp is not None: - fp.flush() - -_add_doc(reraise, """Reraise an exception.""") - -if sys.version_info[0:2] < (3, 4): - def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, - updated=functools.WRAPPER_UPDATES): - def wrapper(f): - f = functools.wraps(wrapped, assigned, updated)(f) - f.__wrapped__ = wrapped - return f - return wrapper -else: - wraps = functools.wraps - - -def with_metaclass(meta, *bases): - """Create a base class with a metaclass.""" - # This requires a bit of explanation: the basic idea is to make a dummy - # metaclass for one level of class instantiation that replaces itself with - # the actual metaclass. - class metaclass(meta): - - def __new__(cls, name, this_bases, d): - return meta(name, bases, d) - return type.__new__(metaclass, 'temporary_class', (), {}) - - -def add_metaclass(metaclass): - """Class decorator for creating a class with a metaclass.""" - def wrapper(cls): - orig_vars = cls.__dict__.copy() - slots = orig_vars.get('__slots__') - if slots is not None: - if isinstance(slots, str): - slots = [slots] - for slots_var in slots: - orig_vars.pop(slots_var) - orig_vars.pop('__dict__', None) - orig_vars.pop('__weakref__', None) - return metaclass(cls.__name__, cls.__bases__, orig_vars) - return wrapper - - -def python_2_unicode_compatible(klass): - """ - A decorator that defines __unicode__ and __str__ methods under Python 2. - Under Python 3 it does nothing. - - To support Python 2 and 3 with a single code base, define a __str__ method - returning text and apply this decorator to the class. - """ - if PY2: - if '__str__' not in klass.__dict__: - raise ValueError("@python_2_unicode_compatible cannot be applied " - "to %s because it doesn't define __str__()." % - klass.__name__) - klass.__unicode__ = klass.__str__ - klass.__str__ = lambda self: self.__unicode__().encode('utf-8') - return klass - - -# Complete the moves implementation. -# This code is at the end of this module to speed up module loading. -# Turn this module into a package. -__path__ = [] # required for PEP 302 and PEP 451 -__package__ = __name__ # see PEP 366 @ReservedAssignment -if globals().get("__spec__") is not None: - __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable -# Remove other six meta path importers, since they cause problems. This can -# happen if six is removed from sys.modules and then reloaded. (Setuptools does -# this for some reason.) -if sys.meta_path: - for i, importer in enumerate(sys.meta_path): - # Here's some real nastiness: Another "instance" of the six module might - # be floating around. Therefore, we can't use isinstance() to check for - # the six meta path importer, since the other six instance will have - # inserted an importer with different class. - if (type(importer).__name__ == "_SixMetaPathImporter" and - importer.name == __name__): - del sys.meta_path[i] - break - del i, importer -# Finally, add the importer to the meta path import hook. -sys.meta_path.append(_importer) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py deleted file mode 100644 index d6594eb..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py +++ /dev/null @@ -1,19 +0,0 @@ -import sys - -try: - # Our match_hostname function is the same as 3.5's, so we only want to - # import the match_hostname function if it's at least that good. - if sys.version_info < (3, 5): - raise ImportError("Fallback to vendored code") - - from ssl import CertificateError, match_hostname -except ImportError: - try: - # Backport of the function from a pypi module - from backports.ssl_match_hostname import CertificateError, match_hostname - except ImportError: - # Our vendored copy - from ._implementation import CertificateError, match_hostname - -# Not needed, but documenting what we provide. -__all__ = ('CertificateError', 'match_hostname') diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 23c3fafe56fb1daef408c241843136febec4118e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 511 zcmZWkJx?1!5S`sSgE2OtaFIwZTp%PD_9;pmMG*)j8X5}XlhEq$uH%jO<FdP0IYb2# ze}syT-*as${{<>$F;QeOt9kqJ-oBYR=yY0uVIDqSJW+tZ@$xUW@$enf-y?9~L_rSK zzJOnZ(>b`Fpgg%Fw*<LVB|6Ph-N+jR&cU3fAn3g1ZV1Fxbze0bYnr_`&0?kD4RqQ3 zuNZ@&KVXGC&6}K@!C+&Fy};>!E)(3B4TS4Y$Awat#bn+Ow!aXDTPJvbV!0U5diPMc zAg6Lt1aah?b@h%e!equ~)(2B)u_Wj**s2p>`MSLj&P!{UG*eq|pXk!Mu=<vGuUv{+ z7mMb-STM4Fgaljn%s()xOC_{0p$O<#Z!(5WGWH0r9X%pEkF%i5td!+Y8Xu4!^52#D z^LaXpkFUvA^JG^}DS7!NE3s<vQ~2zC(Tri&GB7qOtGfABTYja)w>X{eA~Y#YTBJ$4 LWQWj*w3oa9JC=&@ diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-37.pyc deleted file mode 100644 index 874224a3069b302e6fff9290b632619dcf057a86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3270 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 SEW*MT_1s0Tbv5vV_WuCD40JaD diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py deleted file mode 100644 index 970cf65..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py +++ /dev/null @@ -1,156 +0,0 @@ -"""The match_hostname() function from Python 3.3.3, essential when using SSL.""" - -# Note: This file is under the PSF license as the code comes from the python -# stdlib. http://docs.python.org/3/license.html - -import re -import sys - -# ipaddress has been backported to 2.6+ in pypi. If it is installed on the -# system, use it to handle IPAddress ServerAltnames (this was added in -# python-3.5) otherwise only do DNS matching. This allows -# backports.ssl_match_hostname to continue to be used in Python 2.7. -try: - from pip._vendor import ipaddress -except ImportError: - ipaddress = None - -__version__ = '3.5.0.1' - - -class CertificateError(ValueError): - pass - - -def _dnsname_match(dn, hostname, max_wildcards=1): - """Matching according to RFC 6125, section 6.4.3 - - http://tools.ietf.org/html/rfc6125#section-6.4.3 - """ - pats = [] - if not dn: - return False - - # Ported from python3-syntax: - # leftmost, *remainder = dn.split(r'.') - parts = dn.split(r'.') - leftmost = parts[0] - remainder = parts[1:] - - wildcards = leftmost.count('*') - if wildcards > max_wildcards: - # Issue #17980: avoid denials of service by refusing more - # than one wildcard per fragment. A survey of established - # policy among SSL implementations showed it to be a - # reasonable choice. - raise CertificateError( - "too many wildcards in certificate DNS name: " + repr(dn)) - - # speed up common case w/o wildcards - if not wildcards: - return dn.lower() == hostname.lower() - - # RFC 6125, section 6.4.3, subitem 1. - # The client SHOULD NOT attempt to match a presented identifier in which - # the wildcard character comprises a label other than the left-most label. - if leftmost == '*': - # When '*' is a fragment by itself, it matches a non-empty dotless - # fragment. - pats.append('[^.]+') - elif leftmost.startswith('xn--') or hostname.startswith('xn--'): - # RFC 6125, section 6.4.3, subitem 3. - # The client SHOULD NOT attempt to match a presented identifier - # where the wildcard character is embedded within an A-label or - # U-label of an internationalized domain name. - pats.append(re.escape(leftmost)) - else: - # Otherwise, '*' matches any dotless string, e.g. www* - pats.append(re.escape(leftmost).replace(r'\*', '[^.]*')) - - # add the remaining fragments, ignore any wildcards - for frag in remainder: - pats.append(re.escape(frag)) - - pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) - return pat.match(hostname) - - -def _to_unicode(obj): - if isinstance(obj, str) and sys.version_info < (3,): - obj = unicode(obj, encoding='ascii', errors='strict') - return obj - -def _ipaddress_match(ipname, host_ip): - """Exact matching of IP addresses. - - RFC 6125 explicitly doesn't define an algorithm for this - (section 1.7.2 - "Out of Scope"). - """ - # OpenSSL may add a trailing newline to a subjectAltName's IP address - # Divergence from upstream: ipaddress can't handle byte str - ip = ipaddress.ip_address(_to_unicode(ipname).rstrip()) - return ip == host_ip - - -def match_hostname(cert, hostname): - """Verify that *cert* (in decoded format as returned by - SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 - rules are followed, but IP addresses are not accepted for *hostname*. - - CertificateError is raised on failure. On success, the function - returns nothing. - """ - if not cert: - raise ValueError("empty or no certificate, match_hostname needs a " - "SSL socket or SSL context with either " - "CERT_OPTIONAL or CERT_REQUIRED") - try: - # Divergence from upstream: ipaddress can't handle byte str - host_ip = ipaddress.ip_address(_to_unicode(hostname)) - except ValueError: - # Not an IP address (common case) - host_ip = None - except UnicodeError: - # Divergence from upstream: Have to deal with ipaddress not taking - # byte strings. addresses should be all ascii, so we consider it not - # an ipaddress in this case - host_ip = None - except AttributeError: - # Divergence from upstream: Make ipaddress library optional - if ipaddress is None: - host_ip = None - else: - raise - dnsnames = [] - san = cert.get('subjectAltName', ()) - for key, value in san: - if key == 'DNS': - if host_ip is None and _dnsname_match(value, hostname): - return - dnsnames.append(value) - elif key == 'IP Address': - if host_ip is not None and _ipaddress_match(value, host_ip): - return - dnsnames.append(value) - if not dnsnames: - # The subject is only checked when there is no dNSName entry - # in subjectAltName - for sub in cert.get('subject', ()): - for key, value in sub: - # XXX according to RFC 2818, the most specific Common Name - # must be used. - if key == 'commonName': - if _dnsname_match(value, hostname): - return - dnsnames.append(value) - if len(dnsnames) > 1: - raise CertificateError("hostname %r " - "doesn't match either of %s" - % (hostname, ', '.join(map(repr, dnsnames)))) - elif len(dnsnames) == 1: - raise CertificateError("hostname %r " - "doesn't match %r" - % (hostname, dnsnames[0])) - else: - raise CertificateError("no appropriate commonName or " - "subjectAltName fields were found") diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/poolmanager.py b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/poolmanager.py deleted file mode 100644 index fe5491c..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/poolmanager.py +++ /dev/null @@ -1,450 +0,0 @@ -from __future__ import absolute_import -import collections -import functools -import logging - -from ._collections import RecentlyUsedContainer -from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool -from .connectionpool import port_by_scheme -from .exceptions import LocationValueError, MaxRetryError, ProxySchemeUnknown -from .packages.six.moves.urllib.parse import urljoin -from .request import RequestMethods -from .util.url import parse_url -from .util.retry import Retry - - -__all__ = ['PoolManager', 'ProxyManager', 'proxy_from_url'] - - -log = logging.getLogger(__name__) - -SSL_KEYWORDS = ('key_file', 'cert_file', 'cert_reqs', 'ca_certs', - 'ssl_version', 'ca_cert_dir', 'ssl_context') - -# All known keyword arguments that could be provided to the pool manager, its -# pools, or the underlying connections. This is used to construct a pool key. -_key_fields = ( - 'key_scheme', # str - 'key_host', # str - 'key_port', # int - 'key_timeout', # int or float or Timeout - 'key_retries', # int or Retry - 'key_strict', # bool - 'key_block', # bool - 'key_source_address', # str - 'key_key_file', # str - 'key_cert_file', # str - 'key_cert_reqs', # str - 'key_ca_certs', # str - 'key_ssl_version', # str - 'key_ca_cert_dir', # str - 'key_ssl_context', # instance of ssl.SSLContext or urllib3.util.ssl_.SSLContext - 'key_maxsize', # int - 'key_headers', # dict - 'key__proxy', # parsed proxy url - 'key__proxy_headers', # dict - 'key_socket_options', # list of (level (int), optname (int), value (int or str)) tuples - 'key__socks_options', # dict - 'key_assert_hostname', # bool or string - 'key_assert_fingerprint', # str - 'key_server_hostname', #str -) - -#: The namedtuple class used to construct keys for the connection pool. -#: All custom key schemes should include the fields in this key at a minimum. -PoolKey = collections.namedtuple('PoolKey', _key_fields) - - -def _default_key_normalizer(key_class, request_context): - """ - Create a pool key out of a request context dictionary. - - According to RFC 3986, both the scheme and host are case-insensitive. - Therefore, this function normalizes both before constructing the pool - key for an HTTPS request. If you wish to change this behaviour, provide - alternate callables to ``key_fn_by_scheme``. - - :param key_class: - The class to use when constructing the key. This should be a namedtuple - with the ``scheme`` and ``host`` keys at a minimum. - :type key_class: namedtuple - :param request_context: - A dictionary-like object that contain the context for a request. - :type request_context: dict - - :return: A namedtuple that can be used as a connection pool key. - :rtype: PoolKey - """ - # Since we mutate the dictionary, make a copy first - context = request_context.copy() - context['scheme'] = context['scheme'].lower() - context['host'] = context['host'].lower() - - # These are both dictionaries and need to be transformed into frozensets - for key in ('headers', '_proxy_headers', '_socks_options'): - if key in context and context[key] is not None: - context[key] = frozenset(context[key].items()) - - # The socket_options key may be a list and needs to be transformed into a - # tuple. - socket_opts = context.get('socket_options') - if socket_opts is not None: - context['socket_options'] = tuple(socket_opts) - - # Map the kwargs to the names in the namedtuple - this is necessary since - # namedtuples can't have fields starting with '_'. - for key in list(context.keys()): - context['key_' + key] = context.pop(key) - - # Default to ``None`` for keys missing from the context - for field in key_class._fields: - if field not in context: - context[field] = None - - return key_class(**context) - - -#: A dictionary that maps a scheme to a callable that creates a pool key. -#: This can be used to alter the way pool keys are constructed, if desired. -#: Each PoolManager makes a copy of this dictionary so they can be configured -#: globally here, or individually on the instance. -key_fn_by_scheme = { - 'http': functools.partial(_default_key_normalizer, PoolKey), - 'https': functools.partial(_default_key_normalizer, PoolKey), -} - -pool_classes_by_scheme = { - 'http': HTTPConnectionPool, - 'https': HTTPSConnectionPool, -} - - -class PoolManager(RequestMethods): - """ - Allows for arbitrary requests while transparently keeping track of - necessary connection pools for you. - - :param num_pools: - Number of connection pools to cache before discarding the least - recently used pool. - - :param headers: - Headers to include with all requests, unless other headers are given - explicitly. - - :param \\**connection_pool_kw: - Additional parameters are used to create fresh - :class:`urllib3.connectionpool.ConnectionPool` instances. - - Example:: - - >>> manager = PoolManager(num_pools=2) - >>> r = manager.request('GET', 'http://google.com/') - >>> r = manager.request('GET', 'http://google.com/mail') - >>> r = manager.request('GET', 'http://yahoo.com/') - >>> len(manager.pools) - 2 - - """ - - proxy = None - - def __init__(self, num_pools=10, headers=None, **connection_pool_kw): - RequestMethods.__init__(self, headers) - self.connection_pool_kw = connection_pool_kw - self.pools = RecentlyUsedContainer(num_pools, - dispose_func=lambda p: p.close()) - - # Locally set the pool classes and keys so other PoolManagers can - # override them. - self.pool_classes_by_scheme = pool_classes_by_scheme - self.key_fn_by_scheme = key_fn_by_scheme.copy() - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - self.clear() - # Return False to re-raise any potential exceptions - return False - - def _new_pool(self, scheme, host, port, request_context=None): - """ - Create a new :class:`ConnectionPool` based on host, port, scheme, and - any additional pool keyword arguments. - - If ``request_context`` is provided, it is provided as keyword arguments - to the pool class used. This method is used to actually create the - connection pools handed out by :meth:`connection_from_url` and - companion methods. It is intended to be overridden for customization. - """ - pool_cls = self.pool_classes_by_scheme[scheme] - if request_context is None: - request_context = self.connection_pool_kw.copy() - - # Although the context has everything necessary to create the pool, - # this function has historically only used the scheme, host, and port - # in the positional args. When an API change is acceptable these can - # be removed. - for key in ('scheme', 'host', 'port'): - request_context.pop(key, None) - - if scheme == 'http': - for kw in SSL_KEYWORDS: - request_context.pop(kw, None) - - return pool_cls(host, port, **request_context) - - def clear(self): - """ - Empty our store of pools and direct them all to close. - - This will not affect in-flight connections, but they will not be - re-used after completion. - """ - self.pools.clear() - - def connection_from_host(self, host, port=None, scheme='http', pool_kwargs=None): - """ - Get a :class:`ConnectionPool` based on the host, port, and scheme. - - If ``port`` isn't given, it will be derived from the ``scheme`` using - ``urllib3.connectionpool.port_by_scheme``. If ``pool_kwargs`` is - provided, it is merged with the instance's ``connection_pool_kw`` - variable and used to create the new connection pool, if one is - needed. - """ - - if not host: - raise LocationValueError("No host specified.") - - request_context = self._merge_pool_kwargs(pool_kwargs) - request_context['scheme'] = scheme or 'http' - if not port: - port = port_by_scheme.get(request_context['scheme'].lower(), 80) - request_context['port'] = port - request_context['host'] = host - - return self.connection_from_context(request_context) - - def connection_from_context(self, request_context): - """ - Get a :class:`ConnectionPool` based on the request context. - - ``request_context`` must at least contain the ``scheme`` key and its - value must be a key in ``key_fn_by_scheme`` instance variable. - """ - scheme = request_context['scheme'].lower() - pool_key_constructor = self.key_fn_by_scheme[scheme] - pool_key = pool_key_constructor(request_context) - - return self.connection_from_pool_key(pool_key, request_context=request_context) - - def connection_from_pool_key(self, pool_key, request_context=None): - """ - Get a :class:`ConnectionPool` based on the provided pool key. - - ``pool_key`` should be a namedtuple that only contains immutable - objects. At a minimum it must have the ``scheme``, ``host``, and - ``port`` fields. - """ - with self.pools.lock: - # If the scheme, host, or port doesn't match existing open - # connections, open a new ConnectionPool. - pool = self.pools.get(pool_key) - if pool: - return pool - - # Make a fresh ConnectionPool of the desired type - scheme = request_context['scheme'] - host = request_context['host'] - port = request_context['port'] - pool = self._new_pool(scheme, host, port, request_context=request_context) - self.pools[pool_key] = pool - - return pool - - def connection_from_url(self, url, pool_kwargs=None): - """ - Similar to :func:`urllib3.connectionpool.connection_from_url`. - - If ``pool_kwargs`` is not provided and a new pool needs to be - constructed, ``self.connection_pool_kw`` is used to initialize - the :class:`urllib3.connectionpool.ConnectionPool`. If ``pool_kwargs`` - is provided, it is used instead. Note that if a new pool does not - need to be created for the request, the provided ``pool_kwargs`` are - not used. - """ - u = parse_url(url) - return self.connection_from_host(u.host, port=u.port, scheme=u.scheme, - pool_kwargs=pool_kwargs) - - def _merge_pool_kwargs(self, override): - """ - Merge a dictionary of override values for self.connection_pool_kw. - - This does not modify self.connection_pool_kw and returns a new dict. - Any keys in the override dictionary with a value of ``None`` are - removed from the merged dictionary. - """ - base_pool_kwargs = self.connection_pool_kw.copy() - if override: - for key, value in override.items(): - if value is None: - try: - del base_pool_kwargs[key] - except KeyError: - pass - else: - base_pool_kwargs[key] = value - return base_pool_kwargs - - def urlopen(self, method, url, redirect=True, **kw): - """ - Same as :meth:`urllib3.connectionpool.HTTPConnectionPool.urlopen` - with custom cross-host redirect logic and only sends the request-uri - portion of the ``url``. - - The given ``url`` parameter must be absolute, such that an appropriate - :class:`urllib3.connectionpool.ConnectionPool` can be chosen for it. - """ - u = parse_url(url) - conn = self.connection_from_host(u.host, port=u.port, scheme=u.scheme) - - kw['assert_same_host'] = False - kw['redirect'] = False - - if 'headers' not in kw: - kw['headers'] = self.headers.copy() - - if self.proxy is not None and u.scheme == "http": - response = conn.urlopen(method, url, **kw) - else: - response = conn.urlopen(method, u.request_uri, **kw) - - redirect_location = redirect and response.get_redirect_location() - if not redirect_location: - return response - - # Support relative URLs for redirecting. - redirect_location = urljoin(url, redirect_location) - - # RFC 7231, Section 6.4.4 - if response.status == 303: - method = 'GET' - - retries = kw.get('retries') - if not isinstance(retries, Retry): - retries = Retry.from_int(retries, redirect=redirect) - - # Strip headers marked as unsafe to forward to the redirected location. - # Check remove_headers_on_redirect to avoid a potential network call within - # conn.is_same_host() which may use socket.gethostbyname() in the future. - if (retries.remove_headers_on_redirect - and not conn.is_same_host(redirect_location)): - for header in retries.remove_headers_on_redirect: - kw['headers'].pop(header, None) - - try: - retries = retries.increment(method, url, response=response, _pool=conn) - except MaxRetryError: - if retries.raise_on_redirect: - raise - return response - - kw['retries'] = retries - kw['redirect'] = redirect - - log.info("Redirecting %s -> %s", url, redirect_location) - return self.urlopen(method, redirect_location, **kw) - - -class ProxyManager(PoolManager): - """ - Behaves just like :class:`PoolManager`, but sends all requests through - the defined proxy, using the CONNECT method for HTTPS URLs. - - :param proxy_url: - The URL of the proxy to be used. - - :param proxy_headers: - A dictionary containing headers that will be sent to the proxy. In case - of HTTP they are being sent with each request, while in the - HTTPS/CONNECT case they are sent only once. Could be used for proxy - authentication. - - Example: - >>> proxy = urllib3.ProxyManager('http://localhost:3128/') - >>> r1 = proxy.request('GET', 'http://google.com/') - >>> r2 = proxy.request('GET', 'http://httpbin.org/') - >>> len(proxy.pools) - 1 - >>> r3 = proxy.request('GET', 'https://httpbin.org/') - >>> r4 = proxy.request('GET', 'https://twitter.com/') - >>> len(proxy.pools) - 3 - - """ - - def __init__(self, proxy_url, num_pools=10, headers=None, - proxy_headers=None, **connection_pool_kw): - - if isinstance(proxy_url, HTTPConnectionPool): - proxy_url = '%s://%s:%i' % (proxy_url.scheme, proxy_url.host, - proxy_url.port) - proxy = parse_url(proxy_url) - if not proxy.port: - port = port_by_scheme.get(proxy.scheme, 80) - proxy = proxy._replace(port=port) - - if proxy.scheme not in ("http", "https"): - raise ProxySchemeUnknown(proxy.scheme) - - self.proxy = proxy - self.proxy_headers = proxy_headers or {} - - connection_pool_kw['_proxy'] = self.proxy - connection_pool_kw['_proxy_headers'] = self.proxy_headers - - super(ProxyManager, self).__init__( - num_pools, headers, **connection_pool_kw) - - def connection_from_host(self, host, port=None, scheme='http', pool_kwargs=None): - if scheme == "https": - return super(ProxyManager, self).connection_from_host( - host, port, scheme, pool_kwargs=pool_kwargs) - - return super(ProxyManager, self).connection_from_host( - self.proxy.host, self.proxy.port, self.proxy.scheme, pool_kwargs=pool_kwargs) - - def _set_proxy_headers(self, url, headers=None): - """ - Sets headers needed by proxies: specifically, the Accept and Host - headers. Only sets headers not provided by the user. - """ - headers_ = {'Accept': '*/*'} - - netloc = parse_url(url).netloc - if netloc: - headers_['Host'] = netloc - - if headers: - headers_.update(headers) - return headers_ - - def urlopen(self, method, url, redirect=True, **kw): - "Same as HTTP(S)ConnectionPool.urlopen, ``url`` must be absolute." - u = parse_url(url) - - if u.scheme == "http": - # For proxied HTTPS requests, httplib sets the necessary headers - # on the CONNECT to the proxy. For HTTP, we'll definitely - # need to set 'Host' at the very least. - headers = kw.get('headers', self.headers) - kw['headers'] = self._set_proxy_headers(url, headers) - - return super(ProxyManager, self).urlopen(method, url, redirect=redirect, **kw) - - -def proxy_from_url(url, **kw): - return ProxyManager(proxy_url=url, **kw) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/request.py b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/request.py deleted file mode 100644 index 8f2f44b..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/request.py +++ /dev/null @@ -1,150 +0,0 @@ -from __future__ import absolute_import - -from .filepost import encode_multipart_formdata -from .packages.six.moves.urllib.parse import urlencode - - -__all__ = ['RequestMethods'] - - -class RequestMethods(object): - """ - Convenience mixin for classes who implement a :meth:`urlopen` method, such - as :class:`~urllib3.connectionpool.HTTPConnectionPool` and - :class:`~urllib3.poolmanager.PoolManager`. - - Provides behavior for making common types of HTTP request methods and - decides which type of request field encoding to use. - - Specifically, - - :meth:`.request_encode_url` is for sending requests whose fields are - encoded in the URL (such as GET, HEAD, DELETE). - - :meth:`.request_encode_body` is for sending requests whose fields are - encoded in the *body* of the request using multipart or www-form-urlencoded - (such as for POST, PUT, PATCH). - - :meth:`.request` is for making any kind of request, it will look up the - appropriate encoding format and use one of the above two methods to make - the request. - - Initializer parameters: - - :param headers: - Headers to include with all requests, unless other headers are given - explicitly. - """ - - _encode_url_methods = {'DELETE', 'GET', 'HEAD', 'OPTIONS'} - - def __init__(self, headers=None): - self.headers = headers or {} - - def urlopen(self, method, url, body=None, headers=None, - encode_multipart=True, multipart_boundary=None, - **kw): # Abstract - raise NotImplementedError("Classes extending RequestMethods must implement " - "their own ``urlopen`` method.") - - def request(self, method, url, fields=None, headers=None, **urlopen_kw): - """ - Make a request using :meth:`urlopen` with the appropriate encoding of - ``fields`` based on the ``method`` used. - - This is a convenience method that requires the least amount of manual - effort. It can be used in most situations, while still having the - option to drop down to more specific methods when necessary, such as - :meth:`request_encode_url`, :meth:`request_encode_body`, - or even the lowest level :meth:`urlopen`. - """ - method = method.upper() - - urlopen_kw['request_url'] = url - - if method in self._encode_url_methods: - return self.request_encode_url(method, url, fields=fields, - headers=headers, - **urlopen_kw) - else: - return self.request_encode_body(method, url, fields=fields, - headers=headers, - **urlopen_kw) - - def request_encode_url(self, method, url, fields=None, headers=None, - **urlopen_kw): - """ - Make a request using :meth:`urlopen` with the ``fields`` encoded in - the url. This is useful for request methods like GET, HEAD, DELETE, etc. - """ - if headers is None: - headers = self.headers - - extra_kw = {'headers': headers} - extra_kw.update(urlopen_kw) - - if fields: - url += '?' + urlencode(fields) - - return self.urlopen(method, url, **extra_kw) - - def request_encode_body(self, method, url, fields=None, headers=None, - encode_multipart=True, multipart_boundary=None, - **urlopen_kw): - """ - Make a request using :meth:`urlopen` with the ``fields`` encoded in - the body. This is useful for request methods like POST, PUT, PATCH, etc. - - When ``encode_multipart=True`` (default), then - :meth:`urllib3.filepost.encode_multipart_formdata` is used to encode - the payload with the appropriate content type. Otherwise - :meth:`urllib.urlencode` is used with the - 'application/x-www-form-urlencoded' content type. - - Multipart encoding must be used when posting files, and it's reasonably - safe to use it in other times too. However, it may break request - signing, such as with OAuth. - - Supports an optional ``fields`` parameter of key/value strings AND - key/filetuple. A filetuple is a (filename, data, MIME type) tuple where - the MIME type is optional. For example:: - - fields = { - 'foo': 'bar', - 'fakefile': ('foofile.txt', 'contents of foofile'), - 'realfile': ('barfile.txt', open('realfile').read()), - 'typedfile': ('bazfile.bin', open('bazfile').read(), - 'image/jpeg'), - 'nonamefile': 'contents of nonamefile field', - } - - When uploading a file, providing a filename (the first parameter of the - tuple) is optional but recommended to best mimic behavior of browsers. - - Note that if ``headers`` are supplied, the 'Content-Type' header will - be overwritten because it depends on the dynamic random boundary string - which is used to compose the body of the request. The random boundary - string can be explicitly set with the ``multipart_boundary`` parameter. - """ - if headers is None: - headers = self.headers - - extra_kw = {'headers': {}} - - if fields: - if 'body' in urlopen_kw: - raise TypeError( - "request got values for both 'fields' and 'body', can only specify one.") - - if encode_multipart: - body, content_type = encode_multipart_formdata(fields, boundary=multipart_boundary) - else: - body, content_type = urlencode(fields), 'application/x-www-form-urlencoded' - - extra_kw['body'] = body - extra_kw['headers'] = {'Content-Type': content_type} - - extra_kw['headers'].update(headers) - extra_kw.update(urlopen_kw) - - return self.urlopen(method, url, **extra_kw) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/response.py b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/response.py deleted file mode 100644 index c112690..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/response.py +++ /dev/null @@ -1,705 +0,0 @@ -from __future__ import absolute_import -from contextlib import contextmanager -import zlib -import io -import logging -from socket import timeout as SocketTimeout -from socket import error as SocketError - -from ._collections import HTTPHeaderDict -from .exceptions import ( - BodyNotHttplibCompatible, ProtocolError, DecodeError, ReadTimeoutError, - ResponseNotChunked, IncompleteRead, InvalidHeader -) -from .packages.six import string_types as basestring, PY3 -from .packages.six.moves import http_client as httplib -from .connection import HTTPException, BaseSSLError -from .util.response import is_fp_closed, is_response_to_head - -log = logging.getLogger(__name__) - - -class DeflateDecoder(object): - - def __init__(self): - self._first_try = True - self._data = b'' - self._obj = zlib.decompressobj() - - def __getattr__(self, name): - return getattr(self._obj, name) - - def decompress(self, data): - if not data: - return data - - if not self._first_try: - return self._obj.decompress(data) - - self._data += data - try: - decompressed = self._obj.decompress(data) - if decompressed: - self._first_try = False - self._data = None - return decompressed - except zlib.error: - self._first_try = False - self._obj = zlib.decompressobj(-zlib.MAX_WBITS) - try: - return self.decompress(self._data) - finally: - self._data = None - - -class GzipDecoderState(object): - - FIRST_MEMBER = 0 - OTHER_MEMBERS = 1 - SWALLOW_DATA = 2 - - -class GzipDecoder(object): - - def __init__(self): - self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS) - self._state = GzipDecoderState.FIRST_MEMBER - - def __getattr__(self, name): - return getattr(self._obj, name) - - def decompress(self, data): - ret = bytearray() - if self._state == GzipDecoderState.SWALLOW_DATA or not data: - return bytes(ret) - while True: - try: - ret += self._obj.decompress(data) - except zlib.error: - previous_state = self._state - # Ignore data after the first error - self._state = GzipDecoderState.SWALLOW_DATA - if previous_state == GzipDecoderState.OTHER_MEMBERS: - # Allow trailing garbage acceptable in other gzip clients - return bytes(ret) - raise - data = self._obj.unused_data - if not data: - return bytes(ret) - self._state = GzipDecoderState.OTHER_MEMBERS - self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS) - - -class MultiDecoder(object): - """ - From RFC7231: - If one or more encodings have been applied to a representation, the - sender that applied the encodings MUST generate a Content-Encoding - header field that lists the content codings in the order in which - they were applied. - """ - - def __init__(self, modes): - self._decoders = [_get_decoder(m.strip()) for m in modes.split(',')] - - def flush(self): - return self._decoders[0].flush() - - def decompress(self, data): - for d in reversed(self._decoders): - data = d.decompress(data) - return data - - -def _get_decoder(mode): - if ',' in mode: - return MultiDecoder(mode) - - if mode == 'gzip': - return GzipDecoder() - - return DeflateDecoder() - - -class HTTPResponse(io.IOBase): - """ - HTTP Response container. - - Backwards-compatible to httplib's HTTPResponse but the response ``body`` is - loaded and decoded on-demand when the ``data`` property is accessed. This - class is also compatible with the Python standard library's :mod:`io` - module, and can hence be treated as a readable object in the context of that - framework. - - Extra parameters for behaviour not present in httplib.HTTPResponse: - - :param preload_content: - If True, the response's body will be preloaded during construction. - - :param decode_content: - If True, will attempt to decode the body based on the - 'content-encoding' header. - - :param original_response: - When this HTTPResponse wrapper is generated from an httplib.HTTPResponse - object, it's convenient to include the original for debug purposes. It's - otherwise unused. - - :param retries: - The retries contains the last :class:`~urllib3.util.retry.Retry` that - was used during the request. - - :param enforce_content_length: - Enforce content length checking. Body returned by server must match - value of Content-Length header, if present. Otherwise, raise error. - """ - - CONTENT_DECODERS = ['gzip', 'deflate'] - REDIRECT_STATUSES = [301, 302, 303, 307, 308] - - def __init__(self, body='', headers=None, status=0, version=0, reason=None, - strict=0, preload_content=True, decode_content=True, - original_response=None, pool=None, connection=None, msg=None, - retries=None, enforce_content_length=False, - request_method=None, request_url=None): - - if isinstance(headers, HTTPHeaderDict): - self.headers = headers - else: - self.headers = HTTPHeaderDict(headers) - self.status = status - self.version = version - self.reason = reason - self.strict = strict - self.decode_content = decode_content - self.retries = retries - self.enforce_content_length = enforce_content_length - - self._decoder = None - self._body = None - self._fp = None - self._original_response = original_response - self._fp_bytes_read = 0 - self.msg = msg - self._request_url = request_url - - if body and isinstance(body, (basestring, bytes)): - self._body = body - - self._pool = pool - self._connection = connection - - if hasattr(body, 'read'): - self._fp = body - - # Are we using the chunked-style of transfer encoding? - self.chunked = False - self.chunk_left = None - tr_enc = self.headers.get('transfer-encoding', '').lower() - # Don't incur the penalty of creating a list and then discarding it - encodings = (enc.strip() for enc in tr_enc.split(",")) - if "chunked" in encodings: - self.chunked = True - - # Determine length of response - self.length_remaining = self._init_length(request_method) - - # If requested, preload the body. - if preload_content and not self._body: - self._body = self.read(decode_content=decode_content) - - def get_redirect_location(self): - """ - Should we redirect and where to? - - :returns: Truthy redirect location string if we got a redirect status - code and valid location. ``None`` if redirect status and no - location. ``False`` if not a redirect status code. - """ - if self.status in self.REDIRECT_STATUSES: - return self.headers.get('location') - - return False - - def release_conn(self): - if not self._pool or not self._connection: - return - - self._pool._put_conn(self._connection) - self._connection = None - - @property - def data(self): - # For backwords-compat with earlier urllib3 0.4 and earlier. - if self._body: - return self._body - - if self._fp: - return self.read(cache_content=True) - - @property - def connection(self): - return self._connection - - def isclosed(self): - return is_fp_closed(self._fp) - - def tell(self): - """ - Obtain the number of bytes pulled over the wire so far. May differ from - the amount of content returned by :meth:``HTTPResponse.read`` if bytes - are encoded on the wire (e.g, compressed). - """ - return self._fp_bytes_read - - def _init_length(self, request_method): - """ - Set initial length value for Response content if available. - """ - length = self.headers.get('content-length') - - if length is not None: - if self.chunked: - # This Response will fail with an IncompleteRead if it can't be - # received as chunked. This method falls back to attempt reading - # the response before raising an exception. - log.warning("Received response with both Content-Length and " - "Transfer-Encoding set. This is expressly forbidden " - "by RFC 7230 sec 3.3.2. Ignoring Content-Length and " - "attempting to process response as Transfer-Encoding: " - "chunked.") - return None - - try: - # RFC 7230 section 3.3.2 specifies multiple content lengths can - # be sent in a single Content-Length header - # (e.g. Content-Length: 42, 42). This line ensures the values - # are all valid ints and that as long as the `set` length is 1, - # all values are the same. Otherwise, the header is invalid. - lengths = set([int(val) for val in length.split(',')]) - if len(lengths) > 1: - raise InvalidHeader("Content-Length contained multiple " - "unmatching values (%s)" % length) - length = lengths.pop() - except ValueError: - length = None - else: - if length < 0: - length = None - - # Convert status to int for comparison - # In some cases, httplib returns a status of "_UNKNOWN" - try: - status = int(self.status) - except ValueError: - status = 0 - - # Check for responses that shouldn't include a body - if status in (204, 304) or 100 <= status < 200 or request_method == 'HEAD': - length = 0 - - return length - - def _init_decoder(self): - """ - Set-up the _decoder attribute if necessary. - """ - # Note: content-encoding value should be case-insensitive, per RFC 7230 - # Section 3.2 - content_encoding = self.headers.get('content-encoding', '').lower() - if self._decoder is None: - if content_encoding in self.CONTENT_DECODERS: - self._decoder = _get_decoder(content_encoding) - elif ',' in content_encoding: - encodings = [e.strip() for e in content_encoding.split(',') if e.strip() in self.CONTENT_DECODERS] - if len(encodings): - self._decoder = _get_decoder(content_encoding) - - def _decode(self, data, decode_content, flush_decoder): - """ - Decode the data passed in and potentially flush the decoder. - """ - try: - if decode_content and self._decoder: - data = self._decoder.decompress(data) - except (IOError, zlib.error) as e: - content_encoding = self.headers.get('content-encoding', '').lower() - raise DecodeError( - "Received response with content-encoding: %s, but " - "failed to decode it." % content_encoding, e) - - if flush_decoder and decode_content: - data += self._flush_decoder() - - return data - - def _flush_decoder(self): - """ - Flushes the decoder. Should only be called if the decoder is actually - being used. - """ - if self._decoder: - buf = self._decoder.decompress(b'') - return buf + self._decoder.flush() - - return b'' - - @contextmanager - def _error_catcher(self): - """ - Catch low-level python exceptions, instead re-raising urllib3 - variants, so that low-level exceptions are not leaked in the - high-level api. - - On exit, release the connection back to the pool. - """ - clean_exit = False - - try: - try: - yield - - except SocketTimeout: - # FIXME: Ideally we'd like to include the url in the ReadTimeoutError but - # there is yet no clean way to get at it from this context. - raise ReadTimeoutError(self._pool, None, 'Read timed out.') - - except BaseSSLError as e: - # FIXME: Is there a better way to differentiate between SSLErrors? - if 'read operation timed out' not in str(e): # Defensive: - # This shouldn't happen but just in case we're missing an edge - # case, let's avoid swallowing SSL errors. - raise - - raise ReadTimeoutError(self._pool, None, 'Read timed out.') - - except (HTTPException, SocketError) as e: - # This includes IncompleteRead. - raise ProtocolError('Connection broken: %r' % e, e) - - # If no exception is thrown, we should avoid cleaning up - # unnecessarily. - clean_exit = True - finally: - # If we didn't terminate cleanly, we need to throw away our - # connection. - if not clean_exit: - # The response may not be closed but we're not going to use it - # anymore so close it now to ensure that the connection is - # released back to the pool. - if self._original_response: - self._original_response.close() - - # Closing the response may not actually be sufficient to close - # everything, so if we have a hold of the connection close that - # too. - if self._connection: - self._connection.close() - - # If we hold the original response but it's closed now, we should - # return the connection back to the pool. - if self._original_response and self._original_response.isclosed(): - self.release_conn() - - def read(self, amt=None, decode_content=None, cache_content=False): - """ - Similar to :meth:`httplib.HTTPResponse.read`, but with two additional - parameters: ``decode_content`` and ``cache_content``. - - :param amt: - How much of the content to read. If specified, caching is skipped - because it doesn't make sense to cache partial content as the full - response. - - :param decode_content: - If True, will attempt to decode the body based on the - 'content-encoding' header. - - :param cache_content: - If True, will save the returned data such that the same result is - returned despite of the state of the underlying file object. This - is useful if you want the ``.data`` property to continue working - after having ``.read()`` the file object. (Overridden if ``amt`` is - set.) - """ - self._init_decoder() - if decode_content is None: - decode_content = self.decode_content - - if self._fp is None: - return - - flush_decoder = False - data = None - - with self._error_catcher(): - if amt is None: - # cStringIO doesn't like amt=None - data = self._fp.read() - flush_decoder = True - else: - cache_content = False - data = self._fp.read(amt) - if amt != 0 and not data: # Platform-specific: Buggy versions of Python. - # Close the connection when no data is returned - # - # This is redundant to what httplib/http.client _should_ - # already do. However, versions of python released before - # December 15, 2012 (http://bugs.python.org/issue16298) do - # not properly close the connection in all cases. There is - # no harm in redundantly calling close. - self._fp.close() - flush_decoder = True - if self.enforce_content_length and self.length_remaining not in (0, None): - # This is an edge case that httplib failed to cover due - # to concerns of backward compatibility. We're - # addressing it here to make sure IncompleteRead is - # raised during streaming, so all calls with incorrect - # Content-Length are caught. - raise IncompleteRead(self._fp_bytes_read, self.length_remaining) - - if data: - self._fp_bytes_read += len(data) - if self.length_remaining is not None: - self.length_remaining -= len(data) - - data = self._decode(data, decode_content, flush_decoder) - - if cache_content: - self._body = data - - return data - - def stream(self, amt=2**16, decode_content=None): - """ - A generator wrapper for the read() method. A call will block until - ``amt`` bytes have been read from the connection or until the - connection is closed. - - :param amt: - How much of the content to read. The generator will return up to - much data per iteration, but may return less. This is particularly - likely when using compressed data. However, the empty string will - never be returned. - - :param decode_content: - If True, will attempt to decode the body based on the - 'content-encoding' header. - """ - if self.chunked and self.supports_chunked_reads(): - for line in self.read_chunked(amt, decode_content=decode_content): - yield line - else: - while not is_fp_closed(self._fp): - data = self.read(amt=amt, decode_content=decode_content) - - if data: - yield data - - @classmethod - def from_httplib(ResponseCls, r, **response_kw): - """ - Given an :class:`httplib.HTTPResponse` instance ``r``, return a - corresponding :class:`urllib3.response.HTTPResponse` object. - - Remaining parameters are passed to the HTTPResponse constructor, along - with ``original_response=r``. - """ - headers = r.msg - - if not isinstance(headers, HTTPHeaderDict): - if PY3: # Python 3 - headers = HTTPHeaderDict(headers.items()) - else: # Python 2 - headers = HTTPHeaderDict.from_httplib(headers) - - # HTTPResponse objects in Python 3 don't have a .strict attribute - strict = getattr(r, 'strict', 0) - resp = ResponseCls(body=r, - headers=headers, - status=r.status, - version=r.version, - reason=r.reason, - strict=strict, - original_response=r, - **response_kw) - return resp - - # Backwards-compatibility methods for httplib.HTTPResponse - def getheaders(self): - return self.headers - - def getheader(self, name, default=None): - return self.headers.get(name, default) - - # Backwards compatibility for http.cookiejar - def info(self): - return self.headers - - # Overrides from io.IOBase - def close(self): - if not self.closed: - self._fp.close() - - if self._connection: - self._connection.close() - - @property - def closed(self): - if self._fp is None: - return True - elif hasattr(self._fp, 'isclosed'): - return self._fp.isclosed() - elif hasattr(self._fp, 'closed'): - return self._fp.closed - else: - return True - - def fileno(self): - if self._fp is None: - raise IOError("HTTPResponse has no file to get a fileno from") - elif hasattr(self._fp, "fileno"): - return self._fp.fileno() - else: - raise IOError("The file-like object this HTTPResponse is wrapped " - "around has no file descriptor") - - def flush(self): - if self._fp is not None and hasattr(self._fp, 'flush'): - return self._fp.flush() - - def readable(self): - # This method is required for `io` module compatibility. - return True - - def readinto(self, b): - # This method is required for `io` module compatibility. - temp = self.read(len(b)) - if len(temp) == 0: - return 0 - else: - b[:len(temp)] = temp - return len(temp) - - def supports_chunked_reads(self): - """ - Checks if the underlying file-like object looks like a - httplib.HTTPResponse object. We do this by testing for the fp - attribute. If it is present we assume it returns raw chunks as - processed by read_chunked(). - """ - return hasattr(self._fp, 'fp') - - def _update_chunk_length(self): - # First, we'll figure out length of a chunk and then - # we'll try to read it from socket. - if self.chunk_left is not None: - return - line = self._fp.fp.readline() - line = line.split(b';', 1)[0] - try: - self.chunk_left = int(line, 16) - except ValueError: - # Invalid chunked protocol response, abort. - self.close() - raise httplib.IncompleteRead(line) - - def _handle_chunk(self, amt): - returned_chunk = None - if amt is None: - chunk = self._fp._safe_read(self.chunk_left) - returned_chunk = chunk - self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. - self.chunk_left = None - elif amt < self.chunk_left: - value = self._fp._safe_read(amt) - self.chunk_left = self.chunk_left - amt - returned_chunk = value - elif amt == self.chunk_left: - value = self._fp._safe_read(amt) - self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. - self.chunk_left = None - returned_chunk = value - else: # amt > self.chunk_left - returned_chunk = self._fp._safe_read(self.chunk_left) - self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. - self.chunk_left = None - return returned_chunk - - def read_chunked(self, amt=None, decode_content=None): - """ - Similar to :meth:`HTTPResponse.read`, but with an additional - parameter: ``decode_content``. - - :param amt: - How much of the content to read. If specified, caching is skipped - because it doesn't make sense to cache partial content as the full - response. - - :param decode_content: - If True, will attempt to decode the body based on the - 'content-encoding' header. - """ - self._init_decoder() - # FIXME: Rewrite this method and make it a class with a better structured logic. - if not self.chunked: - raise ResponseNotChunked( - "Response is not chunked. " - "Header 'transfer-encoding: chunked' is missing.") - if not self.supports_chunked_reads(): - raise BodyNotHttplibCompatible( - "Body should be httplib.HTTPResponse like. " - "It should have have an fp attribute which returns raw chunks.") - - with self._error_catcher(): - # Don't bother reading the body of a HEAD request. - if self._original_response and is_response_to_head(self._original_response): - self._original_response.close() - return - - # If a response is already read and closed - # then return immediately. - if self._fp.fp is None: - return - - while True: - self._update_chunk_length() - if self.chunk_left == 0: - break - chunk = self._handle_chunk(amt) - decoded = self._decode(chunk, decode_content=decode_content, - flush_decoder=False) - if decoded: - yield decoded - - if decode_content: - # On CPython and PyPy, we should never need to flush the - # decoder. However, on Jython we *might* need to, so - # lets defensively do it anyway. - decoded = self._flush_decoder() - if decoded: # Platform-specific: Jython. - yield decoded - - # Chunk content ends with \r\n: discard it. - while True: - line = self._fp.fp.readline() - if not line: - # Some sites may not end with '\r\n'. - break - if line == b'\r\n': - break - - # We read everything; close the "file". - if self._original_response: - self._original_response.close() - - def geturl(self): - """ - Returns the URL that was the source of this response. - If the request that generated this response redirected, this method - will return the final redirect location. - """ - if self.retries is not None and len(self.retries.history): - return self.retries.history[-1].redirect_location - else: - return self._request_url diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__init__.py b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__init__.py deleted file mode 100644 index 2f2770b..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__init__.py +++ /dev/null @@ -1,54 +0,0 @@ -from __future__ import absolute_import -# For backwards compatibility, provide imports that used to be here. -from .connection import is_connection_dropped -from .request import make_headers -from .response import is_fp_closed -from .ssl_ import ( - SSLContext, - HAS_SNI, - IS_PYOPENSSL, - IS_SECURETRANSPORT, - assert_fingerprint, - resolve_cert_reqs, - resolve_ssl_version, - ssl_wrap_socket, -) -from .timeout import ( - current_time, - Timeout, -) - -from .retry import Retry -from .url import ( - get_host, - parse_url, - split_first, - Url, -) -from .wait import ( - wait_for_read, - wait_for_write -) - -__all__ = ( - 'HAS_SNI', - 'IS_PYOPENSSL', - 'IS_SECURETRANSPORT', - 'SSLContext', - 'Retry', - 'Timeout', - 'Url', - 'assert_fingerprint', - 'current_time', - 'is_connection_dropped', - 'is_fp_closed', - 'get_host', - 'parse_url', - 'make_headers', - 'resolve_cert_reqs', - 'resolve_ssl_version', - 'split_first', - 'ssl_wrap_socket', - 'wait_for_read', - 'wait_for_write' -) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 8c4c89ba1e6d0c56f8040ddf4039c2fc0f994b6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 948 zcmZ9KO;6h}7{`;gY0@-(p)XJvY|>8afmPG4(=<RxLz)U|;4n**6&e>J>?GI@FP~?- z>?`@Y6JKGcJ&zG%TB7{)yg2sXe|x{v2_1Oy?~`w%hU5Ig<mstF@CiQk1CTnY%N^ko z*LBibTIV%UCv_V)ctd!^v$4mU!Y96sn>-LL(h?yFMVqumL?Y249nmFS(IY+4Cw)84 z=WAj>24YBtHV^nnjLF!>Exs-`$cC7ZiP$8YVvB6qddOdhZL%$P$PVOf@-mHLXWDrH zrOwnfz2saKywZ$jqAa9-a3AaAOwnbL=WMC7BB!Y=%95q<LnM+bMlV^CGN~|!fvb`( zd7+>mm@tmN92B``ciQ-$_hK5)k4$tF)03~qCx>(BngL|-;lbJB@N}^^k57&lr)H2S z#iXXIEWco~lv%FLnq;8uhS4Q<B)e8-_*7Dg(;H9#;!F>dTbYzp70WB8r!^BTD=As7 zsm=s5{wc7iG|2T9Ow0Re!vq&h)5}6>(<&3G7_B5XZB_CNMM$XE&m@PbI=2ay3JD65 z)O7!*w=&agI+6i6CR+%+A<{>zA^M0hqK)Vw;OaQCi5MV;2oDh<I*1XXi&#f&0Or$I zCZu##=}Iz6C0;laKA(@B*7#si#gw)angFaSiyU0V<xB%jdKCAcU@Pu<d0g4}=o>ip zC>l3nJc-WPotZkA_0I;ZV%(@{pgYgHjZbO9Ii)`x`5O8bzxQWal(RA`ce7k+=<lZ2 z_xats)g>0~2WOk7g`B}UJUf3st8~U^lx8^`1$|rIo8W^e(u%W>cwZHI8Py^e-#203 Ki`+@G-~0m=68z%; diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-37.pyc deleted file mode 100644 index 046534ffaa1be601afb006781dd9f0e4bee38019..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3123 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-37.pyc deleted file mode 100644 index 7e5a1eafd6bf8df2d1bfc75a7052443a8f7937f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 997 zcmZuvOK;Oa5Z;IFIB8M}^uS;6p$U&Gf(nqhpa{eXOK4@ho8qv3#A{b=m0R;e8gb$; z?UhrHTsbkbsVf&4X=Z2Vv-kUEc3({<BLY@@fAskmCFCb=I`beo1~+dYNFu2wF_BDi zO>-7Ain*tG?!_J@iY@(m>b?r%!CNAI8El9Ql(!5nc^pdmkwk-QIEl=!8N`TMZn862 z{8g)3l_Jy`hvXRCJcgi1OeKk#q>^n&%$2vGl1pzxV}C~z2XY`ozy@*%G$T8Fmo3T< z?pWkP!xjBCxY>u$kSn?+Ya*B=@DrU!-0r2N)+%kXvM|<{3Y672hKO0uD7~;${2(=s z?DxxAlUK7UtB$h5G>O(na&=yuJz0FkqH}So3R%{(w$?iP@@&>NnVz|3r`5UjMOI|Z z9?EeV>BYTU)l-M1|J9D{Yq};&a)~nq-SkFd9Rg&zR)v$e3rJuCu`=0(!nQlIgC3a! z@37$oxJeyAf?QX0O}7;8{AO0naoQlMDrhodJ8my)RQ@-)C#tr&-=p5|Q3I61!*hn~ z?G?E;9r5-qC9lc~TE<@gWjayKApl*IeI|hBQD{RUiX>M;*pU!<DO-*CScp}d=p9mz z@$3l(oLG(8>xURnR4?FcYaasE4Jrz0$j3b7t{M&N0BSa@lJr}0qD+lrjURN|DZKw_ zUY-JgkIeG-pPpLZJ=^$Dv_)%_>?FFXJGIB}<hTnCpYK|EfipB%59yeWS-?X62d7HX ARsaA1 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-37.pyc deleted file mode 100644 index 06c77462a6d679b85ebe7e09ebd5301ba0b288c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3178 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 BlZXHS diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-37.pyc deleted file mode 100644 index b8c57b628ff505a055999c85f438471b0c549215..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1926 zcmZWqPjBQj6t|PiOqx!+OIJv%6<RC=NF&iHXfJ4l5Z$Fx5u#LVK}#hz^~BChI?kWk zPPbFi3+2jpXvK*epC?yN{R*6Tb~5dhjpV=2e((AHe(&Y^+FF3%%l>@)%M+OWV-}0g zfyr0Ul<62^SfCUiVvLx>T;Zhdp=alw=%n4lF3dZu`#U=9u^#hb^w|mvU|eCVFVUcX z16t4k*AM7e<)YL)OwuBk`o`FS{ne?~MHq>MXBw6pyPPsE_o-A#HrbIfmk~B9;4`BS z?FBRyLpS#;bcL?bOXMMqXMubV!y$}*Mw#;p&ASykc5Y>#-;)I(a~YobxAIrZa_uqa z690x7hBvt9Iw0`9nDS_*$eStGQ!WW5ljM|VBu)h16v>Q}e0<C!O%g>Skt@!IfxR~> zsHCZpj_lg#I+*geFY25`#>UVd+dCipn9;G|1oj!%T&79JZ_UTWlA%GT_7l}ut=G4; zmdO}mZR1yW+kGc4>fk3T%4Q#;?SfB#A=!sm{`-7Or^Qy06q`w=G!<f#oy@bd&*G`s zv@L|^vRrPJQix>yY^&6X*pgfod8YWVnAiP8g|R`?yuN2(dIBBt9oNU}xa&Ahw;A2Q zj&dEOxA=BoVVcGF6eb!~fa|ey>8Pg~(7N(;r$U$b8XIgh;A=Q}>0UH*&(2}z!mS+n z8o1HBM(TCtT%rpPba~p>D=}yTnFnXEiYr%29aOk-S?3Q2@OA<3F5L&JSq!$7;!-bR zE(DochAJ|pr<{yAFhG@2#FdImA?5_Yw$K}tch0n=5!~lll$RMm$Qj{=)QZG1PYDo- zKmbdjNgms)!1{%SmOkHSp!H2IfqHpH_UC#E!?XL`YJD1!CViBl%qf>iJa4!((({5Z z^p41pNjiXVxO;H0{~fqaC;VukQPM<lMOu)D{4C;yP5|QJ+qrp1=x^@aZy!h{P#j(j zX<%Y;{sBKLAUz-g3+t`rPsk+K<kwFxhINne7|y7@dUe8eSkSr1DH}NQ0nnjdE3+oL zA)}fOR_h>vDgk88B3}1et@Y~Cqw19dczBxzaV}G;YtO`@?ty*^d15)60ssl9)^%q* z*Id=E(oz~OLSpsW;94K#L)et>7;k#5cQ$>RZq4k!OD$=_<{G@gma>mQ)MUfMKJMba z(}(6^4>F_ctYgpdv3v?=ZnMGEM;DsSh7Vx^6$=5=afP+v@Z$=q(+uicg|FOe$OJQo zTJ^V$_Wx>C!?Tl;D@!zLNN2MaSgaZnQ?k3W{q?5g_Edw}F3p$#E|}{lWnw89lkK9| z$tF;X7L0)>LVb(!ENl4Cu+6T?C=w8l(LKif&>BCouHKke)}FCG@akTeLV3-Z+%UUt zk^v@VQE)kMYJcH%-E9w<%C!{wM^JwjXF{D@2)>0Q%KSFaN*4zh!fc?}8w7O_hH<G& z$-_{ZXdiAAG@3ywsG&;EhG~AvmGnR$A3;|KcbQ<RVT+f=%xYYsf%VFA!T%!7St<CJ S=HI2vPuIZScm4PMkNyLvi5AcR diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-37.pyc deleted file mode 100644 index 1fe8963358ff748bea2204b301a38f27faf8da8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12612 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 V_%*CT*(_yBddZyr3yuDa{{cX^{6zo& diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-37.pyc deleted file mode 100644 index d9c7e1fb60a7ec9d41dbc81e37663e03164a9b67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9504 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-37.pyc deleted file mode 100644 index 026fba1c41dca263ad63f3d63a3fb1cffc11c232..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8727 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-37.pyc deleted file mode 100644 index ec4198ac77639c42ecfefa50ed0adcd91b1a861d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5137 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-37.pyc deleted file mode 100644 index 1e6bd0d7125af2f919418c6ce0d730d78994ae8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3089 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/connection.py b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/connection.py deleted file mode 100644 index 5ad70b2..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/connection.py +++ /dev/null @@ -1,134 +0,0 @@ -from __future__ import absolute_import -import socket -from .wait import NoWayToWaitForSocketError, wait_for_read -from ..contrib import _appengine_environ - - -def is_connection_dropped(conn): # Platform-specific - """ - Returns True if the connection is dropped and should be closed. - - :param conn: - :class:`httplib.HTTPConnection` object. - - Note: For platforms like AppEngine, this will always return ``False`` to - let the platform handle connection recycling transparently for us. - """ - sock = getattr(conn, 'sock', False) - if sock is False: # Platform-specific: AppEngine - return False - if sock is None: # Connection already closed (such as by httplib). - return True - try: - # Returns True if readable, which here means it's been dropped - return wait_for_read(sock, timeout=0.0) - except NoWayToWaitForSocketError: # Platform-specific: AppEngine - return False - - -# This function is copied from socket.py in the Python 2.7 standard -# library test suite. Added to its signature is only `socket_options`. -# One additional modification is that we avoid binding to IPv6 servers -# discovered in DNS if the system doesn't have IPv6 functionality. -def create_connection(address, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, - source_address=None, socket_options=None): - """Connect to *address* and return the socket object. - - Convenience function. Connect to *address* (a 2-tuple ``(host, - port)``) and return the socket object. Passing the optional - *timeout* parameter will set the timeout on the socket instance - before attempting to connect. If no *timeout* is supplied, the - global default timeout setting returned by :func:`getdefaulttimeout` - is used. If *source_address* is set it must be a tuple of (host, port) - for the socket to bind as a source address before making the connection. - An host of '' or port 0 tells the OS to use the default. - """ - - host, port = address - if host.startswith('['): - host = host.strip('[]') - err = None - - # Using the value from allowed_gai_family() in the context of getaddrinfo lets - # us select whether to work with IPv4 DNS records, IPv6 records, or both. - # The original create_connection function always returns all records. - family = allowed_gai_family() - - for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM): - af, socktype, proto, canonname, sa = res - sock = None - try: - sock = socket.socket(af, socktype, proto) - - # If provided, set socket level options before connecting. - _set_socket_options(sock, socket_options) - - if timeout is not socket._GLOBAL_DEFAULT_TIMEOUT: - sock.settimeout(timeout) - if source_address: - sock.bind(source_address) - sock.connect(sa) - return sock - - except socket.error as e: - err = e - if sock is not None: - sock.close() - sock = None - - if err is not None: - raise err - - raise socket.error("getaddrinfo returns an empty list") - - -def _set_socket_options(sock, options): - if options is None: - return - - for opt in options: - sock.setsockopt(*opt) - - -def allowed_gai_family(): - """This function is designed to work in the context of - getaddrinfo, where family=socket.AF_UNSPEC is the default and - will perform a DNS search for both IPv6 and IPv4 records.""" - - family = socket.AF_INET - if HAS_IPV6: - family = socket.AF_UNSPEC - return family - - -def _has_ipv6(host): - """ Returns True if the system can bind an IPv6 address. """ - sock = None - has_ipv6 = False - - # App Engine doesn't support IPV6 sockets and actually has a quota on the - # number of sockets that can be used, so just early out here instead of - # creating a socket needlessly. - # See https://github.com/urllib3/urllib3/issues/1446 - if _appengine_environ.is_appengine_sandbox(): - return False - - if socket.has_ipv6: - # has_ipv6 returns true if cPython was compiled with IPv6 support. - # It does not tell us if the system has IPv6 support enabled. To - # determine that we must bind to an IPv6 address. - # https://github.com/shazow/urllib3/pull/611 - # https://bugs.python.org/issue658327 - try: - sock = socket.socket(socket.AF_INET6) - sock.bind((host, 0)) - has_ipv6 = True - except Exception: - pass - - if sock: - sock.close() - return has_ipv6 - - -HAS_IPV6 = _has_ipv6('::1') diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/queue.py b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/queue.py deleted file mode 100644 index d3d379a..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/queue.py +++ /dev/null @@ -1,21 +0,0 @@ -import collections -from ..packages import six -from ..packages.six.moves import queue - -if six.PY2: - # Queue is imported for side effects on MS Windows. See issue #229. - import Queue as _unused_module_Queue # noqa: F401 - - -class LifoQueue(queue.Queue): - def _init(self, _): - self.queue = collections.deque() - - def _qsize(self, len=len): - return len(self.queue) - - def _put(self, item): - self.queue.append(item) - - def _get(self): - return self.queue.pop() diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/request.py b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/request.py deleted file mode 100644 index 3ddfcd5..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/request.py +++ /dev/null @@ -1,118 +0,0 @@ -from __future__ import absolute_import -from base64 import b64encode - -from ..packages.six import b, integer_types -from ..exceptions import UnrewindableBodyError - -ACCEPT_ENCODING = 'gzip,deflate' -_FAILEDTELL = object() - - -def make_headers(keep_alive=None, accept_encoding=None, user_agent=None, - basic_auth=None, proxy_basic_auth=None, disable_cache=None): - """ - Shortcuts for generating request headers. - - :param keep_alive: - If ``True``, adds 'connection: keep-alive' header. - - :param accept_encoding: - Can be a boolean, list, or string. - ``True`` translates to 'gzip,deflate'. - List will get joined by comma. - String will be used as provided. - - :param user_agent: - String representing the user-agent you want, such as - "python-urllib3/0.6" - - :param basic_auth: - Colon-separated username:password string for 'authorization: basic ...' - auth header. - - :param proxy_basic_auth: - Colon-separated username:password string for 'proxy-authorization: basic ...' - auth header. - - :param disable_cache: - If ``True``, adds 'cache-control: no-cache' header. - - Example:: - - >>> make_headers(keep_alive=True, user_agent="Batman/1.0") - {'connection': 'keep-alive', 'user-agent': 'Batman/1.0'} - >>> make_headers(accept_encoding=True) - {'accept-encoding': 'gzip,deflate'} - """ - headers = {} - if accept_encoding: - if isinstance(accept_encoding, str): - pass - elif isinstance(accept_encoding, list): - accept_encoding = ','.join(accept_encoding) - else: - accept_encoding = ACCEPT_ENCODING - headers['accept-encoding'] = accept_encoding - - if user_agent: - headers['user-agent'] = user_agent - - if keep_alive: - headers['connection'] = 'keep-alive' - - if basic_auth: - headers['authorization'] = 'Basic ' + \ - b64encode(b(basic_auth)).decode('utf-8') - - if proxy_basic_auth: - headers['proxy-authorization'] = 'Basic ' + \ - b64encode(b(proxy_basic_auth)).decode('utf-8') - - if disable_cache: - headers['cache-control'] = 'no-cache' - - return headers - - -def set_file_position(body, pos): - """ - If a position is provided, move file to that point. - Otherwise, we'll attempt to record a position for future use. - """ - if pos is not None: - rewind_body(body, pos) - elif getattr(body, 'tell', None) is not None: - try: - pos = body.tell() - except (IOError, OSError): - # This differentiates from None, allowing us to catch - # a failed `tell()` later when trying to rewind the body. - pos = _FAILEDTELL - - return pos - - -def rewind_body(body, body_pos): - """ - Attempt to rewind body to a certain position. - Primarily used for request redirects and retries. - - :param body: - File-like object that supports seek. - - :param int pos: - Position to seek to in file. - """ - body_seek = getattr(body, 'seek', None) - if body_seek is not None and isinstance(body_pos, integer_types): - try: - body_seek(body_pos) - except (IOError, OSError): - raise UnrewindableBodyError("An error occurred when rewinding request " - "body for redirect/retry.") - elif body_pos is _FAILEDTELL: - raise UnrewindableBodyError("Unable to record file position for rewinding " - "request body during a redirect/retry.") - else: - raise ValueError("body_pos must be of type integer, " - "instead it was %s." % type(body_pos)) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/response.py b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/response.py deleted file mode 100644 index 3d54864..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/response.py +++ /dev/null @@ -1,87 +0,0 @@ -from __future__ import absolute_import -from ..packages.six.moves import http_client as httplib - -from ..exceptions import HeaderParsingError - - -def is_fp_closed(obj): - """ - Checks whether a given file-like object is closed. - - :param obj: - The file-like object to check. - """ - - try: - # Check `isclosed()` first, in case Python3 doesn't set `closed`. - # GH Issue #928 - return obj.isclosed() - except AttributeError: - pass - - try: - # Check via the official file-like-object way. - return obj.closed - except AttributeError: - pass - - try: - # Check if the object is a container for another file-like object that - # gets released on exhaustion (e.g. HTTPResponse). - return obj.fp is None - except AttributeError: - pass - - raise ValueError("Unable to determine whether fp is closed.") - - -def assert_header_parsing(headers): - """ - Asserts whether all headers have been successfully parsed. - Extracts encountered errors from the result of parsing headers. - - Only works on Python 3. - - :param headers: Headers to verify. - :type headers: `httplib.HTTPMessage`. - - :raises urllib3.exceptions.HeaderParsingError: - If parsing errors are found. - """ - - # This will fail silently if we pass in the wrong kind of parameter. - # To make debugging easier add an explicit check. - if not isinstance(headers, httplib.HTTPMessage): - raise TypeError('expected httplib.Message, got {0}.'.format( - type(headers))) - - defects = getattr(headers, 'defects', None) - get_payload = getattr(headers, 'get_payload', None) - - unparsed_data = None - if get_payload: - # get_payload is actually email.message.Message.get_payload; - # we're only interested in the result if it's not a multipart message - if not headers.is_multipart(): - payload = get_payload() - - if isinstance(payload, (bytes, str)): - unparsed_data = payload - - if defects or unparsed_data: - raise HeaderParsingError(defects=defects, unparsed_data=unparsed_data) - - -def is_response_to_head(response): - """ - Checks whether the request of a response has been a HEAD-request. - Handles the quirks of AppEngine. - - :param conn: - :type conn: :class:`httplib.HTTPResponse` - """ - # FIXME: Can we do this somehow without accessing private httplib _method? - method = response._method - if isinstance(method, int): # Platform-specific: Appengine - return method == 3 - return method.upper() == 'HEAD' diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/retry.py b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/retry.py deleted file mode 100644 index e7d0abd..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/retry.py +++ /dev/null @@ -1,411 +0,0 @@ -from __future__ import absolute_import -import time -import logging -from collections import namedtuple -from itertools import takewhile -import email -import re - -from ..exceptions import ( - ConnectTimeoutError, - MaxRetryError, - ProtocolError, - ReadTimeoutError, - ResponseError, - InvalidHeader, -) -from ..packages import six - - -log = logging.getLogger(__name__) - - -# Data structure for representing the metadata of requests that result in a retry. -RequestHistory = namedtuple('RequestHistory', ["method", "url", "error", - "status", "redirect_location"]) - - -class Retry(object): - """ Retry configuration. - - Each retry attempt will create a new Retry object with updated values, so - they can be safely reused. - - Retries can be defined as a default for a pool:: - - retries = Retry(connect=5, read=2, redirect=5) - http = PoolManager(retries=retries) - response = http.request('GET', 'http://example.com/') - - Or per-request (which overrides the default for the pool):: - - response = http.request('GET', 'http://example.com/', retries=Retry(10)) - - Retries can be disabled by passing ``False``:: - - response = http.request('GET', 'http://example.com/', retries=False) - - Errors will be wrapped in :class:`~urllib3.exceptions.MaxRetryError` unless - retries are disabled, in which case the causing exception will be raised. - - :param int total: - Total number of retries to allow. Takes precedence over other counts. - - Set to ``None`` to remove this constraint and fall back on other - counts. It's a good idea to set this to some sensibly-high value to - account for unexpected edge cases and avoid infinite retry loops. - - Set to ``0`` to fail on the first retry. - - Set to ``False`` to disable and imply ``raise_on_redirect=False``. - - :param int connect: - How many connection-related errors to retry on. - - These are errors raised before the request is sent to the remote server, - which we assume has not triggered the server to process the request. - - Set to ``0`` to fail on the first retry of this type. - - :param int read: - How many times to retry on read errors. - - These errors are raised after the request was sent to the server, so the - request may have side-effects. - - Set to ``0`` to fail on the first retry of this type. - - :param int redirect: - How many redirects to perform. Limit this to avoid infinite redirect - loops. - - A redirect is a HTTP response with a status code 301, 302, 303, 307 or - 308. - - Set to ``0`` to fail on the first retry of this type. - - Set to ``False`` to disable and imply ``raise_on_redirect=False``. - - :param int status: - How many times to retry on bad status codes. - - These are retries made on responses, where status code matches - ``status_forcelist``. - - Set to ``0`` to fail on the first retry of this type. - - :param iterable method_whitelist: - Set of uppercased HTTP method verbs that we should retry on. - - By default, we only retry on methods which are considered to be - idempotent (multiple requests with the same parameters end with the - same state). See :attr:`Retry.DEFAULT_METHOD_WHITELIST`. - - Set to a ``False`` value to retry on any verb. - - :param iterable status_forcelist: - A set of integer HTTP status codes that we should force a retry on. - A retry is initiated if the request method is in ``method_whitelist`` - and the response status code is in ``status_forcelist``. - - By default, this is disabled with ``None``. - - :param float backoff_factor: - A backoff factor to apply between attempts after the second try - (most errors are resolved immediately by a second try without a - delay). urllib3 will sleep for:: - - {backoff factor} * (2 ** ({number of total retries} - 1)) - - seconds. If the backoff_factor is 0.1, then :func:`.sleep` will sleep - for [0.0s, 0.2s, 0.4s, ...] between retries. It will never be longer - than :attr:`Retry.BACKOFF_MAX`. - - By default, backoff is disabled (set to 0). - - :param bool raise_on_redirect: Whether, if the number of redirects is - exhausted, to raise a MaxRetryError, or to return a response with a - response code in the 3xx range. - - :param bool raise_on_status: Similar meaning to ``raise_on_redirect``: - whether we should raise an exception, or return a response, - if status falls in ``status_forcelist`` range and retries have - been exhausted. - - :param tuple history: The history of the request encountered during - each call to :meth:`~Retry.increment`. The list is in the order - the requests occurred. Each list item is of class :class:`RequestHistory`. - - :param bool respect_retry_after_header: - Whether to respect Retry-After header on status codes defined as - :attr:`Retry.RETRY_AFTER_STATUS_CODES` or not. - - :param iterable remove_headers_on_redirect: - Sequence of headers to remove from the request when a response - indicating a redirect is returned before firing off the redirected - request. - """ - - DEFAULT_METHOD_WHITELIST = frozenset([ - 'HEAD', 'GET', 'PUT', 'DELETE', 'OPTIONS', 'TRACE']) - - RETRY_AFTER_STATUS_CODES = frozenset([413, 429, 503]) - - DEFAULT_REDIRECT_HEADERS_BLACKLIST = frozenset(['Authorization']) - - #: Maximum backoff time. - BACKOFF_MAX = 120 - - def __init__(self, total=10, connect=None, read=None, redirect=None, status=None, - method_whitelist=DEFAULT_METHOD_WHITELIST, status_forcelist=None, - backoff_factor=0, raise_on_redirect=True, raise_on_status=True, - history=None, respect_retry_after_header=True, - remove_headers_on_redirect=DEFAULT_REDIRECT_HEADERS_BLACKLIST): - - self.total = total - self.connect = connect - self.read = read - self.status = status - - if redirect is False or total is False: - redirect = 0 - raise_on_redirect = False - - self.redirect = redirect - self.status_forcelist = status_forcelist or set() - self.method_whitelist = method_whitelist - self.backoff_factor = backoff_factor - self.raise_on_redirect = raise_on_redirect - self.raise_on_status = raise_on_status - self.history = history or tuple() - self.respect_retry_after_header = respect_retry_after_header - self.remove_headers_on_redirect = remove_headers_on_redirect - - def new(self, **kw): - params = dict( - total=self.total, - connect=self.connect, read=self.read, redirect=self.redirect, status=self.status, - method_whitelist=self.method_whitelist, - status_forcelist=self.status_forcelist, - backoff_factor=self.backoff_factor, - raise_on_redirect=self.raise_on_redirect, - raise_on_status=self.raise_on_status, - history=self.history, - remove_headers_on_redirect=self.remove_headers_on_redirect - ) - params.update(kw) - return type(self)(**params) - - @classmethod - def from_int(cls, retries, redirect=True, default=None): - """ Backwards-compatibility for the old retries format.""" - if retries is None: - retries = default if default is not None else cls.DEFAULT - - if isinstance(retries, Retry): - return retries - - redirect = bool(redirect) and None - new_retries = cls(retries, redirect=redirect) - log.debug("Converted retries value: %r -> %r", retries, new_retries) - return new_retries - - def get_backoff_time(self): - """ Formula for computing the current backoff - - :rtype: float - """ - # We want to consider only the last consecutive errors sequence (Ignore redirects). - consecutive_errors_len = len(list(takewhile(lambda x: x.redirect_location is None, - reversed(self.history)))) - if consecutive_errors_len <= 1: - return 0 - - backoff_value = self.backoff_factor * (2 ** (consecutive_errors_len - 1)) - return min(self.BACKOFF_MAX, backoff_value) - - def parse_retry_after(self, retry_after): - # Whitespace: https://tools.ietf.org/html/rfc7230#section-3.2.4 - if re.match(r"^\s*[0-9]+\s*$", retry_after): - seconds = int(retry_after) - else: - retry_date_tuple = email.utils.parsedate(retry_after) - if retry_date_tuple is None: - raise InvalidHeader("Invalid Retry-After header: %s" % retry_after) - retry_date = time.mktime(retry_date_tuple) - seconds = retry_date - time.time() - - if seconds < 0: - seconds = 0 - - return seconds - - def get_retry_after(self, response): - """ Get the value of Retry-After in seconds. """ - - retry_after = response.getheader("Retry-After") - - if retry_after is None: - return None - - return self.parse_retry_after(retry_after) - - def sleep_for_retry(self, response=None): - retry_after = self.get_retry_after(response) - if retry_after: - time.sleep(retry_after) - return True - - return False - - def _sleep_backoff(self): - backoff = self.get_backoff_time() - if backoff <= 0: - return - time.sleep(backoff) - - def sleep(self, response=None): - """ Sleep between retry attempts. - - This method will respect a server's ``Retry-After`` response header - and sleep the duration of the time requested. If that is not present, it - will use an exponential backoff. By default, the backoff factor is 0 and - this method will return immediately. - """ - - if response: - slept = self.sleep_for_retry(response) - if slept: - return - - self._sleep_backoff() - - def _is_connection_error(self, err): - """ Errors when we're fairly sure that the server did not receive the - request, so it should be safe to retry. - """ - return isinstance(err, ConnectTimeoutError) - - def _is_read_error(self, err): - """ Errors that occur after the request has been started, so we should - assume that the server began processing it. - """ - return isinstance(err, (ReadTimeoutError, ProtocolError)) - - def _is_method_retryable(self, method): - """ Checks if a given HTTP method should be retried upon, depending if - it is included on the method whitelist. - """ - if self.method_whitelist and method.upper() not in self.method_whitelist: - return False - - return True - - def is_retry(self, method, status_code, has_retry_after=False): - """ Is this method/status code retryable? (Based on whitelists and control - variables such as the number of total retries to allow, whether to - respect the Retry-After header, whether this header is present, and - whether the returned status code is on the list of status codes to - be retried upon on the presence of the aforementioned header) - """ - if not self._is_method_retryable(method): - return False - - if self.status_forcelist and status_code in self.status_forcelist: - return True - - return (self.total and self.respect_retry_after_header and - has_retry_after and (status_code in self.RETRY_AFTER_STATUS_CODES)) - - def is_exhausted(self): - """ Are we out of retries? """ - retry_counts = (self.total, self.connect, self.read, self.redirect, self.status) - retry_counts = list(filter(None, retry_counts)) - if not retry_counts: - return False - - return min(retry_counts) < 0 - - def increment(self, method=None, url=None, response=None, error=None, - _pool=None, _stacktrace=None): - """ Return a new Retry object with incremented retry counters. - - :param response: A response object, or None, if the server did not - return a response. - :type response: :class:`~urllib3.response.HTTPResponse` - :param Exception error: An error encountered during the request, or - None if the response was received successfully. - - :return: A new ``Retry`` object. - """ - if self.total is False and error: - # Disabled, indicate to re-raise the error. - raise six.reraise(type(error), error, _stacktrace) - - total = self.total - if total is not None: - total -= 1 - - connect = self.connect - read = self.read - redirect = self.redirect - status_count = self.status - cause = 'unknown' - status = None - redirect_location = None - - if error and self._is_connection_error(error): - # Connect retry? - if connect is False: - raise six.reraise(type(error), error, _stacktrace) - elif connect is not None: - connect -= 1 - - elif error and self._is_read_error(error): - # Read retry? - if read is False or not self._is_method_retryable(method): - raise six.reraise(type(error), error, _stacktrace) - elif read is not None: - read -= 1 - - elif response and response.get_redirect_location(): - # Redirect retry? - if redirect is not None: - redirect -= 1 - cause = 'too many redirects' - redirect_location = response.get_redirect_location() - status = response.status - - else: - # Incrementing because of a server error like a 500 in - # status_forcelist and a the given method is in the whitelist - cause = ResponseError.GENERIC_ERROR - if response and response.status: - if status_count is not None: - status_count -= 1 - cause = ResponseError.SPECIFIC_ERROR.format( - status_code=response.status) - status = response.status - - history = self.history + (RequestHistory(method, url, error, status, redirect_location),) - - new_retry = self.new( - total=total, - connect=connect, read=read, redirect=redirect, status=status_count, - history=history) - - if new_retry.is_exhausted(): - raise MaxRetryError(_pool, url, error or ResponseError(cause)) - - log.debug("Incremented Retry for (url='%s'): %r", url, new_retry) - - return new_retry - - def __repr__(self): - return ('{cls.__name__}(total={self.total}, connect={self.connect}, ' - 'read={self.read}, redirect={self.redirect}, status={self.status})').format( - cls=type(self), self=self) - - -# For backwards compatibility (equivalent to pre-v1.9): -Retry.DEFAULT = Retry(3) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/ssl_.py b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/ssl_.py deleted file mode 100644 index dfc553f..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/ssl_.py +++ /dev/null @@ -1,381 +0,0 @@ -from __future__ import absolute_import -import errno -import warnings -import hmac -import socket - -from binascii import hexlify, unhexlify -from hashlib import md5, sha1, sha256 - -from ..exceptions import SSLError, InsecurePlatformWarning, SNIMissingWarning -from ..packages import six - - -SSLContext = None -HAS_SNI = False -IS_PYOPENSSL = False -IS_SECURETRANSPORT = False - -# Maps the length of a digest to a possible hash function producing this digest -HASHFUNC_MAP = { - 32: md5, - 40: sha1, - 64: sha256, -} - - -def _const_compare_digest_backport(a, b): - """ - Compare two digests of equal length in constant time. - - The digests must be of type str/bytes. - Returns True if the digests match, and False otherwise. - """ - result = abs(len(a) - len(b)) - for l, r in zip(bytearray(a), bytearray(b)): - result |= l ^ r - return result == 0 - - -_const_compare_digest = getattr(hmac, 'compare_digest', - _const_compare_digest_backport) - - -try: # Test for SSL features - import ssl - from ssl import wrap_socket, CERT_NONE, PROTOCOL_SSLv23 - from ssl import HAS_SNI # Has SNI? -except ImportError: - pass - - -try: - from ssl import OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_COMPRESSION -except ImportError: - OP_NO_SSLv2, OP_NO_SSLv3 = 0x1000000, 0x2000000 - OP_NO_COMPRESSION = 0x20000 - - -# Python 2.7 doesn't have inet_pton on non-Linux so we fallback on inet_aton in -# those cases. This means that we can only detect IPv4 addresses in this case. -if hasattr(socket, 'inet_pton'): - inet_pton = socket.inet_pton -else: - # Maybe we can use ipaddress if the user has urllib3[secure]? - try: - from pip._vendor import ipaddress - - def inet_pton(_, host): - if isinstance(host, bytes): - host = host.decode('ascii') - return ipaddress.ip_address(host) - - except ImportError: # Platform-specific: Non-Linux - def inet_pton(_, host): - return socket.inet_aton(host) - - -# A secure default. -# Sources for more information on TLS ciphers: -# -# - https://wiki.mozilla.org/Security/Server_Side_TLS -# - https://www.ssllabs.com/projects/best-practices/index.html -# - https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/ -# -# The general intent is: -# - Prefer TLS 1.3 cipher suites -# - prefer cipher suites that offer perfect forward secrecy (DHE/ECDHE), -# - prefer ECDHE over DHE for better performance, -# - prefer any AES-GCM and ChaCha20 over any AES-CBC for better performance and -# security, -# - prefer AES-GCM over ChaCha20 because hardware-accelerated AES is common, -# - disable NULL authentication, MD5 MACs and DSS for security reasons. -DEFAULT_CIPHERS = ':'.join([ - 'TLS13-AES-256-GCM-SHA384', - 'TLS13-CHACHA20-POLY1305-SHA256', - 'TLS13-AES-128-GCM-SHA256', - 'ECDH+AESGCM', - 'ECDH+CHACHA20', - 'DH+AESGCM', - 'DH+CHACHA20', - 'ECDH+AES256', - 'DH+AES256', - 'ECDH+AES128', - 'DH+AES', - 'RSA+AESGCM', - 'RSA+AES', - '!aNULL', - '!eNULL', - '!MD5', -]) - -try: - from ssl import SSLContext # Modern SSL? -except ImportError: - import sys - - class SSLContext(object): # Platform-specific: Python 2 - def __init__(self, protocol_version): - self.protocol = protocol_version - # Use default values from a real SSLContext - self.check_hostname = False - self.verify_mode = ssl.CERT_NONE - self.ca_certs = None - self.options = 0 - self.certfile = None - self.keyfile = None - self.ciphers = None - - def load_cert_chain(self, certfile, keyfile): - self.certfile = certfile - self.keyfile = keyfile - - def load_verify_locations(self, cafile=None, capath=None): - self.ca_certs = cafile - - if capath is not None: - raise SSLError("CA directories not supported in older Pythons") - - def set_ciphers(self, cipher_suite): - self.ciphers = cipher_suite - - def wrap_socket(self, socket, server_hostname=None, server_side=False): - warnings.warn( - 'A true SSLContext object is not available. This prevents ' - 'urllib3 from configuring SSL appropriately and may cause ' - 'certain SSL connections to fail. You can upgrade to a newer ' - 'version of Python to solve this. For more information, see ' - 'https://urllib3.readthedocs.io/en/latest/advanced-usage.html' - '#ssl-warnings', - InsecurePlatformWarning - ) - kwargs = { - 'keyfile': self.keyfile, - 'certfile': self.certfile, - 'ca_certs': self.ca_certs, - 'cert_reqs': self.verify_mode, - 'ssl_version': self.protocol, - 'server_side': server_side, - } - return wrap_socket(socket, ciphers=self.ciphers, **kwargs) - - -def assert_fingerprint(cert, fingerprint): - """ - Checks if given fingerprint matches the supplied certificate. - - :param cert: - Certificate as bytes object. - :param fingerprint: - Fingerprint as string of hexdigits, can be interspersed by colons. - """ - - fingerprint = fingerprint.replace(':', '').lower() - digest_length = len(fingerprint) - hashfunc = HASHFUNC_MAP.get(digest_length) - if not hashfunc: - raise SSLError( - 'Fingerprint of invalid length: {0}'.format(fingerprint)) - - # We need encode() here for py32; works on py2 and p33. - fingerprint_bytes = unhexlify(fingerprint.encode()) - - cert_digest = hashfunc(cert).digest() - - if not _const_compare_digest(cert_digest, fingerprint_bytes): - raise SSLError('Fingerprints did not match. Expected "{0}", got "{1}".' - .format(fingerprint, hexlify(cert_digest))) - - -def resolve_cert_reqs(candidate): - """ - Resolves the argument to a numeric constant, which can be passed to - the wrap_socket function/method from the ssl module. - Defaults to :data:`ssl.CERT_NONE`. - If given a string it is assumed to be the name of the constant in the - :mod:`ssl` module or its abbreviation. - (So you can specify `REQUIRED` instead of `CERT_REQUIRED`. - If it's neither `None` nor a string we assume it is already the numeric - constant which can directly be passed to wrap_socket. - """ - if candidate is None: - return CERT_NONE - - if isinstance(candidate, str): - res = getattr(ssl, candidate, None) - if res is None: - res = getattr(ssl, 'CERT_' + candidate) - return res - - return candidate - - -def resolve_ssl_version(candidate): - """ - like resolve_cert_reqs - """ - if candidate is None: - return PROTOCOL_SSLv23 - - if isinstance(candidate, str): - res = getattr(ssl, candidate, None) - if res is None: - res = getattr(ssl, 'PROTOCOL_' + candidate) - return res - - return candidate - - -def create_urllib3_context(ssl_version=None, cert_reqs=None, - options=None, ciphers=None): - """All arguments have the same meaning as ``ssl_wrap_socket``. - - By default, this function does a lot of the same work that - ``ssl.create_default_context`` does on Python 3.4+. It: - - - Disables SSLv2, SSLv3, and compression - - Sets a restricted set of server ciphers - - If you wish to enable SSLv3, you can do:: - - from pip._vendor.urllib3.util import ssl_ - context = ssl_.create_urllib3_context() - context.options &= ~ssl_.OP_NO_SSLv3 - - You can do the same to enable compression (substituting ``COMPRESSION`` - for ``SSLv3`` in the last line above). - - :param ssl_version: - The desired protocol version to use. This will default to - PROTOCOL_SSLv23 which will negotiate the highest protocol that both - the server and your installation of OpenSSL support. - :param cert_reqs: - Whether to require the certificate verification. This defaults to - ``ssl.CERT_REQUIRED``. - :param options: - Specific OpenSSL options. These default to ``ssl.OP_NO_SSLv2``, - ``ssl.OP_NO_SSLv3``, ``ssl.OP_NO_COMPRESSION``. - :param ciphers: - Which cipher suites to allow the server to select. - :returns: - Constructed SSLContext object with specified options - :rtype: SSLContext - """ - context = SSLContext(ssl_version or ssl.PROTOCOL_SSLv23) - - context.set_ciphers(ciphers or DEFAULT_CIPHERS) - - # Setting the default here, as we may have no ssl module on import - cert_reqs = ssl.CERT_REQUIRED if cert_reqs is None else cert_reqs - - if options is None: - options = 0 - # SSLv2 is easily broken and is considered harmful and dangerous - options |= OP_NO_SSLv2 - # SSLv3 has several problems and is now dangerous - options |= OP_NO_SSLv3 - # Disable compression to prevent CRIME attacks for OpenSSL 1.0+ - # (issue #309) - options |= OP_NO_COMPRESSION - - context.options |= options - - context.verify_mode = cert_reqs - if getattr(context, 'check_hostname', None) is not None: # Platform-specific: Python 3.2 - # We do our own verification, including fingerprints and alternative - # hostnames. So disable it here - context.check_hostname = False - return context - - -def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None, - ca_certs=None, server_hostname=None, - ssl_version=None, ciphers=None, ssl_context=None, - ca_cert_dir=None): - """ - All arguments except for server_hostname, ssl_context, and ca_cert_dir have - the same meaning as they do when using :func:`ssl.wrap_socket`. - - :param server_hostname: - When SNI is supported, the expected hostname of the certificate - :param ssl_context: - A pre-made :class:`SSLContext` object. If none is provided, one will - be created using :func:`create_urllib3_context`. - :param ciphers: - A string of ciphers we wish the client to support. - :param ca_cert_dir: - A directory containing CA certificates in multiple separate files, as - supported by OpenSSL's -CApath flag or the capath argument to - SSLContext.load_verify_locations(). - """ - context = ssl_context - if context is None: - # Note: This branch of code and all the variables in it are no longer - # used by urllib3 itself. We should consider deprecating and removing - # this code. - context = create_urllib3_context(ssl_version, cert_reqs, - ciphers=ciphers) - - if ca_certs or ca_cert_dir: - try: - context.load_verify_locations(ca_certs, ca_cert_dir) - except IOError as e: # Platform-specific: Python 2.7 - raise SSLError(e) - # Py33 raises FileNotFoundError which subclasses OSError - # These are not equivalent unless we check the errno attribute - except OSError as e: # Platform-specific: Python 3.3 and beyond - if e.errno == errno.ENOENT: - raise SSLError(e) - raise - elif getattr(context, 'load_default_certs', None) is not None: - # try to load OS default certs; works well on Windows (require Python3.4+) - context.load_default_certs() - - if certfile: - context.load_cert_chain(certfile, keyfile) - - # If we detect server_hostname is an IP address then the SNI - # extension should not be used according to RFC3546 Section 3.1 - # We shouldn't warn the user if SNI isn't available but we would - # not be using SNI anyways due to IP address for server_hostname. - if ((server_hostname is not None and not is_ipaddress(server_hostname)) - or IS_SECURETRANSPORT): - if HAS_SNI and server_hostname is not None: - return context.wrap_socket(sock, server_hostname=server_hostname) - - warnings.warn( - 'An HTTPS request has been made, but the SNI (Server Name ' - 'Indication) extension to TLS is not available on this platform. ' - 'This may cause the server to present an incorrect TLS ' - 'certificate, which can cause validation failures. You can upgrade to ' - 'a newer version of Python to solve this. For more information, see ' - 'https://urllib3.readthedocs.io/en/latest/advanced-usage.html' - '#ssl-warnings', - SNIMissingWarning - ) - - return context.wrap_socket(sock) - - -def is_ipaddress(hostname): - """Detects whether the hostname given is an IP address. - - :param str hostname: Hostname to examine. - :return: True if the hostname is an IP address, False otherwise. - """ - if six.PY3 and isinstance(hostname, bytes): - # IDN A-label bytes are ASCII compatible. - hostname = hostname.decode('ascii') - - families = [socket.AF_INET] - if hasattr(socket, 'AF_INET6'): - families.append(socket.AF_INET6) - - for af in families: - try: - inet_pton(af, hostname) - except (socket.error, ValueError, OSError): - pass - else: - return True - return False diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/timeout.py b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/timeout.py deleted file mode 100644 index cec817e..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/timeout.py +++ /dev/null @@ -1,242 +0,0 @@ -from __future__ import absolute_import -# The default socket timeout, used by httplib to indicate that no timeout was -# specified by the user -from socket import _GLOBAL_DEFAULT_TIMEOUT -import time - -from ..exceptions import TimeoutStateError - -# A sentinel value to indicate that no timeout was specified by the user in -# urllib3 -_Default = object() - - -# Use time.monotonic if available. -current_time = getattr(time, "monotonic", time.time) - - -class Timeout(object): - """ Timeout configuration. - - Timeouts can be defined as a default for a pool:: - - timeout = Timeout(connect=2.0, read=7.0) - http = PoolManager(timeout=timeout) - response = http.request('GET', 'http://example.com/') - - Or per-request (which overrides the default for the pool):: - - response = http.request('GET', 'http://example.com/', timeout=Timeout(10)) - - Timeouts can be disabled by setting all the parameters to ``None``:: - - no_timeout = Timeout(connect=None, read=None) - response = http.request('GET', 'http://example.com/, timeout=no_timeout) - - - :param total: - This combines the connect and read timeouts into one; the read timeout - will be set to the time leftover from the connect attempt. In the - event that both a connect timeout and a total are specified, or a read - timeout and a total are specified, the shorter timeout will be applied. - - Defaults to None. - - :type total: integer, float, or None - - :param connect: - The maximum amount of time to wait for a connection attempt to a server - to succeed. Omitting the parameter will default the connect timeout to - the system default, probably `the global default timeout in socket.py - <http://hg.python.org/cpython/file/603b4d593758/Lib/socket.py#l535>`_. - None will set an infinite timeout for connection attempts. - - :type connect: integer, float, or None - - :param read: - The maximum amount of time to wait between consecutive - read operations for a response from the server. Omitting - the parameter will default the read timeout to the system - default, probably `the global default timeout in socket.py - <http://hg.python.org/cpython/file/603b4d593758/Lib/socket.py#l535>`_. - None will set an infinite timeout. - - :type read: integer, float, or None - - .. note:: - - Many factors can affect the total amount of time for urllib3 to return - an HTTP response. - - For example, Python's DNS resolver does not obey the timeout specified - on the socket. Other factors that can affect total request time include - high CPU load, high swap, the program running at a low priority level, - or other behaviors. - - In addition, the read and total timeouts only measure the time between - read operations on the socket connecting the client and the server, - not the total amount of time for the request to return a complete - response. For most requests, the timeout is raised because the server - has not sent the first byte in the specified time. This is not always - the case; if a server streams one byte every fifteen seconds, a timeout - of 20 seconds will not trigger, even though the request will take - several minutes to complete. - - If your goal is to cut off any request after a set amount of wall clock - time, consider having a second "watcher" thread to cut off a slow - request. - """ - - #: A sentinel object representing the default timeout value - DEFAULT_TIMEOUT = _GLOBAL_DEFAULT_TIMEOUT - - def __init__(self, total=None, connect=_Default, read=_Default): - self._connect = self._validate_timeout(connect, 'connect') - self._read = self._validate_timeout(read, 'read') - self.total = self._validate_timeout(total, 'total') - self._start_connect = None - - def __str__(self): - return '%s(connect=%r, read=%r, total=%r)' % ( - type(self).__name__, self._connect, self._read, self.total) - - @classmethod - def _validate_timeout(cls, value, name): - """ Check that a timeout attribute is valid. - - :param value: The timeout value to validate - :param name: The name of the timeout attribute to validate. This is - used to specify in error messages. - :return: The validated and casted version of the given value. - :raises ValueError: If it is a numeric value less than or equal to - zero, or the type is not an integer, float, or None. - """ - if value is _Default: - return cls.DEFAULT_TIMEOUT - - if value is None or value is cls.DEFAULT_TIMEOUT: - return value - - if isinstance(value, bool): - raise ValueError("Timeout cannot be a boolean value. It must " - "be an int, float or None.") - try: - float(value) - except (TypeError, ValueError): - raise ValueError("Timeout value %s was %s, but it must be an " - "int, float or None." % (name, value)) - - try: - if value <= 0: - raise ValueError("Attempted to set %s timeout to %s, but the " - "timeout cannot be set to a value less " - "than or equal to 0." % (name, value)) - except TypeError: # Python 3 - raise ValueError("Timeout value %s was %s, but it must be an " - "int, float or None." % (name, value)) - - return value - - @classmethod - def from_float(cls, timeout): - """ Create a new Timeout from a legacy timeout value. - - The timeout value used by httplib.py sets the same timeout on the - connect(), and recv() socket requests. This creates a :class:`Timeout` - object that sets the individual timeouts to the ``timeout`` value - passed to this function. - - :param timeout: The legacy timeout value. - :type timeout: integer, float, sentinel default object, or None - :return: Timeout object - :rtype: :class:`Timeout` - """ - return Timeout(read=timeout, connect=timeout) - - def clone(self): - """ Create a copy of the timeout object - - Timeout properties are stored per-pool but each request needs a fresh - Timeout object to ensure each one has its own start/stop configured. - - :return: a copy of the timeout object - :rtype: :class:`Timeout` - """ - # We can't use copy.deepcopy because that will also create a new object - # for _GLOBAL_DEFAULT_TIMEOUT, which socket.py uses as a sentinel to - # detect the user default. - return Timeout(connect=self._connect, read=self._read, - total=self.total) - - def start_connect(self): - """ Start the timeout clock, used during a connect() attempt - - :raises urllib3.exceptions.TimeoutStateError: if you attempt - to start a timer that has been started already. - """ - if self._start_connect is not None: - raise TimeoutStateError("Timeout timer has already been started.") - self._start_connect = current_time() - return self._start_connect - - def get_connect_duration(self): - """ Gets the time elapsed since the call to :meth:`start_connect`. - - :return: Elapsed time. - :rtype: float - :raises urllib3.exceptions.TimeoutStateError: if you attempt - to get duration for a timer that hasn't been started. - """ - if self._start_connect is None: - raise TimeoutStateError("Can't get connect duration for timer " - "that has not started.") - return current_time() - self._start_connect - - @property - def connect_timeout(self): - """ Get the value to use when setting a connection timeout. - - This will be a positive float or integer, the value None - (never timeout), or the default system timeout. - - :return: Connect timeout. - :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None - """ - if self.total is None: - return self._connect - - if self._connect is None or self._connect is self.DEFAULT_TIMEOUT: - return self.total - - return min(self._connect, self.total) - - @property - def read_timeout(self): - """ Get the value for the read timeout. - - This assumes some time has elapsed in the connection timeout and - computes the read timeout appropriately. - - If self.total is set, the read timeout is dependent on the amount of - time taken by the connect timeout. If the connection time has not been - established, a :exc:`~urllib3.exceptions.TimeoutStateError` will be - raised. - - :return: Value to use for the read timeout. - :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None - :raises urllib3.exceptions.TimeoutStateError: If :meth:`start_connect` - has not yet been called on this object. - """ - if (self.total is not None and - self.total is not self.DEFAULT_TIMEOUT and - self._read is not None and - self._read is not self.DEFAULT_TIMEOUT): - # In case the connect timeout has not yet been established. - if self._start_connect is None: - return self._read - return max(0, min(self.total - self.get_connect_duration(), - self._read)) - elif self.total is not None and self.total is not self.DEFAULT_TIMEOUT: - return max(0, self.total - self.get_connect_duration()) - else: - return self._read diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/url.py b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/url.py deleted file mode 100644 index 6b6f996..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/url.py +++ /dev/null @@ -1,230 +0,0 @@ -from __future__ import absolute_import -from collections import namedtuple - -from ..exceptions import LocationParseError - - -url_attrs = ['scheme', 'auth', 'host', 'port', 'path', 'query', 'fragment'] - -# We only want to normalize urls with an HTTP(S) scheme. -# urllib3 infers URLs without a scheme (None) to be http. -NORMALIZABLE_SCHEMES = ('http', 'https', None) - - -class Url(namedtuple('Url', url_attrs)): - """ - Datastructure for representing an HTTP URL. Used as a return value for - :func:`parse_url`. Both the scheme and host are normalized as they are - both case-insensitive according to RFC 3986. - """ - __slots__ = () - - def __new__(cls, scheme=None, auth=None, host=None, port=None, path=None, - query=None, fragment=None): - if path and not path.startswith('/'): - path = '/' + path - if scheme: - scheme = scheme.lower() - if host and scheme in NORMALIZABLE_SCHEMES: - host = host.lower() - return super(Url, cls).__new__(cls, scheme, auth, host, port, path, - query, fragment) - - @property - def hostname(self): - """For backwards-compatibility with urlparse. We're nice like that.""" - return self.host - - @property - def request_uri(self): - """Absolute path including the query string.""" - uri = self.path or '/' - - if self.query is not None: - uri += '?' + self.query - - return uri - - @property - def netloc(self): - """Network location including host and port""" - if self.port: - return '%s:%d' % (self.host, self.port) - return self.host - - @property - def url(self): - """ - Convert self into a url - - This function should more or less round-trip with :func:`.parse_url`. The - returned url may not be exactly the same as the url inputted to - :func:`.parse_url`, but it should be equivalent by the RFC (e.g., urls - with a blank port will have : removed). - - Example: :: - - >>> U = parse_url('http://google.com/mail/') - >>> U.url - 'http://google.com/mail/' - >>> Url('http', 'username:password', 'host.com', 80, - ... '/path', 'query', 'fragment').url - 'http://username:password@host.com:80/path?query#fragment' - """ - scheme, auth, host, port, path, query, fragment = self - url = '' - - # We use "is not None" we want things to happen with empty strings (or 0 port) - if scheme is not None: - url += scheme + '://' - if auth is not None: - url += auth + '@' - if host is not None: - url += host - if port is not None: - url += ':' + str(port) - if path is not None: - url += path - if query is not None: - url += '?' + query - if fragment is not None: - url += '#' + fragment - - return url - - def __str__(self): - return self.url - - -def split_first(s, delims): - """ - Given a string and an iterable of delimiters, split on the first found - delimiter. Return two split parts and the matched delimiter. - - If not found, then the first part is the full input string. - - Example:: - - >>> split_first('foo/bar?baz', '?/=') - ('foo', 'bar?baz', '/') - >>> split_first('foo/bar?baz', '123') - ('foo/bar?baz', '', None) - - Scales linearly with number of delims. Not ideal for large number of delims. - """ - min_idx = None - min_delim = None - for d in delims: - idx = s.find(d) - if idx < 0: - continue - - if min_idx is None or idx < min_idx: - min_idx = idx - min_delim = d - - if min_idx is None or min_idx < 0: - return s, '', None - - return s[:min_idx], s[min_idx + 1:], min_delim - - -def parse_url(url): - """ - Given a url, return a parsed :class:`.Url` namedtuple. Best-effort is - performed to parse incomplete urls. Fields not provided will be None. - - Partly backwards-compatible with :mod:`urlparse`. - - Example:: - - >>> parse_url('http://google.com/mail/') - Url(scheme='http', host='google.com', port=None, path='/mail/', ...) - >>> parse_url('google.com:80') - Url(scheme=None, host='google.com', port=80, path=None, ...) - >>> parse_url('/foo?bar') - Url(scheme=None, host=None, port=None, path='/foo', query='bar', ...) - """ - - # While this code has overlap with stdlib's urlparse, it is much - # simplified for our needs and less annoying. - # Additionally, this implementations does silly things to be optimal - # on CPython. - - if not url: - # Empty - return Url() - - scheme = None - auth = None - host = None - port = None - path = None - fragment = None - query = None - - # Scheme - if '://' in url: - scheme, url = url.split('://', 1) - - # Find the earliest Authority Terminator - # (http://tools.ietf.org/html/rfc3986#section-3.2) - url, path_, delim = split_first(url, ['/', '?', '#']) - - if delim: - # Reassemble the path - path = delim + path_ - - # Auth - if '@' in url: - # Last '@' denotes end of auth part - auth, url = url.rsplit('@', 1) - - # IPv6 - if url and url[0] == '[': - host, url = url.split(']', 1) - host += ']' - - # Port - if ':' in url: - _host, port = url.split(':', 1) - - if not host: - host = _host - - if port: - # If given, ports must be integers. No whitespace, no plus or - # minus prefixes, no non-integer digits such as ^2 (superscript). - if not port.isdigit(): - raise LocationParseError(url) - try: - port = int(port) - except ValueError: - raise LocationParseError(url) - else: - # Blank ports are cool, too. (rfc3986#section-3.2.3) - port = None - - elif not host and url: - host = url - - if not path: - return Url(scheme, auth, host, port, path, query, fragment) - - # Fragment - if '#' in path: - path, fragment = path.split('#', 1) - - # Query - if '?' in path: - path, query = path.split('?', 1) - - return Url(scheme, auth, host, port, path, query, fragment) - - -def get_host(url): - """ - Deprecated. Use :func:`parse_url` instead. - """ - p = parse_url(url) - return p.scheme or 'http', p.hostname, p.port diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/wait.py b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/wait.py deleted file mode 100644 index 4db71ba..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/wait.py +++ /dev/null @@ -1,150 +0,0 @@ -import errno -from functools import partial -import select -import sys -try: - from time import monotonic -except ImportError: - from time import time as monotonic - -__all__ = ["NoWayToWaitForSocketError", "wait_for_read", "wait_for_write"] - - -class NoWayToWaitForSocketError(Exception): - pass - - -# How should we wait on sockets? -# -# There are two types of APIs you can use for waiting on sockets: the fancy -# modern stateful APIs like epoll/kqueue, and the older stateless APIs like -# select/poll. The stateful APIs are more efficient when you have a lots of -# sockets to keep track of, because you can set them up once and then use them -# lots of times. But we only ever want to wait on a single socket at a time -# and don't want to keep track of state, so the stateless APIs are actually -# more efficient. So we want to use select() or poll(). -# -# Now, how do we choose between select() and poll()? On traditional Unixes, -# select() has a strange calling convention that makes it slow, or fail -# altogether, for high-numbered file descriptors. The point of poll() is to fix -# that, so on Unixes, we prefer poll(). -# -# On Windows, there is no poll() (or at least Python doesn't provide a wrapper -# for it), but that's OK, because on Windows, select() doesn't have this -# strange calling convention; plain select() works fine. -# -# So: on Windows we use select(), and everywhere else we use poll(). We also -# fall back to select() in case poll() is somehow broken or missing. - -if sys.version_info >= (3, 5): - # Modern Python, that retries syscalls by default - def _retry_on_intr(fn, timeout): - return fn(timeout) -else: - # Old and broken Pythons. - def _retry_on_intr(fn, timeout): - if timeout is None: - deadline = float("inf") - else: - deadline = monotonic() + timeout - - while True: - try: - return fn(timeout) - # OSError for 3 <= pyver < 3.5, select.error for pyver <= 2.7 - except (OSError, select.error) as e: - # 'e.args[0]' incantation works for both OSError and select.error - if e.args[0] != errno.EINTR: - raise - else: - timeout = deadline - monotonic() - if timeout < 0: - timeout = 0 - if timeout == float("inf"): - timeout = None - continue - - -def select_wait_for_socket(sock, read=False, write=False, timeout=None): - if not read and not write: - raise RuntimeError("must specify at least one of read=True, write=True") - rcheck = [] - wcheck = [] - if read: - rcheck.append(sock) - if write: - wcheck.append(sock) - # When doing a non-blocking connect, most systems signal success by - # marking the socket writable. Windows, though, signals success by marked - # it as "exceptional". We paper over the difference by checking the write - # sockets for both conditions. (The stdlib selectors module does the same - # thing.) - fn = partial(select.select, rcheck, wcheck, wcheck) - rready, wready, xready = _retry_on_intr(fn, timeout) - return bool(rready or wready or xready) - - -def poll_wait_for_socket(sock, read=False, write=False, timeout=None): - if not read and not write: - raise RuntimeError("must specify at least one of read=True, write=True") - mask = 0 - if read: - mask |= select.POLLIN - if write: - mask |= select.POLLOUT - poll_obj = select.poll() - poll_obj.register(sock, mask) - - # For some reason, poll() takes timeout in milliseconds - def do_poll(t): - if t is not None: - t *= 1000 - return poll_obj.poll(t) - - return bool(_retry_on_intr(do_poll, timeout)) - - -def null_wait_for_socket(*args, **kwargs): - raise NoWayToWaitForSocketError("no select-equivalent available") - - -def _have_working_poll(): - # Apparently some systems have a select.poll that fails as soon as you try - # to use it, either due to strange configuration or broken monkeypatching - # from libraries like eventlet/greenlet. - try: - poll_obj = select.poll() - _retry_on_intr(poll_obj.poll, 0) - except (AttributeError, OSError): - return False - else: - return True - - -def wait_for_socket(*args, **kwargs): - # We delay choosing which implementation to use until the first time we're - # called. We could do it at import time, but then we might make the wrong - # decision if someone goes wild with monkeypatching select.poll after - # we're imported. - global wait_for_socket - if _have_working_poll(): - wait_for_socket = poll_wait_for_socket - elif hasattr(select, "select"): - wait_for_socket = select_wait_for_socket - else: # Platform-specific: Appengine. - wait_for_socket = null_wait_for_socket - return wait_for_socket(*args, **kwargs) - - -def wait_for_read(sock, timeout=None): - """ Waits for reading to be available on a given socket. - Returns True if the socket is readable, or False if the timeout expired. - """ - return wait_for_socket(sock, read=True, timeout=timeout) - - -def wait_for_write(sock, timeout=None): - """ Waits for writing to be available on a given socket. - Returns True if the socket is readable, or False if the timeout expired. - """ - return wait_for_socket(sock, write=True, timeout=timeout) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/webencodings/__init__.py b/env/lib/python3.7/site-packages/pip/_vendor/webencodings/__init__.py deleted file mode 100644 index d21d697..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/webencodings/__init__.py +++ /dev/null @@ -1,342 +0,0 @@ -# coding: utf-8 -""" - - webencodings - ~~~~~~~~~~~~ - - This is a Python implementation of the `WHATWG Encoding standard - <http://encoding.spec.whatwg.org/>`. See README for details. - - :copyright: Copyright 2012 by Simon Sapin - :license: BSD, see LICENSE for details. - -""" - -from __future__ import unicode_literals - -import codecs - -from .labels import LABELS - - -VERSION = '0.5.1' - - -# Some names in Encoding are not valid Python aliases. Remap these. -PYTHON_NAMES = { - 'iso-8859-8-i': 'iso-8859-8', - 'x-mac-cyrillic': 'mac-cyrillic', - 'macintosh': 'mac-roman', - 'windows-874': 'cp874'} - -CACHE = {} - - -def ascii_lower(string): - r"""Transform (only) ASCII letters to lower case: A-Z is mapped to a-z. - - :param string: An Unicode string. - :returns: A new Unicode string. - - This is used for `ASCII case-insensitive - <http://encoding.spec.whatwg.org/#ascii-case-insensitive>`_ - matching of encoding labels. - The same matching is also used, among other things, - for `CSS keywords <http://dev.w3.org/csswg/css-values/#keywords>`_. - - This is different from the :meth:`~py:str.lower` method of Unicode strings - which also affect non-ASCII characters, - sometimes mapping them into the ASCII range: - - >>> keyword = u'Bac\N{KELVIN SIGN}ground' - >>> assert keyword.lower() == u'background' - >>> assert ascii_lower(keyword) != keyword.lower() - >>> assert ascii_lower(keyword) == u'bac\N{KELVIN SIGN}ground' - - """ - # This turns out to be faster than unicode.translate() - return string.encode('utf8').lower().decode('utf8') - - -def lookup(label): - """ - Look for an encoding by its label. - This is the spec’s `get an encoding - <http://encoding.spec.whatwg.org/#concept-encoding-get>`_ algorithm. - Supported labels are listed there. - - :param label: A string. - :returns: - An :class:`Encoding` object, or :obj:`None` for an unknown label. - - """ - # Only strip ASCII whitespace: U+0009, U+000A, U+000C, U+000D, and U+0020. - label = ascii_lower(label.strip('\t\n\f\r ')) - name = LABELS.get(label) - if name is None: - return None - encoding = CACHE.get(name) - if encoding is None: - if name == 'x-user-defined': - from .x_user_defined import codec_info - else: - python_name = PYTHON_NAMES.get(name, name) - # Any python_name value that gets to here should be valid. - codec_info = codecs.lookup(python_name) - encoding = Encoding(name, codec_info) - CACHE[name] = encoding - return encoding - - -def _get_encoding(encoding_or_label): - """ - Accept either an encoding object or label. - - :param encoding: An :class:`Encoding` object or a label string. - :returns: An :class:`Encoding` object. - :raises: :exc:`~exceptions.LookupError` for an unknown label. - - """ - if hasattr(encoding_or_label, 'codec_info'): - return encoding_or_label - - encoding = lookup(encoding_or_label) - if encoding is None: - raise LookupError('Unknown encoding label: %r' % encoding_or_label) - return encoding - - -class Encoding(object): - """Reresents a character encoding such as UTF-8, - that can be used for decoding or encoding. - - .. attribute:: name - - Canonical name of the encoding - - .. attribute:: codec_info - - The actual implementation of the encoding, - a stdlib :class:`~codecs.CodecInfo` object. - See :func:`codecs.register`. - - """ - def __init__(self, name, codec_info): - self.name = name - self.codec_info = codec_info - - def __repr__(self): - return '<Encoding %s>' % self.name - - -#: The UTF-8 encoding. Should be used for new content and formats. -UTF8 = lookup('utf-8') - -_UTF16LE = lookup('utf-16le') -_UTF16BE = lookup('utf-16be') - - -def decode(input, fallback_encoding, errors='replace'): - """ - Decode a single string. - - :param input: A byte string - :param fallback_encoding: - An :class:`Encoding` object or a label string. - The encoding to use if :obj:`input` does note have a BOM. - :param errors: Type of error handling. See :func:`codecs.register`. - :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. - :return: - A ``(output, encoding)`` tuple of an Unicode string - and an :obj:`Encoding`. - - """ - # Fail early if `encoding` is an invalid label. - fallback_encoding = _get_encoding(fallback_encoding) - bom_encoding, input = _detect_bom(input) - encoding = bom_encoding or fallback_encoding - return encoding.codec_info.decode(input, errors)[0], encoding - - -def _detect_bom(input): - """Return (bom_encoding, input), with any BOM removed from the input.""" - if input.startswith(b'\xFF\xFE'): - return _UTF16LE, input[2:] - if input.startswith(b'\xFE\xFF'): - return _UTF16BE, input[2:] - if input.startswith(b'\xEF\xBB\xBF'): - return UTF8, input[3:] - return None, input - - -def encode(input, encoding=UTF8, errors='strict'): - """ - Encode a single string. - - :param input: An Unicode string. - :param encoding: An :class:`Encoding` object or a label string. - :param errors: Type of error handling. See :func:`codecs.register`. - :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. - :return: A byte string. - - """ - return _get_encoding(encoding).codec_info.encode(input, errors)[0] - - -def iter_decode(input, fallback_encoding, errors='replace'): - """ - "Pull"-based decoder. - - :param input: - An iterable of byte strings. - - The input is first consumed just enough to determine the encoding - based on the precense of a BOM, - then consumed on demand when the return value is. - :param fallback_encoding: - An :class:`Encoding` object or a label string. - The encoding to use if :obj:`input` does note have a BOM. - :param errors: Type of error handling. See :func:`codecs.register`. - :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. - :returns: - An ``(output, encoding)`` tuple. - :obj:`output` is an iterable of Unicode strings, - :obj:`encoding` is the :obj:`Encoding` that is being used. - - """ - - decoder = IncrementalDecoder(fallback_encoding, errors) - generator = _iter_decode_generator(input, decoder) - encoding = next(generator) - return generator, encoding - - -def _iter_decode_generator(input, decoder): - """Return a generator that first yields the :obj:`Encoding`, - then yields output chukns as Unicode strings. - - """ - decode = decoder.decode - input = iter(input) - for chunck in input: - output = decode(chunck) - if output: - assert decoder.encoding is not None - yield decoder.encoding - yield output - break - else: - # Input exhausted without determining the encoding - output = decode(b'', final=True) - assert decoder.encoding is not None - yield decoder.encoding - if output: - yield output - return - - for chunck in input: - output = decode(chunck) - if output: - yield output - output = decode(b'', final=True) - if output: - yield output - - -def iter_encode(input, encoding=UTF8, errors='strict'): - """ - “Pull”-based encoder. - - :param input: An iterable of Unicode strings. - :param encoding: An :class:`Encoding` object or a label string. - :param errors: Type of error handling. See :func:`codecs.register`. - :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. - :returns: An iterable of byte strings. - - """ - # Fail early if `encoding` is an invalid label. - encode = IncrementalEncoder(encoding, errors).encode - return _iter_encode_generator(input, encode) - - -def _iter_encode_generator(input, encode): - for chunck in input: - output = encode(chunck) - if output: - yield output - output = encode('', final=True) - if output: - yield output - - -class IncrementalDecoder(object): - """ - “Push”-based decoder. - - :param fallback_encoding: - An :class:`Encoding` object or a label string. - The encoding to use if :obj:`input` does note have a BOM. - :param errors: Type of error handling. See :func:`codecs.register`. - :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. - - """ - def __init__(self, fallback_encoding, errors='replace'): - # Fail early if `encoding` is an invalid label. - self._fallback_encoding = _get_encoding(fallback_encoding) - self._errors = errors - self._buffer = b'' - self._decoder = None - #: The actual :class:`Encoding` that is being used, - #: or :obj:`None` if that is not determined yet. - #: (Ie. if there is not enough input yet to determine - #: if there is a BOM.) - self.encoding = None # Not known yet. - - def decode(self, input, final=False): - """Decode one chunk of the input. - - :param input: A byte string. - :param final: - Indicate that no more input is available. - Must be :obj:`True` if this is the last call. - :returns: An Unicode string. - - """ - decoder = self._decoder - if decoder is not None: - return decoder(input, final) - - input = self._buffer + input - encoding, input = _detect_bom(input) - if encoding is None: - if len(input) < 3 and not final: # Not enough data yet. - self._buffer = input - return '' - else: # No BOM - encoding = self._fallback_encoding - decoder = encoding.codec_info.incrementaldecoder(self._errors).decode - self._decoder = decoder - self.encoding = encoding - return decoder(input, final) - - -class IncrementalEncoder(object): - """ - “Push”-based encoder. - - :param encoding: An :class:`Encoding` object or a label string. - :param errors: Type of error handling. See :func:`codecs.register`. - :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. - - .. method:: encode(input, final=False) - - :param input: An Unicode string. - :param final: - Indicate that no more input is available. - Must be :obj:`True` if this is the last call. - :returns: A byte string. - - """ - def __init__(self, encoding=UTF8, errors='strict'): - encoding = _get_encoding(encoding) - self.encode = encoding.codec_info.incrementalencoder(errors).encode diff --git a/env/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 76f58c6e37da6ed78ebe161ed6798616ae9bf668..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9632 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-37.pyc deleted file mode 100644 index 4484d86735af801e6b32e17b65e6bfcdcb128fdf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4046 zcmeHKOLH4V5SDFOlI2$(Ji;Te5C|Buw)UxA7e$2xAE*ks_?9YaYqc|$##-%)9VwRg zz%Sv(i7L(<_#vTcuKWv5^vvvI){cuaRp={cyJvc)d!~E3J5P3Z`z`n-zuf!b?t@nA zFV2*|KY@4*fAo*FRtvRWw9uNsI+EBxSJ6gSv5BstgPQ1~o6$qB#};}W`iNt@fgQxL zE3k)Z?4w&1ZlgN|?xGrRAdWW$-a`L|w-Lv^8}JU|cvs*(#PPnseRLmva19?K4SiJM zW5n?Q@JR!oqU(5w9-`0C=YRwB#m}!^tf4PYTL+Kw-}`+HeiwLzlPE<b8Pmf!9O0OX z@t>~$<bv<RxmK>w<N|GxYKsXbnU;hzd?@9PqjY|mk?~}4tUWDB%^Vn}HoDYK$t+E@ z({N4_q3$>)5l$#R)}EYx`$(f0YtO!Wdh-1AL_13}4dF#dVhUU5o6E(S?y(LT%{<r5 z`-G;t=Q+M^Dzv50wn94!t*#v^<6gc~?dj<x->x`gpfZ-q*ec_wjGK3+De?5I_%7Mj zER0C9Na-Zsz90!oFR1Pf?R=+X4AU7jIHSRt4bEzC&0U<voZH}r4bIE=Ryx?FN8qy< zoWVB6qbci-M}{}B26=yy>*JAbT87EmBQkdK4qit3`CJ~=9GE6BY>Q6F*&;Y6RL)N` zWgeIwcb?&na7o3OD_&BZ=?I^Z1fzpj`R!#wASAJF0ED|sueX8o*akSBZANqc=|xmV zLIw$`#kPT^X&f#{qQ*l(lT0@TM!p3iGGth<Af-T11kyf?7WA><dqcJ!o2(;uRaK~A zR?tF)U#qYx6;eQMYvr{Hi>vTJg;l7qR26FU7Bp7@p;(>5u2e_?slrxN*rf`)P+_w> z^+i=K@0FDD8j2Ugb=r2V)2Vby0jbkbbUIRJC(ObTiSk}ZXQ@6Mc*WuPO}kiS2)k9= zRIb9&EQHglw*X-b?vZca)p3I((sFLCIjpUPFe&^jAHB5JRjhTTpZ9AE#u>)byjK|D zu^x`oMc|tr+Z0o*BR-yTS49>P+TB|Fu+lCCr1qhreJHi>&}9<fWgz#Lq0H~e!|K&c z@F>F<tRugQ`ex$7^;KA2Z44ZwxC&{xG{#em@e0SiBy<_ZiibR++%;rI){WCKi7FZK zK3p~TLEhl5;uqq`vx^623|JYwK(5Db5tWU#^0`QPtCqi#b@~2M#;#>-^#S>+K{8n7 z0;gUe6Slkx!vTvLi(J-?D9_;;+kg*ibGppxOl0?<&hFs0D!;Q0AhUHyO!>A<uUR?^ zle~*knevs|Vu-tvrWv(qM&4Zzs=FrCp0Ykbv0$BOeyvOl^4?09<HdZla2VCRk?(~G zCBe!%v~|OGA*e$d5mGEOMRqlO^&Smbat&XJIBB!+??6dNMipaHptx8i#ta$o>oM#q z!UjxRQeD{4s7q#LG9+Mev}V1ts(HwsV!q*gwcZzoi%h0G2){B`3P@vp#aN#k>qAsH zg|W@DYF8$dUTMxd)jX^hCN>MPTg}5e5cAE_Jgnx2#XLOpG87;NylVbh5zqH!)Geo3 zND>kz5XloLvJ~^WIUb2}E_0saN!A-cVv`e4`~xnL_X|Sz2H6G=X8wA)*FpE@3i^U+ z*5<=XlaOtS0p2O-lPQg8-i;ESvv39~8VHEhl^nSnQD`RSQ*<_4oQLy}8(8%hASOGF zA{cqAakcH}M^rQ((08!jj0V#%IVZVnMsyg=I$#ZJQy}YCWEtmqXQlH&{=h-WG-JE) z(rM(l1B2K7s)^~BY0UQdgU>KL;=L&iqJWFS3j*0D@3U^P5$gdV<Z9hM>?89#KhDiv zQb+bnH+M_V57t>X2v8aY0qZ>b=E=#k(_dRz1m_k1{QdZ7F`FOF$y_H1U4(J0qaQDm zm2o!VgW@lEiJ=M2j@17O9Ldi9aDK^pU(HgqjPcjouqpiw+N^eGeeHkzH*Vk`l%-ff diff --git a/env/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-37.pyc deleted file mode 100644 index f195b8e3edc42f25f3e8847f4b207b45325c3ec1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1868 zcmcIlPfsL86tAl8>FMcZk>I)kmqRTpiIc#vi^jtQiOZkECdk1tE)q$nnW~v->FI8& z3Sn@@gOI34zrhesehoiHT|M~~IQd@p4ziJWvpV(a|Eu47?^mxkA3h8Sl=Qc`!}$s! zf8t<LeCT`zRd+xLazF$XETIQ<Fatd&VSVSoq2x75xl5#b9H@0l@GDj;<?7cYW&1?9 zqH;wJJmHBdv{mT~|Cp&GS(8;!yQG&CPO%oL2N!<?0f%xXk7U};M4WbYqko)4M>5gH z$`ALI^3WHuE7M3tMsm}WZ|f*E@O~yv6WJ*DH``f0P;s|sntW^0<!jGhtns4(Z^ivA z<*g`>)8gW061QclWs`5VwwJk<lJCCS+SzOE@J^<<kS2-~4XXbFf04a9wbfIVWI5PD zaRv&u4%98E`VojBd}DG=j+ve@^hY`*-~_r?XSR}LXHwbems(3@;w;@!DpR1;(?)?; zekaNU1vi_krk}6oalR6#+C)jRB2EVB`HM~uCyN?>CsUEB)w@1jo%pno5A0M_ToM*n zA}sBKAasT*B*86wgpQYDTe5<7=?GXMoGW6;m>M=Dmvro0ld&t@YkEz$VLW1{A}YeW zB14AbOZp2L(y{jw=}=LHdB2>$1{T14RruHwwXr`04akbU=v{E#;^N{x<oIuDlm|YK zaz3FGf5QZmAxUDz)2RPH6QThAjPLL7^X-hMnc-5z=4tSZf7y#Q@5G7Z&_<^w>qjPT zLlg%bs4S7n0=al6T0yY;a&u?5#XsfW2e+ZYfMKj!7@A!WU0~MX_J|ItAoFCK9DXul zLndg^|8V3OV(8GpV2qhy*VI68gfoxfE5;r6t9!C=GIQcW09;#}xKCTJbfBfD)<xgd z9qTHYtAZ=Aiu}ys2x~mIej6<4W@=#li2`6YKIVeGrKkejn_xYOwP|Pld}9S|K%RMw z(J6YdFmXj=J;}g1dILI>&9)Nhb{yY20=Zf66P3IV0^BhB4I3c~fnAsMD|m$`OuTt$ z)H;bw>yCN{wyIeaQz-EIJLqcbh~Yd}8*8wj83>nLJh=zhWZzqW(87=K;4%mR^g#(o z03bnshNpwT=Ex(6LC1Ma-ay2J=v+)=I$YAtB@J>pxS<?Ui+T?f{R=gwoPKm3f<^ye zSC3)q$9Q>xnp!%tq+YY`w>nEP%|t>gT*4?u!g@kN-j&t?P1cj=29k&Mq8##=fJ0df z-m(s4He1OfWwgRSNO2v&n!`R?YyF9D=3%7Kv1Ha`9$Ro`sY`?6Q%l9pFziQh8ip5* zo-uiIb#+3OhR$WXan_5>S+|j??(KqZAozM<t6?azb{MKBsL2CVNqkgV^WarK&y*?B zrkyTV8cLp=N+2jcmD}5q#9;{LKwdR>B42QzG-kd0Z)`k(bA>T3^C^P_IZbCBzv4gj F>EAE?;otxO diff --git a/env/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-37.pyc deleted file mode 100644 index 5a2c6b6eda059608f09f4a1b045c80419deaeb28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5009 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-37.pyc deleted file mode 100644 index d2346377f5a6faf643d813881c09d656147692a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2621 zcmbtW*?Sa45TDtZJ+m7^1OzX}3yqS*`-oR09O4m=sOTz=o1G3BoSj{IW`!UM7!*8E zE>EC}04jI@9)JhOAK~ZAy!zx*z58VKESm(x@6*rTuWGuhXR5k>b@a|F6ml95f8Wfd zzqV=G?`qK;S)TMV1qYZpT2XU!C*kRpL@}YOx#1Z_W0B^VPI80hB!#iu95sq2OHxjn zC25u<S(0Q)#>uiI%aRmJQY^_iEi7pfCd<;JW--mOyi;IVA(mxWmf^ju(<;nSZFw%{ zEg~sWA|ukyl+Ed4-f1fqgt4bp6vp)86vr6QI;O7vEtj)+tQ3R7FIOGcUlw$&vg?76 zwj+jIUpVppYyUhN3hwtUw^H*&MfhPUbgRBq9kRk<VXf*^$~w;|vzk`A8lUx)tF;m7 zE*lPetiI;dy6J`+Z?XnQtO2*eiUvwG*N;!p<GE$w2cpNCH!y#$6$oKHytr>c|G)xk zs46W-geBJtSoI$q1g%4l+UmZ`UJ2WCLm^9E&|g+N&0+AQmnpEA39YDe;1W*SNjSy^ zy=ZVCRJin_>7*E}Y?SO{UF9ehgwidCW%aol>X~HfV+vZCh1wo{jlL!kCdL%XdVhxz zrPMjfLDX6vF3C!%X2(c~sI`fR9hL??!Ec&@@P?wK>(}aGloC=_WpGfFEv)#@2fD*b zt-I#dI$b{qOP<&1tQhfE-8eL?gfZDK3*V{A?#UtTK0BmcwGmdV;w>&zXHGEF^ws&; zy{^W_fAUT$_a|IqM_F~$8b3Luny$$Vza~|wNL5L(OAVG+-=`YiUBvTqj?~!b@6e^m zo6Scu%GkDFstDVTa<*NmI(1LY^R~UBUh*0{vY;$+xlT5xu$0QCRI!`R6ez`+M9zpM zWnPRA^-3>OFoW56mL$is#N-gCqV~mpSvJz&TM$Dl7oH!(X{_c<hG@$Zp)qDS`Yer= zB>JV!dmUyBr%ds@fm2#ZjS2LkBv)q1I|skm)7kuL6TDe}Khl}tGLj3~%v5EeU9k%k zi;;?<nP4$U>cp2Z#fme!RO|l<(fl|?{x3wT*cuQ`;n`$}qzdY}0I4jvis^g+ojFj~ zc&eQTpnuFFl^Ity6*E9;eHK6}uD$97h39w<=_=?^ejt>hR9PZbkK$HwZdfLQF_E^a zY_C=NROzxowf?ULpAaSIUmKjs2IfvOsMf1n&u;D=>Bv+?H&Jp?yE{=8jlLq!k~Pql zQJz~WW5C2mYOYqsh}1RZqn<F#WGbD>=34TF)+udM+b@_lea3||XI*shC6`_{+q(RU zE3dkG&NbI|TzCE4&aQ60KyJR}*4u8s<IbMD?!M>V`+D!6*EfH`!bJ}(e(<4(AL)Pe zvB#enc=D;Impt=q@ww-hzF@yt8Z7e_wQSg3{*qVmtF;v}2<tDeTs5-#l{K%vww7QW z!Fqz%2}TJv5WGR~Cc#F6O$2WdyiM>9!Mg;T3Em@kpI{5YR)TE=+X;3Md_eFa!AAri z6MRDODZx&HT?D%cfB*^h5R4J*CD=!>pWris&k4RDI6!ca;7fw92)-uxhTssvVS*zB z-x7RB@IAo~1V;&u5gaG@k>DqSp9y{;I6-id;1t1W!gYk}31251CEP&x2H~588wocN zzD4*p;X8!y5^g4ZkMMoMEreSMw-Ih9+(GyO;fI7D5q?bg3E`)NI|+9Y?j{66B-}$d zM!1)7AK`w&&j>#!{DSZR;X%SL3BMxzn(!OKLxhJ3j}U%K_#NT*gg+1-B|JuWobX4& zp9p^@{DtrY;Yq?%gr_^&qO@&0)pDcN57ooE<W?_LYBai~p=PQv#l;sFgj7iyW#e0I zvCsby#;<}Xr!J_n?JB8i9Z{iqEf3aR&ylL*PU;@xg%@S+Zd^0>szMItFf$YRL?+pu cZBMo*r<v1Irk>DK{7b~YOx9eht<{o$0q*ww`v3p{ diff --git a/env/lib/python3.7/site-packages/pip/_vendor/webencodings/labels.py b/env/lib/python3.7/site-packages/pip/_vendor/webencodings/labels.py deleted file mode 100644 index 29cbf91..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/webencodings/labels.py +++ /dev/null @@ -1,231 +0,0 @@ -""" - - webencodings.labels - ~~~~~~~~~~~~~~~~~~~ - - Map encoding labels to their name. - - :copyright: Copyright 2012 by Simon Sapin - :license: BSD, see LICENSE for details. - -""" - -# XXX Do not edit! -# This file is automatically generated by mklabels.py - -LABELS = { - 'unicode-1-1-utf-8': 'utf-8', - 'utf-8': 'utf-8', - 'utf8': 'utf-8', - '866': 'ibm866', - 'cp866': 'ibm866', - 'csibm866': 'ibm866', - 'ibm866': 'ibm866', - 'csisolatin2': 'iso-8859-2', - 'iso-8859-2': 'iso-8859-2', - 'iso-ir-101': 'iso-8859-2', - 'iso8859-2': 'iso-8859-2', - 'iso88592': 'iso-8859-2', - 'iso_8859-2': 'iso-8859-2', - 'iso_8859-2:1987': 'iso-8859-2', - 'l2': 'iso-8859-2', - 'latin2': 'iso-8859-2', - 'csisolatin3': 'iso-8859-3', - 'iso-8859-3': 'iso-8859-3', - 'iso-ir-109': 'iso-8859-3', - 'iso8859-3': 'iso-8859-3', - 'iso88593': 'iso-8859-3', - 'iso_8859-3': 'iso-8859-3', - 'iso_8859-3:1988': 'iso-8859-3', - 'l3': 'iso-8859-3', - 'latin3': 'iso-8859-3', - 'csisolatin4': 'iso-8859-4', - 'iso-8859-4': 'iso-8859-4', - 'iso-ir-110': 'iso-8859-4', - 'iso8859-4': 'iso-8859-4', - 'iso88594': 'iso-8859-4', - 'iso_8859-4': 'iso-8859-4', - 'iso_8859-4:1988': 'iso-8859-4', - 'l4': 'iso-8859-4', - 'latin4': 'iso-8859-4', - 'csisolatincyrillic': 'iso-8859-5', - 'cyrillic': 'iso-8859-5', - 'iso-8859-5': 'iso-8859-5', - 'iso-ir-144': 'iso-8859-5', - 'iso8859-5': 'iso-8859-5', - 'iso88595': 'iso-8859-5', - 'iso_8859-5': 'iso-8859-5', - 'iso_8859-5:1988': 'iso-8859-5', - 'arabic': 'iso-8859-6', - 'asmo-708': 'iso-8859-6', - 'csiso88596e': 'iso-8859-6', - 'csiso88596i': 'iso-8859-6', - 'csisolatinarabic': 'iso-8859-6', - 'ecma-114': 'iso-8859-6', - 'iso-8859-6': 'iso-8859-6', - 'iso-8859-6-e': 'iso-8859-6', - 'iso-8859-6-i': 'iso-8859-6', - 'iso-ir-127': 'iso-8859-6', - 'iso8859-6': 'iso-8859-6', - 'iso88596': 'iso-8859-6', - 'iso_8859-6': 'iso-8859-6', - 'iso_8859-6:1987': 'iso-8859-6', - 'csisolatingreek': 'iso-8859-7', - 'ecma-118': 'iso-8859-7', - 'elot_928': 'iso-8859-7', - 'greek': 'iso-8859-7', - 'greek8': 'iso-8859-7', - 'iso-8859-7': 'iso-8859-7', - 'iso-ir-126': 'iso-8859-7', - 'iso8859-7': 'iso-8859-7', - 'iso88597': 'iso-8859-7', - 'iso_8859-7': 'iso-8859-7', - 'iso_8859-7:1987': 'iso-8859-7', - 'sun_eu_greek': 'iso-8859-7', - 'csiso88598e': 'iso-8859-8', - 'csisolatinhebrew': 'iso-8859-8', - 'hebrew': 'iso-8859-8', - 'iso-8859-8': 'iso-8859-8', - 'iso-8859-8-e': 'iso-8859-8', - 'iso-ir-138': 'iso-8859-8', - 'iso8859-8': 'iso-8859-8', - 'iso88598': 'iso-8859-8', - 'iso_8859-8': 'iso-8859-8', - 'iso_8859-8:1988': 'iso-8859-8', - 'visual': 'iso-8859-8', - 'csiso88598i': 'iso-8859-8-i', - 'iso-8859-8-i': 'iso-8859-8-i', - 'logical': 'iso-8859-8-i', - 'csisolatin6': 'iso-8859-10', - 'iso-8859-10': 'iso-8859-10', - 'iso-ir-157': 'iso-8859-10', - 'iso8859-10': 'iso-8859-10', - 'iso885910': 'iso-8859-10', - 'l6': 'iso-8859-10', - 'latin6': 'iso-8859-10', - 'iso-8859-13': 'iso-8859-13', - 'iso8859-13': 'iso-8859-13', - 'iso885913': 'iso-8859-13', - 'iso-8859-14': 'iso-8859-14', - 'iso8859-14': 'iso-8859-14', - 'iso885914': 'iso-8859-14', - 'csisolatin9': 'iso-8859-15', - 'iso-8859-15': 'iso-8859-15', - 'iso8859-15': 'iso-8859-15', - 'iso885915': 'iso-8859-15', - 'iso_8859-15': 'iso-8859-15', - 'l9': 'iso-8859-15', - 'iso-8859-16': 'iso-8859-16', - 'cskoi8r': 'koi8-r', - 'koi': 'koi8-r', - 'koi8': 'koi8-r', - 'koi8-r': 'koi8-r', - 'koi8_r': 'koi8-r', - 'koi8-u': 'koi8-u', - 'csmacintosh': 'macintosh', - 'mac': 'macintosh', - 'macintosh': 'macintosh', - 'x-mac-roman': 'macintosh', - 'dos-874': 'windows-874', - 'iso-8859-11': 'windows-874', - 'iso8859-11': 'windows-874', - 'iso885911': 'windows-874', - 'tis-620': 'windows-874', - 'windows-874': 'windows-874', - 'cp1250': 'windows-1250', - 'windows-1250': 'windows-1250', - 'x-cp1250': 'windows-1250', - 'cp1251': 'windows-1251', - 'windows-1251': 'windows-1251', - 'x-cp1251': 'windows-1251', - 'ansi_x3.4-1968': 'windows-1252', - 'ascii': 'windows-1252', - 'cp1252': 'windows-1252', - 'cp819': 'windows-1252', - 'csisolatin1': 'windows-1252', - 'ibm819': 'windows-1252', - 'iso-8859-1': 'windows-1252', - 'iso-ir-100': 'windows-1252', - 'iso8859-1': 'windows-1252', - 'iso88591': 'windows-1252', - 'iso_8859-1': 'windows-1252', - 'iso_8859-1:1987': 'windows-1252', - 'l1': 'windows-1252', - 'latin1': 'windows-1252', - 'us-ascii': 'windows-1252', - 'windows-1252': 'windows-1252', - 'x-cp1252': 'windows-1252', - 'cp1253': 'windows-1253', - 'windows-1253': 'windows-1253', - 'x-cp1253': 'windows-1253', - 'cp1254': 'windows-1254', - 'csisolatin5': 'windows-1254', - 'iso-8859-9': 'windows-1254', - 'iso-ir-148': 'windows-1254', - 'iso8859-9': 'windows-1254', - 'iso88599': 'windows-1254', - 'iso_8859-9': 'windows-1254', - 'iso_8859-9:1989': 'windows-1254', - 'l5': 'windows-1254', - 'latin5': 'windows-1254', - 'windows-1254': 'windows-1254', - 'x-cp1254': 'windows-1254', - 'cp1255': 'windows-1255', - 'windows-1255': 'windows-1255', - 'x-cp1255': 'windows-1255', - 'cp1256': 'windows-1256', - 'windows-1256': 'windows-1256', - 'x-cp1256': 'windows-1256', - 'cp1257': 'windows-1257', - 'windows-1257': 'windows-1257', - 'x-cp1257': 'windows-1257', - 'cp1258': 'windows-1258', - 'windows-1258': 'windows-1258', - 'x-cp1258': 'windows-1258', - 'x-mac-cyrillic': 'x-mac-cyrillic', - 'x-mac-ukrainian': 'x-mac-cyrillic', - 'chinese': 'gbk', - 'csgb2312': 'gbk', - 'csiso58gb231280': 'gbk', - 'gb2312': 'gbk', - 'gb_2312': 'gbk', - 'gb_2312-80': 'gbk', - 'gbk': 'gbk', - 'iso-ir-58': 'gbk', - 'x-gbk': 'gbk', - 'gb18030': 'gb18030', - 'hz-gb-2312': 'hz-gb-2312', - 'big5': 'big5', - 'big5-hkscs': 'big5', - 'cn-big5': 'big5', - 'csbig5': 'big5', - 'x-x-big5': 'big5', - 'cseucpkdfmtjapanese': 'euc-jp', - 'euc-jp': 'euc-jp', - 'x-euc-jp': 'euc-jp', - 'csiso2022jp': 'iso-2022-jp', - 'iso-2022-jp': 'iso-2022-jp', - 'csshiftjis': 'shift_jis', - 'ms_kanji': 'shift_jis', - 'shift-jis': 'shift_jis', - 'shift_jis': 'shift_jis', - 'sjis': 'shift_jis', - 'windows-31j': 'shift_jis', - 'x-sjis': 'shift_jis', - 'cseuckr': 'euc-kr', - 'csksc56011987': 'euc-kr', - 'euc-kr': 'euc-kr', - 'iso-ir-149': 'euc-kr', - 'korean': 'euc-kr', - 'ks_c_5601-1987': 'euc-kr', - 'ks_c_5601-1989': 'euc-kr', - 'ksc5601': 'euc-kr', - 'ksc_5601': 'euc-kr', - 'windows-949': 'euc-kr', - 'csiso2022kr': 'iso-2022-kr', - 'iso-2022-kr': 'iso-2022-kr', - 'utf-16be': 'utf-16be', - 'utf-16': 'utf-16le', - 'utf-16le': 'utf-16le', - 'x-user-defined': 'x-user-defined', -} diff --git a/env/lib/python3.7/site-packages/pip/_vendor/webencodings/mklabels.py b/env/lib/python3.7/site-packages/pip/_vendor/webencodings/mklabels.py deleted file mode 100644 index 295dc92..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/webencodings/mklabels.py +++ /dev/null @@ -1,59 +0,0 @@ -""" - - webencodings.mklabels - ~~~~~~~~~~~~~~~~~~~~~ - - Regenarate the webencodings.labels module. - - :copyright: Copyright 2012 by Simon Sapin - :license: BSD, see LICENSE for details. - -""" - -import json -try: - from urllib import urlopen -except ImportError: - from urllib.request import urlopen - - -def assert_lower(string): - assert string == string.lower() - return string - - -def generate(url): - parts = ['''\ -""" - - webencodings.labels - ~~~~~~~~~~~~~~~~~~~ - - Map encoding labels to their name. - - :copyright: Copyright 2012 by Simon Sapin - :license: BSD, see LICENSE for details. - -""" - -# XXX Do not edit! -# This file is automatically generated by mklabels.py - -LABELS = { -'''] - labels = [ - (repr(assert_lower(label)).lstrip('u'), - repr(encoding['name']).lstrip('u')) - for category in json.loads(urlopen(url).read().decode('ascii')) - for encoding in category['encodings'] - for label in encoding['labels']] - max_len = max(len(label) for label, name in labels) - parts.extend( - ' %s:%s %s,\n' % (label, ' ' * (max_len - len(label)), name) - for label, name in labels) - parts.append('}') - return ''.join(parts) - - -if __name__ == '__main__': - print(generate('http://encoding.spec.whatwg.org/encodings.json')) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/webencodings/tests.py b/env/lib/python3.7/site-packages/pip/_vendor/webencodings/tests.py deleted file mode 100644 index e12c10d..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/webencodings/tests.py +++ /dev/null @@ -1,153 +0,0 @@ -# coding: utf-8 -""" - - webencodings.tests - ~~~~~~~~~~~~~~~~~~ - - A basic test suite for Encoding. - - :copyright: Copyright 2012 by Simon Sapin - :license: BSD, see LICENSE for details. - -""" - -from __future__ import unicode_literals - -from . import (lookup, LABELS, decode, encode, iter_decode, iter_encode, - IncrementalDecoder, IncrementalEncoder, UTF8) - - -def assert_raises(exception, function, *args, **kwargs): - try: - function(*args, **kwargs) - except exception: - return - else: # pragma: no cover - raise AssertionError('Did not raise %s.' % exception) - - -def test_labels(): - assert lookup('utf-8').name == 'utf-8' - assert lookup('Utf-8').name == 'utf-8' - assert lookup('UTF-8').name == 'utf-8' - assert lookup('utf8').name == 'utf-8' - assert lookup('utf8').name == 'utf-8' - assert lookup('utf8 ').name == 'utf-8' - assert lookup(' \r\nutf8\t').name == 'utf-8' - assert lookup('u8') is None # Python label. - assert lookup('utf-8 ') is None # Non-ASCII white space. - - assert lookup('US-ASCII').name == 'windows-1252' - assert lookup('iso-8859-1').name == 'windows-1252' - assert lookup('latin1').name == 'windows-1252' - assert lookup('LATIN1').name == 'windows-1252' - assert lookup('latin-1') is None - assert lookup('LATİN1') is None # ASCII-only case insensitivity. - - -def test_all_labels(): - for label in LABELS: - assert decode(b'', label) == ('', lookup(label)) - assert encode('', label) == b'' - for repeat in [0, 1, 12]: - output, _ = iter_decode([b''] * repeat, label) - assert list(output) == [] - assert list(iter_encode([''] * repeat, label)) == [] - decoder = IncrementalDecoder(label) - assert decoder.decode(b'') == '' - assert decoder.decode(b'', final=True) == '' - encoder = IncrementalEncoder(label) - assert encoder.encode('') == b'' - assert encoder.encode('', final=True) == b'' - # All encoding names are valid labels too: - for name in set(LABELS.values()): - assert lookup(name).name == name - - -def test_invalid_label(): - assert_raises(LookupError, decode, b'\xEF\xBB\xBF\xc3\xa9', 'invalid') - assert_raises(LookupError, encode, 'é', 'invalid') - assert_raises(LookupError, iter_decode, [], 'invalid') - assert_raises(LookupError, iter_encode, [], 'invalid') - assert_raises(LookupError, IncrementalDecoder, 'invalid') - assert_raises(LookupError, IncrementalEncoder, 'invalid') - - -def test_decode(): - assert decode(b'\x80', 'latin1') == ('€', lookup('latin1')) - assert decode(b'\x80', lookup('latin1')) == ('€', lookup('latin1')) - assert decode(b'\xc3\xa9', 'utf8') == ('é', lookup('utf8')) - assert decode(b'\xc3\xa9', UTF8) == ('é', lookup('utf8')) - assert decode(b'\xc3\xa9', 'ascii') == ('é', lookup('ascii')) - assert decode(b'\xEF\xBB\xBF\xc3\xa9', 'ascii') == ('é', lookup('utf8')) # UTF-8 with BOM - - assert decode(b'\xFE\xFF\x00\xe9', 'ascii') == ('é', lookup('utf-16be')) # UTF-16-BE with BOM - assert decode(b'\xFF\xFE\xe9\x00', 'ascii') == ('é', lookup('utf-16le')) # UTF-16-LE with BOM - assert decode(b'\xFE\xFF\xe9\x00', 'ascii') == ('\ue900', lookup('utf-16be')) - assert decode(b'\xFF\xFE\x00\xe9', 'ascii') == ('\ue900', lookup('utf-16le')) - - assert decode(b'\x00\xe9', 'UTF-16BE') == ('é', lookup('utf-16be')) - assert decode(b'\xe9\x00', 'UTF-16LE') == ('é', lookup('utf-16le')) - assert decode(b'\xe9\x00', 'UTF-16') == ('é', lookup('utf-16le')) - - assert decode(b'\xe9\x00', 'UTF-16BE') == ('\ue900', lookup('utf-16be')) - assert decode(b'\x00\xe9', 'UTF-16LE') == ('\ue900', lookup('utf-16le')) - assert decode(b'\x00\xe9', 'UTF-16') == ('\ue900', lookup('utf-16le')) - - -def test_encode(): - assert encode('é', 'latin1') == b'\xe9' - assert encode('é', 'utf8') == b'\xc3\xa9' - assert encode('é', 'utf8') == b'\xc3\xa9' - assert encode('é', 'utf-16') == b'\xe9\x00' - assert encode('é', 'utf-16le') == b'\xe9\x00' - assert encode('é', 'utf-16be') == b'\x00\xe9' - - -def test_iter_decode(): - def iter_decode_to_string(input, fallback_encoding): - output, _encoding = iter_decode(input, fallback_encoding) - return ''.join(output) - assert iter_decode_to_string([], 'latin1') == '' - assert iter_decode_to_string([b''], 'latin1') == '' - assert iter_decode_to_string([b'\xe9'], 'latin1') == 'é' - assert iter_decode_to_string([b'hello'], 'latin1') == 'hello' - assert iter_decode_to_string([b'he', b'llo'], 'latin1') == 'hello' - assert iter_decode_to_string([b'hell', b'o'], 'latin1') == 'hello' - assert iter_decode_to_string([b'\xc3\xa9'], 'latin1') == 'é' - assert iter_decode_to_string([b'\xEF\xBB\xBF\xc3\xa9'], 'latin1') == 'é' - assert iter_decode_to_string([ - b'\xEF\xBB\xBF', b'\xc3', b'\xa9'], 'latin1') == 'é' - assert iter_decode_to_string([ - b'\xEF\xBB\xBF', b'a', b'\xc3'], 'latin1') == 'a\uFFFD' - assert iter_decode_to_string([ - b'', b'\xEF', b'', b'', b'\xBB\xBF\xc3', b'\xa9'], 'latin1') == 'é' - assert iter_decode_to_string([b'\xEF\xBB\xBF'], 'latin1') == '' - assert iter_decode_to_string([b'\xEF\xBB'], 'latin1') == 'ï»' - assert iter_decode_to_string([b'\xFE\xFF\x00\xe9'], 'latin1') == 'é' - assert iter_decode_to_string([b'\xFF\xFE\xe9\x00'], 'latin1') == 'é' - assert iter_decode_to_string([ - b'', b'\xFF', b'', b'', b'\xFE\xe9', b'\x00'], 'latin1') == 'é' - assert iter_decode_to_string([ - b'', b'h\xe9', b'llo'], 'x-user-defined') == 'h\uF7E9llo' - - -def test_iter_encode(): - assert b''.join(iter_encode([], 'latin1')) == b'' - assert b''.join(iter_encode([''], 'latin1')) == b'' - assert b''.join(iter_encode(['é'], 'latin1')) == b'\xe9' - assert b''.join(iter_encode(['', 'é', '', ''], 'latin1')) == b'\xe9' - assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16')) == b'\xe9\x00' - assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16le')) == b'\xe9\x00' - assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16be')) == b'\x00\xe9' - assert b''.join(iter_encode([ - '', 'h\uF7E9', '', 'llo'], 'x-user-defined')) == b'h\xe9llo' - - -def test_x_user_defined(): - encoded = b'2,\x0c\x0b\x1aO\xd9#\xcb\x0f\xc9\xbbt\xcf\xa8\xca' - decoded = '2,\x0c\x0b\x1aO\uf7d9#\uf7cb\x0f\uf7c9\uf7bbt\uf7cf\uf7a8\uf7ca' - encoded = b'aa' - decoded = 'aa' - assert decode(encoded, 'x-user-defined') == (decoded, lookup('x-user-defined')) - assert encode(decoded, 'x-user-defined') == encoded diff --git a/env/lib/python3.7/site-packages/pip/_vendor/webencodings/x_user_defined.py b/env/lib/python3.7/site-packages/pip/_vendor/webencodings/x_user_defined.py deleted file mode 100644 index d16e326..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/webencodings/x_user_defined.py +++ /dev/null @@ -1,325 +0,0 @@ -# coding: utf-8 -""" - - webencodings.x_user_defined - ~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - An implementation of the x-user-defined encoding. - - :copyright: Copyright 2012 by Simon Sapin - :license: BSD, see LICENSE for details. - -""" - -from __future__ import unicode_literals - -import codecs - - -### Codec APIs - -class Codec(codecs.Codec): - - def encode(self, input, errors='strict'): - return codecs.charmap_encode(input, errors, encoding_table) - - def decode(self, input, errors='strict'): - return codecs.charmap_decode(input, errors, decoding_table) - - -class IncrementalEncoder(codecs.IncrementalEncoder): - def encode(self, input, final=False): - return codecs.charmap_encode(input, self.errors, encoding_table)[0] - - -class IncrementalDecoder(codecs.IncrementalDecoder): - def decode(self, input, final=False): - return codecs.charmap_decode(input, self.errors, decoding_table)[0] - - -class StreamWriter(Codec, codecs.StreamWriter): - pass - - -class StreamReader(Codec, codecs.StreamReader): - pass - - -### encodings module API - -codec_info = codecs.CodecInfo( - name='x-user-defined', - encode=Codec().encode, - decode=Codec().decode, - incrementalencoder=IncrementalEncoder, - incrementaldecoder=IncrementalDecoder, - streamreader=StreamReader, - streamwriter=StreamWriter, -) - - -### Decoding Table - -# Python 3: -# for c in range(256): print(' %r' % chr(c if c < 128 else c + 0xF700)) -decoding_table = ( - '\x00' - '\x01' - '\x02' - '\x03' - '\x04' - '\x05' - '\x06' - '\x07' - '\x08' - '\t' - '\n' - '\x0b' - '\x0c' - '\r' - '\x0e' - '\x0f' - '\x10' - '\x11' - '\x12' - '\x13' - '\x14' - '\x15' - '\x16' - '\x17' - '\x18' - '\x19' - '\x1a' - '\x1b' - '\x1c' - '\x1d' - '\x1e' - '\x1f' - ' ' - '!' - '"' - '#' - '$' - '%' - '&' - "'" - '(' - ')' - '*' - '+' - ',' - '-' - '.' - '/' - '0' - '1' - '2' - '3' - '4' - '5' - '6' - '7' - '8' - '9' - ':' - ';' - '<' - '=' - '>' - '?' - '@' - 'A' - 'B' - 'C' - 'D' - 'E' - 'F' - 'G' - 'H' - 'I' - 'J' - 'K' - 'L' - 'M' - 'N' - 'O' - 'P' - 'Q' - 'R' - 'S' - 'T' - 'U' - 'V' - 'W' - 'X' - 'Y' - 'Z' - '[' - '\\' - ']' - '^' - '_' - '`' - 'a' - 'b' - 'c' - 'd' - 'e' - 'f' - 'g' - 'h' - 'i' - 'j' - 'k' - 'l' - 'm' - 'n' - 'o' - 'p' - 'q' - 'r' - 's' - 't' - 'u' - 'v' - 'w' - 'x' - 'y' - 'z' - '{' - '|' - '}' - '~' - '\x7f' - '\uf780' - '\uf781' - '\uf782' - '\uf783' - '\uf784' - '\uf785' - '\uf786' - '\uf787' - '\uf788' - '\uf789' - '\uf78a' - '\uf78b' - '\uf78c' - '\uf78d' - '\uf78e' - '\uf78f' - '\uf790' - '\uf791' - '\uf792' - '\uf793' - '\uf794' - '\uf795' - '\uf796' - '\uf797' - '\uf798' - '\uf799' - '\uf79a' - '\uf79b' - '\uf79c' - '\uf79d' - '\uf79e' - '\uf79f' - '\uf7a0' - '\uf7a1' - '\uf7a2' - '\uf7a3' - '\uf7a4' - '\uf7a5' - '\uf7a6' - '\uf7a7' - '\uf7a8' - '\uf7a9' - '\uf7aa' - '\uf7ab' - '\uf7ac' - '\uf7ad' - '\uf7ae' - '\uf7af' - '\uf7b0' - '\uf7b1' - '\uf7b2' - '\uf7b3' - '\uf7b4' - '\uf7b5' - '\uf7b6' - '\uf7b7' - '\uf7b8' - '\uf7b9' - '\uf7ba' - '\uf7bb' - '\uf7bc' - '\uf7bd' - '\uf7be' - '\uf7bf' - '\uf7c0' - '\uf7c1' - '\uf7c2' - '\uf7c3' - '\uf7c4' - '\uf7c5' - '\uf7c6' - '\uf7c7' - '\uf7c8' - '\uf7c9' - '\uf7ca' - '\uf7cb' - '\uf7cc' - '\uf7cd' - '\uf7ce' - '\uf7cf' - '\uf7d0' - '\uf7d1' - '\uf7d2' - '\uf7d3' - '\uf7d4' - '\uf7d5' - '\uf7d6' - '\uf7d7' - '\uf7d8' - '\uf7d9' - '\uf7da' - '\uf7db' - '\uf7dc' - '\uf7dd' - '\uf7de' - '\uf7df' - '\uf7e0' - '\uf7e1' - '\uf7e2' - '\uf7e3' - '\uf7e4' - '\uf7e5' - '\uf7e6' - '\uf7e7' - '\uf7e8' - '\uf7e9' - '\uf7ea' - '\uf7eb' - '\uf7ec' - '\uf7ed' - '\uf7ee' - '\uf7ef' - '\uf7f0' - '\uf7f1' - '\uf7f2' - '\uf7f3' - '\uf7f4' - '\uf7f5' - '\uf7f6' - '\uf7f7' - '\uf7f8' - '\uf7f9' - '\uf7fa' - '\uf7fb' - '\uf7fc' - '\uf7fd' - '\uf7fe' - '\uf7ff' -) - -### Encoding table -encoding_table = codecs.charmap_build(decoding_table) diff --git a/env/lib/python3.7/site-packages/pkg_resources/__init__.py b/env/lib/python3.7/site-packages/pkg_resources/__init__.py deleted file mode 100644 index 97e08d6..0000000 --- a/env/lib/python3.7/site-packages/pkg_resources/__init__.py +++ /dev/null @@ -1,3286 +0,0 @@ -# coding: utf-8 -""" -Package resource API --------------------- - -A resource is a logical file contained within a package, or a logical -subdirectory thereof. The package resource API expects resource names -to have their path parts separated with ``/``, *not* whatever the local -path separator is. Do not use os.path operations to manipulate resource -names being passed into the API. - -The package resource API is designed to work with normal filesystem packages, -.egg files, and unpacked .egg files. It can also work in a limited way with -.zip files and with custom PEP 302 loaders that support the ``get_data()`` -method. -""" - -from __future__ import absolute_import - -import sys -import os -import io -import time -import re -import types -import zipfile -import zipimport -import warnings -import stat -import functools -import pkgutil -import operator -import platform -import collections -import plistlib -import email.parser -import errno -import tempfile -import textwrap -import itertools -import inspect -import ntpath -import posixpath -from pkgutil import get_importer - -try: - import _imp -except ImportError: - # Python 3.2 compatibility - import imp as _imp - -try: - FileExistsError -except NameError: - FileExistsError = OSError - -from pkg_resources.extern import six -from pkg_resources.extern.six.moves import urllib, map, filter - -# capture these to bypass sandboxing -from os import utime -try: - from os import mkdir, rename, unlink - WRITE_SUPPORT = True -except ImportError: - # no write support, probably under GAE - WRITE_SUPPORT = False - -from os import open as os_open -from os.path import isdir, split - -try: - import importlib.machinery as importlib_machinery - # access attribute to force import under delayed import mechanisms. - importlib_machinery.__name__ -except ImportError: - importlib_machinery = None - -from . import py31compat -from pkg_resources.extern import appdirs -from pkg_resources.extern import packaging -__import__('pkg_resources.extern.packaging.version') -__import__('pkg_resources.extern.packaging.specifiers') -__import__('pkg_resources.extern.packaging.requirements') -__import__('pkg_resources.extern.packaging.markers') - - -__metaclass__ = type - - -if (3, 0) < sys.version_info < (3, 4): - raise RuntimeError("Python 3.4 or later is required") - -if six.PY2: - # Those builtin exceptions are only defined in Python 3 - PermissionError = None - NotADirectoryError = None - -# declare some globals that will be defined later to -# satisfy the linters. -require = None -working_set = None -add_activation_listener = None -resources_stream = None -cleanup_resources = None -resource_dir = None -resource_stream = None -set_extraction_path = None -resource_isdir = None -resource_string = None -iter_entry_points = None -resource_listdir = None -resource_filename = None -resource_exists = None -_distribution_finders = None -_namespace_handlers = None -_namespace_packages = None - - -class PEP440Warning(RuntimeWarning): - """ - Used when there is an issue with a version or specifier not complying with - PEP 440. - """ - - -def parse_version(v): - try: - return packaging.version.Version(v) - except packaging.version.InvalidVersion: - return packaging.version.LegacyVersion(v) - - -_state_vars = {} - - -def _declare_state(vartype, **kw): - globals().update(kw) - _state_vars.update(dict.fromkeys(kw, vartype)) - - -def __getstate__(): - state = {} - g = globals() - for k, v in _state_vars.items(): - state[k] = g['_sget_' + v](g[k]) - return state - - -def __setstate__(state): - g = globals() - for k, v in state.items(): - g['_sset_' + _state_vars[k]](k, g[k], v) - return state - - -def _sget_dict(val): - return val.copy() - - -def _sset_dict(key, ob, state): - ob.clear() - ob.update(state) - - -def _sget_object(val): - return val.__getstate__() - - -def _sset_object(key, ob, state): - ob.__setstate__(state) - - -_sget_none = _sset_none = lambda *args: None - - -def get_supported_platform(): - """Return this platform's maximum compatible version. - - distutils.util.get_platform() normally reports the minimum version - of Mac OS X that would be required to *use* extensions produced by - distutils. But what we want when checking compatibility is to know the - version of Mac OS X that we are *running*. To allow usage of packages that - explicitly require a newer version of Mac OS X, we must also know the - current version of the OS. - - If this condition occurs for any other platform with a version in its - platform strings, this function should be extended accordingly. - """ - plat = get_build_platform() - m = macosVersionString.match(plat) - if m is not None and sys.platform == "darwin": - try: - plat = 'macosx-%s-%s' % ('.'.join(_macosx_vers()[:2]), m.group(3)) - except ValueError: - # not Mac OS X - pass - return plat - - -__all__ = [ - # Basic resource access and distribution/entry point discovery - 'require', 'run_script', 'get_provider', 'get_distribution', - 'load_entry_point', 'get_entry_map', 'get_entry_info', - 'iter_entry_points', - 'resource_string', 'resource_stream', 'resource_filename', - 'resource_listdir', 'resource_exists', 'resource_isdir', - - # Environmental control - 'declare_namespace', 'working_set', 'add_activation_listener', - 'find_distributions', 'set_extraction_path', 'cleanup_resources', - 'get_default_cache', - - # Primary implementation classes - 'Environment', 'WorkingSet', 'ResourceManager', - 'Distribution', 'Requirement', 'EntryPoint', - - # Exceptions - 'ResolutionError', 'VersionConflict', 'DistributionNotFound', - 'UnknownExtra', 'ExtractionError', - - # Warnings - 'PEP440Warning', - - # Parsing functions and string utilities - 'parse_requirements', 'parse_version', 'safe_name', 'safe_version', - 'get_platform', 'compatible_platforms', 'yield_lines', 'split_sections', - 'safe_extra', 'to_filename', 'invalid_marker', 'evaluate_marker', - - # filesystem utilities - 'ensure_directory', 'normalize_path', - - # Distribution "precedence" constants - 'EGG_DIST', 'BINARY_DIST', 'SOURCE_DIST', 'CHECKOUT_DIST', 'DEVELOP_DIST', - - # "Provider" interfaces, implementations, and registration/lookup APIs - 'IMetadataProvider', 'IResourceProvider', 'FileMetadata', - 'PathMetadata', 'EggMetadata', 'EmptyProvider', 'empty_provider', - 'NullProvider', 'EggProvider', 'DefaultProvider', 'ZipProvider', - 'register_finder', 'register_namespace_handler', 'register_loader_type', - 'fixup_namespace_packages', 'get_importer', - - # Warnings - 'PkgResourcesDeprecationWarning', - - # Deprecated/backward compatibility only - 'run_main', 'AvailableDistributions', -] - - -class ResolutionError(Exception): - """Abstract base for dependency resolution errors""" - - def __repr__(self): - return self.__class__.__name__ + repr(self.args) - - -class VersionConflict(ResolutionError): - """ - An already-installed version conflicts with the requested version. - - Should be initialized with the installed Distribution and the requested - Requirement. - """ - - _template = "{self.dist} is installed but {self.req} is required" - - @property - def dist(self): - return self.args[0] - - @property - def req(self): - return self.args[1] - - def report(self): - return self._template.format(**locals()) - - def with_context(self, required_by): - """ - If required_by is non-empty, return a version of self that is a - ContextualVersionConflict. - """ - if not required_by: - return self - args = self.args + (required_by,) - return ContextualVersionConflict(*args) - - -class ContextualVersionConflict(VersionConflict): - """ - A VersionConflict that accepts a third parameter, the set of the - requirements that required the installed Distribution. - """ - - _template = VersionConflict._template + ' by {self.required_by}' - - @property - def required_by(self): - return self.args[2] - - -class DistributionNotFound(ResolutionError): - """A requested distribution was not found""" - - _template = ("The '{self.req}' distribution was not found " - "and is required by {self.requirers_str}") - - @property - def req(self): - return self.args[0] - - @property - def requirers(self): - return self.args[1] - - @property - def requirers_str(self): - if not self.requirers: - return 'the application' - return ', '.join(self.requirers) - - def report(self): - return self._template.format(**locals()) - - def __str__(self): - return self.report() - - -class UnknownExtra(ResolutionError): - """Distribution doesn't have an "extra feature" of the given name""" - - -_provider_factories = {} - -PY_MAJOR = sys.version[:3] -EGG_DIST = 3 -BINARY_DIST = 2 -SOURCE_DIST = 1 -CHECKOUT_DIST = 0 -DEVELOP_DIST = -1 - - -def register_loader_type(loader_type, provider_factory): - """Register `provider_factory` to make providers for `loader_type` - - `loader_type` is the type or class of a PEP 302 ``module.__loader__``, - and `provider_factory` is a function that, passed a *module* object, - returns an ``IResourceProvider`` for that module. - """ - _provider_factories[loader_type] = provider_factory - - -def get_provider(moduleOrReq): - """Return an IResourceProvider for the named module or requirement""" - if isinstance(moduleOrReq, Requirement): - return working_set.find(moduleOrReq) or require(str(moduleOrReq))[0] - try: - module = sys.modules[moduleOrReq] - except KeyError: - __import__(moduleOrReq) - module = sys.modules[moduleOrReq] - loader = getattr(module, '__loader__', None) - return _find_adapter(_provider_factories, loader)(module) - - -def _macosx_vers(_cache=[]): - if not _cache: - version = platform.mac_ver()[0] - # fallback for MacPorts - if version == '': - plist = '/System/Library/CoreServices/SystemVersion.plist' - if os.path.exists(plist): - if hasattr(plistlib, 'readPlist'): - plist_content = plistlib.readPlist(plist) - if 'ProductVersion' in plist_content: - version = plist_content['ProductVersion'] - - _cache.append(version.split('.')) - return _cache[0] - - -def _macosx_arch(machine): - return {'PowerPC': 'ppc', 'Power_Macintosh': 'ppc'}.get(machine, machine) - - -def get_build_platform(): - """Return this platform's string for platform-specific distributions - - XXX Currently this is the same as ``distutils.util.get_platform()``, but it - needs some hacks for Linux and Mac OS X. - """ - from sysconfig import get_platform - - plat = get_platform() - if sys.platform == "darwin" and not plat.startswith('macosx-'): - try: - version = _macosx_vers() - machine = os.uname()[4].replace(" ", "_") - return "macosx-%d.%d-%s" % ( - int(version[0]), int(version[1]), - _macosx_arch(machine), - ) - except ValueError: - # if someone is running a non-Mac darwin system, this will fall - # through to the default implementation - pass - return plat - - -macosVersionString = re.compile(r"macosx-(\d+)\.(\d+)-(.*)") -darwinVersionString = re.compile(r"darwin-(\d+)\.(\d+)\.(\d+)-(.*)") -# XXX backward compat -get_platform = get_build_platform - - -def compatible_platforms(provided, required): - """Can code for the `provided` platform run on the `required` platform? - - Returns true if either platform is ``None``, or the platforms are equal. - - XXX Needs compatibility checks for Linux and other unixy OSes. - """ - if provided is None or required is None or provided == required: - # easy case - return True - - # Mac OS X special cases - reqMac = macosVersionString.match(required) - if reqMac: - provMac = macosVersionString.match(provided) - - # is this a Mac package? - if not provMac: - # this is backwards compatibility for packages built before - # setuptools 0.6. All packages built after this point will - # use the new macosx designation. - provDarwin = darwinVersionString.match(provided) - if provDarwin: - dversion = int(provDarwin.group(1)) - macosversion = "%s.%s" % (reqMac.group(1), reqMac.group(2)) - if dversion == 7 and macosversion >= "10.3" or \ - dversion == 8 and macosversion >= "10.4": - return True - # egg isn't macosx or legacy darwin - return False - - # are they the same major version and machine type? - if provMac.group(1) != reqMac.group(1) or \ - provMac.group(3) != reqMac.group(3): - return False - - # is the required OS major update >= the provided one? - if int(provMac.group(2)) > int(reqMac.group(2)): - return False - - return True - - # XXX Linux and other platforms' special cases should go here - return False - - -def run_script(dist_spec, script_name): - """Locate distribution `dist_spec` and run its `script_name` script""" - ns = sys._getframe(1).f_globals - name = ns['__name__'] - ns.clear() - ns['__name__'] = name - require(dist_spec)[0].run_script(script_name, ns) - - -# backward compatibility -run_main = run_script - - -def get_distribution(dist): - """Return a current distribution object for a Requirement or string""" - if isinstance(dist, six.string_types): - dist = Requirement.parse(dist) - if isinstance(dist, Requirement): - dist = get_provider(dist) - if not isinstance(dist, Distribution): - raise TypeError("Expected string, Requirement, or Distribution", dist) - return dist - - -def load_entry_point(dist, group, name): - """Return `name` entry point of `group` for `dist` or raise ImportError""" - return get_distribution(dist).load_entry_point(group, name) - - -def get_entry_map(dist, group=None): - """Return the entry point map for `group`, or the full entry map""" - return get_distribution(dist).get_entry_map(group) - - -def get_entry_info(dist, group, name): - """Return the EntryPoint object for `group`+`name`, or ``None``""" - return get_distribution(dist).get_entry_info(group, name) - - -class IMetadataProvider: - def has_metadata(name): - """Does the package's distribution contain the named metadata?""" - - def get_metadata(name): - """The named metadata resource as a string""" - - def get_metadata_lines(name): - """Yield named metadata resource as list of non-blank non-comment lines - - Leading and trailing whitespace is stripped from each line, and lines - with ``#`` as the first non-blank character are omitted.""" - - def metadata_isdir(name): - """Is the named metadata a directory? (like ``os.path.isdir()``)""" - - def metadata_listdir(name): - """List of metadata names in the directory (like ``os.listdir()``)""" - - def run_script(script_name, namespace): - """Execute the named script in the supplied namespace dictionary""" - - -class IResourceProvider(IMetadataProvider): - """An object that provides access to package resources""" - - def get_resource_filename(manager, resource_name): - """Return a true filesystem path for `resource_name` - - `manager` must be an ``IResourceManager``""" - - def get_resource_stream(manager, resource_name): - """Return a readable file-like object for `resource_name` - - `manager` must be an ``IResourceManager``""" - - def get_resource_string(manager, resource_name): - """Return a string containing the contents of `resource_name` - - `manager` must be an ``IResourceManager``""" - - def has_resource(resource_name): - """Does the package contain the named resource?""" - - def resource_isdir(resource_name): - """Is the named resource a directory? (like ``os.path.isdir()``)""" - - def resource_listdir(resource_name): - """List of resource names in the directory (like ``os.listdir()``)""" - - -class WorkingSet: - """A collection of active distributions on sys.path (or a similar list)""" - - def __init__(self, entries=None): - """Create working set from list of path entries (default=sys.path)""" - self.entries = [] - self.entry_keys = {} - self.by_key = {} - self.callbacks = [] - - if entries is None: - entries = sys.path - - for entry in entries: - self.add_entry(entry) - - @classmethod - def _build_master(cls): - """ - Prepare the master working set. - """ - ws = cls() - try: - from __main__ import __requires__ - except ImportError: - # The main program does not list any requirements - return ws - - # ensure the requirements are met - try: - ws.require(__requires__) - except VersionConflict: - return cls._build_from_requirements(__requires__) - - return ws - - @classmethod - def _build_from_requirements(cls, req_spec): - """ - Build a working set from a requirement spec. Rewrites sys.path. - """ - # try it without defaults already on sys.path - # by starting with an empty path - ws = cls([]) - reqs = parse_requirements(req_spec) - dists = ws.resolve(reqs, Environment()) - for dist in dists: - ws.add(dist) - - # add any missing entries from sys.path - for entry in sys.path: - if entry not in ws.entries: - ws.add_entry(entry) - - # then copy back to sys.path - sys.path[:] = ws.entries - return ws - - def add_entry(self, entry): - """Add a path item to ``.entries``, finding any distributions on it - - ``find_distributions(entry, True)`` is used to find distributions - corresponding to the path entry, and they are added. `entry` is - always appended to ``.entries``, even if it is already present. - (This is because ``sys.path`` can contain the same value more than - once, and the ``.entries`` of the ``sys.path`` WorkingSet should always - equal ``sys.path``.) - """ - self.entry_keys.setdefault(entry, []) - self.entries.append(entry) - for dist in find_distributions(entry, True): - self.add(dist, entry, False) - - def __contains__(self, dist): - """True if `dist` is the active distribution for its project""" - return self.by_key.get(dist.key) == dist - - def find(self, req): - """Find a distribution matching requirement `req` - - If there is an active distribution for the requested project, this - returns it as long as it meets the version requirement specified by - `req`. But, if there is an active distribution for the project and it - does *not* meet the `req` requirement, ``VersionConflict`` is raised. - If there is no active distribution for the requested project, ``None`` - is returned. - """ - dist = self.by_key.get(req.key) - if dist is not None and dist not in req: - # XXX add more info - raise VersionConflict(dist, req) - return dist - - def iter_entry_points(self, group, name=None): - """Yield entry point objects from `group` matching `name` - - If `name` is None, yields all entry points in `group` from all - distributions in the working set, otherwise only ones matching - both `group` and `name` are yielded (in distribution order). - """ - return ( - entry - for dist in self - for entry in dist.get_entry_map(group).values() - if name is None or name == entry.name - ) - - def run_script(self, requires, script_name): - """Locate distribution for `requires` and run `script_name` script""" - ns = sys._getframe(1).f_globals - name = ns['__name__'] - ns.clear() - ns['__name__'] = name - self.require(requires)[0].run_script(script_name, ns) - - def __iter__(self): - """Yield distributions for non-duplicate projects in the working set - - The yield order is the order in which the items' path entries were - added to the working set. - """ - seen = {} - for item in self.entries: - if item not in self.entry_keys: - # workaround a cache issue - continue - - for key in self.entry_keys[item]: - if key not in seen: - seen[key] = 1 - yield self.by_key[key] - - def add(self, dist, entry=None, insert=True, replace=False): - """Add `dist` to working set, associated with `entry` - - If `entry` is unspecified, it defaults to the ``.location`` of `dist`. - On exit from this routine, `entry` is added to the end of the working - set's ``.entries`` (if it wasn't already present). - - `dist` is only added to the working set if it's for a project that - doesn't already have a distribution in the set, unless `replace=True`. - If it's added, any callbacks registered with the ``subscribe()`` method - will be called. - """ - if insert: - dist.insert_on(self.entries, entry, replace=replace) - - if entry is None: - entry = dist.location - keys = self.entry_keys.setdefault(entry, []) - keys2 = self.entry_keys.setdefault(dist.location, []) - if not replace and dist.key in self.by_key: - # ignore hidden distros - return - - self.by_key[dist.key] = dist - if dist.key not in keys: - keys.append(dist.key) - if dist.key not in keys2: - keys2.append(dist.key) - self._added_new(dist) - - def resolve(self, requirements, env=None, installer=None, - replace_conflicting=False, extras=None): - """List all distributions needed to (recursively) meet `requirements` - - `requirements` must be a sequence of ``Requirement`` objects. `env`, - if supplied, should be an ``Environment`` instance. If - not supplied, it defaults to all distributions available within any - entry or distribution in the working set. `installer`, if supplied, - will be invoked with each requirement that cannot be met by an - already-installed distribution; it should return a ``Distribution`` or - ``None``. - - Unless `replace_conflicting=True`, raises a VersionConflict exception - if - any requirements are found on the path that have the correct name but - the wrong version. Otherwise, if an `installer` is supplied it will be - invoked to obtain the correct version of the requirement and activate - it. - - `extras` is a list of the extras to be used with these requirements. - This is important because extra requirements may look like `my_req; - extra = "my_extra"`, which would otherwise be interpreted as a purely - optional requirement. Instead, we want to be able to assert that these - requirements are truly required. - """ - - # set up the stack - requirements = list(requirements)[::-1] - # set of processed requirements - processed = {} - # key -> dist - best = {} - to_activate = [] - - req_extras = _ReqExtras() - - # Mapping of requirement to set of distributions that required it; - # useful for reporting info about conflicts. - required_by = collections.defaultdict(set) - - while requirements: - # process dependencies breadth-first - req = requirements.pop(0) - if req in processed: - # Ignore cyclic or redundant dependencies - continue - - if not req_extras.markers_pass(req, extras): - continue - - dist = best.get(req.key) - if dist is None: - # Find the best distribution and add it to the map - dist = self.by_key.get(req.key) - if dist is None or (dist not in req and replace_conflicting): - ws = self - if env is None: - if dist is None: - env = Environment(self.entries) - else: - # Use an empty environment and workingset to avoid - # any further conflicts with the conflicting - # distribution - env = Environment([]) - ws = WorkingSet([]) - dist = best[req.key] = env.best_match( - req, ws, installer, - replace_conflicting=replace_conflicting - ) - if dist is None: - requirers = required_by.get(req, None) - raise DistributionNotFound(req, requirers) - to_activate.append(dist) - if dist not in req: - # Oops, the "best" so far conflicts with a dependency - dependent_req = required_by[req] - raise VersionConflict(dist, req).with_context(dependent_req) - - # push the new requirements onto the stack - new_requirements = dist.requires(req.extras)[::-1] - requirements.extend(new_requirements) - - # Register the new requirements needed by req - for new_requirement in new_requirements: - required_by[new_requirement].add(req.project_name) - req_extras[new_requirement] = req.extras - - processed[req] = True - - # return list of distros to activate - return to_activate - - def find_plugins( - self, plugin_env, full_env=None, installer=None, fallback=True): - """Find all activatable distributions in `plugin_env` - - Example usage:: - - distributions, errors = working_set.find_plugins( - Environment(plugin_dirlist) - ) - # add plugins+libs to sys.path - map(working_set.add, distributions) - # display errors - print('Could not load', errors) - - The `plugin_env` should be an ``Environment`` instance that contains - only distributions that are in the project's "plugin directory" or - directories. The `full_env`, if supplied, should be an ``Environment`` - contains all currently-available distributions. If `full_env` is not - supplied, one is created automatically from the ``WorkingSet`` this - method is called on, which will typically mean that every directory on - ``sys.path`` will be scanned for distributions. - - `installer` is a standard installer callback as used by the - ``resolve()`` method. The `fallback` flag indicates whether we should - attempt to resolve older versions of a plugin if the newest version - cannot be resolved. - - This method returns a 2-tuple: (`distributions`, `error_info`), where - `distributions` is a list of the distributions found in `plugin_env` - that were loadable, along with any other distributions that are needed - to resolve their dependencies. `error_info` is a dictionary mapping - unloadable plugin distributions to an exception instance describing the - error that occurred. Usually this will be a ``DistributionNotFound`` or - ``VersionConflict`` instance. - """ - - plugin_projects = list(plugin_env) - # scan project names in alphabetic order - plugin_projects.sort() - - error_info = {} - distributions = {} - - if full_env is None: - env = Environment(self.entries) - env += plugin_env - else: - env = full_env + plugin_env - - shadow_set = self.__class__([]) - # put all our entries in shadow_set - list(map(shadow_set.add, self)) - - for project_name in plugin_projects: - - for dist in plugin_env[project_name]: - - req = [dist.as_requirement()] - - try: - resolvees = shadow_set.resolve(req, env, installer) - - except ResolutionError as v: - # save error info - error_info[dist] = v - if fallback: - # try the next older version of project - continue - else: - # give up on this project, keep going - break - - else: - list(map(shadow_set.add, resolvees)) - distributions.update(dict.fromkeys(resolvees)) - - # success, no need to try any more versions of this project - break - - distributions = list(distributions) - distributions.sort() - - return distributions, error_info - - def require(self, *requirements): - """Ensure that distributions matching `requirements` are activated - - `requirements` must be a string or a (possibly-nested) sequence - thereof, specifying the distributions and versions required. The - return value is a sequence of the distributions that needed to be - activated to fulfill the requirements; all relevant distributions are - included, even if they were already activated in this working set. - """ - needed = self.resolve(parse_requirements(requirements)) - - for dist in needed: - self.add(dist) - - return needed - - def subscribe(self, callback, existing=True): - """Invoke `callback` for all distributions - - If `existing=True` (default), - call on all existing ones, as well. - """ - if callback in self.callbacks: - return - self.callbacks.append(callback) - if not existing: - return - for dist in self: - callback(dist) - - def _added_new(self, dist): - for callback in self.callbacks: - callback(dist) - - def __getstate__(self): - return ( - self.entries[:], self.entry_keys.copy(), self.by_key.copy(), - self.callbacks[:] - ) - - def __setstate__(self, e_k_b_c): - entries, keys, by_key, callbacks = e_k_b_c - self.entries = entries[:] - self.entry_keys = keys.copy() - self.by_key = by_key.copy() - self.callbacks = callbacks[:] - - -class _ReqExtras(dict): - """ - Map each requirement to the extras that demanded it. - """ - - def markers_pass(self, req, extras=None): - """ - Evaluate markers for req against each extra that - demanded it. - - Return False if the req has a marker and fails - evaluation. Otherwise, return True. - """ - extra_evals = ( - req.marker.evaluate({'extra': extra}) - for extra in self.get(req, ()) + (extras or (None,)) - ) - return not req.marker or any(extra_evals) - - -class Environment: - """Searchable snapshot of distributions on a search path""" - - def __init__( - self, search_path=None, platform=get_supported_platform(), - python=PY_MAJOR): - """Snapshot distributions available on a search path - - Any distributions found on `search_path` are added to the environment. - `search_path` should be a sequence of ``sys.path`` items. If not - supplied, ``sys.path`` is used. - - `platform` is an optional string specifying the name of the platform - that platform-specific distributions must be compatible with. If - unspecified, it defaults to the current platform. `python` is an - optional string naming the desired version of Python (e.g. ``'3.6'``); - it defaults to the current version. - - You may explicitly set `platform` (and/or `python`) to ``None`` if you - wish to map *all* distributions, not just those compatible with the - running platform or Python version. - """ - self._distmap = {} - self.platform = platform - self.python = python - self.scan(search_path) - - def can_add(self, dist): - """Is distribution `dist` acceptable for this environment? - - The distribution must match the platform and python version - requirements specified when this environment was created, or False - is returned. - """ - py_compat = ( - self.python is None - or dist.py_version is None - or dist.py_version == self.python - ) - return py_compat and compatible_platforms(dist.platform, self.platform) - - def remove(self, dist): - """Remove `dist` from the environment""" - self._distmap[dist.key].remove(dist) - - def scan(self, search_path=None): - """Scan `search_path` for distributions usable in this environment - - Any distributions found are added to the environment. - `search_path` should be a sequence of ``sys.path`` items. If not - supplied, ``sys.path`` is used. Only distributions conforming to - the platform/python version defined at initialization are added. - """ - if search_path is None: - search_path = sys.path - - for item in search_path: - for dist in find_distributions(item): - self.add(dist) - - def __getitem__(self, project_name): - """Return a newest-to-oldest list of distributions for `project_name` - - Uses case-insensitive `project_name` comparison, assuming all the - project's distributions use their project's name converted to all - lowercase as their key. - - """ - distribution_key = project_name.lower() - return self._distmap.get(distribution_key, []) - - def add(self, dist): - """Add `dist` if we ``can_add()`` it and it has not already been added - """ - if self.can_add(dist) and dist.has_version(): - dists = self._distmap.setdefault(dist.key, []) - if dist not in dists: - dists.append(dist) - dists.sort(key=operator.attrgetter('hashcmp'), reverse=True) - - def best_match( - self, req, working_set, installer=None, replace_conflicting=False): - """Find distribution best matching `req` and usable on `working_set` - - This calls the ``find(req)`` method of the `working_set` to see if a - suitable distribution is already active. (This may raise - ``VersionConflict`` if an unsuitable version of the project is already - active in the specified `working_set`.) If a suitable distribution - isn't active, this method returns the newest distribution in the - environment that meets the ``Requirement`` in `req`. If no suitable - distribution is found, and `installer` is supplied, then the result of - calling the environment's ``obtain(req, installer)`` method will be - returned. - """ - try: - dist = working_set.find(req) - except VersionConflict: - if not replace_conflicting: - raise - dist = None - if dist is not None: - return dist - for dist in self[req.key]: - if dist in req: - return dist - # try to download/install - return self.obtain(req, installer) - - def obtain(self, requirement, installer=None): - """Obtain a distribution matching `requirement` (e.g. via download) - - Obtain a distro that matches requirement (e.g. via download). In the - base ``Environment`` class, this routine just returns - ``installer(requirement)``, unless `installer` is None, in which case - None is returned instead. This method is a hook that allows subclasses - to attempt other ways of obtaining a distribution before falling back - to the `installer` argument.""" - if installer is not None: - return installer(requirement) - - def __iter__(self): - """Yield the unique project names of the available distributions""" - for key in self._distmap.keys(): - if self[key]: - yield key - - def __iadd__(self, other): - """In-place addition of a distribution or environment""" - if isinstance(other, Distribution): - self.add(other) - elif isinstance(other, Environment): - for project in other: - for dist in other[project]: - self.add(dist) - else: - raise TypeError("Can't add %r to environment" % (other,)) - return self - - def __add__(self, other): - """Add an environment or distribution to an environment""" - new = self.__class__([], platform=None, python=None) - for env in self, other: - new += env - return new - - -# XXX backward compatibility -AvailableDistributions = Environment - - -class ExtractionError(RuntimeError): - """An error occurred extracting a resource - - The following attributes are available from instances of this exception: - - manager - The resource manager that raised this exception - - cache_path - The base directory for resource extraction - - original_error - The exception instance that caused extraction to fail - """ - - -class ResourceManager: - """Manage resource extraction and packages""" - extraction_path = None - - def __init__(self): - self.cached_files = {} - - def resource_exists(self, package_or_requirement, resource_name): - """Does the named resource exist?""" - return get_provider(package_or_requirement).has_resource(resource_name) - - def resource_isdir(self, package_or_requirement, resource_name): - """Is the named resource an existing directory?""" - return get_provider(package_or_requirement).resource_isdir( - resource_name - ) - - def resource_filename(self, package_or_requirement, resource_name): - """Return a true filesystem path for specified resource""" - return get_provider(package_or_requirement).get_resource_filename( - self, resource_name - ) - - def resource_stream(self, package_or_requirement, resource_name): - """Return a readable file-like object for specified resource""" - return get_provider(package_or_requirement).get_resource_stream( - self, resource_name - ) - - def resource_string(self, package_or_requirement, resource_name): - """Return specified resource as a string""" - return get_provider(package_or_requirement).get_resource_string( - self, resource_name - ) - - def resource_listdir(self, package_or_requirement, resource_name): - """List the contents of the named resource directory""" - return get_provider(package_or_requirement).resource_listdir( - resource_name - ) - - def extraction_error(self): - """Give an error message for problems extracting file(s)""" - - old_exc = sys.exc_info()[1] - cache_path = self.extraction_path or get_default_cache() - - tmpl = textwrap.dedent(""" - Can't extract file(s) to egg cache - - The following error occurred while trying to extract file(s) - to the Python egg cache: - - {old_exc} - - The Python egg cache directory is currently set to: - - {cache_path} - - Perhaps your account does not have write access to this directory? - You can change the cache directory by setting the PYTHON_EGG_CACHE - environment variable to point to an accessible directory. - """).lstrip() - err = ExtractionError(tmpl.format(**locals())) - err.manager = self - err.cache_path = cache_path - err.original_error = old_exc - raise err - - def get_cache_path(self, archive_name, names=()): - """Return absolute location in cache for `archive_name` and `names` - - The parent directory of the resulting path will be created if it does - not already exist. `archive_name` should be the base filename of the - enclosing egg (which may not be the name of the enclosing zipfile!), - including its ".egg" extension. `names`, if provided, should be a - sequence of path name parts "under" the egg's extraction location. - - This method should only be called by resource providers that need to - obtain an extraction location, and only for names they intend to - extract, as it tracks the generated names for possible cleanup later. - """ - extract_path = self.extraction_path or get_default_cache() - target_path = os.path.join(extract_path, archive_name + '-tmp', *names) - try: - _bypass_ensure_directory(target_path) - except Exception: - self.extraction_error() - - self._warn_unsafe_extraction_path(extract_path) - - self.cached_files[target_path] = 1 - return target_path - - @staticmethod - def _warn_unsafe_extraction_path(path): - """ - If the default extraction path is overridden and set to an insecure - location, such as /tmp, it opens up an opportunity for an attacker to - replace an extracted file with an unauthorized payload. Warn the user - if a known insecure location is used. - - See Distribute #375 for more details. - """ - if os.name == 'nt' and not path.startswith(os.environ['windir']): - # On Windows, permissions are generally restrictive by default - # and temp directories are not writable by other users, so - # bypass the warning. - return - mode = os.stat(path).st_mode - if mode & stat.S_IWOTH or mode & stat.S_IWGRP: - msg = ( - "%s is writable by group/others and vulnerable to attack " - "when " - "used with get_resource_filename. Consider a more secure " - "location (set with .set_extraction_path or the " - "PYTHON_EGG_CACHE environment variable)." % path - ) - warnings.warn(msg, UserWarning) - - def postprocess(self, tempname, filename): - """Perform any platform-specific postprocessing of `tempname` - - This is where Mac header rewrites should be done; other platforms don't - have anything special they should do. - - Resource providers should call this method ONLY after successfully - extracting a compressed resource. They must NOT call it on resources - that are already in the filesystem. - - `tempname` is the current (temporary) name of the file, and `filename` - is the name it will be renamed to by the caller after this routine - returns. - """ - - if os.name == 'posix': - # Make the resource executable - mode = ((os.stat(tempname).st_mode) | 0o555) & 0o7777 - os.chmod(tempname, mode) - - def set_extraction_path(self, path): - """Set the base path where resources will be extracted to, if needed. - - If you do not call this routine before any extractions take place, the - path defaults to the return value of ``get_default_cache()``. (Which - is based on the ``PYTHON_EGG_CACHE`` environment variable, with various - platform-specific fallbacks. See that routine's documentation for more - details.) - - Resources are extracted to subdirectories of this path based upon - information given by the ``IResourceProvider``. You may set this to a - temporary directory, but then you must call ``cleanup_resources()`` to - delete the extracted files when done. There is no guarantee that - ``cleanup_resources()`` will be able to remove all extracted files. - - (Note: you may not change the extraction path for a given resource - manager once resources have been extracted, unless you first call - ``cleanup_resources()``.) - """ - if self.cached_files: - raise ValueError( - "Can't change extraction path, files already extracted" - ) - - self.extraction_path = path - - def cleanup_resources(self, force=False): - """ - Delete all extracted resource files and directories, returning a list - of the file and directory names that could not be successfully removed. - This function does not have any concurrency protection, so it should - generally only be called when the extraction path is a temporary - directory exclusive to a single process. This method is not - automatically called; you must call it explicitly or register it as an - ``atexit`` function if you wish to ensure cleanup of a temporary - directory used for extractions. - """ - # XXX - - -def get_default_cache(): - """ - Return the ``PYTHON_EGG_CACHE`` environment variable - or a platform-relevant user cache dir for an app - named "Python-Eggs". - """ - return ( - os.environ.get('PYTHON_EGG_CACHE') - or appdirs.user_cache_dir(appname='Python-Eggs') - ) - - -def safe_name(name): - """Convert an arbitrary string to a standard distribution name - - Any runs of non-alphanumeric/. characters are replaced with a single '-'. - """ - return re.sub('[^A-Za-z0-9.]+', '-', name) - - -def safe_version(version): - """ - Convert an arbitrary string to a standard version string - """ - try: - # normalize the version - return str(packaging.version.Version(version)) - except packaging.version.InvalidVersion: - version = version.replace(' ', '.') - return re.sub('[^A-Za-z0-9.]+', '-', version) - - -def safe_extra(extra): - """Convert an arbitrary string to a standard 'extra' name - - Any runs of non-alphanumeric characters are replaced with a single '_', - and the result is always lowercased. - """ - return re.sub('[^A-Za-z0-9.-]+', '_', extra).lower() - - -def to_filename(name): - """Convert a project or version name to its filename-escaped form - - Any '-' characters are currently replaced with '_'. - """ - return name.replace('-', '_') - - -def invalid_marker(text): - """ - Validate text as a PEP 508 environment marker; return an exception - if invalid or False otherwise. - """ - try: - evaluate_marker(text) - except SyntaxError as e: - e.filename = None - e.lineno = None - return e - return False - - -def evaluate_marker(text, extra=None): - """ - Evaluate a PEP 508 environment marker. - Return a boolean indicating the marker result in this environment. - Raise SyntaxError if marker is invalid. - - This implementation uses the 'pyparsing' module. - """ - try: - marker = packaging.markers.Marker(text) - return marker.evaluate() - except packaging.markers.InvalidMarker as e: - raise SyntaxError(e) - - -class NullProvider: - """Try to implement resources and metadata for arbitrary PEP 302 loaders""" - - egg_name = None - egg_info = None - loader = None - - def __init__(self, module): - self.loader = getattr(module, '__loader__', None) - self.module_path = os.path.dirname(getattr(module, '__file__', '')) - - def get_resource_filename(self, manager, resource_name): - return self._fn(self.module_path, resource_name) - - def get_resource_stream(self, manager, resource_name): - return io.BytesIO(self.get_resource_string(manager, resource_name)) - - def get_resource_string(self, manager, resource_name): - return self._get(self._fn(self.module_path, resource_name)) - - def has_resource(self, resource_name): - return self._has(self._fn(self.module_path, resource_name)) - - def _get_metadata_path(self, name): - return self._fn(self.egg_info, name) - - def has_metadata(self, name): - if not self.egg_info: - return self.egg_info - - path = self._get_metadata_path(name) - return self._has(path) - - def get_metadata(self, name): - if not self.egg_info: - return "" - value = self._get(self._fn(self.egg_info, name)) - return value.decode('utf-8') if six.PY3 else value - - def get_metadata_lines(self, name): - return yield_lines(self.get_metadata(name)) - - def resource_isdir(self, resource_name): - return self._isdir(self._fn(self.module_path, resource_name)) - - def metadata_isdir(self, name): - return self.egg_info and self._isdir(self._fn(self.egg_info, name)) - - def resource_listdir(self, resource_name): - return self._listdir(self._fn(self.module_path, resource_name)) - - def metadata_listdir(self, name): - if self.egg_info: - return self._listdir(self._fn(self.egg_info, name)) - return [] - - def run_script(self, script_name, namespace): - script = 'scripts/' + script_name - if not self.has_metadata(script): - raise ResolutionError( - "Script {script!r} not found in metadata at {self.egg_info!r}" - .format(**locals()), - ) - script_text = self.get_metadata(script).replace('\r\n', '\n') - script_text = script_text.replace('\r', '\n') - script_filename = self._fn(self.egg_info, script) - namespace['__file__'] = script_filename - if os.path.exists(script_filename): - source = open(script_filename).read() - code = compile(source, script_filename, 'exec') - exec(code, namespace, namespace) - else: - from linecache import cache - cache[script_filename] = ( - len(script_text), 0, script_text.split('\n'), script_filename - ) - script_code = compile(script_text, script_filename, 'exec') - exec(script_code, namespace, namespace) - - def _has(self, path): - raise NotImplementedError( - "Can't perform this operation for unregistered loader type" - ) - - def _isdir(self, path): - raise NotImplementedError( - "Can't perform this operation for unregistered loader type" - ) - - def _listdir(self, path): - raise NotImplementedError( - "Can't perform this operation for unregistered loader type" - ) - - def _fn(self, base, resource_name): - self._validate_resource_path(resource_name) - if resource_name: - return os.path.join(base, *resource_name.split('/')) - return base - - @staticmethod - def _validate_resource_path(path): - """ - Validate the resource paths according to the docs. - https://setuptools.readthedocs.io/en/latest/pkg_resources.html#basic-resource-access - - >>> warned = getfixture('recwarn') - >>> warnings.simplefilter('always') - >>> vrp = NullProvider._validate_resource_path - >>> vrp('foo/bar.txt') - >>> bool(warned) - False - >>> vrp('../foo/bar.txt') - >>> bool(warned) - True - >>> warned.clear() - >>> vrp('/foo/bar.txt') - >>> bool(warned) - True - >>> vrp('foo/../../bar.txt') - >>> bool(warned) - True - >>> warned.clear() - >>> vrp('foo/f../bar.txt') - >>> bool(warned) - False - - Windows path separators are straight-up disallowed. - >>> vrp(r'\\foo/bar.txt') - Traceback (most recent call last): - ... - ValueError: Use of .. or absolute path in a resource path \ -is not allowed. - - >>> vrp(r'C:\\foo/bar.txt') - Traceback (most recent call last): - ... - ValueError: Use of .. or absolute path in a resource path \ -is not allowed. - - Blank values are allowed - - >>> vrp('') - >>> bool(warned) - False - - Non-string values are not. - - >>> vrp(None) - Traceback (most recent call last): - ... - AttributeError: ... - """ - invalid = ( - os.path.pardir in path.split(posixpath.sep) or - posixpath.isabs(path) or - ntpath.isabs(path) - ) - if not invalid: - return - - msg = "Use of .. or absolute path in a resource path is not allowed." - - # Aggressively disallow Windows absolute paths - if ntpath.isabs(path) and not posixpath.isabs(path): - raise ValueError(msg) - - # for compatibility, warn; in future - # raise ValueError(msg) - warnings.warn( - msg[:-1] + " and will raise exceptions in a future release.", - DeprecationWarning, - stacklevel=4, - ) - - def _get(self, path): - if hasattr(self.loader, 'get_data'): - return self.loader.get_data(path) - raise NotImplementedError( - "Can't perform this operation for loaders without 'get_data()'" - ) - - -register_loader_type(object, NullProvider) - - -class EggProvider(NullProvider): - """Provider based on a virtual filesystem""" - - def __init__(self, module): - NullProvider.__init__(self, module) - self._setup_prefix() - - def _setup_prefix(self): - # we assume here that our metadata may be nested inside a "basket" - # of multiple eggs; that's why we use module_path instead of .archive - path = self.module_path - old = None - while path != old: - if _is_egg_path(path): - self.egg_name = os.path.basename(path) - self.egg_info = os.path.join(path, 'EGG-INFO') - self.egg_root = path - break - old = path - path, base = os.path.split(path) - - -class DefaultProvider(EggProvider): - """Provides access to package resources in the filesystem""" - - def _has(self, path): - return os.path.exists(path) - - def _isdir(self, path): - return os.path.isdir(path) - - def _listdir(self, path): - return os.listdir(path) - - def get_resource_stream(self, manager, resource_name): - return open(self._fn(self.module_path, resource_name), 'rb') - - def _get(self, path): - with open(path, 'rb') as stream: - return stream.read() - - @classmethod - def _register(cls): - loader_names = 'SourceFileLoader', 'SourcelessFileLoader', - for name in loader_names: - loader_cls = getattr(importlib_machinery, name, type(None)) - register_loader_type(loader_cls, cls) - - -DefaultProvider._register() - - -class EmptyProvider(NullProvider): - """Provider that returns nothing for all requests""" - - module_path = None - - _isdir = _has = lambda self, path: False - - def _get(self, path): - return '' - - def _listdir(self, path): - return [] - - def __init__(self): - pass - - -empty_provider = EmptyProvider() - - -class ZipManifests(dict): - """ - zip manifest builder - """ - - @classmethod - def build(cls, path): - """ - Build a dictionary similar to the zipimport directory - caches, except instead of tuples, store ZipInfo objects. - - Use a platform-specific path separator (os.sep) for the path keys - for compatibility with pypy on Windows. - """ - with zipfile.ZipFile(path) as zfile: - items = ( - ( - name.replace('/', os.sep), - zfile.getinfo(name), - ) - for name in zfile.namelist() - ) - return dict(items) - - load = build - - -class MemoizedZipManifests(ZipManifests): - """ - Memoized zipfile manifests. - """ - manifest_mod = collections.namedtuple('manifest_mod', 'manifest mtime') - - def load(self, path): - """ - Load a manifest at path or return a suitable manifest already loaded. - """ - path = os.path.normpath(path) - mtime = os.stat(path).st_mtime - - if path not in self or self[path].mtime != mtime: - manifest = self.build(path) - self[path] = self.manifest_mod(manifest, mtime) - - return self[path].manifest - - -class ZipProvider(EggProvider): - """Resource support for zips and eggs""" - - eagers = None - _zip_manifests = MemoizedZipManifests() - - def __init__(self, module): - EggProvider.__init__(self, module) - self.zip_pre = self.loader.archive + os.sep - - def _zipinfo_name(self, fspath): - # Convert a virtual filename (full path to file) into a zipfile subpath - # usable with the zipimport directory cache for our target archive - fspath = fspath.rstrip(os.sep) - if fspath == self.loader.archive: - return '' - if fspath.startswith(self.zip_pre): - return fspath[len(self.zip_pre):] - raise AssertionError( - "%s is not a subpath of %s" % (fspath, self.zip_pre) - ) - - def _parts(self, zip_path): - # Convert a zipfile subpath into an egg-relative path part list. - # pseudo-fs path - fspath = self.zip_pre + zip_path - if fspath.startswith(self.egg_root + os.sep): - return fspath[len(self.egg_root) + 1:].split(os.sep) - raise AssertionError( - "%s is not a subpath of %s" % (fspath, self.egg_root) - ) - - @property - def zipinfo(self): - return self._zip_manifests.load(self.loader.archive) - - def get_resource_filename(self, manager, resource_name): - if not self.egg_name: - raise NotImplementedError( - "resource_filename() only supported for .egg, not .zip" - ) - # no need to lock for extraction, since we use temp names - zip_path = self._resource_to_zip(resource_name) - eagers = self._get_eager_resources() - if '/'.join(self._parts(zip_path)) in eagers: - for name in eagers: - self._extract_resource(manager, self._eager_to_zip(name)) - return self._extract_resource(manager, zip_path) - - @staticmethod - def _get_date_and_size(zip_stat): - size = zip_stat.file_size - # ymdhms+wday, yday, dst - date_time = zip_stat.date_time + (0, 0, -1) - # 1980 offset already done - timestamp = time.mktime(date_time) - return timestamp, size - - def _extract_resource(self, manager, zip_path): - - if zip_path in self._index(): - for name in self._index()[zip_path]: - last = self._extract_resource( - manager, os.path.join(zip_path, name) - ) - # return the extracted directory name - return os.path.dirname(last) - - timestamp, size = self._get_date_and_size(self.zipinfo[zip_path]) - - if not WRITE_SUPPORT: - raise IOError('"os.rename" and "os.unlink" are not supported ' - 'on this platform') - try: - - real_path = manager.get_cache_path( - self.egg_name, self._parts(zip_path) - ) - - if self._is_current(real_path, zip_path): - return real_path - - outf, tmpnam = _mkstemp( - ".$extract", - dir=os.path.dirname(real_path), - ) - os.write(outf, self.loader.get_data(zip_path)) - os.close(outf) - utime(tmpnam, (timestamp, timestamp)) - manager.postprocess(tmpnam, real_path) - - try: - rename(tmpnam, real_path) - - except os.error: - if os.path.isfile(real_path): - if self._is_current(real_path, zip_path): - # the file became current since it was checked above, - # so proceed. - return real_path - # Windows, del old file and retry - elif os.name == 'nt': - unlink(real_path) - rename(tmpnam, real_path) - return real_path - raise - - except os.error: - # report a user-friendly error - manager.extraction_error() - - return real_path - - def _is_current(self, file_path, zip_path): - """ - Return True if the file_path is current for this zip_path - """ - timestamp, size = self._get_date_and_size(self.zipinfo[zip_path]) - if not os.path.isfile(file_path): - return False - stat = os.stat(file_path) - if stat.st_size != size or stat.st_mtime != timestamp: - return False - # check that the contents match - zip_contents = self.loader.get_data(zip_path) - with open(file_path, 'rb') as f: - file_contents = f.read() - return zip_contents == file_contents - - def _get_eager_resources(self): - if self.eagers is None: - eagers = [] - for name in ('native_libs.txt', 'eager_resources.txt'): - if self.has_metadata(name): - eagers.extend(self.get_metadata_lines(name)) - self.eagers = eagers - return self.eagers - - def _index(self): - try: - return self._dirindex - except AttributeError: - ind = {} - for path in self.zipinfo: - parts = path.split(os.sep) - while parts: - parent = os.sep.join(parts[:-1]) - if parent in ind: - ind[parent].append(parts[-1]) - break - else: - ind[parent] = [parts.pop()] - self._dirindex = ind - return ind - - def _has(self, fspath): - zip_path = self._zipinfo_name(fspath) - return zip_path in self.zipinfo or zip_path in self._index() - - def _isdir(self, fspath): - return self._zipinfo_name(fspath) in self._index() - - def _listdir(self, fspath): - return list(self._index().get(self._zipinfo_name(fspath), ())) - - def _eager_to_zip(self, resource_name): - return self._zipinfo_name(self._fn(self.egg_root, resource_name)) - - def _resource_to_zip(self, resource_name): - return self._zipinfo_name(self._fn(self.module_path, resource_name)) - - -register_loader_type(zipimport.zipimporter, ZipProvider) - - -class FileMetadata(EmptyProvider): - """Metadata handler for standalone PKG-INFO files - - Usage:: - - metadata = FileMetadata("/path/to/PKG-INFO") - - This provider rejects all data and metadata requests except for PKG-INFO, - which is treated as existing, and will be the contents of the file at - the provided location. - """ - - def __init__(self, path): - self.path = path - - def _get_metadata_path(self, name): - return self.path - - def has_metadata(self, name): - return name == 'PKG-INFO' and os.path.isfile(self.path) - - def get_metadata(self, name): - if name != 'PKG-INFO': - raise KeyError("No metadata except PKG-INFO is available") - - with io.open(self.path, encoding='utf-8', errors="replace") as f: - metadata = f.read() - self._warn_on_replacement(metadata) - return metadata - - def _warn_on_replacement(self, metadata): - # Python 2.7 compat for: replacement_char = '�' - replacement_char = b'\xef\xbf\xbd'.decode('utf-8') - if replacement_char in metadata: - tmpl = "{self.path} could not be properly decoded in UTF-8" - msg = tmpl.format(**locals()) - warnings.warn(msg) - - def get_metadata_lines(self, name): - return yield_lines(self.get_metadata(name)) - - -class PathMetadata(DefaultProvider): - """Metadata provider for egg directories - - Usage:: - - # Development eggs: - - egg_info = "/path/to/PackageName.egg-info" - base_dir = os.path.dirname(egg_info) - metadata = PathMetadata(base_dir, egg_info) - dist_name = os.path.splitext(os.path.basename(egg_info))[0] - dist = Distribution(basedir, project_name=dist_name, metadata=metadata) - - # Unpacked egg directories: - - egg_path = "/path/to/PackageName-ver-pyver-etc.egg" - metadata = PathMetadata(egg_path, os.path.join(egg_path,'EGG-INFO')) - dist = Distribution.from_filename(egg_path, metadata=metadata) - """ - - def __init__(self, path, egg_info): - self.module_path = path - self.egg_info = egg_info - - -class EggMetadata(ZipProvider): - """Metadata provider for .egg files""" - - def __init__(self, importer): - """Create a metadata provider from a zipimporter""" - - self.zip_pre = importer.archive + os.sep - self.loader = importer - if importer.prefix: - self.module_path = os.path.join(importer.archive, importer.prefix) - else: - self.module_path = importer.archive - self._setup_prefix() - - -_declare_state('dict', _distribution_finders={}) - - -def register_finder(importer_type, distribution_finder): - """Register `distribution_finder` to find distributions in sys.path items - - `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item - handler), and `distribution_finder` is a callable that, passed a path - item and the importer instance, yields ``Distribution`` instances found on - that path item. See ``pkg_resources.find_on_path`` for an example.""" - _distribution_finders[importer_type] = distribution_finder - - -def find_distributions(path_item, only=False): - """Yield distributions accessible via `path_item`""" - importer = get_importer(path_item) - finder = _find_adapter(_distribution_finders, importer) - return finder(importer, path_item, only) - - -def find_eggs_in_zip(importer, path_item, only=False): - """ - Find eggs in zip files; possibly multiple nested eggs. - """ - if importer.archive.endswith('.whl'): - # wheels are not supported with this finder - # they don't have PKG-INFO metadata, and won't ever contain eggs - return - metadata = EggMetadata(importer) - if metadata.has_metadata('PKG-INFO'): - yield Distribution.from_filename(path_item, metadata=metadata) - if only: - # don't yield nested distros - return - for subitem in metadata.resource_listdir(''): - if _is_egg_path(subitem): - subpath = os.path.join(path_item, subitem) - dists = find_eggs_in_zip(zipimport.zipimporter(subpath), subpath) - for dist in dists: - yield dist - elif subitem.lower().endswith('.dist-info'): - subpath = os.path.join(path_item, subitem) - submeta = EggMetadata(zipimport.zipimporter(subpath)) - submeta.egg_info = subpath - yield Distribution.from_location(path_item, subitem, submeta) - - -register_finder(zipimport.zipimporter, find_eggs_in_zip) - - -def find_nothing(importer, path_item, only=False): - return () - - -register_finder(object, find_nothing) - - -def _by_version_descending(names): - """ - Given a list of filenames, return them in descending order - by version number. - - >>> names = 'bar', 'foo', 'Python-2.7.10.egg', 'Python-2.7.2.egg' - >>> _by_version_descending(names) - ['Python-2.7.10.egg', 'Python-2.7.2.egg', 'foo', 'bar'] - >>> names = 'Setuptools-1.2.3b1.egg', 'Setuptools-1.2.3.egg' - >>> _by_version_descending(names) - ['Setuptools-1.2.3.egg', 'Setuptools-1.2.3b1.egg'] - >>> names = 'Setuptools-1.2.3b1.egg', 'Setuptools-1.2.3.post1.egg' - >>> _by_version_descending(names) - ['Setuptools-1.2.3.post1.egg', 'Setuptools-1.2.3b1.egg'] - """ - def _by_version(name): - """ - Parse each component of the filename - """ - name, ext = os.path.splitext(name) - parts = itertools.chain(name.split('-'), [ext]) - return [packaging.version.parse(part) for part in parts] - - return sorted(names, key=_by_version, reverse=True) - - -def find_on_path(importer, path_item, only=False): - """Yield distributions accessible on a sys.path directory""" - path_item = _normalize_cached(path_item) - - if _is_unpacked_egg(path_item): - yield Distribution.from_filename( - path_item, metadata=PathMetadata( - path_item, os.path.join(path_item, 'EGG-INFO') - ) - ) - return - - entries = safe_listdir(path_item) - - # for performance, before sorting by version, - # screen entries for only those that will yield - # distributions - filtered = ( - entry - for entry in entries - if dist_factory(path_item, entry, only) - ) - - # scan for .egg and .egg-info in directory - path_item_entries = _by_version_descending(filtered) - for entry in path_item_entries: - fullpath = os.path.join(path_item, entry) - factory = dist_factory(path_item, entry, only) - for dist in factory(fullpath): - yield dist - - -def dist_factory(path_item, entry, only): - """ - Return a dist_factory for a path_item and entry - """ - lower = entry.lower() - is_meta = any(map(lower.endswith, ('.egg-info', '.dist-info'))) - return ( - distributions_from_metadata - if is_meta else - find_distributions - if not only and _is_egg_path(entry) else - resolve_egg_link - if not only and lower.endswith('.egg-link') else - NoDists() - ) - - -class NoDists: - """ - >>> bool(NoDists()) - False - - >>> list(NoDists()('anything')) - [] - """ - def __bool__(self): - return False - if six.PY2: - __nonzero__ = __bool__ - - def __call__(self, fullpath): - return iter(()) - - -def safe_listdir(path): - """ - Attempt to list contents of path, but suppress some exceptions. - """ - try: - return os.listdir(path) - except (PermissionError, NotADirectoryError): - pass - except OSError as e: - # Ignore the directory if does not exist, not a directory or - # permission denied - ignorable = ( - e.errno in (errno.ENOTDIR, errno.EACCES, errno.ENOENT) - # Python 2 on Windows needs to be handled this way :( - or getattr(e, "winerror", None) == 267 - ) - if not ignorable: - raise - return () - - -def distributions_from_metadata(path): - root = os.path.dirname(path) - if os.path.isdir(path): - if len(os.listdir(path)) == 0: - # empty metadata dir; skip - return - metadata = PathMetadata(root, path) - else: - metadata = FileMetadata(path) - entry = os.path.basename(path) - yield Distribution.from_location( - root, entry, metadata, precedence=DEVELOP_DIST, - ) - - -def non_empty_lines(path): - """ - Yield non-empty lines from file at path - """ - with open(path) as f: - for line in f: - line = line.strip() - if line: - yield line - - -def resolve_egg_link(path): - """ - Given a path to an .egg-link, resolve distributions - present in the referenced path. - """ - referenced_paths = non_empty_lines(path) - resolved_paths = ( - os.path.join(os.path.dirname(path), ref) - for ref in referenced_paths - ) - dist_groups = map(find_distributions, resolved_paths) - return next(dist_groups, ()) - - -register_finder(pkgutil.ImpImporter, find_on_path) - -if hasattr(importlib_machinery, 'FileFinder'): - register_finder(importlib_machinery.FileFinder, find_on_path) - -_declare_state('dict', _namespace_handlers={}) -_declare_state('dict', _namespace_packages={}) - - -def register_namespace_handler(importer_type, namespace_handler): - """Register `namespace_handler` to declare namespace packages - - `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item - handler), and `namespace_handler` is a callable like this:: - - def namespace_handler(importer, path_entry, moduleName, module): - # return a path_entry to use for child packages - - Namespace handlers are only called if the importer object has already - agreed that it can handle the relevant path item, and they should only - return a subpath if the module __path__ does not already contain an - equivalent subpath. For an example namespace handler, see - ``pkg_resources.file_ns_handler``. - """ - _namespace_handlers[importer_type] = namespace_handler - - -def _handle_ns(packageName, path_item): - """Ensure that named package includes a subpath of path_item (if needed)""" - - importer = get_importer(path_item) - if importer is None: - return None - - # capture warnings due to #1111 - with warnings.catch_warnings(): - warnings.simplefilter("ignore") - loader = importer.find_module(packageName) - - if loader is None: - return None - module = sys.modules.get(packageName) - if module is None: - module = sys.modules[packageName] = types.ModuleType(packageName) - module.__path__ = [] - _set_parent_ns(packageName) - elif not hasattr(module, '__path__'): - raise TypeError("Not a package:", packageName) - handler = _find_adapter(_namespace_handlers, importer) - subpath = handler(importer, path_item, packageName, module) - if subpath is not None: - path = module.__path__ - path.append(subpath) - loader.load_module(packageName) - _rebuild_mod_path(path, packageName, module) - return subpath - - -def _rebuild_mod_path(orig_path, package_name, module): - """ - Rebuild module.__path__ ensuring that all entries are ordered - corresponding to their sys.path order - """ - sys_path = [_normalize_cached(p) for p in sys.path] - - def safe_sys_path_index(entry): - """ - Workaround for #520 and #513. - """ - try: - return sys_path.index(entry) - except ValueError: - return float('inf') - - def position_in_sys_path(path): - """ - Return the ordinal of the path based on its position in sys.path - """ - path_parts = path.split(os.sep) - module_parts = package_name.count('.') + 1 - parts = path_parts[:-module_parts] - return safe_sys_path_index(_normalize_cached(os.sep.join(parts))) - - new_path = sorted(orig_path, key=position_in_sys_path) - new_path = [_normalize_cached(p) for p in new_path] - - if isinstance(module.__path__, list): - module.__path__[:] = new_path - else: - module.__path__ = new_path - - -def declare_namespace(packageName): - """Declare that package 'packageName' is a namespace package""" - - _imp.acquire_lock() - try: - if packageName in _namespace_packages: - return - - path = sys.path - parent, _, _ = packageName.rpartition('.') - - if parent: - declare_namespace(parent) - if parent not in _namespace_packages: - __import__(parent) - try: - path = sys.modules[parent].__path__ - except AttributeError: - raise TypeError("Not a package:", parent) - - # Track what packages are namespaces, so when new path items are added, - # they can be updated - _namespace_packages.setdefault(parent or None, []).append(packageName) - _namespace_packages.setdefault(packageName, []) - - for path_item in path: - # Ensure all the parent's path items are reflected in the child, - # if they apply - _handle_ns(packageName, path_item) - - finally: - _imp.release_lock() - - -def fixup_namespace_packages(path_item, parent=None): - """Ensure that previously-declared namespace packages include path_item""" - _imp.acquire_lock() - try: - for package in _namespace_packages.get(parent, ()): - subpath = _handle_ns(package, path_item) - if subpath: - fixup_namespace_packages(subpath, package) - finally: - _imp.release_lock() - - -def file_ns_handler(importer, path_item, packageName, module): - """Compute an ns-package subpath for a filesystem or zipfile importer""" - - subpath = os.path.join(path_item, packageName.split('.')[-1]) - normalized = _normalize_cached(subpath) - for item in module.__path__: - if _normalize_cached(item) == normalized: - break - else: - # Only return the path if it's not already there - return subpath - - -register_namespace_handler(pkgutil.ImpImporter, file_ns_handler) -register_namespace_handler(zipimport.zipimporter, file_ns_handler) - -if hasattr(importlib_machinery, 'FileFinder'): - register_namespace_handler(importlib_machinery.FileFinder, file_ns_handler) - - -def null_ns_handler(importer, path_item, packageName, module): - return None - - -register_namespace_handler(object, null_ns_handler) - - -def normalize_path(filename): - """Normalize a file/dir name for comparison purposes""" - return os.path.normcase(os.path.realpath(os.path.normpath(_cygwin_patch(filename)))) - - -def _cygwin_patch(filename): # pragma: nocover - """ - Contrary to POSIX 2008, on Cygwin, getcwd (3) contains - symlink components. Using - os.path.abspath() works around this limitation. A fix in os.getcwd() - would probably better, in Cygwin even more so, except - that this seems to be by design... - """ - return os.path.abspath(filename) if sys.platform == 'cygwin' else filename - - -def _normalize_cached(filename, _cache={}): - try: - return _cache[filename] - except KeyError: - _cache[filename] = result = normalize_path(filename) - return result - - -def _is_egg_path(path): - """ - Determine if given path appears to be an egg. - """ - return path.lower().endswith('.egg') - - -def _is_unpacked_egg(path): - """ - Determine if given path appears to be an unpacked egg. - """ - return ( - _is_egg_path(path) and - os.path.isfile(os.path.join(path, 'EGG-INFO', 'PKG-INFO')) - ) - - -def _set_parent_ns(packageName): - parts = packageName.split('.') - name = parts.pop() - if parts: - parent = '.'.join(parts) - setattr(sys.modules[parent], name, sys.modules[packageName]) - - -def yield_lines(strs): - """Yield non-empty/non-comment lines of a string or sequence""" - if isinstance(strs, six.string_types): - for s in strs.splitlines(): - s = s.strip() - # skip blank lines/comments - if s and not s.startswith('#'): - yield s - else: - for ss in strs: - for s in yield_lines(ss): - yield s - - -MODULE = re.compile(r"\w+(\.\w+)*$").match -EGG_NAME = re.compile( - r""" - (?P<name>[^-]+) ( - -(?P<ver>[^-]+) ( - -py(?P<pyver>[^-]+) ( - -(?P<plat>.+) - )? - )? - )? - """, - re.VERBOSE | re.IGNORECASE, -).match - - -class EntryPoint: - """Object representing an advertised importable object""" - - def __init__(self, name, module_name, attrs=(), extras=(), dist=None): - if not MODULE(module_name): - raise ValueError("Invalid module name", module_name) - self.name = name - self.module_name = module_name - self.attrs = tuple(attrs) - self.extras = tuple(extras) - self.dist = dist - - def __str__(self): - s = "%s = %s" % (self.name, self.module_name) - if self.attrs: - s += ':' + '.'.join(self.attrs) - if self.extras: - s += ' [%s]' % ','.join(self.extras) - return s - - def __repr__(self): - return "EntryPoint.parse(%r)" % str(self) - - def load(self, require=True, *args, **kwargs): - """ - Require packages for this EntryPoint, then resolve it. - """ - if not require or args or kwargs: - warnings.warn( - "Parameters to load are deprecated. Call .resolve and " - ".require separately.", - PkgResourcesDeprecationWarning, - stacklevel=2, - ) - if require: - self.require(*args, **kwargs) - return self.resolve() - - def resolve(self): - """ - Resolve the entry point from its module and attrs. - """ - module = __import__(self.module_name, fromlist=['__name__'], level=0) - try: - return functools.reduce(getattr, self.attrs, module) - except AttributeError as exc: - raise ImportError(str(exc)) - - def require(self, env=None, installer=None): - if self.extras and not self.dist: - raise UnknownExtra("Can't require() without a distribution", self) - - # Get the requirements for this entry point with all its extras and - # then resolve them. We have to pass `extras` along when resolving so - # that the working set knows what extras we want. Otherwise, for - # dist-info distributions, the working set will assume that the - # requirements for that extra are purely optional and skip over them. - reqs = self.dist.requires(self.extras) - items = working_set.resolve(reqs, env, installer, extras=self.extras) - list(map(working_set.add, items)) - - pattern = re.compile( - r'\s*' - r'(?P<name>.+?)\s*' - r'=\s*' - r'(?P<module>[\w.]+)\s*' - r'(:\s*(?P<attr>[\w.]+))?\s*' - r'(?P<extras>\[.*\])?\s*$' - ) - - @classmethod - def parse(cls, src, dist=None): - """Parse a single entry point from string `src` - - Entry point syntax follows the form:: - - name = some.module:some.attr [extra1, extra2] - - The entry name and module name are required, but the ``:attrs`` and - ``[extras]`` parts are optional - """ - m = cls.pattern.match(src) - if not m: - msg = "EntryPoint must be in 'name=module:attrs [extras]' format" - raise ValueError(msg, src) - res = m.groupdict() - extras = cls._parse_extras(res['extras']) - attrs = res['attr'].split('.') if res['attr'] else () - return cls(res['name'], res['module'], attrs, extras, dist) - - @classmethod - def _parse_extras(cls, extras_spec): - if not extras_spec: - return () - req = Requirement.parse('x' + extras_spec) - if req.specs: - raise ValueError() - return req.extras - - @classmethod - def parse_group(cls, group, lines, dist=None): - """Parse an entry point group""" - if not MODULE(group): - raise ValueError("Invalid group name", group) - this = {} - for line in yield_lines(lines): - ep = cls.parse(line, dist) - if ep.name in this: - raise ValueError("Duplicate entry point", group, ep.name) - this[ep.name] = ep - return this - - @classmethod - def parse_map(cls, data, dist=None): - """Parse a map of entry point groups""" - if isinstance(data, dict): - data = data.items() - else: - data = split_sections(data) - maps = {} - for group, lines in data: - if group is None: - if not lines: - continue - raise ValueError("Entry points must be listed in groups") - group = group.strip() - if group in maps: - raise ValueError("Duplicate group name", group) - maps[group] = cls.parse_group(group, lines, dist) - return maps - - -def _remove_md5_fragment(location): - if not location: - return '' - parsed = urllib.parse.urlparse(location) - if parsed[-1].startswith('md5='): - return urllib.parse.urlunparse(parsed[:-1] + ('',)) - return location - - -def _version_from_file(lines): - """ - Given an iterable of lines from a Metadata file, return - the value of the Version field, if present, or None otherwise. - """ - def is_version_line(line): - return line.lower().startswith('version:') - version_lines = filter(is_version_line, lines) - line = next(iter(version_lines), '') - _, _, value = line.partition(':') - return safe_version(value.strip()) or None - - -class Distribution: - """Wrap an actual or potential sys.path entry w/metadata""" - PKG_INFO = 'PKG-INFO' - - def __init__( - self, location=None, metadata=None, project_name=None, - version=None, py_version=PY_MAJOR, platform=None, - precedence=EGG_DIST): - self.project_name = safe_name(project_name or 'Unknown') - if version is not None: - self._version = safe_version(version) - self.py_version = py_version - self.platform = platform - self.location = location - self.precedence = precedence - self._provider = metadata or empty_provider - - @classmethod - def from_location(cls, location, basename, metadata=None, **kw): - project_name, version, py_version, platform = [None] * 4 - basename, ext = os.path.splitext(basename) - if ext.lower() in _distributionImpl: - cls = _distributionImpl[ext.lower()] - - match = EGG_NAME(basename) - if match: - project_name, version, py_version, platform = match.group( - 'name', 'ver', 'pyver', 'plat' - ) - return cls( - location, metadata, project_name=project_name, version=version, - py_version=py_version, platform=platform, **kw - )._reload_version() - - def _reload_version(self): - return self - - @property - def hashcmp(self): - return ( - self.parsed_version, - self.precedence, - self.key, - _remove_md5_fragment(self.location), - self.py_version or '', - self.platform or '', - ) - - def __hash__(self): - return hash(self.hashcmp) - - def __lt__(self, other): - return self.hashcmp < other.hashcmp - - def __le__(self, other): - return self.hashcmp <= other.hashcmp - - def __gt__(self, other): - return self.hashcmp > other.hashcmp - - def __ge__(self, other): - return self.hashcmp >= other.hashcmp - - def __eq__(self, other): - if not isinstance(other, self.__class__): - # It's not a Distribution, so they are not equal - return False - return self.hashcmp == other.hashcmp - - def __ne__(self, other): - return not self == other - - # These properties have to be lazy so that we don't have to load any - # metadata until/unless it's actually needed. (i.e., some distributions - # may not know their name or version without loading PKG-INFO) - - @property - def key(self): - try: - return self._key - except AttributeError: - self._key = key = self.project_name.lower() - return key - - @property - def parsed_version(self): - if not hasattr(self, "_parsed_version"): - self._parsed_version = parse_version(self.version) - - return self._parsed_version - - def _warn_legacy_version(self): - LV = packaging.version.LegacyVersion - is_legacy = isinstance(self._parsed_version, LV) - if not is_legacy: - return - - # While an empty version is technically a legacy version and - # is not a valid PEP 440 version, it's also unlikely to - # actually come from someone and instead it is more likely that - # it comes from setuptools attempting to parse a filename and - # including it in the list. So for that we'll gate this warning - # on if the version is anything at all or not. - if not self.version: - return - - tmpl = textwrap.dedent(""" - '{project_name} ({version})' is being parsed as a legacy, - non PEP 440, - version. You may find odd behavior and sort order. - In particular it will be sorted as less than 0.0. It - is recommended to migrate to PEP 440 compatible - versions. - """).strip().replace('\n', ' ') - - warnings.warn(tmpl.format(**vars(self)), PEP440Warning) - - @property - def version(self): - try: - return self._version - except AttributeError: - version = self._get_version() - if version is None: - path = self._get_metadata_path_for_display(self.PKG_INFO) - msg = ( - "Missing 'Version:' header and/or {} file at path: {}" - ).format(self.PKG_INFO, path) - raise ValueError(msg, self) - - return version - - @property - def _dep_map(self): - """ - A map of extra to its list of (direct) requirements - for this distribution, including the null extra. - """ - try: - return self.__dep_map - except AttributeError: - self.__dep_map = self._filter_extras(self._build_dep_map()) - return self.__dep_map - - @staticmethod - def _filter_extras(dm): - """ - Given a mapping of extras to dependencies, strip off - environment markers and filter out any dependencies - not matching the markers. - """ - for extra in list(filter(None, dm)): - new_extra = extra - reqs = dm.pop(extra) - new_extra, _, marker = extra.partition(':') - fails_marker = marker and ( - invalid_marker(marker) - or not evaluate_marker(marker) - ) - if fails_marker: - reqs = [] - new_extra = safe_extra(new_extra) or None - - dm.setdefault(new_extra, []).extend(reqs) - return dm - - def _build_dep_map(self): - dm = {} - for name in 'requires.txt', 'depends.txt': - for extra, reqs in split_sections(self._get_metadata(name)): - dm.setdefault(extra, []).extend(parse_requirements(reqs)) - return dm - - def requires(self, extras=()): - """List of Requirements needed for this distro if `extras` are used""" - dm = self._dep_map - deps = [] - deps.extend(dm.get(None, ())) - for ext in extras: - try: - deps.extend(dm[safe_extra(ext)]) - except KeyError: - raise UnknownExtra( - "%s has no such extra feature %r" % (self, ext) - ) - return deps - - def _get_metadata_path_for_display(self, name): - """ - Return the path to the given metadata file, if available. - """ - try: - # We need to access _get_metadata_path() on the provider object - # directly rather than through this class's __getattr__() - # since _get_metadata_path() is marked private. - path = self._provider._get_metadata_path(name) - - # Handle exceptions e.g. in case the distribution's metadata - # provider doesn't support _get_metadata_path(). - except Exception: - return '[could not detect]' - - return path - - def _get_metadata(self, name): - if self.has_metadata(name): - for line in self.get_metadata_lines(name): - yield line - - def _get_version(self): - lines = self._get_metadata(self.PKG_INFO) - version = _version_from_file(lines) - - return version - - def activate(self, path=None, replace=False): - """Ensure distribution is importable on `path` (default=sys.path)""" - if path is None: - path = sys.path - self.insert_on(path, replace=replace) - if path is sys.path: - fixup_namespace_packages(self.location) - for pkg in self._get_metadata('namespace_packages.txt'): - if pkg in sys.modules: - declare_namespace(pkg) - - def egg_name(self): - """Return what this distribution's standard .egg filename should be""" - filename = "%s-%s-py%s" % ( - to_filename(self.project_name), to_filename(self.version), - self.py_version or PY_MAJOR - ) - - if self.platform: - filename += '-' + self.platform - return filename - - def __repr__(self): - if self.location: - return "%s (%s)" % (self, self.location) - else: - return str(self) - - def __str__(self): - try: - version = getattr(self, 'version', None) - except ValueError: - version = None - version = version or "[unknown version]" - return "%s %s" % (self.project_name, version) - - def __getattr__(self, attr): - """Delegate all unrecognized public attributes to .metadata provider""" - if attr.startswith('_'): - raise AttributeError(attr) - return getattr(self._provider, attr) - - def __dir__(self): - return list( - set(super(Distribution, self).__dir__()) - | set( - attr for attr in self._provider.__dir__() - if not attr.startswith('_') - ) - ) - - if not hasattr(object, '__dir__'): - # python 2.7 not supported - del __dir__ - - @classmethod - def from_filename(cls, filename, metadata=None, **kw): - return cls.from_location( - _normalize_cached(filename), os.path.basename(filename), metadata, - **kw - ) - - def as_requirement(self): - """Return a ``Requirement`` that matches this distribution exactly""" - if isinstance(self.parsed_version, packaging.version.Version): - spec = "%s==%s" % (self.project_name, self.parsed_version) - else: - spec = "%s===%s" % (self.project_name, self.parsed_version) - - return Requirement.parse(spec) - - def load_entry_point(self, group, name): - """Return the `name` entry point of `group` or raise ImportError""" - ep = self.get_entry_info(group, name) - if ep is None: - raise ImportError("Entry point %r not found" % ((group, name),)) - return ep.load() - - def get_entry_map(self, group=None): - """Return the entry point map for `group`, or the full entry map""" - try: - ep_map = self._ep_map - except AttributeError: - ep_map = self._ep_map = EntryPoint.parse_map( - self._get_metadata('entry_points.txt'), self - ) - if group is not None: - return ep_map.get(group, {}) - return ep_map - - def get_entry_info(self, group, name): - """Return the EntryPoint object for `group`+`name`, or ``None``""" - return self.get_entry_map(group).get(name) - - def insert_on(self, path, loc=None, replace=False): - """Ensure self.location is on path - - If replace=False (default): - - If location is already in path anywhere, do nothing. - - Else: - - If it's an egg and its parent directory is on path, - insert just ahead of the parent. - - Else: add to the end of path. - If replace=True: - - If location is already on path anywhere (not eggs) - or higher priority than its parent (eggs) - do nothing. - - Else: - - If it's an egg and its parent directory is on path, - insert just ahead of the parent, - removing any lower-priority entries. - - Else: add it to the front of path. - """ - - loc = loc or self.location - if not loc: - return - - nloc = _normalize_cached(loc) - bdir = os.path.dirname(nloc) - npath = [(p and _normalize_cached(p) or p) for p in path] - - for p, item in enumerate(npath): - if item == nloc: - if replace: - break - else: - # don't modify path (even removing duplicates) if - # found and not replace - return - elif item == bdir and self.precedence == EGG_DIST: - # if it's an .egg, give it precedence over its directory - # UNLESS it's already been added to sys.path and replace=False - if (not replace) and nloc in npath[p:]: - return - if path is sys.path: - self.check_version_conflict() - path.insert(p, loc) - npath.insert(p, nloc) - break - else: - if path is sys.path: - self.check_version_conflict() - if replace: - path.insert(0, loc) - else: - path.append(loc) - return - - # p is the spot where we found or inserted loc; now remove duplicates - while True: - try: - np = npath.index(nloc, p + 1) - except ValueError: - break - else: - del npath[np], path[np] - # ha! - p = np - - return - - def check_version_conflict(self): - if self.key == 'setuptools': - # ignore the inevitable setuptools self-conflicts :( - return - - nsp = dict.fromkeys(self._get_metadata('namespace_packages.txt')) - loc = normalize_path(self.location) - for modname in self._get_metadata('top_level.txt'): - if (modname not in sys.modules or modname in nsp - or modname in _namespace_packages): - continue - if modname in ('pkg_resources', 'setuptools', 'site'): - continue - fn = getattr(sys.modules[modname], '__file__', None) - if fn and (normalize_path(fn).startswith(loc) or - fn.startswith(self.location)): - continue - issue_warning( - "Module %s was already imported from %s, but %s is being added" - " to sys.path" % (modname, fn, self.location), - ) - - def has_version(self): - try: - self.version - except ValueError: - issue_warning("Unbuilt egg for " + repr(self)) - return False - return True - - def clone(self, **kw): - """Copy this distribution, substituting in any changed keyword args""" - names = 'project_name version py_version platform location precedence' - for attr in names.split(): - kw.setdefault(attr, getattr(self, attr, None)) - kw.setdefault('metadata', self._provider) - return self.__class__(**kw) - - @property - def extras(self): - return [dep for dep in self._dep_map if dep] - - -class EggInfoDistribution(Distribution): - def _reload_version(self): - """ - Packages installed by distutils (e.g. numpy or scipy), - which uses an old safe_version, and so - their version numbers can get mangled when - converted to filenames (e.g., 1.11.0.dev0+2329eae to - 1.11.0.dev0_2329eae). These distributions will not be - parsed properly - downstream by Distribution and safe_version, so - take an extra step and try to get the version number from - the metadata file itself instead of the filename. - """ - md_version = self._get_version() - if md_version: - self._version = md_version - return self - - -class DistInfoDistribution(Distribution): - """ - Wrap an actual or potential sys.path entry - w/metadata, .dist-info style. - """ - PKG_INFO = 'METADATA' - EQEQ = re.compile(r"([\(,])\s*(\d.*?)\s*([,\)])") - - @property - def _parsed_pkg_info(self): - """Parse and cache metadata""" - try: - return self._pkg_info - except AttributeError: - metadata = self.get_metadata(self.PKG_INFO) - self._pkg_info = email.parser.Parser().parsestr(metadata) - return self._pkg_info - - @property - def _dep_map(self): - try: - return self.__dep_map - except AttributeError: - self.__dep_map = self._compute_dependencies() - return self.__dep_map - - def _compute_dependencies(self): - """Recompute this distribution's dependencies.""" - dm = self.__dep_map = {None: []} - - reqs = [] - # Including any condition expressions - for req in self._parsed_pkg_info.get_all('Requires-Dist') or []: - reqs.extend(parse_requirements(req)) - - def reqs_for_extra(extra): - for req in reqs: - if not req.marker or req.marker.evaluate({'extra': extra}): - yield req - - common = frozenset(reqs_for_extra(None)) - dm[None].extend(common) - - for extra in self._parsed_pkg_info.get_all('Provides-Extra') or []: - s_extra = safe_extra(extra.strip()) - dm[s_extra] = list(frozenset(reqs_for_extra(extra)) - common) - - return dm - - -_distributionImpl = { - '.egg': Distribution, - '.egg-info': EggInfoDistribution, - '.dist-info': DistInfoDistribution, -} - - -def issue_warning(*args, **kw): - level = 1 - g = globals() - try: - # find the first stack frame that is *not* code in - # the pkg_resources module, to use for the warning - while sys._getframe(level).f_globals is g: - level += 1 - except ValueError: - pass - warnings.warn(stacklevel=level + 1, *args, **kw) - - -class RequirementParseError(ValueError): - def __str__(self): - return ' '.join(self.args) - - -def parse_requirements(strs): - """Yield ``Requirement`` objects for each specification in `strs` - - `strs` must be a string, or a (possibly-nested) iterable thereof. - """ - # create a steppable iterator, so we can handle \-continuations - lines = iter(yield_lines(strs)) - - for line in lines: - # Drop comments -- a hash without a space may be in a URL. - if ' #' in line: - line = line[:line.find(' #')] - # If there is a line continuation, drop it, and append the next line. - if line.endswith('\\'): - line = line[:-2].strip() - try: - line += next(lines) - except StopIteration: - return - yield Requirement(line) - - -class Requirement(packaging.requirements.Requirement): - def __init__(self, requirement_string): - """DO NOT CALL THIS UNDOCUMENTED METHOD; use Requirement.parse()!""" - try: - super(Requirement, self).__init__(requirement_string) - except packaging.requirements.InvalidRequirement as e: - raise RequirementParseError(str(e)) - self.unsafe_name = self.name - project_name = safe_name(self.name) - self.project_name, self.key = project_name, project_name.lower() - self.specs = [ - (spec.operator, spec.version) for spec in self.specifier] - self.extras = tuple(map(safe_extra, self.extras)) - self.hashCmp = ( - self.key, - self.specifier, - frozenset(self.extras), - str(self.marker) if self.marker else None, - ) - self.__hash = hash(self.hashCmp) - - def __eq__(self, other): - return ( - isinstance(other, Requirement) and - self.hashCmp == other.hashCmp - ) - - def __ne__(self, other): - return not self == other - - def __contains__(self, item): - if isinstance(item, Distribution): - if item.key != self.key: - return False - - item = item.version - - # Allow prereleases always in order to match the previous behavior of - # this method. In the future this should be smarter and follow PEP 440 - # more accurately. - return self.specifier.contains(item, prereleases=True) - - def __hash__(self): - return self.__hash - - def __repr__(self): - return "Requirement.parse(%r)" % str(self) - - @staticmethod - def parse(s): - req, = parse_requirements(s) - return req - - -def _always_object(classes): - """ - Ensure object appears in the mro even - for old-style classes. - """ - if object not in classes: - return classes + (object,) - return classes - - -def _find_adapter(registry, ob): - """Return an adapter factory for `ob` from `registry`""" - types = _always_object(inspect.getmro(getattr(ob, '__class__', type(ob)))) - for t in types: - if t in registry: - return registry[t] - - -def ensure_directory(path): - """Ensure that the parent directory of `path` exists""" - dirname = os.path.dirname(path) - py31compat.makedirs(dirname, exist_ok=True) - - -def _bypass_ensure_directory(path): - """Sandbox-bypassing version of ensure_directory()""" - if not WRITE_SUPPORT: - raise IOError('"os.mkdir" not supported on this platform.') - dirname, filename = split(path) - if dirname and filename and not isdir(dirname): - _bypass_ensure_directory(dirname) - try: - mkdir(dirname, 0o755) - except FileExistsError: - pass - - -def split_sections(s): - """Split a string or iterable thereof into (section, content) pairs - - Each ``section`` is a stripped version of the section header ("[section]") - and each ``content`` is a list of stripped lines excluding blank lines and - comment-only lines. If there are any such lines before the first section - header, they're returned in a first ``section`` of ``None``. - """ - section = None - content = [] - for line in yield_lines(s): - if line.startswith("["): - if line.endswith("]"): - if section or content: - yield section, content - section = line[1:-1].strip() - content = [] - else: - raise ValueError("Invalid section heading", line) - else: - content.append(line) - - # wrap up last segment - yield section, content - - -def _mkstemp(*args, **kw): - old_open = os.open - try: - # temporarily bypass sandboxing - os.open = os_open - return tempfile.mkstemp(*args, **kw) - finally: - # and then put it back - os.open = old_open - - -# Silence the PEP440Warning by default, so that end users don't get hit by it -# randomly just because they use pkg_resources. We want to append the rule -# because we want earlier uses of filterwarnings to take precedence over this -# one. -warnings.filterwarnings("ignore", category=PEP440Warning, append=True) - - -# from jaraco.functools 1.3 -def _call_aside(f, *args, **kwargs): - f(*args, **kwargs) - return f - - -@_call_aside -def _initialize(g=globals()): - "Set up global resource manager (deliberately not state-saved)" - manager = ResourceManager() - g['_manager'] = manager - g.update( - (name, getattr(manager, name)) - for name in dir(manager) - if not name.startswith('_') - ) - - -@_call_aside -def _initialize_master_working_set(): - """ - Prepare the master working set and make the ``require()`` - API available. - - This function has explicit effects on the global state - of pkg_resources. It is intended to be invoked once at - the initialization of this module. - - Invocation by other packages is unsupported and done - at their own risk. - """ - working_set = WorkingSet._build_master() - _declare_state('object', working_set=working_set) - - require = working_set.require - iter_entry_points = working_set.iter_entry_points - add_activation_listener = working_set.subscribe - run_script = working_set.run_script - # backward compatibility - run_main = run_script - # Activate all distributions already on sys.path with replace=False and - # ensure that all distributions added to the working set in the future - # (e.g. by calling ``require()``) will get activated as well, - # with higher priority (replace=True). - tuple( - dist.activate(replace=False) - for dist in working_set - ) - add_activation_listener( - lambda dist: dist.activate(replace=True), - existing=False, - ) - working_set.entries = [] - # match order - list(map(working_set.add_entry, sys.path)) - globals().update(locals()) - -class PkgResourcesDeprecationWarning(Warning): - """ - Base class for warning about deprecations in ``pkg_resources`` - - This class is not derived from ``DeprecationWarning``, and as such is - visible by default. - """ diff --git a/env/lib/python3.7/site-packages/pkg_resources/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pkg_resources/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 8baa11ef36695ba6e16e076e4a5bb63f2f7d4d63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 99584 zcmd4434B~heJ9?xTCJ8W+ZtbEh91vh$z#iNa?E&Ue9ss>vavl^XP~>)^(42{>XzSY z*-|5sfCrcm7$!gnAp~s5eGn3|ge=({1ags++%Fd)Kr*}8Z1UetvP+W9e!st}SMR-+ ze9Z3u|NpG)erLU^U;XM=zxrKOb#QR7kicK-V_RPT8{d;m{3UOKzejMfA3yJ-`9wk` z$_bTJsb+F6RZb;&oo=SfX*p-g898UmSvlv*IXU;0`{bN2=jGgA?w50+T#)lXc|gv^ za#7BM<v}?Qm51cKuDnjp!{uQ)uP?8c^M>*UId3eF$oYoy4RYR8-X!PE<;`;5Qr;rx zt>vw9-d5fw=Nrp6;+$y?&22AlPbQXh=`Sn4?8!vyrcA=QX}0h}(#<6k{3l<$y!^7K z6Rp%!iKV<#N+ytQ8`9k@>2~RK&W>_Pr@<H5<}Gu#mT#4>bIsf4ZZF?Hx3j!+ZnQiq z&-$8~xv}yX%HEFDdED(P@0z=#e8=4G@@}N)FYhsBXjq;%uoTLBY#9UiYP`Hx@+&s) zoV%-h*WBIZyOF2H!aZ~MmhVd@ocm^8VIkJJ{fWsfUB1ucHmHW0ubg{T`BjqJIza#G z@~h=~7}xig??*llsPz|<a^7Ih8_jt{&il#_svDg2%tM((Ix(AgA?5B@o8)}Fl}RRA zdFNrZ`C{@dN$1v?{doI~N|z7dcM!ir_#MXY2!2QLdj!8n@jHg!Yw&w5e#h~948IBd zPT+SEzt`b+3cu5jB-9qQ_1T2l>YTZlE<diesT-e7l%HrM%1^58>SefoO5LPhj`P#1 zq;AH!tahkdaQ+5$tGW&6XVmR#C(f@|qiPK2H>h3ej%O2@M7dI~s@-Z2p4HU2+N<tV zcd5J8J?dU{pL&IQrFxZmwYpzDp!TT;)kErGwO<`j2h|~USRGME)g$UrbxgfRy;dDp zkEyL{LfxoNsFUh->XbUI&Zx)L6Y5FzlzLi~)i<bT)a%t7R7F))O--u0Qp!<NYFeFD z4K<@?Ra4EWmTIecbxyg{kCZ1-b59*Z&5t>C)Lh}dqh5pi*EkCI4(=D!dEB3O9NbUg z{(^cf?q4hKr*Xfij^qBg+@A%;8fe8Cl~zk{O>Iq-XVp@<sk-GkHCS$`WVx;0Se{qQ zY7Y1~r&iRRIJ?t{sib<7`o?FIWlw#RdNZDN)LYa=oEMzFOXt<Imy_iSa`jeREjkP3 zCG|FS3h%q>?P@R1Z*<;RURKYkyKudtzFFOk^PAMasduP*kn1<9Z&CN+$u|Mscd9Dj ztzJx(-;BF=sT%HT&YMxYx8VMHbr|=D@%AF_-mPB1-3!jMc>7k|f2%r#`$Ks9Hs@{S zx8uos)MI$^nDa1FJcs-Dsw22Rf)wAZ-lq<t%y+17Qzvl#7WIC066bfSZw{4VtY z^#sn(tM5=x;{5Ixk}9D-sGb76FCeGyRMW_58aaKdbIy5>^Q{-bIr02M>MWk0#eKT` zUfh3|YT&-%ychTHbKZC9+b)Ce;Q5D@gXfN<d%yGki;42L<LO7#B|N<(HTnSVFRPE@ z{-e$Z@b!1#{$pwe_cM~)2T^We<~yAanv%a;P2$}o@=BLKgtXtI>bS2v@5B9f;r@G- z!o5QJbos;1Q|kK~3HAN&BESCuHH#X41T{>mA5;&chL>=iQa_}A7}uAbk4QO}Sq`43 z)sLu;<M~JN{5{S``BeR=`UG<L7~W>okEtKW+wWGNR6l`d--D9>o%$3?{uFTaz3L~` zr}6ar)K95@kMsAd�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 E0rD>3rT_o{ diff --git a/env/lib/python3.7/site-packages/pkg_resources/__pycache__/py31compat.cpython-37.pyc b/env/lib/python3.7/site-packages/pkg_resources/__pycache__/py31compat.cpython-37.pyc deleted file mode 100644 index ec420825c9a7a06615b4106c06f531d2b3f20450..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 594 zcmYjO!EO^V5S_7ilTDO_o)F>>_Rxm391*IDQneB)NI}r9ghCX%bh8_K8E;Uw3LFq0 z0^-Ck`N}E3z=?5C5o7sz#xtIIo;m6FyTD?8Ja~H`0DcAIP9!VGyxltn1qw^Z{+^iO z&K8+aLdjAtqbx#D9TltASIlA^En3xc)z)IsjzB_z_Dm%Om`DIZmgt0D>)1pZ7M-l4 zZ~|#}%T?fFi;O9H>GJjIoGI-jPzgkz@pfkn&7g*FxPkA8@CMA|2x?Ju=>*}EK)AiX zL3*?i3t7uWR7g7f!ck0_y`RM;T!CR!z-93wjlHnWC(Bu(RZh;gUrfeCmVB&<jP<SY z`0{-6DwRH}X7!Cv^g4I-)D~Xq_53GLj|u%g9@fihSmo7zZd^Sp%YF5sG3(Lw&Cuz3 zRn^v(ZdeuXr=*=-(Ok3D9F697$ypDo#`mUo6sAX`B>Z$Y8x%OeJzg~6yHspLGqzFC zCEeqL_5y@frFfclDY&T3z)fsi*3#=*lcDfzm%_`JSBJj$QIpH9ndau&`hn3}xqk#G i4#DAH|3N>bOr9*QT9x`~n3D^P667U%vfFFnL-7X-`-kuV diff --git a/env/lib/python3.7/site-packages/pkg_resources/_vendor/__init__.py b/env/lib/python3.7/site-packages/pkg_resources/_vendor/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/env/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index b8e297be182672dbd38ae6666fa5458c5c7f23e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 157 zcmZ?b<>g`kg1p5Nu^{>}h=2h`Aj1KOi&=m~3PUi1CZpd<h9ZzKg81d8Uy@s(Uyxa# zo0(T!l9-dDn^IVrS7Dfzp<kR@Qd&@wpPy5#Uyz+1UzA#$Us{x$TC5*mmYSE6U!)%& epP83g5+AQuP<e~PCO1E&G$+*#Wd3I$W&i-d@F*Do diff --git a/env/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-37.pyc b/env/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-37.pyc deleted file mode 100644 index e105db4075666085b7c77f3923f4df7373c15d8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20645 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 diff --git a/env/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/pyparsing.cpython-37.pyc b/env/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/pyparsing.cpython-37.pyc deleted file mode 100644 index 6387f9cecff92d5f9de1db8a22c867f99dfc52b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 203000 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%0DDhGmPRn}=<v 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 F{{yWe7V-c9 diff --git a/env/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/six.cpython-37.pyc b/env/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/six.cpython-37.pyc deleted file mode 100644 index b5e4dfbc41dbe4ff09ea9a3c9f08b7e4ed53a12b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24358 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 KLMWM*l>ZBXEbOfS diff --git a/env/lib/python3.7/site-packages/pkg_resources/_vendor/appdirs.py b/env/lib/python3.7/site-packages/pkg_resources/_vendor/appdirs.py deleted file mode 100644 index ae67001..0000000 --- a/env/lib/python3.7/site-packages/pkg_resources/_vendor/appdirs.py +++ /dev/null @@ -1,608 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# Copyright (c) 2005-2010 ActiveState Software Inc. -# Copyright (c) 2013 Eddy Petrișor - -"""Utilities for determining application-specific dirs. - -See <http://github.com/ActiveState/appdirs> for details and usage. -""" -# Dev Notes: -# - MSDN on where to store app data files: -# http://support.microsoft.com/default.aspx?scid=kb;en-us;310294#XSLTH3194121123120121120120 -# - Mac OS X: http://developer.apple.com/documentation/MacOSX/Conceptual/BPFileSystem/index.html -# - XDG spec for Un*x: http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html - -__version_info__ = (1, 4, 3) -__version__ = '.'.join(map(str, __version_info__)) - - -import sys -import os - -PY3 = sys.version_info[0] == 3 - -if PY3: - unicode = str - -if sys.platform.startswith('java'): - import platform - os_name = platform.java_ver()[3][0] - if os_name.startswith('Windows'): # "Windows XP", "Windows 7", etc. - system = 'win32' - elif os_name.startswith('Mac'): # "Mac OS X", etc. - system = 'darwin' - else: # "Linux", "SunOS", "FreeBSD", etc. - # Setting this to "linux2" is not ideal, but only Windows or Mac - # are actually checked for and the rest of the module expects - # *sys.platform* style strings. - system = 'linux2' -else: - system = sys.platform - - - -def user_data_dir(appname=None, appauthor=None, version=None, roaming=False): - r"""Return full path to the user-specific data dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "appauthor" (only used on Windows) is the name of the - appauthor or distributing body for this application. Typically - it is the owning company name. This falls back to appname. You may - pass False to disable it. - "version" is an optional version path element to append to the - path. You might want to use this if you want multiple versions - of your app to be able to run independently. If used, this - would typically be "<major>.<minor>". - Only applied when appname is present. - "roaming" (boolean, default False) can be set True to use the Windows - roaming appdata directory. That means that for users on a Windows - network setup for roaming profiles, this user data will be - sync'd on login. See - <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx> - for a discussion of issues. - - Typical user data directories are: - Mac OS X: ~/Library/Application Support/<AppName> - Unix: ~/.local/share/<AppName> # or in $XDG_DATA_HOME, if defined - Win XP (not roaming): C:\Documents and Settings\<username>\Application Data\<AppAuthor>\<AppName> - Win XP (roaming): C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName> - Win 7 (not roaming): C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName> - Win 7 (roaming): C:\Users\<username>\AppData\Roaming\<AppAuthor>\<AppName> - - For Unix, we follow the XDG spec and support $XDG_DATA_HOME. - That means, by default "~/.local/share/<AppName>". - """ - if system == "win32": - if appauthor is None: - appauthor = appname - const = roaming and "CSIDL_APPDATA" or "CSIDL_LOCAL_APPDATA" - path = os.path.normpath(_get_win_folder(const)) - if appname: - if appauthor is not False: - path = os.path.join(path, appauthor, appname) - else: - path = os.path.join(path, appname) - elif system == 'darwin': - path = os.path.expanduser('~/Library/Application Support/') - if appname: - path = os.path.join(path, appname) - else: - path = os.getenv('XDG_DATA_HOME', os.path.expanduser("~/.local/share")) - if appname: - path = os.path.join(path, appname) - if appname and version: - path = os.path.join(path, version) - return path - - -def site_data_dir(appname=None, appauthor=None, version=None, multipath=False): - r"""Return full path to the user-shared data dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "appauthor" (only used on Windows) is the name of the - appauthor or distributing body for this application. Typically - it is the owning company name. This falls back to appname. You may - pass False to disable it. - "version" is an optional version path element to append to the - path. You might want to use this if you want multiple versions - of your app to be able to run independently. If used, this - would typically be "<major>.<minor>". - Only applied when appname is present. - "multipath" is an optional parameter only applicable to *nix - which indicates that the entire list of data dirs should be - returned. By default, the first item from XDG_DATA_DIRS is - returned, or '/usr/local/share/<AppName>', - if XDG_DATA_DIRS is not set - - Typical site data directories are: - Mac OS X: /Library/Application Support/<AppName> - Unix: /usr/local/share/<AppName> or /usr/share/<AppName> - Win XP: C:\Documents and Settings\All Users\Application Data\<AppAuthor>\<AppName> - Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.) - Win 7: C:\ProgramData\<AppAuthor>\<AppName> # Hidden, but writeable on Win 7. - - For Unix, this is using the $XDG_DATA_DIRS[0] default. - - WARNING: Do not use this on Windows. See the Vista-Fail note above for why. - """ - if system == "win32": - if appauthor is None: - appauthor = appname - path = os.path.normpath(_get_win_folder("CSIDL_COMMON_APPDATA")) - if appname: - if appauthor is not False: - path = os.path.join(path, appauthor, appname) - else: - path = os.path.join(path, appname) - elif system == 'darwin': - path = os.path.expanduser('/Library/Application Support') - if appname: - path = os.path.join(path, appname) - else: - # XDG default for $XDG_DATA_DIRS - # only first, if multipath is False - path = os.getenv('XDG_DATA_DIRS', - os.pathsep.join(['/usr/local/share', '/usr/share'])) - pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)] - if appname: - if version: - appname = os.path.join(appname, version) - pathlist = [os.sep.join([x, appname]) for x in pathlist] - - if multipath: - path = os.pathsep.join(pathlist) - else: - path = pathlist[0] - return path - - if appname and version: - path = os.path.join(path, version) - return path - - -def user_config_dir(appname=None, appauthor=None, version=None, roaming=False): - r"""Return full path to the user-specific config dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "appauthor" (only used on Windows) is the name of the - appauthor or distributing body for this application. Typically - it is the owning company name. This falls back to appname. You may - pass False to disable it. - "version" is an optional version path element to append to the - path. You might want to use this if you want multiple versions - of your app to be able to run independently. If used, this - would typically be "<major>.<minor>". - Only applied when appname is present. - "roaming" (boolean, default False) can be set True to use the Windows - roaming appdata directory. That means that for users on a Windows - network setup for roaming profiles, this user data will be - sync'd on login. See - <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx> - for a discussion of issues. - - Typical user config directories are: - Mac OS X: same as user_data_dir - Unix: ~/.config/<AppName> # or in $XDG_CONFIG_HOME, if defined - Win *: same as user_data_dir - - For Unix, we follow the XDG spec and support $XDG_CONFIG_HOME. - That means, by default "~/.config/<AppName>". - """ - if system in ["win32", "darwin"]: - path = user_data_dir(appname, appauthor, None, roaming) - else: - path = os.getenv('XDG_CONFIG_HOME', os.path.expanduser("~/.config")) - if appname: - path = os.path.join(path, appname) - if appname and version: - path = os.path.join(path, version) - return path - - -def site_config_dir(appname=None, appauthor=None, version=None, multipath=False): - r"""Return full path to the user-shared data dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "appauthor" (only used on Windows) is the name of the - appauthor or distributing body for this application. Typically - it is the owning company name. This falls back to appname. You may - pass False to disable it. - "version" is an optional version path element to append to the - path. You might want to use this if you want multiple versions - of your app to be able to run independently. If used, this - would typically be "<major>.<minor>". - Only applied when appname is present. - "multipath" is an optional parameter only applicable to *nix - which indicates that the entire list of config dirs should be - returned. By default, the first item from XDG_CONFIG_DIRS is - returned, or '/etc/xdg/<AppName>', if XDG_CONFIG_DIRS is not set - - Typical site config directories are: - Mac OS X: same as site_data_dir - Unix: /etc/xdg/<AppName> or $XDG_CONFIG_DIRS[i]/<AppName> for each value in - $XDG_CONFIG_DIRS - Win *: same as site_data_dir - Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.) - - For Unix, this is using the $XDG_CONFIG_DIRS[0] default, if multipath=False - - WARNING: Do not use this on Windows. See the Vista-Fail note above for why. - """ - if system in ["win32", "darwin"]: - path = site_data_dir(appname, appauthor) - if appname and version: - path = os.path.join(path, version) - else: - # XDG default for $XDG_CONFIG_DIRS - # only first, if multipath is False - path = os.getenv('XDG_CONFIG_DIRS', '/etc/xdg') - pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)] - if appname: - if version: - appname = os.path.join(appname, version) - pathlist = [os.sep.join([x, appname]) for x in pathlist] - - if multipath: - path = os.pathsep.join(pathlist) - else: - path = pathlist[0] - return path - - -def user_cache_dir(appname=None, appauthor=None, version=None, opinion=True): - r"""Return full path to the user-specific cache dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "appauthor" (only used on Windows) is the name of the - appauthor or distributing body for this application. Typically - it is the owning company name. This falls back to appname. You may - pass False to disable it. - "version" is an optional version path element to append to the - path. You might want to use this if you want multiple versions - of your app to be able to run independently. If used, this - would typically be "<major>.<minor>". - Only applied when appname is present. - "opinion" (boolean) can be False to disable the appending of - "Cache" to the base app data dir for Windows. See - discussion below. - - Typical user cache directories are: - Mac OS X: ~/Library/Caches/<AppName> - Unix: ~/.cache/<AppName> (XDG default) - Win XP: C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName>\Cache - Vista: C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName>\Cache - - On Windows the only suggestion in the MSDN docs is that local settings go in - the `CSIDL_LOCAL_APPDATA` directory. This is identical to the non-roaming - app data dir (the default returned by `user_data_dir` above). Apps typically - put cache data somewhere *under* the given dir here. Some examples: - ...\Mozilla\Firefox\Profiles\<ProfileName>\Cache - ...\Acme\SuperApp\Cache\1.0 - OPINION: This function appends "Cache" to the `CSIDL_LOCAL_APPDATA` value. - This can be disabled with the `opinion=False` option. - """ - if system == "win32": - if appauthor is None: - appauthor = appname - path = os.path.normpath(_get_win_folder("CSIDL_LOCAL_APPDATA")) - if appname: - if appauthor is not False: - path = os.path.join(path, appauthor, appname) - else: - path = os.path.join(path, appname) - if opinion: - path = os.path.join(path, "Cache") - elif system == 'darwin': - path = os.path.expanduser('~/Library/Caches') - if appname: - path = os.path.join(path, appname) - else: - path = os.getenv('XDG_CACHE_HOME', os.path.expanduser('~/.cache')) - if appname: - path = os.path.join(path, appname) - if appname and version: - path = os.path.join(path, version) - return path - - -def user_state_dir(appname=None, appauthor=None, version=None, roaming=False): - r"""Return full path to the user-specific state dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "appauthor" (only used on Windows) is the name of the - appauthor or distributing body for this application. Typically - it is the owning company name. This falls back to appname. You may - pass False to disable it. - "version" is an optional version path element to append to the - path. You might want to use this if you want multiple versions - of your app to be able to run independently. If used, this - would typically be "<major>.<minor>". - Only applied when appname is present. - "roaming" (boolean, default False) can be set True to use the Windows - roaming appdata directory. That means that for users on a Windows - network setup for roaming profiles, this user data will be - sync'd on login. See - <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx> - for a discussion of issues. - - Typical user state directories are: - Mac OS X: same as user_data_dir - Unix: ~/.local/state/<AppName> # or in $XDG_STATE_HOME, if defined - Win *: same as user_data_dir - - For Unix, we follow this Debian proposal <https://wiki.debian.org/XDGBaseDirectorySpecification#state> - to extend the XDG spec and support $XDG_STATE_HOME. - - That means, by default "~/.local/state/<AppName>". - """ - if system in ["win32", "darwin"]: - path = user_data_dir(appname, appauthor, None, roaming) - else: - path = os.getenv('XDG_STATE_HOME', os.path.expanduser("~/.local/state")) - if appname: - path = os.path.join(path, appname) - if appname and version: - path = os.path.join(path, version) - return path - - -def user_log_dir(appname=None, appauthor=None, version=None, opinion=True): - r"""Return full path to the user-specific log dir for this application. - - "appname" is the name of application. - If None, just the system directory is returned. - "appauthor" (only used on Windows) is the name of the - appauthor or distributing body for this application. Typically - it is the owning company name. This falls back to appname. You may - pass False to disable it. - "version" is an optional version path element to append to the - path. You might want to use this if you want multiple versions - of your app to be able to run independently. If used, this - would typically be "<major>.<minor>". - Only applied when appname is present. - "opinion" (boolean) can be False to disable the appending of - "Logs" to the base app data dir for Windows, and "log" to the - base cache dir for Unix. See discussion below. - - Typical user log directories are: - Mac OS X: ~/Library/Logs/<AppName> - Unix: ~/.cache/<AppName>/log # or under $XDG_CACHE_HOME if defined - Win XP: C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName>\Logs - Vista: C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName>\Logs - - On Windows the only suggestion in the MSDN docs is that local settings - go in the `CSIDL_LOCAL_APPDATA` directory. (Note: I'm interested in - examples of what some windows apps use for a logs dir.) - - OPINION: This function appends "Logs" to the `CSIDL_LOCAL_APPDATA` - value for Windows and appends "log" to the user cache dir for Unix. - This can be disabled with the `opinion=False` option. - """ - if system == "darwin": - path = os.path.join( - os.path.expanduser('~/Library/Logs'), - appname) - elif system == "win32": - path = user_data_dir(appname, appauthor, version) - version = False - if opinion: - path = os.path.join(path, "Logs") - else: - path = user_cache_dir(appname, appauthor, version) - version = False - if opinion: - path = os.path.join(path, "log") - if appname and version: - path = os.path.join(path, version) - return path - - -class AppDirs(object): - """Convenience wrapper for getting application dirs.""" - def __init__(self, appname=None, appauthor=None, version=None, - roaming=False, multipath=False): - self.appname = appname - self.appauthor = appauthor - self.version = version - self.roaming = roaming - self.multipath = multipath - - @property - def user_data_dir(self): - return user_data_dir(self.appname, self.appauthor, - version=self.version, roaming=self.roaming) - - @property - def site_data_dir(self): - return site_data_dir(self.appname, self.appauthor, - version=self.version, multipath=self.multipath) - - @property - def user_config_dir(self): - return user_config_dir(self.appname, self.appauthor, - version=self.version, roaming=self.roaming) - - @property - def site_config_dir(self): - return site_config_dir(self.appname, self.appauthor, - version=self.version, multipath=self.multipath) - - @property - def user_cache_dir(self): - return user_cache_dir(self.appname, self.appauthor, - version=self.version) - - @property - def user_state_dir(self): - return user_state_dir(self.appname, self.appauthor, - version=self.version) - - @property - def user_log_dir(self): - return user_log_dir(self.appname, self.appauthor, - version=self.version) - - -#---- internal support stuff - -def _get_win_folder_from_registry(csidl_name): - """This is a fallback technique at best. I'm not sure if using the - registry for this guarantees us the correct answer for all CSIDL_* - names. - """ - if PY3: - import winreg as _winreg - else: - import _winreg - - shell_folder_name = { - "CSIDL_APPDATA": "AppData", - "CSIDL_COMMON_APPDATA": "Common AppData", - "CSIDL_LOCAL_APPDATA": "Local AppData", - }[csidl_name] - - key = _winreg.OpenKey( - _winreg.HKEY_CURRENT_USER, - r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" - ) - dir, type = _winreg.QueryValueEx(key, shell_folder_name) - return dir - - -def _get_win_folder_with_pywin32(csidl_name): - from win32com.shell import shellcon, shell - dir = shell.SHGetFolderPath(0, getattr(shellcon, csidl_name), 0, 0) - # Try to make this a unicode path because SHGetFolderPath does - # not return unicode strings when there is unicode data in the - # path. - try: - dir = unicode(dir) - - # Downgrade to short path name if have highbit chars. See - # <http://bugs.activestate.com/show_bug.cgi?id=85099>. - has_high_char = False - for c in dir: - if ord(c) > 255: - has_high_char = True - break - if has_high_char: - try: - import win32api - dir = win32api.GetShortPathName(dir) - except ImportError: - pass - except UnicodeError: - pass - return dir - - -def _get_win_folder_with_ctypes(csidl_name): - import ctypes - - csidl_const = { - "CSIDL_APPDATA": 26, - "CSIDL_COMMON_APPDATA": 35, - "CSIDL_LOCAL_APPDATA": 28, - }[csidl_name] - - buf = ctypes.create_unicode_buffer(1024) - ctypes.windll.shell32.SHGetFolderPathW(None, csidl_const, None, 0, buf) - - # Downgrade to short path name if have highbit chars. See - # <http://bugs.activestate.com/show_bug.cgi?id=85099>. - has_high_char = False - for c in buf: - if ord(c) > 255: - has_high_char = True - break - if has_high_char: - buf2 = ctypes.create_unicode_buffer(1024) - if ctypes.windll.kernel32.GetShortPathNameW(buf.value, buf2, 1024): - buf = buf2 - - return buf.value - -def _get_win_folder_with_jna(csidl_name): - import array - from com.sun import jna - from com.sun.jna.platform import win32 - - buf_size = win32.WinDef.MAX_PATH * 2 - buf = array.zeros('c', buf_size) - shell = win32.Shell32.INSTANCE - shell.SHGetFolderPath(None, getattr(win32.ShlObj, csidl_name), None, win32.ShlObj.SHGFP_TYPE_CURRENT, buf) - dir = jna.Native.toString(buf.tostring()).rstrip("\0") - - # Downgrade to short path name if have highbit chars. See - # <http://bugs.activestate.com/show_bug.cgi?id=85099>. - has_high_char = False - for c in dir: - if ord(c) > 255: - has_high_char = True - break - if has_high_char: - buf = array.zeros('c', buf_size) - kernel = win32.Kernel32.INSTANCE - if kernel.GetShortPathName(dir, buf, buf_size): - dir = jna.Native.toString(buf.tostring()).rstrip("\0") - - return dir - -if system == "win32": - try: - import win32com.shell - _get_win_folder = _get_win_folder_with_pywin32 - except ImportError: - try: - from ctypes import windll - _get_win_folder = _get_win_folder_with_ctypes - except ImportError: - try: - import com.sun.jna - _get_win_folder = _get_win_folder_with_jna - except ImportError: - _get_win_folder = _get_win_folder_from_registry - - -#---- self test code - -if __name__ == "__main__": - appname = "MyApp" - appauthor = "MyCompany" - - props = ("user_data_dir", - "user_config_dir", - "user_cache_dir", - "user_state_dir", - "user_log_dir", - "site_data_dir", - "site_config_dir") - - print("-- app dirs %s --" % __version__) - - print("-- app dirs (with optional 'version')") - dirs = AppDirs(appname, appauthor, version="1.0") - for prop in props: - print("%s: %s" % (prop, getattr(dirs, prop))) - - print("\n-- app dirs (without optional 'version')") - dirs = AppDirs(appname, appauthor) - for prop in props: - print("%s: %s" % (prop, getattr(dirs, prop))) - - print("\n-- app dirs (without optional 'appauthor')") - dirs = AppDirs(appname) - for prop in props: - print("%s: %s" % (prop, getattr(dirs, prop))) - - print("\n-- app dirs (with disabled 'appauthor')") - dirs = AppDirs(appname, appauthor=False) - for prop in props: - print("%s: %s" % (prop, getattr(dirs, prop))) diff --git a/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__about__.py b/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__about__.py deleted file mode 100644 index 95d330e..0000000 --- a/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__about__.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -__all__ = [ - "__title__", "__summary__", "__uri__", "__version__", "__author__", - "__email__", "__license__", "__copyright__", -] - -__title__ = "packaging" -__summary__ = "Core utilities for Python packages" -__uri__ = "https://github.com/pypa/packaging" - -__version__ = "16.8" - -__author__ = "Donald Stufft and individual contributors" -__email__ = "donald@stufft.io" - -__license__ = "BSD or Apache License, Version 2.0" -__copyright__ = "Copyright 2014-2016 %s" % __author__ diff --git a/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__init__.py b/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__init__.py deleted file mode 100644 index 5ee6220..0000000 --- a/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -from .__about__ import ( - __author__, __copyright__, __email__, __license__, __summary__, __title__, - __uri__, __version__ -) - -__all__ = [ - "__title__", "__summary__", "__uri__", "__version__", "__author__", - "__email__", "__license__", "__copyright__", -] diff --git a/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-37.pyc b/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-37.pyc deleted file mode 100644 index 560fd91fa8daf9074e450dc38f7d91a184e9e981..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 693 zcmYL{&uiN-6vyp2KO84%v#pdJwZaa8HEzl%V~o+YJ&w^4*g-Ia<0spqwxsGunEmhU zwEt%3TzA^Pu+yZ5QVD%{Pdt6~-jl9ovm|hX|9tuVcP|M3c;|7%&bV|--#S15VI4Ff z4x1kCH4%=&0D2HX9|kal5yUVqW88-X4`70aFvTO7;TR6^7!Gj)b3B1(bbK7(DLh{X zix+>LYOsiQhuKDp+8Rn&BZV@%7}%C+Ciw0^D#i^dEYFSi$AlPWYD&m%LWs6ald0A@ zBSNfV``s;7{;YEnLNaSAp`7hb(k5f|KBi_l<=V^42+4(P6)P*_!(^7<WhLWfcXBNh zMb@yI8AdfKghIEiljCR~M0NM7GDhn6X<9N<+08N+O)6WNrB5>b)y48%x402Js{yTz zEeeA&4v2AICfKY-x!^{zjWt5)ZVnHjm--=e$wYT@wZ1{__D@c=qUiHJ`8Vj>zEX6) zJnN3HAFDv;XREiT4j1UP{<4_)HWb!a<;qp=i31gR^c{TPvfA}T4gA*7W8~pqUX4Bc z?@$wusl%^8&AsjM?`vurnMx*48P~??oWgy}f2@is)znyNgs62Y?@FSm7FOj{r({bx p2=&yT)Mc;{*7bfV+g<#j5nyZj(PyWR9FC$SOrn11X3tH}@IRQ-&!zwX diff --git a/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index a07fbcfb2868663034f2c6ba75d734d143ea2113..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 531 zcmYk2&1&2*5XWVE*PrWzLJxg}?jbd~ms0uwrO=)PWpFI5SH$|rNLsqj(^Fr`*PikU zJynw>Ap`m`BhANO^QG@wmdyNq_cO~G`%A&I)yessj{lJ$n8+5UGoI<3=epoU#zZcP zWuv!zt4m($idVYkwQhK$Ti)u9cY4QnDQ_dTq7;>=MI&0#%{A}E?mOG}kEt`;7wh$S z=j{@M1f`wDu+~DIlvmcQR}Pg4aEN9KDSphTqF!5oF@~c>fVBshtUIHck0FH(fYhT} zlG_0+YLdpwOW>o{Bc3lwL4}3xD}adVl5mnpQvt9`bC8yUJ3>z=3A7e$2vx$@{S|3B z#1Jtx!?Z+(1!0pwTE;sYldMZImAvZk)c<MH%Mg+?E=l|!hHogF@bB9Yv>TjqH_G^s z-fzUi+5Eaa90xB$bivxi5AJ>jl-@?1q#xiUjj%Ylak?L8W#$1u8I`nraObuDsI7>L P{6soE{p@Z2zHGDqAAXL1 diff --git a/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-37.pyc b/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-37.pyc deleted file mode 100644 index 3b51b6f73f40d49c4ff9e3aef67eb86c3d6af097..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 983 zcmah{OK%e~5cXq}Y(ttHs48BEa6!tUSpnCoLV(1rAR!^K0$J|bX_xM+wznl!Iki&z zGeDg9OTKdIU*N=y(}p4rj5On!vHi_AV?SSA?Gupd`<;&;I3YhVxE2P^Gf?{uj3SB_ zq@*b=S;|VDa*8=tL}{d>PaQ?>62<pf+FeEwL_OUzFLgYl=}OhreOy&Xb<aq8OR=|P z(z^s~GU0wCcWhm>PK&&3YU6yY^26Nbb>)YR$tx#jZIwBQw=a>{C9owK#oHhlbU}Nd z_7Rv@<eZ$-8B<iTvskeUddj~rN50Y%rnri7@-2e$o#UiG26<t$bb2huJJRZLR!D2d zN4eXBOsSm=iD@{Q0r*m|EQ-AcMw65(lCqnHQ?59aiH;v4n)rjYS=5;<?ACOd%Ax>8 z2(GBNLG1v{1wEk`<b<Ch6y5#-c%Em4^-(2D?fY&ow*rY<Pt}C^&ccrn+TcWfy-r-& zBu(CI<dt=@C^po=y!!ljwwGA#+Q!v&VUuQmR~T*U)@0fy;!szrHc2D1eYu-gyNSr^ zvXO4u%zaOYN*@XF06F4w5PCfMZ;R8bTieh;3_h?I!uN$JYt<I$4}>^qWwF>XBft#} zOqjtznAPiq8G`3mmczRbVc-!{gLCsEr|}y}GZ*3Uu3&uR=8X=(6TW~8z<B51N}<T` z@3z*kQh2J~IydVOO$OM)taYt{77R|q;Kwj{%5yunesHJ_er1tYv)c1F@1LM~3Y*UO q0T>vsKxWqW!{dcaKo6{Ln7}FCTuf{WOIS>;v6v6(Fp6l*y8JgkVE8`( diff --git a/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-37.pyc b/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-37.pyc deleted file mode 100644 index 4b57bef1795700f51925cbfb21f17fe30d478fbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2835 zcmcImPjAyO6t|N$O}lREV88|fi4%&%s6awO0-^CoATGUZr%K2QvD*dGB(t4~P29?X z@4<<$lq)B`0w>;c7ig!1ls|Lj_nbW2zvt)oe(BTI)eeCcf8KiisY%FJd?;E22D{MJ za}b<x8j%Sd(up;+Cic*#<R#%2w?7hYi^kL*HbrwvhD~_e;7xejG;bZ@z*~nqd&Fyf zgPn+H=j;9(l|-2qES#i?)Va&UqfmuOoUf%aj5Ql&aiHNjz!gQaV6Y2a?Sl|xNI4l= zoO0_U8QR?D4bXti9nekQ;x1^1w|NJ2i?8r5XqT_@HPCIo&U>Ice1l&Ay}~bohnu<k zDjtP#sE-2*AlOi2e+FG)P&kE|)<8nQ$QR<#yrD!ik`6o?@qMqaCuu(o)15F@+K-|g zes~<ezdJhUE1|PgCrPCG>ANwLLM53DgzB>+5%Wa$Q$Kj;kHdJ}XG+T~&>76RlOE?T zgW0KMtc`wPC<r~-D7?K>SQp&3VUlsX3j<9w{XnL4itf{aXXT9pUmfHP+}5MA1#^BK zLb~vXpg4yy+@K6}W(|xxFa>p4tX`OnJ<EXP%|ssvc^1oIEYggv&mpbP9S?1Ph9g&D zt1=Y9*o7(-uq~jR3E>9_;afVjiV$`nYw?cbK;&&$8u>~wc6!h%2gD&`mns}UTe$;k zutJl<fi5|9LH6*J8z5>>V>sGY1uEJWP|GfHfBq7y&NhZ?x>kXLw*Q0z{@$oU!Ly+M z*ibK=MW4ov=DmR!`#L-lMUqw2K#Q?hj2XKLTNNeHE7m~W8RNj~VzI>j1km#iW0Qnu z5stfz9cF$svq&sniNz%GIwdB%#9WjYQEZ~X%#c@5{A85b2rJT%4pyqdRj%dQi$7xz z!1S|WN$x^FN79s+VgKropYr8Nd#8xnERjkn$3)0Oe+{S5lkKzD^fy!|@iQk^K$Ksy zxsuy8s7rEPZJC&>@6Ul<DLLX&bXO0B33jgz3Jb<W8z!RuJ?AY&I3}s@*8ran*O^j! zPy@Xb;Vpc%$_URC?86$UrC6^X3TfeS9n^BvXGo%=5RiDD%)xAx<YvKm5<e$$8^u)= z|4eSkBe$SeksI0vUJLnkl;J-k_}7C8D=}jw{x{2=<jq?VXmdovOJyvYyN_o4{213L MB-Ty4cin;h1KtYu1ONa4 diff --git a/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-37.pyc b/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-37.pyc deleted file mode 100644 index c3a1c5daf32822a292d5c1a5d150e59c1d1fb4de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8843 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 diff --git a/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-37.pyc b/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-37.pyc deleted file mode 100644 index 8c338e7ad127cc7faa7af40660da60cdb079432f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3848 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 diff --git a/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc b/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc deleted file mode 100644 index 3d0828e4205edb307fc2e69d7c51a269e2518e6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19761 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 B))4>z diff --git a/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-37.pyc b/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-37.pyc deleted file mode 100644 index 6b8dc09d4e0ff84a4022d17cfdc88f55e1821898..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 462 zcmY*Vy-ve05VoB(jSA&QFz^ZyY9p8tLNL>XEvT~6*bP=4+t^NND@Goq6=L9(yfX0$ zov<q*!AbY|?tJI(KHv8HJ>X5epN&5t0AC^bwa5oI-p!>40tn=wfdy<(ftsj@V5lJ; z7cq_39TII|k&u{l-ayeM=mBKOx1R%9<POV;k-W7Ovqnj6T}s%T87750P?`ygr>&^0 z&qu4|ae#;8^U5!?vv9`V@4TBM4;HK;fv;eL)@TDf4H|9Xz_Xm-suWVNs^n}%v8FX$ zxX82<*WvPo>I}MAlnwm^I%wYB=eAL~VrsyIu_fmN^1Kv_i|JEtsBM*%lAB!3YX6jx zt*)ra@tg`Gb*{>4R@O|^d21OrL$!3r|JVc3epnfK07!>8OI;6pskYS=V;ydE_+uUP oIi#uUR<coyQ=NoznAxrR2lhg1deunMa(W#GP3S#EY1E5;08~nOApigX diff --git a/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-37.pyc b/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-37.pyc deleted file mode 100644 index 755bf5bbc07f702337523229ff6efb48905b11e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10528 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 diff --git a/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/_compat.py b/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/_compat.py deleted file mode 100644 index 210bb80..0000000 --- a/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/_compat.py +++ /dev/null @@ -1,30 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -import sys - - -PY2 = sys.version_info[0] == 2 -PY3 = sys.version_info[0] == 3 - -# flake8: noqa - -if PY3: - string_types = str, -else: - string_types = basestring, - - -def with_metaclass(meta, *bases): - """ - Create a base class with a metaclass. - """ - # This requires a bit of explanation: the basic idea is to make a dummy - # metaclass for one level of class instantiation that replaces itself with - # the actual metaclass. - class metaclass(meta): - def __new__(cls, name, this_bases, d): - return meta(name, bases, d) - return type.__new__(metaclass, 'temporary_class', (), {}) diff --git a/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/_structures.py b/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/_structures.py deleted file mode 100644 index ccc2786..0000000 --- a/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/_structures.py +++ /dev/null @@ -1,68 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - - -class Infinity(object): - - def __repr__(self): - return "Infinity" - - def __hash__(self): - return hash(repr(self)) - - def __lt__(self, other): - return False - - def __le__(self, other): - return False - - def __eq__(self, other): - return isinstance(other, self.__class__) - - def __ne__(self, other): - return not isinstance(other, self.__class__) - - def __gt__(self, other): - return True - - def __ge__(self, other): - return True - - def __neg__(self): - return NegativeInfinity - -Infinity = Infinity() - - -class NegativeInfinity(object): - - def __repr__(self): - return "-Infinity" - - def __hash__(self): - return hash(repr(self)) - - def __lt__(self, other): - return True - - def __le__(self, other): - return True - - def __eq__(self, other): - return isinstance(other, self.__class__) - - def __ne__(self, other): - return not isinstance(other, self.__class__) - - def __gt__(self, other): - return False - - def __ge__(self, other): - return False - - def __neg__(self): - return Infinity - -NegativeInfinity = NegativeInfinity() diff --git a/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/markers.py b/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/markers.py deleted file mode 100644 index 892e578..0000000 --- a/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/markers.py +++ /dev/null @@ -1,301 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -import operator -import os -import platform -import sys - -from pkg_resources.extern.pyparsing import ParseException, ParseResults, stringStart, stringEnd -from pkg_resources.extern.pyparsing import ZeroOrMore, Group, Forward, QuotedString -from pkg_resources.extern.pyparsing import Literal as L # noqa - -from ._compat import string_types -from .specifiers import Specifier, InvalidSpecifier - - -__all__ = [ - "InvalidMarker", "UndefinedComparison", "UndefinedEnvironmentName", - "Marker", "default_environment", -] - - -class InvalidMarker(ValueError): - """ - An invalid marker was found, users should refer to PEP 508. - """ - - -class UndefinedComparison(ValueError): - """ - An invalid operation was attempted on a value that doesn't support it. - """ - - -class UndefinedEnvironmentName(ValueError): - """ - A name was attempted to be used that does not exist inside of the - environment. - """ - - -class Node(object): - - def __init__(self, value): - self.value = value - - def __str__(self): - return str(self.value) - - def __repr__(self): - return "<{0}({1!r})>".format(self.__class__.__name__, str(self)) - - def serialize(self): - raise NotImplementedError - - -class Variable(Node): - - def serialize(self): - return str(self) - - -class Value(Node): - - def serialize(self): - return '"{0}"'.format(self) - - -class Op(Node): - - def serialize(self): - return str(self) - - -VARIABLE = ( - L("implementation_version") | - L("platform_python_implementation") | - L("implementation_name") | - L("python_full_version") | - L("platform_release") | - L("platform_version") | - L("platform_machine") | - L("platform_system") | - L("python_version") | - L("sys_platform") | - L("os_name") | - L("os.name") | # PEP-345 - L("sys.platform") | # PEP-345 - L("platform.version") | # PEP-345 - L("platform.machine") | # PEP-345 - L("platform.python_implementation") | # PEP-345 - L("python_implementation") | # undocumented setuptools legacy - L("extra") -) -ALIASES = { - 'os.name': 'os_name', - 'sys.platform': 'sys_platform', - 'platform.version': 'platform_version', - 'platform.machine': 'platform_machine', - 'platform.python_implementation': 'platform_python_implementation', - 'python_implementation': 'platform_python_implementation' -} -VARIABLE.setParseAction(lambda s, l, t: Variable(ALIASES.get(t[0], t[0]))) - -VERSION_CMP = ( - L("===") | - L("==") | - L(">=") | - L("<=") | - L("!=") | - L("~=") | - L(">") | - L("<") -) - -MARKER_OP = VERSION_CMP | L("not in") | L("in") -MARKER_OP.setParseAction(lambda s, l, t: Op(t[0])) - -MARKER_VALUE = QuotedString("'") | QuotedString('"') -MARKER_VALUE.setParseAction(lambda s, l, t: Value(t[0])) - -BOOLOP = L("and") | L("or") - -MARKER_VAR = VARIABLE | MARKER_VALUE - -MARKER_ITEM = Group(MARKER_VAR + MARKER_OP + MARKER_VAR) -MARKER_ITEM.setParseAction(lambda s, l, t: tuple(t[0])) - -LPAREN = L("(").suppress() -RPAREN = L(")").suppress() - -MARKER_EXPR = Forward() -MARKER_ATOM = MARKER_ITEM | Group(LPAREN + MARKER_EXPR + RPAREN) -MARKER_EXPR << MARKER_ATOM + ZeroOrMore(BOOLOP + MARKER_EXPR) - -MARKER = stringStart + MARKER_EXPR + stringEnd - - -def _coerce_parse_result(results): - if isinstance(results, ParseResults): - return [_coerce_parse_result(i) for i in results] - else: - return results - - -def _format_marker(marker, first=True): - assert isinstance(marker, (list, tuple, string_types)) - - # Sometimes we have a structure like [[...]] which is a single item list - # where the single item is itself it's own list. In that case we want skip - # the rest of this function so that we don't get extraneous () on the - # outside. - if (isinstance(marker, list) and len(marker) == 1 and - isinstance(marker[0], (list, tuple))): - return _format_marker(marker[0]) - - if isinstance(marker, list): - inner = (_format_marker(m, first=False) for m in marker) - if first: - return " ".join(inner) - else: - return "(" + " ".join(inner) + ")" - elif isinstance(marker, tuple): - return " ".join([m.serialize() for m in marker]) - else: - return marker - - -_operators = { - "in": lambda lhs, rhs: lhs in rhs, - "not in": lambda lhs, rhs: lhs not in rhs, - "<": operator.lt, - "<=": operator.le, - "==": operator.eq, - "!=": operator.ne, - ">=": operator.ge, - ">": operator.gt, -} - - -def _eval_op(lhs, op, rhs): - try: - spec = Specifier("".join([op.serialize(), rhs])) - except InvalidSpecifier: - pass - else: - return spec.contains(lhs) - - oper = _operators.get(op.serialize()) - if oper is None: - raise UndefinedComparison( - "Undefined {0!r} on {1!r} and {2!r}.".format(op, lhs, rhs) - ) - - return oper(lhs, rhs) - - -_undefined = object() - - -def _get_env(environment, name): - value = environment.get(name, _undefined) - - if value is _undefined: - raise UndefinedEnvironmentName( - "{0!r} does not exist in evaluation environment.".format(name) - ) - - return value - - -def _evaluate_markers(markers, environment): - groups = [[]] - - for marker in markers: - assert isinstance(marker, (list, tuple, string_types)) - - if isinstance(marker, list): - groups[-1].append(_evaluate_markers(marker, environment)) - elif isinstance(marker, tuple): - lhs, op, rhs = marker - - if isinstance(lhs, Variable): - lhs_value = _get_env(environment, lhs.value) - rhs_value = rhs.value - else: - lhs_value = lhs.value - rhs_value = _get_env(environment, rhs.value) - - groups[-1].append(_eval_op(lhs_value, op, rhs_value)) - else: - assert marker in ["and", "or"] - if marker == "or": - groups.append([]) - - return any(all(item) for item in groups) - - -def format_full_version(info): - version = '{0.major}.{0.minor}.{0.micro}'.format(info) - kind = info.releaselevel - if kind != 'final': - version += kind[0] + str(info.serial) - return version - - -def default_environment(): - if hasattr(sys, 'implementation'): - iver = format_full_version(sys.implementation.version) - implementation_name = sys.implementation.name - else: - iver = '0' - implementation_name = '' - - return { - "implementation_name": implementation_name, - "implementation_version": iver, - "os_name": os.name, - "platform_machine": platform.machine(), - "platform_release": platform.release(), - "platform_system": platform.system(), - "platform_version": platform.version(), - "python_full_version": platform.python_version(), - "platform_python_implementation": platform.python_implementation(), - "python_version": platform.python_version()[:3], - "sys_platform": sys.platform, - } - - -class Marker(object): - - def __init__(self, marker): - try: - self._markers = _coerce_parse_result(MARKER.parseString(marker)) - except ParseException as e: - err_str = "Invalid marker: {0!r}, parse error at {1!r}".format( - marker, marker[e.loc:e.loc + 8]) - raise InvalidMarker(err_str) - - def __str__(self): - return _format_marker(self._markers) - - def __repr__(self): - return "<Marker({0!r})>".format(str(self)) - - def evaluate(self, environment=None): - """Evaluate a marker. - - Return the boolean from evaluating the given marker against the - environment. environment is an optional argument to override all or - part of the determined environment. - - The environment is determined from the current Python process. - """ - current_environment = default_environment() - if environment is not None: - current_environment.update(environment) - - return _evaluate_markers(self._markers, current_environment) diff --git a/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/requirements.py b/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/requirements.py deleted file mode 100644 index 0c8c4a3..0000000 --- a/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/requirements.py +++ /dev/null @@ -1,127 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -import string -import re - -from pkg_resources.extern.pyparsing import stringStart, stringEnd, originalTextFor, ParseException -from pkg_resources.extern.pyparsing import ZeroOrMore, Word, Optional, Regex, Combine -from pkg_resources.extern.pyparsing import Literal as L # noqa -from pkg_resources.extern.six.moves.urllib import parse as urlparse - -from .markers import MARKER_EXPR, Marker -from .specifiers import LegacySpecifier, Specifier, SpecifierSet - - -class InvalidRequirement(ValueError): - """ - An invalid requirement was found, users should refer to PEP 508. - """ - - -ALPHANUM = Word(string.ascii_letters + string.digits) - -LBRACKET = L("[").suppress() -RBRACKET = L("]").suppress() -LPAREN = L("(").suppress() -RPAREN = L(")").suppress() -COMMA = L(",").suppress() -SEMICOLON = L(";").suppress() -AT = L("@").suppress() - -PUNCTUATION = Word("-_.") -IDENTIFIER_END = ALPHANUM | (ZeroOrMore(PUNCTUATION) + ALPHANUM) -IDENTIFIER = Combine(ALPHANUM + ZeroOrMore(IDENTIFIER_END)) - -NAME = IDENTIFIER("name") -EXTRA = IDENTIFIER - -URI = Regex(r'[^ ]+')("url") -URL = (AT + URI) - -EXTRAS_LIST = EXTRA + ZeroOrMore(COMMA + EXTRA) -EXTRAS = (LBRACKET + Optional(EXTRAS_LIST) + RBRACKET)("extras") - -VERSION_PEP440 = Regex(Specifier._regex_str, re.VERBOSE | re.IGNORECASE) -VERSION_LEGACY = Regex(LegacySpecifier._regex_str, re.VERBOSE | re.IGNORECASE) - -VERSION_ONE = VERSION_PEP440 ^ VERSION_LEGACY -VERSION_MANY = Combine(VERSION_ONE + ZeroOrMore(COMMA + VERSION_ONE), - joinString=",", adjacent=False)("_raw_spec") -_VERSION_SPEC = Optional(((LPAREN + VERSION_MANY + RPAREN) | VERSION_MANY)) -_VERSION_SPEC.setParseAction(lambda s, l, t: t._raw_spec or '') - -VERSION_SPEC = originalTextFor(_VERSION_SPEC)("specifier") -VERSION_SPEC.setParseAction(lambda s, l, t: t[1]) - -MARKER_EXPR = originalTextFor(MARKER_EXPR())("marker") -MARKER_EXPR.setParseAction( - lambda s, l, t: Marker(s[t._original_start:t._original_end]) -) -MARKER_SEPERATOR = SEMICOLON -MARKER = MARKER_SEPERATOR + MARKER_EXPR - -VERSION_AND_MARKER = VERSION_SPEC + Optional(MARKER) -URL_AND_MARKER = URL + Optional(MARKER) - -NAMED_REQUIREMENT = \ - NAME + Optional(EXTRAS) + (URL_AND_MARKER | VERSION_AND_MARKER) - -REQUIREMENT = stringStart + NAMED_REQUIREMENT + stringEnd - - -class Requirement(object): - """Parse a requirement. - - Parse a given requirement string into its parts, such as name, specifier, - URL, and extras. Raises InvalidRequirement on a badly-formed requirement - string. - """ - - # TODO: Can we test whether something is contained within a requirement? - # If so how do we do that? Do we need to test against the _name_ of - # the thing as well as the version? What about the markers? - # TODO: Can we normalize the name and extra name? - - def __init__(self, requirement_string): - try: - req = REQUIREMENT.parseString(requirement_string) - except ParseException as e: - raise InvalidRequirement( - "Invalid requirement, parse error at \"{0!r}\"".format( - requirement_string[e.loc:e.loc + 8])) - - self.name = req.name - if req.url: - parsed_url = urlparse.urlparse(req.url) - if not (parsed_url.scheme and parsed_url.netloc) or ( - not parsed_url.scheme and not parsed_url.netloc): - raise InvalidRequirement("Invalid URL given") - self.url = req.url - else: - self.url = None - self.extras = set(req.extras.asList() if req.extras else []) - self.specifier = SpecifierSet(req.specifier) - self.marker = req.marker if req.marker else None - - def __str__(self): - parts = [self.name] - - if self.extras: - parts.append("[{0}]".format(",".join(sorted(self.extras)))) - - if self.specifier: - parts.append(str(self.specifier)) - - if self.url: - parts.append("@ {0}".format(self.url)) - - if self.marker: - parts.append("; {0}".format(self.marker)) - - return "".join(parts) - - def __repr__(self): - return "<Requirement({0!r})>".format(str(self)) diff --git a/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/specifiers.py b/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/specifiers.py deleted file mode 100644 index 7f5a76c..0000000 --- a/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/specifiers.py +++ /dev/null @@ -1,774 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -import abc -import functools -import itertools -import re - -from ._compat import string_types, with_metaclass -from .version import Version, LegacyVersion, parse - - -class InvalidSpecifier(ValueError): - """ - An invalid specifier was found, users should refer to PEP 440. - """ - - -class BaseSpecifier(with_metaclass(abc.ABCMeta, object)): - - @abc.abstractmethod - def __str__(self): - """ - Returns the str representation of this Specifier like object. This - should be representative of the Specifier itself. - """ - - @abc.abstractmethod - def __hash__(self): - """ - Returns a hash value for this Specifier like object. - """ - - @abc.abstractmethod - def __eq__(self, other): - """ - Returns a boolean representing whether or not the two Specifier like - objects are equal. - """ - - @abc.abstractmethod - def __ne__(self, other): - """ - Returns a boolean representing whether or not the two Specifier like - objects are not equal. - """ - - @abc.abstractproperty - def prereleases(self): - """ - Returns whether or not pre-releases as a whole are allowed by this - specifier. - """ - - @prereleases.setter - def prereleases(self, value): - """ - Sets whether or not pre-releases as a whole are allowed by this - specifier. - """ - - @abc.abstractmethod - def contains(self, item, prereleases=None): - """ - Determines if the given item is contained within this specifier. - """ - - @abc.abstractmethod - def filter(self, iterable, prereleases=None): - """ - Takes an iterable of items and filters them so that only items which - are contained within this specifier are allowed in it. - """ - - -class _IndividualSpecifier(BaseSpecifier): - - _operators = {} - - def __init__(self, spec="", prereleases=None): - match = self._regex.search(spec) - if not match: - raise InvalidSpecifier("Invalid specifier: '{0}'".format(spec)) - - self._spec = ( - match.group("operator").strip(), - match.group("version").strip(), - ) - - # Store whether or not this Specifier should accept prereleases - self._prereleases = prereleases - - def __repr__(self): - pre = ( - ", prereleases={0!r}".format(self.prereleases) - if self._prereleases is not None - else "" - ) - - return "<{0}({1!r}{2})>".format( - self.__class__.__name__, - str(self), - pre, - ) - - def __str__(self): - return "{0}{1}".format(*self._spec) - - def __hash__(self): - return hash(self._spec) - - def __eq__(self, other): - if isinstance(other, string_types): - try: - other = self.__class__(other) - except InvalidSpecifier: - return NotImplemented - elif not isinstance(other, self.__class__): - return NotImplemented - - return self._spec == other._spec - - def __ne__(self, other): - if isinstance(other, string_types): - try: - other = self.__class__(other) - except InvalidSpecifier: - return NotImplemented - elif not isinstance(other, self.__class__): - return NotImplemented - - return self._spec != other._spec - - def _get_operator(self, op): - return getattr(self, "_compare_{0}".format(self._operators[op])) - - def _coerce_version(self, version): - if not isinstance(version, (LegacyVersion, Version)): - version = parse(version) - return version - - @property - def operator(self): - return self._spec[0] - - @property - def version(self): - return self._spec[1] - - @property - def prereleases(self): - return self._prereleases - - @prereleases.setter - def prereleases(self, value): - self._prereleases = value - - def __contains__(self, item): - return self.contains(item) - - def contains(self, item, prereleases=None): - # Determine if prereleases are to be allowed or not. - if prereleases is None: - prereleases = self.prereleases - - # Normalize item to a Version or LegacyVersion, this allows us to have - # a shortcut for ``"2.0" in Specifier(">=2") - item = self._coerce_version(item) - - # Determine if we should be supporting prereleases in this specifier - # or not, if we do not support prereleases than we can short circuit - # logic if this version is a prereleases. - if item.is_prerelease and not prereleases: - return False - - # Actually do the comparison to determine if this item is contained - # within this Specifier or not. - return self._get_operator(self.operator)(item, self.version) - - def filter(self, iterable, prereleases=None): - yielded = False - found_prereleases = [] - - kw = {"prereleases": prereleases if prereleases is not None else True} - - # Attempt to iterate over all the values in the iterable and if any of - # them match, yield them. - for version in iterable: - parsed_version = self._coerce_version(version) - - if self.contains(parsed_version, **kw): - # If our version is a prerelease, and we were not set to allow - # prereleases, then we'll store it for later incase nothing - # else matches this specifier. - if (parsed_version.is_prerelease and not - (prereleases or self.prereleases)): - found_prereleases.append(version) - # Either this is not a prerelease, or we should have been - # accepting prereleases from the begining. - else: - yielded = True - yield version - - # Now that we've iterated over everything, determine if we've yielded - # any values, and if we have not and we have any prereleases stored up - # then we will go ahead and yield the prereleases. - if not yielded and found_prereleases: - for version in found_prereleases: - yield version - - -class LegacySpecifier(_IndividualSpecifier): - - _regex_str = ( - r""" - (?P<operator>(==|!=|<=|>=|<|>)) - \s* - (?P<version> - [^,;\s)]* # Since this is a "legacy" specifier, and the version - # string can be just about anything, we match everything - # except for whitespace, a semi-colon for marker support, - # a closing paren since versions can be enclosed in - # them, and a comma since it's a version separator. - ) - """ - ) - - _regex = re.compile( - r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) - - _operators = { - "==": "equal", - "!=": "not_equal", - "<=": "less_than_equal", - ">=": "greater_than_equal", - "<": "less_than", - ">": "greater_than", - } - - def _coerce_version(self, version): - if not isinstance(version, LegacyVersion): - version = LegacyVersion(str(version)) - return version - - def _compare_equal(self, prospective, spec): - return prospective == self._coerce_version(spec) - - def _compare_not_equal(self, prospective, spec): - return prospective != self._coerce_version(spec) - - def _compare_less_than_equal(self, prospective, spec): - return prospective <= self._coerce_version(spec) - - def _compare_greater_than_equal(self, prospective, spec): - return prospective >= self._coerce_version(spec) - - def _compare_less_than(self, prospective, spec): - return prospective < self._coerce_version(spec) - - def _compare_greater_than(self, prospective, spec): - return prospective > self._coerce_version(spec) - - -def _require_version_compare(fn): - @functools.wraps(fn) - def wrapped(self, prospective, spec): - if not isinstance(prospective, Version): - return False - return fn(self, prospective, spec) - return wrapped - - -class Specifier(_IndividualSpecifier): - - _regex_str = ( - r""" - (?P<operator>(~=|==|!=|<=|>=|<|>|===)) - (?P<version> - (?: - # The identity operators allow for an escape hatch that will - # do an exact string match of the version you wish to install. - # This will not be parsed by PEP 440 and we cannot determine - # any semantic meaning from it. This operator is discouraged - # but included entirely as an escape hatch. - (?<====) # Only match for the identity operator - \s* - [^\s]* # We just match everything, except for whitespace - # since we are only testing for strict identity. - ) - | - (?: - # The (non)equality operators allow for wild card and local - # versions to be specified so we have to define these two - # operators separately to enable that. - (?<===|!=) # Only match for equals and not equals - - \s* - v? - (?:[0-9]+!)? # epoch - [0-9]+(?:\.[0-9]+)* # release - (?: # pre release - [-_\.]? - (a|b|c|rc|alpha|beta|pre|preview) - [-_\.]? - [0-9]* - )? - (?: # post release - (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) - )? - - # You cannot use a wild card and a dev or local version - # together so group them with a | and make them optional. - (?: - (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release - (?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local - | - \.\* # Wild card syntax of .* - )? - ) - | - (?: - # The compatible operator requires at least two digits in the - # release segment. - (?<=~=) # Only match for the compatible operator - - \s* - v? - (?:[0-9]+!)? # epoch - [0-9]+(?:\.[0-9]+)+ # release (We have a + instead of a *) - (?: # pre release - [-_\.]? - (a|b|c|rc|alpha|beta|pre|preview) - [-_\.]? - [0-9]* - )? - (?: # post release - (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) - )? - (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release - ) - | - (?: - # All other operators only allow a sub set of what the - # (non)equality operators do. Specifically they do not allow - # local versions to be specified nor do they allow the prefix - # matching wild cards. - (?<!==|!=|~=) # We have special cases for these - # operators so we want to make sure they - # don't match here. - - \s* - v? - (?:[0-9]+!)? # epoch - [0-9]+(?:\.[0-9]+)* # release - (?: # pre release - [-_\.]? - (a|b|c|rc|alpha|beta|pre|preview) - [-_\.]? - [0-9]* - )? - (?: # post release - (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) - )? - (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release - ) - ) - """ - ) - - _regex = re.compile( - r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) - - _operators = { - "~=": "compatible", - "==": "equal", - "!=": "not_equal", - "<=": "less_than_equal", - ">=": "greater_than_equal", - "<": "less_than", - ">": "greater_than", - "===": "arbitrary", - } - - @_require_version_compare - def _compare_compatible(self, prospective, spec): - # Compatible releases have an equivalent combination of >= and ==. That - # is that ~=2.2 is equivalent to >=2.2,==2.*. This allows us to - # implement this in terms of the other specifiers instead of - # implementing it ourselves. The only thing we need to do is construct - # the other specifiers. - - # We want everything but the last item in the version, but we want to - # ignore post and dev releases and we want to treat the pre-release as - # it's own separate segment. - prefix = ".".join( - list( - itertools.takewhile( - lambda x: (not x.startswith("post") and not - x.startswith("dev")), - _version_split(spec), - ) - )[:-1] - ) - - # Add the prefix notation to the end of our string - prefix += ".*" - - return (self._get_operator(">=")(prospective, spec) and - self._get_operator("==")(prospective, prefix)) - - @_require_version_compare - def _compare_equal(self, prospective, spec): - # We need special logic to handle prefix matching - if spec.endswith(".*"): - # In the case of prefix matching we want to ignore local segment. - prospective = Version(prospective.public) - # Split the spec out by dots, and pretend that there is an implicit - # dot in between a release segment and a pre-release segment. - spec = _version_split(spec[:-2]) # Remove the trailing .* - - # Split the prospective version out by dots, and pretend that there - # is an implicit dot in between a release segment and a pre-release - # segment. - prospective = _version_split(str(prospective)) - - # Shorten the prospective version to be the same length as the spec - # so that we can determine if the specifier is a prefix of the - # prospective version or not. - prospective = prospective[:len(spec)] - - # Pad out our two sides with zeros so that they both equal the same - # length. - spec, prospective = _pad_version(spec, prospective) - else: - # Convert our spec string into a Version - spec = Version(spec) - - # If the specifier does not have a local segment, then we want to - # act as if the prospective version also does not have a local - # segment. - if not spec.local: - prospective = Version(prospective.public) - - return prospective == spec - - @_require_version_compare - def _compare_not_equal(self, prospective, spec): - return not self._compare_equal(prospective, spec) - - @_require_version_compare - def _compare_less_than_equal(self, prospective, spec): - return prospective <= Version(spec) - - @_require_version_compare - def _compare_greater_than_equal(self, prospective, spec): - return prospective >= Version(spec) - - @_require_version_compare - def _compare_less_than(self, prospective, spec): - # Convert our spec to a Version instance, since we'll want to work with - # it as a version. - spec = Version(spec) - - # Check to see if the prospective version is less than the spec - # version. If it's not we can short circuit and just return False now - # instead of doing extra unneeded work. - if not prospective < spec: - return False - - # This special case is here so that, unless the specifier itself - # includes is a pre-release version, that we do not accept pre-release - # versions for the version mentioned in the specifier (e.g. <3.1 should - # not match 3.1.dev0, but should match 3.0.dev0). - if not spec.is_prerelease and prospective.is_prerelease: - if Version(prospective.base_version) == Version(spec.base_version): - return False - - # If we've gotten to here, it means that prospective version is both - # less than the spec version *and* it's not a pre-release of the same - # version in the spec. - return True - - @_require_version_compare - def _compare_greater_than(self, prospective, spec): - # Convert our spec to a Version instance, since we'll want to work with - # it as a version. - spec = Version(spec) - - # Check to see if the prospective version is greater than the spec - # version. If it's not we can short circuit and just return False now - # instead of doing extra unneeded work. - if not prospective > spec: - return False - - # This special case is here so that, unless the specifier itself - # includes is a post-release version, that we do not accept - # post-release versions for the version mentioned in the specifier - # (e.g. >3.1 should not match 3.0.post0, but should match 3.2.post0). - if not spec.is_postrelease and prospective.is_postrelease: - if Version(prospective.base_version) == Version(spec.base_version): - return False - - # Ensure that we do not allow a local version of the version mentioned - # in the specifier, which is techincally greater than, to match. - if prospective.local is not None: - if Version(prospective.base_version) == Version(spec.base_version): - return False - - # If we've gotten to here, it means that prospective version is both - # greater than the spec version *and* it's not a pre-release of the - # same version in the spec. - return True - - def _compare_arbitrary(self, prospective, spec): - return str(prospective).lower() == str(spec).lower() - - @property - def prereleases(self): - # If there is an explicit prereleases set for this, then we'll just - # blindly use that. - if self._prereleases is not None: - return self._prereleases - - # Look at all of our specifiers and determine if they are inclusive - # operators, and if they are if they are including an explicit - # prerelease. - operator, version = self._spec - if operator in ["==", ">=", "<=", "~=", "==="]: - # The == specifier can include a trailing .*, if it does we - # want to remove before parsing. - if operator == "==" and version.endswith(".*"): - version = version[:-2] - - # Parse the version, and if it is a pre-release than this - # specifier allows pre-releases. - if parse(version).is_prerelease: - return True - - return False - - @prereleases.setter - def prereleases(self, value): - self._prereleases = value - - -_prefix_regex = re.compile(r"^([0-9]+)((?:a|b|c|rc)[0-9]+)$") - - -def _version_split(version): - result = [] - for item in version.split("."): - match = _prefix_regex.search(item) - if match: - result.extend(match.groups()) - else: - result.append(item) - return result - - -def _pad_version(left, right): - left_split, right_split = [], [] - - # Get the release segment of our versions - left_split.append(list(itertools.takewhile(lambda x: x.isdigit(), left))) - right_split.append(list(itertools.takewhile(lambda x: x.isdigit(), right))) - - # Get the rest of our versions - left_split.append(left[len(left_split[0]):]) - right_split.append(right[len(right_split[0]):]) - - # Insert our padding - left_split.insert( - 1, - ["0"] * max(0, len(right_split[0]) - len(left_split[0])), - ) - right_split.insert( - 1, - ["0"] * max(0, len(left_split[0]) - len(right_split[0])), - ) - - return ( - list(itertools.chain(*left_split)), - list(itertools.chain(*right_split)), - ) - - -class SpecifierSet(BaseSpecifier): - - def __init__(self, specifiers="", prereleases=None): - # Split on , to break each indidivual specifier into it's own item, and - # strip each item to remove leading/trailing whitespace. - specifiers = [s.strip() for s in specifiers.split(",") if s.strip()] - - # Parsed each individual specifier, attempting first to make it a - # Specifier and falling back to a LegacySpecifier. - parsed = set() - for specifier in specifiers: - try: - parsed.add(Specifier(specifier)) - except InvalidSpecifier: - parsed.add(LegacySpecifier(specifier)) - - # Turn our parsed specifiers into a frozen set and save them for later. - self._specs = frozenset(parsed) - - # Store our prereleases value so we can use it later to determine if - # we accept prereleases or not. - self._prereleases = prereleases - - def __repr__(self): - pre = ( - ", prereleases={0!r}".format(self.prereleases) - if self._prereleases is not None - else "" - ) - - return "<SpecifierSet({0!r}{1})>".format(str(self), pre) - - def __str__(self): - return ",".join(sorted(str(s) for s in self._specs)) - - def __hash__(self): - return hash(self._specs) - - def __and__(self, other): - if isinstance(other, string_types): - other = SpecifierSet(other) - elif not isinstance(other, SpecifierSet): - return NotImplemented - - specifier = SpecifierSet() - specifier._specs = frozenset(self._specs | other._specs) - - if self._prereleases is None and other._prereleases is not None: - specifier._prereleases = other._prereleases - elif self._prereleases is not None and other._prereleases is None: - specifier._prereleases = self._prereleases - elif self._prereleases == other._prereleases: - specifier._prereleases = self._prereleases - else: - raise ValueError( - "Cannot combine SpecifierSets with True and False prerelease " - "overrides." - ) - - return specifier - - def __eq__(self, other): - if isinstance(other, string_types): - other = SpecifierSet(other) - elif isinstance(other, _IndividualSpecifier): - other = SpecifierSet(str(other)) - elif not isinstance(other, SpecifierSet): - return NotImplemented - - return self._specs == other._specs - - def __ne__(self, other): - if isinstance(other, string_types): - other = SpecifierSet(other) - elif isinstance(other, _IndividualSpecifier): - other = SpecifierSet(str(other)) - elif not isinstance(other, SpecifierSet): - return NotImplemented - - return self._specs != other._specs - - def __len__(self): - return len(self._specs) - - def __iter__(self): - return iter(self._specs) - - @property - def prereleases(self): - # If we have been given an explicit prerelease modifier, then we'll - # pass that through here. - if self._prereleases is not None: - return self._prereleases - - # If we don't have any specifiers, and we don't have a forced value, - # then we'll just return None since we don't know if this should have - # pre-releases or not. - if not self._specs: - return None - - # Otherwise we'll see if any of the given specifiers accept - # prereleases, if any of them do we'll return True, otherwise False. - return any(s.prereleases for s in self._specs) - - @prereleases.setter - def prereleases(self, value): - self._prereleases = value - - def __contains__(self, item): - return self.contains(item) - - def contains(self, item, prereleases=None): - # Ensure that our item is a Version or LegacyVersion instance. - if not isinstance(item, (LegacyVersion, Version)): - item = parse(item) - - # Determine if we're forcing a prerelease or not, if we're not forcing - # one for this particular filter call, then we'll use whatever the - # SpecifierSet thinks for whether or not we should support prereleases. - if prereleases is None: - prereleases = self.prereleases - - # We can determine if we're going to allow pre-releases by looking to - # see if any of the underlying items supports them. If none of them do - # and this item is a pre-release then we do not allow it and we can - # short circuit that here. - # Note: This means that 1.0.dev1 would not be contained in something - # like >=1.0.devabc however it would be in >=1.0.debabc,>0.0.dev0 - if not prereleases and item.is_prerelease: - return False - - # We simply dispatch to the underlying specs here to make sure that the - # given version is contained within all of them. - # Note: This use of all() here means that an empty set of specifiers - # will always return True, this is an explicit design decision. - return all( - s.contains(item, prereleases=prereleases) - for s in self._specs - ) - - def filter(self, iterable, prereleases=None): - # Determine if we're forcing a prerelease or not, if we're not forcing - # one for this particular filter call, then we'll use whatever the - # SpecifierSet thinks for whether or not we should support prereleases. - if prereleases is None: - prereleases = self.prereleases - - # If we have any specifiers, then we want to wrap our iterable in the - # filter method for each one, this will act as a logical AND amongst - # each specifier. - if self._specs: - for spec in self._specs: - iterable = spec.filter(iterable, prereleases=bool(prereleases)) - return iterable - # If we do not have any specifiers, then we need to have a rough filter - # which will filter out any pre-releases, unless there are no final - # releases, and which will filter out LegacyVersion in general. - else: - filtered = [] - found_prereleases = [] - - for item in iterable: - # Ensure that we some kind of Version class for this item. - if not isinstance(item, (LegacyVersion, Version)): - parsed_version = parse(item) - else: - parsed_version = item - - # Filter out any item which is parsed as a LegacyVersion - if isinstance(parsed_version, LegacyVersion): - continue - - # Store any item which is a pre-release for later unless we've - # already found a final version or we are accepting prereleases - if parsed_version.is_prerelease and not prereleases: - if not filtered: - found_prereleases.append(item) - else: - filtered.append(item) - - # If we've found no items except for pre-releases, then we'll go - # ahead and use the pre-releases - if not filtered and found_prereleases and prereleases is None: - return found_prereleases - - return filtered diff --git a/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/utils.py b/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/utils.py deleted file mode 100644 index 942387c..0000000 --- a/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/utils.py +++ /dev/null @@ -1,14 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -import re - - -_canonicalize_regex = re.compile(r"[-_.]+") - - -def canonicalize_name(name): - # This is taken from PEP 503. - return _canonicalize_regex.sub("-", name).lower() diff --git a/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/version.py b/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/version.py deleted file mode 100644 index 83b5ee8..0000000 --- a/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/version.py +++ /dev/null @@ -1,393 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -import collections -import itertools -import re - -from ._structures import Infinity - - -__all__ = [ - "parse", "Version", "LegacyVersion", "InvalidVersion", "VERSION_PATTERN" -] - - -_Version = collections.namedtuple( - "_Version", - ["epoch", "release", "dev", "pre", "post", "local"], -) - - -def parse(version): - """ - Parse the given version string and return either a :class:`Version` object - or a :class:`LegacyVersion` object depending on if the given version is - a valid PEP 440 version or a legacy version. - """ - try: - return Version(version) - except InvalidVersion: - return LegacyVersion(version) - - -class InvalidVersion(ValueError): - """ - An invalid version was found, users should refer to PEP 440. - """ - - -class _BaseVersion(object): - - def __hash__(self): - return hash(self._key) - - def __lt__(self, other): - return self._compare(other, lambda s, o: s < o) - - def __le__(self, other): - return self._compare(other, lambda s, o: s <= o) - - def __eq__(self, other): - return self._compare(other, lambda s, o: s == o) - - def __ge__(self, other): - return self._compare(other, lambda s, o: s >= o) - - def __gt__(self, other): - return self._compare(other, lambda s, o: s > o) - - def __ne__(self, other): - return self._compare(other, lambda s, o: s != o) - - def _compare(self, other, method): - if not isinstance(other, _BaseVersion): - return NotImplemented - - return method(self._key, other._key) - - -class LegacyVersion(_BaseVersion): - - def __init__(self, version): - self._version = str(version) - self._key = _legacy_cmpkey(self._version) - - def __str__(self): - return self._version - - def __repr__(self): - return "<LegacyVersion({0})>".format(repr(str(self))) - - @property - def public(self): - return self._version - - @property - def base_version(self): - return self._version - - @property - def local(self): - return None - - @property - def is_prerelease(self): - return False - - @property - def is_postrelease(self): - return False - - -_legacy_version_component_re = re.compile( - r"(\d+ | [a-z]+ | \.| -)", re.VERBOSE, -) - -_legacy_version_replacement_map = { - "pre": "c", "preview": "c", "-": "final-", "rc": "c", "dev": "@", -} - - -def _parse_version_parts(s): - for part in _legacy_version_component_re.split(s): - part = _legacy_version_replacement_map.get(part, part) - - if not part or part == ".": - continue - - if part[:1] in "0123456789": - # pad for numeric comparison - yield part.zfill(8) - else: - yield "*" + part - - # ensure that alpha/beta/candidate are before final - yield "*final" - - -def _legacy_cmpkey(version): - # We hardcode an epoch of -1 here. A PEP 440 version can only have a epoch - # greater than or equal to 0. This will effectively put the LegacyVersion, - # which uses the defacto standard originally implemented by setuptools, - # as before all PEP 440 versions. - epoch = -1 - - # This scheme is taken from pkg_resources.parse_version setuptools prior to - # it's adoption of the packaging library. - parts = [] - for part in _parse_version_parts(version.lower()): - if part.startswith("*"): - # remove "-" before a prerelease tag - if part < "*final": - while parts and parts[-1] == "*final-": - parts.pop() - - # remove trailing zeros from each series of numeric parts - while parts and parts[-1] == "00000000": - parts.pop() - - parts.append(part) - parts = tuple(parts) - - return epoch, parts - -# Deliberately not anchored to the start and end of the string, to make it -# easier for 3rd party code to reuse -VERSION_PATTERN = r""" - v? - (?: - (?:(?P<epoch>[0-9]+)!)? # epoch - (?P<release>[0-9]+(?:\.[0-9]+)*) # release segment - (?P<pre> # pre-release - [-_\.]? - (?P<pre_l>(a|b|c|rc|alpha|beta|pre|preview)) - [-_\.]? - (?P<pre_n>[0-9]+)? - )? - (?P<post> # post release - (?:-(?P<post_n1>[0-9]+)) - | - (?: - [-_\.]? - (?P<post_l>post|rev|r) - [-_\.]? - (?P<post_n2>[0-9]+)? - ) - )? - (?P<dev> # dev release - [-_\.]? - (?P<dev_l>dev) - [-_\.]? - (?P<dev_n>[0-9]+)? - )? - ) - (?:\+(?P<local>[a-z0-9]+(?:[-_\.][a-z0-9]+)*))? # local version -""" - - -class Version(_BaseVersion): - - _regex = re.compile( - r"^\s*" + VERSION_PATTERN + r"\s*$", - re.VERBOSE | re.IGNORECASE, - ) - - def __init__(self, version): - # Validate the version and parse it into pieces - match = self._regex.search(version) - if not match: - raise InvalidVersion("Invalid version: '{0}'".format(version)) - - # Store the parsed out pieces of the version - self._version = _Version( - epoch=int(match.group("epoch")) if match.group("epoch") else 0, - release=tuple(int(i) for i in match.group("release").split(".")), - pre=_parse_letter_version( - match.group("pre_l"), - match.group("pre_n"), - ), - post=_parse_letter_version( - match.group("post_l"), - match.group("post_n1") or match.group("post_n2"), - ), - dev=_parse_letter_version( - match.group("dev_l"), - match.group("dev_n"), - ), - local=_parse_local_version(match.group("local")), - ) - - # Generate a key which will be used for sorting - self._key = _cmpkey( - self._version.epoch, - self._version.release, - self._version.pre, - self._version.post, - self._version.dev, - self._version.local, - ) - - def __repr__(self): - return "<Version({0})>".format(repr(str(self))) - - def __str__(self): - parts = [] - - # Epoch - if self._version.epoch != 0: - parts.append("{0}!".format(self._version.epoch)) - - # Release segment - parts.append(".".join(str(x) for x in self._version.release)) - - # Pre-release - if self._version.pre is not None: - parts.append("".join(str(x) for x in self._version.pre)) - - # Post-release - if self._version.post is not None: - parts.append(".post{0}".format(self._version.post[1])) - - # Development release - if self._version.dev is not None: - parts.append(".dev{0}".format(self._version.dev[1])) - - # Local version segment - if self._version.local is not None: - parts.append( - "+{0}".format(".".join(str(x) for x in self._version.local)) - ) - - return "".join(parts) - - @property - def public(self): - return str(self).split("+", 1)[0] - - @property - def base_version(self): - parts = [] - - # Epoch - if self._version.epoch != 0: - parts.append("{0}!".format(self._version.epoch)) - - # Release segment - parts.append(".".join(str(x) for x in self._version.release)) - - return "".join(parts) - - @property - def local(self): - version_string = str(self) - if "+" in version_string: - return version_string.split("+", 1)[1] - - @property - def is_prerelease(self): - return bool(self._version.dev or self._version.pre) - - @property - def is_postrelease(self): - return bool(self._version.post) - - -def _parse_letter_version(letter, number): - if letter: - # We consider there to be an implicit 0 in a pre-release if there is - # not a numeral associated with it. - if number is None: - number = 0 - - # We normalize any letters to their lower case form - letter = letter.lower() - - # We consider some words to be alternate spellings of other words and - # in those cases we want to normalize the spellings to our preferred - # spelling. - if letter == "alpha": - letter = "a" - elif letter == "beta": - letter = "b" - elif letter in ["c", "pre", "preview"]: - letter = "rc" - elif letter in ["rev", "r"]: - letter = "post" - - return letter, int(number) - if not letter and number: - # We assume if we are given a number, but we are not given a letter - # then this is using the implicit post release syntax (e.g. 1.0-1) - letter = "post" - - return letter, int(number) - - -_local_version_seperators = re.compile(r"[\._-]") - - -def _parse_local_version(local): - """ - Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve"). - """ - if local is not None: - return tuple( - part.lower() if not part.isdigit() else int(part) - for part in _local_version_seperators.split(local) - ) - - -def _cmpkey(epoch, release, pre, post, dev, local): - # When we compare a release version, we want to compare it with all of the - # trailing zeros removed. So we'll use a reverse the list, drop all the now - # leading zeros until we come to something non zero, then take the rest - # re-reverse it back into the correct order and make it a tuple and use - # that for our sorting key. - release = tuple( - reversed(list( - itertools.dropwhile( - lambda x: x == 0, - reversed(release), - ) - )) - ) - - # We need to "trick" the sorting algorithm to put 1.0.dev0 before 1.0a0. - # We'll do this by abusing the pre segment, but we _only_ want to do this - # if there is not a pre or a post segment. If we have one of those then - # the normal sorting rules will handle this case correctly. - if pre is None and post is None and dev is not None: - pre = -Infinity - # Versions without a pre-release (except as noted above) should sort after - # those with one. - elif pre is None: - pre = Infinity - - # Versions without a post segment should sort before those with one. - if post is None: - post = -Infinity - - # Versions without a development segment should sort after those with one. - if dev is None: - dev = Infinity - - if local is None: - # Versions without a local segment should sort before those with one. - local = -Infinity - else: - # Versions with a local segment need that segment parsed to implement - # the sorting rules in PEP440. - # - Alpha numeric segments sort before numeric segments - # - Alpha numeric segments sort lexicographically - # - Numeric segments sort numerically - # - Shorter versions sort before longer versions when the prefixes - # match exactly - local = tuple( - (i, "") if isinstance(i, int) else (-Infinity, i) - for i in local - ) - - return epoch, release, pre, post, dev, local diff --git a/env/lib/python3.7/site-packages/pkg_resources/_vendor/pyparsing.py b/env/lib/python3.7/site-packages/pkg_resources/_vendor/pyparsing.py deleted file mode 100644 index cf75e1e..0000000 --- a/env/lib/python3.7/site-packages/pkg_resources/_vendor/pyparsing.py +++ /dev/null @@ -1,5742 +0,0 @@ -# module pyparsing.py -# -# Copyright (c) 2003-2018 Paul T. McGuire -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be -# included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__doc__ = \ -""" -pyparsing module - Classes and methods to define and execute parsing grammars -============================================================================= - -The pyparsing module is an alternative approach to creating and executing simple grammars, -vs. the traditional lex/yacc approach, or the use of regular expressions. With pyparsing, you -don't need to learn a new syntax for defining grammars or matching expressions - the parsing module -provides a library of classes that you use to construct the grammar directly in Python. - -Here is a program to parse "Hello, World!" (or any greeting of the form -C{"<salutation>, <addressee>!"}), built up using L{Word}, L{Literal}, and L{And} elements -(L{'+'<ParserElement.__add__>} operator gives L{And} expressions, strings are auto-converted to -L{Literal} expressions):: - - from pyparsing import Word, alphas - - # define grammar of a greeting - greet = Word(alphas) + "," + Word(alphas) + "!" - - hello = "Hello, World!" - print (hello, "->", greet.parseString(hello)) - -The program outputs the following:: - - Hello, World! -> ['Hello', ',', 'World', '!'] - -The Python representation of the grammar is quite readable, owing to the self-explanatory -class names, and the use of '+', '|' and '^' operators. - -The L{ParseResults} object returned from L{ParserElement.parseString<ParserElement.parseString>} can be accessed as a nested list, a dictionary, or an -object with named attributes. - -The pyparsing module handles some of the problems that are typically vexing when writing text parsers: - - extra or missing whitespace (the above program will also handle "Hello,World!", "Hello , World !", etc.) - - quoted strings - - embedded comments - - -Getting Started - ------------------ -Visit the classes L{ParserElement} and L{ParseResults} to see the base classes that most other pyparsing -classes inherit from. Use the docstrings for examples of how to: - - construct literal match expressions from L{Literal} and L{CaselessLiteral} classes - - construct character word-group expressions using the L{Word} class - - see how to create repetitive expressions using L{ZeroOrMore} and L{OneOrMore} classes - - use L{'+'<And>}, L{'|'<MatchFirst>}, L{'^'<Or>}, and L{'&'<Each>} operators to combine simple expressions into more complex ones - - associate names with your parsed results using L{ParserElement.setResultsName} - - find some helpful expression short-cuts like L{delimitedList} and L{oneOf} - - find more useful common expressions in the L{pyparsing_common} namespace class -""" - -__version__ = "2.2.1" -__versionTime__ = "18 Sep 2018 00:49 UTC" -__author__ = "Paul McGuire <ptmcg@users.sourceforge.net>" - -import string -from weakref import ref as wkref -import copy -import sys -import warnings -import re -import sre_constants -import collections -import pprint -import traceback -import types -from datetime import datetime - -try: - from _thread import RLock -except ImportError: - from threading import RLock - -try: - # Python 3 - from collections.abc import Iterable - from collections.abc import MutableMapping -except ImportError: - # Python 2.7 - from collections import Iterable - from collections import MutableMapping - -try: - from collections import OrderedDict as _OrderedDict -except ImportError: - try: - from ordereddict import OrderedDict as _OrderedDict - except ImportError: - _OrderedDict = None - -#~ sys.stderr.write( "testing pyparsing module, version %s, %s\n" % (__version__,__versionTime__ ) ) - -__all__ = [ -'And', 'CaselessKeyword', 'CaselessLiteral', 'CharsNotIn', 'Combine', 'Dict', 'Each', 'Empty', -'FollowedBy', 'Forward', 'GoToColumn', 'Group', 'Keyword', 'LineEnd', 'LineStart', 'Literal', -'MatchFirst', 'NoMatch', 'NotAny', 'OneOrMore', 'OnlyOnce', 'Optional', 'Or', -'ParseBaseException', 'ParseElementEnhance', 'ParseException', 'ParseExpression', 'ParseFatalException', -'ParseResults', 'ParseSyntaxException', 'ParserElement', 'QuotedString', 'RecursiveGrammarException', -'Regex', 'SkipTo', 'StringEnd', 'StringStart', 'Suppress', 'Token', 'TokenConverter', -'White', 'Word', 'WordEnd', 'WordStart', 'ZeroOrMore', -'alphanums', 'alphas', 'alphas8bit', 'anyCloseTag', 'anyOpenTag', 'cStyleComment', 'col', -'commaSeparatedList', 'commonHTMLEntity', 'countedArray', 'cppStyleComment', 'dblQuotedString', -'dblSlashComment', 'delimitedList', 'dictOf', 'downcaseTokens', 'empty', 'hexnums', -'htmlComment', 'javaStyleComment', 'line', 'lineEnd', 'lineStart', 'lineno', -'makeHTMLTags', 'makeXMLTags', 'matchOnlyAtCol', 'matchPreviousExpr', 'matchPreviousLiteral', -'nestedExpr', 'nullDebugAction', 'nums', 'oneOf', 'opAssoc', 'operatorPrecedence', 'printables', -'punc8bit', 'pythonStyleComment', 'quotedString', 'removeQuotes', 'replaceHTMLEntity', -'replaceWith', 'restOfLine', 'sglQuotedString', 'srange', 'stringEnd', -'stringStart', 'traceParseAction', 'unicodeString', 'upcaseTokens', 'withAttribute', -'indentedBlock', 'originalTextFor', 'ungroup', 'infixNotation','locatedExpr', 'withClass', -'CloseMatch', 'tokenMap', 'pyparsing_common', -] - -system_version = tuple(sys.version_info)[:3] -PY_3 = system_version[0] == 3 -if PY_3: - _MAX_INT = sys.maxsize - basestring = str - unichr = chr - _ustr = str - - # build list of single arg builtins, that can be used as parse actions - singleArgBuiltins = [sum, len, sorted, reversed, list, tuple, set, any, all, min, max] - -else: - _MAX_INT = sys.maxint - range = xrange - - def _ustr(obj): - """Drop-in replacement for str(obj) that tries to be Unicode friendly. It first tries - str(obj). If that fails with a UnicodeEncodeError, then it tries unicode(obj). It - then < returns the unicode object | encodes it with the default encoding | ... >. - """ - if isinstance(obj,unicode): - return obj - - try: - # If this works, then _ustr(obj) has the same behaviour as str(obj), so - # it won't break any existing code. - return str(obj) - - except UnicodeEncodeError: - # Else encode it - ret = unicode(obj).encode(sys.getdefaultencoding(), 'xmlcharrefreplace') - xmlcharref = Regex(r'&#\d+;') - xmlcharref.setParseAction(lambda t: '\\u' + hex(int(t[0][2:-1]))[2:]) - return xmlcharref.transformString(ret) - - # build list of single arg builtins, tolerant of Python version, that can be used as parse actions - singleArgBuiltins = [] - import __builtin__ - for fname in "sum len sorted reversed list tuple set any all min max".split(): - try: - singleArgBuiltins.append(getattr(__builtin__,fname)) - except AttributeError: - continue - -_generatorType = type((y for y in range(1))) - -def _xml_escape(data): - """Escape &, <, >, ", ', etc. in a string of data.""" - - # ampersand must be replaced first - from_symbols = '&><"\'' - to_symbols = ('&'+s+';' for s in "amp gt lt quot apos".split()) - for from_,to_ in zip(from_symbols, to_symbols): - data = data.replace(from_, to_) - return data - -class _Constants(object): - pass - -alphas = string.ascii_uppercase + string.ascii_lowercase -nums = "0123456789" -hexnums = nums + "ABCDEFabcdef" -alphanums = alphas + nums -_bslash = chr(92) -printables = "".join(c for c in string.printable if c not in string.whitespace) - -class ParseBaseException(Exception): - """base exception class for all parsing runtime exceptions""" - # Performance tuning: we construct a *lot* of these, so keep this - # constructor as small and fast as possible - def __init__( self, pstr, loc=0, msg=None, elem=None ): - self.loc = loc - if msg is None: - self.msg = pstr - self.pstr = "" - else: - self.msg = msg - self.pstr = pstr - self.parserElement = elem - self.args = (pstr, loc, msg) - - @classmethod - def _from_exception(cls, pe): - """ - internal factory method to simplify creating one type of ParseException - from another - avoids having __init__ signature conflicts among subclasses - """ - return cls(pe.pstr, pe.loc, pe.msg, pe.parserElement) - - def __getattr__( self, aname ): - """supported attributes by name are: - - lineno - returns the line number of the exception text - - col - returns the column number of the exception text - - line - returns the line containing the exception text - """ - if( aname == "lineno" ): - return lineno( self.loc, self.pstr ) - elif( aname in ("col", "column") ): - return col( self.loc, self.pstr ) - elif( aname == "line" ): - return line( self.loc, self.pstr ) - else: - raise AttributeError(aname) - - def __str__( self ): - return "%s (at char %d), (line:%d, col:%d)" % \ - ( self.msg, self.loc, self.lineno, self.column ) - def __repr__( self ): - return _ustr(self) - def markInputline( self, markerString = ">!<" ): - """Extracts the exception line from the input string, and marks - the location of the exception with a special symbol. - """ - line_str = self.line - line_column = self.column - 1 - if markerString: - line_str = "".join((line_str[:line_column], - markerString, line_str[line_column:])) - return line_str.strip() - def __dir__(self): - return "lineno col line".split() + dir(type(self)) - -class ParseException(ParseBaseException): - """ - Exception thrown when parse expressions don't match class; - supported attributes by name are: - - lineno - returns the line number of the exception text - - col - returns the column number of the exception text - - line - returns the line containing the exception text - - Example:: - try: - Word(nums).setName("integer").parseString("ABC") - except ParseException as pe: - print(pe) - print("column: {}".format(pe.col)) - - prints:: - Expected integer (at char 0), (line:1, col:1) - column: 1 - """ - pass - -class ParseFatalException(ParseBaseException): - """user-throwable exception thrown when inconsistent parse content - is found; stops all parsing immediately""" - pass - -class ParseSyntaxException(ParseFatalException): - """just like L{ParseFatalException}, but thrown internally when an - L{ErrorStop<And._ErrorStop>} ('-' operator) indicates that parsing is to stop - immediately because an unbacktrackable syntax error has been found""" - pass - -#~ class ReparseException(ParseBaseException): - #~ """Experimental class - parse actions can raise this exception to cause - #~ pyparsing to reparse the input string: - #~ - with a modified input string, and/or - #~ - with a modified start location - #~ Set the values of the ReparseException in the constructor, and raise the - #~ exception in a parse action to cause pyparsing to use the new string/location. - #~ Setting the values as None causes no change to be made. - #~ """ - #~ def __init_( self, newstring, restartLoc ): - #~ self.newParseText = newstring - #~ self.reparseLoc = restartLoc - -class RecursiveGrammarException(Exception): - """exception thrown by L{ParserElement.validate} if the grammar could be improperly recursive""" - def __init__( self, parseElementList ): - self.parseElementTrace = parseElementList - - def __str__( self ): - return "RecursiveGrammarException: %s" % self.parseElementTrace - -class _ParseResultsWithOffset(object): - def __init__(self,p1,p2): - self.tup = (p1,p2) - def __getitem__(self,i): - return self.tup[i] - def __repr__(self): - return repr(self.tup[0]) - def setOffset(self,i): - self.tup = (self.tup[0],i) - -class ParseResults(object): - """ - Structured parse results, to provide multiple means of access to the parsed data: - - as a list (C{len(results)}) - - by list index (C{results[0], results[1]}, etc.) - - by attribute (C{results.<resultsName>} - see L{ParserElement.setResultsName}) - - Example:: - integer = Word(nums) - date_str = (integer.setResultsName("year") + '/' - + integer.setResultsName("month") + '/' - + integer.setResultsName("day")) - # equivalent form: - # date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - # parseString returns a ParseResults object - result = date_str.parseString("1999/12/31") - - def test(s, fn=repr): - print("%s -> %s" % (s, fn(eval(s)))) - test("list(result)") - test("result[0]") - test("result['month']") - test("result.day") - test("'month' in result") - test("'minutes' in result") - test("result.dump()", str) - prints:: - list(result) -> ['1999', '/', '12', '/', '31'] - result[0] -> '1999' - result['month'] -> '12' - result.day -> '31' - 'month' in result -> True - 'minutes' in result -> False - result.dump() -> ['1999', '/', '12', '/', '31'] - - day: 31 - - month: 12 - - year: 1999 - """ - def __new__(cls, toklist=None, name=None, asList=True, modal=True ): - if isinstance(toklist, cls): - return toklist - retobj = object.__new__(cls) - retobj.__doinit = True - return retobj - - # Performance tuning: we construct a *lot* of these, so keep this - # constructor as small and fast as possible - def __init__( self, toklist=None, name=None, asList=True, modal=True, isinstance=isinstance ): - if self.__doinit: - self.__doinit = False - self.__name = None - self.__parent = None - self.__accumNames = {} - self.__asList = asList - self.__modal = modal - if toklist is None: - toklist = [] - if isinstance(toklist, list): - self.__toklist = toklist[:] - elif isinstance(toklist, _generatorType): - self.__toklist = list(toklist) - else: - self.__toklist = [toklist] - self.__tokdict = dict() - - if name is not None and name: - if not modal: - self.__accumNames[name] = 0 - if isinstance(name,int): - name = _ustr(name) # will always return a str, but use _ustr for consistency - self.__name = name - if not (isinstance(toklist, (type(None), basestring, list)) and toklist in (None,'',[])): - if isinstance(toklist,basestring): - toklist = [ toklist ] - if asList: - if isinstance(toklist,ParseResults): - self[name] = _ParseResultsWithOffset(toklist.copy(),0) - else: - self[name] = _ParseResultsWithOffset(ParseResults(toklist[0]),0) - self[name].__name = name - else: - try: - self[name] = toklist[0] - except (KeyError,TypeError,IndexError): - self[name] = toklist - - def __getitem__( self, i ): - if isinstance( i, (int,slice) ): - return self.__toklist[i] - else: - if i not in self.__accumNames: - return self.__tokdict[i][-1][0] - else: - return ParseResults([ v[0] for v in self.__tokdict[i] ]) - - def __setitem__( self, k, v, isinstance=isinstance ): - if isinstance(v,_ParseResultsWithOffset): - self.__tokdict[k] = self.__tokdict.get(k,list()) + [v] - sub = v[0] - elif isinstance(k,(int,slice)): - self.__toklist[k] = v - sub = v - else: - self.__tokdict[k] = self.__tokdict.get(k,list()) + [_ParseResultsWithOffset(v,0)] - sub = v - if isinstance(sub,ParseResults): - sub.__parent = wkref(self) - - def __delitem__( self, i ): - if isinstance(i,(int,slice)): - mylen = len( self.__toklist ) - del self.__toklist[i] - - # convert int to slice - if isinstance(i, int): - if i < 0: - i += mylen - i = slice(i, i+1) - # get removed indices - removed = list(range(*i.indices(mylen))) - removed.reverse() - # fixup indices in token dictionary - for name,occurrences in self.__tokdict.items(): - for j in removed: - for k, (value, position) in enumerate(occurrences): - occurrences[k] = _ParseResultsWithOffset(value, position - (position > j)) - else: - del self.__tokdict[i] - - def __contains__( self, k ): - return k in self.__tokdict - - def __len__( self ): return len( self.__toklist ) - def __bool__(self): return ( not not self.__toklist ) - __nonzero__ = __bool__ - def __iter__( self ): return iter( self.__toklist ) - def __reversed__( self ): return iter( self.__toklist[::-1] ) - def _iterkeys( self ): - if hasattr(self.__tokdict, "iterkeys"): - return self.__tokdict.iterkeys() - else: - return iter(self.__tokdict) - - def _itervalues( self ): - return (self[k] for k in self._iterkeys()) - - def _iteritems( self ): - return ((k, self[k]) for k in self._iterkeys()) - - if PY_3: - keys = _iterkeys - """Returns an iterator of all named result keys (Python 3.x only).""" - - values = _itervalues - """Returns an iterator of all named result values (Python 3.x only).""" - - items = _iteritems - """Returns an iterator of all named result key-value tuples (Python 3.x only).""" - - else: - iterkeys = _iterkeys - """Returns an iterator of all named result keys (Python 2.x only).""" - - itervalues = _itervalues - """Returns an iterator of all named result values (Python 2.x only).""" - - iteritems = _iteritems - """Returns an iterator of all named result key-value tuples (Python 2.x only).""" - - def keys( self ): - """Returns all named result keys (as a list in Python 2.x, as an iterator in Python 3.x).""" - return list(self.iterkeys()) - - def values( self ): - """Returns all named result values (as a list in Python 2.x, as an iterator in Python 3.x).""" - return list(self.itervalues()) - - def items( self ): - """Returns all named result key-values (as a list of tuples in Python 2.x, as an iterator in Python 3.x).""" - return list(self.iteritems()) - - def haskeys( self ): - """Since keys() returns an iterator, this method is helpful in bypassing - code that looks for the existence of any defined results names.""" - return bool(self.__tokdict) - - def pop( self, *args, **kwargs): - """ - Removes and returns item at specified index (default=C{last}). - Supports both C{list} and C{dict} semantics for C{pop()}. If passed no - argument or an integer argument, it will use C{list} semantics - and pop tokens from the list of parsed tokens. If passed a - non-integer argument (most likely a string), it will use C{dict} - semantics and pop the corresponding value from any defined - results names. A second default return value argument is - supported, just as in C{dict.pop()}. - - Example:: - def remove_first(tokens): - tokens.pop(0) - print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] - print(OneOrMore(Word(nums)).addParseAction(remove_first).parseString("0 123 321")) # -> ['123', '321'] - - label = Word(alphas) - patt = label("LABEL") + OneOrMore(Word(nums)) - print(patt.parseString("AAB 123 321").dump()) - - # Use pop() in a parse action to remove named result (note that corresponding value is not - # removed from list form of results) - def remove_LABEL(tokens): - tokens.pop("LABEL") - return tokens - patt.addParseAction(remove_LABEL) - print(patt.parseString("AAB 123 321").dump()) - prints:: - ['AAB', '123', '321'] - - LABEL: AAB - - ['AAB', '123', '321'] - """ - if not args: - args = [-1] - for k,v in kwargs.items(): - if k == 'default': - args = (args[0], v) - else: - raise TypeError("pop() got an unexpected keyword argument '%s'" % k) - if (isinstance(args[0], int) or - len(args) == 1 or - args[0] in self): - index = args[0] - ret = self[index] - del self[index] - return ret - else: - defaultvalue = args[1] - return defaultvalue - - def get(self, key, defaultValue=None): - """ - Returns named result matching the given key, or if there is no - such name, then returns the given C{defaultValue} or C{None} if no - C{defaultValue} is specified. - - Similar to C{dict.get()}. - - Example:: - integer = Word(nums) - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - result = date_str.parseString("1999/12/31") - print(result.get("year")) # -> '1999' - print(result.get("hour", "not specified")) # -> 'not specified' - print(result.get("hour")) # -> None - """ - if key in self: - return self[key] - else: - return defaultValue - - def insert( self, index, insStr ): - """ - Inserts new element at location index in the list of parsed tokens. - - Similar to C{list.insert()}. - - Example:: - print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] - - # use a parse action to insert the parse location in the front of the parsed results - def insert_locn(locn, tokens): - tokens.insert(0, locn) - print(OneOrMore(Word(nums)).addParseAction(insert_locn).parseString("0 123 321")) # -> [0, '0', '123', '321'] - """ - self.__toklist.insert(index, insStr) - # fixup indices in token dictionary - for name,occurrences in self.__tokdict.items(): - for k, (value, position) in enumerate(occurrences): - occurrences[k] = _ParseResultsWithOffset(value, position + (position > index)) - - def append( self, item ): - """ - Add single element to end of ParseResults list of elements. - - Example:: - print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] - - # use a parse action to compute the sum of the parsed integers, and add it to the end - def append_sum(tokens): - tokens.append(sum(map(int, tokens))) - print(OneOrMore(Word(nums)).addParseAction(append_sum).parseString("0 123 321")) # -> ['0', '123', '321', 444] - """ - self.__toklist.append(item) - - def extend( self, itemseq ): - """ - Add sequence of elements to end of ParseResults list of elements. - - Example:: - patt = OneOrMore(Word(alphas)) - - # use a parse action to append the reverse of the matched strings, to make a palindrome - def make_palindrome(tokens): - tokens.extend(reversed([t[::-1] for t in tokens])) - return ''.join(tokens) - print(patt.addParseAction(make_palindrome).parseString("lskdj sdlkjf lksd")) # -> 'lskdjsdlkjflksddsklfjkldsjdksl' - """ - if isinstance(itemseq, ParseResults): - self += itemseq - else: - self.__toklist.extend(itemseq) - - def clear( self ): - """ - Clear all elements and results names. - """ - del self.__toklist[:] - self.__tokdict.clear() - - def __getattr__( self, name ): - try: - return self[name] - except KeyError: - return "" - - if name in self.__tokdict: - if name not in self.__accumNames: - return self.__tokdict[name][-1][0] - else: - return ParseResults([ v[0] for v in self.__tokdict[name] ]) - else: - return "" - - def __add__( self, other ): - ret = self.copy() - ret += other - return ret - - def __iadd__( self, other ): - if other.__tokdict: - offset = len(self.__toklist) - addoffset = lambda a: offset if a<0 else a+offset - otheritems = other.__tokdict.items() - otherdictitems = [(k, _ParseResultsWithOffset(v[0],addoffset(v[1])) ) - for (k,vlist) in otheritems for v in vlist] - for k,v in otherdictitems: - self[k] = v - if isinstance(v[0],ParseResults): - v[0].__parent = wkref(self) - - self.__toklist += other.__toklist - self.__accumNames.update( other.__accumNames ) - return self - - def __radd__(self, other): - if isinstance(other,int) and other == 0: - # useful for merging many ParseResults using sum() builtin - return self.copy() - else: - # this may raise a TypeError - so be it - return other + self - - def __repr__( self ): - return "(%s, %s)" % ( repr( self.__toklist ), repr( self.__tokdict ) ) - - def __str__( self ): - return '[' + ', '.join(_ustr(i) if isinstance(i, ParseResults) else repr(i) for i in self.__toklist) + ']' - - def _asStringList( self, sep='' ): - out = [] - for item in self.__toklist: - if out and sep: - out.append(sep) - if isinstance( item, ParseResults ): - out += item._asStringList() - else: - out.append( _ustr(item) ) - return out - - def asList( self ): - """ - Returns the parse results as a nested list of matching tokens, all converted to strings. - - Example:: - patt = OneOrMore(Word(alphas)) - result = patt.parseString("sldkj lsdkj sldkj") - # even though the result prints in string-like form, it is actually a pyparsing ParseResults - print(type(result), result) # -> <class 'pyparsing.ParseResults'> ['sldkj', 'lsdkj', 'sldkj'] - - # Use asList() to create an actual list - result_list = result.asList() - print(type(result_list), result_list) # -> <class 'list'> ['sldkj', 'lsdkj', 'sldkj'] - """ - return [res.asList() if isinstance(res,ParseResults) else res for res in self.__toklist] - - def asDict( self ): - """ - Returns the named parse results as a nested dictionary. - - Example:: - integer = Word(nums) - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - result = date_str.parseString('12/31/1999') - print(type(result), repr(result)) # -> <class 'pyparsing.ParseResults'> (['12', '/', '31', '/', '1999'], {'day': [('1999', 4)], 'year': [('12', 0)], 'month': [('31', 2)]}) - - result_dict = result.asDict() - print(type(result_dict), repr(result_dict)) # -> <class 'dict'> {'day': '1999', 'year': '12', 'month': '31'} - - # even though a ParseResults supports dict-like access, sometime you just need to have a dict - import json - print(json.dumps(result)) # -> Exception: TypeError: ... is not JSON serializable - print(json.dumps(result.asDict())) # -> {"month": "31", "day": "1999", "year": "12"} - """ - if PY_3: - item_fn = self.items - else: - item_fn = self.iteritems - - def toItem(obj): - if isinstance(obj, ParseResults): - if obj.haskeys(): - return obj.asDict() - else: - return [toItem(v) for v in obj] - else: - return obj - - return dict((k,toItem(v)) for k,v in item_fn()) - - def copy( self ): - """ - Returns a new copy of a C{ParseResults} object. - """ - ret = ParseResults( self.__toklist ) - ret.__tokdict = self.__tokdict.copy() - ret.__parent = self.__parent - ret.__accumNames.update( self.__accumNames ) - ret.__name = self.__name - return ret - - def asXML( self, doctag=None, namedItemsOnly=False, indent="", formatted=True ): - """ - (Deprecated) Returns the parse results as XML. Tags are created for tokens and lists that have defined results names. - """ - nl = "\n" - out = [] - namedItems = dict((v[1],k) for (k,vlist) in self.__tokdict.items() - for v in vlist) - nextLevelIndent = indent + " " - - # collapse out indents if formatting is not desired - if not formatted: - indent = "" - nextLevelIndent = "" - nl = "" - - selfTag = None - if doctag is not None: - selfTag = doctag - else: - if self.__name: - selfTag = self.__name - - if not selfTag: - if namedItemsOnly: - return "" - else: - selfTag = "ITEM" - - out += [ nl, indent, "<", selfTag, ">" ] - - for i,res in enumerate(self.__toklist): - if isinstance(res,ParseResults): - if i in namedItems: - out += [ res.asXML(namedItems[i], - namedItemsOnly and doctag is None, - nextLevelIndent, - formatted)] - else: - out += [ res.asXML(None, - namedItemsOnly and doctag is None, - nextLevelIndent, - formatted)] - else: - # individual token, see if there is a name for it - resTag = None - if i in namedItems: - resTag = namedItems[i] - if not resTag: - if namedItemsOnly: - continue - else: - resTag = "ITEM" - xmlBodyText = _xml_escape(_ustr(res)) - out += [ nl, nextLevelIndent, "<", resTag, ">", - xmlBodyText, - "</", resTag, ">" ] - - out += [ nl, indent, "</", selfTag, ">" ] - return "".join(out) - - def __lookup(self,sub): - for k,vlist in self.__tokdict.items(): - for v,loc in vlist: - if sub is v: - return k - return None - - def getName(self): - r""" - Returns the results name for this token expression. Useful when several - different expressions might match at a particular location. - - Example:: - integer = Word(nums) - ssn_expr = Regex(r"\d\d\d-\d\d-\d\d\d\d") - house_number_expr = Suppress('#') + Word(nums, alphanums) - user_data = (Group(house_number_expr)("house_number") - | Group(ssn_expr)("ssn") - | Group(integer)("age")) - user_info = OneOrMore(user_data) - - result = user_info.parseString("22 111-22-3333 #221B") - for item in result: - print(item.getName(), ':', item[0]) - prints:: - age : 22 - ssn : 111-22-3333 - house_number : 221B - """ - if self.__name: - return self.__name - elif self.__parent: - par = self.__parent() - if par: - return par.__lookup(self) - else: - return None - elif (len(self) == 1 and - len(self.__tokdict) == 1 and - next(iter(self.__tokdict.values()))[0][1] in (0,-1)): - return next(iter(self.__tokdict.keys())) - else: - return None - - def dump(self, indent='', depth=0, full=True): - """ - Diagnostic method for listing out the contents of a C{ParseResults}. - Accepts an optional C{indent} argument so that this string can be embedded - in a nested display of other data. - - Example:: - integer = Word(nums) - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - result = date_str.parseString('12/31/1999') - print(result.dump()) - prints:: - ['12', '/', '31', '/', '1999'] - - day: 1999 - - month: 31 - - year: 12 - """ - out = [] - NL = '\n' - out.append( indent+_ustr(self.asList()) ) - if full: - if self.haskeys(): - items = sorted((str(k), v) for k,v in self.items()) - for k,v in items: - if out: - out.append(NL) - out.append( "%s%s- %s: " % (indent,(' '*depth), k) ) - if isinstance(v,ParseResults): - if v: - out.append( v.dump(indent,depth+1) ) - else: - out.append(_ustr(v)) - else: - out.append(repr(v)) - elif any(isinstance(vv,ParseResults) for vv in self): - v = self - for i,vv in enumerate(v): - if isinstance(vv,ParseResults): - out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth)),i,indent,(' '*(depth+1)),vv.dump(indent,depth+1) )) - else: - out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth)),i,indent,(' '*(depth+1)),_ustr(vv))) - - return "".join(out) - - def pprint(self, *args, **kwargs): - """ - Pretty-printer for parsed results as a list, using the C{pprint} module. - Accepts additional positional or keyword args as defined for the - C{pprint.pprint} method. (U{http://docs.python.org/3/library/pprint.html#pprint.pprint}) - - Example:: - ident = Word(alphas, alphanums) - num = Word(nums) - func = Forward() - term = ident | num | Group('(' + func + ')') - func <<= ident + Group(Optional(delimitedList(term))) - result = func.parseString("fna a,b,(fnb c,d,200),100") - result.pprint(width=40) - prints:: - ['fna', - ['a', - 'b', - ['(', 'fnb', ['c', 'd', '200'], ')'], - '100']] - """ - pprint.pprint(self.asList(), *args, **kwargs) - - # add support for pickle protocol - def __getstate__(self): - return ( self.__toklist, - ( self.__tokdict.copy(), - self.__parent is not None and self.__parent() or None, - self.__accumNames, - self.__name ) ) - - def __setstate__(self,state): - self.__toklist = state[0] - (self.__tokdict, - par, - inAccumNames, - self.__name) = state[1] - self.__accumNames = {} - self.__accumNames.update(inAccumNames) - if par is not None: - self.__parent = wkref(par) - else: - self.__parent = None - - def __getnewargs__(self): - return self.__toklist, self.__name, self.__asList, self.__modal - - def __dir__(self): - return (dir(type(self)) + list(self.keys())) - -MutableMapping.register(ParseResults) - -def col (loc,strg): - """Returns current column within a string, counting newlines as line separators. - The first column is number 1. - - Note: the default parsing behavior is to expand tabs in the input string - before starting the parsing process. See L{I{ParserElement.parseString}<ParserElement.parseString>} for more information - on parsing strings containing C{<TAB>}s, and suggested methods to maintain a - consistent view of the parsed string, the parse location, and line and column - positions within the parsed string. - """ - s = strg - return 1 if 0<loc<len(s) and s[loc-1] == '\n' else loc - s.rfind("\n", 0, loc) - -def lineno(loc,strg): - """Returns current line number within a string, counting newlines as line separators. - The first line is number 1. - - Note: the default parsing behavior is to expand tabs in the input string - before starting the parsing process. See L{I{ParserElement.parseString}<ParserElement.parseString>} for more information - on parsing strings containing C{<TAB>}s, and suggested methods to maintain a - consistent view of the parsed string, the parse location, and line and column - positions within the parsed string. - """ - return strg.count("\n",0,loc) + 1 - -def line( loc, strg ): - """Returns the line of text containing loc within a string, counting newlines as line separators. - """ - lastCR = strg.rfind("\n", 0, loc) - nextCR = strg.find("\n", loc) - if nextCR >= 0: - return strg[lastCR+1:nextCR] - else: - return strg[lastCR+1:] - -def _defaultStartDebugAction( instring, loc, expr ): - print (("Match " + _ustr(expr) + " at loc " + _ustr(loc) + "(%d,%d)" % ( lineno(loc,instring), col(loc,instring) ))) - -def _defaultSuccessDebugAction( instring, startloc, endloc, expr, toks ): - print ("Matched " + _ustr(expr) + " -> " + str(toks.asList())) - -def _defaultExceptionDebugAction( instring, loc, expr, exc ): - print ("Exception raised:" + _ustr(exc)) - -def nullDebugAction(*args): - """'Do-nothing' debug action, to suppress debugging output during parsing.""" - pass - -# Only works on Python 3.x - nonlocal is toxic to Python 2 installs -#~ 'decorator to trim function calls to match the arity of the target' -#~ def _trim_arity(func, maxargs=3): - #~ if func in singleArgBuiltins: - #~ return lambda s,l,t: func(t) - #~ limit = 0 - #~ foundArity = False - #~ def wrapper(*args): - #~ nonlocal limit,foundArity - #~ while 1: - #~ try: - #~ ret = func(*args[limit:]) - #~ foundArity = True - #~ return ret - #~ except TypeError: - #~ if limit == maxargs or foundArity: - #~ raise - #~ limit += 1 - #~ continue - #~ return wrapper - -# this version is Python 2.x-3.x cross-compatible -'decorator to trim function calls to match the arity of the target' -def _trim_arity(func, maxargs=2): - if func in singleArgBuiltins: - return lambda s,l,t: func(t) - limit = [0] - foundArity = [False] - - # traceback return data structure changed in Py3.5 - normalize back to plain tuples - if system_version[:2] >= (3,5): - def extract_stack(limit=0): - # special handling for Python 3.5.0 - extra deep call stack by 1 - offset = -3 if system_version == (3,5,0) else -2 - frame_summary = traceback.extract_stack(limit=-offset+limit-1)[offset] - return [frame_summary[:2]] - def extract_tb(tb, limit=0): - frames = traceback.extract_tb(tb, limit=limit) - frame_summary = frames[-1] - return [frame_summary[:2]] - else: - extract_stack = traceback.extract_stack - extract_tb = traceback.extract_tb - - # synthesize what would be returned by traceback.extract_stack at the call to - # user's parse action 'func', so that we don't incur call penalty at parse time - - LINE_DIFF = 6 - # IF ANY CODE CHANGES, EVEN JUST COMMENTS OR BLANK LINES, BETWEEN THE NEXT LINE AND - # THE CALL TO FUNC INSIDE WRAPPER, LINE_DIFF MUST BE MODIFIED!!!! - this_line = extract_stack(limit=2)[-1] - pa_call_line_synth = (this_line[0], this_line[1]+LINE_DIFF) - - def wrapper(*args): - while 1: - try: - ret = func(*args[limit[0]:]) - foundArity[0] = True - return ret - except TypeError: - # re-raise TypeErrors if they did not come from our arity testing - if foundArity[0]: - raise - else: - try: - tb = sys.exc_info()[-1] - if not extract_tb(tb, limit=2)[-1][:2] == pa_call_line_synth: - raise - finally: - del tb - - if limit[0] <= maxargs: - limit[0] += 1 - continue - raise - - # copy func name to wrapper for sensible debug output - func_name = "<parse action>" - try: - func_name = getattr(func, '__name__', - getattr(func, '__class__').__name__) - except Exception: - func_name = str(func) - wrapper.__name__ = func_name - - return wrapper - -class ParserElement(object): - """Abstract base level parser element class.""" - DEFAULT_WHITE_CHARS = " \n\t\r" - verbose_stacktrace = False - - @staticmethod - def setDefaultWhitespaceChars( chars ): - r""" - Overrides the default whitespace chars - - Example:: - # default whitespace chars are space, <TAB> and newline - OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def', 'ghi', 'jkl'] - - # change to just treat newline as significant - ParserElement.setDefaultWhitespaceChars(" \t") - OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def'] - """ - ParserElement.DEFAULT_WHITE_CHARS = chars - - @staticmethod - def inlineLiteralsUsing(cls): - """ - Set class to be used for inclusion of string literals into a parser. - - Example:: - # default literal class used is Literal - integer = Word(nums) - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] - - - # change to Suppress - ParserElement.inlineLiteralsUsing(Suppress) - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - date_str.parseString("1999/12/31") # -> ['1999', '12', '31'] - """ - ParserElement._literalStringClass = cls - - def __init__( self, savelist=False ): - self.parseAction = list() - self.failAction = None - #~ self.name = "<unknown>" # don't define self.name, let subclasses try/except upcall - self.strRepr = None - self.resultsName = None - self.saveAsList = savelist - self.skipWhitespace = True - self.whiteChars = ParserElement.DEFAULT_WHITE_CHARS - self.copyDefaultWhiteChars = True - self.mayReturnEmpty = False # used when checking for left-recursion - self.keepTabs = False - self.ignoreExprs = list() - self.debug = False - self.streamlined = False - self.mayIndexError = True # used to optimize exception handling for subclasses that don't advance parse index - self.errmsg = "" - self.modalResults = True # used to mark results names as modal (report only last) or cumulative (list all) - self.debugActions = ( None, None, None ) #custom debug actions - self.re = None - self.callPreparse = True # used to avoid redundant calls to preParse - self.callDuringTry = False - - def copy( self ): - """ - Make a copy of this C{ParserElement}. Useful for defining different parse actions - for the same parsing pattern, using copies of the original parse element. - - Example:: - integer = Word(nums).setParseAction(lambda toks: int(toks[0])) - integerK = integer.copy().addParseAction(lambda toks: toks[0]*1024) + Suppress("K") - integerM = integer.copy().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") - - print(OneOrMore(integerK | integerM | integer).parseString("5K 100 640K 256M")) - prints:: - [5120, 100, 655360, 268435456] - Equivalent form of C{expr.copy()} is just C{expr()}:: - integerM = integer().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") - """ - cpy = copy.copy( self ) - cpy.parseAction = self.parseAction[:] - cpy.ignoreExprs = self.ignoreExprs[:] - if self.copyDefaultWhiteChars: - cpy.whiteChars = ParserElement.DEFAULT_WHITE_CHARS - return cpy - - def setName( self, name ): - """ - Define name for this expression, makes debugging and exception messages clearer. - - Example:: - Word(nums).parseString("ABC") # -> Exception: Expected W:(0123...) (at char 0), (line:1, col:1) - Word(nums).setName("integer").parseString("ABC") # -> Exception: Expected integer (at char 0), (line:1, col:1) - """ - self.name = name - self.errmsg = "Expected " + self.name - if hasattr(self,"exception"): - self.exception.msg = self.errmsg - return self - - def setResultsName( self, name, listAllMatches=False ): - """ - Define name for referencing matching tokens as a nested attribute - of the returned parse results. - NOTE: this returns a *copy* of the original C{ParserElement} object; - this is so that the client can define a basic element, such as an - integer, and reference it in multiple places with different names. - - You can also set results names using the abbreviated syntax, - C{expr("name")} in place of C{expr.setResultsName("name")} - - see L{I{__call__}<__call__>}. - - Example:: - date_str = (integer.setResultsName("year") + '/' - + integer.setResultsName("month") + '/' - + integer.setResultsName("day")) - - # equivalent form: - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - """ - newself = self.copy() - if name.endswith("*"): - name = name[:-1] - listAllMatches=True - newself.resultsName = name - newself.modalResults = not listAllMatches - return newself - - def setBreak(self,breakFlag = True): - """Method to invoke the Python pdb debugger when this element is - about to be parsed. Set C{breakFlag} to True to enable, False to - disable. - """ - if breakFlag: - _parseMethod = self._parse - def breaker(instring, loc, doActions=True, callPreParse=True): - import pdb - pdb.set_trace() - return _parseMethod( instring, loc, doActions, callPreParse ) - breaker._originalParseMethod = _parseMethod - self._parse = breaker - else: - if hasattr(self._parse,"_originalParseMethod"): - self._parse = self._parse._originalParseMethod - return self - - def setParseAction( self, *fns, **kwargs ): - """ - Define one or more actions to perform when successfully matching parse element definition. - Parse action fn is a callable method with 0-3 arguments, called as C{fn(s,loc,toks)}, - C{fn(loc,toks)}, C{fn(toks)}, or just C{fn()}, where: - - s = the original string being parsed (see note below) - - loc = the location of the matching substring - - toks = a list of the matched tokens, packaged as a C{L{ParseResults}} object - If the functions in fns modify the tokens, they can return them as the return - value from fn, and the modified list of tokens will replace the original. - Otherwise, fn does not need to return any value. - - Optional keyword arguments: - - callDuringTry = (default=C{False}) indicate if parse action should be run during lookaheads and alternate testing - - Note: the default parsing behavior is to expand tabs in the input string - before starting the parsing process. See L{I{parseString}<parseString>} for more information - on parsing strings containing C{<TAB>}s, and suggested methods to maintain a - consistent view of the parsed string, the parse location, and line and column - positions within the parsed string. - - Example:: - integer = Word(nums) - date_str = integer + '/' + integer + '/' + integer - - date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] - - # use parse action to convert to ints at parse time - integer = Word(nums).setParseAction(lambda toks: int(toks[0])) - date_str = integer + '/' + integer + '/' + integer - - # note that integer fields are now ints, not strings - date_str.parseString("1999/12/31") # -> [1999, '/', 12, '/', 31] - """ - self.parseAction = list(map(_trim_arity, list(fns))) - self.callDuringTry = kwargs.get("callDuringTry", False) - return self - - def addParseAction( self, *fns, **kwargs ): - """ - Add one or more parse actions to expression's list of parse actions. See L{I{setParseAction}<setParseAction>}. - - See examples in L{I{copy}<copy>}. - """ - self.parseAction += list(map(_trim_arity, list(fns))) - self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False) - return self - - def addCondition(self, *fns, **kwargs): - """Add a boolean predicate function to expression's list of parse actions. See - L{I{setParseAction}<setParseAction>} for function call signatures. Unlike C{setParseAction}, - functions passed to C{addCondition} need to return boolean success/fail of the condition. - - Optional keyword arguments: - - message = define a custom message to be used in the raised exception - - fatal = if True, will raise ParseFatalException to stop parsing immediately; otherwise will raise ParseException - - Example:: - integer = Word(nums).setParseAction(lambda toks: int(toks[0])) - year_int = integer.copy() - year_int.addCondition(lambda toks: toks[0] >= 2000, message="Only support years 2000 and later") - date_str = year_int + '/' + integer + '/' + integer - - result = date_str.parseString("1999/12/31") # -> Exception: Only support years 2000 and later (at char 0), (line:1, col:1) - """ - msg = kwargs.get("message", "failed user-defined condition") - exc_type = ParseFatalException if kwargs.get("fatal", False) else ParseException - for fn in fns: - def pa(s,l,t): - if not bool(_trim_arity(fn)(s,l,t)): - raise exc_type(s,l,msg) - self.parseAction.append(pa) - self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False) - return self - - def setFailAction( self, fn ): - """Define action to perform if parsing fails at this expression. - Fail acton fn is a callable function that takes the arguments - C{fn(s,loc,expr,err)} where: - - s = string being parsed - - loc = location where expression match was attempted and failed - - expr = the parse expression that failed - - err = the exception thrown - The function returns no value. It may throw C{L{ParseFatalException}} - if it is desired to stop parsing immediately.""" - self.failAction = fn - return self - - def _skipIgnorables( self, instring, loc ): - exprsFound = True - while exprsFound: - exprsFound = False - for e in self.ignoreExprs: - try: - while 1: - loc,dummy = e._parse( instring, loc ) - exprsFound = True - except ParseException: - pass - return loc - - def preParse( self, instring, loc ): - if self.ignoreExprs: - loc = self._skipIgnorables( instring, loc ) - - if self.skipWhitespace: - wt = self.whiteChars - instrlen = len(instring) - while loc < instrlen and instring[loc] in wt: - loc += 1 - - return loc - - def parseImpl( self, instring, loc, doActions=True ): - return loc, [] - - def postParse( self, instring, loc, tokenlist ): - return tokenlist - - #~ @profile - def _parseNoCache( self, instring, loc, doActions=True, callPreParse=True ): - debugging = ( self.debug ) #and doActions ) - - if debugging or self.failAction: - #~ print ("Match",self,"at loc",loc,"(%d,%d)" % ( lineno(loc,instring), col(loc,instring) )) - if (self.debugActions[0] ): - self.debugActions[0]( instring, loc, self ) - if callPreParse and self.callPreparse: - preloc = self.preParse( instring, loc ) - else: - preloc = loc - tokensStart = preloc - try: - try: - loc,tokens = self.parseImpl( instring, preloc, doActions ) - except IndexError: - raise ParseException( instring, len(instring), self.errmsg, self ) - except ParseBaseException as err: - #~ print ("Exception raised:", err) - if self.debugActions[2]: - self.debugActions[2]( instring, tokensStart, self, err ) - if self.failAction: - self.failAction( instring, tokensStart, self, err ) - raise - else: - if callPreParse and self.callPreparse: - preloc = self.preParse( instring, loc ) - else: - preloc = loc - tokensStart = preloc - if self.mayIndexError or preloc >= len(instring): - try: - loc,tokens = self.parseImpl( instring, preloc, doActions ) - except IndexError: - raise ParseException( instring, len(instring), self.errmsg, self ) - else: - loc,tokens = self.parseImpl( instring, preloc, doActions ) - - tokens = self.postParse( instring, loc, tokens ) - - retTokens = ParseResults( tokens, self.resultsName, asList=self.saveAsList, modal=self.modalResults ) - if self.parseAction and (doActions or self.callDuringTry): - if debugging: - try: - for fn in self.parseAction: - tokens = fn( instring, tokensStart, retTokens ) - if tokens is not None: - retTokens = ParseResults( tokens, - self.resultsName, - asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), - modal=self.modalResults ) - except ParseBaseException as err: - #~ print "Exception raised in user parse action:", err - if (self.debugActions[2] ): - self.debugActions[2]( instring, tokensStart, self, err ) - raise - else: - for fn in self.parseAction: - tokens = fn( instring, tokensStart, retTokens ) - if tokens is not None: - retTokens = ParseResults( tokens, - self.resultsName, - asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), - modal=self.modalResults ) - if debugging: - #~ print ("Matched",self,"->",retTokens.asList()) - if (self.debugActions[1] ): - self.debugActions[1]( instring, tokensStart, loc, self, retTokens ) - - return loc, retTokens - - def tryParse( self, instring, loc ): - try: - return self._parse( instring, loc, doActions=False )[0] - except ParseFatalException: - raise ParseException( instring, loc, self.errmsg, self) - - def canParseNext(self, instring, loc): - try: - self.tryParse(instring, loc) - except (ParseException, IndexError): - return False - else: - return True - - class _UnboundedCache(object): - def __init__(self): - cache = {} - self.not_in_cache = not_in_cache = object() - - def get(self, key): - return cache.get(key, not_in_cache) - - def set(self, key, value): - cache[key] = value - - def clear(self): - cache.clear() - - def cache_len(self): - return len(cache) - - self.get = types.MethodType(get, self) - self.set = types.MethodType(set, self) - self.clear = types.MethodType(clear, self) - self.__len__ = types.MethodType(cache_len, self) - - if _OrderedDict is not None: - class _FifoCache(object): - def __init__(self, size): - self.not_in_cache = not_in_cache = object() - - cache = _OrderedDict() - - def get(self, key): - return cache.get(key, not_in_cache) - - def set(self, key, value): - cache[key] = value - while len(cache) > size: - try: - cache.popitem(False) - except KeyError: - pass - - def clear(self): - cache.clear() - - def cache_len(self): - return len(cache) - - self.get = types.MethodType(get, self) - self.set = types.MethodType(set, self) - self.clear = types.MethodType(clear, self) - self.__len__ = types.MethodType(cache_len, self) - - else: - class _FifoCache(object): - def __init__(self, size): - self.not_in_cache = not_in_cache = object() - - cache = {} - key_fifo = collections.deque([], size) - - def get(self, key): - return cache.get(key, not_in_cache) - - def set(self, key, value): - cache[key] = value - while len(key_fifo) > size: - cache.pop(key_fifo.popleft(), None) - key_fifo.append(key) - - def clear(self): - cache.clear() - key_fifo.clear() - - def cache_len(self): - return len(cache) - - self.get = types.MethodType(get, self) - self.set = types.MethodType(set, self) - self.clear = types.MethodType(clear, self) - self.__len__ = types.MethodType(cache_len, self) - - # argument cache for optimizing repeated calls when backtracking through recursive expressions - packrat_cache = {} # this is set later by enabledPackrat(); this is here so that resetCache() doesn't fail - packrat_cache_lock = RLock() - packrat_cache_stats = [0, 0] - - # this method gets repeatedly called during backtracking with the same arguments - - # we can cache these arguments and save ourselves the trouble of re-parsing the contained expression - def _parseCache( self, instring, loc, doActions=True, callPreParse=True ): - HIT, MISS = 0, 1 - lookup = (self, instring, loc, callPreParse, doActions) - with ParserElement.packrat_cache_lock: - cache = ParserElement.packrat_cache - value = cache.get(lookup) - if value is cache.not_in_cache: - ParserElement.packrat_cache_stats[MISS] += 1 - try: - value = self._parseNoCache(instring, loc, doActions, callPreParse) - except ParseBaseException as pe: - # cache a copy of the exception, without the traceback - cache.set(lookup, pe.__class__(*pe.args)) - raise - else: - cache.set(lookup, (value[0], value[1].copy())) - return value - else: - ParserElement.packrat_cache_stats[HIT] += 1 - if isinstance(value, Exception): - raise value - return (value[0], value[1].copy()) - - _parse = _parseNoCache - - @staticmethod - def resetCache(): - ParserElement.packrat_cache.clear() - ParserElement.packrat_cache_stats[:] = [0] * len(ParserElement.packrat_cache_stats) - - _packratEnabled = False - @staticmethod - def enablePackrat(cache_size_limit=128): - """Enables "packrat" parsing, which adds memoizing to the parsing logic. - Repeated parse attempts at the same string location (which happens - often in many complex grammars) can immediately return a cached value, - instead of re-executing parsing/validating code. Memoizing is done of - both valid results and parsing exceptions. - - Parameters: - - cache_size_limit - (default=C{128}) - if an integer value is provided - will limit the size of the packrat cache; if None is passed, then - the cache size will be unbounded; if 0 is passed, the cache will - be effectively disabled. - - This speedup may break existing programs that use parse actions that - have side-effects. For this reason, packrat parsing is disabled when - you first import pyparsing. To activate the packrat feature, your - program must call the class method C{ParserElement.enablePackrat()}. If - your program uses C{psyco} to "compile as you go", you must call - C{enablePackrat} before calling C{psyco.full()}. If you do not do this, - Python will crash. For best results, call C{enablePackrat()} immediately - after importing pyparsing. - - Example:: - import pyparsing - pyparsing.ParserElement.enablePackrat() - """ - if not ParserElement._packratEnabled: - ParserElement._packratEnabled = True - if cache_size_limit is None: - ParserElement.packrat_cache = ParserElement._UnboundedCache() - else: - ParserElement.packrat_cache = ParserElement._FifoCache(cache_size_limit) - ParserElement._parse = ParserElement._parseCache - - def parseString( self, instring, parseAll=False ): - """ - Execute the parse expression with the given string. - This is the main interface to the client code, once the complete - expression has been built. - - If you want the grammar to require that the entire input string be - successfully parsed, then set C{parseAll} to True (equivalent to ending - the grammar with C{L{StringEnd()}}). - - Note: C{parseString} implicitly calls C{expandtabs()} on the input string, - in order to report proper column numbers in parse actions. - If the input string contains tabs and - the grammar uses parse actions that use the C{loc} argument to index into the - string being parsed, you can ensure you have a consistent view of the input - string by: - - calling C{parseWithTabs} on your grammar before calling C{parseString} - (see L{I{parseWithTabs}<parseWithTabs>}) - - define your parse action using the full C{(s,loc,toks)} signature, and - reference the input string using the parse action's C{s} argument - - explictly expand the tabs in your input string before calling - C{parseString} - - Example:: - Word('a').parseString('aaaaabaaa') # -> ['aaaaa'] - Word('a').parseString('aaaaabaaa', parseAll=True) # -> Exception: Expected end of text - """ - ParserElement.resetCache() - if not self.streamlined: - self.streamline() - #~ self.saveAsList = True - for e in self.ignoreExprs: - e.streamline() - if not self.keepTabs: - instring = instring.expandtabs() - try: - loc, tokens = self._parse( instring, 0 ) - if parseAll: - loc = self.preParse( instring, loc ) - se = Empty() + StringEnd() - se._parse( instring, loc ) - except ParseBaseException as exc: - if ParserElement.verbose_stacktrace: - raise - else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace - raise exc - else: - return tokens - - def scanString( self, instring, maxMatches=_MAX_INT, overlap=False ): - """ - Scan the input string for expression matches. Each match will return the - matching tokens, start location, and end location. May be called with optional - C{maxMatches} argument, to clip scanning after 'n' matches are found. If - C{overlap} is specified, then overlapping matches will be reported. - - Note that the start and end locations are reported relative to the string - being parsed. See L{I{parseString}<parseString>} for more information on parsing - strings with embedded tabs. - - Example:: - source = "sldjf123lsdjjkf345sldkjf879lkjsfd987" - print(source) - for tokens,start,end in Word(alphas).scanString(source): - print(' '*start + '^'*(end-start)) - print(' '*start + tokens[0]) - - prints:: - - sldjf123lsdjjkf345sldkjf879lkjsfd987 - ^^^^^ - sldjf - ^^^^^^^ - lsdjjkf - ^^^^^^ - sldkjf - ^^^^^^ - lkjsfd - """ - if not self.streamlined: - self.streamline() - for e in self.ignoreExprs: - e.streamline() - - if not self.keepTabs: - instring = _ustr(instring).expandtabs() - instrlen = len(instring) - loc = 0 - preparseFn = self.preParse - parseFn = self._parse - ParserElement.resetCache() - matches = 0 - try: - while loc <= instrlen and matches < maxMatches: - try: - preloc = preparseFn( instring, loc ) - nextLoc,tokens = parseFn( instring, preloc, callPreParse=False ) - except ParseException: - loc = preloc+1 - else: - if nextLoc > loc: - matches += 1 - yield tokens, preloc, nextLoc - if overlap: - nextloc = preparseFn( instring, loc ) - if nextloc > loc: - loc = nextLoc - else: - loc += 1 - else: - loc = nextLoc - else: - loc = preloc+1 - except ParseBaseException as exc: - if ParserElement.verbose_stacktrace: - raise - else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace - raise exc - - def transformString( self, instring ): - """ - Extension to C{L{scanString}}, to modify matching text with modified tokens that may - be returned from a parse action. To use C{transformString}, define a grammar and - attach a parse action to it that modifies the returned token list. - Invoking C{transformString()} on a target string will then scan for matches, - and replace the matched text patterns according to the logic in the parse - action. C{transformString()} returns the resulting transformed string. - - Example:: - wd = Word(alphas) - wd.setParseAction(lambda toks: toks[0].title()) - - print(wd.transformString("now is the winter of our discontent made glorious summer by this sun of york.")) - Prints:: - Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York. - """ - out = [] - lastE = 0 - # force preservation of <TAB>s, to minimize unwanted transformation of string, and to - # keep string locs straight between transformString and scanString - self.keepTabs = True - try: - for t,s,e in self.scanString( instring ): - out.append( instring[lastE:s] ) - if t: - if isinstance(t,ParseResults): - out += t.asList() - elif isinstance(t,list): - out += t - else: - out.append(t) - lastE = e - out.append(instring[lastE:]) - out = [o for o in out if o] - return "".join(map(_ustr,_flatten(out))) - except ParseBaseException as exc: - if ParserElement.verbose_stacktrace: - raise - else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace - raise exc - - def searchString( self, instring, maxMatches=_MAX_INT ): - """ - Another extension to C{L{scanString}}, simplifying the access to the tokens found - to match the given parse expression. May be called with optional - C{maxMatches} argument, to clip searching after 'n' matches are found. - - Example:: - # a capitalized word starts with an uppercase letter, followed by zero or more lowercase letters - cap_word = Word(alphas.upper(), alphas.lower()) - - print(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity")) - - # the sum() builtin can be used to merge results into a single ParseResults object - print(sum(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity"))) - prints:: - [['More'], ['Iron'], ['Lead'], ['Gold'], ['I'], ['Electricity']] - ['More', 'Iron', 'Lead', 'Gold', 'I', 'Electricity'] - """ - try: - return ParseResults([ t for t,s,e in self.scanString( instring, maxMatches ) ]) - except ParseBaseException as exc: - if ParserElement.verbose_stacktrace: - raise - else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace - raise exc - - def split(self, instring, maxsplit=_MAX_INT, includeSeparators=False): - """ - Generator method to split a string using the given expression as a separator. - May be called with optional C{maxsplit} argument, to limit the number of splits; - and the optional C{includeSeparators} argument (default=C{False}), if the separating - matching text should be included in the split results. - - Example:: - punc = oneOf(list(".,;:/-!?")) - print(list(punc.split("This, this?, this sentence, is badly punctuated!"))) - prints:: - ['This', ' this', '', ' this sentence', ' is badly punctuated', ''] - """ - splits = 0 - last = 0 - for t,s,e in self.scanString(instring, maxMatches=maxsplit): - yield instring[last:s] - if includeSeparators: - yield t[0] - last = e - yield instring[last:] - - def __add__(self, other ): - """ - Implementation of + operator - returns C{L{And}}. Adding strings to a ParserElement - converts them to L{Literal}s by default. - - Example:: - greet = Word(alphas) + "," + Word(alphas) + "!" - hello = "Hello, World!" - print (hello, "->", greet.parseString(hello)) - Prints:: - Hello, World! -> ['Hello', ',', 'World', '!'] - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return And( [ self, other ] ) - - def __radd__(self, other ): - """ - Implementation of + operator when left operand is not a C{L{ParserElement}} - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return other + self - - def __sub__(self, other): - """ - Implementation of - operator, returns C{L{And}} with error stop - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return self + And._ErrorStop() + other - - def __rsub__(self, other ): - """ - Implementation of - operator when left operand is not a C{L{ParserElement}} - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return other - self - - def __mul__(self,other): - """ - Implementation of * operator, allows use of C{expr * 3} in place of - C{expr + expr + expr}. Expressions may also me multiplied by a 2-integer - tuple, similar to C{{min,max}} multipliers in regular expressions. Tuples - may also include C{None} as in: - - C{expr*(n,None)} or C{expr*(n,)} is equivalent - to C{expr*n + L{ZeroOrMore}(expr)} - (read as "at least n instances of C{expr}") - - C{expr*(None,n)} is equivalent to C{expr*(0,n)} - (read as "0 to n instances of C{expr}") - - C{expr*(None,None)} is equivalent to C{L{ZeroOrMore}(expr)} - - C{expr*(1,None)} is equivalent to C{L{OneOrMore}(expr)} - - Note that C{expr*(None,n)} does not raise an exception if - more than n exprs exist in the input stream; that is, - C{expr*(None,n)} does not enforce a maximum number of expr - occurrences. If this behavior is desired, then write - C{expr*(None,n) + ~expr} - """ - if isinstance(other,int): - minElements, optElements = other,0 - elif isinstance(other,tuple): - other = (other + (None, None))[:2] - if other[0] is None: - other = (0, other[1]) - if isinstance(other[0],int) and other[1] is None: - if other[0] == 0: - return ZeroOrMore(self) - if other[0] == 1: - return OneOrMore(self) - else: - return self*other[0] + ZeroOrMore(self) - elif isinstance(other[0],int) and isinstance(other[1],int): - minElements, optElements = other - optElements -= minElements - else: - raise TypeError("cannot multiply 'ParserElement' and ('%s','%s') objects", type(other[0]),type(other[1])) - else: - raise TypeError("cannot multiply 'ParserElement' and '%s' objects", type(other)) - - if minElements < 0: - raise ValueError("cannot multiply ParserElement by negative value") - if optElements < 0: - raise ValueError("second tuple value must be greater or equal to first tuple value") - if minElements == optElements == 0: - raise ValueError("cannot multiply ParserElement by 0 or (0,0)") - - if (optElements): - def makeOptionalList(n): - if n>1: - return Optional(self + makeOptionalList(n-1)) - else: - return Optional(self) - if minElements: - if minElements == 1: - ret = self + makeOptionalList(optElements) - else: - ret = And([self]*minElements) + makeOptionalList(optElements) - else: - ret = makeOptionalList(optElements) - else: - if minElements == 1: - ret = self - else: - ret = And([self]*minElements) - return ret - - def __rmul__(self, other): - return self.__mul__(other) - - def __or__(self, other ): - """ - Implementation of | operator - returns C{L{MatchFirst}} - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return MatchFirst( [ self, other ] ) - - def __ror__(self, other ): - """ - Implementation of | operator when left operand is not a C{L{ParserElement}} - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return other | self - - def __xor__(self, other ): - """ - Implementation of ^ operator - returns C{L{Or}} - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return Or( [ self, other ] ) - - def __rxor__(self, other ): - """ - Implementation of ^ operator when left operand is not a C{L{ParserElement}} - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return other ^ self - - def __and__(self, other ): - """ - Implementation of & operator - returns C{L{Each}} - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return Each( [ self, other ] ) - - def __rand__(self, other ): - """ - Implementation of & operator when left operand is not a C{L{ParserElement}} - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return other & self - - def __invert__( self ): - """ - Implementation of ~ operator - returns C{L{NotAny}} - """ - return NotAny( self ) - - def __call__(self, name=None): - """ - Shortcut for C{L{setResultsName}}, with C{listAllMatches=False}. - - If C{name} is given with a trailing C{'*'} character, then C{listAllMatches} will be - passed as C{True}. - - If C{name} is omitted, same as calling C{L{copy}}. - - Example:: - # these are equivalent - userdata = Word(alphas).setResultsName("name") + Word(nums+"-").setResultsName("socsecno") - userdata = Word(alphas)("name") + Word(nums+"-")("socsecno") - """ - if name is not None: - return self.setResultsName(name) - else: - return self.copy() - - def suppress( self ): - """ - Suppresses the output of this C{ParserElement}; useful to keep punctuation from - cluttering up returned output. - """ - return Suppress( self ) - - def leaveWhitespace( self ): - """ - Disables the skipping of whitespace before matching the characters in the - C{ParserElement}'s defined pattern. This is normally only used internally by - the pyparsing module, but may be needed in some whitespace-sensitive grammars. - """ - self.skipWhitespace = False - return self - - def setWhitespaceChars( self, chars ): - """ - Overrides the default whitespace chars - """ - self.skipWhitespace = True - self.whiteChars = chars - self.copyDefaultWhiteChars = False - return self - - def parseWithTabs( self ): - """ - Overrides default behavior to expand C{<TAB>}s to spaces before parsing the input string. - Must be called before C{parseString} when the input grammar contains elements that - match C{<TAB>} characters. - """ - self.keepTabs = True - return self - - def ignore( self, other ): - """ - Define expression to be ignored (e.g., comments) while doing pattern - matching; may be called repeatedly, to define multiple comment or other - ignorable patterns. - - Example:: - patt = OneOrMore(Word(alphas)) - patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj'] - - patt.ignore(cStyleComment) - patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj', 'lskjd'] - """ - if isinstance(other, basestring): - other = Suppress(other) - - if isinstance( other, Suppress ): - if other not in self.ignoreExprs: - self.ignoreExprs.append(other) - else: - self.ignoreExprs.append( Suppress( other.copy() ) ) - return self - - def setDebugActions( self, startAction, successAction, exceptionAction ): - """ - Enable display of debugging messages while doing pattern matching. - """ - self.debugActions = (startAction or _defaultStartDebugAction, - successAction or _defaultSuccessDebugAction, - exceptionAction or _defaultExceptionDebugAction) - self.debug = True - return self - - def setDebug( self, flag=True ): - """ - Enable display of debugging messages while doing pattern matching. - Set C{flag} to True to enable, False to disable. - - Example:: - wd = Word(alphas).setName("alphaword") - integer = Word(nums).setName("numword") - term = wd | integer - - # turn on debugging for wd - wd.setDebug() - - OneOrMore(term).parseString("abc 123 xyz 890") - - prints:: - Match alphaword at loc 0(1,1) - Matched alphaword -> ['abc'] - Match alphaword at loc 3(1,4) - Exception raised:Expected alphaword (at char 4), (line:1, col:5) - Match alphaword at loc 7(1,8) - Matched alphaword -> ['xyz'] - Match alphaword at loc 11(1,12) - Exception raised:Expected alphaword (at char 12), (line:1, col:13) - Match alphaword at loc 15(1,16) - Exception raised:Expected alphaword (at char 15), (line:1, col:16) - - The output shown is that produced by the default debug actions - custom debug actions can be - specified using L{setDebugActions}. Prior to attempting - to match the C{wd} expression, the debugging message C{"Match <exprname> at loc <n>(<line>,<col>)"} - is shown. Then if the parse succeeds, a C{"Matched"} message is shown, or an C{"Exception raised"} - message is shown. Also note the use of L{setName} to assign a human-readable name to the expression, - which makes debugging and exception messages easier to understand - for instance, the default - name created for the C{Word} expression without calling C{setName} is C{"W:(ABCD...)"}. - """ - if flag: - self.setDebugActions( _defaultStartDebugAction, _defaultSuccessDebugAction, _defaultExceptionDebugAction ) - else: - self.debug = False - return self - - def __str__( self ): - return self.name - - def __repr__( self ): - return _ustr(self) - - def streamline( self ): - self.streamlined = True - self.strRepr = None - return self - - def checkRecursion( self, parseElementList ): - pass - - def validate( self, validateTrace=[] ): - """ - Check defined expressions for valid structure, check for infinite recursive definitions. - """ - self.checkRecursion( [] ) - - def parseFile( self, file_or_filename, parseAll=False ): - """ - Execute the parse expression on the given file or filename. - If a filename is specified (instead of a file object), - the entire file is opened, read, and closed before parsing. - """ - try: - file_contents = file_or_filename.read() - except AttributeError: - with open(file_or_filename, "r") as f: - file_contents = f.read() - try: - return self.parseString(file_contents, parseAll) - except ParseBaseException as exc: - if ParserElement.verbose_stacktrace: - raise - else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace - raise exc - - def __eq__(self,other): - if isinstance(other, ParserElement): - return self is other or vars(self) == vars(other) - elif isinstance(other, basestring): - return self.matches(other) - else: - return super(ParserElement,self)==other - - def __ne__(self,other): - return not (self == other) - - def __hash__(self): - return hash(id(self)) - - def __req__(self,other): - return self == other - - def __rne__(self,other): - return not (self == other) - - def matches(self, testString, parseAll=True): - """ - Method for quick testing of a parser against a test string. Good for simple - inline microtests of sub expressions while building up larger parser. - - Parameters: - - testString - to test against this expression for a match - - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests - - Example:: - expr = Word(nums) - assert expr.matches("100") - """ - try: - self.parseString(_ustr(testString), parseAll=parseAll) - return True - except ParseBaseException: - return False - - def runTests(self, tests, parseAll=True, comment='#', fullDump=True, printResults=True, failureTests=False): - """ - Execute the parse expression on a series of test strings, showing each - test, the parsed results or where the parse failed. Quick and easy way to - run a parse expression against a list of sample strings. - - Parameters: - - tests - a list of separate test strings, or a multiline string of test strings - - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests - - comment - (default=C{'#'}) - expression for indicating embedded comments in the test - string; pass None to disable comment filtering - - fullDump - (default=C{True}) - dump results as list followed by results names in nested outline; - if False, only dump nested list - - printResults - (default=C{True}) prints test output to stdout - - failureTests - (default=C{False}) indicates if these tests are expected to fail parsing - - Returns: a (success, results) tuple, where success indicates that all tests succeeded - (or failed if C{failureTests} is True), and the results contain a list of lines of each - test's output - - Example:: - number_expr = pyparsing_common.number.copy() - - result = number_expr.runTests(''' - # unsigned integer - 100 - # negative integer - -100 - # float with scientific notation - 6.02e23 - # integer with scientific notation - 1e-12 - ''') - print("Success" if result[0] else "Failed!") - - result = number_expr.runTests(''' - # stray character - 100Z - # missing leading digit before '.' - -.100 - # too many '.' - 3.14.159 - ''', failureTests=True) - print("Success" if result[0] else "Failed!") - prints:: - # unsigned integer - 100 - [100] - - # negative integer - -100 - [-100] - - # float with scientific notation - 6.02e23 - [6.02e+23] - - # integer with scientific notation - 1e-12 - [1e-12] - - Success - - # stray character - 100Z - ^ - FAIL: Expected end of text (at char 3), (line:1, col:4) - - # missing leading digit before '.' - -.100 - ^ - FAIL: Expected {real number with scientific notation | real number | signed integer} (at char 0), (line:1, col:1) - - # too many '.' - 3.14.159 - ^ - FAIL: Expected end of text (at char 4), (line:1, col:5) - - Success - - Each test string must be on a single line. If you want to test a string that spans multiple - lines, create a test like this:: - - expr.runTest(r"this is a test\\n of strings that spans \\n 3 lines") - - (Note that this is a raw string literal, you must include the leading 'r'.) - """ - if isinstance(tests, basestring): - tests = list(map(str.strip, tests.rstrip().splitlines())) - if isinstance(comment, basestring): - comment = Literal(comment) - allResults = [] - comments = [] - success = True - for t in tests: - if comment is not None and comment.matches(t, False) or comments and not t: - comments.append(t) - continue - if not t: - continue - out = ['\n'.join(comments), t] - comments = [] - try: - t = t.replace(r'\n','\n') - result = self.parseString(t, parseAll=parseAll) - out.append(result.dump(full=fullDump)) - success = success and not failureTests - except ParseBaseException as pe: - fatal = "(FATAL)" if isinstance(pe, ParseFatalException) else "" - if '\n' in t: - out.append(line(pe.loc, t)) - out.append(' '*(col(pe.loc,t)-1) + '^' + fatal) - else: - out.append(' '*pe.loc + '^' + fatal) - out.append("FAIL: " + str(pe)) - success = success and failureTests - result = pe - except Exception as exc: - out.append("FAIL-EXCEPTION: " + str(exc)) - success = success and failureTests - result = exc - - if printResults: - if fullDump: - out.append('') - print('\n'.join(out)) - - allResults.append((t, result)) - - return success, allResults - - -class Token(ParserElement): - """ - Abstract C{ParserElement} subclass, for defining atomic matching patterns. - """ - def __init__( self ): - super(Token,self).__init__( savelist=False ) - - -class Empty(Token): - """ - An empty token, will always match. - """ - def __init__( self ): - super(Empty,self).__init__() - self.name = "Empty" - self.mayReturnEmpty = True - self.mayIndexError = False - - -class NoMatch(Token): - """ - A token that will never match. - """ - def __init__( self ): - super(NoMatch,self).__init__() - self.name = "NoMatch" - self.mayReturnEmpty = True - self.mayIndexError = False - self.errmsg = "Unmatchable token" - - def parseImpl( self, instring, loc, doActions=True ): - raise ParseException(instring, loc, self.errmsg, self) - - -class Literal(Token): - """ - Token to exactly match a specified string. - - Example:: - Literal('blah').parseString('blah') # -> ['blah'] - Literal('blah').parseString('blahfooblah') # -> ['blah'] - Literal('blah').parseString('bla') # -> Exception: Expected "blah" - - For case-insensitive matching, use L{CaselessLiteral}. - - For keyword matching (force word break before and after the matched string), - use L{Keyword} or L{CaselessKeyword}. - """ - def __init__( self, matchString ): - super(Literal,self).__init__() - self.match = matchString - self.matchLen = len(matchString) - try: - self.firstMatchChar = matchString[0] - except IndexError: - warnings.warn("null string passed to Literal; use Empty() instead", - SyntaxWarning, stacklevel=2) - self.__class__ = Empty - self.name = '"%s"' % _ustr(self.match) - self.errmsg = "Expected " + self.name - self.mayReturnEmpty = False - self.mayIndexError = False - - # Performance tuning: this routine gets called a *lot* - # if this is a single character match string and the first character matches, - # short-circuit as quickly as possible, and avoid calling startswith - #~ @profile - def parseImpl( self, instring, loc, doActions=True ): - if (instring[loc] == self.firstMatchChar and - (self.matchLen==1 or instring.startswith(self.match,loc)) ): - return loc+self.matchLen, self.match - raise ParseException(instring, loc, self.errmsg, self) -_L = Literal -ParserElement._literalStringClass = Literal - -class Keyword(Token): - """ - Token to exactly match a specified string as a keyword, that is, it must be - immediately followed by a non-keyword character. Compare with C{L{Literal}}: - - C{Literal("if")} will match the leading C{'if'} in C{'ifAndOnlyIf'}. - - C{Keyword("if")} will not; it will only match the leading C{'if'} in C{'if x=1'}, or C{'if(y==2)'} - Accepts two optional constructor arguments in addition to the keyword string: - - C{identChars} is a string of characters that would be valid identifier characters, - defaulting to all alphanumerics + "_" and "$" - - C{caseless} allows case-insensitive matching, default is C{False}. - - Example:: - Keyword("start").parseString("start") # -> ['start'] - Keyword("start").parseString("starting") # -> Exception - - For case-insensitive matching, use L{CaselessKeyword}. - """ - DEFAULT_KEYWORD_CHARS = alphanums+"_$" - - def __init__( self, matchString, identChars=None, caseless=False ): - super(Keyword,self).__init__() - if identChars is None: - identChars = Keyword.DEFAULT_KEYWORD_CHARS - self.match = matchString - self.matchLen = len(matchString) - try: - self.firstMatchChar = matchString[0] - except IndexError: - warnings.warn("null string passed to Keyword; use Empty() instead", - SyntaxWarning, stacklevel=2) - self.name = '"%s"' % self.match - self.errmsg = "Expected " + self.name - self.mayReturnEmpty = False - self.mayIndexError = False - self.caseless = caseless - if caseless: - self.caselessmatch = matchString.upper() - identChars = identChars.upper() - self.identChars = set(identChars) - - def parseImpl( self, instring, loc, doActions=True ): - if self.caseless: - if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and - (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) and - (loc == 0 or instring[loc-1].upper() not in self.identChars) ): - return loc+self.matchLen, self.match - else: - if (instring[loc] == self.firstMatchChar and - (self.matchLen==1 or instring.startswith(self.match,loc)) and - (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen] not in self.identChars) and - (loc == 0 or instring[loc-1] not in self.identChars) ): - return loc+self.matchLen, self.match - raise ParseException(instring, loc, self.errmsg, self) - - def copy(self): - c = super(Keyword,self).copy() - c.identChars = Keyword.DEFAULT_KEYWORD_CHARS - return c - - @staticmethod - def setDefaultKeywordChars( chars ): - """Overrides the default Keyword chars - """ - Keyword.DEFAULT_KEYWORD_CHARS = chars - -class CaselessLiteral(Literal): - """ - Token to match a specified string, ignoring case of letters. - Note: the matched results will always be in the case of the given - match string, NOT the case of the input text. - - Example:: - OneOrMore(CaselessLiteral("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD', 'CMD'] - - (Contrast with example for L{CaselessKeyword}.) - """ - def __init__( self, matchString ): - super(CaselessLiteral,self).__init__( matchString.upper() ) - # Preserve the defining literal. - self.returnString = matchString - self.name = "'%s'" % self.returnString - self.errmsg = "Expected " + self.name - - def parseImpl( self, instring, loc, doActions=True ): - if instring[ loc:loc+self.matchLen ].upper() == self.match: - return loc+self.matchLen, self.returnString - raise ParseException(instring, loc, self.errmsg, self) - -class CaselessKeyword(Keyword): - """ - Caseless version of L{Keyword}. - - Example:: - OneOrMore(CaselessKeyword("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD'] - - (Contrast with example for L{CaselessLiteral}.) - """ - def __init__( self, matchString, identChars=None ): - super(CaselessKeyword,self).__init__( matchString, identChars, caseless=True ) - - def parseImpl( self, instring, loc, doActions=True ): - if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and - (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) ): - return loc+self.matchLen, self.match - raise ParseException(instring, loc, self.errmsg, self) - -class CloseMatch(Token): - """ - A variation on L{Literal} which matches "close" matches, that is, - strings with at most 'n' mismatching characters. C{CloseMatch} takes parameters: - - C{match_string} - string to be matched - - C{maxMismatches} - (C{default=1}) maximum number of mismatches allowed to count as a match - - The results from a successful parse will contain the matched text from the input string and the following named results: - - C{mismatches} - a list of the positions within the match_string where mismatches were found - - C{original} - the original match_string used to compare against the input string - - If C{mismatches} is an empty list, then the match was an exact match. - - Example:: - patt = CloseMatch("ATCATCGAATGGA") - patt.parseString("ATCATCGAAXGGA") # -> (['ATCATCGAAXGGA'], {'mismatches': [[9]], 'original': ['ATCATCGAATGGA']}) - patt.parseString("ATCAXCGAAXGGA") # -> Exception: Expected 'ATCATCGAATGGA' (with up to 1 mismatches) (at char 0), (line:1, col:1) - - # exact match - patt.parseString("ATCATCGAATGGA") # -> (['ATCATCGAATGGA'], {'mismatches': [[]], 'original': ['ATCATCGAATGGA']}) - - # close match allowing up to 2 mismatches - patt = CloseMatch("ATCATCGAATGGA", maxMismatches=2) - patt.parseString("ATCAXCGAAXGGA") # -> (['ATCAXCGAAXGGA'], {'mismatches': [[4, 9]], 'original': ['ATCATCGAATGGA']}) - """ - def __init__(self, match_string, maxMismatches=1): - super(CloseMatch,self).__init__() - self.name = match_string - self.match_string = match_string - self.maxMismatches = maxMismatches - self.errmsg = "Expected %r (with up to %d mismatches)" % (self.match_string, self.maxMismatches) - self.mayIndexError = False - self.mayReturnEmpty = False - - def parseImpl( self, instring, loc, doActions=True ): - start = loc - instrlen = len(instring) - maxloc = start + len(self.match_string) - - if maxloc <= instrlen: - match_string = self.match_string - match_stringloc = 0 - mismatches = [] - maxMismatches = self.maxMismatches - - for match_stringloc,s_m in enumerate(zip(instring[loc:maxloc], self.match_string)): - src,mat = s_m - if src != mat: - mismatches.append(match_stringloc) - if len(mismatches) > maxMismatches: - break - else: - loc = match_stringloc + 1 - results = ParseResults([instring[start:loc]]) - results['original'] = self.match_string - results['mismatches'] = mismatches - return loc, results - - raise ParseException(instring, loc, self.errmsg, self) - - -class Word(Token): - """ - Token for matching words composed of allowed character sets. - Defined with string containing all allowed initial characters, - an optional string containing allowed body characters (if omitted, - defaults to the initial character set), and an optional minimum, - maximum, and/or exact length. The default value for C{min} is 1 (a - minimum value < 1 is not valid); the default values for C{max} and C{exact} - are 0, meaning no maximum or exact length restriction. An optional - C{excludeChars} parameter can list characters that might be found in - the input C{bodyChars} string; useful to define a word of all printables - except for one or two characters, for instance. - - L{srange} is useful for defining custom character set strings for defining - C{Word} expressions, using range notation from regular expression character sets. - - A common mistake is to use C{Word} to match a specific literal string, as in - C{Word("Address")}. Remember that C{Word} uses the string argument to define - I{sets} of matchable characters. This expression would match "Add", "AAA", - "dAred", or any other word made up of the characters 'A', 'd', 'r', 'e', and 's'. - To match an exact literal string, use L{Literal} or L{Keyword}. - - pyparsing includes helper strings for building Words: - - L{alphas} - - L{nums} - - L{alphanums} - - L{hexnums} - - L{alphas8bit} (alphabetic characters in ASCII range 128-255 - accented, tilded, umlauted, etc.) - - L{punc8bit} (non-alphabetic characters in ASCII range 128-255 - currency, symbols, superscripts, diacriticals, etc.) - - L{printables} (any non-whitespace character) - - Example:: - # a word composed of digits - integer = Word(nums) # equivalent to Word("0123456789") or Word(srange("0-9")) - - # a word with a leading capital, and zero or more lowercase - capital_word = Word(alphas.upper(), alphas.lower()) - - # hostnames are alphanumeric, with leading alpha, and '-' - hostname = Word(alphas, alphanums+'-') - - # roman numeral (not a strict parser, accepts invalid mix of characters) - roman = Word("IVXLCDM") - - # any string of non-whitespace characters, except for ',' - csv_value = Word(printables, excludeChars=",") - """ - def __init__( self, initChars, bodyChars=None, min=1, max=0, exact=0, asKeyword=False, excludeChars=None ): - super(Word,self).__init__() - if excludeChars: - initChars = ''.join(c for c in initChars if c not in excludeChars) - if bodyChars: - bodyChars = ''.join(c for c in bodyChars if c not in excludeChars) - self.initCharsOrig = initChars - self.initChars = set(initChars) - if bodyChars : - self.bodyCharsOrig = bodyChars - self.bodyChars = set(bodyChars) - else: - self.bodyCharsOrig = initChars - self.bodyChars = set(initChars) - - self.maxSpecified = max > 0 - - if min < 1: - raise ValueError("cannot specify a minimum length < 1; use Optional(Word()) if zero-length word is permitted") - - self.minLen = min - - if max > 0: - self.maxLen = max - else: - self.maxLen = _MAX_INT - - if exact > 0: - self.maxLen = exact - self.minLen = exact - - self.name = _ustr(self) - self.errmsg = "Expected " + self.name - self.mayIndexError = False - self.asKeyword = asKeyword - - if ' ' not in self.initCharsOrig+self.bodyCharsOrig and (min==1 and max==0 and exact==0): - if self.bodyCharsOrig == self.initCharsOrig: - self.reString = "[%s]+" % _escapeRegexRangeChars(self.initCharsOrig) - elif len(self.initCharsOrig) == 1: - self.reString = "%s[%s]*" % \ - (re.escape(self.initCharsOrig), - _escapeRegexRangeChars(self.bodyCharsOrig),) - else: - self.reString = "[%s][%s]*" % \ - (_escapeRegexRangeChars(self.initCharsOrig), - _escapeRegexRangeChars(self.bodyCharsOrig),) - if self.asKeyword: - self.reString = r"\b"+self.reString+r"\b" - try: - self.re = re.compile( self.reString ) - except Exception: - self.re = None - - def parseImpl( self, instring, loc, doActions=True ): - if self.re: - result = self.re.match(instring,loc) - if not result: - raise ParseException(instring, loc, self.errmsg, self) - - loc = result.end() - return loc, result.group() - - if not(instring[ loc ] in self.initChars): - raise ParseException(instring, loc, self.errmsg, self) - - start = loc - loc += 1 - instrlen = len(instring) - bodychars = self.bodyChars - maxloc = start + self.maxLen - maxloc = min( maxloc, instrlen ) - while loc < maxloc and instring[loc] in bodychars: - loc += 1 - - throwException = False - if loc - start < self.minLen: - throwException = True - if self.maxSpecified and loc < instrlen and instring[loc] in bodychars: - throwException = True - if self.asKeyword: - if (start>0 and instring[start-1] in bodychars) or (loc<instrlen and instring[loc] in bodychars): - throwException = True - - if throwException: - raise ParseException(instring, loc, self.errmsg, self) - - return loc, instring[start:loc] - - def __str__( self ): - try: - return super(Word,self).__str__() - except Exception: - pass - - - if self.strRepr is None: - - def charsAsStr(s): - if len(s)>4: - return s[:4]+"..." - else: - return s - - if ( self.initCharsOrig != self.bodyCharsOrig ): - self.strRepr = "W:(%s,%s)" % ( charsAsStr(self.initCharsOrig), charsAsStr(self.bodyCharsOrig) ) - else: - self.strRepr = "W:(%s)" % charsAsStr(self.initCharsOrig) - - return self.strRepr - - -class Regex(Token): - r""" - Token for matching strings that match a given regular expression. - Defined with string specifying the regular expression in a form recognized by the inbuilt Python re module. - If the given regex contains named groups (defined using C{(?P<name>...)}), these will be preserved as - named parse results. - - Example:: - realnum = Regex(r"[+-]?\d+\.\d*") - date = Regex(r'(?P<year>\d{4})-(?P<month>\d\d?)-(?P<day>\d\d?)') - # ref: http://stackoverflow.com/questions/267399/how-do-you-match-only-valid-roman-numerals-with-a-regular-expression - roman = Regex(r"M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})") - """ - compiledREtype = type(re.compile("[A-Z]")) - def __init__( self, pattern, flags=0): - """The parameters C{pattern} and C{flags} are passed to the C{re.compile()} function as-is. See the Python C{re} module for an explanation of the acceptable patterns and flags.""" - super(Regex,self).__init__() - - if isinstance(pattern, basestring): - if not pattern: - warnings.warn("null string passed to Regex; use Empty() instead", - SyntaxWarning, stacklevel=2) - - self.pattern = pattern - self.flags = flags - - try: - self.re = re.compile(self.pattern, self.flags) - self.reString = self.pattern - except sre_constants.error: - warnings.warn("invalid pattern (%s) passed to Regex" % pattern, - SyntaxWarning, stacklevel=2) - raise - - elif isinstance(pattern, Regex.compiledREtype): - self.re = pattern - self.pattern = \ - self.reString = str(pattern) - self.flags = flags - - else: - raise ValueError("Regex may only be constructed with a string or a compiled RE object") - - self.name = _ustr(self) - self.errmsg = "Expected " + self.name - self.mayIndexError = False - self.mayReturnEmpty = True - - def parseImpl( self, instring, loc, doActions=True ): - result = self.re.match(instring,loc) - if not result: - raise ParseException(instring, loc, self.errmsg, self) - - loc = result.end() - d = result.groupdict() - ret = ParseResults(result.group()) - if d: - for k in d: - ret[k] = d[k] - return loc,ret - - def __str__( self ): - try: - return super(Regex,self).__str__() - except Exception: - pass - - if self.strRepr is None: - self.strRepr = "Re:(%s)" % repr(self.pattern) - - return self.strRepr - - -class QuotedString(Token): - r""" - Token for matching strings that are delimited by quoting characters. - - Defined with the following parameters: - - quoteChar - string of one or more characters defining the quote delimiting string - - escChar - character to escape quotes, typically backslash (default=C{None}) - - escQuote - special quote sequence to escape an embedded quote string (such as SQL's "" to escape an embedded ") (default=C{None}) - - multiline - boolean indicating whether quotes can span multiple lines (default=C{False}) - - unquoteResults - boolean indicating whether the matched text should be unquoted (default=C{True}) - - endQuoteChar - string of one or more characters defining the end of the quote delimited string (default=C{None} => same as quoteChar) - - convertWhitespaceEscapes - convert escaped whitespace (C{'\t'}, C{'\n'}, etc.) to actual whitespace (default=C{True}) - - Example:: - qs = QuotedString('"') - print(qs.searchString('lsjdf "This is the quote" sldjf')) - complex_qs = QuotedString('{{', endQuoteChar='}}') - print(complex_qs.searchString('lsjdf {{This is the "quote"}} sldjf')) - sql_qs = QuotedString('"', escQuote='""') - print(sql_qs.searchString('lsjdf "This is the quote with ""embedded"" quotes" sldjf')) - prints:: - [['This is the quote']] - [['This is the "quote"']] - [['This is the quote with "embedded" quotes']] - """ - def __init__( self, quoteChar, escChar=None, escQuote=None, multiline=False, unquoteResults=True, endQuoteChar=None, convertWhitespaceEscapes=True): - super(QuotedString,self).__init__() - - # remove white space from quote chars - wont work anyway - quoteChar = quoteChar.strip() - if not quoteChar: - warnings.warn("quoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) - raise SyntaxError() - - if endQuoteChar is None: - endQuoteChar = quoteChar - else: - endQuoteChar = endQuoteChar.strip() - if not endQuoteChar: - warnings.warn("endQuoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) - raise SyntaxError() - - self.quoteChar = quoteChar - self.quoteCharLen = len(quoteChar) - self.firstQuoteChar = quoteChar[0] - self.endQuoteChar = endQuoteChar - self.endQuoteCharLen = len(endQuoteChar) - self.escChar = escChar - self.escQuote = escQuote - self.unquoteResults = unquoteResults - self.convertWhitespaceEscapes = convertWhitespaceEscapes - - if multiline: - self.flags = re.MULTILINE | re.DOTALL - self.pattern = r'%s(?:[^%s%s]' % \ - ( re.escape(self.quoteChar), - _escapeRegexRangeChars(self.endQuoteChar[0]), - (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) - else: - self.flags = 0 - self.pattern = r'%s(?:[^%s\n\r%s]' % \ - ( re.escape(self.quoteChar), - _escapeRegexRangeChars(self.endQuoteChar[0]), - (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) - if len(self.endQuoteChar) > 1: - self.pattern += ( - '|(?:' + ')|(?:'.join("%s[^%s]" % (re.escape(self.endQuoteChar[:i]), - _escapeRegexRangeChars(self.endQuoteChar[i])) - for i in range(len(self.endQuoteChar)-1,0,-1)) + ')' - ) - if escQuote: - self.pattern += (r'|(?:%s)' % re.escape(escQuote)) - if escChar: - self.pattern += (r'|(?:%s.)' % re.escape(escChar)) - self.escCharReplacePattern = re.escape(self.escChar)+"(.)" - self.pattern += (r')*%s' % re.escape(self.endQuoteChar)) - - try: - self.re = re.compile(self.pattern, self.flags) - self.reString = self.pattern - except sre_constants.error: - warnings.warn("invalid pattern (%s) passed to Regex" % self.pattern, - SyntaxWarning, stacklevel=2) - raise - - self.name = _ustr(self) - self.errmsg = "Expected " + self.name - self.mayIndexError = False - self.mayReturnEmpty = True - - def parseImpl( self, instring, loc, doActions=True ): - result = instring[loc] == self.firstQuoteChar and self.re.match(instring,loc) or None - if not result: - raise ParseException(instring, loc, self.errmsg, self) - - loc = result.end() - ret = result.group() - - if self.unquoteResults: - - # strip off quotes - ret = ret[self.quoteCharLen:-self.endQuoteCharLen] - - if isinstance(ret,basestring): - # replace escaped whitespace - if '\\' in ret and self.convertWhitespaceEscapes: - ws_map = { - r'\t' : '\t', - r'\n' : '\n', - r'\f' : '\f', - r'\r' : '\r', - } - for wslit,wschar in ws_map.items(): - ret = ret.replace(wslit, wschar) - - # replace escaped characters - if self.escChar: - ret = re.sub(self.escCharReplacePattern, r"\g<1>", ret) - - # replace escaped quotes - if self.escQuote: - ret = ret.replace(self.escQuote, self.endQuoteChar) - - return loc, ret - - def __str__( self ): - try: - return super(QuotedString,self).__str__() - except Exception: - pass - - if self.strRepr is None: - self.strRepr = "quoted string, starting with %s ending with %s" % (self.quoteChar, self.endQuoteChar) - - return self.strRepr - - -class CharsNotIn(Token): - """ - Token for matching words composed of characters I{not} in a given set (will - include whitespace in matched characters if not listed in the provided exclusion set - see example). - Defined with string containing all disallowed characters, and an optional - minimum, maximum, and/or exact length. The default value for C{min} is 1 (a - minimum value < 1 is not valid); the default values for C{max} and C{exact} - are 0, meaning no maximum or exact length restriction. - - Example:: - # define a comma-separated-value as anything that is not a ',' - csv_value = CharsNotIn(',') - print(delimitedList(csv_value).parseString("dkls,lsdkjf,s12 34,@!#,213")) - prints:: - ['dkls', 'lsdkjf', 's12 34', '@!#', '213'] - """ - def __init__( self, notChars, min=1, max=0, exact=0 ): - super(CharsNotIn,self).__init__() - self.skipWhitespace = False - self.notChars = notChars - - if min < 1: - raise ValueError("cannot specify a minimum length < 1; use Optional(CharsNotIn()) if zero-length char group is permitted") - - self.minLen = min - - if max > 0: - self.maxLen = max - else: - self.maxLen = _MAX_INT - - if exact > 0: - self.maxLen = exact - self.minLen = exact - - self.name = _ustr(self) - self.errmsg = "Expected " + self.name - self.mayReturnEmpty = ( self.minLen == 0 ) - self.mayIndexError = False - - def parseImpl( self, instring, loc, doActions=True ): - if instring[loc] in self.notChars: - raise ParseException(instring, loc, self.errmsg, self) - - start = loc - loc += 1 - notchars = self.notChars - maxlen = min( start+self.maxLen, len(instring) ) - while loc < maxlen and \ - (instring[loc] not in notchars): - loc += 1 - - if loc - start < self.minLen: - raise ParseException(instring, loc, self.errmsg, self) - - return loc, instring[start:loc] - - def __str__( self ): - try: - return super(CharsNotIn, self).__str__() - except Exception: - pass - - if self.strRepr is None: - if len(self.notChars) > 4: - self.strRepr = "!W:(%s...)" % self.notChars[:4] - else: - self.strRepr = "!W:(%s)" % self.notChars - - return self.strRepr - -class White(Token): - """ - Special matching class for matching whitespace. Normally, whitespace is ignored - by pyparsing grammars. This class is included when some whitespace structures - are significant. Define with a string containing the whitespace characters to be - matched; default is C{" \\t\\r\\n"}. Also takes optional C{min}, C{max}, and C{exact} arguments, - as defined for the C{L{Word}} class. - """ - whiteStrs = { - " " : "<SPC>", - "\t": "<TAB>", - "\n": "<LF>", - "\r": "<CR>", - "\f": "<FF>", - } - def __init__(self, ws=" \t\r\n", min=1, max=0, exact=0): - super(White,self).__init__() - self.matchWhite = ws - self.setWhitespaceChars( "".join(c for c in self.whiteChars if c not in self.matchWhite) ) - #~ self.leaveWhitespace() - self.name = ("".join(White.whiteStrs[c] for c in self.matchWhite)) - self.mayReturnEmpty = True - self.errmsg = "Expected " + self.name - - self.minLen = min - - if max > 0: - self.maxLen = max - else: - self.maxLen = _MAX_INT - - if exact > 0: - self.maxLen = exact - self.minLen = exact - - def parseImpl( self, instring, loc, doActions=True ): - if not(instring[ loc ] in self.matchWhite): - raise ParseException(instring, loc, self.errmsg, self) - start = loc - loc += 1 - maxloc = start + self.maxLen - maxloc = min( maxloc, len(instring) ) - while loc < maxloc and instring[loc] in self.matchWhite: - loc += 1 - - if loc - start < self.minLen: - raise ParseException(instring, loc, self.errmsg, self) - - return loc, instring[start:loc] - - -class _PositionToken(Token): - def __init__( self ): - super(_PositionToken,self).__init__() - self.name=self.__class__.__name__ - self.mayReturnEmpty = True - self.mayIndexError = False - -class GoToColumn(_PositionToken): - """ - Token to advance to a specific column of input text; useful for tabular report scraping. - """ - def __init__( self, colno ): - super(GoToColumn,self).__init__() - self.col = colno - - def preParse( self, instring, loc ): - if col(loc,instring) != self.col: - instrlen = len(instring) - if self.ignoreExprs: - loc = self._skipIgnorables( instring, loc ) - while loc < instrlen and instring[loc].isspace() and col( loc, instring ) != self.col : - loc += 1 - return loc - - def parseImpl( self, instring, loc, doActions=True ): - thiscol = col( loc, instring ) - if thiscol > self.col: - raise ParseException( instring, loc, "Text not in expected column", self ) - newloc = loc + self.col - thiscol - ret = instring[ loc: newloc ] - return newloc, ret - - -class LineStart(_PositionToken): - """ - Matches if current position is at the beginning of a line within the parse string - - Example:: - - test = '''\ - AAA this line - AAA and this line - AAA but not this one - B AAA and definitely not this one - ''' - - for t in (LineStart() + 'AAA' + restOfLine).searchString(test): - print(t) - - Prints:: - ['AAA', ' this line'] - ['AAA', ' and this line'] - - """ - def __init__( self ): - super(LineStart,self).__init__() - self.errmsg = "Expected start of line" - - def parseImpl( self, instring, loc, doActions=True ): - if col(loc, instring) == 1: - return loc, [] - raise ParseException(instring, loc, self.errmsg, self) - -class LineEnd(_PositionToken): - """ - Matches if current position is at the end of a line within the parse string - """ - def __init__( self ): - super(LineEnd,self).__init__() - self.setWhitespaceChars( ParserElement.DEFAULT_WHITE_CHARS.replace("\n","") ) - self.errmsg = "Expected end of line" - - def parseImpl( self, instring, loc, doActions=True ): - if loc<len(instring): - if instring[loc] == "\n": - return loc+1, "\n" - else: - raise ParseException(instring, loc, self.errmsg, self) - elif loc == len(instring): - return loc+1, [] - else: - raise ParseException(instring, loc, self.errmsg, self) - -class StringStart(_PositionToken): - """ - Matches if current position is at the beginning of the parse string - """ - def __init__( self ): - super(StringStart,self).__init__() - self.errmsg = "Expected start of text" - - def parseImpl( self, instring, loc, doActions=True ): - if loc != 0: - # see if entire string up to here is just whitespace and ignoreables - if loc != self.preParse( instring, 0 ): - raise ParseException(instring, loc, self.errmsg, self) - return loc, [] - -class StringEnd(_PositionToken): - """ - Matches if current position is at the end of the parse string - """ - def __init__( self ): - super(StringEnd,self).__init__() - self.errmsg = "Expected end of text" - - def parseImpl( self, instring, loc, doActions=True ): - if loc < len(instring): - raise ParseException(instring, loc, self.errmsg, self) - elif loc == len(instring): - return loc+1, [] - elif loc > len(instring): - return loc, [] - else: - raise ParseException(instring, loc, self.errmsg, self) - -class WordStart(_PositionToken): - """ - Matches if the current position is at the beginning of a Word, and - is not preceded by any character in a given set of C{wordChars} - (default=C{printables}). To emulate the C{\b} behavior of regular expressions, - use C{WordStart(alphanums)}. C{WordStart} will also match at the beginning of - the string being parsed, or at the beginning of a line. - """ - def __init__(self, wordChars = printables): - super(WordStart,self).__init__() - self.wordChars = set(wordChars) - self.errmsg = "Not at the start of a word" - - def parseImpl(self, instring, loc, doActions=True ): - if loc != 0: - if (instring[loc-1] in self.wordChars or - instring[loc] not in self.wordChars): - raise ParseException(instring, loc, self.errmsg, self) - return loc, [] - -class WordEnd(_PositionToken): - """ - Matches if the current position is at the end of a Word, and - is not followed by any character in a given set of C{wordChars} - (default=C{printables}). To emulate the C{\b} behavior of regular expressions, - use C{WordEnd(alphanums)}. C{WordEnd} will also match at the end of - the string being parsed, or at the end of a line. - """ - def __init__(self, wordChars = printables): - super(WordEnd,self).__init__() - self.wordChars = set(wordChars) - self.skipWhitespace = False - self.errmsg = "Not at the end of a word" - - def parseImpl(self, instring, loc, doActions=True ): - instrlen = len(instring) - if instrlen>0 and loc<instrlen: - if (instring[loc] in self.wordChars or - instring[loc-1] not in self.wordChars): - raise ParseException(instring, loc, self.errmsg, self) - return loc, [] - - -class ParseExpression(ParserElement): - """ - Abstract subclass of ParserElement, for combining and post-processing parsed tokens. - """ - def __init__( self, exprs, savelist = False ): - super(ParseExpression,self).__init__(savelist) - if isinstance( exprs, _generatorType ): - exprs = list(exprs) - - if isinstance( exprs, basestring ): - self.exprs = [ ParserElement._literalStringClass( exprs ) ] - elif isinstance( exprs, Iterable ): - exprs = list(exprs) - # if sequence of strings provided, wrap with Literal - if all(isinstance(expr, basestring) for expr in exprs): - exprs = map(ParserElement._literalStringClass, exprs) - self.exprs = list(exprs) - else: - try: - self.exprs = list( exprs ) - except TypeError: - self.exprs = [ exprs ] - self.callPreparse = False - - def __getitem__( self, i ): - return self.exprs[i] - - def append( self, other ): - self.exprs.append( other ) - self.strRepr = None - return self - - def leaveWhitespace( self ): - """Extends C{leaveWhitespace} defined in base class, and also invokes C{leaveWhitespace} on - all contained expressions.""" - self.skipWhitespace = False - self.exprs = [ e.copy() for e in self.exprs ] - for e in self.exprs: - e.leaveWhitespace() - return self - - def ignore( self, other ): - if isinstance( other, Suppress ): - if other not in self.ignoreExprs: - super( ParseExpression, self).ignore( other ) - for e in self.exprs: - e.ignore( self.ignoreExprs[-1] ) - else: - super( ParseExpression, self).ignore( other ) - for e in self.exprs: - e.ignore( self.ignoreExprs[-1] ) - return self - - def __str__( self ): - try: - return super(ParseExpression,self).__str__() - except Exception: - pass - - if self.strRepr is None: - self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.exprs) ) - return self.strRepr - - def streamline( self ): - super(ParseExpression,self).streamline() - - for e in self.exprs: - e.streamline() - - # collapse nested And's of the form And( And( And( a,b), c), d) to And( a,b,c,d ) - # but only if there are no parse actions or resultsNames on the nested And's - # (likewise for Or's and MatchFirst's) - if ( len(self.exprs) == 2 ): - other = self.exprs[0] - if ( isinstance( other, self.__class__ ) and - not(other.parseAction) and - other.resultsName is None and - not other.debug ): - self.exprs = other.exprs[:] + [ self.exprs[1] ] - self.strRepr = None - self.mayReturnEmpty |= other.mayReturnEmpty - self.mayIndexError |= other.mayIndexError - - other = self.exprs[-1] - if ( isinstance( other, self.__class__ ) and - not(other.parseAction) and - other.resultsName is None and - not other.debug ): - self.exprs = self.exprs[:-1] + other.exprs[:] - self.strRepr = None - self.mayReturnEmpty |= other.mayReturnEmpty - self.mayIndexError |= other.mayIndexError - - self.errmsg = "Expected " + _ustr(self) - - return self - - def setResultsName( self, name, listAllMatches=False ): - ret = super(ParseExpression,self).setResultsName(name,listAllMatches) - return ret - - def validate( self, validateTrace=[] ): - tmp = validateTrace[:]+[self] - for e in self.exprs: - e.validate(tmp) - self.checkRecursion( [] ) - - def copy(self): - ret = super(ParseExpression,self).copy() - ret.exprs = [e.copy() for e in self.exprs] - return ret - -class And(ParseExpression): - """ - Requires all given C{ParseExpression}s to be found in the given order. - Expressions may be separated by whitespace. - May be constructed using the C{'+'} operator. - May also be constructed using the C{'-'} operator, which will suppress backtracking. - - Example:: - integer = Word(nums) - name_expr = OneOrMore(Word(alphas)) - - expr = And([integer("id"),name_expr("name"),integer("age")]) - # more easily written as: - expr = integer("id") + name_expr("name") + integer("age") - """ - - class _ErrorStop(Empty): - def __init__(self, *args, **kwargs): - super(And._ErrorStop,self).__init__(*args, **kwargs) - self.name = '-' - self.leaveWhitespace() - - def __init__( self, exprs, savelist = True ): - super(And,self).__init__(exprs, savelist) - self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) - self.setWhitespaceChars( self.exprs[0].whiteChars ) - self.skipWhitespace = self.exprs[0].skipWhitespace - self.callPreparse = True - - def parseImpl( self, instring, loc, doActions=True ): - # pass False as last arg to _parse for first element, since we already - # pre-parsed the string as part of our And pre-parsing - loc, resultlist = self.exprs[0]._parse( instring, loc, doActions, callPreParse=False ) - errorStop = False - for e in self.exprs[1:]: - if isinstance(e, And._ErrorStop): - errorStop = True - continue - if errorStop: - try: - loc, exprtokens = e._parse( instring, loc, doActions ) - except ParseSyntaxException: - raise - except ParseBaseException as pe: - pe.__traceback__ = None - raise ParseSyntaxException._from_exception(pe) - except IndexError: - raise ParseSyntaxException(instring, len(instring), self.errmsg, self) - else: - loc, exprtokens = e._parse( instring, loc, doActions ) - if exprtokens or exprtokens.haskeys(): - resultlist += exprtokens - return loc, resultlist - - def __iadd__(self, other ): - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - return self.append( other ) #And( [ self, other ] ) - - def checkRecursion( self, parseElementList ): - subRecCheckList = parseElementList[:] + [ self ] - for e in self.exprs: - e.checkRecursion( subRecCheckList ) - if not e.mayReturnEmpty: - break - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "{" + " ".join(_ustr(e) for e in self.exprs) + "}" - - return self.strRepr - - -class Or(ParseExpression): - """ - Requires that at least one C{ParseExpression} is found. - If two expressions match, the expression that matches the longest string will be used. - May be constructed using the C{'^'} operator. - - Example:: - # construct Or using '^' operator - - number = Word(nums) ^ Combine(Word(nums) + '.' + Word(nums)) - print(number.searchString("123 3.1416 789")) - prints:: - [['123'], ['3.1416'], ['789']] - """ - def __init__( self, exprs, savelist = False ): - super(Or,self).__init__(exprs, savelist) - if self.exprs: - self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) - else: - self.mayReturnEmpty = True - - def parseImpl( self, instring, loc, doActions=True ): - maxExcLoc = -1 - maxException = None - matches = [] - for e in self.exprs: - try: - loc2 = e.tryParse( instring, loc ) - except ParseException as err: - err.__traceback__ = None - if err.loc > maxExcLoc: - maxException = err - maxExcLoc = err.loc - except IndexError: - if len(instring) > maxExcLoc: - maxException = ParseException(instring,len(instring),e.errmsg,self) - maxExcLoc = len(instring) - else: - # save match among all matches, to retry longest to shortest - matches.append((loc2, e)) - - if matches: - matches.sort(key=lambda x: -x[0]) - for _,e in matches: - try: - return e._parse( instring, loc, doActions ) - except ParseException as err: - err.__traceback__ = None - if err.loc > maxExcLoc: - maxException = err - maxExcLoc = err.loc - - if maxException is not None: - maxException.msg = self.errmsg - raise maxException - else: - raise ParseException(instring, loc, "no defined alternatives to match", self) - - - def __ixor__(self, other ): - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - return self.append( other ) #Or( [ self, other ] ) - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "{" + " ^ ".join(_ustr(e) for e in self.exprs) + "}" - - return self.strRepr - - def checkRecursion( self, parseElementList ): - subRecCheckList = parseElementList[:] + [ self ] - for e in self.exprs: - e.checkRecursion( subRecCheckList ) - - -class MatchFirst(ParseExpression): - """ - Requires that at least one C{ParseExpression} is found. - If two expressions match, the first one listed is the one that will match. - May be constructed using the C{'|'} operator. - - Example:: - # construct MatchFirst using '|' operator - - # watch the order of expressions to match - number = Word(nums) | Combine(Word(nums) + '.' + Word(nums)) - print(number.searchString("123 3.1416 789")) # Fail! -> [['123'], ['3'], ['1416'], ['789']] - - # put more selective expression first - number = Combine(Word(nums) + '.' + Word(nums)) | Word(nums) - print(number.searchString("123 3.1416 789")) # Better -> [['123'], ['3.1416'], ['789']] - """ - def __init__( self, exprs, savelist = False ): - super(MatchFirst,self).__init__(exprs, savelist) - if self.exprs: - self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) - else: - self.mayReturnEmpty = True - - def parseImpl( self, instring, loc, doActions=True ): - maxExcLoc = -1 - maxException = None - for e in self.exprs: - try: - ret = e._parse( instring, loc, doActions ) - return ret - except ParseException as err: - if err.loc > maxExcLoc: - maxException = err - maxExcLoc = err.loc - except IndexError: - if len(instring) > maxExcLoc: - maxException = ParseException(instring,len(instring),e.errmsg,self) - maxExcLoc = len(instring) - - # only got here if no expression matched, raise exception for match that made it the furthest - else: - if maxException is not None: - maxException.msg = self.errmsg - raise maxException - else: - raise ParseException(instring, loc, "no defined alternatives to match", self) - - def __ior__(self, other ): - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - return self.append( other ) #MatchFirst( [ self, other ] ) - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "{" + " | ".join(_ustr(e) for e in self.exprs) + "}" - - return self.strRepr - - def checkRecursion( self, parseElementList ): - subRecCheckList = parseElementList[:] + [ self ] - for e in self.exprs: - e.checkRecursion( subRecCheckList ) - - -class Each(ParseExpression): - """ - Requires all given C{ParseExpression}s to be found, but in any order. - Expressions may be separated by whitespace. - May be constructed using the C{'&'} operator. - - Example:: - color = oneOf("RED ORANGE YELLOW GREEN BLUE PURPLE BLACK WHITE BROWN") - shape_type = oneOf("SQUARE CIRCLE TRIANGLE STAR HEXAGON OCTAGON") - integer = Word(nums) - shape_attr = "shape:" + shape_type("shape") - posn_attr = "posn:" + Group(integer("x") + ',' + integer("y"))("posn") - color_attr = "color:" + color("color") - size_attr = "size:" + integer("size") - - # use Each (using operator '&') to accept attributes in any order - # (shape and posn are required, color and size are optional) - shape_spec = shape_attr & posn_attr & Optional(color_attr) & Optional(size_attr) - - shape_spec.runTests(''' - shape: SQUARE color: BLACK posn: 100, 120 - shape: CIRCLE size: 50 color: BLUE posn: 50,80 - color:GREEN size:20 shape:TRIANGLE posn:20,40 - ''' - ) - prints:: - shape: SQUARE color: BLACK posn: 100, 120 - ['shape:', 'SQUARE', 'color:', 'BLACK', 'posn:', ['100', ',', '120']] - - color: BLACK - - posn: ['100', ',', '120'] - - x: 100 - - y: 120 - - shape: SQUARE - - - shape: CIRCLE size: 50 color: BLUE posn: 50,80 - ['shape:', 'CIRCLE', 'size:', '50', 'color:', 'BLUE', 'posn:', ['50', ',', '80']] - - color: BLUE - - posn: ['50', ',', '80'] - - x: 50 - - y: 80 - - shape: CIRCLE - - size: 50 - - - color: GREEN size: 20 shape: TRIANGLE posn: 20,40 - ['color:', 'GREEN', 'size:', '20', 'shape:', 'TRIANGLE', 'posn:', ['20', ',', '40']] - - color: GREEN - - posn: ['20', ',', '40'] - - x: 20 - - y: 40 - - shape: TRIANGLE - - size: 20 - """ - def __init__( self, exprs, savelist = True ): - super(Each,self).__init__(exprs, savelist) - self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) - self.skipWhitespace = True - self.initExprGroups = True - - def parseImpl( self, instring, loc, doActions=True ): - if self.initExprGroups: - self.opt1map = dict((id(e.expr),e) for e in self.exprs if isinstance(e,Optional)) - opt1 = [ e.expr for e in self.exprs if isinstance(e,Optional) ] - opt2 = [ e for e in self.exprs if e.mayReturnEmpty and not isinstance(e,Optional)] - self.optionals = opt1 + opt2 - self.multioptionals = [ e.expr for e in self.exprs if isinstance(e,ZeroOrMore) ] - self.multirequired = [ e.expr for e in self.exprs if isinstance(e,OneOrMore) ] - self.required = [ e for e in self.exprs if not isinstance(e,(Optional,ZeroOrMore,OneOrMore)) ] - self.required += self.multirequired - self.initExprGroups = False - tmpLoc = loc - tmpReqd = self.required[:] - tmpOpt = self.optionals[:] - matchOrder = [] - - keepMatching = True - while keepMatching: - tmpExprs = tmpReqd + tmpOpt + self.multioptionals + self.multirequired - failed = [] - for e in tmpExprs: - try: - tmpLoc = e.tryParse( instring, tmpLoc ) - except ParseException: - failed.append(e) - else: - matchOrder.append(self.opt1map.get(id(e),e)) - if e in tmpReqd: - tmpReqd.remove(e) - elif e in tmpOpt: - tmpOpt.remove(e) - if len(failed) == len(tmpExprs): - keepMatching = False - - if tmpReqd: - missing = ", ".join(_ustr(e) for e in tmpReqd) - raise ParseException(instring,loc,"Missing one or more required elements (%s)" % missing ) - - # add any unmatched Optionals, in case they have default values defined - matchOrder += [e for e in self.exprs if isinstance(e,Optional) and e.expr in tmpOpt] - - resultlist = [] - for e in matchOrder: - loc,results = e._parse(instring,loc,doActions) - resultlist.append(results) - - finalResults = sum(resultlist, ParseResults([])) - return loc, finalResults - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "{" + " & ".join(_ustr(e) for e in self.exprs) + "}" - - return self.strRepr - - def checkRecursion( self, parseElementList ): - subRecCheckList = parseElementList[:] + [ self ] - for e in self.exprs: - e.checkRecursion( subRecCheckList ) - - -class ParseElementEnhance(ParserElement): - """ - Abstract subclass of C{ParserElement}, for combining and post-processing parsed tokens. - """ - def __init__( self, expr, savelist=False ): - super(ParseElementEnhance,self).__init__(savelist) - if isinstance( expr, basestring ): - if issubclass(ParserElement._literalStringClass, Token): - expr = ParserElement._literalStringClass(expr) - else: - expr = ParserElement._literalStringClass(Literal(expr)) - self.expr = expr - self.strRepr = None - if expr is not None: - self.mayIndexError = expr.mayIndexError - self.mayReturnEmpty = expr.mayReturnEmpty - self.setWhitespaceChars( expr.whiteChars ) - self.skipWhitespace = expr.skipWhitespace - self.saveAsList = expr.saveAsList - self.callPreparse = expr.callPreparse - self.ignoreExprs.extend(expr.ignoreExprs) - - def parseImpl( self, instring, loc, doActions=True ): - if self.expr is not None: - return self.expr._parse( instring, loc, doActions, callPreParse=False ) - else: - raise ParseException("",loc,self.errmsg,self) - - def leaveWhitespace( self ): - self.skipWhitespace = False - self.expr = self.expr.copy() - if self.expr is not None: - self.expr.leaveWhitespace() - return self - - def ignore( self, other ): - if isinstance( other, Suppress ): - if other not in self.ignoreExprs: - super( ParseElementEnhance, self).ignore( other ) - if self.expr is not None: - self.expr.ignore( self.ignoreExprs[-1] ) - else: - super( ParseElementEnhance, self).ignore( other ) - if self.expr is not None: - self.expr.ignore( self.ignoreExprs[-1] ) - return self - - def streamline( self ): - super(ParseElementEnhance,self).streamline() - if self.expr is not None: - self.expr.streamline() - return self - - def checkRecursion( self, parseElementList ): - if self in parseElementList: - raise RecursiveGrammarException( parseElementList+[self] ) - subRecCheckList = parseElementList[:] + [ self ] - if self.expr is not None: - self.expr.checkRecursion( subRecCheckList ) - - def validate( self, validateTrace=[] ): - tmp = validateTrace[:]+[self] - if self.expr is not None: - self.expr.validate(tmp) - self.checkRecursion( [] ) - - def __str__( self ): - try: - return super(ParseElementEnhance,self).__str__() - except Exception: - pass - - if self.strRepr is None and self.expr is not None: - self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.expr) ) - return self.strRepr - - -class FollowedBy(ParseElementEnhance): - """ - Lookahead matching of the given parse expression. C{FollowedBy} - does I{not} advance the parsing position within the input string, it only - verifies that the specified parse expression matches at the current - position. C{FollowedBy} always returns a null token list. - - Example:: - # use FollowedBy to match a label only if it is followed by a ':' - data_word = Word(alphas) - label = data_word + FollowedBy(':') - attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) - - OneOrMore(attr_expr).parseString("shape: SQUARE color: BLACK posn: upper left").pprint() - prints:: - [['shape', 'SQUARE'], ['color', 'BLACK'], ['posn', 'upper left']] - """ - def __init__( self, expr ): - super(FollowedBy,self).__init__(expr) - self.mayReturnEmpty = True - - def parseImpl( self, instring, loc, doActions=True ): - self.expr.tryParse( instring, loc ) - return loc, [] - - -class NotAny(ParseElementEnhance): - """ - Lookahead to disallow matching with the given parse expression. C{NotAny} - does I{not} advance the parsing position within the input string, it only - verifies that the specified parse expression does I{not} match at the current - position. Also, C{NotAny} does I{not} skip over leading whitespace. C{NotAny} - always returns a null token list. May be constructed using the '~' operator. - - Example:: - - """ - def __init__( self, expr ): - super(NotAny,self).__init__(expr) - #~ self.leaveWhitespace() - self.skipWhitespace = False # do NOT use self.leaveWhitespace(), don't want to propagate to exprs - self.mayReturnEmpty = True - self.errmsg = "Found unwanted token, "+_ustr(self.expr) - - def parseImpl( self, instring, loc, doActions=True ): - if self.expr.canParseNext(instring, loc): - raise ParseException(instring, loc, self.errmsg, self) - return loc, [] - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "~{" + _ustr(self.expr) + "}" - - return self.strRepr - -class _MultipleMatch(ParseElementEnhance): - def __init__( self, expr, stopOn=None): - super(_MultipleMatch, self).__init__(expr) - self.saveAsList = True - ender = stopOn - if isinstance(ender, basestring): - ender = ParserElement._literalStringClass(ender) - self.not_ender = ~ender if ender is not None else None - - def parseImpl( self, instring, loc, doActions=True ): - self_expr_parse = self.expr._parse - self_skip_ignorables = self._skipIgnorables - check_ender = self.not_ender is not None - if check_ender: - try_not_ender = self.not_ender.tryParse - - # must be at least one (but first see if we are the stopOn sentinel; - # if so, fail) - if check_ender: - try_not_ender(instring, loc) - loc, tokens = self_expr_parse( instring, loc, doActions, callPreParse=False ) - try: - hasIgnoreExprs = (not not self.ignoreExprs) - while 1: - if check_ender: - try_not_ender(instring, loc) - if hasIgnoreExprs: - preloc = self_skip_ignorables( instring, loc ) - else: - preloc = loc - loc, tmptokens = self_expr_parse( instring, preloc, doActions ) - if tmptokens or tmptokens.haskeys(): - tokens += tmptokens - except (ParseException,IndexError): - pass - - return loc, tokens - -class OneOrMore(_MultipleMatch): - """ - Repetition of one or more of the given expression. - - Parameters: - - expr - expression that must match one or more times - - stopOn - (default=C{None}) - expression for a terminating sentinel - (only required if the sentinel would ordinarily match the repetition - expression) - - Example:: - data_word = Word(alphas) - label = data_word + FollowedBy(':') - attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) - - text = "shape: SQUARE posn: upper left color: BLACK" - OneOrMore(attr_expr).parseString(text).pprint() # Fail! read 'color' as data instead of next label -> [['shape', 'SQUARE color']] - - # use stopOn attribute for OneOrMore to avoid reading label string as part of the data - attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) - OneOrMore(attr_expr).parseString(text).pprint() # Better -> [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'BLACK']] - - # could also be written as - (attr_expr * (1,)).parseString(text).pprint() - """ - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "{" + _ustr(self.expr) + "}..." - - return self.strRepr - -class ZeroOrMore(_MultipleMatch): - """ - Optional repetition of zero or more of the given expression. - - Parameters: - - expr - expression that must match zero or more times - - stopOn - (default=C{None}) - expression for a terminating sentinel - (only required if the sentinel would ordinarily match the repetition - expression) - - Example: similar to L{OneOrMore} - """ - def __init__( self, expr, stopOn=None): - super(ZeroOrMore,self).__init__(expr, stopOn=stopOn) - self.mayReturnEmpty = True - - def parseImpl( self, instring, loc, doActions=True ): - try: - return super(ZeroOrMore, self).parseImpl(instring, loc, doActions) - except (ParseException,IndexError): - return loc, [] - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "[" + _ustr(self.expr) + "]..." - - return self.strRepr - -class _NullToken(object): - def __bool__(self): - return False - __nonzero__ = __bool__ - def __str__(self): - return "" - -_optionalNotMatched = _NullToken() -class Optional(ParseElementEnhance): - """ - Optional matching of the given expression. - - Parameters: - - expr - expression that must match zero or more times - - default (optional) - value to be returned if the optional expression is not found. - - Example:: - # US postal code can be a 5-digit zip, plus optional 4-digit qualifier - zip = Combine(Word(nums, exact=5) + Optional('-' + Word(nums, exact=4))) - zip.runTests(''' - # traditional ZIP code - 12345 - - # ZIP+4 form - 12101-0001 - - # invalid ZIP - 98765- - ''') - prints:: - # traditional ZIP code - 12345 - ['12345'] - - # ZIP+4 form - 12101-0001 - ['12101-0001'] - - # invalid ZIP - 98765- - ^ - FAIL: Expected end of text (at char 5), (line:1, col:6) - """ - def __init__( self, expr, default=_optionalNotMatched ): - super(Optional,self).__init__( expr, savelist=False ) - self.saveAsList = self.expr.saveAsList - self.defaultValue = default - self.mayReturnEmpty = True - - def parseImpl( self, instring, loc, doActions=True ): - try: - loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False ) - except (ParseException,IndexError): - if self.defaultValue is not _optionalNotMatched: - if self.expr.resultsName: - tokens = ParseResults([ self.defaultValue ]) - tokens[self.expr.resultsName] = self.defaultValue - else: - tokens = [ self.defaultValue ] - else: - tokens = [] - return loc, tokens - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "[" + _ustr(self.expr) + "]" - - return self.strRepr - -class SkipTo(ParseElementEnhance): - """ - Token for skipping over all undefined text until the matched expression is found. - - Parameters: - - expr - target expression marking the end of the data to be skipped - - include - (default=C{False}) if True, the target expression is also parsed - (the skipped text and target expression are returned as a 2-element list). - - ignore - (default=C{None}) used to define grammars (typically quoted strings and - comments) that might contain false matches to the target expression - - failOn - (default=C{None}) define expressions that are not allowed to be - included in the skipped test; if found before the target expression is found, - the SkipTo is not a match - - Example:: - report = ''' - Outstanding Issues Report - 1 Jan 2000 - - # | Severity | Description | Days Open - -----+----------+-------------------------------------------+----------- - 101 | Critical | Intermittent system crash | 6 - 94 | Cosmetic | Spelling error on Login ('log|n') | 14 - 79 | Minor | System slow when running too many reports | 47 - ''' - integer = Word(nums) - SEP = Suppress('|') - # use SkipTo to simply match everything up until the next SEP - # - ignore quoted strings, so that a '|' character inside a quoted string does not match - # - parse action will call token.strip() for each matched token, i.e., the description body - string_data = SkipTo(SEP, ignore=quotedString) - string_data.setParseAction(tokenMap(str.strip)) - ticket_expr = (integer("issue_num") + SEP - + string_data("sev") + SEP - + string_data("desc") + SEP - + integer("days_open")) - - for tkt in ticket_expr.searchString(report): - print tkt.dump() - prints:: - ['101', 'Critical', 'Intermittent system crash', '6'] - - days_open: 6 - - desc: Intermittent system crash - - issue_num: 101 - - sev: Critical - ['94', 'Cosmetic', "Spelling error on Login ('log|n')", '14'] - - days_open: 14 - - desc: Spelling error on Login ('log|n') - - issue_num: 94 - - sev: Cosmetic - ['79', 'Minor', 'System slow when running too many reports', '47'] - - days_open: 47 - - desc: System slow when running too many reports - - issue_num: 79 - - sev: Minor - """ - def __init__( self, other, include=False, ignore=None, failOn=None ): - super( SkipTo, self ).__init__( other ) - self.ignoreExpr = ignore - self.mayReturnEmpty = True - self.mayIndexError = False - self.includeMatch = include - self.asList = False - if isinstance(failOn, basestring): - self.failOn = ParserElement._literalStringClass(failOn) - else: - self.failOn = failOn - self.errmsg = "No match found for "+_ustr(self.expr) - - def parseImpl( self, instring, loc, doActions=True ): - startloc = loc - instrlen = len(instring) - expr = self.expr - expr_parse = self.expr._parse - self_failOn_canParseNext = self.failOn.canParseNext if self.failOn is not None else None - self_ignoreExpr_tryParse = self.ignoreExpr.tryParse if self.ignoreExpr is not None else None - - tmploc = loc - while tmploc <= instrlen: - if self_failOn_canParseNext is not None: - # break if failOn expression matches - if self_failOn_canParseNext(instring, tmploc): - break - - if self_ignoreExpr_tryParse is not None: - # advance past ignore expressions - while 1: - try: - tmploc = self_ignoreExpr_tryParse(instring, tmploc) - except ParseBaseException: - break - - try: - expr_parse(instring, tmploc, doActions=False, callPreParse=False) - except (ParseException, IndexError): - # no match, advance loc in string - tmploc += 1 - else: - # matched skipto expr, done - break - - else: - # ran off the end of the input string without matching skipto expr, fail - raise ParseException(instring, loc, self.errmsg, self) - - # build up return values - loc = tmploc - skiptext = instring[startloc:loc] - skipresult = ParseResults(skiptext) - - if self.includeMatch: - loc, mat = expr_parse(instring,loc,doActions,callPreParse=False) - skipresult += mat - - return loc, skipresult - -class Forward(ParseElementEnhance): - """ - Forward declaration of an expression to be defined later - - used for recursive grammars, such as algebraic infix notation. - When the expression is known, it is assigned to the C{Forward} variable using the '<<' operator. - - Note: take care when assigning to C{Forward} not to overlook precedence of operators. - Specifically, '|' has a lower precedence than '<<', so that:: - fwdExpr << a | b | c - will actually be evaluated as:: - (fwdExpr << a) | b | c - thereby leaving b and c out as parseable alternatives. It is recommended that you - explicitly group the values inserted into the C{Forward}:: - fwdExpr << (a | b | c) - Converting to use the '<<=' operator instead will avoid this problem. - - See L{ParseResults.pprint} for an example of a recursive parser created using - C{Forward}. - """ - def __init__( self, other=None ): - super(Forward,self).__init__( other, savelist=False ) - - def __lshift__( self, other ): - if isinstance( other, basestring ): - other = ParserElement._literalStringClass(other) - self.expr = other - self.strRepr = None - self.mayIndexError = self.expr.mayIndexError - self.mayReturnEmpty = self.expr.mayReturnEmpty - self.setWhitespaceChars( self.expr.whiteChars ) - self.skipWhitespace = self.expr.skipWhitespace - self.saveAsList = self.expr.saveAsList - self.ignoreExprs.extend(self.expr.ignoreExprs) - return self - - def __ilshift__(self, other): - return self << other - - def leaveWhitespace( self ): - self.skipWhitespace = False - return self - - def streamline( self ): - if not self.streamlined: - self.streamlined = True - if self.expr is not None: - self.expr.streamline() - return self - - def validate( self, validateTrace=[] ): - if self not in validateTrace: - tmp = validateTrace[:]+[self] - if self.expr is not None: - self.expr.validate(tmp) - self.checkRecursion([]) - - def __str__( self ): - if hasattr(self,"name"): - return self.name - return self.__class__.__name__ + ": ..." - - # stubbed out for now - creates awful memory and perf issues - self._revertClass = self.__class__ - self.__class__ = _ForwardNoRecurse - try: - if self.expr is not None: - retString = _ustr(self.expr) - else: - retString = "None" - finally: - self.__class__ = self._revertClass - return self.__class__.__name__ + ": " + retString - - def copy(self): - if self.expr is not None: - return super(Forward,self).copy() - else: - ret = Forward() - ret <<= self - return ret - -class _ForwardNoRecurse(Forward): - def __str__( self ): - return "..." - -class TokenConverter(ParseElementEnhance): - """ - Abstract subclass of C{ParseExpression}, for converting parsed results. - """ - def __init__( self, expr, savelist=False ): - super(TokenConverter,self).__init__( expr )#, savelist ) - self.saveAsList = False - -class Combine(TokenConverter): - """ - Converter to concatenate all matching tokens to a single string. - By default, the matching patterns must also be contiguous in the input string; - this can be disabled by specifying C{'adjacent=False'} in the constructor. - - Example:: - real = Word(nums) + '.' + Word(nums) - print(real.parseString('3.1416')) # -> ['3', '.', '1416'] - # will also erroneously match the following - print(real.parseString('3. 1416')) # -> ['3', '.', '1416'] - - real = Combine(Word(nums) + '.' + Word(nums)) - print(real.parseString('3.1416')) # -> ['3.1416'] - # no match when there are internal spaces - print(real.parseString('3. 1416')) # -> Exception: Expected W:(0123...) - """ - def __init__( self, expr, joinString="", adjacent=True ): - super(Combine,self).__init__( expr ) - # suppress whitespace-stripping in contained parse expressions, but re-enable it on the Combine itself - if adjacent: - self.leaveWhitespace() - self.adjacent = adjacent - self.skipWhitespace = True - self.joinString = joinString - self.callPreparse = True - - def ignore( self, other ): - if self.adjacent: - ParserElement.ignore(self, other) - else: - super( Combine, self).ignore( other ) - return self - - def postParse( self, instring, loc, tokenlist ): - retToks = tokenlist.copy() - del retToks[:] - retToks += ParseResults([ "".join(tokenlist._asStringList(self.joinString)) ], modal=self.modalResults) - - if self.resultsName and retToks.haskeys(): - return [ retToks ] - else: - return retToks - -class Group(TokenConverter): - """ - Converter to return the matched tokens as a list - useful for returning tokens of C{L{ZeroOrMore}} and C{L{OneOrMore}} expressions. - - Example:: - ident = Word(alphas) - num = Word(nums) - term = ident | num - func = ident + Optional(delimitedList(term)) - print(func.parseString("fn a,b,100")) # -> ['fn', 'a', 'b', '100'] - - func = ident + Group(Optional(delimitedList(term))) - print(func.parseString("fn a,b,100")) # -> ['fn', ['a', 'b', '100']] - """ - def __init__( self, expr ): - super(Group,self).__init__( expr ) - self.saveAsList = True - - def postParse( self, instring, loc, tokenlist ): - return [ tokenlist ] - -class Dict(TokenConverter): - """ - Converter to return a repetitive expression as a list, but also as a dictionary. - Each element can also be referenced using the first token in the expression as its key. - Useful for tabular report scraping when the first column can be used as a item key. - - Example:: - data_word = Word(alphas) - label = data_word + FollowedBy(':') - attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) - - text = "shape: SQUARE posn: upper left color: light blue texture: burlap" - attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) - - # print attributes as plain groups - print(OneOrMore(attr_expr).parseString(text).dump()) - - # instead of OneOrMore(expr), parse using Dict(OneOrMore(Group(expr))) - Dict will auto-assign names - result = Dict(OneOrMore(Group(attr_expr))).parseString(text) - print(result.dump()) - - # access named fields as dict entries, or output as dict - print(result['shape']) - print(result.asDict()) - prints:: - ['shape', 'SQUARE', 'posn', 'upper left', 'color', 'light blue', 'texture', 'burlap'] - - [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] - - color: light blue - - posn: upper left - - shape: SQUARE - - texture: burlap - SQUARE - {'color': 'light blue', 'posn': 'upper left', 'texture': 'burlap', 'shape': 'SQUARE'} - See more examples at L{ParseResults} of accessing fields by results name. - """ - def __init__( self, expr ): - super(Dict,self).__init__( expr ) - self.saveAsList = True - - def postParse( self, instring, loc, tokenlist ): - for i,tok in enumerate(tokenlist): - if len(tok) == 0: - continue - ikey = tok[0] - if isinstance(ikey,int): - ikey = _ustr(tok[0]).strip() - if len(tok)==1: - tokenlist[ikey] = _ParseResultsWithOffset("",i) - elif len(tok)==2 and not isinstance(tok[1],ParseResults): - tokenlist[ikey] = _ParseResultsWithOffset(tok[1],i) - else: - dictvalue = tok.copy() #ParseResults(i) - del dictvalue[0] - if len(dictvalue)!= 1 or (isinstance(dictvalue,ParseResults) and dictvalue.haskeys()): - tokenlist[ikey] = _ParseResultsWithOffset(dictvalue,i) - else: - tokenlist[ikey] = _ParseResultsWithOffset(dictvalue[0],i) - - if self.resultsName: - return [ tokenlist ] - else: - return tokenlist - - -class Suppress(TokenConverter): - """ - Converter for ignoring the results of a parsed expression. - - Example:: - source = "a, b, c,d" - wd = Word(alphas) - wd_list1 = wd + ZeroOrMore(',' + wd) - print(wd_list1.parseString(source)) - - # often, delimiters that are useful during parsing are just in the - # way afterward - use Suppress to keep them out of the parsed output - wd_list2 = wd + ZeroOrMore(Suppress(',') + wd) - print(wd_list2.parseString(source)) - prints:: - ['a', ',', 'b', ',', 'c', ',', 'd'] - ['a', 'b', 'c', 'd'] - (See also L{delimitedList}.) - """ - def postParse( self, instring, loc, tokenlist ): - return [] - - def suppress( self ): - return self - - -class OnlyOnce(object): - """ - Wrapper for parse actions, to ensure they are only called once. - """ - def __init__(self, methodCall): - self.callable = _trim_arity(methodCall) - self.called = False - def __call__(self,s,l,t): - if not self.called: - results = self.callable(s,l,t) - self.called = True - return results - raise ParseException(s,l,"") - def reset(self): - self.called = False - -def traceParseAction(f): - """ - Decorator for debugging parse actions. - - When the parse action is called, this decorator will print C{">> entering I{method-name}(line:I{current_source_line}, I{parse_location}, I{matched_tokens})".} - When the parse action completes, the decorator will print C{"<<"} followed by the returned value, or any exception that the parse action raised. - - Example:: - wd = Word(alphas) - - @traceParseAction - def remove_duplicate_chars(tokens): - return ''.join(sorted(set(''.join(tokens)))) - - wds = OneOrMore(wd).setParseAction(remove_duplicate_chars) - print(wds.parseString("slkdjs sld sldd sdlf sdljf")) - prints:: - >>entering remove_duplicate_chars(line: 'slkdjs sld sldd sdlf sdljf', 0, (['slkdjs', 'sld', 'sldd', 'sdlf', 'sdljf'], {})) - <<leaving remove_duplicate_chars (ret: 'dfjkls') - ['dfjkls'] - """ - f = _trim_arity(f) - def z(*paArgs): - thisFunc = f.__name__ - s,l,t = paArgs[-3:] - if len(paArgs)>3: - thisFunc = paArgs[0].__class__.__name__ + '.' + thisFunc - sys.stderr.write( ">>entering %s(line: '%s', %d, %r)\n" % (thisFunc,line(l,s),l,t) ) - try: - ret = f(*paArgs) - except Exception as exc: - sys.stderr.write( "<<leaving %s (exception: %s)\n" % (thisFunc,exc) ) - raise - sys.stderr.write( "<<leaving %s (ret: %r)\n" % (thisFunc,ret) ) - return ret - try: - z.__name__ = f.__name__ - except AttributeError: - pass - return z - -# -# global helpers -# -def delimitedList( expr, delim=",", combine=False ): - """ - Helper to define a delimited list of expressions - the delimiter defaults to ','. - By default, the list elements and delimiters can have intervening whitespace, and - comments, but this can be overridden by passing C{combine=True} in the constructor. - If C{combine} is set to C{True}, the matching tokens are returned as a single token - string, with the delimiters included; otherwise, the matching tokens are returned - as a list of tokens, with the delimiters suppressed. - - Example:: - delimitedList(Word(alphas)).parseString("aa,bb,cc") # -> ['aa', 'bb', 'cc'] - delimitedList(Word(hexnums), delim=':', combine=True).parseString("AA:BB:CC:DD:EE") # -> ['AA:BB:CC:DD:EE'] - """ - dlName = _ustr(expr)+" ["+_ustr(delim)+" "+_ustr(expr)+"]..." - if combine: - return Combine( expr + ZeroOrMore( delim + expr ) ).setName(dlName) - else: - return ( expr + ZeroOrMore( Suppress( delim ) + expr ) ).setName(dlName) - -def countedArray( expr, intExpr=None ): - """ - Helper to define a counted list of expressions. - This helper defines a pattern of the form:: - integer expr expr expr... - where the leading integer tells how many expr expressions follow. - The matched tokens returns the array of expr tokens as a list - the leading count token is suppressed. - - If C{intExpr} is specified, it should be a pyparsing expression that produces an integer value. - - Example:: - countedArray(Word(alphas)).parseString('2 ab cd ef') # -> ['ab', 'cd'] - - # in this parser, the leading integer value is given in binary, - # '10' indicating that 2 values are in the array - binaryConstant = Word('01').setParseAction(lambda t: int(t[0], 2)) - countedArray(Word(alphas), intExpr=binaryConstant).parseString('10 ab cd ef') # -> ['ab', 'cd'] - """ - arrayExpr = Forward() - def countFieldParseAction(s,l,t): - n = t[0] - arrayExpr << (n and Group(And([expr]*n)) or Group(empty)) - return [] - if intExpr is None: - intExpr = Word(nums).setParseAction(lambda t:int(t[0])) - else: - intExpr = intExpr.copy() - intExpr.setName("arrayLen") - intExpr.addParseAction(countFieldParseAction, callDuringTry=True) - return ( intExpr + arrayExpr ).setName('(len) ' + _ustr(expr) + '...') - -def _flatten(L): - ret = [] - for i in L: - if isinstance(i,list): - ret.extend(_flatten(i)) - else: - ret.append(i) - return ret - -def matchPreviousLiteral(expr): - """ - Helper to define an expression that is indirectly defined from - the tokens matched in a previous expression, that is, it looks - for a 'repeat' of a previous expression. For example:: - first = Word(nums) - second = matchPreviousLiteral(first) - matchExpr = first + ":" + second - will match C{"1:1"}, but not C{"1:2"}. Because this matches a - previous literal, will also match the leading C{"1:1"} in C{"1:10"}. - If this is not desired, use C{matchPreviousExpr}. - Do I{not} use with packrat parsing enabled. - """ - rep = Forward() - def copyTokenToRepeater(s,l,t): - if t: - if len(t) == 1: - rep << t[0] - else: - # flatten t tokens - tflat = _flatten(t.asList()) - rep << And(Literal(tt) for tt in tflat) - else: - rep << Empty() - expr.addParseAction(copyTokenToRepeater, callDuringTry=True) - rep.setName('(prev) ' + _ustr(expr)) - return rep - -def matchPreviousExpr(expr): - """ - Helper to define an expression that is indirectly defined from - the tokens matched in a previous expression, that is, it looks - for a 'repeat' of a previous expression. For example:: - first = Word(nums) - second = matchPreviousExpr(first) - matchExpr = first + ":" + second - will match C{"1:1"}, but not C{"1:2"}. Because this matches by - expressions, will I{not} match the leading C{"1:1"} in C{"1:10"}; - the expressions are evaluated first, and then compared, so - C{"1"} is compared with C{"10"}. - Do I{not} use with packrat parsing enabled. - """ - rep = Forward() - e2 = expr.copy() - rep <<= e2 - def copyTokenToRepeater(s,l,t): - matchTokens = _flatten(t.asList()) - def mustMatchTheseTokens(s,l,t): - theseTokens = _flatten(t.asList()) - if theseTokens != matchTokens: - raise ParseException("",0,"") - rep.setParseAction( mustMatchTheseTokens, callDuringTry=True ) - expr.addParseAction(copyTokenToRepeater, callDuringTry=True) - rep.setName('(prev) ' + _ustr(expr)) - return rep - -def _escapeRegexRangeChars(s): - #~ escape these chars: ^-] - for c in r"\^-]": - s = s.replace(c,_bslash+c) - s = s.replace("\n",r"\n") - s = s.replace("\t",r"\t") - return _ustr(s) - -def oneOf( strs, caseless=False, useRegex=True ): - """ - Helper to quickly define a set of alternative Literals, and makes sure to do - longest-first testing when there is a conflict, regardless of the input order, - but returns a C{L{MatchFirst}} for best performance. - - Parameters: - - strs - a string of space-delimited literals, or a collection of string literals - - caseless - (default=C{False}) - treat all literals as caseless - - useRegex - (default=C{True}) - as an optimization, will generate a Regex - object; otherwise, will generate a C{MatchFirst} object (if C{caseless=True}, or - if creating a C{Regex} raises an exception) - - Example:: - comp_oper = oneOf("< = > <= >= !=") - var = Word(alphas) - number = Word(nums) - term = var | number - comparison_expr = term + comp_oper + term - print(comparison_expr.searchString("B = 12 AA=23 B<=AA AA>12")) - prints:: - [['B', '=', '12'], ['AA', '=', '23'], ['B', '<=', 'AA'], ['AA', '>', '12']] - """ - if caseless: - isequal = ( lambda a,b: a.upper() == b.upper() ) - masks = ( lambda a,b: b.upper().startswith(a.upper()) ) - parseElementClass = CaselessLiteral - else: - isequal = ( lambda a,b: a == b ) - masks = ( lambda a,b: b.startswith(a) ) - parseElementClass = Literal - - symbols = [] - if isinstance(strs,basestring): - symbols = strs.split() - elif isinstance(strs, Iterable): - symbols = list(strs) - else: - warnings.warn("Invalid argument to oneOf, expected string or iterable", - SyntaxWarning, stacklevel=2) - if not symbols: - return NoMatch() - - i = 0 - while i < len(symbols)-1: - cur = symbols[i] - for j,other in enumerate(symbols[i+1:]): - if ( isequal(other, cur) ): - del symbols[i+j+1] - break - elif ( masks(cur, other) ): - del symbols[i+j+1] - symbols.insert(i,other) - cur = other - break - else: - i += 1 - - if not caseless and useRegex: - #~ print (strs,"->", "|".join( [ _escapeRegexChars(sym) for sym in symbols] )) - try: - if len(symbols)==len("".join(symbols)): - return Regex( "[%s]" % "".join(_escapeRegexRangeChars(sym) for sym in symbols) ).setName(' | '.join(symbols)) - else: - return Regex( "|".join(re.escape(sym) for sym in symbols) ).setName(' | '.join(symbols)) - except Exception: - warnings.warn("Exception creating Regex for oneOf, building MatchFirst", - SyntaxWarning, stacklevel=2) - - - # last resort, just use MatchFirst - return MatchFirst(parseElementClass(sym) for sym in symbols).setName(' | '.join(symbols)) - -def dictOf( key, value ): - """ - Helper to easily and clearly define a dictionary by specifying the respective patterns - for the key and value. Takes care of defining the C{L{Dict}}, C{L{ZeroOrMore}}, and C{L{Group}} tokens - in the proper order. The key pattern can include delimiting markers or punctuation, - as long as they are suppressed, thereby leaving the significant key text. The value - pattern can include named results, so that the C{Dict} results can include named token - fields. - - Example:: - text = "shape: SQUARE posn: upper left color: light blue texture: burlap" - attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) - print(OneOrMore(attr_expr).parseString(text).dump()) - - attr_label = label - attr_value = Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join) - - # similar to Dict, but simpler call format - result = dictOf(attr_label, attr_value).parseString(text) - print(result.dump()) - print(result['shape']) - print(result.shape) # object attribute access works too - print(result.asDict()) - prints:: - [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] - - color: light blue - - posn: upper left - - shape: SQUARE - - texture: burlap - SQUARE - SQUARE - {'color': 'light blue', 'shape': 'SQUARE', 'posn': 'upper left', 'texture': 'burlap'} - """ - return Dict( ZeroOrMore( Group ( key + value ) ) ) - -def originalTextFor(expr, asString=True): - """ - Helper to return the original, untokenized text for a given expression. Useful to - restore the parsed fields of an HTML start tag into the raw tag text itself, or to - revert separate tokens with intervening whitespace back to the original matching - input text. By default, returns astring containing the original parsed text. - - If the optional C{asString} argument is passed as C{False}, then the return value is a - C{L{ParseResults}} containing any results names that were originally matched, and a - single token containing the original matched text from the input string. So if - the expression passed to C{L{originalTextFor}} contains expressions with defined - results names, you must set C{asString} to C{False} if you want to preserve those - results name values. - - Example:: - src = "this is test <b> bold <i>text</i> </b> normal text " - for tag in ("b","i"): - opener,closer = makeHTMLTags(tag) - patt = originalTextFor(opener + SkipTo(closer) + closer) - print(patt.searchString(src)[0]) - prints:: - ['<b> bold <i>text</i> </b>'] - ['<i>text</i>'] - """ - locMarker = Empty().setParseAction(lambda s,loc,t: loc) - endlocMarker = locMarker.copy() - endlocMarker.callPreparse = False - matchExpr = locMarker("_original_start") + expr + endlocMarker("_original_end") - if asString: - extractText = lambda s,l,t: s[t._original_start:t._original_end] - else: - def extractText(s,l,t): - t[:] = [s[t.pop('_original_start'):t.pop('_original_end')]] - matchExpr.setParseAction(extractText) - matchExpr.ignoreExprs = expr.ignoreExprs - return matchExpr - -def ungroup(expr): - """ - Helper to undo pyparsing's default grouping of And expressions, even - if all but one are non-empty. - """ - return TokenConverter(expr).setParseAction(lambda t:t[0]) - -def locatedExpr(expr): - """ - Helper to decorate a returned token with its starting and ending locations in the input string. - This helper adds the following results names: - - locn_start = location where matched expression begins - - locn_end = location where matched expression ends - - value = the actual parsed results - - Be careful if the input text contains C{<TAB>} characters, you may want to call - C{L{ParserElement.parseWithTabs}} - - Example:: - wd = Word(alphas) - for match in locatedExpr(wd).searchString("ljsdf123lksdjjf123lkkjj1222"): - print(match) - prints:: - [[0, 'ljsdf', 5]] - [[8, 'lksdjjf', 15]] - [[18, 'lkkjj', 23]] - """ - locator = Empty().setParseAction(lambda s,l,t: l) - return Group(locator("locn_start") + expr("value") + locator.copy().leaveWhitespace()("locn_end")) - - -# convenience constants for positional expressions -empty = Empty().setName("empty") -lineStart = LineStart().setName("lineStart") -lineEnd = LineEnd().setName("lineEnd") -stringStart = StringStart().setName("stringStart") -stringEnd = StringEnd().setName("stringEnd") - -_escapedPunc = Word( _bslash, r"\[]-*.$+^?()~ ", exact=2 ).setParseAction(lambda s,l,t:t[0][1]) -_escapedHexChar = Regex(r"\\0?[xX][0-9a-fA-F]+").setParseAction(lambda s,l,t:unichr(int(t[0].lstrip(r'\0x'),16))) -_escapedOctChar = Regex(r"\\0[0-7]+").setParseAction(lambda s,l,t:unichr(int(t[0][1:],8))) -_singleChar = _escapedPunc | _escapedHexChar | _escapedOctChar | CharsNotIn(r'\]', exact=1) -_charRange = Group(_singleChar + Suppress("-") + _singleChar) -_reBracketExpr = Literal("[") + Optional("^").setResultsName("negate") + Group( OneOrMore( _charRange | _singleChar ) ).setResultsName("body") + "]" - -def srange(s): - r""" - Helper to easily define string ranges for use in Word construction. Borrows - syntax from regexp '[]' string range definitions:: - srange("[0-9]") -> "0123456789" - srange("[a-z]") -> "abcdefghijklmnopqrstuvwxyz" - srange("[a-z$_]") -> "abcdefghijklmnopqrstuvwxyz$_" - The input string must be enclosed in []'s, and the returned string is the expanded - character set joined into a single string. - The values enclosed in the []'s may be: - - a single character - - an escaped character with a leading backslash (such as C{\-} or C{\]}) - - an escaped hex character with a leading C{'\x'} (C{\x21}, which is a C{'!'} character) - (C{\0x##} is also supported for backwards compatibility) - - an escaped octal character with a leading C{'\0'} (C{\041}, which is a C{'!'} character) - - a range of any of the above, separated by a dash (C{'a-z'}, etc.) - - any combination of the above (C{'aeiouy'}, C{'a-zA-Z0-9_$'}, etc.) - """ - _expanded = lambda p: p if not isinstance(p,ParseResults) else ''.join(unichr(c) for c in range(ord(p[0]),ord(p[1])+1)) - try: - return "".join(_expanded(part) for part in _reBracketExpr.parseString(s).body) - except Exception: - return "" - -def matchOnlyAtCol(n): - """ - Helper method for defining parse actions that require matching at a specific - column in the input text. - """ - def verifyCol(strg,locn,toks): - if col(locn,strg) != n: - raise ParseException(strg,locn,"matched token not at column %d" % n) - return verifyCol - -def replaceWith(replStr): - """ - Helper method for common parse actions that simply return a literal value. Especially - useful when used with C{L{transformString<ParserElement.transformString>}()}. - - Example:: - num = Word(nums).setParseAction(lambda toks: int(toks[0])) - na = oneOf("N/A NA").setParseAction(replaceWith(math.nan)) - term = na | num - - OneOrMore(term).parseString("324 234 N/A 234") # -> [324, 234, nan, 234] - """ - return lambda s,l,t: [replStr] - -def removeQuotes(s,l,t): - """ - Helper parse action for removing quotation marks from parsed quoted strings. - - Example:: - # by default, quotation marks are included in parsed results - quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["'Now is the Winter of our Discontent'"] - - # use removeQuotes to strip quotation marks from parsed results - quotedString.setParseAction(removeQuotes) - quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["Now is the Winter of our Discontent"] - """ - return t[0][1:-1] - -def tokenMap(func, *args): - """ - Helper to define a parse action by mapping a function to all elements of a ParseResults list.If any additional - args are passed, they are forwarded to the given function as additional arguments after - the token, as in C{hex_integer = Word(hexnums).setParseAction(tokenMap(int, 16))}, which will convert the - parsed data to an integer using base 16. - - Example (compare the last to example in L{ParserElement.transformString}:: - hex_ints = OneOrMore(Word(hexnums)).setParseAction(tokenMap(int, 16)) - hex_ints.runTests(''' - 00 11 22 aa FF 0a 0d 1a - ''') - - upperword = Word(alphas).setParseAction(tokenMap(str.upper)) - OneOrMore(upperword).runTests(''' - my kingdom for a horse - ''') - - wd = Word(alphas).setParseAction(tokenMap(str.title)) - OneOrMore(wd).setParseAction(' '.join).runTests(''' - now is the winter of our discontent made glorious summer by this sun of york - ''') - prints:: - 00 11 22 aa FF 0a 0d 1a - [0, 17, 34, 170, 255, 10, 13, 26] - - my kingdom for a horse - ['MY', 'KINGDOM', 'FOR', 'A', 'HORSE'] - - now is the winter of our discontent made glorious summer by this sun of york - ['Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York'] - """ - def pa(s,l,t): - return [func(tokn, *args) for tokn in t] - - try: - func_name = getattr(func, '__name__', - getattr(func, '__class__').__name__) - except Exception: - func_name = str(func) - pa.__name__ = func_name - - return pa - -upcaseTokens = tokenMap(lambda t: _ustr(t).upper()) -"""(Deprecated) Helper parse action to convert tokens to upper case. Deprecated in favor of L{pyparsing_common.upcaseTokens}""" - -downcaseTokens = tokenMap(lambda t: _ustr(t).lower()) -"""(Deprecated) Helper parse action to convert tokens to lower case. Deprecated in favor of L{pyparsing_common.downcaseTokens}""" - -def _makeTags(tagStr, xml): - """Internal helper to construct opening and closing tag expressions, given a tag name""" - if isinstance(tagStr,basestring): - resname = tagStr - tagStr = Keyword(tagStr, caseless=not xml) - else: - resname = tagStr.name - - tagAttrName = Word(alphas,alphanums+"_-:") - if (xml): - tagAttrValue = dblQuotedString.copy().setParseAction( removeQuotes ) - openTag = Suppress("<") + tagStr("tag") + \ - Dict(ZeroOrMore(Group( tagAttrName + Suppress("=") + tagAttrValue ))) + \ - Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">") - else: - printablesLessRAbrack = "".join(c for c in printables if c not in ">") - tagAttrValue = quotedString.copy().setParseAction( removeQuotes ) | Word(printablesLessRAbrack) - openTag = Suppress("<") + tagStr("tag") + \ - Dict(ZeroOrMore(Group( tagAttrName.setParseAction(downcaseTokens) + \ - Optional( Suppress("=") + tagAttrValue ) ))) + \ - Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">") - closeTag = Combine(_L("</") + tagStr + ">") - - openTag = openTag.setResultsName("start"+"".join(resname.replace(":"," ").title().split())).setName("<%s>" % resname) - closeTag = closeTag.setResultsName("end"+"".join(resname.replace(":"," ").title().split())).setName("</%s>" % resname) - openTag.tag = resname - closeTag.tag = resname - return openTag, closeTag - -def makeHTMLTags(tagStr): - """ - Helper to construct opening and closing tag expressions for HTML, given a tag name. Matches - tags in either upper or lower case, attributes with namespaces and with quoted or unquoted values. - - Example:: - text = '<td>More info at the <a href="http://pyparsing.wikispaces.com">pyparsing</a> wiki page</td>' - # makeHTMLTags returns pyparsing expressions for the opening and closing tags as a 2-tuple - a,a_end = makeHTMLTags("A") - link_expr = a + SkipTo(a_end)("link_text") + a_end - - for link in link_expr.searchString(text): - # attributes in the <A> tag (like "href" shown here) are also accessible as named results - print(link.link_text, '->', link.href) - prints:: - pyparsing -> http://pyparsing.wikispaces.com - """ - return _makeTags( tagStr, False ) - -def makeXMLTags(tagStr): - """ - Helper to construct opening and closing tag expressions for XML, given a tag name. Matches - tags only in the given upper/lower case. - - Example: similar to L{makeHTMLTags} - """ - return _makeTags( tagStr, True ) - -def withAttribute(*args,**attrDict): - """ - Helper to create a validating parse action to be used with start tags created - with C{L{makeXMLTags}} or C{L{makeHTMLTags}}. Use C{withAttribute} to qualify a starting tag - with a required attribute value, to avoid false matches on common tags such as - C{<TD>} or C{<DIV>}. - - Call C{withAttribute} with a series of attribute names and values. Specify the list - of filter attributes names and values as: - - keyword arguments, as in C{(align="right")}, or - - as an explicit dict with C{**} operator, when an attribute name is also a Python - reserved word, as in C{**{"class":"Customer", "align":"right"}} - - a list of name-value tuples, as in ( ("ns1:class", "Customer"), ("ns2:align","right") ) - For attribute names with a namespace prefix, you must use the second form. Attribute - names are matched insensitive to upper/lower case. - - If just testing for C{class} (with or without a namespace), use C{L{withClass}}. - - To verify that the attribute exists, but without specifying a value, pass - C{withAttribute.ANY_VALUE} as the value. - - Example:: - html = ''' - <div> - Some text - <div type="grid">1 4 0 1 0</div> - <div type="graph">1,3 2,3 1,1</div> - <div>this has no type</div> - </div> - - ''' - div,div_end = makeHTMLTags("div") - - # only match div tag having a type attribute with value "grid" - div_grid = div().setParseAction(withAttribute(type="grid")) - grid_expr = div_grid + SkipTo(div | div_end)("body") - for grid_header in grid_expr.searchString(html): - print(grid_header.body) - - # construct a match with any div tag having a type attribute, regardless of the value - div_any_type = div().setParseAction(withAttribute(type=withAttribute.ANY_VALUE)) - div_expr = div_any_type + SkipTo(div | div_end)("body") - for div_header in div_expr.searchString(html): - print(div_header.body) - prints:: - 1 4 0 1 0 - - 1 4 0 1 0 - 1,3 2,3 1,1 - """ - if args: - attrs = args[:] - else: - attrs = attrDict.items() - attrs = [(k,v) for k,v in attrs] - def pa(s,l,tokens): - for attrName,attrValue in attrs: - if attrName not in tokens: - raise ParseException(s,l,"no matching attribute " + attrName) - if attrValue != withAttribute.ANY_VALUE and tokens[attrName] != attrValue: - raise ParseException(s,l,"attribute '%s' has value '%s', must be '%s'" % - (attrName, tokens[attrName], attrValue)) - return pa -withAttribute.ANY_VALUE = object() - -def withClass(classname, namespace=''): - """ - Simplified version of C{L{withAttribute}} when matching on a div class - made - difficult because C{class} is a reserved word in Python. - - Example:: - html = ''' - <div> - Some text - <div class="grid">1 4 0 1 0</div> - <div class="graph">1,3 2,3 1,1</div> - <div>this <div> has no class</div> - </div> - - ''' - div,div_end = makeHTMLTags("div") - div_grid = div().setParseAction(withClass("grid")) - - grid_expr = div_grid + SkipTo(div | div_end)("body") - for grid_header in grid_expr.searchString(html): - print(grid_header.body) - - div_any_type = div().setParseAction(withClass(withAttribute.ANY_VALUE)) - div_expr = div_any_type + SkipTo(div | div_end)("body") - for div_header in div_expr.searchString(html): - print(div_header.body) - prints:: - 1 4 0 1 0 - - 1 4 0 1 0 - 1,3 2,3 1,1 - """ - classattr = "%s:class" % namespace if namespace else "class" - return withAttribute(**{classattr : classname}) - -opAssoc = _Constants() -opAssoc.LEFT = object() -opAssoc.RIGHT = object() - -def infixNotation( baseExpr, opList, lpar=Suppress('('), rpar=Suppress(')') ): - """ - Helper method for constructing grammars of expressions made up of - operators working in a precedence hierarchy. Operators may be unary or - binary, left- or right-associative. Parse actions can also be attached - to operator expressions. The generated parser will also recognize the use - of parentheses to override operator precedences (see example below). - - Note: if you define a deep operator list, you may see performance issues - when using infixNotation. See L{ParserElement.enablePackrat} for a - mechanism to potentially improve your parser performance. - - Parameters: - - baseExpr - expression representing the most basic element for the nested - - opList - list of tuples, one for each operator precedence level in the - expression grammar; each tuple is of the form - (opExpr, numTerms, rightLeftAssoc, parseAction), where: - - opExpr is the pyparsing expression for the operator; - may also be a string, which will be converted to a Literal; - if numTerms is 3, opExpr is a tuple of two expressions, for the - two operators separating the 3 terms - - numTerms is the number of terms for this operator (must - be 1, 2, or 3) - - rightLeftAssoc is the indicator whether the operator is - right or left associative, using the pyparsing-defined - constants C{opAssoc.RIGHT} and C{opAssoc.LEFT}. - - parseAction is the parse action to be associated with - expressions matching this operator expression (the - parse action tuple member may be omitted); if the parse action - is passed a tuple or list of functions, this is equivalent to - calling C{setParseAction(*fn)} (L{ParserElement.setParseAction}) - - lpar - expression for matching left-parentheses (default=C{Suppress('(')}) - - rpar - expression for matching right-parentheses (default=C{Suppress(')')}) - - Example:: - # simple example of four-function arithmetic with ints and variable names - integer = pyparsing_common.signed_integer - varname = pyparsing_common.identifier - - arith_expr = infixNotation(integer | varname, - [ - ('-', 1, opAssoc.RIGHT), - (oneOf('* /'), 2, opAssoc.LEFT), - (oneOf('+ -'), 2, opAssoc.LEFT), - ]) - - arith_expr.runTests(''' - 5+3*6 - (5+3)*6 - -2--11 - ''', fullDump=False) - prints:: - 5+3*6 - [[5, '+', [3, '*', 6]]] - - (5+3)*6 - [[[5, '+', 3], '*', 6]] - - -2--11 - [[['-', 2], '-', ['-', 11]]] - """ - ret = Forward() - lastExpr = baseExpr | ( lpar + ret + rpar ) - for i,operDef in enumerate(opList): - opExpr,arity,rightLeftAssoc,pa = (operDef + (None,))[:4] - termName = "%s term" % opExpr if arity < 3 else "%s%s term" % opExpr - if arity == 3: - if opExpr is None or len(opExpr) != 2: - raise ValueError("if numterms=3, opExpr must be a tuple or list of two expressions") - opExpr1, opExpr2 = opExpr - thisExpr = Forward().setName(termName) - if rightLeftAssoc == opAssoc.LEFT: - if arity == 1: - matchExpr = FollowedBy(lastExpr + opExpr) + Group( lastExpr + OneOrMore( opExpr ) ) - elif arity == 2: - if opExpr is not None: - matchExpr = FollowedBy(lastExpr + opExpr + lastExpr) + Group( lastExpr + OneOrMore( opExpr + lastExpr ) ) - else: - matchExpr = FollowedBy(lastExpr+lastExpr) + Group( lastExpr + OneOrMore(lastExpr) ) - elif arity == 3: - matchExpr = FollowedBy(lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr) + \ - Group( lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr ) - else: - raise ValueError("operator must be unary (1), binary (2), or ternary (3)") - elif rightLeftAssoc == opAssoc.RIGHT: - if arity == 1: - # try to avoid LR with this extra test - if not isinstance(opExpr, Optional): - opExpr = Optional(opExpr) - matchExpr = FollowedBy(opExpr.expr + thisExpr) + Group( opExpr + thisExpr ) - elif arity == 2: - if opExpr is not None: - matchExpr = FollowedBy(lastExpr + opExpr + thisExpr) + Group( lastExpr + OneOrMore( opExpr + thisExpr ) ) - else: - matchExpr = FollowedBy(lastExpr + thisExpr) + Group( lastExpr + OneOrMore( thisExpr ) ) - elif arity == 3: - matchExpr = FollowedBy(lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr) + \ - Group( lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr ) - else: - raise ValueError("operator must be unary (1), binary (2), or ternary (3)") - else: - raise ValueError("operator must indicate right or left associativity") - if pa: - if isinstance(pa, (tuple, list)): - matchExpr.setParseAction(*pa) - else: - matchExpr.setParseAction(pa) - thisExpr <<= ( matchExpr.setName(termName) | lastExpr ) - lastExpr = thisExpr - ret <<= lastExpr - return ret - -operatorPrecedence = infixNotation -"""(Deprecated) Former name of C{L{infixNotation}}, will be dropped in a future release.""" - -dblQuotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"').setName("string enclosed in double quotes") -sglQuotedString = Combine(Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("string enclosed in single quotes") -quotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"'| - Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("quotedString using single or double quotes") -unicodeString = Combine(_L('u') + quotedString.copy()).setName("unicode string literal") - -def nestedExpr(opener="(", closer=")", content=None, ignoreExpr=quotedString.copy()): - """ - Helper method for defining nested lists enclosed in opening and closing - delimiters ("(" and ")" are the default). - - Parameters: - - opener - opening character for a nested list (default=C{"("}); can also be a pyparsing expression - - closer - closing character for a nested list (default=C{")"}); can also be a pyparsing expression - - content - expression for items within the nested lists (default=C{None}) - - ignoreExpr - expression for ignoring opening and closing delimiters (default=C{quotedString}) - - If an expression is not provided for the content argument, the nested - expression will capture all whitespace-delimited content between delimiters - as a list of separate values. - - Use the C{ignoreExpr} argument to define expressions that may contain - opening or closing characters that should not be treated as opening - or closing characters for nesting, such as quotedString or a comment - expression. Specify multiple expressions using an C{L{Or}} or C{L{MatchFirst}}. - The default is L{quotedString}, but if no expressions are to be ignored, - then pass C{None} for this argument. - - Example:: - data_type = oneOf("void int short long char float double") - decl_data_type = Combine(data_type + Optional(Word('*'))) - ident = Word(alphas+'_', alphanums+'_') - number = pyparsing_common.number - arg = Group(decl_data_type + ident) - LPAR,RPAR = map(Suppress, "()") - - code_body = nestedExpr('{', '}', ignoreExpr=(quotedString | cStyleComment)) - - c_function = (decl_data_type("type") - + ident("name") - + LPAR + Optional(delimitedList(arg), [])("args") + RPAR - + code_body("body")) - c_function.ignore(cStyleComment) - - source_code = ''' - int is_odd(int x) { - return (x%2); - } - - int dec_to_hex(char hchar) { - if (hchar >= '0' && hchar <= '9') { - return (ord(hchar)-ord('0')); - } else { - return (10+ord(hchar)-ord('A')); - } - } - ''' - for func in c_function.searchString(source_code): - print("%(name)s (%(type)s) args: %(args)s" % func) - - prints:: - is_odd (int) args: [['int', 'x']] - dec_to_hex (int) args: [['char', 'hchar']] - """ - if opener == closer: - raise ValueError("opening and closing strings cannot be the same") - if content is None: - if isinstance(opener,basestring) and isinstance(closer,basestring): - if len(opener) == 1 and len(closer)==1: - if ignoreExpr is not None: - content = (Combine(OneOrMore(~ignoreExpr + - CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS,exact=1)) - ).setParseAction(lambda t:t[0].strip())) - else: - content = (empty.copy()+CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS - ).setParseAction(lambda t:t[0].strip())) - else: - if ignoreExpr is not None: - content = (Combine(OneOrMore(~ignoreExpr + - ~Literal(opener) + ~Literal(closer) + - CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) - ).setParseAction(lambda t:t[0].strip())) - else: - content = (Combine(OneOrMore(~Literal(opener) + ~Literal(closer) + - CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) - ).setParseAction(lambda t:t[0].strip())) - else: - raise ValueError("opening and closing arguments must be strings if no content expression is given") - ret = Forward() - if ignoreExpr is not None: - ret <<= Group( Suppress(opener) + ZeroOrMore( ignoreExpr | ret | content ) + Suppress(closer) ) - else: - ret <<= Group( Suppress(opener) + ZeroOrMore( ret | content ) + Suppress(closer) ) - ret.setName('nested %s%s expression' % (opener,closer)) - return ret - -def indentedBlock(blockStatementExpr, indentStack, indent=True): - """ - Helper method for defining space-delimited indentation blocks, such as - those used to define block statements in Python source code. - - Parameters: - - blockStatementExpr - expression defining syntax of statement that - is repeated within the indented block - - indentStack - list created by caller to manage indentation stack - (multiple statementWithIndentedBlock expressions within a single grammar - should share a common indentStack) - - indent - boolean indicating whether block must be indented beyond the - the current level; set to False for block of left-most statements - (default=C{True}) - - A valid block must contain at least one C{blockStatement}. - - Example:: - data = ''' - def A(z): - A1 - B = 100 - G = A2 - A2 - A3 - B - def BB(a,b,c): - BB1 - def BBA(): - bba1 - bba2 - bba3 - C - D - def spam(x,y): - def eggs(z): - pass - ''' - - - indentStack = [1] - stmt = Forward() - - identifier = Word(alphas, alphanums) - funcDecl = ("def" + identifier + Group( "(" + Optional( delimitedList(identifier) ) + ")" ) + ":") - func_body = indentedBlock(stmt, indentStack) - funcDef = Group( funcDecl + func_body ) - - rvalue = Forward() - funcCall = Group(identifier + "(" + Optional(delimitedList(rvalue)) + ")") - rvalue << (funcCall | identifier | Word(nums)) - assignment = Group(identifier + "=" + rvalue) - stmt << ( funcDef | assignment | identifier ) - - module_body = OneOrMore(stmt) - - parseTree = module_body.parseString(data) - parseTree.pprint() - prints:: - [['def', - 'A', - ['(', 'z', ')'], - ':', - [['A1'], [['B', '=', '100']], [['G', '=', 'A2']], ['A2'], ['A3']]], - 'B', - ['def', - 'BB', - ['(', 'a', 'b', 'c', ')'], - ':', - [['BB1'], [['def', 'BBA', ['(', ')'], ':', [['bba1'], ['bba2'], ['bba3']]]]]], - 'C', - 'D', - ['def', - 'spam', - ['(', 'x', 'y', ')'], - ':', - [[['def', 'eggs', ['(', 'z', ')'], ':', [['pass']]]]]]] - """ - def checkPeerIndent(s,l,t): - if l >= len(s): return - curCol = col(l,s) - if curCol != indentStack[-1]: - if curCol > indentStack[-1]: - raise ParseFatalException(s,l,"illegal nesting") - raise ParseException(s,l,"not a peer entry") - - def checkSubIndent(s,l,t): - curCol = col(l,s) - if curCol > indentStack[-1]: - indentStack.append( curCol ) - else: - raise ParseException(s,l,"not a subentry") - - def checkUnindent(s,l,t): - if l >= len(s): return - curCol = col(l,s) - if not(indentStack and curCol < indentStack[-1] and curCol <= indentStack[-2]): - raise ParseException(s,l,"not an unindent") - indentStack.pop() - - NL = OneOrMore(LineEnd().setWhitespaceChars("\t ").suppress()) - INDENT = (Empty() + Empty().setParseAction(checkSubIndent)).setName('INDENT') - PEER = Empty().setParseAction(checkPeerIndent).setName('') - UNDENT = Empty().setParseAction(checkUnindent).setName('UNINDENT') - if indent: - smExpr = Group( Optional(NL) + - #~ FollowedBy(blockStatementExpr) + - INDENT + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) + UNDENT) - else: - smExpr = Group( Optional(NL) + - (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) ) - blockStatementExpr.ignore(_bslash + LineEnd()) - return smExpr.setName('indented block') - -alphas8bit = srange(r"[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]") -punc8bit = srange(r"[\0xa1-\0xbf\0xd7\0xf7]") - -anyOpenTag,anyCloseTag = makeHTMLTags(Word(alphas,alphanums+"_:").setName('any tag')) -_htmlEntityMap = dict(zip("gt lt amp nbsp quot apos".split(),'><& "\'')) -commonHTMLEntity = Regex('&(?P<entity>' + '|'.join(_htmlEntityMap.keys()) +");").setName("common HTML entity") -def replaceHTMLEntity(t): - """Helper parser action to replace common HTML entities with their special characters""" - return _htmlEntityMap.get(t.entity) - -# it's easy to get these comment structures wrong - they're very common, so may as well make them available -cStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/').setName("C style comment") -"Comment of the form C{/* ... */}" - -htmlComment = Regex(r"<!--[\s\S]*?-->").setName("HTML comment") -"Comment of the form C{<!-- ... -->}" - -restOfLine = Regex(r".*").leaveWhitespace().setName("rest of line") -dblSlashComment = Regex(r"//(?:\\\n|[^\n])*").setName("// comment") -"Comment of the form C{// ... (to end of line)}" - -cppStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/'| dblSlashComment).setName("C++ style comment") -"Comment of either form C{L{cStyleComment}} or C{L{dblSlashComment}}" - -javaStyleComment = cppStyleComment -"Same as C{L{cppStyleComment}}" - -pythonStyleComment = Regex(r"#.*").setName("Python style comment") -"Comment of the form C{# ... (to end of line)}" - -_commasepitem = Combine(OneOrMore(Word(printables, excludeChars=',') + - Optional( Word(" \t") + - ~Literal(",") + ~LineEnd() ) ) ).streamline().setName("commaItem") -commaSeparatedList = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("commaSeparatedList") -"""(Deprecated) Predefined expression of 1 or more printable words or quoted strings, separated by commas. - This expression is deprecated in favor of L{pyparsing_common.comma_separated_list}.""" - -# some other useful expressions - using lower-case class name since we are really using this as a namespace -class pyparsing_common: - """ - Here are some common low-level expressions that may be useful in jump-starting parser development: - - numeric forms (L{integers<integer>}, L{reals<real>}, L{scientific notation<sci_real>}) - - common L{programming identifiers<identifier>} - - network addresses (L{MAC<mac_address>}, L{IPv4<ipv4_address>}, L{IPv6<ipv6_address>}) - - ISO8601 L{dates<iso8601_date>} and L{datetime<iso8601_datetime>} - - L{UUID<uuid>} - - L{comma-separated list<comma_separated_list>} - Parse actions: - - C{L{convertToInteger}} - - C{L{convertToFloat}} - - C{L{convertToDate}} - - C{L{convertToDatetime}} - - C{L{stripHTMLTags}} - - C{L{upcaseTokens}} - - C{L{downcaseTokens}} - - Example:: - pyparsing_common.number.runTests(''' - # any int or real number, returned as the appropriate type - 100 - -100 - +100 - 3.14159 - 6.02e23 - 1e-12 - ''') - - pyparsing_common.fnumber.runTests(''' - # any int or real number, returned as float - 100 - -100 - +100 - 3.14159 - 6.02e23 - 1e-12 - ''') - - pyparsing_common.hex_integer.runTests(''' - # hex numbers - 100 - FF - ''') - - pyparsing_common.fraction.runTests(''' - # fractions - 1/2 - -3/4 - ''') - - pyparsing_common.mixed_integer.runTests(''' - # mixed fractions - 1 - 1/2 - -3/4 - 1-3/4 - ''') - - import uuid - pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) - pyparsing_common.uuid.runTests(''' - # uuid - 12345678-1234-5678-1234-567812345678 - ''') - prints:: - # any int or real number, returned as the appropriate type - 100 - [100] - - -100 - [-100] - - +100 - [100] - - 3.14159 - [3.14159] - - 6.02e23 - [6.02e+23] - - 1e-12 - [1e-12] - - # any int or real number, returned as float - 100 - [100.0] - - -100 - [-100.0] - - +100 - [100.0] - - 3.14159 - [3.14159] - - 6.02e23 - [6.02e+23] - - 1e-12 - [1e-12] - - # hex numbers - 100 - [256] - - FF - [255] - - # fractions - 1/2 - [0.5] - - -3/4 - [-0.75] - - # mixed fractions - 1 - [1] - - 1/2 - [0.5] - - -3/4 - [-0.75] - - 1-3/4 - [1.75] - - # uuid - 12345678-1234-5678-1234-567812345678 - [UUID('12345678-1234-5678-1234-567812345678')] - """ - - convertToInteger = tokenMap(int) - """ - Parse action for converting parsed integers to Python int - """ - - convertToFloat = tokenMap(float) - """ - Parse action for converting parsed numbers to Python float - """ - - integer = Word(nums).setName("integer").setParseAction(convertToInteger) - """expression that parses an unsigned integer, returns an int""" - - hex_integer = Word(hexnums).setName("hex integer").setParseAction(tokenMap(int,16)) - """expression that parses a hexadecimal integer, returns an int""" - - signed_integer = Regex(r'[+-]?\d+').setName("signed integer").setParseAction(convertToInteger) - """expression that parses an integer with optional leading sign, returns an int""" - - fraction = (signed_integer().setParseAction(convertToFloat) + '/' + signed_integer().setParseAction(convertToFloat)).setName("fraction") - """fractional expression of an integer divided by an integer, returns a float""" - fraction.addParseAction(lambda t: t[0]/t[-1]) - - mixed_integer = (fraction | signed_integer + Optional(Optional('-').suppress() + fraction)).setName("fraction or mixed integer-fraction") - """mixed integer of the form 'integer - fraction', with optional leading integer, returns float""" - mixed_integer.addParseAction(sum) - - real = Regex(r'[+-]?\d+\.\d*').setName("real number").setParseAction(convertToFloat) - """expression that parses a floating point number and returns a float""" - - sci_real = Regex(r'[+-]?\d+([eE][+-]?\d+|\.\d*([eE][+-]?\d+)?)').setName("real number with scientific notation").setParseAction(convertToFloat) - """expression that parses a floating point number with optional scientific notation and returns a float""" - - # streamlining this expression makes the docs nicer-looking - number = (sci_real | real | signed_integer).streamline() - """any numeric expression, returns the corresponding Python type""" - - fnumber = Regex(r'[+-]?\d+\.?\d*([eE][+-]?\d+)?').setName("fnumber").setParseAction(convertToFloat) - """any int or real number, returned as float""" - - identifier = Word(alphas+'_', alphanums+'_').setName("identifier") - """typical code identifier (leading alpha or '_', followed by 0 or more alphas, nums, or '_')""" - - ipv4_address = Regex(r'(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})){3}').setName("IPv4 address") - "IPv4 address (C{0.0.0.0 - 255.255.255.255})" - - _ipv6_part = Regex(r'[0-9a-fA-F]{1,4}').setName("hex_integer") - _full_ipv6_address = (_ipv6_part + (':' + _ipv6_part)*7).setName("full IPv6 address") - _short_ipv6_address = (Optional(_ipv6_part + (':' + _ipv6_part)*(0,6)) + "::" + Optional(_ipv6_part + (':' + _ipv6_part)*(0,6))).setName("short IPv6 address") - _short_ipv6_address.addCondition(lambda t: sum(1 for tt in t if pyparsing_common._ipv6_part.matches(tt)) < 8) - _mixed_ipv6_address = ("::ffff:" + ipv4_address).setName("mixed IPv6 address") - ipv6_address = Combine((_full_ipv6_address | _mixed_ipv6_address | _short_ipv6_address).setName("IPv6 address")).setName("IPv6 address") - "IPv6 address (long, short, or mixed form)" - - mac_address = Regex(r'[0-9a-fA-F]{2}([:.-])[0-9a-fA-F]{2}(?:\1[0-9a-fA-F]{2}){4}').setName("MAC address") - "MAC address xx:xx:xx:xx:xx (may also have '-' or '.' delimiters)" - - @staticmethod - def convertToDate(fmt="%Y-%m-%d"): - """ - Helper to create a parse action for converting parsed date string to Python datetime.date - - Params - - - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%d"}) - - Example:: - date_expr = pyparsing_common.iso8601_date.copy() - date_expr.setParseAction(pyparsing_common.convertToDate()) - print(date_expr.parseString("1999-12-31")) - prints:: - [datetime.date(1999, 12, 31)] - """ - def cvt_fn(s,l,t): - try: - return datetime.strptime(t[0], fmt).date() - except ValueError as ve: - raise ParseException(s, l, str(ve)) - return cvt_fn - - @staticmethod - def convertToDatetime(fmt="%Y-%m-%dT%H:%M:%S.%f"): - """ - Helper to create a parse action for converting parsed datetime string to Python datetime.datetime - - Params - - - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%dT%H:%M:%S.%f"}) - - Example:: - dt_expr = pyparsing_common.iso8601_datetime.copy() - dt_expr.setParseAction(pyparsing_common.convertToDatetime()) - print(dt_expr.parseString("1999-12-31T23:59:59.999")) - prints:: - [datetime.datetime(1999, 12, 31, 23, 59, 59, 999000)] - """ - def cvt_fn(s,l,t): - try: - return datetime.strptime(t[0], fmt) - except ValueError as ve: - raise ParseException(s, l, str(ve)) - return cvt_fn - - iso8601_date = Regex(r'(?P<year>\d{4})(?:-(?P<month>\d\d)(?:-(?P<day>\d\d))?)?').setName("ISO8601 date") - "ISO8601 date (C{yyyy-mm-dd})" - - iso8601_datetime = Regex(r'(?P<year>\d{4})-(?P<month>\d\d)-(?P<day>\d\d)[T ](?P<hour>\d\d):(?P<minute>\d\d)(:(?P<second>\d\d(\.\d*)?)?)?(?P<tz>Z|[+-]\d\d:?\d\d)?').setName("ISO8601 datetime") - "ISO8601 datetime (C{yyyy-mm-ddThh:mm:ss.s(Z|+-00:00)}) - trailing seconds, milliseconds, and timezone optional; accepts separating C{'T'} or C{' '}" - - uuid = Regex(r'[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}').setName("UUID") - "UUID (C{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx})" - - _html_stripper = anyOpenTag.suppress() | anyCloseTag.suppress() - @staticmethod - def stripHTMLTags(s, l, tokens): - """ - Parse action to remove HTML tags from web page HTML source - - Example:: - # strip HTML links from normal text - text = '<td>More info at the <a href="http://pyparsing.wikispaces.com">pyparsing</a> wiki page</td>' - td,td_end = makeHTMLTags("TD") - table_text = td + SkipTo(td_end).setParseAction(pyparsing_common.stripHTMLTags)("body") + td_end - - print(table_text.parseString(text).body) # -> 'More info at the pyparsing wiki page' - """ - return pyparsing_common._html_stripper.transformString(tokens[0]) - - _commasepitem = Combine(OneOrMore(~Literal(",") + ~LineEnd() + Word(printables, excludeChars=',') - + Optional( White(" \t") ) ) ).streamline().setName("commaItem") - comma_separated_list = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("comma separated list") - """Predefined expression of 1 or more printable words or quoted strings, separated by commas.""" - - upcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).upper())) - """Parse action to convert tokens to upper case.""" - - downcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).lower())) - """Parse action to convert tokens to lower case.""" - - -if __name__ == "__main__": - - selectToken = CaselessLiteral("select") - fromToken = CaselessLiteral("from") - - ident = Word(alphas, alphanums + "_$") - - columnName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) - columnNameList = Group(delimitedList(columnName)).setName("columns") - columnSpec = ('*' | columnNameList) - - tableName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) - tableNameList = Group(delimitedList(tableName)).setName("tables") - - simpleSQL = selectToken("command") + columnSpec("columns") + fromToken + tableNameList("tables") - - # demo runTests method, including embedded comments in test string - simpleSQL.runTests(""" - # '*' as column list and dotted table name - select * from SYS.XYZZY - - # caseless match on "SELECT", and casts back to "select" - SELECT * from XYZZY, ABC - - # list of column names, and mixed case SELECT keyword - Select AA,BB,CC from Sys.dual - - # multiple tables - Select A, B, C from Sys.dual, Table2 - - # invalid SELECT keyword - should fail - Xelect A, B, C from Sys.dual - - # incomplete command - should fail - Select - - # invalid column name - should fail - Select ^^^ frox Sys.dual - - """) - - pyparsing_common.number.runTests(""" - 100 - -100 - +100 - 3.14159 - 6.02e23 - 1e-12 - """) - - # any int or real number, returned as float - pyparsing_common.fnumber.runTests(""" - 100 - -100 - +100 - 3.14159 - 6.02e23 - 1e-12 - """) - - pyparsing_common.hex_integer.runTests(""" - 100 - FF - """) - - import uuid - pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) - pyparsing_common.uuid.runTests(""" - 12345678-1234-5678-1234-567812345678 - """) diff --git a/env/lib/python3.7/site-packages/pkg_resources/_vendor/six.py b/env/lib/python3.7/site-packages/pkg_resources/_vendor/six.py deleted file mode 100644 index 190c023..0000000 --- a/env/lib/python3.7/site-packages/pkg_resources/_vendor/six.py +++ /dev/null @@ -1,868 +0,0 @@ -"""Utilities for writing code that runs on Python 2 and 3""" - -# Copyright (c) 2010-2015 Benjamin Peterson -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -from __future__ import absolute_import - -import functools -import itertools -import operator -import sys -import types - -__author__ = "Benjamin Peterson <benjamin@python.org>" -__version__ = "1.10.0" - - -# Useful for very coarse version differentiation. -PY2 = sys.version_info[0] == 2 -PY3 = sys.version_info[0] == 3 -PY34 = sys.version_info[0:2] >= (3, 4) - -if PY3: - string_types = str, - integer_types = int, - class_types = type, - text_type = str - binary_type = bytes - - MAXSIZE = sys.maxsize -else: - string_types = basestring, - integer_types = (int, long) - class_types = (type, types.ClassType) - text_type = unicode - binary_type = str - - if sys.platform.startswith("java"): - # Jython always uses 32 bits. - MAXSIZE = int((1 << 31) - 1) - else: - # It's possible to have sizeof(long) != sizeof(Py_ssize_t). - class X(object): - - def __len__(self): - return 1 << 31 - try: - len(X()) - except OverflowError: - # 32-bit - MAXSIZE = int((1 << 31) - 1) - else: - # 64-bit - MAXSIZE = int((1 << 63) - 1) - del X - - -def _add_doc(func, doc): - """Add documentation to a function.""" - func.__doc__ = doc - - -def _import_module(name): - """Import module, returning the module after the last dot.""" - __import__(name) - return sys.modules[name] - - -class _LazyDescr(object): - - def __init__(self, name): - self.name = name - - def __get__(self, obj, tp): - result = self._resolve() - setattr(obj, self.name, result) # Invokes __set__. - try: - # This is a bit ugly, but it avoids running this again by - # removing this descriptor. - delattr(obj.__class__, self.name) - except AttributeError: - pass - return result - - -class MovedModule(_LazyDescr): - - def __init__(self, name, old, new=None): - super(MovedModule, self).__init__(name) - if PY3: - if new is None: - new = name - self.mod = new - else: - self.mod = old - - def _resolve(self): - return _import_module(self.mod) - - def __getattr__(self, attr): - _module = self._resolve() - value = getattr(_module, attr) - setattr(self, attr, value) - return value - - -class _LazyModule(types.ModuleType): - - def __init__(self, name): - super(_LazyModule, self).__init__(name) - self.__doc__ = self.__class__.__doc__ - - def __dir__(self): - attrs = ["__doc__", "__name__"] - attrs += [attr.name for attr in self._moved_attributes] - return attrs - - # Subclasses should override this - _moved_attributes = [] - - -class MovedAttribute(_LazyDescr): - - def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): - super(MovedAttribute, self).__init__(name) - if PY3: - if new_mod is None: - new_mod = name - self.mod = new_mod - if new_attr is None: - if old_attr is None: - new_attr = name - else: - new_attr = old_attr - self.attr = new_attr - else: - self.mod = old_mod - if old_attr is None: - old_attr = name - self.attr = old_attr - - def _resolve(self): - module = _import_module(self.mod) - return getattr(module, self.attr) - - -class _SixMetaPathImporter(object): - - """ - A meta path importer to import six.moves and its submodules. - - This class implements a PEP302 finder and loader. It should be compatible - with Python 2.5 and all existing versions of Python3 - """ - - def __init__(self, six_module_name): - self.name = six_module_name - self.known_modules = {} - - def _add_module(self, mod, *fullnames): - for fullname in fullnames: - self.known_modules[self.name + "." + fullname] = mod - - def _get_module(self, fullname): - return self.known_modules[self.name + "." + fullname] - - def find_module(self, fullname, path=None): - if fullname in self.known_modules: - return self - return None - - def __get_module(self, fullname): - try: - return self.known_modules[fullname] - except KeyError: - raise ImportError("This loader does not know module " + fullname) - - def load_module(self, fullname): - try: - # in case of a reload - return sys.modules[fullname] - except KeyError: - pass - mod = self.__get_module(fullname) - if isinstance(mod, MovedModule): - mod = mod._resolve() - else: - mod.__loader__ = self - sys.modules[fullname] = mod - return mod - - def is_package(self, fullname): - """ - Return true, if the named module is a package. - - We need this method to get correct spec objects with - Python 3.4 (see PEP451) - """ - return hasattr(self.__get_module(fullname), "__path__") - - def get_code(self, fullname): - """Return None - - Required, if is_package is implemented""" - self.__get_module(fullname) # eventually raises ImportError - return None - get_source = get_code # same as get_code - -_importer = _SixMetaPathImporter(__name__) - - -class _MovedItems(_LazyModule): - - """Lazy loading of moved objects""" - __path__ = [] # mark as package - - -_moved_attributes = [ - MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), - MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), - MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), - MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), - MovedAttribute("intern", "__builtin__", "sys"), - MovedAttribute("map", "itertools", "builtins", "imap", "map"), - MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), - MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), - MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), - MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), - MovedAttribute("reduce", "__builtin__", "functools"), - MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), - MovedAttribute("StringIO", "StringIO", "io"), - MovedAttribute("UserDict", "UserDict", "collections"), - MovedAttribute("UserList", "UserList", "collections"), - MovedAttribute("UserString", "UserString", "collections"), - MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), - MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), - MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), - MovedModule("builtins", "__builtin__"), - MovedModule("configparser", "ConfigParser"), - MovedModule("copyreg", "copy_reg"), - MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), - MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), - MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), - MovedModule("http_cookies", "Cookie", "http.cookies"), - MovedModule("html_entities", "htmlentitydefs", "html.entities"), - MovedModule("html_parser", "HTMLParser", "html.parser"), - MovedModule("http_client", "httplib", "http.client"), - MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), - MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), - MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), - MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), - MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), - MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), - MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), - MovedModule("cPickle", "cPickle", "pickle"), - MovedModule("queue", "Queue"), - MovedModule("reprlib", "repr"), - MovedModule("socketserver", "SocketServer"), - MovedModule("_thread", "thread", "_thread"), - MovedModule("tkinter", "Tkinter"), - MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), - MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), - MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), - MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), - MovedModule("tkinter_tix", "Tix", "tkinter.tix"), - MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), - MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), - MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), - MovedModule("tkinter_colorchooser", "tkColorChooser", - "tkinter.colorchooser"), - MovedModule("tkinter_commondialog", "tkCommonDialog", - "tkinter.commondialog"), - MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), - MovedModule("tkinter_font", "tkFont", "tkinter.font"), - MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), - MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", - "tkinter.simpledialog"), - MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), - MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), - MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), - MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), - MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), - MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), -] -# Add windows specific modules. -if sys.platform == "win32": - _moved_attributes += [ - MovedModule("winreg", "_winreg"), - ] - -for attr in _moved_attributes: - setattr(_MovedItems, attr.name, attr) - if isinstance(attr, MovedModule): - _importer._add_module(attr, "moves." + attr.name) -del attr - -_MovedItems._moved_attributes = _moved_attributes - -moves = _MovedItems(__name__ + ".moves") -_importer._add_module(moves, "moves") - - -class Module_six_moves_urllib_parse(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_parse""" - - -_urllib_parse_moved_attributes = [ - MovedAttribute("ParseResult", "urlparse", "urllib.parse"), - MovedAttribute("SplitResult", "urlparse", "urllib.parse"), - MovedAttribute("parse_qs", "urlparse", "urllib.parse"), - MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), - MovedAttribute("urldefrag", "urlparse", "urllib.parse"), - MovedAttribute("urljoin", "urlparse", "urllib.parse"), - MovedAttribute("urlparse", "urlparse", "urllib.parse"), - MovedAttribute("urlsplit", "urlparse", "urllib.parse"), - MovedAttribute("urlunparse", "urlparse", "urllib.parse"), - MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), - MovedAttribute("quote", "urllib", "urllib.parse"), - MovedAttribute("quote_plus", "urllib", "urllib.parse"), - MovedAttribute("unquote", "urllib", "urllib.parse"), - MovedAttribute("unquote_plus", "urllib", "urllib.parse"), - MovedAttribute("urlencode", "urllib", "urllib.parse"), - MovedAttribute("splitquery", "urllib", "urllib.parse"), - MovedAttribute("splittag", "urllib", "urllib.parse"), - MovedAttribute("splituser", "urllib", "urllib.parse"), - MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), - MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), - MovedAttribute("uses_params", "urlparse", "urllib.parse"), - MovedAttribute("uses_query", "urlparse", "urllib.parse"), - MovedAttribute("uses_relative", "urlparse", "urllib.parse"), -] -for attr in _urllib_parse_moved_attributes: - setattr(Module_six_moves_urllib_parse, attr.name, attr) -del attr - -Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes - -_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), - "moves.urllib_parse", "moves.urllib.parse") - - -class Module_six_moves_urllib_error(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_error""" - - -_urllib_error_moved_attributes = [ - MovedAttribute("URLError", "urllib2", "urllib.error"), - MovedAttribute("HTTPError", "urllib2", "urllib.error"), - MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), -] -for attr in _urllib_error_moved_attributes: - setattr(Module_six_moves_urllib_error, attr.name, attr) -del attr - -Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes - -_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), - "moves.urllib_error", "moves.urllib.error") - - -class Module_six_moves_urllib_request(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_request""" - - -_urllib_request_moved_attributes = [ - MovedAttribute("urlopen", "urllib2", "urllib.request"), - MovedAttribute("install_opener", "urllib2", "urllib.request"), - MovedAttribute("build_opener", "urllib2", "urllib.request"), - MovedAttribute("pathname2url", "urllib", "urllib.request"), - MovedAttribute("url2pathname", "urllib", "urllib.request"), - MovedAttribute("getproxies", "urllib", "urllib.request"), - MovedAttribute("Request", "urllib2", "urllib.request"), - MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), - MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), - MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), - MovedAttribute("BaseHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), - MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), - MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), - MovedAttribute("FileHandler", "urllib2", "urllib.request"), - MovedAttribute("FTPHandler", "urllib2", "urllib.request"), - MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), - MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), - MovedAttribute("urlretrieve", "urllib", "urllib.request"), - MovedAttribute("urlcleanup", "urllib", "urllib.request"), - MovedAttribute("URLopener", "urllib", "urllib.request"), - MovedAttribute("FancyURLopener", "urllib", "urllib.request"), - MovedAttribute("proxy_bypass", "urllib", "urllib.request"), -] -for attr in _urllib_request_moved_attributes: - setattr(Module_six_moves_urllib_request, attr.name, attr) -del attr - -Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes - -_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), - "moves.urllib_request", "moves.urllib.request") - - -class Module_six_moves_urllib_response(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_response""" - - -_urllib_response_moved_attributes = [ - MovedAttribute("addbase", "urllib", "urllib.response"), - MovedAttribute("addclosehook", "urllib", "urllib.response"), - MovedAttribute("addinfo", "urllib", "urllib.response"), - MovedAttribute("addinfourl", "urllib", "urllib.response"), -] -for attr in _urllib_response_moved_attributes: - setattr(Module_six_moves_urllib_response, attr.name, attr) -del attr - -Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes - -_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), - "moves.urllib_response", "moves.urllib.response") - - -class Module_six_moves_urllib_robotparser(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_robotparser""" - - -_urllib_robotparser_moved_attributes = [ - MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), -] -for attr in _urllib_robotparser_moved_attributes: - setattr(Module_six_moves_urllib_robotparser, attr.name, attr) -del attr - -Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes - -_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), - "moves.urllib_robotparser", "moves.urllib.robotparser") - - -class Module_six_moves_urllib(types.ModuleType): - - """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" - __path__ = [] # mark as package - parse = _importer._get_module("moves.urllib_parse") - error = _importer._get_module("moves.urllib_error") - request = _importer._get_module("moves.urllib_request") - response = _importer._get_module("moves.urllib_response") - robotparser = _importer._get_module("moves.urllib_robotparser") - - def __dir__(self): - return ['parse', 'error', 'request', 'response', 'robotparser'] - -_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), - "moves.urllib") - - -def add_move(move): - """Add an item to six.moves.""" - setattr(_MovedItems, move.name, move) - - -def remove_move(name): - """Remove item from six.moves.""" - try: - delattr(_MovedItems, name) - except AttributeError: - try: - del moves.__dict__[name] - except KeyError: - raise AttributeError("no such move, %r" % (name,)) - - -if PY3: - _meth_func = "__func__" - _meth_self = "__self__" - - _func_closure = "__closure__" - _func_code = "__code__" - _func_defaults = "__defaults__" - _func_globals = "__globals__" -else: - _meth_func = "im_func" - _meth_self = "im_self" - - _func_closure = "func_closure" - _func_code = "func_code" - _func_defaults = "func_defaults" - _func_globals = "func_globals" - - -try: - advance_iterator = next -except NameError: - def advance_iterator(it): - return it.next() -next = advance_iterator - - -try: - callable = callable -except NameError: - def callable(obj): - return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) - - -if PY3: - def get_unbound_function(unbound): - return unbound - - create_bound_method = types.MethodType - - def create_unbound_method(func, cls): - return func - - Iterator = object -else: - def get_unbound_function(unbound): - return unbound.im_func - - def create_bound_method(func, obj): - return types.MethodType(func, obj, obj.__class__) - - def create_unbound_method(func, cls): - return types.MethodType(func, None, cls) - - class Iterator(object): - - def next(self): - return type(self).__next__(self) - - callable = callable -_add_doc(get_unbound_function, - """Get the function out of a possibly unbound function""") - - -get_method_function = operator.attrgetter(_meth_func) -get_method_self = operator.attrgetter(_meth_self) -get_function_closure = operator.attrgetter(_func_closure) -get_function_code = operator.attrgetter(_func_code) -get_function_defaults = operator.attrgetter(_func_defaults) -get_function_globals = operator.attrgetter(_func_globals) - - -if PY3: - def iterkeys(d, **kw): - return iter(d.keys(**kw)) - - def itervalues(d, **kw): - return iter(d.values(**kw)) - - def iteritems(d, **kw): - return iter(d.items(**kw)) - - def iterlists(d, **kw): - return iter(d.lists(**kw)) - - viewkeys = operator.methodcaller("keys") - - viewvalues = operator.methodcaller("values") - - viewitems = operator.methodcaller("items") -else: - def iterkeys(d, **kw): - return d.iterkeys(**kw) - - def itervalues(d, **kw): - return d.itervalues(**kw) - - def iteritems(d, **kw): - return d.iteritems(**kw) - - def iterlists(d, **kw): - return d.iterlists(**kw) - - viewkeys = operator.methodcaller("viewkeys") - - viewvalues = operator.methodcaller("viewvalues") - - viewitems = operator.methodcaller("viewitems") - -_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") -_add_doc(itervalues, "Return an iterator over the values of a dictionary.") -_add_doc(iteritems, - "Return an iterator over the (key, value) pairs of a dictionary.") -_add_doc(iterlists, - "Return an iterator over the (key, [values]) pairs of a dictionary.") - - -if PY3: - def b(s): - return s.encode("latin-1") - - def u(s): - return s - unichr = chr - import struct - int2byte = struct.Struct(">B").pack - del struct - byte2int = operator.itemgetter(0) - indexbytes = operator.getitem - iterbytes = iter - import io - StringIO = io.StringIO - BytesIO = io.BytesIO - _assertCountEqual = "assertCountEqual" - if sys.version_info[1] <= 1: - _assertRaisesRegex = "assertRaisesRegexp" - _assertRegex = "assertRegexpMatches" - else: - _assertRaisesRegex = "assertRaisesRegex" - _assertRegex = "assertRegex" -else: - def b(s): - return s - # Workaround for standalone backslash - - def u(s): - return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") - unichr = unichr - int2byte = chr - - def byte2int(bs): - return ord(bs[0]) - - def indexbytes(buf, i): - return ord(buf[i]) - iterbytes = functools.partial(itertools.imap, ord) - import StringIO - StringIO = BytesIO = StringIO.StringIO - _assertCountEqual = "assertItemsEqual" - _assertRaisesRegex = "assertRaisesRegexp" - _assertRegex = "assertRegexpMatches" -_add_doc(b, """Byte literal""") -_add_doc(u, """Text literal""") - - -def assertCountEqual(self, *args, **kwargs): - return getattr(self, _assertCountEqual)(*args, **kwargs) - - -def assertRaisesRegex(self, *args, **kwargs): - return getattr(self, _assertRaisesRegex)(*args, **kwargs) - - -def assertRegex(self, *args, **kwargs): - return getattr(self, _assertRegex)(*args, **kwargs) - - -if PY3: - exec_ = getattr(moves.builtins, "exec") - - def reraise(tp, value, tb=None): - if value is None: - value = tp() - if value.__traceback__ is not tb: - raise value.with_traceback(tb) - raise value - -else: - def exec_(_code_, _globs_=None, _locs_=None): - """Execute code in a namespace.""" - if _globs_ is None: - frame = sys._getframe(1) - _globs_ = frame.f_globals - if _locs_ is None: - _locs_ = frame.f_locals - del frame - elif _locs_ is None: - _locs_ = _globs_ - exec("""exec _code_ in _globs_, _locs_""") - - exec_("""def reraise(tp, value, tb=None): - raise tp, value, tb -""") - - -if sys.version_info[:2] == (3, 2): - exec_("""def raise_from(value, from_value): - if from_value is None: - raise value - raise value from from_value -""") -elif sys.version_info[:2] > (3, 2): - exec_("""def raise_from(value, from_value): - raise value from from_value -""") -else: - def raise_from(value, from_value): - raise value - - -print_ = getattr(moves.builtins, "print", None) -if print_ is None: - def print_(*args, **kwargs): - """The new-style print function for Python 2.4 and 2.5.""" - fp = kwargs.pop("file", sys.stdout) - if fp is None: - return - - def write(data): - if not isinstance(data, basestring): - data = str(data) - # If the file has an encoding, encode unicode with it. - if (isinstance(fp, file) and - isinstance(data, unicode) and - fp.encoding is not None): - errors = getattr(fp, "errors", None) - if errors is None: - errors = "strict" - data = data.encode(fp.encoding, errors) - fp.write(data) - want_unicode = False - sep = kwargs.pop("sep", None) - if sep is not None: - if isinstance(sep, unicode): - want_unicode = True - elif not isinstance(sep, str): - raise TypeError("sep must be None or a string") - end = kwargs.pop("end", None) - if end is not None: - if isinstance(end, unicode): - want_unicode = True - elif not isinstance(end, str): - raise TypeError("end must be None or a string") - if kwargs: - raise TypeError("invalid keyword arguments to print()") - if not want_unicode: - for arg in args: - if isinstance(arg, unicode): - want_unicode = True - break - if want_unicode: - newline = unicode("\n") - space = unicode(" ") - else: - newline = "\n" - space = " " - if sep is None: - sep = space - if end is None: - end = newline - for i, arg in enumerate(args): - if i: - write(sep) - write(arg) - write(end) -if sys.version_info[:2] < (3, 3): - _print = print_ - - def print_(*args, **kwargs): - fp = kwargs.get("file", sys.stdout) - flush = kwargs.pop("flush", False) - _print(*args, **kwargs) - if flush and fp is not None: - fp.flush() - -_add_doc(reraise, """Reraise an exception.""") - -if sys.version_info[0:2] < (3, 4): - def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, - updated=functools.WRAPPER_UPDATES): - def wrapper(f): - f = functools.wraps(wrapped, assigned, updated)(f) - f.__wrapped__ = wrapped - return f - return wrapper -else: - wraps = functools.wraps - - -def with_metaclass(meta, *bases): - """Create a base class with a metaclass.""" - # This requires a bit of explanation: the basic idea is to make a dummy - # metaclass for one level of class instantiation that replaces itself with - # the actual metaclass. - class metaclass(meta): - - def __new__(cls, name, this_bases, d): - return meta(name, bases, d) - return type.__new__(metaclass, 'temporary_class', (), {}) - - -def add_metaclass(metaclass): - """Class decorator for creating a class with a metaclass.""" - def wrapper(cls): - orig_vars = cls.__dict__.copy() - slots = orig_vars.get('__slots__') - if slots is not None: - if isinstance(slots, str): - slots = [slots] - for slots_var in slots: - orig_vars.pop(slots_var) - orig_vars.pop('__dict__', None) - orig_vars.pop('__weakref__', None) - return metaclass(cls.__name__, cls.__bases__, orig_vars) - return wrapper - - -def python_2_unicode_compatible(klass): - """ - A decorator that defines __unicode__ and __str__ methods under Python 2. - Under Python 3 it does nothing. - - To support Python 2 and 3 with a single code base, define a __str__ method - returning text and apply this decorator to the class. - """ - if PY2: - if '__str__' not in klass.__dict__: - raise ValueError("@python_2_unicode_compatible cannot be applied " - "to %s because it doesn't define __str__()." % - klass.__name__) - klass.__unicode__ = klass.__str__ - klass.__str__ = lambda self: self.__unicode__().encode('utf-8') - return klass - - -# Complete the moves implementation. -# This code is at the end of this module to speed up module loading. -# Turn this module into a package. -__path__ = [] # required for PEP 302 and PEP 451 -__package__ = __name__ # see PEP 366 @ReservedAssignment -if globals().get("__spec__") is not None: - __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable -# Remove other six meta path importers, since they cause problems. This can -# happen if six is removed from sys.modules and then reloaded. (Setuptools does -# this for some reason.) -if sys.meta_path: - for i, importer in enumerate(sys.meta_path): - # Here's some real nastiness: Another "instance" of the six module might - # be floating around. Therefore, we can't use isinstance() to check for - # the six meta path importer, since the other six instance will have - # inserted an importer with different class. - if (type(importer).__name__ == "_SixMetaPathImporter" and - importer.name == __name__): - del sys.meta_path[i] - break - del i, importer -# Finally, add the importer to the meta path import hook. -sys.meta_path.append(_importer) diff --git a/env/lib/python3.7/site-packages/pkg_resources/extern/__init__.py b/env/lib/python3.7/site-packages/pkg_resources/extern/__init__.py deleted file mode 100644 index c1eb9e9..0000000 --- a/env/lib/python3.7/site-packages/pkg_resources/extern/__init__.py +++ /dev/null @@ -1,73 +0,0 @@ -import sys - - -class VendorImporter: - """ - A PEP 302 meta path importer for finding optionally-vendored - or otherwise naturally-installed packages from root_name. - """ - - def __init__(self, root_name, vendored_names=(), vendor_pkg=None): - self.root_name = root_name - self.vendored_names = set(vendored_names) - self.vendor_pkg = vendor_pkg or root_name.replace('extern', '_vendor') - - @property - def search_path(self): - """ - Search first the vendor package then as a natural package. - """ - yield self.vendor_pkg + '.' - yield '' - - def find_module(self, fullname, path=None): - """ - Return self when fullname starts with root_name and the - target module is one vendored through this importer. - """ - root, base, target = fullname.partition(self.root_name + '.') - if root: - return - if not any(map(target.startswith, self.vendored_names)): - return - return self - - def load_module(self, fullname): - """ - Iterate over the search path to locate and load fullname. - """ - root, base, target = fullname.partition(self.root_name + '.') - for prefix in self.search_path: - try: - extant = prefix + target - __import__(extant) - mod = sys.modules[extant] - sys.modules[fullname] = mod - # mysterious hack: - # Remove the reference to the extant package/module - # on later Python versions to cause relative imports - # in the vendor package to resolve the same modules - # as those going through this importer. - if prefix and sys.version_info > (3, 3): - del sys.modules[extant] - return mod - except ImportError: - pass - else: - raise ImportError( - "The '{target}' package is required; " - "normally this is bundled with this package so if you get " - "this warning, consult the packager of your " - "distribution.".format(**locals()) - ) - - def install(self): - """ - Install this importer into sys.meta_path if not already present. - """ - if self not in sys.meta_path: - sys.meta_path.append(self) - - -names = 'packaging', 'pyparsing', 'six', 'appdirs' -VendorImporter(__name__, names).install() diff --git a/env/lib/python3.7/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 188737a92994f2314144f0d14092a9177ac93c65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2376 zcmZ`)TW=gS6t?HKvy)9)A(XTgM3z95mD+^c0}`bwv=ypAQPrSOR+Q0n?M)_`9Zzg; zlU*h+Y{Vnth4)50@i+Jxe&wlufhW%K>~7jd^~lGb8DGvh-{;R?FE1wqO8M87C;zkw z`4?a2#fQ!vsQLyNPB<+{k9<S8$Nf{n{i)ZZJm`6X3SW3r?|E=WD2&=B-S7p>AX|O3 z^Rig&4tx;==8~SrY0u{?JmBFe?FAy_5pSK6DeXo45|4QszP5P6mrhA9<{iEaZJYbB z!)3d&BT6pSgJC6=5o&UpFeqQKhxZ?{Pe1yE4TZ^Am6<)3&xWvpRBVu!JTG^dtV}M; ztSH7epSgtucMHG}Y4(IV%C%r+W=6`5$xCgZBRDMCKgf24W&<UMOi5|dG8>8wH~Vi0 zI+#U_E!MkG^#@>TT9cF*T6<IMd9`1y*Yvs1DfiAi_!4jeq4`_ANE|~*rER5+Z{5(g z7du&B3u9O2Uc243Z7ER|Szp+s`H@x!yWPMBS`-5n!tSbt1~4WHp>XEE`<rH1ZB}`8 za~9xDemE|VKOXFD!X~52NLlDjSSnRQ%aQ5}z1jG-nWlM}n>5|1#x|b6AenRohR}#6 zbh5Vd3P>CCaeazopkV7kMXKmkFg4i+4y}<L<dWws;vG!Ba|uR_w?(G<dw`_Uh5=Tr ziFl3-ekxg}SvJRS{-?nRm#}ohlC3Uv`G5xfK2M8Uf>*nw-99OD=n}f;fDJoza_zOK zUK-fP++x8bEYSZPUI1wfj$&|U^e6wsKM794+E?q`+a|^{ejV-yFe01+KlEq#wRU`% z{I&@F5rCpfhM=+|40A9l3Zx$cdMcyYQ4WM(P=#eB$8;>_!=PPZ*iiCOAy}@NEa&M1 zYMVVJN4tB_!k_u6IZv8ehA_6ek!@G7SB~e$G0XZ{Ikx^Vt8CJ^fnGSibt9Kr8_)f; z0jARi=%NjtW?I;&aq2?)@ua4Wr)#jW?tmfTDh=Ry3+e?JUYgKHPGO0mBIoZy)qjAw z0E34>92-cycaJ=Id=idt*I^y3k&_4@iKdhi6YPg|bd{X6>Xz%%Tci%v&(M#!cM!N9 zjQEn&t!+Tvv<?zwC@`3kAIahRW2isCSMKk}17g}!@;jZ<UqL-lD<|JB;CTS2J~M*J zXF?%v0JNjJlQAP%A^Z3nQ7vS~7wEr+QP+EcG*s8XO#b{H*17&mljM`@^Rs~9D{(l= zmEd2nQmP^9+zfino{mb6YUlXm_%PEwrX|Y<Y%E6%ndE*QWvT>Cy}|mj)T5#~l(X?5 zr*5=jJl96$Pe;g`jje8?E~Af5n(%np1jNB9b((_2jX}~H@U`tgIyB4z#TiJu)JXn) zrKGYEX!<ZSHp0{tx*In~`E6Vp<wPNM)D>Jms+1Vy$4*?c(g0y4zd$-n>x^{o!6dy7 zh6Jm$Lp>V9lh7nufi|EkH1Rwd`4?#T(h{%8975t~h_KYefEFCI)GD^mLH*BwXzud# zCXdbu(Of&Po=BFLzy-+A2HtT_pAeE#8kQAGWPHpZR4qz#&Wo+Cuik-uZF@1tMp;#X zJikHyTC*GB4$Nw#F91PbeNFmigSwu}Bq%BXi`M~a65t4!HXuU3lctBG%&8T;wbGQ! zewr#g);6w`tb{USg;Y>i(Y%l5IvPjjbA#%v@PMPfI$4N=z)QkToOI%M-5<F5K&0@Z z23|sU42q?(>+Ag3wjgj0w?{X0IdL;=h%RgOAuj%=U2S};3FkK6TkfKZ{grzG{U6DB BafJW? diff --git a/env/lib/python3.7/site-packages/pkg_resources/py31compat.py b/env/lib/python3.7/site-packages/pkg_resources/py31compat.py deleted file mode 100644 index a381c42..0000000 --- a/env/lib/python3.7/site-packages/pkg_resources/py31compat.py +++ /dev/null @@ -1,23 +0,0 @@ -import os -import errno -import sys - -from .extern import six - - -def _makedirs_31(path, exist_ok=False): - try: - os.makedirs(path) - except OSError as exc: - if not exist_ok or exc.errno != errno.EEXIST: - raise - - -# rely on compatibility behavior until mode considerations -# and exists_ok considerations are disentangled. -# See https://github.com/pypa/setuptools/pull/1083#issuecomment-315168663 -needs_makedirs = ( - six.PY2 or - (3, 4) <= sys.version_info < (3, 4, 1) -) -makedirs = _makedirs_31 if needs_makedirs else os.makedirs diff --git a/env/lib/python3.7/site-packages/setuptools/__init__.py b/env/lib/python3.7/site-packages/setuptools/__init__.py deleted file mode 100644 index a71b2bb..0000000 --- a/env/lib/python3.7/site-packages/setuptools/__init__.py +++ /dev/null @@ -1,228 +0,0 @@ -"""Extensions to the 'distutils' for large or complex distributions""" - -import os -import sys -import functools -import distutils.core -import distutils.filelist -import re -from distutils.errors import DistutilsOptionError -from distutils.util import convert_path -from fnmatch import fnmatchcase - -from ._deprecation_warning import SetuptoolsDeprecationWarning - -from setuptools.extern.six import PY3, string_types -from setuptools.extern.six.moves import filter, map - -import setuptools.version -from setuptools.extension import Extension -from setuptools.dist import Distribution, Feature -from setuptools.depends import Require -from . import monkey - -__metaclass__ = type - - -__all__ = [ - 'setup', 'Distribution', 'Feature', 'Command', 'Extension', 'Require', - 'SetuptoolsDeprecationWarning', - 'find_packages' -] - -if PY3: - __all__.append('find_namespace_packages') - -__version__ = setuptools.version.__version__ - -bootstrap_install_from = None - -# If we run 2to3 on .py files, should we also convert docstrings? -# Default: yes; assume that we can detect doctests reliably -run_2to3_on_doctests = True -# Standard package names for fixer packages -lib2to3_fixer_packages = ['lib2to3.fixes'] - - -class PackageFinder: - """ - Generate a list of all Python packages found within a directory - """ - - @classmethod - def find(cls, where='.', exclude=(), include=('*',)): - """Return a list all Python packages found within directory 'where' - - 'where' is the root directory which will be searched for packages. It - should be supplied as a "cross-platform" (i.e. URL-style) path; it will - be converted to the appropriate local path syntax. - - 'exclude' is a sequence of package names to exclude; '*' can be used - as a wildcard in the names, such that 'foo.*' will exclude all - subpackages of 'foo' (but not 'foo' itself). - - 'include' is a sequence of package names to include. If it's - specified, only the named packages will be included. If it's not - specified, all found packages will be included. 'include' can contain - shell style wildcard patterns just like 'exclude'. - """ - - return list(cls._find_packages_iter( - convert_path(where), - cls._build_filter('ez_setup', '*__pycache__', *exclude), - cls._build_filter(*include))) - - @classmethod - def _find_packages_iter(cls, where, exclude, include): - """ - All the packages found in 'where' that pass the 'include' filter, but - not the 'exclude' filter. - """ - for root, dirs, files in os.walk(where, followlinks=True): - # Copy dirs to iterate over it, then empty dirs. - all_dirs = dirs[:] - dirs[:] = [] - - for dir in all_dirs: - full_path = os.path.join(root, dir) - rel_path = os.path.relpath(full_path, where) - package = rel_path.replace(os.path.sep, '.') - - # Skip directory trees that are not valid packages - if ('.' in dir or not cls._looks_like_package(full_path)): - continue - - # Should this package be included? - if include(package) and not exclude(package): - yield package - - # Keep searching subdirectories, as there may be more packages - # down there, even if the parent was excluded. - dirs.append(dir) - - @staticmethod - def _looks_like_package(path): - """Does a directory look like a package?""" - return os.path.isfile(os.path.join(path, '__init__.py')) - - @staticmethod - def _build_filter(*patterns): - """ - Given a list of patterns, return a callable that will be true only if - the input matches at least one of the patterns. - """ - return lambda name: any(fnmatchcase(name, pat=pat) for pat in patterns) - - -class PEP420PackageFinder(PackageFinder): - @staticmethod - def _looks_like_package(path): - return True - - -find_packages = PackageFinder.find - -if PY3: - find_namespace_packages = PEP420PackageFinder.find - - -def _install_setup_requires(attrs): - # Note: do not use `setuptools.Distribution` directly, as - # our PEP 517 backend patch `distutils.core.Distribution`. - dist = distutils.core.Distribution(dict( - (k, v) for k, v in attrs.items() - if k in ('dependency_links', 'setup_requires') - )) - # Honor setup.cfg's options. - dist.parse_config_files(ignore_option_errors=True) - if dist.setup_requires: - dist.fetch_build_eggs(dist.setup_requires) - - -def setup(**attrs): - # Make sure we have any requirements needed to interpret 'attrs'. - _install_setup_requires(attrs) - return distutils.core.setup(**attrs) - -setup.__doc__ = distutils.core.setup.__doc__ - - -_Command = monkey.get_unpatched(distutils.core.Command) - - -class Command(_Command): - __doc__ = _Command.__doc__ - - command_consumes_arguments = False - - def __init__(self, dist, **kw): - """ - Construct the command for dist, updating - vars(self) with any keyword parameters. - """ - _Command.__init__(self, dist) - vars(self).update(kw) - - def _ensure_stringlike(self, option, what, default=None): - val = getattr(self, option) - if val is None: - setattr(self, option, default) - return default - elif not isinstance(val, string_types): - raise DistutilsOptionError("'%s' must be a %s (got `%s`)" - % (option, what, val)) - return val - - def ensure_string_list(self, option): - r"""Ensure that 'option' is a list of strings. If 'option' is - currently a string, we split it either on /,\s*/ or /\s+/, so - "foo bar baz", "foo,bar,baz", and "foo, bar baz" all become - ["foo", "bar", "baz"]. - """ - val = getattr(self, option) - if val is None: - return - elif isinstance(val, string_types): - setattr(self, option, re.split(r',\s*|\s+', val)) - else: - if isinstance(val, list): - ok = all(isinstance(v, string_types) for v in val) - else: - ok = False - if not ok: - raise DistutilsOptionError( - "'%s' must be a list of strings (got %r)" - % (option, val)) - - def reinitialize_command(self, command, reinit_subcommands=0, **kw): - cmd = _Command.reinitialize_command(self, command, reinit_subcommands) - vars(cmd).update(kw) - return cmd - - -def _find_all_simple(path): - """ - Find all files under 'path' - """ - results = ( - os.path.join(base, file) - for base, dirs, files in os.walk(path, followlinks=True) - for file in files - ) - return filter(os.path.isfile, results) - - -def findall(dir=os.curdir): - """ - Find all files under 'dir' and return the list of full filenames. - Unless dir is '.', return full filenames with dir prepended. - """ - files = _find_all_simple(dir) - if dir == os.curdir: - make_rel = functools.partial(os.path.relpath, start=dir) - files = map(make_rel, files) - return list(files) - - -# Apply monkey patches -monkey.patch_all() diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index fbc98725aba1cfd0c11c50714fbce69da53c6bec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7658 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 Jwq2i_{Xgx+ygmQ` diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-37.pyc deleted file mode 100644 index 035a8d2d2b86b50ea834649aeaf4fdcf0944d2ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 512 zcmZWlO-lnY5Y28&TNVo*Jb3VsYr(d77b!*Pt(OWyL9*#4YXjM2yOXWftNs!_`Iq+U zPw?i+*$>--18?#sGjArDX}=#3H1l!(P~iDh27lH@GC{x@x)~8fcy9<vURz5~_zN;< zMVQ%}hirm?Q*@GG4O#laTej-j;$k6Po;qta+{!eQ5qHX(d!89(9$(%AiZ<mSX{0#- zjcrDs>LeA1dZ5bCFob=tFbpc`-C98-MPjT&Ri?I5&^WURO8yTG!%NDIpd2XV(V8l# zI&BrGm6mk1!xk~mwHsCU^Fh1lF=luo87l(D5-W0D@)O23IoD05%b2hcW1l4J;3_Kj zGaI`k9j7WCDg%ydJrtXrdA^F*<HKK$DLeW!YZfs|cUigS65yljb*gwi@QZG<$?D=T TxMp3fEqd4WgKtXtH-h{E*2a&z diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/archive_util.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/archive_util.cpython-37.pyc deleted file mode 100644 index d22c9d732cd37d49a45f22d258550267ffa8c56e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5093 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 z K1={z;6Ct0{;nz`AfQnTbR>Nu7*Q|!+Tbn2=_`86Zhil^kX!O<+iUHc+(Ex-1 zE(0@UVksL~d3eWjhn|1@X8`SwsdMI@Q_}G1+)drX%Dj?R&Z^wTdu{HZU8D9<Ro*>r zYwxgr=mVry`TW=RM-0HU(@I(ebgF4p&5qmXU81+-N4kOM08#vM*}{CwG|#y;uj!Sv z%H0R{$IZEydS|O??HpqPqRLO$U3Q;g9MbF889-i_nEmWZS|u=B?6|#qX&kQrbhX(( zifjecav2(rXDt5*xC+t=Hh@<y5HS&gijc531yGCrcBHyRbEDPk5%1m;lpht`SHPV5 za@d3LPshU$kq)_#0d5hopG=#|>?o(d+11PVriByIBqfY9yWP(0lfCWFD35HdWwk=3 z%)d}C$9t_4jo&e-j^aTw#F@ijI`aW=sTD=#tfCOjwOofRiBlSr&!EaY5p&a@`-v+> z$TK$?i#V&CNTd?kGC0;`Y~4_6nN|7+2q!K7ai_6nnM;#rE~T0Bn<U)jA?Ck@W@mL0 zN2f+Yv^UX3+ME-z$&x7>?x3g*RLp~u*bTTx)mgV}dmT>Wf}MTacRaXE!@6poEI686 zhl+8X0rLFmO6fdv2f6d}$er1tjqLfQJbTW0yL71cSZv>C+C8hJ&bjr-`uG`~FKzBT zWU14wKC(`|)Om|NVjuk5xLD1&n8#hX*bXOmt5f@^CU>-dxOCVk9Lzk;9qja{smrTJ zb@{i{JzG9!>Jwa7&KcbwuFh-4U8b9G5%&;oH22VMAQsfX?=`g7$hk1mIeW^q+~Z&E z!oiHx9lU?_oISFXjn>nUyR&d<a=o3jes&GIU8mK_Z>4oQJO9GI0msBS!#P{eV+^_O z@s6?8jUyi;@8;IRNn__e3LM+J$8y)^Rk&<@_OHTavCms5?fsd#?9E>KiaZ#TkcWJ! z2N(Tqg78=EyIYri7heL#ba*rwcYtHj#XWQ~Zrvwr(~nM~RCZC!X_PZq)7s7tlUC+} zB=VExg^Og~tHW@#$HUh?!dw4DVKYo)J{^>ces!4O?4w?5mqQmsvi;eA@Y`wK%xcA8 z`647_-cBgZr-__Me58UJ4nK_cvRZ$bP`D?TPflX_ZH$+9sA^O77?B|S4&x(=!fHCo zykQg{5fNndF@&6&2wg)cHP5^lUn$HZzl-oW5~DqQ$EZfiaNkXmzJ&^BYBA1MyJeDB zjBC7|e}2ios60VL6qA#^!>pPQH)?l$Y|Stlb#Xq=b)(tkvzVk)A4E8gQqSZ0VHMp! zM^WEF#cDSAs0kKYvsY{i;#Kg{x_i^AB9Id&5og^ryhLH$wwoB~Tdk+$3f`72s=h~+ zG2GXw^)^+MC}d4uekW?1lY^4<wIEv_AMJMmDszTbIYr~U2@Vt8uGuj2bwN@hD~bOk y(WoT7^MrZvVdZ~dlphCPBLJ%BQMtB<C6xb$-2ln@ZqxNDw$*s9@wLXSM*F{N^tlB9 diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/build_meta.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/build_meta.cpython-37.pyc deleted file mode 100644 index b1684637ff720ff7a7409d2be2f3be0d7c3c705c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8251 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 diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/config.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/config.cpython-37.pyc deleted file mode 100644 index 2c6ab0199266200a9cc559828816a45ad0eabad2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17655 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 L<Fm%E%)Rh`$4qK! diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/dep_util.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/dep_util.cpython-37.pyc deleted file mode 100644 index d31184c58c3854d7ac14f924d85059fcdaaca84d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 819 zcmY*X&2Q5%6u0wHMz>C=;!tkBWs$m8AaNQ(Xuy>NNKC3UO<wFK)*L6Z9d(<s3*`?1 zaX|b_xpLxPfD6xYD|IjO%lrJj5Bqd98X_R|V{-m8MCi9uwiJNy29B8kV~AmiO1!`r zv4DkN(IQ~cCzQs2z>8Ac?JK_G`Xbj=Q)e#MQM@^C;cp}`i(0hC!0{Sig?eH!1L+IS z(R~0Xyg9Xjk6Gh)=={ZfWWyG<(KE<!d>!an8+?nr?K^bShM@I6r(Ms^P#d)2GJxKK zyMJd?UXjbn7KG}&DY>$S2t{hDsgzt!iRH!$l@qZfoMr_vRiiUb`Z0(wq@QX?fNVh( z5s;r%T60rZin&A!z}(KrM{XOf450unG^v(E3Iowc9?|&Cn5oC=lT1oh1=oC26gu0~ z^R+zkl+X++`dSruAe@&}S&^9@3o0c$yFW^kS#Q64nLH?+5ULnSJgP}Z*%(VMxkscW zCz7k&7HQmtAa%pfR5tv*)|KvJO;ygdyVY($>zXT;#*4!T@TPmTf$kowi;c^PTPqg7 zklqJ~zbA8B*7I7_$3htk7jew4Z`IB7WidCf#oAVtG`k|>^+jWaoYlA8Q$MR)@=6%) z*E(?TYYYqxp5VPO!Vw<BcZkP<9)a~k8g^p__u){?Y>U@V)Ccs9?XUw#>h@lh6>B7a LjX^VR`h)mCwg~O& diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/depends.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/depends.cpython-37.pyc deleted file mode 100644 index 7b44884ce7dca017266950182cac5079af410866..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5228 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 Ct6$0h diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/dist.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/dist.cpython-37.pyc deleted file mode 100644 index 3ba01d86467420bbad87ab53d5fa35ece2ed4283..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42051 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 K_t1wDcl|%G=W>An diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/extension.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/extension.cpython-37.pyc deleted file mode 100644 index 9b373d10ca3ca55fa1040d5dcfb620019c722f16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1939 zcmaJ>PmkO*6t|tsOeVWCUD^s2S_wld%BbBGxWJ*H6@?-pv`BOh5D7)u*t3(_{HyJ> zJEQDrdxejHT5;lI@HH%Moca|w@m?~UZKVoF@A=t&dH%hB{%SJu35?>8Yrp(8B;+4l zoDUa-Js{lx6GYIAgxyR-+OApXw6nXJ2kp$VVLl2+ln6(-nU{~lF~|ckd`3cF`r(!w zOJ}*goSe~c`YjP7;XNb5lhZRNoWOc4d|3N(0_#hHJ|eTNmw<rm&!~0sxOz!p0rKQX zny4<S*dz-n5>&x~rykG)ApI#YK~Kr*sv!*#?1&2ISGJ@8$bCdyV%V{-?o#-PlAlSz zegdFy;c)%2&td#1O|1%kplZp}Ie)M+i?ZNJT<}BK$g5HrDS}pY{cd*}e4T1jn>5qG zVV!0ok|)NFdl7JZb5-UUXdOJ9Io6M&&QKJo0id<xZ%z_fnY1isG~7zsD^Vr;lc+H$ z{CoeN$*X%+TJ5HVHgT5iipQ(s<dga0o(8;?Da%a1DgpvoXfPO5E4v*n;wLid>~3R> zrof2nQpR?uOQ&>5)fVjZ0mWkmv<IX)Fi9}~Arlnx&4dGab%iSiFhiChd?R#XbLaZA zUgTyG8(wRv`RyRN&F5(bVp{MjixbJqIc!&}lg&Zmz*RUfDp-p@0O^l_HSTjrs$efz zLn3O}(rHLT8#Z?u=Xch)zhQa_;BfZsv|2@3nx~MbD6Z0nGuJv*S*Z!wf!O!htOt20 zQWHh9fpxXa=GHCZT-uQ?Yn4cC-B=xI%Z{J6S?CxxkJ<rt6G$US;!NrKa&I;`x0+yC z;y@+zs4dTZ5DYmZ%Evly$dXo<1v{k;ea>D${~R-QOSlCSgHvXl=dKwnhho^U7tX0; zM#gKv^X2%Aol%Iyxb2nE`tP<LyYlTKyK#X(P0fO1h`BsZkLIT2ubrEP<OY0|rni&D z#Zes}$&23tey~V2&t<ZRi&W<v%CLN@d9NAQ&?>64URPDN>Wx)O?j~jNL}KssS0B~} zk-*_xDkv1$;oKnWS`1y<w`A=kckZm+AgQV~3zGE!J-RjX+p4wRIRrZZL{i!Dye^Wq zC+w(-l}Y2wG9|5}>qF~eA1bVFbp_bWRd2xr+u(8NcVWN|RyR-u+wUUr_C~bvBLV=? z25Mx=2>+geuEzc%!y$92Pp{G)y8iH$%J`q3_h&;aNG!l8!Y3jxMV+C%9Yv4pINO|z zqDYhpyc}4A>OEu^7+a~WP=vvOG(7Rdqb~D?3in=XaV*e1AdR+OZ*goTJNiC7RIysE zzxb}!hG*%q<S|$BsLo==d%x~-OeMZ|hQ}H-vhFwNb8TcS_94a`Zcy(d`vBQZWN*TK z3l2U9(wHERDqPQY)ODEDJHYHz^p9;)LQcp1+V1pXAeDkrv{zo)IWPb4`o)tOU{k0f z(CJB#mrtZ_>mnTHWpON53LCdAvCwZ{&}yaRiFNVbHkj%XDj>u+`C`5MT@Js*IP158 Sd35u!ZMN-rmt5dG*Zu>92mMh1 diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/glibc.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/glibc.cpython-37.pyc deleted file mode 100644 index 62b7e503e541187e630ba6fbf13dfbbd2fb3f8ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1504 zcmZ8h-EJH;6t+FHv(ssk{t&7P5LhBe8Id1ATu@ZXPicfuw5pm)MS*HG8GCmpJ2Rfz zo~9d3uEHDe0*Scdm3+$;ufP@OcoUJ-EBkmq+n<lmch3B<yqpkd&7b#Q{=7uU-}vXU zF_?S@-TVZDAc9t;ru&rQoK<X}c^m8p-iG_32t@ch*&m33h`>f-C}OZfaYH0vW5M=F zdh;J(BPn&a@&lu)&dRK;Tcz!&zy)jp^cebM=;kR5mYh*R&*=%7Cp|f2C-enrRzqTg zS)$h|!JnXe<QLd^81^(9^z@XRFdOyE4o{ic?b#Vz4-BkFCxYV#&!p{iWB8;h4+{QT zYE!C)8>`D^vcZ++Bh^S=j(MXj?+l=ety?2E$W2j}=?xbZcHT<k!pA@E?z+`U(`6HB zGi1yz7~RVE7B~;!olmq@+QmgyOmm&JZm6Zf^DZfY-q^e;qzk|U7YSJ?A=AL!X|*b( zF<Fz>(zJOYbp!!%H!tWj*!~yMw*dS1t8H7i+ilrydbX<C6tCvZo6pD7Z3B;Otx}b_ zI`vQAYUkkjRhN+yo{NcLR$(B+gfg1Yl^_aY8nJ{XOy2>#K%uaO7u^en*|HF<C+F-W z=mWE6*;yc1Pwo*Lo-+_D*dun(2WOE8&*>@c>5QqJ3uNFCHXDFY(dc+>{oAJx>-<pZ zN56iy`QYWJ>2F&eDx3eI<8Pk4X=P!hcuUZu(oXpoyiky1jclypo@%Sc(;IxE?AQDg zv*QLH27`DybWBUcY%z85QLY;Z2<VJ6xALrOY+1_}3)lr^W8Gk)RoAAWUV-Pk6)j(N zrIsRF&@KaQS$B2j=^d@TVvFH69(bpi%3_vX(_sx34APO|5)Ekt5`^?F)gJ;<U~ytY z2{8OV^tfUPW_}OFIg9mOtO`qe2t8B;1U+S=ophm|=Sc(oJ{-~?;DC3%?by51{I$$5 ze7P+TD!Fj+OW0|!L<zVRgIoF|m=_3OqtMa8>rRm#iqty=B`AWPjM0LFX?Xm{b3Nx) zaUreL5G2X%R9=@dNjS92vduYUbS1eOU(~GO>yX47mzA9IqiI=8fpDC6l|^n@w|0KH z+mn?IFLJZEt5Ry#wS1hHmD%#Eqm((KIlKeZ#R5sGPkZ=wEngGr?U==v)wBy|7h#Hg zn3(<;5cqH;SvKzA`y;bVW1uujsIl1eJshyQygojz{?wIAu-dgxoA_a^L|4g20YE-i QmRJme#6kRCd^^7XAMApJX#fBK diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/glob.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/glob.cpython-37.pyc deleted file mode 100644 index ccf2a33b79864033f66a324277b2275d0f7697c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3714 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 diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/launch.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/launch.cpython-37.pyc deleted file mode 100644 index 2e26d1e6703d0633c2669833e7abc6e3a148326f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 818 zcmYjPO>fjN5cO9!*|g<?5be#^Me0^PB2@^%6;&17wp&GR?CqK+PH>!6ca=RY9QhBe zIPsT!<<!5xiE#p=W6k7^XEJ$DnRf>VDFQP;4zHe5gnotOpAi6W!J8=riDpP*NeVo} z{gcdyq>_C_Gpd-3Zi#)R=ni2d$tN@!Z7$OfqBZ%FyQSh6YqzWnZ*r?^#{q@Qyedm! zBrmj4Tr8ZjX`@_QyQ(T0t{Z+`RjzSX)U}d)r3KezU0F9xAAt}$&qEA00*}DogEtm} z0~!v0CK4Z^EpoI2Qi1Guy2Zo2q~FNV&_e@0LyoyfMsBpDThfsZ?eKm4fVQ-w_lX?I z_<?Mh8+Qz5CD0SOw2L~tBOsW9;PK`n<zOG%LEK-d8bq&~sjxSz%hM|^K-Yq6$CpC( z?bk{fuFa~t1&Kzu){3H7Py5;<1}Q$tvQlW1W#<zbl7%i*mIY))8Bm;MvdRIls#a#h z=5}s2WNtiDcPgLk`TZ=rZgt_bX`qV&AI}0I&!o<sk8hL{&RL&0U}5w|**JWdStX>8 zt*Q%=D<8w}s^Qx<f#PK3_XdSM3qKBAnmY7Ffkoy=LwUAmDqChl;#pov^%L2bFyi;? z6Ia$JwXTnWm;>3z^2^%Xoi3Iq|JUFtEc$(#)@x5~YYt#Wa|i)N45yg%Cn1Mq9}mYK wLCwNaqe*1Lir8l%gnb`MVP$$MPeK^zle4mtZK2*U$eQp1ixQmB<VAx20GIpS(*OVf diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/lib2to3_ex.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/lib2to3_ex.cpython-37.pyc deleted file mode 100644 index 733b2230e0a36289954941d39618c6ed8cdef027..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2397 zcmbVNUvC>l5Z}E&_W9x@ZW>4w2%Jh)$x`Ep@`4bch?Z15U=UO)I;os&@7g)%{y4kq z*0G$Y<P|;wa>Nr~X(gU`;w$utnf2LmqO>6Pw6nW+vpciD`OVx{tE)bNmi@l{;?FW6 zf8k=@9GDzHmp_4EBqWS7E1{_s+7#z@;-qfqnz@sd(sEc%z0fmjH>re`r-YSQ`GT-A zFQ40?4{MKAU|r!htS#pLNb3Ih)PFpbDo^7vXTi7eD9#?K{F6Wq2ZLOw&wM}F3tEiH z`J14di=dNdFS$^0)(cqPQCuqN`~I_|SO#g%h6xWuE0$aatt|K^#e=>U0`}!u@cpSe zg5goa{~Inw>Qq-2R$*Z$d9QBi^&fb*)ls<s6VLKI(OW&PqHa9mLPlMYr_rF*Id1iM zvxBG1n+1~t=<+@YPC^R6SqR((32kOG2S$gvtOTRW$^d|;x1YpP4ON`T8#X(58a51t z4gEXlaub9ieLA6CI<bDUekA}ofs<&nZV6P=F2~E(9qmY-bhVwzo_1QIC$)9_>JK8S zp!E8SeU%RO2k~Gp&ZKH3$sRj7%|;)0kM<>3!-0ZZ%jIbjw=psiA2kN2x&k;w#?A(M zWn87>dvCf+W1+sd6}pQ3DenIdw{qgFo7ZjOfxf7qK=PW)%)}}z^$HqFxs(u_ci_d` zv-@xLtl03seRCOa4}1UWoB_?KZZEm^cF>G^vtH6(6lJZHN0IiUXvT7wSEJ};*h*$! z#2O+}LxE9Q!UjVw5Fk+kaR<7@iAO!#v(38>EEf&qasXXE0I}e4g;~tLpul9{uwk-E zaA2~BsVtBLhaKFD4Oxpe9z&M`#Dw&Lw~QWFL=71`p>i8XWle27dFo8)CEX&Il!ETm zy#!{%STds}+N#|5M5Zcmj(<+i?1|l9nZSAQIKMzq%Bre5U7f(WmsXJzZu8l=e27J* z7rdqcB)0oX#EOTj^Rf};S#nxm(^UppDB?CGVxEQGQ1S@bZW2nYgZJ9$=W(WYqeZod zqV_OO*sLm;*hsyz{F#qB$&m4)Y-s-~ufk0+%!~oBAI*I+anLKK$`t2$qNqa<^o3#V z&3D%wlMdSL#tE09H$O>Ju@rn0_W<s&3tb}hh+U<Qc{V9<0A?lX(+z99u`tq@+vrf- z01d<ILN@_z!vq5=d<<a^<`EfvplIKELSAg1QT#Tw6@>I0f=bEB_H)#C`z1zz06&j{ z+3F42htC&9tt`-O@ji&~-FXq3VN}#$sY`sMc*X>}C-8#d`aFUK`cNCOaA-QX0Ze%J zmN+&*Rbn0y00zOS(oN`Vbi8{7&@KBGSYZ-i0vN2CFi~)OMtkJkHrN1828Ra|I<)}_ zSR+cKdlL$X?3`H>3*I`%CGil)sXH;>PaYPySj}+lI=!Gml;I!MQcBDa*jgZPT~T}l z?ifsUN$@m($&0!bt`~|0rDf<}QSl~fwFrI$%k=&fPL)_@2mpmp`S6T)mf^a-p;@Pg z^^&-Y-eCC`Sgu8YVh6>0C`{eD5{AjhLu5ly!TdYktn}1ZbUDIgg0i@V>1=+g4V0!d zi4S3ut}MRHewMX@QjK}035?r}Nod6+<!ydw@AFv|{t}60uI^ZP^_u0`wUvJWns-TM diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/monkey.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/monkey.cpython-37.pyc deleted file mode 100644 index dcb2e22d5152e628b42ab514b3fb1f69aabec06b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4598 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 I{wd%2FG3#K&Hw-a diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/msvc.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/msvc.cpython-37.pyc deleted file mode 100644 index 994a5f70c3cfe811b64f004352eb7bc46ebb7d2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34395 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 Xr*p@01NkF^UmE;!B7^J8iQE4h-g-+n diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/namespaces.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/namespaces.cpython-37.pyc deleted file mode 100644 index 701d2d25b5cb0d1a533a3b64bfb4e2726a02b2c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3576 zcmai1OK&5`5uTn0HKZu5EX#IcFPw2~g&arX!iXIMu~%4l13NiHh}R1zpezh#*+Xfx z^V;sFED<Df&>nKjIX4P9<=5oi*PQYfe9Bin6e($yc!YkitGl}UtFNkBU#zXQEPTa3 zescJiwq^aBeq4PnI*(A~6I9&dEVKI5+8N93zRl_}r|)3Q$=uxQd(29llg7zP-~Y<u zF85wq+`F**P5f%`75rLBnio#L#o0Gj=>G?Lt^JT`Co7Mr$>VB3V^^Pp&Lb506jfsN z8Mpd2XV}r^&P%KB)_e55T6@32{r(DX_I=*stB^N&o3Ej5@pXO=?P}8I8~nAG)&=XY z@lBlJb=~}ZAyu4Zi5Rzb3t2rs>Q(A^z_25I4U{IzV-)#UR1<4vU0PE%VRD08-&l&B z*fR&C?xl6fzO$$H)S1{5>%{xino`@CtxW7o#w_K}nw+5z=u``m)d{<>r!IPJ!PVNt zy}&G^bA4iS`@;U)#?+g5vwIVl*8d5zudOH6pUs@m*&naX&z=@X!M4=)_bS}bThURX zBHSn{WK_k2=kZYjSt+$!#p+o5vdU7GoGHC(W~x|Vfo__+M>M`tj#M>LQa9qNN(wG) z+*`Y8F)Rg{MBl^00_p))l%++YSGYKj#Hi42mP)1F63cY!dx3pOF2ja)Ws(iGgGJgO zrdd+Nd7>TK&NEXq8~)Q0Z$teL4<D$!dQhd+Zd%)Bm%lhK&ORC*KahzURjMpAdA&=z zB(9psUUjZF=c}US@I9!Nq}yUXbMd#uTC7cfcEiSq-Dczab1)OpdsV@L4|IQW48w=t zp`)x5HiMmK&fNYCR%fuO3;Q!8^(O3+$)2$+*Z>YN!vSmNlcctJXz!0#pCoyCT3a)0 ziWR6AK2^j(L7pmBQRzl<2AHL>i&!@!f>tJ>BerPPn^e6;6<xZn-a$`qjfz(<_Z}n? z-VbzYTwEYCes_t-U5gfokf%^Fh>*MB?(mC{k!Lq*c7?1y*Ui(I8--XQiC`8Rzp>o% z8a2b__>DBLN}&RIE_VWTUL|NsIez~*mQg;G!9$YtP7@*1vWSSN!Cuh))lTq9IR2o5 zxCApm{@zKM7TxWxC`%PW$A{ZpID06<@yGQJS^5mKuhhl`52C1+L{Yc1nA01nH0y-p z-5;Ns$Ae?IfH=qWzvs7<)2Z{4k1{Y9)aJ=B9%Tv#glC0fC%C!cd}=flWgf{Y8FZKO z#WuY^;+|io1qY9ZXzGazjR#jq@Klh0bgS?%48!qbI$9o-!XWwo&Sc>4{lT32DNJ#7 zS}6H6C#<_h&B0+95Po?tig-FuQFQ%=od}^x9Y;}T2NTEdcB`N$Rge}zUd`84y*m2f zgdrP$oEvQbDOO5!uK{;}yTu|YR45L2g6%Hg&NzXWhj(+7+}9)^c-#l1h`2Ts1ja{U zZy06eAkO4LM<RLwrOu)8pSvlnn}(>wC&T|akzc<>WReez411GDFG9$-_@OK$0)}9L zz%WC8yQE)s9a4}?5K53F*vuozch1zCHl`~RPkb?<)X_kgak-5ogCwE+3+qi}<G08G z-F?k^Kd{d<YlThiNF}s~=$R$jGbuoj-y;dsaU3Bx(=7ogRjS}c`n79<C<iT5?UMWG zMh#Ht8=uw=xQYsy#ieWZTcpXP1tgH#GT1z+v}Y`HD<TOB&0nI(4OA9_@j60ugKZ#4 zx7hfnH-NmJa~8HGSUnVje}E3fpA%NKjwt@x%25OpV(^810bnUIjdz|PkBB0W2r3B= zC}{=dFhJ4_<{2|sCJ!X9HpdK+K7-qrMSpW4TjtkBtxB&9GY~W>>O|R!C`Fp-p<Tn} zVnp5sfx_n3D3W+#Q8v03eGS8I<?|c2cd%wat9MY*`-F%xWoP#%O#Fhg8RZ-HErK-B z>k{pYHr^68kZ{KTY6bJ}tMoJ}f_QoHD=2n?^EAnLppKJZP$Cc)a5hPJspD8J*3W_K zwH70LdwaDu1chsMTtL$8#Jy*|K_|Si0xsUI5ept7uH)B1C+_S7G<n`&&Eay<Q!z>w z8pO|m!9Ma}2d(%eDsZ!`fc`G^J>vH(@c$Yjazsh4X|-D5A55@y*O~Xjb?rySq*0_> zQB;RY^xIMNViad|^e8fUTHJ>=@iVGS?(S0WL#oL04D$t9UbpcARp}s4)N#oLo#q-r zOwOd_Er=YH|0U&k-*#<()AxPX-E>{w@mGD%%pfK#K5~vnD3Xq{d_i*?uVIHf+(nCb zI;hal8^29XldP;3*Itl}(mRptF=?XrhQhNKPPK3-01od@Dj~KZ?fc2mk%{kj2TgPR zBhp33L*9S;_Rc0GM<#00-t<vR#hl^xGsA3%XXNw$u_3{Kf^xOt{ku1;A1nKzCw_y; z;xno~r|Lbbj18ABn5A9zARVF@@AaAQ2pS1j%>zz1DR$6%p?<IFCen&9PuTuDVE6nv z+rvvZ5k*g?XGrs>iL3(%VrGnxyJk{8EsUSxKb24DIK&3C(Oq28{^vC@_Xsodxbwkj L-)=j;vwrYj<ky~N diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/package_index.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/package_index.cpython-37.pyc deleted file mode 100644 index baec63d92b487e5d635e7911c6fabf148363fcd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32662 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 U{b{&;GMk1U89J0qpd|W#0c9*QV*mgE diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/pep425tags.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/pep425tags.cpython-37.pyc deleted file mode 100644 index 1c1ddc53eb4bd5243002bcf5a90cb9178c5a3e17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7166 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 MooVNNgB2?O10FZ^a{vGU diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/py27compat.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/py27compat.cpython-37.pyc deleted file mode 100644 index 4b6d72a45aac9d9e891bf46f3ce7663c98b3f260..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 775 zcma)4J#X7E5G5sBQd9?NItA#$)j(sTUb3`C(G2m>1_t7#0t$f<X`2o85t1&Xz+-<% zf=>NQT03>_)~R>0iw2!~z}=D5@!fkzy*)gP30U#<<l~7)$amcQG1!wg;C2B)kc0>- zJWUe{+1Fm~Cq5;jC;DGV(v$wDz8Q&NzoYlT0}<hkS5EOu63WobWK;wq5(iL!AiOIw zjPEA#d6`$-scWT`YuMGMs!HS7vNUYoxOG{u$>@ynLNLjVR?@^jfDO4E($=@C&X6P; zW*__<+@hu}xhGrtK%ou2o5c+5LVcD6V6oX^F@G<u<tzDu8R<3#j<sfM$%QnQ<=ka! zRje3itM1N?Y(^afv<+9%rBFTe+A!aNv_2GkBPM{pzg~}BUX3eNovOk*C_ELnO;NvG zuE!QyRjw?xeY~ui$ywG-VN^Bk(H=hClR+)EQ`s{Stp86j&L;+>J;=~AJ-BQ77?9;I zgt$V`XW+XgwC%rB#iq_E9HC)G?*@w?TY@9K>=2*}t^WaRqgR^e*Md)<L-kK^Vg?X~ zaT}(oD6=$eqe^oJZ=5H`e`hk1wUeeWD7ItO`tuKyHn5F#GEa^)@=9S^DYuzY@czyu sPfYHNl&R%Q`G`oT5#<4!yc8QPr}%eR6x#D5Z{SB^K%@SE2L4m}8(Y1&=>Px# diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/py31compat.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/py31compat.cpython-37.pyc deleted file mode 100644 index 63078a910d139e49d90a5e68c777cd753a39c83b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1173 zcmZ`&OK;RL5Vjp}Hr=+Us(PqY4mlwr(N-;2Kow5`(iW)|g-FN>v3Hx+dDQmOP1PGc z^BX{1;4kIMiNC;!ne1+<piDI5u|1i`H{*wki#-BVd|iF_)Fb2vZe|pKvIA^iff$mQ zC>pbRNfJr5m-CoYazKi0PE_Z(XI@Z(AKWtS$9}tdvG<HfPx1>Q`9~J>x1?Ziz+#U? zouA;9M6_AnS9w*M#MF;7qf%Fzx}W0Rj2I|8!1gu>MPe#R%p{FH$)tBdVlKJtz}k_% z?855H0Q}Dx{O{~rFPzeAW$Msod8Jk8W+6j4iy5Y6;ndiLc~T@pWi~E<Jjk>T9sKOd zP%5pQ3X_3T<}@+#PWXQ0!c(+Jv@OGISd>PEyL(|$NQ{>0#9Vq(#+1f}Wij!SmBpVZ zDTQ>AFl}fBc?oP+K}d2=1ab6;4ahnDL~$nxlt}xL*YG0ARTE%EgG{TYn;%QuM6BUf z=|STkL!v|bofvHBult)WuQsc!TF(mW60O(eNnMP$28Wwgxl!fHQroL)Ro~r8%e+e5 zMpZX~5LuBqAyzOw4uVjho~`}c#EqHdWo1|)@*`mDgE%Kg(>kcZk|S#HxJ`5-=3v{* z38A1jMhJw%B0z+m-MlvB)G%!`13O%??l$H&DD|=<p8>-o7@;q$9pM#DoChO(Ycj&q zAw|?#i!<x*N4)Xv;mBpW@lEcGQf<ObcX#gzHZ|gH=1o_PQ&(3i4nX;k=+Q)TCP~%b zWdW3Gj8LvYTDE<Ml+k5+<Ntt8?E6s{`+$uXqUi~dmvW?0Ul8JCl<4VAR|r|ALKyUI z=20x6Ks>Gp#JGJdi=bG%3_6?zJn-662nLQ|P{2RO+L}d(s9cij#9Hu<5Vw}i{BwNC hu0_Nw;PEw~n&93f-v>Ag_67*fxX0KMR36ZP{RZ3@8$$p9 diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/py33compat.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/py33compat.cpython-37.pyc deleted file mode 100644 index 22947cc1f1cb43875d3e743ec9ecf1ac4956c252..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1384 zcmZux-EZ7P5Z@1fo#RWJ644Y8vWnDjQk$si123g&N>42kJrIO`SVETL-CTU}+0O0; z<s#n;*GHZakBN|w5d1~^%2WOYUSP(jhzh#a%+8KyW@mmg_M?73B(SPqHop7aA>>ay zT&@6whd}x#V1fu*l4QBlgm!0^uvyeeJmD`$wc!xy9ER#XCHM%M@K>Z_FVTyY?$k>> z&=SE*e;OnKC9;=<lAWyxN4V!KiJlPQ3I8<_{(>caxhjbWWPibvD<E^xlfl{5b23>2 z&6=R!kU@9>xslO;TCR%|*j5hAv`m{!X{oIHWwWEkr(xaXwUBY9#yOf_E(XFwApHR_ zNwBDd2`boYl5oL=13M%J*Le2IqnVKyCC%$;lbIZyap8{i8IVRWTiTKossuNRi8<&s zVAj#H+*cl0{6-XF``4%2X4-5wMRTX9w8_fyjyRfCCwKP`wzV|Jjj8KWzbQ7ed-s;t zZ#6R;q-jwVCQaYLtGj&Y>BfKZ+`2T%DOlmctD)5dq0oN-Gvo|f)shLFuyZ!2hA-s> zoioAa9LPEOq2(<*B<fcvkKZ73w{?v(aSvVfBWeV{PHtf7fEr4|T_@K`3-a6po%acu z^UlLNWa?+*PXggX6u<RaUjz%fPUg<httt||&Yq*a>9ua_E!cAyrK4Lfi0EO%PanK0 zWGUj!kL%_(bab#8H(8<L{aVE`%MaqZkt#DqUByKecYUw-CNekiCLT5|-BSp~MaK}e z3y4oHI7)xRDhQlMgV4H}QrWEQnDz4-8ZV^frK~I$g|_{tJI{yd&eu=AeKs8J+GzN4 zcQ|@He2glEac#e-j2ugqnpq>YLeK|+^6{0s2jiqIm-W8ojZrp|Cq`C6iWF+HtZpm^ zA?cNMHSYYoky)}HM!@bHh@HL*CmjPL{3?x@Lmd{f04S!wX-FgLa0leK&PEqvG;lFq zl}%-u+AvM0wKy(Oj?(n#I4hTL6ppw05E%~98w@j2F0gAr8Ve0*z&ni%E+^6k$CcE1 z*2uv%wT>QZ!0bw1mnHNEI;O3IpRZl{eA?8?43(-?vi9${u!SJ0szWz<|9|=|_yufD z>+b<;?51@PciV?@q{;F!(;BP8S_FJurR+MgOwu2Ni7`suM91*y?z1nx>i!|>BTV!y i<=Wu>5~T+?NcufsP&2^H0Ps~BvIv{OBEEVv;{O1PcU<cL diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/sandbox.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/sandbox.cpython-37.pyc deleted file mode 100644 index b854f18fc15260b62d256e85c72322ca0070e933..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15500 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 GIR6X2qmhLG diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/site-patch.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/site-patch.cpython-37.pyc deleted file mode 100644 index bccae15fcb773254c096058bfad9f3fd9ed4169d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1466 zcmY*ZPjBNy6rVSCY{zlZHcd;5IOKp-<<J&(54(qM1?(c0OR2P#x*N7K-i({NacpO1 zO8;nlAq(ds@c~kCfiHme$cNxGCnQdL;RE!5c;l!mm}uV2d-MMM-k<ohX45CQvY*$E z{_zO;%P@C~;^h<E;sYd%FnCS+BnC!Dl&{5PN`QP#nDvbG>;Y<2YXxZ?_hZ~5Ko1NU zNl7_Bp#%k|bY?Mn10_|Ik&!3vDROEv3%x#6R6HD#l4gOTvl{9;Mo+qmFgqbrtF%zp zlXXR>==XcNPD&fKyqPZ>s9C#sqwFW-=$Fz_j;f8QkjfE1Or)}AmNLFv<zmb_f1})4 zz-lP*lvhc9Q{Jp;BtZ7bL|%3)<gK!<>PAyJL%5+Yt<o<WWpGHcRh!6#k<b4ItOJm9 z`GREhIZ?jJiQi7-RR=B6qw-Zl1vfU3L#(3mXNxze|GbKFh(4Gzh3`NvF_(F-iOKH? znZgvxW|eoH0p{Ieph(!hSXC7BYn6^%R%i$08YTyaXl0YrwrV{f6t!eW*$mdv%S&1= zl#7g%OIX$RMLPF>^a|}e#vb37%Z}=(#Sy&*{<~T-=*<ml+(ryb_|_ab*C76Q_x7i1 z&sIz|fn*)Luc{^FC=k@}A7CuR^b=xgn`k&U*ry$&I46z0w`NMTzyIRk=~sLEpB_Bb zweuvqe@`zLkvs{LaglQw^KcLiPGW6~M8;PiKF-flmTk!HagwpFJc+wJj?(UidEMxa zb9R=-12CR(nW?pLKf_&3?hvbU)G0v{g;ix_9kCqKAL+zKMDW(w^+0>$XcQX^J*w%} zN7_c;<6j9ke~;To+j3lN7fG?1WI{%1y2&P&*~Q1lC)*;HXNAo3RQ&IX)|=>UaI#fg z-ugRfBIF<+7rQ-!%0P6;)%#)iD$nKCPMQy*RP5sAPE9w$FdhyuTFfPP48-@eB`$@g zxzKK$eVgz+)7CJS+AGpX9_M_lYobUKsa=zXhzsrFb0j6#wvlKnjWg}CglEw>)?OGM zCutmpx?##1&daD9X&${}EbNDFd|5T+bIx<FYlAcw*cg@!ByS=v?MIB6MxbBr8i5lP zMVvA1%+dE&cnigR!4Q*q-zt(p-xZP>RQ=lc(wLf$hW76IuN?y;=G=UGv?C-oe9Tu3 zQ)96haNQVX`FR#rscI)rS%HNC)~6Zk*XNPL2#b@&=arI%Les3M`Z*_!%JsYlW(dSL zNC<fN3t$x-8qfgR5Ktd^3O>qlBWF{J_cdr$x)dnwpwyuro&ladv}lVif{mI1+IP$g s1Xh4@zKJn-4ar__&X`7+hJ@jNu$igj6+mxi-k9AAqL~Em3lALl7vmOx_W%F@ diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/ssl_support.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/ssl_support.cpython-37.pyc deleted file mode 100644 index 87957a28e83ccc194b185bd3eed8d445f845352c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6756 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 VMF#VMSD%}myIS$Qa&^h8{14{UnX3Q* diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/unicode_utils.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/unicode_utils.cpython-37.pyc deleted file mode 100644 index 94f89d19e3f660e8495fca38a0f866496b7fe4aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1133 zcmZ9L&u`N(6vu5RP1CHaU>j)SfO42XMQjzf9T1ve<rt7ASXXJPqS{@<QYW(=)>iEa z{*X<a_?L2p3;zNq-gCMi!ja#zofkXr^S*w&z8(;0^2he+Z-<ayIJs#I1_#jfJ{V3o zO-aA<v`=BqQZ{k=4kg^-?sw96d5wGEYrM{V@E)f}q}})fUz4a!OGhWuA;lRq^gi@= z(Di39hAfDoU)VRMwvBV;a=IYb?1;>E7UZhN*)?5~yY(eRUwPH)F_Bv?G4=C6eWb84 zB_~9(9z?+LPSkgz_lNUZVMe?AZNCf>ok(qBITQ*rEE`5l&A`lZQLYs-8D?DY*u-T+ zW@-|r$y}5k7r0z{LR#PaRK<0b$`oYg=CK+7Bx()z`+Lwalf08B`K~=DO?UalOio{o z#vLt8k((?__5I=M&_Q96RPW`pvVq4<@=OaPq&L72+JuME0Bj2$kE(T8y~XLmqygRH z?7`q3&Ibqr(Or}L38zcCpq!4_l1=v(?2w#3TRO7<AupV3s2HI10A*C6ynJy&E?)GY zA4A0v==>xIp>?G$lnBi@Hef_}mV6a5L=a)3!wMLGX+xtAQ8&CC!)uv^Vw#Jg5j?ak z6L}V1X6jtqz*Uu^c3puOiLH;q)Id8kT|PP!W|X7?#zstTzE^b&*jSb1&{nD{jH^)G zeQ%@(5L^bsSn>pFD|G3=f-P5Nnz%)4wfCU<`7Kzh*n3UtvL^LeU@Op~Y7^cKQ9anu z-%5E0CYB~y&=pMzG@n*9@kaFECILq_@0dc#a8>;~9Emhp7>A=m4o#BDI1N<>(vTu* zGll2e=GwJtta4?gr;P%f3gz;DYJpKRWB?+54zD$CLm0{ll6eecAYKEfT44GQ?{vBc qcS9&yRRR@fQ@5YoI|FsEEJOeGB;!RY-r)V#h~EcpP1kSwoBse&BN1i* diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/version.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/version.cpython-37.pyc deleted file mode 100644 index 727f2e65f3cb25c93d3e14272e2c14a8f792c394..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 292 zcmYjMJ5B>J5FL9LWwU6}mbpTTu%w|t2q7d|8VX<~WRchjW*yu31KC?}1W+oj<d%vn zP+_AWc%zwlBfWW}IjgD?BIIUt`x5&{8h%kkavIYf#zKK20WI`3gI7fH8+yQPb_H^j z1IxS893V(Rvo^Z{iLayn62|#w+=Yu!TIRfVN(mbVUUpJF%kfUAbhjjiS>?@~*-$T; zBa~Zb_{=-5WEea#V-wjWWJ?JN!}Il==_GguGmHm*%GXijR=Uw#Pq?)1PKXJ8?B#m8 gxNrW>|EF8WecgxRc%`Tp>;y$Sn_e$4Mm5?)-{aa-J^%m! diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/wheel.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/wheel.cpython-37.pyc deleted file mode 100644 index 60c50794719fdc0d74b77387497056b7109ded28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6945 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 diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/windows_support.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/windows_support.cpython-37.pyc deleted file mode 100644 index 80dbe597d20fcbe8ac9ea551f3f69de58df4ed34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 975 zcmZWo!EVz)5Z$#M$8l2?DiA#(AIYJy+Db^Es-hvOS}96V6BNl3a$WC+II+F%?uIl~ zdZE4X6RkM$D|~{loO<TQiCIU13P#$Q=h5uj*|+1y>Z*;v(ytpIzH12mP#;Uv0la}F zUVtNr;23#}h&@a+qTe7-qZ%<t=>}b6PbavGYUVvuqfUrb08<f|(OXzz1Dr&+_zu{{ zI)AcY>7qG;okk}w_oI}ssR*I2Ftt-L_^^Zlj;Ko9`G#s*ZUp?J$j$LoMXuT{+^>c! zlg!PcY%@xQ4B~i`oX^sWt-;V0R8BI<SS%jG>EcvhOtOq|S<hy<wHpV?8432vK>HIG zx_rJYV`)6A@5U?)VzCEcQ3wrLSscg#<4JCcnUFN8;oKNZ((rF{+ytt;`jDyw8KKe$ zSFwe870@5~)ScDM3i;XqBuICSF_L(sjr5Umg#ndDX5q^NZH|4bz!g9?(XJpfM|163 zyVB>nIF$Hy<qmzuL|2kuez6^}E|rcPQfC+uLQ^M@l1FC~NgW0s&LD~bafd{lhLZ7F z-7a<=aF#ejDYMtE3p$5m_KEUA%%=5_CGPoz3K_9fxLdDYZf|ex?6`|<r&%C}r%o~v z(mA7!q!+SY@LjHja+Xn12XzW?ub#hCtLC=vM~QkG-_OlOQEn;?<2bj*l&3V_+4k1q z8VAtp{<3}1_pBwCXSUz<yS)>y)a)OhG;<4vrZ~hi8pp@&yv(6pINh`QQQG31@tTnv zs#Wjtf4uqAgQIrK-|zKKjvDWKE&uSS*=%)kom2VmTUS6->MIRb;5OnBI8?E)jn}cQ u8Jdj^%%4H7X7CCGzNVa-fg<~Wtr+lPe5~Dskx5MV)UQ#Dj)g7VGJgX%)B3#t diff --git a/env/lib/python3.7/site-packages/setuptools/_deprecation_warning.py b/env/lib/python3.7/site-packages/setuptools/_deprecation_warning.py deleted file mode 100644 index 086b64d..0000000 --- a/env/lib/python3.7/site-packages/setuptools/_deprecation_warning.py +++ /dev/null @@ -1,7 +0,0 @@ -class SetuptoolsDeprecationWarning(Warning): - """ - Base class for warning deprecations in ``setuptools`` - - This class is not derived from ``DeprecationWarning``, and as such is - visible by default. - """ diff --git a/env/lib/python3.7/site-packages/setuptools/_vendor/__init__.py b/env/lib/python3.7/site-packages/setuptools/_vendor/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/env/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 2a3f5895c1904ef8002d54e6f343fd515fd19464..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 154 zcmZ?b<>g`kg1p5Nu^{>}h=2h`Aj1KOi&=m~3PUi1CZpd<h9ZzKg81dEUy@s(Uyxa# zo0(T!l9-dDn^IVrS7Dfzp<kR@Qd&@wpPy5V%#1Hf%}dEI(vOeN%*!l^kJl@xyv1RY Ro1apelWGSt{4)?U002ZaCj0;Z diff --git a/env/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/pyparsing.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/pyparsing.cpython-37.pyc deleted file mode 100644 index e279403cf14f2c193c519e074d324b534dc50031..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 202997 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 diff --git a/env/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/six.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/six.cpython-37.pyc deleted file mode 100644 index 60d07e96100e45fad18ed75fc8370700d8700776..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24355 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 diff --git a/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/__about__.py b/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/__about__.py deleted file mode 100644 index 95d330e..0000000 --- a/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/__about__.py +++ /dev/null @@ -1,21 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -__all__ = [ - "__title__", "__summary__", "__uri__", "__version__", "__author__", - "__email__", "__license__", "__copyright__", -] - -__title__ = "packaging" -__summary__ = "Core utilities for Python packages" -__uri__ = "https://github.com/pypa/packaging" - -__version__ = "16.8" - -__author__ = "Donald Stufft and individual contributors" -__email__ = "donald@stufft.io" - -__license__ = "BSD or Apache License, Version 2.0" -__copyright__ = "Copyright 2014-2016 %s" % __author__ diff --git a/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/__init__.py b/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/__init__.py deleted file mode 100644 index 5ee6220..0000000 --- a/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -from .__about__ import ( - __author__, __copyright__, __email__, __license__, __summary__, __title__, - __uri__, __version__ -) - -__all__ = [ - "__title__", "__summary__", "__uri__", "__version__", "__author__", - "__email__", "__license__", "__copyright__", -] diff --git a/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-37.pyc deleted file mode 100644 index 1c46e2181ce598e61cd097882235e7d061ea8a39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 690 zcmYk4&uiN-6vyp2KO84%v#pdJwZaa8HEzl%V~o+YJ&sZc>>wDz$&+JITk`ZH%>H+F z+JCcit~>2t*lAA<rIYZ7_rzCU={@;sGD!j)^2f`szdAwi+b54B#^4e^bBBNc!ZN5r z8de?JsUjMM0dydOF7%)e1BhX`iD?%S+Jh18!<Y_WLSs0fLpY=fOz8-o@!@em$MAd^ z%wGIK*I*Xy4zra}rL&xgs#e<WVh~$lgp#|1S_^4e?&R9~e8`v;w&aZMMvNI(Rhe!u z88GIw*spH6_Ioi&7|Wb3l*Sl$@+uSMUQ>!Sm&V&n7+b5l(PC3rFRQcleYO#D)1F)_ z&55(36jpFUa;3>#gLabaMclNn3TtcgK20~m7H&0Pt17LVI!m8yx{HhXyLNV?WL5%M zT9@aRWD<ywzD#ggN!ChQEmqDdZQ3b3NH5KUbS_kTa<#l6c={)FEjanSzx*5WWnU>d zpP#kI*N;_@^Rva<Q^W;%ZEj~1--g^-r?Fg(PaNpTql@r;%S!Bt?)jy@$H2qCydHY^ zzeA5a#)zMRp8DA1?`>+UI;};0Dx|UKa|+)Y`F)WWso~buR;kkbAF?f%p!8F7Qapa8 h95#MlH@o;lrNEW^qraLtLL5a&m_*$WX9uTe_zw?7&WQj3 diff --git a/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 54d85a0e770fb8d6c796981131dba7cddd68884e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 528 zcmYk2xo#UV5Qe$C(w<re23+_NtioBi4}u`Q-6RzOW3U!i5)oeJAw<uU%CEGoE5Cv( z&sd1z0r+8toa5*G?E99XnSYn}S<cuq1^=x^=Leqf8zGp;6w?{cbk1{K@FHU(7lm5r zC12{2m%8GWu6eB+-sqOMy5pT*@fGGR#8Q-^618YVE4p3Hd$Ib(*8K~1X6s`9GCl;W zQk+0)XMLP&ArCT0YvwcOrHQajW)m@f$*7{9TYxdez4ZWd53sTB=;dx7F>C-PJxYac z2cYC;GGRIeA!$AO<0&c1sOY`|NM4>24wI*;0KUUHo|fZRgq~0mXf3`WREWFv8EM(3 zm^?P~xJ2d)!U92B#s`~F)~T3EK6QBS|32ws2+0{0ihpAMoU#e8w?ou!aME2%6C%D} zi^rq+d$ZjSVT#E`YgPE{!eKJP`oWExKjTiC-2fnsL?K_@ajw5<E0UVNlgL2dy2!7} GHhTkTr;TC& diff --git a/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/_compat.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/_compat.cpython-37.pyc deleted file mode 100644 index 73a75ca814afed34d0a366bbc1ae6de04714ce6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 980 zcmah{OK%e~5cXq}Y(ttHs48BEa6#Hb69Lz%LV&~tRY*uktU#8#cG{);s_kt_RZgwc z{tOT&{*tep`WHAc<FuiO10&6NW^8}+dB)FISNjB{`hMr*2TsUO46cQN^9<C!1EYwd z1u1DtOO~>dr<`Jr6;T@L=u=0LyF~GQmUfp>1W`}-%u5~5Xu48$bstyNQQb3=-csx> zNqU!nO%m=$a>v$1>$J$rrZ&#UDnHC^URQqDn7ndg)>fH=c>5BGT>@K@QM?U;K^L?K zY9E1lMb61NoiRlfJBt;&pr`x`bL1;MVT!9LC*L9{-#MQ4#~?3^mQIi5ct=`2&I)Pm z_$YUKkSVp3Au$OjGXP%-mPN7mz-W?EMN)RNaLN^jGSTrvL=%6oHj6rwh25GgQ&|+C z2*DNgHmDtdxu7TXf}HSEgreI&0MGNRus*6}seRw=<yIhZ>#0hZ?=1WXp$&HA*XyY( zn`x6b8+m1&EQ$?vFt0v8p6yMoc5UP8y0AB0ai}X*n`tAneYu-gyHk<XWh33Bnfsm) zl|B;U0TRSn5PF>a_kEMATid`s1|O&k;rl|AwQ39W2SOaQvRLex5#R>)2{YIQvwEE{ zL-72{vUB$#3_N0LuxWneH2xuJ<|0h)3dTon-sk|F@C94|#ykI33Ppy0KWhyug*o-s zxmkxO8Q>FUt!oWD!C*HG{tAPqJhyY}2Z!3=KNfj4t37}7{t23=u<48+fPwZ3WM+Lo iOfF;sdSG?K1WxhhqGMZF!eVNT#e7JIQAA_b<-Y;QsP`fO diff --git a/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-37.pyc deleted file mode 100644 index caa2b44bbb6abbaaafd560dbb2ef0b4192af6259..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2832 zcmcImOK;Oa5Z<*D$4S#BeL!0fNSu%*+6W{hBv4fz0&$6u=qVCfx!z6c;@IwbQ_-ro z^uYh%#9#826MumdGn=|3m5sxr8|}>6v%BBy?9Au9SX^unXyKQQ51*@qe8Y#VRba3S zJ$VI!6HWs%q&+$`ddAS~nUuUC+~DRp;ijmJ&0bYh$D~(<w-sK6w^jYt5*EC*xb>bm zwePSKam=*k?k7<&QiA!zIFc&0xqs{@eiWulvGha5`lHZO@a*A=tQj!ag`Vtz5Tr*r z=^31I<DB$NZt@Cfz~&a{Dz9-Hw8iVZ0lLN)coVeE7x@zCI&bkd=muZrE1(znDtNe- z+Hb?YANuOVqX2>pHTIX#6ATKcFw^Kt2pIWF9GX@V5%i@6k6QeA*HOc`6Z`R&A12BT zf-Qb@5`KEvKj<Vvjbar=K{7pL$0FpB?8L73(H;2Vpu-X+N1hr<k!;5&sm+)av1F`{ zPGB4eJzdUR-Oj8tKASK}``m<qB8r}oF&(4twCfmY<-ko2(h6?tP+5aHzfK@+ctlW~ z!x(Om2RgBO+8vmJIxkSK^~R2&LDFiZ4urglWib{g##&QIt*PUo?ay%JB5ak1A{bjK zLIK+h%9RkFK?o1&*vLZIfRx1x4n2|9VQJtd31b%rEpk8{F?OTC0kq{iummd<$sA~s z3m0S?Pq_@D1T}=CZ4{uQZ3Z>(68EMrvFL0AxTf0$C}{gnDB$niA{0Ce`i~9u%vsb$ z+-TbFih-;AW056UK@HRx3&nu3d$3hj0_|)K)SWhVohBAb=nerrZ7?>B_$a_}ld+?b z8%!(`i&tVXNxV*p$u2P$<tmCb6qp%u9mOS`Oh#CdnsKmF6I^8*wmJLLb`MOK4NGzt z`ZY49yb1dkhx~#pPwQJ*)Fz3POF2414*IJ(g`RF+y{5mRI*H#nxd0;nlJ%85C_$Z* z>q^T+Uwvl^Y(3|QbJ1Nn6eifCGAJw<9c`G1`uChS7vbonep~{4JzS?t=}8InT!c6C z)ygA0U9e9}pypz|aww#QoieETs85qbK_MXVJfDKu$jQx&@g#mu<R*$+DE^t;kVo!A zFCsUzcbyvYYk!3QjNo4nCalDamH5XjwW9q);VFGY%}aSKn%d7M{Jeu}5+v3&vwg>c F{u4D3^ydHo diff --git a/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-37.pyc deleted file mode 100644 index 7f0dd459d143a551ba2a2a85f743c06e7c802c0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8837 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 UE2jUVX&<l*d&oX&+xF!D0fX?!!~g&Q diff --git a/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-37.pyc deleted file mode 100644 index 64edc87fd2f0ae7b325196bb55e1e330a2877e29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3839 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 Ymf099gIYGrEQ3;-0UxWZF|%a-7bAb&b^rhX diff --git a/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc deleted file mode 100644 index aabdd037e19cfae1c2ad7224535cf994cfed4015..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19758 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 diff --git a/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-37.pyc deleted file mode 100644 index 44f5743098186e23be9488b68f5f01e4a42215b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 459 zcmY*VyH3L}6t$f+jSA%<82E(<r4h^sA=ntYumx3C8oR~9v5oDNwqoQ%S|J90$tx4T z&<VQ|Qn}JOzE7QdecSK%fH(1RHu{7Be23uABJbRIm`hIt5XeCTOW2?iHBlMCkV8B! zV;ZkIBwE8VAu;K^gR)D|1IUseKL@hN9adu_d21<Vjgs2Bl&~2yObU0PG!qt2T2Wgc z50}Yfjt8Uj+Ap)U@Wvi@9_GlC1uID48(5<iS_3bGh8viBl@nZ7LJC$_oGmHVbV}zg zGVR!PxO}BLgDw_TL%)CyH*f9>+o(b@l`~;%#d%I%7Gi!ec`6LGt+G;bv+Lp+6-4Sn zRrPZ<Wnx;imT@ys3wQiaI;iZ2eUT@Cbnvs(^{~IwwwhwBLq&%V*5NpZG<DrtHi~ho elaLNG+dX$^FSMptjU+9n*J03v-cyuDz33OM#&`q( diff --git a/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-37.pyc deleted file mode 100644 index 18fd553e6ecd7437329ca1ff01203ab3caaed12b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10525 zcmb_iO>o;tc18mr2vQU+%kuAdJh0^%oAyZlS?}(Q<H#P*dUieKaJ;r-Z*lB}AvPpY zf=Idn$u>h>qS?KrD!1g2gIGD`o_lV&rgFt8RmsIwsa%pn%7-N1djKeslDx{;WObv_ z{kr@0>(}oOeS3VosNvWA+hfnp&S=`d(o6O$pl}N*{2ydelOoVoMNO>gHGS2n8G`Ec zz^s}4%++%Iv}%?#q#5K_?V1gkoU~+K+On{is}+26t0;?dOqS%hEXxCOV$tg9wJ~{6 z=6=v>rC(}tQrbUg()PzUjanJ+hvXFAr~CtWpTPTJna6wHpTPS;-`bj#M|^Af5Js7j zNAW*~bX=bJn_TU%{79a}s7K_-@)Vv&<tMdc7{QSiMzDB<<MOmTgSHbq(sWPMK9XnU zr>Hq8Ka=P1{8;J_waWQ7pn+B~;sf4%*b3Gn-)*e6TPlie*;sFcjaD-*w^gGVxeIH} zdW84t8$n$}Y~O7zG@6a*b)0K^D)i(0V_$KP@q7NFSAU(omhU##y`Ukp_XCgbJa~Bb zyQ+Ktt4ELSJgCODn>FS9cB{S==anD$9)>iezaATH<;P~b6-IF`Xw|)-P8iUSo;K3g zNa1J5UfYq@)i%XL&D0{XQdEurkkBGMsr?PM8_U)^|6FwNyH9vK(UR{hHrD;7vz{!# z2_r0d(eawnQGT?hnvUN9lyW@hdOh&M@cQ!<<L6Fme%Y@_JX~uKV2B18m?QnR-;^|X ztLZcrcA2{o@>rh3G;{9Xx$j)NcDaul&k-<vv$|RCP^}n>XrYMn6)`#XD4(wA?=&@q znz#2ZMXT*g?M8d1(F`Lm2xjDq*UeW~7M3oBSZF(HwSsW4=z=V=r7pF-`ii#*yf39A z&bD8xJcc}m6w<t!r3+h>MV-pok2dHQQaFLk*J?s)HC>9D!Q5vsuAOff|F1xggio?{ zIWN7?S!k^_<>$^?h^=wLrPf+Nd$NGNh*}wOG6I<3B)93U`mP%nU3ax5*8(b+T=&JA z7o;tD*Ojfh>oP?Kvco`;5jsl<>&R?lXfafEi`woX+g^;+ahwbi4tSa*81T%IaKO`& z1zE&1Pr?CDn*;=&1ric?7Ue<k<0MeL4Sr9VYKXsSR_1ToSK{tvLHu12)ruaQOJ2AX zo9>GL8oO<Vey}jIA|eR^x$ftLI*q1@&f&r7W;2L7w*r8kIV7H!wyvvfX<Z=&t+hvj z!>A4cQ-_C0%n4n9uHY3YGBUtZgt2Jt!0blgt<Fnt?lOA*Cz96rbOf&;a^2Y*eCWeD z6cTt6K5o6W3bEr?boDWM#<><9(9tO@*QFsY0U}%ap<SjJTFZMbJlUIc;p!92tQ^Yd z{3RJP+G)K0gsRRU+qrJA?QZK<(|}HwtcXuXhK*^#=zA4SdoCF5A9BIO4*i{e_kw>$ z81K4Z|HY4AF!lZEI~GjsA9BID{V({-Jr}(A9y?5Zzj()jsr^GP*xdhuZ|uF`J&y8z zSb7nC|L9!{M*D|cu(AII-`sP-&G*=0>O1$21yg(7008~yN$G2(@FX&52@#1+JuF8! zoL$&H%SKl$8=J{dt(b8UrX3jo&AP8nphsM;wxYYM?Z994n~^US4FiLML@Udg*jn|Y zrIs9#H@taY0VuSPX`(1heN?%mg1TB6Q%7jHqm+@^piWWtDP?54sdJQ_r>sKR1<Ix= z+ZLT%V);o}69iipwr(4Pe_m4^t^FU-=N3}<9N8bz-9DT4KfsQx<xyr0j<St1YjKnd zD6=L<xrj1rbChB7gLfv`{u<&)(vZACgg9-`rs!&}Aj6atI?9GjbSAdPfB^~>mzr8} z88V#=YPY`HhNe$8C((QA5QZBd5YdKIJ{jh&`z_u=6B+GH=g5#r3ay_24OtsxurZpn zpFk}|NhngG6_GH+_I~hmFsOj9>sA4hDV@Wkb1}rwRDC@=iGEUS!C+6!^i9!YBfZ+0 zx-m4&`9Hh7QJI6cVlA}Psu#tk^4m(y?u{BKK_IUC>jB($&>;aCLhi@V!D_F~2aWop z{#1HrY6$<?1mL|VD$T=I%(&w>1Jj)to^B9q_eqI2Qnq6z+I@!=?a<SKc@7QFv(qW- zlaD7zcJrHe%n*+^LKkjc>i0b#nCqkAxrX50v8a8_S*EezRi=~5fk{v9oOBzoS}Bc6 zvMcDT$mmjJh{SeVwc5UlUMseEeohTULq%F!u~D#nhPGuIIc>i}%4C{JGOc7L|IU%~ zPvu3Y>wNFcbe>V+>1@}Tsl=k*vEYb%!OUB6tCCY>ug7^1bG_led@E*RUDeeARQ9Pw zvWQL}Nk|rmuO3C(7GzLQ{6c&7%?8fl78FKT^z;qnszj#$imooapc0}ZztfLv(pa(7 zuexH(lx9ynhLioGBy(MHR7=WF5R0G^vsb<vi&;f;#>LB5uKwiOPk;9FFTQ+3eq$^y zbgT=!fJ!btnTfho_OY4YYC<XDAji3|9W<i&lTjcX;J~Z1?s8YXc5E#Ah!u1e8bJVK znQU;x4?Go(3d$*$BNy3GqPHkiL=_^UCMHBlF9}_r(93$+P$W+KL?q6p#M1KjC`hp( z7PSriRX|?amgqr$fSgY^jIObzOT8!5QWt*Wil)AOb+W62cyNV5NE4(*dCTY#5oe!h z+`5pq=Fp0A+IsH^^!b+AHF^TDN1kX=uB&f~4ISI1FOYt>s&D=mKSg+Dgze-L0?)+u z<@8svcsUeNdFiXT2x9<ie~B;$;w`OqY<X>pRKz(%1p>cfCW>YpgL1eBWV(y;2tn0l z)NLY#q~EoiX_{hE6m=VU$w1P}!qyqe`zu4!*zsS#$&d3luk(}QGAN(FdH)6ngXX@! zJoDwVi<Q%ro7A+&Z`xttff4TCNY8aT0LFYen~rs%vU8YegcUgG<b?hrSwTZ%;W*9h z?6X(Rv;+8=biDpJ1pWPt`*ikMvf`{aEfw%?Fn8YT&UfowRquL1dkHUo<aN<RiB5B+ zvhTr~8Qr$$s%#f|N=UT*uL(;6d`6=oG(g#zY(TepC7XB{*Y0SSq4&K=L-qZkgE>N> z3sQ8|@ZkIE-n^P&woM1>xINSefe?G#KYg5O#P-&ArO#e_4tVT2@@)+ES_sjA!1vzO zWDH{Riv-Lnd5%;CpB~gFSoCWu7b^V&HSI8X7I!Pw>F{Ph656+r!Y;DRa`p{~ec|Vh zLKz&@d}G-{%HKw82obI%5>`kfVZ}5OHs+W5mh?EvnI&CDIkTh>pqyFK6DS{)lWc__ zl!qYMrZ~RYF@O6sywEX`o$XuLkR@6X>1#stUyzaM3XKL!5~5KLPel;5q|<t^wf|g1 zCWL5?Me-Msm6bO|Q<p}Rmk8qhKw=i5yq?&yWuElnCVEB%uC;p*wrDM2G(D{=rgdXI z(f&QRmIhkK)7CQA6}kNY;UXvg!h-ET7L|bU*z!2%WzG+9KEe4x&L=ks_7H2-gVoNF zG_IcQ+jZw04CHf)gtQ_Htgov`;S-5MO5}ufwP$6hd3HlsUF(_iAz}m3euV7w*~_tL zj0pI*g&T{0(|^@gbN@tR(ZHtGnN9<jeV<|=c9p@aGGNs$WKbX^?UF|`w&+yjHP6rH zm8@_z&hZIJ9!)l&ptX2)JQnF_b&xW$Zj$yXM8K54=)a1s(Dzh*DG7&jq^-nrFRIpB zTRo&6<P@koRC_oz1Oh*be3jV)ab_Rz@yKe~6^iqjGxkn=hWu!9)#4od7GSk){;@Yp z_TxVyh2+a<usKXoHgs`9oD>vQFY1&}abDD?OkG(0e`jKp`2B4s9-!mPr-JOy-My^x zjdX;}zfw%DYv}L}--<2WH-O1pz5zT&94g`xGW8gb|3Cp|60FT-c)qYJ4Rsb)Bn%{+ zPp<3XlnSsW>PXBar;%E6bPCf}dbgyuQcwXyT7b;+x#gA-$UH;-B}3ZjJb76-4vUxP zqCPgm{5``IQy6^T8-gh?%)c?r*cOaA%nGX)(t<`PWV6zk5*U%Zf#4di@^S2#IG(5Z z2=uq;|8p{v&Ct~&P%sv+MtSHls{acqJCtX(`GTGAUCw0u<3z+DBFe{<yP@*m1E|=u zbhfd2b^$v1SsZM<b<B&%-<uYDqL9M@NU2dN^07^%$9+PXcsw?jTa9KSnRb&VX^iE; zE=#<Mx_?LFfSV>vqa>z`Q^+YDOOq)aqjO+nANuR1<JtEhNFb2kuqn3qJ4+ADf1IK( zX7#PO$aG^Sf<Hqtg2mPz-a7f5#cb)C-YI7YjD#PE_bAN6$CAEjz5lTsVEX)rXZk%i z`e?RV=%RDkY6qhqyYRkRz>1+yD6loc7HW~|NXKNKT6W_A^6JYpF&Q43o^k+UKD!~% z-}FRdrbIuBj>)EPVAJu{%u)_yOU3~3vL7b?vr$z`fMqrq;(&xhYvuLi%QXe!@R4@( zJd*7Hh)|{N*5HoWqBEYMxifl0I5JaYOt~zU^)^`|6htP8hL4YCY|i6raY8><z;uH4 zU`dL5oX$20EO|JaeD82h9|=<1L?l8Yo7_+h)FyM21+d4o6lwW%VA>;t(?TMp9$FOv zTe6C_L(_<v;64LIt{Z``#?Xe_4R;>g{_f$OxOn%M)$bnM`TDDechqmG7b$PnhDikI zI=#{vRQrwlkZ$}3BsR@#-9)gqY}nI?{+vSWXS`&U%)X^dWHFF<f7VgxYN|$2nH5`2 zPzZuP)%LUv)Jq+qgU_U~p*7FrjlvAqWDaj9@MeM6Zp%F0V0lU#Z&g{KUJ>|kQ&1?O ztAz^DA2nLfreZNU-f@mS)mV672Y9Qon8#-W`c}hnDD}rwqHiRyC=GaSF~;K!)776) z6WL*CvJ%59wwi0J^E*D{Di2T>XdfLENZ8txayE>h?PS7ivJF#b=#KUM(^+@sS^wOj z_qHuW=MJkDupXQUbdtsoSoaoU@tLKMb4Pq`b{?>w`p8@HL&wW5h6Ifj-|^<_vsY%L zmwvF07hDygiz1=Zh;WYqcN5N^0l=BhohzR^XA+<@mGq)QAE|6JL*T>rS74W)qL3SH zVR(c@K~HO12#aG&hV67C&No8YSZqXtgk;-b*T~FcOz|K)3a03s%Pd~HP?MRqyNF5b z=C9E;KJE?~!ET6)EXs>oD$G<737JvBGmpA^G%K;VX4<f3EupBk&Y}nfdiIUOzs5_% z9|9uwFzLQQ!jL_jefons@KwO<w-8H9p17!mjl31*#t?l2J16b;q8wbm1g6GqMwcLM zwSX40o8$62x8$0WU<3AByKH1)o*Z3cz_&B>>gE<KFhj1|-#FqX+B{<4^v(lCNCBiL z=Yk0VskEDQbQ+zWV+3^uh0gKRkr<$Tdd;Cf8_h(90<*~l6u>5D68DWh^QmKW{ulJ7 z9qD60dO=TFg*X_&Lv*0aK^O5%{2n4X8pw`Re@Yq2`6Od+gm~q5v}-)E=$zPzV&>IB zfiip8INMM`zKqSFfs0y&2K*?#O%xX-g5fWhNRaZxf53$sMWzm9o)9vhp+J|6O#Ce| zQ8<Rv&T>Fl^wjYYut4lpG!*rzoT58G3u`!)_*klFDaxRXC>f8{TS0((Te#2`st#2z zb2TZ@wL0|)8C&>yF0M(@g(A8>Bsm(YNG0*@r?~jo3)cKQO0^Vwnz5DK2jef0{1s5G z5O6@*FDUzlvTrH7Od08x<ldG?rI(b=Q$}kTpapLc?M`gpNG>+bF-wp!IK>*>)=Op? j0asm2ns#Zznm9Fa8mh#cFzti(m!>hXVt-OJ?6Lm?wvl>W diff --git a/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/_compat.py b/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/_compat.py deleted file mode 100644 index 210bb80..0000000 --- a/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/_compat.py +++ /dev/null @@ -1,30 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -import sys - - -PY2 = sys.version_info[0] == 2 -PY3 = sys.version_info[0] == 3 - -# flake8: noqa - -if PY3: - string_types = str, -else: - string_types = basestring, - - -def with_metaclass(meta, *bases): - """ - Create a base class with a metaclass. - """ - # This requires a bit of explanation: the basic idea is to make a dummy - # metaclass for one level of class instantiation that replaces itself with - # the actual metaclass. - class metaclass(meta): - def __new__(cls, name, this_bases, d): - return meta(name, bases, d) - return type.__new__(metaclass, 'temporary_class', (), {}) diff --git a/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/_structures.py b/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/_structures.py deleted file mode 100644 index ccc2786..0000000 --- a/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/_structures.py +++ /dev/null @@ -1,68 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - - -class Infinity(object): - - def __repr__(self): - return "Infinity" - - def __hash__(self): - return hash(repr(self)) - - def __lt__(self, other): - return False - - def __le__(self, other): - return False - - def __eq__(self, other): - return isinstance(other, self.__class__) - - def __ne__(self, other): - return not isinstance(other, self.__class__) - - def __gt__(self, other): - return True - - def __ge__(self, other): - return True - - def __neg__(self): - return NegativeInfinity - -Infinity = Infinity() - - -class NegativeInfinity(object): - - def __repr__(self): - return "-Infinity" - - def __hash__(self): - return hash(repr(self)) - - def __lt__(self, other): - return True - - def __le__(self, other): - return True - - def __eq__(self, other): - return isinstance(other, self.__class__) - - def __ne__(self, other): - return not isinstance(other, self.__class__) - - def __gt__(self, other): - return False - - def __ge__(self, other): - return False - - def __neg__(self): - return Infinity - -NegativeInfinity = NegativeInfinity() diff --git a/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/markers.py b/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/markers.py deleted file mode 100644 index 031332a..0000000 --- a/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/markers.py +++ /dev/null @@ -1,301 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -import operator -import os -import platform -import sys - -from setuptools.extern.pyparsing import ParseException, ParseResults, stringStart, stringEnd -from setuptools.extern.pyparsing import ZeroOrMore, Group, Forward, QuotedString -from setuptools.extern.pyparsing import Literal as L # noqa - -from ._compat import string_types -from .specifiers import Specifier, InvalidSpecifier - - -__all__ = [ - "InvalidMarker", "UndefinedComparison", "UndefinedEnvironmentName", - "Marker", "default_environment", -] - - -class InvalidMarker(ValueError): - """ - An invalid marker was found, users should refer to PEP 508. - """ - - -class UndefinedComparison(ValueError): - """ - An invalid operation was attempted on a value that doesn't support it. - """ - - -class UndefinedEnvironmentName(ValueError): - """ - A name was attempted to be used that does not exist inside of the - environment. - """ - - -class Node(object): - - def __init__(self, value): - self.value = value - - def __str__(self): - return str(self.value) - - def __repr__(self): - return "<{0}({1!r})>".format(self.__class__.__name__, str(self)) - - def serialize(self): - raise NotImplementedError - - -class Variable(Node): - - def serialize(self): - return str(self) - - -class Value(Node): - - def serialize(self): - return '"{0}"'.format(self) - - -class Op(Node): - - def serialize(self): - return str(self) - - -VARIABLE = ( - L("implementation_version") | - L("platform_python_implementation") | - L("implementation_name") | - L("python_full_version") | - L("platform_release") | - L("platform_version") | - L("platform_machine") | - L("platform_system") | - L("python_version") | - L("sys_platform") | - L("os_name") | - L("os.name") | # PEP-345 - L("sys.platform") | # PEP-345 - L("platform.version") | # PEP-345 - L("platform.machine") | # PEP-345 - L("platform.python_implementation") | # PEP-345 - L("python_implementation") | # undocumented setuptools legacy - L("extra") -) -ALIASES = { - 'os.name': 'os_name', - 'sys.platform': 'sys_platform', - 'platform.version': 'platform_version', - 'platform.machine': 'platform_machine', - 'platform.python_implementation': 'platform_python_implementation', - 'python_implementation': 'platform_python_implementation' -} -VARIABLE.setParseAction(lambda s, l, t: Variable(ALIASES.get(t[0], t[0]))) - -VERSION_CMP = ( - L("===") | - L("==") | - L(">=") | - L("<=") | - L("!=") | - L("~=") | - L(">") | - L("<") -) - -MARKER_OP = VERSION_CMP | L("not in") | L("in") -MARKER_OP.setParseAction(lambda s, l, t: Op(t[0])) - -MARKER_VALUE = QuotedString("'") | QuotedString('"') -MARKER_VALUE.setParseAction(lambda s, l, t: Value(t[0])) - -BOOLOP = L("and") | L("or") - -MARKER_VAR = VARIABLE | MARKER_VALUE - -MARKER_ITEM = Group(MARKER_VAR + MARKER_OP + MARKER_VAR) -MARKER_ITEM.setParseAction(lambda s, l, t: tuple(t[0])) - -LPAREN = L("(").suppress() -RPAREN = L(")").suppress() - -MARKER_EXPR = Forward() -MARKER_ATOM = MARKER_ITEM | Group(LPAREN + MARKER_EXPR + RPAREN) -MARKER_EXPR << MARKER_ATOM + ZeroOrMore(BOOLOP + MARKER_EXPR) - -MARKER = stringStart + MARKER_EXPR + stringEnd - - -def _coerce_parse_result(results): - if isinstance(results, ParseResults): - return [_coerce_parse_result(i) for i in results] - else: - return results - - -def _format_marker(marker, first=True): - assert isinstance(marker, (list, tuple, string_types)) - - # Sometimes we have a structure like [[...]] which is a single item list - # where the single item is itself it's own list. In that case we want skip - # the rest of this function so that we don't get extraneous () on the - # outside. - if (isinstance(marker, list) and len(marker) == 1 and - isinstance(marker[0], (list, tuple))): - return _format_marker(marker[0]) - - if isinstance(marker, list): - inner = (_format_marker(m, first=False) for m in marker) - if first: - return " ".join(inner) - else: - return "(" + " ".join(inner) + ")" - elif isinstance(marker, tuple): - return " ".join([m.serialize() for m in marker]) - else: - return marker - - -_operators = { - "in": lambda lhs, rhs: lhs in rhs, - "not in": lambda lhs, rhs: lhs not in rhs, - "<": operator.lt, - "<=": operator.le, - "==": operator.eq, - "!=": operator.ne, - ">=": operator.ge, - ">": operator.gt, -} - - -def _eval_op(lhs, op, rhs): - try: - spec = Specifier("".join([op.serialize(), rhs])) - except InvalidSpecifier: - pass - else: - return spec.contains(lhs) - - oper = _operators.get(op.serialize()) - if oper is None: - raise UndefinedComparison( - "Undefined {0!r} on {1!r} and {2!r}.".format(op, lhs, rhs) - ) - - return oper(lhs, rhs) - - -_undefined = object() - - -def _get_env(environment, name): - value = environment.get(name, _undefined) - - if value is _undefined: - raise UndefinedEnvironmentName( - "{0!r} does not exist in evaluation environment.".format(name) - ) - - return value - - -def _evaluate_markers(markers, environment): - groups = [[]] - - for marker in markers: - assert isinstance(marker, (list, tuple, string_types)) - - if isinstance(marker, list): - groups[-1].append(_evaluate_markers(marker, environment)) - elif isinstance(marker, tuple): - lhs, op, rhs = marker - - if isinstance(lhs, Variable): - lhs_value = _get_env(environment, lhs.value) - rhs_value = rhs.value - else: - lhs_value = lhs.value - rhs_value = _get_env(environment, rhs.value) - - groups[-1].append(_eval_op(lhs_value, op, rhs_value)) - else: - assert marker in ["and", "or"] - if marker == "or": - groups.append([]) - - return any(all(item) for item in groups) - - -def format_full_version(info): - version = '{0.major}.{0.minor}.{0.micro}'.format(info) - kind = info.releaselevel - if kind != 'final': - version += kind[0] + str(info.serial) - return version - - -def default_environment(): - if hasattr(sys, 'implementation'): - iver = format_full_version(sys.implementation.version) - implementation_name = sys.implementation.name - else: - iver = '0' - implementation_name = '' - - return { - "implementation_name": implementation_name, - "implementation_version": iver, - "os_name": os.name, - "platform_machine": platform.machine(), - "platform_release": platform.release(), - "platform_system": platform.system(), - "platform_version": platform.version(), - "python_full_version": platform.python_version(), - "platform_python_implementation": platform.python_implementation(), - "python_version": platform.python_version()[:3], - "sys_platform": sys.platform, - } - - -class Marker(object): - - def __init__(self, marker): - try: - self._markers = _coerce_parse_result(MARKER.parseString(marker)) - except ParseException as e: - err_str = "Invalid marker: {0!r}, parse error at {1!r}".format( - marker, marker[e.loc:e.loc + 8]) - raise InvalidMarker(err_str) - - def __str__(self): - return _format_marker(self._markers) - - def __repr__(self): - return "<Marker({0!r})>".format(str(self)) - - def evaluate(self, environment=None): - """Evaluate a marker. - - Return the boolean from evaluating the given marker against the - environment. environment is an optional argument to override all or - part of the determined environment. - - The environment is determined from the current Python process. - """ - current_environment = default_environment() - if environment is not None: - current_environment.update(environment) - - return _evaluate_markers(self._markers, current_environment) diff --git a/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/requirements.py b/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/requirements.py deleted file mode 100644 index 5b49341..0000000 --- a/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/requirements.py +++ /dev/null @@ -1,127 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -import string -import re - -from setuptools.extern.pyparsing import stringStart, stringEnd, originalTextFor, ParseException -from setuptools.extern.pyparsing import ZeroOrMore, Word, Optional, Regex, Combine -from setuptools.extern.pyparsing import Literal as L # noqa -from setuptools.extern.six.moves.urllib import parse as urlparse - -from .markers import MARKER_EXPR, Marker -from .specifiers import LegacySpecifier, Specifier, SpecifierSet - - -class InvalidRequirement(ValueError): - """ - An invalid requirement was found, users should refer to PEP 508. - """ - - -ALPHANUM = Word(string.ascii_letters + string.digits) - -LBRACKET = L("[").suppress() -RBRACKET = L("]").suppress() -LPAREN = L("(").suppress() -RPAREN = L(")").suppress() -COMMA = L(",").suppress() -SEMICOLON = L(";").suppress() -AT = L("@").suppress() - -PUNCTUATION = Word("-_.") -IDENTIFIER_END = ALPHANUM | (ZeroOrMore(PUNCTUATION) + ALPHANUM) -IDENTIFIER = Combine(ALPHANUM + ZeroOrMore(IDENTIFIER_END)) - -NAME = IDENTIFIER("name") -EXTRA = IDENTIFIER - -URI = Regex(r'[^ ]+')("url") -URL = (AT + URI) - -EXTRAS_LIST = EXTRA + ZeroOrMore(COMMA + EXTRA) -EXTRAS = (LBRACKET + Optional(EXTRAS_LIST) + RBRACKET)("extras") - -VERSION_PEP440 = Regex(Specifier._regex_str, re.VERBOSE | re.IGNORECASE) -VERSION_LEGACY = Regex(LegacySpecifier._regex_str, re.VERBOSE | re.IGNORECASE) - -VERSION_ONE = VERSION_PEP440 ^ VERSION_LEGACY -VERSION_MANY = Combine(VERSION_ONE + ZeroOrMore(COMMA + VERSION_ONE), - joinString=",", adjacent=False)("_raw_spec") -_VERSION_SPEC = Optional(((LPAREN + VERSION_MANY + RPAREN) | VERSION_MANY)) -_VERSION_SPEC.setParseAction(lambda s, l, t: t._raw_spec or '') - -VERSION_SPEC = originalTextFor(_VERSION_SPEC)("specifier") -VERSION_SPEC.setParseAction(lambda s, l, t: t[1]) - -MARKER_EXPR = originalTextFor(MARKER_EXPR())("marker") -MARKER_EXPR.setParseAction( - lambda s, l, t: Marker(s[t._original_start:t._original_end]) -) -MARKER_SEPERATOR = SEMICOLON -MARKER = MARKER_SEPERATOR + MARKER_EXPR - -VERSION_AND_MARKER = VERSION_SPEC + Optional(MARKER) -URL_AND_MARKER = URL + Optional(MARKER) - -NAMED_REQUIREMENT = \ - NAME + Optional(EXTRAS) + (URL_AND_MARKER | VERSION_AND_MARKER) - -REQUIREMENT = stringStart + NAMED_REQUIREMENT + stringEnd - - -class Requirement(object): - """Parse a requirement. - - Parse a given requirement string into its parts, such as name, specifier, - URL, and extras. Raises InvalidRequirement on a badly-formed requirement - string. - """ - - # TODO: Can we test whether something is contained within a requirement? - # If so how do we do that? Do we need to test against the _name_ of - # the thing as well as the version? What about the markers? - # TODO: Can we normalize the name and extra name? - - def __init__(self, requirement_string): - try: - req = REQUIREMENT.parseString(requirement_string) - except ParseException as e: - raise InvalidRequirement( - "Invalid requirement, parse error at \"{0!r}\"".format( - requirement_string[e.loc:e.loc + 8])) - - self.name = req.name - if req.url: - parsed_url = urlparse.urlparse(req.url) - if not (parsed_url.scheme and parsed_url.netloc) or ( - not parsed_url.scheme and not parsed_url.netloc): - raise InvalidRequirement("Invalid URL given") - self.url = req.url - else: - self.url = None - self.extras = set(req.extras.asList() if req.extras else []) - self.specifier = SpecifierSet(req.specifier) - self.marker = req.marker if req.marker else None - - def __str__(self): - parts = [self.name] - - if self.extras: - parts.append("[{0}]".format(",".join(sorted(self.extras)))) - - if self.specifier: - parts.append(str(self.specifier)) - - if self.url: - parts.append("@ {0}".format(self.url)) - - if self.marker: - parts.append("; {0}".format(self.marker)) - - return "".join(parts) - - def __repr__(self): - return "<Requirement({0!r})>".format(str(self)) diff --git a/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/specifiers.py b/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/specifiers.py deleted file mode 100644 index 7f5a76c..0000000 --- a/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/specifiers.py +++ /dev/null @@ -1,774 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -import abc -import functools -import itertools -import re - -from ._compat import string_types, with_metaclass -from .version import Version, LegacyVersion, parse - - -class InvalidSpecifier(ValueError): - """ - An invalid specifier was found, users should refer to PEP 440. - """ - - -class BaseSpecifier(with_metaclass(abc.ABCMeta, object)): - - @abc.abstractmethod - def __str__(self): - """ - Returns the str representation of this Specifier like object. This - should be representative of the Specifier itself. - """ - - @abc.abstractmethod - def __hash__(self): - """ - Returns a hash value for this Specifier like object. - """ - - @abc.abstractmethod - def __eq__(self, other): - """ - Returns a boolean representing whether or not the two Specifier like - objects are equal. - """ - - @abc.abstractmethod - def __ne__(self, other): - """ - Returns a boolean representing whether or not the two Specifier like - objects are not equal. - """ - - @abc.abstractproperty - def prereleases(self): - """ - Returns whether or not pre-releases as a whole are allowed by this - specifier. - """ - - @prereleases.setter - def prereleases(self, value): - """ - Sets whether or not pre-releases as a whole are allowed by this - specifier. - """ - - @abc.abstractmethod - def contains(self, item, prereleases=None): - """ - Determines if the given item is contained within this specifier. - """ - - @abc.abstractmethod - def filter(self, iterable, prereleases=None): - """ - Takes an iterable of items and filters them so that only items which - are contained within this specifier are allowed in it. - """ - - -class _IndividualSpecifier(BaseSpecifier): - - _operators = {} - - def __init__(self, spec="", prereleases=None): - match = self._regex.search(spec) - if not match: - raise InvalidSpecifier("Invalid specifier: '{0}'".format(spec)) - - self._spec = ( - match.group("operator").strip(), - match.group("version").strip(), - ) - - # Store whether or not this Specifier should accept prereleases - self._prereleases = prereleases - - def __repr__(self): - pre = ( - ", prereleases={0!r}".format(self.prereleases) - if self._prereleases is not None - else "" - ) - - return "<{0}({1!r}{2})>".format( - self.__class__.__name__, - str(self), - pre, - ) - - def __str__(self): - return "{0}{1}".format(*self._spec) - - def __hash__(self): - return hash(self._spec) - - def __eq__(self, other): - if isinstance(other, string_types): - try: - other = self.__class__(other) - except InvalidSpecifier: - return NotImplemented - elif not isinstance(other, self.__class__): - return NotImplemented - - return self._spec == other._spec - - def __ne__(self, other): - if isinstance(other, string_types): - try: - other = self.__class__(other) - except InvalidSpecifier: - return NotImplemented - elif not isinstance(other, self.__class__): - return NotImplemented - - return self._spec != other._spec - - def _get_operator(self, op): - return getattr(self, "_compare_{0}".format(self._operators[op])) - - def _coerce_version(self, version): - if not isinstance(version, (LegacyVersion, Version)): - version = parse(version) - return version - - @property - def operator(self): - return self._spec[0] - - @property - def version(self): - return self._spec[1] - - @property - def prereleases(self): - return self._prereleases - - @prereleases.setter - def prereleases(self, value): - self._prereleases = value - - def __contains__(self, item): - return self.contains(item) - - def contains(self, item, prereleases=None): - # Determine if prereleases are to be allowed or not. - if prereleases is None: - prereleases = self.prereleases - - # Normalize item to a Version or LegacyVersion, this allows us to have - # a shortcut for ``"2.0" in Specifier(">=2") - item = self._coerce_version(item) - - # Determine if we should be supporting prereleases in this specifier - # or not, if we do not support prereleases than we can short circuit - # logic if this version is a prereleases. - if item.is_prerelease and not prereleases: - return False - - # Actually do the comparison to determine if this item is contained - # within this Specifier or not. - return self._get_operator(self.operator)(item, self.version) - - def filter(self, iterable, prereleases=None): - yielded = False - found_prereleases = [] - - kw = {"prereleases": prereleases if prereleases is not None else True} - - # Attempt to iterate over all the values in the iterable and if any of - # them match, yield them. - for version in iterable: - parsed_version = self._coerce_version(version) - - if self.contains(parsed_version, **kw): - # If our version is a prerelease, and we were not set to allow - # prereleases, then we'll store it for later incase nothing - # else matches this specifier. - if (parsed_version.is_prerelease and not - (prereleases or self.prereleases)): - found_prereleases.append(version) - # Either this is not a prerelease, or we should have been - # accepting prereleases from the begining. - else: - yielded = True - yield version - - # Now that we've iterated over everything, determine if we've yielded - # any values, and if we have not and we have any prereleases stored up - # then we will go ahead and yield the prereleases. - if not yielded and found_prereleases: - for version in found_prereleases: - yield version - - -class LegacySpecifier(_IndividualSpecifier): - - _regex_str = ( - r""" - (?P<operator>(==|!=|<=|>=|<|>)) - \s* - (?P<version> - [^,;\s)]* # Since this is a "legacy" specifier, and the version - # string can be just about anything, we match everything - # except for whitespace, a semi-colon for marker support, - # a closing paren since versions can be enclosed in - # them, and a comma since it's a version separator. - ) - """ - ) - - _regex = re.compile( - r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) - - _operators = { - "==": "equal", - "!=": "not_equal", - "<=": "less_than_equal", - ">=": "greater_than_equal", - "<": "less_than", - ">": "greater_than", - } - - def _coerce_version(self, version): - if not isinstance(version, LegacyVersion): - version = LegacyVersion(str(version)) - return version - - def _compare_equal(self, prospective, spec): - return prospective == self._coerce_version(spec) - - def _compare_not_equal(self, prospective, spec): - return prospective != self._coerce_version(spec) - - def _compare_less_than_equal(self, prospective, spec): - return prospective <= self._coerce_version(spec) - - def _compare_greater_than_equal(self, prospective, spec): - return prospective >= self._coerce_version(spec) - - def _compare_less_than(self, prospective, spec): - return prospective < self._coerce_version(spec) - - def _compare_greater_than(self, prospective, spec): - return prospective > self._coerce_version(spec) - - -def _require_version_compare(fn): - @functools.wraps(fn) - def wrapped(self, prospective, spec): - if not isinstance(prospective, Version): - return False - return fn(self, prospective, spec) - return wrapped - - -class Specifier(_IndividualSpecifier): - - _regex_str = ( - r""" - (?P<operator>(~=|==|!=|<=|>=|<|>|===)) - (?P<version> - (?: - # The identity operators allow for an escape hatch that will - # do an exact string match of the version you wish to install. - # This will not be parsed by PEP 440 and we cannot determine - # any semantic meaning from it. This operator is discouraged - # but included entirely as an escape hatch. - (?<====) # Only match for the identity operator - \s* - [^\s]* # We just match everything, except for whitespace - # since we are only testing for strict identity. - ) - | - (?: - # The (non)equality operators allow for wild card and local - # versions to be specified so we have to define these two - # operators separately to enable that. - (?<===|!=) # Only match for equals and not equals - - \s* - v? - (?:[0-9]+!)? # epoch - [0-9]+(?:\.[0-9]+)* # release - (?: # pre release - [-_\.]? - (a|b|c|rc|alpha|beta|pre|preview) - [-_\.]? - [0-9]* - )? - (?: # post release - (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) - )? - - # You cannot use a wild card and a dev or local version - # together so group them with a | and make them optional. - (?: - (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release - (?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local - | - \.\* # Wild card syntax of .* - )? - ) - | - (?: - # The compatible operator requires at least two digits in the - # release segment. - (?<=~=) # Only match for the compatible operator - - \s* - v? - (?:[0-9]+!)? # epoch - [0-9]+(?:\.[0-9]+)+ # release (We have a + instead of a *) - (?: # pre release - [-_\.]? - (a|b|c|rc|alpha|beta|pre|preview) - [-_\.]? - [0-9]* - )? - (?: # post release - (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) - )? - (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release - ) - | - (?: - # All other operators only allow a sub set of what the - # (non)equality operators do. Specifically they do not allow - # local versions to be specified nor do they allow the prefix - # matching wild cards. - (?<!==|!=|~=) # We have special cases for these - # operators so we want to make sure they - # don't match here. - - \s* - v? - (?:[0-9]+!)? # epoch - [0-9]+(?:\.[0-9]+)* # release - (?: # pre release - [-_\.]? - (a|b|c|rc|alpha|beta|pre|preview) - [-_\.]? - [0-9]* - )? - (?: # post release - (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) - )? - (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release - ) - ) - """ - ) - - _regex = re.compile( - r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) - - _operators = { - "~=": "compatible", - "==": "equal", - "!=": "not_equal", - "<=": "less_than_equal", - ">=": "greater_than_equal", - "<": "less_than", - ">": "greater_than", - "===": "arbitrary", - } - - @_require_version_compare - def _compare_compatible(self, prospective, spec): - # Compatible releases have an equivalent combination of >= and ==. That - # is that ~=2.2 is equivalent to >=2.2,==2.*. This allows us to - # implement this in terms of the other specifiers instead of - # implementing it ourselves. The only thing we need to do is construct - # the other specifiers. - - # We want everything but the last item in the version, but we want to - # ignore post and dev releases and we want to treat the pre-release as - # it's own separate segment. - prefix = ".".join( - list( - itertools.takewhile( - lambda x: (not x.startswith("post") and not - x.startswith("dev")), - _version_split(spec), - ) - )[:-1] - ) - - # Add the prefix notation to the end of our string - prefix += ".*" - - return (self._get_operator(">=")(prospective, spec) and - self._get_operator("==")(prospective, prefix)) - - @_require_version_compare - def _compare_equal(self, prospective, spec): - # We need special logic to handle prefix matching - if spec.endswith(".*"): - # In the case of prefix matching we want to ignore local segment. - prospective = Version(prospective.public) - # Split the spec out by dots, and pretend that there is an implicit - # dot in between a release segment and a pre-release segment. - spec = _version_split(spec[:-2]) # Remove the trailing .* - - # Split the prospective version out by dots, and pretend that there - # is an implicit dot in between a release segment and a pre-release - # segment. - prospective = _version_split(str(prospective)) - - # Shorten the prospective version to be the same length as the spec - # so that we can determine if the specifier is a prefix of the - # prospective version or not. - prospective = prospective[:len(spec)] - - # Pad out our two sides with zeros so that they both equal the same - # length. - spec, prospective = _pad_version(spec, prospective) - else: - # Convert our spec string into a Version - spec = Version(spec) - - # If the specifier does not have a local segment, then we want to - # act as if the prospective version also does not have a local - # segment. - if not spec.local: - prospective = Version(prospective.public) - - return prospective == spec - - @_require_version_compare - def _compare_not_equal(self, prospective, spec): - return not self._compare_equal(prospective, spec) - - @_require_version_compare - def _compare_less_than_equal(self, prospective, spec): - return prospective <= Version(spec) - - @_require_version_compare - def _compare_greater_than_equal(self, prospective, spec): - return prospective >= Version(spec) - - @_require_version_compare - def _compare_less_than(self, prospective, spec): - # Convert our spec to a Version instance, since we'll want to work with - # it as a version. - spec = Version(spec) - - # Check to see if the prospective version is less than the spec - # version. If it's not we can short circuit and just return False now - # instead of doing extra unneeded work. - if not prospective < spec: - return False - - # This special case is here so that, unless the specifier itself - # includes is a pre-release version, that we do not accept pre-release - # versions for the version mentioned in the specifier (e.g. <3.1 should - # not match 3.1.dev0, but should match 3.0.dev0). - if not spec.is_prerelease and prospective.is_prerelease: - if Version(prospective.base_version) == Version(spec.base_version): - return False - - # If we've gotten to here, it means that prospective version is both - # less than the spec version *and* it's not a pre-release of the same - # version in the spec. - return True - - @_require_version_compare - def _compare_greater_than(self, prospective, spec): - # Convert our spec to a Version instance, since we'll want to work with - # it as a version. - spec = Version(spec) - - # Check to see if the prospective version is greater than the spec - # version. If it's not we can short circuit and just return False now - # instead of doing extra unneeded work. - if not prospective > spec: - return False - - # This special case is here so that, unless the specifier itself - # includes is a post-release version, that we do not accept - # post-release versions for the version mentioned in the specifier - # (e.g. >3.1 should not match 3.0.post0, but should match 3.2.post0). - if not spec.is_postrelease and prospective.is_postrelease: - if Version(prospective.base_version) == Version(spec.base_version): - return False - - # Ensure that we do not allow a local version of the version mentioned - # in the specifier, which is techincally greater than, to match. - if prospective.local is not None: - if Version(prospective.base_version) == Version(spec.base_version): - return False - - # If we've gotten to here, it means that prospective version is both - # greater than the spec version *and* it's not a pre-release of the - # same version in the spec. - return True - - def _compare_arbitrary(self, prospective, spec): - return str(prospective).lower() == str(spec).lower() - - @property - def prereleases(self): - # If there is an explicit prereleases set for this, then we'll just - # blindly use that. - if self._prereleases is not None: - return self._prereleases - - # Look at all of our specifiers and determine if they are inclusive - # operators, and if they are if they are including an explicit - # prerelease. - operator, version = self._spec - if operator in ["==", ">=", "<=", "~=", "==="]: - # The == specifier can include a trailing .*, if it does we - # want to remove before parsing. - if operator == "==" and version.endswith(".*"): - version = version[:-2] - - # Parse the version, and if it is a pre-release than this - # specifier allows pre-releases. - if parse(version).is_prerelease: - return True - - return False - - @prereleases.setter - def prereleases(self, value): - self._prereleases = value - - -_prefix_regex = re.compile(r"^([0-9]+)((?:a|b|c|rc)[0-9]+)$") - - -def _version_split(version): - result = [] - for item in version.split("."): - match = _prefix_regex.search(item) - if match: - result.extend(match.groups()) - else: - result.append(item) - return result - - -def _pad_version(left, right): - left_split, right_split = [], [] - - # Get the release segment of our versions - left_split.append(list(itertools.takewhile(lambda x: x.isdigit(), left))) - right_split.append(list(itertools.takewhile(lambda x: x.isdigit(), right))) - - # Get the rest of our versions - left_split.append(left[len(left_split[0]):]) - right_split.append(right[len(right_split[0]):]) - - # Insert our padding - left_split.insert( - 1, - ["0"] * max(0, len(right_split[0]) - len(left_split[0])), - ) - right_split.insert( - 1, - ["0"] * max(0, len(left_split[0]) - len(right_split[0])), - ) - - return ( - list(itertools.chain(*left_split)), - list(itertools.chain(*right_split)), - ) - - -class SpecifierSet(BaseSpecifier): - - def __init__(self, specifiers="", prereleases=None): - # Split on , to break each indidivual specifier into it's own item, and - # strip each item to remove leading/trailing whitespace. - specifiers = [s.strip() for s in specifiers.split(",") if s.strip()] - - # Parsed each individual specifier, attempting first to make it a - # Specifier and falling back to a LegacySpecifier. - parsed = set() - for specifier in specifiers: - try: - parsed.add(Specifier(specifier)) - except InvalidSpecifier: - parsed.add(LegacySpecifier(specifier)) - - # Turn our parsed specifiers into a frozen set and save them for later. - self._specs = frozenset(parsed) - - # Store our prereleases value so we can use it later to determine if - # we accept prereleases or not. - self._prereleases = prereleases - - def __repr__(self): - pre = ( - ", prereleases={0!r}".format(self.prereleases) - if self._prereleases is not None - else "" - ) - - return "<SpecifierSet({0!r}{1})>".format(str(self), pre) - - def __str__(self): - return ",".join(sorted(str(s) for s in self._specs)) - - def __hash__(self): - return hash(self._specs) - - def __and__(self, other): - if isinstance(other, string_types): - other = SpecifierSet(other) - elif not isinstance(other, SpecifierSet): - return NotImplemented - - specifier = SpecifierSet() - specifier._specs = frozenset(self._specs | other._specs) - - if self._prereleases is None and other._prereleases is not None: - specifier._prereleases = other._prereleases - elif self._prereleases is not None and other._prereleases is None: - specifier._prereleases = self._prereleases - elif self._prereleases == other._prereleases: - specifier._prereleases = self._prereleases - else: - raise ValueError( - "Cannot combine SpecifierSets with True and False prerelease " - "overrides." - ) - - return specifier - - def __eq__(self, other): - if isinstance(other, string_types): - other = SpecifierSet(other) - elif isinstance(other, _IndividualSpecifier): - other = SpecifierSet(str(other)) - elif not isinstance(other, SpecifierSet): - return NotImplemented - - return self._specs == other._specs - - def __ne__(self, other): - if isinstance(other, string_types): - other = SpecifierSet(other) - elif isinstance(other, _IndividualSpecifier): - other = SpecifierSet(str(other)) - elif not isinstance(other, SpecifierSet): - return NotImplemented - - return self._specs != other._specs - - def __len__(self): - return len(self._specs) - - def __iter__(self): - return iter(self._specs) - - @property - def prereleases(self): - # If we have been given an explicit prerelease modifier, then we'll - # pass that through here. - if self._prereleases is not None: - return self._prereleases - - # If we don't have any specifiers, and we don't have a forced value, - # then we'll just return None since we don't know if this should have - # pre-releases or not. - if not self._specs: - return None - - # Otherwise we'll see if any of the given specifiers accept - # prereleases, if any of them do we'll return True, otherwise False. - return any(s.prereleases for s in self._specs) - - @prereleases.setter - def prereleases(self, value): - self._prereleases = value - - def __contains__(self, item): - return self.contains(item) - - def contains(self, item, prereleases=None): - # Ensure that our item is a Version or LegacyVersion instance. - if not isinstance(item, (LegacyVersion, Version)): - item = parse(item) - - # Determine if we're forcing a prerelease or not, if we're not forcing - # one for this particular filter call, then we'll use whatever the - # SpecifierSet thinks for whether or not we should support prereleases. - if prereleases is None: - prereleases = self.prereleases - - # We can determine if we're going to allow pre-releases by looking to - # see if any of the underlying items supports them. If none of them do - # and this item is a pre-release then we do not allow it and we can - # short circuit that here. - # Note: This means that 1.0.dev1 would not be contained in something - # like >=1.0.devabc however it would be in >=1.0.debabc,>0.0.dev0 - if not prereleases and item.is_prerelease: - return False - - # We simply dispatch to the underlying specs here to make sure that the - # given version is contained within all of them. - # Note: This use of all() here means that an empty set of specifiers - # will always return True, this is an explicit design decision. - return all( - s.contains(item, prereleases=prereleases) - for s in self._specs - ) - - def filter(self, iterable, prereleases=None): - # Determine if we're forcing a prerelease or not, if we're not forcing - # one for this particular filter call, then we'll use whatever the - # SpecifierSet thinks for whether or not we should support prereleases. - if prereleases is None: - prereleases = self.prereleases - - # If we have any specifiers, then we want to wrap our iterable in the - # filter method for each one, this will act as a logical AND amongst - # each specifier. - if self._specs: - for spec in self._specs: - iterable = spec.filter(iterable, prereleases=bool(prereleases)) - return iterable - # If we do not have any specifiers, then we need to have a rough filter - # which will filter out any pre-releases, unless there are no final - # releases, and which will filter out LegacyVersion in general. - else: - filtered = [] - found_prereleases = [] - - for item in iterable: - # Ensure that we some kind of Version class for this item. - if not isinstance(item, (LegacyVersion, Version)): - parsed_version = parse(item) - else: - parsed_version = item - - # Filter out any item which is parsed as a LegacyVersion - if isinstance(parsed_version, LegacyVersion): - continue - - # Store any item which is a pre-release for later unless we've - # already found a final version or we are accepting prereleases - if parsed_version.is_prerelease and not prereleases: - if not filtered: - found_prereleases.append(item) - else: - filtered.append(item) - - # If we've found no items except for pre-releases, then we'll go - # ahead and use the pre-releases - if not filtered and found_prereleases and prereleases is None: - return found_prereleases - - return filtered diff --git a/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/utils.py b/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/utils.py deleted file mode 100644 index 942387c..0000000 --- a/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/utils.py +++ /dev/null @@ -1,14 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -import re - - -_canonicalize_regex = re.compile(r"[-_.]+") - - -def canonicalize_name(name): - # This is taken from PEP 503. - return _canonicalize_regex.sub("-", name).lower() diff --git a/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/version.py b/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/version.py deleted file mode 100644 index 83b5ee8..0000000 --- a/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/version.py +++ /dev/null @@ -1,393 +0,0 @@ -# This file is dual licensed under the terms of the Apache License, Version -# 2.0, and the BSD License. See the LICENSE file in the root of this repository -# for complete details. -from __future__ import absolute_import, division, print_function - -import collections -import itertools -import re - -from ._structures import Infinity - - -__all__ = [ - "parse", "Version", "LegacyVersion", "InvalidVersion", "VERSION_PATTERN" -] - - -_Version = collections.namedtuple( - "_Version", - ["epoch", "release", "dev", "pre", "post", "local"], -) - - -def parse(version): - """ - Parse the given version string and return either a :class:`Version` object - or a :class:`LegacyVersion` object depending on if the given version is - a valid PEP 440 version or a legacy version. - """ - try: - return Version(version) - except InvalidVersion: - return LegacyVersion(version) - - -class InvalidVersion(ValueError): - """ - An invalid version was found, users should refer to PEP 440. - """ - - -class _BaseVersion(object): - - def __hash__(self): - return hash(self._key) - - def __lt__(self, other): - return self._compare(other, lambda s, o: s < o) - - def __le__(self, other): - return self._compare(other, lambda s, o: s <= o) - - def __eq__(self, other): - return self._compare(other, lambda s, o: s == o) - - def __ge__(self, other): - return self._compare(other, lambda s, o: s >= o) - - def __gt__(self, other): - return self._compare(other, lambda s, o: s > o) - - def __ne__(self, other): - return self._compare(other, lambda s, o: s != o) - - def _compare(self, other, method): - if not isinstance(other, _BaseVersion): - return NotImplemented - - return method(self._key, other._key) - - -class LegacyVersion(_BaseVersion): - - def __init__(self, version): - self._version = str(version) - self._key = _legacy_cmpkey(self._version) - - def __str__(self): - return self._version - - def __repr__(self): - return "<LegacyVersion({0})>".format(repr(str(self))) - - @property - def public(self): - return self._version - - @property - def base_version(self): - return self._version - - @property - def local(self): - return None - - @property - def is_prerelease(self): - return False - - @property - def is_postrelease(self): - return False - - -_legacy_version_component_re = re.compile( - r"(\d+ | [a-z]+ | \.| -)", re.VERBOSE, -) - -_legacy_version_replacement_map = { - "pre": "c", "preview": "c", "-": "final-", "rc": "c", "dev": "@", -} - - -def _parse_version_parts(s): - for part in _legacy_version_component_re.split(s): - part = _legacy_version_replacement_map.get(part, part) - - if not part or part == ".": - continue - - if part[:1] in "0123456789": - # pad for numeric comparison - yield part.zfill(8) - else: - yield "*" + part - - # ensure that alpha/beta/candidate are before final - yield "*final" - - -def _legacy_cmpkey(version): - # We hardcode an epoch of -1 here. A PEP 440 version can only have a epoch - # greater than or equal to 0. This will effectively put the LegacyVersion, - # which uses the defacto standard originally implemented by setuptools, - # as before all PEP 440 versions. - epoch = -1 - - # This scheme is taken from pkg_resources.parse_version setuptools prior to - # it's adoption of the packaging library. - parts = [] - for part in _parse_version_parts(version.lower()): - if part.startswith("*"): - # remove "-" before a prerelease tag - if part < "*final": - while parts and parts[-1] == "*final-": - parts.pop() - - # remove trailing zeros from each series of numeric parts - while parts and parts[-1] == "00000000": - parts.pop() - - parts.append(part) - parts = tuple(parts) - - return epoch, parts - -# Deliberately not anchored to the start and end of the string, to make it -# easier for 3rd party code to reuse -VERSION_PATTERN = r""" - v? - (?: - (?:(?P<epoch>[0-9]+)!)? # epoch - (?P<release>[0-9]+(?:\.[0-9]+)*) # release segment - (?P<pre> # pre-release - [-_\.]? - (?P<pre_l>(a|b|c|rc|alpha|beta|pre|preview)) - [-_\.]? - (?P<pre_n>[0-9]+)? - )? - (?P<post> # post release - (?:-(?P<post_n1>[0-9]+)) - | - (?: - [-_\.]? - (?P<post_l>post|rev|r) - [-_\.]? - (?P<post_n2>[0-9]+)? - ) - )? - (?P<dev> # dev release - [-_\.]? - (?P<dev_l>dev) - [-_\.]? - (?P<dev_n>[0-9]+)? - )? - ) - (?:\+(?P<local>[a-z0-9]+(?:[-_\.][a-z0-9]+)*))? # local version -""" - - -class Version(_BaseVersion): - - _regex = re.compile( - r"^\s*" + VERSION_PATTERN + r"\s*$", - re.VERBOSE | re.IGNORECASE, - ) - - def __init__(self, version): - # Validate the version and parse it into pieces - match = self._regex.search(version) - if not match: - raise InvalidVersion("Invalid version: '{0}'".format(version)) - - # Store the parsed out pieces of the version - self._version = _Version( - epoch=int(match.group("epoch")) if match.group("epoch") else 0, - release=tuple(int(i) for i in match.group("release").split(".")), - pre=_parse_letter_version( - match.group("pre_l"), - match.group("pre_n"), - ), - post=_parse_letter_version( - match.group("post_l"), - match.group("post_n1") or match.group("post_n2"), - ), - dev=_parse_letter_version( - match.group("dev_l"), - match.group("dev_n"), - ), - local=_parse_local_version(match.group("local")), - ) - - # Generate a key which will be used for sorting - self._key = _cmpkey( - self._version.epoch, - self._version.release, - self._version.pre, - self._version.post, - self._version.dev, - self._version.local, - ) - - def __repr__(self): - return "<Version({0})>".format(repr(str(self))) - - def __str__(self): - parts = [] - - # Epoch - if self._version.epoch != 0: - parts.append("{0}!".format(self._version.epoch)) - - # Release segment - parts.append(".".join(str(x) for x in self._version.release)) - - # Pre-release - if self._version.pre is not None: - parts.append("".join(str(x) for x in self._version.pre)) - - # Post-release - if self._version.post is not None: - parts.append(".post{0}".format(self._version.post[1])) - - # Development release - if self._version.dev is not None: - parts.append(".dev{0}".format(self._version.dev[1])) - - # Local version segment - if self._version.local is not None: - parts.append( - "+{0}".format(".".join(str(x) for x in self._version.local)) - ) - - return "".join(parts) - - @property - def public(self): - return str(self).split("+", 1)[0] - - @property - def base_version(self): - parts = [] - - # Epoch - if self._version.epoch != 0: - parts.append("{0}!".format(self._version.epoch)) - - # Release segment - parts.append(".".join(str(x) for x in self._version.release)) - - return "".join(parts) - - @property - def local(self): - version_string = str(self) - if "+" in version_string: - return version_string.split("+", 1)[1] - - @property - def is_prerelease(self): - return bool(self._version.dev or self._version.pre) - - @property - def is_postrelease(self): - return bool(self._version.post) - - -def _parse_letter_version(letter, number): - if letter: - # We consider there to be an implicit 0 in a pre-release if there is - # not a numeral associated with it. - if number is None: - number = 0 - - # We normalize any letters to their lower case form - letter = letter.lower() - - # We consider some words to be alternate spellings of other words and - # in those cases we want to normalize the spellings to our preferred - # spelling. - if letter == "alpha": - letter = "a" - elif letter == "beta": - letter = "b" - elif letter in ["c", "pre", "preview"]: - letter = "rc" - elif letter in ["rev", "r"]: - letter = "post" - - return letter, int(number) - if not letter and number: - # We assume if we are given a number, but we are not given a letter - # then this is using the implicit post release syntax (e.g. 1.0-1) - letter = "post" - - return letter, int(number) - - -_local_version_seperators = re.compile(r"[\._-]") - - -def _parse_local_version(local): - """ - Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve"). - """ - if local is not None: - return tuple( - part.lower() if not part.isdigit() else int(part) - for part in _local_version_seperators.split(local) - ) - - -def _cmpkey(epoch, release, pre, post, dev, local): - # When we compare a release version, we want to compare it with all of the - # trailing zeros removed. So we'll use a reverse the list, drop all the now - # leading zeros until we come to something non zero, then take the rest - # re-reverse it back into the correct order and make it a tuple and use - # that for our sorting key. - release = tuple( - reversed(list( - itertools.dropwhile( - lambda x: x == 0, - reversed(release), - ) - )) - ) - - # We need to "trick" the sorting algorithm to put 1.0.dev0 before 1.0a0. - # We'll do this by abusing the pre segment, but we _only_ want to do this - # if there is not a pre or a post segment. If we have one of those then - # the normal sorting rules will handle this case correctly. - if pre is None and post is None and dev is not None: - pre = -Infinity - # Versions without a pre-release (except as noted above) should sort after - # those with one. - elif pre is None: - pre = Infinity - - # Versions without a post segment should sort before those with one. - if post is None: - post = -Infinity - - # Versions without a development segment should sort after those with one. - if dev is None: - dev = Infinity - - if local is None: - # Versions without a local segment should sort before those with one. - local = -Infinity - else: - # Versions with a local segment need that segment parsed to implement - # the sorting rules in PEP440. - # - Alpha numeric segments sort before numeric segments - # - Alpha numeric segments sort lexicographically - # - Numeric segments sort numerically - # - Shorter versions sort before longer versions when the prefixes - # match exactly - local = tuple( - (i, "") if isinstance(i, int) else (-Infinity, i) - for i in local - ) - - return epoch, release, pre, post, dev, local diff --git a/env/lib/python3.7/site-packages/setuptools/_vendor/pyparsing.py b/env/lib/python3.7/site-packages/setuptools/_vendor/pyparsing.py deleted file mode 100644 index cf75e1e..0000000 --- a/env/lib/python3.7/site-packages/setuptools/_vendor/pyparsing.py +++ /dev/null @@ -1,5742 +0,0 @@ -# module pyparsing.py -# -# Copyright (c) 2003-2018 Paul T. McGuire -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be -# included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__doc__ = \ -""" -pyparsing module - Classes and methods to define and execute parsing grammars -============================================================================= - -The pyparsing module is an alternative approach to creating and executing simple grammars, -vs. the traditional lex/yacc approach, or the use of regular expressions. With pyparsing, you -don't need to learn a new syntax for defining grammars or matching expressions - the parsing module -provides a library of classes that you use to construct the grammar directly in Python. - -Here is a program to parse "Hello, World!" (or any greeting of the form -C{"<salutation>, <addressee>!"}), built up using L{Word}, L{Literal}, and L{And} elements -(L{'+'<ParserElement.__add__>} operator gives L{And} expressions, strings are auto-converted to -L{Literal} expressions):: - - from pyparsing import Word, alphas - - # define grammar of a greeting - greet = Word(alphas) + "," + Word(alphas) + "!" - - hello = "Hello, World!" - print (hello, "->", greet.parseString(hello)) - -The program outputs the following:: - - Hello, World! -> ['Hello', ',', 'World', '!'] - -The Python representation of the grammar is quite readable, owing to the self-explanatory -class names, and the use of '+', '|' and '^' operators. - -The L{ParseResults} object returned from L{ParserElement.parseString<ParserElement.parseString>} can be accessed as a nested list, a dictionary, or an -object with named attributes. - -The pyparsing module handles some of the problems that are typically vexing when writing text parsers: - - extra or missing whitespace (the above program will also handle "Hello,World!", "Hello , World !", etc.) - - quoted strings - - embedded comments - - -Getting Started - ------------------ -Visit the classes L{ParserElement} and L{ParseResults} to see the base classes that most other pyparsing -classes inherit from. Use the docstrings for examples of how to: - - construct literal match expressions from L{Literal} and L{CaselessLiteral} classes - - construct character word-group expressions using the L{Word} class - - see how to create repetitive expressions using L{ZeroOrMore} and L{OneOrMore} classes - - use L{'+'<And>}, L{'|'<MatchFirst>}, L{'^'<Or>}, and L{'&'<Each>} operators to combine simple expressions into more complex ones - - associate names with your parsed results using L{ParserElement.setResultsName} - - find some helpful expression short-cuts like L{delimitedList} and L{oneOf} - - find more useful common expressions in the L{pyparsing_common} namespace class -""" - -__version__ = "2.2.1" -__versionTime__ = "18 Sep 2018 00:49 UTC" -__author__ = "Paul McGuire <ptmcg@users.sourceforge.net>" - -import string -from weakref import ref as wkref -import copy -import sys -import warnings -import re -import sre_constants -import collections -import pprint -import traceback -import types -from datetime import datetime - -try: - from _thread import RLock -except ImportError: - from threading import RLock - -try: - # Python 3 - from collections.abc import Iterable - from collections.abc import MutableMapping -except ImportError: - # Python 2.7 - from collections import Iterable - from collections import MutableMapping - -try: - from collections import OrderedDict as _OrderedDict -except ImportError: - try: - from ordereddict import OrderedDict as _OrderedDict - except ImportError: - _OrderedDict = None - -#~ sys.stderr.write( "testing pyparsing module, version %s, %s\n" % (__version__,__versionTime__ ) ) - -__all__ = [ -'And', 'CaselessKeyword', 'CaselessLiteral', 'CharsNotIn', 'Combine', 'Dict', 'Each', 'Empty', -'FollowedBy', 'Forward', 'GoToColumn', 'Group', 'Keyword', 'LineEnd', 'LineStart', 'Literal', -'MatchFirst', 'NoMatch', 'NotAny', 'OneOrMore', 'OnlyOnce', 'Optional', 'Or', -'ParseBaseException', 'ParseElementEnhance', 'ParseException', 'ParseExpression', 'ParseFatalException', -'ParseResults', 'ParseSyntaxException', 'ParserElement', 'QuotedString', 'RecursiveGrammarException', -'Regex', 'SkipTo', 'StringEnd', 'StringStart', 'Suppress', 'Token', 'TokenConverter', -'White', 'Word', 'WordEnd', 'WordStart', 'ZeroOrMore', -'alphanums', 'alphas', 'alphas8bit', 'anyCloseTag', 'anyOpenTag', 'cStyleComment', 'col', -'commaSeparatedList', 'commonHTMLEntity', 'countedArray', 'cppStyleComment', 'dblQuotedString', -'dblSlashComment', 'delimitedList', 'dictOf', 'downcaseTokens', 'empty', 'hexnums', -'htmlComment', 'javaStyleComment', 'line', 'lineEnd', 'lineStart', 'lineno', -'makeHTMLTags', 'makeXMLTags', 'matchOnlyAtCol', 'matchPreviousExpr', 'matchPreviousLiteral', -'nestedExpr', 'nullDebugAction', 'nums', 'oneOf', 'opAssoc', 'operatorPrecedence', 'printables', -'punc8bit', 'pythonStyleComment', 'quotedString', 'removeQuotes', 'replaceHTMLEntity', -'replaceWith', 'restOfLine', 'sglQuotedString', 'srange', 'stringEnd', -'stringStart', 'traceParseAction', 'unicodeString', 'upcaseTokens', 'withAttribute', -'indentedBlock', 'originalTextFor', 'ungroup', 'infixNotation','locatedExpr', 'withClass', -'CloseMatch', 'tokenMap', 'pyparsing_common', -] - -system_version = tuple(sys.version_info)[:3] -PY_3 = system_version[0] == 3 -if PY_3: - _MAX_INT = sys.maxsize - basestring = str - unichr = chr - _ustr = str - - # build list of single arg builtins, that can be used as parse actions - singleArgBuiltins = [sum, len, sorted, reversed, list, tuple, set, any, all, min, max] - -else: - _MAX_INT = sys.maxint - range = xrange - - def _ustr(obj): - """Drop-in replacement for str(obj) that tries to be Unicode friendly. It first tries - str(obj). If that fails with a UnicodeEncodeError, then it tries unicode(obj). It - then < returns the unicode object | encodes it with the default encoding | ... >. - """ - if isinstance(obj,unicode): - return obj - - try: - # If this works, then _ustr(obj) has the same behaviour as str(obj), so - # it won't break any existing code. - return str(obj) - - except UnicodeEncodeError: - # Else encode it - ret = unicode(obj).encode(sys.getdefaultencoding(), 'xmlcharrefreplace') - xmlcharref = Regex(r'&#\d+;') - xmlcharref.setParseAction(lambda t: '\\u' + hex(int(t[0][2:-1]))[2:]) - return xmlcharref.transformString(ret) - - # build list of single arg builtins, tolerant of Python version, that can be used as parse actions - singleArgBuiltins = [] - import __builtin__ - for fname in "sum len sorted reversed list tuple set any all min max".split(): - try: - singleArgBuiltins.append(getattr(__builtin__,fname)) - except AttributeError: - continue - -_generatorType = type((y for y in range(1))) - -def _xml_escape(data): - """Escape &, <, >, ", ', etc. in a string of data.""" - - # ampersand must be replaced first - from_symbols = '&><"\'' - to_symbols = ('&'+s+';' for s in "amp gt lt quot apos".split()) - for from_,to_ in zip(from_symbols, to_symbols): - data = data.replace(from_, to_) - return data - -class _Constants(object): - pass - -alphas = string.ascii_uppercase + string.ascii_lowercase -nums = "0123456789" -hexnums = nums + "ABCDEFabcdef" -alphanums = alphas + nums -_bslash = chr(92) -printables = "".join(c for c in string.printable if c not in string.whitespace) - -class ParseBaseException(Exception): - """base exception class for all parsing runtime exceptions""" - # Performance tuning: we construct a *lot* of these, so keep this - # constructor as small and fast as possible - def __init__( self, pstr, loc=0, msg=None, elem=None ): - self.loc = loc - if msg is None: - self.msg = pstr - self.pstr = "" - else: - self.msg = msg - self.pstr = pstr - self.parserElement = elem - self.args = (pstr, loc, msg) - - @classmethod - def _from_exception(cls, pe): - """ - internal factory method to simplify creating one type of ParseException - from another - avoids having __init__ signature conflicts among subclasses - """ - return cls(pe.pstr, pe.loc, pe.msg, pe.parserElement) - - def __getattr__( self, aname ): - """supported attributes by name are: - - lineno - returns the line number of the exception text - - col - returns the column number of the exception text - - line - returns the line containing the exception text - """ - if( aname == "lineno" ): - return lineno( self.loc, self.pstr ) - elif( aname in ("col", "column") ): - return col( self.loc, self.pstr ) - elif( aname == "line" ): - return line( self.loc, self.pstr ) - else: - raise AttributeError(aname) - - def __str__( self ): - return "%s (at char %d), (line:%d, col:%d)" % \ - ( self.msg, self.loc, self.lineno, self.column ) - def __repr__( self ): - return _ustr(self) - def markInputline( self, markerString = ">!<" ): - """Extracts the exception line from the input string, and marks - the location of the exception with a special symbol. - """ - line_str = self.line - line_column = self.column - 1 - if markerString: - line_str = "".join((line_str[:line_column], - markerString, line_str[line_column:])) - return line_str.strip() - def __dir__(self): - return "lineno col line".split() + dir(type(self)) - -class ParseException(ParseBaseException): - """ - Exception thrown when parse expressions don't match class; - supported attributes by name are: - - lineno - returns the line number of the exception text - - col - returns the column number of the exception text - - line - returns the line containing the exception text - - Example:: - try: - Word(nums).setName("integer").parseString("ABC") - except ParseException as pe: - print(pe) - print("column: {}".format(pe.col)) - - prints:: - Expected integer (at char 0), (line:1, col:1) - column: 1 - """ - pass - -class ParseFatalException(ParseBaseException): - """user-throwable exception thrown when inconsistent parse content - is found; stops all parsing immediately""" - pass - -class ParseSyntaxException(ParseFatalException): - """just like L{ParseFatalException}, but thrown internally when an - L{ErrorStop<And._ErrorStop>} ('-' operator) indicates that parsing is to stop - immediately because an unbacktrackable syntax error has been found""" - pass - -#~ class ReparseException(ParseBaseException): - #~ """Experimental class - parse actions can raise this exception to cause - #~ pyparsing to reparse the input string: - #~ - with a modified input string, and/or - #~ - with a modified start location - #~ Set the values of the ReparseException in the constructor, and raise the - #~ exception in a parse action to cause pyparsing to use the new string/location. - #~ Setting the values as None causes no change to be made. - #~ """ - #~ def __init_( self, newstring, restartLoc ): - #~ self.newParseText = newstring - #~ self.reparseLoc = restartLoc - -class RecursiveGrammarException(Exception): - """exception thrown by L{ParserElement.validate} if the grammar could be improperly recursive""" - def __init__( self, parseElementList ): - self.parseElementTrace = parseElementList - - def __str__( self ): - return "RecursiveGrammarException: %s" % self.parseElementTrace - -class _ParseResultsWithOffset(object): - def __init__(self,p1,p2): - self.tup = (p1,p2) - def __getitem__(self,i): - return self.tup[i] - def __repr__(self): - return repr(self.tup[0]) - def setOffset(self,i): - self.tup = (self.tup[0],i) - -class ParseResults(object): - """ - Structured parse results, to provide multiple means of access to the parsed data: - - as a list (C{len(results)}) - - by list index (C{results[0], results[1]}, etc.) - - by attribute (C{results.<resultsName>} - see L{ParserElement.setResultsName}) - - Example:: - integer = Word(nums) - date_str = (integer.setResultsName("year") + '/' - + integer.setResultsName("month") + '/' - + integer.setResultsName("day")) - # equivalent form: - # date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - # parseString returns a ParseResults object - result = date_str.parseString("1999/12/31") - - def test(s, fn=repr): - print("%s -> %s" % (s, fn(eval(s)))) - test("list(result)") - test("result[0]") - test("result['month']") - test("result.day") - test("'month' in result") - test("'minutes' in result") - test("result.dump()", str) - prints:: - list(result) -> ['1999', '/', '12', '/', '31'] - result[0] -> '1999' - result['month'] -> '12' - result.day -> '31' - 'month' in result -> True - 'minutes' in result -> False - result.dump() -> ['1999', '/', '12', '/', '31'] - - day: 31 - - month: 12 - - year: 1999 - """ - def __new__(cls, toklist=None, name=None, asList=True, modal=True ): - if isinstance(toklist, cls): - return toklist - retobj = object.__new__(cls) - retobj.__doinit = True - return retobj - - # Performance tuning: we construct a *lot* of these, so keep this - # constructor as small and fast as possible - def __init__( self, toklist=None, name=None, asList=True, modal=True, isinstance=isinstance ): - if self.__doinit: - self.__doinit = False - self.__name = None - self.__parent = None - self.__accumNames = {} - self.__asList = asList - self.__modal = modal - if toklist is None: - toklist = [] - if isinstance(toklist, list): - self.__toklist = toklist[:] - elif isinstance(toklist, _generatorType): - self.__toklist = list(toklist) - else: - self.__toklist = [toklist] - self.__tokdict = dict() - - if name is not None and name: - if not modal: - self.__accumNames[name] = 0 - if isinstance(name,int): - name = _ustr(name) # will always return a str, but use _ustr for consistency - self.__name = name - if not (isinstance(toklist, (type(None), basestring, list)) and toklist in (None,'',[])): - if isinstance(toklist,basestring): - toklist = [ toklist ] - if asList: - if isinstance(toklist,ParseResults): - self[name] = _ParseResultsWithOffset(toklist.copy(),0) - else: - self[name] = _ParseResultsWithOffset(ParseResults(toklist[0]),0) - self[name].__name = name - else: - try: - self[name] = toklist[0] - except (KeyError,TypeError,IndexError): - self[name] = toklist - - def __getitem__( self, i ): - if isinstance( i, (int,slice) ): - return self.__toklist[i] - else: - if i not in self.__accumNames: - return self.__tokdict[i][-1][0] - else: - return ParseResults([ v[0] for v in self.__tokdict[i] ]) - - def __setitem__( self, k, v, isinstance=isinstance ): - if isinstance(v,_ParseResultsWithOffset): - self.__tokdict[k] = self.__tokdict.get(k,list()) + [v] - sub = v[0] - elif isinstance(k,(int,slice)): - self.__toklist[k] = v - sub = v - else: - self.__tokdict[k] = self.__tokdict.get(k,list()) + [_ParseResultsWithOffset(v,0)] - sub = v - if isinstance(sub,ParseResults): - sub.__parent = wkref(self) - - def __delitem__( self, i ): - if isinstance(i,(int,slice)): - mylen = len( self.__toklist ) - del self.__toklist[i] - - # convert int to slice - if isinstance(i, int): - if i < 0: - i += mylen - i = slice(i, i+1) - # get removed indices - removed = list(range(*i.indices(mylen))) - removed.reverse() - # fixup indices in token dictionary - for name,occurrences in self.__tokdict.items(): - for j in removed: - for k, (value, position) in enumerate(occurrences): - occurrences[k] = _ParseResultsWithOffset(value, position - (position > j)) - else: - del self.__tokdict[i] - - def __contains__( self, k ): - return k in self.__tokdict - - def __len__( self ): return len( self.__toklist ) - def __bool__(self): return ( not not self.__toklist ) - __nonzero__ = __bool__ - def __iter__( self ): return iter( self.__toklist ) - def __reversed__( self ): return iter( self.__toklist[::-1] ) - def _iterkeys( self ): - if hasattr(self.__tokdict, "iterkeys"): - return self.__tokdict.iterkeys() - else: - return iter(self.__tokdict) - - def _itervalues( self ): - return (self[k] for k in self._iterkeys()) - - def _iteritems( self ): - return ((k, self[k]) for k in self._iterkeys()) - - if PY_3: - keys = _iterkeys - """Returns an iterator of all named result keys (Python 3.x only).""" - - values = _itervalues - """Returns an iterator of all named result values (Python 3.x only).""" - - items = _iteritems - """Returns an iterator of all named result key-value tuples (Python 3.x only).""" - - else: - iterkeys = _iterkeys - """Returns an iterator of all named result keys (Python 2.x only).""" - - itervalues = _itervalues - """Returns an iterator of all named result values (Python 2.x only).""" - - iteritems = _iteritems - """Returns an iterator of all named result key-value tuples (Python 2.x only).""" - - def keys( self ): - """Returns all named result keys (as a list in Python 2.x, as an iterator in Python 3.x).""" - return list(self.iterkeys()) - - def values( self ): - """Returns all named result values (as a list in Python 2.x, as an iterator in Python 3.x).""" - return list(self.itervalues()) - - def items( self ): - """Returns all named result key-values (as a list of tuples in Python 2.x, as an iterator in Python 3.x).""" - return list(self.iteritems()) - - def haskeys( self ): - """Since keys() returns an iterator, this method is helpful in bypassing - code that looks for the existence of any defined results names.""" - return bool(self.__tokdict) - - def pop( self, *args, **kwargs): - """ - Removes and returns item at specified index (default=C{last}). - Supports both C{list} and C{dict} semantics for C{pop()}. If passed no - argument or an integer argument, it will use C{list} semantics - and pop tokens from the list of parsed tokens. If passed a - non-integer argument (most likely a string), it will use C{dict} - semantics and pop the corresponding value from any defined - results names. A second default return value argument is - supported, just as in C{dict.pop()}. - - Example:: - def remove_first(tokens): - tokens.pop(0) - print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] - print(OneOrMore(Word(nums)).addParseAction(remove_first).parseString("0 123 321")) # -> ['123', '321'] - - label = Word(alphas) - patt = label("LABEL") + OneOrMore(Word(nums)) - print(patt.parseString("AAB 123 321").dump()) - - # Use pop() in a parse action to remove named result (note that corresponding value is not - # removed from list form of results) - def remove_LABEL(tokens): - tokens.pop("LABEL") - return tokens - patt.addParseAction(remove_LABEL) - print(patt.parseString("AAB 123 321").dump()) - prints:: - ['AAB', '123', '321'] - - LABEL: AAB - - ['AAB', '123', '321'] - """ - if not args: - args = [-1] - for k,v in kwargs.items(): - if k == 'default': - args = (args[0], v) - else: - raise TypeError("pop() got an unexpected keyword argument '%s'" % k) - if (isinstance(args[0], int) or - len(args) == 1 or - args[0] in self): - index = args[0] - ret = self[index] - del self[index] - return ret - else: - defaultvalue = args[1] - return defaultvalue - - def get(self, key, defaultValue=None): - """ - Returns named result matching the given key, or if there is no - such name, then returns the given C{defaultValue} or C{None} if no - C{defaultValue} is specified. - - Similar to C{dict.get()}. - - Example:: - integer = Word(nums) - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - result = date_str.parseString("1999/12/31") - print(result.get("year")) # -> '1999' - print(result.get("hour", "not specified")) # -> 'not specified' - print(result.get("hour")) # -> None - """ - if key in self: - return self[key] - else: - return defaultValue - - def insert( self, index, insStr ): - """ - Inserts new element at location index in the list of parsed tokens. - - Similar to C{list.insert()}. - - Example:: - print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] - - # use a parse action to insert the parse location in the front of the parsed results - def insert_locn(locn, tokens): - tokens.insert(0, locn) - print(OneOrMore(Word(nums)).addParseAction(insert_locn).parseString("0 123 321")) # -> [0, '0', '123', '321'] - """ - self.__toklist.insert(index, insStr) - # fixup indices in token dictionary - for name,occurrences in self.__tokdict.items(): - for k, (value, position) in enumerate(occurrences): - occurrences[k] = _ParseResultsWithOffset(value, position + (position > index)) - - def append( self, item ): - """ - Add single element to end of ParseResults list of elements. - - Example:: - print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] - - # use a parse action to compute the sum of the parsed integers, and add it to the end - def append_sum(tokens): - tokens.append(sum(map(int, tokens))) - print(OneOrMore(Word(nums)).addParseAction(append_sum).parseString("0 123 321")) # -> ['0', '123', '321', 444] - """ - self.__toklist.append(item) - - def extend( self, itemseq ): - """ - Add sequence of elements to end of ParseResults list of elements. - - Example:: - patt = OneOrMore(Word(alphas)) - - # use a parse action to append the reverse of the matched strings, to make a palindrome - def make_palindrome(tokens): - tokens.extend(reversed([t[::-1] for t in tokens])) - return ''.join(tokens) - print(patt.addParseAction(make_palindrome).parseString("lskdj sdlkjf lksd")) # -> 'lskdjsdlkjflksddsklfjkldsjdksl' - """ - if isinstance(itemseq, ParseResults): - self += itemseq - else: - self.__toklist.extend(itemseq) - - def clear( self ): - """ - Clear all elements and results names. - """ - del self.__toklist[:] - self.__tokdict.clear() - - def __getattr__( self, name ): - try: - return self[name] - except KeyError: - return "" - - if name in self.__tokdict: - if name not in self.__accumNames: - return self.__tokdict[name][-1][0] - else: - return ParseResults([ v[0] for v in self.__tokdict[name] ]) - else: - return "" - - def __add__( self, other ): - ret = self.copy() - ret += other - return ret - - def __iadd__( self, other ): - if other.__tokdict: - offset = len(self.__toklist) - addoffset = lambda a: offset if a<0 else a+offset - otheritems = other.__tokdict.items() - otherdictitems = [(k, _ParseResultsWithOffset(v[0],addoffset(v[1])) ) - for (k,vlist) in otheritems for v in vlist] - for k,v in otherdictitems: - self[k] = v - if isinstance(v[0],ParseResults): - v[0].__parent = wkref(self) - - self.__toklist += other.__toklist - self.__accumNames.update( other.__accumNames ) - return self - - def __radd__(self, other): - if isinstance(other,int) and other == 0: - # useful for merging many ParseResults using sum() builtin - return self.copy() - else: - # this may raise a TypeError - so be it - return other + self - - def __repr__( self ): - return "(%s, %s)" % ( repr( self.__toklist ), repr( self.__tokdict ) ) - - def __str__( self ): - return '[' + ', '.join(_ustr(i) if isinstance(i, ParseResults) else repr(i) for i in self.__toklist) + ']' - - def _asStringList( self, sep='' ): - out = [] - for item in self.__toklist: - if out and sep: - out.append(sep) - if isinstance( item, ParseResults ): - out += item._asStringList() - else: - out.append( _ustr(item) ) - return out - - def asList( self ): - """ - Returns the parse results as a nested list of matching tokens, all converted to strings. - - Example:: - patt = OneOrMore(Word(alphas)) - result = patt.parseString("sldkj lsdkj sldkj") - # even though the result prints in string-like form, it is actually a pyparsing ParseResults - print(type(result), result) # -> <class 'pyparsing.ParseResults'> ['sldkj', 'lsdkj', 'sldkj'] - - # Use asList() to create an actual list - result_list = result.asList() - print(type(result_list), result_list) # -> <class 'list'> ['sldkj', 'lsdkj', 'sldkj'] - """ - return [res.asList() if isinstance(res,ParseResults) else res for res in self.__toklist] - - def asDict( self ): - """ - Returns the named parse results as a nested dictionary. - - Example:: - integer = Word(nums) - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - result = date_str.parseString('12/31/1999') - print(type(result), repr(result)) # -> <class 'pyparsing.ParseResults'> (['12', '/', '31', '/', '1999'], {'day': [('1999', 4)], 'year': [('12', 0)], 'month': [('31', 2)]}) - - result_dict = result.asDict() - print(type(result_dict), repr(result_dict)) # -> <class 'dict'> {'day': '1999', 'year': '12', 'month': '31'} - - # even though a ParseResults supports dict-like access, sometime you just need to have a dict - import json - print(json.dumps(result)) # -> Exception: TypeError: ... is not JSON serializable - print(json.dumps(result.asDict())) # -> {"month": "31", "day": "1999", "year": "12"} - """ - if PY_3: - item_fn = self.items - else: - item_fn = self.iteritems - - def toItem(obj): - if isinstance(obj, ParseResults): - if obj.haskeys(): - return obj.asDict() - else: - return [toItem(v) for v in obj] - else: - return obj - - return dict((k,toItem(v)) for k,v in item_fn()) - - def copy( self ): - """ - Returns a new copy of a C{ParseResults} object. - """ - ret = ParseResults( self.__toklist ) - ret.__tokdict = self.__tokdict.copy() - ret.__parent = self.__parent - ret.__accumNames.update( self.__accumNames ) - ret.__name = self.__name - return ret - - def asXML( self, doctag=None, namedItemsOnly=False, indent="", formatted=True ): - """ - (Deprecated) Returns the parse results as XML. Tags are created for tokens and lists that have defined results names. - """ - nl = "\n" - out = [] - namedItems = dict((v[1],k) for (k,vlist) in self.__tokdict.items() - for v in vlist) - nextLevelIndent = indent + " " - - # collapse out indents if formatting is not desired - if not formatted: - indent = "" - nextLevelIndent = "" - nl = "" - - selfTag = None - if doctag is not None: - selfTag = doctag - else: - if self.__name: - selfTag = self.__name - - if not selfTag: - if namedItemsOnly: - return "" - else: - selfTag = "ITEM" - - out += [ nl, indent, "<", selfTag, ">" ] - - for i,res in enumerate(self.__toklist): - if isinstance(res,ParseResults): - if i in namedItems: - out += [ res.asXML(namedItems[i], - namedItemsOnly and doctag is None, - nextLevelIndent, - formatted)] - else: - out += [ res.asXML(None, - namedItemsOnly and doctag is None, - nextLevelIndent, - formatted)] - else: - # individual token, see if there is a name for it - resTag = None - if i in namedItems: - resTag = namedItems[i] - if not resTag: - if namedItemsOnly: - continue - else: - resTag = "ITEM" - xmlBodyText = _xml_escape(_ustr(res)) - out += [ nl, nextLevelIndent, "<", resTag, ">", - xmlBodyText, - "</", resTag, ">" ] - - out += [ nl, indent, "</", selfTag, ">" ] - return "".join(out) - - def __lookup(self,sub): - for k,vlist in self.__tokdict.items(): - for v,loc in vlist: - if sub is v: - return k - return None - - def getName(self): - r""" - Returns the results name for this token expression. Useful when several - different expressions might match at a particular location. - - Example:: - integer = Word(nums) - ssn_expr = Regex(r"\d\d\d-\d\d-\d\d\d\d") - house_number_expr = Suppress('#') + Word(nums, alphanums) - user_data = (Group(house_number_expr)("house_number") - | Group(ssn_expr)("ssn") - | Group(integer)("age")) - user_info = OneOrMore(user_data) - - result = user_info.parseString("22 111-22-3333 #221B") - for item in result: - print(item.getName(), ':', item[0]) - prints:: - age : 22 - ssn : 111-22-3333 - house_number : 221B - """ - if self.__name: - return self.__name - elif self.__parent: - par = self.__parent() - if par: - return par.__lookup(self) - else: - return None - elif (len(self) == 1 and - len(self.__tokdict) == 1 and - next(iter(self.__tokdict.values()))[0][1] in (0,-1)): - return next(iter(self.__tokdict.keys())) - else: - return None - - def dump(self, indent='', depth=0, full=True): - """ - Diagnostic method for listing out the contents of a C{ParseResults}. - Accepts an optional C{indent} argument so that this string can be embedded - in a nested display of other data. - - Example:: - integer = Word(nums) - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - result = date_str.parseString('12/31/1999') - print(result.dump()) - prints:: - ['12', '/', '31', '/', '1999'] - - day: 1999 - - month: 31 - - year: 12 - """ - out = [] - NL = '\n' - out.append( indent+_ustr(self.asList()) ) - if full: - if self.haskeys(): - items = sorted((str(k), v) for k,v in self.items()) - for k,v in items: - if out: - out.append(NL) - out.append( "%s%s- %s: " % (indent,(' '*depth), k) ) - if isinstance(v,ParseResults): - if v: - out.append( v.dump(indent,depth+1) ) - else: - out.append(_ustr(v)) - else: - out.append(repr(v)) - elif any(isinstance(vv,ParseResults) for vv in self): - v = self - for i,vv in enumerate(v): - if isinstance(vv,ParseResults): - out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth)),i,indent,(' '*(depth+1)),vv.dump(indent,depth+1) )) - else: - out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth)),i,indent,(' '*(depth+1)),_ustr(vv))) - - return "".join(out) - - def pprint(self, *args, **kwargs): - """ - Pretty-printer for parsed results as a list, using the C{pprint} module. - Accepts additional positional or keyword args as defined for the - C{pprint.pprint} method. (U{http://docs.python.org/3/library/pprint.html#pprint.pprint}) - - Example:: - ident = Word(alphas, alphanums) - num = Word(nums) - func = Forward() - term = ident | num | Group('(' + func + ')') - func <<= ident + Group(Optional(delimitedList(term))) - result = func.parseString("fna a,b,(fnb c,d,200),100") - result.pprint(width=40) - prints:: - ['fna', - ['a', - 'b', - ['(', 'fnb', ['c', 'd', '200'], ')'], - '100']] - """ - pprint.pprint(self.asList(), *args, **kwargs) - - # add support for pickle protocol - def __getstate__(self): - return ( self.__toklist, - ( self.__tokdict.copy(), - self.__parent is not None and self.__parent() or None, - self.__accumNames, - self.__name ) ) - - def __setstate__(self,state): - self.__toklist = state[0] - (self.__tokdict, - par, - inAccumNames, - self.__name) = state[1] - self.__accumNames = {} - self.__accumNames.update(inAccumNames) - if par is not None: - self.__parent = wkref(par) - else: - self.__parent = None - - def __getnewargs__(self): - return self.__toklist, self.__name, self.__asList, self.__modal - - def __dir__(self): - return (dir(type(self)) + list(self.keys())) - -MutableMapping.register(ParseResults) - -def col (loc,strg): - """Returns current column within a string, counting newlines as line separators. - The first column is number 1. - - Note: the default parsing behavior is to expand tabs in the input string - before starting the parsing process. See L{I{ParserElement.parseString}<ParserElement.parseString>} for more information - on parsing strings containing C{<TAB>}s, and suggested methods to maintain a - consistent view of the parsed string, the parse location, and line and column - positions within the parsed string. - """ - s = strg - return 1 if 0<loc<len(s) and s[loc-1] == '\n' else loc - s.rfind("\n", 0, loc) - -def lineno(loc,strg): - """Returns current line number within a string, counting newlines as line separators. - The first line is number 1. - - Note: the default parsing behavior is to expand tabs in the input string - before starting the parsing process. See L{I{ParserElement.parseString}<ParserElement.parseString>} for more information - on parsing strings containing C{<TAB>}s, and suggested methods to maintain a - consistent view of the parsed string, the parse location, and line and column - positions within the parsed string. - """ - return strg.count("\n",0,loc) + 1 - -def line( loc, strg ): - """Returns the line of text containing loc within a string, counting newlines as line separators. - """ - lastCR = strg.rfind("\n", 0, loc) - nextCR = strg.find("\n", loc) - if nextCR >= 0: - return strg[lastCR+1:nextCR] - else: - return strg[lastCR+1:] - -def _defaultStartDebugAction( instring, loc, expr ): - print (("Match " + _ustr(expr) + " at loc " + _ustr(loc) + "(%d,%d)" % ( lineno(loc,instring), col(loc,instring) ))) - -def _defaultSuccessDebugAction( instring, startloc, endloc, expr, toks ): - print ("Matched " + _ustr(expr) + " -> " + str(toks.asList())) - -def _defaultExceptionDebugAction( instring, loc, expr, exc ): - print ("Exception raised:" + _ustr(exc)) - -def nullDebugAction(*args): - """'Do-nothing' debug action, to suppress debugging output during parsing.""" - pass - -# Only works on Python 3.x - nonlocal is toxic to Python 2 installs -#~ 'decorator to trim function calls to match the arity of the target' -#~ def _trim_arity(func, maxargs=3): - #~ if func in singleArgBuiltins: - #~ return lambda s,l,t: func(t) - #~ limit = 0 - #~ foundArity = False - #~ def wrapper(*args): - #~ nonlocal limit,foundArity - #~ while 1: - #~ try: - #~ ret = func(*args[limit:]) - #~ foundArity = True - #~ return ret - #~ except TypeError: - #~ if limit == maxargs or foundArity: - #~ raise - #~ limit += 1 - #~ continue - #~ return wrapper - -# this version is Python 2.x-3.x cross-compatible -'decorator to trim function calls to match the arity of the target' -def _trim_arity(func, maxargs=2): - if func in singleArgBuiltins: - return lambda s,l,t: func(t) - limit = [0] - foundArity = [False] - - # traceback return data structure changed in Py3.5 - normalize back to plain tuples - if system_version[:2] >= (3,5): - def extract_stack(limit=0): - # special handling for Python 3.5.0 - extra deep call stack by 1 - offset = -3 if system_version == (3,5,0) else -2 - frame_summary = traceback.extract_stack(limit=-offset+limit-1)[offset] - return [frame_summary[:2]] - def extract_tb(tb, limit=0): - frames = traceback.extract_tb(tb, limit=limit) - frame_summary = frames[-1] - return [frame_summary[:2]] - else: - extract_stack = traceback.extract_stack - extract_tb = traceback.extract_tb - - # synthesize what would be returned by traceback.extract_stack at the call to - # user's parse action 'func', so that we don't incur call penalty at parse time - - LINE_DIFF = 6 - # IF ANY CODE CHANGES, EVEN JUST COMMENTS OR BLANK LINES, BETWEEN THE NEXT LINE AND - # THE CALL TO FUNC INSIDE WRAPPER, LINE_DIFF MUST BE MODIFIED!!!! - this_line = extract_stack(limit=2)[-1] - pa_call_line_synth = (this_line[0], this_line[1]+LINE_DIFF) - - def wrapper(*args): - while 1: - try: - ret = func(*args[limit[0]:]) - foundArity[0] = True - return ret - except TypeError: - # re-raise TypeErrors if they did not come from our arity testing - if foundArity[0]: - raise - else: - try: - tb = sys.exc_info()[-1] - if not extract_tb(tb, limit=2)[-1][:2] == pa_call_line_synth: - raise - finally: - del tb - - if limit[0] <= maxargs: - limit[0] += 1 - continue - raise - - # copy func name to wrapper for sensible debug output - func_name = "<parse action>" - try: - func_name = getattr(func, '__name__', - getattr(func, '__class__').__name__) - except Exception: - func_name = str(func) - wrapper.__name__ = func_name - - return wrapper - -class ParserElement(object): - """Abstract base level parser element class.""" - DEFAULT_WHITE_CHARS = " \n\t\r" - verbose_stacktrace = False - - @staticmethod - def setDefaultWhitespaceChars( chars ): - r""" - Overrides the default whitespace chars - - Example:: - # default whitespace chars are space, <TAB> and newline - OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def', 'ghi', 'jkl'] - - # change to just treat newline as significant - ParserElement.setDefaultWhitespaceChars(" \t") - OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def'] - """ - ParserElement.DEFAULT_WHITE_CHARS = chars - - @staticmethod - def inlineLiteralsUsing(cls): - """ - Set class to be used for inclusion of string literals into a parser. - - Example:: - # default literal class used is Literal - integer = Word(nums) - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] - - - # change to Suppress - ParserElement.inlineLiteralsUsing(Suppress) - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - date_str.parseString("1999/12/31") # -> ['1999', '12', '31'] - """ - ParserElement._literalStringClass = cls - - def __init__( self, savelist=False ): - self.parseAction = list() - self.failAction = None - #~ self.name = "<unknown>" # don't define self.name, let subclasses try/except upcall - self.strRepr = None - self.resultsName = None - self.saveAsList = savelist - self.skipWhitespace = True - self.whiteChars = ParserElement.DEFAULT_WHITE_CHARS - self.copyDefaultWhiteChars = True - self.mayReturnEmpty = False # used when checking for left-recursion - self.keepTabs = False - self.ignoreExprs = list() - self.debug = False - self.streamlined = False - self.mayIndexError = True # used to optimize exception handling for subclasses that don't advance parse index - self.errmsg = "" - self.modalResults = True # used to mark results names as modal (report only last) or cumulative (list all) - self.debugActions = ( None, None, None ) #custom debug actions - self.re = None - self.callPreparse = True # used to avoid redundant calls to preParse - self.callDuringTry = False - - def copy( self ): - """ - Make a copy of this C{ParserElement}. Useful for defining different parse actions - for the same parsing pattern, using copies of the original parse element. - - Example:: - integer = Word(nums).setParseAction(lambda toks: int(toks[0])) - integerK = integer.copy().addParseAction(lambda toks: toks[0]*1024) + Suppress("K") - integerM = integer.copy().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") - - print(OneOrMore(integerK | integerM | integer).parseString("5K 100 640K 256M")) - prints:: - [5120, 100, 655360, 268435456] - Equivalent form of C{expr.copy()} is just C{expr()}:: - integerM = integer().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") - """ - cpy = copy.copy( self ) - cpy.parseAction = self.parseAction[:] - cpy.ignoreExprs = self.ignoreExprs[:] - if self.copyDefaultWhiteChars: - cpy.whiteChars = ParserElement.DEFAULT_WHITE_CHARS - return cpy - - def setName( self, name ): - """ - Define name for this expression, makes debugging and exception messages clearer. - - Example:: - Word(nums).parseString("ABC") # -> Exception: Expected W:(0123...) (at char 0), (line:1, col:1) - Word(nums).setName("integer").parseString("ABC") # -> Exception: Expected integer (at char 0), (line:1, col:1) - """ - self.name = name - self.errmsg = "Expected " + self.name - if hasattr(self,"exception"): - self.exception.msg = self.errmsg - return self - - def setResultsName( self, name, listAllMatches=False ): - """ - Define name for referencing matching tokens as a nested attribute - of the returned parse results. - NOTE: this returns a *copy* of the original C{ParserElement} object; - this is so that the client can define a basic element, such as an - integer, and reference it in multiple places with different names. - - You can also set results names using the abbreviated syntax, - C{expr("name")} in place of C{expr.setResultsName("name")} - - see L{I{__call__}<__call__>}. - - Example:: - date_str = (integer.setResultsName("year") + '/' - + integer.setResultsName("month") + '/' - + integer.setResultsName("day")) - - # equivalent form: - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - """ - newself = self.copy() - if name.endswith("*"): - name = name[:-1] - listAllMatches=True - newself.resultsName = name - newself.modalResults = not listAllMatches - return newself - - def setBreak(self,breakFlag = True): - """Method to invoke the Python pdb debugger when this element is - about to be parsed. Set C{breakFlag} to True to enable, False to - disable. - """ - if breakFlag: - _parseMethod = self._parse - def breaker(instring, loc, doActions=True, callPreParse=True): - import pdb - pdb.set_trace() - return _parseMethod( instring, loc, doActions, callPreParse ) - breaker._originalParseMethod = _parseMethod - self._parse = breaker - else: - if hasattr(self._parse,"_originalParseMethod"): - self._parse = self._parse._originalParseMethod - return self - - def setParseAction( self, *fns, **kwargs ): - """ - Define one or more actions to perform when successfully matching parse element definition. - Parse action fn is a callable method with 0-3 arguments, called as C{fn(s,loc,toks)}, - C{fn(loc,toks)}, C{fn(toks)}, or just C{fn()}, where: - - s = the original string being parsed (see note below) - - loc = the location of the matching substring - - toks = a list of the matched tokens, packaged as a C{L{ParseResults}} object - If the functions in fns modify the tokens, they can return them as the return - value from fn, and the modified list of tokens will replace the original. - Otherwise, fn does not need to return any value. - - Optional keyword arguments: - - callDuringTry = (default=C{False}) indicate if parse action should be run during lookaheads and alternate testing - - Note: the default parsing behavior is to expand tabs in the input string - before starting the parsing process. See L{I{parseString}<parseString>} for more information - on parsing strings containing C{<TAB>}s, and suggested methods to maintain a - consistent view of the parsed string, the parse location, and line and column - positions within the parsed string. - - Example:: - integer = Word(nums) - date_str = integer + '/' + integer + '/' + integer - - date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] - - # use parse action to convert to ints at parse time - integer = Word(nums).setParseAction(lambda toks: int(toks[0])) - date_str = integer + '/' + integer + '/' + integer - - # note that integer fields are now ints, not strings - date_str.parseString("1999/12/31") # -> [1999, '/', 12, '/', 31] - """ - self.parseAction = list(map(_trim_arity, list(fns))) - self.callDuringTry = kwargs.get("callDuringTry", False) - return self - - def addParseAction( self, *fns, **kwargs ): - """ - Add one or more parse actions to expression's list of parse actions. See L{I{setParseAction}<setParseAction>}. - - See examples in L{I{copy}<copy>}. - """ - self.parseAction += list(map(_trim_arity, list(fns))) - self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False) - return self - - def addCondition(self, *fns, **kwargs): - """Add a boolean predicate function to expression's list of parse actions. See - L{I{setParseAction}<setParseAction>} for function call signatures. Unlike C{setParseAction}, - functions passed to C{addCondition} need to return boolean success/fail of the condition. - - Optional keyword arguments: - - message = define a custom message to be used in the raised exception - - fatal = if True, will raise ParseFatalException to stop parsing immediately; otherwise will raise ParseException - - Example:: - integer = Word(nums).setParseAction(lambda toks: int(toks[0])) - year_int = integer.copy() - year_int.addCondition(lambda toks: toks[0] >= 2000, message="Only support years 2000 and later") - date_str = year_int + '/' + integer + '/' + integer - - result = date_str.parseString("1999/12/31") # -> Exception: Only support years 2000 and later (at char 0), (line:1, col:1) - """ - msg = kwargs.get("message", "failed user-defined condition") - exc_type = ParseFatalException if kwargs.get("fatal", False) else ParseException - for fn in fns: - def pa(s,l,t): - if not bool(_trim_arity(fn)(s,l,t)): - raise exc_type(s,l,msg) - self.parseAction.append(pa) - self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False) - return self - - def setFailAction( self, fn ): - """Define action to perform if parsing fails at this expression. - Fail acton fn is a callable function that takes the arguments - C{fn(s,loc,expr,err)} where: - - s = string being parsed - - loc = location where expression match was attempted and failed - - expr = the parse expression that failed - - err = the exception thrown - The function returns no value. It may throw C{L{ParseFatalException}} - if it is desired to stop parsing immediately.""" - self.failAction = fn - return self - - def _skipIgnorables( self, instring, loc ): - exprsFound = True - while exprsFound: - exprsFound = False - for e in self.ignoreExprs: - try: - while 1: - loc,dummy = e._parse( instring, loc ) - exprsFound = True - except ParseException: - pass - return loc - - def preParse( self, instring, loc ): - if self.ignoreExprs: - loc = self._skipIgnorables( instring, loc ) - - if self.skipWhitespace: - wt = self.whiteChars - instrlen = len(instring) - while loc < instrlen and instring[loc] in wt: - loc += 1 - - return loc - - def parseImpl( self, instring, loc, doActions=True ): - return loc, [] - - def postParse( self, instring, loc, tokenlist ): - return tokenlist - - #~ @profile - def _parseNoCache( self, instring, loc, doActions=True, callPreParse=True ): - debugging = ( self.debug ) #and doActions ) - - if debugging or self.failAction: - #~ print ("Match",self,"at loc",loc,"(%d,%d)" % ( lineno(loc,instring), col(loc,instring) )) - if (self.debugActions[0] ): - self.debugActions[0]( instring, loc, self ) - if callPreParse and self.callPreparse: - preloc = self.preParse( instring, loc ) - else: - preloc = loc - tokensStart = preloc - try: - try: - loc,tokens = self.parseImpl( instring, preloc, doActions ) - except IndexError: - raise ParseException( instring, len(instring), self.errmsg, self ) - except ParseBaseException as err: - #~ print ("Exception raised:", err) - if self.debugActions[2]: - self.debugActions[2]( instring, tokensStart, self, err ) - if self.failAction: - self.failAction( instring, tokensStart, self, err ) - raise - else: - if callPreParse and self.callPreparse: - preloc = self.preParse( instring, loc ) - else: - preloc = loc - tokensStart = preloc - if self.mayIndexError or preloc >= len(instring): - try: - loc,tokens = self.parseImpl( instring, preloc, doActions ) - except IndexError: - raise ParseException( instring, len(instring), self.errmsg, self ) - else: - loc,tokens = self.parseImpl( instring, preloc, doActions ) - - tokens = self.postParse( instring, loc, tokens ) - - retTokens = ParseResults( tokens, self.resultsName, asList=self.saveAsList, modal=self.modalResults ) - if self.parseAction and (doActions or self.callDuringTry): - if debugging: - try: - for fn in self.parseAction: - tokens = fn( instring, tokensStart, retTokens ) - if tokens is not None: - retTokens = ParseResults( tokens, - self.resultsName, - asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), - modal=self.modalResults ) - except ParseBaseException as err: - #~ print "Exception raised in user parse action:", err - if (self.debugActions[2] ): - self.debugActions[2]( instring, tokensStart, self, err ) - raise - else: - for fn in self.parseAction: - tokens = fn( instring, tokensStart, retTokens ) - if tokens is not None: - retTokens = ParseResults( tokens, - self.resultsName, - asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), - modal=self.modalResults ) - if debugging: - #~ print ("Matched",self,"->",retTokens.asList()) - if (self.debugActions[1] ): - self.debugActions[1]( instring, tokensStart, loc, self, retTokens ) - - return loc, retTokens - - def tryParse( self, instring, loc ): - try: - return self._parse( instring, loc, doActions=False )[0] - except ParseFatalException: - raise ParseException( instring, loc, self.errmsg, self) - - def canParseNext(self, instring, loc): - try: - self.tryParse(instring, loc) - except (ParseException, IndexError): - return False - else: - return True - - class _UnboundedCache(object): - def __init__(self): - cache = {} - self.not_in_cache = not_in_cache = object() - - def get(self, key): - return cache.get(key, not_in_cache) - - def set(self, key, value): - cache[key] = value - - def clear(self): - cache.clear() - - def cache_len(self): - return len(cache) - - self.get = types.MethodType(get, self) - self.set = types.MethodType(set, self) - self.clear = types.MethodType(clear, self) - self.__len__ = types.MethodType(cache_len, self) - - if _OrderedDict is not None: - class _FifoCache(object): - def __init__(self, size): - self.not_in_cache = not_in_cache = object() - - cache = _OrderedDict() - - def get(self, key): - return cache.get(key, not_in_cache) - - def set(self, key, value): - cache[key] = value - while len(cache) > size: - try: - cache.popitem(False) - except KeyError: - pass - - def clear(self): - cache.clear() - - def cache_len(self): - return len(cache) - - self.get = types.MethodType(get, self) - self.set = types.MethodType(set, self) - self.clear = types.MethodType(clear, self) - self.__len__ = types.MethodType(cache_len, self) - - else: - class _FifoCache(object): - def __init__(self, size): - self.not_in_cache = not_in_cache = object() - - cache = {} - key_fifo = collections.deque([], size) - - def get(self, key): - return cache.get(key, not_in_cache) - - def set(self, key, value): - cache[key] = value - while len(key_fifo) > size: - cache.pop(key_fifo.popleft(), None) - key_fifo.append(key) - - def clear(self): - cache.clear() - key_fifo.clear() - - def cache_len(self): - return len(cache) - - self.get = types.MethodType(get, self) - self.set = types.MethodType(set, self) - self.clear = types.MethodType(clear, self) - self.__len__ = types.MethodType(cache_len, self) - - # argument cache for optimizing repeated calls when backtracking through recursive expressions - packrat_cache = {} # this is set later by enabledPackrat(); this is here so that resetCache() doesn't fail - packrat_cache_lock = RLock() - packrat_cache_stats = [0, 0] - - # this method gets repeatedly called during backtracking with the same arguments - - # we can cache these arguments and save ourselves the trouble of re-parsing the contained expression - def _parseCache( self, instring, loc, doActions=True, callPreParse=True ): - HIT, MISS = 0, 1 - lookup = (self, instring, loc, callPreParse, doActions) - with ParserElement.packrat_cache_lock: - cache = ParserElement.packrat_cache - value = cache.get(lookup) - if value is cache.not_in_cache: - ParserElement.packrat_cache_stats[MISS] += 1 - try: - value = self._parseNoCache(instring, loc, doActions, callPreParse) - except ParseBaseException as pe: - # cache a copy of the exception, without the traceback - cache.set(lookup, pe.__class__(*pe.args)) - raise - else: - cache.set(lookup, (value[0], value[1].copy())) - return value - else: - ParserElement.packrat_cache_stats[HIT] += 1 - if isinstance(value, Exception): - raise value - return (value[0], value[1].copy()) - - _parse = _parseNoCache - - @staticmethod - def resetCache(): - ParserElement.packrat_cache.clear() - ParserElement.packrat_cache_stats[:] = [0] * len(ParserElement.packrat_cache_stats) - - _packratEnabled = False - @staticmethod - def enablePackrat(cache_size_limit=128): - """Enables "packrat" parsing, which adds memoizing to the parsing logic. - Repeated parse attempts at the same string location (which happens - often in many complex grammars) can immediately return a cached value, - instead of re-executing parsing/validating code. Memoizing is done of - both valid results and parsing exceptions. - - Parameters: - - cache_size_limit - (default=C{128}) - if an integer value is provided - will limit the size of the packrat cache; if None is passed, then - the cache size will be unbounded; if 0 is passed, the cache will - be effectively disabled. - - This speedup may break existing programs that use parse actions that - have side-effects. For this reason, packrat parsing is disabled when - you first import pyparsing. To activate the packrat feature, your - program must call the class method C{ParserElement.enablePackrat()}. If - your program uses C{psyco} to "compile as you go", you must call - C{enablePackrat} before calling C{psyco.full()}. If you do not do this, - Python will crash. For best results, call C{enablePackrat()} immediately - after importing pyparsing. - - Example:: - import pyparsing - pyparsing.ParserElement.enablePackrat() - """ - if not ParserElement._packratEnabled: - ParserElement._packratEnabled = True - if cache_size_limit is None: - ParserElement.packrat_cache = ParserElement._UnboundedCache() - else: - ParserElement.packrat_cache = ParserElement._FifoCache(cache_size_limit) - ParserElement._parse = ParserElement._parseCache - - def parseString( self, instring, parseAll=False ): - """ - Execute the parse expression with the given string. - This is the main interface to the client code, once the complete - expression has been built. - - If you want the grammar to require that the entire input string be - successfully parsed, then set C{parseAll} to True (equivalent to ending - the grammar with C{L{StringEnd()}}). - - Note: C{parseString} implicitly calls C{expandtabs()} on the input string, - in order to report proper column numbers in parse actions. - If the input string contains tabs and - the grammar uses parse actions that use the C{loc} argument to index into the - string being parsed, you can ensure you have a consistent view of the input - string by: - - calling C{parseWithTabs} on your grammar before calling C{parseString} - (see L{I{parseWithTabs}<parseWithTabs>}) - - define your parse action using the full C{(s,loc,toks)} signature, and - reference the input string using the parse action's C{s} argument - - explictly expand the tabs in your input string before calling - C{parseString} - - Example:: - Word('a').parseString('aaaaabaaa') # -> ['aaaaa'] - Word('a').parseString('aaaaabaaa', parseAll=True) # -> Exception: Expected end of text - """ - ParserElement.resetCache() - if not self.streamlined: - self.streamline() - #~ self.saveAsList = True - for e in self.ignoreExprs: - e.streamline() - if not self.keepTabs: - instring = instring.expandtabs() - try: - loc, tokens = self._parse( instring, 0 ) - if parseAll: - loc = self.preParse( instring, loc ) - se = Empty() + StringEnd() - se._parse( instring, loc ) - except ParseBaseException as exc: - if ParserElement.verbose_stacktrace: - raise - else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace - raise exc - else: - return tokens - - def scanString( self, instring, maxMatches=_MAX_INT, overlap=False ): - """ - Scan the input string for expression matches. Each match will return the - matching tokens, start location, and end location. May be called with optional - C{maxMatches} argument, to clip scanning after 'n' matches are found. If - C{overlap} is specified, then overlapping matches will be reported. - - Note that the start and end locations are reported relative to the string - being parsed. See L{I{parseString}<parseString>} for more information on parsing - strings with embedded tabs. - - Example:: - source = "sldjf123lsdjjkf345sldkjf879lkjsfd987" - print(source) - for tokens,start,end in Word(alphas).scanString(source): - print(' '*start + '^'*(end-start)) - print(' '*start + tokens[0]) - - prints:: - - sldjf123lsdjjkf345sldkjf879lkjsfd987 - ^^^^^ - sldjf - ^^^^^^^ - lsdjjkf - ^^^^^^ - sldkjf - ^^^^^^ - lkjsfd - """ - if not self.streamlined: - self.streamline() - for e in self.ignoreExprs: - e.streamline() - - if not self.keepTabs: - instring = _ustr(instring).expandtabs() - instrlen = len(instring) - loc = 0 - preparseFn = self.preParse - parseFn = self._parse - ParserElement.resetCache() - matches = 0 - try: - while loc <= instrlen and matches < maxMatches: - try: - preloc = preparseFn( instring, loc ) - nextLoc,tokens = parseFn( instring, preloc, callPreParse=False ) - except ParseException: - loc = preloc+1 - else: - if nextLoc > loc: - matches += 1 - yield tokens, preloc, nextLoc - if overlap: - nextloc = preparseFn( instring, loc ) - if nextloc > loc: - loc = nextLoc - else: - loc += 1 - else: - loc = nextLoc - else: - loc = preloc+1 - except ParseBaseException as exc: - if ParserElement.verbose_stacktrace: - raise - else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace - raise exc - - def transformString( self, instring ): - """ - Extension to C{L{scanString}}, to modify matching text with modified tokens that may - be returned from a parse action. To use C{transformString}, define a grammar and - attach a parse action to it that modifies the returned token list. - Invoking C{transformString()} on a target string will then scan for matches, - and replace the matched text patterns according to the logic in the parse - action. C{transformString()} returns the resulting transformed string. - - Example:: - wd = Word(alphas) - wd.setParseAction(lambda toks: toks[0].title()) - - print(wd.transformString("now is the winter of our discontent made glorious summer by this sun of york.")) - Prints:: - Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York. - """ - out = [] - lastE = 0 - # force preservation of <TAB>s, to minimize unwanted transformation of string, and to - # keep string locs straight between transformString and scanString - self.keepTabs = True - try: - for t,s,e in self.scanString( instring ): - out.append( instring[lastE:s] ) - if t: - if isinstance(t,ParseResults): - out += t.asList() - elif isinstance(t,list): - out += t - else: - out.append(t) - lastE = e - out.append(instring[lastE:]) - out = [o for o in out if o] - return "".join(map(_ustr,_flatten(out))) - except ParseBaseException as exc: - if ParserElement.verbose_stacktrace: - raise - else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace - raise exc - - def searchString( self, instring, maxMatches=_MAX_INT ): - """ - Another extension to C{L{scanString}}, simplifying the access to the tokens found - to match the given parse expression. May be called with optional - C{maxMatches} argument, to clip searching after 'n' matches are found. - - Example:: - # a capitalized word starts with an uppercase letter, followed by zero or more lowercase letters - cap_word = Word(alphas.upper(), alphas.lower()) - - print(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity")) - - # the sum() builtin can be used to merge results into a single ParseResults object - print(sum(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity"))) - prints:: - [['More'], ['Iron'], ['Lead'], ['Gold'], ['I'], ['Electricity']] - ['More', 'Iron', 'Lead', 'Gold', 'I', 'Electricity'] - """ - try: - return ParseResults([ t for t,s,e in self.scanString( instring, maxMatches ) ]) - except ParseBaseException as exc: - if ParserElement.verbose_stacktrace: - raise - else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace - raise exc - - def split(self, instring, maxsplit=_MAX_INT, includeSeparators=False): - """ - Generator method to split a string using the given expression as a separator. - May be called with optional C{maxsplit} argument, to limit the number of splits; - and the optional C{includeSeparators} argument (default=C{False}), if the separating - matching text should be included in the split results. - - Example:: - punc = oneOf(list(".,;:/-!?")) - print(list(punc.split("This, this?, this sentence, is badly punctuated!"))) - prints:: - ['This', ' this', '', ' this sentence', ' is badly punctuated', ''] - """ - splits = 0 - last = 0 - for t,s,e in self.scanString(instring, maxMatches=maxsplit): - yield instring[last:s] - if includeSeparators: - yield t[0] - last = e - yield instring[last:] - - def __add__(self, other ): - """ - Implementation of + operator - returns C{L{And}}. Adding strings to a ParserElement - converts them to L{Literal}s by default. - - Example:: - greet = Word(alphas) + "," + Word(alphas) + "!" - hello = "Hello, World!" - print (hello, "->", greet.parseString(hello)) - Prints:: - Hello, World! -> ['Hello', ',', 'World', '!'] - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return And( [ self, other ] ) - - def __radd__(self, other ): - """ - Implementation of + operator when left operand is not a C{L{ParserElement}} - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return other + self - - def __sub__(self, other): - """ - Implementation of - operator, returns C{L{And}} with error stop - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return self + And._ErrorStop() + other - - def __rsub__(self, other ): - """ - Implementation of - operator when left operand is not a C{L{ParserElement}} - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return other - self - - def __mul__(self,other): - """ - Implementation of * operator, allows use of C{expr * 3} in place of - C{expr + expr + expr}. Expressions may also me multiplied by a 2-integer - tuple, similar to C{{min,max}} multipliers in regular expressions. Tuples - may also include C{None} as in: - - C{expr*(n,None)} or C{expr*(n,)} is equivalent - to C{expr*n + L{ZeroOrMore}(expr)} - (read as "at least n instances of C{expr}") - - C{expr*(None,n)} is equivalent to C{expr*(0,n)} - (read as "0 to n instances of C{expr}") - - C{expr*(None,None)} is equivalent to C{L{ZeroOrMore}(expr)} - - C{expr*(1,None)} is equivalent to C{L{OneOrMore}(expr)} - - Note that C{expr*(None,n)} does not raise an exception if - more than n exprs exist in the input stream; that is, - C{expr*(None,n)} does not enforce a maximum number of expr - occurrences. If this behavior is desired, then write - C{expr*(None,n) + ~expr} - """ - if isinstance(other,int): - minElements, optElements = other,0 - elif isinstance(other,tuple): - other = (other + (None, None))[:2] - if other[0] is None: - other = (0, other[1]) - if isinstance(other[0],int) and other[1] is None: - if other[0] == 0: - return ZeroOrMore(self) - if other[0] == 1: - return OneOrMore(self) - else: - return self*other[0] + ZeroOrMore(self) - elif isinstance(other[0],int) and isinstance(other[1],int): - minElements, optElements = other - optElements -= minElements - else: - raise TypeError("cannot multiply 'ParserElement' and ('%s','%s') objects", type(other[0]),type(other[1])) - else: - raise TypeError("cannot multiply 'ParserElement' and '%s' objects", type(other)) - - if minElements < 0: - raise ValueError("cannot multiply ParserElement by negative value") - if optElements < 0: - raise ValueError("second tuple value must be greater or equal to first tuple value") - if minElements == optElements == 0: - raise ValueError("cannot multiply ParserElement by 0 or (0,0)") - - if (optElements): - def makeOptionalList(n): - if n>1: - return Optional(self + makeOptionalList(n-1)) - else: - return Optional(self) - if minElements: - if minElements == 1: - ret = self + makeOptionalList(optElements) - else: - ret = And([self]*minElements) + makeOptionalList(optElements) - else: - ret = makeOptionalList(optElements) - else: - if minElements == 1: - ret = self - else: - ret = And([self]*minElements) - return ret - - def __rmul__(self, other): - return self.__mul__(other) - - def __or__(self, other ): - """ - Implementation of | operator - returns C{L{MatchFirst}} - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return MatchFirst( [ self, other ] ) - - def __ror__(self, other ): - """ - Implementation of | operator when left operand is not a C{L{ParserElement}} - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return other | self - - def __xor__(self, other ): - """ - Implementation of ^ operator - returns C{L{Or}} - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return Or( [ self, other ] ) - - def __rxor__(self, other ): - """ - Implementation of ^ operator when left operand is not a C{L{ParserElement}} - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return other ^ self - - def __and__(self, other ): - """ - Implementation of & operator - returns C{L{Each}} - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return Each( [ self, other ] ) - - def __rand__(self, other ): - """ - Implementation of & operator when left operand is not a C{L{ParserElement}} - """ - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - if not isinstance( other, ParserElement ): - warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), - SyntaxWarning, stacklevel=2) - return None - return other & self - - def __invert__( self ): - """ - Implementation of ~ operator - returns C{L{NotAny}} - """ - return NotAny( self ) - - def __call__(self, name=None): - """ - Shortcut for C{L{setResultsName}}, with C{listAllMatches=False}. - - If C{name} is given with a trailing C{'*'} character, then C{listAllMatches} will be - passed as C{True}. - - If C{name} is omitted, same as calling C{L{copy}}. - - Example:: - # these are equivalent - userdata = Word(alphas).setResultsName("name") + Word(nums+"-").setResultsName("socsecno") - userdata = Word(alphas)("name") + Word(nums+"-")("socsecno") - """ - if name is not None: - return self.setResultsName(name) - else: - return self.copy() - - def suppress( self ): - """ - Suppresses the output of this C{ParserElement}; useful to keep punctuation from - cluttering up returned output. - """ - return Suppress( self ) - - def leaveWhitespace( self ): - """ - Disables the skipping of whitespace before matching the characters in the - C{ParserElement}'s defined pattern. This is normally only used internally by - the pyparsing module, but may be needed in some whitespace-sensitive grammars. - """ - self.skipWhitespace = False - return self - - def setWhitespaceChars( self, chars ): - """ - Overrides the default whitespace chars - """ - self.skipWhitespace = True - self.whiteChars = chars - self.copyDefaultWhiteChars = False - return self - - def parseWithTabs( self ): - """ - Overrides default behavior to expand C{<TAB>}s to spaces before parsing the input string. - Must be called before C{parseString} when the input grammar contains elements that - match C{<TAB>} characters. - """ - self.keepTabs = True - return self - - def ignore( self, other ): - """ - Define expression to be ignored (e.g., comments) while doing pattern - matching; may be called repeatedly, to define multiple comment or other - ignorable patterns. - - Example:: - patt = OneOrMore(Word(alphas)) - patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj'] - - patt.ignore(cStyleComment) - patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj', 'lskjd'] - """ - if isinstance(other, basestring): - other = Suppress(other) - - if isinstance( other, Suppress ): - if other not in self.ignoreExprs: - self.ignoreExprs.append(other) - else: - self.ignoreExprs.append( Suppress( other.copy() ) ) - return self - - def setDebugActions( self, startAction, successAction, exceptionAction ): - """ - Enable display of debugging messages while doing pattern matching. - """ - self.debugActions = (startAction or _defaultStartDebugAction, - successAction or _defaultSuccessDebugAction, - exceptionAction or _defaultExceptionDebugAction) - self.debug = True - return self - - def setDebug( self, flag=True ): - """ - Enable display of debugging messages while doing pattern matching. - Set C{flag} to True to enable, False to disable. - - Example:: - wd = Word(alphas).setName("alphaword") - integer = Word(nums).setName("numword") - term = wd | integer - - # turn on debugging for wd - wd.setDebug() - - OneOrMore(term).parseString("abc 123 xyz 890") - - prints:: - Match alphaword at loc 0(1,1) - Matched alphaword -> ['abc'] - Match alphaword at loc 3(1,4) - Exception raised:Expected alphaword (at char 4), (line:1, col:5) - Match alphaword at loc 7(1,8) - Matched alphaword -> ['xyz'] - Match alphaword at loc 11(1,12) - Exception raised:Expected alphaword (at char 12), (line:1, col:13) - Match alphaword at loc 15(1,16) - Exception raised:Expected alphaword (at char 15), (line:1, col:16) - - The output shown is that produced by the default debug actions - custom debug actions can be - specified using L{setDebugActions}. Prior to attempting - to match the C{wd} expression, the debugging message C{"Match <exprname> at loc <n>(<line>,<col>)"} - is shown. Then if the parse succeeds, a C{"Matched"} message is shown, or an C{"Exception raised"} - message is shown. Also note the use of L{setName} to assign a human-readable name to the expression, - which makes debugging and exception messages easier to understand - for instance, the default - name created for the C{Word} expression without calling C{setName} is C{"W:(ABCD...)"}. - """ - if flag: - self.setDebugActions( _defaultStartDebugAction, _defaultSuccessDebugAction, _defaultExceptionDebugAction ) - else: - self.debug = False - return self - - def __str__( self ): - return self.name - - def __repr__( self ): - return _ustr(self) - - def streamline( self ): - self.streamlined = True - self.strRepr = None - return self - - def checkRecursion( self, parseElementList ): - pass - - def validate( self, validateTrace=[] ): - """ - Check defined expressions for valid structure, check for infinite recursive definitions. - """ - self.checkRecursion( [] ) - - def parseFile( self, file_or_filename, parseAll=False ): - """ - Execute the parse expression on the given file or filename. - If a filename is specified (instead of a file object), - the entire file is opened, read, and closed before parsing. - """ - try: - file_contents = file_or_filename.read() - except AttributeError: - with open(file_or_filename, "r") as f: - file_contents = f.read() - try: - return self.parseString(file_contents, parseAll) - except ParseBaseException as exc: - if ParserElement.verbose_stacktrace: - raise - else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace - raise exc - - def __eq__(self,other): - if isinstance(other, ParserElement): - return self is other or vars(self) == vars(other) - elif isinstance(other, basestring): - return self.matches(other) - else: - return super(ParserElement,self)==other - - def __ne__(self,other): - return not (self == other) - - def __hash__(self): - return hash(id(self)) - - def __req__(self,other): - return self == other - - def __rne__(self,other): - return not (self == other) - - def matches(self, testString, parseAll=True): - """ - Method for quick testing of a parser against a test string. Good for simple - inline microtests of sub expressions while building up larger parser. - - Parameters: - - testString - to test against this expression for a match - - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests - - Example:: - expr = Word(nums) - assert expr.matches("100") - """ - try: - self.parseString(_ustr(testString), parseAll=parseAll) - return True - except ParseBaseException: - return False - - def runTests(self, tests, parseAll=True, comment='#', fullDump=True, printResults=True, failureTests=False): - """ - Execute the parse expression on a series of test strings, showing each - test, the parsed results or where the parse failed. Quick and easy way to - run a parse expression against a list of sample strings. - - Parameters: - - tests - a list of separate test strings, or a multiline string of test strings - - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests - - comment - (default=C{'#'}) - expression for indicating embedded comments in the test - string; pass None to disable comment filtering - - fullDump - (default=C{True}) - dump results as list followed by results names in nested outline; - if False, only dump nested list - - printResults - (default=C{True}) prints test output to stdout - - failureTests - (default=C{False}) indicates if these tests are expected to fail parsing - - Returns: a (success, results) tuple, where success indicates that all tests succeeded - (or failed if C{failureTests} is True), and the results contain a list of lines of each - test's output - - Example:: - number_expr = pyparsing_common.number.copy() - - result = number_expr.runTests(''' - # unsigned integer - 100 - # negative integer - -100 - # float with scientific notation - 6.02e23 - # integer with scientific notation - 1e-12 - ''') - print("Success" if result[0] else "Failed!") - - result = number_expr.runTests(''' - # stray character - 100Z - # missing leading digit before '.' - -.100 - # too many '.' - 3.14.159 - ''', failureTests=True) - print("Success" if result[0] else "Failed!") - prints:: - # unsigned integer - 100 - [100] - - # negative integer - -100 - [-100] - - # float with scientific notation - 6.02e23 - [6.02e+23] - - # integer with scientific notation - 1e-12 - [1e-12] - - Success - - # stray character - 100Z - ^ - FAIL: Expected end of text (at char 3), (line:1, col:4) - - # missing leading digit before '.' - -.100 - ^ - FAIL: Expected {real number with scientific notation | real number | signed integer} (at char 0), (line:1, col:1) - - # too many '.' - 3.14.159 - ^ - FAIL: Expected end of text (at char 4), (line:1, col:5) - - Success - - Each test string must be on a single line. If you want to test a string that spans multiple - lines, create a test like this:: - - expr.runTest(r"this is a test\\n of strings that spans \\n 3 lines") - - (Note that this is a raw string literal, you must include the leading 'r'.) - """ - if isinstance(tests, basestring): - tests = list(map(str.strip, tests.rstrip().splitlines())) - if isinstance(comment, basestring): - comment = Literal(comment) - allResults = [] - comments = [] - success = True - for t in tests: - if comment is not None and comment.matches(t, False) or comments and not t: - comments.append(t) - continue - if not t: - continue - out = ['\n'.join(comments), t] - comments = [] - try: - t = t.replace(r'\n','\n') - result = self.parseString(t, parseAll=parseAll) - out.append(result.dump(full=fullDump)) - success = success and not failureTests - except ParseBaseException as pe: - fatal = "(FATAL)" if isinstance(pe, ParseFatalException) else "" - if '\n' in t: - out.append(line(pe.loc, t)) - out.append(' '*(col(pe.loc,t)-1) + '^' + fatal) - else: - out.append(' '*pe.loc + '^' + fatal) - out.append("FAIL: " + str(pe)) - success = success and failureTests - result = pe - except Exception as exc: - out.append("FAIL-EXCEPTION: " + str(exc)) - success = success and failureTests - result = exc - - if printResults: - if fullDump: - out.append('') - print('\n'.join(out)) - - allResults.append((t, result)) - - return success, allResults - - -class Token(ParserElement): - """ - Abstract C{ParserElement} subclass, for defining atomic matching patterns. - """ - def __init__( self ): - super(Token,self).__init__( savelist=False ) - - -class Empty(Token): - """ - An empty token, will always match. - """ - def __init__( self ): - super(Empty,self).__init__() - self.name = "Empty" - self.mayReturnEmpty = True - self.mayIndexError = False - - -class NoMatch(Token): - """ - A token that will never match. - """ - def __init__( self ): - super(NoMatch,self).__init__() - self.name = "NoMatch" - self.mayReturnEmpty = True - self.mayIndexError = False - self.errmsg = "Unmatchable token" - - def parseImpl( self, instring, loc, doActions=True ): - raise ParseException(instring, loc, self.errmsg, self) - - -class Literal(Token): - """ - Token to exactly match a specified string. - - Example:: - Literal('blah').parseString('blah') # -> ['blah'] - Literal('blah').parseString('blahfooblah') # -> ['blah'] - Literal('blah').parseString('bla') # -> Exception: Expected "blah" - - For case-insensitive matching, use L{CaselessLiteral}. - - For keyword matching (force word break before and after the matched string), - use L{Keyword} or L{CaselessKeyword}. - """ - def __init__( self, matchString ): - super(Literal,self).__init__() - self.match = matchString - self.matchLen = len(matchString) - try: - self.firstMatchChar = matchString[0] - except IndexError: - warnings.warn("null string passed to Literal; use Empty() instead", - SyntaxWarning, stacklevel=2) - self.__class__ = Empty - self.name = '"%s"' % _ustr(self.match) - self.errmsg = "Expected " + self.name - self.mayReturnEmpty = False - self.mayIndexError = False - - # Performance tuning: this routine gets called a *lot* - # if this is a single character match string and the first character matches, - # short-circuit as quickly as possible, and avoid calling startswith - #~ @profile - def parseImpl( self, instring, loc, doActions=True ): - if (instring[loc] == self.firstMatchChar and - (self.matchLen==1 or instring.startswith(self.match,loc)) ): - return loc+self.matchLen, self.match - raise ParseException(instring, loc, self.errmsg, self) -_L = Literal -ParserElement._literalStringClass = Literal - -class Keyword(Token): - """ - Token to exactly match a specified string as a keyword, that is, it must be - immediately followed by a non-keyword character. Compare with C{L{Literal}}: - - C{Literal("if")} will match the leading C{'if'} in C{'ifAndOnlyIf'}. - - C{Keyword("if")} will not; it will only match the leading C{'if'} in C{'if x=1'}, or C{'if(y==2)'} - Accepts two optional constructor arguments in addition to the keyword string: - - C{identChars} is a string of characters that would be valid identifier characters, - defaulting to all alphanumerics + "_" and "$" - - C{caseless} allows case-insensitive matching, default is C{False}. - - Example:: - Keyword("start").parseString("start") # -> ['start'] - Keyword("start").parseString("starting") # -> Exception - - For case-insensitive matching, use L{CaselessKeyword}. - """ - DEFAULT_KEYWORD_CHARS = alphanums+"_$" - - def __init__( self, matchString, identChars=None, caseless=False ): - super(Keyword,self).__init__() - if identChars is None: - identChars = Keyword.DEFAULT_KEYWORD_CHARS - self.match = matchString - self.matchLen = len(matchString) - try: - self.firstMatchChar = matchString[0] - except IndexError: - warnings.warn("null string passed to Keyword; use Empty() instead", - SyntaxWarning, stacklevel=2) - self.name = '"%s"' % self.match - self.errmsg = "Expected " + self.name - self.mayReturnEmpty = False - self.mayIndexError = False - self.caseless = caseless - if caseless: - self.caselessmatch = matchString.upper() - identChars = identChars.upper() - self.identChars = set(identChars) - - def parseImpl( self, instring, loc, doActions=True ): - if self.caseless: - if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and - (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) and - (loc == 0 or instring[loc-1].upper() not in self.identChars) ): - return loc+self.matchLen, self.match - else: - if (instring[loc] == self.firstMatchChar and - (self.matchLen==1 or instring.startswith(self.match,loc)) and - (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen] not in self.identChars) and - (loc == 0 or instring[loc-1] not in self.identChars) ): - return loc+self.matchLen, self.match - raise ParseException(instring, loc, self.errmsg, self) - - def copy(self): - c = super(Keyword,self).copy() - c.identChars = Keyword.DEFAULT_KEYWORD_CHARS - return c - - @staticmethod - def setDefaultKeywordChars( chars ): - """Overrides the default Keyword chars - """ - Keyword.DEFAULT_KEYWORD_CHARS = chars - -class CaselessLiteral(Literal): - """ - Token to match a specified string, ignoring case of letters. - Note: the matched results will always be in the case of the given - match string, NOT the case of the input text. - - Example:: - OneOrMore(CaselessLiteral("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD', 'CMD'] - - (Contrast with example for L{CaselessKeyword}.) - """ - def __init__( self, matchString ): - super(CaselessLiteral,self).__init__( matchString.upper() ) - # Preserve the defining literal. - self.returnString = matchString - self.name = "'%s'" % self.returnString - self.errmsg = "Expected " + self.name - - def parseImpl( self, instring, loc, doActions=True ): - if instring[ loc:loc+self.matchLen ].upper() == self.match: - return loc+self.matchLen, self.returnString - raise ParseException(instring, loc, self.errmsg, self) - -class CaselessKeyword(Keyword): - """ - Caseless version of L{Keyword}. - - Example:: - OneOrMore(CaselessKeyword("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD'] - - (Contrast with example for L{CaselessLiteral}.) - """ - def __init__( self, matchString, identChars=None ): - super(CaselessKeyword,self).__init__( matchString, identChars, caseless=True ) - - def parseImpl( self, instring, loc, doActions=True ): - if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and - (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) ): - return loc+self.matchLen, self.match - raise ParseException(instring, loc, self.errmsg, self) - -class CloseMatch(Token): - """ - A variation on L{Literal} which matches "close" matches, that is, - strings with at most 'n' mismatching characters. C{CloseMatch} takes parameters: - - C{match_string} - string to be matched - - C{maxMismatches} - (C{default=1}) maximum number of mismatches allowed to count as a match - - The results from a successful parse will contain the matched text from the input string and the following named results: - - C{mismatches} - a list of the positions within the match_string where mismatches were found - - C{original} - the original match_string used to compare against the input string - - If C{mismatches} is an empty list, then the match was an exact match. - - Example:: - patt = CloseMatch("ATCATCGAATGGA") - patt.parseString("ATCATCGAAXGGA") # -> (['ATCATCGAAXGGA'], {'mismatches': [[9]], 'original': ['ATCATCGAATGGA']}) - patt.parseString("ATCAXCGAAXGGA") # -> Exception: Expected 'ATCATCGAATGGA' (with up to 1 mismatches) (at char 0), (line:1, col:1) - - # exact match - patt.parseString("ATCATCGAATGGA") # -> (['ATCATCGAATGGA'], {'mismatches': [[]], 'original': ['ATCATCGAATGGA']}) - - # close match allowing up to 2 mismatches - patt = CloseMatch("ATCATCGAATGGA", maxMismatches=2) - patt.parseString("ATCAXCGAAXGGA") # -> (['ATCAXCGAAXGGA'], {'mismatches': [[4, 9]], 'original': ['ATCATCGAATGGA']}) - """ - def __init__(self, match_string, maxMismatches=1): - super(CloseMatch,self).__init__() - self.name = match_string - self.match_string = match_string - self.maxMismatches = maxMismatches - self.errmsg = "Expected %r (with up to %d mismatches)" % (self.match_string, self.maxMismatches) - self.mayIndexError = False - self.mayReturnEmpty = False - - def parseImpl( self, instring, loc, doActions=True ): - start = loc - instrlen = len(instring) - maxloc = start + len(self.match_string) - - if maxloc <= instrlen: - match_string = self.match_string - match_stringloc = 0 - mismatches = [] - maxMismatches = self.maxMismatches - - for match_stringloc,s_m in enumerate(zip(instring[loc:maxloc], self.match_string)): - src,mat = s_m - if src != mat: - mismatches.append(match_stringloc) - if len(mismatches) > maxMismatches: - break - else: - loc = match_stringloc + 1 - results = ParseResults([instring[start:loc]]) - results['original'] = self.match_string - results['mismatches'] = mismatches - return loc, results - - raise ParseException(instring, loc, self.errmsg, self) - - -class Word(Token): - """ - Token for matching words composed of allowed character sets. - Defined with string containing all allowed initial characters, - an optional string containing allowed body characters (if omitted, - defaults to the initial character set), and an optional minimum, - maximum, and/or exact length. The default value for C{min} is 1 (a - minimum value < 1 is not valid); the default values for C{max} and C{exact} - are 0, meaning no maximum or exact length restriction. An optional - C{excludeChars} parameter can list characters that might be found in - the input C{bodyChars} string; useful to define a word of all printables - except for one or two characters, for instance. - - L{srange} is useful for defining custom character set strings for defining - C{Word} expressions, using range notation from regular expression character sets. - - A common mistake is to use C{Word} to match a specific literal string, as in - C{Word("Address")}. Remember that C{Word} uses the string argument to define - I{sets} of matchable characters. This expression would match "Add", "AAA", - "dAred", or any other word made up of the characters 'A', 'd', 'r', 'e', and 's'. - To match an exact literal string, use L{Literal} or L{Keyword}. - - pyparsing includes helper strings for building Words: - - L{alphas} - - L{nums} - - L{alphanums} - - L{hexnums} - - L{alphas8bit} (alphabetic characters in ASCII range 128-255 - accented, tilded, umlauted, etc.) - - L{punc8bit} (non-alphabetic characters in ASCII range 128-255 - currency, symbols, superscripts, diacriticals, etc.) - - L{printables} (any non-whitespace character) - - Example:: - # a word composed of digits - integer = Word(nums) # equivalent to Word("0123456789") or Word(srange("0-9")) - - # a word with a leading capital, and zero or more lowercase - capital_word = Word(alphas.upper(), alphas.lower()) - - # hostnames are alphanumeric, with leading alpha, and '-' - hostname = Word(alphas, alphanums+'-') - - # roman numeral (not a strict parser, accepts invalid mix of characters) - roman = Word("IVXLCDM") - - # any string of non-whitespace characters, except for ',' - csv_value = Word(printables, excludeChars=",") - """ - def __init__( self, initChars, bodyChars=None, min=1, max=0, exact=0, asKeyword=False, excludeChars=None ): - super(Word,self).__init__() - if excludeChars: - initChars = ''.join(c for c in initChars if c not in excludeChars) - if bodyChars: - bodyChars = ''.join(c for c in bodyChars if c not in excludeChars) - self.initCharsOrig = initChars - self.initChars = set(initChars) - if bodyChars : - self.bodyCharsOrig = bodyChars - self.bodyChars = set(bodyChars) - else: - self.bodyCharsOrig = initChars - self.bodyChars = set(initChars) - - self.maxSpecified = max > 0 - - if min < 1: - raise ValueError("cannot specify a minimum length < 1; use Optional(Word()) if zero-length word is permitted") - - self.minLen = min - - if max > 0: - self.maxLen = max - else: - self.maxLen = _MAX_INT - - if exact > 0: - self.maxLen = exact - self.minLen = exact - - self.name = _ustr(self) - self.errmsg = "Expected " + self.name - self.mayIndexError = False - self.asKeyword = asKeyword - - if ' ' not in self.initCharsOrig+self.bodyCharsOrig and (min==1 and max==0 and exact==0): - if self.bodyCharsOrig == self.initCharsOrig: - self.reString = "[%s]+" % _escapeRegexRangeChars(self.initCharsOrig) - elif len(self.initCharsOrig) == 1: - self.reString = "%s[%s]*" % \ - (re.escape(self.initCharsOrig), - _escapeRegexRangeChars(self.bodyCharsOrig),) - else: - self.reString = "[%s][%s]*" % \ - (_escapeRegexRangeChars(self.initCharsOrig), - _escapeRegexRangeChars(self.bodyCharsOrig),) - if self.asKeyword: - self.reString = r"\b"+self.reString+r"\b" - try: - self.re = re.compile( self.reString ) - except Exception: - self.re = None - - def parseImpl( self, instring, loc, doActions=True ): - if self.re: - result = self.re.match(instring,loc) - if not result: - raise ParseException(instring, loc, self.errmsg, self) - - loc = result.end() - return loc, result.group() - - if not(instring[ loc ] in self.initChars): - raise ParseException(instring, loc, self.errmsg, self) - - start = loc - loc += 1 - instrlen = len(instring) - bodychars = self.bodyChars - maxloc = start + self.maxLen - maxloc = min( maxloc, instrlen ) - while loc < maxloc and instring[loc] in bodychars: - loc += 1 - - throwException = False - if loc - start < self.minLen: - throwException = True - if self.maxSpecified and loc < instrlen and instring[loc] in bodychars: - throwException = True - if self.asKeyword: - if (start>0 and instring[start-1] in bodychars) or (loc<instrlen and instring[loc] in bodychars): - throwException = True - - if throwException: - raise ParseException(instring, loc, self.errmsg, self) - - return loc, instring[start:loc] - - def __str__( self ): - try: - return super(Word,self).__str__() - except Exception: - pass - - - if self.strRepr is None: - - def charsAsStr(s): - if len(s)>4: - return s[:4]+"..." - else: - return s - - if ( self.initCharsOrig != self.bodyCharsOrig ): - self.strRepr = "W:(%s,%s)" % ( charsAsStr(self.initCharsOrig), charsAsStr(self.bodyCharsOrig) ) - else: - self.strRepr = "W:(%s)" % charsAsStr(self.initCharsOrig) - - return self.strRepr - - -class Regex(Token): - r""" - Token for matching strings that match a given regular expression. - Defined with string specifying the regular expression in a form recognized by the inbuilt Python re module. - If the given regex contains named groups (defined using C{(?P<name>...)}), these will be preserved as - named parse results. - - Example:: - realnum = Regex(r"[+-]?\d+\.\d*") - date = Regex(r'(?P<year>\d{4})-(?P<month>\d\d?)-(?P<day>\d\d?)') - # ref: http://stackoverflow.com/questions/267399/how-do-you-match-only-valid-roman-numerals-with-a-regular-expression - roman = Regex(r"M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})") - """ - compiledREtype = type(re.compile("[A-Z]")) - def __init__( self, pattern, flags=0): - """The parameters C{pattern} and C{flags} are passed to the C{re.compile()} function as-is. See the Python C{re} module for an explanation of the acceptable patterns and flags.""" - super(Regex,self).__init__() - - if isinstance(pattern, basestring): - if not pattern: - warnings.warn("null string passed to Regex; use Empty() instead", - SyntaxWarning, stacklevel=2) - - self.pattern = pattern - self.flags = flags - - try: - self.re = re.compile(self.pattern, self.flags) - self.reString = self.pattern - except sre_constants.error: - warnings.warn("invalid pattern (%s) passed to Regex" % pattern, - SyntaxWarning, stacklevel=2) - raise - - elif isinstance(pattern, Regex.compiledREtype): - self.re = pattern - self.pattern = \ - self.reString = str(pattern) - self.flags = flags - - else: - raise ValueError("Regex may only be constructed with a string or a compiled RE object") - - self.name = _ustr(self) - self.errmsg = "Expected " + self.name - self.mayIndexError = False - self.mayReturnEmpty = True - - def parseImpl( self, instring, loc, doActions=True ): - result = self.re.match(instring,loc) - if not result: - raise ParseException(instring, loc, self.errmsg, self) - - loc = result.end() - d = result.groupdict() - ret = ParseResults(result.group()) - if d: - for k in d: - ret[k] = d[k] - return loc,ret - - def __str__( self ): - try: - return super(Regex,self).__str__() - except Exception: - pass - - if self.strRepr is None: - self.strRepr = "Re:(%s)" % repr(self.pattern) - - return self.strRepr - - -class QuotedString(Token): - r""" - Token for matching strings that are delimited by quoting characters. - - Defined with the following parameters: - - quoteChar - string of one or more characters defining the quote delimiting string - - escChar - character to escape quotes, typically backslash (default=C{None}) - - escQuote - special quote sequence to escape an embedded quote string (such as SQL's "" to escape an embedded ") (default=C{None}) - - multiline - boolean indicating whether quotes can span multiple lines (default=C{False}) - - unquoteResults - boolean indicating whether the matched text should be unquoted (default=C{True}) - - endQuoteChar - string of one or more characters defining the end of the quote delimited string (default=C{None} => same as quoteChar) - - convertWhitespaceEscapes - convert escaped whitespace (C{'\t'}, C{'\n'}, etc.) to actual whitespace (default=C{True}) - - Example:: - qs = QuotedString('"') - print(qs.searchString('lsjdf "This is the quote" sldjf')) - complex_qs = QuotedString('{{', endQuoteChar='}}') - print(complex_qs.searchString('lsjdf {{This is the "quote"}} sldjf')) - sql_qs = QuotedString('"', escQuote='""') - print(sql_qs.searchString('lsjdf "This is the quote with ""embedded"" quotes" sldjf')) - prints:: - [['This is the quote']] - [['This is the "quote"']] - [['This is the quote with "embedded" quotes']] - """ - def __init__( self, quoteChar, escChar=None, escQuote=None, multiline=False, unquoteResults=True, endQuoteChar=None, convertWhitespaceEscapes=True): - super(QuotedString,self).__init__() - - # remove white space from quote chars - wont work anyway - quoteChar = quoteChar.strip() - if not quoteChar: - warnings.warn("quoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) - raise SyntaxError() - - if endQuoteChar is None: - endQuoteChar = quoteChar - else: - endQuoteChar = endQuoteChar.strip() - if not endQuoteChar: - warnings.warn("endQuoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) - raise SyntaxError() - - self.quoteChar = quoteChar - self.quoteCharLen = len(quoteChar) - self.firstQuoteChar = quoteChar[0] - self.endQuoteChar = endQuoteChar - self.endQuoteCharLen = len(endQuoteChar) - self.escChar = escChar - self.escQuote = escQuote - self.unquoteResults = unquoteResults - self.convertWhitespaceEscapes = convertWhitespaceEscapes - - if multiline: - self.flags = re.MULTILINE | re.DOTALL - self.pattern = r'%s(?:[^%s%s]' % \ - ( re.escape(self.quoteChar), - _escapeRegexRangeChars(self.endQuoteChar[0]), - (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) - else: - self.flags = 0 - self.pattern = r'%s(?:[^%s\n\r%s]' % \ - ( re.escape(self.quoteChar), - _escapeRegexRangeChars(self.endQuoteChar[0]), - (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) - if len(self.endQuoteChar) > 1: - self.pattern += ( - '|(?:' + ')|(?:'.join("%s[^%s]" % (re.escape(self.endQuoteChar[:i]), - _escapeRegexRangeChars(self.endQuoteChar[i])) - for i in range(len(self.endQuoteChar)-1,0,-1)) + ')' - ) - if escQuote: - self.pattern += (r'|(?:%s)' % re.escape(escQuote)) - if escChar: - self.pattern += (r'|(?:%s.)' % re.escape(escChar)) - self.escCharReplacePattern = re.escape(self.escChar)+"(.)" - self.pattern += (r')*%s' % re.escape(self.endQuoteChar)) - - try: - self.re = re.compile(self.pattern, self.flags) - self.reString = self.pattern - except sre_constants.error: - warnings.warn("invalid pattern (%s) passed to Regex" % self.pattern, - SyntaxWarning, stacklevel=2) - raise - - self.name = _ustr(self) - self.errmsg = "Expected " + self.name - self.mayIndexError = False - self.mayReturnEmpty = True - - def parseImpl( self, instring, loc, doActions=True ): - result = instring[loc] == self.firstQuoteChar and self.re.match(instring,loc) or None - if not result: - raise ParseException(instring, loc, self.errmsg, self) - - loc = result.end() - ret = result.group() - - if self.unquoteResults: - - # strip off quotes - ret = ret[self.quoteCharLen:-self.endQuoteCharLen] - - if isinstance(ret,basestring): - # replace escaped whitespace - if '\\' in ret and self.convertWhitespaceEscapes: - ws_map = { - r'\t' : '\t', - r'\n' : '\n', - r'\f' : '\f', - r'\r' : '\r', - } - for wslit,wschar in ws_map.items(): - ret = ret.replace(wslit, wschar) - - # replace escaped characters - if self.escChar: - ret = re.sub(self.escCharReplacePattern, r"\g<1>", ret) - - # replace escaped quotes - if self.escQuote: - ret = ret.replace(self.escQuote, self.endQuoteChar) - - return loc, ret - - def __str__( self ): - try: - return super(QuotedString,self).__str__() - except Exception: - pass - - if self.strRepr is None: - self.strRepr = "quoted string, starting with %s ending with %s" % (self.quoteChar, self.endQuoteChar) - - return self.strRepr - - -class CharsNotIn(Token): - """ - Token for matching words composed of characters I{not} in a given set (will - include whitespace in matched characters if not listed in the provided exclusion set - see example). - Defined with string containing all disallowed characters, and an optional - minimum, maximum, and/or exact length. The default value for C{min} is 1 (a - minimum value < 1 is not valid); the default values for C{max} and C{exact} - are 0, meaning no maximum or exact length restriction. - - Example:: - # define a comma-separated-value as anything that is not a ',' - csv_value = CharsNotIn(',') - print(delimitedList(csv_value).parseString("dkls,lsdkjf,s12 34,@!#,213")) - prints:: - ['dkls', 'lsdkjf', 's12 34', '@!#', '213'] - """ - def __init__( self, notChars, min=1, max=0, exact=0 ): - super(CharsNotIn,self).__init__() - self.skipWhitespace = False - self.notChars = notChars - - if min < 1: - raise ValueError("cannot specify a minimum length < 1; use Optional(CharsNotIn()) if zero-length char group is permitted") - - self.minLen = min - - if max > 0: - self.maxLen = max - else: - self.maxLen = _MAX_INT - - if exact > 0: - self.maxLen = exact - self.minLen = exact - - self.name = _ustr(self) - self.errmsg = "Expected " + self.name - self.mayReturnEmpty = ( self.minLen == 0 ) - self.mayIndexError = False - - def parseImpl( self, instring, loc, doActions=True ): - if instring[loc] in self.notChars: - raise ParseException(instring, loc, self.errmsg, self) - - start = loc - loc += 1 - notchars = self.notChars - maxlen = min( start+self.maxLen, len(instring) ) - while loc < maxlen and \ - (instring[loc] not in notchars): - loc += 1 - - if loc - start < self.minLen: - raise ParseException(instring, loc, self.errmsg, self) - - return loc, instring[start:loc] - - def __str__( self ): - try: - return super(CharsNotIn, self).__str__() - except Exception: - pass - - if self.strRepr is None: - if len(self.notChars) > 4: - self.strRepr = "!W:(%s...)" % self.notChars[:4] - else: - self.strRepr = "!W:(%s)" % self.notChars - - return self.strRepr - -class White(Token): - """ - Special matching class for matching whitespace. Normally, whitespace is ignored - by pyparsing grammars. This class is included when some whitespace structures - are significant. Define with a string containing the whitespace characters to be - matched; default is C{" \\t\\r\\n"}. Also takes optional C{min}, C{max}, and C{exact} arguments, - as defined for the C{L{Word}} class. - """ - whiteStrs = { - " " : "<SPC>", - "\t": "<TAB>", - "\n": "<LF>", - "\r": "<CR>", - "\f": "<FF>", - } - def __init__(self, ws=" \t\r\n", min=1, max=0, exact=0): - super(White,self).__init__() - self.matchWhite = ws - self.setWhitespaceChars( "".join(c for c in self.whiteChars if c not in self.matchWhite) ) - #~ self.leaveWhitespace() - self.name = ("".join(White.whiteStrs[c] for c in self.matchWhite)) - self.mayReturnEmpty = True - self.errmsg = "Expected " + self.name - - self.minLen = min - - if max > 0: - self.maxLen = max - else: - self.maxLen = _MAX_INT - - if exact > 0: - self.maxLen = exact - self.minLen = exact - - def parseImpl( self, instring, loc, doActions=True ): - if not(instring[ loc ] in self.matchWhite): - raise ParseException(instring, loc, self.errmsg, self) - start = loc - loc += 1 - maxloc = start + self.maxLen - maxloc = min( maxloc, len(instring) ) - while loc < maxloc and instring[loc] in self.matchWhite: - loc += 1 - - if loc - start < self.minLen: - raise ParseException(instring, loc, self.errmsg, self) - - return loc, instring[start:loc] - - -class _PositionToken(Token): - def __init__( self ): - super(_PositionToken,self).__init__() - self.name=self.__class__.__name__ - self.mayReturnEmpty = True - self.mayIndexError = False - -class GoToColumn(_PositionToken): - """ - Token to advance to a specific column of input text; useful for tabular report scraping. - """ - def __init__( self, colno ): - super(GoToColumn,self).__init__() - self.col = colno - - def preParse( self, instring, loc ): - if col(loc,instring) != self.col: - instrlen = len(instring) - if self.ignoreExprs: - loc = self._skipIgnorables( instring, loc ) - while loc < instrlen and instring[loc].isspace() and col( loc, instring ) != self.col : - loc += 1 - return loc - - def parseImpl( self, instring, loc, doActions=True ): - thiscol = col( loc, instring ) - if thiscol > self.col: - raise ParseException( instring, loc, "Text not in expected column", self ) - newloc = loc + self.col - thiscol - ret = instring[ loc: newloc ] - return newloc, ret - - -class LineStart(_PositionToken): - """ - Matches if current position is at the beginning of a line within the parse string - - Example:: - - test = '''\ - AAA this line - AAA and this line - AAA but not this one - B AAA and definitely not this one - ''' - - for t in (LineStart() + 'AAA' + restOfLine).searchString(test): - print(t) - - Prints:: - ['AAA', ' this line'] - ['AAA', ' and this line'] - - """ - def __init__( self ): - super(LineStart,self).__init__() - self.errmsg = "Expected start of line" - - def parseImpl( self, instring, loc, doActions=True ): - if col(loc, instring) == 1: - return loc, [] - raise ParseException(instring, loc, self.errmsg, self) - -class LineEnd(_PositionToken): - """ - Matches if current position is at the end of a line within the parse string - """ - def __init__( self ): - super(LineEnd,self).__init__() - self.setWhitespaceChars( ParserElement.DEFAULT_WHITE_CHARS.replace("\n","") ) - self.errmsg = "Expected end of line" - - def parseImpl( self, instring, loc, doActions=True ): - if loc<len(instring): - if instring[loc] == "\n": - return loc+1, "\n" - else: - raise ParseException(instring, loc, self.errmsg, self) - elif loc == len(instring): - return loc+1, [] - else: - raise ParseException(instring, loc, self.errmsg, self) - -class StringStart(_PositionToken): - """ - Matches if current position is at the beginning of the parse string - """ - def __init__( self ): - super(StringStart,self).__init__() - self.errmsg = "Expected start of text" - - def parseImpl( self, instring, loc, doActions=True ): - if loc != 0: - # see if entire string up to here is just whitespace and ignoreables - if loc != self.preParse( instring, 0 ): - raise ParseException(instring, loc, self.errmsg, self) - return loc, [] - -class StringEnd(_PositionToken): - """ - Matches if current position is at the end of the parse string - """ - def __init__( self ): - super(StringEnd,self).__init__() - self.errmsg = "Expected end of text" - - def parseImpl( self, instring, loc, doActions=True ): - if loc < len(instring): - raise ParseException(instring, loc, self.errmsg, self) - elif loc == len(instring): - return loc+1, [] - elif loc > len(instring): - return loc, [] - else: - raise ParseException(instring, loc, self.errmsg, self) - -class WordStart(_PositionToken): - """ - Matches if the current position is at the beginning of a Word, and - is not preceded by any character in a given set of C{wordChars} - (default=C{printables}). To emulate the C{\b} behavior of regular expressions, - use C{WordStart(alphanums)}. C{WordStart} will also match at the beginning of - the string being parsed, or at the beginning of a line. - """ - def __init__(self, wordChars = printables): - super(WordStart,self).__init__() - self.wordChars = set(wordChars) - self.errmsg = "Not at the start of a word" - - def parseImpl(self, instring, loc, doActions=True ): - if loc != 0: - if (instring[loc-1] in self.wordChars or - instring[loc] not in self.wordChars): - raise ParseException(instring, loc, self.errmsg, self) - return loc, [] - -class WordEnd(_PositionToken): - """ - Matches if the current position is at the end of a Word, and - is not followed by any character in a given set of C{wordChars} - (default=C{printables}). To emulate the C{\b} behavior of regular expressions, - use C{WordEnd(alphanums)}. C{WordEnd} will also match at the end of - the string being parsed, or at the end of a line. - """ - def __init__(self, wordChars = printables): - super(WordEnd,self).__init__() - self.wordChars = set(wordChars) - self.skipWhitespace = False - self.errmsg = "Not at the end of a word" - - def parseImpl(self, instring, loc, doActions=True ): - instrlen = len(instring) - if instrlen>0 and loc<instrlen: - if (instring[loc] in self.wordChars or - instring[loc-1] not in self.wordChars): - raise ParseException(instring, loc, self.errmsg, self) - return loc, [] - - -class ParseExpression(ParserElement): - """ - Abstract subclass of ParserElement, for combining and post-processing parsed tokens. - """ - def __init__( self, exprs, savelist = False ): - super(ParseExpression,self).__init__(savelist) - if isinstance( exprs, _generatorType ): - exprs = list(exprs) - - if isinstance( exprs, basestring ): - self.exprs = [ ParserElement._literalStringClass( exprs ) ] - elif isinstance( exprs, Iterable ): - exprs = list(exprs) - # if sequence of strings provided, wrap with Literal - if all(isinstance(expr, basestring) for expr in exprs): - exprs = map(ParserElement._literalStringClass, exprs) - self.exprs = list(exprs) - else: - try: - self.exprs = list( exprs ) - except TypeError: - self.exprs = [ exprs ] - self.callPreparse = False - - def __getitem__( self, i ): - return self.exprs[i] - - def append( self, other ): - self.exprs.append( other ) - self.strRepr = None - return self - - def leaveWhitespace( self ): - """Extends C{leaveWhitespace} defined in base class, and also invokes C{leaveWhitespace} on - all contained expressions.""" - self.skipWhitespace = False - self.exprs = [ e.copy() for e in self.exprs ] - for e in self.exprs: - e.leaveWhitespace() - return self - - def ignore( self, other ): - if isinstance( other, Suppress ): - if other not in self.ignoreExprs: - super( ParseExpression, self).ignore( other ) - for e in self.exprs: - e.ignore( self.ignoreExprs[-1] ) - else: - super( ParseExpression, self).ignore( other ) - for e in self.exprs: - e.ignore( self.ignoreExprs[-1] ) - return self - - def __str__( self ): - try: - return super(ParseExpression,self).__str__() - except Exception: - pass - - if self.strRepr is None: - self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.exprs) ) - return self.strRepr - - def streamline( self ): - super(ParseExpression,self).streamline() - - for e in self.exprs: - e.streamline() - - # collapse nested And's of the form And( And( And( a,b), c), d) to And( a,b,c,d ) - # but only if there are no parse actions or resultsNames on the nested And's - # (likewise for Or's and MatchFirst's) - if ( len(self.exprs) == 2 ): - other = self.exprs[0] - if ( isinstance( other, self.__class__ ) and - not(other.parseAction) and - other.resultsName is None and - not other.debug ): - self.exprs = other.exprs[:] + [ self.exprs[1] ] - self.strRepr = None - self.mayReturnEmpty |= other.mayReturnEmpty - self.mayIndexError |= other.mayIndexError - - other = self.exprs[-1] - if ( isinstance( other, self.__class__ ) and - not(other.parseAction) and - other.resultsName is None and - not other.debug ): - self.exprs = self.exprs[:-1] + other.exprs[:] - self.strRepr = None - self.mayReturnEmpty |= other.mayReturnEmpty - self.mayIndexError |= other.mayIndexError - - self.errmsg = "Expected " + _ustr(self) - - return self - - def setResultsName( self, name, listAllMatches=False ): - ret = super(ParseExpression,self).setResultsName(name,listAllMatches) - return ret - - def validate( self, validateTrace=[] ): - tmp = validateTrace[:]+[self] - for e in self.exprs: - e.validate(tmp) - self.checkRecursion( [] ) - - def copy(self): - ret = super(ParseExpression,self).copy() - ret.exprs = [e.copy() for e in self.exprs] - return ret - -class And(ParseExpression): - """ - Requires all given C{ParseExpression}s to be found in the given order. - Expressions may be separated by whitespace. - May be constructed using the C{'+'} operator. - May also be constructed using the C{'-'} operator, which will suppress backtracking. - - Example:: - integer = Word(nums) - name_expr = OneOrMore(Word(alphas)) - - expr = And([integer("id"),name_expr("name"),integer("age")]) - # more easily written as: - expr = integer("id") + name_expr("name") + integer("age") - """ - - class _ErrorStop(Empty): - def __init__(self, *args, **kwargs): - super(And._ErrorStop,self).__init__(*args, **kwargs) - self.name = '-' - self.leaveWhitespace() - - def __init__( self, exprs, savelist = True ): - super(And,self).__init__(exprs, savelist) - self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) - self.setWhitespaceChars( self.exprs[0].whiteChars ) - self.skipWhitespace = self.exprs[0].skipWhitespace - self.callPreparse = True - - def parseImpl( self, instring, loc, doActions=True ): - # pass False as last arg to _parse for first element, since we already - # pre-parsed the string as part of our And pre-parsing - loc, resultlist = self.exprs[0]._parse( instring, loc, doActions, callPreParse=False ) - errorStop = False - for e in self.exprs[1:]: - if isinstance(e, And._ErrorStop): - errorStop = True - continue - if errorStop: - try: - loc, exprtokens = e._parse( instring, loc, doActions ) - except ParseSyntaxException: - raise - except ParseBaseException as pe: - pe.__traceback__ = None - raise ParseSyntaxException._from_exception(pe) - except IndexError: - raise ParseSyntaxException(instring, len(instring), self.errmsg, self) - else: - loc, exprtokens = e._parse( instring, loc, doActions ) - if exprtokens or exprtokens.haskeys(): - resultlist += exprtokens - return loc, resultlist - - def __iadd__(self, other ): - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - return self.append( other ) #And( [ self, other ] ) - - def checkRecursion( self, parseElementList ): - subRecCheckList = parseElementList[:] + [ self ] - for e in self.exprs: - e.checkRecursion( subRecCheckList ) - if not e.mayReturnEmpty: - break - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "{" + " ".join(_ustr(e) for e in self.exprs) + "}" - - return self.strRepr - - -class Or(ParseExpression): - """ - Requires that at least one C{ParseExpression} is found. - If two expressions match, the expression that matches the longest string will be used. - May be constructed using the C{'^'} operator. - - Example:: - # construct Or using '^' operator - - number = Word(nums) ^ Combine(Word(nums) + '.' + Word(nums)) - print(number.searchString("123 3.1416 789")) - prints:: - [['123'], ['3.1416'], ['789']] - """ - def __init__( self, exprs, savelist = False ): - super(Or,self).__init__(exprs, savelist) - if self.exprs: - self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) - else: - self.mayReturnEmpty = True - - def parseImpl( self, instring, loc, doActions=True ): - maxExcLoc = -1 - maxException = None - matches = [] - for e in self.exprs: - try: - loc2 = e.tryParse( instring, loc ) - except ParseException as err: - err.__traceback__ = None - if err.loc > maxExcLoc: - maxException = err - maxExcLoc = err.loc - except IndexError: - if len(instring) > maxExcLoc: - maxException = ParseException(instring,len(instring),e.errmsg,self) - maxExcLoc = len(instring) - else: - # save match among all matches, to retry longest to shortest - matches.append((loc2, e)) - - if matches: - matches.sort(key=lambda x: -x[0]) - for _,e in matches: - try: - return e._parse( instring, loc, doActions ) - except ParseException as err: - err.__traceback__ = None - if err.loc > maxExcLoc: - maxException = err - maxExcLoc = err.loc - - if maxException is not None: - maxException.msg = self.errmsg - raise maxException - else: - raise ParseException(instring, loc, "no defined alternatives to match", self) - - - def __ixor__(self, other ): - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - return self.append( other ) #Or( [ self, other ] ) - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "{" + " ^ ".join(_ustr(e) for e in self.exprs) + "}" - - return self.strRepr - - def checkRecursion( self, parseElementList ): - subRecCheckList = parseElementList[:] + [ self ] - for e in self.exprs: - e.checkRecursion( subRecCheckList ) - - -class MatchFirst(ParseExpression): - """ - Requires that at least one C{ParseExpression} is found. - If two expressions match, the first one listed is the one that will match. - May be constructed using the C{'|'} operator. - - Example:: - # construct MatchFirst using '|' operator - - # watch the order of expressions to match - number = Word(nums) | Combine(Word(nums) + '.' + Word(nums)) - print(number.searchString("123 3.1416 789")) # Fail! -> [['123'], ['3'], ['1416'], ['789']] - - # put more selective expression first - number = Combine(Word(nums) + '.' + Word(nums)) | Word(nums) - print(number.searchString("123 3.1416 789")) # Better -> [['123'], ['3.1416'], ['789']] - """ - def __init__( self, exprs, savelist = False ): - super(MatchFirst,self).__init__(exprs, savelist) - if self.exprs: - self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) - else: - self.mayReturnEmpty = True - - def parseImpl( self, instring, loc, doActions=True ): - maxExcLoc = -1 - maxException = None - for e in self.exprs: - try: - ret = e._parse( instring, loc, doActions ) - return ret - except ParseException as err: - if err.loc > maxExcLoc: - maxException = err - maxExcLoc = err.loc - except IndexError: - if len(instring) > maxExcLoc: - maxException = ParseException(instring,len(instring),e.errmsg,self) - maxExcLoc = len(instring) - - # only got here if no expression matched, raise exception for match that made it the furthest - else: - if maxException is not None: - maxException.msg = self.errmsg - raise maxException - else: - raise ParseException(instring, loc, "no defined alternatives to match", self) - - def __ior__(self, other ): - if isinstance( other, basestring ): - other = ParserElement._literalStringClass( other ) - return self.append( other ) #MatchFirst( [ self, other ] ) - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "{" + " | ".join(_ustr(e) for e in self.exprs) + "}" - - return self.strRepr - - def checkRecursion( self, parseElementList ): - subRecCheckList = parseElementList[:] + [ self ] - for e in self.exprs: - e.checkRecursion( subRecCheckList ) - - -class Each(ParseExpression): - """ - Requires all given C{ParseExpression}s to be found, but in any order. - Expressions may be separated by whitespace. - May be constructed using the C{'&'} operator. - - Example:: - color = oneOf("RED ORANGE YELLOW GREEN BLUE PURPLE BLACK WHITE BROWN") - shape_type = oneOf("SQUARE CIRCLE TRIANGLE STAR HEXAGON OCTAGON") - integer = Word(nums) - shape_attr = "shape:" + shape_type("shape") - posn_attr = "posn:" + Group(integer("x") + ',' + integer("y"))("posn") - color_attr = "color:" + color("color") - size_attr = "size:" + integer("size") - - # use Each (using operator '&') to accept attributes in any order - # (shape and posn are required, color and size are optional) - shape_spec = shape_attr & posn_attr & Optional(color_attr) & Optional(size_attr) - - shape_spec.runTests(''' - shape: SQUARE color: BLACK posn: 100, 120 - shape: CIRCLE size: 50 color: BLUE posn: 50,80 - color:GREEN size:20 shape:TRIANGLE posn:20,40 - ''' - ) - prints:: - shape: SQUARE color: BLACK posn: 100, 120 - ['shape:', 'SQUARE', 'color:', 'BLACK', 'posn:', ['100', ',', '120']] - - color: BLACK - - posn: ['100', ',', '120'] - - x: 100 - - y: 120 - - shape: SQUARE - - - shape: CIRCLE size: 50 color: BLUE posn: 50,80 - ['shape:', 'CIRCLE', 'size:', '50', 'color:', 'BLUE', 'posn:', ['50', ',', '80']] - - color: BLUE - - posn: ['50', ',', '80'] - - x: 50 - - y: 80 - - shape: CIRCLE - - size: 50 - - - color: GREEN size: 20 shape: TRIANGLE posn: 20,40 - ['color:', 'GREEN', 'size:', '20', 'shape:', 'TRIANGLE', 'posn:', ['20', ',', '40']] - - color: GREEN - - posn: ['20', ',', '40'] - - x: 20 - - y: 40 - - shape: TRIANGLE - - size: 20 - """ - def __init__( self, exprs, savelist = True ): - super(Each,self).__init__(exprs, savelist) - self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) - self.skipWhitespace = True - self.initExprGroups = True - - def parseImpl( self, instring, loc, doActions=True ): - if self.initExprGroups: - self.opt1map = dict((id(e.expr),e) for e in self.exprs if isinstance(e,Optional)) - opt1 = [ e.expr for e in self.exprs if isinstance(e,Optional) ] - opt2 = [ e for e in self.exprs if e.mayReturnEmpty and not isinstance(e,Optional)] - self.optionals = opt1 + opt2 - self.multioptionals = [ e.expr for e in self.exprs if isinstance(e,ZeroOrMore) ] - self.multirequired = [ e.expr for e in self.exprs if isinstance(e,OneOrMore) ] - self.required = [ e for e in self.exprs if not isinstance(e,(Optional,ZeroOrMore,OneOrMore)) ] - self.required += self.multirequired - self.initExprGroups = False - tmpLoc = loc - tmpReqd = self.required[:] - tmpOpt = self.optionals[:] - matchOrder = [] - - keepMatching = True - while keepMatching: - tmpExprs = tmpReqd + tmpOpt + self.multioptionals + self.multirequired - failed = [] - for e in tmpExprs: - try: - tmpLoc = e.tryParse( instring, tmpLoc ) - except ParseException: - failed.append(e) - else: - matchOrder.append(self.opt1map.get(id(e),e)) - if e in tmpReqd: - tmpReqd.remove(e) - elif e in tmpOpt: - tmpOpt.remove(e) - if len(failed) == len(tmpExprs): - keepMatching = False - - if tmpReqd: - missing = ", ".join(_ustr(e) for e in tmpReqd) - raise ParseException(instring,loc,"Missing one or more required elements (%s)" % missing ) - - # add any unmatched Optionals, in case they have default values defined - matchOrder += [e for e in self.exprs if isinstance(e,Optional) and e.expr in tmpOpt] - - resultlist = [] - for e in matchOrder: - loc,results = e._parse(instring,loc,doActions) - resultlist.append(results) - - finalResults = sum(resultlist, ParseResults([])) - return loc, finalResults - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "{" + " & ".join(_ustr(e) for e in self.exprs) + "}" - - return self.strRepr - - def checkRecursion( self, parseElementList ): - subRecCheckList = parseElementList[:] + [ self ] - for e in self.exprs: - e.checkRecursion( subRecCheckList ) - - -class ParseElementEnhance(ParserElement): - """ - Abstract subclass of C{ParserElement}, for combining and post-processing parsed tokens. - """ - def __init__( self, expr, savelist=False ): - super(ParseElementEnhance,self).__init__(savelist) - if isinstance( expr, basestring ): - if issubclass(ParserElement._literalStringClass, Token): - expr = ParserElement._literalStringClass(expr) - else: - expr = ParserElement._literalStringClass(Literal(expr)) - self.expr = expr - self.strRepr = None - if expr is not None: - self.mayIndexError = expr.mayIndexError - self.mayReturnEmpty = expr.mayReturnEmpty - self.setWhitespaceChars( expr.whiteChars ) - self.skipWhitespace = expr.skipWhitespace - self.saveAsList = expr.saveAsList - self.callPreparse = expr.callPreparse - self.ignoreExprs.extend(expr.ignoreExprs) - - def parseImpl( self, instring, loc, doActions=True ): - if self.expr is not None: - return self.expr._parse( instring, loc, doActions, callPreParse=False ) - else: - raise ParseException("",loc,self.errmsg,self) - - def leaveWhitespace( self ): - self.skipWhitespace = False - self.expr = self.expr.copy() - if self.expr is not None: - self.expr.leaveWhitespace() - return self - - def ignore( self, other ): - if isinstance( other, Suppress ): - if other not in self.ignoreExprs: - super( ParseElementEnhance, self).ignore( other ) - if self.expr is not None: - self.expr.ignore( self.ignoreExprs[-1] ) - else: - super( ParseElementEnhance, self).ignore( other ) - if self.expr is not None: - self.expr.ignore( self.ignoreExprs[-1] ) - return self - - def streamline( self ): - super(ParseElementEnhance,self).streamline() - if self.expr is not None: - self.expr.streamline() - return self - - def checkRecursion( self, parseElementList ): - if self in parseElementList: - raise RecursiveGrammarException( parseElementList+[self] ) - subRecCheckList = parseElementList[:] + [ self ] - if self.expr is not None: - self.expr.checkRecursion( subRecCheckList ) - - def validate( self, validateTrace=[] ): - tmp = validateTrace[:]+[self] - if self.expr is not None: - self.expr.validate(tmp) - self.checkRecursion( [] ) - - def __str__( self ): - try: - return super(ParseElementEnhance,self).__str__() - except Exception: - pass - - if self.strRepr is None and self.expr is not None: - self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.expr) ) - return self.strRepr - - -class FollowedBy(ParseElementEnhance): - """ - Lookahead matching of the given parse expression. C{FollowedBy} - does I{not} advance the parsing position within the input string, it only - verifies that the specified parse expression matches at the current - position. C{FollowedBy} always returns a null token list. - - Example:: - # use FollowedBy to match a label only if it is followed by a ':' - data_word = Word(alphas) - label = data_word + FollowedBy(':') - attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) - - OneOrMore(attr_expr).parseString("shape: SQUARE color: BLACK posn: upper left").pprint() - prints:: - [['shape', 'SQUARE'], ['color', 'BLACK'], ['posn', 'upper left']] - """ - def __init__( self, expr ): - super(FollowedBy,self).__init__(expr) - self.mayReturnEmpty = True - - def parseImpl( self, instring, loc, doActions=True ): - self.expr.tryParse( instring, loc ) - return loc, [] - - -class NotAny(ParseElementEnhance): - """ - Lookahead to disallow matching with the given parse expression. C{NotAny} - does I{not} advance the parsing position within the input string, it only - verifies that the specified parse expression does I{not} match at the current - position. Also, C{NotAny} does I{not} skip over leading whitespace. C{NotAny} - always returns a null token list. May be constructed using the '~' operator. - - Example:: - - """ - def __init__( self, expr ): - super(NotAny,self).__init__(expr) - #~ self.leaveWhitespace() - self.skipWhitespace = False # do NOT use self.leaveWhitespace(), don't want to propagate to exprs - self.mayReturnEmpty = True - self.errmsg = "Found unwanted token, "+_ustr(self.expr) - - def parseImpl( self, instring, loc, doActions=True ): - if self.expr.canParseNext(instring, loc): - raise ParseException(instring, loc, self.errmsg, self) - return loc, [] - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "~{" + _ustr(self.expr) + "}" - - return self.strRepr - -class _MultipleMatch(ParseElementEnhance): - def __init__( self, expr, stopOn=None): - super(_MultipleMatch, self).__init__(expr) - self.saveAsList = True - ender = stopOn - if isinstance(ender, basestring): - ender = ParserElement._literalStringClass(ender) - self.not_ender = ~ender if ender is not None else None - - def parseImpl( self, instring, loc, doActions=True ): - self_expr_parse = self.expr._parse - self_skip_ignorables = self._skipIgnorables - check_ender = self.not_ender is not None - if check_ender: - try_not_ender = self.not_ender.tryParse - - # must be at least one (but first see if we are the stopOn sentinel; - # if so, fail) - if check_ender: - try_not_ender(instring, loc) - loc, tokens = self_expr_parse( instring, loc, doActions, callPreParse=False ) - try: - hasIgnoreExprs = (not not self.ignoreExprs) - while 1: - if check_ender: - try_not_ender(instring, loc) - if hasIgnoreExprs: - preloc = self_skip_ignorables( instring, loc ) - else: - preloc = loc - loc, tmptokens = self_expr_parse( instring, preloc, doActions ) - if tmptokens or tmptokens.haskeys(): - tokens += tmptokens - except (ParseException,IndexError): - pass - - return loc, tokens - -class OneOrMore(_MultipleMatch): - """ - Repetition of one or more of the given expression. - - Parameters: - - expr - expression that must match one or more times - - stopOn - (default=C{None}) - expression for a terminating sentinel - (only required if the sentinel would ordinarily match the repetition - expression) - - Example:: - data_word = Word(alphas) - label = data_word + FollowedBy(':') - attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) - - text = "shape: SQUARE posn: upper left color: BLACK" - OneOrMore(attr_expr).parseString(text).pprint() # Fail! read 'color' as data instead of next label -> [['shape', 'SQUARE color']] - - # use stopOn attribute for OneOrMore to avoid reading label string as part of the data - attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) - OneOrMore(attr_expr).parseString(text).pprint() # Better -> [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'BLACK']] - - # could also be written as - (attr_expr * (1,)).parseString(text).pprint() - """ - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "{" + _ustr(self.expr) + "}..." - - return self.strRepr - -class ZeroOrMore(_MultipleMatch): - """ - Optional repetition of zero or more of the given expression. - - Parameters: - - expr - expression that must match zero or more times - - stopOn - (default=C{None}) - expression for a terminating sentinel - (only required if the sentinel would ordinarily match the repetition - expression) - - Example: similar to L{OneOrMore} - """ - def __init__( self, expr, stopOn=None): - super(ZeroOrMore,self).__init__(expr, stopOn=stopOn) - self.mayReturnEmpty = True - - def parseImpl( self, instring, loc, doActions=True ): - try: - return super(ZeroOrMore, self).parseImpl(instring, loc, doActions) - except (ParseException,IndexError): - return loc, [] - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "[" + _ustr(self.expr) + "]..." - - return self.strRepr - -class _NullToken(object): - def __bool__(self): - return False - __nonzero__ = __bool__ - def __str__(self): - return "" - -_optionalNotMatched = _NullToken() -class Optional(ParseElementEnhance): - """ - Optional matching of the given expression. - - Parameters: - - expr - expression that must match zero or more times - - default (optional) - value to be returned if the optional expression is not found. - - Example:: - # US postal code can be a 5-digit zip, plus optional 4-digit qualifier - zip = Combine(Word(nums, exact=5) + Optional('-' + Word(nums, exact=4))) - zip.runTests(''' - # traditional ZIP code - 12345 - - # ZIP+4 form - 12101-0001 - - # invalid ZIP - 98765- - ''') - prints:: - # traditional ZIP code - 12345 - ['12345'] - - # ZIP+4 form - 12101-0001 - ['12101-0001'] - - # invalid ZIP - 98765- - ^ - FAIL: Expected end of text (at char 5), (line:1, col:6) - """ - def __init__( self, expr, default=_optionalNotMatched ): - super(Optional,self).__init__( expr, savelist=False ) - self.saveAsList = self.expr.saveAsList - self.defaultValue = default - self.mayReturnEmpty = True - - def parseImpl( self, instring, loc, doActions=True ): - try: - loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False ) - except (ParseException,IndexError): - if self.defaultValue is not _optionalNotMatched: - if self.expr.resultsName: - tokens = ParseResults([ self.defaultValue ]) - tokens[self.expr.resultsName] = self.defaultValue - else: - tokens = [ self.defaultValue ] - else: - tokens = [] - return loc, tokens - - def __str__( self ): - if hasattr(self,"name"): - return self.name - - if self.strRepr is None: - self.strRepr = "[" + _ustr(self.expr) + "]" - - return self.strRepr - -class SkipTo(ParseElementEnhance): - """ - Token for skipping over all undefined text until the matched expression is found. - - Parameters: - - expr - target expression marking the end of the data to be skipped - - include - (default=C{False}) if True, the target expression is also parsed - (the skipped text and target expression are returned as a 2-element list). - - ignore - (default=C{None}) used to define grammars (typically quoted strings and - comments) that might contain false matches to the target expression - - failOn - (default=C{None}) define expressions that are not allowed to be - included in the skipped test; if found before the target expression is found, - the SkipTo is not a match - - Example:: - report = ''' - Outstanding Issues Report - 1 Jan 2000 - - # | Severity | Description | Days Open - -----+----------+-------------------------------------------+----------- - 101 | Critical | Intermittent system crash | 6 - 94 | Cosmetic | Spelling error on Login ('log|n') | 14 - 79 | Minor | System slow when running too many reports | 47 - ''' - integer = Word(nums) - SEP = Suppress('|') - # use SkipTo to simply match everything up until the next SEP - # - ignore quoted strings, so that a '|' character inside a quoted string does not match - # - parse action will call token.strip() for each matched token, i.e., the description body - string_data = SkipTo(SEP, ignore=quotedString) - string_data.setParseAction(tokenMap(str.strip)) - ticket_expr = (integer("issue_num") + SEP - + string_data("sev") + SEP - + string_data("desc") + SEP - + integer("days_open")) - - for tkt in ticket_expr.searchString(report): - print tkt.dump() - prints:: - ['101', 'Critical', 'Intermittent system crash', '6'] - - days_open: 6 - - desc: Intermittent system crash - - issue_num: 101 - - sev: Critical - ['94', 'Cosmetic', "Spelling error on Login ('log|n')", '14'] - - days_open: 14 - - desc: Spelling error on Login ('log|n') - - issue_num: 94 - - sev: Cosmetic - ['79', 'Minor', 'System slow when running too many reports', '47'] - - days_open: 47 - - desc: System slow when running too many reports - - issue_num: 79 - - sev: Minor - """ - def __init__( self, other, include=False, ignore=None, failOn=None ): - super( SkipTo, self ).__init__( other ) - self.ignoreExpr = ignore - self.mayReturnEmpty = True - self.mayIndexError = False - self.includeMatch = include - self.asList = False - if isinstance(failOn, basestring): - self.failOn = ParserElement._literalStringClass(failOn) - else: - self.failOn = failOn - self.errmsg = "No match found for "+_ustr(self.expr) - - def parseImpl( self, instring, loc, doActions=True ): - startloc = loc - instrlen = len(instring) - expr = self.expr - expr_parse = self.expr._parse - self_failOn_canParseNext = self.failOn.canParseNext if self.failOn is not None else None - self_ignoreExpr_tryParse = self.ignoreExpr.tryParse if self.ignoreExpr is not None else None - - tmploc = loc - while tmploc <= instrlen: - if self_failOn_canParseNext is not None: - # break if failOn expression matches - if self_failOn_canParseNext(instring, tmploc): - break - - if self_ignoreExpr_tryParse is not None: - # advance past ignore expressions - while 1: - try: - tmploc = self_ignoreExpr_tryParse(instring, tmploc) - except ParseBaseException: - break - - try: - expr_parse(instring, tmploc, doActions=False, callPreParse=False) - except (ParseException, IndexError): - # no match, advance loc in string - tmploc += 1 - else: - # matched skipto expr, done - break - - else: - # ran off the end of the input string without matching skipto expr, fail - raise ParseException(instring, loc, self.errmsg, self) - - # build up return values - loc = tmploc - skiptext = instring[startloc:loc] - skipresult = ParseResults(skiptext) - - if self.includeMatch: - loc, mat = expr_parse(instring,loc,doActions,callPreParse=False) - skipresult += mat - - return loc, skipresult - -class Forward(ParseElementEnhance): - """ - Forward declaration of an expression to be defined later - - used for recursive grammars, such as algebraic infix notation. - When the expression is known, it is assigned to the C{Forward} variable using the '<<' operator. - - Note: take care when assigning to C{Forward} not to overlook precedence of operators. - Specifically, '|' has a lower precedence than '<<', so that:: - fwdExpr << a | b | c - will actually be evaluated as:: - (fwdExpr << a) | b | c - thereby leaving b and c out as parseable alternatives. It is recommended that you - explicitly group the values inserted into the C{Forward}:: - fwdExpr << (a | b | c) - Converting to use the '<<=' operator instead will avoid this problem. - - See L{ParseResults.pprint} for an example of a recursive parser created using - C{Forward}. - """ - def __init__( self, other=None ): - super(Forward,self).__init__( other, savelist=False ) - - def __lshift__( self, other ): - if isinstance( other, basestring ): - other = ParserElement._literalStringClass(other) - self.expr = other - self.strRepr = None - self.mayIndexError = self.expr.mayIndexError - self.mayReturnEmpty = self.expr.mayReturnEmpty - self.setWhitespaceChars( self.expr.whiteChars ) - self.skipWhitespace = self.expr.skipWhitespace - self.saveAsList = self.expr.saveAsList - self.ignoreExprs.extend(self.expr.ignoreExprs) - return self - - def __ilshift__(self, other): - return self << other - - def leaveWhitespace( self ): - self.skipWhitespace = False - return self - - def streamline( self ): - if not self.streamlined: - self.streamlined = True - if self.expr is not None: - self.expr.streamline() - return self - - def validate( self, validateTrace=[] ): - if self not in validateTrace: - tmp = validateTrace[:]+[self] - if self.expr is not None: - self.expr.validate(tmp) - self.checkRecursion([]) - - def __str__( self ): - if hasattr(self,"name"): - return self.name - return self.__class__.__name__ + ": ..." - - # stubbed out for now - creates awful memory and perf issues - self._revertClass = self.__class__ - self.__class__ = _ForwardNoRecurse - try: - if self.expr is not None: - retString = _ustr(self.expr) - else: - retString = "None" - finally: - self.__class__ = self._revertClass - return self.__class__.__name__ + ": " + retString - - def copy(self): - if self.expr is not None: - return super(Forward,self).copy() - else: - ret = Forward() - ret <<= self - return ret - -class _ForwardNoRecurse(Forward): - def __str__( self ): - return "..." - -class TokenConverter(ParseElementEnhance): - """ - Abstract subclass of C{ParseExpression}, for converting parsed results. - """ - def __init__( self, expr, savelist=False ): - super(TokenConverter,self).__init__( expr )#, savelist ) - self.saveAsList = False - -class Combine(TokenConverter): - """ - Converter to concatenate all matching tokens to a single string. - By default, the matching patterns must also be contiguous in the input string; - this can be disabled by specifying C{'adjacent=False'} in the constructor. - - Example:: - real = Word(nums) + '.' + Word(nums) - print(real.parseString('3.1416')) # -> ['3', '.', '1416'] - # will also erroneously match the following - print(real.parseString('3. 1416')) # -> ['3', '.', '1416'] - - real = Combine(Word(nums) + '.' + Word(nums)) - print(real.parseString('3.1416')) # -> ['3.1416'] - # no match when there are internal spaces - print(real.parseString('3. 1416')) # -> Exception: Expected W:(0123...) - """ - def __init__( self, expr, joinString="", adjacent=True ): - super(Combine,self).__init__( expr ) - # suppress whitespace-stripping in contained parse expressions, but re-enable it on the Combine itself - if adjacent: - self.leaveWhitespace() - self.adjacent = adjacent - self.skipWhitespace = True - self.joinString = joinString - self.callPreparse = True - - def ignore( self, other ): - if self.adjacent: - ParserElement.ignore(self, other) - else: - super( Combine, self).ignore( other ) - return self - - def postParse( self, instring, loc, tokenlist ): - retToks = tokenlist.copy() - del retToks[:] - retToks += ParseResults([ "".join(tokenlist._asStringList(self.joinString)) ], modal=self.modalResults) - - if self.resultsName and retToks.haskeys(): - return [ retToks ] - else: - return retToks - -class Group(TokenConverter): - """ - Converter to return the matched tokens as a list - useful for returning tokens of C{L{ZeroOrMore}} and C{L{OneOrMore}} expressions. - - Example:: - ident = Word(alphas) - num = Word(nums) - term = ident | num - func = ident + Optional(delimitedList(term)) - print(func.parseString("fn a,b,100")) # -> ['fn', 'a', 'b', '100'] - - func = ident + Group(Optional(delimitedList(term))) - print(func.parseString("fn a,b,100")) # -> ['fn', ['a', 'b', '100']] - """ - def __init__( self, expr ): - super(Group,self).__init__( expr ) - self.saveAsList = True - - def postParse( self, instring, loc, tokenlist ): - return [ tokenlist ] - -class Dict(TokenConverter): - """ - Converter to return a repetitive expression as a list, but also as a dictionary. - Each element can also be referenced using the first token in the expression as its key. - Useful for tabular report scraping when the first column can be used as a item key. - - Example:: - data_word = Word(alphas) - label = data_word + FollowedBy(':') - attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) - - text = "shape: SQUARE posn: upper left color: light blue texture: burlap" - attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) - - # print attributes as plain groups - print(OneOrMore(attr_expr).parseString(text).dump()) - - # instead of OneOrMore(expr), parse using Dict(OneOrMore(Group(expr))) - Dict will auto-assign names - result = Dict(OneOrMore(Group(attr_expr))).parseString(text) - print(result.dump()) - - # access named fields as dict entries, or output as dict - print(result['shape']) - print(result.asDict()) - prints:: - ['shape', 'SQUARE', 'posn', 'upper left', 'color', 'light blue', 'texture', 'burlap'] - - [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] - - color: light blue - - posn: upper left - - shape: SQUARE - - texture: burlap - SQUARE - {'color': 'light blue', 'posn': 'upper left', 'texture': 'burlap', 'shape': 'SQUARE'} - See more examples at L{ParseResults} of accessing fields by results name. - """ - def __init__( self, expr ): - super(Dict,self).__init__( expr ) - self.saveAsList = True - - def postParse( self, instring, loc, tokenlist ): - for i,tok in enumerate(tokenlist): - if len(tok) == 0: - continue - ikey = tok[0] - if isinstance(ikey,int): - ikey = _ustr(tok[0]).strip() - if len(tok)==1: - tokenlist[ikey] = _ParseResultsWithOffset("",i) - elif len(tok)==2 and not isinstance(tok[1],ParseResults): - tokenlist[ikey] = _ParseResultsWithOffset(tok[1],i) - else: - dictvalue = tok.copy() #ParseResults(i) - del dictvalue[0] - if len(dictvalue)!= 1 or (isinstance(dictvalue,ParseResults) and dictvalue.haskeys()): - tokenlist[ikey] = _ParseResultsWithOffset(dictvalue,i) - else: - tokenlist[ikey] = _ParseResultsWithOffset(dictvalue[0],i) - - if self.resultsName: - return [ tokenlist ] - else: - return tokenlist - - -class Suppress(TokenConverter): - """ - Converter for ignoring the results of a parsed expression. - - Example:: - source = "a, b, c,d" - wd = Word(alphas) - wd_list1 = wd + ZeroOrMore(',' + wd) - print(wd_list1.parseString(source)) - - # often, delimiters that are useful during parsing are just in the - # way afterward - use Suppress to keep them out of the parsed output - wd_list2 = wd + ZeroOrMore(Suppress(',') + wd) - print(wd_list2.parseString(source)) - prints:: - ['a', ',', 'b', ',', 'c', ',', 'd'] - ['a', 'b', 'c', 'd'] - (See also L{delimitedList}.) - """ - def postParse( self, instring, loc, tokenlist ): - return [] - - def suppress( self ): - return self - - -class OnlyOnce(object): - """ - Wrapper for parse actions, to ensure they are only called once. - """ - def __init__(self, methodCall): - self.callable = _trim_arity(methodCall) - self.called = False - def __call__(self,s,l,t): - if not self.called: - results = self.callable(s,l,t) - self.called = True - return results - raise ParseException(s,l,"") - def reset(self): - self.called = False - -def traceParseAction(f): - """ - Decorator for debugging parse actions. - - When the parse action is called, this decorator will print C{">> entering I{method-name}(line:I{current_source_line}, I{parse_location}, I{matched_tokens})".} - When the parse action completes, the decorator will print C{"<<"} followed by the returned value, or any exception that the parse action raised. - - Example:: - wd = Word(alphas) - - @traceParseAction - def remove_duplicate_chars(tokens): - return ''.join(sorted(set(''.join(tokens)))) - - wds = OneOrMore(wd).setParseAction(remove_duplicate_chars) - print(wds.parseString("slkdjs sld sldd sdlf sdljf")) - prints:: - >>entering remove_duplicate_chars(line: 'slkdjs sld sldd sdlf sdljf', 0, (['slkdjs', 'sld', 'sldd', 'sdlf', 'sdljf'], {})) - <<leaving remove_duplicate_chars (ret: 'dfjkls') - ['dfjkls'] - """ - f = _trim_arity(f) - def z(*paArgs): - thisFunc = f.__name__ - s,l,t = paArgs[-3:] - if len(paArgs)>3: - thisFunc = paArgs[0].__class__.__name__ + '.' + thisFunc - sys.stderr.write( ">>entering %s(line: '%s', %d, %r)\n" % (thisFunc,line(l,s),l,t) ) - try: - ret = f(*paArgs) - except Exception as exc: - sys.stderr.write( "<<leaving %s (exception: %s)\n" % (thisFunc,exc) ) - raise - sys.stderr.write( "<<leaving %s (ret: %r)\n" % (thisFunc,ret) ) - return ret - try: - z.__name__ = f.__name__ - except AttributeError: - pass - return z - -# -# global helpers -# -def delimitedList( expr, delim=",", combine=False ): - """ - Helper to define a delimited list of expressions - the delimiter defaults to ','. - By default, the list elements and delimiters can have intervening whitespace, and - comments, but this can be overridden by passing C{combine=True} in the constructor. - If C{combine} is set to C{True}, the matching tokens are returned as a single token - string, with the delimiters included; otherwise, the matching tokens are returned - as a list of tokens, with the delimiters suppressed. - - Example:: - delimitedList(Word(alphas)).parseString("aa,bb,cc") # -> ['aa', 'bb', 'cc'] - delimitedList(Word(hexnums), delim=':', combine=True).parseString("AA:BB:CC:DD:EE") # -> ['AA:BB:CC:DD:EE'] - """ - dlName = _ustr(expr)+" ["+_ustr(delim)+" "+_ustr(expr)+"]..." - if combine: - return Combine( expr + ZeroOrMore( delim + expr ) ).setName(dlName) - else: - return ( expr + ZeroOrMore( Suppress( delim ) + expr ) ).setName(dlName) - -def countedArray( expr, intExpr=None ): - """ - Helper to define a counted list of expressions. - This helper defines a pattern of the form:: - integer expr expr expr... - where the leading integer tells how many expr expressions follow. - The matched tokens returns the array of expr tokens as a list - the leading count token is suppressed. - - If C{intExpr} is specified, it should be a pyparsing expression that produces an integer value. - - Example:: - countedArray(Word(alphas)).parseString('2 ab cd ef') # -> ['ab', 'cd'] - - # in this parser, the leading integer value is given in binary, - # '10' indicating that 2 values are in the array - binaryConstant = Word('01').setParseAction(lambda t: int(t[0], 2)) - countedArray(Word(alphas), intExpr=binaryConstant).parseString('10 ab cd ef') # -> ['ab', 'cd'] - """ - arrayExpr = Forward() - def countFieldParseAction(s,l,t): - n = t[0] - arrayExpr << (n and Group(And([expr]*n)) or Group(empty)) - return [] - if intExpr is None: - intExpr = Word(nums).setParseAction(lambda t:int(t[0])) - else: - intExpr = intExpr.copy() - intExpr.setName("arrayLen") - intExpr.addParseAction(countFieldParseAction, callDuringTry=True) - return ( intExpr + arrayExpr ).setName('(len) ' + _ustr(expr) + '...') - -def _flatten(L): - ret = [] - for i in L: - if isinstance(i,list): - ret.extend(_flatten(i)) - else: - ret.append(i) - return ret - -def matchPreviousLiteral(expr): - """ - Helper to define an expression that is indirectly defined from - the tokens matched in a previous expression, that is, it looks - for a 'repeat' of a previous expression. For example:: - first = Word(nums) - second = matchPreviousLiteral(first) - matchExpr = first + ":" + second - will match C{"1:1"}, but not C{"1:2"}. Because this matches a - previous literal, will also match the leading C{"1:1"} in C{"1:10"}. - If this is not desired, use C{matchPreviousExpr}. - Do I{not} use with packrat parsing enabled. - """ - rep = Forward() - def copyTokenToRepeater(s,l,t): - if t: - if len(t) == 1: - rep << t[0] - else: - # flatten t tokens - tflat = _flatten(t.asList()) - rep << And(Literal(tt) for tt in tflat) - else: - rep << Empty() - expr.addParseAction(copyTokenToRepeater, callDuringTry=True) - rep.setName('(prev) ' + _ustr(expr)) - return rep - -def matchPreviousExpr(expr): - """ - Helper to define an expression that is indirectly defined from - the tokens matched in a previous expression, that is, it looks - for a 'repeat' of a previous expression. For example:: - first = Word(nums) - second = matchPreviousExpr(first) - matchExpr = first + ":" + second - will match C{"1:1"}, but not C{"1:2"}. Because this matches by - expressions, will I{not} match the leading C{"1:1"} in C{"1:10"}; - the expressions are evaluated first, and then compared, so - C{"1"} is compared with C{"10"}. - Do I{not} use with packrat parsing enabled. - """ - rep = Forward() - e2 = expr.copy() - rep <<= e2 - def copyTokenToRepeater(s,l,t): - matchTokens = _flatten(t.asList()) - def mustMatchTheseTokens(s,l,t): - theseTokens = _flatten(t.asList()) - if theseTokens != matchTokens: - raise ParseException("",0,"") - rep.setParseAction( mustMatchTheseTokens, callDuringTry=True ) - expr.addParseAction(copyTokenToRepeater, callDuringTry=True) - rep.setName('(prev) ' + _ustr(expr)) - return rep - -def _escapeRegexRangeChars(s): - #~ escape these chars: ^-] - for c in r"\^-]": - s = s.replace(c,_bslash+c) - s = s.replace("\n",r"\n") - s = s.replace("\t",r"\t") - return _ustr(s) - -def oneOf( strs, caseless=False, useRegex=True ): - """ - Helper to quickly define a set of alternative Literals, and makes sure to do - longest-first testing when there is a conflict, regardless of the input order, - but returns a C{L{MatchFirst}} for best performance. - - Parameters: - - strs - a string of space-delimited literals, or a collection of string literals - - caseless - (default=C{False}) - treat all literals as caseless - - useRegex - (default=C{True}) - as an optimization, will generate a Regex - object; otherwise, will generate a C{MatchFirst} object (if C{caseless=True}, or - if creating a C{Regex} raises an exception) - - Example:: - comp_oper = oneOf("< = > <= >= !=") - var = Word(alphas) - number = Word(nums) - term = var | number - comparison_expr = term + comp_oper + term - print(comparison_expr.searchString("B = 12 AA=23 B<=AA AA>12")) - prints:: - [['B', '=', '12'], ['AA', '=', '23'], ['B', '<=', 'AA'], ['AA', '>', '12']] - """ - if caseless: - isequal = ( lambda a,b: a.upper() == b.upper() ) - masks = ( lambda a,b: b.upper().startswith(a.upper()) ) - parseElementClass = CaselessLiteral - else: - isequal = ( lambda a,b: a == b ) - masks = ( lambda a,b: b.startswith(a) ) - parseElementClass = Literal - - symbols = [] - if isinstance(strs,basestring): - symbols = strs.split() - elif isinstance(strs, Iterable): - symbols = list(strs) - else: - warnings.warn("Invalid argument to oneOf, expected string or iterable", - SyntaxWarning, stacklevel=2) - if not symbols: - return NoMatch() - - i = 0 - while i < len(symbols)-1: - cur = symbols[i] - for j,other in enumerate(symbols[i+1:]): - if ( isequal(other, cur) ): - del symbols[i+j+1] - break - elif ( masks(cur, other) ): - del symbols[i+j+1] - symbols.insert(i,other) - cur = other - break - else: - i += 1 - - if not caseless and useRegex: - #~ print (strs,"->", "|".join( [ _escapeRegexChars(sym) for sym in symbols] )) - try: - if len(symbols)==len("".join(symbols)): - return Regex( "[%s]" % "".join(_escapeRegexRangeChars(sym) for sym in symbols) ).setName(' | '.join(symbols)) - else: - return Regex( "|".join(re.escape(sym) for sym in symbols) ).setName(' | '.join(symbols)) - except Exception: - warnings.warn("Exception creating Regex for oneOf, building MatchFirst", - SyntaxWarning, stacklevel=2) - - - # last resort, just use MatchFirst - return MatchFirst(parseElementClass(sym) for sym in symbols).setName(' | '.join(symbols)) - -def dictOf( key, value ): - """ - Helper to easily and clearly define a dictionary by specifying the respective patterns - for the key and value. Takes care of defining the C{L{Dict}}, C{L{ZeroOrMore}}, and C{L{Group}} tokens - in the proper order. The key pattern can include delimiting markers or punctuation, - as long as they are suppressed, thereby leaving the significant key text. The value - pattern can include named results, so that the C{Dict} results can include named token - fields. - - Example:: - text = "shape: SQUARE posn: upper left color: light blue texture: burlap" - attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) - print(OneOrMore(attr_expr).parseString(text).dump()) - - attr_label = label - attr_value = Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join) - - # similar to Dict, but simpler call format - result = dictOf(attr_label, attr_value).parseString(text) - print(result.dump()) - print(result['shape']) - print(result.shape) # object attribute access works too - print(result.asDict()) - prints:: - [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] - - color: light blue - - posn: upper left - - shape: SQUARE - - texture: burlap - SQUARE - SQUARE - {'color': 'light blue', 'shape': 'SQUARE', 'posn': 'upper left', 'texture': 'burlap'} - """ - return Dict( ZeroOrMore( Group ( key + value ) ) ) - -def originalTextFor(expr, asString=True): - """ - Helper to return the original, untokenized text for a given expression. Useful to - restore the parsed fields of an HTML start tag into the raw tag text itself, or to - revert separate tokens with intervening whitespace back to the original matching - input text. By default, returns astring containing the original parsed text. - - If the optional C{asString} argument is passed as C{False}, then the return value is a - C{L{ParseResults}} containing any results names that were originally matched, and a - single token containing the original matched text from the input string. So if - the expression passed to C{L{originalTextFor}} contains expressions with defined - results names, you must set C{asString} to C{False} if you want to preserve those - results name values. - - Example:: - src = "this is test <b> bold <i>text</i> </b> normal text " - for tag in ("b","i"): - opener,closer = makeHTMLTags(tag) - patt = originalTextFor(opener + SkipTo(closer) + closer) - print(patt.searchString(src)[0]) - prints:: - ['<b> bold <i>text</i> </b>'] - ['<i>text</i>'] - """ - locMarker = Empty().setParseAction(lambda s,loc,t: loc) - endlocMarker = locMarker.copy() - endlocMarker.callPreparse = False - matchExpr = locMarker("_original_start") + expr + endlocMarker("_original_end") - if asString: - extractText = lambda s,l,t: s[t._original_start:t._original_end] - else: - def extractText(s,l,t): - t[:] = [s[t.pop('_original_start'):t.pop('_original_end')]] - matchExpr.setParseAction(extractText) - matchExpr.ignoreExprs = expr.ignoreExprs - return matchExpr - -def ungroup(expr): - """ - Helper to undo pyparsing's default grouping of And expressions, even - if all but one are non-empty. - """ - return TokenConverter(expr).setParseAction(lambda t:t[0]) - -def locatedExpr(expr): - """ - Helper to decorate a returned token with its starting and ending locations in the input string. - This helper adds the following results names: - - locn_start = location where matched expression begins - - locn_end = location where matched expression ends - - value = the actual parsed results - - Be careful if the input text contains C{<TAB>} characters, you may want to call - C{L{ParserElement.parseWithTabs}} - - Example:: - wd = Word(alphas) - for match in locatedExpr(wd).searchString("ljsdf123lksdjjf123lkkjj1222"): - print(match) - prints:: - [[0, 'ljsdf', 5]] - [[8, 'lksdjjf', 15]] - [[18, 'lkkjj', 23]] - """ - locator = Empty().setParseAction(lambda s,l,t: l) - return Group(locator("locn_start") + expr("value") + locator.copy().leaveWhitespace()("locn_end")) - - -# convenience constants for positional expressions -empty = Empty().setName("empty") -lineStart = LineStart().setName("lineStart") -lineEnd = LineEnd().setName("lineEnd") -stringStart = StringStart().setName("stringStart") -stringEnd = StringEnd().setName("stringEnd") - -_escapedPunc = Word( _bslash, r"\[]-*.$+^?()~ ", exact=2 ).setParseAction(lambda s,l,t:t[0][1]) -_escapedHexChar = Regex(r"\\0?[xX][0-9a-fA-F]+").setParseAction(lambda s,l,t:unichr(int(t[0].lstrip(r'\0x'),16))) -_escapedOctChar = Regex(r"\\0[0-7]+").setParseAction(lambda s,l,t:unichr(int(t[0][1:],8))) -_singleChar = _escapedPunc | _escapedHexChar | _escapedOctChar | CharsNotIn(r'\]', exact=1) -_charRange = Group(_singleChar + Suppress("-") + _singleChar) -_reBracketExpr = Literal("[") + Optional("^").setResultsName("negate") + Group( OneOrMore( _charRange | _singleChar ) ).setResultsName("body") + "]" - -def srange(s): - r""" - Helper to easily define string ranges for use in Word construction. Borrows - syntax from regexp '[]' string range definitions:: - srange("[0-9]") -> "0123456789" - srange("[a-z]") -> "abcdefghijklmnopqrstuvwxyz" - srange("[a-z$_]") -> "abcdefghijklmnopqrstuvwxyz$_" - The input string must be enclosed in []'s, and the returned string is the expanded - character set joined into a single string. - The values enclosed in the []'s may be: - - a single character - - an escaped character with a leading backslash (such as C{\-} or C{\]}) - - an escaped hex character with a leading C{'\x'} (C{\x21}, which is a C{'!'} character) - (C{\0x##} is also supported for backwards compatibility) - - an escaped octal character with a leading C{'\0'} (C{\041}, which is a C{'!'} character) - - a range of any of the above, separated by a dash (C{'a-z'}, etc.) - - any combination of the above (C{'aeiouy'}, C{'a-zA-Z0-9_$'}, etc.) - """ - _expanded = lambda p: p if not isinstance(p,ParseResults) else ''.join(unichr(c) for c in range(ord(p[0]),ord(p[1])+1)) - try: - return "".join(_expanded(part) for part in _reBracketExpr.parseString(s).body) - except Exception: - return "" - -def matchOnlyAtCol(n): - """ - Helper method for defining parse actions that require matching at a specific - column in the input text. - """ - def verifyCol(strg,locn,toks): - if col(locn,strg) != n: - raise ParseException(strg,locn,"matched token not at column %d" % n) - return verifyCol - -def replaceWith(replStr): - """ - Helper method for common parse actions that simply return a literal value. Especially - useful when used with C{L{transformString<ParserElement.transformString>}()}. - - Example:: - num = Word(nums).setParseAction(lambda toks: int(toks[0])) - na = oneOf("N/A NA").setParseAction(replaceWith(math.nan)) - term = na | num - - OneOrMore(term).parseString("324 234 N/A 234") # -> [324, 234, nan, 234] - """ - return lambda s,l,t: [replStr] - -def removeQuotes(s,l,t): - """ - Helper parse action for removing quotation marks from parsed quoted strings. - - Example:: - # by default, quotation marks are included in parsed results - quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["'Now is the Winter of our Discontent'"] - - # use removeQuotes to strip quotation marks from parsed results - quotedString.setParseAction(removeQuotes) - quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["Now is the Winter of our Discontent"] - """ - return t[0][1:-1] - -def tokenMap(func, *args): - """ - Helper to define a parse action by mapping a function to all elements of a ParseResults list.If any additional - args are passed, they are forwarded to the given function as additional arguments after - the token, as in C{hex_integer = Word(hexnums).setParseAction(tokenMap(int, 16))}, which will convert the - parsed data to an integer using base 16. - - Example (compare the last to example in L{ParserElement.transformString}:: - hex_ints = OneOrMore(Word(hexnums)).setParseAction(tokenMap(int, 16)) - hex_ints.runTests(''' - 00 11 22 aa FF 0a 0d 1a - ''') - - upperword = Word(alphas).setParseAction(tokenMap(str.upper)) - OneOrMore(upperword).runTests(''' - my kingdom for a horse - ''') - - wd = Word(alphas).setParseAction(tokenMap(str.title)) - OneOrMore(wd).setParseAction(' '.join).runTests(''' - now is the winter of our discontent made glorious summer by this sun of york - ''') - prints:: - 00 11 22 aa FF 0a 0d 1a - [0, 17, 34, 170, 255, 10, 13, 26] - - my kingdom for a horse - ['MY', 'KINGDOM', 'FOR', 'A', 'HORSE'] - - now is the winter of our discontent made glorious summer by this sun of york - ['Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York'] - """ - def pa(s,l,t): - return [func(tokn, *args) for tokn in t] - - try: - func_name = getattr(func, '__name__', - getattr(func, '__class__').__name__) - except Exception: - func_name = str(func) - pa.__name__ = func_name - - return pa - -upcaseTokens = tokenMap(lambda t: _ustr(t).upper()) -"""(Deprecated) Helper parse action to convert tokens to upper case. Deprecated in favor of L{pyparsing_common.upcaseTokens}""" - -downcaseTokens = tokenMap(lambda t: _ustr(t).lower()) -"""(Deprecated) Helper parse action to convert tokens to lower case. Deprecated in favor of L{pyparsing_common.downcaseTokens}""" - -def _makeTags(tagStr, xml): - """Internal helper to construct opening and closing tag expressions, given a tag name""" - if isinstance(tagStr,basestring): - resname = tagStr - tagStr = Keyword(tagStr, caseless=not xml) - else: - resname = tagStr.name - - tagAttrName = Word(alphas,alphanums+"_-:") - if (xml): - tagAttrValue = dblQuotedString.copy().setParseAction( removeQuotes ) - openTag = Suppress("<") + tagStr("tag") + \ - Dict(ZeroOrMore(Group( tagAttrName + Suppress("=") + tagAttrValue ))) + \ - Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">") - else: - printablesLessRAbrack = "".join(c for c in printables if c not in ">") - tagAttrValue = quotedString.copy().setParseAction( removeQuotes ) | Word(printablesLessRAbrack) - openTag = Suppress("<") + tagStr("tag") + \ - Dict(ZeroOrMore(Group( tagAttrName.setParseAction(downcaseTokens) + \ - Optional( Suppress("=") + tagAttrValue ) ))) + \ - Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">") - closeTag = Combine(_L("</") + tagStr + ">") - - openTag = openTag.setResultsName("start"+"".join(resname.replace(":"," ").title().split())).setName("<%s>" % resname) - closeTag = closeTag.setResultsName("end"+"".join(resname.replace(":"," ").title().split())).setName("</%s>" % resname) - openTag.tag = resname - closeTag.tag = resname - return openTag, closeTag - -def makeHTMLTags(tagStr): - """ - Helper to construct opening and closing tag expressions for HTML, given a tag name. Matches - tags in either upper or lower case, attributes with namespaces and with quoted or unquoted values. - - Example:: - text = '<td>More info at the <a href="http://pyparsing.wikispaces.com">pyparsing</a> wiki page</td>' - # makeHTMLTags returns pyparsing expressions for the opening and closing tags as a 2-tuple - a,a_end = makeHTMLTags("A") - link_expr = a + SkipTo(a_end)("link_text") + a_end - - for link in link_expr.searchString(text): - # attributes in the <A> tag (like "href" shown here) are also accessible as named results - print(link.link_text, '->', link.href) - prints:: - pyparsing -> http://pyparsing.wikispaces.com - """ - return _makeTags( tagStr, False ) - -def makeXMLTags(tagStr): - """ - Helper to construct opening and closing tag expressions for XML, given a tag name. Matches - tags only in the given upper/lower case. - - Example: similar to L{makeHTMLTags} - """ - return _makeTags( tagStr, True ) - -def withAttribute(*args,**attrDict): - """ - Helper to create a validating parse action to be used with start tags created - with C{L{makeXMLTags}} or C{L{makeHTMLTags}}. Use C{withAttribute} to qualify a starting tag - with a required attribute value, to avoid false matches on common tags such as - C{<TD>} or C{<DIV>}. - - Call C{withAttribute} with a series of attribute names and values. Specify the list - of filter attributes names and values as: - - keyword arguments, as in C{(align="right")}, or - - as an explicit dict with C{**} operator, when an attribute name is also a Python - reserved word, as in C{**{"class":"Customer", "align":"right"}} - - a list of name-value tuples, as in ( ("ns1:class", "Customer"), ("ns2:align","right") ) - For attribute names with a namespace prefix, you must use the second form. Attribute - names are matched insensitive to upper/lower case. - - If just testing for C{class} (with or without a namespace), use C{L{withClass}}. - - To verify that the attribute exists, but without specifying a value, pass - C{withAttribute.ANY_VALUE} as the value. - - Example:: - html = ''' - <div> - Some text - <div type="grid">1 4 0 1 0</div> - <div type="graph">1,3 2,3 1,1</div> - <div>this has no type</div> - </div> - - ''' - div,div_end = makeHTMLTags("div") - - # only match div tag having a type attribute with value "grid" - div_grid = div().setParseAction(withAttribute(type="grid")) - grid_expr = div_grid + SkipTo(div | div_end)("body") - for grid_header in grid_expr.searchString(html): - print(grid_header.body) - - # construct a match with any div tag having a type attribute, regardless of the value - div_any_type = div().setParseAction(withAttribute(type=withAttribute.ANY_VALUE)) - div_expr = div_any_type + SkipTo(div | div_end)("body") - for div_header in div_expr.searchString(html): - print(div_header.body) - prints:: - 1 4 0 1 0 - - 1 4 0 1 0 - 1,3 2,3 1,1 - """ - if args: - attrs = args[:] - else: - attrs = attrDict.items() - attrs = [(k,v) for k,v in attrs] - def pa(s,l,tokens): - for attrName,attrValue in attrs: - if attrName not in tokens: - raise ParseException(s,l,"no matching attribute " + attrName) - if attrValue != withAttribute.ANY_VALUE and tokens[attrName] != attrValue: - raise ParseException(s,l,"attribute '%s' has value '%s', must be '%s'" % - (attrName, tokens[attrName], attrValue)) - return pa -withAttribute.ANY_VALUE = object() - -def withClass(classname, namespace=''): - """ - Simplified version of C{L{withAttribute}} when matching on a div class - made - difficult because C{class} is a reserved word in Python. - - Example:: - html = ''' - <div> - Some text - <div class="grid">1 4 0 1 0</div> - <div class="graph">1,3 2,3 1,1</div> - <div>this <div> has no class</div> - </div> - - ''' - div,div_end = makeHTMLTags("div") - div_grid = div().setParseAction(withClass("grid")) - - grid_expr = div_grid + SkipTo(div | div_end)("body") - for grid_header in grid_expr.searchString(html): - print(grid_header.body) - - div_any_type = div().setParseAction(withClass(withAttribute.ANY_VALUE)) - div_expr = div_any_type + SkipTo(div | div_end)("body") - for div_header in div_expr.searchString(html): - print(div_header.body) - prints:: - 1 4 0 1 0 - - 1 4 0 1 0 - 1,3 2,3 1,1 - """ - classattr = "%s:class" % namespace if namespace else "class" - return withAttribute(**{classattr : classname}) - -opAssoc = _Constants() -opAssoc.LEFT = object() -opAssoc.RIGHT = object() - -def infixNotation( baseExpr, opList, lpar=Suppress('('), rpar=Suppress(')') ): - """ - Helper method for constructing grammars of expressions made up of - operators working in a precedence hierarchy. Operators may be unary or - binary, left- or right-associative. Parse actions can also be attached - to operator expressions. The generated parser will also recognize the use - of parentheses to override operator precedences (see example below). - - Note: if you define a deep operator list, you may see performance issues - when using infixNotation. See L{ParserElement.enablePackrat} for a - mechanism to potentially improve your parser performance. - - Parameters: - - baseExpr - expression representing the most basic element for the nested - - opList - list of tuples, one for each operator precedence level in the - expression grammar; each tuple is of the form - (opExpr, numTerms, rightLeftAssoc, parseAction), where: - - opExpr is the pyparsing expression for the operator; - may also be a string, which will be converted to a Literal; - if numTerms is 3, opExpr is a tuple of two expressions, for the - two operators separating the 3 terms - - numTerms is the number of terms for this operator (must - be 1, 2, or 3) - - rightLeftAssoc is the indicator whether the operator is - right or left associative, using the pyparsing-defined - constants C{opAssoc.RIGHT} and C{opAssoc.LEFT}. - - parseAction is the parse action to be associated with - expressions matching this operator expression (the - parse action tuple member may be omitted); if the parse action - is passed a tuple or list of functions, this is equivalent to - calling C{setParseAction(*fn)} (L{ParserElement.setParseAction}) - - lpar - expression for matching left-parentheses (default=C{Suppress('(')}) - - rpar - expression for matching right-parentheses (default=C{Suppress(')')}) - - Example:: - # simple example of four-function arithmetic with ints and variable names - integer = pyparsing_common.signed_integer - varname = pyparsing_common.identifier - - arith_expr = infixNotation(integer | varname, - [ - ('-', 1, opAssoc.RIGHT), - (oneOf('* /'), 2, opAssoc.LEFT), - (oneOf('+ -'), 2, opAssoc.LEFT), - ]) - - arith_expr.runTests(''' - 5+3*6 - (5+3)*6 - -2--11 - ''', fullDump=False) - prints:: - 5+3*6 - [[5, '+', [3, '*', 6]]] - - (5+3)*6 - [[[5, '+', 3], '*', 6]] - - -2--11 - [[['-', 2], '-', ['-', 11]]] - """ - ret = Forward() - lastExpr = baseExpr | ( lpar + ret + rpar ) - for i,operDef in enumerate(opList): - opExpr,arity,rightLeftAssoc,pa = (operDef + (None,))[:4] - termName = "%s term" % opExpr if arity < 3 else "%s%s term" % opExpr - if arity == 3: - if opExpr is None or len(opExpr) != 2: - raise ValueError("if numterms=3, opExpr must be a tuple or list of two expressions") - opExpr1, opExpr2 = opExpr - thisExpr = Forward().setName(termName) - if rightLeftAssoc == opAssoc.LEFT: - if arity == 1: - matchExpr = FollowedBy(lastExpr + opExpr) + Group( lastExpr + OneOrMore( opExpr ) ) - elif arity == 2: - if opExpr is not None: - matchExpr = FollowedBy(lastExpr + opExpr + lastExpr) + Group( lastExpr + OneOrMore( opExpr + lastExpr ) ) - else: - matchExpr = FollowedBy(lastExpr+lastExpr) + Group( lastExpr + OneOrMore(lastExpr) ) - elif arity == 3: - matchExpr = FollowedBy(lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr) + \ - Group( lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr ) - else: - raise ValueError("operator must be unary (1), binary (2), or ternary (3)") - elif rightLeftAssoc == opAssoc.RIGHT: - if arity == 1: - # try to avoid LR with this extra test - if not isinstance(opExpr, Optional): - opExpr = Optional(opExpr) - matchExpr = FollowedBy(opExpr.expr + thisExpr) + Group( opExpr + thisExpr ) - elif arity == 2: - if opExpr is not None: - matchExpr = FollowedBy(lastExpr + opExpr + thisExpr) + Group( lastExpr + OneOrMore( opExpr + thisExpr ) ) - else: - matchExpr = FollowedBy(lastExpr + thisExpr) + Group( lastExpr + OneOrMore( thisExpr ) ) - elif arity == 3: - matchExpr = FollowedBy(lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr) + \ - Group( lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr ) - else: - raise ValueError("operator must be unary (1), binary (2), or ternary (3)") - else: - raise ValueError("operator must indicate right or left associativity") - if pa: - if isinstance(pa, (tuple, list)): - matchExpr.setParseAction(*pa) - else: - matchExpr.setParseAction(pa) - thisExpr <<= ( matchExpr.setName(termName) | lastExpr ) - lastExpr = thisExpr - ret <<= lastExpr - return ret - -operatorPrecedence = infixNotation -"""(Deprecated) Former name of C{L{infixNotation}}, will be dropped in a future release.""" - -dblQuotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"').setName("string enclosed in double quotes") -sglQuotedString = Combine(Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("string enclosed in single quotes") -quotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"'| - Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("quotedString using single or double quotes") -unicodeString = Combine(_L('u') + quotedString.copy()).setName("unicode string literal") - -def nestedExpr(opener="(", closer=")", content=None, ignoreExpr=quotedString.copy()): - """ - Helper method for defining nested lists enclosed in opening and closing - delimiters ("(" and ")" are the default). - - Parameters: - - opener - opening character for a nested list (default=C{"("}); can also be a pyparsing expression - - closer - closing character for a nested list (default=C{")"}); can also be a pyparsing expression - - content - expression for items within the nested lists (default=C{None}) - - ignoreExpr - expression for ignoring opening and closing delimiters (default=C{quotedString}) - - If an expression is not provided for the content argument, the nested - expression will capture all whitespace-delimited content between delimiters - as a list of separate values. - - Use the C{ignoreExpr} argument to define expressions that may contain - opening or closing characters that should not be treated as opening - or closing characters for nesting, such as quotedString or a comment - expression. Specify multiple expressions using an C{L{Or}} or C{L{MatchFirst}}. - The default is L{quotedString}, but if no expressions are to be ignored, - then pass C{None} for this argument. - - Example:: - data_type = oneOf("void int short long char float double") - decl_data_type = Combine(data_type + Optional(Word('*'))) - ident = Word(alphas+'_', alphanums+'_') - number = pyparsing_common.number - arg = Group(decl_data_type + ident) - LPAR,RPAR = map(Suppress, "()") - - code_body = nestedExpr('{', '}', ignoreExpr=(quotedString | cStyleComment)) - - c_function = (decl_data_type("type") - + ident("name") - + LPAR + Optional(delimitedList(arg), [])("args") + RPAR - + code_body("body")) - c_function.ignore(cStyleComment) - - source_code = ''' - int is_odd(int x) { - return (x%2); - } - - int dec_to_hex(char hchar) { - if (hchar >= '0' && hchar <= '9') { - return (ord(hchar)-ord('0')); - } else { - return (10+ord(hchar)-ord('A')); - } - } - ''' - for func in c_function.searchString(source_code): - print("%(name)s (%(type)s) args: %(args)s" % func) - - prints:: - is_odd (int) args: [['int', 'x']] - dec_to_hex (int) args: [['char', 'hchar']] - """ - if opener == closer: - raise ValueError("opening and closing strings cannot be the same") - if content is None: - if isinstance(opener,basestring) and isinstance(closer,basestring): - if len(opener) == 1 and len(closer)==1: - if ignoreExpr is not None: - content = (Combine(OneOrMore(~ignoreExpr + - CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS,exact=1)) - ).setParseAction(lambda t:t[0].strip())) - else: - content = (empty.copy()+CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS - ).setParseAction(lambda t:t[0].strip())) - else: - if ignoreExpr is not None: - content = (Combine(OneOrMore(~ignoreExpr + - ~Literal(opener) + ~Literal(closer) + - CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) - ).setParseAction(lambda t:t[0].strip())) - else: - content = (Combine(OneOrMore(~Literal(opener) + ~Literal(closer) + - CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) - ).setParseAction(lambda t:t[0].strip())) - else: - raise ValueError("opening and closing arguments must be strings if no content expression is given") - ret = Forward() - if ignoreExpr is not None: - ret <<= Group( Suppress(opener) + ZeroOrMore( ignoreExpr | ret | content ) + Suppress(closer) ) - else: - ret <<= Group( Suppress(opener) + ZeroOrMore( ret | content ) + Suppress(closer) ) - ret.setName('nested %s%s expression' % (opener,closer)) - return ret - -def indentedBlock(blockStatementExpr, indentStack, indent=True): - """ - Helper method for defining space-delimited indentation blocks, such as - those used to define block statements in Python source code. - - Parameters: - - blockStatementExpr - expression defining syntax of statement that - is repeated within the indented block - - indentStack - list created by caller to manage indentation stack - (multiple statementWithIndentedBlock expressions within a single grammar - should share a common indentStack) - - indent - boolean indicating whether block must be indented beyond the - the current level; set to False for block of left-most statements - (default=C{True}) - - A valid block must contain at least one C{blockStatement}. - - Example:: - data = ''' - def A(z): - A1 - B = 100 - G = A2 - A2 - A3 - B - def BB(a,b,c): - BB1 - def BBA(): - bba1 - bba2 - bba3 - C - D - def spam(x,y): - def eggs(z): - pass - ''' - - - indentStack = [1] - stmt = Forward() - - identifier = Word(alphas, alphanums) - funcDecl = ("def" + identifier + Group( "(" + Optional( delimitedList(identifier) ) + ")" ) + ":") - func_body = indentedBlock(stmt, indentStack) - funcDef = Group( funcDecl + func_body ) - - rvalue = Forward() - funcCall = Group(identifier + "(" + Optional(delimitedList(rvalue)) + ")") - rvalue << (funcCall | identifier | Word(nums)) - assignment = Group(identifier + "=" + rvalue) - stmt << ( funcDef | assignment | identifier ) - - module_body = OneOrMore(stmt) - - parseTree = module_body.parseString(data) - parseTree.pprint() - prints:: - [['def', - 'A', - ['(', 'z', ')'], - ':', - [['A1'], [['B', '=', '100']], [['G', '=', 'A2']], ['A2'], ['A3']]], - 'B', - ['def', - 'BB', - ['(', 'a', 'b', 'c', ')'], - ':', - [['BB1'], [['def', 'BBA', ['(', ')'], ':', [['bba1'], ['bba2'], ['bba3']]]]]], - 'C', - 'D', - ['def', - 'spam', - ['(', 'x', 'y', ')'], - ':', - [[['def', 'eggs', ['(', 'z', ')'], ':', [['pass']]]]]]] - """ - def checkPeerIndent(s,l,t): - if l >= len(s): return - curCol = col(l,s) - if curCol != indentStack[-1]: - if curCol > indentStack[-1]: - raise ParseFatalException(s,l,"illegal nesting") - raise ParseException(s,l,"not a peer entry") - - def checkSubIndent(s,l,t): - curCol = col(l,s) - if curCol > indentStack[-1]: - indentStack.append( curCol ) - else: - raise ParseException(s,l,"not a subentry") - - def checkUnindent(s,l,t): - if l >= len(s): return - curCol = col(l,s) - if not(indentStack and curCol < indentStack[-1] and curCol <= indentStack[-2]): - raise ParseException(s,l,"not an unindent") - indentStack.pop() - - NL = OneOrMore(LineEnd().setWhitespaceChars("\t ").suppress()) - INDENT = (Empty() + Empty().setParseAction(checkSubIndent)).setName('INDENT') - PEER = Empty().setParseAction(checkPeerIndent).setName('') - UNDENT = Empty().setParseAction(checkUnindent).setName('UNINDENT') - if indent: - smExpr = Group( Optional(NL) + - #~ FollowedBy(blockStatementExpr) + - INDENT + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) + UNDENT) - else: - smExpr = Group( Optional(NL) + - (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) ) - blockStatementExpr.ignore(_bslash + LineEnd()) - return smExpr.setName('indented block') - -alphas8bit = srange(r"[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]") -punc8bit = srange(r"[\0xa1-\0xbf\0xd7\0xf7]") - -anyOpenTag,anyCloseTag = makeHTMLTags(Word(alphas,alphanums+"_:").setName('any tag')) -_htmlEntityMap = dict(zip("gt lt amp nbsp quot apos".split(),'><& "\'')) -commonHTMLEntity = Regex('&(?P<entity>' + '|'.join(_htmlEntityMap.keys()) +");").setName("common HTML entity") -def replaceHTMLEntity(t): - """Helper parser action to replace common HTML entities with their special characters""" - return _htmlEntityMap.get(t.entity) - -# it's easy to get these comment structures wrong - they're very common, so may as well make them available -cStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/').setName("C style comment") -"Comment of the form C{/* ... */}" - -htmlComment = Regex(r"<!--[\s\S]*?-->").setName("HTML comment") -"Comment of the form C{<!-- ... -->}" - -restOfLine = Regex(r".*").leaveWhitespace().setName("rest of line") -dblSlashComment = Regex(r"//(?:\\\n|[^\n])*").setName("// comment") -"Comment of the form C{// ... (to end of line)}" - -cppStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/'| dblSlashComment).setName("C++ style comment") -"Comment of either form C{L{cStyleComment}} or C{L{dblSlashComment}}" - -javaStyleComment = cppStyleComment -"Same as C{L{cppStyleComment}}" - -pythonStyleComment = Regex(r"#.*").setName("Python style comment") -"Comment of the form C{# ... (to end of line)}" - -_commasepitem = Combine(OneOrMore(Word(printables, excludeChars=',') + - Optional( Word(" \t") + - ~Literal(",") + ~LineEnd() ) ) ).streamline().setName("commaItem") -commaSeparatedList = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("commaSeparatedList") -"""(Deprecated) Predefined expression of 1 or more printable words or quoted strings, separated by commas. - This expression is deprecated in favor of L{pyparsing_common.comma_separated_list}.""" - -# some other useful expressions - using lower-case class name since we are really using this as a namespace -class pyparsing_common: - """ - Here are some common low-level expressions that may be useful in jump-starting parser development: - - numeric forms (L{integers<integer>}, L{reals<real>}, L{scientific notation<sci_real>}) - - common L{programming identifiers<identifier>} - - network addresses (L{MAC<mac_address>}, L{IPv4<ipv4_address>}, L{IPv6<ipv6_address>}) - - ISO8601 L{dates<iso8601_date>} and L{datetime<iso8601_datetime>} - - L{UUID<uuid>} - - L{comma-separated list<comma_separated_list>} - Parse actions: - - C{L{convertToInteger}} - - C{L{convertToFloat}} - - C{L{convertToDate}} - - C{L{convertToDatetime}} - - C{L{stripHTMLTags}} - - C{L{upcaseTokens}} - - C{L{downcaseTokens}} - - Example:: - pyparsing_common.number.runTests(''' - # any int or real number, returned as the appropriate type - 100 - -100 - +100 - 3.14159 - 6.02e23 - 1e-12 - ''') - - pyparsing_common.fnumber.runTests(''' - # any int or real number, returned as float - 100 - -100 - +100 - 3.14159 - 6.02e23 - 1e-12 - ''') - - pyparsing_common.hex_integer.runTests(''' - # hex numbers - 100 - FF - ''') - - pyparsing_common.fraction.runTests(''' - # fractions - 1/2 - -3/4 - ''') - - pyparsing_common.mixed_integer.runTests(''' - # mixed fractions - 1 - 1/2 - -3/4 - 1-3/4 - ''') - - import uuid - pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) - pyparsing_common.uuid.runTests(''' - # uuid - 12345678-1234-5678-1234-567812345678 - ''') - prints:: - # any int or real number, returned as the appropriate type - 100 - [100] - - -100 - [-100] - - +100 - [100] - - 3.14159 - [3.14159] - - 6.02e23 - [6.02e+23] - - 1e-12 - [1e-12] - - # any int or real number, returned as float - 100 - [100.0] - - -100 - [-100.0] - - +100 - [100.0] - - 3.14159 - [3.14159] - - 6.02e23 - [6.02e+23] - - 1e-12 - [1e-12] - - # hex numbers - 100 - [256] - - FF - [255] - - # fractions - 1/2 - [0.5] - - -3/4 - [-0.75] - - # mixed fractions - 1 - [1] - - 1/2 - [0.5] - - -3/4 - [-0.75] - - 1-3/4 - [1.75] - - # uuid - 12345678-1234-5678-1234-567812345678 - [UUID('12345678-1234-5678-1234-567812345678')] - """ - - convertToInteger = tokenMap(int) - """ - Parse action for converting parsed integers to Python int - """ - - convertToFloat = tokenMap(float) - """ - Parse action for converting parsed numbers to Python float - """ - - integer = Word(nums).setName("integer").setParseAction(convertToInteger) - """expression that parses an unsigned integer, returns an int""" - - hex_integer = Word(hexnums).setName("hex integer").setParseAction(tokenMap(int,16)) - """expression that parses a hexadecimal integer, returns an int""" - - signed_integer = Regex(r'[+-]?\d+').setName("signed integer").setParseAction(convertToInteger) - """expression that parses an integer with optional leading sign, returns an int""" - - fraction = (signed_integer().setParseAction(convertToFloat) + '/' + signed_integer().setParseAction(convertToFloat)).setName("fraction") - """fractional expression of an integer divided by an integer, returns a float""" - fraction.addParseAction(lambda t: t[0]/t[-1]) - - mixed_integer = (fraction | signed_integer + Optional(Optional('-').suppress() + fraction)).setName("fraction or mixed integer-fraction") - """mixed integer of the form 'integer - fraction', with optional leading integer, returns float""" - mixed_integer.addParseAction(sum) - - real = Regex(r'[+-]?\d+\.\d*').setName("real number").setParseAction(convertToFloat) - """expression that parses a floating point number and returns a float""" - - sci_real = Regex(r'[+-]?\d+([eE][+-]?\d+|\.\d*([eE][+-]?\d+)?)').setName("real number with scientific notation").setParseAction(convertToFloat) - """expression that parses a floating point number with optional scientific notation and returns a float""" - - # streamlining this expression makes the docs nicer-looking - number = (sci_real | real | signed_integer).streamline() - """any numeric expression, returns the corresponding Python type""" - - fnumber = Regex(r'[+-]?\d+\.?\d*([eE][+-]?\d+)?').setName("fnumber").setParseAction(convertToFloat) - """any int or real number, returned as float""" - - identifier = Word(alphas+'_', alphanums+'_').setName("identifier") - """typical code identifier (leading alpha or '_', followed by 0 or more alphas, nums, or '_')""" - - ipv4_address = Regex(r'(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})){3}').setName("IPv4 address") - "IPv4 address (C{0.0.0.0 - 255.255.255.255})" - - _ipv6_part = Regex(r'[0-9a-fA-F]{1,4}').setName("hex_integer") - _full_ipv6_address = (_ipv6_part + (':' + _ipv6_part)*7).setName("full IPv6 address") - _short_ipv6_address = (Optional(_ipv6_part + (':' + _ipv6_part)*(0,6)) + "::" + Optional(_ipv6_part + (':' + _ipv6_part)*(0,6))).setName("short IPv6 address") - _short_ipv6_address.addCondition(lambda t: sum(1 for tt in t if pyparsing_common._ipv6_part.matches(tt)) < 8) - _mixed_ipv6_address = ("::ffff:" + ipv4_address).setName("mixed IPv6 address") - ipv6_address = Combine((_full_ipv6_address | _mixed_ipv6_address | _short_ipv6_address).setName("IPv6 address")).setName("IPv6 address") - "IPv6 address (long, short, or mixed form)" - - mac_address = Regex(r'[0-9a-fA-F]{2}([:.-])[0-9a-fA-F]{2}(?:\1[0-9a-fA-F]{2}){4}').setName("MAC address") - "MAC address xx:xx:xx:xx:xx (may also have '-' or '.' delimiters)" - - @staticmethod - def convertToDate(fmt="%Y-%m-%d"): - """ - Helper to create a parse action for converting parsed date string to Python datetime.date - - Params - - - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%d"}) - - Example:: - date_expr = pyparsing_common.iso8601_date.copy() - date_expr.setParseAction(pyparsing_common.convertToDate()) - print(date_expr.parseString("1999-12-31")) - prints:: - [datetime.date(1999, 12, 31)] - """ - def cvt_fn(s,l,t): - try: - return datetime.strptime(t[0], fmt).date() - except ValueError as ve: - raise ParseException(s, l, str(ve)) - return cvt_fn - - @staticmethod - def convertToDatetime(fmt="%Y-%m-%dT%H:%M:%S.%f"): - """ - Helper to create a parse action for converting parsed datetime string to Python datetime.datetime - - Params - - - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%dT%H:%M:%S.%f"}) - - Example:: - dt_expr = pyparsing_common.iso8601_datetime.copy() - dt_expr.setParseAction(pyparsing_common.convertToDatetime()) - print(dt_expr.parseString("1999-12-31T23:59:59.999")) - prints:: - [datetime.datetime(1999, 12, 31, 23, 59, 59, 999000)] - """ - def cvt_fn(s,l,t): - try: - return datetime.strptime(t[0], fmt) - except ValueError as ve: - raise ParseException(s, l, str(ve)) - return cvt_fn - - iso8601_date = Regex(r'(?P<year>\d{4})(?:-(?P<month>\d\d)(?:-(?P<day>\d\d))?)?').setName("ISO8601 date") - "ISO8601 date (C{yyyy-mm-dd})" - - iso8601_datetime = Regex(r'(?P<year>\d{4})-(?P<month>\d\d)-(?P<day>\d\d)[T ](?P<hour>\d\d):(?P<minute>\d\d)(:(?P<second>\d\d(\.\d*)?)?)?(?P<tz>Z|[+-]\d\d:?\d\d)?').setName("ISO8601 datetime") - "ISO8601 datetime (C{yyyy-mm-ddThh:mm:ss.s(Z|+-00:00)}) - trailing seconds, milliseconds, and timezone optional; accepts separating C{'T'} or C{' '}" - - uuid = Regex(r'[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}').setName("UUID") - "UUID (C{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx})" - - _html_stripper = anyOpenTag.suppress() | anyCloseTag.suppress() - @staticmethod - def stripHTMLTags(s, l, tokens): - """ - Parse action to remove HTML tags from web page HTML source - - Example:: - # strip HTML links from normal text - text = '<td>More info at the <a href="http://pyparsing.wikispaces.com">pyparsing</a> wiki page</td>' - td,td_end = makeHTMLTags("TD") - table_text = td + SkipTo(td_end).setParseAction(pyparsing_common.stripHTMLTags)("body") + td_end - - print(table_text.parseString(text).body) # -> 'More info at the pyparsing wiki page' - """ - return pyparsing_common._html_stripper.transformString(tokens[0]) - - _commasepitem = Combine(OneOrMore(~Literal(",") + ~LineEnd() + Word(printables, excludeChars=',') - + Optional( White(" \t") ) ) ).streamline().setName("commaItem") - comma_separated_list = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("comma separated list") - """Predefined expression of 1 or more printable words or quoted strings, separated by commas.""" - - upcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).upper())) - """Parse action to convert tokens to upper case.""" - - downcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).lower())) - """Parse action to convert tokens to lower case.""" - - -if __name__ == "__main__": - - selectToken = CaselessLiteral("select") - fromToken = CaselessLiteral("from") - - ident = Word(alphas, alphanums + "_$") - - columnName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) - columnNameList = Group(delimitedList(columnName)).setName("columns") - columnSpec = ('*' | columnNameList) - - tableName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) - tableNameList = Group(delimitedList(tableName)).setName("tables") - - simpleSQL = selectToken("command") + columnSpec("columns") + fromToken + tableNameList("tables") - - # demo runTests method, including embedded comments in test string - simpleSQL.runTests(""" - # '*' as column list and dotted table name - select * from SYS.XYZZY - - # caseless match on "SELECT", and casts back to "select" - SELECT * from XYZZY, ABC - - # list of column names, and mixed case SELECT keyword - Select AA,BB,CC from Sys.dual - - # multiple tables - Select A, B, C from Sys.dual, Table2 - - # invalid SELECT keyword - should fail - Xelect A, B, C from Sys.dual - - # incomplete command - should fail - Select - - # invalid column name - should fail - Select ^^^ frox Sys.dual - - """) - - pyparsing_common.number.runTests(""" - 100 - -100 - +100 - 3.14159 - 6.02e23 - 1e-12 - """) - - # any int or real number, returned as float - pyparsing_common.fnumber.runTests(""" - 100 - -100 - +100 - 3.14159 - 6.02e23 - 1e-12 - """) - - pyparsing_common.hex_integer.runTests(""" - 100 - FF - """) - - import uuid - pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) - pyparsing_common.uuid.runTests(""" - 12345678-1234-5678-1234-567812345678 - """) diff --git a/env/lib/python3.7/site-packages/setuptools/_vendor/six.py b/env/lib/python3.7/site-packages/setuptools/_vendor/six.py deleted file mode 100644 index 190c023..0000000 --- a/env/lib/python3.7/site-packages/setuptools/_vendor/six.py +++ /dev/null @@ -1,868 +0,0 @@ -"""Utilities for writing code that runs on Python 2 and 3""" - -# Copyright (c) 2010-2015 Benjamin Peterson -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -from __future__ import absolute_import - -import functools -import itertools -import operator -import sys -import types - -__author__ = "Benjamin Peterson <benjamin@python.org>" -__version__ = "1.10.0" - - -# Useful for very coarse version differentiation. -PY2 = sys.version_info[0] == 2 -PY3 = sys.version_info[0] == 3 -PY34 = sys.version_info[0:2] >= (3, 4) - -if PY3: - string_types = str, - integer_types = int, - class_types = type, - text_type = str - binary_type = bytes - - MAXSIZE = sys.maxsize -else: - string_types = basestring, - integer_types = (int, long) - class_types = (type, types.ClassType) - text_type = unicode - binary_type = str - - if sys.platform.startswith("java"): - # Jython always uses 32 bits. - MAXSIZE = int((1 << 31) - 1) - else: - # It's possible to have sizeof(long) != sizeof(Py_ssize_t). - class X(object): - - def __len__(self): - return 1 << 31 - try: - len(X()) - except OverflowError: - # 32-bit - MAXSIZE = int((1 << 31) - 1) - else: - # 64-bit - MAXSIZE = int((1 << 63) - 1) - del X - - -def _add_doc(func, doc): - """Add documentation to a function.""" - func.__doc__ = doc - - -def _import_module(name): - """Import module, returning the module after the last dot.""" - __import__(name) - return sys.modules[name] - - -class _LazyDescr(object): - - def __init__(self, name): - self.name = name - - def __get__(self, obj, tp): - result = self._resolve() - setattr(obj, self.name, result) # Invokes __set__. - try: - # This is a bit ugly, but it avoids running this again by - # removing this descriptor. - delattr(obj.__class__, self.name) - except AttributeError: - pass - return result - - -class MovedModule(_LazyDescr): - - def __init__(self, name, old, new=None): - super(MovedModule, self).__init__(name) - if PY3: - if new is None: - new = name - self.mod = new - else: - self.mod = old - - def _resolve(self): - return _import_module(self.mod) - - def __getattr__(self, attr): - _module = self._resolve() - value = getattr(_module, attr) - setattr(self, attr, value) - return value - - -class _LazyModule(types.ModuleType): - - def __init__(self, name): - super(_LazyModule, self).__init__(name) - self.__doc__ = self.__class__.__doc__ - - def __dir__(self): - attrs = ["__doc__", "__name__"] - attrs += [attr.name for attr in self._moved_attributes] - return attrs - - # Subclasses should override this - _moved_attributes = [] - - -class MovedAttribute(_LazyDescr): - - def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): - super(MovedAttribute, self).__init__(name) - if PY3: - if new_mod is None: - new_mod = name - self.mod = new_mod - if new_attr is None: - if old_attr is None: - new_attr = name - else: - new_attr = old_attr - self.attr = new_attr - else: - self.mod = old_mod - if old_attr is None: - old_attr = name - self.attr = old_attr - - def _resolve(self): - module = _import_module(self.mod) - return getattr(module, self.attr) - - -class _SixMetaPathImporter(object): - - """ - A meta path importer to import six.moves and its submodules. - - This class implements a PEP302 finder and loader. It should be compatible - with Python 2.5 and all existing versions of Python3 - """ - - def __init__(self, six_module_name): - self.name = six_module_name - self.known_modules = {} - - def _add_module(self, mod, *fullnames): - for fullname in fullnames: - self.known_modules[self.name + "." + fullname] = mod - - def _get_module(self, fullname): - return self.known_modules[self.name + "." + fullname] - - def find_module(self, fullname, path=None): - if fullname in self.known_modules: - return self - return None - - def __get_module(self, fullname): - try: - return self.known_modules[fullname] - except KeyError: - raise ImportError("This loader does not know module " + fullname) - - def load_module(self, fullname): - try: - # in case of a reload - return sys.modules[fullname] - except KeyError: - pass - mod = self.__get_module(fullname) - if isinstance(mod, MovedModule): - mod = mod._resolve() - else: - mod.__loader__ = self - sys.modules[fullname] = mod - return mod - - def is_package(self, fullname): - """ - Return true, if the named module is a package. - - We need this method to get correct spec objects with - Python 3.4 (see PEP451) - """ - return hasattr(self.__get_module(fullname), "__path__") - - def get_code(self, fullname): - """Return None - - Required, if is_package is implemented""" - self.__get_module(fullname) # eventually raises ImportError - return None - get_source = get_code # same as get_code - -_importer = _SixMetaPathImporter(__name__) - - -class _MovedItems(_LazyModule): - - """Lazy loading of moved objects""" - __path__ = [] # mark as package - - -_moved_attributes = [ - MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), - MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), - MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), - MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), - MovedAttribute("intern", "__builtin__", "sys"), - MovedAttribute("map", "itertools", "builtins", "imap", "map"), - MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), - MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), - MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), - MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), - MovedAttribute("reduce", "__builtin__", "functools"), - MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), - MovedAttribute("StringIO", "StringIO", "io"), - MovedAttribute("UserDict", "UserDict", "collections"), - MovedAttribute("UserList", "UserList", "collections"), - MovedAttribute("UserString", "UserString", "collections"), - MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), - MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), - MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), - MovedModule("builtins", "__builtin__"), - MovedModule("configparser", "ConfigParser"), - MovedModule("copyreg", "copy_reg"), - MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), - MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), - MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), - MovedModule("http_cookies", "Cookie", "http.cookies"), - MovedModule("html_entities", "htmlentitydefs", "html.entities"), - MovedModule("html_parser", "HTMLParser", "html.parser"), - MovedModule("http_client", "httplib", "http.client"), - MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), - MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), - MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), - MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), - MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), - MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), - MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), - MovedModule("cPickle", "cPickle", "pickle"), - MovedModule("queue", "Queue"), - MovedModule("reprlib", "repr"), - MovedModule("socketserver", "SocketServer"), - MovedModule("_thread", "thread", "_thread"), - MovedModule("tkinter", "Tkinter"), - MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), - MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), - MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), - MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), - MovedModule("tkinter_tix", "Tix", "tkinter.tix"), - MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), - MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), - MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), - MovedModule("tkinter_colorchooser", "tkColorChooser", - "tkinter.colorchooser"), - MovedModule("tkinter_commondialog", "tkCommonDialog", - "tkinter.commondialog"), - MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), - MovedModule("tkinter_font", "tkFont", "tkinter.font"), - MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), - MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", - "tkinter.simpledialog"), - MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), - MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), - MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), - MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), - MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), - MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), -] -# Add windows specific modules. -if sys.platform == "win32": - _moved_attributes += [ - MovedModule("winreg", "_winreg"), - ] - -for attr in _moved_attributes: - setattr(_MovedItems, attr.name, attr) - if isinstance(attr, MovedModule): - _importer._add_module(attr, "moves." + attr.name) -del attr - -_MovedItems._moved_attributes = _moved_attributes - -moves = _MovedItems(__name__ + ".moves") -_importer._add_module(moves, "moves") - - -class Module_six_moves_urllib_parse(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_parse""" - - -_urllib_parse_moved_attributes = [ - MovedAttribute("ParseResult", "urlparse", "urllib.parse"), - MovedAttribute("SplitResult", "urlparse", "urllib.parse"), - MovedAttribute("parse_qs", "urlparse", "urllib.parse"), - MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), - MovedAttribute("urldefrag", "urlparse", "urllib.parse"), - MovedAttribute("urljoin", "urlparse", "urllib.parse"), - MovedAttribute("urlparse", "urlparse", "urllib.parse"), - MovedAttribute("urlsplit", "urlparse", "urllib.parse"), - MovedAttribute("urlunparse", "urlparse", "urllib.parse"), - MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), - MovedAttribute("quote", "urllib", "urllib.parse"), - MovedAttribute("quote_plus", "urllib", "urllib.parse"), - MovedAttribute("unquote", "urllib", "urllib.parse"), - MovedAttribute("unquote_plus", "urllib", "urllib.parse"), - MovedAttribute("urlencode", "urllib", "urllib.parse"), - MovedAttribute("splitquery", "urllib", "urllib.parse"), - MovedAttribute("splittag", "urllib", "urllib.parse"), - MovedAttribute("splituser", "urllib", "urllib.parse"), - MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), - MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), - MovedAttribute("uses_params", "urlparse", "urllib.parse"), - MovedAttribute("uses_query", "urlparse", "urllib.parse"), - MovedAttribute("uses_relative", "urlparse", "urllib.parse"), -] -for attr in _urllib_parse_moved_attributes: - setattr(Module_six_moves_urllib_parse, attr.name, attr) -del attr - -Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes - -_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), - "moves.urllib_parse", "moves.urllib.parse") - - -class Module_six_moves_urllib_error(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_error""" - - -_urllib_error_moved_attributes = [ - MovedAttribute("URLError", "urllib2", "urllib.error"), - MovedAttribute("HTTPError", "urllib2", "urllib.error"), - MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), -] -for attr in _urllib_error_moved_attributes: - setattr(Module_six_moves_urllib_error, attr.name, attr) -del attr - -Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes - -_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), - "moves.urllib_error", "moves.urllib.error") - - -class Module_six_moves_urllib_request(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_request""" - - -_urllib_request_moved_attributes = [ - MovedAttribute("urlopen", "urllib2", "urllib.request"), - MovedAttribute("install_opener", "urllib2", "urllib.request"), - MovedAttribute("build_opener", "urllib2", "urllib.request"), - MovedAttribute("pathname2url", "urllib", "urllib.request"), - MovedAttribute("url2pathname", "urllib", "urllib.request"), - MovedAttribute("getproxies", "urllib", "urllib.request"), - MovedAttribute("Request", "urllib2", "urllib.request"), - MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), - MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), - MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), - MovedAttribute("BaseHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), - MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), - MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), - MovedAttribute("FileHandler", "urllib2", "urllib.request"), - MovedAttribute("FTPHandler", "urllib2", "urllib.request"), - MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), - MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), - MovedAttribute("urlretrieve", "urllib", "urllib.request"), - MovedAttribute("urlcleanup", "urllib", "urllib.request"), - MovedAttribute("URLopener", "urllib", "urllib.request"), - MovedAttribute("FancyURLopener", "urllib", "urllib.request"), - MovedAttribute("proxy_bypass", "urllib", "urllib.request"), -] -for attr in _urllib_request_moved_attributes: - setattr(Module_six_moves_urllib_request, attr.name, attr) -del attr - -Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes - -_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), - "moves.urllib_request", "moves.urllib.request") - - -class Module_six_moves_urllib_response(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_response""" - - -_urllib_response_moved_attributes = [ - MovedAttribute("addbase", "urllib", "urllib.response"), - MovedAttribute("addclosehook", "urllib", "urllib.response"), - MovedAttribute("addinfo", "urllib", "urllib.response"), - MovedAttribute("addinfourl", "urllib", "urllib.response"), -] -for attr in _urllib_response_moved_attributes: - setattr(Module_six_moves_urllib_response, attr.name, attr) -del attr - -Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes - -_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), - "moves.urllib_response", "moves.urllib.response") - - -class Module_six_moves_urllib_robotparser(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_robotparser""" - - -_urllib_robotparser_moved_attributes = [ - MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), -] -for attr in _urllib_robotparser_moved_attributes: - setattr(Module_six_moves_urllib_robotparser, attr.name, attr) -del attr - -Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes - -_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), - "moves.urllib_robotparser", "moves.urllib.robotparser") - - -class Module_six_moves_urllib(types.ModuleType): - - """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" - __path__ = [] # mark as package - parse = _importer._get_module("moves.urllib_parse") - error = _importer._get_module("moves.urllib_error") - request = _importer._get_module("moves.urllib_request") - response = _importer._get_module("moves.urllib_response") - robotparser = _importer._get_module("moves.urllib_robotparser") - - def __dir__(self): - return ['parse', 'error', 'request', 'response', 'robotparser'] - -_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), - "moves.urllib") - - -def add_move(move): - """Add an item to six.moves.""" - setattr(_MovedItems, move.name, move) - - -def remove_move(name): - """Remove item from six.moves.""" - try: - delattr(_MovedItems, name) - except AttributeError: - try: - del moves.__dict__[name] - except KeyError: - raise AttributeError("no such move, %r" % (name,)) - - -if PY3: - _meth_func = "__func__" - _meth_self = "__self__" - - _func_closure = "__closure__" - _func_code = "__code__" - _func_defaults = "__defaults__" - _func_globals = "__globals__" -else: - _meth_func = "im_func" - _meth_self = "im_self" - - _func_closure = "func_closure" - _func_code = "func_code" - _func_defaults = "func_defaults" - _func_globals = "func_globals" - - -try: - advance_iterator = next -except NameError: - def advance_iterator(it): - return it.next() -next = advance_iterator - - -try: - callable = callable -except NameError: - def callable(obj): - return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) - - -if PY3: - def get_unbound_function(unbound): - return unbound - - create_bound_method = types.MethodType - - def create_unbound_method(func, cls): - return func - - Iterator = object -else: - def get_unbound_function(unbound): - return unbound.im_func - - def create_bound_method(func, obj): - return types.MethodType(func, obj, obj.__class__) - - def create_unbound_method(func, cls): - return types.MethodType(func, None, cls) - - class Iterator(object): - - def next(self): - return type(self).__next__(self) - - callable = callable -_add_doc(get_unbound_function, - """Get the function out of a possibly unbound function""") - - -get_method_function = operator.attrgetter(_meth_func) -get_method_self = operator.attrgetter(_meth_self) -get_function_closure = operator.attrgetter(_func_closure) -get_function_code = operator.attrgetter(_func_code) -get_function_defaults = operator.attrgetter(_func_defaults) -get_function_globals = operator.attrgetter(_func_globals) - - -if PY3: - def iterkeys(d, **kw): - return iter(d.keys(**kw)) - - def itervalues(d, **kw): - return iter(d.values(**kw)) - - def iteritems(d, **kw): - return iter(d.items(**kw)) - - def iterlists(d, **kw): - return iter(d.lists(**kw)) - - viewkeys = operator.methodcaller("keys") - - viewvalues = operator.methodcaller("values") - - viewitems = operator.methodcaller("items") -else: - def iterkeys(d, **kw): - return d.iterkeys(**kw) - - def itervalues(d, **kw): - return d.itervalues(**kw) - - def iteritems(d, **kw): - return d.iteritems(**kw) - - def iterlists(d, **kw): - return d.iterlists(**kw) - - viewkeys = operator.methodcaller("viewkeys") - - viewvalues = operator.methodcaller("viewvalues") - - viewitems = operator.methodcaller("viewitems") - -_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") -_add_doc(itervalues, "Return an iterator over the values of a dictionary.") -_add_doc(iteritems, - "Return an iterator over the (key, value) pairs of a dictionary.") -_add_doc(iterlists, - "Return an iterator over the (key, [values]) pairs of a dictionary.") - - -if PY3: - def b(s): - return s.encode("latin-1") - - def u(s): - return s - unichr = chr - import struct - int2byte = struct.Struct(">B").pack - del struct - byte2int = operator.itemgetter(0) - indexbytes = operator.getitem - iterbytes = iter - import io - StringIO = io.StringIO - BytesIO = io.BytesIO - _assertCountEqual = "assertCountEqual" - if sys.version_info[1] <= 1: - _assertRaisesRegex = "assertRaisesRegexp" - _assertRegex = "assertRegexpMatches" - else: - _assertRaisesRegex = "assertRaisesRegex" - _assertRegex = "assertRegex" -else: - def b(s): - return s - # Workaround for standalone backslash - - def u(s): - return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") - unichr = unichr - int2byte = chr - - def byte2int(bs): - return ord(bs[0]) - - def indexbytes(buf, i): - return ord(buf[i]) - iterbytes = functools.partial(itertools.imap, ord) - import StringIO - StringIO = BytesIO = StringIO.StringIO - _assertCountEqual = "assertItemsEqual" - _assertRaisesRegex = "assertRaisesRegexp" - _assertRegex = "assertRegexpMatches" -_add_doc(b, """Byte literal""") -_add_doc(u, """Text literal""") - - -def assertCountEqual(self, *args, **kwargs): - return getattr(self, _assertCountEqual)(*args, **kwargs) - - -def assertRaisesRegex(self, *args, **kwargs): - return getattr(self, _assertRaisesRegex)(*args, **kwargs) - - -def assertRegex(self, *args, **kwargs): - return getattr(self, _assertRegex)(*args, **kwargs) - - -if PY3: - exec_ = getattr(moves.builtins, "exec") - - def reraise(tp, value, tb=None): - if value is None: - value = tp() - if value.__traceback__ is not tb: - raise value.with_traceback(tb) - raise value - -else: - def exec_(_code_, _globs_=None, _locs_=None): - """Execute code in a namespace.""" - if _globs_ is None: - frame = sys._getframe(1) - _globs_ = frame.f_globals - if _locs_ is None: - _locs_ = frame.f_locals - del frame - elif _locs_ is None: - _locs_ = _globs_ - exec("""exec _code_ in _globs_, _locs_""") - - exec_("""def reraise(tp, value, tb=None): - raise tp, value, tb -""") - - -if sys.version_info[:2] == (3, 2): - exec_("""def raise_from(value, from_value): - if from_value is None: - raise value - raise value from from_value -""") -elif sys.version_info[:2] > (3, 2): - exec_("""def raise_from(value, from_value): - raise value from from_value -""") -else: - def raise_from(value, from_value): - raise value - - -print_ = getattr(moves.builtins, "print", None) -if print_ is None: - def print_(*args, **kwargs): - """The new-style print function for Python 2.4 and 2.5.""" - fp = kwargs.pop("file", sys.stdout) - if fp is None: - return - - def write(data): - if not isinstance(data, basestring): - data = str(data) - # If the file has an encoding, encode unicode with it. - if (isinstance(fp, file) and - isinstance(data, unicode) and - fp.encoding is not None): - errors = getattr(fp, "errors", None) - if errors is None: - errors = "strict" - data = data.encode(fp.encoding, errors) - fp.write(data) - want_unicode = False - sep = kwargs.pop("sep", None) - if sep is not None: - if isinstance(sep, unicode): - want_unicode = True - elif not isinstance(sep, str): - raise TypeError("sep must be None or a string") - end = kwargs.pop("end", None) - if end is not None: - if isinstance(end, unicode): - want_unicode = True - elif not isinstance(end, str): - raise TypeError("end must be None or a string") - if kwargs: - raise TypeError("invalid keyword arguments to print()") - if not want_unicode: - for arg in args: - if isinstance(arg, unicode): - want_unicode = True - break - if want_unicode: - newline = unicode("\n") - space = unicode(" ") - else: - newline = "\n" - space = " " - if sep is None: - sep = space - if end is None: - end = newline - for i, arg in enumerate(args): - if i: - write(sep) - write(arg) - write(end) -if sys.version_info[:2] < (3, 3): - _print = print_ - - def print_(*args, **kwargs): - fp = kwargs.get("file", sys.stdout) - flush = kwargs.pop("flush", False) - _print(*args, **kwargs) - if flush and fp is not None: - fp.flush() - -_add_doc(reraise, """Reraise an exception.""") - -if sys.version_info[0:2] < (3, 4): - def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, - updated=functools.WRAPPER_UPDATES): - def wrapper(f): - f = functools.wraps(wrapped, assigned, updated)(f) - f.__wrapped__ = wrapped - return f - return wrapper -else: - wraps = functools.wraps - - -def with_metaclass(meta, *bases): - """Create a base class with a metaclass.""" - # This requires a bit of explanation: the basic idea is to make a dummy - # metaclass for one level of class instantiation that replaces itself with - # the actual metaclass. - class metaclass(meta): - - def __new__(cls, name, this_bases, d): - return meta(name, bases, d) - return type.__new__(metaclass, 'temporary_class', (), {}) - - -def add_metaclass(metaclass): - """Class decorator for creating a class with a metaclass.""" - def wrapper(cls): - orig_vars = cls.__dict__.copy() - slots = orig_vars.get('__slots__') - if slots is not None: - if isinstance(slots, str): - slots = [slots] - for slots_var in slots: - orig_vars.pop(slots_var) - orig_vars.pop('__dict__', None) - orig_vars.pop('__weakref__', None) - return metaclass(cls.__name__, cls.__bases__, orig_vars) - return wrapper - - -def python_2_unicode_compatible(klass): - """ - A decorator that defines __unicode__ and __str__ methods under Python 2. - Under Python 3 it does nothing. - - To support Python 2 and 3 with a single code base, define a __str__ method - returning text and apply this decorator to the class. - """ - if PY2: - if '__str__' not in klass.__dict__: - raise ValueError("@python_2_unicode_compatible cannot be applied " - "to %s because it doesn't define __str__()." % - klass.__name__) - klass.__unicode__ = klass.__str__ - klass.__str__ = lambda self: self.__unicode__().encode('utf-8') - return klass - - -# Complete the moves implementation. -# This code is at the end of this module to speed up module loading. -# Turn this module into a package. -__path__ = [] # required for PEP 302 and PEP 451 -__package__ = __name__ # see PEP 366 @ReservedAssignment -if globals().get("__spec__") is not None: - __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable -# Remove other six meta path importers, since they cause problems. This can -# happen if six is removed from sys.modules and then reloaded. (Setuptools does -# this for some reason.) -if sys.meta_path: - for i, importer in enumerate(sys.meta_path): - # Here's some real nastiness: Another "instance" of the six module might - # be floating around. Therefore, we can't use isinstance() to check for - # the six meta path importer, since the other six instance will have - # inserted an importer with different class. - if (type(importer).__name__ == "_SixMetaPathImporter" and - importer.name == __name__): - del sys.meta_path[i] - break - del i, importer -# Finally, add the importer to the meta path import hook. -sys.meta_path.append(_importer) diff --git a/env/lib/python3.7/site-packages/setuptools/archive_util.py b/env/lib/python3.7/site-packages/setuptools/archive_util.py deleted file mode 100644 index 8143604..0000000 --- a/env/lib/python3.7/site-packages/setuptools/archive_util.py +++ /dev/null @@ -1,173 +0,0 @@ -"""Utilities for extracting common archive formats""" - -import zipfile -import tarfile -import os -import shutil -import posixpath -import contextlib -from distutils.errors import DistutilsError - -from pkg_resources import ensure_directory - -__all__ = [ - "unpack_archive", "unpack_zipfile", "unpack_tarfile", "default_filter", - "UnrecognizedFormat", "extraction_drivers", "unpack_directory", -] - - -class UnrecognizedFormat(DistutilsError): - """Couldn't recognize the archive type""" - - -def default_filter(src, dst): - """The default progress/filter callback; returns True for all files""" - return dst - - -def unpack_archive(filename, extract_dir, progress_filter=default_filter, - drivers=None): - """Unpack `filename` to `extract_dir`, or raise ``UnrecognizedFormat`` - - `progress_filter` is a function taking two arguments: a source path - internal to the archive ('/'-separated), and a filesystem path where it - will be extracted. The callback must return the desired extract path - (which may be the same as the one passed in), or else ``None`` to skip - that file or directory. The callback can thus be used to report on the - progress of the extraction, as well as to filter the items extracted or - alter their extraction paths. - - `drivers`, if supplied, must be a non-empty sequence of functions with the - same signature as this function (minus the `drivers` argument), that raise - ``UnrecognizedFormat`` if they do not support extracting the designated - archive type. The `drivers` are tried in sequence until one is found that - does not raise an error, or until all are exhausted (in which case - ``UnrecognizedFormat`` is raised). If you do not supply a sequence of - drivers, the module's ``extraction_drivers`` constant will be used, which - means that ``unpack_zipfile`` and ``unpack_tarfile`` will be tried, in that - order. - """ - for driver in drivers or extraction_drivers: - try: - driver(filename, extract_dir, progress_filter) - except UnrecognizedFormat: - continue - else: - return - else: - raise UnrecognizedFormat( - "Not a recognized archive type: %s" % filename - ) - - -def unpack_directory(filename, extract_dir, progress_filter=default_filter): - """"Unpack" a directory, using the same interface as for archives - - Raises ``UnrecognizedFormat`` if `filename` is not a directory - """ - if not os.path.isdir(filename): - raise UnrecognizedFormat("%s is not a directory" % filename) - - paths = { - filename: ('', extract_dir), - } - for base, dirs, files in os.walk(filename): - src, dst = paths[base] - for d in dirs: - paths[os.path.join(base, d)] = src + d + '/', os.path.join(dst, d) - for f in files: - target = os.path.join(dst, f) - target = progress_filter(src + f, target) - if not target: - # skip non-files - continue - ensure_directory(target) - f = os.path.join(base, f) - shutil.copyfile(f, target) - shutil.copystat(f, target) - - -def unpack_zipfile(filename, extract_dir, progress_filter=default_filter): - """Unpack zip `filename` to `extract_dir` - - Raises ``UnrecognizedFormat`` if `filename` is not a zipfile (as determined - by ``zipfile.is_zipfile()``). See ``unpack_archive()`` for an explanation - of the `progress_filter` argument. - """ - - if not zipfile.is_zipfile(filename): - raise UnrecognizedFormat("%s is not a zip file" % (filename,)) - - with zipfile.ZipFile(filename) as z: - for info in z.infolist(): - name = info.filename - - # don't extract absolute paths or ones with .. in them - if name.startswith('/') or '..' in name.split('/'): - continue - - target = os.path.join(extract_dir, *name.split('/')) - target = progress_filter(name, target) - if not target: - continue - if name.endswith('/'): - # directory - ensure_directory(target) - else: - # file - ensure_directory(target) - data = z.read(info.filename) - with open(target, 'wb') as f: - f.write(data) - unix_attributes = info.external_attr >> 16 - if unix_attributes: - os.chmod(target, unix_attributes) - - -def unpack_tarfile(filename, extract_dir, progress_filter=default_filter): - """Unpack tar/tar.gz/tar.bz2 `filename` to `extract_dir` - - Raises ``UnrecognizedFormat`` if `filename` is not a tarfile (as determined - by ``tarfile.open()``). See ``unpack_archive()`` for an explanation - of the `progress_filter` argument. - """ - try: - tarobj = tarfile.open(filename) - except tarfile.TarError: - raise UnrecognizedFormat( - "%s is not a compressed or uncompressed tar file" % (filename,) - ) - with contextlib.closing(tarobj): - # don't do any chowning! - tarobj.chown = lambda *args: None - for member in tarobj: - name = member.name - # don't extract absolute paths or ones with .. in them - if not name.startswith('/') and '..' not in name.split('/'): - prelim_dst = os.path.join(extract_dir, *name.split('/')) - - # resolve any links and to extract the link targets as normal - # files - while member is not None and (member.islnk() or member.issym()): - linkpath = member.linkname - if member.issym(): - base = posixpath.dirname(member.name) - linkpath = posixpath.join(base, linkpath) - linkpath = posixpath.normpath(linkpath) - member = tarobj._getmember(linkpath) - - if member is not None and (member.isfile() or member.isdir()): - final_dst = progress_filter(name, prelim_dst) - if final_dst: - if final_dst.endswith(os.sep): - final_dst = final_dst[:-1] - try: - # XXX Ugh - tarobj._extract_member(member, final_dst) - except tarfile.ExtractError: - # chown/chmod/mkfifo/mknode/makedev failed - pass - return True - - -extraction_drivers = unpack_directory, unpack_zipfile, unpack_tarfile diff --git a/env/lib/python3.7/site-packages/setuptools/build_meta.py b/env/lib/python3.7/site-packages/setuptools/build_meta.py deleted file mode 100644 index e40904a..0000000 --- a/env/lib/python3.7/site-packages/setuptools/build_meta.py +++ /dev/null @@ -1,254 +0,0 @@ -"""A PEP 517 interface to setuptools - -Previously, when a user or a command line tool (let's call it a "frontend") -needed to make a request of setuptools to take a certain action, for -example, generating a list of installation requirements, the frontend would -would call "setup.py egg_info" or "setup.py bdist_wheel" on the command line. - -PEP 517 defines a different method of interfacing with setuptools. Rather -than calling "setup.py" directly, the frontend should: - - 1. Set the current directory to the directory with a setup.py file - 2. Import this module into a safe python interpreter (one in which - setuptools can potentially set global variables or crash hard). - 3. Call one of the functions defined in PEP 517. - -What each function does is defined in PEP 517. However, here is a "casual" -definition of the functions (this definition should not be relied on for -bug reports or API stability): - - - `build_wheel`: build a wheel in the folder and return the basename - - `get_requires_for_build_wheel`: get the `setup_requires` to build - - `prepare_metadata_for_build_wheel`: get the `install_requires` - - `build_sdist`: build an sdist in the folder and return the basename - - `get_requires_for_build_sdist`: get the `setup_requires` to build - -Again, this is not a formal definition! Just a "taste" of the module. -""" - -import io -import os -import sys -import tokenize -import shutil -import contextlib - -import setuptools -import distutils -from setuptools.py31compat import TemporaryDirectory - -from pkg_resources import parse_requirements - -__all__ = ['get_requires_for_build_sdist', - 'get_requires_for_build_wheel', - 'prepare_metadata_for_build_wheel', - 'build_wheel', - 'build_sdist', - '__legacy__', - 'SetupRequirementsError'] - -class SetupRequirementsError(BaseException): - def __init__(self, specifiers): - self.specifiers = specifiers - - -class Distribution(setuptools.dist.Distribution): - def fetch_build_eggs(self, specifiers): - specifier_list = list(map(str, parse_requirements(specifiers))) - - raise SetupRequirementsError(specifier_list) - - @classmethod - @contextlib.contextmanager - def patch(cls): - """ - Replace - distutils.dist.Distribution with this class - for the duration of this context. - """ - orig = distutils.core.Distribution - distutils.core.Distribution = cls - try: - yield - finally: - distutils.core.Distribution = orig - - -def _to_str(s): - """ - Convert a filename to a string (on Python 2, explicitly - a byte string, not Unicode) as distutils checks for the - exact type str. - """ - if sys.version_info[0] == 2 and not isinstance(s, str): - # Assume it's Unicode, as that's what the PEP says - # should be provided. - return s.encode(sys.getfilesystemencoding()) - return s - - -def _get_immediate_subdirectories(a_dir): - return [name for name in os.listdir(a_dir) - if os.path.isdir(os.path.join(a_dir, name))] - - -def _file_with_extension(directory, extension): - matching = ( - f for f in os.listdir(directory) - if f.endswith(extension) - ) - file, = matching - return file - - -def _open_setup_script(setup_script): - if not os.path.exists(setup_script): - # Supply a default setup.py - return io.StringIO(u"from setuptools import setup; setup()") - - return getattr(tokenize, 'open', open)(setup_script) - - -class _BuildMetaBackend(object): - - def _fix_config(self, config_settings): - config_settings = config_settings or {} - config_settings.setdefault('--global-option', []) - return config_settings - - def _get_build_requires(self, config_settings, requirements): - config_settings = self._fix_config(config_settings) - - sys.argv = sys.argv[:1] + ['egg_info'] + \ - config_settings["--global-option"] - try: - with Distribution.patch(): - self.run_setup() - except SetupRequirementsError as e: - requirements += e.specifiers - - return requirements - - def run_setup(self, setup_script='setup.py'): - # Note that we can reuse our build directory between calls - # Correctness comes first, then optimization later - __file__ = setup_script - __name__ = '__main__' - - with _open_setup_script(__file__) as f: - code = f.read().replace(r'\r\n', r'\n') - - exec(compile(code, __file__, 'exec'), locals()) - - def get_requires_for_build_wheel(self, config_settings=None): - config_settings = self._fix_config(config_settings) - return self._get_build_requires(config_settings, requirements=['wheel']) - - def get_requires_for_build_sdist(self, config_settings=None): - config_settings = self._fix_config(config_settings) - return self._get_build_requires(config_settings, requirements=[]) - - def prepare_metadata_for_build_wheel(self, metadata_directory, - config_settings=None): - sys.argv = sys.argv[:1] + ['dist_info', '--egg-base', - _to_str(metadata_directory)] - self.run_setup() - - dist_info_directory = metadata_directory - while True: - dist_infos = [f for f in os.listdir(dist_info_directory) - if f.endswith('.dist-info')] - - if (len(dist_infos) == 0 and - len(_get_immediate_subdirectories(dist_info_directory)) == 1): - - dist_info_directory = os.path.join( - dist_info_directory, os.listdir(dist_info_directory)[0]) - continue - - assert len(dist_infos) == 1 - break - - # PEP 517 requires that the .dist-info directory be placed in the - # metadata_directory. To comply, we MUST copy the directory to the root - if dist_info_directory != metadata_directory: - shutil.move( - os.path.join(dist_info_directory, dist_infos[0]), - metadata_directory) - shutil.rmtree(dist_info_directory, ignore_errors=True) - - return dist_infos[0] - - def build_wheel(self, wheel_directory, config_settings=None, - metadata_directory=None): - config_settings = self._fix_config(config_settings) - wheel_directory = os.path.abspath(wheel_directory) - - # Build the wheel in a temporary directory, then copy to the target - with TemporaryDirectory(dir=wheel_directory) as tmp_dist_dir: - sys.argv = (sys.argv[:1] + - ['bdist_wheel', '--dist-dir', tmp_dist_dir] + - config_settings["--global-option"]) - self.run_setup() - - wheel_basename = _file_with_extension(tmp_dist_dir, '.whl') - wheel_path = os.path.join(wheel_directory, wheel_basename) - if os.path.exists(wheel_path): - # os.rename will fail overwriting on non-unix env - os.remove(wheel_path) - os.rename(os.path.join(tmp_dist_dir, wheel_basename), wheel_path) - - return wheel_basename - - def build_sdist(self, sdist_directory, config_settings=None): - config_settings = self._fix_config(config_settings) - sdist_directory = os.path.abspath(sdist_directory) - sys.argv = sys.argv[:1] + ['sdist', '--formats', 'gztar'] + \ - config_settings["--global-option"] + \ - ["--dist-dir", sdist_directory] - self.run_setup() - - return _file_with_extension(sdist_directory, '.tar.gz') - - -class _BuildMetaLegacyBackend(_BuildMetaBackend): - """Compatibility backend for setuptools - - This is a version of setuptools.build_meta that endeavors to maintain backwards - compatibility with pre-PEP 517 modes of invocation. It exists as a temporary - bridge between the old packaging mechanism and the new packaging mechanism, - and will eventually be removed. - """ - def run_setup(self, setup_script='setup.py'): - # In order to maintain compatibility with scripts assuming that - # the setup.py script is in a directory on the PYTHONPATH, inject - # '' into sys.path. (pypa/setuptools#1642) - sys_path = list(sys.path) # Save the original path - - script_dir = os.path.dirname(os.path.abspath(setup_script)) - if script_dir not in sys.path: - sys.path.insert(0, script_dir) - - try: - super(_BuildMetaLegacyBackend, - self).run_setup(setup_script=setup_script) - finally: - # While PEP 517 frontends should be calling each hook in a fresh - # subprocess according to the standard (and thus it should not be - # strictly necessary to restore the old sys.path), we'll restore - # the original path so that the path manipulation does not persist - # within the hook after run_setup is called. - sys.path[:] = sys_path - -# The primary backend -_BACKEND = _BuildMetaBackend() - -get_requires_for_build_wheel = _BACKEND.get_requires_for_build_wheel -get_requires_for_build_sdist = _BACKEND.get_requires_for_build_sdist -prepare_metadata_for_build_wheel = _BACKEND.prepare_metadata_for_build_wheel -build_wheel = _BACKEND.build_wheel -build_sdist = _BACKEND.build_sdist - - -# The legacy backend -__legacy__ = _BuildMetaLegacyBackend() diff --git a/env/lib/python3.7/site-packages/setuptools/cli-32.exe b/env/lib/python3.7/site-packages/setuptools/cli-32.exe deleted file mode 100644 index b1487b7819e7286577a043c7726fbe0ca1543083..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65536 zcmeFae|%KMxj%k3yGc&ShO@v10t8qfC>m5WpovRhA=wa=z=p_%6%z1@blsvwI0vv2 zNIY4alVK~j)mwY3trY!Sy|tffZ$+^cObBMdpZutbN^PuECoa`kXb2K>zVBzw<_Fq) zU-$d^{_*|%@qt&)nVIv<%rnnC&oeX6JTqHy>n_PINs<G9rYTAL@TPx0@%--}9r!$a z((i^#&t<$Zd7o|Z8<TGd-?_=NVdM9{v+=gOJh$I=_ub!9J^yrvXQOtv=gzx5rAw<k zcYSZ|9am>%4a-Xw9jfY!Ot@}WQUBkK=MqH|Mf{(O%J6=?F0E)R-u5-_q9XB5EmFjL zRMB1HZ7a&fd)b}0hpCKjVjS>G(qfxk>Uow`_J8Y;?6yo>h9td;lqFW`r_=Cu;je?@ zJ}aCeNvRaYzy7!6vsuJK8t7Ip04X137Vm)<B}y|cNYZo>`v3N5I`@q}=|CK){8#_3 zR`1xV;$zJbJP0ppD|Paae;!F%bM?lxx2d-wfQV@O6ujTW-;jSkRCTolCLPMh2Nx=) zGP{NVA?TB&mP=FqZ|whc3RJSvJUJGyHOs!nBie<k<-z=e)r`kVud+vM0lsONB<Y9b z0<+))qcqReE=`GTutop6y*iN=`x&*3EzZknc4W?3rP&uIJaeXK<D%wvS9N4nkT;0D zPW$-+vpsE9St6ytWVaCXsHU`%GVdR^wE=Xv01fto0vp%r_OvPOWj3j{W@V_Y;fxbp zySskme5v4&(U>PA7G%%m<=|b-UJ~!-boN$bi#jT{Hcy&A=Niq?KHpr`Y-?=MzKk{I zIl-)f*v>o`q`5M7OP+gKtTfLZsOCS(qPDr~x8=!_5`6-VLD0EMY5XaI$Uqq@V-Jap zR-V}6Ja=V~*CHdz@F4Rb<?;{KZ*yd>ij_JtwPEG;g{#zT!Uq*Py$3gDv`Z2tYF|X8 zYEi!^3#I2mi!9?8K!AuX>_C;=ltI=m5eE7*@I4UZ&p}=3ho&bc^h3P|C;`K|s)PJt z@!8GLOb})@Yp*SMou>fLhC@WZw%7ar>1Sm0aW&hPm&@Wqv5z<cJW4gM&zmkfJJ+a@ zj6&r=dVrlbR^{dLe--p{MqAX8%7LY}g_XQXq&T82+UL#6!luP}xs6BE?<fb3E#r6f ze^S%+ZFw$9UEExnmrHC?k~jf28Qa}v(?%Aw6cJb9i=;f%LL7GNV)O&mRYm+WAK2)J zoc6N?AE0A$CG}^`sG(_iS>i_&0GwOEjRhPMrYB*+WA64e$@ELiFO?ay?gvgcC<n$Y z<L^1CK%h$vSZG@q;PL(x?eqG1V1nyS(*z5;SA+M!_HB5xgCaCQzioLANgKIa^30b| zP)0-wnAuW?PuhpB1D*9VD+*d7r2(|XN$tU(8-F?I^V~ojiGY&$x^&Sr^ySP^J_*UW zrARijT__0kuL5&8h*xu#MI`axM$bS5AWndQ;JM+aKJrO?BE}`X#TVcgz$PT9E&8Dq zZ6JXIg6WKy%Zx0-)XbKtWRx0n<OM3tY=>1!dbl2?B=#{!9_2$Llg!~3%n@58CG`RW z1LPlkk=p2eFSa3N`&F?g@~A1mHitQyVq0yNK4^CN8joui^5gTpuf^0f+qMtEYVL?F z$fu`~#PaZA)VQ4Amx;XbZ%EJqQT~UlXZwx7HHW!>vn=MgCVU7v0(=qWSe%!~9KS(N zgLM=3LHzO$mU+*{wx!#)wXd#auhgvU=lF&*IVnT+hZ`~0nCHPOETKA3I;S!sQ8$^{ zZcv4UbEsTEpxvZ3yazYCQD1%G)vA+(ndH~oy5$RmDNA{h9?j)8QlvdBd-|V!63d!_ zr{P-1vS(7D+|itM9Rk61MnI<ijY!Ly%7^jv=YUlg`cLmOwOJ@HClJm79G^?wO8q+) z2vf7m?6nYbY6S#*GNiuY5H+x^+G@?tJP#TL9re>+K~KhBa?C)KKh+E*p-K?e54p;H z-uNb0vkbWyR)1lbnp%G$OG`vjpo}PU*o}&pp;`PEODluTuiNcFBFmELneD_AsyG+G zkGm*r)oMJHmxrXL#=Plxfj%;6&nXBm<I#%{teK#)2aU^vKFj+G2|d8ZfX<DYT4pfZ zfo|^HD@jrnxXrnoJ(D*BEsHtwkuBFp`spvA2GpIQLK~G_Fij)vWt2{I(c2x~KW)!t zCOE{y+%GQUQ^og%kazlaaoZ=NV(uK8O?>)d`#6i)km>UtDzrb-*V{hPU&@;WB&3=+ zxL1-^s(vuM%+x$5wc!b>TMmX_2j=|8Kt*)b-4;r#_ff_ny|oEKpX@DE=!THWD9l;8 zEWjV=HO&BTAtLP*tp;IMlM0_Vn8(sUqI$?Nv_U1G^tEZC@of=jxa%BH_{Ai!MYo}y zE@)vjviC#f;TCVZ=HXtX$EDFgCrJNz+eAX#tsgc!-#{X?u;vu7>K}|6xr+Y+O$ixV zZ+D5)r){a?S581&?=jW!dQYD^njLNZDwQ49Kbq9~QJUTP@Z(p`mlCNjK7uj2dw$*y z?Fs@NOQ3Fcxb;G+-Z81QBhBuJS%CWlpf9gp&E>m+$xzI$NMcrT+APveYg4QEVhkj# zC+2qrf~MxI;{Q2Zk_`Xps%rkG7-Dkc{@y;QZ4Oz0#y`#fgd*BZP3DWK6>a+@*L<mM zcZ+wv6pXlQp*qv|N$8nGnzy|!owe_wFT`9w_5eJz=cRm7?ApYLBWTQ~Z~Xh0d`OLq zTT$CqaQsCoH<7xV;0<Sr-s;g0IvOs}L}lA&k-l0$xByYj4z~8BGDno!&c4z=oz(hi z8grx*iDYlPN`q&LaV@ehXt=Ne8MeK-x}c@DjsM$J%twl6LU~JSD&H^}!^3Q<i@!_g zv@vrzI}>D@EZXPo+Bl`5Zw>0+GLF5OFNogis^p(SM>i~SO7+N+7^b&-f@XG3hYwRL zs{rPg^&WTKXuZW1;J*Vf^E(^LEqH+VoqCH0;~Qle%pqFtZQVGjSX7wPu*PZbFwOi{ zG*lGy6QCZdX|wX?4#`^~>lfT8wQf{0k4{L2{|oR+{f=JfFn@0V9WOeR5QLU=M!U6~ zB7d(sir<zi(J(xWuRwrR^cpgzK1ceMKSTyn=7h94qQ})c3tBJ-kufbC-S8FZ{*A-+ z;wE$p2;6zcG#Z^Q=wCTDUVHvM{Uf{T%s<wYuE%Y9r%meyA9u+1R(iScdR70ky|pt% zO*{K56g<p=`;6dF!Rj_V9Z4Kex3fBWL}~ny1nH|{??HFC&$rtV!@%g$GEs~YjUt-3 zyg5y8xAoVl=3`2GjRmRwg}nzj?Kb^myE<wR3=lWy37hs;ROnh+ySnXsoC;P)_ZOlx zK7zQFs(oe^qFNu3t$Ssyg|9J2k2}y#^%uW0`}(%CH2YD#%Pcs^MniW#E!k`h>Z!)# z>Ws#2b>jJh;6zDv(pxgML&lgyPQ#zcbb!!sgpiDoqu{tG6%!Ja>nvz7KufAa>qaA# z=oV|HC9oE}Y-%~C<~B7KIy+)gcYDw!`k|a8<5gBx6?_n^Hfnl`YGk#JRXDw`Y3W5Z zF72K~Dqd=&sK!kRIocXZ$WcQ@HMx}F(UwwzM=dX^$<yW*)lApsLU0ONe1#L$wDK}< z+m`P7xi@OFy|1a`^g5Sax&QBIL?i`BM9fM)?J~l{Rc2^%VhrUz829&peWXrWCnHlz z(^x9cG-`TL;&SCcT7aJf@*!}hy(}@hIc?50YSx@pYQ~(aH5qypGnehQvcielAG{aU zX~0_@&*J%hxyYZhxenZpYC#MBj39u^sFM>J%<uNLp{5+>??vDyuV3EiM+4QdBA;io zzdv6tSFL<#t<s2TfRwNG7HQKrPlW>QrIPdbG7F+JhObn}j(kln(mY$%K{!!5k#)1E ziz+3WTCrR!=CNXVR%|-O_{kh9N!CV3M%Px+KVv3eg)|H^tUYmMQB9Bbm&lY5<g+!A z3q(W{bNLa7G-%8GR2a%BXjxsm@<>uSRpgw1Z~T#cB&t&nSAs!Ug_}|kVHMz$WCS?l zqwD<1@hy6X9b^#7A}+?pyqY#|7U^Uy<!oE$R#G6OIHC7~?928tC#m||`Rwb!vt=?X zUvCU&<zZuqgAMm)Z5TgaQb)3^o#QYflyA_|`O&KZm&VE*-qc-V@o_Xmrh)G=FTI?~ zaUiwZw;@Gy>*X6#P>C%ujL9h3=b(@6wKWGF78?2)w89yy=;G^09Q<ASzGu)Qw(X;0 z{;ohoCMo#dETWJz;bQfN@r_l;$_tKiy+f|A>y^}WR?(y1w&Cj}$@F5L2YsfEL<3pY z8Z-dF^8sAbhP4Aqi=v(obhDs>e#QftDyng66L`)T%)98HH5&8BF<Y>v2#E?5hTb_9 zH2mD~chFE=MQHmw0&)Lo6u2YqKeGV1@zG*g<1#Bwv#zb_%-_+JlMrxKd<~ir3Ze1+ zy(_eP6{~SYKhV+(S~~v~1yt)79UHaSeZ5h0^WBheRNU;+TO4|;1L|kljg`GxMRVY5 zgy-B?`L%XKbD$65%Wkaf(<V0uOoUxGf)z4#f3Kscu6N_X#60DBpQ${*$V`+W)Q3=C zVh%!IBlLCRI)r)=>P<|yYD*~1E|lWFafIgb%{TqMMK!$}&wwd`weq~AJfD%@n)sU_ zUiHfyy0+TP&cgr)(wf;G1RCO$+F-8vOp><HO7p|jNn-Q6t|xsd^WT9I=Ikc$B){h> zOt(p4nn%&aNx*RFpHZMF4f(Ufvk=7?JRPMYo=R06O@dN!hp9(J{WAdZdPL@b!%!G% zLqHJ$fo+g=B{EqW3P?d+m=J67#;*QZ08JwbS`rFm!NrD0j{xSFfN^d-(+{H;KZnVO zq>c^Kn`akV>TQ^)nUX?$=?!SjnvZ-^xEv3@Td*3+ToB$GLi`Q1f1eLu;*Pvh0=OLj zdhtFgHl&UZQ-JSB8KgFySnsCLa+gvITEM<JVb|Z0=_NNbv&@H6(`bHB@Igt@ghI@c zl*U&;NMph*gq!`YU((D;uXAEi{}>T?_A^wxGy~aKk5P9rYN}h!*-ueoBA*hw4DFOr zciPZ8^v@j#d(UsI=5c%~N>l%e$W7+;ycJQ_!+(R9k!HS|Ec90*HCfot5kX%T)t%N- zi~Jqxa4NIzB;-ca!0JvWei7b)=I>ieG+2$PYbd;x;wr_LQoMggi&;CG;F7fIhG-(% zJ!c$nrEc$qdPCdkvnu1mRQk}y|2ztlU(w@aFd)D-lsL#-NVQSwulrLY!m_|0v*K-t zB7y%f8D%CG3s<7iT|s_@7ZVu%+>P|Sc?3OwD#DH8xgHD=<f-VsApaaa9sX=8nv;#Z z`k}l%#O<|7rBhsro=L%+c2xoT1-LwYZBh#O<!BUXr-(Z|lREpYkzkpMTP0~-Q7W02 zwZh$V@M_pc5wh%Sm%o^4qt8t_^m(klPsMxqW>>+Hq9%@@@^GtBaXR79?>LQ?^WZ#C z2`ni`a{1lFpInCsiUb$05edblZ^2mnBP=hXEp>8aJojRG7BaJEcKD<{j}yzhTP#U? z=Aa#XBtim8=Gg?r4Uj`5WN-&1pw{2h8%&)Z;9p{i7uubJoO^Qd2$-{7c$u@ERF>y& zqN~6wdfjPB!z|)D^aBs!k+_=q&oG%~7!{|m@ca2}v;&KPJ2>;78Umj~@P&9JSqLha zzlFYP<2&bKzVZaVB-Mc?2YHnu!LA|`O$fbh{3s#N;_-HA4$=p_MZ|rGufc4|OmzUu z^JPvljA~1&s$+Aa<w()zNx!G<0L@dyGr)f#BOMeS6)ST`QZT9-X)BDf9E^O4EH=;B zE*o==+8m?Sfptj=P=j*yt%Pm3WkA!^$&z|GbdnQQQMu~aAXl=XRo6Mq&w=2&97(@S z($~pS2zk2aJAG=JelIfRnTs4-Gueoy6w{_W-;!`D2U;p&H9!}KX!)wyGt%13G>Z>O zBaXr}qS-H-6;8gFl+j!hB|&HG__QCH?uAZY6+qd0>UH`KS<+@;OtPgV@|*2uh0NaK zb;wtOjM^yvHpr<LUa2YUt!L-)wNxOQvg7UAl}UBoaAs>tzb)z&!{3Y1&uQu2YF0;6 z-&pJkNPw~TIeP9tMbGFy@$3@M*Ts{I=TY%&5zoVT@~P)d6APo+yaISwqj*6}fd26l zSTkcVuiyVH03~%8i#~&ZzGlPMWCA!0Gf#IJR{FI;?gP_@en$)RA<KPQ>9elZzErW? z-z!$}DeP6T*8k_BYkgYiUq~IY)=yyvyM1}}O7uIRM!^y9drD&sLd~O$*hyeu#5%<D zB|MuR{sPa&<4WTs;8UXSCjiNK>=0hc&P=2=ADrQtvtr8#<-kGZK>Z2~i+YDr(2b== zcR`DCps{r;k|OD?J&uqOeF)jSt;!F64YPom7yZ+9fQ}L6K;B(=8G8lk_6m~j6~x@z zCDMtQotu#j_2}HA-lTK8dcDqNby|73nvIwet;T0PM(}dy%>!Xa=e&Wit+N2(1_4tK zJ>Ho&@F}G;2jTj!uGD5=No4gi+tKUoGxifUO6&p|zC}*Q`Nt@!^HZd-C<VXUGE6z} zYOGW~YKVB}>-c2srIvNJB1pwv_RV7Hs}lRAC|1y*^It@P6dqcjDCIs;$|7}n{a0bN zwEnC0YEJ!ETa@VSNVnP}A=G&bfqB<!qf3&BkW{O;I*ahh!r#?-)j-(OIT_(*`<&~w z3HA5cW@%$e`m=&S$*g^tLCz@<0M`kCCyB^pUPuD`kpR{zjc?QYPNne;dVddtKfN`j zaX-DcDvf*Ty+UdHHQvTv;)Yn1ge#yte=uO|J&YiKVh)%++R_{)&I_qiSd0WOwwE}M zKLJhMY%j5@ZER5*pMVy>1mb=`bXK5zVw9e>%7YwwQE9vvGOqVjDG&Y)-L5pEZIaIC zt1d9l3jE3C<x2EN7|!Ysdg9Sts0z6xi~B92`HDn$#vVI|kHS`EJa!sEBl<X=N~|0e z#G}+#WRvWC64CQfBGXLJSBXA?#3B7;AUgP28#eff33<>jm|E(KL}PG`1?WOK18iyR zr@EEK-#D<=?b9-MKLq7qL@AMpXFN*8q(*e^0F2H-_4k1j+Inw(tI~Km%BD8|oIZZL z3U#LP!ouD_m~3*fC^b0{i;`Lh@J}(6VsVI}X;M5&;!2eyMl~<&Z4!WS0Y`~eMhmOX z*{Fz-wZUowjBH+3?(n{;&a#?E?5n&i88K>u>i%i|!DBr`8qsAZj-fVnlD&ENu7UOj zcr8tPJKsdI-m^h@@FMC~8b8KU@3}+S`I1Qgj`G7<7-#jKJJoyip1alQde8Ti=;Qd- zEqbZmLK{d(>TSv1K-&|`*$o3Y^LH_kih}8`ftlRO=24yNSd>_EospK1t)P)MNSMz5 zMFbXV!)H|iohdPqaK2TlCsdyXsw|yVJM_5R`8Fcji2AR-qupV#6XH@LR3unydzvBM z4f~1F_TbC*c}(zSLwgMXgM4Bpq**9!s9VzD=qH!e1;$?DRCY2k%qp0&7j#pf$VRk@ zJ}vAuqB{{t3Z*G@GUUh<RahMtFhwyjk)sMzr4_lDBo%wm1?Ew<pEzDWl-uxWJxW(S zme6Q9$r7u~*=q@WxCI^x)$b=M|BjXmCLRK`hJZRJi82A?y-FLA>=QH+(oZ~6)oG_G zm7oW8n-SZG)I^@nHz|$JLoI;48x87n8XKNR#<&=^F9+-;eGV0gPPh}0%>uwt*&h7^ zikjIJeH*WM^eCR-1*y{y7<3vkDAAj#<hY}|)uZNEl<988lt+1aVQ<1g!t+y1WES>P zqW!0sNgW>q8t;8)$CzynZ~LYZ=TGX#rStC(HZCa)yTB3evmPy_-~(OswN&RE!Vcqf zp@Gi}J#;B+uy|&hmNr=+9n;P-K_62nm1xV3H2SPw#e|IhbXfof`+6|7-a1piP-HwN z7^H{2zdg+^sM$1pNn(G@e>T6pEQuKCV2I4dULmNrfxpt(oApIA)u1V4mx*V)ZKf|V zchNeer}=!|H??#5LN6WbNlX_CYfykKg_THOR9^_2FTwuZg0(8r_mh$V#aE#VnGn{e zeCl;DfP%p?tggB$k@J+TKa!uwd@4m9VSVvf-3M5SiBUWMu?`fM{}^?u#Rg7oj438} zF(JrR5f9(+cj98FDW)K7zZihT$5@OwgKx%nE3=G6vK4Y@Bde<-Gp$1S)m91meo|RL zn<`b;MO(K26BC3>4jV6|nK2@IAd(jIpM#El1d*~p8E?Q^LTFiSdXY#}J?38eXq6wU zILE&{2PF4XZYiYgP2}og_GW_ZL=T`a(o6hRfQ6D1w{88ns)Va232{Fagx$LRq%S0O zl)0Az+ySZ5pA=~!CT4ui_9ihZH^Qxh#U26>6Z7Hbqn#h2z5ie)Ybiu*0bt+kjg>s@ zjA<Te+x6L%J}EKXCyl?tC*6y`SMYZff1{CJnvdz?E#UyIH1B}!gaNm%H|Bp7#ui@( z%oNtXQp6YWU}CIctPO>{aix*=UiZ)(*qFTw&sY<UCyANuK8K{sX1gzSn6XuE_vK0L zzG=hSeU~9x*zTJ}dxI>C@-?(l4s4*jzOJb5O{H-dahv}rm2DF96vkFyo8F5}t^)$F zZ(9oMi~Bo>vl1%_AO0!k4`R(0WECATr`T9CY<emo<caMP7+pC8BYll5)vw8`??*{r zQwa1doJQE+frH9%)8A24O!>DxmPlhFq~FmY!A0jT?5Z*B+?Z-mztE>vHrpWqH$Nq7 znQ$bS14=<K=P<2<wbKUBCzDz~Nwd$g_PdY~mJ)PknIrr-mL;(=XMopVX(6vP9zl!D zG8t8u=>F3%*>!CDalr@dER`@@Y?!6d@*<PA64UCJIO-D{+shmcuo$LBx>vxe+Ey;C zzAb-8pA`ZV>?nizOJLlY2g_U%w^_#AX+&7PCq<)De2EOb$F4aLln1f;?205wZvaM# zVFVXXgXYER?xJ1UNedWLbhw#43pHVVJOXQCT7oAT1xqP@drH6g1<S->K{s|^C-D8~ zII-`VG_Cp(PnuTk%;)M~Y9hy;0G87Oi^b`fGFXmJv{=-iJc*G;s){U*MNc7w4PZX$ zFG5NYGosTWBeCdAJRx94bOr)R^%*-w;fF~?jmJo-7}k16tTxu|e7FZm>vqP@h}UDJ zMb_<%9ulu7Tg2<vB$|&tC^RDTJ7N`%xTwhn&1g*%jMzDVutmMrtSTNQWXCw9mbgHc zSQk?Rq?y?(K)r~>PMX=bAQTgbqx%Agz--_|=gN^3-U*{nC`=`o*^BWB5aoD5zDc^L zbCPah$}ndW(fDOKfCnSmYs?O0|98q>)A^t1Kmi5fV)^NK<0K|?>Ztkpg{wAx87u#* zeqqFx;gPHrpt<9XQ}|ZXmRbrVBf~@9!{b|~w(2b~o%2V>(ripi+vjs*FBxfV+~`j# zwUV4ks{+SXm<c0&r6KeC5rkopzl66j6a9?+$nen{e9~GIIv0{&3jd(>d9E1#@;j=6 z)uOkr_4gLM5-{%ICcH@ey-Dse{MZBUT1zu282Bo>*21v||3a&=U&8)UQ`x`eDO#(a z$+2t;o8*GowEI!b(%StdRN6V}iP(KElBg`U#9@D{z*)%O`vf>Iabn-XiXWl4ADbAC zbxL$JvcOIfTh5KDUbfOny8snu^oxD!YWTy%94p!42i&pJ2V91~3)1fIfdSdg-sO4d z0#s^?wrun5SjhZ6>?CT{-mI^K=Fel0?4c+GlPClQ3ODjHfx<bfb!|YLTAMfm$~F|; zzUi(GI2jc0gto%WFHCQ)PbR4%le@x}%Msf$Gn>-kp8?Z8kIzIS{LZ2kPIYA1qR0t$ zn7?WzV-v+FcYYJ4Hb@syr5~l=QXFk8m(jW!<oq3}hoUN{(zpzPWU;St4WBx5kz$$J zstdZw%J~Xa)f0lN%jHF>w}53gPr_z=9*MvMv}fS8675hU*yDz=>Qxqp`&p8$PzafG z#m<%=%AZ_k$Zh6-SXSFN%1V}W(ZY$4no;C;s{g~%TEA5qZDWZ>Vk4~|HI(T3pO(1a zDly^=Z=limT__6dNkqF<O)qXlFWR+|h=Y&CAT5mkLH;f(3SopqcV`3xyoaI#cJoZI zim;&G0GtxTkTVqo4z&eA!rAH-<PNvS(l(>HhpOr_vsaOh;YYEgH_}4<XGm>}xWc;# zn?;DgBeLc+Ou7F;1!12zVqb04b$E-(L8Pvlop1dlMR<bP+lzA4QYLl#oVuz6cm(EQ z;W=YB{ik))y=}SxV~#Y-JE9cTiWGBJ8vh#n6tWyja?=(jex4Nl0ne6Hft8KlkV35y z+y&dDCbKdpJ6!*f9e$D*QZ(PwG9*?lf;3mNx%oX9!Dm#%Tj>sXK7|7O2c;w@PH!A` z$}(qT%e{);@wHLrOr+~eoF4r(b2T#R>l_%jYgt>r>5{5}aWNyvNppn~*97@Ca5!n) zRB&u!64`2fsMa0iy>Oxm@QbJ?bpB*$d`r@}3#0zCM9#0Uq@}4Awna{XqNUUrOuWc% zslzKgZj_jgN(3Qdj%SMs)!HOMgJ?$SA5m?n;P?V#d2f=I&$4o7cdM>mQ?y*xMg;gx zgc(g7CW7dRu|;*V=I(Ayq5ilg`3a_A7|!c@Ic8!~S)viH$y!IUBc2WN3Q-Bvj^$c3 z5<sx!+AtAP?XbA>`_KmLmGEEV1Gd_1d=iz5E(t<VUtR&}*5~|vF-8WPHZkV-dpSZz zp_pr!Gxc~5uY<A@^EYRi-j}!SIA#*7YuofZ0ZDU<FPT}zCJ=W74^VFOBqlYZ^z9Ct znpJI{sOCq(3^0R-^me(SFPx2e+bIFLTI}*=5Tu69@DqdIKdD`5F%49^IqMZF*38aD z71(fbhEG!8)PhF}%!TM2><dpIQPFbva~SF(6L|_oSg~2j>p!M007t}T351I#sty)U z+#Si`84w_Buz4?P3V#KB5SPf|6%DG44C5i97KEp0qBcViqnfK8ixAqFYTieA`GW(w zAaRLIV{Rh7ntx26`g<b-#gL;{Hz3<k?DQn<ll%HHt7-aNNgEa5Q|P1E;2FVHjLjkQ z`T-Xxw7Q2{9Y#SISPD$<Tbr+rbgU>ie*R0Z-#Na;r%mD}%<5Jvs_7s90pggwVaNJy z;Gz5ncB#LFXNdQ_W-sV26M91L>)3K<zv8-CZ&&nBu)9dR+1}I*&}Lh1fJ$0Sh=Bu1 zZIV!tHtTQUYHDH4Y44xZ5%^qP#jpQBOzXUV(rydFEg-4H)}rs&NhB^VDy~OgsRcp) zBQj;caunT&@|oX7tBL@ERuek?2okS5fdLs%LT$*NCE(OF3x;97gEqE-ocb9DFl2Q! zgtm63uT#EgNyte@*InzB9Z1=+&_xdqJ!aCwM~?tK*3e@^?B#m2W|4N3p`^dmSjEDp zr5EJ*DeEctDj!a93cWB2&A~*29n=53!&rXK`>HxJ|5fbYYy!?SjKig2`8l{-`R#sJ z{y|JM;N@7?!z#|5{daszTz&pedK?9JQ8F;@qU0|0D_iceAI?7tSL#Z>U6e&#kwgbP zkkbtwSlf+Cu<f@_ncfPo253+zF_re*BqkMOz=e-l@dSF=3tHNe6Mx!NOm-RZ<2n>! z2^i*I1ua#Wv>X0&z_aSn73?s&*dqlVd-T@)W9p>J$FO7ZOZr;Fjpb*IiZ0<kj-=(t z)3frtzZVEN)Zu&;5GEyyDoKyR4}t#_Nqfj|4VZ{Qpi+zi1s_y<&#G{Aa&GbPMOY+9 zMu&t)2l!LwN5#q;zBt0;6CDn2Z&SxMOE<QuqarD*i|U-p1COE7rnIv5v>VIdYQtLL z+vF=8tIkQ-iCW8@Pz=4^uQuJ=>}nca<}1w6IQAlU`d|lyHiM6o3qDTHh2A>nrl2_S zA+q^%P|?VQl|Hvwh66uk?P7j%C%U{@zVS76a{Yy?)f|yCw>|CZvLrN|l>4FS+vXAI zH~1Q@M_VFOIwyh-O%sQD3<-Z4nfz%+pMuT$dA}3f(Y)N<c#Ca<Hc{-Aj|5{d<1iXZ zo-tGXE}|+3jBfS)BafO0JZ&L^nBNGx!%&i(k|jT2v%Ep@)Id7GlWuGz+R=G5+`2DW z)a`k83dV!1XXu&z6g?+ALC@Kb)3f+dJlE~aJ}h2YFNxQLN5m`jA@Q2FOT4byiPxhK zrncaPvkrTn6K}_!eR#*Pnmk1DXa@$0c&dc34gYu3$34$Yo-f5ypTaYP)@Z5EAVe%L z79fULyzOojc5hm0T5GmFJpjT`w=@qL21F6dx9}hS>_d<iZ+bBSNLanucs{{|sq9Nu zZ%5j$dIA$Db&Ad%>KL78sm^jCQ2QJXENk|S6i>1Swe1^0VH!|z6vhVJ3d~qpZgqg? zzXJ`{qP%dJwHn(Uw4c1)+4_+yvo*He^{Zd~>O~p~F~0$D{+lmT#%8yz$>m$BosT^* z0nr20&}O%cv?bbkjJiUE8qVZG$Ol*3*xZhC4DtbUv%|~|qj@h=J~GK)1f2?6ni^AS zZU9&Mjpv%9p98c#N(mlVtgend_5~7@=MO8-+r5XkjLvWM1!50n(f5dF84tfLw0Q}( zm*9+g613dxj758q1+@iGGXVyKBgR-iD*K=c=}3jXt{(VYjZ9Vis|CbfrAYwv)gXY_ zQ4v6I3!prr+D<=J)7@%Qhu1Goo8W5RnM%bbM$r5yo02?~go2uOrV+Uka(kl)NYvB= ziJ(Qrc=R;N`2{d8IC6yuvxg}q);OGU*^kC<_2?JJZgJKx9*$a$VY4ft=wFT9f@+7O zj$`$od74}ad%Gmf_rA69AldC`VZZbwE$pF`3rQ)z)dl0=BiP1ZJ-dY$-og#)1bxSP zNgczsgfSnLVGH~D`xwSpJO32GZILW~7K4{qB>)7j@ZQ<NRquK%CdOgGwE<m;>40L* znbh<k|G`<n?<OE)VVDVMWCQ4WfcB5bU=AtqL#CZZ1^b}qlhbb~9C*-Gk;ZxAT`V0Y zybkv}y{}K37*C}jNCD~Cih>GjdU1BZa@I@C(fhvEMh*p00h0JY@9QPky)JkP4t`7= zqP*~?>!A&M*52<x2k*Th{F-zns1|+)7*@OCH45wZaE#_Jpf@pHc?`&iqX9+x9zkQ3 z#(yT{uqtVpS=@!-#!nke{xxk-Yyf0~*(t(n5msJ^!~C*MP!4Ndq{RF@00SGz1&Krf zl7x`PN^-FpYdVe!k1rrQ)O`+Ple1_!S03m=74>zWqxiQFifLao4{wB9^g%?F=gS~0 zM>_u(!b6Igk78KGX%zF_BQvo$i2dd%>Ll%S;>zYS8{}-d^88%#^8m>@n(H6JN4eBH z0j1d%dV4m1hFL&aSv{tK$Ix%EF=8gH*LA?R>-5G>76)qa5?U!q{5zOkM$(KDXRO2( zGaf}bx2|K?&R=KDobU79gq@AE{9S-_z5ubTUu>V?@OfJ|ccbj>v{^6<LJ%vN_+lT5 zs+VQoBJBbzaqyAIfg+76Ibk<ohp|+arK#>CO_g}6Xg2YP5?z6EY1!XzyS@qf0Ycyo zuOK0K^{@C^(P8ojvDHkzYo|CVWwttu893J<y#^+hB@U&rn!3T0f)?HX1<Az8=m$z; z84_P?0&WlocJb_!`cw(tn=;==vp-BaJ7}^<vkj)5GB<|@BxD3D3m20zCAX#9AzLA% zHeAJuNh-{DyURAfZT&N3>rN%fv?<X)A_D19F*sY|SK`=n3hiSh@}3UycJ4WiH(bHN zbUmqcI2E<H#I??F`i~;nm*C<{G3o5OtmefzxlK(?W9UPt^?{_R4jL<mG)z;|t{nRI z35>GnumQA32}vG6{NITX#smVXGT-f&W{?OLdm#JQzu|LRVj9_7JPjAE=2mf)a`9Ab zAy_6`@*nHK5Zl4;M_QX+{4AWn;AI>6ng`K$p?E4K0IPv1nYAu|;3Z1JysS<AUUB&Z z&@#*(cou0$s4dFTZe<VbvtnZq!)oOs{F}_@DHn%f0h22Bz;l-Xygvx=wvPbJ=czn? za4`J^1Sw++(os(-O7^h_4k30Gv1ow*3jo*yuOlp`=K1je*G1A%BvDKgg|#5YBM4&7 z6Fcw+#8`T96Shm$F-4CMRvOmRzlU3yc>^y2SSS?R4u@cwoDv##^y~sxs3TZ9P{;%d zV4{fxRJ6JmKGh2ygURWXjF~(9skC^I_ki6)F#9EEOd#ZJVmWw7$<^jN><83bny&>Y zLev|G5KaS;mcdAD^#EG;S!iW2dlFE;4^Gs>Ag}%LHh~9<rUs`{k*H`89YP}tZwN9_ z5Nb4>{Qrg)EWdHM7sD`c1JExBvYFoV>hx-(khc<7V#FIC<h0_$S~x^Q-Xqi}81h0S z`z(%QOf59lZteEL8@Cf<Egd#yUDjAzwgL0B?HFrwc{U|)Sf3nluR1}w+xceXKz4pV zDF<3R#md&RV)B~jccRiE>scXhtpKePdPzHNO}c{S>_$Md+4Z2J`3~AJd3QY$$aFIX z`~CFMe8)VB4>GIofqW${KcIdLn~0fokH)b<em8~*vP0#B*Wwcfs_7_=ve2~sD0Cwh z4X~qPqW%M5l^nSL-&NiFUsQeeSbx>K{=2Hp>_(s@oc@#bn%UH3)&+`=hYRR5kn9dZ z4t}=DW@k4MKznW507XWFA~^)<B}jO2XA!N;-9#m#*l;v`Co<_-f^MC^gCL=EAEC~D z;8WB52Ias8vj}~36ULEv*{WTgK1{L~8r$6<UY<ovHi3v~o-iID>W8V7CdN|4i6qAM z4ebxmQmUl=ftwL8iI;^*g+j63Erc38A%+wZ;C|f;g&~0xDhNPW0h~tJdNR=LCeA_F z+`OLKFu)Did$N&(XP^abKo7X0_}Qc+i1%iQ04)<N6RtU%hyow&e})9WON1!ABurbj zSe5(+yGE=FcDHWzM$lQ1Z?>CA%1Iyuqv1qukiSCW1Bc&-h@49tFbOAM`K$%MhYGq; z(=Mdb8GBlv@Exc~)FVe+e8f?}(3glDZXwD$X&-}Zr%EHufLK``s0(E{f(m10Gpv~1 zip{cOe+QoUHphy6YQ=n3>^&=1YQ<i&V&ztBzZF|mOkGKpJVOZ}R|iHdYfRoAhPD`o zCJfAjO>5Ar<~s<uzn7}5Uivr6h%|Jr#I~<T-l^66Eav$kuMl+A-Czo(;)D~h21A_* zQ`$fw6Ok*(FQ;<(B5a<J1c>h2oIp|=g`GTNh0%lGX3!tM2{;A|w$fM&6xeLy#&FBW zLg$8`qxT*s`p<kP{FI20Bq8#+h)~a(@94z@fxIM8dq{xP(RwifN@|u~OhA%2g_*aT zWO5IE*-dg3Po<1&m-?_UCn%BE66HNfnNu2R6tx5x!vsx*e~$$I3b+71-N?j8VH#)w z2u!(M#6@{R?1`9`T<@Vo{xRYha7AVO8L$Pq_Kxt1N(i1+U@-~+tM2Jnl;!>0eF79t za`&uDxqFzE1tpCq?*5dbmvA>3m(ux<kWSVVOF6@ag?XYYR>Ap^S5b0}94oOE(<En$ z!u;GijRYIYiiCzU!>x6)Op5~OTCvw2;0wtUob>WYcvweLn*2RYH5c0bU(rF-f+I~e zJ?;Jr(tMPJ0|^`4<^~5H^sJ2edjcqjt{$0)Qv~`U4^)Gz(0`5=KwY!|f-Tvtyx{Mh z>UY-HodcW0prhZm;p_foQ6+hf2l<u`8iBB-=?pz}zcz*!!uA`N$aE~WIpFqu4VnV? zo-95=e42t!iI1_GgLA`ZxTinmQW}4NG`2+6JNk^_*djq;ddC;~VR*GW0Rc<))4~;g z2LDMLdW{_CRVQa6OiuGzWHovkZVzODhQ2)jTTloaCA8|ORvPQ6bQ~a?8!NZrbl8%d z{GLVLi#U9?eL^*zV&kXaC_#%Te{Z5fKkPxRwAFGijIrd5F`k?;MzdBpU9)32kS*M< zlV`D$N30zl6+ZY?Rh9fosNJat!B{j>Ohc{B6>^iD7!8eD4O5Y*?yiCAaCS<~NYV+e zhRHr%y%HyDErVkvwwGnv>kvLO-rTR7pmo&@vJdL!n2n#~q3B!C%!r+T--lM~JvOCr zmX&ZPC4eH3zMZf!;lp@*Xt+p=5T$WG!r={2V83@`)=~Ac2U1bZXBG-lfSt0eBkU(X zBsp=58&D1u0S23U?Wx6=&4)aSdmK=~W#JVlCwwu5)X?WQ^p~LYyTw0bl>rj~{NsJV zan9z#Apbr&%YW{*w@2(R&YC`73g3c4@(;rh-7PqhhQ|>F-4+^^RuM2Fc83FigO{62 zKsg6dy~={YUOskRc7jj<O28b9t{nuDlkIVNY*KhSN~-23iv>*Ly2!btcgsodhiaaF z(Nrfzump#s%=((j!^xyq;0+K8nAcaC*^fYXVZw?9q@DMn+llsSHX>hA1Z0_%q`Njc zOeE)5^kMVbq|hXU=vWCIk%UpXI(fk9RTw<1<4v^u?B%~hoHUL1ymCKHgxQDre~Ohj z^d85?E!F&ORD%QiC617{XH)q;;lk9jDTT%DaafQPuv#zQ^bu7ATt>$hVvAy<Po&l) zQ`Ku*FQ%YzkMOr)#t!YFqg%9OjU#5@jI<-jUlJea_!hV`L^fQ}WQ@nK%X)Ym(obiW z9tIf5EK1lz(3lRSMsjd~A6sX1%pMaYPQ&yaAU|(83}~9OpspSw#gHj%|E5y|0NeO4 z0BMnlU|#@v$PWp-o#nJ_3GVAS=aUZ5qZ)f*?VA*a6EWiCUEJaA+xVr>vB7<upy=`6 zK~=->`GOD2F7$Fc8S&#d-jJr7(>HPy^SbCOY;q)zN!e7K+yM^r=h#~t3dIqrFK`n< zCWLBTQF)H?&_Q-k_@P+0N#J~Z@;EFjpJP9)yfEKg6;xihC#~Q(ZYh#;qTQRvvpOgC zSG^ZDX0R2q{XOr+jl&k`Ez`a4Y{Y_Htc?20qPHk7(ifJ`L-K^L%WiOp6rg*D1{_>^ z;NUXg%>qvs%rFQj3@McOm7u2O$gv!KdljX@JDk1*#1|Q)^fF&wE1z`!sNP{qPFaTf z#0ZxdTwg#Zrfdbr#r}<G`Ve<5>=F&}qOo#d(l#A<^XgOJ1`lz$Z!2mWEtukH0>@N` zI(+e;%#kF%0kCc1td+=iIaw0-kj`l9*ONiM1}sR^L(3Awf~$6`=uBEivRA8$iqzrk z<aa-C>a9-u``*_!e*WDSr~RP!@FuyaNORz<w6!}i45Y_!lRPR*7HIuqs^%oOKH$_z zb{PF46zPWuuqA7Z3T%rxjU{W~_pV=%l_;%~SymVo!+=B2WA+Q)ckA-Ld&J4MuhQ4z z#0D!CpC{1g1@=DyA@7N8e`Ynk*a6$Vw)ltG`_eMvWot>`6Sc*=`r{20Us4QXqV>Iz z;&Y3C+#iop{OaOZfBb%mPb_}0KmGv4hZp~d;^`>A8F6#-TI_P32pQYg!Yu)ftTa!+ z{uwgL)?fr&xw?NG0)Ol&1iAOjp@)wirFbMw2l&deh}glRfCFAZUw*gSY1d@E#p!L| zcm_?kSID*A)=jDO8Fa2`GiOs7{QWP{k8Kf8xSW{bCfJvg{t72C>gg9VcPv)3Sz9C} zl;5gO!Jmx3wfU`DDc=MRNFFc6>2FLjZiC<*AQX4gBeBNZvWlG$Ck^4`(=M~L#I3AN z=ZZQ<=V@wwITqVLe6Qc^)IUzSk%F-<@xKocdb{b77=3`+yqg}0VF#$yyXleKx(x8q zXoKPJ2;u&Px(;y0NszV3-=U>rAo$xWa9e^a16By_P?Ufn|H6y1It-12KgUIfHl8g7 z7yZFlxCZI4A1z&LR2+>jT)Pv+P|DR7H{moQ%MuKgP26LDwW#7$-B?y}iWsYUl~FnZ z&Yh<cAMow45#X>w(w`zbS;{1H%i1b)c}FNQ7L>)=Sn}GzaaLSC^e5^9@$FK?um#wU zRT`XTjfHCqTKF048dwrX9I+U57-WGxD=v+$5>fc}gsF4yLQYHNlmC*L{dfna`*0e$ zCb{(s5*8dO9s}l79%^N+q(2(!Iw+3C3*c!b_>FDg)t4Z%X0Ud1HbwY0vVlOWC{*E5 z3eo0n4Qw%kNHeLSP<Xjrsc&`JwLIo?7kg5FJXXyvo=mUd#Z%~&UM%^3YSU7AiI}?6 zy#nDMuEtV9?9IWr({HIv<>gpr!CpmYRxzSr7|bE|d>kDyr&zTu400V?93i@~t2qsu zQlCW}3*oR2#)HpV$S9^0t62TLW|dHtSP<mPkb#{nsh?XMQm>8Js`xTM1D1xmCBdoy z-*z>4Ma*#qW?WO=7MzSR%zl<E^DmkLBW{O`>C*@~NxvK`uO|k~sUb)^<dW*=e<V4W zMnQ=t!l$iy3S0)N3R;3jI{O>8sN-Zl2B*tv1_`TQb{M0;-Su;)XfE7y<nR6M6x=jd zMsw;pW;(nH<mR-d6gU$(n<pyIx4|ENB6*3R4WrC-ItvQxV1=_e&Gb8)Y-Okb)ir*A z!=Si*L3_IXq6gP!UChvafs!2U3rulz7%fv8JAno+{_v=dIT>17S>o)H#K+<TSy|~| zC=kT$JA|OiwBaas!I4Bt+5GystJDjG?Pb`c!&HqfdBA3-t-f#y#)GazRzV9~bNsz@ zU7o-9SSOq<M=lbTr>t6l1|8A9q_&_B)#U<587SO5CqrF``|^r$AT|Ktsl14$T4-ce za~hgwHO|CRs=uX)EIv93VlOk(@oBlUtTTuK7}?X?QzW7oWpH&4M<QBMyAs9Ob&q7) z`Y)q6<HT|*SY0%MtmEL)L$Cx`6ZS9!Az0NkVLiN7tm*o0I#+GXo{r9iX*eBigO7k6 zccrl9@X7B9R8__5&hcTGmC;7nA!jjaoww;G?C)bOv}pnBY5g=M=1|~Oe?83E?*ObT z1b2ullG*Kj)j=xY2n;<|0p)w>%(WrTUt>*4ewWE9BqqPRHvlmm_(No#gNRobd_evZ z+SM>R!?{Uy##0G`SS>NtvOMWMTeV@4lofmE1MY<qC1BMPZ2%DYLs?nHT^Fw+iN)6y zO;U&ZeCuExzhJ%o#%4c@+TgX3AFn#r;|o;d9u@yN^BwqvfGXDn_|p&|OiOzan_PwU zc@HMe=Kw{<2Xeve<@?Zfa<an64KvR(D2}xyR>AjOh0R^N-^_lBlDfQSmBx*rAug;L zM(!9F>Cv6v?hBwUz5vxg@PW1yw$>+*LwF9MzF;+fI$y|j@&kEp_OHE3z@WXsn_)V- z1cT&0WZgr4WI!*4bewMw`Ew>U9kx%!7N&kjj}V-y>X(;%;`=>pC^)<uSF@sRYR37a zd&m<Zu?9Cmp|#ns6Z%?jf!1SYA4a&K%d*qa`;drZW(l|!g7cp%@OKq-!8t4az*3Z) z$c&!VaOoFramws6glqKqcZ}IoLG9}PR*+c2QCZ;*Se7lD0qJJp&c6*VTy#icV=n&$ z)>E+vv_SaXhzrNC#5mlI)<GwsnRPM)D|6*Qsm-Bx_+W^(T71}sD+*G#f-=^?(m#i$ zyQ<E&V&w}T>1LbWO8cBktOV@~+J%;q{#VHtvxzI4k{34Nq7>`8CeG&fBIk9Dr`5ct zK~6Zm<0YADO5%;!e7Ysik>A=Do8LDO`g$PLn+yr{iY|f>Xin^6u{xLctmgJ!-0T90 zz=0_S+?+ba3Q)xDIRDZBo-%iA9?#>jfepC}D1a!agS&um`A-gQm~YxgqS#fm!mUIf z1#Y-|$o(QML)T$<^?Jyzf|@d`tAf1nIm+wgD$0mUuu@=y0YN4<)%$P25nPB|*Lg2) znZXxP?NbJBB0Bz-s2v;WIG+mylbh+CcOl$_c?7iv?r$W|0%qC}n6U`QDx8&7)xn4@ zR^hI!GHRT#SDD!)tH|hv%aszXr7RUPT&DILw#1A5O5yuTlnxY-xX}?3??vT-)p%30 zZu_lhR_9X0t!2}tu0z|P>_D<XS%FQ62zMjaoA7NS7q>xArfE_=?XQ3PN+99B#9u@m zbhF0mK^!`8XSQh5(aA1^o#gDuP9h}Z-No9@uSNP{)=qExvBW}zS0RP2Q3K4e&SM`O z`|Q}s%p=;l^JiHXpm4_@zPQeRVn4QVxEF9+<c*3Ku$wcM<m1D5T%K9*0YWlD&hzi% zAmaNHdzGEQU1+GM_Ml7Br`1EI#4WX0B%&_D%nb~4mM;rbR)#%y4xE{=TpkYLN=SLF zF%A7irzmD(c?9Sg1!LI;C)_WvKD;Gwmi|>Abl%@KUmcsZIkxJzE|v)=fBimO-}<`n zGQh?(Pr)ID7pdDR;zlI#?Aix~nBnFzuv8n#!uk0Q+SJ@faB2bS!%b0g!D0T(y(U)A z;T&@V_`wA$CZ7v3gHvk+44Pr2>?2Wz(<5%fWLKE?<eK;7nD<QQ*-1dm*l-(f75j{a z^@8JMP&1EV%7ae-jD5*kv1_q<Cial&>k)i6%}+2qfk<?{OE?a?RPvux;>KUvFkOzj zd*x-7CT^JH&k5#n)*O_v+Y)Y~xo*Q7K<<vy(4Mk)w(vup0x!@*e*kCD6c`Mdi7DVe zuzAFgu??Uvp8%*e&nACxxVb7n*p22@RkPx?kOjS%G(EWtH(*-^F2iqO(rH<iD!{X$ z&~DQGFh^;_u?2&huoC2T7r=Q!9LK^=UKKGZ8HF%CwUt?Zvx7eS?~*@*c6G#ATa+ri zU9-vd@=J0zz|2DdLY?=a0KVjPEH!5Gh2pguF6;^Tq~AwiyZ~vIldHIH1dD*Dh%jL! zW3q_Shm+ZLJfYF~I(i#=52(P+>UQXlQ0EIsO1kwbQM&F^EDHr0nh^tqwh)D2B7?_n zilAi&`QQE=G)hu@5lxJ9;K%_k0oJMH<2)NCd6<`o@)-0kXC=MmSfHk`cDiQkG`}$q z6y~3x0xU+5+li9FoOHubIR>^gcpbyJc)-h;taj85W;S(+Ri@{gWqvXhWtv(Cf0>$e z$lbp%!;Bqs(+)|yc1RbX^k5a#NV3>Jpjg%eryF=Q*T`t}QyBQb7ImkwPZNC^B_zF( zX9T(9EIyHg$#JkFe-8TyIOC_SA3Sie8c8r`C00{j8cFzr7LXdYIx2CGz~tKqz*{(& zWQ18k{xfpq06{0AH#WZ!<c#9H1ZDO2H;*II#%JQ$xeYyx{G<64#0HT$euNgO*ceY7 z7y1~}VN77XuWg<l=_ok9f}Fx#n{xSI0VW)4t)jVxIB1AT<b1e;yP&|nq$>(Di9HWr zfsSP->B2i6qq!$mQ&>m2y&rCJ<(~y}+y7L>SNvLN4Kb7IUjt@^Au7Aq<MG`iZu{ZH z2pnq44>)mgC1zF|GxQc*KD;q8ux7+CO`gv4T{Ko#v%dU$!4bW!U*Im9JC8WPF|nPt zQeq*D8N(MD6*w)9sp$!PsEXxY%SOT9ngx4}<vnn*#_-mC(59)aUpa2lznZt%9+`J5 zyV>ErS=JWN_Ex?Am1omf_Ueg5Y;lU?{E5k{_LcT!Xj6f}<gtm|*i9V+Umo2@ekb^d zRfaq{<banNtCHDD2Yj9E73Yjw9kimtbD0cBDWF9=8AEEV>Cr#788zpWDC|YJ$FPUh z^t4`dMCO4fZ?5%zxH*M=Xos;&<U)4uJ4kuQ`#w&Lz%TzEhxZ;?^Bxd5U-WDm!(Kb_ z`T2JytH5`$-Jwk;q^?bji{0EI(x0=irB4Fidw?cNk=Y^#T?r^kWQ$~Di3}pcCmQQZ z>_9=AzOOXaqY@0rG3PNB0<=u~L&(1bPZ>||5?Nc*401J9D1EI>2oMpc)z>K!eDq!w zWId4pJ{e<0SWvfgUui~8;tB!e0$GPZg&c_gjv992vsk0RI|H+_UL(yYoe9_aE)!P2 zv-rMyo0xoC1|XKT4GhI*zXTBuOFl_z{YbHwJAY4ehpI{}P{enUC0TYxKo(J)Q?)+o zPc%`NTIC|Oue`(pD0kK0TOw&0`Wi={NYS^#1LF=-92g$o5lI*&2ldDrAOR~9u{q%g zHfPzy@A-#gi$|QPjFr2w<?`2jkQMWBoRAlw-c*9!?9lI$-9kF{sMI1@eJI^1ruGT@ z;O?ymVf9Ak!{CA4xLLTH_PZ@^cu`O-16q>Q84g3yg;!hkRLbSDa_teq*X_0o`0%0m z(D0WWy)eqKb)m*1j<Dnr#%mW{2Y3?YVW$p7jx;yB2CAXfCVr+bkxkrxwcTN+5@M{( zg()+`mF4~RVsHSP4@)__$AvX#!ftOV!DV6>SlgW~LW&z_k`#mg{XMrDKH2a&a2oX{ z?OepcE{Zi*>!*tSUT2tkG>HrbRGDl&kD=FMKan;-2`q;f|CSQ=YW`cTolfk)%-73% zOugw0wkplou3o$h7v3;b#eKb96b(4y^&A0;q|(}Mk@gyv)|f}9l4nS4sS|gb8}sGZ zO$f-we22dF=cU4(<fWezzciPXG#~D3ZEQhTH7zN@@vE&4!D0}}&(0s89FQ3<+wWh2 zVdX6dA(kF4EIgd--TX>uv@xxpDeTp6XtZ-|X)jLLEb@LC+g8-eCK(kjtbdgsE(c=x zl>sG62d=SkaaMWIix5;#>jejNV2^%b-sZH(ybzhoS3A6`Wv#^0Zx=k9#*sAk#1`9x zg4;z3?lMvrV-u6~Rw%f^kB{!61`g42OJ$U1K-n#IupP2-FDB}){5NeCy=0G3e)uGy z={N<B)R>N?vBlS7%Ty@Y)vV@REcc>O<AQ>u{538kBpWw7NTb{=<LM2_T6Oc{bZC)L zq(#yly6M@JTVFSdw8&dS^uyR#>8?`tR>C8`xnfJdp*$J|(n#)?bC)n}^~OrC!yU@T zVjJ$LMG6d0#)4j>^tztTIUpTYdxdx@G1@zaF24f)0ZVMg&AqWz1-(pjwe~rdVDvzO z-Y1$=+YR3lC0b8S)_Uo4{|6AqyL4bc>7xPVO$-}qT0gyq4-P0x#DF5ce2dr^P(bf3 zLfLMSQ7Y+M4K~wW!@_5v!isY-=a=kWA|<&cgT6Q8DJMrZkTtDeIj1>vAOx}s<@_d1 zY3fgWLCU#Eko8R>E54!e9Ya3e>xd=Ex?~7h{Vv09l;-qeraP3u-MfVXsF0zO?5U(` z^wu%@M_m}8!JSo$^b4L~bzP?Zrg`FXy`slVWP$DUSIvU%6Q9vAoh9_%dzcqgIhc3q z@}8-EneS@D^fouVF}x=?a_>oP2b(|z{}(Xt0p>kzWdchg+-o<OvkN(|P3FwF<lB22 zyO1NBKMo%ib`td@_oFgWXoh+tY|tTgv&*ot5|>_Rs(&#i2qa5f%mtOBe}#Du+bI~2 zZQE5kwSsVd3kSKe_+S=4mY1@k{<aLq^{eck8$o<nH4>kaw)wW?FWyyJU`~A#Uh`JL zC^X_(4ZV3}Ve|;}X2m&n%LNA;mXCSQmr4GExNpatrWV`RjbtrmH#xjF$=WK&l8~Uf z%h+2a;JvYJh2Tb`=FHSpO{E6@`V_5zRh+@VKRGio1JYxG?G!_z1wDCepMo4(CV&7s z`DRCQqR@kSWcGcBajydvvhR~(P#Uo<28GnmnK#J>04fQ<sFag<)mogH+1CoLYyy|o zO|7rXl(bC2dXSngGQ4b%NqaN4HI>q&0U%j}44QEt&ADPPS*R}Q5R;-4pJ&_vMFtyk zrZLP|Jc5KCx=`z~A0xR&(sdB)b8L9*UYju&w&ii&2{g`v+?Z>L$%2-yPopGKtA-p~ z;230bvKz@5dvT^1>y%u+_W<l3^e=f2Mls@;H)pmb7U23pUA+On5dz<tAUnwqO(&O) z-@Zf#i4(X+NvB)D>QYe>n7J$$!|t#Ef3ua=4%>5a07wiT;uz~;TG0K3O2$tJV2_vX z<wi&2hY;episL$buxb~G@ZaqhD9~<#ldeEiom3dk^8G6S+k*UG9;YhmdV^wDdg$7i zYy^q7QGAe}CLn77-*<W(mN11dQ4Jo=z_kM~9U9SD@Xs>#7K-OgJc~4!Fa~$Rwt#y= zF6U1H87y3Xh*#3CI2x7k(E~Vk9snp7+t@me<EoX|EbEe$H0wtN?D6Imc_|+py=d&6 zj^djhyByE@i@0gE{-RBri9zW6G1^nOjL$=fz-T6)`i-i71%jhTI!jOwE`RW-Bj^%d z%Yt+}P64AEXd&~?XJ{}vyFCWMXKCG~>5h7(aTg*yL6&#lde}D0-LYscFo1b8z|zcF z=|;?hsF~e?nGj`O19-rRR8?-oQH20f%<NP6&K?ug5(Qv)GCBu2ah-tjzyi?Sh?XMS z9HsW*V!r5iAj8d>OtiY71;1!Qdm~Y*3>VqQ^{u$;DZ4o^t7-YUri#DQ%{Ta|6WoB5 zxLG;S8sP7q5sguAWHG8U|22CBHi~@S!^#6sqF}&AeMrZ`dk&Zq6H$0jS-0Vpm;#Z+ zcx--IKv>!jfr&Y2#0&%?sklR_61Kw_6;z39&4@0^+?Ey5au8UB3~=lbtqs83eJ;SF z)RjyE`7FmCBHR@KW1?ynBSx~f7VRYh8Bt;`WoI_N>-(ww67EL?3k{SB9EKFy?mw4x zNx?^9tJ3#VQ8s1gTZouZD&G|43Onx{_?OH{(IzV|6cij;r}u%>ttBP8Kqkf5OYO6| zISIJT6lr|gG%SPHc?BhvXqf5|g{CC&RIk7#ECEA&=RJ8tfxQ9`YMF%%j;<Do`jq=G ze2umI<@nBqH;=NgY`R66#fBTDN@3@4d?+|VEC5ypf4&UvVwMz&jsV9+X(J}dT@~Oi z53=C$Bf&{5MugCxBwmy91#iTn<%oDIT$_s6!}Qe@UDZ5te*IU&@WTayTJ2Jn&teRm zFth><`>7BU4v{$McG4;(AIJV;(HTe&fO)7~OG*a2d4a%}AZ&tG-Zo|DjUtVz&KE6# zK|;BIG0N`r;EN>~5P2nf3=J!yCRHGPut|i6{v_r9R+Gxu!{V#em&ywx=g(iKqgkVM z(X5n6*2;B8j?bryHm4+C>kOCA*C2SNkJ`8Qf8M@-qM=t%V6c6+iZsGwNc-kd`+WE! z8nlf-V&7^A$!Ylo)2yZLnPasDjj-({Nc)?jDY)r}+F)<D33;)eXo0=mYQa-bdmCRa z=ne+M%d@bkiFLt#Ss9B_x%sW)p2z@e4Ftn<G%hK)C-EygjXy~WndnZ|mfs$THO{8Y z|44vUr+qI0dOzIpTEc1V6Ih&&lvS2sTdlVQTJ-TS&>%4nEEA)w^m7O1UQ$=)%zlP} zONt<-{v=5uc!5Ob((?8FlqPBG_5A`yy(*GgTO=eDzcw)%Cfejy)<gu2nTdHx>77Ex z+r+g=xe)r^2ZO8N!1}^*V(pyA-+7+$=YkacLj-k?*razdfk?h!qSY%gODK4wmWO{X zPPn<koQ7)-a9ZSJ(``KerInZeKokeNC>0|XuNcVV1N(22`Mm(ZQJ2*NaMqCiDU9+M z!*Ep){R&PjSKN&TXB%-Z8Ou}-EWXyEe`Hf%4)7vUG#K5Py}NWKF4h=LWVJ4`xw?l+ zf$Qz*#Ax1&B9oMHh)QX0(Qh&(3~9y?#uxFkLpqg8m&eFGXqyws$+nH+za1!u+Vt<p z3G-sxK%2(#9}NHq10x@oY|K%sF>@|$jDp4t7maBT@by!vG1&J_?=DS4W3Hu<x?>6w zu^D>0gT`DfGs$gel^vGnqMFm{Sbi<)U=^ovM}T{v_J7pCAK<HK;4i5rYraFfgY*j$ zGNyO$V3#gw78UcBTEs20XoQTC*g71?|MMF#H(D_Gc^3R00hwTMkv3e;yLj+XLh4+s z%q$AYYHm69mA4F2o_BSZ4x8Y>-2wQGBXnZ^mrGc?bvo8MSvz1spgD`Uk!U$&1RXiB ziRLDk1WeoL$6{zZ(?vgjfdRksQ|J|JABy`ECh`m*He~nmN52(q!R-kxq=%5#(KIn} zL~My()Fw7f<R<|!B!jiL=kA;iaIxQchU-5gPQZSrtYPQET@3_-e9tiO_aRp&{Z^HZ zJHTlb-mWRlN|Wqch>H;>;rMA{+(1;m2|oZ);nqGU6zokoKJN)7dKi3EIEij9ciXht zv8{BCA-qf{#{6gCkKc>mtqAa$FGGaMK#t4K@nbN(oBm8cIMe$S7UyjwVs!oZt(d7| zb7u36v2AI6Mx7gFOt#8!i!#n&PTXIHyGV1R3^>@om0y9&buceznv`%ftx7WsYkJ68 z{~S5%M*=IvZ_I!|FZ|~vJF-4R!5u?^u^+US9nODKzmT%6BDOV&Lb4ea3U_`R1vJAA zm;KzPN&FU+$qq-ZTw&O#+%e=Ff|CJ>;X`W~@D#>A8Uzz08Hu~S8w&sUN9<g|BW^3$ zeDDWS+=KJ@svzxwe_1r4kyb#3RaN9WA71+znNrbv@VxF4Ql`pAF@Yqq`}ct17!psV zq!f@EJ-2-d-LBzxEh@}WWgmXVs9Qe*)^O*ymV5o~I-Ae%yLS^jyf&1^XHYoC{>CSW zMaZFqcBaJ7AbD{0QyR{S8-5R)eFl}o|Dq<3+(O(~@Q@@qUI8rpFf@<leWElzh=lDW z)_%r$l)v$YSm`{uSi+of%P9Ush&DTfJ?-4M^g7PABt~Gr2|w`?LQ+OtA{xQo2$vMn zALoi-m~Whm0>R7YtXnVW*CkLFO;bNc&1^Q&q^imS5H5D_u)|n@dtbATexLU{scQ8K z{0foM_$;z`D{_?w{|y0C%Z20&&Dpt&zQ4BJpWKci^kI?7NTNTQzcmF_o`V!e;%S6F zJS-FAa39pi-)sRKso=2>!1=<ZMWAmv04DozN>vs8dX%H8Dv@R(LV%#G#~Sxxe+^nk zsF9cd2PUF0g@!sqqHC~&(nUH^^o|=R5a~Cl2D*y$vd2Tp+J6RX39$y8jC@|dM``>3 zErhERybREN)Ngz)K(XBinxhZ?z-DtnP*59RErJ3Uc=n_hba%dh+}n%wo{lYr=q9UE zNAnjagDSo7TKZ!=T~H-1s4|QE+%D-??CRk+dI9(x8jC{;Ek6>v6A|<R6a@NsXpOjc zKQRr&fnN?f3iknkINBK=n}q6c-%%H^KL6qP?y1PmW4)*>F|MDKC@eYBn%UGK26~-S zGl-TwzX2rlBrtR0_pr!G^)Di+J$6S2j0<80!7u-pfeRop27#nBXiP?;sZB=^zi}n7 zAr7(_6R7j)KmsR<{*jkNW#yot?{0$VS<-$1guRjcj<CrZ6tWJlryd|on$(z0fQeZ{ z#GL%UL}IEaM9A-3=oFIQINm~jIRZj{bHEhoLVj}w<<~><>k{(o9F*Uje);_sb@7}A zvkP7}TkuPvgR*;^=>84a4Ul{9rG1P|boI`dV;+7?wu*naOZ0FxRS61_^r9v-4);#E zY5N&2uGCzxSQS4)W<PLwLM!Md;Sk7!y>sa|*9KaGF6Q$mfW3*gX-Hq_MK4Yyrgnj; zodHzA?*st-l3xx)@D%p)2KtC<gxqJJBc|xVR~(!A<Ufcb;;}o<40QkWhyFqLPeCF& zUUWY=@zTB@-A65jP50X#GBh0^|NI6BAud|sn^B*+S>|_(x0A0EZx^o>Z#NH$cMe}d z@9X(O5%utS;+@BD5bx>y8u6aNFBk8be3E$2;$y@+mn-63$kWAp4mbZdVdyhA`}jEo z&CR9!jChyx)8f6DpAzo?|ATnn!e1Bf75tERui`I>_Zt43c(3Kph<BJjA>QlxqvE}R zKP28N-znZ(d82r5<J<5i6rQgKm+`wP_4!5$-Y$Yo6kH*K<Oj|xM39s+Um$`HQSb&4 ze1w8CM39`j_+$}$oPwi8@CgcLir`Zeln~Sp%^0}xQgn(so27YE#mx!O1AoLmInKr6 z*Vh))T?$BfO{8pwKTANQ1o?}U@{K~a<KP~y*G%U5iB*cro4O*I617s?-qcmelucGj zjyH8pGUYZaCD)s}Hkq>2O7VD8!^xClk+M0@JA1uI3G#eO>Bk1M4dD+9c}&Na7W~x4 z^W9I2X`?aIn(tqUC}u^N3E@Iznw~oF3u^DPqlM#C$AYCAxt@OBJiKYxf-=kv?Mt<@ z@X&POMyy+@81d_RUncfmaw-S2oM7@C!T;0Vxd290UW<AsGbBR@%pgI-dk|0*#3&CF z0ydEZf)W@AB&3QG$zT#g5|h1oSON(XY?3jR+SaPa(~79Ix3<SVL~XStKodZUAXZU1 z6_itV&TupyBg7h+`>lV^B$Ei%bK85*z2}~RmA&`>e*f!VYyE3s2}W2t*mRDL+r|C9 z-BHe;*vF%45dPr)Anr&THpVEgmMG^A`}nF4xLvr{9lmX$=(*rPy-;UNcrz=pvd2^n zSL)zXy(+bgPpeXY3}em*(8-p1R3Xtv6xu5|ZyY%94b*Ei^$HB@{&Xygz<DtdNR|Bx zU*#HVe2GU;&gE_E8LA+eOC;w|J8TKbaD*ED<(~3Q?p?lTe-tiXQn=BF(db8%VEA10 zqjfj*F!LkAhBIjH)zBdUP6W@y^tR*dZX2T-g?7<1ql_su>SZ$vqKpY~r}R<HrfX(; zv@s0F!7~eNh70}%wqxT?8Hk-Aw7+e{t|KRWyQ21--OY-m>4}Ze^cBgxPX`g{_}Sgj z;{Nz*KOU0)AzWJ|{oj-ROTOmlKz&%Al>X0?;}_&#p&K`I^QR^C95bfVxkWI_+D`>} zt>jK%J**<`M(5?Cj?edJXX?3IZ!;XX-nOD`GBoXw3DKcgA;t75cZw>n{P>CB`0p+K zcAB=$-}-B*tgp>p$pu-PZ65}AingU;cc-aP{CS#uZd=cv$ANvoIBDKk^!U`zi)x%3 zO}h2-qJ1qkU#m*}V0Y?_%kHo$RFtnJ+SeK_Wq7hX)HW*&_EV*V7;VM3zT1~HZlWN` zKoT$!a07{e3vdAbjBlN4$hhwmPm`y~^EA)XJllD;^X%Z+!LyTRCr|jI_jNVdg@vQp z+HIYo=I{rl(xt$9;9f}^>G<1FMlUsve79;Ja*=r%*&;MYIBb)C4ZNt7u23h8@9Bhr zpMU&B7x}i|PcFf;Z_?6_@=99aKKaz@lS$Gi9h8L-5_p@PKNA5D&^XsN?nwPSo9_eF zdLOFR`$a_3QnpZ-p1%4Z+V`RAh5Cq)+akhI18NxRvkz>(52a_FTXLDI5iv;namw&C z@GIa&U@veGcnx?Tpsh#J)+2c)@=WBJz%zlTizmXO--_pnfa<p#Jh7_%Ejv$?=tuUA z)kfNP=x-nqm<)v5m~zts5q+V)scl3*SYa%;UVRsyY&^f(dg~9Wg%*hhYoYxJLPx|( zyLhoMjaZk#yErH2VR^I5Oc=}*dj)i^)fj9R?+BBm{H^{s0yly{HDz~!Ux|pkc2Z$% z1RP@FrXY0vJ?72C$q&4u)bxi8Qd?B9Ca7OE?$5#PV6w{Px{`#Vi9)<uL<~64Vi^(j z{uYI9q^XIkTQmRVvF<Xo_+M{3%rxjjqI;bXkmz3Q4rr0+GWcdg2<-cE5*?hX?^y|a zqfY`hD*@Qy{@sC_J!XYVj#E8^JW#)$6NdR?h5ES~Q24v-L}0jiRd;IUbd|m@`?%7u z6(;G$QxmlO`j?$B?<asFdi_+gu!vrk9Xus%V-9;<P?BsUUWAe`&^JHc(VCtp0y2TY zeAt`P6Y#=GR%|4Dd<7_0j*6g0ai8LLgtLVQ?wh@h^8|OQoLjkV2~~lc!NH-AC`?#X zU|h*U9a4eO@iBK&tYdZpu4wu|m>#>Dr^J1SBolnyV}9RqJggkQ8*<!YIsQsHJ{WRb zgJb@VNBN=_2}O@s$$QLY%KZ`Cx62<emqjU~B$z(WWBwA);B@&y$NiHMQgn5k(I+F| zI8mJ<hBak(E-pc6{WR<^Pw)*Ak2!-5dZT}BHcjN#0x8?2T%?<Xk}*kwAQMDuPZuvE zw@dl(9O5zOhCDeQbSZ!Ie&K0O3AuB8krRwMKM+9f&4QPNZX(e^a(m;@#?jE0HlaPi zW+ZISaC3N@s2&Xi)yD|)B3QYRyw`_+s75N(T97zMx>+(SQV0ZRd4+J6-wAV;j}bDG zv%Io9W*{f53OE^I*<~OQmV|J^>++U~gs?uqU)AONpuecLv!SalJPu)+X(BJ{f_@Sb zzO^&8k<xE5KP7$i;fRz0N(t@exF<=CJE`V<4f3LJpW4$C*_V3`wrBcn122ur<%VUP zIaNq$X58;#VsVx&x!8>7HQx#X)yd+Fi7lCizq9=a15F?HhL8a-u~!iV24Y#T^QU!{ zzy%a@KNyVRv@S+2W^M_82|+%>&P54kmL$+nE{9_yh&RjZ#d!=%aOw5)#$eD|pOKzl zro`tR4>7@@#^heAX)EMxiF)EM$opT5EPsMOt83~$^A}r{yuZuunYhI78Nb9#po4sS z9bXXlmrD%Xd|2k;BD{-CLiQf4p4jVY!aTfX$$?N4<?e#qS_tYheH+J5#sp=mK7R7r ztGKn`kN;%@_T%N+!p2{6Z{ZT_-a^JN9p-#lPvqq`UINcau?sDe5S*&13s<cQ{V=h> z@HW_`44C#^9PeKepR(9t^ix+E_T()7&373PfdQcx5<zy$(J;r}aA*9o#h&H)EAnsV zhC=XgnA)F!bh*%4PMgox2{FJ0W+`hvSAozyW=uAZJkndnBcE@U`kLxa(bQrQg(0>d zW6?^fPSE2)<fAw4=kNH<ShYBv(>R)C9OLM|7oMi*QJXFi0yOtBOB^24%Q{IIMghjK zzr7ECJkUUM1NN;M!~Gh^%nP*Ee0G%)<I7Hr4j}e0$*|!FWfgkly*H7k&|m6qP%q=1 z_oeUxSLDi?&yt{SW+p(3hn&+GJ8M1G+LtRQhd7PJkL8Ms*1k@cF@)g8AQj3!Yq?>c zCt3Vlio;UG%JAx0$gewJc0L!s@JzE^cQ}9hvac;EFoH{5<fmWL_;O8KLCvSba9?Nh zwYh!G`%|+Ms)kW$2NydlFE{L|2iA_|)2@vFqJ=tf5!QCxN`EmbmE&cz2;9sCKj%NK zNU*&L(?_cAXF>-zKgHecr=pD6z7x@U|5~UW$gZvHPc0`w^<R6LnFJT&OlD$KtHz+$ zU>an11p`i85cF8iVrFY$?WJRB(CCI_ao25US9JC2K$r@F#Bi9TUS4RZ?!KMRv9o(o zPU$Cx$&J{e^&=Q?X!rREbDV+EOBaQpQGbW?%0`C$h0ZJXAAtLYapTDIO5#5%+&Dq} z!I2;2bK6AzECtpB-Di+5JFiIU;IrLf&wpM~Ww_vZC6vZz<Y@vYfMdX6U>~pxcpd=9 z{X3jjBr|_dDm@aI2+R_f|Ly0MM}H{!s`HA6*9)9i9;YmFq9Me#U-5nn(D(?SG0uBl zk<ef5yrR+#r`3(sf7y8@l=f1xxCJN#N&y|%2-E@J2k4u>!+AwA^9P^d@AJSu;JCPi z`{r*suPE$5&KG&P=1Z_&gjTD2wu{9r-#M_eGc`i>i!uiI&P5v|&!lC*8wa(xpP(gC zDA#L{I2=Uuk-28IymRPqfSIt[c}i<OXTz6k>I#RErv3nvcIClH@!{vM)zJ_weD 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 diff --git a/env/lib/python3.7/site-packages/setuptools/cli-64.exe b/env/lib/python3.7/site-packages/setuptools/cli-64.exe deleted file mode 100644 index 675e6bf3743f3d3011c238657e7128ee9960ef7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74752 zcmeFad3;nw);Hdr?j}u==7yyqfJg%kqCtqpC80t4LPu^(N8=-ER75n&prFR&UceDB z@phavWskhi=#1m|%%F}lj?UsZGsvQt5J<wlxB%iv+^cPuAew~rzTZ>Todne9_xygp zKi+>{KBRBmT2Gxib?VePr|Op8w9@9V*=$byS(eSV22c7I6u<xdPaBf^ja=8y_RqdM zMy;_&c8r=e|E_9ZWz~H@sk-eRU&U?r-g}?!yZugIm2t1{u6uo<tFQIlbKf0zPV{)P z{Hdx3p3OZsJoLz%^k3!LlXGT?_n*zl!t?Wj+&S0c89qN_PPKRroO6qKy5>w4&mnWJ z$MZk#s+do8oC$GRiOqJ$BTifH-`O?kw07GVTXsfYo9!LM+%035<l~tu!a+MdD4b!l zx#$P~(ob6@QVCi32fWp!3#G~;R#uXJP`*?Q1#MsC+HK=SDD^YfZaV=`{(t{#x7k)o zP=BzhiTa&Obfld17JdjI>U*jm2#J3_n{DpIsylAeZ?oA}or@^cX*&;p@8Yl5zaYqC zqReLd_+ljZfRn*^ItAvsb0S~E#7db_^bvivWg&Uk_wpg@|NZxW0s~rXw%@JA7W#9w znC{QhVoUu#b(VUadc9_T;ft^jG;@np*brtX*3qDS^H;5NPdwDuuEig)w2D?9%(2-D zI|{#yRD9iR8?D95?Ge^qXDz=|8CgU9QI*v>6KammHk?*-@|>EZqYYnO$MQiT*8IwB zjcsG6_)Vxma~#U=Xm-rjtfpi}VFwC1Cur7YyoLi`)=#&Vu0f#zy$X$$g*3L%uW3y8 zmuYONzr5Kox_P?Yrm@-nV3;*)<|dyyN4-Uz-LyUZkNTT;gI4>+ToAv;T(1p4{=!XK zEb1>4F$Xl(sI2a*v18FK`oNW%)lhSElHqI)TC-QUqg#xxw0P7X1TG@+NBu#}xJW$Y z4{GsQ{sQzzi-r6?etCazhNb=jn^N~z-~hqkY$f^}g8yCNU9xZn3QMGGaTEl`MFX9C zG^<s!wrGyln&R1p8$mpEuS^ZJR%JJ%CnC~F_JWC^1fz-owidt!7;Jo($7U15xt3-u zUy3=Y#UB^>k^_1rR8RtYQ(Z&ZG}fxIF8)$B1zR-ss6<%dcHRYkqOqs_HH5(0O@!H7 z(-{Bn=}Th=WLG2XbB!I3m$?Ojp&R@&FvUVkV@K53GMlm?8)Q{d_^}qt<JSQ}bq%^# z85y!6Wu_fu!h<5xXjfL}<24xlQolK<Y}moa%gnBlx{vj6u;wHYVoUM>LZgkr!HyQY z(XX%piOS;*!3)0(v9>){ouv<muoj}vo%}U`p*cDWEvoX_VEsf5bo|t5S$>_)(%i?U zS|zq{MF|F?IUKvFnF@^q@cbE|2r&0wnTB_zh%nk~0w9tZmW7^zXwRVMAE05(%JFqu zi~-E^@F=^jZj0_N+-rF+c@HZ$%}<d0_%!MT$rJu_iQe0gTG&7sJ)p%S{>o5%#{9y) zvDf^><cadi=%<{1=JIB@%@)4_lic$tKm*-W&POiG`_)0B_u0q`nyieVZjA~AiER|o zPeDoHmXg8-5KZA0ypAW5Be*Q@ODI~`V2tOVyU<?T`_lXL(B|^nK`vC{X@3_%QoE@Q zk6W7<;LupaUuJH#Vy-7pi{-r)b%;2kR)X8|hSJskLRLE=U2XP{R2!8YKC`*r{Gk^= zyn%S3<b(-Hsq3jbVRkZH!9lBme{1X;utZF+Nc<Z6vSC-UDO+X6Z~hv#8j%!o?1=<+ zEd4ZGu@z|HN~Y-k_J7-KrED`MRfM(i3<Z%XMtf3Li#p?XS<4C{%=vz}Vh1qx1d4<m z+xgr52n$o*mjyuWV$Osd2|%-S_Zf5)W}5^X1QQf<GI;F`>h&rSL^*gD7~pzOHv=pn zZpOX|VMKkAilc(3scUTLaN!oqd+b0OM&e5aa-zmVIg^N-3ba7uqC91!t)^(Ao-0Z= zBRe=&VB_K>f*4`+Pn0a&i?Yl$8QqaZV>2w}Ro8`hpBI~vsjPOLi(vhXzC8J=&Bped zU6wJL|AUwqsICB*_!{IcXlEQCj!$<ajsQlYi2^( &sjKl@1{;unAiW2w^OujNoW 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 diff --git a/env/lib/python3.7/site-packages/setuptools/cli.exe b/env/lib/python3.7/site-packages/setuptools/cli.exe deleted file mode 100644 index b1487b7819e7286577a043c7726fbe0ca1543083..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65536 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[c}i<OXTz6k>I#RErv3nvcIClH@!{vM)zJ_weD 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 diff --git a/env/lib/python3.7/site-packages/setuptools/command/__init__.py b/env/lib/python3.7/site-packages/setuptools/command/__init__.py deleted file mode 100644 index fe619e2..0000000 --- a/env/lib/python3.7/site-packages/setuptools/command/__init__.py +++ /dev/null @@ -1,18 +0,0 @@ -__all__ = [ - 'alias', 'bdist_egg', 'bdist_rpm', 'build_ext', 'build_py', 'develop', - 'easy_install', 'egg_info', 'install', 'install_lib', 'rotate', 'saveopts', - 'sdist', 'setopt', 'test', 'install_egg_info', 'install_scripts', - 'register', 'bdist_wininst', 'upload_docs', 'upload', 'build_clib', - 'dist_info', -] - -from distutils.command.bdist import bdist -import sys - -from setuptools.command import install_scripts - -if 'egg' not in bdist.format_commands: - bdist.format_command['egg'] = ('bdist_egg', "Python .egg file") - bdist.format_commands.append('egg') - -del bdist, sys diff --git a/env/lib/python3.7/site-packages/setuptools/command/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/command/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index c1f0375b0c108a3fd3feef9ff1218a61efee3464..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 700 zcmY*WO>Yx15cTe6Kay;kw9uv@AoZF<6LGH)f;&QRbA_yJ#z_s{wQGAz(_d4>iNEA4 zC;kE_W|J%huhxF^<o9OA^JXyU5nR>x(@!5lLVh+uyT%A!<8SYA0|Ehr5J3lGNFap_ zy3m6@<S>8(7{Uk+;Rv3<Q#gi`^_UVE!>J6)kcL5nCo-ZDp3h{bjA@MAl!u>_FR3x` z98n6>3(_zT8BD(g0l5q>Bba<7vll)tq$sTKUV*TV@%6feMwbX{A%XEb=d&Hu8=nHd z<x**%^TKYJsH`ib^ciX~SSg>jRDTbc6jwem$`y{&%oev?X=i<Go18SU++plHj$7wP zt>&-Yux0Ghh(?zgzD6N8ez2?htEiegv|nqf3Sgj?)+f8b_jZLZu?E`RHrW*U3*Vj0 z0v~T3-pv9tM1n?`bru>N7r7t3-?(d4oz0OuTM5Z$U7s?By)s6}jZ^J}wDYAZ%c6q$ z*2x^B)JJw>=@Ir-Yp2xXon4aQN|~~7Y%jF*;D5p=h1R@+AH+=1ZM*$`yKtpmXra&d z&v6bno9gc6>U!~*=U=#YUoaesaE#4yblF9zpqBhq)1W=UEf4abhhGxqK^Ep=gY)nY Dw$<If diff --git a/env/lib/python3.7/site-packages/setuptools/command/__pycache__/alias.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/command/__pycache__/alias.cpython-37.pyc deleted file mode 100644 index 2af65c73e42f03c5c44c54a33add41461cae2d49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2368 zcmZuzOK%%D5GJ_~ttB~jQ#XDj2o}ww-nNocG>0DAB2C=1m%1%nAiyHQVl7hg+WU}6 zDwP-VB})H6e?Wqs`Vaa;dfIDG`3pXEhASz~gTl;`vm|%;%{N2cUtVq!X!&0oPs$}i z{=>n%+0eNMqJ9Cz38yK^Xh<pcS;{giv`pVh?aT?C%njYF5jMbPbLTk;y&nj7dE+_Z z4dG6$aEW_-3G7YY+$TZn73@j^TCMFSN{@7ss-K5CDe~{7EF{>iEFK0{)e=0>QLo7R z$)IW#W=eDrD^ay-W7JPl(WAH<GzMaUJOEK&ff`@qbeB9?JEIdiA;+$CHJOkp-6tpR zBj~-LFF_CJu_f=$-%JQN$jZCFjtVXOIQL^Y7-b^Ye!q}@8fzi_VJuaW5B!5uUmd1m z+*QLg(c3{_pVN=e=_lv(@j1N_u*#NVC@aUjhM@&}RkZgvkt^Wc`Mn*T4R?mgu#@CU z$7$N(C#U)Ni~iw`5_&Y$MUkqD-CmJpan5(*G>KJrcv>~o;R*Wb;fdRz2y0T0w&^9% z@&g$6&^T`h&^-|KBPc;a%1OvL4K2<>n_Hp7?Ew|;QDdEi5Vs?bI|B-Rua4!#DDoCW zv&Gv0)^g<-hsrN^ML)>_G(e@0x;N6kK8&@W<WGxZq5J~g0ft#2g+DurD(~=j7ZtN5 z?_Kd55W|%sE1rsq%5tOb`rD%%KnviD-~i$yKZHXrxPcs5aAOMw8lpcTFAb$9Bw`$x z5Lq0fPxk^_IxwfYoaBj4V7pR8HT_g&LlEoDfvC0;Y2QS%R;#c|egx_|h;l&@+N3Tm zH|m(ZyWjgg{1g_x_HaUun7pkmc-m9Sk*~M4!`YNRgAjtp*4`^TVEOQ;k<z{zieAz` z^~E^u>Gaf~xM1=20w6z+GZFZ|ABx-`89sM9HJE{0AAc3X`NrW5rj?b7Twa0iNhDN2 z<vR9}(icG3gy9Vkh1^6C)+nRpl^TY(_g#R1b*BOH07U%@3XTkc;`AkjBnBANt_HSF zA#Cup@HxIVsgs<6#n$$OP3V+O86_v%kDy-d6Ybzi0M0pP@=xqPre_SEuIzJiW}W<l zYoI(ldwU17+T!knU4gQJ6>p#9H*p8v*d%9+doLQ=(@VzUaPkM+BvS^yTDl3g7N@YY zmCyuzZ%?gyhhS;1Y8W7dDpwxVN$r1!q(wvL%~oDA#Q@TM#_J7$rS$iTdgz<{0hSgy zRH#wTO`W<WB@*JC`jDP&4pmkr2T*8>yjmFuJtK3(lb$w_tel}ta$U8d$YrsPjCT_A zqz<`#R3y2?1Ts}cVw@@ut1ptMYH)cP$x#k@W4Le?Ctk)mjaj0<MUTpY*`L7#bsH3+ zZRSG7@(fLEhSkf3pGQ}z&Dzw3s<y?-rJ6jjaxZ9CUKHWCqo`^|QC9F#iv4yJos8mi z_NEa<yy$_s#f9q0#M~g^*32ioSrpWE70t6l)x2+yl#q*rUpas}EaH4_F!?Q!-|`l! z*TgqHQv&epC<>Jahp?$_+0<ig<~g2cu<2p;U_&q$wJC%F-d3CBF*{>t)`V%eey0?u zd!2(N|J+!B`e3=kZLn+^i(@SJxeFGLH;}SGa-jJ-;odr#SnF6RfO_sAEe_(eT<vt~ zUZ=iH{mRC3mzO#nd@ig`TJ++yBIR<YGmrQ;K(K4zDI`A@xxlV$gj{0aD_0dG*%R_6 z3@)H!fbqfh5X1ljafhEf7Y270zTXR4)hcq<{4?kZ{8OMztqHHbz8Je=40mzfRmr%E zmw__$3^y;#n8mpZCaB(qv?jpD=bFeEAM?=*jxNGjd0*GW`WBN(;oqe;L~zaWnyYvJ E2jRs|N&o-= diff --git a/env/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-37.pyc deleted file mode 100644 index aeeda65dcaf31c8c055540a68149bc450e1f4726..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14156 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 diff --git a/env/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-37.pyc deleted file mode 100644 index 83430616cb98f9f74214fd4ace8e2e0d4ac9f8fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1747 zcma)6PjA~c6elTJR#azgS8Uz70plfYeUOv>*`)}AZY!|UvZ1{hC<xi4ZDq8ikW>@9 z@~H*d9rq1v?6j|>>vri^$Z3z1on*@fj0PW{$;bB|fA9D7?e=zrU}V32_VUjbLVwsl zo8g1<6sEopf+LP4nqq=5nv%YU(f5cG?!86a6W$Sd<Mj#0FHqP20M_VmXys-QP@cln z6of#1%#pS3dyR*_&wbu{i~21dfQNRyHQ=c>Ocm2)gb|7;j2~YKrBW`anFz|oC@H0( z=XP`;CdsQbSJdQ`=gw%9OPQaf+4xE1JUr;p=VeC4c+Apl1U5MpnJ!i1GE1g{CK;y? zN2hs46F4YTUI-;;bePCtDH9`j&-r@Tqu<DrWTvSCm-o_4n?%ZcwA2uf#<5+bh}XVi zacYFhz+x6plPnnv4$++>cp1Dk8AxFh(=^TK^PhgOdq$;$(m*D<3Hb=p7lllQ@ccwi z=t*iOw9Gi9JIo<hxM`u;q@R`30UXg0U@{N};#<d?n8SQpBqklCGBvZt{}7ON!>%68 z?_laXAS$$k>aQ?H1|N~7S0Sr&1hpcEb+`ev>(|!+4F<m9k-YYEm5!CIeeJ=17uUWP za`Zb=A?%$!+cnc-w@8b4jb6-;XW8k4(PUQ(Qx+!ArM|4L{qCL@y;sas0IsgX)RwJ? zL}b2waSl<>Uu6xgjeVJxAS!f(mUx90xWY?dBPT1eAjUiLmo59kg~z=L-$uUx!z%(S zeuv)S5pi4%EAJV412&bn4Bi7aJh+V(K5yF_ix%v*E5B;32u76$IE9C2IIc09-`D}} zrrAZE&J(mi*(7h-1ouFUA;p*XU3#wlRs_lbE$3Ef7`whl5S;u<j(rFc%)fe(mue{X zp3t4wme7lM=k=Npi=Ii;y!$T(Wd`K}wsQ72)0?gefH5%3v764nzOwaym_847+`akT zW~Fg<DZQ)FfhcX&FuhA^(%Y+j35bCn*!AI~_4?THNNoXBXVJcdj<Kvh_|oF%z>Mbc z1sB*f`B^Ysh#?!LQuOv^4o$5OK-t{<V3|L^v#HRP%xE{PJC{4NzBU$SgPQ8VZ3Q1u z)Nua#KO)wx6q@z44ggM}OgB(%u&vu`(EAa5?$$aq3gp?38cPP5_HSOv#=X8vlx4rV zVTDCPeFDNx{V529Biw;sh(pqeLh=!49X$X1KVdoS26f1o<ql(Y#Mm_FrL=m7vEwq4 z>ytKPJRdUV`p?B|ieWqZqAU&w+jQCzJKXX~7`VNz-~Yk_3EwxVd+WyToo7|I*IUlG X!Suqj)9hR8aKB0Kz!uKc{A2GgG*Ie_ diff --git a/env/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_wininst.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_wininst.cpython-37.pyc deleted file mode 100644 index 38c078f0841e13694352cd299e36c09c43fdaa05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 938 zcmZuvOK;Oa5Z;HASb3mOao~W!LLBg+G35jZp$a76luMC7me9({x`|W2y1Q0s<eumc zX~l`Zv{z321y0O3ZfQ`*n(^oLJieLPx1&*?faE{!e?4P_{KAhbaRBUt>Zf2Nku)V4 zWrUK9g`AQPL^8?GiR3X~vF|)&k{%G>`3>G=I!AjY9Kb%Peh4NeA(aHYdrdqIxpZXb zoP>_-LcD87Gnr^3PLe#ywNVse=9mEmIibD-)gG9dtjGneY0WO#8Lz3NM_u(mvYHD} z$j8^KzSqh@RhDU-#kuiR4Czf0rO7%L^CHWlTzaPPP6~D8MXIQBc^$SirhF9yvudFy z<*8W~`J_;bAkn&tpFexC_ww4)XSRo=qcpXH7Kk*NO?_^M*p*6Vl}U=+-n)%}!q$Ap zIyz1dZLg(ecQ(F4SF`p=TRzX^Pof48@aJP-vN9->a<?tHE00g}Z+nN!K*y#kO;M!! zCTz0=TZ4wyR2R~9Ky`B~I$i3*)1~Xj+n%>^pW~iT@a=*&D|!Mz(wYde9vix17rZ8y zl#<VQp%|Wj0fcLsetPda;Xou>s49omFRW9jWTD_%63gMtr>Y0I>3L&@_<0A+7*u0X z0&E!_v-REo7+3ie;*p!*v91t#l*K~Wz7Sa<s}%82h~p|sH-DN@G`Vlo!)dFgD3Zcu xX*4eF4;q@#z$4r;tT@$^cFL12CJI?L&T53HN%_xUa_hd{aC(DuHI~}pe*t7A=Kufz diff --git a/env/lib/python3.7/site-packages/setuptools/command/__pycache__/build_clib.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/command/__pycache__/build_clib.cpython-37.pyc deleted file mode 100644 index a80c9c6cc9ceefe07c89509a69ea57aaefdd43b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2417 zcma)8OOM+&5T+<umgPq_kETJ97Q7UWgRU3JF(`txO;8jl(gHz|LP(&>B5i9Ui3&;W zt{3v9n`?mlgx&Vi{v}=8OaDSo9a4U6&_ig58jj}iab`I5*ZsbaVC28wdimxmLVxMS zdN@Elf=7N26GhZYQD$Lep$rGMr8zitvR2SCw4J(HJ7^o)NxiHSbS(5OqAlvaLDXgT zAwIJMOs!{V)cyx7qNgLPzWz9os#HlTpD|SyPlVtC*mlZi@Vb$+V<y5PO2ly@SvV8C zEMl#@9vFy6@W@**F%(!7X&-@2F}2^Iz@ZNKYt{awOi~)gX)=k9K*=XCemG)6B$N>~ zXN0n8RHlk-1<8cXqoahEf+$WXH)2zsru;a`XAgX1<KCEjmlY|?SguG!L`f4(Mq)t} zP*O!%u|J6<qu`-nIc0ggAaWrU%ZvfQAvqbwJS&ov-5CwR6O;K+fvub{fY?|X8|nLF z@)e~d<ARY_Y#}u=jegj`PVy-S14*nBo&$ylYZv4$;giD<AV{)LWWnNOy4WI0m?Tp! z2#eym7G$v^D@3$$tmAcQsCgoZobxiJ5GdIC)+@=PqJR(q6EJQdTv9(y)Z8GK5Z{=Q zDQrHEGROr7wG^s?@ag}nZsG{2$K)po&LL1)p&+hGXuo<Zvy@Mw^aCtxMDCJ!nnp7T zIJY6%U?CBui3w{;8ZkgxL{g_<W8%^lbzW9M6ipCgU9NiU!P9}~8+c@8A@t5VQI+)= z-Y*Yd;3Zz#m3<CJ?!sC+l|#`hPu^En<tVJ|DL%vUp>im$@J)1P{c0&(IcFfLTIVjc zD|~@1Wb_@?K0_CH*#g}b&{!UUUTdv4Lrb@6fge|4Bi9DG_QuC=yRs)gSI%Sf^2eoD zc{6L-sXFIg)xNO66IiIcl?5Lx_!|p<?^-Y#zR_^cL0?m^|9Flnbm$*;D+k^^+J1|d zUDdDLs(XfKXojZvmHo~VFU)>Ch)2&*puOxH3M?)M#>SwrQT3{Rr8!q<_pQ6UV!rKF z-3kMB)$n_79q{cvhb9K?q5rgQH)SYKr%6tR&?Q79puC2J7dq$UPQzM|;pcKV`hpBs z@<Wo9P^xeM3c;l50XZDc6>nQS?^U@x{m2|xU98$76ukDhsJ-<mJ$><kK-LOdB$tjN zpAxkwpg}YU9+;ywtPylqpO>mARY((2yIB+qF6&;B$7xBKX3E-a4#cP>bg>G3RfsN3 z!GN785rqYZ{w8L!Zc#QVXCvIm^+9BGt+r=O)qWzA9HjD?)s8;abqo4@%7i`&!iK4K zbl0jK-9Ks<3`3KwUFabC?X3?`u-CMuaNQ{6x~D@UErh<S>h@Y#0|>6hf<=mj;9Mnf zs3Y70{%EguBul4tXOrc?12WXzCs^GR8j)~8TC}yP-fqhYx=m{_&9ru#xCWjSvEc-M z6C2%XgFSWvtyVD_Ht6LxhN7n}w^#f>k+==(f1ezvtT-r=V&6n9P50^RMSgN`IzN#5 zf>fNRa+icHXHiZMw%69USkzaV<z|N;gKhZ>Ovt)s`PNMfTNrzmhkLC7techN46H#z zJHF)tf3wy!cHx_E-+*uWr&o@a)?8Pw^!oIZ9U$+4cnbHh7n(SSVeN-u#%Y-{pnGBX zx{Okt0a&%ekn%VT#b<!mgk@*?RP%Hmbz-DWyEkxflUYBwP1k=X#;d@Lw|Go_=wKP? z+TkLZ)q7hF_%pzTG=*7rHf&R)!S!wQ$B@}j|79^nw*yTlP-uL$_hqxShtS!P^kBMX I_4LpF50=ZP>i_@% diff --git a/env/lib/python3.7/site-packages/setuptools/command/__pycache__/build_ext.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/command/__pycache__/build_ext.cpython-37.pyc deleted file mode 100644 index 26494a9a0e7ffdb04ac4090b2dda12a450bd567e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9671 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 diff --git a/env/lib/python3.7/site-packages/setuptools/command/__pycache__/build_py.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/command/__pycache__/build_py.cpython-37.pyc deleted file mode 100644 index 4bff49e1a19fd0461016b4271a8dd72a5193afb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8547 zcmb7JO>7)lUawbGU0vO7w>ysGIGOBhO_Uj@gX7H3!T?b=lby_DU;!&T6PTIO%oOE* z)ppt4UG4YEiEUNGERM9ZE7)C*AP#MDLgK^$Ar44LTseVO=)sNCp15$D6Tknf54W8N zM7Q2Yy{dX2|Igq5U+>P(Hx2wof4TB`_PSyGCtZ|37o7(v^50N#gR_A#G<<_m-yE=^ z>6^N54XmMUVtiQhonoZ!*YT7!aD7*|4Zoq=rr*@<oZr&zyg!fD9<+xG{(^qDHs}m5 z_!owY{^IbWe~}r79X#O-mWG%7OU(G#7+trGXnD6O{+eM;W_)1qI(MHN+&wn^OP?Ae z^Aj3t@FvEZk+V~aE*;x`jW6&y-g?gb%Y2@<pBw%Pw>~nuonPQ|MwcmjYmjWBZS|7T z(@3PjI83)UFks2}plc~>7><?Gj|XWa)Lh>7!-0(ONaJ_ngLw2-ntZ!Qvz0#!od+m# z8C7KXj2phmYuw}(_F-`w>pOzz{G><E(vMn(@(@MZs5rw@=24R;-Y7}8<I&c}Um4hs zEu%qS)v%FBg33uRjbtiC1Fz`n>xXyJ;rPxt9^Z~fG7SfV+kEeEbnvbI_8l3e`{Oi8 z26DFBONPU6#P4kG#{(XW57)<s$`$*gfDU$%_G6+l*wJEj-1YJ{2=%0ED>n#6;V=pU z)eM4R!uJQ%Zw0~LemKbQi1~7dr+XDG8Y4n1qUdE@rmuUru6{(D2PpE7QC0LLN)km4 z-{v;2p{;R;*U>uM<qfoT-sE#=UEbpJXdArE7tl6&hhIQD#~1lUv@O2GFQJ|1%ltCh zHecaa&@S++{1vnvevN+v?S*KOzskS)+&E_bMecz=uPL{rTKEar_x@-*9Q7jZt(L>9 zUO`?j-40VP9`y$MJdz#{)6mmQ^q$4(wl@xYyWv(On@tbDC)?5N6QPJaIgWa9KgQfo z<IoGe)#8nSW?J<^v9&*pMyZ!3-m2#F&F<>Dp6sJ2Duy)c*Lf_{_4iPTcym9ElhLZz zPlPv2unLdTFdoSDd>h{#$Yc#0kEI9Ika*Nf`nbk?FP;yQmOPW*VX{wq$hUjwZ9;bS zE>_2fg=9$Vb_5cYM_vV0^rR9Z<mtV8$v6@r?JYk-k5q$x)RH(nM3IkBrN$1MnwfFJ zn2{Mf){dPS0SbDxu@_@3sBwmCXV(#LQ_I<Rj4c|k>l%iN6m3H_iI9P2Nw=ZwM8sR- z0#;C+emn{X@lg~cW7?8bEh1q_J=L1!gj$LYG>c(JG)FamNI`hqOQ94iK}otG*dJrf zi06x*xl`)3*1;|lWUkNa%@W35Ly;X+25Ye<bD2}rM_0;a*3WPM3^5(Ns)>1k4#<Pq zP&3&f`$N~_)y$ZhC!joyi(kf-m0wNmqOIYM!_5=;1>DWAteLAiFR$FRvD4g{%V7I? z?N3Z%nznP!(L3*w^??wQ?T~AgKCEe3=_TXCS%rXr>En4k7Ev!v#No!HCxV2d%luBE zWWnZP8ubz$bz7==Dt*c=1<#+)X;dugw+oULs;CyvTx&+=R_qEE5?4{F7OfFL#mBJ6 zf{bM@Gjm%}8YKJact4ddXP>fQLw^Y`XfI)yEoPezbE%+iGyLtNR<VOaGPpf$hVcfq z<RUcR-asc~ob8%o1=KfAz=MDU9{fwq9cv0@$k>Ugy~&k9coYu~$tGcEvo=PM1@6|= zLO?q|RRujhd$52W2-8#qLD$rBscgDDFP+yh-#aLh%)4Q_kV}UhEma4anWsmGp&toj zC6M341!=dqmYSJ`o^@=BYZ(s2*$JCiX>G@u*6DB=?w{D7nG<_b%WC3X9NwKaGF#gO zJFE5e;Wrdp?=}UkrL4!FzNMP6)E*KBTeV1^M_WO9IF6*M$?+ggXHH%4Ar}-u>{m`W z9!Db%M^3t_ocx|Ym$zD_RlSfjRfi~$Wl;_!88-YpvAUSz5sGZ1GT5To)aq=bKDtzq zEbrtCoKfOR7+%HOxezcTWuP0VhGLIbI6F3vb4c;d2hoVEYvc`J#>k?t-Yhn{CPfd1 zO04BeQIEDw9$a=;J)j3Dr`|k7r4zy|9>OdFJ;Z&W5M|SZqJ~YVi&~DxyIZrebPac2 zt_^|=*<%!qeMnr6R;qKK6Uj;s=-9LvIRr`KLPv+JvmfE`JCJ=k`WDOB6fWR|T{eDV zOw1n|eWr1Pi>IB8ePx`O@4=%_Eb5ae^$DNZ8{!6LtjJ6{N200m5UD;nkIxq;tZ+bj zo<BAB@NP~YOPPsOHlayX7tw$^T~nFsZz`K;3iwzrsGUm#VWF>^_lSg~p7+1NwT47c zn>WwW;w)L$?+ub35b1q%%9p!!wLpqoIiXmHw=kjjHY#QBB=JZ!@<|8rrnpI?3vd*C zhFx7dcROozvv?R1p&FG)<R@j~S7~OA<-Ud9@1jUj3d3w#SM4V2m`B(Cw*yolm`p{b z|DWJOGZZ#}bo|7E&YP)~!46F9)ZVFqebDhqEv={S4jfBX!yPBJwF{b?wlcN_=4Q@` zIf0#+&TC6iKOy+fj^6$dU|5Va2GjDbK~O=j)iVGM@MN`M)oQn`mUGb_gehRtkm3b| z1|um5?Q7u|BrK{CV^||DRqJhsAozS=B*TD)!%cV#I_V5koLFiT(Js}gfCU!#s1{39 zacY^n?kRgT2gtGITk+cz)W{$@7z1fV+@H^{hhf^=M%d7#%Y1q<N4uz^hn$P|FxEpU zT$9agW-`ZY!b!E!Z=pY<p6A4-QW+9~I*N8vKSSr>$52S)J>&B)KeH!nVot1yeIPO$ zBRk+CRCWsPW;O830l#cLQUm{>ykyVxeN*2jemYs5cniDlP8#}dJ*z_=>RCfv#XWd| zod!_fRrH$Exy+?m_O5<x?71J8;nj_Y=a5A_dI`4ZwsJREX^^;!<G|+c=IRZtAQ4gx z!YPI64>u*<6qoR%f2j;EDWnQYaHk=JxP=Gcmxx+|R4v!0?@;ePD&>~yrkoTgAHqO( zLyL+{ZbhuqqvtsI4UDBIl0c$iF2Vb@*&<2@+|zF5l}aOv&J0|wSV+QAvGBif5d(Mt zUl<dOFm_D2Oz=5|T|Kw~GF#&toPnLou%=dKrobLhM(czfvwOzg8y}NG6H){t(5q7q zBJk&#O{~IuKY<tkA5L3%vvv%&gSpNGIfaRv)hCUEyO|^YE^{(>*V3)ITc>v7=5LXx z=r@}BdOmAHAfWtvUt(n^Ga(FLWVLA<c$A5sLqr-tO+VlJ0v=)kmfyJotA1imI}kAv zl`kMB6db@85P6jwZEXedsGl5Jh>^P&#CsUc8N5_t&dT5-m=NUe)IumF<rUxq5YZrx z`gIzeqX@bP4b>$w)g?^l)v)HgcBxuPPo<B{buNM~Ac&*@QZ*4c@u(l}57Jzu=Cnxp z=CJR(h4qqJz<ei)gWizmzJPJX`tVaCdg|NBfcKHA=${v-J6P}sD3Vq-bcjJlp<^xs zsgP(b;mT&qGzKwqQA{=yf}BSRm4Fdsr=o2H`EyNhmJ|HtP(ihcTBmmK&+t~6p}1TL z_1R}C4@1ICywvOcEjouyvPl`c0!G`gF-S1IO6etL<SC_72%UQ%h_!zHo{?GN5&A%( z@_QM4%E4NG1u?!hu`@dZB$uPi21W%uzl;b~Jb7&FJ%K3V>68#E5*R1uPuqlAr_B>% z;y~c6?;9T)pCCZW90>Q{q;os1={&Dxtk0G)#~(3zyXzeN+QaRrx9e%w1)+<oh-uXe zAfz#3P3_Tm)Egjwpz|}ZNWDno8fA*j4N2kc3-^!yaf9IA?3~_MB=A_nyWZ>4Loy(I zaoIHlWJqtM5(%Jub*PBP6QnwjzVd)i21qWP+se)EYu@8Q6v_y0_yBLOH*Zq5f-(%J zxhfA15osiEAFfPz*H3r%xCqp)7YEH#7v1J{IOz`duM;W(JYH`%;>!K4=<t0Z5;248 z=k?7JCFQETSdp|GmryQfbDArf87IgN0Q)OjL?KrVN(La0GLXuNXnv{MlwHw7dckh} z)Viy=Vq*le{kkR<@@*C%ogl=cT)2u9iJX~~Uhb3$5B>#;d;^tXnp*E1v%|<O+lUyK z;g+c-{d1UUHO-^tN*~S~^o;shm`$q#;TN4SDP65jsuT(dF!&kn&(Lm>_8y-}jJ#Z7 zMT{5!9wo>26b7C;pBE>o;5}`OOoHCro9L9e9tvkCI=0!dxv|?2Yh^5`^FPojq%J7t zV;cZTRZy-CZ_Z<F5Ji%tr}#_T)2=ncDN7WwPHqh~z9rlJ4=8z53&Ym}xo5BtnVlI1 zSCK6t+bUEcLZ-%7aEd>I8=aCXH4B7m{}6i45uiMG2^S$Osinwi!HL2p0oyv6gSQMF z#K3wycfW$W#Z&dvNP&KiF()~!qqiUFg!TUy-ByA@2$uFs;ew=arwn$c6eNNEzXuDs zXO_ZYs(OE<(WOSUNDTZ6-l6zc15(JvDa<4~e%-jYg&_1`Ebjj^tw77!>}b6b*B9aL zOq5f;dS<sIE$4Pi0Uc~8XnSV2nw{kq&HjjT{hMJClWQ&yG1tG+zDWEC`$CLJ00kv9 z#AT`;Q1xA^-bICv1;AyUV1E?v?MFdG+0rN)y#Ud3GJJqH{FWwHuqBfHu~hXEn%8%u z2)WN9$TmenOK9Thojt<kKcUDKR1_u`*xW+y&uSrYgw~!>uNUc9xk5S{xkDnHBn+8q zQJk7Q51Wwn%L6DVn>7<PTO@E=$o@koc0K$K;|R&SaS;;TE^^g9_#~a$&Z83VrreKH z3VpP_rWmA}0Qu+s2#Ey5CtZ)iBro*nf!mvK4qRuG>Gj^W7s~1-`Vz8UX&WWfF^wK9 zk3D;{TfL{3LAIxKnUsGn5K^9QrX#5rV}C7P9w-H6SScg_uMC8wP`mRgVV^TCg6LdG zofuHRh?_NXuf*;bxKpabTa`MzJmP$bO2B|Uzzn%$zE7*z_+o@l2dANh-xA@o)2Nk} zFSnw1K{EdDD0v9)+T>>t#2<b0|Jcn&cS%tCN-R*-L8a=*dMCXg5EO+7kE-ibb*Xxd zD#{m#dsI=xA_!*+pDOZp+HvGoo8+F7bU@I(VU%tsJl91{ywge_fKUzTsPs^|u5G$a zcgd}zuDNaZf;;c7xR(2>YrBqnS*L3&mqQ^r@u`O*cTlCqF=Cs{+|l_VWLaHt_uw%S zYdX7hYy#{p0_<6teasNk*xJxs$JffWgIgJey4P`+(Om+0h(PM%0fo3TPd})F(ck!O zzy`n^vLRjsyhShosc`tANIWHhO#~p&y7wV&4L1RX2vwC2dSrDV{?TZC1KxU!-772P zT#%B}w>Sb8NJB^@ZXM;8X$WQQMu+rOF&ZIGKpo&6RWD{$Z1;RDu!rgX3nfnu*be+T z;eD62$oS~Lpl2%UOa!I!kY1v|x%A^F_{@+2cay)PkI55|Fhy2}!n0}p1ZuWS#7FMu z7`V3##VA~W$-Y=&tdHocrUqI^|5E9=zP?+0O_DtkkJIWC8UXCbLwueLC<jh9>TdqM zi}ap;uNR-;sIPJ8&2II9O?tz9aOqY!corVYTi#~m-MKBJaYz|e*g(uCy)xFLFJS<) z)vokp8W@+~E!MnSBVydGvm3$}I9i;3a3WRYr)sgp##N`noa;H{6n_A!C^wA`(r1D` zSR?BL=~2#r65C^#1u|awQ`S&!ooDLzahHLzk~E0EB_T&(+VwUQbccY{l{~A}K3$mr zuC{9a)ziTuq^&%;suv?#(Q+`RkF$$;#Sf_ZeX72siquZqFaLt3RQ|mZXF`5WC+_`M zUKn4;XZrPF@)TH&085@#Ba!zn%{+@Fr%t^@2m14}n)}V+I1#Cq5-qLzoHJC>Hid|x n+<SS({XPkvyn(8vQC}|Vx&{DW0wC|Owz*VW`a|Q>=HmYVA~$#S diff --git a/env/lib/python3.7/site-packages/setuptools/command/__pycache__/develop.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/command/__pycache__/develop.cpython-37.pyc deleted file mode 100644 index b664b94ca5c23512ef597dfc2ed5ff9429495c4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6428 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 Yk)diT_rf-6cwD7A9A>li8}0S~0WfZ|EC2ui diff --git a/env/lib/python3.7/site-packages/setuptools/command/__pycache__/dist_info.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/command/__pycache__/dist_info.cpython-37.pyc deleted file mode 100644 index bbcd8b0376ff290b2fcaa88cb71f0ae8ac8cdfa4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1343 zcmZuw%Z}SN6y-y<WZ7<l1VN`SK)Y0n@t|D=K~kid0NE6?=}tgFXhhnhfh;N{jbs$h zD#?F%&{hAU-@$EG{e`Y_FFp2T($XM#bxrY{bMMjf=`<xU+CLBe_?r{*5g&FVg5ViU z`v?|E3L>dw4J|0_ykSdTaEiI8iI#(6K*>uY2XgqH$f4rzcrldhcaq2bi}cv2(y6S> zWNn?O+qs6wsLE+`k^X8kspfU7WLCGCJ5$-~Go_l$cB-o9byd1rx9LB?ft=*j$H#iP zEL#a7Z}g(V{BAG^p24&;SQG)Kq+pU3T(Si%BFSa+o)m*EOW+sF1fF9#0-mWK?b-D| zR6E8qOdj5*ob!I97K_8v(yFJPs{XgVnyk{TE9<sy7ugKY+<LQCHv198maE1+&YbQt zJr9blUYSZ|&M1{v6v*Si9TgqJwAdy|)<nPxY$=u^0RVv{AdakR=6?~Bz`1{49Jyt8 z)YTopTUR#Cp?r1GzWHf>c4U=Xbx!NXejZlanjY;dFzYV-J&@t*vZ;F|bcbEA50DCS zBDDYh=J0<H-V%XAf(UffHT^&|rzVC}h_}lK9{pW#!!6hY$nIdjy@CDm*d7#d@Ztd4 zLa-(qaOxGkq-%0c*HpmVuq!Ar?0mbQN0PXKWbf#hd|=-Y$-gF-%ndiOj5diIou`}e znq9#yR}|jE8wYSBU-QjmP0u6vkHPnV-5H*2dxOpIM|&Ui>5ZHEX|Ndj<l)=Phkkq- zbOr0@Q~zM0oY?7;;<`U(2wKb-7SGM9HIooEsx=&=2=V-IuFbM^o@wi&u5@QUE>A56 z1sdjO#L1&=;qiiEy054JADb!UzUYX#1G(>D+Pkn2n$jfv4(I_(X@7IU3|O7yiBE)R z%cT;+r$Q{XTs0U^gm|?oo9lnZQrXJX!B~E>vdZjSX3*?GW&r+-47%H(M+~+Y*@q7! zVG$oj2~T*)=dq84kh&7W+=ny%D^$30bz^6hHp-xbx1W1RhU$ek{}0M1PqqqvK}?Gj KB9^cTo$yZ)XIw)7 diff --git a/env/lib/python3.7/site-packages/setuptools/command/__pycache__/easy_install.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/command/__pycache__/easy_install.cpython-37.pyc deleted file mode 100644 index b197f5b4d93d8f6c216248bdf3660c091e399816..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64799 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 aIQEI^vFgNNj%%vrGRFtYBP09A_WnOeb>^J_ diff --git a/env/lib/python3.7/site-packages/setuptools/command/__pycache__/egg_info.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/command/__pycache__/egg_info.cpython-37.pyc deleted file mode 100644 index a4f8a2a1c55f4dcd59be97bfea39f995d010e56a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21645 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 Q2)rysCsTBs1J3yW1N=HzPyhe` diff --git a/env/lib/python3.7/site-packages/setuptools/command/__pycache__/install.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/command/__pycache__/install.cpython-37.pyc deleted file mode 100644 index a2aec6ef820bd3a9cdcb1bf9d9093ff866713184..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3975 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 E2mHn$>Hq)$ diff --git a/env/lib/python3.7/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-37.pyc deleted file mode 100644 index b2df38f576c2e779549d7fa23d05060c4b7fd0d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2376 zcmZ`*Uysv95Z|>O$N6`p6gWV%3aUy;C6c1PA&L-(TA@n!P$Vi@Aj_BC<eYQtuxnrM zqT>mq_NAYoeMr=&ex-fwQ@;XF{mmvm4vsq7+1c^z&g}eV#(C7~G#Q@kud6Tq2pIc^ z7S&S&^AJNn2N6v0l+Ad^XHMvFT05y5x|rS6o7KXam3iR((6@Xot<Qom*yuLG#t%&R zqW*@7y7Z?_S$pk;E#W+6{or3%V1389X+AN5NK{l7NxIwTroNNUW^pFKHnVsp^*kO) zjn!6}fjx*~HQG-O<%mwG9tX@r4E+d1vXBcFI)cMn9(ux=@USLa;k{v@FKWWaTo-i_ zU=Bn>G%+_sOSCaJMF;+EnQoHlB2LptP9{;3jq}Ce$y(Bjv)%yGJ0$JFbvY_>b=({0 zs#omG9yu9LWZzx1H)q^|(szc7#r8YxBJXY9_KJMO;Wj-q(_MBjGyx^p35!7C6Q}63 zDz|VFmY$aB_;03KP<{L3u$aw<^JEUstnYWk%j4|m?s$KwWl_$HJWusmcC?Q4usXB4 z>R^6sE+$!0BypN7WR%Z~B+vAx<P>?w_~MImd(P{h-pa)mAH&}28JH8cM0N>hg}egK zg}dUfc;PH5yVwbzdKk5pxAay_c-!oigSC%H)Qe!+ST;}Cv~_~rkhCWhp^lAEZTDS# z(qymis0NH#VuI>&i^eH<fcY{a6P1~e<0O-!x~aK5ffyote-Uj0WjgbNNu;FCONE>? z?Z=5ORI-QE&9k)y%Gj_)whpDz5UUGt!T9Sf#>utu=5euaylI|fYuEfDR<LL4d0EWM zLib%o(1*TEqR~v4U@z8^4z@6_Nt;gXRvuP<Ux8F#1Yz9AugN`r5pw{#xOon-4|kv9 zMOj$Kuz39mW{ua1b5`&vP(u8@6<7D{s<vL~dxbx(6OR!H=XYS6-L@Kyjs70aX+qMX z^%$tryv<fFWx+JiMbTb%*19$?2<I)~39@j3<YVW`Mtj*^p;#>H{;rKNs-Z5_aiq#@ z(fCQu^1~#X^lY>i-JN`XOv^7dstvUNiD^Nx0#;Gr)HaBzB^srrt`YAiI!&?zMfnST zI#Wi4l2UzUU&|xluT5PZ$x&HI<CmG$Cj?AaX1Y`|IxTq<jNpacei;fODs0_h&UQJA z{D(NZaP=m(=u03Bu-@R8_!hqoXxo7Js<XIMomFM|09)R}lQ6Y-QXwLiRYy_RvF`Ja z+HFx4Y?5*SwW|1UoU?XD@zg4H3J-&#r+Xm3GGLCXe-ohA*>7yhF;LmBfxku4-5uHX zve`tRBinPn2Xk~w@W<@M=V%3J9w>gUd%`(!wsDyQU-@*vOaEtk>=K9CWObJwB^g$f zVjNA>+wD7x+CU#>!-co=?CJ0=AATe~YNiQnRH1)KihUa*<Hz&4%!DEjO-;zXa?*E= ztJTQ3LKkSo2g&@sK-wCuLp($2ev56IB+P5_D=5h}5L|qHE|OJ_4DP4-C{Fc*!R7#T z1%ggd?%4E1d!sg?z9B*%fXX;oQMW+uVrYVZIqlZs+W*?x?YB%2MU;n8WSUVl%SD+I z-;Sb}Wt?u_)T2n`BZyl<>XAz9XTh{fEmhTlR0r174I*C=xlM$8Ig``mtFlf~lc784 zE=a&V$8&u*aD!IR30y^Q`)$(@s51I@pl$4JHQIs&MyH=OMb}i6G2!+*>0t9;!Tz~e lhtJk#<H@@8q_Rdn=9>xbucPpQD#s$%<$==%Zfzd8{{empVbuTt diff --git a/env/lib/python3.7/site-packages/setuptools/command/__pycache__/install_lib.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/command/__pycache__/install_lib.cpython-37.pyc deleted file mode 100644 index f1d4e9f09573faaadd2925b50146ae0aa9f74ec4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4052 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 W4BLIw=)H?}F}XGVR~ypn)_(zkQxskR diff --git a/env/lib/python3.7/site-packages/setuptools/command/__pycache__/install_scripts.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/command/__pycache__/install_scripts.cpython-37.pyc deleted file mode 100644 index f7ae8c816b11b56032ca23c219c2757dc1eb80bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2255 zcmZuyOK%)S5bo}I?kjejmkB{xf(%+jY$Y5)C<;*`kg$+)2pTDBji=k|nanHQy*Rs? z<$xn`<2S6u34Q`UrLS<|FXRGMv%8KljMcT>)#d8ys_(0QI2d#ZeC03O&wuI=@&_)~ zp9_-*F!XmI1Q9eR1&t`hIm=n$FhWV;M&3%}M}E5#L;?Idd02F!PSK6JMK9`6@`MOi zc&~}@q?frTPUH&ql#Kkpz&jaH>*UpVf8^Nyqf{G}9!yMHmA3zFY>vK>CKj=Y?WQdC zL`g1EB@<JrX@dW}{v4P*fT2GIAxT69iI|{~Bbabr6F9I9Ao4_41R{J*A>a;#(6bw9 zsZE^cTqi26jh=n>s2Y})D&l;&R1H@apA74KqK9!g9m?^Tr{!TaJXUdCOSQ7p35DbF z!(WW)OBnh(2tzWuU=2CNB+`a(M-Vul?LQv5)~!@JRz8^7t+Y%{8t3Uu@~Xx>XzP^~ zmo?<c)iOW)m8c$AzWI936!l)6)^}I&-4!pV<*R##M|)bDNo}es*XO56RTOb4_AXp_ zx1OpH9QI*oEIgroI=gex>c4TFT^7UfV6>Ng0}}!1N5r%!VRN{0Ll#g9ynI74H}lke z<7dGlTqdOS$DrpO*z2l?m>96{q5Yhhe#5eXxr7qN#t8$t3FGpKJ9k<;2kcz4)nJjy zi8J?Ftp{2kw7&2~0NS9T*_C<N1nM^tf(^~C!pbw(vg<FH`n~bS6tv;u#wh`Pm~G>1 z@lJz&I<M})&dtVYI*WHt$tin8o?n`GA>La}_h+c~%Riq1H=v-MeTB8R;Tj@#a4<=8 zv4)rJ%2zU(nD`)<uq6QS{1|czAdGrE)m%+VSdAagy7kl?Rpl<&kKVJl-_~?@Rmfc# z>nXsng|7`(THF7Zx(ELF*%lsm#;;(7cojgvOY}KlZNq9}4%1v}1#N-YYh!8nVOqAB z6l-4!(H*t7JczYa2ply)`&L)Rg^YTbgYTu%$mRgt#Kx$o|Fk9AGnE>tqASnRQdGzK zywW;)s?`QMa}OjWW@~i;u4|d_B#*VW-9uFsypB~|L?MP4tFewcvF1lI7E;;%F`lr> z`>3a|+gT>l$d@Tk3SnK$M&uu8Tt#hNR{s2h<E0Mju_})BTX)Jj?Z4t-Ee)3fxub4? z*o2|)gCKN^b!kX1F`xR(g*l^}v=6_1io>Ta{Q0!&_$-8->vVSIBIU3c)Fdq@!6RM( zY4!w${t*Pwj3LeDUcu%*CB|8}!fBwpWZtO*>lMW^0Q)He0+6h;=r%!1L;nO}PO_f< z0Vo!n05#2^3544?H^>Q_cL3@@y4JR{*f<4{Hy-Q*MYdrdx|k1e4`%n;LPA#@z6JIW z;WISV&>YEiYaE_6?v@}UX1(O7sDvFP6QyKn_@s#Si`mVumVgEh40rUp1%t00ZRv6P zH?V7ew5cw`{ndvkK0?7jSQlGz)LW+!4z#S&)~(?kv2IqSrP@Y2AA5EwY#`JW`KB<d z(1by0y|&B{TV827>Ml{!TQY?ss%@B5rGa?CF@!IpARWVVA;sHhtZx7x(trWn$kM}$ zNVyH?eF~#}83@~Cn=Li~DTo-rM@VP4*4J3EboV@*_eWIifP+zBL*9nPx$SZe0ZnoV z^FHS<CvlDe!z$ohR0-#8pKo!hFobhqVGCC+it!af-fMglLh7>64L@kR!>DgNNEvvY zbKPb<djD*F)|4)Ut+voJI$gFIe4o`V5Oz?%7;`0cHBkxl8tf;_E`rtgztC*>`SN~W RV29O6hd$kcT!rka^AGhba1H<f diff --git a/env/lib/python3.7/site-packages/setuptools/command/__pycache__/py36compat.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/command/__pycache__/py36compat.cpython-37.pyc deleted file mode 100644 index 4d825ebb88fb6440a0a8a06bc62a7dd7c6ad7473..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4588 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 EU$M}&2><{9 diff --git a/env/lib/python3.7/site-packages/setuptools/command/__pycache__/register.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/command/__pycache__/register.cpython-37.pyc deleted file mode 100644 index 473e28fca806f86e9bd7a3ed0ec64162201dd83b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 745 zcmZ8fL2DE-6izak-Eq4G@gPz>%+UqAqu{9&QF|y}_D~O%5edU2oz9X;(j<fK(wqGu zEuQ>Kxq9+1c=Ba-w-f_;@5@Wx`@X#7!~XsR!B9V+eSJz0`W+X$K>@sj>E3|hh+~O5 zTw)wCk)%rq!l<KViqR?J38y!RQ;{y|kEEoWd_uGI4`iYl4vEywqK=E*0J2T-=KusM zF-Ij4$&xP9GUb?)8&r;X0!3)ZtY}*2g{|>6J^Cp81g3ihW_@stZb9N5$n$tfZj);i z@i~Zv9gySG<>-!J^cf;hHCcpAG!1Ljg<gL-e}A_4xHvt^&$djhYVy|QTo^0r$_xH7 z@14l~w^o7Gd2ghyc-|_I1^&gQ_r@I+g;|+)u5DA8VmMpOX5+ADd&O$qb(P|QYTGt8 z0nH(Sc*rWHbgyb*V@m>!QlMkh33>4g**ysUJt=%=3e%dyNLWdE$gfuF`|FF#!U^9S zueEd!;g+n}HEwQJb_|s=m~ILNVL~SOF`?ks)B9r}XaRyV##Ge_#=?ZLPV-(yJZ0>v zujFROj-bfq8e_(|t{EE`2Eh+ZBpZ&U09^c18P3QMnT^6D4)5CgR=VN#<-z@WzP-YH er!9=Pks)_OADi<ZSICYxg5SnJG7wJjljI*-QMZ%; diff --git a/env/lib/python3.7/site-packages/setuptools/command/__pycache__/rotate.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/command/__pycache__/rotate.cpython-37.pyc deleted file mode 100644 index e3dd386ca339760a684e678bf82208aac89ddd88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2494 zcmZ`*OLH7G5SBELoqgEZIL?a-sVRudUJ|bZ2M&};1u(@41C=TQTeybxO1mC=UY4}P zp4z?OP{n}@|6sQ`apBB~U%^RNPW*+O=+=7u2+2%I>S;->ethblj~5nd1fJ}-TRS=+ z<RAQ)KQ0iDp{eho<Al?Mq_jgR(kx-A({U{AByQ?;JWIQY-|=DIO)8xVj9wC?)lSvU z`AIFUcj}aUMtFq>&j}Ai{lw`sxch{(s{g_%q(x1mmuEi+siUH+_u$(}@&OFXTd~qZ z9VhCGLdSXbsg$|g#(5PV!BF`mPt$J3dnji9I6ypxrapj9kPhXf!#M3YoON98aF=@n zr{fI>DDCsga{@{Syb5E$YrGC)l{Y}S1>?(HceN<r*b<4*BFqymWXM4$8SjExd8W$u z_-p4Lga<+taW)9I!%RFAN{9V85vt{se%jT&y$=md%R6AQ7BW+z&O^%%*Q7Wc#!~PW zEUn^s>pYgQnwKj;h@Q^narkUcND=Biaap6VD+O%x@NC#}P_AXebQko_`!n&V&?Ou2 zU|ij!;4pk}WY9i=rfxvT$%sU=9=r)O;{-fJw_A?!tj;Dtkr8NTT$BaDag|8=zY}={ z1ibiYL#M??5f|%mrgS$+*7@OacJyw4Z$k+^EOeeH>LS^jMRsErf_8Cimf|edaW{!e z5#<&R>J}>KLr16&Z+ZK4_5W91vJF5#v+ZXfMr0o>I|$^GrktM8A1QFaKH%H~4nxjy zQ#;5#fw_o1CD|R9X!oEdzog(SN?@IX>%Ju!`-W%_Wom!Fa>C>h;_bOTWfE|IO1FrW z0-Q+|uf&w$MZwFkU4HfX5I~{|(Tn@XVV(ixWSHg<<~8e&btQ_f1W5AMDOAqDvnJYu zcDULu<6;$et+vHru-Yo`T@rZ?1&hRa<jdRZ>ln2##q)PX*v-N?(_$dxnd1-;9<(RW ztm6k@!cKEcH5t(foq}1vvO~DlHsCELaf9*jt`se1So@)&g`JyqO_+XB+e`p9U|aF% zKFY;CJ}K{?#<3q~m*U;tO!8hgQICL_?|VTX7;hKR2WK{5zwKHzSw|Z4nOuO*IAD;e zecerl!ln^Zi<QM<))Nv9GY!-=8$|lJ5DGLel31JT0MBTcaRIsrJ_lZl%0-ln*giMM zG+$QuO_;aNBD6*s^_?0GU~JMweAz8l-h7RzXMRU`W3!j>Zy*3Tke8>JlNomsn$j`Q zM}Hzfx5&;PV+NEnai@@xZ;}zaNq|GOx9?9XFcXZ}6o5Q-xW|0}rh|YSJ0oXOodT3$ ztl_BZlLoKog%JQ7b~rc#yB9h6iQOh+=V%Le?reU?#_rg&tAmk;V1`v!)GzkDCUB_y zOJAKVAw|g{@F&;i^iy(p_vsw`CIG-jan{cz<{wNTgCyTI^qn(TT!P>oSY#o%j1b(X z6EJd0N3_o_!q71+SH{J%VuFFtsg6?tK)D9H4eh@aKzSY5??amd@$PAK<S=^`_R1S8 z+~)K(b$TH&xvr?PZY##@qqS`6us=G@Xfg!(7M!MWF%4VwqO6+=`4+Bt8#?3e=W%8M z4e2zO+Ek=~I;n)jDra1D7Zgj8%`jf!@;HLCj2A0R#lG6Z>IsD`)lvxK53?lB4qE;U zy&=k|oTd=t*_2?YmMg%2$uq_Qu^YfwxCznRU=6xNmjTBC4cL-JbOVxb17^zFx!<;1 zH4{YEuqZOMC`xlaOa#!4C^{T=6EqpVDpADq9uRddR1cB{)>qRQg01sgXRho*nGoG< z&X89@7kL*ujM@dA?Zw0tBP-BhT2M>S1=M9OWA-Y#EbxLQI}f#f5o2M0HQLzEvX`yB zmO1lx^L&xOUlBFSFE(BeL44=xc`<8?BP{E))KWX=OT5hX)K{r%g3XzK9^oZWm}J1A K@S>B!<<5UMhL+R- diff --git a/env/lib/python3.7/site-packages/setuptools/command/__pycache__/saveopts.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/command/__pycache__/saveopts.cpython-37.pyc deleted file mode 100644 index 6caeac5863ef7812534ff4125df74fe157c6b38d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 889 zcmYjP&2AGh5cbb*vNWlR3P?rjVI_LWAxXKwr9y}zxJ5`kR9aD4+qILr>|bne)kK?9 z`vg2eD^9$Uubg-VPK-Ajh^3hwduG4+=CeQS?(QI1`HzE(?*yS=ZnIe)1n<H05jc)G zPEm#<oRNrN^ciu&={@39kUJVt?wz55{~IdNfY_ek(y*k+r*dX{MQLP_v&&eE#1(87 zG+Z}0gg~GOa}*Jd0gOZ*2grLA`P>KKjtz8tBLGM*U!6e|CPkLTIUlAn7vZ{r4owlp z;Z&w#`PP+(x+=?53cg*Sg{jI>GM$Bm3JY^36ks`?&5sFg$#voD>=aCw;A(V@R#>7H zx&2b(Yy1&id|J_(a{P^`aK3;0rp6DXrjPi6J|f5-eI+Xo%wKhCpA)D$t~)h(@M<d2 zBdNU;G(SE^^Zj#Vd_adB`0gFWAU4cQC(7Nxvfqvxx={y#?Q^M(l9!be)$X-f)@oq) zX2P@^#${rxFOA5w-GRZmn8sCVloQ?tPN+Q2gza**V5-UoUF&I)POax!faJm$na{MP zNyaUO4wh<_Sb7tuKaqL{D1T1JCM(CKEQd1JCQj2KpD*&;*VC(UqqHfCRBwkZ-|^-? zN9Dp&X#NDy^gcL*JJ=(A5@13OaexoVvj49b3McM0Fy@#uW_K9N3SOly?lU&8;<U|l z8RJC)$2~4|qGa<3)eC6QFyC^|-I>$cneKoKfPqJvv&q1VUj83t)bby}5eU*qsptk^ W3)HEj9I_2g)(qddx22u-Pw8J2;`6Kk diff --git a/env/lib/python3.7/site-packages/setuptools/command/__pycache__/sdist.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/command/__pycache__/sdist.cpython-37.pyc deleted file mode 100644 index 50b5a6141a147dbf4180d139acc356d16888b7b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6747 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 Ivuc(92k3gjq5uE@ diff --git a/env/lib/python3.7/site-packages/setuptools/command/__pycache__/setopt.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/command/__pycache__/setopt.cpython-37.pyc deleted file mode 100644 index 7d8fa3b21d500355fe54cffb0577bf3c9b9ceefd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4487 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 DPVl}t diff --git a/env/lib/python3.7/site-packages/setuptools/command/__pycache__/test.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/command/__pycache__/test.cpython-37.pyc deleted file mode 100644 index 9a944dd9170642cc28bd385c2461fcc6d45a1c1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8140 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 diff --git a/env/lib/python3.7/site-packages/setuptools/command/__pycache__/upload.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/command/__pycache__/upload.cpython-37.pyc deleted file mode 100644 index 5654eab95e3841b087a7243a3067e444930b6e81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5153 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 diff --git a/env/lib/python3.7/site-packages/setuptools/command/__pycache__/upload_docs.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/command/__pycache__/upload_docs.cpython-37.pyc deleted file mode 100644 index 238e2cd58d714287f8b09726bebae46db20bfc6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6098 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 ann?3!q`i_KhDM<VA>-U1v<A_2+x%Y>#eft5 diff --git a/env/lib/python3.7/site-packages/setuptools/command/alias.py b/env/lib/python3.7/site-packages/setuptools/command/alias.py deleted file mode 100644 index 4532b1c..0000000 --- a/env/lib/python3.7/site-packages/setuptools/command/alias.py +++ /dev/null @@ -1,80 +0,0 @@ -from distutils.errors import DistutilsOptionError - -from setuptools.extern.six.moves import map - -from setuptools.command.setopt import edit_config, option_base, config_file - - -def shquote(arg): - """Quote an argument for later parsing by shlex.split()""" - for c in '"', "'", "\\", "#": - if c in arg: - return repr(arg) - if arg.split() != [arg]: - return repr(arg) - return arg - - -class alias(option_base): - """Define a shortcut that invokes one or more commands""" - - description = "define a shortcut to invoke one or more commands" - command_consumes_arguments = True - - user_options = [ - ('remove', 'r', 'remove (unset) the alias'), - ] + option_base.user_options - - boolean_options = option_base.boolean_options + ['remove'] - - def initialize_options(self): - option_base.initialize_options(self) - self.args = None - self.remove = None - - def finalize_options(self): - option_base.finalize_options(self) - if self.remove and len(self.args) != 1: - raise DistutilsOptionError( - "Must specify exactly one argument (the alias name) when " - "using --remove" - ) - - def run(self): - aliases = self.distribution.get_option_dict('aliases') - - if not self.args: - print("Command Aliases") - print("---------------") - for alias in aliases: - print("setup.py alias", format_alias(alias, aliases)) - return - - elif len(self.args) == 1: - alias, = self.args - if self.remove: - command = None - elif alias in aliases: - print("setup.py alias", format_alias(alias, aliases)) - return - else: - print("No alias definition found for %r" % alias) - return - else: - alias = self.args[0] - command = ' '.join(map(shquote, self.args[1:])) - - edit_config(self.filename, {'aliases': {alias: command}}, self.dry_run) - - -def format_alias(name, aliases): - source, command = aliases[name] - if source == config_file('global'): - source = '--global-config ' - elif source == config_file('user'): - source = '--user-config ' - elif source == config_file('local'): - source = '' - else: - source = '--filename=%r' % source - return source + name + ' ' + command diff --git a/env/lib/python3.7/site-packages/setuptools/command/bdist_egg.py b/env/lib/python3.7/site-packages/setuptools/command/bdist_egg.py deleted file mode 100644 index 9f8df91..0000000 --- a/env/lib/python3.7/site-packages/setuptools/command/bdist_egg.py +++ /dev/null @@ -1,502 +0,0 @@ -"""setuptools.command.bdist_egg - -Build .egg distributions""" - -from distutils.errors import DistutilsSetupError -from distutils.dir_util import remove_tree, mkpath -from distutils import log -from types import CodeType -import sys -import os -import re -import textwrap -import marshal - -from setuptools.extern import six - -from pkg_resources import get_build_platform, Distribution, ensure_directory -from pkg_resources import EntryPoint -from setuptools.extension import Library -from setuptools import Command - -try: - # Python 2.7 or >=3.2 - from sysconfig import get_path, get_python_version - - def _get_purelib(): - return get_path("purelib") -except ImportError: - from distutils.sysconfig import get_python_lib, get_python_version - - def _get_purelib(): - return get_python_lib(False) - - -def strip_module(filename): - if '.' in filename: - filename = os.path.splitext(filename)[0] - if filename.endswith('module'): - filename = filename[:-6] - return filename - - -def sorted_walk(dir): - """Do os.walk in a reproducible way, - independent of indeterministic filesystem readdir order - """ - for base, dirs, files in os.walk(dir): - dirs.sort() - files.sort() - yield base, dirs, files - - -def write_stub(resource, pyfile): - _stub_template = textwrap.dedent(""" - def __bootstrap__(): - global __bootstrap__, __loader__, __file__ - import sys, pkg_resources, imp - __file__ = pkg_resources.resource_filename(__name__, %r) - __loader__ = None; del __bootstrap__, __loader__ - imp.load_dynamic(__name__,__file__) - __bootstrap__() - """).lstrip() - with open(pyfile, 'w') as f: - f.write(_stub_template % resource) - - -class bdist_egg(Command): - description = "create an \"egg\" distribution" - - user_options = [ - ('bdist-dir=', 'b', - "temporary directory for creating the distribution"), - ('plat-name=', 'p', "platform name to embed in generated filenames " - "(default: %s)" % get_build_platform()), - ('exclude-source-files', None, - "remove all .py files from the generated egg"), - ('keep-temp', 'k', - "keep the pseudo-installation tree around after " + - "creating the distribution archive"), - ('dist-dir=', 'd', - "directory to put final built distributions in"), - ('skip-build', None, - "skip rebuilding everything (for testing/debugging)"), - ] - - boolean_options = [ - 'keep-temp', 'skip-build', 'exclude-source-files' - ] - - def initialize_options(self): - self.bdist_dir = None - self.plat_name = None - self.keep_temp = 0 - self.dist_dir = None - self.skip_build = 0 - self.egg_output = None - self.exclude_source_files = None - - def finalize_options(self): - ei_cmd = self.ei_cmd = self.get_finalized_command("egg_info") - self.egg_info = ei_cmd.egg_info - - if self.bdist_dir is None: - bdist_base = self.get_finalized_command('bdist').bdist_base - self.bdist_dir = os.path.join(bdist_base, 'egg') - - if self.plat_name is None: - self.plat_name = get_build_platform() - - self.set_undefined_options('bdist', ('dist_dir', 'dist_dir')) - - if self.egg_output is None: - - # Compute filename of the output egg - basename = Distribution( - None, None, ei_cmd.egg_name, ei_cmd.egg_version, - get_python_version(), - self.distribution.has_ext_modules() and self.plat_name - ).egg_name() - - self.egg_output = os.path.join(self.dist_dir, basename + '.egg') - - def do_install_data(self): - # Hack for packages that install data to install's --install-lib - self.get_finalized_command('install').install_lib = self.bdist_dir - - site_packages = os.path.normcase(os.path.realpath(_get_purelib())) - old, self.distribution.data_files = self.distribution.data_files, [] - - for item in old: - if isinstance(item, tuple) and len(item) == 2: - if os.path.isabs(item[0]): - realpath = os.path.realpath(item[0]) - normalized = os.path.normcase(realpath) - if normalized == site_packages or normalized.startswith( - site_packages + os.sep - ): - item = realpath[len(site_packages) + 1:], item[1] - # XXX else: raise ??? - self.distribution.data_files.append(item) - - try: - log.info("installing package data to %s", self.bdist_dir) - self.call_command('install_data', force=0, root=None) - finally: - self.distribution.data_files = old - - def get_outputs(self): - return [self.egg_output] - - def call_command(self, cmdname, **kw): - """Invoke reinitialized command `cmdname` with keyword args""" - for dirname in INSTALL_DIRECTORY_ATTRS: - kw.setdefault(dirname, self.bdist_dir) - kw.setdefault('skip_build', self.skip_build) - kw.setdefault('dry_run', self.dry_run) - cmd = self.reinitialize_command(cmdname, **kw) - self.run_command(cmdname) - return cmd - - def run(self): - # Generate metadata first - self.run_command("egg_info") - # We run install_lib before install_data, because some data hacks - # pull their data path from the install_lib command. - log.info("installing library code to %s", self.bdist_dir) - instcmd = self.get_finalized_command('install') - old_root = instcmd.root - instcmd.root = None - if self.distribution.has_c_libraries() and not self.skip_build: - self.run_command('build_clib') - cmd = self.call_command('install_lib', warn_dir=0) - instcmd.root = old_root - - all_outputs, ext_outputs = self.get_ext_outputs() - self.stubs = [] - to_compile = [] - for (p, ext_name) in enumerate(ext_outputs): - filename, ext = os.path.splitext(ext_name) - pyfile = os.path.join(self.bdist_dir, strip_module(filename) + - '.py') - self.stubs.append(pyfile) - log.info("creating stub loader for %s", ext_name) - if not self.dry_run: - write_stub(os.path.basename(ext_name), pyfile) - to_compile.append(pyfile) - ext_outputs[p] = ext_name.replace(os.sep, '/') - - if to_compile: - cmd.byte_compile(to_compile) - if self.distribution.data_files: - self.do_install_data() - - # Make the EGG-INFO directory - archive_root = self.bdist_dir - egg_info = os.path.join(archive_root, 'EGG-INFO') - self.mkpath(egg_info) - if self.distribution.scripts: - script_dir = os.path.join(egg_info, 'scripts') - log.info("installing scripts to %s", script_dir) - self.call_command('install_scripts', install_dir=script_dir, - no_ep=1) - - self.copy_metadata_to(egg_info) - native_libs = os.path.join(egg_info, "native_libs.txt") - if all_outputs: - log.info("writing %s", native_libs) - if not self.dry_run: - ensure_directory(native_libs) - libs_file = open(native_libs, 'wt') - libs_file.write('\n'.join(all_outputs)) - libs_file.write('\n') - libs_file.close() - elif os.path.isfile(native_libs): - log.info("removing %s", native_libs) - if not self.dry_run: - os.unlink(native_libs) - - write_safety_flag( - os.path.join(archive_root, 'EGG-INFO'), self.zip_safe() - ) - - if os.path.exists(os.path.join(self.egg_info, 'depends.txt')): - log.warn( - "WARNING: 'depends.txt' will not be used by setuptools 0.6!\n" - "Use the install_requires/extras_require setup() args instead." - ) - - if self.exclude_source_files: - self.zap_pyfiles() - - # Make the archive - make_zipfile(self.egg_output, archive_root, verbose=self.verbose, - dry_run=self.dry_run, mode=self.gen_header()) - if not self.keep_temp: - remove_tree(self.bdist_dir, dry_run=self.dry_run) - - # Add to 'Distribution.dist_files' so that the "upload" command works - getattr(self.distribution, 'dist_files', []).append( - ('bdist_egg', get_python_version(), self.egg_output)) - - def zap_pyfiles(self): - log.info("Removing .py files from temporary directory") - for base, dirs, files in walk_egg(self.bdist_dir): - for name in files: - path = os.path.join(base, name) - - if name.endswith('.py'): - log.debug("Deleting %s", path) - os.unlink(path) - - if base.endswith('__pycache__'): - path_old = path - - pattern = r'(?P<name>.+)\.(?P<magic>[^.]+)\.pyc' - m = re.match(pattern, name) - path_new = os.path.join( - base, os.pardir, m.group('name') + '.pyc') - log.info( - "Renaming file from [%s] to [%s]" - % (path_old, path_new)) - try: - os.remove(path_new) - except OSError: - pass - os.rename(path_old, path_new) - - def zip_safe(self): - safe = getattr(self.distribution, 'zip_safe', None) - if safe is not None: - return safe - log.warn("zip_safe flag not set; analyzing archive contents...") - return analyze_egg(self.bdist_dir, self.stubs) - - def gen_header(self): - epm = EntryPoint.parse_map(self.distribution.entry_points or '') - ep = epm.get('setuptools.installation', {}).get('eggsecutable') - if ep is None: - return 'w' # not an eggsecutable, do it the usual way. - - if not ep.attrs or ep.extras: - raise DistutilsSetupError( - "eggsecutable entry point (%r) cannot have 'extras' " - "or refer to a module" % (ep,) - ) - - pyver = sys.version[:3] - pkg = ep.module_name - full = '.'.join(ep.attrs) - base = ep.attrs[0] - basename = os.path.basename(self.egg_output) - - header = ( - "#!/bin/sh\n" - 'if [ `basename $0` = "%(basename)s" ]\n' - 'then exec python%(pyver)s -c "' - "import sys, os; sys.path.insert(0, os.path.abspath('$0')); " - "from %(pkg)s import %(base)s; sys.exit(%(full)s())" - '" "$@"\n' - 'else\n' - ' echo $0 is not the correct name for this egg file.\n' - ' echo Please rename it back to %(basename)s and try again.\n' - ' exec false\n' - 'fi\n' - ) % locals() - - if not self.dry_run: - mkpath(os.path.dirname(self.egg_output), dry_run=self.dry_run) - f = open(self.egg_output, 'w') - f.write(header) - f.close() - return 'a' - - def copy_metadata_to(self, target_dir): - "Copy metadata (egg info) to the target_dir" - # normalize the path (so that a forward-slash in egg_info will - # match using startswith below) - norm_egg_info = os.path.normpath(self.egg_info) - prefix = os.path.join(norm_egg_info, '') - for path in self.ei_cmd.filelist.files: - if path.startswith(prefix): - target = os.path.join(target_dir, path[len(prefix):]) - ensure_directory(target) - self.copy_file(path, target) - - def get_ext_outputs(self): - """Get a list of relative paths to C extensions in the output distro""" - - all_outputs = [] - ext_outputs = [] - - paths = {self.bdist_dir: ''} - for base, dirs, files in sorted_walk(self.bdist_dir): - for filename in files: - if os.path.splitext(filename)[1].lower() in NATIVE_EXTENSIONS: - all_outputs.append(paths[base] + filename) - for filename in dirs: - paths[os.path.join(base, filename)] = (paths[base] + - filename + '/') - - if self.distribution.has_ext_modules(): - build_cmd = self.get_finalized_command('build_ext') - for ext in build_cmd.extensions: - if isinstance(ext, Library): - continue - fullname = build_cmd.get_ext_fullname(ext.name) - filename = build_cmd.get_ext_filename(fullname) - if not os.path.basename(filename).startswith('dl-'): - if os.path.exists(os.path.join(self.bdist_dir, filename)): - ext_outputs.append(filename) - - return all_outputs, ext_outputs - - -NATIVE_EXTENSIONS = dict.fromkeys('.dll .so .dylib .pyd'.split()) - - -def walk_egg(egg_dir): - """Walk an unpacked egg's contents, skipping the metadata directory""" - walker = sorted_walk(egg_dir) - base, dirs, files = next(walker) - if 'EGG-INFO' in dirs: - dirs.remove('EGG-INFO') - yield base, dirs, files - for bdf in walker: - yield bdf - - -def analyze_egg(egg_dir, stubs): - # check for existing flag in EGG-INFO - for flag, fn in safety_flags.items(): - if os.path.exists(os.path.join(egg_dir, 'EGG-INFO', fn)): - return flag - if not can_scan(): - return False - safe = True - for base, dirs, files in walk_egg(egg_dir): - for name in files: - if name.endswith('.py') or name.endswith('.pyw'): - continue - elif name.endswith('.pyc') or name.endswith('.pyo'): - # always scan, even if we already know we're not safe - safe = scan_module(egg_dir, base, name, stubs) and safe - return safe - - -def write_safety_flag(egg_dir, safe): - # Write or remove zip safety flag file(s) - for flag, fn in safety_flags.items(): - fn = os.path.join(egg_dir, fn) - if os.path.exists(fn): - if safe is None or bool(safe) != flag: - os.unlink(fn) - elif safe is not None and bool(safe) == flag: - f = open(fn, 'wt') - f.write('\n') - f.close() - - -safety_flags = { - True: 'zip-safe', - False: 'not-zip-safe', -} - - -def scan_module(egg_dir, base, name, stubs): - """Check whether module possibly uses unsafe-for-zipfile stuff""" - - filename = os.path.join(base, name) - if filename[:-1] in stubs: - return True # Extension module - pkg = base[len(egg_dir) + 1:].replace(os.sep, '.') - module = pkg + (pkg and '.' or '') + os.path.splitext(name)[0] - if six.PY2: - skip = 8 # skip magic & date - elif sys.version_info < (3, 7): - skip = 12 # skip magic & date & file size - else: - skip = 16 # skip magic & reserved? & date & file size - f = open(filename, 'rb') - f.read(skip) - code = marshal.load(f) - f.close() - safe = True - symbols = dict.fromkeys(iter_symbols(code)) - for bad in ['__file__', '__path__']: - if bad in symbols: - log.warn("%s: module references %s", module, bad) - safe = False - if 'inspect' in symbols: - for bad in [ - 'getsource', 'getabsfile', 'getsourcefile', 'getfile' - 'getsourcelines', 'findsource', 'getcomments', 'getframeinfo', - 'getinnerframes', 'getouterframes', 'stack', 'trace' - ]: - if bad in symbols: - log.warn("%s: module MAY be using inspect.%s", module, bad) - safe = False - return safe - - -def iter_symbols(code): - """Yield names and strings used by `code` and its nested code objects""" - for name in code.co_names: - yield name - for const in code.co_consts: - if isinstance(const, six.string_types): - yield const - elif isinstance(const, CodeType): - for name in iter_symbols(const): - yield name - - -def can_scan(): - if not sys.platform.startswith('java') and sys.platform != 'cli': - # CPython, PyPy, etc. - return True - log.warn("Unable to analyze compiled code on this platform.") - log.warn("Please ask the author to include a 'zip_safe'" - " setting (either True or False) in the package's setup.py") - - -# Attribute names of options for commands that might need to be convinced to -# install to the egg build directory - -INSTALL_DIRECTORY_ATTRS = [ - 'install_lib', 'install_dir', 'install_data', 'install_base' -] - - -def make_zipfile(zip_filename, base_dir, verbose=0, dry_run=0, compress=True, - mode='w'): - """Create a zip file from all the files under 'base_dir'. The output - zip file will be named 'base_dir' + ".zip". Uses either the "zipfile" - Python module (if available) or the InfoZIP "zip" utility (if installed - and found on the default search path). If neither tool is available, - raises DistutilsExecError. Returns the name of the output zip file. - """ - import zipfile - - mkpath(os.path.dirname(zip_filename), dry_run=dry_run) - log.info("creating '%s' and adding '%s' to it", zip_filename, base_dir) - - def visit(z, dirname, names): - for name in names: - path = os.path.normpath(os.path.join(dirname, name)) - if os.path.isfile(path): - p = path[len(base_dir) + 1:] - if not dry_run: - z.write(path, p) - log.debug("adding '%s'", p) - - compression = zipfile.ZIP_DEFLATED if compress else zipfile.ZIP_STORED - if not dry_run: - z = zipfile.ZipFile(zip_filename, mode, compression=compression) - for dirname, dirs, files in sorted_walk(base_dir): - visit(z, dirname, files) - z.close() - else: - for dirname, dirs, files in sorted_walk(base_dir): - visit(None, dirname, files) - return zip_filename diff --git a/env/lib/python3.7/site-packages/setuptools/command/bdist_rpm.py b/env/lib/python3.7/site-packages/setuptools/command/bdist_rpm.py deleted file mode 100644 index 7073092..0000000 --- a/env/lib/python3.7/site-packages/setuptools/command/bdist_rpm.py +++ /dev/null @@ -1,43 +0,0 @@ -import distutils.command.bdist_rpm as orig - - -class bdist_rpm(orig.bdist_rpm): - """ - Override the default bdist_rpm behavior to do the following: - - 1. Run egg_info to ensure the name and version are properly calculated. - 2. Always run 'install' using --single-version-externally-managed to - disable eggs in RPM distributions. - 3. Replace dash with underscore in the version numbers for better RPM - compatibility. - """ - - def run(self): - # ensure distro name is up-to-date - self.run_command('egg_info') - - orig.bdist_rpm.run(self) - - def _make_spec_file(self): - version = self.distribution.get_version() - rpmversion = version.replace('-', '_') - spec = orig.bdist_rpm._make_spec_file(self) - line23 = '%define version ' + version - line24 = '%define version ' + rpmversion - spec = [ - line.replace( - "Source0: %{name}-%{version}.tar", - "Source0: %{name}-%{unmangled_version}.tar" - ).replace( - "setup.py install ", - "setup.py install --single-version-externally-managed " - ).replace( - "%setup", - "%setup -n %{name}-%{unmangled_version}" - ).replace(line23, line24) - for line in spec - ] - insert_loc = spec.index(line24) + 1 - unmangled_version = "%define unmangled_version " + version - spec.insert(insert_loc, unmangled_version) - return spec diff --git a/env/lib/python3.7/site-packages/setuptools/command/bdist_wininst.py b/env/lib/python3.7/site-packages/setuptools/command/bdist_wininst.py deleted file mode 100644 index 073de97..0000000 --- a/env/lib/python3.7/site-packages/setuptools/command/bdist_wininst.py +++ /dev/null @@ -1,21 +0,0 @@ -import distutils.command.bdist_wininst as orig - - -class bdist_wininst(orig.bdist_wininst): - def reinitialize_command(self, command, reinit_subcommands=0): - """ - Supplement reinitialize_command to work around - http://bugs.python.org/issue20819 - """ - cmd = self.distribution.reinitialize_command( - command, reinit_subcommands) - if command in ('install', 'install_lib'): - cmd.install_lib = None - return cmd - - def run(self): - self._is_running = True - try: - orig.bdist_wininst.run(self) - finally: - self._is_running = False diff --git a/env/lib/python3.7/site-packages/setuptools/command/build_clib.py b/env/lib/python3.7/site-packages/setuptools/command/build_clib.py deleted file mode 100644 index 09caff6..0000000 --- a/env/lib/python3.7/site-packages/setuptools/command/build_clib.py +++ /dev/null @@ -1,98 +0,0 @@ -import distutils.command.build_clib as orig -from distutils.errors import DistutilsSetupError -from distutils import log -from setuptools.dep_util import newer_pairwise_group - - -class build_clib(orig.build_clib): - """ - Override the default build_clib behaviour to do the following: - - 1. Implement a rudimentary timestamp-based dependency system - so 'compile()' doesn't run every time. - 2. Add more keys to the 'build_info' dictionary: - * obj_deps - specify dependencies for each object compiled. - this should be a dictionary mapping a key - with the source filename to a list of - dependencies. Use an empty string for global - dependencies. - * cflags - specify a list of additional flags to pass to - the compiler. - """ - - def build_libraries(self, libraries): - for (lib_name, build_info) in libraries: - sources = build_info.get('sources') - if sources is None or not isinstance(sources, (list, tuple)): - raise DistutilsSetupError( - "in 'libraries' option (library '%s'), " - "'sources' must be present and must be " - "a list of source filenames" % lib_name) - sources = list(sources) - - log.info("building '%s' library", lib_name) - - # Make sure everything is the correct type. - # obj_deps should be a dictionary of keys as sources - # and a list/tuple of files that are its dependencies. - obj_deps = build_info.get('obj_deps', dict()) - if not isinstance(obj_deps, dict): - raise DistutilsSetupError( - "in 'libraries' option (library '%s'), " - "'obj_deps' must be a dictionary of " - "type 'source: list'" % lib_name) - dependencies = [] - - # Get the global dependencies that are specified by the '' key. - # These will go into every source's dependency list. - global_deps = obj_deps.get('', list()) - if not isinstance(global_deps, (list, tuple)): - raise DistutilsSetupError( - "in 'libraries' option (library '%s'), " - "'obj_deps' must be a dictionary of " - "type 'source: list'" % lib_name) - - # Build the list to be used by newer_pairwise_group - # each source will be auto-added to its dependencies. - for source in sources: - src_deps = [source] - src_deps.extend(global_deps) - extra_deps = obj_deps.get(source, list()) - if not isinstance(extra_deps, (list, tuple)): - raise DistutilsSetupError( - "in 'libraries' option (library '%s'), " - "'obj_deps' must be a dictionary of " - "type 'source: list'" % lib_name) - src_deps.extend(extra_deps) - dependencies.append(src_deps) - - expected_objects = self.compiler.object_filenames( - sources, - output_dir=self.build_temp - ) - - if newer_pairwise_group(dependencies, expected_objects) != ([], []): - # First, compile the source code to object files in the library - # directory. (This should probably change to putting object - # files in a temporary build directory.) - macros = build_info.get('macros') - include_dirs = build_info.get('include_dirs') - cflags = build_info.get('cflags') - objects = self.compiler.compile( - sources, - output_dir=self.build_temp, - macros=macros, - include_dirs=include_dirs, - extra_postargs=cflags, - debug=self.debug - ) - - # Now "link" the object files together into a static library. - # (On Unix at least, this isn't really linking -- it just - # builds an archive. Whatever.) - self.compiler.create_static_lib( - expected_objects, - lib_name, - output_dir=self.build_clib, - debug=self.debug - ) diff --git a/env/lib/python3.7/site-packages/setuptools/command/build_ext.py b/env/lib/python3.7/site-packages/setuptools/command/build_ext.py deleted file mode 100644 index 60a8a32..0000000 --- a/env/lib/python3.7/site-packages/setuptools/command/build_ext.py +++ /dev/null @@ -1,321 +0,0 @@ -import os -import sys -import itertools -import imp -from distutils.command.build_ext import build_ext as _du_build_ext -from distutils.file_util import copy_file -from distutils.ccompiler import new_compiler -from distutils.sysconfig import customize_compiler, get_config_var -from distutils.errors import DistutilsError -from distutils import log - -from setuptools.extension import Library -from setuptools.extern import six - -try: - # Attempt to use Cython for building extensions, if available - from Cython.Distutils.build_ext import build_ext as _build_ext - # Additionally, assert that the compiler module will load - # also. Ref #1229. - __import__('Cython.Compiler.Main') -except ImportError: - _build_ext = _du_build_ext - -# make sure _config_vars is initialized -get_config_var("LDSHARED") -from distutils.sysconfig import _config_vars as _CONFIG_VARS - - -def _customize_compiler_for_shlib(compiler): - if sys.platform == "darwin": - # building .dylib requires additional compiler flags on OSX; here we - # temporarily substitute the pyconfig.h variables so that distutils' - # 'customize_compiler' uses them before we build the shared libraries. - tmp = _CONFIG_VARS.copy() - try: - # XXX Help! I don't have any idea whether these are right... - _CONFIG_VARS['LDSHARED'] = ( - "gcc -Wl,-x -dynamiclib -undefined dynamic_lookup") - _CONFIG_VARS['CCSHARED'] = " -dynamiclib" - _CONFIG_VARS['SO'] = ".dylib" - customize_compiler(compiler) - finally: - _CONFIG_VARS.clear() - _CONFIG_VARS.update(tmp) - else: - customize_compiler(compiler) - - -have_rtld = False -use_stubs = False -libtype = 'shared' - -if sys.platform == "darwin": - use_stubs = True -elif os.name != 'nt': - try: - import dl - use_stubs = have_rtld = hasattr(dl, 'RTLD_NOW') - except ImportError: - pass - -if_dl = lambda s: s if have_rtld else '' - - -def get_abi3_suffix(): - """Return the file extension for an abi3-compliant Extension()""" - for suffix, _, _ in (s for s in imp.get_suffixes() if s[2] == imp.C_EXTENSION): - if '.abi3' in suffix: # Unix - return suffix - elif suffix == '.pyd': # Windows - return suffix - - -class build_ext(_build_ext): - def run(self): - """Build extensions in build directory, then copy if --inplace""" - old_inplace, self.inplace = self.inplace, 0 - _build_ext.run(self) - self.inplace = old_inplace - if old_inplace: - self.copy_extensions_to_source() - - def copy_extensions_to_source(self): - build_py = self.get_finalized_command('build_py') - for ext in self.extensions: - fullname = self.get_ext_fullname(ext.name) - filename = self.get_ext_filename(fullname) - modpath = fullname.split('.') - package = '.'.join(modpath[:-1]) - package_dir = build_py.get_package_dir(package) - dest_filename = os.path.join(package_dir, - os.path.basename(filename)) - src_filename = os.path.join(self.build_lib, filename) - - # Always copy, even if source is older than destination, to ensure - # that the right extensions for the current Python/platform are - # used. - copy_file( - src_filename, dest_filename, verbose=self.verbose, - dry_run=self.dry_run - ) - if ext._needs_stub: - self.write_stub(package_dir or os.curdir, ext, True) - - def get_ext_filename(self, fullname): - filename = _build_ext.get_ext_filename(self, fullname) - if fullname in self.ext_map: - ext = self.ext_map[fullname] - use_abi3 = ( - six.PY3 - and getattr(ext, 'py_limited_api') - and get_abi3_suffix() - ) - if use_abi3: - so_ext = get_config_var('EXT_SUFFIX') - filename = filename[:-len(so_ext)] - filename = filename + get_abi3_suffix() - if isinstance(ext, Library): - fn, ext = os.path.splitext(filename) - return self.shlib_compiler.library_filename(fn, libtype) - elif use_stubs and ext._links_to_dynamic: - d, fn = os.path.split(filename) - return os.path.join(d, 'dl-' + fn) - return filename - - def initialize_options(self): - _build_ext.initialize_options(self) - self.shlib_compiler = None - self.shlibs = [] - self.ext_map = {} - - def finalize_options(self): - _build_ext.finalize_options(self) - self.extensions = self.extensions or [] - self.check_extensions_list(self.extensions) - self.shlibs = [ext for ext in self.extensions - if isinstance(ext, Library)] - if self.shlibs: - self.setup_shlib_compiler() - for ext in self.extensions: - ext._full_name = self.get_ext_fullname(ext.name) - for ext in self.extensions: - fullname = ext._full_name - self.ext_map[fullname] = ext - - # distutils 3.1 will also ask for module names - # XXX what to do with conflicts? - self.ext_map[fullname.split('.')[-1]] = ext - - ltd = self.shlibs and self.links_to_dynamic(ext) or False - ns = ltd and use_stubs and not isinstance(ext, Library) - ext._links_to_dynamic = ltd - ext._needs_stub = ns - filename = ext._file_name = self.get_ext_filename(fullname) - libdir = os.path.dirname(os.path.join(self.build_lib, filename)) - if ltd and libdir not in ext.library_dirs: - ext.library_dirs.append(libdir) - if ltd and use_stubs and os.curdir not in ext.runtime_library_dirs: - ext.runtime_library_dirs.append(os.curdir) - - def setup_shlib_compiler(self): - compiler = self.shlib_compiler = new_compiler( - compiler=self.compiler, dry_run=self.dry_run, force=self.force - ) - _customize_compiler_for_shlib(compiler) - - if self.include_dirs is not None: - compiler.set_include_dirs(self.include_dirs) - if self.define is not None: - # 'define' option is a list of (name,value) tuples - for (name, value) in self.define: - compiler.define_macro(name, value) - if self.undef is not None: - for macro in self.undef: - compiler.undefine_macro(macro) - if self.libraries is not None: - compiler.set_libraries(self.libraries) - if self.library_dirs is not None: - compiler.set_library_dirs(self.library_dirs) - if self.rpath is not None: - compiler.set_runtime_library_dirs(self.rpath) - if self.link_objects is not None: - compiler.set_link_objects(self.link_objects) - - # hack so distutils' build_extension() builds a library instead - compiler.link_shared_object = link_shared_object.__get__(compiler) - - def get_export_symbols(self, ext): - if isinstance(ext, Library): - return ext.export_symbols - return _build_ext.get_export_symbols(self, ext) - - def build_extension(self, ext): - ext._convert_pyx_sources_to_lang() - _compiler = self.compiler - try: - if isinstance(ext, Library): - self.compiler = self.shlib_compiler - _build_ext.build_extension(self, ext) - if ext._needs_stub: - cmd = self.get_finalized_command('build_py').build_lib - self.write_stub(cmd, ext) - finally: - self.compiler = _compiler - - def links_to_dynamic(self, ext): - """Return true if 'ext' links to a dynamic lib in the same package""" - # XXX this should check to ensure the lib is actually being built - # XXX as dynamic, and not just using a locally-found version or a - # XXX static-compiled version - libnames = dict.fromkeys([lib._full_name for lib in self.shlibs]) - pkg = '.'.join(ext._full_name.split('.')[:-1] + ['']) - return any(pkg + libname in libnames for libname in ext.libraries) - - def get_outputs(self): - return _build_ext.get_outputs(self) + self.__get_stubs_outputs() - - def __get_stubs_outputs(self): - # assemble the base name for each extension that needs a stub - ns_ext_bases = ( - os.path.join(self.build_lib, *ext._full_name.split('.')) - for ext in self.extensions - if ext._needs_stub - ) - # pair each base with the extension - pairs = itertools.product(ns_ext_bases, self.__get_output_extensions()) - return list(base + fnext for base, fnext in pairs) - - def __get_output_extensions(self): - yield '.py' - yield '.pyc' - if self.get_finalized_command('build_py').optimize: - yield '.pyo' - - def write_stub(self, output_dir, ext, compile=False): - log.info("writing stub loader for %s to %s", ext._full_name, - output_dir) - stub_file = (os.path.join(output_dir, *ext._full_name.split('.')) + - '.py') - if compile and os.path.exists(stub_file): - raise DistutilsError(stub_file + " already exists! Please delete.") - if not self.dry_run: - f = open(stub_file, 'w') - f.write( - '\n'.join([ - "def __bootstrap__():", - " global __bootstrap__, __file__, __loader__", - " import sys, os, pkg_resources, imp" + if_dl(", dl"), - " __file__ = pkg_resources.resource_filename" - "(__name__,%r)" - % os.path.basename(ext._file_name), - " del __bootstrap__", - " if '__loader__' in globals():", - " del __loader__", - if_dl(" old_flags = sys.getdlopenflags()"), - " old_dir = os.getcwd()", - " try:", - " os.chdir(os.path.dirname(__file__))", - if_dl(" sys.setdlopenflags(dl.RTLD_NOW)"), - " imp.load_dynamic(__name__,__file__)", - " finally:", - if_dl(" sys.setdlopenflags(old_flags)"), - " os.chdir(old_dir)", - "__bootstrap__()", - "" # terminal \n - ]) - ) - f.close() - if compile: - from distutils.util import byte_compile - - byte_compile([stub_file], optimize=0, - force=True, dry_run=self.dry_run) - optimize = self.get_finalized_command('install_lib').optimize - if optimize > 0: - byte_compile([stub_file], optimize=optimize, - force=True, dry_run=self.dry_run) - if os.path.exists(stub_file) and not self.dry_run: - os.unlink(stub_file) - - -if use_stubs or os.name == 'nt': - # Build shared libraries - # - def link_shared_object( - self, objects, output_libname, output_dir=None, libraries=None, - library_dirs=None, runtime_library_dirs=None, export_symbols=None, - debug=0, extra_preargs=None, extra_postargs=None, build_temp=None, - target_lang=None): - self.link( - self.SHARED_LIBRARY, objects, output_libname, - output_dir, libraries, library_dirs, runtime_library_dirs, - export_symbols, debug, extra_preargs, extra_postargs, - build_temp, target_lang - ) -else: - # Build static libraries everywhere else - libtype = 'static' - - def link_shared_object( - self, objects, output_libname, output_dir=None, libraries=None, - library_dirs=None, runtime_library_dirs=None, export_symbols=None, - debug=0, extra_preargs=None, extra_postargs=None, build_temp=None, - target_lang=None): - # XXX we need to either disallow these attrs on Library instances, - # or warn/abort here if set, or something... - # libraries=None, library_dirs=None, runtime_library_dirs=None, - # export_symbols=None, extra_preargs=None, extra_postargs=None, - # build_temp=None - - assert output_dir is None # distutils build_ext doesn't pass this - output_dir, filename = os.path.split(output_libname) - basename, ext = os.path.splitext(filename) - if self.library_filename("x").startswith('lib'): - # strip 'lib' prefix; this is kludgy if some platform uses - # a different prefix - basename = basename[3:] - - self.create_static_lib( - objects, basename, output_dir, debug, target_lang - ) diff --git a/env/lib/python3.7/site-packages/setuptools/command/build_py.py b/env/lib/python3.7/site-packages/setuptools/command/build_py.py deleted file mode 100644 index b0314fd..0000000 --- a/env/lib/python3.7/site-packages/setuptools/command/build_py.py +++ /dev/null @@ -1,270 +0,0 @@ -from glob import glob -from distutils.util import convert_path -import distutils.command.build_py as orig -import os -import fnmatch -import textwrap -import io -import distutils.errors -import itertools - -from setuptools.extern import six -from setuptools.extern.six.moves import map, filter, filterfalse - -try: - from setuptools.lib2to3_ex import Mixin2to3 -except ImportError: - - class Mixin2to3: - def run_2to3(self, files, doctests=True): - "do nothing" - - -class build_py(orig.build_py, Mixin2to3): - """Enhanced 'build_py' command that includes data files with packages - - The data files are specified via a 'package_data' argument to 'setup()'. - See 'setuptools.dist.Distribution' for more details. - - Also, this version of the 'build_py' command allows you to specify both - 'py_modules' and 'packages' in the same setup operation. - """ - - def finalize_options(self): - orig.build_py.finalize_options(self) - self.package_data = self.distribution.package_data - self.exclude_package_data = (self.distribution.exclude_package_data or - {}) - if 'data_files' in self.__dict__: - del self.__dict__['data_files'] - self.__updated_files = [] - self.__doctests_2to3 = [] - - def run(self): - """Build modules, packages, and copy data files to build directory""" - if not self.py_modules and not self.packages: - return - - if self.py_modules: - self.build_modules() - - if self.packages: - self.build_packages() - self.build_package_data() - - self.run_2to3(self.__updated_files, False) - self.run_2to3(self.__updated_files, True) - self.run_2to3(self.__doctests_2to3, True) - - # Only compile actual .py files, using our base class' idea of what our - # output files are. - self.byte_compile(orig.build_py.get_outputs(self, include_bytecode=0)) - - def __getattr__(self, attr): - "lazily compute data files" - if attr == 'data_files': - self.data_files = self._get_data_files() - return self.data_files - return orig.build_py.__getattr__(self, attr) - - def build_module(self, module, module_file, package): - if six.PY2 and isinstance(package, six.string_types): - # avoid errors on Python 2 when unicode is passed (#190) - package = package.split('.') - outfile, copied = orig.build_py.build_module(self, module, module_file, - package) - if copied: - self.__updated_files.append(outfile) - return outfile, copied - - def _get_data_files(self): - """Generate list of '(package,src_dir,build_dir,filenames)' tuples""" - self.analyze_manifest() - return list(map(self._get_pkg_data_files, self.packages or ())) - - def _get_pkg_data_files(self, package): - # Locate package source directory - src_dir = self.get_package_dir(package) - - # Compute package build directory - build_dir = os.path.join(*([self.build_lib] + package.split('.'))) - - # Strip directory from globbed filenames - filenames = [ - os.path.relpath(file, src_dir) - for file in self.find_data_files(package, src_dir) - ] - return package, src_dir, build_dir, filenames - - def find_data_files(self, package, src_dir): - """Return filenames for package's data files in 'src_dir'""" - patterns = self._get_platform_patterns( - self.package_data, - package, - src_dir, - ) - globs_expanded = map(glob, patterns) - # flatten the expanded globs into an iterable of matches - globs_matches = itertools.chain.from_iterable(globs_expanded) - glob_files = filter(os.path.isfile, globs_matches) - files = itertools.chain( - self.manifest_files.get(package, []), - glob_files, - ) - return self.exclude_data_files(package, src_dir, files) - - def build_package_data(self): - """Copy data files into build directory""" - for package, src_dir, build_dir, filenames in self.data_files: - for filename in filenames: - target = os.path.join(build_dir, filename) - self.mkpath(os.path.dirname(target)) - srcfile = os.path.join(src_dir, filename) - outf, copied = self.copy_file(srcfile, target) - srcfile = os.path.abspath(srcfile) - if (copied and - srcfile in self.distribution.convert_2to3_doctests): - self.__doctests_2to3.append(outf) - - def analyze_manifest(self): - self.manifest_files = mf = {} - if not self.distribution.include_package_data: - return - src_dirs = {} - for package in self.packages or (): - # Locate package source directory - src_dirs[assert_relative(self.get_package_dir(package))] = package - - self.run_command('egg_info') - ei_cmd = self.get_finalized_command('egg_info') - for path in ei_cmd.filelist.files: - d, f = os.path.split(assert_relative(path)) - prev = None - oldf = f - while d and d != prev and d not in src_dirs: - prev = d - d, df = os.path.split(d) - f = os.path.join(df, f) - if d in src_dirs: - if path.endswith('.py') and f == oldf: - continue # it's a module, not data - mf.setdefault(src_dirs[d], []).append(path) - - def get_data_files(self): - pass # Lazily compute data files in _get_data_files() function. - - def check_package(self, package, package_dir): - """Check namespace packages' __init__ for declare_namespace""" - try: - return self.packages_checked[package] - except KeyError: - pass - - init_py = orig.build_py.check_package(self, package, package_dir) - self.packages_checked[package] = init_py - - if not init_py or not self.distribution.namespace_packages: - return init_py - - for pkg in self.distribution.namespace_packages: - if pkg == package or pkg.startswith(package + '.'): - break - else: - return init_py - - with io.open(init_py, 'rb') as f: - contents = f.read() - if b'declare_namespace' not in contents: - raise distutils.errors.DistutilsError( - "Namespace package problem: %s is a namespace package, but " - "its\n__init__.py does not call declare_namespace()! Please " - 'fix it.\n(See the setuptools manual under ' - '"Namespace Packages" for details.)\n"' % (package,) - ) - return init_py - - def initialize_options(self): - self.packages_checked = {} - orig.build_py.initialize_options(self) - - def get_package_dir(self, package): - res = orig.build_py.get_package_dir(self, package) - if self.distribution.src_root is not None: - return os.path.join(self.distribution.src_root, res) - return res - - def exclude_data_files(self, package, src_dir, files): - """Filter filenames for package's data files in 'src_dir'""" - files = list(files) - patterns = self._get_platform_patterns( - self.exclude_package_data, - package, - src_dir, - ) - match_groups = ( - fnmatch.filter(files, pattern) - for pattern in patterns - ) - # flatten the groups of matches into an iterable of matches - matches = itertools.chain.from_iterable(match_groups) - bad = set(matches) - keepers = ( - fn - for fn in files - if fn not in bad - ) - # ditch dupes - return list(_unique_everseen(keepers)) - - @staticmethod - def _get_platform_patterns(spec, package, src_dir): - """ - yield platform-specific path patterns (suitable for glob - or fn_match) from a glob-based spec (such as - self.package_data or self.exclude_package_data) - matching package in src_dir. - """ - raw_patterns = itertools.chain( - spec.get('', []), - spec.get(package, []), - ) - return ( - # Each pattern has to be converted to a platform-specific path - os.path.join(src_dir, convert_path(pattern)) - for pattern in raw_patterns - ) - - -# from Python docs -def _unique_everseen(iterable, key=None): - "List unique elements, preserving order. Remember all elements ever seen." - # unique_everseen('AAAABBBCCDAABBB') --> A B C D - # unique_everseen('ABBCcAD', str.lower) --> A B C D - seen = set() - seen_add = seen.add - if key is None: - for element in filterfalse(seen.__contains__, iterable): - seen_add(element) - yield element - else: - for element in iterable: - k = key(element) - if k not in seen: - seen_add(k) - yield element - - -def assert_relative(path): - if not os.path.isabs(path): - return path - from distutils.errors import DistutilsSetupError - - msg = textwrap.dedent(""" - Error: setup script specifies an absolute path: - - %s - - setup() arguments must *always* be /-separated paths relative to the - setup.py directory, *never* absolute paths. - """).lstrip() % path - raise DistutilsSetupError(msg) diff --git a/env/lib/python3.7/site-packages/setuptools/command/develop.py b/env/lib/python3.7/site-packages/setuptools/command/develop.py deleted file mode 100644 index 009e4f9..0000000 --- a/env/lib/python3.7/site-packages/setuptools/command/develop.py +++ /dev/null @@ -1,221 +0,0 @@ -from distutils.util import convert_path -from distutils import log -from distutils.errors import DistutilsError, DistutilsOptionError -import os -import glob -import io - -from setuptools.extern import six - -import pkg_resources -from setuptools.command.easy_install import easy_install -from setuptools import namespaces -import setuptools - -__metaclass__ = type - - -class develop(namespaces.DevelopInstaller, easy_install): - """Set up package for development""" - - description = "install package in 'development mode'" - - user_options = easy_install.user_options + [ - ("uninstall", "u", "Uninstall this source package"), - ("egg-path=", None, "Set the path to be used in the .egg-link file"), - ] - - boolean_options = easy_install.boolean_options + ['uninstall'] - - command_consumes_arguments = False # override base - - def run(self): - if self.uninstall: - self.multi_version = True - self.uninstall_link() - self.uninstall_namespaces() - else: - self.install_for_development() - self.warn_deprecated_options() - - def initialize_options(self): - self.uninstall = None - self.egg_path = None - easy_install.initialize_options(self) - self.setup_path = None - self.always_copy_from = '.' # always copy eggs installed in curdir - - def finalize_options(self): - ei = self.get_finalized_command("egg_info") - if ei.broken_egg_info: - template = "Please rename %r to %r before using 'develop'" - args = ei.egg_info, ei.broken_egg_info - raise DistutilsError(template % args) - self.args = [ei.egg_name] - - easy_install.finalize_options(self) - self.expand_basedirs() - self.expand_dirs() - # pick up setup-dir .egg files only: no .egg-info - self.package_index.scan(glob.glob('*.egg')) - - egg_link_fn = ei.egg_name + '.egg-link' - self.egg_link = os.path.join(self.install_dir, egg_link_fn) - self.egg_base = ei.egg_base - if self.egg_path is None: - self.egg_path = os.path.abspath(ei.egg_base) - - target = pkg_resources.normalize_path(self.egg_base) - egg_path = pkg_resources.normalize_path( - os.path.join(self.install_dir, self.egg_path)) - if egg_path != target: - raise DistutilsOptionError( - "--egg-path must be a relative path from the install" - " directory to " + target - ) - - # Make a distribution for the package's source - self.dist = pkg_resources.Distribution( - target, - pkg_resources.PathMetadata(target, os.path.abspath(ei.egg_info)), - project_name=ei.egg_name - ) - - self.setup_path = self._resolve_setup_path( - self.egg_base, - self.install_dir, - self.egg_path, - ) - - @staticmethod - def _resolve_setup_path(egg_base, install_dir, egg_path): - """ - Generate a path from egg_base back to '.' where the - setup script resides and ensure that path points to the - setup path from $install_dir/$egg_path. - """ - path_to_setup = egg_base.replace(os.sep, '/').rstrip('/') - if path_to_setup != os.curdir: - path_to_setup = '../' * (path_to_setup.count('/') + 1) - resolved = pkg_resources.normalize_path( - os.path.join(install_dir, egg_path, path_to_setup) - ) - if resolved != pkg_resources.normalize_path(os.curdir): - raise DistutilsOptionError( - "Can't get a consistent path to setup script from" - " installation directory", resolved, - pkg_resources.normalize_path(os.curdir)) - return path_to_setup - - def install_for_development(self): - if six.PY3 and getattr(self.distribution, 'use_2to3', False): - # If we run 2to3 we can not do this inplace: - - # Ensure metadata is up-to-date - self.reinitialize_command('build_py', inplace=0) - self.run_command('build_py') - bpy_cmd = self.get_finalized_command("build_py") - build_path = pkg_resources.normalize_path(bpy_cmd.build_lib) - - # Build extensions - self.reinitialize_command('egg_info', egg_base=build_path) - self.run_command('egg_info') - - self.reinitialize_command('build_ext', inplace=0) - self.run_command('build_ext') - - # Fixup egg-link and easy-install.pth - ei_cmd = self.get_finalized_command("egg_info") - self.egg_path = build_path - self.dist.location = build_path - # XXX - self.dist._provider = pkg_resources.PathMetadata( - build_path, ei_cmd.egg_info) - else: - # Without 2to3 inplace works fine: - self.run_command('egg_info') - - # Build extensions in-place - self.reinitialize_command('build_ext', inplace=1) - self.run_command('build_ext') - - self.install_site_py() # ensure that target dir is site-safe - if setuptools.bootstrap_install_from: - self.easy_install(setuptools.bootstrap_install_from) - setuptools.bootstrap_install_from = None - - self.install_namespaces() - - # create an .egg-link in the installation dir, pointing to our egg - log.info("Creating %s (link to %s)", self.egg_link, self.egg_base) - if not self.dry_run: - with open(self.egg_link, "w") as f: - f.write(self.egg_path + "\n" + self.setup_path) - # postprocess the installed distro, fixing up .pth, installing scripts, - # and handling requirements - self.process_distribution(None, self.dist, not self.no_deps) - - def uninstall_link(self): - if os.path.exists(self.egg_link): - log.info("Removing %s (link to %s)", self.egg_link, self.egg_base) - egg_link_file = open(self.egg_link) - contents = [line.rstrip() for line in egg_link_file] - egg_link_file.close() - if contents not in ([self.egg_path], - [self.egg_path, self.setup_path]): - log.warn("Link points to %s: uninstall aborted", contents) - return - if not self.dry_run: - os.unlink(self.egg_link) - if not self.dry_run: - self.update_pth(self.dist) # remove any .pth link to us - if self.distribution.scripts: - # XXX should also check for entry point scripts! - log.warn("Note: you must uninstall or replace scripts manually!") - - def install_egg_scripts(self, dist): - if dist is not self.dist: - # Installing a dependency, so fall back to normal behavior - return easy_install.install_egg_scripts(self, dist) - - # create wrapper scripts in the script dir, pointing to dist.scripts - - # new-style... - self.install_wrapper_scripts(dist) - - # ...and old-style - for script_name in self.distribution.scripts or []: - script_path = os.path.abspath(convert_path(script_name)) - script_name = os.path.basename(script_path) - with io.open(script_path) as strm: - script_text = strm.read() - self.install_script(dist, script_name, script_text, script_path) - - def install_wrapper_scripts(self, dist): - dist = VersionlessRequirement(dist) - return easy_install.install_wrapper_scripts(self, dist) - - -class VersionlessRequirement: - """ - Adapt a pkg_resources.Distribution to simply return the project - name as the 'requirement' so that scripts will work across - multiple versions. - - >>> from pkg_resources import Distribution - >>> dist = Distribution(project_name='foo', version='1.0') - >>> str(dist.as_requirement()) - 'foo==1.0' - >>> adapted_dist = VersionlessRequirement(dist) - >>> str(adapted_dist.as_requirement()) - 'foo' - """ - - def __init__(self, dist): - self.__dist = dist - - def __getattr__(self, name): - return getattr(self.__dist, name) - - def as_requirement(self): - return self.project_name diff --git a/env/lib/python3.7/site-packages/setuptools/command/dist_info.py b/env/lib/python3.7/site-packages/setuptools/command/dist_info.py deleted file mode 100644 index c45258f..0000000 --- a/env/lib/python3.7/site-packages/setuptools/command/dist_info.py +++ /dev/null @@ -1,36 +0,0 @@ -""" -Create a dist_info directory -As defined in the wheel specification -""" - -import os - -from distutils.core import Command -from distutils import log - - -class dist_info(Command): - - description = 'create a .dist-info directory' - - user_options = [ - ('egg-base=', 'e', "directory containing .egg-info directories" - " (default: top of the source tree)"), - ] - - def initialize_options(self): - self.egg_base = None - - def finalize_options(self): - pass - - def run(self): - egg_info = self.get_finalized_command('egg_info') - egg_info.egg_base = self.egg_base - egg_info.finalize_options() - egg_info.run() - dist_info_dir = egg_info.egg_info[:-len('.egg-info')] + '.dist-info' - log.info("creating '{}'".format(os.path.abspath(dist_info_dir))) - - bdist_wheel = self.get_finalized_command('bdist_wheel') - bdist_wheel.egg2dist(egg_info.egg_info, dist_info_dir) diff --git a/env/lib/python3.7/site-packages/setuptools/command/easy_install.py b/env/lib/python3.7/site-packages/setuptools/command/easy_install.py deleted file mode 100644 index 06c9827..0000000 --- a/env/lib/python3.7/site-packages/setuptools/command/easy_install.py +++ /dev/null @@ -1,2342 +0,0 @@ -#!/usr/bin/env python -""" -Easy Install ------------- - -A tool for doing automatic download/extract/build of distutils-based Python -packages. For detailed documentation, see the accompanying EasyInstall.txt -file, or visit the `EasyInstall home page`__. - -__ https://setuptools.readthedocs.io/en/latest/easy_install.html - -""" - -from glob import glob -from distutils.util import get_platform -from distutils.util import convert_path, subst_vars -from distutils.errors import ( - DistutilsArgError, DistutilsOptionError, - DistutilsError, DistutilsPlatformError, -) -from distutils.command.install import INSTALL_SCHEMES, SCHEME_KEYS -from distutils import log, dir_util -from distutils.command.build_scripts import first_line_re -from distutils.spawn import find_executable -import sys -import os -import zipimport -import shutil -import tempfile -import zipfile -import re -import stat -import random -import textwrap -import warnings -import site -import struct -import contextlib -import subprocess -import shlex -import io - - -from sysconfig import get_config_vars, get_path - -from setuptools import SetuptoolsDeprecationWarning - -from setuptools.extern import six -from setuptools.extern.six.moves import configparser, map - -from setuptools import Command -from setuptools.sandbox import run_setup -from setuptools.py27compat import rmtree_safe -from setuptools.command import setopt -from setuptools.archive_util import unpack_archive -from setuptools.package_index import ( - PackageIndex, parse_requirement_arg, URL_SCHEME, -) -from setuptools.command import bdist_egg, egg_info -from setuptools.wheel import Wheel -from pkg_resources import ( - yield_lines, normalize_path, resource_string, ensure_directory, - get_distribution, find_distributions, Environment, Requirement, - Distribution, PathMetadata, EggMetadata, WorkingSet, DistributionNotFound, - VersionConflict, DEVELOP_DIST, -) -import pkg_resources.py31compat - -__metaclass__ = type - -# Turn on PEP440Warnings -warnings.filterwarnings("default", category=pkg_resources.PEP440Warning) - -__all__ = [ - 'samefile', 'easy_install', 'PthDistributions', 'extract_wininst_cfg', - 'main', 'get_exe_prefixes', -] - - -def is_64bit(): - return struct.calcsize("P") == 8 - - -def samefile(p1, p2): - """ - Determine if two paths reference the same file. - - Augments os.path.samefile to work on Windows and - suppresses errors if the path doesn't exist. - """ - both_exist = os.path.exists(p1) and os.path.exists(p2) - use_samefile = hasattr(os.path, 'samefile') and both_exist - if use_samefile: - return os.path.samefile(p1, p2) - norm_p1 = os.path.normpath(os.path.normcase(p1)) - norm_p2 = os.path.normpath(os.path.normcase(p2)) - return norm_p1 == norm_p2 - - -if six.PY2: - - def _to_bytes(s): - return s - - def isascii(s): - try: - six.text_type(s, 'ascii') - return True - except UnicodeError: - return False -else: - - def _to_bytes(s): - return s.encode('utf8') - - def isascii(s): - try: - s.encode('ascii') - return True - except UnicodeError: - return False - - -_one_liner = lambda text: textwrap.dedent(text).strip().replace('\n', '; ') - - -class easy_install(Command): - """Manage a download/build/install process""" - description = "Find/get/install Python packages" - command_consumes_arguments = True - - user_options = [ - ('prefix=', None, "installation prefix"), - ("zip-ok", "z", "install package as a zipfile"), - ("multi-version", "m", "make apps have to require() a version"), - ("upgrade", "U", "force upgrade (searches PyPI for latest versions)"), - ("install-dir=", "d", "install package to DIR"), - ("script-dir=", "s", "install scripts to DIR"), - ("exclude-scripts", "x", "Don't install scripts"), - ("always-copy", "a", "Copy all needed packages to install dir"), - ("index-url=", "i", "base URL of Python Package Index"), - ("find-links=", "f", "additional URL(s) to search for packages"), - ("build-directory=", "b", - "download/extract/build in DIR; keep the results"), - ('optimize=', 'O', - "also compile with optimization: -O1 for \"python -O\", " - "-O2 for \"python -OO\", and -O0 to disable [default: -O0]"), - ('record=', None, - "filename in which to record list of installed files"), - ('always-unzip', 'Z', "don't install as a zipfile, no matter what"), - ('site-dirs=', 'S', "list of directories where .pth files work"), - ('editable', 'e', "Install specified packages in editable form"), - ('no-deps', 'N', "don't install dependencies"), - ('allow-hosts=', 'H', "pattern(s) that hostnames must match"), - ('local-snapshots-ok', 'l', - "allow building eggs from local checkouts"), - ('version', None, "print version information and exit"), - ('no-find-links', None, - "Don't load find-links defined in packages being installed") - ] - boolean_options = [ - 'zip-ok', 'multi-version', 'exclude-scripts', 'upgrade', 'always-copy', - 'editable', - 'no-deps', 'local-snapshots-ok', 'version' - ] - - if site.ENABLE_USER_SITE: - help_msg = "install in user site-package '%s'" % site.USER_SITE - user_options.append(('user', None, help_msg)) - boolean_options.append('user') - - negative_opt = {'always-unzip': 'zip-ok'} - create_index = PackageIndex - - def initialize_options(self): - # the --user option seems to be an opt-in one, - # so the default should be False. - self.user = 0 - self.zip_ok = self.local_snapshots_ok = None - self.install_dir = self.script_dir = self.exclude_scripts = None - self.index_url = None - self.find_links = None - self.build_directory = None - self.args = None - self.optimize = self.record = None - self.upgrade = self.always_copy = self.multi_version = None - self.editable = self.no_deps = self.allow_hosts = None - self.root = self.prefix = self.no_report = None - self.version = None - self.install_purelib = None # for pure module distributions - self.install_platlib = None # non-pure (dists w/ extensions) - self.install_headers = None # for C/C++ headers - self.install_lib = None # set to either purelib or platlib - self.install_scripts = None - self.install_data = None - self.install_base = None - self.install_platbase = None - if site.ENABLE_USER_SITE: - self.install_userbase = site.USER_BASE - self.install_usersite = site.USER_SITE - else: - self.install_userbase = None - self.install_usersite = None - self.no_find_links = None - - # Options not specifiable via command line - self.package_index = None - self.pth_file = self.always_copy_from = None - self.site_dirs = None - self.installed_projects = {} - self.sitepy_installed = False - # Always read easy_install options, even if we are subclassed, or have - # an independent instance created. This ensures that defaults will - # always come from the standard configuration file(s)' "easy_install" - # section, even if this is a "develop" or "install" command, or some - # other embedding. - self._dry_run = None - self.verbose = self.distribution.verbose - self.distribution._set_command_options( - self, self.distribution.get_option_dict('easy_install') - ) - - def delete_blockers(self, blockers): - extant_blockers = ( - filename for filename in blockers - if os.path.exists(filename) or os.path.islink(filename) - ) - list(map(self._delete_path, extant_blockers)) - - def _delete_path(self, path): - log.info("Deleting %s", path) - if self.dry_run: - return - - is_tree = os.path.isdir(path) and not os.path.islink(path) - remover = rmtree if is_tree else os.unlink - remover(path) - - @staticmethod - def _render_version(): - """ - Render the Setuptools version and installation details, then exit. - """ - ver = sys.version[:3] - dist = get_distribution('setuptools') - tmpl = 'setuptools {dist.version} from {dist.location} (Python {ver})' - print(tmpl.format(**locals())) - raise SystemExit() - - def finalize_options(self): - self.version and self._render_version() - - py_version = sys.version.split()[0] - prefix, exec_prefix = get_config_vars('prefix', 'exec_prefix') - - self.config_vars = { - 'dist_name': self.distribution.get_name(), - 'dist_version': self.distribution.get_version(), - 'dist_fullname': self.distribution.get_fullname(), - 'py_version': py_version, - 'py_version_short': py_version[0:3], - 'py_version_nodot': py_version[0] + py_version[2], - 'sys_prefix': prefix, - 'prefix': prefix, - 'sys_exec_prefix': exec_prefix, - 'exec_prefix': exec_prefix, - # Only python 3.2+ has abiflags - 'abiflags': getattr(sys, 'abiflags', ''), - } - - if site.ENABLE_USER_SITE: - self.config_vars['userbase'] = self.install_userbase - self.config_vars['usersite'] = self.install_usersite - - self._fix_install_dir_for_user_site() - - self.expand_basedirs() - self.expand_dirs() - - self._expand( - 'install_dir', 'script_dir', 'build_directory', - 'site_dirs', - ) - # If a non-default installation directory was specified, default the - # script directory to match it. - if self.script_dir is None: - self.script_dir = self.install_dir - - if self.no_find_links is None: - self.no_find_links = False - - # Let install_dir get set by install_lib command, which in turn - # gets its info from the install command, and takes into account - # --prefix and --home and all that other crud. - self.set_undefined_options( - 'install_lib', ('install_dir', 'install_dir') - ) - # Likewise, set default script_dir from 'install_scripts.install_dir' - self.set_undefined_options( - 'install_scripts', ('install_dir', 'script_dir') - ) - - if self.user and self.install_purelib: - self.install_dir = self.install_purelib - self.script_dir = self.install_scripts - # default --record from the install command - self.set_undefined_options('install', ('record', 'record')) - # Should this be moved to the if statement below? It's not used - # elsewhere - normpath = map(normalize_path, sys.path) - self.all_site_dirs = get_site_dirs() - if self.site_dirs is not None: - site_dirs = [ - os.path.expanduser(s.strip()) for s in - self.site_dirs.split(',') - ] - for d in site_dirs: - if not os.path.isdir(d): - log.warn("%s (in --site-dirs) does not exist", d) - elif normalize_path(d) not in normpath: - raise DistutilsOptionError( - d + " (in --site-dirs) is not on sys.path" - ) - else: - self.all_site_dirs.append(normalize_path(d)) - if not self.editable: - self.check_site_dir() - self.index_url = self.index_url or "https://pypi.org/simple/" - self.shadow_path = self.all_site_dirs[:] - for path_item in self.install_dir, normalize_path(self.script_dir): - if path_item not in self.shadow_path: - self.shadow_path.insert(0, path_item) - - if self.allow_hosts is not None: - hosts = [s.strip() for s in self.allow_hosts.split(',')] - else: - hosts = ['*'] - if self.package_index is None: - self.package_index = self.create_index( - self.index_url, search_path=self.shadow_path, hosts=hosts, - ) - self.local_index = Environment(self.shadow_path + sys.path) - - if self.find_links is not None: - if isinstance(self.find_links, six.string_types): - self.find_links = self.find_links.split() - else: - self.find_links = [] - if self.local_snapshots_ok: - self.package_index.scan_egg_links(self.shadow_path + sys.path) - if not self.no_find_links: - self.package_index.add_find_links(self.find_links) - self.set_undefined_options('install_lib', ('optimize', 'optimize')) - if not isinstance(self.optimize, int): - try: - self.optimize = int(self.optimize) - if not (0 <= self.optimize <= 2): - raise ValueError - except ValueError: - raise DistutilsOptionError("--optimize must be 0, 1, or 2") - - if self.editable and not self.build_directory: - raise DistutilsArgError( - "Must specify a build directory (-b) when using --editable" - ) - if not self.args: - raise DistutilsArgError( - "No urls, filenames, or requirements specified (see --help)") - - self.outputs = [] - - def _fix_install_dir_for_user_site(self): - """ - Fix the install_dir if "--user" was used. - """ - if not self.user or not site.ENABLE_USER_SITE: - return - - self.create_home_path() - if self.install_userbase is None: - msg = "User base directory is not specified" - raise DistutilsPlatformError(msg) - self.install_base = self.install_platbase = self.install_userbase - scheme_name = os.name.replace('posix', 'unix') + '_user' - self.select_scheme(scheme_name) - - def _expand_attrs(self, attrs): - for attr in attrs: - val = getattr(self, attr) - if val is not None: - if os.name == 'posix' or os.name == 'nt': - val = os.path.expanduser(val) - val = subst_vars(val, self.config_vars) - setattr(self, attr, val) - - def expand_basedirs(self): - """Calls `os.path.expanduser` on install_base, install_platbase and - root.""" - self._expand_attrs(['install_base', 'install_platbase', 'root']) - - def expand_dirs(self): - """Calls `os.path.expanduser` on install dirs.""" - dirs = [ - 'install_purelib', - 'install_platlib', - 'install_lib', - 'install_headers', - 'install_scripts', - 'install_data', - ] - self._expand_attrs(dirs) - - def run(self): - if self.verbose != self.distribution.verbose: - log.set_verbosity(self.verbose) - try: - for spec in self.args: - self.easy_install(spec, not self.no_deps) - if self.record: - outputs = self.outputs - if self.root: # strip any package prefix - root_len = len(self.root) - for counter in range(len(outputs)): - outputs[counter] = outputs[counter][root_len:] - from distutils import file_util - - self.execute( - file_util.write_file, (self.record, outputs), - "writing list of installed files to '%s'" % - self.record - ) - self.warn_deprecated_options() - finally: - log.set_verbosity(self.distribution.verbose) - - def pseudo_tempname(self): - """Return a pseudo-tempname base in the install directory. - This code is intentionally naive; if a malicious party can write to - the target directory you're already in deep doodoo. - """ - try: - pid = os.getpid() - except Exception: - pid = random.randint(0, sys.maxsize) - return os.path.join(self.install_dir, "test-easy-install-%s" % pid) - - def warn_deprecated_options(self): - pass - - def check_site_dir(self): - """Verify that self.install_dir is .pth-capable dir, if needed""" - - instdir = normalize_path(self.install_dir) - pth_file = os.path.join(instdir, 'easy-install.pth') - - # Is it a configured, PYTHONPATH, implicit, or explicit site dir? - is_site_dir = instdir in self.all_site_dirs - - if not is_site_dir and not self.multi_version: - # No? Then directly test whether it does .pth file processing - is_site_dir = self.check_pth_processing() - else: - # make sure we can write to target dir - testfile = self.pseudo_tempname() + '.write-test' - test_exists = os.path.exists(testfile) - try: - if test_exists: - os.unlink(testfile) - open(testfile, 'w').close() - os.unlink(testfile) - except (OSError, IOError): - self.cant_write_to_target() - - if not is_site_dir and not self.multi_version: - # Can't install non-multi to non-site dir - raise DistutilsError(self.no_default_version_msg()) - - if is_site_dir: - if self.pth_file is None: - self.pth_file = PthDistributions(pth_file, self.all_site_dirs) - else: - self.pth_file = None - - if instdir not in map(normalize_path, _pythonpath()): - # only PYTHONPATH dirs need a site.py, so pretend it's there - self.sitepy_installed = True - elif self.multi_version and not os.path.exists(pth_file): - self.sitepy_installed = True # don't need site.py in this case - self.pth_file = None # and don't create a .pth file - self.install_dir = instdir - - __cant_write_msg = textwrap.dedent(""" - can't create or remove files in install directory - - The following error occurred while trying to add or remove files in the - installation directory: - - %s - - The installation directory you specified (via --install-dir, --prefix, or - the distutils default setting) was: - - %s - """).lstrip() - - __not_exists_id = textwrap.dedent(""" - This directory does not currently exist. Please create it and try again, or - choose a different installation directory (using the -d or --install-dir - option). - """).lstrip() - - __access_msg = textwrap.dedent(""" - Perhaps your account does not have write access to this directory? If the - installation directory is a system-owned directory, you may need to sign in - as the administrator or "root" account. If you do not have administrative - access to this machine, you may wish to choose a different installation - directory, preferably one that is listed in your PYTHONPATH environment - variable. - - For information on other options, you may wish to consult the - documentation at: - - https://setuptools.readthedocs.io/en/latest/easy_install.html - - Please make the appropriate changes for your system and try again. - """).lstrip() - - def cant_write_to_target(self): - msg = self.__cant_write_msg % (sys.exc_info()[1], self.install_dir,) - - if not os.path.exists(self.install_dir): - msg += '\n' + self.__not_exists_id - else: - msg += '\n' + self.__access_msg - raise DistutilsError(msg) - - def check_pth_processing(self): - """Empirically verify whether .pth files are supported in inst. dir""" - instdir = self.install_dir - log.info("Checking .pth file support in %s", instdir) - pth_file = self.pseudo_tempname() + ".pth" - ok_file = pth_file + '.ok' - ok_exists = os.path.exists(ok_file) - tmpl = _one_liner(""" - import os - f = open({ok_file!r}, 'w') - f.write('OK') - f.close() - """) + '\n' - try: - if ok_exists: - os.unlink(ok_file) - dirname = os.path.dirname(ok_file) - pkg_resources.py31compat.makedirs(dirname, exist_ok=True) - f = open(pth_file, 'w') - except (OSError, IOError): - self.cant_write_to_target() - else: - try: - f.write(tmpl.format(**locals())) - f.close() - f = None - executable = sys.executable - if os.name == 'nt': - dirname, basename = os.path.split(executable) - alt = os.path.join(dirname, 'pythonw.exe') - use_alt = ( - basename.lower() == 'python.exe' and - os.path.exists(alt) - ) - if use_alt: - # use pythonw.exe to avoid opening a console window - executable = alt - - from distutils.spawn import spawn - - spawn([executable, '-E', '-c', 'pass'], 0) - - if os.path.exists(ok_file): - log.info( - "TEST PASSED: %s appears to support .pth files", - instdir - ) - return True - finally: - if f: - f.close() - if os.path.exists(ok_file): - os.unlink(ok_file) - if os.path.exists(pth_file): - os.unlink(pth_file) - if not self.multi_version: - log.warn("TEST FAILED: %s does NOT support .pth files", instdir) - return False - - def install_egg_scripts(self, dist): - """Write all the scripts for `dist`, unless scripts are excluded""" - if not self.exclude_scripts and dist.metadata_isdir('scripts'): - for script_name in dist.metadata_listdir('scripts'): - if dist.metadata_isdir('scripts/' + script_name): - # The "script" is a directory, likely a Python 3 - # __pycache__ directory, so skip it. - continue - self.install_script( - dist, script_name, - dist.get_metadata('scripts/' + script_name) - ) - self.install_wrapper_scripts(dist) - - def add_output(self, path): - if os.path.isdir(path): - for base, dirs, files in os.walk(path): - for filename in files: - self.outputs.append(os.path.join(base, filename)) - else: - self.outputs.append(path) - - def not_editable(self, spec): - if self.editable: - raise DistutilsArgError( - "Invalid argument %r: you can't use filenames or URLs " - "with --editable (except via the --find-links option)." - % (spec,) - ) - - def check_editable(self, spec): - if not self.editable: - return - - if os.path.exists(os.path.join(self.build_directory, spec.key)): - raise DistutilsArgError( - "%r already exists in %s; can't do a checkout there" % - (spec.key, self.build_directory) - ) - - @contextlib.contextmanager - def _tmpdir(self): - tmpdir = tempfile.mkdtemp(prefix=u"easy_install-") - try: - # cast to str as workaround for #709 and #710 and #712 - yield str(tmpdir) - finally: - os.path.exists(tmpdir) and rmtree(rmtree_safe(tmpdir)) - - def easy_install(self, spec, deps=False): - if not self.editable: - self.install_site_py() - - with self._tmpdir() as tmpdir: - if not isinstance(spec, Requirement): - if URL_SCHEME(spec): - # It's a url, download it to tmpdir and process - self.not_editable(spec) - dl = self.package_index.download(spec, tmpdir) - return self.install_item(None, dl, tmpdir, deps, True) - - elif os.path.exists(spec): - # Existing file or directory, just process it directly - self.not_editable(spec) - return self.install_item(None, spec, tmpdir, deps, True) - else: - spec = parse_requirement_arg(spec) - - self.check_editable(spec) - dist = self.package_index.fetch_distribution( - spec, tmpdir, self.upgrade, self.editable, - not self.always_copy, self.local_index - ) - if dist is None: - msg = "Could not find suitable distribution for %r" % spec - if self.always_copy: - msg += " (--always-copy skips system and development eggs)" - raise DistutilsError(msg) - elif dist.precedence == DEVELOP_DIST: - # .egg-info dists don't need installing, just process deps - self.process_distribution(spec, dist, deps, "Using") - return dist - else: - return self.install_item(spec, dist.location, tmpdir, deps) - - def install_item(self, spec, download, tmpdir, deps, install_needed=False): - - # Installation is also needed if file in tmpdir or is not an egg - install_needed = install_needed or self.always_copy - install_needed = install_needed or os.path.dirname(download) == tmpdir - install_needed = install_needed or not download.endswith('.egg') - install_needed = install_needed or ( - self.always_copy_from is not None and - os.path.dirname(normalize_path(download)) == - normalize_path(self.always_copy_from) - ) - - if spec and not install_needed: - # at this point, we know it's a local .egg, we just don't know if - # it's already installed. - for dist in self.local_index[spec.project_name]: - if dist.location == download: - break - else: - install_needed = True # it's not in the local index - - log.info("Processing %s", os.path.basename(download)) - - if install_needed: - dists = self.install_eggs(spec, download, tmpdir) - for dist in dists: - self.process_distribution(spec, dist, deps) - else: - dists = [self.egg_distribution(download)] - self.process_distribution(spec, dists[0], deps, "Using") - - if spec is not None: - for dist in dists: - if dist in spec: - return dist - - def select_scheme(self, name): - """Sets the install directories by applying the install schemes.""" - # it's the caller's problem if they supply a bad name! - scheme = INSTALL_SCHEMES[name] - for key in SCHEME_KEYS: - attrname = 'install_' + key - if getattr(self, attrname) is None: - setattr(self, attrname, scheme[key]) - - def process_distribution(self, requirement, dist, deps=True, *info): - self.update_pth(dist) - self.package_index.add(dist) - if dist in self.local_index[dist.key]: - self.local_index.remove(dist) - self.local_index.add(dist) - self.install_egg_scripts(dist) - self.installed_projects[dist.key] = dist - log.info(self.installation_report(requirement, dist, *info)) - if (dist.has_metadata('dependency_links.txt') and - not self.no_find_links): - self.package_index.add_find_links( - dist.get_metadata_lines('dependency_links.txt') - ) - if not deps and not self.always_copy: - return - elif requirement is not None and dist.key != requirement.key: - log.warn("Skipping dependencies for %s", dist) - return # XXX this is not the distribution we were looking for - elif requirement is None or dist not in requirement: - # if we wound up with a different version, resolve what we've got - distreq = dist.as_requirement() - requirement = Requirement(str(distreq)) - log.info("Processing dependencies for %s", requirement) - try: - distros = WorkingSet([]).resolve( - [requirement], self.local_index, self.easy_install - ) - except DistributionNotFound as e: - raise DistutilsError(str(e)) - except VersionConflict as e: - raise DistutilsError(e.report()) - if self.always_copy or self.always_copy_from: - # Force all the relevant distros to be copied or activated - for dist in distros: - if dist.key not in self.installed_projects: - self.easy_install(dist.as_requirement()) - log.info("Finished processing dependencies for %s", requirement) - - def should_unzip(self, dist): - if self.zip_ok is not None: - return not self.zip_ok - if dist.has_metadata('not-zip-safe'): - return True - if not dist.has_metadata('zip-safe'): - return True - return False - - def maybe_move(self, spec, dist_filename, setup_base): - dst = os.path.join(self.build_directory, spec.key) - if os.path.exists(dst): - msg = ( - "%r already exists in %s; build directory %s will not be kept" - ) - log.warn(msg, spec.key, self.build_directory, setup_base) - return setup_base - if os.path.isdir(dist_filename): - setup_base = dist_filename - else: - if os.path.dirname(dist_filename) == setup_base: - os.unlink(dist_filename) # get it out of the tmp dir - contents = os.listdir(setup_base) - if len(contents) == 1: - dist_filename = os.path.join(setup_base, contents[0]) - if os.path.isdir(dist_filename): - # if the only thing there is a directory, move it instead - setup_base = dist_filename - ensure_directory(dst) - shutil.move(setup_base, dst) - return dst - - def install_wrapper_scripts(self, dist): - if self.exclude_scripts: - return - for args in ScriptWriter.best().get_args(dist): - self.write_script(*args) - - def install_script(self, dist, script_name, script_text, dev_path=None): - """Generate a legacy script wrapper and install it""" - spec = str(dist.as_requirement()) - is_script = is_python_script(script_text, script_name) - - if is_script: - body = self._load_template(dev_path) % locals() - script_text = ScriptWriter.get_header(script_text) + body - self.write_script(script_name, _to_bytes(script_text), 'b') - - @staticmethod - def _load_template(dev_path): - """ - There are a couple of template scripts in the package. This - function loads one of them and prepares it for use. - """ - # See https://github.com/pypa/setuptools/issues/134 for info - # on script file naming and downstream issues with SVR4 - name = 'script.tmpl' - if dev_path: - name = name.replace('.tmpl', ' (dev).tmpl') - - raw_bytes = resource_string('setuptools', name) - return raw_bytes.decode('utf-8') - - def write_script(self, script_name, contents, mode="t", blockers=()): - """Write an executable file to the scripts directory""" - self.delete_blockers( # clean up old .py/.pyw w/o a script - [os.path.join(self.script_dir, x) for x in blockers] - ) - log.info("Installing %s script to %s", script_name, self.script_dir) - target = os.path.join(self.script_dir, script_name) - self.add_output(target) - - if self.dry_run: - return - - mask = current_umask() - ensure_directory(target) - if os.path.exists(target): - os.unlink(target) - with open(target, "w" + mode) as f: - f.write(contents) - chmod(target, 0o777 - mask) - - def install_eggs(self, spec, dist_filename, tmpdir): - # .egg dirs or files are already built, so just return them - if dist_filename.lower().endswith('.egg'): - return [self.install_egg(dist_filename, tmpdir)] - elif dist_filename.lower().endswith('.exe'): - return [self.install_exe(dist_filename, tmpdir)] - elif dist_filename.lower().endswith('.whl'): - return [self.install_wheel(dist_filename, tmpdir)] - - # Anything else, try to extract and build - setup_base = tmpdir - if os.path.isfile(dist_filename) and not dist_filename.endswith('.py'): - unpack_archive(dist_filename, tmpdir, self.unpack_progress) - elif os.path.isdir(dist_filename): - setup_base = os.path.abspath(dist_filename) - - if (setup_base.startswith(tmpdir) # something we downloaded - and self.build_directory and spec is not None): - setup_base = self.maybe_move(spec, dist_filename, setup_base) - - # Find the setup.py file - setup_script = os.path.join(setup_base, 'setup.py') - - if not os.path.exists(setup_script): - setups = glob(os.path.join(setup_base, '*', 'setup.py')) - if not setups: - raise DistutilsError( - "Couldn't find a setup script in %s" % - os.path.abspath(dist_filename) - ) - if len(setups) > 1: - raise DistutilsError( - "Multiple setup scripts in %s" % - os.path.abspath(dist_filename) - ) - setup_script = setups[0] - - # Now run it, and return the result - if self.editable: - log.info(self.report_editable(spec, setup_script)) - return [] - else: - return self.build_and_install(setup_script, setup_base) - - def egg_distribution(self, egg_path): - if os.path.isdir(egg_path): - metadata = PathMetadata(egg_path, os.path.join(egg_path, - 'EGG-INFO')) - else: - metadata = EggMetadata(zipimport.zipimporter(egg_path)) - return Distribution.from_filename(egg_path, metadata=metadata) - - def install_egg(self, egg_path, tmpdir): - destination = os.path.join( - self.install_dir, - os.path.basename(egg_path), - ) - destination = os.path.abspath(destination) - if not self.dry_run: - ensure_directory(destination) - - dist = self.egg_distribution(egg_path) - if not samefile(egg_path, destination): - if os.path.isdir(destination) and not os.path.islink(destination): - dir_util.remove_tree(destination, dry_run=self.dry_run) - elif os.path.exists(destination): - self.execute( - os.unlink, - (destination,), - "Removing " + destination, - ) - try: - new_dist_is_zipped = False - if os.path.isdir(egg_path): - if egg_path.startswith(tmpdir): - f, m = shutil.move, "Moving" - else: - f, m = shutil.copytree, "Copying" - elif self.should_unzip(dist): - self.mkpath(destination) - f, m = self.unpack_and_compile, "Extracting" - else: - new_dist_is_zipped = True - if egg_path.startswith(tmpdir): - f, m = shutil.move, "Moving" - else: - f, m = shutil.copy2, "Copying" - self.execute( - f, - (egg_path, destination), - (m + " %s to %s") % ( - os.path.basename(egg_path), - os.path.dirname(destination) - ), - ) - update_dist_caches( - destination, - fix_zipimporter_caches=new_dist_is_zipped, - ) - except Exception: - update_dist_caches(destination, fix_zipimporter_caches=False) - raise - - self.add_output(destination) - return self.egg_distribution(destination) - - def install_exe(self, dist_filename, tmpdir): - # See if it's valid, get data - cfg = extract_wininst_cfg(dist_filename) - if cfg is None: - raise DistutilsError( - "%s is not a valid distutils Windows .exe" % dist_filename - ) - # Create a dummy distribution object until we build the real distro - dist = Distribution( - None, - project_name=cfg.get('metadata', 'name'), - version=cfg.get('metadata', 'version'), platform=get_platform(), - ) - - # Convert the .exe to an unpacked egg - egg_path = os.path.join(tmpdir, dist.egg_name() + '.egg') - dist.location = egg_path - egg_tmp = egg_path + '.tmp' - _egg_info = os.path.join(egg_tmp, 'EGG-INFO') - pkg_inf = os.path.join(_egg_info, 'PKG-INFO') - ensure_directory(pkg_inf) # make sure EGG-INFO dir exists - dist._provider = PathMetadata(egg_tmp, _egg_info) # XXX - self.exe_to_egg(dist_filename, egg_tmp) - - # Write EGG-INFO/PKG-INFO - if not os.path.exists(pkg_inf): - f = open(pkg_inf, 'w') - f.write('Metadata-Version: 1.0\n') - for k, v in cfg.items('metadata'): - if k != 'target_version': - f.write('%s: %s\n' % (k.replace('_', '-').title(), v)) - f.close() - script_dir = os.path.join(_egg_info, 'scripts') - # delete entry-point scripts to avoid duping - self.delete_blockers([ - os.path.join(script_dir, args[0]) - for args in ScriptWriter.get_args(dist) - ]) - # Build .egg file from tmpdir - bdist_egg.make_zipfile( - egg_path, egg_tmp, verbose=self.verbose, dry_run=self.dry_run, - ) - # install the .egg - return self.install_egg(egg_path, tmpdir) - - def exe_to_egg(self, dist_filename, egg_tmp): - """Extract a bdist_wininst to the directories an egg would use""" - # Check for .pth file and set up prefix translations - prefixes = get_exe_prefixes(dist_filename) - to_compile = [] - native_libs = [] - top_level = {} - - def process(src, dst): - s = src.lower() - for old, new in prefixes: - if s.startswith(old): - src = new + src[len(old):] - parts = src.split('/') - dst = os.path.join(egg_tmp, *parts) - dl = dst.lower() - if dl.endswith('.pyd') or dl.endswith('.dll'): - parts[-1] = bdist_egg.strip_module(parts[-1]) - top_level[os.path.splitext(parts[0])[0]] = 1 - native_libs.append(src) - elif dl.endswith('.py') and old != 'SCRIPTS/': - top_level[os.path.splitext(parts[0])[0]] = 1 - to_compile.append(dst) - return dst - if not src.endswith('.pth'): - log.warn("WARNING: can't process %s", src) - return None - - # extract, tracking .pyd/.dll->native_libs and .py -> to_compile - unpack_archive(dist_filename, egg_tmp, process) - stubs = [] - for res in native_libs: - if res.lower().endswith('.pyd'): # create stubs for .pyd's - parts = res.split('/') - resource = parts[-1] - parts[-1] = bdist_egg.strip_module(parts[-1]) + '.py' - pyfile = os.path.join(egg_tmp, *parts) - to_compile.append(pyfile) - stubs.append(pyfile) - bdist_egg.write_stub(resource, pyfile) - self.byte_compile(to_compile) # compile .py's - bdist_egg.write_safety_flag( - os.path.join(egg_tmp, 'EGG-INFO'), - bdist_egg.analyze_egg(egg_tmp, stubs)) # write zip-safety flag - - for name in 'top_level', 'native_libs': - if locals()[name]: - txt = os.path.join(egg_tmp, 'EGG-INFO', name + '.txt') - if not os.path.exists(txt): - f = open(txt, 'w') - f.write('\n'.join(locals()[name]) + '\n') - f.close() - - def install_wheel(self, wheel_path, tmpdir): - wheel = Wheel(wheel_path) - assert wheel.is_compatible() - destination = os.path.join(self.install_dir, wheel.egg_name()) - destination = os.path.abspath(destination) - if not self.dry_run: - ensure_directory(destination) - if os.path.isdir(destination) and not os.path.islink(destination): - dir_util.remove_tree(destination, dry_run=self.dry_run) - elif os.path.exists(destination): - self.execute( - os.unlink, - (destination,), - "Removing " + destination, - ) - try: - self.execute( - wheel.install_as_egg, - (destination,), - ("Installing %s to %s") % ( - os.path.basename(wheel_path), - os.path.dirname(destination) - ), - ) - finally: - update_dist_caches(destination, fix_zipimporter_caches=False) - self.add_output(destination) - return self.egg_distribution(destination) - - __mv_warning = textwrap.dedent(""" - Because this distribution was installed --multi-version, before you can - import modules from this package in an application, you will need to - 'import pkg_resources' and then use a 'require()' call similar to one of - these examples, in order to select the desired version: - - pkg_resources.require("%(name)s") # latest installed version - pkg_resources.require("%(name)s==%(version)s") # this exact version - pkg_resources.require("%(name)s>=%(version)s") # this version or higher - """).lstrip() - - __id_warning = textwrap.dedent(""" - Note also that the installation directory must be on sys.path at runtime for - this to work. (e.g. by being the application's script directory, by being on - PYTHONPATH, or by being added to sys.path by your code.) - """) - - def installation_report(self, req, dist, what="Installed"): - """Helpful installation message for display to package users""" - msg = "\n%(what)s %(eggloc)s%(extras)s" - if self.multi_version and not self.no_report: - msg += '\n' + self.__mv_warning - if self.install_dir not in map(normalize_path, sys.path): - msg += '\n' + self.__id_warning - - eggloc = dist.location - name = dist.project_name - version = dist.version - extras = '' # TODO: self.report_extras(req, dist) - return msg % locals() - - __editable_msg = textwrap.dedent(""" - Extracted editable version of %(spec)s to %(dirname)s - - If it uses setuptools in its setup script, you can activate it in - "development" mode by going to that directory and running:: - - %(python)s setup.py develop - - See the setuptools documentation for the "develop" command for more info. - """).lstrip() - - def report_editable(self, spec, setup_script): - dirname = os.path.dirname(setup_script) - python = sys.executable - return '\n' + self.__editable_msg % locals() - - def run_setup(self, setup_script, setup_base, args): - sys.modules.setdefault('distutils.command.bdist_egg', bdist_egg) - sys.modules.setdefault('distutils.command.egg_info', egg_info) - - args = list(args) - if self.verbose > 2: - v = 'v' * (self.verbose - 1) - args.insert(0, '-' + v) - elif self.verbose < 2: - args.insert(0, '-q') - if self.dry_run: - args.insert(0, '-n') - log.info( - "Running %s %s", setup_script[len(setup_base) + 1:], ' '.join(args) - ) - try: - run_setup(setup_script, args) - except SystemExit as v: - raise DistutilsError("Setup script exited with %s" % (v.args[0],)) - - def build_and_install(self, setup_script, setup_base): - args = ['bdist_egg', '--dist-dir'] - - dist_dir = tempfile.mkdtemp( - prefix='egg-dist-tmp-', dir=os.path.dirname(setup_script) - ) - try: - self._set_fetcher_options(os.path.dirname(setup_script)) - args.append(dist_dir) - - self.run_setup(setup_script, setup_base, args) - all_eggs = Environment([dist_dir]) - eggs = [] - for key in all_eggs: - for dist in all_eggs[key]: - eggs.append(self.install_egg(dist.location, setup_base)) - if not eggs and not self.dry_run: - log.warn("No eggs found in %s (setup script problem?)", - dist_dir) - return eggs - finally: - rmtree(dist_dir) - log.set_verbosity(self.verbose) # restore our log verbosity - - def _set_fetcher_options(self, base): - """ - When easy_install is about to run bdist_egg on a source dist, that - source dist might have 'setup_requires' directives, requiring - additional fetching. Ensure the fetcher options given to easy_install - are available to that command as well. - """ - # find the fetch options from easy_install and write them out - # to the setup.cfg file. - ei_opts = self.distribution.get_option_dict('easy_install').copy() - fetch_directives = ( - 'find_links', 'site_dirs', 'index_url', 'optimize', - 'site_dirs', 'allow_hosts', - ) - fetch_options = {} - for key, val in ei_opts.items(): - if key not in fetch_directives: - continue - fetch_options[key.replace('_', '-')] = val[1] - # create a settings dictionary suitable for `edit_config` - settings = dict(easy_install=fetch_options) - cfg_filename = os.path.join(base, 'setup.cfg') - setopt.edit_config(cfg_filename, settings) - - def update_pth(self, dist): - if self.pth_file is None: - return - - for d in self.pth_file[dist.key]: # drop old entries - if self.multi_version or d.location != dist.location: - log.info("Removing %s from easy-install.pth file", d) - self.pth_file.remove(d) - if d.location in self.shadow_path: - self.shadow_path.remove(d.location) - - if not self.multi_version: - if dist.location in self.pth_file.paths: - log.info( - "%s is already the active version in easy-install.pth", - dist, - ) - else: - log.info("Adding %s to easy-install.pth file", dist) - self.pth_file.add(dist) # add new entry - if dist.location not in self.shadow_path: - self.shadow_path.append(dist.location) - - if not self.dry_run: - - self.pth_file.save() - - if dist.key == 'setuptools': - # Ensure that setuptools itself never becomes unavailable! - # XXX should this check for latest version? - filename = os.path.join(self.install_dir, 'setuptools.pth') - if os.path.islink(filename): - os.unlink(filename) - f = open(filename, 'wt') - f.write(self.pth_file.make_relative(dist.location) + '\n') - f.close() - - def unpack_progress(self, src, dst): - # Progress filter for unpacking - log.debug("Unpacking %s to %s", src, dst) - return dst # only unpack-and-compile skips files for dry run - - def unpack_and_compile(self, egg_path, destination): - to_compile = [] - to_chmod = [] - - def pf(src, dst): - if dst.endswith('.py') and not src.startswith('EGG-INFO/'): - to_compile.append(dst) - elif dst.endswith('.dll') or dst.endswith('.so'): - to_chmod.append(dst) - self.unpack_progress(src, dst) - return not self.dry_run and dst or None - - unpack_archive(egg_path, destination, pf) - self.byte_compile(to_compile) - if not self.dry_run: - for f in to_chmod: - mode = ((os.stat(f)[stat.ST_MODE]) | 0o555) & 0o7755 - chmod(f, mode) - - def byte_compile(self, to_compile): - if sys.dont_write_bytecode: - return - - from distutils.util import byte_compile - - try: - # try to make the byte compile messages quieter - log.set_verbosity(self.verbose - 1) - - byte_compile(to_compile, optimize=0, force=1, dry_run=self.dry_run) - if self.optimize: - byte_compile( - to_compile, optimize=self.optimize, force=1, - dry_run=self.dry_run, - ) - finally: - log.set_verbosity(self.verbose) # restore original verbosity - - __no_default_msg = textwrap.dedent(""" - bad install directory or PYTHONPATH - - You are attempting to install a package to a directory that is not - on PYTHONPATH and which Python does not read ".pth" files from. The - installation directory you specified (via --install-dir, --prefix, or - the distutils default setting) was: - - %s - - and your PYTHONPATH environment variable currently contains: - - %r - - Here are some of your options for correcting the problem: - - * You can choose a different installation directory, i.e., one that is - on PYTHONPATH or supports .pth files - - * You can add the installation directory to the PYTHONPATH environment - variable. (It must then also be on PYTHONPATH whenever you run - Python and want to use the package(s) you are installing.) - - * You can set up the installation directory to support ".pth" files by - using one of the approaches described here: - - https://setuptools.readthedocs.io/en/latest/easy_install.html#custom-installation-locations - - - Please make the appropriate changes for your system and try again.""").lstrip() - - def no_default_version_msg(self): - template = self.__no_default_msg - return template % (self.install_dir, os.environ.get('PYTHONPATH', '')) - - def install_site_py(self): - """Make sure there's a site.py in the target dir, if needed""" - - if self.sitepy_installed: - return # already did it, or don't need to - - sitepy = os.path.join(self.install_dir, "site.py") - source = resource_string("setuptools", "site-patch.py") - source = source.decode('utf-8') - current = "" - - if os.path.exists(sitepy): - log.debug("Checking existing site.py in %s", self.install_dir) - with io.open(sitepy) as strm: - current = strm.read() - - if not current.startswith('def __boot():'): - raise DistutilsError( - "%s is not a setuptools-generated site.py; please" - " remove it." % sitepy - ) - - if current != source: - log.info("Creating %s", sitepy) - if not self.dry_run: - ensure_directory(sitepy) - with io.open(sitepy, 'w', encoding='utf-8') as strm: - strm.write(source) - self.byte_compile([sitepy]) - - self.sitepy_installed = True - - def create_home_path(self): - """Create directories under ~.""" - if not self.user: - return - home = convert_path(os.path.expanduser("~")) - for name, path in six.iteritems(self.config_vars): - if path.startswith(home) and not os.path.isdir(path): - self.debug_print("os.makedirs('%s', 0o700)" % path) - os.makedirs(path, 0o700) - - INSTALL_SCHEMES = dict( - posix=dict( - install_dir='$base/lib/python$py_version_short/site-packages', - script_dir='$base/bin', - ), - ) - - DEFAULT_SCHEME = dict( - install_dir='$base/Lib/site-packages', - script_dir='$base/Scripts', - ) - - def _expand(self, *attrs): - config_vars = self.get_finalized_command('install').config_vars - - if self.prefix: - # Set default install_dir/scripts from --prefix - config_vars = config_vars.copy() - config_vars['base'] = self.prefix - scheme = self.INSTALL_SCHEMES.get(os.name, self.DEFAULT_SCHEME) - for attr, val in scheme.items(): - if getattr(self, attr, None) is None: - setattr(self, attr, val) - - from distutils.util import subst_vars - - for attr in attrs: - val = getattr(self, attr) - if val is not None: - val = subst_vars(val, config_vars) - if os.name == 'posix': - val = os.path.expanduser(val) - setattr(self, attr, val) - - -def _pythonpath(): - items = os.environ.get('PYTHONPATH', '').split(os.pathsep) - return filter(None, items) - - -def get_site_dirs(): - """ - Return a list of 'site' dirs - """ - - sitedirs = [] - - # start with PYTHONPATH - sitedirs.extend(_pythonpath()) - - prefixes = [sys.prefix] - if sys.exec_prefix != sys.prefix: - prefixes.append(sys.exec_prefix) - for prefix in prefixes: - if prefix: - if sys.platform in ('os2emx', 'riscos'): - sitedirs.append(os.path.join(prefix, "Lib", "site-packages")) - elif os.sep == '/': - sitedirs.extend([ - os.path.join( - prefix, - "lib", - "python" + sys.version[:3], - "site-packages", - ), - os.path.join(prefix, "lib", "site-python"), - ]) - else: - sitedirs.extend([ - prefix, - os.path.join(prefix, "lib", "site-packages"), - ]) - if sys.platform == 'darwin': - # for framework builds *only* we add the standard Apple - # locations. Currently only per-user, but /Library and - # /Network/Library could be added too - if 'Python.framework' in prefix: - home = os.environ.get('HOME') - if home: - home_sp = os.path.join( - home, - 'Library', - 'Python', - sys.version[:3], - 'site-packages', - ) - sitedirs.append(home_sp) - lib_paths = get_path('purelib'), get_path('platlib') - for site_lib in lib_paths: - if site_lib not in sitedirs: - sitedirs.append(site_lib) - - if site.ENABLE_USER_SITE: - sitedirs.append(site.USER_SITE) - - try: - sitedirs.extend(site.getsitepackages()) - except AttributeError: - pass - - sitedirs = list(map(normalize_path, sitedirs)) - - return sitedirs - - -def expand_paths(inputs): - """Yield sys.path directories that might contain "old-style" packages""" - - seen = {} - - for dirname in inputs: - dirname = normalize_path(dirname) - if dirname in seen: - continue - - seen[dirname] = 1 - if not os.path.isdir(dirname): - continue - - files = os.listdir(dirname) - yield dirname, files - - for name in files: - if not name.endswith('.pth'): - # We only care about the .pth files - continue - if name in ('easy-install.pth', 'setuptools.pth'): - # Ignore .pth files that we control - continue - - # Read the .pth file - f = open(os.path.join(dirname, name)) - lines = list(yield_lines(f)) - f.close() - - # Yield existing non-dupe, non-import directory lines from it - for line in lines: - if not line.startswith("import"): - line = normalize_path(line.rstrip()) - if line not in seen: - seen[line] = 1 - if not os.path.isdir(line): - continue - yield line, os.listdir(line) - - -def extract_wininst_cfg(dist_filename): - """Extract configuration data from a bdist_wininst .exe - - Returns a configparser.RawConfigParser, or None - """ - f = open(dist_filename, 'rb') - try: - endrec = zipfile._EndRecData(f) - if endrec is None: - return None - - prepended = (endrec[9] - endrec[5]) - endrec[6] - if prepended < 12: # no wininst data here - return None - f.seek(prepended - 12) - - tag, cfglen, bmlen = struct.unpack("<iii", f.read(12)) - if tag not in (0x1234567A, 0x1234567B): - return None # not a valid tag - - f.seek(prepended - (12 + cfglen)) - init = {'version': '', 'target_version': ''} - cfg = configparser.RawConfigParser(init) - try: - part = f.read(cfglen) - # Read up to the first null byte. - config = part.split(b'\0', 1)[0] - # Now the config is in bytes, but for RawConfigParser, it should - # be text, so decode it. - config = config.decode(sys.getfilesystemencoding()) - cfg.readfp(six.StringIO(config)) - except configparser.Error: - return None - if not cfg.has_section('metadata') or not cfg.has_section('Setup'): - return None - return cfg - - finally: - f.close() - - -def get_exe_prefixes(exe_filename): - """Get exe->egg path translations for a given .exe file""" - - prefixes = [ - ('PURELIB/', ''), - ('PLATLIB/pywin32_system32', ''), - ('PLATLIB/', ''), - ('SCRIPTS/', 'EGG-INFO/scripts/'), - ('DATA/lib/site-packages', ''), - ] - z = zipfile.ZipFile(exe_filename) - try: - for info in z.infolist(): - name = info.filename - parts = name.split('/') - if len(parts) == 3 and parts[2] == 'PKG-INFO': - if parts[1].endswith('.egg-info'): - prefixes.insert(0, ('/'.join(parts[:2]), 'EGG-INFO/')) - break - if len(parts) != 2 or not name.endswith('.pth'): - continue - if name.endswith('-nspkg.pth'): - continue - if parts[0].upper() in ('PURELIB', 'PLATLIB'): - contents = z.read(name) - if six.PY3: - contents = contents.decode() - for pth in yield_lines(contents): - pth = pth.strip().replace('\\', '/') - if not pth.startswith('import'): - prefixes.append((('%s/%s/' % (parts[0], pth)), '')) - finally: - z.close() - prefixes = [(x.lower(), y) for x, y in prefixes] - prefixes.sort() - prefixes.reverse() - return prefixes - - -class PthDistributions(Environment): - """A .pth file with Distribution paths in it""" - - dirty = False - - def __init__(self, filename, sitedirs=()): - self.filename = filename - self.sitedirs = list(map(normalize_path, sitedirs)) - self.basedir = normalize_path(os.path.dirname(self.filename)) - self._load() - Environment.__init__(self, [], None, None) - for path in yield_lines(self.paths): - list(map(self.add, find_distributions(path, True))) - - def _load(self): - self.paths = [] - saw_import = False - seen = dict.fromkeys(self.sitedirs) - if os.path.isfile(self.filename): - f = open(self.filename, 'rt') - for line in f: - if line.startswith('import'): - saw_import = True - continue - path = line.rstrip() - self.paths.append(path) - if not path.strip() or path.strip().startswith('#'): - continue - # skip non-existent paths, in case somebody deleted a package - # manually, and duplicate paths as well - path = self.paths[-1] = normalize_path( - os.path.join(self.basedir, path) - ) - if not os.path.exists(path) or path in seen: - self.paths.pop() # skip it - self.dirty = True # we cleaned up, so we're dirty now :) - continue - seen[path] = 1 - f.close() - - if self.paths and not saw_import: - self.dirty = True # ensure anything we touch has import wrappers - while self.paths and not self.paths[-1].strip(): - self.paths.pop() - - def save(self): - """Write changed .pth file back to disk""" - if not self.dirty: - return - - rel_paths = list(map(self.make_relative, self.paths)) - if rel_paths: - log.debug("Saving %s", self.filename) - lines = self._wrap_lines(rel_paths) - data = '\n'.join(lines) + '\n' - - if os.path.islink(self.filename): - os.unlink(self.filename) - with open(self.filename, 'wt') as f: - f.write(data) - - elif os.path.exists(self.filename): - log.debug("Deleting empty %s", self.filename) - os.unlink(self.filename) - - self.dirty = False - - @staticmethod - def _wrap_lines(lines): - return lines - - def add(self, dist): - """Add `dist` to the distribution map""" - new_path = ( - dist.location not in self.paths and ( - dist.location not in self.sitedirs or - # account for '.' being in PYTHONPATH - dist.location == os.getcwd() - ) - ) - if new_path: - self.paths.append(dist.location) - self.dirty = True - Environment.add(self, dist) - - def remove(self, dist): - """Remove `dist` from the distribution map""" - while dist.location in self.paths: - self.paths.remove(dist.location) - self.dirty = True - Environment.remove(self, dist) - - def make_relative(self, path): - npath, last = os.path.split(normalize_path(path)) - baselen = len(self.basedir) - parts = [last] - sep = os.altsep == '/' and '/' or os.sep - while len(npath) >= baselen: - if npath == self.basedir: - parts.append(os.curdir) - parts.reverse() - return sep.join(parts) - npath, last = os.path.split(npath) - parts.append(last) - else: - return path - - -class RewritePthDistributions(PthDistributions): - @classmethod - def _wrap_lines(cls, lines): - yield cls.prelude - for line in lines: - yield line - yield cls.postlude - - prelude = _one_liner(""" - import sys - sys.__plen = len(sys.path) - """) - postlude = _one_liner(""" - import sys - new = sys.path[sys.__plen:] - del sys.path[sys.__plen:] - p = getattr(sys, '__egginsert', 0) - sys.path[p:p] = new - sys.__egginsert = p + len(new) - """) - - -if os.environ.get('SETUPTOOLS_SYS_PATH_TECHNIQUE', 'raw') == 'rewrite': - PthDistributions = RewritePthDistributions - - -def _first_line_re(): - """ - Return a regular expression based on first_line_re suitable for matching - strings. - """ - if isinstance(first_line_re.pattern, str): - return first_line_re - - # first_line_re in Python >=3.1.4 and >=3.2.1 is a bytes pattern. - return re.compile(first_line_re.pattern.decode()) - - -def auto_chmod(func, arg, exc): - if func in [os.unlink, os.remove] and os.name == 'nt': - chmod(arg, stat.S_IWRITE) - return func(arg) - et, ev, _ = sys.exc_info() - six.reraise(et, (ev[0], ev[1] + (" %s %s" % (func, arg)))) - - -def update_dist_caches(dist_path, fix_zipimporter_caches): - """ - Fix any globally cached `dist_path` related data - - `dist_path` should be a path of a newly installed egg distribution (zipped - or unzipped). - - sys.path_importer_cache contains finder objects that have been cached when - importing data from the original distribution. Any such finders need to be - cleared since the replacement distribution might be packaged differently, - e.g. a zipped egg distribution might get replaced with an unzipped egg - folder or vice versa. Having the old finders cached may then cause Python - to attempt loading modules from the replacement distribution using an - incorrect loader. - - zipimport.zipimporter objects are Python loaders charged with importing - data packaged inside zip archives. If stale loaders referencing the - original distribution, are left behind, they can fail to load modules from - the replacement distribution. E.g. if an old zipimport.zipimporter instance - is used to load data from a new zipped egg archive, it may cause the - operation to attempt to locate the requested data in the wrong location - - one indicated by the original distribution's zip archive directory - information. Such an operation may then fail outright, e.g. report having - read a 'bad local file header', or even worse, it may fail silently & - return invalid data. - - zipimport._zip_directory_cache contains cached zip archive directory - information for all existing zipimport.zipimporter instances and all such - instances connected to the same archive share the same cached directory - information. - - If asked, and the underlying Python implementation allows it, we can fix - all existing zipimport.zipimporter instances instead of having to track - them down and remove them one by one, by updating their shared cached zip - archive directory information. This, of course, assumes that the - replacement distribution is packaged as a zipped egg. - - If not asked to fix existing zipimport.zipimporter instances, we still do - our best to clear any remaining zipimport.zipimporter related cached data - that might somehow later get used when attempting to load data from the new - distribution and thus cause such load operations to fail. Note that when - tracking down such remaining stale data, we can not catch every conceivable - usage from here, and we clear only those that we know of and have found to - cause problems if left alive. Any remaining caches should be updated by - whomever is in charge of maintaining them, i.e. they should be ready to - handle us replacing their zip archives with new distributions at runtime. - - """ - # There are several other known sources of stale zipimport.zipimporter - # instances that we do not clear here, but might if ever given a reason to - # do so: - # * Global setuptools pkg_resources.working_set (a.k.a. 'master working - # set') may contain distributions which may in turn contain their - # zipimport.zipimporter loaders. - # * Several zipimport.zipimporter loaders held by local variables further - # up the function call stack when running the setuptools installation. - # * Already loaded modules may have their __loader__ attribute set to the - # exact loader instance used when importing them. Python 3.4 docs state - # that this information is intended mostly for introspection and so is - # not expected to cause us problems. - normalized_path = normalize_path(dist_path) - _uncache(normalized_path, sys.path_importer_cache) - if fix_zipimporter_caches: - _replace_zip_directory_cache_data(normalized_path) - else: - # Here, even though we do not want to fix existing and now stale - # zipimporter cache information, we still want to remove it. Related to - # Python's zip archive directory information cache, we clear each of - # its stale entries in two phases: - # 1. Clear the entry so attempting to access zip archive information - # via any existing stale zipimport.zipimporter instances fails. - # 2. Remove the entry from the cache so any newly constructed - # zipimport.zipimporter instances do not end up using old stale - # zip archive directory information. - # This whole stale data removal step does not seem strictly necessary, - # but has been left in because it was done before we started replacing - # the zip archive directory information cache content if possible, and - # there are no relevant unit tests that we can depend on to tell us if - # this is really needed. - _remove_and_clear_zip_directory_cache_data(normalized_path) - - -def _collect_zipimporter_cache_entries(normalized_path, cache): - """ - Return zipimporter cache entry keys related to a given normalized path. - - Alternative path spellings (e.g. those using different character case or - those using alternative path separators) related to the same path are - included. Any sub-path entries are included as well, i.e. those - corresponding to zip archives embedded in other zip archives. - - """ - result = [] - prefix_len = len(normalized_path) - for p in cache: - np = normalize_path(p) - if (np.startswith(normalized_path) and - np[prefix_len:prefix_len + 1] in (os.sep, '')): - result.append(p) - return result - - -def _update_zipimporter_cache(normalized_path, cache, updater=None): - """ - Update zipimporter cache data for a given normalized path. - - Any sub-path entries are processed as well, i.e. those corresponding to zip - archives embedded in other zip archives. - - Given updater is a callable taking a cache entry key and the original entry - (after already removing the entry from the cache), and expected to update - the entry and possibly return a new one to be inserted in its place. - Returning None indicates that the entry should not be replaced with a new - one. If no updater is given, the cache entries are simply removed without - any additional processing, the same as if the updater simply returned None. - - """ - for p in _collect_zipimporter_cache_entries(normalized_path, cache): - # N.B. pypy's custom zipimport._zip_directory_cache implementation does - # not support the complete dict interface: - # * Does not support item assignment, thus not allowing this function - # to be used only for removing existing cache entries. - # * Does not support the dict.pop() method, forcing us to use the - # get/del patterns instead. For more detailed information see the - # following links: - # https://github.com/pypa/setuptools/issues/202#issuecomment-202913420 - # http://bit.ly/2h9itJX - old_entry = cache[p] - del cache[p] - new_entry = updater and updater(p, old_entry) - if new_entry is not None: - cache[p] = new_entry - - -def _uncache(normalized_path, cache): - _update_zipimporter_cache(normalized_path, cache) - - -def _remove_and_clear_zip_directory_cache_data(normalized_path): - def clear_and_remove_cached_zip_archive_directory_data(path, old_entry): - old_entry.clear() - - _update_zipimporter_cache( - normalized_path, zipimport._zip_directory_cache, - updater=clear_and_remove_cached_zip_archive_directory_data) - - -# PyPy Python implementation does not allow directly writing to the -# zipimport._zip_directory_cache and so prevents us from attempting to correct -# its content. The best we can do there is clear the problematic cache content -# and have PyPy repopulate it as needed. The downside is that if there are any -# stale zipimport.zipimporter instances laying around, attempting to use them -# will fail due to not having its zip archive directory information available -# instead of being automatically corrected to use the new correct zip archive -# directory information. -if '__pypy__' in sys.builtin_module_names: - _replace_zip_directory_cache_data = \ - _remove_and_clear_zip_directory_cache_data -else: - - def _replace_zip_directory_cache_data(normalized_path): - def replace_cached_zip_archive_directory_data(path, old_entry): - # N.B. In theory, we could load the zip directory information just - # once for all updated path spellings, and then copy it locally and - # update its contained path strings to contain the correct - # spelling, but that seems like a way too invasive move (this cache - # structure is not officially documented anywhere and could in - # theory change with new Python releases) for no significant - # benefit. - old_entry.clear() - zipimport.zipimporter(path) - old_entry.update(zipimport._zip_directory_cache[path]) - return old_entry - - _update_zipimporter_cache( - normalized_path, zipimport._zip_directory_cache, - updater=replace_cached_zip_archive_directory_data) - - -def is_python(text, filename='<string>'): - "Is this string a valid Python script?" - try: - compile(text, filename, 'exec') - except (SyntaxError, TypeError): - return False - else: - return True - - -def is_sh(executable): - """Determine if the specified executable is a .sh (contains a #! line)""" - try: - with io.open(executable, encoding='latin-1') as fp: - magic = fp.read(2) - except (OSError, IOError): - return executable - return magic == '#!' - - -def nt_quote_arg(arg): - """Quote a command line argument according to Windows parsing rules""" - return subprocess.list2cmdline([arg]) - - -def is_python_script(script_text, filename): - """Is this text, as a whole, a Python script? (as opposed to shell/bat/etc. - """ - if filename.endswith('.py') or filename.endswith('.pyw'): - return True # extension says it's Python - if is_python(script_text, filename): - return True # it's syntactically valid Python - if script_text.startswith('#!'): - # It begins with a '#!' line, so check if 'python' is in it somewhere - return 'python' in script_text.splitlines()[0].lower() - - return False # Not any Python I can recognize - - -try: - from os import chmod as _chmod -except ImportError: - # Jython compatibility - def _chmod(*args): - pass - - -def chmod(path, mode): - log.debug("changing mode of %s to %o", path, mode) - try: - _chmod(path, mode) - except os.error as e: - log.debug("chmod failed: %s", e) - - -class CommandSpec(list): - """ - A command spec for a #! header, specified as a list of arguments akin to - those passed to Popen. - """ - - options = [] - split_args = dict() - - @classmethod - def best(cls): - """ - Choose the best CommandSpec class based on environmental conditions. - """ - return cls - - @classmethod - def _sys_executable(cls): - _default = os.path.normpath(sys.executable) - return os.environ.get('__PYVENV_LAUNCHER__', _default) - - @classmethod - def from_param(cls, param): - """ - Construct a CommandSpec from a parameter to build_scripts, which may - be None. - """ - if isinstance(param, cls): - return param - if isinstance(param, list): - return cls(param) - if param is None: - return cls.from_environment() - # otherwise, assume it's a string. - return cls.from_string(param) - - @classmethod - def from_environment(cls): - return cls([cls._sys_executable()]) - - @classmethod - def from_string(cls, string): - """ - Construct a command spec from a simple string representing a command - line parseable by shlex.split. - """ - items = shlex.split(string, **cls.split_args) - return cls(items) - - def install_options(self, script_text): - self.options = shlex.split(self._extract_options(script_text)) - cmdline = subprocess.list2cmdline(self) - if not isascii(cmdline): - self.options[:0] = ['-x'] - - @staticmethod - def _extract_options(orig_script): - """ - Extract any options from the first line of the script. - """ - first = (orig_script + '\n').splitlines()[0] - match = _first_line_re().match(first) - options = match.group(1) or '' if match else '' - return options.strip() - - def as_header(self): - return self._render(self + list(self.options)) - - @staticmethod - def _strip_quotes(item): - _QUOTES = '"\'' - for q in _QUOTES: - if item.startswith(q) and item.endswith(q): - return item[1:-1] - return item - - @staticmethod - def _render(items): - cmdline = subprocess.list2cmdline( - CommandSpec._strip_quotes(item.strip()) for item in items) - return '#!' + cmdline + '\n' - - -# For pbr compat; will be removed in a future version. -sys_executable = CommandSpec._sys_executable() - - -class WindowsCommandSpec(CommandSpec): - split_args = dict(posix=False) - - -class ScriptWriter: - """ - Encapsulates behavior around writing entry point scripts for console and - gui apps. - """ - - template = textwrap.dedent(r""" - # EASY-INSTALL-ENTRY-SCRIPT: %(spec)r,%(group)r,%(name)r - __requires__ = %(spec)r - import re - import sys - from pkg_resources import load_entry_point - - if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit( - load_entry_point(%(spec)r, %(group)r, %(name)r)() - ) - """).lstrip() - - command_spec_class = CommandSpec - - @classmethod - def get_script_args(cls, dist, executable=None, wininst=False): - # for backward compatibility - warnings.warn("Use get_args", EasyInstallDeprecationWarning) - writer = (WindowsScriptWriter if wininst else ScriptWriter).best() - header = cls.get_script_header("", executable, wininst) - return writer.get_args(dist, header) - - @classmethod - def get_script_header(cls, script_text, executable=None, wininst=False): - # for backward compatibility - warnings.warn("Use get_header", EasyInstallDeprecationWarning, stacklevel=2) - if wininst: - executable = "python.exe" - return cls.get_header(script_text, executable) - - @classmethod - def get_args(cls, dist, header=None): - """ - Yield write_script() argument tuples for a distribution's - console_scripts and gui_scripts entry points. - """ - if header is None: - header = cls.get_header() - spec = str(dist.as_requirement()) - for type_ in 'console', 'gui': - group = type_ + '_scripts' - for name, ep in dist.get_entry_map(group).items(): - cls._ensure_safe_name(name) - script_text = cls.template % locals() - args = cls._get_script_args(type_, name, header, script_text) - for res in args: - yield res - - @staticmethod - def _ensure_safe_name(name): - """ - Prevent paths in *_scripts entry point names. - """ - has_path_sep = re.search(r'[\\/]', name) - if has_path_sep: - raise ValueError("Path separators not allowed in script names") - - @classmethod - def get_writer(cls, force_windows): - # for backward compatibility - warnings.warn("Use best", EasyInstallDeprecationWarning) - return WindowsScriptWriter.best() if force_windows else cls.best() - - @classmethod - def best(cls): - """ - Select the best ScriptWriter for this environment. - """ - if sys.platform == 'win32' or (os.name == 'java' and os._name == 'nt'): - return WindowsScriptWriter.best() - else: - return cls - - @classmethod - def _get_script_args(cls, type_, name, header, script_text): - # Simply write the stub with no extension. - yield (name, header + script_text) - - @classmethod - def get_header(cls, script_text="", executable=None): - """Create a #! line, getting options (if any) from script_text""" - cmd = cls.command_spec_class.best().from_param(executable) - cmd.install_options(script_text) - return cmd.as_header() - - -class WindowsScriptWriter(ScriptWriter): - command_spec_class = WindowsCommandSpec - - @classmethod - def get_writer(cls): - # for backward compatibility - warnings.warn("Use best", EasyInstallDeprecationWarning) - return cls.best() - - @classmethod - def best(cls): - """ - Select the best ScriptWriter suitable for Windows - """ - writer_lookup = dict( - executable=WindowsExecutableLauncherWriter, - natural=cls, - ) - # for compatibility, use the executable launcher by default - launcher = os.environ.get('SETUPTOOLS_LAUNCHER', 'executable') - return writer_lookup[launcher] - - @classmethod - def _get_script_args(cls, type_, name, header, script_text): - "For Windows, add a .py extension" - ext = dict(console='.pya', gui='.pyw')[type_] - if ext not in os.environ['PATHEXT'].lower().split(';'): - msg = ( - "{ext} not listed in PATHEXT; scripts will not be " - "recognized as executables." - ).format(**locals()) - warnings.warn(msg, UserWarning) - old = ['.pya', '.py', '-script.py', '.pyc', '.pyo', '.pyw', '.exe'] - old.remove(ext) - header = cls._adjust_header(type_, header) - blockers = [name + x for x in old] - yield name + ext, header + script_text, 't', blockers - - @classmethod - def _adjust_header(cls, type_, orig_header): - """ - Make sure 'pythonw' is used for gui and and 'python' is used for - console (regardless of what sys.executable is). - """ - pattern = 'pythonw.exe' - repl = 'python.exe' - if type_ == 'gui': - pattern, repl = repl, pattern - pattern_ob = re.compile(re.escape(pattern), re.IGNORECASE) - new_header = pattern_ob.sub(string=orig_header, repl=repl) - return new_header if cls._use_header(new_header) else orig_header - - @staticmethod - def _use_header(new_header): - """ - Should _adjust_header use the replaced header? - - On non-windows systems, always use. On - Windows systems, only use the replaced header if it resolves - to an executable on the system. - """ - clean_header = new_header[2:-1].strip('"') - return sys.platform != 'win32' or find_executable(clean_header) - - -class WindowsExecutableLauncherWriter(WindowsScriptWriter): - @classmethod - def _get_script_args(cls, type_, name, header, script_text): - """ - For Windows, add a .py extension and an .exe launcher - """ - if type_ == 'gui': - launcher_type = 'gui' - ext = '-script.pyw' - old = ['.pyw'] - else: - launcher_type = 'cli' - ext = '-script.py' - old = ['.py', '.pyc', '.pyo'] - hdr = cls._adjust_header(type_, header) - blockers = [name + x for x in old] - yield (name + ext, hdr + script_text, 't', blockers) - yield ( - name + '.exe', get_win_launcher(launcher_type), - 'b' # write in binary mode - ) - if not is_64bit(): - # install a manifest for the launcher to prevent Windows - # from detecting it as an installer (which it will for - # launchers like easy_install.exe). Consider only - # adding a manifest for launchers detected as installers. - # See Distribute #143 for details. - m_name = name + '.exe.manifest' - yield (m_name, load_launcher_manifest(name), 't') - - -# for backward-compatibility -get_script_args = ScriptWriter.get_script_args -get_script_header = ScriptWriter.get_script_header - - -def get_win_launcher(type): - """ - Load the Windows launcher (executable) suitable for launching a script. - - `type` should be either 'cli' or 'gui' - - Returns the executable as a byte string. - """ - launcher_fn = '%s.exe' % type - if is_64bit(): - launcher_fn = launcher_fn.replace(".", "-64.") - else: - launcher_fn = launcher_fn.replace(".", "-32.") - return resource_string('setuptools', launcher_fn) - - -def load_launcher_manifest(name): - manifest = pkg_resources.resource_string(__name__, 'launcher manifest.xml') - if six.PY2: - return manifest % vars() - else: - return manifest.decode('utf-8') % vars() - - -def rmtree(path, ignore_errors=False, onerror=auto_chmod): - return shutil.rmtree(path, ignore_errors, onerror) - - -def current_umask(): - tmp = os.umask(0o022) - os.umask(tmp) - return tmp - - -def bootstrap(): - # This function is called when setuptools*.egg is run using /bin/sh - import setuptools - - argv0 = os.path.dirname(setuptools.__path__[0]) - sys.argv[0] = argv0 - sys.argv.append(argv0) - main() - - -def main(argv=None, **kw): - from setuptools import setup - from setuptools.dist import Distribution - - class DistributionWithoutHelpCommands(Distribution): - common_usage = "" - - def _show_help(self, *args, **kw): - with _patch_usage(): - Distribution._show_help(self, *args, **kw) - - if argv is None: - argv = sys.argv[1:] - - with _patch_usage(): - setup( - script_args=['-q', 'easy_install', '-v'] + argv, - script_name=sys.argv[0] or 'easy_install', - distclass=DistributionWithoutHelpCommands, - **kw - ) - - -@contextlib.contextmanager -def _patch_usage(): - import distutils.core - USAGE = textwrap.dedent(""" - usage: %(script)s [options] requirement_or_url ... - or: %(script)s --help - """).lstrip() - - def gen_usage(script_name): - return USAGE % dict( - script=os.path.basename(script_name), - ) - - saved = distutils.core.gen_usage - distutils.core.gen_usage = gen_usage - try: - yield - finally: - distutils.core.gen_usage = saved - -class EasyInstallDeprecationWarning(SetuptoolsDeprecationWarning): - """Class for warning about deprecations in EasyInstall in SetupTools. Not ignored by default, unlike DeprecationWarning.""" - diff --git a/env/lib/python3.7/site-packages/setuptools/command/egg_info.py b/env/lib/python3.7/site-packages/setuptools/command/egg_info.py deleted file mode 100644 index 5d8f451..0000000 --- a/env/lib/python3.7/site-packages/setuptools/command/egg_info.py +++ /dev/null @@ -1,717 +0,0 @@ -"""setuptools.command.egg_info - -Create a distribution's .egg-info directory and contents""" - -from distutils.filelist import FileList as _FileList -from distutils.errors import DistutilsInternalError -from distutils.util import convert_path -from distutils import log -import distutils.errors -import distutils.filelist -import os -import re -import sys -import io -import warnings -import time -import collections - -from setuptools.extern import six -from setuptools.extern.six.moves import map - -from setuptools import Command -from setuptools.command.sdist import sdist -from setuptools.command.sdist import walk_revctrl -from setuptools.command.setopt import edit_config -from setuptools.command import bdist_egg -from pkg_resources import ( - parse_requirements, safe_name, parse_version, - safe_version, yield_lines, EntryPoint, iter_entry_points, to_filename) -import setuptools.unicode_utils as unicode_utils -from setuptools.glob import glob - -from setuptools.extern import packaging -from setuptools import SetuptoolsDeprecationWarning - -def translate_pattern(glob): - """ - Translate a file path glob like '*.txt' in to a regular expression. - This differs from fnmatch.translate which allows wildcards to match - directory separators. It also knows about '**/' which matches any number of - directories. - """ - pat = '' - - # This will split on '/' within [character classes]. This is deliberate. - chunks = glob.split(os.path.sep) - - sep = re.escape(os.sep) - valid_char = '[^%s]' % (sep,) - - for c, chunk in enumerate(chunks): - last_chunk = c == len(chunks) - 1 - - # Chunks that are a literal ** are globstars. They match anything. - if chunk == '**': - if last_chunk: - # Match anything if this is the last component - pat += '.*' - else: - # Match '(name/)*' - pat += '(?:%s+%s)*' % (valid_char, sep) - continue # Break here as the whole path component has been handled - - # Find any special characters in the remainder - i = 0 - chunk_len = len(chunk) - while i < chunk_len: - char = chunk[i] - if char == '*': - # Match any number of name characters - pat += valid_char + '*' - elif char == '?': - # Match a name character - pat += valid_char - elif char == '[': - # Character class - inner_i = i + 1 - # Skip initial !/] chars - if inner_i < chunk_len and chunk[inner_i] == '!': - inner_i = inner_i + 1 - if inner_i < chunk_len and chunk[inner_i] == ']': - inner_i = inner_i + 1 - - # Loop till the closing ] is found - while inner_i < chunk_len and chunk[inner_i] != ']': - inner_i = inner_i + 1 - - if inner_i >= chunk_len: - # Got to the end of the string without finding a closing ] - # Do not treat this as a matching group, but as a literal [ - pat += re.escape(char) - else: - # Grab the insides of the [brackets] - inner = chunk[i + 1:inner_i] - char_class = '' - - # Class negation - if inner[0] == '!': - char_class = '^' - inner = inner[1:] - - char_class += re.escape(inner) - pat += '[%s]' % (char_class,) - - # Skip to the end ] - i = inner_i - else: - pat += re.escape(char) - i += 1 - - # Join each chunk with the dir separator - if not last_chunk: - pat += sep - - pat += r'\Z' - return re.compile(pat, flags=re.MULTILINE|re.DOTALL) - - -class InfoCommon: - tag_build = None - tag_date = None - - @property - def name(self): - return safe_name(self.distribution.get_name()) - - def tagged_version(self): - version = self.distribution.get_version() - # egg_info may be called more than once for a distribution, - # in which case the version string already contains all tags. - if self.vtags and version.endswith(self.vtags): - return safe_version(version) - return safe_version(version + self.vtags) - - def tags(self): - version = '' - if self.tag_build: - version += self.tag_build - if self.tag_date: - version += time.strftime("-%Y%m%d") - return version - vtags = property(tags) - - -class egg_info(InfoCommon, Command): - description = "create a distribution's .egg-info directory" - - user_options = [ - ('egg-base=', 'e', "directory containing .egg-info directories" - " (default: top of the source tree)"), - ('tag-date', 'd', "Add date stamp (e.g. 20050528) to version number"), - ('tag-build=', 'b', "Specify explicit tag to add to version number"), - ('no-date', 'D', "Don't include date stamp [default]"), - ] - - boolean_options = ['tag-date'] - negative_opt = { - 'no-date': 'tag-date', - } - - def initialize_options(self): - self.egg_base = None - self.egg_name = None - self.egg_info = None - self.egg_version = None - self.broken_egg_info = False - - #################################### - # allow the 'tag_svn_revision' to be detected and - # set, supporting sdists built on older Setuptools. - @property - def tag_svn_revision(self): - pass - - @tag_svn_revision.setter - def tag_svn_revision(self, value): - pass - #################################### - - def save_version_info(self, filename): - """ - Materialize the value of date into the - build tag. Install build keys in a deterministic order - to avoid arbitrary reordering on subsequent builds. - """ - egg_info = collections.OrderedDict() - # follow the order these keys would have been added - # when PYTHONHASHSEED=0 - egg_info['tag_build'] = self.tags() - egg_info['tag_date'] = 0 - edit_config(filename, dict(egg_info=egg_info)) - - def finalize_options(self): - # Note: we need to capture the current value returned - # by `self.tagged_version()`, so we can later update - # `self.distribution.metadata.version` without - # repercussions. - self.egg_name = self.name - self.egg_version = self.tagged_version() - parsed_version = parse_version(self.egg_version) - - try: - is_version = isinstance(parsed_version, packaging.version.Version) - spec = ( - "%s==%s" if is_version else "%s===%s" - ) - list( - parse_requirements(spec % (self.egg_name, self.egg_version)) - ) - except ValueError: - raise distutils.errors.DistutilsOptionError( - "Invalid distribution name or version syntax: %s-%s" % - (self.egg_name, self.egg_version) - ) - - if self.egg_base is None: - dirs = self.distribution.package_dir - self.egg_base = (dirs or {}).get('', os.curdir) - - self.ensure_dirname('egg_base') - self.egg_info = to_filename(self.egg_name) + '.egg-info' - if self.egg_base != os.curdir: - self.egg_info = os.path.join(self.egg_base, self.egg_info) - if '-' in self.egg_name: - self.check_broken_egg_info() - - # Set package version for the benefit of dumber commands - # (e.g. sdist, bdist_wininst, etc.) - # - self.distribution.metadata.version = self.egg_version - - # If we bootstrapped around the lack of a PKG-INFO, as might be the - # case in a fresh checkout, make sure that any special tags get added - # to the version info - # - pd = self.distribution._patched_dist - if pd is not None and pd.key == self.egg_name.lower(): - pd._version = self.egg_version - pd._parsed_version = parse_version(self.egg_version) - self.distribution._patched_dist = None - - def write_or_delete_file(self, what, filename, data, force=False): - """Write `data` to `filename` or delete if empty - - If `data` is non-empty, this routine is the same as ``write_file()``. - If `data` is empty but not ``None``, this is the same as calling - ``delete_file(filename)`. If `data` is ``None``, then this is a no-op - unless `filename` exists, in which case a warning is issued about the - orphaned file (if `force` is false), or deleted (if `force` is true). - """ - if data: - self.write_file(what, filename, data) - elif os.path.exists(filename): - if data is None and not force: - log.warn( - "%s not set in setup(), but %s exists", what, filename - ) - return - else: - self.delete_file(filename) - - def write_file(self, what, filename, data): - """Write `data` to `filename` (if not a dry run) after announcing it - - `what` is used in a log message to identify what is being written - to the file. - """ - log.info("writing %s to %s", what, filename) - if six.PY3: - data = data.encode("utf-8") - if not self.dry_run: - f = open(filename, 'wb') - f.write(data) - f.close() - - def delete_file(self, filename): - """Delete `filename` (if not a dry run) after announcing it""" - log.info("deleting %s", filename) - if not self.dry_run: - os.unlink(filename) - - def run(self): - self.mkpath(self.egg_info) - os.utime(self.egg_info, None) - installer = self.distribution.fetch_build_egg - for ep in iter_entry_points('egg_info.writers'): - ep.require(installer=installer) - writer = ep.resolve() - writer(self, ep.name, os.path.join(self.egg_info, ep.name)) - - # Get rid of native_libs.txt if it was put there by older bdist_egg - nl = os.path.join(self.egg_info, "native_libs.txt") - if os.path.exists(nl): - self.delete_file(nl) - - self.find_sources() - - def find_sources(self): - """Generate SOURCES.txt manifest file""" - manifest_filename = os.path.join(self.egg_info, "SOURCES.txt") - mm = manifest_maker(self.distribution) - mm.manifest = manifest_filename - mm.run() - self.filelist = mm.filelist - - def check_broken_egg_info(self): - bei = self.egg_name + '.egg-info' - if self.egg_base != os.curdir: - bei = os.path.join(self.egg_base, bei) - if os.path.exists(bei): - log.warn( - "-" * 78 + '\n' - "Note: Your current .egg-info directory has a '-' in its name;" - '\nthis will not work correctly with "setup.py develop".\n\n' - 'Please rename %s to %s to correct this problem.\n' + '-' * 78, - bei, self.egg_info - ) - self.broken_egg_info = self.egg_info - self.egg_info = bei # make it work for now - - -class FileList(_FileList): - # Implementations of the various MANIFEST.in commands - - def process_template_line(self, line): - # Parse the line: split it up, make sure the right number of words - # is there, and return the relevant words. 'action' is always - # defined: it's the first word of the line. Which of the other - # three are defined depends on the action; it'll be either - # patterns, (dir and patterns), or (dir_pattern). - (action, patterns, dir, dir_pattern) = self._parse_template_line(line) - - # OK, now we know that the action is valid and we have the - # right number of words on the line for that action -- so we - # can proceed with minimal error-checking. - if action == 'include': - self.debug_print("include " + ' '.join(patterns)) - for pattern in patterns: - if not self.include(pattern): - log.warn("warning: no files found matching '%s'", pattern) - - elif action == 'exclude': - self.debug_print("exclude " + ' '.join(patterns)) - for pattern in patterns: - if not self.exclude(pattern): - log.warn(("warning: no previously-included files " - "found matching '%s'"), pattern) - - elif action == 'global-include': - self.debug_print("global-include " + ' '.join(patterns)) - for pattern in patterns: - if not self.global_include(pattern): - log.warn(("warning: no files found matching '%s' " - "anywhere in distribution"), pattern) - - elif action == 'global-exclude': - self.debug_print("global-exclude " + ' '.join(patterns)) - for pattern in patterns: - if not self.global_exclude(pattern): - log.warn(("warning: no previously-included files matching " - "'%s' found anywhere in distribution"), - pattern) - - elif action == 'recursive-include': - self.debug_print("recursive-include %s %s" % - (dir, ' '.join(patterns))) - for pattern in patterns: - if not self.recursive_include(dir, pattern): - log.warn(("warning: no files found matching '%s' " - "under directory '%s'"), - pattern, dir) - - elif action == 'recursive-exclude': - self.debug_print("recursive-exclude %s %s" % - (dir, ' '.join(patterns))) - for pattern in patterns: - if not self.recursive_exclude(dir, pattern): - log.warn(("warning: no previously-included files matching " - "'%s' found under directory '%s'"), - pattern, dir) - - elif action == 'graft': - self.debug_print("graft " + dir_pattern) - if not self.graft(dir_pattern): - log.warn("warning: no directories found matching '%s'", - dir_pattern) - - elif action == 'prune': - self.debug_print("prune " + dir_pattern) - if not self.prune(dir_pattern): - log.warn(("no previously-included directories found " - "matching '%s'"), dir_pattern) - - else: - raise DistutilsInternalError( - "this cannot happen: invalid action '%s'" % action) - - def _remove_files(self, predicate): - """ - Remove all files from the file list that match the predicate. - Return True if any matching files were removed - """ - found = False - for i in range(len(self.files) - 1, -1, -1): - if predicate(self.files[i]): - self.debug_print(" removing " + self.files[i]) - del self.files[i] - found = True - return found - - def include(self, pattern): - """Include files that match 'pattern'.""" - found = [f for f in glob(pattern) if not os.path.isdir(f)] - self.extend(found) - return bool(found) - - def exclude(self, pattern): - """Exclude files that match 'pattern'.""" - match = translate_pattern(pattern) - return self._remove_files(match.match) - - def recursive_include(self, dir, pattern): - """ - Include all files anywhere in 'dir/' that match the pattern. - """ - full_pattern = os.path.join(dir, '**', pattern) - found = [f for f in glob(full_pattern, recursive=True) - if not os.path.isdir(f)] - self.extend(found) - return bool(found) - - def recursive_exclude(self, dir, pattern): - """ - Exclude any file anywhere in 'dir/' that match the pattern. - """ - match = translate_pattern(os.path.join(dir, '**', pattern)) - return self._remove_files(match.match) - - def graft(self, dir): - """Include all files from 'dir/'.""" - found = [ - item - for match_dir in glob(dir) - for item in distutils.filelist.findall(match_dir) - ] - self.extend(found) - return bool(found) - - def prune(self, dir): - """Filter out files from 'dir/'.""" - match = translate_pattern(os.path.join(dir, '**')) - return self._remove_files(match.match) - - def global_include(self, pattern): - """ - Include all files anywhere in the current directory that match the - pattern. This is very inefficient on large file trees. - """ - if self.allfiles is None: - self.findall() - match = translate_pattern(os.path.join('**', pattern)) - found = [f for f in self.allfiles if match.match(f)] - self.extend(found) - return bool(found) - - def global_exclude(self, pattern): - """ - Exclude all files anywhere that match the pattern. - """ - match = translate_pattern(os.path.join('**', pattern)) - return self._remove_files(match.match) - - def append(self, item): - if item.endswith('\r'): # Fix older sdists built on Windows - item = item[:-1] - path = convert_path(item) - - if self._safe_path(path): - self.files.append(path) - - def extend(self, paths): - self.files.extend(filter(self._safe_path, paths)) - - def _repair(self): - """ - Replace self.files with only safe paths - - Because some owners of FileList manipulate the underlying - ``files`` attribute directly, this method must be called to - repair those paths. - """ - self.files = list(filter(self._safe_path, self.files)) - - def _safe_path(self, path): - enc_warn = "'%s' not %s encodable -- skipping" - - # To avoid accidental trans-codings errors, first to unicode - u_path = unicode_utils.filesys_decode(path) - if u_path is None: - log.warn("'%s' in unexpected encoding -- skipping" % path) - return False - - # Must ensure utf-8 encodability - utf8_path = unicode_utils.try_encode(u_path, "utf-8") - if utf8_path is None: - log.warn(enc_warn, path, 'utf-8') - return False - - try: - # accept is either way checks out - if os.path.exists(u_path) or os.path.exists(utf8_path): - return True - # this will catch any encode errors decoding u_path - except UnicodeEncodeError: - log.warn(enc_warn, path, sys.getfilesystemencoding()) - - -class manifest_maker(sdist): - template = "MANIFEST.in" - - def initialize_options(self): - self.use_defaults = 1 - self.prune = 1 - self.manifest_only = 1 - self.force_manifest = 1 - - def finalize_options(self): - pass - - def run(self): - self.filelist = FileList() - if not os.path.exists(self.manifest): - self.write_manifest() # it must exist so it'll get in the list - self.add_defaults() - if os.path.exists(self.template): - self.read_template() - self.prune_file_list() - self.filelist.sort() - self.filelist.remove_duplicates() - self.write_manifest() - - def _manifest_normalize(self, path): - path = unicode_utils.filesys_decode(path) - return path.replace(os.sep, '/') - - def write_manifest(self): - """ - Write the file list in 'self.filelist' to the manifest file - named by 'self.manifest'. - """ - self.filelist._repair() - - # Now _repairs should encodability, but not unicode - files = [self._manifest_normalize(f) for f in self.filelist.files] - msg = "writing manifest file '%s'" % self.manifest - self.execute(write_file, (self.manifest, files), msg) - - def warn(self, msg): - if not self._should_suppress_warning(msg): - sdist.warn(self, msg) - - @staticmethod - def _should_suppress_warning(msg): - """ - suppress missing-file warnings from sdist - """ - return re.match(r"standard file .*not found", msg) - - def add_defaults(self): - sdist.add_defaults(self) - self.check_license() - self.filelist.append(self.template) - self.filelist.append(self.manifest) - rcfiles = list(walk_revctrl()) - if rcfiles: - self.filelist.extend(rcfiles) - elif os.path.exists(self.manifest): - self.read_manifest() - - if os.path.exists("setup.py"): - # setup.py should be included by default, even if it's not - # the script called to create the sdist - self.filelist.append("setup.py") - - ei_cmd = self.get_finalized_command('egg_info') - self.filelist.graft(ei_cmd.egg_info) - - def prune_file_list(self): - build = self.get_finalized_command('build') - base_dir = self.distribution.get_fullname() - self.filelist.prune(build.build_base) - self.filelist.prune(base_dir) - sep = re.escape(os.sep) - self.filelist.exclude_pattern(r'(^|' + sep + r')(RCS|CVS|\.svn)' + sep, - is_regex=1) - - -def write_file(filename, contents): - """Create a file with the specified name and write 'contents' (a - sequence of strings without line terminators) to it. - """ - contents = "\n".join(contents) - - # assuming the contents has been vetted for utf-8 encoding - contents = contents.encode("utf-8") - - with open(filename, "wb") as f: # always write POSIX-style manifest - f.write(contents) - - -def write_pkg_info(cmd, basename, filename): - log.info("writing %s", filename) - if not cmd.dry_run: - metadata = cmd.distribution.metadata - metadata.version, oldver = cmd.egg_version, metadata.version - metadata.name, oldname = cmd.egg_name, metadata.name - - try: - # write unescaped data to PKG-INFO, so older pkg_resources - # can still parse it - metadata.write_pkg_info(cmd.egg_info) - finally: - metadata.name, metadata.version = oldname, oldver - - safe = getattr(cmd.distribution, 'zip_safe', None) - - bdist_egg.write_safety_flag(cmd.egg_info, safe) - - -def warn_depends_obsolete(cmd, basename, filename): - if os.path.exists(filename): - log.warn( - "WARNING: 'depends.txt' is not used by setuptools 0.6!\n" - "Use the install_requires/extras_require setup() args instead." - ) - - -def _write_requirements(stream, reqs): - lines = yield_lines(reqs or ()) - append_cr = lambda line: line + '\n' - lines = map(append_cr, lines) - stream.writelines(lines) - - -def write_requirements(cmd, basename, filename): - dist = cmd.distribution - data = six.StringIO() - _write_requirements(data, dist.install_requires) - extras_require = dist.extras_require or {} - for extra in sorted(extras_require): - data.write('\n[{extra}]\n'.format(**vars())) - _write_requirements(data, extras_require[extra]) - cmd.write_or_delete_file("requirements", filename, data.getvalue()) - - -def write_setup_requirements(cmd, basename, filename): - data = io.StringIO() - _write_requirements(data, cmd.distribution.setup_requires) - cmd.write_or_delete_file("setup-requirements", filename, data.getvalue()) - - -def write_toplevel_names(cmd, basename, filename): - pkgs = dict.fromkeys( - [ - k.split('.', 1)[0] - for k in cmd.distribution.iter_distribution_names() - ] - ) - cmd.write_file("top-level names", filename, '\n'.join(sorted(pkgs)) + '\n') - - -def overwrite_arg(cmd, basename, filename): - write_arg(cmd, basename, filename, True) - - -def write_arg(cmd, basename, filename, force=False): - argname = os.path.splitext(basename)[0] - value = getattr(cmd.distribution, argname, None) - if value is not None: - value = '\n'.join(value) + '\n' - cmd.write_or_delete_file(argname, filename, value, force) - - -def write_entries(cmd, basename, filename): - ep = cmd.distribution.entry_points - - if isinstance(ep, six.string_types) or ep is None: - data = ep - elif ep is not None: - data = [] - for section, contents in sorted(ep.items()): - if not isinstance(contents, six.string_types): - contents = EntryPoint.parse_group(section, contents) - contents = '\n'.join(sorted(map(str, contents.values()))) - data.append('[%s]\n%s\n\n' % (section, contents)) - data = ''.join(data) - - cmd.write_or_delete_file('entry points', filename, data, True) - - -def get_pkg_info_revision(): - """ - Get a -r### off of PKG-INFO Version in case this is an sdist of - a subversion revision. - """ - warnings.warn("get_pkg_info_revision is deprecated.", EggInfoDeprecationWarning) - if os.path.exists('PKG-INFO'): - with io.open('PKG-INFO') as f: - for line in f: - match = re.match(r"Version:.*-r(\d+)\s*$", line) - if match: - return int(match.group(1)) - return 0 - - -class EggInfoDeprecationWarning(SetuptoolsDeprecationWarning): - """Class for warning about deprecations in eggInfo in setupTools. Not ignored by default, unlike DeprecationWarning.""" diff --git a/env/lib/python3.7/site-packages/setuptools/command/install.py b/env/lib/python3.7/site-packages/setuptools/command/install.py deleted file mode 100644 index 31a5ddb..0000000 --- a/env/lib/python3.7/site-packages/setuptools/command/install.py +++ /dev/null @@ -1,125 +0,0 @@ -from distutils.errors import DistutilsArgError -import inspect -import glob -import warnings -import platform -import distutils.command.install as orig - -import setuptools - -# Prior to numpy 1.9, NumPy relies on the '_install' name, so provide it for -# now. See https://github.com/pypa/setuptools/issues/199/ -_install = orig.install - - -class install(orig.install): - """Use easy_install to install the package, w/dependencies""" - - user_options = orig.install.user_options + [ - ('old-and-unmanageable', None, "Try not to use this!"), - ('single-version-externally-managed', None, - "used by system package builders to create 'flat' eggs"), - ] - boolean_options = orig.install.boolean_options + [ - 'old-and-unmanageable', 'single-version-externally-managed', - ] - new_commands = [ - ('install_egg_info', lambda self: True), - ('install_scripts', lambda self: True), - ] - _nc = dict(new_commands) - - def initialize_options(self): - orig.install.initialize_options(self) - self.old_and_unmanageable = None - self.single_version_externally_managed = None - - def finalize_options(self): - orig.install.finalize_options(self) - if self.root: - self.single_version_externally_managed = True - elif self.single_version_externally_managed: - if not self.root and not self.record: - raise DistutilsArgError( - "You must specify --record or --root when building system" - " packages" - ) - - def handle_extra_path(self): - if self.root or self.single_version_externally_managed: - # explicit backward-compatibility mode, allow extra_path to work - return orig.install.handle_extra_path(self) - - # Ignore extra_path when installing an egg (or being run by another - # command without --root or --single-version-externally-managed - self.path_file = None - self.extra_dirs = '' - - def run(self): - # Explicit request for old-style install? Just do it - if self.old_and_unmanageable or self.single_version_externally_managed: - return orig.install.run(self) - - if not self._called_from_setup(inspect.currentframe()): - # Run in backward-compatibility mode to support bdist_* commands. - orig.install.run(self) - else: - self.do_egg_install() - - @staticmethod - def _called_from_setup(run_frame): - """ - Attempt to detect whether run() was called from setup() or by another - command. If called by setup(), the parent caller will be the - 'run_command' method in 'distutils.dist', and *its* caller will be - the 'run_commands' method. If called any other way, the - immediate caller *might* be 'run_command', but it won't have been - called by 'run_commands'. Return True in that case or if a call stack - is unavailable. Return False otherwise. - """ - if run_frame is None: - msg = "Call stack not available. bdist_* commands may fail." - warnings.warn(msg) - if platform.python_implementation() == 'IronPython': - msg = "For best results, pass -X:Frames to enable call stack." - warnings.warn(msg) - return True - res = inspect.getouterframes(run_frame)[2] - caller, = res[:1] - info = inspect.getframeinfo(caller) - caller_module = caller.f_globals.get('__name__', '') - return ( - caller_module == 'distutils.dist' - and info.function == 'run_commands' - ) - - def do_egg_install(self): - - easy_install = self.distribution.get_command_class('easy_install') - - cmd = easy_install( - self.distribution, args="x", root=self.root, record=self.record, - ) - cmd.ensure_finalized() # finalize before bdist_egg munges install cmd - cmd.always_copy_from = '.' # make sure local-dir eggs get installed - - # pick up setup-dir .egg files only: no .egg-info - cmd.package_index.scan(glob.glob('*.egg')) - - self.run_command('bdist_egg') - args = [self.distribution.get_command_obj('bdist_egg').egg_output] - - if setuptools.bootstrap_install_from: - # Bootstrap self-installation of setuptools - args.insert(0, setuptools.bootstrap_install_from) - - cmd.args = args - cmd.run() - setuptools.bootstrap_install_from = None - - -# XXX Python 3.1 doesn't see _nc if this is inside the class -install.sub_commands = ( - [cmd for cmd in orig.install.sub_commands if cmd[0] not in install._nc] + - install.new_commands -) diff --git a/env/lib/python3.7/site-packages/setuptools/command/install_egg_info.py b/env/lib/python3.7/site-packages/setuptools/command/install_egg_info.py deleted file mode 100644 index edc4718..0000000 --- a/env/lib/python3.7/site-packages/setuptools/command/install_egg_info.py +++ /dev/null @@ -1,62 +0,0 @@ -from distutils import log, dir_util -import os - -from setuptools import Command -from setuptools import namespaces -from setuptools.archive_util import unpack_archive -import pkg_resources - - -class install_egg_info(namespaces.Installer, Command): - """Install an .egg-info directory for the package""" - - description = "Install an .egg-info directory for the package" - - user_options = [ - ('install-dir=', 'd', "directory to install to"), - ] - - def initialize_options(self): - self.install_dir = None - - def finalize_options(self): - self.set_undefined_options('install_lib', - ('install_dir', 'install_dir')) - ei_cmd = self.get_finalized_command("egg_info") - basename = pkg_resources.Distribution( - None, None, ei_cmd.egg_name, ei_cmd.egg_version - ).egg_name() + '.egg-info' - self.source = ei_cmd.egg_info - self.target = os.path.join(self.install_dir, basename) - self.outputs = [] - - def run(self): - self.run_command('egg_info') - if os.path.isdir(self.target) and not os.path.islink(self.target): - dir_util.remove_tree(self.target, dry_run=self.dry_run) - elif os.path.exists(self.target): - self.execute(os.unlink, (self.target,), "Removing " + self.target) - if not self.dry_run: - pkg_resources.ensure_directory(self.target) - self.execute( - self.copytree, (), "Copying %s to %s" % (self.source, self.target) - ) - self.install_namespaces() - - def get_outputs(self): - return self.outputs - - def copytree(self): - # Copy the .egg-info tree to site-packages - def skimmer(src, dst): - # filter out source-control directories; note that 'src' is always - # a '/'-separated path, regardless of platform. 'dst' is a - # platform-specific path. - for skip in '.svn/', 'CVS/': - if src.startswith(skip) or '/' + skip in src: - return None - self.outputs.append(dst) - log.debug("Copying %s to %s", src, dst) - return dst - - unpack_archive(self.source, self.target, skimmer) diff --git a/env/lib/python3.7/site-packages/setuptools/command/install_lib.py b/env/lib/python3.7/site-packages/setuptools/command/install_lib.py deleted file mode 100644 index 2b31c3e..0000000 --- a/env/lib/python3.7/site-packages/setuptools/command/install_lib.py +++ /dev/null @@ -1,121 +0,0 @@ -import os -import imp -from itertools import product, starmap -import distutils.command.install_lib as orig - - -class install_lib(orig.install_lib): - """Don't add compiled flags to filenames of non-Python files""" - - def run(self): - self.build() - outfiles = self.install() - if outfiles is not None: - # always compile, in case we have any extension stubs to deal with - self.byte_compile(outfiles) - - def get_exclusions(self): - """ - Return a collections.Sized collections.Container of paths to be - excluded for single_version_externally_managed installations. - """ - all_packages = ( - pkg - for ns_pkg in self._get_SVEM_NSPs() - for pkg in self._all_packages(ns_pkg) - ) - - excl_specs = product(all_packages, self._gen_exclusion_paths()) - return set(starmap(self._exclude_pkg_path, excl_specs)) - - def _exclude_pkg_path(self, pkg, exclusion_path): - """ - Given a package name and exclusion path within that package, - compute the full exclusion path. - """ - parts = pkg.split('.') + [exclusion_path] - return os.path.join(self.install_dir, *parts) - - @staticmethod - def _all_packages(pkg_name): - """ - >>> list(install_lib._all_packages('foo.bar.baz')) - ['foo.bar.baz', 'foo.bar', 'foo'] - """ - while pkg_name: - yield pkg_name - pkg_name, sep, child = pkg_name.rpartition('.') - - def _get_SVEM_NSPs(self): - """ - Get namespace packages (list) but only for - single_version_externally_managed installations and empty otherwise. - """ - # TODO: is it necessary to short-circuit here? i.e. what's the cost - # if get_finalized_command is called even when namespace_packages is - # False? - if not self.distribution.namespace_packages: - return [] - - install_cmd = self.get_finalized_command('install') - svem = install_cmd.single_version_externally_managed - - return self.distribution.namespace_packages if svem else [] - - @staticmethod - def _gen_exclusion_paths(): - """ - Generate file paths to be excluded for namespace packages (bytecode - cache files). - """ - # always exclude the package module itself - yield '__init__.py' - - yield '__init__.pyc' - yield '__init__.pyo' - - if not hasattr(imp, 'get_tag'): - return - - base = os.path.join('__pycache__', '__init__.' + imp.get_tag()) - yield base + '.pyc' - yield base + '.pyo' - yield base + '.opt-1.pyc' - yield base + '.opt-2.pyc' - - def copy_tree( - self, infile, outfile, - preserve_mode=1, preserve_times=1, preserve_symlinks=0, level=1 - ): - assert preserve_mode and preserve_times and not preserve_symlinks - exclude = self.get_exclusions() - - if not exclude: - return orig.install_lib.copy_tree(self, infile, outfile) - - # Exclude namespace package __init__.py* files from the output - - from setuptools.archive_util import unpack_directory - from distutils import log - - outfiles = [] - - def pf(src, dst): - if dst in exclude: - log.warn("Skipping installation of %s (namespace package)", - dst) - return False - - log.info("copying %s -> %s", src, os.path.dirname(dst)) - outfiles.append(dst) - return dst - - unpack_directory(infile, outfile, pf) - return outfiles - - def get_outputs(self): - outputs = orig.install_lib.get_outputs(self) - exclude = self.get_exclusions() - if exclude: - return [f for f in outputs if f not in exclude] - return outputs diff --git a/env/lib/python3.7/site-packages/setuptools/command/install_scripts.py b/env/lib/python3.7/site-packages/setuptools/command/install_scripts.py deleted file mode 100644 index 1623427..0000000 --- a/env/lib/python3.7/site-packages/setuptools/command/install_scripts.py +++ /dev/null @@ -1,65 +0,0 @@ -from distutils import log -import distutils.command.install_scripts as orig -import os -import sys - -from pkg_resources import Distribution, PathMetadata, ensure_directory - - -class install_scripts(orig.install_scripts): - """Do normal script install, plus any egg_info wrapper scripts""" - - def initialize_options(self): - orig.install_scripts.initialize_options(self) - self.no_ep = False - - def run(self): - import setuptools.command.easy_install as ei - - self.run_command("egg_info") - if self.distribution.scripts: - orig.install_scripts.run(self) # run first to set up self.outfiles - else: - self.outfiles = [] - if self.no_ep: - # don't install entry point scripts into .egg file! - return - - ei_cmd = self.get_finalized_command("egg_info") - dist = Distribution( - ei_cmd.egg_base, PathMetadata(ei_cmd.egg_base, ei_cmd.egg_info), - ei_cmd.egg_name, ei_cmd.egg_version, - ) - bs_cmd = self.get_finalized_command('build_scripts') - exec_param = getattr(bs_cmd, 'executable', None) - bw_cmd = self.get_finalized_command("bdist_wininst") - is_wininst = getattr(bw_cmd, '_is_running', False) - writer = ei.ScriptWriter - if is_wininst: - exec_param = "python.exe" - writer = ei.WindowsScriptWriter - if exec_param == sys.executable: - # In case the path to the Python executable contains a space, wrap - # it so it's not split up. - exec_param = [exec_param] - # resolve the writer to the environment - writer = writer.best() - cmd = writer.command_spec_class.best().from_param(exec_param) - for args in writer.get_args(dist, cmd.as_header()): - self.write_script(*args) - - def write_script(self, script_name, contents, mode="t", *ignored): - """Write an executable file to the scripts directory""" - from setuptools.command.easy_install import chmod, current_umask - - log.info("Installing %s script to %s", script_name, self.install_dir) - target = os.path.join(self.install_dir, script_name) - self.outfiles.append(target) - - mask = current_umask() - if not self.dry_run: - ensure_directory(target) - f = open(target, "w" + mode) - f.write(contents) - f.close() - chmod(target, 0o777 - mask) diff --git a/env/lib/python3.7/site-packages/setuptools/command/launcher manifest.xml b/env/lib/python3.7/site-packages/setuptools/command/launcher manifest.xml deleted file mode 100644 index 5972a96..0000000 --- a/env/lib/python3.7/site-packages/setuptools/command/launcher manifest.xml +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="yes"?> -<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> - <assemblyIdentity version="1.0.0.0" - processorArchitecture="X86" - name="%(name)s" - type="win32"/> - <!-- Identify the application security requirements. --> - <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> - <security> - <requestedPrivileges> - <requestedExecutionLevel level="asInvoker" uiAccess="false"/> - </requestedPrivileges> - </security> - </trustInfo> -</assembly> diff --git a/env/lib/python3.7/site-packages/setuptools/command/py36compat.py b/env/lib/python3.7/site-packages/setuptools/command/py36compat.py deleted file mode 100644 index 61063e7..0000000 --- a/env/lib/python3.7/site-packages/setuptools/command/py36compat.py +++ /dev/null @@ -1,136 +0,0 @@ -import os -from glob import glob -from distutils.util import convert_path -from distutils.command import sdist - -from setuptools.extern.six.moves import filter - - -class sdist_add_defaults: - """ - Mix-in providing forward-compatibility for functionality as found in - distutils on Python 3.7. - - Do not edit the code in this class except to update functionality - as implemented in distutils. Instead, override in the subclass. - """ - - def add_defaults(self): - """Add all the default files to self.filelist: - - README or README.txt - - setup.py - - test/test*.py - - all pure Python modules mentioned in setup script - - all files pointed by package_data (build_py) - - all files defined in data_files. - - all files defined as scripts. - - all C sources listed as part of extensions or C libraries - in the setup script (doesn't catch C headers!) - Warns if (README or README.txt) or setup.py are missing; everything - else is optional. - """ - self._add_defaults_standards() - self._add_defaults_optional() - self._add_defaults_python() - self._add_defaults_data_files() - self._add_defaults_ext() - self._add_defaults_c_libs() - self._add_defaults_scripts() - - @staticmethod - def _cs_path_exists(fspath): - """ - Case-sensitive path existence check - - >>> sdist_add_defaults._cs_path_exists(__file__) - True - >>> sdist_add_defaults._cs_path_exists(__file__.upper()) - False - """ - if not os.path.exists(fspath): - return False - # make absolute so we always have a directory - abspath = os.path.abspath(fspath) - directory, filename = os.path.split(abspath) - return filename in os.listdir(directory) - - def _add_defaults_standards(self): - standards = [self.READMES, self.distribution.script_name] - for fn in standards: - if isinstance(fn, tuple): - alts = fn - got_it = False - for fn in alts: - if self._cs_path_exists(fn): - got_it = True - self.filelist.append(fn) - break - - if not got_it: - self.warn("standard file not found: should have one of " + - ', '.join(alts)) - else: - if self._cs_path_exists(fn): - self.filelist.append(fn) - else: - self.warn("standard file '%s' not found" % fn) - - def _add_defaults_optional(self): - optional = ['test/test*.py', 'setup.cfg'] - for pattern in optional: - files = filter(os.path.isfile, glob(pattern)) - self.filelist.extend(files) - - def _add_defaults_python(self): - # build_py is used to get: - # - python modules - # - files defined in package_data - build_py = self.get_finalized_command('build_py') - - # getting python files - if self.distribution.has_pure_modules(): - self.filelist.extend(build_py.get_source_files()) - - # getting package_data files - # (computed in build_py.data_files by build_py.finalize_options) - for pkg, src_dir, build_dir, filenames in build_py.data_files: - for filename in filenames: - self.filelist.append(os.path.join(src_dir, filename)) - - def _add_defaults_data_files(self): - # getting distribution.data_files - if self.distribution.has_data_files(): - for item in self.distribution.data_files: - if isinstance(item, str): - # plain file - item = convert_path(item) - if os.path.isfile(item): - self.filelist.append(item) - else: - # a (dirname, filenames) tuple - dirname, filenames = item - for f in filenames: - f = convert_path(f) - if os.path.isfile(f): - self.filelist.append(f) - - def _add_defaults_ext(self): - if self.distribution.has_ext_modules(): - build_ext = self.get_finalized_command('build_ext') - self.filelist.extend(build_ext.get_source_files()) - - def _add_defaults_c_libs(self): - if self.distribution.has_c_libraries(): - build_clib = self.get_finalized_command('build_clib') - self.filelist.extend(build_clib.get_source_files()) - - def _add_defaults_scripts(self): - if self.distribution.has_scripts(): - build_scripts = self.get_finalized_command('build_scripts') - self.filelist.extend(build_scripts.get_source_files()) - - -if hasattr(sdist.sdist, '_add_defaults_standards'): - # disable the functionality already available upstream - class sdist_add_defaults: - pass diff --git a/env/lib/python3.7/site-packages/setuptools/command/register.py b/env/lib/python3.7/site-packages/setuptools/command/register.py deleted file mode 100644 index 98bc015..0000000 --- a/env/lib/python3.7/site-packages/setuptools/command/register.py +++ /dev/null @@ -1,18 +0,0 @@ -from distutils import log -import distutils.command.register as orig - - -class register(orig.register): - __doc__ = orig.register.__doc__ - - def run(self): - try: - # Make sure that we are using valid current name/version info - self.run_command('egg_info') - orig.register.run(self) - finally: - self.announce( - "WARNING: Registering is deprecated, use twine to " - "upload instead (https://pypi.org/p/twine/)", - log.WARN - ) diff --git a/env/lib/python3.7/site-packages/setuptools/command/rotate.py b/env/lib/python3.7/site-packages/setuptools/command/rotate.py deleted file mode 100644 index b89353f..0000000 --- a/env/lib/python3.7/site-packages/setuptools/command/rotate.py +++ /dev/null @@ -1,66 +0,0 @@ -from distutils.util import convert_path -from distutils import log -from distutils.errors import DistutilsOptionError -import os -import shutil - -from setuptools.extern import six - -from setuptools import Command - - -class rotate(Command): - """Delete older distributions""" - - description = "delete older distributions, keeping N newest files" - user_options = [ - ('match=', 'm', "patterns to match (required)"), - ('dist-dir=', 'd', "directory where the distributions are"), - ('keep=', 'k', "number of matching distributions to keep"), - ] - - boolean_options = [] - - def initialize_options(self): - self.match = None - self.dist_dir = None - self.keep = None - - def finalize_options(self): - if self.match is None: - raise DistutilsOptionError( - "Must specify one or more (comma-separated) match patterns " - "(e.g. '.zip' or '.egg')" - ) - if self.keep is None: - raise DistutilsOptionError("Must specify number of files to keep") - try: - self.keep = int(self.keep) - except ValueError: - raise DistutilsOptionError("--keep must be an integer") - if isinstance(self.match, six.string_types): - self.match = [ - convert_path(p.strip()) for p in self.match.split(',') - ] - self.set_undefined_options('bdist', ('dist_dir', 'dist_dir')) - - def run(self): - self.run_command("egg_info") - from glob import glob - - for pattern in self.match: - pattern = self.distribution.get_name() + '*' + pattern - files = glob(os.path.join(self.dist_dir, pattern)) - files = [(os.path.getmtime(f), f) for f in files] - files.sort() - files.reverse() - - log.info("%d file(s) matching %s", len(files), pattern) - files = files[self.keep:] - for (t, f) in files: - log.info("Deleting %s", f) - if not self.dry_run: - if os.path.isdir(f): - shutil.rmtree(f) - else: - os.unlink(f) diff --git a/env/lib/python3.7/site-packages/setuptools/command/saveopts.py b/env/lib/python3.7/site-packages/setuptools/command/saveopts.py deleted file mode 100644 index 611cec5..0000000 --- a/env/lib/python3.7/site-packages/setuptools/command/saveopts.py +++ /dev/null @@ -1,22 +0,0 @@ -from setuptools.command.setopt import edit_config, option_base - - -class saveopts(option_base): - """Save command-line options to a file""" - - description = "save supplied options to setup.cfg or other config file" - - def run(self): - dist = self.distribution - settings = {} - - for cmd in dist.command_options: - - if cmd == 'saveopts': - continue # don't save our own options! - - for opt, (src, val) in dist.get_option_dict(cmd).items(): - if src == "command line": - settings.setdefault(cmd, {})[opt] = val - - edit_config(self.filename, settings, self.dry_run) diff --git a/env/lib/python3.7/site-packages/setuptools/command/sdist.py b/env/lib/python3.7/site-packages/setuptools/command/sdist.py deleted file mode 100644 index dc25398..0000000 --- a/env/lib/python3.7/site-packages/setuptools/command/sdist.py +++ /dev/null @@ -1,221 +0,0 @@ -from distutils import log -import distutils.command.sdist as orig -import os -import sys -import io -import contextlib - -from setuptools.extern import six - -from .py36compat import sdist_add_defaults - -import pkg_resources - -_default_revctrl = list - - -def walk_revctrl(dirname=''): - """Find all files under revision control""" - for ep in pkg_resources.iter_entry_points('setuptools.file_finders'): - for item in ep.load()(dirname): - yield item - - -class sdist(sdist_add_defaults, orig.sdist): - """Smart sdist that finds anything supported by revision control""" - - user_options = [ - ('formats=', None, - "formats for source distribution (comma-separated list)"), - ('keep-temp', 'k', - "keep the distribution tree around after creating " + - "archive file(s)"), - ('dist-dir=', 'd', - "directory to put the source distribution archive(s) in " - "[default: dist]"), - ] - - negative_opt = {} - - README_EXTENSIONS = ['', '.rst', '.txt', '.md'] - READMES = tuple('README{0}'.format(ext) for ext in README_EXTENSIONS) - - def run(self): - self.run_command('egg_info') - ei_cmd = self.get_finalized_command('egg_info') - self.filelist = ei_cmd.filelist - self.filelist.append(os.path.join(ei_cmd.egg_info, 'SOURCES.txt')) - self.check_readme() - - # Run sub commands - for cmd_name in self.get_sub_commands(): - self.run_command(cmd_name) - - self.make_distribution() - - dist_files = getattr(self.distribution, 'dist_files', []) - for file in self.archive_files: - data = ('sdist', '', file) - if data not in dist_files: - dist_files.append(data) - - def initialize_options(self): - orig.sdist.initialize_options(self) - - self._default_to_gztar() - - def _default_to_gztar(self): - # only needed on Python prior to 3.6. - if sys.version_info >= (3, 6, 0, 'beta', 1): - return - self.formats = ['gztar'] - - def make_distribution(self): - """ - Workaround for #516 - """ - with self._remove_os_link(): - orig.sdist.make_distribution(self) - - @staticmethod - @contextlib.contextmanager - def _remove_os_link(): - """ - In a context, remove and restore os.link if it exists - """ - - class NoValue: - pass - - orig_val = getattr(os, 'link', NoValue) - try: - del os.link - except Exception: - pass - try: - yield - finally: - if orig_val is not NoValue: - setattr(os, 'link', orig_val) - - def __read_template_hack(self): - # This grody hack closes the template file (MANIFEST.in) if an - # exception occurs during read_template. - # Doing so prevents an error when easy_install attempts to delete the - # file. - try: - orig.sdist.read_template(self) - except Exception: - _, _, tb = sys.exc_info() - tb.tb_next.tb_frame.f_locals['template'].close() - raise - - # Beginning with Python 2.7.2, 3.1.4, and 3.2.1, this leaky file handle - # has been fixed, so only override the method if we're using an earlier - # Python. - has_leaky_handle = ( - sys.version_info < (2, 7, 2) - or (3, 0) <= sys.version_info < (3, 1, 4) - or (3, 2) <= sys.version_info < (3, 2, 1) - ) - if has_leaky_handle: - read_template = __read_template_hack - - def _add_defaults_python(self): - """getting python files""" - if self.distribution.has_pure_modules(): - build_py = self.get_finalized_command('build_py') - self.filelist.extend(build_py.get_source_files()) - # This functionality is incompatible with include_package_data, and - # will in fact create an infinite recursion if include_package_data - # is True. Use of include_package_data will imply that - # distutils-style automatic handling of package_data is disabled - if not self.distribution.include_package_data: - for _, src_dir, _, filenames in build_py.data_files: - self.filelist.extend([os.path.join(src_dir, filename) - for filename in filenames]) - - def _add_defaults_data_files(self): - try: - if six.PY2: - sdist_add_defaults._add_defaults_data_files(self) - else: - super()._add_defaults_data_files() - except TypeError: - log.warn("data_files contains unexpected objects") - - def check_readme(self): - for f in self.READMES: - if os.path.exists(f): - return - else: - self.warn( - "standard file not found: should have one of " + - ', '.join(self.READMES) - ) - - def make_release_tree(self, base_dir, files): - orig.sdist.make_release_tree(self, base_dir, files) - - # Save any egg_info command line options used to create this sdist - dest = os.path.join(base_dir, 'setup.cfg') - if hasattr(os, 'link') and os.path.exists(dest): - # unlink and re-copy, since it might be hard-linked, and - # we don't want to change the source version - os.unlink(dest) - self.copy_file('setup.cfg', dest) - - self.get_finalized_command('egg_info').save_version_info(dest) - - def _manifest_is_not_generated(self): - # check for special comment used in 2.7.1 and higher - if not os.path.isfile(self.manifest): - return False - - with io.open(self.manifest, 'rb') as fp: - first_line = fp.readline() - return (first_line != - '# file GENERATED by distutils, do NOT edit\n'.encode()) - - def read_manifest(self): - """Read the manifest file (named by 'self.manifest') and use it to - fill in 'self.filelist', the list of files to include in the source - distribution. - """ - log.info("reading manifest file '%s'", self.manifest) - manifest = open(self.manifest, 'rb') - for line in manifest: - # The manifest must contain UTF-8. See #303. - if six.PY3: - try: - line = line.decode('UTF-8') - except UnicodeDecodeError: - log.warn("%r not UTF-8 decodable -- skipping" % line) - continue - # ignore comments and blank lines - line = line.strip() - if line.startswith('#') or not line: - continue - self.filelist.append(line) - manifest.close() - - def check_license(self): - """Checks if license_file' is configured and adds it to - 'self.filelist' if the value contains a valid path. - """ - - opts = self.distribution.get_option_dict('metadata') - - # ignore the source of the value - _, license_file = opts.get('license_file', (None, None)) - - if license_file is None: - log.debug("'license_file' option was not specified") - return - - if not os.path.exists(license_file): - log.warn("warning: Failed to find the configured license file '%s'", - license_file) - return - - self.filelist.append(license_file) diff --git a/env/lib/python3.7/site-packages/setuptools/command/setopt.py b/env/lib/python3.7/site-packages/setuptools/command/setopt.py deleted file mode 100644 index 7e57cc0..0000000 --- a/env/lib/python3.7/site-packages/setuptools/command/setopt.py +++ /dev/null @@ -1,149 +0,0 @@ -from distutils.util import convert_path -from distutils import log -from distutils.errors import DistutilsOptionError -import distutils -import os - -from setuptools.extern.six.moves import configparser - -from setuptools import Command - -__all__ = ['config_file', 'edit_config', 'option_base', 'setopt'] - - -def config_file(kind="local"): - """Get the filename of the distutils, local, global, or per-user config - - `kind` must be one of "local", "global", or "user" - """ - if kind == 'local': - return 'setup.cfg' - if kind == 'global': - return os.path.join( - os.path.dirname(distutils.__file__), 'distutils.cfg' - ) - if kind == 'user': - dot = os.name == 'posix' and '.' or '' - return os.path.expanduser(convert_path("~/%spydistutils.cfg" % dot)) - raise ValueError( - "config_file() type must be 'local', 'global', or 'user'", kind - ) - - -def edit_config(filename, settings, dry_run=False): - """Edit a configuration file to include `settings` - - `settings` is a dictionary of dictionaries or ``None`` values, keyed by - command/section name. A ``None`` value means to delete the entire section, - while a dictionary lists settings to be changed or deleted in that section. - A setting of ``None`` means to delete that setting. - """ - log.debug("Reading configuration from %s", filename) - opts = configparser.RawConfigParser() - opts.read([filename]) - for section, options in settings.items(): - if options is None: - log.info("Deleting section [%s] from %s", section, filename) - opts.remove_section(section) - else: - if not opts.has_section(section): - log.debug("Adding new section [%s] to %s", section, filename) - opts.add_section(section) - for option, value in options.items(): - if value is None: - log.debug( - "Deleting %s.%s from %s", - section, option, filename - ) - opts.remove_option(section, option) - if not opts.options(section): - log.info("Deleting empty [%s] section from %s", - section, filename) - opts.remove_section(section) - else: - log.debug( - "Setting %s.%s to %r in %s", - section, option, value, filename - ) - opts.set(section, option, value) - - log.info("Writing %s", filename) - if not dry_run: - with open(filename, 'w') as f: - opts.write(f) - - -class option_base(Command): - """Abstract base class for commands that mess with config files""" - - user_options = [ - ('global-config', 'g', - "save options to the site-wide distutils.cfg file"), - ('user-config', 'u', - "save options to the current user's pydistutils.cfg file"), - ('filename=', 'f', - "configuration file to use (default=setup.cfg)"), - ] - - boolean_options = [ - 'global-config', 'user-config', - ] - - def initialize_options(self): - self.global_config = None - self.user_config = None - self.filename = None - - def finalize_options(self): - filenames = [] - if self.global_config: - filenames.append(config_file('global')) - if self.user_config: - filenames.append(config_file('user')) - if self.filename is not None: - filenames.append(self.filename) - if not filenames: - filenames.append(config_file('local')) - if len(filenames) > 1: - raise DistutilsOptionError( - "Must specify only one configuration file option", - filenames - ) - self.filename, = filenames - - -class setopt(option_base): - """Save command-line options to a file""" - - description = "set an option in setup.cfg or another config file" - - user_options = [ - ('command=', 'c', 'command to set an option for'), - ('option=', 'o', 'option to set'), - ('set-value=', 's', 'value of the option'), - ('remove', 'r', 'remove (unset) the value'), - ] + option_base.user_options - - boolean_options = option_base.boolean_options + ['remove'] - - def initialize_options(self): - option_base.initialize_options(self) - self.command = None - self.option = None - self.set_value = None - self.remove = None - - def finalize_options(self): - option_base.finalize_options(self) - if self.command is None or self.option is None: - raise DistutilsOptionError("Must specify --command *and* --option") - if self.set_value is None and not self.remove: - raise DistutilsOptionError("Must specify --set-value or --remove") - - def run(self): - edit_config( - self.filename, { - self.command: {self.option.replace('-', '_'): self.set_value} - }, - self.dry_run - ) diff --git a/env/lib/python3.7/site-packages/setuptools/command/test.py b/env/lib/python3.7/site-packages/setuptools/command/test.py deleted file mode 100644 index 973e4eb..0000000 --- a/env/lib/python3.7/site-packages/setuptools/command/test.py +++ /dev/null @@ -1,271 +0,0 @@ -import os -import operator -import sys -import contextlib -import itertools -import unittest -from distutils.errors import DistutilsError, DistutilsOptionError -from distutils import log -from unittest import TestLoader - -from setuptools.extern import six -from setuptools.extern.six.moves import map, filter - -from pkg_resources import (resource_listdir, resource_exists, normalize_path, - working_set, _namespace_packages, evaluate_marker, - add_activation_listener, require, EntryPoint) -from setuptools import Command -from .build_py import _unique_everseen - -__metaclass__ = type - - -class ScanningLoader(TestLoader): - - def __init__(self): - TestLoader.__init__(self) - self._visited = set() - - def loadTestsFromModule(self, module, pattern=None): - """Return a suite of all tests cases contained in the given module - - If the module is a package, load tests from all the modules in it. - If the module has an ``additional_tests`` function, call it and add - the return value to the tests. - """ - if module in self._visited: - return None - self._visited.add(module) - - tests = [] - tests.append(TestLoader.loadTestsFromModule(self, module)) - - if hasattr(module, "additional_tests"): - tests.append(module.additional_tests()) - - if hasattr(module, '__path__'): - for file in resource_listdir(module.__name__, ''): - if file.endswith('.py') and file != '__init__.py': - submodule = module.__name__ + '.' + file[:-3] - else: - if resource_exists(module.__name__, file + '/__init__.py'): - submodule = module.__name__ + '.' + file - else: - continue - tests.append(self.loadTestsFromName(submodule)) - - if len(tests) != 1: - return self.suiteClass(tests) - else: - return tests[0] # don't create a nested suite for only one return - - -# adapted from jaraco.classes.properties:NonDataProperty -class NonDataProperty: - def __init__(self, fget): - self.fget = fget - - def __get__(self, obj, objtype=None): - if obj is None: - return self - return self.fget(obj) - - -class test(Command): - """Command to run unit tests after in-place build""" - - description = "run unit tests after in-place build" - - user_options = [ - ('test-module=', 'm', "Run 'test_suite' in specified module"), - ('test-suite=', 's', - "Run single test, case or suite (e.g. 'module.test_suite')"), - ('test-runner=', 'r', "Test runner to use"), - ] - - def initialize_options(self): - self.test_suite = None - self.test_module = None - self.test_loader = None - self.test_runner = None - - def finalize_options(self): - - if self.test_suite and self.test_module: - msg = "You may specify a module or a suite, but not both" - raise DistutilsOptionError(msg) - - if self.test_suite is None: - if self.test_module is None: - self.test_suite = self.distribution.test_suite - else: - self.test_suite = self.test_module + ".test_suite" - - if self.test_loader is None: - self.test_loader = getattr(self.distribution, 'test_loader', None) - if self.test_loader is None: - self.test_loader = "setuptools.command.test:ScanningLoader" - if self.test_runner is None: - self.test_runner = getattr(self.distribution, 'test_runner', None) - - @NonDataProperty - def test_args(self): - return list(self._test_args()) - - def _test_args(self): - if not self.test_suite and sys.version_info >= (2, 7): - yield 'discover' - if self.verbose: - yield '--verbose' - if self.test_suite: - yield self.test_suite - - def with_project_on_sys_path(self, func): - """ - Backward compatibility for project_on_sys_path context. - """ - with self.project_on_sys_path(): - func() - - @contextlib.contextmanager - def project_on_sys_path(self, include_dists=[]): - with_2to3 = six.PY3 and getattr(self.distribution, 'use_2to3', False) - - if with_2to3: - # If we run 2to3 we can not do this inplace: - - # Ensure metadata is up-to-date - self.reinitialize_command('build_py', inplace=0) - self.run_command('build_py') - bpy_cmd = self.get_finalized_command("build_py") - build_path = normalize_path(bpy_cmd.build_lib) - - # Build extensions - self.reinitialize_command('egg_info', egg_base=build_path) - self.run_command('egg_info') - - self.reinitialize_command('build_ext', inplace=0) - self.run_command('build_ext') - else: - # Without 2to3 inplace works fine: - self.run_command('egg_info') - - # Build extensions in-place - self.reinitialize_command('build_ext', inplace=1) - self.run_command('build_ext') - - ei_cmd = self.get_finalized_command("egg_info") - - old_path = sys.path[:] - old_modules = sys.modules.copy() - - try: - project_path = normalize_path(ei_cmd.egg_base) - sys.path.insert(0, project_path) - working_set.__init__() - add_activation_listener(lambda dist: dist.activate()) - require('%s==%s' % (ei_cmd.egg_name, ei_cmd.egg_version)) - with self.paths_on_pythonpath([project_path]): - yield - finally: - sys.path[:] = old_path - sys.modules.clear() - sys.modules.update(old_modules) - working_set.__init__() - - @staticmethod - @contextlib.contextmanager - def paths_on_pythonpath(paths): - """ - Add the indicated paths to the head of the PYTHONPATH environment - variable so that subprocesses will also see the packages at - these paths. - - Do this in a context that restores the value on exit. - """ - nothing = object() - orig_pythonpath = os.environ.get('PYTHONPATH', nothing) - current_pythonpath = os.environ.get('PYTHONPATH', '') - try: - prefix = os.pathsep.join(_unique_everseen(paths)) - to_join = filter(None, [prefix, current_pythonpath]) - new_path = os.pathsep.join(to_join) - if new_path: - os.environ['PYTHONPATH'] = new_path - yield - finally: - if orig_pythonpath is nothing: - os.environ.pop('PYTHONPATH', None) - else: - os.environ['PYTHONPATH'] = orig_pythonpath - - @staticmethod - def install_dists(dist): - """ - Install the requirements indicated by self.distribution and - return an iterable of the dists that were built. - """ - ir_d = dist.fetch_build_eggs(dist.install_requires) - tr_d = dist.fetch_build_eggs(dist.tests_require or []) - er_d = dist.fetch_build_eggs( - v for k, v in dist.extras_require.items() - if k.startswith(':') and evaluate_marker(k[1:]) - ) - return itertools.chain(ir_d, tr_d, er_d) - - def run(self): - installed_dists = self.install_dists(self.distribution) - - cmd = ' '.join(self._argv) - if self.dry_run: - self.announce('skipping "%s" (dry run)' % cmd) - return - - self.announce('running "%s"' % cmd) - - paths = map(operator.attrgetter('location'), installed_dists) - with self.paths_on_pythonpath(paths): - with self.project_on_sys_path(): - self.run_tests() - - def run_tests(self): - # Purge modules under test from sys.modules. The test loader will - # re-import them from the build location. Required when 2to3 is used - # with namespace packages. - if six.PY3 and getattr(self.distribution, 'use_2to3', False): - module = self.test_suite.split('.')[0] - if module in _namespace_packages: - del_modules = [] - if module in sys.modules: - del_modules.append(module) - module += '.' - for name in sys.modules: - if name.startswith(module): - del_modules.append(name) - list(map(sys.modules.__delitem__, del_modules)) - - test = unittest.main( - None, None, self._argv, - testLoader=self._resolve_as_ep(self.test_loader), - testRunner=self._resolve_as_ep(self.test_runner), - exit=False, - ) - if not test.result.wasSuccessful(): - msg = 'Test failed: %s' % test.result - self.announce(msg, log.ERROR) - raise DistutilsError(msg) - - @property - def _argv(self): - return ['unittest'] + self.test_args - - @staticmethod - def _resolve_as_ep(val): - """ - Load the indicated attribute value, called, as a as if it were - specified as an entry point. - """ - if val is None: - return - parsed = EntryPoint.parse("x=" + val) - return parsed.resolve()() diff --git a/env/lib/python3.7/site-packages/setuptools/command/upload.py b/env/lib/python3.7/site-packages/setuptools/command/upload.py deleted file mode 100644 index 6db8888..0000000 --- a/env/lib/python3.7/site-packages/setuptools/command/upload.py +++ /dev/null @@ -1,196 +0,0 @@ -import io -import os -import hashlib -import getpass - -from base64 import standard_b64encode - -from distutils import log -from distutils.command import upload as orig -from distutils.spawn import spawn - -from distutils.errors import DistutilsError - -from setuptools.extern.six.moves.urllib.request import urlopen, Request -from setuptools.extern.six.moves.urllib.error import HTTPError -from setuptools.extern.six.moves.urllib.parse import urlparse - - -class upload(orig.upload): - """ - Override default upload behavior to obtain password - in a variety of different ways. - """ - def run(self): - try: - orig.upload.run(self) - finally: - self.announce( - "WARNING: Uploading via this command is deprecated, use twine " - "to upload instead (https://pypi.org/p/twine/)", - log.WARN - ) - - def finalize_options(self): - orig.upload.finalize_options(self) - self.username = ( - self.username or - getpass.getuser() - ) - # Attempt to obtain password. Short circuit evaluation at the first - # sign of success. - self.password = ( - self.password or - self._load_password_from_keyring() or - self._prompt_for_password() - ) - - def upload_file(self, command, pyversion, filename): - # Makes sure the repository URL is compliant - schema, netloc, url, params, query, fragments = \ - urlparse(self.repository) - if params or query or fragments: - raise AssertionError("Incompatible url %s" % self.repository) - - if schema not in ('http', 'https'): - raise AssertionError("unsupported schema " + schema) - - # Sign if requested - if self.sign: - gpg_args = ["gpg", "--detach-sign", "-a", filename] - if self.identity: - gpg_args[2:2] = ["--local-user", self.identity] - spawn(gpg_args, - dry_run=self.dry_run) - - # Fill in the data - send all the meta-data in case we need to - # register a new release - with open(filename, 'rb') as f: - content = f.read() - - meta = self.distribution.metadata - - data = { - # action - ':action': 'file_upload', - 'protocol_version': '1', - - # identify release - 'name': meta.get_name(), - 'version': meta.get_version(), - - # file content - 'content': (os.path.basename(filename), content), - 'filetype': command, - 'pyversion': pyversion, - 'md5_digest': hashlib.md5(content).hexdigest(), - - # additional meta-data - 'metadata_version': str(meta.get_metadata_version()), - 'summary': meta.get_description(), - 'home_page': meta.get_url(), - 'author': meta.get_contact(), - 'author_email': meta.get_contact_email(), - 'license': meta.get_licence(), - 'description': meta.get_long_description(), - 'keywords': meta.get_keywords(), - 'platform': meta.get_platforms(), - 'classifiers': meta.get_classifiers(), - 'download_url': meta.get_download_url(), - # PEP 314 - 'provides': meta.get_provides(), - 'requires': meta.get_requires(), - 'obsoletes': meta.get_obsoletes(), - } - - data['comment'] = '' - - if self.sign: - data['gpg_signature'] = (os.path.basename(filename) + ".asc", - open(filename+".asc", "rb").read()) - - # set up the authentication - user_pass = (self.username + ":" + self.password).encode('ascii') - # The exact encoding of the authentication string is debated. - # Anyway PyPI only accepts ascii for both username or password. - auth = "Basic " + standard_b64encode(user_pass).decode('ascii') - - # Build up the MIME payload for the POST data - boundary = '--------------GHSKFJDLGDS7543FJKLFHRE75642756743254' - sep_boundary = b'\r\n--' + boundary.encode('ascii') - end_boundary = sep_boundary + b'--\r\n' - body = io.BytesIO() - for key, value in data.items(): - title = '\r\nContent-Disposition: form-data; name="%s"' % key - # handle multiple entries for the same name - if not isinstance(value, list): - value = [value] - for value in value: - if type(value) is tuple: - title += '; filename="%s"' % value[0] - value = value[1] - else: - value = str(value).encode('utf-8') - body.write(sep_boundary) - body.write(title.encode('utf-8')) - body.write(b"\r\n\r\n") - body.write(value) - body.write(end_boundary) - body = body.getvalue() - - msg = "Submitting %s to %s" % (filename, self.repository) - self.announce(msg, log.INFO) - - # build the Request - headers = { - 'Content-type': 'multipart/form-data; boundary=%s' % boundary, - 'Content-length': str(len(body)), - 'Authorization': auth, - } - - request = Request(self.repository, data=body, - headers=headers) - # send the data - try: - result = urlopen(request) - status = result.getcode() - reason = result.msg - except HTTPError as e: - status = e.code - reason = e.msg - except OSError as e: - self.announce(str(e), log.ERROR) - raise - - if status == 200: - self.announce('Server response (%s): %s' % (status, reason), - log.INFO) - if self.show_response: - text = getattr(self, '_read_pypi_response', - lambda x: None)(result) - if text is not None: - msg = '\n'.join(('-' * 75, text, '-' * 75)) - self.announce(msg, log.INFO) - else: - msg = 'Upload failed (%s): %s' % (status, reason) - self.announce(msg, log.ERROR) - raise DistutilsError(msg) - - def _load_password_from_keyring(self): - """ - Attempt to load password from keyring. Suppress Exceptions. - """ - try: - keyring = __import__('keyring') - return keyring.get_password(self.repository, self.username) - except Exception: - pass - - def _prompt_for_password(self): - """ - Prompt for a password on the tty. Suppress Exceptions. - """ - try: - return getpass.getpass() - except (Exception, KeyboardInterrupt): - pass diff --git a/env/lib/python3.7/site-packages/setuptools/command/upload_docs.py b/env/lib/python3.7/site-packages/setuptools/command/upload_docs.py deleted file mode 100644 index 07aa564..0000000 --- a/env/lib/python3.7/site-packages/setuptools/command/upload_docs.py +++ /dev/null @@ -1,206 +0,0 @@ -# -*- coding: utf-8 -*- -"""upload_docs - -Implements a Distutils 'upload_docs' subcommand (upload documentation to -PyPI's pythonhosted.org). -""" - -from base64 import standard_b64encode -from distutils import log -from distutils.errors import DistutilsOptionError -import os -import socket -import zipfile -import tempfile -import shutil -import itertools -import functools - -from setuptools.extern import six -from setuptools.extern.six.moves import http_client, urllib - -from pkg_resources import iter_entry_points -from .upload import upload - - -def _encode(s): - errors = 'surrogateescape' if six.PY3 else 'strict' - return s.encode('utf-8', errors) - - -class upload_docs(upload): - # override the default repository as upload_docs isn't - # supported by Warehouse (and won't be). - DEFAULT_REPOSITORY = 'https://pypi.python.org/pypi/' - - description = 'Upload documentation to PyPI' - - user_options = [ - ('repository=', 'r', - "url of repository [default: %s]" % upload.DEFAULT_REPOSITORY), - ('show-response', None, - 'display full response text from server'), - ('upload-dir=', None, 'directory to upload'), - ] - boolean_options = upload.boolean_options - - def has_sphinx(self): - if self.upload_dir is None: - for ep in iter_entry_points('distutils.commands', 'build_sphinx'): - return True - - sub_commands = [('build_sphinx', has_sphinx)] - - def initialize_options(self): - upload.initialize_options(self) - self.upload_dir = None - self.target_dir = None - - def finalize_options(self): - upload.finalize_options(self) - if self.upload_dir is None: - if self.has_sphinx(): - build_sphinx = self.get_finalized_command('build_sphinx') - self.target_dir = build_sphinx.builder_target_dir - else: - build = self.get_finalized_command('build') - self.target_dir = os.path.join(build.build_base, 'docs') - else: - self.ensure_dirname('upload_dir') - self.target_dir = self.upload_dir - if 'pypi.python.org' in self.repository: - log.warn("Upload_docs command is deprecated. Use RTD instead.") - self.announce('Using upload directory %s' % self.target_dir) - - def create_zipfile(self, filename): - zip_file = zipfile.ZipFile(filename, "w") - try: - self.mkpath(self.target_dir) # just in case - for root, dirs, files in os.walk(self.target_dir): - if root == self.target_dir and not files: - tmpl = "no files found in upload directory '%s'" - raise DistutilsOptionError(tmpl % self.target_dir) - for name in files: - full = os.path.join(root, name) - relative = root[len(self.target_dir):].lstrip(os.path.sep) - dest = os.path.join(relative, name) - zip_file.write(full, dest) - finally: - zip_file.close() - - def run(self): - # Run sub commands - for cmd_name in self.get_sub_commands(): - self.run_command(cmd_name) - - tmp_dir = tempfile.mkdtemp() - name = self.distribution.metadata.get_name() - zip_file = os.path.join(tmp_dir, "%s.zip" % name) - try: - self.create_zipfile(zip_file) - self.upload_file(zip_file) - finally: - shutil.rmtree(tmp_dir) - - @staticmethod - def _build_part(item, sep_boundary): - key, values = item - title = '\nContent-Disposition: form-data; name="%s"' % key - # handle multiple entries for the same name - if not isinstance(values, list): - values = [values] - for value in values: - if isinstance(value, tuple): - title += '; filename="%s"' % value[0] - value = value[1] - else: - value = _encode(value) - yield sep_boundary - yield _encode(title) - yield b"\n\n" - yield value - if value and value[-1:] == b'\r': - yield b'\n' # write an extra newline (lurve Macs) - - @classmethod - def _build_multipart(cls, data): - """ - Build up the MIME payload for the POST data - """ - boundary = b'--------------GHSKFJDLGDS7543FJKLFHRE75642756743254' - sep_boundary = b'\n--' + boundary - end_boundary = sep_boundary + b'--' - end_items = end_boundary, b"\n", - builder = functools.partial( - cls._build_part, - sep_boundary=sep_boundary, - ) - part_groups = map(builder, data.items()) - parts = itertools.chain.from_iterable(part_groups) - body_items = itertools.chain(parts, end_items) - content_type = 'multipart/form-data; boundary=%s' % boundary.decode('ascii') - return b''.join(body_items), content_type - - def upload_file(self, filename): - with open(filename, 'rb') as f: - content = f.read() - meta = self.distribution.metadata - data = { - ':action': 'doc_upload', - 'name': meta.get_name(), - 'content': (os.path.basename(filename), content), - } - # set up the authentication - credentials = _encode(self.username + ':' + self.password) - credentials = standard_b64encode(credentials) - if six.PY3: - credentials = credentials.decode('ascii') - auth = "Basic " + credentials - - body, ct = self._build_multipart(data) - - msg = "Submitting documentation to %s" % (self.repository) - self.announce(msg, log.INFO) - - # build the Request - # We can't use urllib2 since we need to send the Basic - # auth right with the first request - schema, netloc, url, params, query, fragments = \ - urllib.parse.urlparse(self.repository) - assert not params and not query and not fragments - if schema == 'http': - conn = http_client.HTTPConnection(netloc) - elif schema == 'https': - conn = http_client.HTTPSConnection(netloc) - else: - raise AssertionError("unsupported schema " + schema) - - data = '' - try: - conn.connect() - conn.putrequest("POST", url) - content_type = ct - conn.putheader('Content-type', content_type) - conn.putheader('Content-length', str(len(body))) - conn.putheader('Authorization', auth) - conn.endheaders() - conn.send(body) - except socket.error as e: - self.announce(str(e), log.ERROR) - return - - r = conn.getresponse() - if r.status == 200: - msg = 'Server response (%s): %s' % (r.status, r.reason) - self.announce(msg, log.INFO) - elif r.status == 301: - location = r.getheader('Location') - if location is None: - location = 'https://pythonhosted.org/%s/' % meta.get_name() - msg = 'Upload successful. Visit %s' % location - self.announce(msg, log.INFO) - else: - msg = 'Upload failed (%s): %s' % (r.status, r.reason) - self.announce(msg, log.ERROR) - if self.show_response: - print('-' * 75, r.read(), '-' * 75) diff --git a/env/lib/python3.7/site-packages/setuptools/config.py b/env/lib/python3.7/site-packages/setuptools/config.py deleted file mode 100644 index b662604..0000000 --- a/env/lib/python3.7/site-packages/setuptools/config.py +++ /dev/null @@ -1,656 +0,0 @@ -from __future__ import absolute_import, unicode_literals -import io -import os -import sys - -import warnings -import functools -from collections import defaultdict -from functools import partial -from functools import wraps -from importlib import import_module - -from distutils.errors import DistutilsOptionError, DistutilsFileError -from setuptools.extern.packaging.version import LegacyVersion, parse -from setuptools.extern.six import string_types, PY3 - - -__metaclass__ = type - - -def read_configuration( - filepath, find_others=False, ignore_option_errors=False): - """Read given configuration file and returns options from it as a dict. - - :param str|unicode filepath: Path to configuration file - to get options from. - - :param bool find_others: Whether to search for other configuration files - which could be on in various places. - - :param bool ignore_option_errors: Whether to silently ignore - options, values of which could not be resolved (e.g. due to exceptions - in directives such as file:, attr:, etc.). - If False exceptions are propagated as expected. - - :rtype: dict - """ - from setuptools.dist import Distribution, _Distribution - - filepath = os.path.abspath(filepath) - - if not os.path.isfile(filepath): - raise DistutilsFileError( - 'Configuration file %s does not exist.' % filepath) - - current_directory = os.getcwd() - os.chdir(os.path.dirname(filepath)) - - try: - dist = Distribution() - - filenames = dist.find_config_files() if find_others else [] - if filepath not in filenames: - filenames.append(filepath) - - _Distribution.parse_config_files(dist, filenames=filenames) - - handlers = parse_configuration( - dist, dist.command_options, - ignore_option_errors=ignore_option_errors) - - finally: - os.chdir(current_directory) - - return configuration_to_dict(handlers) - - -def _get_option(target_obj, key): - """ - Given a target object and option key, get that option from - the target object, either through a get_{key} method or - from an attribute directly. - """ - getter_name = 'get_{key}'.format(**locals()) - by_attribute = functools.partial(getattr, target_obj, key) - getter = getattr(target_obj, getter_name, by_attribute) - return getter() - - -def configuration_to_dict(handlers): - """Returns configuration data gathered by given handlers as a dict. - - :param list[ConfigHandler] handlers: Handlers list, - usually from parse_configuration() - - :rtype: dict - """ - config_dict = defaultdict(dict) - - for handler in handlers: - for option in handler.set_options: - value = _get_option(handler.target_obj, option) - config_dict[handler.section_prefix][option] = value - - return config_dict - - -def parse_configuration( - distribution, command_options, ignore_option_errors=False): - """Performs additional parsing of configuration options - for a distribution. - - Returns a list of used option handlers. - - :param Distribution distribution: - :param dict command_options: - :param bool ignore_option_errors: Whether to silently ignore - options, values of which could not be resolved (e.g. due to exceptions - in directives such as file:, attr:, etc.). - If False exceptions are propagated as expected. - :rtype: list - """ - options = ConfigOptionsHandler( - distribution, command_options, ignore_option_errors) - options.parse() - - meta = ConfigMetadataHandler( - distribution.metadata, command_options, ignore_option_errors, - distribution.package_dir) - meta.parse() - - return meta, options - - -class ConfigHandler: - """Handles metadata supplied in configuration files.""" - - section_prefix = None - """Prefix for config sections handled by this handler. - Must be provided by class heirs. - - """ - - aliases = {} - """Options aliases. - For compatibility with various packages. E.g.: d2to1 and pbr. - Note: `-` in keys is replaced with `_` by config parser. - - """ - - def __init__(self, target_obj, options, ignore_option_errors=False): - sections = {} - - section_prefix = self.section_prefix - for section_name, section_options in options.items(): - if not section_name.startswith(section_prefix): - continue - - section_name = section_name.replace(section_prefix, '').strip('.') - sections[section_name] = section_options - - self.ignore_option_errors = ignore_option_errors - self.target_obj = target_obj - self.sections = sections - self.set_options = [] - - @property - def parsers(self): - """Metadata item name to parser function mapping.""" - raise NotImplementedError( - '%s must provide .parsers property' % self.__class__.__name__) - - def __setitem__(self, option_name, value): - unknown = tuple() - target_obj = self.target_obj - - # Translate alias into real name. - option_name = self.aliases.get(option_name, option_name) - - current_value = getattr(target_obj, option_name, unknown) - - if current_value is unknown: - raise KeyError(option_name) - - if current_value: - # Already inhabited. Skipping. - return - - skip_option = False - parser = self.parsers.get(option_name) - if parser: - try: - value = parser(value) - - except Exception: - skip_option = True - if not self.ignore_option_errors: - raise - - if skip_option: - return - - setter = getattr(target_obj, 'set_%s' % option_name, None) - if setter is None: - setattr(target_obj, option_name, value) - else: - setter(value) - - self.set_options.append(option_name) - - @classmethod - def _parse_list(cls, value, separator=','): - """Represents value as a list. - - Value is split either by separator (defaults to comma) or by lines. - - :param value: - :param separator: List items separator character. - :rtype: list - """ - if isinstance(value, list): # _get_parser_compound case - return value - - if '\n' in value: - value = value.splitlines() - else: - value = value.split(separator) - - return [chunk.strip() for chunk in value if chunk.strip()] - - @classmethod - def _parse_dict(cls, value): - """Represents value as a dict. - - :param value: - :rtype: dict - """ - separator = '=' - result = {} - for line in cls._parse_list(value): - key, sep, val = line.partition(separator) - if sep != separator: - raise DistutilsOptionError( - 'Unable to parse option value to dict: %s' % value) - result[key.strip()] = val.strip() - - return result - - @classmethod - def _parse_bool(cls, value): - """Represents value as boolean. - - :param value: - :rtype: bool - """ - value = value.lower() - return value in ('1', 'true', 'yes') - - @classmethod - def _exclude_files_parser(cls, key): - """Returns a parser function to make sure field inputs - are not files. - - Parses a value after getting the key so error messages are - more informative. - - :param key: - :rtype: callable - """ - def parser(value): - exclude_directive = 'file:' - if value.startswith(exclude_directive): - raise ValueError( - 'Only strings are accepted for the {0} field, ' - 'files are not accepted'.format(key)) - return value - return parser - - @classmethod - def _parse_file(cls, value): - """Represents value as a string, allowing including text - from nearest files using `file:` directive. - - Directive is sandboxed and won't reach anything outside - directory with setup.py. - - Examples: - file: README.rst, CHANGELOG.md, src/file.txt - - :param str value: - :rtype: str - """ - include_directive = 'file:' - - if not isinstance(value, string_types): - return value - - if not value.startswith(include_directive): - return value - - spec = value[len(include_directive):] - filepaths = (os.path.abspath(path.strip()) for path in spec.split(',')) - return '\n'.join( - cls._read_file(path) - for path in filepaths - if (cls._assert_local(path) or True) - and os.path.isfile(path) - ) - - @staticmethod - def _assert_local(filepath): - if not filepath.startswith(os.getcwd()): - raise DistutilsOptionError( - '`file:` directive can not access %s' % filepath) - - @staticmethod - def _read_file(filepath): - with io.open(filepath, encoding='utf-8') as f: - return f.read() - - @classmethod - def _parse_attr(cls, value, package_dir=None): - """Represents value as a module attribute. - - Examples: - attr: package.attr - attr: package.module.attr - - :param str value: - :rtype: str - """ - attr_directive = 'attr:' - if not value.startswith(attr_directive): - return value - - attrs_path = value.replace(attr_directive, '').strip().split('.') - attr_name = attrs_path.pop() - - module_name = '.'.join(attrs_path) - module_name = module_name or '__init__' - - parent_path = os.getcwd() - if package_dir: - if attrs_path[0] in package_dir: - # A custom path was specified for the module we want to import - custom_path = package_dir[attrs_path[0]] - parts = custom_path.rsplit('/', 1) - if len(parts) > 1: - parent_path = os.path.join(os.getcwd(), parts[0]) - module_name = parts[1] - else: - module_name = custom_path - elif '' in package_dir: - # A custom parent directory was specified for all root modules - parent_path = os.path.join(os.getcwd(), package_dir['']) - sys.path.insert(0, parent_path) - try: - module = import_module(module_name) - value = getattr(module, attr_name) - - finally: - sys.path = sys.path[1:] - - return value - - @classmethod - def _get_parser_compound(cls, *parse_methods): - """Returns parser function to represents value as a list. - - Parses a value applying given methods one after another. - - :param parse_methods: - :rtype: callable - """ - def parse(value): - parsed = value - - for method in parse_methods: - parsed = method(parsed) - - return parsed - - return parse - - @classmethod - def _parse_section_to_dict(cls, section_options, values_parser=None): - """Parses section options into a dictionary. - - Optionally applies a given parser to values. - - :param dict section_options: - :param callable values_parser: - :rtype: dict - """ - value = {} - values_parser = values_parser or (lambda val: val) - for key, (_, val) in section_options.items(): - value[key] = values_parser(val) - return value - - def parse_section(self, section_options): - """Parses configuration file section. - - :param dict section_options: - """ - for (name, (_, value)) in section_options.items(): - try: - self[name] = value - - except KeyError: - pass # Keep silent for a new option may appear anytime. - - def parse(self): - """Parses configuration file items from one - or more related sections. - - """ - for section_name, section_options in self.sections.items(): - - method_postfix = '' - if section_name: # [section.option] variant - method_postfix = '_%s' % section_name - - section_parser_method = getattr( - self, - # Dots in section names are translated into dunderscores. - ('parse_section%s' % method_postfix).replace('.', '__'), - None) - - if section_parser_method is None: - raise DistutilsOptionError( - 'Unsupported distribution option section: [%s.%s]' % ( - self.section_prefix, section_name)) - - section_parser_method(section_options) - - def _deprecated_config_handler(self, func, msg, warning_class): - """ this function will wrap around parameters that are deprecated - - :param msg: deprecation message - :param warning_class: class of warning exception to be raised - :param func: function to be wrapped around - """ - @wraps(func) - def config_handler(*args, **kwargs): - warnings.warn(msg, warning_class) - return func(*args, **kwargs) - - return config_handler - - -class ConfigMetadataHandler(ConfigHandler): - - section_prefix = 'metadata' - - aliases = { - 'home_page': 'url', - 'summary': 'description', - 'classifier': 'classifiers', - 'platform': 'platforms', - } - - strict_mode = False - """We need to keep it loose, to be partially compatible with - `pbr` and `d2to1` packages which also uses `metadata` section. - - """ - - def __init__(self, target_obj, options, ignore_option_errors=False, - package_dir=None): - super(ConfigMetadataHandler, self).__init__(target_obj, options, - ignore_option_errors) - self.package_dir = package_dir - - @property - def parsers(self): - """Metadata item name to parser function mapping.""" - parse_list = self._parse_list - parse_file = self._parse_file - parse_dict = self._parse_dict - exclude_files_parser = self._exclude_files_parser - - return { - 'platforms': parse_list, - 'keywords': parse_list, - 'provides': parse_list, - 'requires': self._deprecated_config_handler( - parse_list, - "The requires parameter is deprecated, please use " - "install_requires for runtime dependencies.", - DeprecationWarning), - 'obsoletes': parse_list, - 'classifiers': self._get_parser_compound(parse_file, parse_list), - 'license': exclude_files_parser('license'), - 'description': parse_file, - 'long_description': parse_file, - 'version': self._parse_version, - 'project_urls': parse_dict, - } - - def _parse_version(self, value): - """Parses `version` option value. - - :param value: - :rtype: str - - """ - version = self._parse_file(value) - - if version != value: - version = version.strip() - # Be strict about versions loaded from file because it's easy to - # accidentally include newlines and other unintended content - if isinstance(parse(version), LegacyVersion): - tmpl = ( - 'Version loaded from {value} does not ' - 'comply with PEP 440: {version}' - ) - raise DistutilsOptionError(tmpl.format(**locals())) - - return version - - version = self._parse_attr(value, self.package_dir) - - if callable(version): - version = version() - - if not isinstance(version, string_types): - if hasattr(version, '__iter__'): - version = '.'.join(map(str, version)) - else: - version = '%s' % version - - return version - - -class ConfigOptionsHandler(ConfigHandler): - - section_prefix = 'options' - - @property - def parsers(self): - """Metadata item name to parser function mapping.""" - parse_list = self._parse_list - parse_list_semicolon = partial(self._parse_list, separator=';') - parse_bool = self._parse_bool - parse_dict = self._parse_dict - - return { - 'zip_safe': parse_bool, - 'use_2to3': parse_bool, - 'include_package_data': parse_bool, - 'package_dir': parse_dict, - 'use_2to3_fixers': parse_list, - 'use_2to3_exclude_fixers': parse_list, - 'convert_2to3_doctests': parse_list, - 'scripts': parse_list, - 'eager_resources': parse_list, - 'dependency_links': parse_list, - 'namespace_packages': parse_list, - 'install_requires': parse_list_semicolon, - 'setup_requires': parse_list_semicolon, - 'tests_require': parse_list_semicolon, - 'packages': self._parse_packages, - 'entry_points': self._parse_file, - 'py_modules': parse_list, - } - - def _parse_packages(self, value): - """Parses `packages` option value. - - :param value: - :rtype: list - """ - find_directives = ['find:', 'find_namespace:'] - trimmed_value = value.strip() - - if trimmed_value not in find_directives: - return self._parse_list(value) - - findns = trimmed_value == find_directives[1] - if findns and not PY3: - raise DistutilsOptionError( - 'find_namespace: directive is unsupported on Python < 3.3') - - # Read function arguments from a dedicated section. - find_kwargs = self.parse_section_packages__find( - self.sections.get('packages.find', {})) - - if findns: - from setuptools import find_namespace_packages as find_packages - else: - from setuptools import find_packages - - return find_packages(**find_kwargs) - - def parse_section_packages__find(self, section_options): - """Parses `packages.find` configuration file section. - - To be used in conjunction with _parse_packages(). - - :param dict section_options: - """ - section_data = self._parse_section_to_dict( - section_options, self._parse_list) - - valid_keys = ['where', 'include', 'exclude'] - - find_kwargs = dict( - [(k, v) for k, v in section_data.items() if k in valid_keys and v]) - - where = find_kwargs.get('where') - if where is not None: - find_kwargs['where'] = where[0] # cast list to single val - - return find_kwargs - - def parse_section_entry_points(self, section_options): - """Parses `entry_points` configuration file section. - - :param dict section_options: - """ - parsed = self._parse_section_to_dict(section_options, self._parse_list) - self['entry_points'] = parsed - - def _parse_package_data(self, section_options): - parsed = self._parse_section_to_dict(section_options, self._parse_list) - - root = parsed.get('*') - if root: - parsed[''] = root - del parsed['*'] - - return parsed - - def parse_section_package_data(self, section_options): - """Parses `package_data` configuration file section. - - :param dict section_options: - """ - self['package_data'] = self._parse_package_data(section_options) - - def parse_section_exclude_package_data(self, section_options): - """Parses `exclude_package_data` configuration file section. - - :param dict section_options: - """ - self['exclude_package_data'] = self._parse_package_data( - section_options) - - def parse_section_extras_require(self, section_options): - """Parses `extras_require` configuration file section. - - :param dict section_options: - """ - parse_list = partial(self._parse_list, separator=';') - self['extras_require'] = self._parse_section_to_dict( - section_options, parse_list) - - def parse_section_data_files(self, section_options): - """Parses `data_files` configuration file section. - - :param dict section_options: - """ - parsed = self._parse_section_to_dict(section_options, self._parse_list) - self['data_files'] = [(k, v) for k, v in parsed.items()] diff --git a/env/lib/python3.7/site-packages/setuptools/dep_util.py b/env/lib/python3.7/site-packages/setuptools/dep_util.py deleted file mode 100644 index 2931c13..0000000 --- a/env/lib/python3.7/site-packages/setuptools/dep_util.py +++ /dev/null @@ -1,23 +0,0 @@ -from distutils.dep_util import newer_group - -# yes, this is was almost entirely copy-pasted from -# 'newer_pairwise()', this is just another convenience -# function. -def newer_pairwise_group(sources_groups, targets): - """Walk both arguments in parallel, testing if each source group is newer - than its corresponding target. Returns a pair of lists (sources_groups, - targets) where sources is newer than target, according to the semantics - of 'newer_group()'. - """ - if len(sources_groups) != len(targets): - raise ValueError("'sources_group' and 'targets' must be the same length") - - # build a pair of lists (sources_groups, targets) where source is newer - n_sources = [] - n_targets = [] - for i in range(len(sources_groups)): - if newer_group(sources_groups[i], targets[i]): - n_sources.append(sources_groups[i]) - n_targets.append(targets[i]) - - return n_sources, n_targets diff --git a/env/lib/python3.7/site-packages/setuptools/depends.py b/env/lib/python3.7/site-packages/setuptools/depends.py deleted file mode 100644 index 45e7052..0000000 --- a/env/lib/python3.7/site-packages/setuptools/depends.py +++ /dev/null @@ -1,186 +0,0 @@ -import sys -import imp -import marshal -from distutils.version import StrictVersion -from imp import PKG_DIRECTORY, PY_COMPILED, PY_SOURCE, PY_FROZEN - -from .py33compat import Bytecode - - -__all__ = [ - 'Require', 'find_module', 'get_module_constant', 'extract_constant' -] - - -class Require: - """A prerequisite to building or installing a distribution""" - - def __init__(self, name, requested_version, module, homepage='', - attribute=None, format=None): - - if format is None and requested_version is not None: - format = StrictVersion - - if format is not None: - requested_version = format(requested_version) - if attribute is None: - attribute = '__version__' - - self.__dict__.update(locals()) - del self.self - - def full_name(self): - """Return full package/distribution name, w/version""" - if self.requested_version is not None: - return '%s-%s' % (self.name, self.requested_version) - return self.name - - def version_ok(self, version): - """Is 'version' sufficiently up-to-date?""" - return self.attribute is None or self.format is None or \ - str(version) != "unknown" and version >= self.requested_version - - def get_version(self, paths=None, default="unknown"): - """Get version number of installed module, 'None', or 'default' - - Search 'paths' for module. If not found, return 'None'. If found, - return the extracted version attribute, or 'default' if no version - attribute was specified, or the value cannot be determined without - importing the module. The version is formatted according to the - requirement's version format (if any), unless it is 'None' or the - supplied 'default'. - """ - - if self.attribute is None: - try: - f, p, i = find_module(self.module, paths) - if f: - f.close() - return default - except ImportError: - return None - - v = get_module_constant(self.module, self.attribute, default, paths) - - if v is not None and v is not default and self.format is not None: - return self.format(v) - - return v - - def is_present(self, paths=None): - """Return true if dependency is present on 'paths'""" - return self.get_version(paths) is not None - - def is_current(self, paths=None): - """Return true if dependency is present and up-to-date on 'paths'""" - version = self.get_version(paths) - if version is None: - return False - return self.version_ok(version) - - -def find_module(module, paths=None): - """Just like 'imp.find_module()', but with package support""" - - parts = module.split('.') - - while parts: - part = parts.pop(0) - f, path, (suffix, mode, kind) = info = imp.find_module(part, paths) - - if kind == PKG_DIRECTORY: - parts = parts or ['__init__'] - paths = [path] - - elif parts: - raise ImportError("Can't find %r in %s" % (parts, module)) - - return info - - -def get_module_constant(module, symbol, default=-1, paths=None): - """Find 'module' by searching 'paths', and extract 'symbol' - - Return 'None' if 'module' does not exist on 'paths', or it does not define - 'symbol'. If the module defines 'symbol' as a constant, return the - constant. Otherwise, return 'default'.""" - - try: - f, path, (suffix, mode, kind) = find_module(module, paths) - except ImportError: - # Module doesn't exist - return None - - try: - if kind == PY_COMPILED: - f.read(8) # skip magic & date - code = marshal.load(f) - elif kind == PY_FROZEN: - code = imp.get_frozen_object(module) - elif kind == PY_SOURCE: - code = compile(f.read(), path, 'exec') - else: - # Not something we can parse; we'll have to import it. :( - if module not in sys.modules: - imp.load_module(module, f, path, (suffix, mode, kind)) - return getattr(sys.modules[module], symbol, None) - - finally: - if f: - f.close() - - return extract_constant(code, symbol, default) - - -def extract_constant(code, symbol, default=-1): - """Extract the constant value of 'symbol' from 'code' - - If the name 'symbol' is bound to a constant value by the Python code - object 'code', return that value. If 'symbol' is bound to an expression, - return 'default'. Otherwise, return 'None'. - - Return value is based on the first assignment to 'symbol'. 'symbol' must - be a global, or at least a non-"fast" local in the code block. That is, - only 'STORE_NAME' and 'STORE_GLOBAL' opcodes are checked, and 'symbol' - must be present in 'code.co_names'. - """ - if symbol not in code.co_names: - # name's not there, can't possibly be an assignment - return None - - name_idx = list(code.co_names).index(symbol) - - STORE_NAME = 90 - STORE_GLOBAL = 97 - LOAD_CONST = 100 - - const = default - - for byte_code in Bytecode(code): - op = byte_code.opcode - arg = byte_code.arg - - if op == LOAD_CONST: - const = code.co_consts[arg] - elif arg == name_idx and (op == STORE_NAME or op == STORE_GLOBAL): - return const - else: - const = default - - -def _update_globals(): - """ - Patch the globals to remove the objects not available on some platforms. - - XXX it'd be better to test assertions about bytecode instead. - """ - - if not sys.platform.startswith('java') and sys.platform != 'cli': - return - incompatible = 'extract_constant', 'get_module_constant' - for name in incompatible: - del globals()[name] - __all__.remove(name) - - -_update_globals() diff --git a/env/lib/python3.7/site-packages/setuptools/dist.py b/env/lib/python3.7/site-packages/setuptools/dist.py deleted file mode 100644 index 9a165de..0000000 --- a/env/lib/python3.7/site-packages/setuptools/dist.py +++ /dev/null @@ -1,1278 +0,0 @@ -# -*- coding: utf-8 -*- -__all__ = ['Distribution'] - -import io -import sys -import re -import os -import warnings -import numbers -import distutils.log -import distutils.core -import distutils.cmd -import distutils.dist -from distutils.util import strtobool -from distutils.debug import DEBUG -from distutils.fancy_getopt import translate_longopt -import itertools - -from collections import defaultdict -from email import message_from_file - -from distutils.errors import ( - DistutilsOptionError, DistutilsPlatformError, DistutilsSetupError, -) -from distutils.util import rfc822_escape -from distutils.version import StrictVersion - -from setuptools.extern import six -from setuptools.extern import packaging -from setuptools.extern.six.moves import map, filter, filterfalse - -from . import SetuptoolsDeprecationWarning - -from setuptools.depends import Require -from setuptools import windows_support -from setuptools.monkey import get_unpatched -from setuptools.config import parse_configuration -import pkg_resources - -__import__('setuptools.extern.packaging.specifiers') -__import__('setuptools.extern.packaging.version') - - -def _get_unpatched(cls): - warnings.warn("Do not call this function", DistDeprecationWarning) - return get_unpatched(cls) - - -def get_metadata_version(self): - mv = getattr(self, 'metadata_version', None) - - if mv is None: - if self.long_description_content_type or self.provides_extras: - mv = StrictVersion('2.1') - elif (self.maintainer is not None or - self.maintainer_email is not None or - getattr(self, 'python_requires', None) is not None): - mv = StrictVersion('1.2') - elif (self.provides or self.requires or self.obsoletes or - self.classifiers or self.download_url): - mv = StrictVersion('1.1') - else: - mv = StrictVersion('1.0') - - self.metadata_version = mv - - return mv - - -def read_pkg_file(self, file): - """Reads the metadata values from a file object.""" - msg = message_from_file(file) - - def _read_field(name): - value = msg[name] - if value == 'UNKNOWN': - return None - return value - - def _read_list(name): - values = msg.get_all(name, None) - if values == []: - return None - return values - - self.metadata_version = StrictVersion(msg['metadata-version']) - self.name = _read_field('name') - self.version = _read_field('version') - self.description = _read_field('summary') - # we are filling author only. - self.author = _read_field('author') - self.maintainer = None - self.author_email = _read_field('author-email') - self.maintainer_email = None - self.url = _read_field('home-page') - self.license = _read_field('license') - - if 'download-url' in msg: - self.download_url = _read_field('download-url') - else: - self.download_url = None - - self.long_description = _read_field('description') - self.description = _read_field('summary') - - if 'keywords' in msg: - self.keywords = _read_field('keywords').split(',') - - self.platforms = _read_list('platform') - self.classifiers = _read_list('classifier') - - # PEP 314 - these fields only exist in 1.1 - if self.metadata_version == StrictVersion('1.1'): - self.requires = _read_list('requires') - self.provides = _read_list('provides') - self.obsoletes = _read_list('obsoletes') - else: - self.requires = None - self.provides = None - self.obsoletes = None - - -# Based on Python 3.5 version -def write_pkg_file(self, file): - """Write the PKG-INFO format data to a file object. - """ - version = self.get_metadata_version() - - if six.PY2: - def write_field(key, value): - file.write("%s: %s\n" % (key, self._encode_field(value))) - else: - def write_field(key, value): - file.write("%s: %s\n" % (key, value)) - - write_field('Metadata-Version', str(version)) - write_field('Name', self.get_name()) - write_field('Version', self.get_version()) - write_field('Summary', self.get_description()) - write_field('Home-page', self.get_url()) - - if version < StrictVersion('1.2'): - write_field('Author', self.get_contact()) - write_field('Author-email', self.get_contact_email()) - else: - optional_fields = ( - ('Author', 'author'), - ('Author-email', 'author_email'), - ('Maintainer', 'maintainer'), - ('Maintainer-email', 'maintainer_email'), - ) - - for field, attr in optional_fields: - attr_val = getattr(self, attr) - - if attr_val is not None: - write_field(field, attr_val) - - write_field('License', self.get_license()) - if self.download_url: - write_field('Download-URL', self.download_url) - for project_url in self.project_urls.items(): - write_field('Project-URL', '%s, %s' % project_url) - - long_desc = rfc822_escape(self.get_long_description()) - write_field('Description', long_desc) - - keywords = ','.join(self.get_keywords()) - if keywords: - write_field('Keywords', keywords) - - if version >= StrictVersion('1.2'): - for platform in self.get_platforms(): - write_field('Platform', platform) - else: - self._write_list(file, 'Platform', self.get_platforms()) - - self._write_list(file, 'Classifier', self.get_classifiers()) - - # PEP 314 - self._write_list(file, 'Requires', self.get_requires()) - self._write_list(file, 'Provides', self.get_provides()) - self._write_list(file, 'Obsoletes', self.get_obsoletes()) - - # Setuptools specific for PEP 345 - if hasattr(self, 'python_requires'): - write_field('Requires-Python', self.python_requires) - - # PEP 566 - if self.long_description_content_type: - write_field( - 'Description-Content-Type', - self.long_description_content_type - ) - if self.provides_extras: - for extra in self.provides_extras: - write_field('Provides-Extra', extra) - - -sequence = tuple, list - - -def check_importable(dist, attr, value): - try: - ep = pkg_resources.EntryPoint.parse('x=' + value) - assert not ep.extras - except (TypeError, ValueError, AttributeError, AssertionError): - raise DistutilsSetupError( - "%r must be importable 'module:attrs' string (got %r)" - % (attr, value) - ) - - -def assert_string_list(dist, attr, value): - """Verify that value is a string list or None""" - try: - assert ''.join(value) != value - except (TypeError, ValueError, AttributeError, AssertionError): - raise DistutilsSetupError( - "%r must be a list of strings (got %r)" % (attr, value) - ) - - -def check_nsp(dist, attr, value): - """Verify that namespace packages are valid""" - ns_packages = value - assert_string_list(dist, attr, ns_packages) - for nsp in ns_packages: - if not dist.has_contents_for(nsp): - raise DistutilsSetupError( - "Distribution contains no modules or packages for " + - "namespace package %r" % nsp - ) - parent, sep, child = nsp.rpartition('.') - if parent and parent not in ns_packages: - distutils.log.warn( - "WARNING: %r is declared as a package namespace, but %r" - " is not: please correct this in setup.py", nsp, parent - ) - - -def check_extras(dist, attr, value): - """Verify that extras_require mapping is valid""" - try: - list(itertools.starmap(_check_extra, value.items())) - except (TypeError, ValueError, AttributeError): - raise DistutilsSetupError( - "'extras_require' must be a dictionary whose values are " - "strings or lists of strings containing valid project/version " - "requirement specifiers." - ) - - -def _check_extra(extra, reqs): - name, sep, marker = extra.partition(':') - if marker and pkg_resources.invalid_marker(marker): - raise DistutilsSetupError("Invalid environment marker: " + marker) - list(pkg_resources.parse_requirements(reqs)) - - -def assert_bool(dist, attr, value): - """Verify that value is True, False, 0, or 1""" - if bool(value) != value: - tmpl = "{attr!r} must be a boolean value (got {value!r})" - raise DistutilsSetupError(tmpl.format(attr=attr, value=value)) - - -def check_requirements(dist, attr, value): - """Verify that install_requires is a valid requirements list""" - try: - list(pkg_resources.parse_requirements(value)) - if isinstance(value, (dict, set)): - raise TypeError("Unordered types are not allowed") - except (TypeError, ValueError) as error: - tmpl = ( - "{attr!r} must be a string or list of strings " - "containing valid project/version requirement specifiers; {error}" - ) - raise DistutilsSetupError(tmpl.format(attr=attr, error=error)) - - -def check_specifier(dist, attr, value): - """Verify that value is a valid version specifier""" - try: - packaging.specifiers.SpecifierSet(value) - except packaging.specifiers.InvalidSpecifier as error: - tmpl = ( - "{attr!r} must be a string " - "containing valid version specifiers; {error}" - ) - raise DistutilsSetupError(tmpl.format(attr=attr, error=error)) - - -def check_entry_points(dist, attr, value): - """Verify that entry_points map is parseable""" - try: - pkg_resources.EntryPoint.parse_map(value) - except ValueError as e: - raise DistutilsSetupError(e) - - -def check_test_suite(dist, attr, value): - if not isinstance(value, six.string_types): - raise DistutilsSetupError("test_suite must be a string") - - -def check_package_data(dist, attr, value): - """Verify that value is a dictionary of package names to glob lists""" - if isinstance(value, dict): - for k, v in value.items(): - if not isinstance(k, str): - break - try: - iter(v) - except TypeError: - break - else: - return - raise DistutilsSetupError( - attr + " must be a dictionary mapping package names to lists of " - "wildcard patterns" - ) - - -def check_packages(dist, attr, value): - for pkgname in value: - if not re.match(r'\w+(\.\w+)*', pkgname): - distutils.log.warn( - "WARNING: %r not a valid package name; please use only " - ".-separated package names in setup.py", pkgname - ) - - -_Distribution = get_unpatched(distutils.core.Distribution) - - -class Distribution(_Distribution): - """Distribution with support for features, tests, and package data - - This is an enhanced version of 'distutils.dist.Distribution' that - effectively adds the following new optional keyword arguments to 'setup()': - - 'install_requires' -- a string or sequence of strings specifying project - versions that the distribution requires when installed, in the format - used by 'pkg_resources.require()'. They will be installed - automatically when the package is installed. If you wish to use - packages that are not available in PyPI, or want to give your users an - alternate download location, you can add a 'find_links' option to the - '[easy_install]' section of your project's 'setup.cfg' file, and then - setuptools will scan the listed web pages for links that satisfy the - requirements. - - 'extras_require' -- a dictionary mapping names of optional "extras" to the - additional requirement(s) that using those extras incurs. For example, - this:: - - extras_require = dict(reST = ["docutils>=0.3", "reSTedit"]) - - indicates that the distribution can optionally provide an extra - capability called "reST", but it can only be used if docutils and - reSTedit are installed. If the user installs your package using - EasyInstall and requests one of your extras, the corresponding - additional requirements will be installed if needed. - - 'features' **deprecated** -- a dictionary mapping option names to - 'setuptools.Feature' - objects. Features are a portion of the distribution that can be - included or excluded based on user options, inter-feature dependencies, - and availability on the current system. Excluded features are omitted - from all setup commands, including source and binary distributions, so - you can create multiple distributions from the same source tree. - Feature names should be valid Python identifiers, except that they may - contain the '-' (minus) sign. Features can be included or excluded - via the command line options '--with-X' and '--without-X', where 'X' is - the name of the feature. Whether a feature is included by default, and - whether you are allowed to control this from the command line, is - determined by the Feature object. See the 'Feature' class for more - information. - - 'test_suite' -- the name of a test suite to run for the 'test' command. - If the user runs 'python setup.py test', the package will be installed, - and the named test suite will be run. The format is the same as - would be used on a 'unittest.py' command line. That is, it is the - dotted name of an object to import and call to generate a test suite. - - 'package_data' -- a dictionary mapping package names to lists of filenames - or globs to use to find data files contained in the named packages. - If the dictionary has filenames or globs listed under '""' (the empty - string), those names will be searched for in every package, in addition - to any names for the specific package. Data files found using these - names/globs will be installed along with the package, in the same - location as the package. Note that globs are allowed to reference - the contents of non-package subdirectories, as long as you use '/' as - a path separator. (Globs are automatically converted to - platform-specific paths at runtime.) - - In addition to these new keywords, this class also has several new methods - for manipulating the distribution's contents. For example, the 'include()' - and 'exclude()' methods can be thought of as in-place add and subtract - commands that add or remove packages, modules, extensions, and so on from - the distribution. They are used by the feature subsystem to configure the - distribution for the included and excluded features. - """ - - _DISTUTILS_UNSUPPORTED_METADATA = { - 'long_description_content_type': None, - 'project_urls': dict, - 'provides_extras': set, - } - - _patched_dist = None - - def patch_missing_pkg_info(self, attrs): - # Fake up a replacement for the data that would normally come from - # PKG-INFO, but which might not yet be built if this is a fresh - # checkout. - # - if not attrs or 'name' not in attrs or 'version' not in attrs: - return - key = pkg_resources.safe_name(str(attrs['name'])).lower() - dist = pkg_resources.working_set.by_key.get(key) - if dist is not None and not dist.has_metadata('PKG-INFO'): - dist._version = pkg_resources.safe_version(str(attrs['version'])) - self._patched_dist = dist - - def __init__(self, attrs=None): - have_package_data = hasattr(self, "package_data") - if not have_package_data: - self.package_data = {} - attrs = attrs or {} - if 'features' in attrs or 'require_features' in attrs: - Feature.warn_deprecated() - self.require_features = [] - self.features = {} - self.dist_files = [] - # Filter-out setuptools' specific options. - self.src_root = attrs.pop("src_root", None) - self.patch_missing_pkg_info(attrs) - self.dependency_links = attrs.pop('dependency_links', []) - self.setup_requires = attrs.pop('setup_requires', []) - for ep in pkg_resources.iter_entry_points('distutils.setup_keywords'): - vars(self).setdefault(ep.name, None) - _Distribution.__init__(self, { - k: v for k, v in attrs.items() - if k not in self._DISTUTILS_UNSUPPORTED_METADATA - }) - - # Fill-in missing metadata fields not supported by distutils. - # Note some fields may have been set by other tools (e.g. pbr) - # above; they are taken preferrentially to setup() arguments - for option, default in self._DISTUTILS_UNSUPPORTED_METADATA.items(): - for source in self.metadata.__dict__, attrs: - if option in source: - value = source[option] - break - else: - value = default() if default else None - setattr(self.metadata, option, value) - - if isinstance(self.metadata.version, numbers.Number): - # Some people apparently take "version number" too literally :) - self.metadata.version = str(self.metadata.version) - - if self.metadata.version is not None: - try: - ver = packaging.version.Version(self.metadata.version) - normalized_version = str(ver) - if self.metadata.version != normalized_version: - warnings.warn( - "Normalizing '%s' to '%s'" % ( - self.metadata.version, - normalized_version, - ) - ) - self.metadata.version = normalized_version - except (packaging.version.InvalidVersion, TypeError): - warnings.warn( - "The version specified (%r) is an invalid version, this " - "may not work as expected with newer versions of " - "setuptools, pip, and PyPI. Please see PEP 440 for more " - "details." % self.metadata.version - ) - self._finalize_requires() - - def _finalize_requires(self): - """ - Set `metadata.python_requires` and fix environment markers - in `install_requires` and `extras_require`. - """ - if getattr(self, 'python_requires', None): - self.metadata.python_requires = self.python_requires - - if getattr(self, 'extras_require', None): - for extra in self.extras_require.keys(): - # Since this gets called multiple times at points where the - # keys have become 'converted' extras, ensure that we are only - # truly adding extras we haven't seen before here. - extra = extra.split(':')[0] - if extra: - self.metadata.provides_extras.add(extra) - - self._convert_extras_requirements() - self._move_install_requirements_markers() - - def _convert_extras_requirements(self): - """ - Convert requirements in `extras_require` of the form - `"extra": ["barbazquux; {marker}"]` to - `"extra:{marker}": ["barbazquux"]`. - """ - spec_ext_reqs = getattr(self, 'extras_require', None) or {} - self._tmp_extras_require = defaultdict(list) - for section, v in spec_ext_reqs.items(): - # Do not strip empty sections. - self._tmp_extras_require[section] - for r in pkg_resources.parse_requirements(v): - suffix = self._suffix_for(r) - self._tmp_extras_require[section + suffix].append(r) - - @staticmethod - def _suffix_for(req): - """ - For a requirement, return the 'extras_require' suffix for - that requirement. - """ - return ':' + str(req.marker) if req.marker else '' - - def _move_install_requirements_markers(self): - """ - Move requirements in `install_requires` that are using environment - markers `extras_require`. - """ - - # divide the install_requires into two sets, simple ones still - # handled by install_requires and more complex ones handled - # by extras_require. - - def is_simple_req(req): - return not req.marker - - spec_inst_reqs = getattr(self, 'install_requires', None) or () - inst_reqs = list(pkg_resources.parse_requirements(spec_inst_reqs)) - simple_reqs = filter(is_simple_req, inst_reqs) - complex_reqs = filterfalse(is_simple_req, inst_reqs) - self.install_requires = list(map(str, simple_reqs)) - - for r in complex_reqs: - self._tmp_extras_require[':' + str(r.marker)].append(r) - self.extras_require = dict( - (k, [str(r) for r in map(self._clean_req, v)]) - for k, v in self._tmp_extras_require.items() - ) - - def _clean_req(self, req): - """ - Given a Requirement, remove environment markers and return it. - """ - req.marker = None - return req - - def _parse_config_files(self, filenames=None): - """ - Adapted from distutils.dist.Distribution.parse_config_files, - this method provides the same functionality in subtly-improved - ways. - """ - from setuptools.extern.six.moves.configparser import ConfigParser - - # Ignore install directory options if we have a venv - if six.PY3 and sys.prefix != sys.base_prefix: - ignore_options = [ - 'install-base', 'install-platbase', 'install-lib', - 'install-platlib', 'install-purelib', 'install-headers', - 'install-scripts', 'install-data', 'prefix', 'exec-prefix', - 'home', 'user', 'root'] - else: - ignore_options = [] - - ignore_options = frozenset(ignore_options) - - if filenames is None: - filenames = self.find_config_files() - - if DEBUG: - self.announce("Distribution.parse_config_files():") - - parser = ConfigParser() - for filename in filenames: - with io.open(filename, encoding='utf-8') as reader: - if DEBUG: - self.announce(" reading {filename}".format(**locals())) - (parser.read_file if six.PY3 else parser.readfp)(reader) - for section in parser.sections(): - options = parser.options(section) - opt_dict = self.get_option_dict(section) - - for opt in options: - if opt != '__name__' and opt not in ignore_options: - val = self._try_str(parser.get(section, opt)) - opt = opt.replace('-', '_') - opt_dict[opt] = (filename, val) - - # Make the ConfigParser forget everything (so we retain - # the original filenames that options come from) - parser.__init__() - - # If there was a "global" section in the config file, use it - # to set Distribution options. - - if 'global' in self.command_options: - for (opt, (src, val)) in self.command_options['global'].items(): - alias = self.negative_opt.get(opt) - try: - if alias: - setattr(self, alias, not strtobool(val)) - elif opt in ('verbose', 'dry_run'): # ugh! - setattr(self, opt, strtobool(val)) - else: - setattr(self, opt, val) - except ValueError as msg: - raise DistutilsOptionError(msg) - - @staticmethod - def _try_str(val): - """ - On Python 2, much of distutils relies on string values being of - type 'str' (bytes) and not unicode text. If the value can be safely - encoded to bytes using the default encoding, prefer that. - - Why the default encoding? Because that value can be implicitly - decoded back to text if needed. - - Ref #1653 - """ - if six.PY3: - return val - try: - return val.encode() - except UnicodeEncodeError: - pass - return val - - def _set_command_options(self, command_obj, option_dict=None): - """ - Set the options for 'command_obj' from 'option_dict'. Basically - this means copying elements of a dictionary ('option_dict') to - attributes of an instance ('command'). - - 'command_obj' must be a Command instance. If 'option_dict' is not - supplied, uses the standard option dictionary for this command - (from 'self.command_options'). - - (Adopted from distutils.dist.Distribution._set_command_options) - """ - command_name = command_obj.get_command_name() - if option_dict is None: - option_dict = self.get_option_dict(command_name) - - if DEBUG: - self.announce(" setting options for '%s' command:" % command_name) - for (option, (source, value)) in option_dict.items(): - if DEBUG: - self.announce(" %s = %s (from %s)" % (option, value, - source)) - try: - bool_opts = [translate_longopt(o) - for o in command_obj.boolean_options] - except AttributeError: - bool_opts = [] - try: - neg_opt = command_obj.negative_opt - except AttributeError: - neg_opt = {} - - try: - is_string = isinstance(value, six.string_types) - if option in neg_opt and is_string: - setattr(command_obj, neg_opt[option], not strtobool(value)) - elif option in bool_opts and is_string: - setattr(command_obj, option, strtobool(value)) - elif hasattr(command_obj, option): - setattr(command_obj, option, value) - else: - raise DistutilsOptionError( - "error in %s: command '%s' has no such option '%s'" - % (source, command_name, option)) - except ValueError as msg: - raise DistutilsOptionError(msg) - - def parse_config_files(self, filenames=None, ignore_option_errors=False): - """Parses configuration files from various levels - and loads configuration. - - """ - self._parse_config_files(filenames=filenames) - - parse_configuration(self, self.command_options, - ignore_option_errors=ignore_option_errors) - self._finalize_requires() - - def parse_command_line(self): - """Process features after parsing command line options""" - result = _Distribution.parse_command_line(self) - if self.features: - self._finalize_features() - return result - - def _feature_attrname(self, name): - """Convert feature name to corresponding option attribute name""" - return 'with_' + name.replace('-', '_') - - def fetch_build_eggs(self, requires): - """Resolve pre-setup requirements""" - resolved_dists = pkg_resources.working_set.resolve( - pkg_resources.parse_requirements(requires), - installer=self.fetch_build_egg, - replace_conflicting=True, - ) - for dist in resolved_dists: - pkg_resources.working_set.add(dist, replace=True) - return resolved_dists - - def finalize_options(self): - _Distribution.finalize_options(self) - if self.features: - self._set_global_opts_from_features() - - for ep in pkg_resources.iter_entry_points('distutils.setup_keywords'): - value = getattr(self, ep.name, None) - if value is not None: - ep.require(installer=self.fetch_build_egg) - ep.load()(self, ep.name, value) - if getattr(self, 'convert_2to3_doctests', None): - # XXX may convert to set here when we can rely on set being builtin - self.convert_2to3_doctests = [ - os.path.abspath(p) - for p in self.convert_2to3_doctests - ] - else: - self.convert_2to3_doctests = [] - - def get_egg_cache_dir(self): - egg_cache_dir = os.path.join(os.curdir, '.eggs') - if not os.path.exists(egg_cache_dir): - os.mkdir(egg_cache_dir) - windows_support.hide_file(egg_cache_dir) - readme_txt_filename = os.path.join(egg_cache_dir, 'README.txt') - with open(readme_txt_filename, 'w') as f: - f.write('This directory contains eggs that were downloaded ' - 'by setuptools to build, test, and run plug-ins.\n\n') - f.write('This directory caches those eggs to prevent ' - 'repeated downloads.\n\n') - f.write('However, it is safe to delete this directory.\n\n') - - return egg_cache_dir - - def fetch_build_egg(self, req): - """Fetch an egg needed for building""" - from setuptools.command.easy_install import easy_install - dist = self.__class__({'script_args': ['easy_install']}) - opts = dist.get_option_dict('easy_install') - opts.clear() - opts.update( - (k, v) - for k, v in self.get_option_dict('easy_install').items() - if k in ( - # don't use any other settings - 'find_links', 'site_dirs', 'index_url', - 'optimize', 'site_dirs', 'allow_hosts', - )) - if self.dependency_links: - links = self.dependency_links[:] - if 'find_links' in opts: - links = opts['find_links'][1] + links - opts['find_links'] = ('setup', links) - install_dir = self.get_egg_cache_dir() - cmd = easy_install( - dist, args=["x"], install_dir=install_dir, - exclude_scripts=True, - always_copy=False, build_directory=None, editable=False, - upgrade=False, multi_version=True, no_report=True, user=False - ) - cmd.ensure_finalized() - return cmd.easy_install(req) - - def _set_global_opts_from_features(self): - """Add --with-X/--without-X options based on optional features""" - - go = [] - no = self.negative_opt.copy() - - for name, feature in self.features.items(): - self._set_feature(name, None) - feature.validate(self) - - if feature.optional: - descr = feature.description - incdef = ' (default)' - excdef = '' - if not feature.include_by_default(): - excdef, incdef = incdef, excdef - - new = ( - ('with-' + name, None, 'include ' + descr + incdef), - ('without-' + name, None, 'exclude ' + descr + excdef), - ) - go.extend(new) - no['without-' + name] = 'with-' + name - - self.global_options = self.feature_options = go + self.global_options - self.negative_opt = self.feature_negopt = no - - def _finalize_features(self): - """Add/remove features and resolve dependencies between them""" - - # First, flag all the enabled items (and thus their dependencies) - for name, feature in self.features.items(): - enabled = self.feature_is_included(name) - if enabled or (enabled is None and feature.include_by_default()): - feature.include_in(self) - self._set_feature(name, 1) - - # Then disable the rest, so that off-by-default features don't - # get flagged as errors when they're required by an enabled feature - for name, feature in self.features.items(): - if not self.feature_is_included(name): - feature.exclude_from(self) - self._set_feature(name, 0) - - def get_command_class(self, command): - """Pluggable version of get_command_class()""" - if command in self.cmdclass: - return self.cmdclass[command] - - eps = pkg_resources.iter_entry_points('distutils.commands', command) - for ep in eps: - ep.require(installer=self.fetch_build_egg) - self.cmdclass[command] = cmdclass = ep.load() - return cmdclass - else: - return _Distribution.get_command_class(self, command) - - def print_commands(self): - for ep in pkg_resources.iter_entry_points('distutils.commands'): - if ep.name not in self.cmdclass: - # don't require extras as the commands won't be invoked - cmdclass = ep.resolve() - self.cmdclass[ep.name] = cmdclass - return _Distribution.print_commands(self) - - def get_command_list(self): - for ep in pkg_resources.iter_entry_points('distutils.commands'): - if ep.name not in self.cmdclass: - # don't require extras as the commands won't be invoked - cmdclass = ep.resolve() - self.cmdclass[ep.name] = cmdclass - return _Distribution.get_command_list(self) - - def _set_feature(self, name, status): - """Set feature's inclusion status""" - setattr(self, self._feature_attrname(name), status) - - def feature_is_included(self, name): - """Return 1 if feature is included, 0 if excluded, 'None' if unknown""" - return getattr(self, self._feature_attrname(name)) - - def include_feature(self, name): - """Request inclusion of feature named 'name'""" - - if self.feature_is_included(name) == 0: - descr = self.features[name].description - raise DistutilsOptionError( - descr + " is required, but was excluded or is not available" - ) - self.features[name].include_in(self) - self._set_feature(name, 1) - - def include(self, **attrs): - """Add items to distribution that are named in keyword arguments - - For example, 'dist.include(py_modules=["x"])' would add 'x' to - the distribution's 'py_modules' attribute, if it was not already - there. - - Currently, this method only supports inclusion for attributes that are - lists or tuples. If you need to add support for adding to other - attributes in this or a subclass, you can add an '_include_X' method, - where 'X' is the name of the attribute. The method will be called with - the value passed to 'include()'. So, 'dist.include(foo={"bar":"baz"})' - will try to call 'dist._include_foo({"bar":"baz"})', which can then - handle whatever special inclusion logic is needed. - """ - for k, v in attrs.items(): - include = getattr(self, '_include_' + k, None) - if include: - include(v) - else: - self._include_misc(k, v) - - def exclude_package(self, package): - """Remove packages, modules, and extensions in named package""" - - pfx = package + '.' - if self.packages: - self.packages = [ - p for p in self.packages - if p != package and not p.startswith(pfx) - ] - - if self.py_modules: - self.py_modules = [ - p for p in self.py_modules - if p != package and not p.startswith(pfx) - ] - - if self.ext_modules: - self.ext_modules = [ - p for p in self.ext_modules - if p.name != package and not p.name.startswith(pfx) - ] - - def has_contents_for(self, package): - """Return true if 'exclude_package(package)' would do something""" - - pfx = package + '.' - - for p in self.iter_distribution_names(): - if p == package or p.startswith(pfx): - return True - - def _exclude_misc(self, name, value): - """Handle 'exclude()' for list/tuple attrs without a special handler""" - if not isinstance(value, sequence): - raise DistutilsSetupError( - "%s: setting must be a list or tuple (%r)" % (name, value) - ) - try: - old = getattr(self, name) - except AttributeError: - raise DistutilsSetupError( - "%s: No such distribution setting" % name - ) - if old is not None and not isinstance(old, sequence): - raise DistutilsSetupError( - name + ": this setting cannot be changed via include/exclude" - ) - elif old: - setattr(self, name, [item for item in old if item not in value]) - - def _include_misc(self, name, value): - """Handle 'include()' for list/tuple attrs without a special handler""" - - if not isinstance(value, sequence): - raise DistutilsSetupError( - "%s: setting must be a list (%r)" % (name, value) - ) - try: - old = getattr(self, name) - except AttributeError: - raise DistutilsSetupError( - "%s: No such distribution setting" % name - ) - if old is None: - setattr(self, name, value) - elif not isinstance(old, sequence): - raise DistutilsSetupError( - name + ": this setting cannot be changed via include/exclude" - ) - else: - new = [item for item in value if item not in old] - setattr(self, name, old + new) - - def exclude(self, **attrs): - """Remove items from distribution that are named in keyword arguments - - For example, 'dist.exclude(py_modules=["x"])' would remove 'x' from - the distribution's 'py_modules' attribute. Excluding packages uses - the 'exclude_package()' method, so all of the package's contained - packages, modules, and extensions are also excluded. - - Currently, this method only supports exclusion from attributes that are - lists or tuples. If you need to add support for excluding from other - attributes in this or a subclass, you can add an '_exclude_X' method, - where 'X' is the name of the attribute. The method will be called with - the value passed to 'exclude()'. So, 'dist.exclude(foo={"bar":"baz"})' - will try to call 'dist._exclude_foo({"bar":"baz"})', which can then - handle whatever special exclusion logic is needed. - """ - for k, v in attrs.items(): - exclude = getattr(self, '_exclude_' + k, None) - if exclude: - exclude(v) - else: - self._exclude_misc(k, v) - - def _exclude_packages(self, packages): - if not isinstance(packages, sequence): - raise DistutilsSetupError( - "packages: setting must be a list or tuple (%r)" % (packages,) - ) - list(map(self.exclude_package, packages)) - - def _parse_command_opts(self, parser, args): - # Remove --with-X/--without-X options when processing command args - self.global_options = self.__class__.global_options - self.negative_opt = self.__class__.negative_opt - - # First, expand any aliases - command = args[0] - aliases = self.get_option_dict('aliases') - while command in aliases: - src, alias = aliases[command] - del aliases[command] # ensure each alias can expand only once! - import shlex - args[:1] = shlex.split(alias, True) - command = args[0] - - nargs = _Distribution._parse_command_opts(self, parser, args) - - # Handle commands that want to consume all remaining arguments - cmd_class = self.get_command_class(command) - if getattr(cmd_class, 'command_consumes_arguments', None): - self.get_option_dict(command)['args'] = ("command line", nargs) - if nargs is not None: - return [] - - return nargs - - def get_cmdline_options(self): - """Return a '{cmd: {opt:val}}' map of all command-line options - - Option names are all long, but do not include the leading '--', and - contain dashes rather than underscores. If the option doesn't take - an argument (e.g. '--quiet'), the 'val' is 'None'. - - Note that options provided by config files are intentionally excluded. - """ - - d = {} - - for cmd, opts in self.command_options.items(): - - for opt, (src, val) in opts.items(): - - if src != "command line": - continue - - opt = opt.replace('_', '-') - - if val == 0: - cmdobj = self.get_command_obj(cmd) - neg_opt = self.negative_opt.copy() - neg_opt.update(getattr(cmdobj, 'negative_opt', {})) - for neg, pos in neg_opt.items(): - if pos == opt: - opt = neg - val = None - break - else: - raise AssertionError("Shouldn't be able to get here") - - elif val == 1: - val = None - - d.setdefault(cmd, {})[opt] = val - - return d - - def iter_distribution_names(self): - """Yield all packages, modules, and extension names in distribution""" - - for pkg in self.packages or (): - yield pkg - - for module in self.py_modules or (): - yield module - - for ext in self.ext_modules or (): - if isinstance(ext, tuple): - name, buildinfo = ext - else: - name = ext.name - if name.endswith('module'): - name = name[:-6] - yield name - - def handle_display_options(self, option_order): - """If there were any non-global "display-only" options - (--help-commands or the metadata display options) on the command - line, display the requested info and return true; else return - false. - """ - import sys - - if six.PY2 or self.help_commands: - return _Distribution.handle_display_options(self, option_order) - - # Stdout may be StringIO (e.g. in tests) - if not isinstance(sys.stdout, io.TextIOWrapper): - return _Distribution.handle_display_options(self, option_order) - - # Don't wrap stdout if utf-8 is already the encoding. Provides - # workaround for #334. - if sys.stdout.encoding.lower() in ('utf-8', 'utf8'): - return _Distribution.handle_display_options(self, option_order) - - # Print metadata in UTF-8 no matter the platform - encoding = sys.stdout.encoding - errors = sys.stdout.errors - newline = sys.platform != 'win32' and '\n' or None - line_buffering = sys.stdout.line_buffering - - sys.stdout = io.TextIOWrapper( - sys.stdout.detach(), 'utf-8', errors, newline, line_buffering) - try: - return _Distribution.handle_display_options(self, option_order) - finally: - sys.stdout = io.TextIOWrapper( - sys.stdout.detach(), encoding, errors, newline, line_buffering) - - -class Feature: - """ - **deprecated** -- The `Feature` facility was never completely implemented - or supported, `has reported issues - <https://github.com/pypa/setuptools/issues/58>`_ and will be removed in - a future version. - - A subset of the distribution that can be excluded if unneeded/wanted - - Features are created using these keyword arguments: - - 'description' -- a short, human readable description of the feature, to - be used in error messages, and option help messages. - - 'standard' -- if true, the feature is included by default if it is - available on the current system. Otherwise, the feature is only - included if requested via a command line '--with-X' option, or if - another included feature requires it. The default setting is 'False'. - - 'available' -- if true, the feature is available for installation on the - current system. The default setting is 'True'. - - 'optional' -- if true, the feature's inclusion can be controlled from the - command line, using the '--with-X' or '--without-X' options. If - false, the feature's inclusion status is determined automatically, - based on 'availabile', 'standard', and whether any other feature - requires it. The default setting is 'True'. - - 'require_features' -- a string or sequence of strings naming features - that should also be included if this feature is included. Defaults to - empty list. May also contain 'Require' objects that should be - added/removed from the distribution. - - 'remove' -- a string or list of strings naming packages to be removed - from the distribution if this feature is *not* included. If the - feature *is* included, this argument is ignored. This argument exists - to support removing features that "crosscut" a distribution, such as - defining a 'tests' feature that removes all the 'tests' subpackages - provided by other features. The default for this argument is an empty - list. (Note: the named package(s) or modules must exist in the base - distribution when the 'setup()' function is initially called.) - - other keywords -- any other keyword arguments are saved, and passed to - the distribution's 'include()' and 'exclude()' methods when the - feature is included or excluded, respectively. So, for example, you - could pass 'packages=["a","b"]' to cause packages 'a' and 'b' to be - added or removed from the distribution as appropriate. - - A feature must include at least one 'requires', 'remove', or other - keyword argument. Otherwise, it can't affect the distribution in any way. - Note also that you can subclass 'Feature' to create your own specialized - feature types that modify the distribution in other ways when included or - excluded. See the docstrings for the various methods here for more detail. - Aside from the methods, the only feature attributes that distributions look - at are 'description' and 'optional'. - """ - - @staticmethod - def warn_deprecated(): - msg = ( - "Features are deprecated and will be removed in a future " - "version. See https://github.com/pypa/setuptools/issues/65." - ) - warnings.warn(msg, DistDeprecationWarning, stacklevel=3) - - def __init__( - self, description, standard=False, available=True, - optional=True, require_features=(), remove=(), **extras): - self.warn_deprecated() - - self.description = description - self.standard = standard - self.available = available - self.optional = optional - if isinstance(require_features, (str, Require)): - require_features = require_features, - - self.require_features = [ - r for r in require_features if isinstance(r, str) - ] - er = [r for r in require_features if not isinstance(r, str)] - if er: - extras['require_features'] = er - - if isinstance(remove, str): - remove = remove, - self.remove = remove - self.extras = extras - - if not remove and not require_features and not extras: - raise DistutilsSetupError( - "Feature %s: must define 'require_features', 'remove', or " - "at least one of 'packages', 'py_modules', etc." - ) - - def include_by_default(self): - """Should this feature be included by default?""" - return self.available and self.standard - - def include_in(self, dist): - """Ensure feature and its requirements are included in distribution - - You may override this in a subclass to perform additional operations on - the distribution. Note that this method may be called more than once - per feature, and so should be idempotent. - - """ - - if not self.available: - raise DistutilsPlatformError( - self.description + " is required, " - "but is not available on this platform" - ) - - dist.include(**self.extras) - - for f in self.require_features: - dist.include_feature(f) - - def exclude_from(self, dist): - """Ensure feature is excluded from distribution - - You may override this in a subclass to perform additional operations on - the distribution. This method will be called at most once per - feature, and only after all included features have been asked to - include themselves. - """ - - dist.exclude(**self.extras) - - if self.remove: - for item in self.remove: - dist.exclude_package(item) - - def validate(self, dist): - """Verify that feature makes sense in context of distribution - - This method is called by the distribution just before it parses its - command line. It checks to ensure that the 'remove' attribute, if any, - contains only valid package/module names that are present in the base - distribution when 'setup()' is called. You may override it in a - subclass to perform any other required validation of the feature - against a target distribution. - """ - - for item in self.remove: - if not dist.has_contents_for(item): - raise DistutilsSetupError( - "%s wants to be able to remove %s, but the distribution" - " doesn't contain any packages or modules under %s" - % (self.description, item, item) - ) - - -class DistDeprecationWarning(SetuptoolsDeprecationWarning): - """Class for warning about deprecations in dist in - setuptools. Not ignored by default, unlike DeprecationWarning.""" diff --git a/env/lib/python3.7/site-packages/setuptools/extension.py b/env/lib/python3.7/site-packages/setuptools/extension.py deleted file mode 100644 index 2946889..0000000 --- a/env/lib/python3.7/site-packages/setuptools/extension.py +++ /dev/null @@ -1,57 +0,0 @@ -import re -import functools -import distutils.core -import distutils.errors -import distutils.extension - -from setuptools.extern.six.moves import map - -from .monkey import get_unpatched - - -def _have_cython(): - """ - Return True if Cython can be imported. - """ - cython_impl = 'Cython.Distutils.build_ext' - try: - # from (cython_impl) import build_ext - __import__(cython_impl, fromlist=['build_ext']).build_ext - return True - except Exception: - pass - return False - - -# for compatibility -have_pyrex = _have_cython - -_Extension = get_unpatched(distutils.core.Extension) - - -class Extension(_Extension): - """Extension that uses '.c' files in place of '.pyx' files""" - - def __init__(self, name, sources, *args, **kw): - # The *args is needed for compatibility as calls may use positional - # arguments. py_limited_api may be set only via keyword. - self.py_limited_api = kw.pop("py_limited_api", False) - _Extension.__init__(self, name, sources, *args, **kw) - - def _convert_pyx_sources_to_lang(self): - """ - Replace sources with .pyx extensions to sources with the target - language extension. This mechanism allows language authors to supply - pre-converted sources but to prefer the .pyx sources. - """ - if _have_cython(): - # the build has Cython, so allow it to compile the .pyx files - return - lang = self.language or '' - target_ext = '.cpp' if lang.lower() == 'c++' else '.c' - sub = functools.partial(re.sub, '.pyx$', target_ext) - self.sources = list(map(sub, self.sources)) - - -class Library(Extension): - """Just like a regular Extension, but built as a library instead""" diff --git a/env/lib/python3.7/site-packages/setuptools/extern/__init__.py b/env/lib/python3.7/site-packages/setuptools/extern/__init__.py deleted file mode 100644 index cb2fa32..0000000 --- a/env/lib/python3.7/site-packages/setuptools/extern/__init__.py +++ /dev/null @@ -1,73 +0,0 @@ -import sys - - -class VendorImporter: - """ - A PEP 302 meta path importer for finding optionally-vendored - or otherwise naturally-installed packages from root_name. - """ - - def __init__(self, root_name, vendored_names=(), vendor_pkg=None): - self.root_name = root_name - self.vendored_names = set(vendored_names) - self.vendor_pkg = vendor_pkg or root_name.replace('extern', '_vendor') - - @property - def search_path(self): - """ - Search first the vendor package then as a natural package. - """ - yield self.vendor_pkg + '.' - yield '' - - def find_module(self, fullname, path=None): - """ - Return self when fullname starts with root_name and the - target module is one vendored through this importer. - """ - root, base, target = fullname.partition(self.root_name + '.') - if root: - return - if not any(map(target.startswith, self.vendored_names)): - return - return self - - def load_module(self, fullname): - """ - Iterate over the search path to locate and load fullname. - """ - root, base, target = fullname.partition(self.root_name + '.') - for prefix in self.search_path: - try: - extant = prefix + target - __import__(extant) - mod = sys.modules[extant] - sys.modules[fullname] = mod - # mysterious hack: - # Remove the reference to the extant package/module - # on later Python versions to cause relative imports - # in the vendor package to resolve the same modules - # as those going through this importer. - if sys.version_info >= (3, ): - del sys.modules[extant] - return mod - except ImportError: - pass - else: - raise ImportError( - "The '{target}' package is required; " - "normally this is bundled with this package so if you get " - "this warning, consult the packager of your " - "distribution.".format(**locals()) - ) - - def install(self): - """ - Install this importer into sys.meta_path if not already present. - """ - if self not in sys.meta_path: - sys.meta_path.append(self) - - -names = 'six', 'packaging', 'pyparsing', -VendorImporter(__name__, names, 'setuptools._vendor').install() diff --git a/env/lib/python3.7/site-packages/setuptools/extern/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/extern/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 5a22f7ec86cf7bcdb27baa1ea8b08db03c50c27b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2377 zcmZ`)TW=gS6t?HKyOT{?RVZmIh%A99E71+N2LuI`UW6)8R5ewB71e0E_9m0ejwiOa z$u6@mY{V1djrT@8@jLhze&wlufhW%K>~7LV^~lE_UyslC`SYFC)tEpk{<`|~pB5qi z;?E)lP`M3RcfoMNX-<0NTf#l=pAhcPydLF2&l6Pm!sFr0e-WG#3gdQ2Cwd8U$aWv? zBKc6c4OycR1ZI<-$7#>!YdqlL3GD?U<PmS2kQwbo{1R{S7PK~a%vVlGugTkd70MR( zVTa3h?TIM3R1b!wR7R-DNz5R9!yev$$Ugn(6E+kkWo2siST-NR22!y>R`9IYWwJDx zEYdt5-+b;C65K5SL!{Xg>L}BK6{#61Hzq5zfr{X;Wd9)D6`Bo{95N-PNs4qRx^DL0 zaA*u1CM+@Eg{<EPQ_+ef#L&u{Va==ja<if@d``J{>Oo7u2^`Je?nUAlj#Su2Qv22k zZELxc^|df|ZQ-@sUE78dWuEqhjq8r2JlO37Hqas;s1SBn4K#o<Q3!=I|J~U#!*Z+4 z%A4~8-sFel;`rmi-WF^!Dvgx6K3}aJ+e(tG$V`%S%du@PevnH#0z+s-V>;P*@(M!T z#kfAjF_5tIAR|xoI+%*=1A#Wk6C{%7EP@?OzIV|@fOkZy`g;JQ(uM(0tUm4n7Hle5 zs#&@KZ_!f&giBc3wPd?PT`-_Pzt3W#R^ZpJXtz&-1iFOoIaI?oom_wIRObfvF|e30 z2utWchaZ3$4@dEEr}Srk>Q94dSovy`dppE<#;?Nt07ir}Acy`8TPsI~$#2V}KLSKl z!4Oe)gvT6=@*KIxfSbx_c9a3zmpox<!7&`m`7mf#7&erAlna(=CW}S*fY)YE$<gi} zl+d%dGG{?kt8k3%PGnmp?3Ll=akR32T8ynfOiLTrZlD*AY@Nu3);1S@+5p3819Z^_ z&r&UHR6BJc{CG{1+S3i#ShvBDaGeJ5U4eW7hI148$SF)s$Vm9RkoE6iF2LX+5XU71 z-n&PhKAwi-FRHK#HpnyrNTL~~#02|c6<s6KM%8e2dJEek?j3}xSNDEJs>Ti=ZW;%% zDk-p+lAp-o=8uqnfL8ABHwVPDX5<e#qrZZ10;|KxcS~p<z;#cJVDh<8h#7$FXzujO zNS4b!b|a#>O!*S|*YN4kmq@|MpO0aQ8^6@Co!(en0mNL1!%?OL|B@9_4N=?Xh->z2 zRB%){M<Yjrxz;f)SvFu}Ibuj4*L9St0(A64)|Z7I<@H^hj|T~LqZQ+sHY$5ILb`Of zJF&V9?$vUHx5~z#2~M4p1Y~UtGFD@*Z5tw?VHOC@K-!gB=I<*dm5o5hhpDj<MkUvs zW_^R-!lh9~6f#C##r307i9vSk1T`%T@Ko{(T*HXYx%Mth(wksNuuj|5qfPi?8b>jd z0bQf9=h4W&z`k=!yrOQ1hGXA#s8qy&1RONfI+ia$@lSzY?!ojXkIuMIKQ*sjM3xmm z1Bg%;-!&&o2uUFgOLHYsK4x%KEedl+iS3TB-iCc`YdOb8X<33Qzd`jH^H<<D%&HYH z03Ba{P4VV~I-ZLp2q^%IuK-FB;0T!3AVR&JB!{Eai4^=bl7!2Ck|?~*wpl7!3T4I$ zsi3Z*c@NDEG#I&a21Qxny+&DeYS0V<FAm$yxZQlm^>looP<D(0g)cOa6RKlSD-G4j pm9zJ(yL?q$c-&+gqW4;Tfcw130o%M)pX_UVx!hCN^w;hM^nVQ8a}odm diff --git a/env/lib/python3.7/site-packages/setuptools/glibc.py b/env/lib/python3.7/site-packages/setuptools/glibc.py deleted file mode 100644 index a134591..0000000 --- a/env/lib/python3.7/site-packages/setuptools/glibc.py +++ /dev/null @@ -1,86 +0,0 @@ -# This file originally from pip: -# https://github.com/pypa/pip/blob/8f4f15a5a95d7d5b511ceaee9ed261176c181970/src/pip/_internal/utils/glibc.py -from __future__ import absolute_import - -import ctypes -import re -import warnings - - -def glibc_version_string(): - "Returns glibc version string, or None if not using glibc." - - # ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen - # manpage says, "If filename is NULL, then the returned handle is for the - # main program". This way we can let the linker do the work to figure out - # which libc our process is actually using. - process_namespace = ctypes.CDLL(None) - try: - gnu_get_libc_version = process_namespace.gnu_get_libc_version - except AttributeError: - # Symbol doesn't exist -> therefore, we are not linked to - # glibc. - return None - - # Call gnu_get_libc_version, which returns a string like "2.5" - gnu_get_libc_version.restype = ctypes.c_char_p - version_str = gnu_get_libc_version() - # py2 / py3 compatibility: - if not isinstance(version_str, str): - version_str = version_str.decode("ascii") - - return version_str - - -# Separated out from have_compatible_glibc for easier unit testing -def check_glibc_version(version_str, required_major, minimum_minor): - # Parse string and check against requested version. - # - # We use a regexp instead of str.split because we want to discard any - # random junk that might come after the minor version -- this might happen - # in patched/forked versions of glibc (e.g. Linaro's version of glibc - # uses version strings like "2.20-2014.11"). See gh-3588. - m = re.match(r"(?P<major>[0-9]+)\.(?P<minor>[0-9]+)", version_str) - if not m: - warnings.warn("Expected glibc version with 2 components major.minor," - " got: %s" % version_str, RuntimeWarning) - return False - return (int(m.group("major")) == required_major and - int(m.group("minor")) >= minimum_minor) - - -def have_compatible_glibc(required_major, minimum_minor): - version_str = glibc_version_string() - if version_str is None: - return False - return check_glibc_version(version_str, required_major, minimum_minor) - - -# platform.libc_ver regularly returns completely nonsensical glibc -# versions. E.g. on my computer, platform says: -# -# ~$ python2.7 -c 'import platform; print(platform.libc_ver())' -# ('glibc', '2.7') -# ~$ python3.5 -c 'import platform; print(platform.libc_ver())' -# ('glibc', '2.9') -# -# But the truth is: -# -# ~$ ldd --version -# ldd (Debian GLIBC 2.22-11) 2.22 -# -# This is unfortunate, because it means that the linehaul data on libc -# versions that was generated by pip 8.1.2 and earlier is useless and -# misleading. Solution: instead of using platform, use our code that actually -# works. -def libc_ver(): - """Try to determine the glibc version - - Returns a tuple of strings (lib, version) which default to empty strings - in case the lookup fails. - """ - glibc_version = glibc_version_string() - if glibc_version is None: - return ("", "") - else: - return ("glibc", glibc_version) diff --git a/env/lib/python3.7/site-packages/setuptools/glob.py b/env/lib/python3.7/site-packages/setuptools/glob.py deleted file mode 100644 index 9d7cbc5..0000000 --- a/env/lib/python3.7/site-packages/setuptools/glob.py +++ /dev/null @@ -1,174 +0,0 @@ -""" -Filename globbing utility. Mostly a copy of `glob` from Python 3.5. - -Changes include: - * `yield from` and PEP3102 `*` removed. - * Hidden files are not ignored. -""" - -import os -import re -import fnmatch - -__all__ = ["glob", "iglob", "escape"] - - -def glob(pathname, recursive=False): - """Return a list of paths matching a pathname pattern. - - The pattern may contain simple shell-style wildcards a la - fnmatch. However, unlike fnmatch, filenames starting with a - dot are special cases that are not matched by '*' and '?' - patterns. - - If recursive is true, the pattern '**' will match any files and - zero or more directories and subdirectories. - """ - return list(iglob(pathname, recursive=recursive)) - - -def iglob(pathname, recursive=False): - """Return an iterator which yields the paths matching a pathname pattern. - - The pattern may contain simple shell-style wildcards a la - fnmatch. However, unlike fnmatch, filenames starting with a - dot are special cases that are not matched by '*' and '?' - patterns. - - If recursive is true, the pattern '**' will match any files and - zero or more directories and subdirectories. - """ - it = _iglob(pathname, recursive) - if recursive and _isrecursive(pathname): - s = next(it) # skip empty string - assert not s - return it - - -def _iglob(pathname, recursive): - dirname, basename = os.path.split(pathname) - if not has_magic(pathname): - if basename: - if os.path.lexists(pathname): - yield pathname - else: - # Patterns ending with a slash should match only directories - if os.path.isdir(dirname): - yield pathname - return - if not dirname: - if recursive and _isrecursive(basename): - for x in glob2(dirname, basename): - yield x - else: - for x in glob1(dirname, basename): - yield x - return - # `os.path.split()` returns the argument itself as a dirname if it is a - # drive or UNC path. Prevent an infinite recursion if a drive or UNC path - # contains magic characters (i.e. r'\\?\C:'). - if dirname != pathname and has_magic(dirname): - dirs = _iglob(dirname, recursive) - else: - dirs = [dirname] - if has_magic(basename): - if recursive and _isrecursive(basename): - glob_in_dir = glob2 - else: - glob_in_dir = glob1 - else: - glob_in_dir = glob0 - for dirname in dirs: - for name in glob_in_dir(dirname, basename): - yield os.path.join(dirname, name) - - -# These 2 helper functions non-recursively glob inside a literal directory. -# They return a list of basenames. `glob1` accepts a pattern while `glob0` -# takes a literal basename (so it only has to check for its existence). - - -def glob1(dirname, pattern): - if not dirname: - if isinstance(pattern, bytes): - dirname = os.curdir.encode('ASCII') - else: - dirname = os.curdir - try: - names = os.listdir(dirname) - except OSError: - return [] - return fnmatch.filter(names, pattern) - - -def glob0(dirname, basename): - if not basename: - # `os.path.split()` returns an empty basename for paths ending with a - # directory separator. 'q*x/' should match only directories. - if os.path.isdir(dirname): - return [basename] - else: - if os.path.lexists(os.path.join(dirname, basename)): - return [basename] - return [] - - -# This helper function recursively yields relative pathnames inside a literal -# directory. - - -def glob2(dirname, pattern): - assert _isrecursive(pattern) - yield pattern[:0] - for x in _rlistdir(dirname): - yield x - - -# Recursively yields relative pathnames inside a literal directory. -def _rlistdir(dirname): - if not dirname: - if isinstance(dirname, bytes): - dirname = os.curdir.encode('ASCII') - else: - dirname = os.curdir - try: - names = os.listdir(dirname) - except os.error: - return - for x in names: - yield x - path = os.path.join(dirname, x) if dirname else x - for y in _rlistdir(path): - yield os.path.join(x, y) - - -magic_check = re.compile('([*?[])') -magic_check_bytes = re.compile(b'([*?[])') - - -def has_magic(s): - if isinstance(s, bytes): - match = magic_check_bytes.search(s) - else: - match = magic_check.search(s) - return match is not None - - -def _isrecursive(pattern): - if isinstance(pattern, bytes): - return pattern == b'**' - else: - return pattern == '**' - - -def escape(pathname): - """Escape all special characters. - """ - # Escaping is done by wrapping any of "*?[" between square brackets. - # Metacharacters do not work in the drive part and shouldn't be escaped. - drive, pathname = os.path.splitdrive(pathname) - if isinstance(pathname, bytes): - pathname = magic_check_bytes.sub(br'[\1]', pathname) - else: - pathname = magic_check.sub(r'[\1]', pathname) - return drive + pathname diff --git a/env/lib/python3.7/site-packages/setuptools/gui-32.exe b/env/lib/python3.7/site-packages/setuptools/gui-32.exe deleted file mode 100644 index f8d3509653ba8f80ca7f3aa7f95616142ba83a94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65536 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 diff --git a/env/lib/python3.7/site-packages/setuptools/gui-64.exe b/env/lib/python3.7/site-packages/setuptools/gui-64.exe deleted file mode 100644 index 330c51a5dde15a0bb610a48cd0ca11770c914dae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75264 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 diff --git a/env/lib/python3.7/site-packages/setuptools/gui.exe b/env/lib/python3.7/site-packages/setuptools/gui.exe deleted file mode 100644 index f8d3509653ba8f80ca7f3aa7f95616142ba83a94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65536 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 diff --git a/env/lib/python3.7/site-packages/setuptools/launch.py b/env/lib/python3.7/site-packages/setuptools/launch.py deleted file mode 100644 index 308283e..0000000 --- a/env/lib/python3.7/site-packages/setuptools/launch.py +++ /dev/null @@ -1,35 +0,0 @@ -""" -Launch the Python script on the command line after -setuptools is bootstrapped via import. -""" - -# Note that setuptools gets imported implicitly by the -# invocation of this script using python -m setuptools.launch - -import tokenize -import sys - - -def run(): - """ - Run the script in sys.argv[1] as if it had - been invoked naturally. - """ - __builtins__ - script_name = sys.argv[1] - namespace = dict( - __file__=script_name, - __name__='__main__', - __doc__=None, - ) - sys.argv[:] = sys.argv[1:] - - open_ = getattr(tokenize, 'open', open) - script = open_(script_name).read() - norm_script = script.replace('\\r\\n', '\\n') - code = compile(norm_script, script_name, 'exec') - exec(code, namespace) - - -if __name__ == '__main__': - run() diff --git a/env/lib/python3.7/site-packages/setuptools/lib2to3_ex.py b/env/lib/python3.7/site-packages/setuptools/lib2to3_ex.py deleted file mode 100644 index 4b1a73f..0000000 --- a/env/lib/python3.7/site-packages/setuptools/lib2to3_ex.py +++ /dev/null @@ -1,62 +0,0 @@ -""" -Customized Mixin2to3 support: - - - adds support for converting doctests - - -This module raises an ImportError on Python 2. -""" - -from distutils.util import Mixin2to3 as _Mixin2to3 -from distutils import log -from lib2to3.refactor import RefactoringTool, get_fixers_from_package - -import setuptools - - -class DistutilsRefactoringTool(RefactoringTool): - def log_error(self, msg, *args, **kw): - log.error(msg, *args) - - def log_message(self, msg, *args): - log.info(msg, *args) - - def log_debug(self, msg, *args): - log.debug(msg, *args) - - -class Mixin2to3(_Mixin2to3): - def run_2to3(self, files, doctests=False): - # See of the distribution option has been set, otherwise check the - # setuptools default. - if self.distribution.use_2to3 is not True: - return - if not files: - return - log.info("Fixing " + " ".join(files)) - self.__build_fixer_names() - self.__exclude_fixers() - if doctests: - if setuptools.run_2to3_on_doctests: - r = DistutilsRefactoringTool(self.fixer_names) - r.refactor(files, write=True, doctests_only=True) - else: - _Mixin2to3.run_2to3(self, files) - - def __build_fixer_names(self): - if self.fixer_names: - return - self.fixer_names = [] - for p in setuptools.lib2to3_fixer_packages: - self.fixer_names.extend(get_fixers_from_package(p)) - if self.distribution.use_2to3_fixers is not None: - for p in self.distribution.use_2to3_fixers: - self.fixer_names.extend(get_fixers_from_package(p)) - - def __exclude_fixers(self): - excluded_fixers = getattr(self, 'exclude_fixers', []) - if self.distribution.use_2to3_exclude_fixers is not None: - excluded_fixers.extend(self.distribution.use_2to3_exclude_fixers) - for fixer_name in excluded_fixers: - if fixer_name in self.fixer_names: - self.fixer_names.remove(fixer_name) diff --git a/env/lib/python3.7/site-packages/setuptools/monkey.py b/env/lib/python3.7/site-packages/setuptools/monkey.py deleted file mode 100644 index 3c77f8c..0000000 --- a/env/lib/python3.7/site-packages/setuptools/monkey.py +++ /dev/null @@ -1,179 +0,0 @@ -""" -Monkey patching of distutils. -""" - -import sys -import distutils.filelist -import platform -import types -import functools -from importlib import import_module -import inspect - -from setuptools.extern import six - -import setuptools - -__all__ = [] -""" -Everything is private. Contact the project team -if you think you need this functionality. -""" - - -def _get_mro(cls): - """ - Returns the bases classes for cls sorted by the MRO. - - Works around an issue on Jython where inspect.getmro will not return all - base classes if multiple classes share the same name. Instead, this - function will return a tuple containing the class itself, and the contents - of cls.__bases__. See https://github.com/pypa/setuptools/issues/1024. - """ - if platform.python_implementation() == "Jython": - return (cls,) + cls.__bases__ - return inspect.getmro(cls) - - -def get_unpatched(item): - lookup = ( - get_unpatched_class if isinstance(item, six.class_types) else - get_unpatched_function if isinstance(item, types.FunctionType) else - lambda item: None - ) - return lookup(item) - - -def get_unpatched_class(cls): - """Protect against re-patching the distutils if reloaded - - Also ensures that no other distutils extension monkeypatched the distutils - first. - """ - external_bases = ( - cls - for cls in _get_mro(cls) - if not cls.__module__.startswith('setuptools') - ) - base = next(external_bases) - if not base.__module__.startswith('distutils'): - msg = "distutils has already been patched by %r" % cls - raise AssertionError(msg) - return base - - -def patch_all(): - # we can't patch distutils.cmd, alas - distutils.core.Command = setuptools.Command - - has_issue_12885 = sys.version_info <= (3, 5, 3) - - if has_issue_12885: - # fix findall bug in distutils (http://bugs.python.org/issue12885) - distutils.filelist.findall = setuptools.findall - - needs_warehouse = ( - sys.version_info < (2, 7, 13) - or - (3, 4) < sys.version_info < (3, 4, 6) - or - (3, 5) < sys.version_info <= (3, 5, 3) - ) - - if needs_warehouse: - warehouse = 'https://upload.pypi.org/legacy/' - distutils.config.PyPIRCCommand.DEFAULT_REPOSITORY = warehouse - - _patch_distribution_metadata() - - # Install Distribution throughout the distutils - for module in distutils.dist, distutils.core, distutils.cmd: - module.Distribution = setuptools.dist.Distribution - - # Install the patched Extension - distutils.core.Extension = setuptools.extension.Extension - distutils.extension.Extension = setuptools.extension.Extension - if 'distutils.command.build_ext' in sys.modules: - sys.modules['distutils.command.build_ext'].Extension = ( - setuptools.extension.Extension - ) - - patch_for_msvc_specialized_compiler() - - -def _patch_distribution_metadata(): - """Patch write_pkg_file and read_pkg_file for higher metadata standards""" - for attr in ('write_pkg_file', 'read_pkg_file', 'get_metadata_version'): - new_val = getattr(setuptools.dist, attr) - setattr(distutils.dist.DistributionMetadata, attr, new_val) - - -def patch_func(replacement, target_mod, func_name): - """ - Patch func_name in target_mod with replacement - - Important - original must be resolved by name to avoid - patching an already patched function. - """ - original = getattr(target_mod, func_name) - - # set the 'unpatched' attribute on the replacement to - # point to the original. - vars(replacement).setdefault('unpatched', original) - - # replace the function in the original module - setattr(target_mod, func_name, replacement) - - -def get_unpatched_function(candidate): - return getattr(candidate, 'unpatched') - - -def patch_for_msvc_specialized_compiler(): - """ - Patch functions in distutils to use standalone Microsoft Visual C++ - compilers. - """ - # import late to avoid circular imports on Python < 3.5 - msvc = import_module('setuptools.msvc') - - if platform.system() != 'Windows': - # Compilers only availables on Microsoft Windows - return - - def patch_params(mod_name, func_name): - """ - Prepare the parameters for patch_func to patch indicated function. - """ - repl_prefix = 'msvc9_' if 'msvc9' in mod_name else 'msvc14_' - repl_name = repl_prefix + func_name.lstrip('_') - repl = getattr(msvc, repl_name) - mod = import_module(mod_name) - if not hasattr(mod, func_name): - raise ImportError(func_name) - return repl, mod, func_name - - # Python 2.7 to 3.4 - msvc9 = functools.partial(patch_params, 'distutils.msvc9compiler') - - # Python 3.5+ - msvc14 = functools.partial(patch_params, 'distutils._msvccompiler') - - try: - # Patch distutils.msvc9compiler - patch_func(*msvc9('find_vcvarsall')) - patch_func(*msvc9('query_vcvarsall')) - except ImportError: - pass - - try: - # Patch distutils._msvccompiler._get_vc_env - patch_func(*msvc14('_get_vc_env')) - except ImportError: - pass - - try: - # Patch distutils._msvccompiler.gen_lib_options for Numpy - patch_func(*msvc14('gen_lib_options')) - except ImportError: - pass diff --git a/env/lib/python3.7/site-packages/setuptools/msvc.py b/env/lib/python3.7/site-packages/setuptools/msvc.py deleted file mode 100644 index b9c472f..0000000 --- a/env/lib/python3.7/site-packages/setuptools/msvc.py +++ /dev/null @@ -1,1301 +0,0 @@ -""" -Improved support for Microsoft Visual C++ compilers. - -Known supported compilers: --------------------------- -Microsoft Visual C++ 9.0: - Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64) - Microsoft Windows SDK 6.1 (x86, x64, ia64) - Microsoft Windows SDK 7.0 (x86, x64, ia64) - -Microsoft Visual C++ 10.0: - Microsoft Windows SDK 7.1 (x86, x64, ia64) - -Microsoft Visual C++ 14.0: - Microsoft Visual C++ Build Tools 2015 (x86, x64, arm) - Microsoft Visual Studio 2017 (x86, x64, arm, arm64) - Microsoft Visual Studio Build Tools 2017 (x86, x64, arm, arm64) -""" - -import os -import sys -import platform -import itertools -import distutils.errors -from setuptools.extern.packaging.version import LegacyVersion - -from setuptools.extern.six.moves import filterfalse - -from .monkey import get_unpatched - -if platform.system() == 'Windows': - from setuptools.extern.six.moves import winreg - safe_env = os.environ -else: - """ - Mock winreg and environ so the module can be imported - on this platform. - """ - - class winreg: - HKEY_USERS = None - HKEY_CURRENT_USER = None - HKEY_LOCAL_MACHINE = None - HKEY_CLASSES_ROOT = None - - safe_env = dict() - -_msvc9_suppress_errors = ( - # msvc9compiler isn't available on some platforms - ImportError, - - # msvc9compiler raises DistutilsPlatformError in some - # environments. See #1118. - distutils.errors.DistutilsPlatformError, -) - -try: - from distutils.msvc9compiler import Reg -except _msvc9_suppress_errors: - pass - - -def msvc9_find_vcvarsall(version): - """ - Patched "distutils.msvc9compiler.find_vcvarsall" to use the standalone - compiler build for Python (VCForPython). Fall back to original behavior - when the standalone compiler is not available. - - Redirect the path of "vcvarsall.bat". - - Known supported compilers - ------------------------- - Microsoft Visual C++ 9.0: - Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64) - - Parameters - ---------- - version: float - Required Microsoft Visual C++ version. - - Return - ------ - vcvarsall.bat path: str - """ - VC_BASE = r'Software\%sMicrosoft\DevDiv\VCForPython\%0.1f' - key = VC_BASE % ('', version) - try: - # Per-user installs register the compiler path here - productdir = Reg.get_value(key, "installdir") - except KeyError: - try: - # All-user installs on a 64-bit system register here - key = VC_BASE % ('Wow6432Node\\', version) - productdir = Reg.get_value(key, "installdir") - except KeyError: - productdir = None - - if productdir: - vcvarsall = os.path.os.path.join(productdir, "vcvarsall.bat") - if os.path.isfile(vcvarsall): - return vcvarsall - - return get_unpatched(msvc9_find_vcvarsall)(version) - - -def msvc9_query_vcvarsall(ver, arch='x86', *args, **kwargs): - """ - Patched "distutils.msvc9compiler.query_vcvarsall" for support extra - compilers. - - Set environment without use of "vcvarsall.bat". - - Known supported compilers - ------------------------- - Microsoft Visual C++ 9.0: - Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64) - Microsoft Windows SDK 6.1 (x86, x64, ia64) - Microsoft Windows SDK 7.0 (x86, x64, ia64) - - Microsoft Visual C++ 10.0: - Microsoft Windows SDK 7.1 (x86, x64, ia64) - - Parameters - ---------- - ver: float - Required Microsoft Visual C++ version. - arch: str - Target architecture. - - Return - ------ - environment: dict - """ - # Try to get environement from vcvarsall.bat (Classical way) - try: - orig = get_unpatched(msvc9_query_vcvarsall) - return orig(ver, arch, *args, **kwargs) - except distutils.errors.DistutilsPlatformError: - # Pass error if Vcvarsall.bat is missing - pass - except ValueError: - # Pass error if environment not set after executing vcvarsall.bat - pass - - # If error, try to set environment directly - try: - return EnvironmentInfo(arch, ver).return_env() - except distutils.errors.DistutilsPlatformError as exc: - _augment_exception(exc, ver, arch) - raise - - -def msvc14_get_vc_env(plat_spec): - """ - Patched "distutils._msvccompiler._get_vc_env" for support extra - compilers. - - Set environment without use of "vcvarsall.bat". - - Known supported compilers - ------------------------- - Microsoft Visual C++ 14.0: - Microsoft Visual C++ Build Tools 2015 (x86, x64, arm) - Microsoft Visual Studio 2017 (x86, x64, arm, arm64) - Microsoft Visual Studio Build Tools 2017 (x86, x64, arm, arm64) - - Parameters - ---------- - plat_spec: str - Target architecture. - - Return - ------ - environment: dict - """ - # Try to get environment from vcvarsall.bat (Classical way) - try: - return get_unpatched(msvc14_get_vc_env)(plat_spec) - except distutils.errors.DistutilsPlatformError: - # Pass error Vcvarsall.bat is missing - pass - - # If error, try to set environment directly - try: - return EnvironmentInfo(plat_spec, vc_min_ver=14.0).return_env() - except distutils.errors.DistutilsPlatformError as exc: - _augment_exception(exc, 14.0) - raise - - -def msvc14_gen_lib_options(*args, **kwargs): - """ - Patched "distutils._msvccompiler.gen_lib_options" for fix - compatibility between "numpy.distutils" and "distutils._msvccompiler" - (for Numpy < 1.11.2) - """ - if "numpy.distutils" in sys.modules: - import numpy as np - if LegacyVersion(np.__version__) < LegacyVersion('1.11.2'): - return np.distutils.ccompiler.gen_lib_options(*args, **kwargs) - return get_unpatched(msvc14_gen_lib_options)(*args, **kwargs) - - -def _augment_exception(exc, version, arch=''): - """ - Add details to the exception message to help guide the user - as to what action will resolve it. - """ - # Error if MSVC++ directory not found or environment not set - message = exc.args[0] - - if "vcvarsall" in message.lower() or "visual c" in message.lower(): - # Special error message if MSVC++ not installed - tmpl = 'Microsoft Visual C++ {version:0.1f} is required.' - message = tmpl.format(**locals()) - msdownload = 'www.microsoft.com/download/details.aspx?id=%d' - if version == 9.0: - if arch.lower().find('ia64') > -1: - # For VC++ 9.0, if IA64 support is needed, redirect user - # to Windows SDK 7.0 - message += ' Get it with "Microsoft Windows SDK 7.0": ' - message += msdownload % 3138 - else: - # For VC++ 9.0 redirect user to Vc++ for Python 2.7 : - # This redirection link is maintained by Microsoft. - # Contact vspython@microsoft.com if it needs updating. - message += ' Get it from http://aka.ms/vcpython27' - elif version == 10.0: - # For VC++ 10.0 Redirect user to Windows SDK 7.1 - message += ' Get it with "Microsoft Windows SDK 7.1": ' - message += msdownload % 8279 - elif version >= 14.0: - # For VC++ 14.0 Redirect user to Visual C++ Build Tools - message += (' Get it with "Microsoft Visual C++ Build Tools": ' - r'https://visualstudio.microsoft.com/downloads/') - - exc.args = (message, ) - - -class PlatformInfo: - """ - Current and Target Architectures informations. - - Parameters - ---------- - arch: str - Target architecture. - """ - current_cpu = safe_env.get('processor_architecture', '').lower() - - def __init__(self, arch): - self.arch = arch.lower().replace('x64', 'amd64') - - @property - def target_cpu(self): - return self.arch[self.arch.find('_') + 1:] - - def target_is_x86(self): - return self.target_cpu == 'x86' - - def current_is_x86(self): - return self.current_cpu == 'x86' - - def current_dir(self, hidex86=False, x64=False): - """ - Current platform specific subfolder. - - Parameters - ---------- - hidex86: bool - return '' and not '\x86' if architecture is x86. - x64: bool - return '\x64' and not '\amd64' if architecture is amd64. - - Return - ------ - subfolder: str - '\target', or '' (see hidex86 parameter) - """ - return ( - '' if (self.current_cpu == 'x86' and hidex86) else - r'\x64' if (self.current_cpu == 'amd64' and x64) else - r'\%s' % self.current_cpu - ) - - def target_dir(self, hidex86=False, x64=False): - r""" - Target platform specific subfolder. - - Parameters - ---------- - hidex86: bool - return '' and not '\x86' if architecture is x86. - x64: bool - return '\x64' and not '\amd64' if architecture is amd64. - - Return - ------ - subfolder: str - '\current', or '' (see hidex86 parameter) - """ - return ( - '' if (self.target_cpu == 'x86' and hidex86) else - r'\x64' if (self.target_cpu == 'amd64' and x64) else - r'\%s' % self.target_cpu - ) - - def cross_dir(self, forcex86=False): - r""" - Cross platform specific subfolder. - - Parameters - ---------- - forcex86: bool - Use 'x86' as current architecture even if current acritecture is - not x86. - - Return - ------ - subfolder: str - '' if target architecture is current architecture, - '\current_target' if not. - """ - current = 'x86' if forcex86 else self.current_cpu - return ( - '' if self.target_cpu == current else - self.target_dir().replace('\\', '\\%s_' % current) - ) - - -class RegistryInfo: - """ - Microsoft Visual Studio related registry informations. - - Parameters - ---------- - platform_info: PlatformInfo - "PlatformInfo" instance. - """ - HKEYS = (winreg.HKEY_USERS, - winreg.HKEY_CURRENT_USER, - winreg.HKEY_LOCAL_MACHINE, - winreg.HKEY_CLASSES_ROOT) - - def __init__(self, platform_info): - self.pi = platform_info - - @property - def visualstudio(self): - """ - Microsoft Visual Studio root registry key. - """ - return 'VisualStudio' - - @property - def sxs(self): - """ - Microsoft Visual Studio SxS registry key. - """ - return os.path.join(self.visualstudio, 'SxS') - - @property - def vc(self): - """ - Microsoft Visual C++ VC7 registry key. - """ - return os.path.join(self.sxs, 'VC7') - - @property - def vs(self): - """ - Microsoft Visual Studio VS7 registry key. - """ - return os.path.join(self.sxs, 'VS7') - - @property - def vc_for_python(self): - """ - Microsoft Visual C++ for Python registry key. - """ - return r'DevDiv\VCForPython' - - @property - def microsoft_sdk(self): - """ - Microsoft SDK registry key. - """ - return 'Microsoft SDKs' - - @property - def windows_sdk(self): - """ - Microsoft Windows/Platform SDK registry key. - """ - return os.path.join(self.microsoft_sdk, 'Windows') - - @property - def netfx_sdk(self): - """ - Microsoft .NET Framework SDK registry key. - """ - return os.path.join(self.microsoft_sdk, 'NETFXSDK') - - @property - def windows_kits_roots(self): - """ - Microsoft Windows Kits Roots registry key. - """ - return r'Windows Kits\Installed Roots' - - def microsoft(self, key, x86=False): - """ - Return key in Microsoft software registry. - - Parameters - ---------- - key: str - Registry key path where look. - x86: str - Force x86 software registry. - - Return - ------ - str: value - """ - node64 = '' if self.pi.current_is_x86() or x86 else 'Wow6432Node' - return os.path.join('Software', node64, 'Microsoft', key) - - def lookup(self, key, name): - """ - Look for values in registry in Microsoft software registry. - - Parameters - ---------- - key: str - Registry key path where look. - name: str - Value name to find. - - Return - ------ - str: value - """ - KEY_READ = winreg.KEY_READ - openkey = winreg.OpenKey - ms = self.microsoft - for hkey in self.HKEYS: - try: - bkey = openkey(hkey, ms(key), 0, KEY_READ) - except (OSError, IOError): - if not self.pi.current_is_x86(): - try: - bkey = openkey(hkey, ms(key, True), 0, KEY_READ) - except (OSError, IOError): - continue - else: - continue - try: - return winreg.QueryValueEx(bkey, name)[0] - except (OSError, IOError): - pass - - -class SystemInfo: - """ - Microsoft Windows and Visual Studio related system inormations. - - Parameters - ---------- - registry_info: RegistryInfo - "RegistryInfo" instance. - vc_ver: float - Required Microsoft Visual C++ version. - """ - - # Variables and properties in this class use originals CamelCase variables - # names from Microsoft source files for more easy comparaison. - WinDir = safe_env.get('WinDir', '') - ProgramFiles = safe_env.get('ProgramFiles', '') - ProgramFilesx86 = safe_env.get('ProgramFiles(x86)', ProgramFiles) - - def __init__(self, registry_info, vc_ver=None): - self.ri = registry_info - self.pi = self.ri.pi - self.vc_ver = vc_ver or self._find_latest_available_vc_ver() - - def _find_latest_available_vc_ver(self): - try: - return self.find_available_vc_vers()[-1] - except IndexError: - err = 'No Microsoft Visual C++ version found' - raise distutils.errors.DistutilsPlatformError(err) - - def find_available_vc_vers(self): - """ - Find all available Microsoft Visual C++ versions. - """ - ms = self.ri.microsoft - vckeys = (self.ri.vc, self.ri.vc_for_python, self.ri.vs) - vc_vers = [] - for hkey in self.ri.HKEYS: - for key in vckeys: - try: - bkey = winreg.OpenKey(hkey, ms(key), 0, winreg.KEY_READ) - except (OSError, IOError): - continue - subkeys, values, _ = winreg.QueryInfoKey(bkey) - for i in range(values): - try: - ver = float(winreg.EnumValue(bkey, i)[0]) - if ver not in vc_vers: - vc_vers.append(ver) - except ValueError: - pass - for i in range(subkeys): - try: - ver = float(winreg.EnumKey(bkey, i)) - if ver not in vc_vers: - vc_vers.append(ver) - except ValueError: - pass - return sorted(vc_vers) - - @property - def VSInstallDir(self): - """ - Microsoft Visual Studio directory. - """ - # Default path - name = 'Microsoft Visual Studio %0.1f' % self.vc_ver - default = os.path.join(self.ProgramFilesx86, name) - - # Try to get path from registry, if fail use default path - return self.ri.lookup(self.ri.vs, '%0.1f' % self.vc_ver) or default - - @property - def VCInstallDir(self): - """ - Microsoft Visual C++ directory. - """ - self.VSInstallDir - - guess_vc = self._guess_vc() or self._guess_vc_legacy() - - # Try to get "VC++ for Python" path from registry as default path - reg_path = os.path.join(self.ri.vc_for_python, '%0.1f' % self.vc_ver) - python_vc = self.ri.lookup(reg_path, 'installdir') - default_vc = os.path.join(python_vc, 'VC') if python_vc else guess_vc - - # Try to get path from registry, if fail use default path - path = self.ri.lookup(self.ri.vc, '%0.1f' % self.vc_ver) or default_vc - - if not os.path.isdir(path): - msg = 'Microsoft Visual C++ directory not found' - raise distutils.errors.DistutilsPlatformError(msg) - - return path - - def _guess_vc(self): - """ - Locate Visual C for 2017 - """ - if self.vc_ver <= 14.0: - return - - default = r'VC\Tools\MSVC' - guess_vc = os.path.join(self.VSInstallDir, default) - # Subdir with VC exact version as name - try: - vc_exact_ver = os.listdir(guess_vc)[-1] - return os.path.join(guess_vc, vc_exact_ver) - except (OSError, IOError, IndexError): - pass - - def _guess_vc_legacy(self): - """ - Locate Visual C for versions prior to 2017 - """ - default = r'Microsoft Visual Studio %0.1f\VC' % self.vc_ver - return os.path.join(self.ProgramFilesx86, default) - - @property - def WindowsSdkVersion(self): - """ - Microsoft Windows SDK versions for specified MSVC++ version. - """ - if self.vc_ver <= 9.0: - return ('7.0', '6.1', '6.0a') - elif self.vc_ver == 10.0: - return ('7.1', '7.0a') - elif self.vc_ver == 11.0: - return ('8.0', '8.0a') - elif self.vc_ver == 12.0: - return ('8.1', '8.1a') - elif self.vc_ver >= 14.0: - return ('10.0', '8.1') - - @property - def WindowsSdkLastVersion(self): - """ - Microsoft Windows SDK last version - """ - return self._use_last_dir_name(os.path.join( - self.WindowsSdkDir, 'lib')) - - @property - def WindowsSdkDir(self): - """ - Microsoft Windows SDK directory. - """ - sdkdir = '' - for ver in self.WindowsSdkVersion: - # Try to get it from registry - loc = os.path.join(self.ri.windows_sdk, 'v%s' % ver) - sdkdir = self.ri.lookup(loc, 'installationfolder') - if sdkdir: - break - if not sdkdir or not os.path.isdir(sdkdir): - # Try to get "VC++ for Python" version from registry - path = os.path.join(self.ri.vc_for_python, '%0.1f' % self.vc_ver) - install_base = self.ri.lookup(path, 'installdir') - if install_base: - sdkdir = os.path.join(install_base, 'WinSDK') - if not sdkdir or not os.path.isdir(sdkdir): - # If fail, use default new path - for ver in self.WindowsSdkVersion: - intver = ver[:ver.rfind('.')] - path = r'Microsoft SDKs\Windows Kits\%s' % (intver) - d = os.path.join(self.ProgramFiles, path) - if os.path.isdir(d): - sdkdir = d - if not sdkdir or not os.path.isdir(sdkdir): - # If fail, use default old path - for ver in self.WindowsSdkVersion: - path = r'Microsoft SDKs\Windows\v%s' % ver - d = os.path.join(self.ProgramFiles, path) - if os.path.isdir(d): - sdkdir = d - if not sdkdir: - # If fail, use Platform SDK - sdkdir = os.path.join(self.VCInstallDir, 'PlatformSDK') - return sdkdir - - @property - def WindowsSDKExecutablePath(self): - """ - Microsoft Windows SDK executable directory. - """ - # Find WinSDK NetFx Tools registry dir name - if self.vc_ver <= 11.0: - netfxver = 35 - arch = '' - else: - netfxver = 40 - hidex86 = True if self.vc_ver <= 12.0 else False - arch = self.pi.current_dir(x64=True, hidex86=hidex86) - fx = 'WinSDK-NetFx%dTools%s' % (netfxver, arch.replace('\\', '-')) - - # liste all possibles registry paths - regpaths = [] - if self.vc_ver >= 14.0: - for ver in self.NetFxSdkVersion: - regpaths += [os.path.join(self.ri.netfx_sdk, ver, fx)] - - for ver in self.WindowsSdkVersion: - regpaths += [os.path.join(self.ri.windows_sdk, 'v%sA' % ver, fx)] - - # Return installation folder from the more recent path - for path in regpaths: - execpath = self.ri.lookup(path, 'installationfolder') - if execpath: - break - return execpath - - @property - def FSharpInstallDir(self): - """ - Microsoft Visual F# directory. - """ - path = r'%0.1f\Setup\F#' % self.vc_ver - path = os.path.join(self.ri.visualstudio, path) - return self.ri.lookup(path, 'productdir') or '' - - @property - def UniversalCRTSdkDir(self): - """ - Microsoft Universal CRT SDK directory. - """ - # Set Kit Roots versions for specified MSVC++ version - if self.vc_ver >= 14.0: - vers = ('10', '81') - else: - vers = () - - # Find path of the more recent Kit - for ver in vers: - sdkdir = self.ri.lookup(self.ri.windows_kits_roots, - 'kitsroot%s' % ver) - if sdkdir: - break - return sdkdir or '' - - @property - def UniversalCRTSdkLastVersion(self): - """ - Microsoft Universal C Runtime SDK last version - """ - return self._use_last_dir_name(os.path.join( - self.UniversalCRTSdkDir, 'lib')) - - @property - def NetFxSdkVersion(self): - """ - Microsoft .NET Framework SDK versions. - """ - # Set FxSdk versions for specified MSVC++ version - if self.vc_ver >= 14.0: - return ('4.6.1', '4.6') - else: - return () - - @property - def NetFxSdkDir(self): - """ - Microsoft .NET Framework SDK directory. - """ - for ver in self.NetFxSdkVersion: - loc = os.path.join(self.ri.netfx_sdk, ver) - sdkdir = self.ri.lookup(loc, 'kitsinstallationfolder') - if sdkdir: - break - return sdkdir or '' - - @property - def FrameworkDir32(self): - """ - Microsoft .NET Framework 32bit directory. - """ - # Default path - guess_fw = os.path.join(self.WinDir, r'Microsoft.NET\Framework') - - # Try to get path from registry, if fail use default path - return self.ri.lookup(self.ri.vc, 'frameworkdir32') or guess_fw - - @property - def FrameworkDir64(self): - """ - Microsoft .NET Framework 64bit directory. - """ - # Default path - guess_fw = os.path.join(self.WinDir, r'Microsoft.NET\Framework64') - - # Try to get path from registry, if fail use default path - return self.ri.lookup(self.ri.vc, 'frameworkdir64') or guess_fw - - @property - def FrameworkVersion32(self): - """ - Microsoft .NET Framework 32bit versions. - """ - return self._find_dot_net_versions(32) - - @property - def FrameworkVersion64(self): - """ - Microsoft .NET Framework 64bit versions. - """ - return self._find_dot_net_versions(64) - - def _find_dot_net_versions(self, bits): - """ - Find Microsoft .NET Framework versions. - - Parameters - ---------- - bits: int - Platform number of bits: 32 or 64. - """ - # Find actual .NET version in registry - reg_ver = self.ri.lookup(self.ri.vc, 'frameworkver%d' % bits) - dot_net_dir = getattr(self, 'FrameworkDir%d' % bits) - ver = reg_ver or self._use_last_dir_name(dot_net_dir, 'v') or '' - - # Set .NET versions for specified MSVC++ version - if self.vc_ver >= 12.0: - frameworkver = (ver, 'v4.0') - elif self.vc_ver >= 10.0: - frameworkver = ('v4.0.30319' if ver.lower()[:2] != 'v4' else ver, - 'v3.5') - elif self.vc_ver == 9.0: - frameworkver = ('v3.5', 'v2.0.50727') - if self.vc_ver == 8.0: - frameworkver = ('v3.0', 'v2.0.50727') - return frameworkver - - def _use_last_dir_name(self, path, prefix=''): - """ - Return name of the last dir in path or '' if no dir found. - - Parameters - ---------- - path: str - Use dirs in this path - prefix: str - Use only dirs startings by this prefix - """ - matching_dirs = ( - dir_name - for dir_name in reversed(os.listdir(path)) - if os.path.isdir(os.path.join(path, dir_name)) and - dir_name.startswith(prefix) - ) - return next(matching_dirs, None) or '' - - -class EnvironmentInfo: - """ - Return environment variables for specified Microsoft Visual C++ version - and platform : Lib, Include, Path and libpath. - - This function is compatible with Microsoft Visual C++ 9.0 to 14.0. - - Script created by analysing Microsoft environment configuration files like - "vcvars[...].bat", "SetEnv.Cmd", "vcbuildtools.bat", ... - - Parameters - ---------- - arch: str - Target architecture. - vc_ver: float - Required Microsoft Visual C++ version. If not set, autodetect the last - version. - vc_min_ver: float - Minimum Microsoft Visual C++ version. - """ - - # Variables and properties in this class use originals CamelCase variables - # names from Microsoft source files for more easy comparaison. - - def __init__(self, arch, vc_ver=None, vc_min_ver=0): - self.pi = PlatformInfo(arch) - self.ri = RegistryInfo(self.pi) - self.si = SystemInfo(self.ri, vc_ver) - - if self.vc_ver < vc_min_ver: - err = 'No suitable Microsoft Visual C++ version found' - raise distutils.errors.DistutilsPlatformError(err) - - @property - def vc_ver(self): - """ - Microsoft Visual C++ version. - """ - return self.si.vc_ver - - @property - def VSTools(self): - """ - Microsoft Visual Studio Tools - """ - paths = [r'Common7\IDE', r'Common7\Tools'] - - if self.vc_ver >= 14.0: - arch_subdir = self.pi.current_dir(hidex86=True, x64=True) - paths += [r'Common7\IDE\CommonExtensions\Microsoft\TestWindow'] - paths += [r'Team Tools\Performance Tools'] - paths += [r'Team Tools\Performance Tools%s' % arch_subdir] - - return [os.path.join(self.si.VSInstallDir, path) for path in paths] - - @property - def VCIncludes(self): - """ - Microsoft Visual C++ & Microsoft Foundation Class Includes - """ - return [os.path.join(self.si.VCInstallDir, 'Include'), - os.path.join(self.si.VCInstallDir, r'ATLMFC\Include')] - - @property - def VCLibraries(self): - """ - Microsoft Visual C++ & Microsoft Foundation Class Libraries - """ - if self.vc_ver >= 15.0: - arch_subdir = self.pi.target_dir(x64=True) - else: - arch_subdir = self.pi.target_dir(hidex86=True) - paths = ['Lib%s' % arch_subdir, r'ATLMFC\Lib%s' % arch_subdir] - - if self.vc_ver >= 14.0: - paths += [r'Lib\store%s' % arch_subdir] - - return [os.path.join(self.si.VCInstallDir, path) for path in paths] - - @property - def VCStoreRefs(self): - """ - Microsoft Visual C++ store references Libraries - """ - if self.vc_ver < 14.0: - return [] - return [os.path.join(self.si.VCInstallDir, r'Lib\store\references')] - - @property - def VCTools(self): - """ - Microsoft Visual C++ Tools - """ - si = self.si - tools = [os.path.join(si.VCInstallDir, 'VCPackages')] - - forcex86 = True if self.vc_ver <= 10.0 else False - arch_subdir = self.pi.cross_dir(forcex86) - if arch_subdir: - tools += [os.path.join(si.VCInstallDir, 'Bin%s' % arch_subdir)] - - if self.vc_ver == 14.0: - path = 'Bin%s' % self.pi.current_dir(hidex86=True) - tools += [os.path.join(si.VCInstallDir, path)] - - elif self.vc_ver >= 15.0: - host_dir = (r'bin\HostX86%s' if self.pi.current_is_x86() else - r'bin\HostX64%s') - tools += [os.path.join( - si.VCInstallDir, host_dir % self.pi.target_dir(x64=True))] - - if self.pi.current_cpu != self.pi.target_cpu: - tools += [os.path.join( - si.VCInstallDir, host_dir % self.pi.current_dir(x64=True))] - - else: - tools += [os.path.join(si.VCInstallDir, 'Bin')] - - return tools - - @property - def OSLibraries(self): - """ - Microsoft Windows SDK Libraries - """ - if self.vc_ver <= 10.0: - arch_subdir = self.pi.target_dir(hidex86=True, x64=True) - return [os.path.join(self.si.WindowsSdkDir, 'Lib%s' % arch_subdir)] - - else: - arch_subdir = self.pi.target_dir(x64=True) - lib = os.path.join(self.si.WindowsSdkDir, 'lib') - libver = self._sdk_subdir - return [os.path.join(lib, '%sum%s' % (libver , arch_subdir))] - - @property - def OSIncludes(self): - """ - Microsoft Windows SDK Include - """ - include = os.path.join(self.si.WindowsSdkDir, 'include') - - if self.vc_ver <= 10.0: - return [include, os.path.join(include, 'gl')] - - else: - if self.vc_ver >= 14.0: - sdkver = self._sdk_subdir - else: - sdkver = '' - return [os.path.join(include, '%sshared' % sdkver), - os.path.join(include, '%sum' % sdkver), - os.path.join(include, '%swinrt' % sdkver)] - - @property - def OSLibpath(self): - """ - Microsoft Windows SDK Libraries Paths - """ - ref = os.path.join(self.si.WindowsSdkDir, 'References') - libpath = [] - - if self.vc_ver <= 9.0: - libpath += self.OSLibraries - - if self.vc_ver >= 11.0: - libpath += [os.path.join(ref, r'CommonConfiguration\Neutral')] - - if self.vc_ver >= 14.0: - libpath += [ - ref, - os.path.join(self.si.WindowsSdkDir, 'UnionMetadata'), - os.path.join( - ref, - 'Windows.Foundation.UniversalApiContract', - '1.0.0.0', - ), - os.path.join( - ref, - 'Windows.Foundation.FoundationContract', - '1.0.0.0', - ), - os.path.join( - ref, - 'Windows.Networking.Connectivity.WwanContract', - '1.0.0.0', - ), - os.path.join( - self.si.WindowsSdkDir, - 'ExtensionSDKs', - 'Microsoft.VCLibs', - '%0.1f' % self.vc_ver, - 'References', - 'CommonConfiguration', - 'neutral', - ), - ] - return libpath - - @property - def SdkTools(self): - """ - Microsoft Windows SDK Tools - """ - return list(self._sdk_tools()) - - def _sdk_tools(self): - """ - Microsoft Windows SDK Tools paths generator - """ - if self.vc_ver < 15.0: - bin_dir = 'Bin' if self.vc_ver <= 11.0 else r'Bin\x86' - yield os.path.join(self.si.WindowsSdkDir, bin_dir) - - if not self.pi.current_is_x86(): - arch_subdir = self.pi.current_dir(x64=True) - path = 'Bin%s' % arch_subdir - yield os.path.join(self.si.WindowsSdkDir, path) - - if self.vc_ver == 10.0 or self.vc_ver == 11.0: - if self.pi.target_is_x86(): - arch_subdir = '' - else: - arch_subdir = self.pi.current_dir(hidex86=True, x64=True) - path = r'Bin\NETFX 4.0 Tools%s' % arch_subdir - yield os.path.join(self.si.WindowsSdkDir, path) - - elif self.vc_ver >= 15.0: - path = os.path.join(self.si.WindowsSdkDir, 'Bin') - arch_subdir = self.pi.current_dir(x64=True) - sdkver = self.si.WindowsSdkLastVersion - yield os.path.join(path, '%s%s' % (sdkver, arch_subdir)) - - if self.si.WindowsSDKExecutablePath: - yield self.si.WindowsSDKExecutablePath - - @property - def _sdk_subdir(self): - """ - Microsoft Windows SDK version subdir - """ - ucrtver = self.si.WindowsSdkLastVersion - return ('%s\\' % ucrtver) if ucrtver else '' - - @property - def SdkSetup(self): - """ - Microsoft Windows SDK Setup - """ - if self.vc_ver > 9.0: - return [] - - return [os.path.join(self.si.WindowsSdkDir, 'Setup')] - - @property - def FxTools(self): - """ - Microsoft .NET Framework Tools - """ - pi = self.pi - si = self.si - - if self.vc_ver <= 10.0: - include32 = True - include64 = not pi.target_is_x86() and not pi.current_is_x86() - else: - include32 = pi.target_is_x86() or pi.current_is_x86() - include64 = pi.current_cpu == 'amd64' or pi.target_cpu == 'amd64' - - tools = [] - if include32: - tools += [os.path.join(si.FrameworkDir32, ver) - for ver in si.FrameworkVersion32] - if include64: - tools += [os.path.join(si.FrameworkDir64, ver) - for ver in si.FrameworkVersion64] - return tools - - @property - def NetFxSDKLibraries(self): - """ - Microsoft .Net Framework SDK Libraries - """ - if self.vc_ver < 14.0 or not self.si.NetFxSdkDir: - return [] - - arch_subdir = self.pi.target_dir(x64=True) - return [os.path.join(self.si.NetFxSdkDir, r'lib\um%s' % arch_subdir)] - - @property - def NetFxSDKIncludes(self): - """ - Microsoft .Net Framework SDK Includes - """ - if self.vc_ver < 14.0 or not self.si.NetFxSdkDir: - return [] - - return [os.path.join(self.si.NetFxSdkDir, r'include\um')] - - @property - def VsTDb(self): - """ - Microsoft Visual Studio Team System Database - """ - return [os.path.join(self.si.VSInstallDir, r'VSTSDB\Deploy')] - - @property - def MSBuild(self): - """ - Microsoft Build Engine - """ - if self.vc_ver < 12.0: - return [] - elif self.vc_ver < 15.0: - base_path = self.si.ProgramFilesx86 - arch_subdir = self.pi.current_dir(hidex86=True) - else: - base_path = self.si.VSInstallDir - arch_subdir = '' - - path = r'MSBuild\%0.1f\bin%s' % (self.vc_ver, arch_subdir) - build = [os.path.join(base_path, path)] - - if self.vc_ver >= 15.0: - # Add Roslyn C# & Visual Basic Compiler - build += [os.path.join(base_path, path, 'Roslyn')] - - return build - - @property - def HTMLHelpWorkshop(self): - """ - Microsoft HTML Help Workshop - """ - if self.vc_ver < 11.0: - return [] - - return [os.path.join(self.si.ProgramFilesx86, 'HTML Help Workshop')] - - @property - def UCRTLibraries(self): - """ - Microsoft Universal C Runtime SDK Libraries - """ - if self.vc_ver < 14.0: - return [] - - arch_subdir = self.pi.target_dir(x64=True) - lib = os.path.join(self.si.UniversalCRTSdkDir, 'lib') - ucrtver = self._ucrt_subdir - return [os.path.join(lib, '%sucrt%s' % (ucrtver, arch_subdir))] - - @property - def UCRTIncludes(self): - """ - Microsoft Universal C Runtime SDK Include - """ - if self.vc_ver < 14.0: - return [] - - include = os.path.join(self.si.UniversalCRTSdkDir, 'include') - return [os.path.join(include, '%sucrt' % self._ucrt_subdir)] - - @property - def _ucrt_subdir(self): - """ - Microsoft Universal C Runtime SDK version subdir - """ - ucrtver = self.si.UniversalCRTSdkLastVersion - return ('%s\\' % ucrtver) if ucrtver else '' - - @property - def FSharp(self): - """ - Microsoft Visual F# - """ - if self.vc_ver < 11.0 and self.vc_ver > 12.0: - return [] - - return self.si.FSharpInstallDir - - @property - def VCRuntimeRedist(self): - """ - Microsoft Visual C++ runtime redistribuable dll - """ - arch_subdir = self.pi.target_dir(x64=True) - if self.vc_ver < 15: - redist_path = self.si.VCInstallDir - vcruntime = 'redist%s\\Microsoft.VC%d0.CRT\\vcruntime%d0.dll' - else: - redist_path = self.si.VCInstallDir.replace('\\Tools', '\\Redist') - vcruntime = 'onecore%s\\Microsoft.VC%d0.CRT\\vcruntime%d0.dll' - - # Visual Studio 2017 is still Visual C++ 14.0 - dll_ver = 14.0 if self.vc_ver == 15 else self.vc_ver - - vcruntime = vcruntime % (arch_subdir, self.vc_ver, dll_ver) - return os.path.join(redist_path, vcruntime) - - def return_env(self, exists=True): - """ - Return environment dict. - - Parameters - ---------- - exists: bool - It True, only return existing paths. - """ - env = dict( - include=self._build_paths('include', - [self.VCIncludes, - self.OSIncludes, - self.UCRTIncludes, - self.NetFxSDKIncludes], - exists), - lib=self._build_paths('lib', - [self.VCLibraries, - self.OSLibraries, - self.FxTools, - self.UCRTLibraries, - self.NetFxSDKLibraries], - exists), - libpath=self._build_paths('libpath', - [self.VCLibraries, - self.FxTools, - self.VCStoreRefs, - self.OSLibpath], - exists), - path=self._build_paths('path', - [self.VCTools, - self.VSTools, - self.VsTDb, - self.SdkTools, - self.SdkSetup, - self.FxTools, - self.MSBuild, - self.HTMLHelpWorkshop, - self.FSharp], - exists), - ) - if self.vc_ver >= 14 and os.path.isfile(self.VCRuntimeRedist): - env['py_vcruntime_redist'] = self.VCRuntimeRedist - return env - - def _build_paths(self, name, spec_path_lists, exists): - """ - Given an environment variable name and specified paths, - return a pathsep-separated string of paths containing - unique, extant, directories from those paths and from - the environment variable. Raise an error if no paths - are resolved. - """ - # flatten spec_path_lists - spec_paths = itertools.chain.from_iterable(spec_path_lists) - env_paths = safe_env.get(name, '').split(os.pathsep) - paths = itertools.chain(spec_paths, env_paths) - extant_paths = list(filter(os.path.isdir, paths)) if exists else paths - if not extant_paths: - msg = "%s environment variable is empty" % name.upper() - raise distutils.errors.DistutilsPlatformError(msg) - unique_paths = self._unique_everseen(extant_paths) - return os.pathsep.join(unique_paths) - - # from Python docs - def _unique_everseen(self, iterable, key=None): - """ - List unique elements, preserving order. - Remember all elements ever seen. - - _unique_everseen('AAAABBBCCDAABBB') --> A B C D - - _unique_everseen('ABBCcAD', str.lower) --> A B C D - """ - seen = set() - seen_add = seen.add - if key is None: - for element in filterfalse(seen.__contains__, iterable): - seen_add(element) - yield element - else: - for element in iterable: - k = key(element) - if k not in seen: - seen_add(k) - yield element diff --git a/env/lib/python3.7/site-packages/setuptools/namespaces.py b/env/lib/python3.7/site-packages/setuptools/namespaces.py deleted file mode 100644 index dc16106..0000000 --- a/env/lib/python3.7/site-packages/setuptools/namespaces.py +++ /dev/null @@ -1,107 +0,0 @@ -import os -from distutils import log -import itertools - -from setuptools.extern.six.moves import map - - -flatten = itertools.chain.from_iterable - - -class Installer: - - nspkg_ext = '-nspkg.pth' - - def install_namespaces(self): - nsp = self._get_all_ns_packages() - if not nsp: - return - filename, ext = os.path.splitext(self._get_target()) - filename += self.nspkg_ext - self.outputs.append(filename) - log.info("Installing %s", filename) - lines = map(self._gen_nspkg_line, nsp) - - if self.dry_run: - # always generate the lines, even in dry run - list(lines) - return - - with open(filename, 'wt') as f: - f.writelines(lines) - - def uninstall_namespaces(self): - filename, ext = os.path.splitext(self._get_target()) - filename += self.nspkg_ext - if not os.path.exists(filename): - return - log.info("Removing %s", filename) - os.remove(filename) - - def _get_target(self): - return self.target - - _nspkg_tmpl = ( - "import sys, types, os", - "has_mfs = sys.version_info > (3, 5)", - "p = os.path.join(%(root)s, *%(pth)r)", - "importlib = has_mfs and __import__('importlib.util')", - "has_mfs and __import__('importlib.machinery')", - "m = has_mfs and " - "sys.modules.setdefault(%(pkg)r, " - "importlib.util.module_from_spec(" - "importlib.machinery.PathFinder.find_spec(%(pkg)r, " - "[os.path.dirname(p)])))", - "m = m or " - "sys.modules.setdefault(%(pkg)r, types.ModuleType(%(pkg)r))", - "mp = (m or []) and m.__dict__.setdefault('__path__',[])", - "(p not in mp) and mp.append(p)", - ) - "lines for the namespace installer" - - _nspkg_tmpl_multi = ( - 'm and setattr(sys.modules[%(parent)r], %(child)r, m)', - ) - "additional line(s) when a parent package is indicated" - - def _get_root(self): - return "sys._getframe(1).f_locals['sitedir']" - - def _gen_nspkg_line(self, pkg): - # ensure pkg is not a unicode string under Python 2.7 - pkg = str(pkg) - pth = tuple(pkg.split('.')) - root = self._get_root() - tmpl_lines = self._nspkg_tmpl - parent, sep, child = pkg.rpartition('.') - if parent: - tmpl_lines += self._nspkg_tmpl_multi - return ';'.join(tmpl_lines) % locals() + '\n' - - def _get_all_ns_packages(self): - """Return sorted list of all package namespaces""" - pkgs = self.distribution.namespace_packages or [] - return sorted(flatten(map(self._pkg_names, pkgs))) - - @staticmethod - def _pkg_names(pkg): - """ - Given a namespace package, yield the components of that - package. - - >>> names = Installer._pkg_names('a.b.c') - >>> set(names) == set(['a', 'a.b', 'a.b.c']) - True - """ - parts = pkg.split('.') - while parts: - yield '.'.join(parts) - parts.pop() - - -class DevelopInstaller(Installer): - def _get_root(self): - return repr(str(self.egg_path)) - - def _get_target(self): - return self.egg_link diff --git a/env/lib/python3.7/site-packages/setuptools/package_index.py b/env/lib/python3.7/site-packages/setuptools/package_index.py deleted file mode 100644 index 6b06f2c..0000000 --- a/env/lib/python3.7/site-packages/setuptools/package_index.py +++ /dev/null @@ -1,1136 +0,0 @@ -"""PyPI and direct package downloading""" -import sys -import os -import re -import shutil -import socket -import base64 -import hashlib -import itertools -import warnings -from functools import wraps - -from setuptools.extern import six -from setuptools.extern.six.moves import urllib, http_client, configparser, map - -import setuptools -from pkg_resources import ( - CHECKOUT_DIST, Distribution, BINARY_DIST, normalize_path, SOURCE_DIST, - Environment, find_distributions, safe_name, safe_version, - to_filename, Requirement, DEVELOP_DIST, EGG_DIST, -) -from setuptools import ssl_support -from distutils import log -from distutils.errors import DistutilsError -from fnmatch import translate -from setuptools.py27compat import get_all_headers -from setuptools.py33compat import unescape -from setuptools.wheel import Wheel - -__metaclass__ = type - -EGG_FRAGMENT = re.compile(r'^egg=([-A-Za-z0-9_.+!]+)$') -HREF = re.compile(r"""href\s*=\s*['"]?([^'"> ]+)""", re.I) -PYPI_MD5 = re.compile( - r'<a href="([^"#]+)">([^<]+)</a>\n\s+\(<a (?:title="MD5 hash"\n\s+)' - r'href="[^?]+\?:action=show_md5&digest=([0-9a-f]{32})">md5</a>\)' -) -URL_SCHEME = re.compile('([-+.a-z0-9]{2,}):', re.I).match -EXTENSIONS = ".tar.gz .tar.bz2 .tar .zip .tgz".split() - -__all__ = [ - 'PackageIndex', 'distros_for_url', 'parse_bdist_wininst', - 'interpret_distro_name', -] - -_SOCKET_TIMEOUT = 15 - -_tmpl = "setuptools/{setuptools.__version__} Python-urllib/{py_major}" -user_agent = _tmpl.format(py_major=sys.version[:3], setuptools=setuptools) - - -def parse_requirement_arg(spec): - try: - return Requirement.parse(spec) - except ValueError: - raise DistutilsError( - "Not a URL, existing file, or requirement spec: %r" % (spec,) - ) - - -def parse_bdist_wininst(name): - """Return (base,pyversion) or (None,None) for possible .exe name""" - - lower = name.lower() - base, py_ver, plat = None, None, None - - if lower.endswith('.exe'): - if lower.endswith('.win32.exe'): - base = name[:-10] - plat = 'win32' - elif lower.startswith('.win32-py', -16): - py_ver = name[-7:-4] - base = name[:-16] - plat = 'win32' - elif lower.endswith('.win-amd64.exe'): - base = name[:-14] - plat = 'win-amd64' - elif lower.startswith('.win-amd64-py', -20): - py_ver = name[-7:-4] - base = name[:-20] - plat = 'win-amd64' - return base, py_ver, plat - - -def egg_info_for_url(url): - parts = urllib.parse.urlparse(url) - scheme, server, path, parameters, query, fragment = parts - base = urllib.parse.unquote(path.split('/')[-1]) - if server == 'sourceforge.net' and base == 'download': # XXX Yuck - base = urllib.parse.unquote(path.split('/')[-2]) - if '#' in base: - base, fragment = base.split('#', 1) - return base, fragment - - -def distros_for_url(url, metadata=None): - """Yield egg or source distribution objects that might be found at a URL""" - base, fragment = egg_info_for_url(url) - for dist in distros_for_location(url, base, metadata): - yield dist - if fragment: - match = EGG_FRAGMENT.match(fragment) - if match: - for dist in interpret_distro_name( - url, match.group(1), metadata, precedence=CHECKOUT_DIST - ): - yield dist - - -def distros_for_location(location, basename, metadata=None): - """Yield egg or source distribution objects based on basename""" - if basename.endswith('.egg.zip'): - basename = basename[:-4] # strip the .zip - if basename.endswith('.egg') and '-' in basename: - # only one, unambiguous interpretation - return [Distribution.from_location(location, basename, metadata)] - if basename.endswith('.whl') and '-' in basename: - wheel = Wheel(basename) - if not wheel.is_compatible(): - return [] - return [Distribution( - location=location, - project_name=wheel.project_name, - version=wheel.version, - # Increase priority over eggs. - precedence=EGG_DIST + 1, - )] - if basename.endswith('.exe'): - win_base, py_ver, platform = parse_bdist_wininst(basename) - if win_base is not None: - return interpret_distro_name( - location, win_base, metadata, py_ver, BINARY_DIST, platform - ) - # Try source distro extensions (.zip, .tgz, etc.) - # - for ext in EXTENSIONS: - if basename.endswith(ext): - basename = basename[:-len(ext)] - return interpret_distro_name(location, basename, metadata) - return [] # no extension matched - - -def distros_for_filename(filename, metadata=None): - """Yield possible egg or source distribution objects based on a filename""" - return distros_for_location( - normalize_path(filename), os.path.basename(filename), metadata - ) - - -def interpret_distro_name( - location, basename, metadata, py_version=None, precedence=SOURCE_DIST, - platform=None -): - """Generate alternative interpretations of a source distro name - - Note: if `location` is a filesystem filename, you should call - ``pkg_resources.normalize_path()`` on it before passing it to this - routine! - """ - # Generate alternative interpretations of a source distro name - # Because some packages are ambiguous as to name/versions split - # e.g. "adns-python-1.1.0", "egenix-mx-commercial", etc. - # So, we generate each possible interepretation (e.g. "adns, python-1.1.0" - # "adns-python, 1.1.0", and "adns-python-1.1.0, no version"). In practice, - # the spurious interpretations should be ignored, because in the event - # there's also an "adns" package, the spurious "python-1.1.0" version will - # compare lower than any numeric version number, and is therefore unlikely - # to match a request for it. It's still a potential problem, though, and - # in the long run PyPI and the distutils should go for "safe" names and - # versions in distribution archive names (sdist and bdist). - - parts = basename.split('-') - if not py_version and any(re.match(r'py\d\.\d$', p) for p in parts[2:]): - # it is a bdist_dumb, not an sdist -- bail out - return - - for p in range(1, len(parts) + 1): - yield Distribution( - location, metadata, '-'.join(parts[:p]), '-'.join(parts[p:]), - py_version=py_version, precedence=precedence, - platform=platform - ) - - -# From Python 2.7 docs -def unique_everseen(iterable, key=None): - "List unique elements, preserving order. Remember all elements ever seen." - # unique_everseen('AAAABBBCCDAABBB') --> A B C D - # unique_everseen('ABBCcAD', str.lower) --> A B C D - seen = set() - seen_add = seen.add - if key is None: - for element in six.moves.filterfalse(seen.__contains__, iterable): - seen_add(element) - yield element - else: - for element in iterable: - k = key(element) - if k not in seen: - seen_add(k) - yield element - - -def unique_values(func): - """ - Wrap a function returning an iterable such that the resulting iterable - only ever yields unique items. - """ - - @wraps(func) - def wrapper(*args, **kwargs): - return unique_everseen(func(*args, **kwargs)) - - return wrapper - - -REL = re.compile(r"""<([^>]*\srel\s*=\s*['"]?([^'">]+)[^>]*)>""", re.I) -# this line is here to fix emacs' cruddy broken syntax highlighting - - -@unique_values -def find_external_links(url, page): - """Find rel="homepage" and rel="download" links in `page`, yielding URLs""" - - for match in REL.finditer(page): - tag, rel = match.groups() - rels = set(map(str.strip, rel.lower().split(','))) - if 'homepage' in rels or 'download' in rels: - for match in HREF.finditer(tag): - yield urllib.parse.urljoin(url, htmldecode(match.group(1))) - - for tag in ("<th>Home Page", "<th>Download URL"): - pos = page.find(tag) - if pos != -1: - match = HREF.search(page, pos) - if match: - yield urllib.parse.urljoin(url, htmldecode(match.group(1))) - - -class ContentChecker: - """ - A null content checker that defines the interface for checking content - """ - - def feed(self, block): - """ - Feed a block of data to the hash. - """ - return - - def is_valid(self): - """ - Check the hash. Return False if validation fails. - """ - return True - - def report(self, reporter, template): - """ - Call reporter with information about the checker (hash name) - substituted into the template. - """ - return - - -class HashChecker(ContentChecker): - pattern = re.compile( - r'(?P<hash_name>sha1|sha224|sha384|sha256|sha512|md5)=' - r'(?P<expected>[a-f0-9]+)' - ) - - def __init__(self, hash_name, expected): - self.hash_name = hash_name - self.hash = hashlib.new(hash_name) - self.expected = expected - - @classmethod - def from_url(cls, url): - "Construct a (possibly null) ContentChecker from a URL" - fragment = urllib.parse.urlparse(url)[-1] - if not fragment: - return ContentChecker() - match = cls.pattern.search(fragment) - if not match: - return ContentChecker() - return cls(**match.groupdict()) - - def feed(self, block): - self.hash.update(block) - - def is_valid(self): - return self.hash.hexdigest() == self.expected - - def report(self, reporter, template): - msg = template % self.hash_name - return reporter(msg) - - -class PackageIndex(Environment): - """A distribution index that scans web pages for download URLs""" - - def __init__( - self, index_url="https://pypi.org/simple/", hosts=('*',), - ca_bundle=None, verify_ssl=True, *args, **kw - ): - Environment.__init__(self, *args, **kw) - self.index_url = index_url + "/" [:not index_url.endswith('/')] - self.scanned_urls = {} - self.fetched_urls = {} - self.package_pages = {} - self.allows = re.compile('|'.join(map(translate, hosts))).match - self.to_scan = [] - use_ssl = ( - verify_ssl - and ssl_support.is_available - and (ca_bundle or ssl_support.find_ca_bundle()) - ) - if use_ssl: - self.opener = ssl_support.opener_for(ca_bundle) - else: - self.opener = urllib.request.urlopen - - def process_url(self, url, retrieve=False): - """Evaluate a URL as a possible download, and maybe retrieve it""" - if url in self.scanned_urls and not retrieve: - return - self.scanned_urls[url] = True - if not URL_SCHEME(url): - self.process_filename(url) - return - else: - dists = list(distros_for_url(url)) - if dists: - if not self.url_ok(url): - return - self.debug("Found link: %s", url) - - if dists or not retrieve or url in self.fetched_urls: - list(map(self.add, dists)) - return # don't need the actual page - - if not self.url_ok(url): - self.fetched_urls[url] = True - return - - self.info("Reading %s", url) - self.fetched_urls[url] = True # prevent multiple fetch attempts - tmpl = "Download error on %s: %%s -- Some packages may not be found!" - f = self.open_url(url, tmpl % url) - if f is None: - return - self.fetched_urls[f.url] = True - if 'html' not in f.headers.get('content-type', '').lower(): - f.close() # not html, we can't process it - return - - base = f.url # handle redirects - page = f.read() - if not isinstance(page, str): - # In Python 3 and got bytes but want str. - if isinstance(f, urllib.error.HTTPError): - # Errors have no charset, assume latin1: - charset = 'latin-1' - else: - charset = f.headers.get_param('charset') or 'latin-1' - page = page.decode(charset, "ignore") - f.close() - for match in HREF.finditer(page): - link = urllib.parse.urljoin(base, htmldecode(match.group(1))) - self.process_url(link) - if url.startswith(self.index_url) and getattr(f, 'code', None) != 404: - page = self.process_index(url, page) - - def process_filename(self, fn, nested=False): - # process filenames or directories - if not os.path.exists(fn): - self.warn("Not found: %s", fn) - return - - if os.path.isdir(fn) and not nested: - path = os.path.realpath(fn) - for item in os.listdir(path): - self.process_filename(os.path.join(path, item), True) - - dists = distros_for_filename(fn) - if dists: - self.debug("Found: %s", fn) - list(map(self.add, dists)) - - def url_ok(self, url, fatal=False): - s = URL_SCHEME(url) - is_file = s and s.group(1).lower() == 'file' - if is_file or self.allows(urllib.parse.urlparse(url)[1]): - return True - msg = ( - "\nNote: Bypassing %s (disallowed host; see " - "http://bit.ly/2hrImnY for details).\n") - if fatal: - raise DistutilsError(msg % url) - else: - self.warn(msg, url) - - def scan_egg_links(self, search_path): - dirs = filter(os.path.isdir, search_path) - egg_links = ( - (path, entry) - for path in dirs - for entry in os.listdir(path) - if entry.endswith('.egg-link') - ) - list(itertools.starmap(self.scan_egg_link, egg_links)) - - def scan_egg_link(self, path, entry): - with open(os.path.join(path, entry)) as raw_lines: - # filter non-empty lines - lines = list(filter(None, map(str.strip, raw_lines))) - - if len(lines) != 2: - # format is not recognized; punt - return - - egg_path, setup_path = lines - - for dist in find_distributions(os.path.join(path, egg_path)): - dist.location = os.path.join(path, *lines) - dist.precedence = SOURCE_DIST - self.add(dist) - - def process_index(self, url, page): - """Process the contents of a PyPI page""" - - def scan(link): - # Process a URL to see if it's for a package page - if link.startswith(self.index_url): - parts = list(map( - urllib.parse.unquote, link[len(self.index_url):].split('/') - )) - if len(parts) == 2 and '#' not in parts[1]: - # it's a package page, sanitize and index it - pkg = safe_name(parts[0]) - ver = safe_version(parts[1]) - self.package_pages.setdefault(pkg.lower(), {})[link] = True - return to_filename(pkg), to_filename(ver) - return None, None - - # process an index page into the package-page index - for match in HREF.finditer(page): - try: - scan(urllib.parse.urljoin(url, htmldecode(match.group(1)))) - except ValueError: - pass - - pkg, ver = scan(url) # ensure this page is in the page index - if pkg: - # process individual package page - for new_url in find_external_links(url, page): - # Process the found URL - base, frag = egg_info_for_url(new_url) - if base.endswith('.py') and not frag: - if ver: - new_url += '#egg=%s-%s' % (pkg, ver) - else: - self.need_version_info(url) - self.scan_url(new_url) - - return PYPI_MD5.sub( - lambda m: '<a href="%s#md5=%s">%s</a>' % m.group(1, 3, 2), page - ) - else: - return "" # no sense double-scanning non-package pages - - def need_version_info(self, url): - self.scan_all( - "Page at %s links to .py file(s) without version info; an index " - "scan is required.", url - ) - - def scan_all(self, msg=None, *args): - if self.index_url not in self.fetched_urls: - if msg: - self.warn(msg, *args) - self.info( - "Scanning index of all packages (this may take a while)" - ) - self.scan_url(self.index_url) - - def find_packages(self, requirement): - self.scan_url(self.index_url + requirement.unsafe_name + '/') - - if not self.package_pages.get(requirement.key): - # Fall back to safe version of the name - self.scan_url(self.index_url + requirement.project_name + '/') - - if not self.package_pages.get(requirement.key): - # We couldn't find the target package, so search the index page too - self.not_found_in_index(requirement) - - for url in list(self.package_pages.get(requirement.key, ())): - # scan each page that might be related to the desired package - self.scan_url(url) - - def obtain(self, requirement, installer=None): - self.prescan() - self.find_packages(requirement) - for dist in self[requirement.key]: - if dist in requirement: - return dist - self.debug("%s does not match %s", requirement, dist) - return super(PackageIndex, self).obtain(requirement, installer) - - def check_hash(self, checker, filename, tfp): - """ - checker is a ContentChecker - """ - checker.report( - self.debug, - "Validating %%s checksum for %s" % filename) - if not checker.is_valid(): - tfp.close() - os.unlink(filename) - raise DistutilsError( - "%s validation failed for %s; " - "possible download problem?" - % (checker.hash.name, os.path.basename(filename)) - ) - - def add_find_links(self, urls): - """Add `urls` to the list that will be prescanned for searches""" - for url in urls: - if ( - self.to_scan is None # if we have already "gone online" - or not URL_SCHEME(url) # or it's a local file/directory - or url.startswith('file:') - or list(distros_for_url(url)) # or a direct package link - ): - # then go ahead and process it now - self.scan_url(url) - else: - # otherwise, defer retrieval till later - self.to_scan.append(url) - - def prescan(self): - """Scan urls scheduled for prescanning (e.g. --find-links)""" - if self.to_scan: - list(map(self.scan_url, self.to_scan)) - self.to_scan = None # from now on, go ahead and process immediately - - def not_found_in_index(self, requirement): - if self[requirement.key]: # we've seen at least one distro - meth, msg = self.info, "Couldn't retrieve index page for %r" - else: # no distros seen for this name, might be misspelled - meth, msg = ( - self.warn, - "Couldn't find index page for %r (maybe misspelled?)") - meth(msg, requirement.unsafe_name) - self.scan_all() - - def download(self, spec, tmpdir): - """Locate and/or download `spec` to `tmpdir`, returning a local path - - `spec` may be a ``Requirement`` object, or a string containing a URL, - an existing local filename, or a project/version requirement spec - (i.e. the string form of a ``Requirement`` object). If it is the URL - of a .py file with an unambiguous ``#egg=name-version`` tag (i.e., one - that escapes ``-`` as ``_`` throughout), a trivial ``setup.py`` is - automatically created alongside the downloaded file. - - If `spec` is a ``Requirement`` object or a string containing a - project/version requirement spec, this method returns the location of - a matching distribution (possibly after downloading it to `tmpdir`). - If `spec` is a locally existing file or directory name, it is simply - returned unchanged. If `spec` is a URL, it is downloaded to a subpath - of `tmpdir`, and the local filename is returned. Various errors may be - raised if a problem occurs during downloading. - """ - if not isinstance(spec, Requirement): - scheme = URL_SCHEME(spec) - if scheme: - # It's a url, download it to tmpdir - found = self._download_url(scheme.group(1), spec, tmpdir) - base, fragment = egg_info_for_url(spec) - if base.endswith('.py'): - found = self.gen_setup(found, fragment, tmpdir) - return found - elif os.path.exists(spec): - # Existing file or directory, just return it - return spec - else: - spec = parse_requirement_arg(spec) - return getattr(self.fetch_distribution(spec, tmpdir), 'location', None) - - def fetch_distribution( - self, requirement, tmpdir, force_scan=False, source=False, - develop_ok=False, local_index=None): - """Obtain a distribution suitable for fulfilling `requirement` - - `requirement` must be a ``pkg_resources.Requirement`` instance. - If necessary, or if the `force_scan` flag is set, the requirement is - searched for in the (online) package index as well as the locally - installed packages. If a distribution matching `requirement` is found, - the returned distribution's ``location`` is the value you would have - gotten from calling the ``download()`` method with the matching - distribution's URL or filename. If no matching distribution is found, - ``None`` is returned. - - If the `source` flag is set, only source distributions and source - checkout links will be considered. Unless the `develop_ok` flag is - set, development and system eggs (i.e., those using the ``.egg-info`` - format) will be ignored. - """ - # process a Requirement - self.info("Searching for %s", requirement) - skipped = {} - dist = None - - def find(req, env=None): - if env is None: - env = self - # Find a matching distribution; may be called more than once - - for dist in env[req.key]: - - if dist.precedence == DEVELOP_DIST and not develop_ok: - if dist not in skipped: - self.warn( - "Skipping development or system egg: %s", dist, - ) - skipped[dist] = 1 - continue - - test = ( - dist in req - and (dist.precedence <= SOURCE_DIST or not source) - ) - if test: - loc = self.download(dist.location, tmpdir) - dist.download_location = loc - if os.path.exists(dist.download_location): - return dist - - if force_scan: - self.prescan() - self.find_packages(requirement) - dist = find(requirement) - - if not dist and local_index is not None: - dist = find(requirement, local_index) - - if dist is None: - if self.to_scan is not None: - self.prescan() - dist = find(requirement) - - if dist is None and not force_scan: - self.find_packages(requirement) - dist = find(requirement) - - if dist is None: - self.warn( - "No local packages or working download links found for %s%s", - (source and "a source distribution of " or ""), - requirement, - ) - else: - self.info("Best match: %s", dist) - return dist.clone(location=dist.download_location) - - def fetch(self, requirement, tmpdir, force_scan=False, source=False): - """Obtain a file suitable for fulfilling `requirement` - - DEPRECATED; use the ``fetch_distribution()`` method now instead. For - backward compatibility, this routine is identical but returns the - ``location`` of the downloaded distribution instead of a distribution - object. - """ - dist = self.fetch_distribution(requirement, tmpdir, force_scan, source) - if dist is not None: - return dist.location - return None - - def gen_setup(self, filename, fragment, tmpdir): - match = EGG_FRAGMENT.match(fragment) - dists = match and [ - d for d in - interpret_distro_name(filename, match.group(1), None) if d.version - ] or [] - - if len(dists) == 1: # unambiguous ``#egg`` fragment - basename = os.path.basename(filename) - - # Make sure the file has been downloaded to the temp dir. - if os.path.dirname(filename) != tmpdir: - dst = os.path.join(tmpdir, basename) - from setuptools.command.easy_install import samefile - if not samefile(filename, dst): - shutil.copy2(filename, dst) - filename = dst - - with open(os.path.join(tmpdir, 'setup.py'), 'w') as file: - file.write( - "from setuptools import setup\n" - "setup(name=%r, version=%r, py_modules=[%r])\n" - % ( - dists[0].project_name, dists[0].version, - os.path.splitext(basename)[0] - ) - ) - return filename - - elif match: - raise DistutilsError( - "Can't unambiguously interpret project/version identifier %r; " - "any dashes in the name or version should be escaped using " - "underscores. %r" % (fragment, dists) - ) - else: - raise DistutilsError( - "Can't process plain .py files without an '#egg=name-version'" - " suffix to enable automatic setup script generation." - ) - - dl_blocksize = 8192 - - def _download_to(self, url, filename): - self.info("Downloading %s", url) - # Download the file - fp = None - try: - checker = HashChecker.from_url(url) - fp = self.open_url(url) - if isinstance(fp, urllib.error.HTTPError): - raise DistutilsError( - "Can't download %s: %s %s" % (url, fp.code, fp.msg) - ) - headers = fp.info() - blocknum = 0 - bs = self.dl_blocksize - size = -1 - if "content-length" in headers: - # Some servers return multiple Content-Length headers :( - sizes = get_all_headers(headers, 'Content-Length') - size = max(map(int, sizes)) - self.reporthook(url, filename, blocknum, bs, size) - with open(filename, 'wb') as tfp: - while True: - block = fp.read(bs) - if block: - checker.feed(block) - tfp.write(block) - blocknum += 1 - self.reporthook(url, filename, blocknum, bs, size) - else: - break - self.check_hash(checker, filename, tfp) - return headers - finally: - if fp: - fp.close() - - def reporthook(self, url, filename, blocknum, blksize, size): - pass # no-op - - def open_url(self, url, warning=None): - if url.startswith('file:'): - return local_open(url) - try: - return open_with_auth(url, self.opener) - except (ValueError, http_client.InvalidURL) as v: - msg = ' '.join([str(arg) for arg in v.args]) - if warning: - self.warn(warning, msg) - else: - raise DistutilsError('%s %s' % (url, msg)) - except urllib.error.HTTPError as v: - return v - except urllib.error.URLError as v: - if warning: - self.warn(warning, v.reason) - else: - raise DistutilsError("Download error for %s: %s" - % (url, v.reason)) - except http_client.BadStatusLine as v: - if warning: - self.warn(warning, v.line) - else: - raise DistutilsError( - '%s returned a bad status line. The server might be ' - 'down, %s' % - (url, v.line) - ) - except (http_client.HTTPException, socket.error) as v: - if warning: - self.warn(warning, v) - else: - raise DistutilsError("Download error for %s: %s" - % (url, v)) - - def _download_url(self, scheme, url, tmpdir): - # Determine download filename - # - name, fragment = egg_info_for_url(url) - if name: - while '..' in name: - name = name.replace('..', '.').replace('\\', '_') - else: - name = "__downloaded__" # default if URL has no path contents - - if name.endswith('.egg.zip'): - name = name[:-4] # strip the extra .zip before download - - filename = os.path.join(tmpdir, name) - - # Download the file - # - if scheme == 'svn' or scheme.startswith('svn+'): - return self._download_svn(url, filename) - elif scheme == 'git' or scheme.startswith('git+'): - return self._download_git(url, filename) - elif scheme.startswith('hg+'): - return self._download_hg(url, filename) - elif scheme == 'file': - return urllib.request.url2pathname(urllib.parse.urlparse(url)[2]) - else: - self.url_ok(url, True) # raises error if not allowed - return self._attempt_download(url, filename) - - def scan_url(self, url): - self.process_url(url, True) - - def _attempt_download(self, url, filename): - headers = self._download_to(url, filename) - if 'html' in headers.get('content-type', '').lower(): - return self._download_html(url, headers, filename) - else: - return filename - - def _download_html(self, url, headers, filename): - file = open(filename) - for line in file: - if line.strip(): - # Check for a subversion index page - if re.search(r'<title>([^- ]+ - )?Revision \d+:', line): - # it's a subversion index page: - file.close() - os.unlink(filename) - return self._download_svn(url, filename) - break # not an index page - file.close() - os.unlink(filename) - raise DistutilsError("Unexpected HTML page found at " + url) - - def _download_svn(self, url, filename): - warnings.warn("SVN download support is deprecated", UserWarning) - url = url.split('#', 1)[0] # remove any fragment for svn's sake - creds = '' - if url.lower().startswith('svn:') and '@' in url: - scheme, netloc, path, p, q, f = urllib.parse.urlparse(url) - if not netloc and path.startswith('//') and '/' in path[2:]: - netloc, path = path[2:].split('/', 1) - auth, host = _splituser(netloc) - if auth: - if ':' in auth: - user, pw = auth.split(':', 1) - creds = " --username=%s --password=%s" % (user, pw) - else: - creds = " --username=" + auth - netloc = host - parts = scheme, netloc, url, p, q, f - url = urllib.parse.urlunparse(parts) - self.info("Doing subversion checkout from %s to %s", url, filename) - os.system("svn checkout%s -q %s %s" % (creds, url, filename)) - return filename - - @staticmethod - def _vcs_split_rev_from_url(url, pop_prefix=False): - scheme, netloc, path, query, frag = urllib.parse.urlsplit(url) - - scheme = scheme.split('+', 1)[-1] - - # Some fragment identification fails - path = path.split('#', 1)[0] - - rev = None - if '@' in path: - path, rev = path.rsplit('@', 1) - - # Also, discard fragment - url = urllib.parse.urlunsplit((scheme, netloc, path, query, '')) - - return url, rev - - def _download_git(self, url, filename): - filename = filename.split('#', 1)[0] - url, rev = self._vcs_split_rev_from_url(url, pop_prefix=True) - - self.info("Doing git clone from %s to %s", url, filename) - os.system("git clone --quiet %s %s" % (url, filename)) - - if rev is not None: - self.info("Checking out %s", rev) - os.system("git -C %s checkout --quiet %s" % ( - filename, - rev, - )) - - return filename - - def _download_hg(self, url, filename): - filename = filename.split('#', 1)[0] - url, rev = self._vcs_split_rev_from_url(url, pop_prefix=True) - - self.info("Doing hg clone from %s to %s", url, filename) - os.system("hg clone --quiet %s %s" % (url, filename)) - - if rev is not None: - self.info("Updating to %s", rev) - os.system("hg --cwd %s up -C -r %s -q" % ( - filename, - rev, - )) - - return filename - - def debug(self, msg, *args): - log.debug(msg, *args) - - def info(self, msg, *args): - log.info(msg, *args) - - def warn(self, msg, *args): - log.warn(msg, *args) - - -# This pattern matches a character entity reference (a decimal numeric -# references, a hexadecimal numeric reference, or a named reference). -entity_sub = re.compile(r'&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?').sub - - -def decode_entity(match): - what = match.group(0) - return unescape(what) - - -def htmldecode(text): - """ - Decode HTML entities in the given text. - - >>> htmldecode( - ... 'https://../package_name-0.1.2.tar.gz' - ... '?tokena=A&tokenb=B">package_name-0.1.2.tar.gz') - 'https://../package_name-0.1.2.tar.gz?tokena=A&tokenb=B">package_name-0.1.2.tar.gz' - """ - return entity_sub(decode_entity, text) - - -def socket_timeout(timeout=15): - def _socket_timeout(func): - def _socket_timeout(*args, **kwargs): - old_timeout = socket.getdefaulttimeout() - socket.setdefaulttimeout(timeout) - try: - return func(*args, **kwargs) - finally: - socket.setdefaulttimeout(old_timeout) - - return _socket_timeout - - return _socket_timeout - - -def _encode_auth(auth): - """ - A function compatible with Python 2.3-3.3 that will encode - auth from a URL suitable for an HTTP header. - >>> str(_encode_auth('username%3Apassword')) - 'dXNlcm5hbWU6cGFzc3dvcmQ=' - - Long auth strings should not cause a newline to be inserted. - >>> long_auth = 'username:' + 'password'*10 - >>> chr(10) in str(_encode_auth(long_auth)) - False - """ - auth_s = urllib.parse.unquote(auth) - # convert to bytes - auth_bytes = auth_s.encode() - encoded_bytes = base64.b64encode(auth_bytes) - # convert back to a string - encoded = encoded_bytes.decode() - # strip the trailing carriage return - return encoded.replace('\n', '') - - -class Credential: - """ - A username/password pair. Use like a namedtuple. - """ - - def __init__(self, username, password): - self.username = username - self.password = password - - def __iter__(self): - yield self.username - yield self.password - - def __str__(self): - return '%(username)s:%(password)s' % vars(self) - - -class PyPIConfig(configparser.RawConfigParser): - def __init__(self): - """ - Load from ~/.pypirc - """ - defaults = dict.fromkeys(['username', 'password', 'repository'], '') - configparser.RawConfigParser.__init__(self, defaults) - - rc = os.path.join(os.path.expanduser('~'), '.pypirc') - if os.path.exists(rc): - self.read(rc) - - @property - def creds_by_repository(self): - sections_with_repositories = [ - section for section in self.sections() - if self.get(section, 'repository').strip() - ] - - return dict(map(self._get_repo_cred, sections_with_repositories)) - - def _get_repo_cred(self, section): - repo = self.get(section, 'repository').strip() - return repo, Credential( - self.get(section, 'username').strip(), - self.get(section, 'password').strip(), - ) - - def find_credential(self, url): - """ - If the URL indicated appears to be a repository defined in this - config, return the credential for that repository. - """ - for repository, cred in self.creds_by_repository.items(): - if url.startswith(repository): - return cred - - -def open_with_auth(url, opener=urllib.request.urlopen): - """Open a urllib2 request, handling HTTP authentication""" - - parsed = urllib.parse.urlparse(url) - scheme, netloc, path, params, query, frag = parsed - - # Double scheme does not raise on Mac OS X as revealed by a - # failing test. We would expect "nonnumeric port". Refs #20. - if netloc.endswith(':'): - raise http_client.InvalidURL("nonnumeric port: ''") - - if scheme in ('http', 'https'): - auth, address = _splituser(netloc) - else: - auth = None - - if not auth: - cred = PyPIConfig().find_credential(url) - if cred: - auth = str(cred) - info = cred.username, url - log.info('Authenticating as %s for %s (from .pypirc)', *info) - - if auth: - auth = "Basic " + _encode_auth(auth) - parts = scheme, address, path, params, query, frag - new_url = urllib.parse.urlunparse(parts) - request = urllib.request.Request(new_url) - request.add_header("Authorization", auth) - else: - request = urllib.request.Request(url) - - request.add_header('User-Agent', user_agent) - fp = opener(request) - - if auth: - # Put authentication info back into request URL if same host, - # so that links found on the page will work - s2, h2, path2, param2, query2, frag2 = urllib.parse.urlparse(fp.url) - if s2 == scheme and h2 == address: - parts = s2, netloc, path2, param2, query2, frag2 - fp.url = urllib.parse.urlunparse(parts) - - return fp - - -# copy of urllib.parse._splituser from Python 3.8 -def _splituser(host): - """splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.""" - user, delim, host = host.rpartition('@') - return (user if delim else None), host - - -# adding a timeout to avoid freezing package_index -open_with_auth = socket_timeout(_SOCKET_TIMEOUT)(open_with_auth) - - -def fix_sf_url(url): - return url # backward compatibility - - -def local_open(url): - """Read a local path, with special support for directories""" - scheme, server, path, param, query, frag = urllib.parse.urlparse(url) - filename = urllib.request.url2pathname(path) - if os.path.isfile(filename): - return urllib.request.urlopen(url) - elif path.endswith('/') and os.path.isdir(filename): - files = [] - for f in os.listdir(filename): - filepath = os.path.join(filename, f) - if f == 'index.html': - with open(filepath, 'r') as fp: - body = fp.read() - break - elif os.path.isdir(filepath): - f += '/' - files.append('<a href="{name}">{name}</a>'.format(name=f)) - else: - tmpl = ( - "<html><head><title>{url}" - "{files}") - body = tmpl.format(url=url, files='\n'.join(files)) - status, message = 200, "OK" - else: - status, message, body = 404, "Path not found", "Not found" - - headers = {'content-type': 'text/html'} - body_stream = six.StringIO(body) - return urllib.error.HTTPError(url, status, message, headers, body_stream) diff --git a/env/lib/python3.7/site-packages/setuptools/pep425tags.py b/env/lib/python3.7/site-packages/setuptools/pep425tags.py deleted file mode 100644 index 48745a2..0000000 --- a/env/lib/python3.7/site-packages/setuptools/pep425tags.py +++ /dev/null @@ -1,319 +0,0 @@ -# This file originally from pip: -# https://github.com/pypa/pip/blob/8f4f15a5a95d7d5b511ceaee9ed261176c181970/src/pip/_internal/pep425tags.py -"""Generate and work with PEP 425 Compatibility Tags.""" -from __future__ import absolute_import - -import distutils.util -from distutils import log -import platform -import re -import sys -import sysconfig -import warnings -from collections import OrderedDict - -from .extern import six - -from . import glibc - -_osx_arch_pat = re.compile(r'(.+)_(\d+)_(\d+)_(.+)') - - -def get_config_var(var): - try: - return sysconfig.get_config_var(var) - except IOError as e: # Issue #1074 - warnings.warn("{}".format(e), RuntimeWarning) - return None - - -def get_abbr_impl(): - """Return abbreviated implementation name.""" - if hasattr(sys, 'pypy_version_info'): - pyimpl = 'pp' - elif sys.platform.startswith('java'): - pyimpl = 'jy' - elif sys.platform == 'cli': - pyimpl = 'ip' - else: - pyimpl = 'cp' - return pyimpl - - -def get_impl_ver(): - """Return implementation version.""" - impl_ver = get_config_var("py_version_nodot") - if not impl_ver or get_abbr_impl() == 'pp': - impl_ver = ''.join(map(str, get_impl_version_info())) - return impl_ver - - -def get_impl_version_info(): - """Return sys.version_info-like tuple for use in decrementing the minor - version.""" - if get_abbr_impl() == 'pp': - # as per https://github.com/pypa/pip/issues/2882 - return (sys.version_info[0], sys.pypy_version_info.major, - sys.pypy_version_info.minor) - else: - return sys.version_info[0], sys.version_info[1] - - -def get_impl_tag(): - """ - Returns the Tag for this specific implementation. - """ - return "{}{}".format(get_abbr_impl(), get_impl_ver()) - - -def get_flag(var, fallback, expected=True, warn=True): - """Use a fallback method for determining SOABI flags if the needed config - var is unset or unavailable.""" - val = get_config_var(var) - if val is None: - if warn: - log.debug("Config variable '%s' is unset, Python ABI tag may " - "be incorrect", var) - return fallback() - return val == expected - - -def get_abi_tag(): - """Return the ABI tag based on SOABI (if available) or emulate SOABI - (CPython 2, PyPy).""" - soabi = get_config_var('SOABI') - impl = get_abbr_impl() - if not soabi and impl in {'cp', 'pp'} and hasattr(sys, 'maxunicode'): - d = '' - m = '' - u = '' - if get_flag('Py_DEBUG', - lambda: hasattr(sys, 'gettotalrefcount'), - warn=(impl == 'cp')): - d = 'd' - if get_flag('WITH_PYMALLOC', - lambda: impl == 'cp', - warn=(impl == 'cp')): - m = 'm' - if get_flag('Py_UNICODE_SIZE', - lambda: sys.maxunicode == 0x10ffff, - expected=4, - warn=(impl == 'cp' and - six.PY2)) \ - and six.PY2: - u = 'u' - abi = '%s%s%s%s%s' % (impl, get_impl_ver(), d, m, u) - elif soabi and soabi.startswith('cpython-'): - abi = 'cp' + soabi.split('-')[1] - elif soabi: - abi = soabi.replace('.', '_').replace('-', '_') - else: - abi = None - return abi - - -def _is_running_32bit(): - return sys.maxsize == 2147483647 - - -def get_platform(): - """Return our platform name 'win32', 'linux_x86_64'""" - if sys.platform == 'darwin': - # distutils.util.get_platform() returns the release based on the value - # of MACOSX_DEPLOYMENT_TARGET on which Python was built, which may - # be significantly older than the user's current machine. - release, _, machine = platform.mac_ver() - split_ver = release.split('.') - - if machine == "x86_64" and _is_running_32bit(): - machine = "i386" - elif machine == "ppc64" and _is_running_32bit(): - machine = "ppc" - - return 'macosx_{}_{}_{}'.format(split_ver[0], split_ver[1], machine) - - # XXX remove distutils dependency - result = distutils.util.get_platform().replace('.', '_').replace('-', '_') - if result == "linux_x86_64" and _is_running_32bit(): - # 32 bit Python program (running on a 64 bit Linux): pip should only - # install and run 32 bit compiled extensions in that case. - result = "linux_i686" - - return result - - -def is_manylinux1_compatible(): - # Only Linux, and only x86-64 / i686 - if get_platform() not in {"linux_x86_64", "linux_i686"}: - return False - - # Check for presence of _manylinux module - try: - import _manylinux - return bool(_manylinux.manylinux1_compatible) - except (ImportError, AttributeError): - # Fall through to heuristic check below - pass - - # Check glibc version. CentOS 5 uses glibc 2.5. - return glibc.have_compatible_glibc(2, 5) - - -def get_darwin_arches(major, minor, machine): - """Return a list of supported arches (including group arches) for - the given major, minor and machine architecture of a macOS machine. - """ - arches = [] - - def _supports_arch(major, minor, arch): - # Looking at the application support for macOS versions in the chart - # provided by https://en.wikipedia.org/wiki/OS_X#Versions it appears - # our timeline looks roughly like: - # - # 10.0 - Introduces ppc support. - # 10.4 - Introduces ppc64, i386, and x86_64 support, however the ppc64 - # and x86_64 support is CLI only, and cannot be used for GUI - # applications. - # 10.5 - Extends ppc64 and x86_64 support to cover GUI applications. - # 10.6 - Drops support for ppc64 - # 10.7 - Drops support for ppc - # - # Given that we do not know if we're installing a CLI or a GUI - # application, we must be conservative and assume it might be a GUI - # application and behave as if ppc64 and x86_64 support did not occur - # until 10.5. - # - # Note: The above information is taken from the "Application support" - # column in the chart not the "Processor support" since I believe - # that we care about what instruction sets an application can use - # not which processors the OS supports. - if arch == 'ppc': - return (major, minor) <= (10, 5) - if arch == 'ppc64': - return (major, minor) == (10, 5) - if arch == 'i386': - return (major, minor) >= (10, 4) - if arch == 'x86_64': - return (major, minor) >= (10, 5) - if arch in groups: - for garch in groups[arch]: - if _supports_arch(major, minor, garch): - return True - return False - - groups = OrderedDict([ - ("fat", ("i386", "ppc")), - ("intel", ("x86_64", "i386")), - ("fat64", ("x86_64", "ppc64")), - ("fat32", ("x86_64", "i386", "ppc")), - ]) - - if _supports_arch(major, minor, machine): - arches.append(machine) - - for garch in groups: - if machine in groups[garch] and _supports_arch(major, minor, garch): - arches.append(garch) - - arches.append('universal') - - return arches - - -def get_supported(versions=None, noarch=False, platform=None, - impl=None, abi=None): - """Return a list of supported tags for each version specified in - `versions`. - - :param versions: a list of string versions, of the form ["33", "32"], - or None. The first version will be assumed to support our ABI. - :param platform: specify the exact platform you want valid - tags for, or None. If None, use the local system platform. - :param impl: specify the exact implementation you want valid - tags for, or None. If None, use the local interpreter impl. - :param abi: specify the exact abi you want valid - tags for, or None. If None, use the local interpreter abi. - """ - supported = [] - - # Versions must be given with respect to the preference - if versions is None: - versions = [] - version_info = get_impl_version_info() - major = version_info[:-1] - # Support all previous minor Python versions. - for minor in range(version_info[-1], -1, -1): - versions.append(''.join(map(str, major + (minor,)))) - - impl = impl or get_abbr_impl() - - abis = [] - - abi = abi or get_abi_tag() - if abi: - abis[0:0] = [abi] - - abi3s = set() - import imp - for suffix in imp.get_suffixes(): - if suffix[0].startswith('.abi'): - abi3s.add(suffix[0].split('.', 2)[1]) - - abis.extend(sorted(list(abi3s))) - - abis.append('none') - - if not noarch: - arch = platform or get_platform() - if arch.startswith('macosx'): - # support macosx-10.6-intel on macosx-10.9-x86_64 - match = _osx_arch_pat.match(arch) - if match: - name, major, minor, actual_arch = match.groups() - tpl = '{}_{}_%i_%s'.format(name, major) - arches = [] - for m in reversed(range(int(minor) + 1)): - for a in get_darwin_arches(int(major), m, actual_arch): - arches.append(tpl % (m, a)) - else: - # arch pattern didn't match (?!) - arches = [arch] - elif platform is None and is_manylinux1_compatible(): - arches = [arch.replace('linux', 'manylinux1'), arch] - else: - arches = [arch] - - # Current version, current API (built specifically for our Python): - for abi in abis: - for arch in arches: - supported.append(('%s%s' % (impl, versions[0]), abi, arch)) - - # abi3 modules compatible with older version of Python - for version in versions[1:]: - # abi3 was introduced in Python 3.2 - if version in {'31', '30'}: - break - for abi in abi3s: # empty set if not Python 3 - for arch in arches: - supported.append(("%s%s" % (impl, version), abi, arch)) - - # Has binaries, does not use the Python API: - for arch in arches: - supported.append(('py%s' % (versions[0][0]), 'none', arch)) - - # No abi / arch, but requires our implementation: - supported.append(('%s%s' % (impl, versions[0]), 'none', 'any')) - # Tagged specifically as being cross-version compatible - # (with just the major version specified) - supported.append(('%s%s' % (impl, versions[0][0]), 'none', 'any')) - - # No abi / arch, generic Python - for i, version in enumerate(versions): - supported.append(('py%s' % (version,), 'none', 'any')) - if i == 0: - supported.append(('py%s' % (version[0]), 'none', 'any')) - - return supported - - -implementation_tag = get_impl_tag() diff --git a/env/lib/python3.7/site-packages/setuptools/py27compat.py b/env/lib/python3.7/site-packages/setuptools/py27compat.py deleted file mode 100644 index 2985011..0000000 --- a/env/lib/python3.7/site-packages/setuptools/py27compat.py +++ /dev/null @@ -1,28 +0,0 @@ -""" -Compatibility Support for Python 2.7 and earlier -""" - -import platform - -from setuptools.extern import six - - -def get_all_headers(message, key): - """ - Given an HTTPMessage, return all headers matching a given key. - """ - return message.get_all(key) - - -if six.PY2: - def get_all_headers(message, key): - return message.getheaders(key) - - -linux_py2_ascii = ( - platform.system() == 'Linux' and - six.PY2 -) - -rmtree_safe = str if linux_py2_ascii else lambda x: x -"""Workaround for http://bugs.python.org/issue24672""" diff --git a/env/lib/python3.7/site-packages/setuptools/py31compat.py b/env/lib/python3.7/site-packages/setuptools/py31compat.py deleted file mode 100644 index e1da7ee..0000000 --- a/env/lib/python3.7/site-packages/setuptools/py31compat.py +++ /dev/null @@ -1,32 +0,0 @@ -__all__ = [] - -__metaclass__ = type - - -try: - # Python >=3.2 - from tempfile import TemporaryDirectory -except ImportError: - import shutil - import tempfile - - class TemporaryDirectory: - """ - Very simple temporary directory context manager. - Will try to delete afterward, but will also ignore OS and similar - errors on deletion. - """ - - def __init__(self, **kwargs): - self.name = None # Handle mkdtemp raising an exception - self.name = tempfile.mkdtemp(**kwargs) - - def __enter__(self): - return self.name - - def __exit__(self, exctype, excvalue, exctrace): - try: - shutil.rmtree(self.name, True) - except OSError: # removal errors are not the only possible - pass - self.name = None diff --git a/env/lib/python3.7/site-packages/setuptools/py33compat.py b/env/lib/python3.7/site-packages/setuptools/py33compat.py deleted file mode 100644 index 87cf539..0000000 --- a/env/lib/python3.7/site-packages/setuptools/py33compat.py +++ /dev/null @@ -1,55 +0,0 @@ -import dis -import array -import collections - -try: - import html -except ImportError: - html = None - -from setuptools.extern import six -from setuptools.extern.six.moves import html_parser - -__metaclass__ = type - -OpArg = collections.namedtuple('OpArg', 'opcode arg') - - -class Bytecode_compat: - def __init__(self, code): - self.code = code - - def __iter__(self): - """Yield '(op,arg)' pair for each operation in code object 'code'""" - - bytes = array.array('b', self.code.co_code) - eof = len(self.code.co_code) - - ptr = 0 - extended_arg = 0 - - while ptr < eof: - - op = bytes[ptr] - - if op >= dis.HAVE_ARGUMENT: - - arg = bytes[ptr + 1] + bytes[ptr + 2] * 256 + extended_arg - ptr += 3 - - if op == dis.EXTENDED_ARG: - long_type = six.integer_types[-1] - extended_arg = arg * long_type(65536) - continue - - else: - arg = None - ptr += 1 - - yield OpArg(op, arg) - - -Bytecode = getattr(dis, 'Bytecode', Bytecode_compat) - - -unescape = getattr(html, 'unescape', html_parser.HTMLParser().unescape) diff --git a/env/lib/python3.7/site-packages/setuptools/sandbox.py b/env/lib/python3.7/site-packages/setuptools/sandbox.py deleted file mode 100644 index 685f3f7..0000000 --- a/env/lib/python3.7/site-packages/setuptools/sandbox.py +++ /dev/null @@ -1,491 +0,0 @@ -import os -import sys -import tempfile -import operator -import functools -import itertools -import re -import contextlib -import pickle -import textwrap - -from setuptools.extern import six -from setuptools.extern.six.moves import builtins, map - -import pkg_resources.py31compat - -if sys.platform.startswith('java'): - import org.python.modules.posix.PosixModule as _os -else: - _os = sys.modules[os.name] -try: - _file = file -except NameError: - _file = None -_open = open -from distutils.errors import DistutilsError -from pkg_resources import working_set - - -__all__ = [ - "AbstractSandbox", "DirectorySandbox", "SandboxViolation", "run_setup", -] - - -def _execfile(filename, globals, locals=None): - """ - Python 3 implementation of execfile. - """ - mode = 'rb' - with open(filename, mode) as stream: - script = stream.read() - if locals is None: - locals = globals - code = compile(script, filename, 'exec') - exec(code, globals, locals) - - -@contextlib.contextmanager -def save_argv(repl=None): - saved = sys.argv[:] - if repl is not None: - sys.argv[:] = repl - try: - yield saved - finally: - sys.argv[:] = saved - - -@contextlib.contextmanager -def save_path(): - saved = sys.path[:] - try: - yield saved - finally: - sys.path[:] = saved - - -@contextlib.contextmanager -def override_temp(replacement): - """ - Monkey-patch tempfile.tempdir with replacement, ensuring it exists - """ - pkg_resources.py31compat.makedirs(replacement, exist_ok=True) - - saved = tempfile.tempdir - - tempfile.tempdir = replacement - - try: - yield - finally: - tempfile.tempdir = saved - - -@contextlib.contextmanager -def pushd(target): - saved = os.getcwd() - os.chdir(target) - try: - yield saved - finally: - os.chdir(saved) - - -class UnpickleableException(Exception): - """ - An exception representing another Exception that could not be pickled. - """ - - @staticmethod - def dump(type, exc): - """ - Always return a dumped (pickled) type and exc. If exc can't be pickled, - wrap it in UnpickleableException first. - """ - try: - return pickle.dumps(type), pickle.dumps(exc) - except Exception: - # get UnpickleableException inside the sandbox - from setuptools.sandbox import UnpickleableException as cls - return cls.dump(cls, cls(repr(exc))) - - -class ExceptionSaver: - """ - A Context Manager that will save an exception, serialized, and restore it - later. - """ - - def __enter__(self): - return self - - def __exit__(self, type, exc, tb): - if not exc: - return - - # dump the exception - self._saved = UnpickleableException.dump(type, exc) - self._tb = tb - - # suppress the exception - return True - - def resume(self): - "restore and re-raise any exception" - - if '_saved' not in vars(self): - return - - type, exc = map(pickle.loads, self._saved) - six.reraise(type, exc, self._tb) - - -@contextlib.contextmanager -def save_modules(): - """ - Context in which imported modules are saved. - - Translates exceptions internal to the context into the equivalent exception - outside the context. - """ - saved = sys.modules.copy() - with ExceptionSaver() as saved_exc: - yield saved - - sys.modules.update(saved) - # remove any modules imported since - del_modules = ( - mod_name for mod_name in sys.modules - if mod_name not in saved - # exclude any encodings modules. See #285 - and not mod_name.startswith('encodings.') - ) - _clear_modules(del_modules) - - saved_exc.resume() - - -def _clear_modules(module_names): - for mod_name in list(module_names): - del sys.modules[mod_name] - - -@contextlib.contextmanager -def save_pkg_resources_state(): - saved = pkg_resources.__getstate__() - try: - yield saved - finally: - pkg_resources.__setstate__(saved) - - -@contextlib.contextmanager -def setup_context(setup_dir): - temp_dir = os.path.join(setup_dir, 'temp') - with save_pkg_resources_state(): - with save_modules(): - hide_setuptools() - with save_path(): - with save_argv(): - with override_temp(temp_dir): - with pushd(setup_dir): - # ensure setuptools commands are available - __import__('setuptools') - yield - - -def _needs_hiding(mod_name): - """ - >>> _needs_hiding('setuptools') - True - >>> _needs_hiding('pkg_resources') - True - >>> _needs_hiding('setuptools_plugin') - False - >>> _needs_hiding('setuptools.__init__') - True - >>> _needs_hiding('distutils') - True - >>> _needs_hiding('os') - False - >>> _needs_hiding('Cython') - True - """ - pattern = re.compile(r'(setuptools|pkg_resources|distutils|Cython)(\.|$)') - return bool(pattern.match(mod_name)) - - -def hide_setuptools(): - """ - Remove references to setuptools' modules from sys.modules to allow the - invocation to import the most appropriate setuptools. This technique is - necessary to avoid issues such as #315 where setuptools upgrading itself - would fail to find a function declared in the metadata. - """ - modules = filter(_needs_hiding, sys.modules) - _clear_modules(modules) - - -def run_setup(setup_script, args): - """Run a distutils setup script, sandboxed in its directory""" - setup_dir = os.path.abspath(os.path.dirname(setup_script)) - with setup_context(setup_dir): - try: - sys.argv[:] = [setup_script] + list(args) - sys.path.insert(0, setup_dir) - # reset to include setup dir, w/clean callback list - working_set.__init__() - working_set.callbacks.append(lambda dist: dist.activate()) - - # __file__ should be a byte string on Python 2 (#712) - dunder_file = ( - setup_script - if isinstance(setup_script, str) else - setup_script.encode(sys.getfilesystemencoding()) - ) - - with DirectorySandbox(setup_dir): - ns = dict(__file__=dunder_file, __name__='__main__') - _execfile(setup_script, ns) - except SystemExit as v: - if v.args and v.args[0]: - raise - # Normal exit, just return - - -class AbstractSandbox: - """Wrap 'os' module and 'open()' builtin for virtualizing setup scripts""" - - _active = False - - def __init__(self): - self._attrs = [ - name for name in dir(_os) - if not name.startswith('_') and hasattr(self, name) - ] - - def _copy(self, source): - for name in self._attrs: - setattr(os, name, getattr(source, name)) - - def __enter__(self): - self._copy(self) - if _file: - builtins.file = self._file - builtins.open = self._open - self._active = True - - def __exit__(self, exc_type, exc_value, traceback): - self._active = False - if _file: - builtins.file = _file - builtins.open = _open - self._copy(_os) - - def run(self, func): - """Run 'func' under os sandboxing""" - with self: - return func() - - def _mk_dual_path_wrapper(name): - original = getattr(_os, name) - - def wrap(self, src, dst, *args, **kw): - if self._active: - src, dst = self._remap_pair(name, src, dst, *args, **kw) - return original(src, dst, *args, **kw) - - return wrap - - for name in ["rename", "link", "symlink"]: - if hasattr(_os, name): - locals()[name] = _mk_dual_path_wrapper(name) - - def _mk_single_path_wrapper(name, original=None): - original = original or getattr(_os, name) - - def wrap(self, path, *args, **kw): - if self._active: - path = self._remap_input(name, path, *args, **kw) - return original(path, *args, **kw) - - return wrap - - if _file: - _file = _mk_single_path_wrapper('file', _file) - _open = _mk_single_path_wrapper('open', _open) - for name in [ - "stat", "listdir", "chdir", "open", "chmod", "chown", "mkdir", - "remove", "unlink", "rmdir", "utime", "lchown", "chroot", "lstat", - "startfile", "mkfifo", "mknod", "pathconf", "access" - ]: - if hasattr(_os, name): - locals()[name] = _mk_single_path_wrapper(name) - - def _mk_single_with_return(name): - original = getattr(_os, name) - - def wrap(self, path, *args, **kw): - if self._active: - path = self._remap_input(name, path, *args, **kw) - return self._remap_output(name, original(path, *args, **kw)) - return original(path, *args, **kw) - - return wrap - - for name in ['readlink', 'tempnam']: - if hasattr(_os, name): - locals()[name] = _mk_single_with_return(name) - - def _mk_query(name): - original = getattr(_os, name) - - def wrap(self, *args, **kw): - retval = original(*args, **kw) - if self._active: - return self._remap_output(name, retval) - return retval - - return wrap - - for name in ['getcwd', 'tmpnam']: - if hasattr(_os, name): - locals()[name] = _mk_query(name) - - def _validate_path(self, path): - """Called to remap or validate any path, whether input or output""" - return path - - def _remap_input(self, operation, path, *args, **kw): - """Called for path inputs""" - return self._validate_path(path) - - def _remap_output(self, operation, path): - """Called for path outputs""" - return self._validate_path(path) - - def _remap_pair(self, operation, src, dst, *args, **kw): - """Called for path pairs like rename, link, and symlink operations""" - return ( - self._remap_input(operation + '-from', src, *args, **kw), - self._remap_input(operation + '-to', dst, *args, **kw) - ) - - -if hasattr(os, 'devnull'): - _EXCEPTIONS = [os.devnull,] -else: - _EXCEPTIONS = [] - - -class DirectorySandbox(AbstractSandbox): - """Restrict operations to a single subdirectory - pseudo-chroot""" - - write_ops = dict.fromkeys([ - "open", "chmod", "chown", "mkdir", "remove", "unlink", "rmdir", - "utime", "lchown", "chroot", "mkfifo", "mknod", "tempnam", - ]) - - _exception_patterns = [ - # Allow lib2to3 to attempt to save a pickled grammar object (#121) - r'.*lib2to3.*\.pickle$', - ] - "exempt writing to paths that match the pattern" - - def __init__(self, sandbox, exceptions=_EXCEPTIONS): - self._sandbox = os.path.normcase(os.path.realpath(sandbox)) - self._prefix = os.path.join(self._sandbox, '') - self._exceptions = [ - os.path.normcase(os.path.realpath(path)) - for path in exceptions - ] - AbstractSandbox.__init__(self) - - def _violation(self, operation, *args, **kw): - from setuptools.sandbox import SandboxViolation - raise SandboxViolation(operation, args, kw) - - if _file: - - def _file(self, path, mode='r', *args, **kw): - if mode not in ('r', 'rt', 'rb', 'rU', 'U') and not self._ok(path): - self._violation("file", path, mode, *args, **kw) - return _file(path, mode, *args, **kw) - - def _open(self, path, mode='r', *args, **kw): - if mode not in ('r', 'rt', 'rb', 'rU', 'U') and not self._ok(path): - self._violation("open", path, mode, *args, **kw) - return _open(path, mode, *args, **kw) - - def tmpnam(self): - self._violation("tmpnam") - - def _ok(self, path): - active = self._active - try: - self._active = False - realpath = os.path.normcase(os.path.realpath(path)) - return ( - self._exempted(realpath) - or realpath == self._sandbox - or realpath.startswith(self._prefix) - ) - finally: - self._active = active - - def _exempted(self, filepath): - start_matches = ( - filepath.startswith(exception) - for exception in self._exceptions - ) - pattern_matches = ( - re.match(pattern, filepath) - for pattern in self._exception_patterns - ) - candidates = itertools.chain(start_matches, pattern_matches) - return any(candidates) - - def _remap_input(self, operation, path, *args, **kw): - """Called for path inputs""" - if operation in self.write_ops and not self._ok(path): - self._violation(operation, os.path.realpath(path), *args, **kw) - return path - - def _remap_pair(self, operation, src, dst, *args, **kw): - """Called for path pairs like rename, link, and symlink operations""" - if not self._ok(src) or not self._ok(dst): - self._violation(operation, src, dst, *args, **kw) - return (src, dst) - - def open(self, file, flags, mode=0o777, *args, **kw): - """Called for low-level os.open()""" - if flags & WRITE_FLAGS and not self._ok(file): - self._violation("os.open", file, flags, mode, *args, **kw) - return _os.open(file, flags, mode, *args, **kw) - - -WRITE_FLAGS = functools.reduce( - operator.or_, [getattr(_os, a, 0) for a in - "O_WRONLY O_RDWR O_APPEND O_CREAT O_TRUNC O_TEMPORARY".split()] -) - - -class SandboxViolation(DistutilsError): - """A setup script attempted to modify the filesystem outside the sandbox""" - - tmpl = textwrap.dedent(""" - SandboxViolation: {cmd}{args!r} {kwargs} - - The package setup script has attempted to modify files on your system - that are not within the EasyInstall build area, and has been aborted. - - This package cannot be safely installed by EasyInstall, and may not - support alternate installation locations even if you run its setup - script by hand. Please inform the package's author and the EasyInstall - maintainers to find out if a fix or workaround is available. - """).lstrip() - - def __str__(self): - cmd, args, kwargs = self.args - return self.tmpl.format(**locals()) diff --git a/env/lib/python3.7/site-packages/setuptools/script (dev).tmpl b/env/lib/python3.7/site-packages/setuptools/script (dev).tmpl deleted file mode 100644 index 39a24b0..0000000 --- a/env/lib/python3.7/site-packages/setuptools/script (dev).tmpl +++ /dev/null @@ -1,6 +0,0 @@ -# EASY-INSTALL-DEV-SCRIPT: %(spec)r,%(script_name)r -__requires__ = %(spec)r -__import__('pkg_resources').require(%(spec)r) -__file__ = %(dev_path)r -with open(__file__) as f: - exec(compile(f.read(), __file__, 'exec')) diff --git a/env/lib/python3.7/site-packages/setuptools/script.tmpl b/env/lib/python3.7/site-packages/setuptools/script.tmpl deleted file mode 100644 index ff5efbc..0000000 --- a/env/lib/python3.7/site-packages/setuptools/script.tmpl +++ /dev/null @@ -1,3 +0,0 @@ -# EASY-INSTALL-SCRIPT: %(spec)r,%(script_name)r -__requires__ = %(spec)r -__import__('pkg_resources').run_script(%(spec)r, %(script_name)r) diff --git a/env/lib/python3.7/site-packages/setuptools/site-patch.py b/env/lib/python3.7/site-packages/setuptools/site-patch.py deleted file mode 100644 index 40b00de..0000000 --- a/env/lib/python3.7/site-packages/setuptools/site-patch.py +++ /dev/null @@ -1,74 +0,0 @@ -def __boot(): - import sys - import os - PYTHONPATH = os.environ.get('PYTHONPATH') - if PYTHONPATH is None or (sys.platform == 'win32' and not PYTHONPATH): - PYTHONPATH = [] - else: - PYTHONPATH = PYTHONPATH.split(os.pathsep) - - pic = getattr(sys, 'path_importer_cache', {}) - stdpath = sys.path[len(PYTHONPATH):] - mydir = os.path.dirname(__file__) - - for item in stdpath: - if item == mydir or not item: - continue # skip if current dir. on Windows, or my own directory - importer = pic.get(item) - if importer is not None: - loader = importer.find_module('site') - if loader is not None: - # This should actually reload the current module - loader.load_module('site') - break - else: - try: - import imp # Avoid import loop in Python 3 - stream, path, descr = imp.find_module('site', [item]) - except ImportError: - continue - if stream is None: - continue - try: - # This should actually reload the current module - imp.load_module('site', stream, path, descr) - finally: - stream.close() - break - else: - raise ImportError("Couldn't find the real 'site' module") - - known_paths = dict([(makepath(item)[1], 1) for item in sys.path]) # 2.2 comp - - oldpos = getattr(sys, '__egginsert', 0) # save old insertion position - sys.__egginsert = 0 # and reset the current one - - for item in PYTHONPATH: - addsitedir(item) - - sys.__egginsert += oldpos # restore effective old position - - d, nd = makepath(stdpath[0]) - insert_at = None - new_path = [] - - for item in sys.path: - p, np = makepath(item) - - if np == nd and insert_at is None: - # We've hit the first 'system' path entry, so added entries go here - insert_at = len(new_path) - - if np in known_paths or insert_at is None: - new_path.append(item) - else: - # new path after the insert point, back-insert it - new_path.insert(insert_at, item) - insert_at += 1 - - sys.path[:] = new_path - - -if __name__ == 'site': - __boot() - del __boot diff --git a/env/lib/python3.7/site-packages/setuptools/ssl_support.py b/env/lib/python3.7/site-packages/setuptools/ssl_support.py deleted file mode 100644 index 226db69..0000000 --- a/env/lib/python3.7/site-packages/setuptools/ssl_support.py +++ /dev/null @@ -1,260 +0,0 @@ -import os -import socket -import atexit -import re -import functools - -from setuptools.extern.six.moves import urllib, http_client, map, filter - -from pkg_resources import ResolutionError, ExtractionError - -try: - import ssl -except ImportError: - ssl = None - -__all__ = [ - 'VerifyingHTTPSHandler', 'find_ca_bundle', 'is_available', 'cert_paths', - 'opener_for' -] - -cert_paths = """ -/etc/pki/tls/certs/ca-bundle.crt -/etc/ssl/certs/ca-certificates.crt -/usr/share/ssl/certs/ca-bundle.crt -/usr/local/share/certs/ca-root.crt -/etc/ssl/cert.pem -/System/Library/OpenSSL/certs/cert.pem -/usr/local/share/certs/ca-root-nss.crt -/etc/ssl/ca-bundle.pem -""".strip().split() - -try: - HTTPSHandler = urllib.request.HTTPSHandler - HTTPSConnection = http_client.HTTPSConnection -except AttributeError: - HTTPSHandler = HTTPSConnection = object - -is_available = ssl is not None and object not in (HTTPSHandler, HTTPSConnection) - - -try: - from ssl import CertificateError, match_hostname -except ImportError: - try: - from backports.ssl_match_hostname import CertificateError - from backports.ssl_match_hostname import match_hostname - except ImportError: - CertificateError = None - match_hostname = None - -if not CertificateError: - - class CertificateError(ValueError): - pass - - -if not match_hostname: - - def _dnsname_match(dn, hostname, max_wildcards=1): - """Matching according to RFC 6125, section 6.4.3 - - https://tools.ietf.org/html/rfc6125#section-6.4.3 - """ - pats = [] - if not dn: - return False - - # Ported from python3-syntax: - # leftmost, *remainder = dn.split(r'.') - parts = dn.split(r'.') - leftmost = parts[0] - remainder = parts[1:] - - wildcards = leftmost.count('*') - if wildcards > max_wildcards: - # Issue #17980: avoid denials of service by refusing more - # than one wildcard per fragment. A survey of established - # policy among SSL implementations showed it to be a - # reasonable choice. - raise CertificateError( - "too many wildcards in certificate DNS name: " + repr(dn)) - - # speed up common case w/o wildcards - if not wildcards: - return dn.lower() == hostname.lower() - - # RFC 6125, section 6.4.3, subitem 1. - # The client SHOULD NOT attempt to match a presented identifier in which - # the wildcard character comprises a label other than the left-most label. - if leftmost == '*': - # When '*' is a fragment by itself, it matches a non-empty dotless - # fragment. - pats.append('[^.]+') - elif leftmost.startswith('xn--') or hostname.startswith('xn--'): - # RFC 6125, section 6.4.3, subitem 3. - # The client SHOULD NOT attempt to match a presented identifier - # where the wildcard character is embedded within an A-label or - # U-label of an internationalized domain name. - pats.append(re.escape(leftmost)) - else: - # Otherwise, '*' matches any dotless string, e.g. www* - pats.append(re.escape(leftmost).replace(r'\*', '[^.]*')) - - # add the remaining fragments, ignore any wildcards - for frag in remainder: - pats.append(re.escape(frag)) - - pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) - return pat.match(hostname) - - def match_hostname(cert, hostname): - """Verify that *cert* (in decoded format as returned by - SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 - rules are followed, but IP addresses are not accepted for *hostname*. - - CertificateError is raised on failure. On success, the function - returns nothing. - """ - if not cert: - raise ValueError("empty or no certificate") - dnsnames = [] - san = cert.get('subjectAltName', ()) - for key, value in san: - if key == 'DNS': - if _dnsname_match(value, hostname): - return - dnsnames.append(value) - if not dnsnames: - # The subject is only checked when there is no dNSName entry - # in subjectAltName - for sub in cert.get('subject', ()): - for key, value in sub: - # XXX according to RFC 2818, the most specific Common Name - # must be used. - if key == 'commonName': - if _dnsname_match(value, hostname): - return - dnsnames.append(value) - if len(dnsnames) > 1: - raise CertificateError("hostname %r " - "doesn't match either of %s" - % (hostname, ', '.join(map(repr, dnsnames)))) - elif len(dnsnames) == 1: - raise CertificateError("hostname %r " - "doesn't match %r" - % (hostname, dnsnames[0])) - else: - raise CertificateError("no appropriate commonName or " - "subjectAltName fields were found") - - -class VerifyingHTTPSHandler(HTTPSHandler): - """Simple verifying handler: no auth, subclasses, timeouts, etc.""" - - def __init__(self, ca_bundle): - self.ca_bundle = ca_bundle - HTTPSHandler.__init__(self) - - def https_open(self, req): - return self.do_open( - lambda host, **kw: VerifyingHTTPSConn(host, self.ca_bundle, **kw), req - ) - - -class VerifyingHTTPSConn(HTTPSConnection): - """Simple verifying connection: no auth, subclasses, timeouts, etc.""" - - def __init__(self, host, ca_bundle, **kw): - HTTPSConnection.__init__(self, host, **kw) - self.ca_bundle = ca_bundle - - def connect(self): - sock = socket.create_connection( - (self.host, self.port), getattr(self, 'source_address', None) - ) - - # Handle the socket if a (proxy) tunnel is present - if hasattr(self, '_tunnel') and getattr(self, '_tunnel_host', None): - self.sock = sock - self._tunnel() - # http://bugs.python.org/issue7776: Python>=3.4.1 and >=2.7.7 - # change self.host to mean the proxy server host when tunneling is - # being used. Adapt, since we are interested in the destination - # host for the match_hostname() comparison. - actual_host = self._tunnel_host - else: - actual_host = self.host - - if hasattr(ssl, 'create_default_context'): - ctx = ssl.create_default_context(cafile=self.ca_bundle) - self.sock = ctx.wrap_socket(sock, server_hostname=actual_host) - else: - # This is for python < 2.7.9 and < 3.4? - self.sock = ssl.wrap_socket( - sock, cert_reqs=ssl.CERT_REQUIRED, ca_certs=self.ca_bundle - ) - try: - match_hostname(self.sock.getpeercert(), actual_host) - except CertificateError: - self.sock.shutdown(socket.SHUT_RDWR) - self.sock.close() - raise - - -def opener_for(ca_bundle=None): - """Get a urlopen() replacement that uses ca_bundle for verification""" - return urllib.request.build_opener( - VerifyingHTTPSHandler(ca_bundle or find_ca_bundle()) - ).open - - -# from jaraco.functools -def once(func): - @functools.wraps(func) - def wrapper(*args, **kwargs): - if not hasattr(func, 'always_returns'): - func.always_returns = func(*args, **kwargs) - return func.always_returns - return wrapper - - -@once -def get_win_certfile(): - try: - import wincertstore - except ImportError: - return None - - class CertFile(wincertstore.CertFile): - def __init__(self): - super(CertFile, self).__init__() - atexit.register(self.close) - - def close(self): - try: - super(CertFile, self).close() - except OSError: - pass - - _wincerts = CertFile() - _wincerts.addstore('CA') - _wincerts.addstore('ROOT') - return _wincerts.name - - -def find_ca_bundle(): - """Return an existing CA bundle path, or None""" - extant_cert_paths = filter(os.path.isfile, cert_paths) - return ( - get_win_certfile() - or next(extant_cert_paths, None) - or _certifi_where() - ) - - -def _certifi_where(): - try: - return __import__('certifi').where() - except (ImportError, ResolutionError, ExtractionError): - pass diff --git a/env/lib/python3.7/site-packages/setuptools/unicode_utils.py b/env/lib/python3.7/site-packages/setuptools/unicode_utils.py deleted file mode 100644 index 7c63efd..0000000 --- a/env/lib/python3.7/site-packages/setuptools/unicode_utils.py +++ /dev/null @@ -1,44 +0,0 @@ -import unicodedata -import sys - -from setuptools.extern import six - - -# HFS Plus uses decomposed UTF-8 -def decompose(path): - if isinstance(path, six.text_type): - return unicodedata.normalize('NFD', path) - try: - path = path.decode('utf-8') - path = unicodedata.normalize('NFD', path) - path = path.encode('utf-8') - except UnicodeError: - pass # Not UTF-8 - return path - - -def filesys_decode(path): - """ - Ensure that the given path is decoded, - NONE when no expected encoding works - """ - - if isinstance(path, six.text_type): - return path - - fs_enc = sys.getfilesystemencoding() or 'utf-8' - candidates = fs_enc, 'utf-8' - - for enc in candidates: - try: - return path.decode(enc) - except UnicodeDecodeError: - continue - - -def try_encode(string, enc): - "turn unicode encoding into a functional routine" - try: - return string.encode(enc) - except UnicodeEncodeError: - return None diff --git a/env/lib/python3.7/site-packages/setuptools/version.py b/env/lib/python3.7/site-packages/setuptools/version.py deleted file mode 100644 index 95e1869..0000000 --- a/env/lib/python3.7/site-packages/setuptools/version.py +++ /dev/null @@ -1,6 +0,0 @@ -import pkg_resources - -try: - __version__ = pkg_resources.get_distribution('setuptools').version -except Exception: - __version__ = 'unknown' diff --git a/env/lib/python3.7/site-packages/setuptools/wheel.py b/env/lib/python3.7/site-packages/setuptools/wheel.py deleted file mode 100644 index e11f0a1..0000000 --- a/env/lib/python3.7/site-packages/setuptools/wheel.py +++ /dev/null @@ -1,211 +0,0 @@ -"""Wheels support.""" - -from distutils.util import get_platform -import email -import itertools -import os -import posixpath -import re -import zipfile - -import pkg_resources -import setuptools -from pkg_resources import parse_version -from setuptools.extern.packaging.utils import canonicalize_name -from setuptools.extern.six import PY3 -from setuptools import pep425tags -from setuptools.command.egg_info import write_requirements - - -__metaclass__ = type - - -WHEEL_NAME = re.compile( - r"""^(?P.+?)-(?P\d.*?) - ((-(?P\d.*?))?-(?P.+?)-(?P.+?)-(?P.+?) - )\.whl$""", - re.VERBOSE).match - -NAMESPACE_PACKAGE_INIT = '''\ -try: - __import__('pkg_resources').declare_namespace(__name__) -except ImportError: - __path__ = __import__('pkgutil').extend_path(__path__, __name__) -''' - - -def unpack(src_dir, dst_dir): - '''Move everything under `src_dir` to `dst_dir`, and delete the former.''' - for dirpath, dirnames, filenames in os.walk(src_dir): - subdir = os.path.relpath(dirpath, src_dir) - for f in filenames: - src = os.path.join(dirpath, f) - dst = os.path.join(dst_dir, subdir, f) - os.renames(src, dst) - for n, d in reversed(list(enumerate(dirnames))): - src = os.path.join(dirpath, d) - dst = os.path.join(dst_dir, subdir, d) - if not os.path.exists(dst): - # Directory does not exist in destination, - # rename it and prune it from os.walk list. - os.renames(src, dst) - del dirnames[n] - # Cleanup. - for dirpath, dirnames, filenames in os.walk(src_dir, topdown=True): - assert not filenames - os.rmdir(dirpath) - - -class Wheel: - - def __init__(self, filename): - match = WHEEL_NAME(os.path.basename(filename)) - if match is None: - raise ValueError('invalid wheel name: %r' % filename) - self.filename = filename - for k, v in match.groupdict().items(): - setattr(self, k, v) - - def tags(self): - '''List tags (py_version, abi, platform) supported by this wheel.''' - return itertools.product( - self.py_version.split('.'), - self.abi.split('.'), - self.platform.split('.'), - ) - - def is_compatible(self): - '''Is the wheel is compatible with the current platform?''' - supported_tags = pep425tags.get_supported() - return next((True for t in self.tags() if t in supported_tags), False) - - def egg_name(self): - return pkg_resources.Distribution( - project_name=self.project_name, version=self.version, - platform=(None if self.platform == 'any' else get_platform()), - ).egg_name() + '.egg' - - def get_dist_info(self, zf): - # find the correct name of the .dist-info dir in the wheel file - for member in zf.namelist(): - dirname = posixpath.dirname(member) - if (dirname.endswith('.dist-info') and - canonicalize_name(dirname).startswith( - canonicalize_name(self.project_name))): - return dirname - raise ValueError("unsupported wheel format. .dist-info not found") - - def install_as_egg(self, destination_eggdir): - '''Install wheel as an egg directory.''' - with zipfile.ZipFile(self.filename) as zf: - self._install_as_egg(destination_eggdir, zf) - - def _install_as_egg(self, destination_eggdir, zf): - dist_basename = '%s-%s' % (self.project_name, self.version) - dist_info = self.get_dist_info(zf) - dist_data = '%s.data' % dist_basename - egg_info = os.path.join(destination_eggdir, 'EGG-INFO') - - self._convert_metadata(zf, destination_eggdir, dist_info, egg_info) - self._move_data_entries(destination_eggdir, dist_data) - self._fix_namespace_packages(egg_info, destination_eggdir) - - @staticmethod - def _convert_metadata(zf, destination_eggdir, dist_info, egg_info): - def get_metadata(name): - with zf.open(posixpath.join(dist_info, name)) as fp: - value = fp.read().decode('utf-8') if PY3 else fp.read() - return email.parser.Parser().parsestr(value) - - wheel_metadata = get_metadata('WHEEL') - # Check wheel format version is supported. - wheel_version = parse_version(wheel_metadata.get('Wheel-Version')) - wheel_v1 = ( - parse_version('1.0') <= wheel_version < parse_version('2.0dev0') - ) - if not wheel_v1: - raise ValueError( - 'unsupported wheel format version: %s' % wheel_version) - # Extract to target directory. - os.mkdir(destination_eggdir) - zf.extractall(destination_eggdir) - # Convert metadata. - dist_info = os.path.join(destination_eggdir, dist_info) - dist = pkg_resources.Distribution.from_location( - destination_eggdir, dist_info, - metadata=pkg_resources.PathMetadata(destination_eggdir, dist_info), - ) - - # Note: Evaluate and strip markers now, - # as it's difficult to convert back from the syntax: - # foobar; "linux" in sys_platform and extra == 'test' - def raw_req(req): - req.marker = None - return str(req) - install_requires = list(sorted(map(raw_req, dist.requires()))) - extras_require = { - extra: sorted( - req - for req in map(raw_req, dist.requires((extra,))) - if req not in install_requires - ) - for extra in dist.extras - } - os.rename(dist_info, egg_info) - os.rename( - os.path.join(egg_info, 'METADATA'), - os.path.join(egg_info, 'PKG-INFO'), - ) - setup_dist = setuptools.Distribution( - attrs=dict( - install_requires=install_requires, - extras_require=extras_require, - ), - ) - write_requirements( - setup_dist.get_command_obj('egg_info'), - None, - os.path.join(egg_info, 'requires.txt'), - ) - - @staticmethod - def _move_data_entries(destination_eggdir, dist_data): - """Move data entries to their correct location.""" - dist_data = os.path.join(destination_eggdir, dist_data) - dist_data_scripts = os.path.join(dist_data, 'scripts') - if os.path.exists(dist_data_scripts): - egg_info_scripts = os.path.join( - destination_eggdir, 'EGG-INFO', 'scripts') - os.mkdir(egg_info_scripts) - for entry in os.listdir(dist_data_scripts): - # Remove bytecode, as it's not properly handled - # during easy_install scripts install phase. - if entry.endswith('.pyc'): - os.unlink(os.path.join(dist_data_scripts, entry)) - else: - os.rename( - os.path.join(dist_data_scripts, entry), - os.path.join(egg_info_scripts, entry), - ) - os.rmdir(dist_data_scripts) - for subdir in filter(os.path.exists, ( - os.path.join(dist_data, d) - for d in ('data', 'headers', 'purelib', 'platlib') - )): - unpack(subdir, destination_eggdir) - if os.path.exists(dist_data): - os.rmdir(dist_data) - - @staticmethod - def _fix_namespace_packages(egg_info, destination_eggdir): - namespace_packages = os.path.join( - egg_info, 'namespace_packages.txt') - if os.path.exists(namespace_packages): - with open(namespace_packages) as fp: - namespace_packages = fp.read().split() - for mod in namespace_packages: - mod_dir = os.path.join(destination_eggdir, *mod.split('.')) - mod_init = os.path.join(mod_dir, '__init__.py') - if os.path.exists(mod_dir) and not os.path.exists(mod_init): - with open(mod_init, 'w') as fp: - fp.write(NAMESPACE_PACKAGE_INIT) diff --git a/env/lib/python3.7/site-packages/setuptools/windows_support.py b/env/lib/python3.7/site-packages/setuptools/windows_support.py deleted file mode 100644 index cb977cf..0000000 --- a/env/lib/python3.7/site-packages/setuptools/windows_support.py +++ /dev/null @@ -1,29 +0,0 @@ -import platform -import ctypes - - -def windows_only(func): - if platform.system() != 'Windows': - return lambda *args, **kwargs: None - return func - - -@windows_only -def hide_file(path): - """ - Set the hidden attribute on a file or directory. - - From http://stackoverflow.com/questions/19622133/ - - `path` must be text. - """ - __import__('ctypes.wintypes') - SetFileAttributes = ctypes.windll.kernel32.SetFileAttributesW - SetFileAttributes.argtypes = ctypes.wintypes.LPWSTR, ctypes.wintypes.DWORD - SetFileAttributes.restype = ctypes.wintypes.BOOL - - FILE_ATTRIBUTE_HIDDEN = 0x02 - - ret = SetFileAttributes(path, FILE_ATTRIBUTE_HIDDEN) - if not ret: - raise ctypes.WinError() diff --git a/env/lib/python3.7/site-packages/wheel/__init__.py b/env/lib/python3.7/site-packages/wheel/__init__.py deleted file mode 100644 index 0f8ca70..0000000 --- a/env/lib/python3.7/site-packages/wheel/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# __variables__ with double-quoted values will be available in setup.py: -__version__ = "0.33.4" diff --git a/env/lib/python3.7/site-packages/wheel/__main__.py b/env/lib/python3.7/site-packages/wheel/__main__.py deleted file mode 100644 index b3773a2..0000000 --- a/env/lib/python3.7/site-packages/wheel/__main__.py +++ /dev/null @@ -1,19 +0,0 @@ -""" -Wheel command line tool (enable python -m wheel syntax) -""" - -import sys - - -def main(): # needed for console script - if __package__ == '': - # To be able to run 'python wheel-0.9.whl/wheel': - import os.path - path = os.path.dirname(os.path.dirname(__file__)) - sys.path[0:0] = [path] - import wheel.cli - sys.exit(wheel.cli.main()) - - -if __name__ == "__main__": - sys.exit(main()) diff --git a/env/lib/python3.7/site-packages/wheel/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/wheel/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index f342b641bd0e7d2c7e82adb359f9e626a0c20ee6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 158 zcmZ?b<>g`kg1p5Nu?ax>F^B^Lj6jA15EpX*i4=w?h7`tN22G|aHUm9lV?7f;O~zZ? z@$qG;Ma7xbB0nU`4-AFo$Xd5gm)H$SB`C)EyQ%4Z;E007tUCm#R+ diff --git a/env/lib/python3.7/site-packages/wheel/__pycache__/__main__.cpython-37.pyc b/env/lib/python3.7/site-packages/wheel/__pycache__/__main__.cpython-37.pyc deleted file mode 100644 index 504fe9782bf5ede74322eedeb292c882c98f4b9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 551 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 diff --git a/env/lib/python3.7/site-packages/wheel/__pycache__/metadata.cpython-37.pyc b/env/lib/python3.7/site-packages/wheel/__pycache__/metadata.cpython-37.pyc deleted file mode 100644 index cc2b30989c7fea77e53cc5cd6f1f326f260646dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3734 zcmZu!OLH5?5uSZuu~>j0Ma5KMOG{;6e-IVCFjX7lp;BhWz+^UAeUNV zmor0=gcnt*qEqEVQn}`oA}Xic@>6oiX|Fl?oSRPhdH~QQ9kAxHGqXLt{dIrc{CH|A zVEFa^{@oYPXBqnsJxqQMCil@)4;^PM#w~6qR?9Y{({jw{wp=roS|#pqH}Q7Mt+K_0 zbK>*T&}vn<$ID-`R=|B;!C2)1uVSq68lS>A#p`?;W1Y|NOBkoQ{g^dp`|kx$(lk+F zH8ln^!faU8!K7Vc^PeqdrQ|pY|h{POkJl%i0846)81%V9BLVbtE*vyHqDdSXf!`; zzSAM;^mEZlXb;fTQ*@f;#zM!Aoa0W;cC0JxG23DT>oCNVy~bY5eP$2rfs!VFKYstl`?qh0-AHZYm8HVjm&tnH3Gasm>zBg$YpVI$ zT4;Jjc?%}gT1xt+qC~P);YC>{dc1IV(zsW6DwSIBrdw3cT-Ab&&AqD4W2Fl_%?bx9 z{)5SBhgfO zdIlY{YgS;p){Hf4x%iWpuy%?IVM48grZ&+X{xWB<{o26Nz~scvVcCJLfxxjffDapc z+dCdveBkD;T;_J}&N0mGopSD8VT9CE2Bf@aj61-@?XUhW76}hG$DhBr1_hTxr6qiH ze^)c+>xL25+T98D-3cRUd|CAADFp(#eLcvIEQa*;C5`` z*4cr}E4fSSBN=;tc*gbuU>E?yYP5h*4nq7MjOgV&R$ZCyhEb>xd)a(*%r!jj5Klz% zh&X7zaSs2+LfANC|3=dYk9r&jH)Q%M=0Yt#ByypX2Ej%%g!n|LrNA5>!8$R17%OOS z=FYSmeqoL*htJR4q+SfdNQGIX$m5{cSm^~Lb6*i}5_yQ-Odo|tK=?(Y@ogb^bsGc= z1~Jh((F59%nIwhPYin8B82k0}pY+_ zi-`~u9q-~o^)@=@6OH)f)^KmvqE@qNAQ<1STk;1u(V;Jo0YpoRjj94N7oK?>B6d zeaf`2DRqN%K~y|3W<5{bs=2iJGoSM>g3KmL3v_o1`X!O?&;FGvm5?fnf z@NNoUlwg|_?tc*L?Qr84pDg}t{n4+<=g7f+HBQChdrLPdG3`d$2Q!L z-_99IhNKI$-czzc)6%Ob*%w9ij3yVYe0ieB8Iyj3chwKkG1o_wd6s9@5pRJtYm!Ud znnQY-v3*2g-STXC2PaSC?_ANfgPk1l2Y*H~p;UtuZ{@bOk8RaOf`?mRwxAIY$JS$Z zcn1l|H3@0KBoOpG zy||Nd5vKb(1TjZF@M{z&2m+;0V$L_i#c<ygOUpurAT$+ zxR_S^Ql?wrD8L$JqF>tA-Nif2a#2ds1GrKUgT+D0y^bgxlo>^NJ5r`*`w5BhM2~bS zJT7Q#y7HEhjtVhB38z7tg-dr|L}+?~(EjLaI9^k8=ok?2fl7eBPKW>}pz#npr-4ZM zfNB!Mh7yxeAX0KifdynV+5a8x;K?4LL23QO0aEx^0let&64`vnw0BY-ui)Q>KLVK{ zSc$t`a3vLDvImy*xj(c{D!jr2uqk-caMgW7F>59)O#T^{FyX}QpEu6LYU2d~IL2av59lF1ltQS80BaIksn~*3Qj>+txIR3sBL7n5b38Oj&L`E&R1*lCd6p8Q66)BXOz7H ziXJCGB>Bi23ys zX!#F6eX{vcd-LI_9HsJaL{k)_#wg~NGd^bYHHD?WvYYb#MBF2$RP?HAJj}O!yXHbi P$Di`6{+s?={>=XX#N_P7 diff --git a/env/lib/python3.7/site-packages/wheel/__pycache__/pep425tags.cpython-37.pyc b/env/lib/python3.7/site-packages/wheel/__pycache__/pep425tags.cpython-37.pyc deleted file mode 100644 index 5c792865c3b69ba0822b7c63650f6142243d6751..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4669 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 LM!hk2*7g1ePqchW diff --git a/env/lib/python3.7/site-packages/wheel/__pycache__/pkginfo.cpython-37.pyc b/env/lib/python3.7/site-packages/wheel/__pycache__/pkginfo.cpython-37.pyc deleted file mode 100644 index 19278d381f02a6dbd88bb898f3b2ef066e8407a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1529 zcmb_cO>Y}F5GA?0+LbKH`9KplK#N6D1P~D03DRQ_)Jfx@D5|=xfFuHf4J}gACi~SP z4aI?cN)EjQ{R<6x>R;MxPx%Wyb%rZBu-l@SQXn}y9FcGM-tb5HQm6i(MuyLd!)yBE4I%)&wPVqTLbunsVyn#`@RaAc!wb?|e3qP{K#aE+I zS!O1lmJoxMDlKNQEL6OJ)RKMh&BN`lhx^~fyYaUVMtfiFjrQV2YUkyVjVBT?q$3aM z!_IZAi%Cg4?7YVu*?`xr0|`dM{s`^%LtSW)wuA|%Wo$Hi*zaRET^uZX&3@%e_KqVq zJ{$-T=&hrQwlNlPoAB`1lKDG>7OwqybJyn8Zk1NsX<@9)vTgO#aq;rjbiTWoYn`pe z>cuQArsYm`TwkU<6LcixN!)&$gn-Us9Ehn?hy<^V-9fyLhGk2n?zQ;k(h0X5;ff`H z$4|r~B=vjt1AEMt0>O)6&0*lxep%_F$s%xBkgt+(1Mx8s zbvKvAEYryp$~>X3mkrcR7XuGS;y?%1;WU%hIwz3_eR4**wo*we&!^KTN$Jyjzly;I zi^SyvAK{GT_U{q7e-{cJN3o8DPtjPi=dOU1_g0+c!QH+;tOIE#XsH-X`ASf_G3r|EG4u;&3e< zxJbZAtZSrK$Z@%Ge2|HUZ^rp6bt1sPQ&|iL-8xJXRZbGrq0VKR?YJU>rlP{5A|=|! zesb{ScHJJzTt6U6>&+&3wtjM)U>#?!aGc)2A)}Hy2c(YfD>hgawqs1 z9YCG>mu~IE+>NR4ooPgZx>P;u-t&9*d-vVefqizl<)TS9W@k4(Swt|uski#+8&;?~P(3@e!7mqN7) zb}b5igB=QnUHER>vr($kT$?2CNn0J|X>S111~Mn#7M5!px**LDe=t?Ues`TUb23~T zro)b_%(4!A8RzG3`$ubMM^a|@c4X4*&2VgkJTd91oFhB|8pb1h6vh7tT2-*t`Uhhp zwGBX)SXC9XDkMWNOG8t1N44E7(wE(X zjrEe5)w9$b4Mt{lm;fL(zo^Z7q%$~3wA@&?i;qfdptMoxu+41+5|hk=q_dyl)^3nO zQ9MCOIl8nP>Pvh94uS@I$-&!V%dEw|a)X!)R`4Z6kK?UO;VxO4#jTpy>y|nzIsz}? zWinUu_&#-o3CB<9i-)(Kh5r;kJjbo6851q8C^Nah6wQxSSyJs(DRwVPMYlaSXH~~O zs)44>%Mnjc*G7r%-V65?{`FwUYU%$#ur(vkP1lTvQjvoH0whErPLr=^V62oiBr_~^ zu32&{(t-8#SljxkR5~5x-8AnHl#hQZV#!vwN#r|wHrz+?<=!ZcV{00hg{}BKH diff --git a/env/lib/python3.7/site-packages/wheel/__pycache__/wheelfile.cpython-37.pyc b/env/lib/python3.7/site-packages/wheel/__pycache__/wheelfile.cpython-37.pyc deleted file mode 100644 index ca28521eac357d78a4fe471f22b4de9eb3430117..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5429 zcmZu#&2t;am7kt(3_$Qh6!jSg`IHe`RN}}=%EidCEh^F`rWDDsoLM`wL-c?gaxj2; z8lngdE~XPvmAH~aDhF3;3)sEv=A1*0`6Kq!*R9$r-*eJwf3JsMN(HES-LLy~Pj|of ze(&|XJ2Mj)_~rk3_LFND4dZ`_IsDnE+`v=(4TKwY@v55Jf-Viw%9uz zp6)G$OT9DUncms(Z0}rnu6I5>&y2*KT;P7y`mRh0TR|pnSm&8IkFrC|;m<%Uegc(AV~b79l1vIP#?Vum>lLmLE z7>$``z|U~+jDdPn&hAk;mlB;XP3~`-zh~l4yauT`Jk1s3xXyz!#!Gyi_+7|N7DyIr zwjUb#H*G_n+7873G1xUTu*!yB1^Q{7zc6z1Bcrr`_h)82`H#}RX?*g<*eRXKBA>ww zR69-jo0=b6V|VP0{n8VEFTKeUpPRCe&2eq)?Kb6^$=R|tWz0Bu?uzl~?+-CQH-2W^H$FlMYdXC) zvdMWzXWor@OFMy9H9<$~>DR>ggSM&aoqlg1lA-|O0hO|>zXPkgc6HQvIzG0Z&^y4J zk#}H70ztuOn``urt(^jN@PlGB`+ka<@{QKhv3}La8OrYEAHHC(e`!Mg1^dzHm7nLu za4_f#nQ(2du;Y!sNabelEeyL(a?0xQH4f+g}k2G@U(&<)-r2<07GbsF{biS66=;-C4VJH@d&7 zoL($Do8jyr7Dd7%atAHuCpj;6urlG(EN-_iASpaz{3uHER7R0-h;=qZe>e!6jzA%?R=&)zH&Nm7}V9#TDrY5O4PfNv`~#B)d9rDEA;%xS|+jsZ>r?cr-Rk z*OiqgJ1Y1v&W1@fz=84-A!>TDRRn1VIL0LFDw}qt>>h%T__h|PmZt11%@gr0G=)CR z92LVJ#$ZLNcBB~%u@yN7N%0y8%~IR|F<1ltMbRLx5FeazCKo6Z>@$VqqeP%pk&&+4mGrQ|>gqP21 zV_O;%U`Ti?%^vQ8KXx&YT+i=C&o)BqHp@ zmd^3ww3C}_qYJm8wpK4Kv>CTxrP}vem!6I#Sl?Cy(qs*j>7~G92he@6ck`8=K8?I`IVV=XyD{i)$I_ii{1V`RDwiDR* zaUUH((F8FLEF>@k*um%<$J!?cSYFBc9fY>)%O}Qaw0XgYTCm?NCyoDlc&`Dr} z+P%dJnv^xz;aW!A0IT=icEl~J|Cq>aB6o=V3lZ%)w6ve$DJah{*iwBCZsFpAd%z`p z97@w1HD5lIBa-C+ zDECB2w{-TXuRC_7wdGBGO>3o9x>FO8&C`5PdWhmHx?V3m%x@yXQIu}LgUUxMi1afY z^5T!BIcY+|?}B3ndW^{|@l%-eqm_roqt-(MGS&MpmL}f42%n;ec~bJP6v5y_*4pSB z9b`6=Ldm6X6_<3{5_5jU%YG}Bqu@9~wda(J?0h2;$|n33l%5@+|4y831JV$3luI<> z8t;^!1JE^2+gtrKS8iHpl=MWBQM0&AbC8)RHy*$?xpH<8sgib0n?w~+BAyE6^P~&t zO}Mf}zc0b3g6ySGwL^OYz*9^0YA+TY&5;$HbQnFqjtWJFuA&8Ez)ftnWcdW80N5sM z#l$lQz@@g)>0@g-G5!cb$zaHEw9!04MG_JLZ+>?Xz)4A*J+Y9rQ%a-r_py7NN=T

K7ZX9)jBy%bACg9vR*gDWo0NiME{ zJpfWQr;m}4^uP&}qwl!Yi922L3+3osr1A`X;2Jz>ZNJ4+kkOD^kYhC93IV&wPUaDZ zYCXEQQaVBVvG5fC1wt{n3g@W78+1|t7)5xu_7I&Vu5<7bqzl~U&gb^n1b`v+=rVn+ z^D)YtcvIsh4qC@+TySI!tpR)lSH3PTJ5Xa?HmWu`vxf@`e8+++tZ0@8pmY1iWWKcI zLdhnlNM)p2xi~q!uX6ycruv#iOXHxw*~awcxzmSvsMhf*Tn=~^EmQamy_0~(v+ zYZ!#jA(a+wWiEeL?4n8BATk0$pZ1<3O}(hCY$Q3d266pQ=r1T0vYpY_kNu&O(KYiZ z*dK{2nv6p{HH^Qo_L4HY108LvP)!MhvO2|MV(!;ls!vwl3j@zn%c)Ffyb0mS82YZm)W+f?G+^UYa)^e?e=iz+B|=QhCkw| zV!L@>$906*c7 z!3BRQz)$zm!dkSP?obW|mLo{B;#WlU3cP-?tYfE!a#JK?i~3H3&|NdjkVfLFSyZ>7 z8r_$MGR+D>4l3@En1?Sig#DG0wBiVu!rBgf$64-VsZQ9!pyFw`zVqmW?*s&qK83ay zk3gU9Ki-F{_uswyU{zeAK5YrK=YMt>%3rCD{5pM}(s8(fXnXwEmmXYmTDEPPxW)wD F{{vOHZvFrO diff --git a/env/lib/python3.7/site-packages/wheel/bdist_wheel.py b/env/lib/python3.7/site-packages/wheel/bdist_wheel.py deleted file mode 100644 index c79307b..0000000 --- a/env/lib/python3.7/site-packages/wheel/bdist_wheel.py +++ /dev/null @@ -1,372 +0,0 @@ -""" -Create a wheel (.whl) distribution. - -A wheel is a built archive format. -""" - -import os -import shutil -import sys -import re -from email.generator import Generator -from distutils.core import Command -from distutils.sysconfig import get_python_version -from distutils import log as logger -from glob import iglob -from shutil import rmtree -from warnings import warn - -import pkg_resources - -from .pep425tags import get_abbr_impl, get_impl_ver, get_abi_tag, get_platform -from .pkginfo import write_pkg_info -from .metadata import pkginfo_to_metadata -from .wheelfile import WheelFile -from . import pep425tags -from . import __version__ as wheel_version - - -safe_name = pkg_resources.safe_name -safe_version = pkg_resources.safe_version - -PY_LIMITED_API_PATTERN = r'cp3\d' - - -def safer_name(name): - return safe_name(name).replace('-', '_') - - -def safer_version(version): - return safe_version(version).replace('-', '_') - - -class bdist_wheel(Command): - - description = 'create a wheel distribution' - - user_options = [('bdist-dir=', 'b', - "temporary directory for creating the distribution"), - ('plat-name=', 'p', - "platform name to embed in generated filenames " - "(default: %s)" % get_platform()), - ('keep-temp', 'k', - "keep the pseudo-installation tree around after " + - "creating the distribution archive"), - ('dist-dir=', 'd', - "directory to put final built distributions in"), - ('skip-build', None, - "skip rebuilding everything (for testing/debugging)"), - ('relative', None, - "build the archive using relative paths " - "(default: false)"), - ('owner=', 'u', - "Owner name used when creating a tar file" - " [default: current user]"), - ('group=', 'g', - "Group name used when creating a tar file" - " [default: current group]"), - ('universal', None, - "make a universal wheel" - " (default: false)"), - ('python-tag=', None, - "Python implementation compatibility tag" - " (default: py%s)" % get_impl_ver()[0]), - ('build-number=', None, - "Build number for this particular version. " - "As specified in PEP-0427, this must start with a digit. " - "[default: None]"), - ('py-limited-api=', None, - "Python tag (cp32|cp33|cpNN) for abi3 wheel tag" - " (default: false)"), - ] - - boolean_options = ['keep-temp', 'skip-build', 'relative', 'universal'] - - def initialize_options(self): - self.bdist_dir = None - self.data_dir = None - self.plat_name = None - self.plat_tag = None - self.format = 'zip' - self.keep_temp = False - self.dist_dir = None - self.egginfo_dir = None - self.root_is_pure = None - self.skip_build = None - self.relative = False - self.owner = None - self.group = None - self.universal = False - self.python_tag = 'py' + get_impl_ver()[0] - self.build_number = None - self.py_limited_api = False - self.plat_name_supplied = False - - def finalize_options(self): - if self.bdist_dir is None: - bdist_base = self.get_finalized_command('bdist').bdist_base - self.bdist_dir = os.path.join(bdist_base, 'wheel') - - self.data_dir = self.wheel_dist_name + '.data' - self.plat_name_supplied = self.plat_name is not None - - need_options = ('dist_dir', 'plat_name', 'skip_build') - - self.set_undefined_options('bdist', - *zip(need_options, need_options)) - - self.root_is_pure = not (self.distribution.has_ext_modules() - or self.distribution.has_c_libraries()) - - if self.py_limited_api and not re.match(PY_LIMITED_API_PATTERN, self.py_limited_api): - raise ValueError("py-limited-api must match '%s'" % PY_LIMITED_API_PATTERN) - - # Support legacy [wheel] section for setting universal - wheel = self.distribution.get_option_dict('wheel') - if 'universal' in wheel: - # please don't define this in your global configs - logger.warn('The [wheel] section is deprecated. Use [bdist_wheel] instead.') - val = wheel['universal'][1].strip() - if val.lower() in ('1', 'true', 'yes'): - self.universal = True - - if self.build_number is not None and not self.build_number[:1].isdigit(): - raise ValueError("Build tag (build-number) must start with a digit.") - - @property - def wheel_dist_name(self): - """Return distribution full name with - replaced with _""" - components = (safer_name(self.distribution.get_name()), - safer_version(self.distribution.get_version())) - if self.build_number: - components += (self.build_number,) - return '-'.join(components) - - def get_tag(self): - # bdist sets self.plat_name if unset, we should only use it for purepy - # wheels if the user supplied it. - if self.plat_name_supplied: - plat_name = self.plat_name - elif self.root_is_pure: - plat_name = 'any' - else: - plat_name = self.plat_name or get_platform() - if plat_name in ('linux-x86_64', 'linux_x86_64') and sys.maxsize == 2147483647: - plat_name = 'linux_i686' - plat_name = plat_name.replace('-', '_').replace('.', '_') - - if self.root_is_pure: - if self.universal: - impl = 'py2.py3' - else: - impl = self.python_tag - tag = (impl, 'none', plat_name) - else: - impl_name = get_abbr_impl() - impl_ver = get_impl_ver() - impl = impl_name + impl_ver - # We don't work on CPython 3.1, 3.0. - if self.py_limited_api and (impl_name + impl_ver).startswith('cp3'): - impl = self.py_limited_api - abi_tag = 'abi3' - else: - abi_tag = str(get_abi_tag()).lower() - tag = (impl, abi_tag, plat_name) - supported_tags = pep425tags.get_supported( - supplied_platform=plat_name if self.plat_name_supplied else None) - # XXX switch to this alternate implementation for non-pure: - if not self.py_limited_api: - assert tag == supported_tags[0], "%s != %s" % (tag, supported_tags[0]) - assert tag in supported_tags, "would build wheel with unsupported tag {}".format(tag) - return tag - - def run(self): - build_scripts = self.reinitialize_command('build_scripts') - build_scripts.executable = 'python' - build_scripts.force = True - - build_ext = self.reinitialize_command('build_ext') - build_ext.inplace = False - - if not self.skip_build: - self.run_command('build') - - install = self.reinitialize_command('install', - reinit_subcommands=True) - install.root = self.bdist_dir - install.compile = False - install.skip_build = self.skip_build - install.warn_dir = False - - # A wheel without setuptools scripts is more cross-platform. - # Use the (undocumented) `no_ep` option to setuptools' - # install_scripts command to avoid creating entry point scripts. - install_scripts = self.reinitialize_command('install_scripts') - install_scripts.no_ep = True - - # Use a custom scheme for the archive, because we have to decide - # at installation time which scheme to use. - for key in ('headers', 'scripts', 'data', 'purelib', 'platlib'): - setattr(install, - 'install_' + key, - os.path.join(self.data_dir, key)) - - basedir_observed = '' - - if os.name == 'nt': - # win32 barfs if any of these are ''; could be '.'? - # (distutils.command.install:change_roots bug) - basedir_observed = os.path.normpath(os.path.join(self.data_dir, '..')) - self.install_libbase = self.install_lib = basedir_observed - - setattr(install, - 'install_purelib' if self.root_is_pure else 'install_platlib', - basedir_observed) - - logger.info("installing to %s", self.bdist_dir) - - self.run_command('install') - - impl_tag, abi_tag, plat_tag = self.get_tag() - archive_basename = "{}-{}-{}-{}".format(self.wheel_dist_name, impl_tag, abi_tag, plat_tag) - if not self.relative: - archive_root = self.bdist_dir - else: - archive_root = os.path.join( - self.bdist_dir, - self._ensure_relative(install.install_base)) - - self.set_undefined_options('install_egg_info', ('target', 'egginfo_dir')) - distinfo_dirname = '{}-{}.dist-info'.format( - safer_name(self.distribution.get_name()), - safer_version(self.distribution.get_version())) - distinfo_dir = os.path.join(self.bdist_dir, distinfo_dirname) - self.egg2dist(self.egginfo_dir, distinfo_dir) - - self.write_wheelfile(distinfo_dir) - - # Make the archive - if not os.path.exists(self.dist_dir): - os.makedirs(self.dist_dir) - - wheel_path = os.path.join(self.dist_dir, archive_basename + '.whl') - with WheelFile(wheel_path, 'w') as wf: - wf.write_files(archive_root) - - # Add to 'Distribution.dist_files' so that the "upload" command works - getattr(self.distribution, 'dist_files', []).append( - ('bdist_wheel', get_python_version(), wheel_path)) - - if not self.keep_temp: - logger.info('removing %s', self.bdist_dir) - if not self.dry_run: - rmtree(self.bdist_dir) - - def write_wheelfile(self, wheelfile_base, generator='bdist_wheel (' + wheel_version + ')'): - from email.message import Message - msg = Message() - msg['Wheel-Version'] = '1.0' # of the spec - msg['Generator'] = generator - msg['Root-Is-Purelib'] = str(self.root_is_pure).lower() - if self.build_number is not None: - msg['Build'] = self.build_number - - # Doesn't work for bdist_wininst - impl_tag, abi_tag, plat_tag = self.get_tag() - for impl in impl_tag.split('.'): - for abi in abi_tag.split('.'): - for plat in plat_tag.split('.'): - msg['Tag'] = '-'.join((impl, abi, plat)) - - wheelfile_path = os.path.join(wheelfile_base, 'WHEEL') - logger.info('creating %s', wheelfile_path) - with open(wheelfile_path, 'w') as f: - Generator(f, maxheaderlen=0).flatten(msg) - - def _ensure_relative(self, path): - # copied from dir_util, deleted - drive, path = os.path.splitdrive(path) - if path[0:1] == os.sep: - path = drive + path[1:] - return path - - @property - def license_paths(self): - metadata = self.distribution.get_option_dict('metadata') - files = set() - patterns = sorted({ - option for option in metadata.get('license_files', ('', ''))[1].split() - }) - - if 'license_file' in metadata: - warn('The "license_file" option is deprecated. Use "license_files" instead.', - DeprecationWarning) - files.add(metadata['license_file'][1]) - - if 'license_file' not in metadata and 'license_files' not in metadata: - patterns = ('LICEN[CS]E*', 'COPYING*', 'NOTICE*', 'AUTHORS*') - - for pattern in patterns: - for path in iglob(pattern): - if path not in files and os.path.isfile(path): - logger.info('adding license file "%s" (matched pattern "%s")', path, pattern) - files.add(path) - - return files - - def egg2dist(self, egginfo_path, distinfo_path): - """Convert an .egg-info directory into a .dist-info directory""" - def adios(p): - """Appropriately delete directory, file or link.""" - if os.path.exists(p) and not os.path.islink(p) and os.path.isdir(p): - shutil.rmtree(p) - elif os.path.exists(p): - os.unlink(p) - - adios(distinfo_path) - - if not os.path.exists(egginfo_path): - # There is no egg-info. This is probably because the egg-info - # file/directory is not named matching the distribution name used - # to name the archive file. Check for this case and report - # accordingly. - import glob - pat = os.path.join(os.path.dirname(egginfo_path), '*.egg-info') - possible = glob.glob(pat) - err = "Egg metadata expected at %s but not found" % (egginfo_path,) - if possible: - alt = os.path.basename(possible[0]) - err += " (%s found - possible misnamed archive file?)" % (alt,) - - raise ValueError(err) - - if os.path.isfile(egginfo_path): - # .egg-info is a single file - pkginfo_path = egginfo_path - pkg_info = pkginfo_to_metadata(egginfo_path, egginfo_path) - os.mkdir(distinfo_path) - else: - # .egg-info is a directory - pkginfo_path = os.path.join(egginfo_path, 'PKG-INFO') - pkg_info = pkginfo_to_metadata(egginfo_path, pkginfo_path) - - # ignore common egg metadata that is useless to wheel - shutil.copytree(egginfo_path, distinfo_path, - ignore=lambda x, y: {'PKG-INFO', 'requires.txt', 'SOURCES.txt', - 'not-zip-safe'} - ) - - # delete dependency_links if it is only whitespace - dependency_links_path = os.path.join(distinfo_path, 'dependency_links.txt') - with open(dependency_links_path, 'r') as dependency_links_file: - dependency_links = dependency_links_file.read().strip() - if not dependency_links: - adios(dependency_links_path) - - write_pkg_info(os.path.join(distinfo_path, 'METADATA'), pkg_info) - - for license_path in self.license_paths: - filename = os.path.basename(license_path) - shutil.copy(license_path, os.path.join(distinfo_path, filename)) - - adios(egginfo_path) diff --git a/env/lib/python3.7/site-packages/wheel/cli/__init__.py b/env/lib/python3.7/site-packages/wheel/cli/__init__.py deleted file mode 100644 index 95740bf..0000000 --- a/env/lib/python3.7/site-packages/wheel/cli/__init__.py +++ /dev/null @@ -1,88 +0,0 @@ -""" -Wheel command-line utility. -""" - -from __future__ import print_function - -import argparse -import os -import sys - - -def require_pkgresources(name): - try: - import pkg_resources # noqa: F401 - except ImportError: - raise RuntimeError("'{0}' needs pkg_resources (part of setuptools).".format(name)) - - -class WheelError(Exception): - pass - - -def unpack_f(args): - from .unpack import unpack - unpack(args.wheelfile, args.dest) - - -def pack_f(args): - from .pack import pack - pack(args.directory, args.dest_dir, args.build_number) - - -def convert_f(args): - from .convert import convert - convert(args.files, args.dest_dir, args.verbose) - - -def version_f(args): - from .. import __version__ - print("wheel %s" % __version__) - - -def parser(): - p = argparse.ArgumentParser() - s = p.add_subparsers(help="commands") - - unpack_parser = s.add_parser('unpack', help='Unpack wheel') - unpack_parser.add_argument('--dest', '-d', help='Destination directory', - default='.') - unpack_parser.add_argument('wheelfile', help='Wheel file') - unpack_parser.set_defaults(func=unpack_f) - - repack_parser = s.add_parser('pack', help='Repack wheel') - repack_parser.add_argument('directory', help='Root directory of the unpacked wheel') - repack_parser.add_argument('--dest-dir', '-d', default=os.path.curdir, - help="Directory to store the wheel (default %(default)s)") - repack_parser.add_argument('--build-number', help="Build tag to use in the wheel name") - repack_parser.set_defaults(func=pack_f) - - convert_parser = s.add_parser('convert', help='Convert egg or wininst to wheel') - convert_parser.add_argument('files', nargs='*', help='Files to convert') - convert_parser.add_argument('--dest-dir', '-d', default=os.path.curdir, - help="Directory to store wheels (default %(default)s)") - convert_parser.add_argument('--verbose', '-v', action='store_true') - convert_parser.set_defaults(func=convert_f) - - version_parser = s.add_parser('version', help='Print version and exit') - version_parser.set_defaults(func=version_f) - - help_parser = s.add_parser('help', help='Show this help') - help_parser.set_defaults(func=lambda args: p.print_help()) - - return p - - -def main(): - p = parser() - args = p.parse_args() - if not hasattr(args, 'func'): - p.print_help() - else: - try: - args.func(args) - return 0 - except WheelError as e: - print(e, file=sys.stderr) - - return 1 diff --git a/env/lib/python3.7/site-packages/wheel/cli/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/wheel/cli/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 9666108f3b7264008bb9497866c776c6344fcf8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3000 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 E0qx<9asU7T diff --git a/env/lib/python3.7/site-packages/wheel/cli/__pycache__/pack.cpython-37.pyc b/env/lib/python3.7/site-packages/wheel/cli/__pycache__/pack.cpython-37.pyc deleted file mode 100644 index 768bc82bd68a6d4610068c9db01689cb2b794802..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2458 zcmbtW-ESL35Z}EIe_YN^nwBQv>4X5qlsK(~KnhWcN>fn*DI}GOPA%5OyN<6t-(7dt z4ROyeq!N8W75oLZ;Dx^kXctfI(>J||;(lN{5bt*pX6rp$iih)8Q-gV>)yTOQeO%DuuN~J|ja{ftH8Wk@uVw4y%qq!;24xCFX&CQk0D5 za#5Cl!s&A(2Twwc_XzX9C%fbaqUKnQ)j_t5vS4QgIP>Q?Rp2a~<9MtB0k|;oiprRp zu{s^SF+H%s&bf(I1!aq%)h*`6*4P^Q$}fC&@z{Ft@vx?9>=Nwx@Z~$~@~;*ps{U|( zv@j-=6t&R>M2C_yme$zPF(!)-pbacw}+JQh%>S8@?v zc@@Y3DaeD>A%#HFk!7e2Nk$=%R5;2RxiE)WL4UIzJA33W(kN*wliJB6)zxk+!949e z%;Hr0H*fFVZQb6vb*Htvt=(Rv+TDhwt>#s2byBRyS78z^=svl&u6p@;9_LVOQbkF! z#vUJ~KV9o|*A2E)+D_tijCM0WI`K9WD9(1)%eR)$2M0)rSah&#BsP<*9VK$BITL${ zz7MW^3oykwgnE_$uTYA)3_4jqWsp6=)8XKQo$P;z2|PF~PkYJVWpL_7i zRUiiJU`Pu(f@U~@bp%}mYQtI~BWp}1AUEuRdpA1R2u^4qF2IKkTYCVIQ1UQF)McK; zN|%IGBF-C@@Igj93FMpsc0%TXDHedBYKf6Ak-?YXn#pOXC5f40Jf4)o=a|812HA6( z!P9I%Q%UIU&VPIOE@9ruA%Djz12H$fAi4`;yBX?T!5cMViB6r@v^l6g9j-kc zHV?arriX*&Nn?!DgK2;w3EA6hHZ|UkHcy$h?tI-?6eT!Cm$7iLSnY(T0`DSO|{ zRN!4M=8)qah^(J$C(A*mjBLF0bV+7HaVD_Zv}>+iZObDG8;WIprQJ@_m)&sgP{fM2 zuqDbyUErmuD{R`tw7=hv6V^)my?rjiI^MD^yk)V&$*^{A9r~DQEx48?v^-5a+QGC9 z-ME)0GAu{?G4APVoB1?$r9J#%SKImE%@u9`hvGw0z<0HnQWrc z3Er0A0xK`98grV^#SH4<{A6t?A~iv^j6DrkCK#yVOa_`6S(1J{9 zLMh%^!4j`I{lpiZ@QYv?CL#Q_MJQTdXwnkw73p;@z?bx>+pBc0>~K`8%;u#!ynt+| z?;MS#EDrKQIvQuFL<)dAz)yh9dk~f^$T|IXuw)B1p(`fnnl3%-P5f1`pbKx!mc9)I zTeTMcnj)aDj1t?PbXL)tP_kgF9sHr>h=||?c}d<9un*6%oB)8f&VIj9RhoU|DL+9- zaTIZ&1|H8!Wu>zGBrgj7LGrpWm4e%n&xJI0*`KR)Dwq57&r&b%U1SSnz?Xu#qBbCAV?>oUAjlF(1>1R`X*?4RO15n+AbQx#@brT z;ZWmlx>jjoEKTpgOJ4?&bede)gr+S`ga+S#;s*M*A52S87xE#6muZ9OvNmnAuJ;ED Csr(!O diff --git a/env/lib/python3.7/site-packages/wheel/cli/convert.py b/env/lib/python3.7/site-packages/wheel/cli/convert.py deleted file mode 100644 index f1a793a..0000000 --- a/env/lib/python3.7/site-packages/wheel/cli/convert.py +++ /dev/null @@ -1,269 +0,0 @@ -import os.path -import re -import shutil -import sys -import tempfile -import zipfile -from distutils import dist -from glob import iglob - -from ..bdist_wheel import bdist_wheel -from ..wheelfile import WheelFile -from . import WheelError, require_pkgresources - -egg_info_re = re.compile(r''' - (?P.+?)-(?P.+?) - (-(?Ppy\d\.\d) - (-(?P.+?))? - )?.egg$''', re.VERBOSE) - - -class _bdist_wheel_tag(bdist_wheel): - # allow the client to override the default generated wheel tag - # The default bdist_wheel implementation uses python and abi tags - # of the running python process. This is not suitable for - # generating/repackaging prebuild binaries. - - full_tag_supplied = False - full_tag = None # None or a (pytag, soabitag, plattag) triple - - def get_tag(self): - if self.full_tag_supplied and self.full_tag is not None: - return self.full_tag - else: - return bdist_wheel.get_tag(self) - - -def egg2wheel(egg_path, dest_dir): - filename = os.path.basename(egg_path) - match = egg_info_re.match(filename) - if not match: - raise WheelError('Invalid egg file name: {}'.format(filename)) - - egg_info = match.groupdict() - dir = tempfile.mkdtemp(suffix="_e2w") - if os.path.isfile(egg_path): - # assume we have a bdist_egg otherwise - with zipfile.ZipFile(egg_path) as egg: - egg.extractall(dir) - else: - # support buildout-style installed eggs directories - for pth in os.listdir(egg_path): - src = os.path.join(egg_path, pth) - if os.path.isfile(src): - shutil.copy2(src, dir) - else: - shutil.copytree(src, os.path.join(dir, pth)) - - pyver = egg_info['pyver'] - if pyver: - pyver = egg_info['pyver'] = pyver.replace('.', '') - - arch = (egg_info['arch'] or 'any').replace('.', '_').replace('-', '_') - - # assume all binary eggs are for CPython - abi = 'cp' + pyver[2:] if arch != 'any' else 'none' - - root_is_purelib = egg_info['arch'] is None - if root_is_purelib: - bw = bdist_wheel(dist.Distribution()) - else: - bw = _bdist_wheel_tag(dist.Distribution()) - - bw.root_is_pure = root_is_purelib - bw.python_tag = pyver - bw.plat_name_supplied = True - bw.plat_name = egg_info['arch'] or 'any' - if not root_is_purelib: - bw.full_tag_supplied = True - bw.full_tag = (pyver, abi, arch) - - dist_info_dir = os.path.join(dir, '{name}-{ver}.dist-info'.format(**egg_info)) - bw.egg2dist(os.path.join(dir, 'EGG-INFO'), dist_info_dir) - bw.write_wheelfile(dist_info_dir, generator='egg2wheel') - wheel_name = '{name}-{ver}-{pyver}-{}-{}.whl'.format(abi, arch, **egg_info) - with WheelFile(os.path.join(dest_dir, wheel_name), 'w') as wf: - wf.write_files(dir) - - shutil.rmtree(dir) - - -def parse_wininst_info(wininfo_name, egginfo_name): - """Extract metadata from filenames. - - Extracts the 4 metadataitems needed (name, version, pyversion, arch) from - the installer filename and the name of the egg-info directory embedded in - the zipfile (if any). - - The egginfo filename has the format:: - - name-ver(-pyver)(-arch).egg-info - - The installer filename has the format:: - - name-ver.arch(-pyver).exe - - Some things to note: - - 1. The installer filename is not definitive. An installer can be renamed - and work perfectly well as an installer. So more reliable data should - be used whenever possible. - 2. The egg-info data should be preferred for the name and version, because - these come straight from the distutils metadata, and are mandatory. - 3. The pyver from the egg-info data should be ignored, as it is - constructed from the version of Python used to build the installer, - which is irrelevant - the installer filename is correct here (even to - the point that when it's not there, any version is implied). - 4. The architecture must be taken from the installer filename, as it is - not included in the egg-info data. - 5. Architecture-neutral installers still have an architecture because the - installer format itself (being executable) is architecture-specific. We - should therefore ignore the architecture if the content is pure-python. - """ - - egginfo = None - if egginfo_name: - egginfo = egg_info_re.search(egginfo_name) - if not egginfo: - raise ValueError("Egg info filename %s is not valid" % (egginfo_name,)) - - # Parse the wininst filename - # 1. Distribution name (up to the first '-') - w_name, sep, rest = wininfo_name.partition('-') - if not sep: - raise ValueError("Installer filename %s is not valid" % (wininfo_name,)) - - # Strip '.exe' - rest = rest[:-4] - # 2. Python version (from the last '-', must start with 'py') - rest2, sep, w_pyver = rest.rpartition('-') - if sep and w_pyver.startswith('py'): - rest = rest2 - w_pyver = w_pyver.replace('.', '') - else: - # Not version specific - use py2.py3. While it is possible that - # pure-Python code is not compatible with both Python 2 and 3, there - # is no way of knowing from the wininst format, so we assume the best - # here (the user can always manually rename the wheel to be more - # restrictive if needed). - w_pyver = 'py2.py3' - # 3. Version and architecture - w_ver, sep, w_arch = rest.rpartition('.') - if not sep: - raise ValueError("Installer filename %s is not valid" % (wininfo_name,)) - - if egginfo: - w_name = egginfo.group('name') - w_ver = egginfo.group('ver') - - return {'name': w_name, 'ver': w_ver, 'arch': w_arch, 'pyver': w_pyver} - - -def wininst2wheel(path, dest_dir): - with zipfile.ZipFile(path) as bdw: - # Search for egg-info in the archive - egginfo_name = None - for filename in bdw.namelist(): - if '.egg-info' in filename: - egginfo_name = filename - break - - info = parse_wininst_info(os.path.basename(path), egginfo_name) - - root_is_purelib = True - for zipinfo in bdw.infolist(): - if zipinfo.filename.startswith('PLATLIB'): - root_is_purelib = False - break - if root_is_purelib: - paths = {'purelib': ''} - else: - paths = {'platlib': ''} - - dist_info = "%(name)s-%(ver)s" % info - datadir = "%s.data/" % dist_info - - # rewrite paths to trick ZipFile into extracting an egg - # XXX grab wininst .ini - between .exe, padding, and first zip file. - members = [] - egginfo_name = '' - for zipinfo in bdw.infolist(): - key, basename = zipinfo.filename.split('/', 1) - key = key.lower() - basepath = paths.get(key, None) - if basepath is None: - basepath = datadir + key.lower() + '/' - oldname = zipinfo.filename - newname = basepath + basename - zipinfo.filename = newname - del bdw.NameToInfo[oldname] - bdw.NameToInfo[newname] = zipinfo - # Collect member names, but omit '' (from an entry like "PLATLIB/" - if newname: - members.append(newname) - # Remember egg-info name for the egg2dist call below - if not egginfo_name: - if newname.endswith('.egg-info'): - egginfo_name = newname - elif '.egg-info/' in newname: - egginfo_name, sep, _ = newname.rpartition('/') - dir = tempfile.mkdtemp(suffix="_b2w") - bdw.extractall(dir, members) - - # egg2wheel - abi = 'none' - pyver = info['pyver'] - arch = (info['arch'] or 'any').replace('.', '_').replace('-', '_') - # Wininst installers always have arch even if they are not - # architecture-specific (because the format itself is). - # So, assume the content is architecture-neutral if root is purelib. - if root_is_purelib: - arch = 'any' - # If the installer is architecture-specific, it's almost certainly also - # CPython-specific. - if arch != 'any': - pyver = pyver.replace('py', 'cp') - wheel_name = '-'.join((dist_info, pyver, abi, arch)) - if root_is_purelib: - bw = bdist_wheel(dist.Distribution()) - else: - bw = _bdist_wheel_tag(dist.Distribution()) - - bw.root_is_pure = root_is_purelib - bw.python_tag = pyver - bw.plat_name_supplied = True - bw.plat_name = info['arch'] or 'any' - - if not root_is_purelib: - bw.full_tag_supplied = True - bw.full_tag = (pyver, abi, arch) - - dist_info_dir = os.path.join(dir, '%s.dist-info' % dist_info) - bw.egg2dist(os.path.join(dir, egginfo_name), dist_info_dir) - bw.write_wheelfile(dist_info_dir, generator='wininst2wheel') - - wheel_path = os.path.join(dest_dir, wheel_name) - with WheelFile(wheel_path, 'w') as wf: - wf.write_files(dir) - - shutil.rmtree(dir) - - -def convert(files, dest_dir, verbose): - # Only support wheel convert if pkg_resources is present - require_pkgresources('wheel convert') - - for pat in files: - for installer in iglob(pat): - if os.path.splitext(installer)[1] == '.egg': - conv = egg2wheel - else: - conv = wininst2wheel - - if verbose: - print("{}... ".format(installer)) - sys.stdout.flush() - - conv(installer, dest_dir) - if verbose: - print("OK") diff --git a/env/lib/python3.7/site-packages/wheel/cli/pack.py b/env/lib/python3.7/site-packages/wheel/cli/pack.py deleted file mode 100644 index af6e81c..0000000 --- a/env/lib/python3.7/site-packages/wheel/cli/pack.py +++ /dev/null @@ -1,58 +0,0 @@ -from __future__ import print_function - -import os.path -import re -import sys - -from wheel.cli import WheelError -from wheel.wheelfile import WheelFile - -DIST_INFO_RE = re.compile(r"^(?P(?P.+?)-(?P\d.*?))\.dist-info$") - - -def pack(directory, dest_dir, build_number): - """Repack a previously unpacked wheel directory into a new wheel file. - - The .dist-info/WHEEL file must contain one or more tags so that the target - wheel file name can be determined. - - :param directory: The unpacked wheel directory - :param dest_dir: Destination directory (defaults to the current directory) - """ - # Find the .dist-info directory - dist_info_dirs = [fn for fn in os.listdir(directory) - if os.path.isdir(os.path.join(directory, fn)) and DIST_INFO_RE.match(fn)] - if len(dist_info_dirs) > 1: - raise WheelError('Multiple .dist-info directories found in {}'.format(directory)) - elif not dist_info_dirs: - raise WheelError('No .dist-info directories found in {}'.format(directory)) - - # Determine the target wheel filename - dist_info_dir = dist_info_dirs[0] - name_version = DIST_INFO_RE.match(dist_info_dir).group('namever') - - # Add the build number if specific - if build_number: - name_version += '-' + build_number - - # Read the tags from .dist-info/WHEEL - with open(os.path.join(directory, dist_info_dir, 'WHEEL')) as f: - tags = [line.split(' ')[1].rstrip() for line in f if line.startswith('Tag: ')] - if not tags: - raise WheelError('No tags present in {}/WHEEL; cannot determine target wheel filename' - .format(dist_info_dir)) - - # Reassemble the tags for the wheel file - impls = sorted({tag.split('-')[0] for tag in tags}) - abivers = sorted({tag.split('-')[1] for tag in tags}) - platforms = sorted({tag.split('-')[2] for tag in tags}) - tagline = '-'.join(['.'.join(impls), '.'.join(abivers), '.'.join(platforms)]) - - # Repack the wheel - wheel_path = os.path.join(dest_dir, '{}-{}.whl'.format(name_version, tagline)) - with WheelFile(wheel_path, 'w') as wf: - print("Repacking wheel as {}...".format(wheel_path), end='') - sys.stdout.flush() - wf.write_files(directory) - - print('OK') diff --git a/env/lib/python3.7/site-packages/wheel/cli/unpack.py b/env/lib/python3.7/site-packages/wheel/cli/unpack.py deleted file mode 100644 index 2e9857a..0000000 --- a/env/lib/python3.7/site-packages/wheel/cli/unpack.py +++ /dev/null @@ -1,25 +0,0 @@ -from __future__ import print_function - -import os.path -import sys - -from ..wheelfile import WheelFile - - -def unpack(path, dest='.'): - """Unpack a wheel. - - Wheel content will be unpacked to {dest}/{name}-{ver}, where {name} - is the package name and {ver} its version. - - :param path: The path to the wheel. - :param dest: Destination directory (default to current directory). - """ - with WheelFile(path) as wf: - namever = wf.parsed_filename.group('namever') - destination = os.path.join(dest, namever) - print("Unpacking to: {}...".format(destination), end='') - sys.stdout.flush() - wf.extractall(destination) - - print('OK') diff --git a/env/lib/python3.7/site-packages/wheel/metadata.py b/env/lib/python3.7/site-packages/wheel/metadata.py deleted file mode 100644 index ab0c07e..0000000 --- a/env/lib/python3.7/site-packages/wheel/metadata.py +++ /dev/null @@ -1,141 +0,0 @@ -""" -Tools for converting old- to new-style metadata. -""" - -import os.path -import re -import textwrap - -import pkg_resources - -from .pkginfo import read_pkg_info - -# Wheel itself is probably the only program that uses non-extras markers -# in METADATA/PKG-INFO. Support its syntax with the extra at the end only. -EXTRA_RE = re.compile( - r"""^(?P.*?)(;\s*(?P.*?)(extra == '(?P.*?)')?)$""") - - -def requires_to_requires_dist(requirement): - """Return the version specifier for a requirement in PEP 345/566 fashion.""" - if getattr(requirement, 'url', None): - return " @ " + requirement.url - - requires_dist = [] - for op, ver in requirement.specs: - requires_dist.append(op + ver) - if not requires_dist: - return '' - return " (%s)" % ','.join(sorted(requires_dist)) - - -def convert_requirements(requirements): - """Yield Requires-Dist: strings for parsed requirements strings.""" - for req in requirements: - parsed_requirement = pkg_resources.Requirement.parse(req) - spec = requires_to_requires_dist(parsed_requirement) - extras = ",".join(sorted(parsed_requirement.extras)) - if extras: - extras = "[%s]" % extras - yield (parsed_requirement.project_name + extras + spec) - - -def generate_requirements(extras_require): - """ - Convert requirements from a setup()-style dictionary to ('Requires-Dist', 'requirement') - and ('Provides-Extra', 'extra') tuples. - - extras_require is a dictionary of {extra: [requirements]} as passed to setup(), - using the empty extra {'': [requirements]} to hold install_requires. - """ - for extra, depends in extras_require.items(): - condition = '' - extra = extra or '' - if ':' in extra: # setuptools extra:condition syntax - extra, condition = extra.split(':', 1) - - extra = pkg_resources.safe_extra(extra) - if extra: - yield 'Provides-Extra', extra - if condition: - condition = "(" + condition + ") and " - condition += "extra == '%s'" % extra - - if condition: - condition = ' ; ' + condition - - for new_req in convert_requirements(depends): - yield 'Requires-Dist', new_req + condition - - -def pkginfo_to_metadata(egg_info_path, pkginfo_path): - """ - Convert .egg-info directory with PKG-INFO to the Metadata 2.1 format - """ - pkg_info = read_pkg_info(pkginfo_path) - pkg_info.replace_header('Metadata-Version', '2.1') - # Those will be regenerated from `requires.txt`. - del pkg_info['Provides-Extra'] - del pkg_info['Requires-Dist'] - requires_path = os.path.join(egg_info_path, 'requires.txt') - if os.path.exists(requires_path): - with open(requires_path) as requires_file: - requires = requires_file.read() - - parsed_requirements = sorted(pkg_resources.split_sections(requires), - key=lambda x: x[0] or '') - for extra, reqs in parsed_requirements: - for key, value in generate_requirements({extra: reqs}): - if (key, value) not in pkg_info.items(): - pkg_info[key] = value - - description = pkg_info['Description'] - if description: - pkg_info.set_payload(dedent_description(pkg_info)) - del pkg_info['Description'] - - return pkg_info - - -def pkginfo_unicode(pkg_info, field): - """Hack to coax Unicode out of an email Message() - Python 3.3+""" - text = pkg_info[field] - field = field.lower() - if not isinstance(text, str): - if not hasattr(pkg_info, 'raw_items'): # Python 3.2 - return str(text) - for item in pkg_info.raw_items(): - if item[0].lower() == field: - text = item[1].encode('ascii', 'surrogateescape') \ - .decode('utf-8') - break - - return text - - -def dedent_description(pkg_info): - """ - Dedent and convert pkg_info['Description'] to Unicode. - """ - description = pkg_info['Description'] - - # Python 3 Unicode handling, sorta. - surrogates = False - if not isinstance(description, str): - surrogates = True - description = pkginfo_unicode(pkg_info, 'Description') - - description_lines = description.splitlines() - description_dedent = '\n'.join( - # if the first line of long_description is blank, - # the first line here will be indented. - (description_lines[0].lstrip(), - textwrap.dedent('\n'.join(description_lines[1:])), - '\n')) - - if surrogates: - description_dedent = description_dedent \ - .encode("utf8") \ - .decode("ascii", "surrogateescape") - - return description_dedent diff --git a/env/lib/python3.7/site-packages/wheel/pep425tags.py b/env/lib/python3.7/site-packages/wheel/pep425tags.py deleted file mode 100644 index 13b5073..0000000 --- a/env/lib/python3.7/site-packages/wheel/pep425tags.py +++ /dev/null @@ -1,185 +0,0 @@ -"""Generate and work with PEP 425 Compatibility Tags.""" - -import distutils.util -import platform -import sys -import sysconfig -import warnings - -try: - from importlib.machinery import get_all_suffixes -except ImportError: - from imp import get_suffixes as get_all_suffixes - - -def get_config_var(var): - try: - return sysconfig.get_config_var(var) - except IOError as e: # pip Issue #1074 - warnings.warn("{0}".format(e), RuntimeWarning) - return None - - -def get_abbr_impl(): - """Return abbreviated implementation name.""" - impl = platform.python_implementation() - if impl == 'PyPy': - return 'pp' - elif impl == 'Jython': - return 'jy' - elif impl == 'IronPython': - return 'ip' - elif impl == 'CPython': - return 'cp' - - raise LookupError('Unknown Python implementation: ' + impl) - - -def get_impl_ver(): - """Return implementation version.""" - impl_ver = get_config_var("py_version_nodot") - if not impl_ver or get_abbr_impl() == 'pp': - impl_ver = ''.join(map(str, get_impl_version_info())) - return impl_ver - - -def get_impl_version_info(): - """Return sys.version_info-like tuple for use in decrementing the minor - version.""" - if get_abbr_impl() == 'pp': - # as per https://github.com/pypa/pip/issues/2882 - return (sys.version_info[0], sys.pypy_version_info.major, - sys.pypy_version_info.minor) - else: - return sys.version_info[0], sys.version_info[1] - - -def get_flag(var, fallback, expected=True, warn=True): - """Use a fallback method for determining SOABI flags if the needed config - var is unset or unavailable.""" - val = get_config_var(var) - if val is None: - if warn: - warnings.warn("Config variable '{0}' is unset, Python ABI tag may " - "be incorrect".format(var), RuntimeWarning, 2) - return fallback() - return val == expected - - -def get_abi_tag(): - """Return the ABI tag based on SOABI (if available) or emulate SOABI - (CPython 2, PyPy).""" - soabi = get_config_var('SOABI') - impl = get_abbr_impl() - if not soabi and impl in ('cp', 'pp') and hasattr(sys, 'maxunicode'): - d = '' - m = '' - u = '' - if get_flag('Py_DEBUG', - lambda: hasattr(sys, 'gettotalrefcount'), - warn=(impl == 'cp')): - d = 'd' - if get_flag('WITH_PYMALLOC', - lambda: impl == 'cp', - warn=(impl == 'cp')): - m = 'm' - if get_flag('Py_UNICODE_SIZE', - lambda: sys.maxunicode == 0x10ffff, - expected=4, - warn=(impl == 'cp' and - sys.version_info < (3, 3))) \ - and sys.version_info < (3, 3): - u = 'u' - abi = '%s%s%s%s%s' % (impl, get_impl_ver(), d, m, u) - elif soabi and soabi.startswith('cpython-'): - abi = 'cp' + soabi.split('-')[1] - elif soabi: - abi = soabi.replace('.', '_').replace('-', '_') - else: - abi = None - return abi - - -def get_platform(): - """Return our platform name 'win32', 'linux_x86_64'""" - # XXX remove distutils dependency - result = distutils.util.get_platform().replace('.', '_').replace('-', '_') - if result == "linux_x86_64" and sys.maxsize == 2147483647: - # pip pull request #3497 - result = "linux_i686" - return result - - -def get_supported(versions=None, supplied_platform=None): - """Return a list of supported tags for each version specified in - `versions`. - - :param versions: a list of string versions, of the form ["33", "32"], - or None. The first version will be assumed to support our ABI. - """ - supported = [] - - # Versions must be given with respect to the preference - if versions is None: - versions = [] - version_info = get_impl_version_info() - major = version_info[:-1] - # Support all previous minor Python versions. - for minor in range(version_info[-1], -1, -1): - versions.append(''.join(map(str, major + (minor,)))) - - impl = get_abbr_impl() - - abis = [] - - abi = get_abi_tag() - if abi: - abis[0:0] = [abi] - - abi3s = set() - for suffix in get_all_suffixes(): - if suffix[0].startswith('.abi'): - abi3s.add(suffix[0].split('.', 2)[1]) - - abis.extend(sorted(list(abi3s))) - - abis.append('none') - - platforms = [] - if supplied_platform: - platforms.append(supplied_platform) - platforms.append(get_platform()) - - # Current version, current API (built specifically for our Python): - for abi in abis: - for arch in platforms: - supported.append(('%s%s' % (impl, versions[0]), abi, arch)) - - # abi3 modules compatible with older version of Python - for version in versions[1:]: - # abi3 was introduced in Python 3.2 - if version in ('31', '30'): - break - for abi in abi3s: # empty set if not Python 3 - for arch in platforms: - supported.append(("%s%s" % (impl, version), abi, arch)) - - # No abi / arch, but requires our implementation: - for i, version in enumerate(versions): - supported.append(('%s%s' % (impl, version), 'none', 'any')) - if i == 0: - # Tagged specifically as being cross-version compatible - # (with just the major version specified) - supported.append(('%s%s' % (impl, versions[0][0]), 'none', 'any')) - - # Major Python version + platform; e.g. binaries not using the Python API - for arch in platforms: - supported.append(('py%s' % (versions[0][0]), 'none', arch)) - - # No abi / arch, generic Python - for i, version in enumerate(versions): - supported.append(('py%s' % (version,), 'none', 'any')) - if i == 0: - supported.append(('py%s' % (version[0]), 'none', 'any')) - - return supported diff --git a/env/lib/python3.7/site-packages/wheel/pkginfo.py b/env/lib/python3.7/site-packages/wheel/pkginfo.py deleted file mode 100644 index 115be45..0000000 --- a/env/lib/python3.7/site-packages/wheel/pkginfo.py +++ /dev/null @@ -1,43 +0,0 @@ -"""Tools for reading and writing PKG-INFO / METADATA without caring -about the encoding.""" - -from email.parser import Parser - -try: - unicode - _PY3 = False -except NameError: - _PY3 = True - -if not _PY3: - from email.generator import Generator - - def read_pkg_info_bytes(bytestr): - return Parser().parsestr(bytestr) - - def read_pkg_info(path): - with open(path, "r") as headers: - message = Parser().parse(headers) - return message - - def write_pkg_info(path, message): - with open(path, 'w') as metadata: - Generator(metadata, mangle_from_=False, maxheaderlen=0).flatten(message) -else: - from email.generator import BytesGenerator - - def read_pkg_info_bytes(bytestr): - headers = bytestr.decode(encoding="ascii", errors="surrogateescape") - message = Parser().parsestr(headers) - return message - - def read_pkg_info(path): - with open(path, "r", - encoding="ascii", - errors="surrogateescape") as headers: - message = Parser().parse(headers) - return message - - def write_pkg_info(path, message): - with open(path, "wb") as out: - BytesGenerator(out, mangle_from_=False, maxheaderlen=0).flatten(message) diff --git a/env/lib/python3.7/site-packages/wheel/util.py b/env/lib/python3.7/site-packages/wheel/util.py deleted file mode 100644 index 0afb54a..0000000 --- a/env/lib/python3.7/site-packages/wheel/util.py +++ /dev/null @@ -1,46 +0,0 @@ -import base64 -import io -import sys - - -if sys.version_info[0] < 3: - text_type = unicode # noqa: F821 - - StringIO = io.BytesIO - - def native(s, encoding='utf-8'): - if isinstance(s, unicode): - return s.encode(encoding) - return s -else: - text_type = str - - StringIO = io.StringIO - - def native(s, encoding='utf-8'): - if isinstance(s, bytes): - return s.decode(encoding) - return s - - -def urlsafe_b64encode(data): - """urlsafe_b64encode without padding""" - return base64.urlsafe_b64encode(data).rstrip(b'=') - - -def urlsafe_b64decode(data): - """urlsafe_b64decode without padding""" - pad = b'=' * (4 - (len(data) & 3)) - return base64.urlsafe_b64decode(data + pad) - - -def as_unicode(s): - if isinstance(s, bytes): - return s.decode('utf-8') - return s - - -def as_bytes(s): - if isinstance(s, text_type): - return s.encode('utf-8') - return s diff --git a/env/lib/python3.7/site-packages/wheel/wheelfile.py b/env/lib/python3.7/site-packages/wheel/wheelfile.py deleted file mode 100644 index ddf8509..0000000 --- a/env/lib/python3.7/site-packages/wheel/wheelfile.py +++ /dev/null @@ -1,169 +0,0 @@ -from __future__ import print_function - -import csv -import hashlib -import os.path -import re -import stat -import time -from collections import OrderedDict -from distutils import log as logger -from zipfile import ZIP_DEFLATED, ZipInfo, ZipFile - -from wheel.cli import WheelError -from wheel.util import urlsafe_b64decode, as_unicode, native, urlsafe_b64encode, as_bytes, StringIO - -# Non-greedy matching of an optional build number may be too clever (more -# invalid wheel filenames will match). Separate regex for .dist-info? -WHEEL_INFO_RE = re.compile( - r"""^(?P(?P.+?)-(?P.+?))(-(?P\d[^-]*))? - -(?P.+?)-(?P.+?)-(?P.+?)\.whl$""", - re.VERBOSE) - - -def get_zipinfo_datetime(timestamp=None): - # Some applications need reproducible .whl files, but they can't do this without forcing - # the timestamp of the individual ZipInfo objects. See issue #143. - timestamp = int(os.environ.get('SOURCE_DATE_EPOCH', timestamp or time.time())) - return time.gmtime(timestamp)[0:6] - - -class WheelFile(ZipFile): - """A ZipFile derivative class that also reads SHA-256 hashes from - .dist-info/RECORD and checks any read files against those. - """ - - _default_algorithm = hashlib.sha256 - - def __init__(self, file, mode='r'): - basename = os.path.basename(file) - self.parsed_filename = WHEEL_INFO_RE.match(basename) - if not basename.endswith('.whl') or self.parsed_filename is None: - raise WheelError("Bad wheel filename {!r}".format(basename)) - - ZipFile.__init__(self, file, mode, compression=ZIP_DEFLATED, allowZip64=True) - - self.dist_info_path = '{}.dist-info'.format(self.parsed_filename.group('namever')) - self.record_path = self.dist_info_path + '/RECORD' - self._file_hashes = OrderedDict() - self._file_sizes = {} - if mode == 'r': - # Ignore RECORD and any embedded wheel signatures - self._file_hashes[self.record_path] = None, None - self._file_hashes[self.record_path + '.jws'] = None, None - self._file_hashes[self.record_path + '.p7s'] = None, None - - # Fill in the expected hashes by reading them from RECORD - try: - record = self.open(self.record_path) - except KeyError: - raise WheelError('Missing {} file'.format(self.record_path)) - - with record: - for line in record: - line = line.decode('utf-8') - path, hash_sum, size = line.rsplit(u',', 2) - if hash_sum: - algorithm, hash_sum = hash_sum.split(u'=') - try: - hashlib.new(algorithm) - except ValueError: - raise WheelError('Unsupported hash algorithm: {}'.format(algorithm)) - - if algorithm.lower() in {'md5', 'sha1'}: - raise WheelError( - 'Weak hash algorithm ({}) is not permitted by PEP 427' - .format(algorithm)) - - self._file_hashes[path] = ( - algorithm, urlsafe_b64decode(hash_sum.encode('ascii'))) - - def open(self, name_or_info, mode="r", pwd=None): - def _update_crc(newdata, eof=None): - if eof is None: - eof = ef._eof - update_crc_orig(newdata) - else: # Python 2 - update_crc_orig(newdata, eof) - - running_hash.update(newdata) - if eof and running_hash.digest() != expected_hash: - raise WheelError("Hash mismatch for file '{}'".format(native(ef_name))) - - ef = ZipFile.open(self, name_or_info, mode, pwd) - ef_name = as_unicode(name_or_info.filename if isinstance(name_or_info, ZipInfo) - else name_or_info) - if mode == 'r' and not ef_name.endswith('/'): - if ef_name not in self._file_hashes: - raise WheelError("No hash found for file '{}'".format(native(ef_name))) - - algorithm, expected_hash = self._file_hashes[ef_name] - if expected_hash is not None: - # Monkey patch the _update_crc method to also check for the hash from RECORD - running_hash = hashlib.new(algorithm) - update_crc_orig, ef._update_crc = ef._update_crc, _update_crc - - return ef - - def write_files(self, base_dir): - logger.info("creating '%s' and adding '%s' to it", self.filename, base_dir) - deferred = [] - for root, dirnames, filenames in os.walk(base_dir): - # Sort the directory names so that `os.walk` will walk them in a - # defined order on the next iteration. - dirnames.sort() - for name in sorted(filenames): - path = os.path.normpath(os.path.join(root, name)) - if os.path.isfile(path): - arcname = os.path.relpath(path, base_dir) - if arcname == self.record_path: - pass - elif root.endswith('.dist-info'): - deferred.append((path, arcname)) - else: - self.write(path, arcname) - - deferred.sort() - for path, arcname in deferred: - self.write(path, arcname) - - def write(self, filename, arcname=None, compress_type=None): - with open(filename, 'rb') as f: - st = os.fstat(f.fileno()) - data = f.read() - - zinfo = ZipInfo(arcname or filename, date_time=get_zipinfo_datetime(st.st_mtime)) - zinfo.external_attr = (stat.S_IMODE(st.st_mode) | stat.S_IFMT(st.st_mode)) << 16 - zinfo.compress_type = ZIP_DEFLATED - self.writestr(zinfo, data, compress_type) - - def writestr(self, zinfo_or_arcname, bytes, compress_type=None): - ZipFile.writestr(self, zinfo_or_arcname, bytes, compress_type) - fname = (zinfo_or_arcname.filename if isinstance(zinfo_or_arcname, ZipInfo) - else zinfo_or_arcname) - logger.info("adding '%s'", fname) - if fname != self.record_path: - hash_ = self._default_algorithm(bytes) - self._file_hashes[fname] = hash_.name, native(urlsafe_b64encode(hash_.digest())) - self._file_sizes[fname] = len(bytes) - - def close(self): - # Write RECORD - if self.fp is not None and self.mode == 'w' and self._file_hashes: - data = StringIO() - writer = csv.writer(data, delimiter=',', quotechar='"', lineterminator='\n') - writer.writerows(( - ( - fname, - algorithm + "=" + hash_, - self._file_sizes[fname] - ) - for fname, (algorithm, hash_) in self._file_hashes.items() - )) - writer.writerow((format(self.record_path), "", "")) - zinfo = ZipInfo(native(self.record_path), date_time=get_zipinfo_datetime()) - zinfo.compress_type = ZIP_DEFLATED - zinfo.external_attr = 0o664 << 16 - self.writestr(zinfo, as_bytes(data.getvalue())) - - ZipFile.close(self) diff --git a/env/lib/python3.7/site.py b/env/lib/python3.7/site.py deleted file mode 100644 index dc9887a..0000000 --- a/env/lib/python3.7/site.py +++ /dev/null @@ -1,833 +0,0 @@ -"""Append module search paths for third-party packages to sys.path. - -**************************************************************** -* This module is automatically imported during initialization. * -**************************************************************** - -In earlier versions of Python (up to 1.5a3), scripts or modules that -needed to use site-specific modules would place ``import site'' -somewhere near the top of their code. Because of the automatic -import, this is no longer necessary (but code that does it still -works). - -This will append site-specific paths to the module search path. On -Unix, it starts with sys.prefix and sys.exec_prefix (if different) and -appends lib/python/site-packages as well as lib/site-python. -It also supports the Debian convention of -lib/python/dist-packages. On other platforms (mainly Mac and -Windows), it uses just sys.prefix (and sys.exec_prefix, if different, -but this is unlikely). The resulting directories, if they exist, are -appended to sys.path, and also inspected for path configuration files. - -FOR DEBIAN, this sys.path is augmented with directories in /usr/local. -Local addons go into /usr/local/lib/python/site-packages -(resp. /usr/local/lib/site-python), Debian addons install into -/usr/{lib,share}/python/dist-packages. - -A path configuration file is a file whose name has the form -.pth; its contents are additional directories (one per line) -to be added to sys.path. Non-existing directories (or -non-directories) are never added to sys.path; no directory is added to -sys.path more than once. Blank lines and lines beginning with -'#' are skipped. Lines starting with 'import' are executed. - -For example, suppose sys.prefix and sys.exec_prefix are set to -/usr/local and there is a directory /usr/local/lib/python2.X/site-packages -with three subdirectories, foo, bar and spam, and two path -configuration files, foo.pth and bar.pth. Assume foo.pth contains the -following: - - # foo package configuration - foo - bar - bletch - -and bar.pth contains: - - # bar package configuration - bar - -Then the following directories are added to sys.path, in this order: - - /usr/local/lib/python2.X/site-packages/bar - /usr/local/lib/python2.X/site-packages/foo - -Note that bletch is omitted because it doesn't exist; bar precedes foo -because bar.pth comes alphabetically before foo.pth; and spam is -omitted because it is not mentioned in either path configuration file. - -After these path manipulations, an attempt is made to import a module -named sitecustomize, which can perform arbitrary additional -site-specific customizations. If this import fails with an -ImportError exception, it is silently ignored. - -""" - -import os -import sys - -try: - import __builtin__ as builtins -except ImportError: - import builtins -try: - set -except NameError: - from sets import Set as set - -# Prefixes for site-packages; add additional prefixes like /usr/local here -PREFIXES = [sys.prefix, sys.exec_prefix] -# Enable per user site-packages directory -# set it to False to disable the feature or True to force the feature -ENABLE_USER_SITE = None -# for distutils.commands.install -USER_SITE = None -USER_BASE = None - -_is_64bit = (getattr(sys, "maxsize", None) or getattr(sys, "maxint")) > 2 ** 32 -_is_pypy = hasattr(sys, "pypy_version_info") -_is_jython = sys.platform[:4] == "java" -if _is_jython: - ModuleType = type(os) - - -def makepath(*paths): - dir = os.path.join(*paths) - if _is_jython and (dir == "__classpath__" or dir.startswith("__pyclasspath__")): - return dir, dir - dir = os.path.abspath(dir) - return dir, os.path.normcase(dir) - - -def abs__file__(): - """Set all module' __file__ attribute to an absolute path""" - for m in sys.modules.values(): - if (_is_jython and not isinstance(m, ModuleType)) or hasattr(m, "__loader__"): - # only modules need the abspath in Jython. and don't mess - # with a PEP 302-supplied __file__ - continue - f = getattr(m, "__file__", None) - if f is None: - continue - m.__file__ = os.path.abspath(f) - - -def removeduppaths(): - """ Remove duplicate entries from sys.path along with making them - absolute""" - # This ensures that the initial path provided by the interpreter contains - # only absolute pathnames, even if we're running from the build directory. - L = [] - known_paths = set() - for dir in sys.path: - # Filter out duplicate paths (on case-insensitive file systems also - # if they only differ in case); turn relative paths into absolute - # paths. - dir, dircase = makepath(dir) - if not dircase in known_paths: - L.append(dir) - known_paths.add(dircase) - sys.path[:] = L - return known_paths - - -# XXX This should not be part of site.py, since it is needed even when -# using the -S option for Python. See http://www.python.org/sf/586680 -def addbuilddir(): - """Append ./build/lib. in case we're running in the build dir - (especially for Guido :-)""" - from distutils.util import get_platform - - s = "build/lib.{}-{:.3}".format(get_platform(), sys.version) - if hasattr(sys, "gettotalrefcount"): - s += "-pydebug" - s = os.path.join(os.path.dirname(sys.path[-1]), s) - sys.path.append(s) - - -def _init_pathinfo(): - """Return a set containing all existing directory entries from sys.path""" - d = set() - for dir in sys.path: - try: - if os.path.isdir(dir): - dir, dircase = makepath(dir) - d.add(dircase) - except TypeError: - continue - return d - - -def addpackage(sitedir, name, known_paths): - """Add a new path to known_paths by combining sitedir and 'name' or execute - sitedir if it starts with 'import'""" - if known_paths is None: - _init_pathinfo() - reset = 1 - else: - reset = 0 - fullname = os.path.join(sitedir, name) - try: - f = open(fullname, "r") - except IOError: - return - try: - for line in f: - if line.startswith("#"): - continue - if line.startswith("import"): - exec(line) - continue - line = line.rstrip() - dir, dircase = makepath(sitedir, line) - if not dircase in known_paths and os.path.exists(dir): - sys.path.append(dir) - known_paths.add(dircase) - finally: - f.close() - if reset: - known_paths = None - return known_paths - - -def addsitedir(sitedir, known_paths=None): - """Add 'sitedir' argument to sys.path if missing and handle .pth files in - 'sitedir'""" - if known_paths is None: - known_paths = _init_pathinfo() - reset = 1 - else: - reset = 0 - sitedir, sitedircase = makepath(sitedir) - if not sitedircase in known_paths: - sys.path.append(sitedir) # Add path component - try: - names = os.listdir(sitedir) - except os.error: - return - names.sort() - for name in names: - if name.endswith(os.extsep + "pth"): - addpackage(sitedir, name, known_paths) - if reset: - known_paths = None - return known_paths - - -def addsitepackages(known_paths, sys_prefix=sys.prefix, exec_prefix=sys.exec_prefix): - """Add site-packages (and possibly site-python) to sys.path""" - prefixes = [os.path.join(sys_prefix, "local"), sys_prefix] - if exec_prefix != sys_prefix: - prefixes.append(os.path.join(exec_prefix, "local")) - - for prefix in prefixes: - if prefix: - if sys.platform in ("os2emx", "riscos") or _is_jython: - sitedirs = [os.path.join(prefix, "Lib", "site-packages")] - elif _is_pypy: - sitedirs = [os.path.join(prefix, "site-packages")] - elif sys.platform == "darwin" and prefix == sys_prefix: - - if prefix.startswith("/System/Library/Frameworks/"): # Apple's Python - - sitedirs = [ - os.path.join("/Library/Python", sys.version[:3], "site-packages"), - os.path.join(prefix, "Extras", "lib", "python"), - ] - - else: # any other Python distros on OSX work this way - sitedirs = [os.path.join(prefix, "lib", "python" + sys.version[:3], "site-packages")] - - elif os.sep == "/": - sitedirs = [ - os.path.join(prefix, "lib", "python" + sys.version[:3], "site-packages"), - os.path.join(prefix, "lib", "site-python"), - os.path.join(prefix, "python" + sys.version[:3], "lib-dynload"), - ] - lib64_dir = os.path.join(prefix, "lib64", "python" + sys.version[:3], "site-packages") - if os.path.exists(lib64_dir) and os.path.realpath(lib64_dir) not in [ - os.path.realpath(p) for p in sitedirs - ]: - if _is_64bit: - sitedirs.insert(0, lib64_dir) - else: - sitedirs.append(lib64_dir) - try: - # sys.getobjects only available in --with-pydebug build - sys.getobjects - sitedirs.insert(0, os.path.join(sitedirs[0], "debug")) - except AttributeError: - pass - # Debian-specific dist-packages directories: - sitedirs.append(os.path.join(prefix, "local/lib", "python" + sys.version[:3], "dist-packages")) - if sys.version[0] == "2": - sitedirs.append(os.path.join(prefix, "lib", "python" + sys.version[:3], "dist-packages")) - else: - sitedirs.append(os.path.join(prefix, "lib", "python" + sys.version[0], "dist-packages")) - sitedirs.append(os.path.join(prefix, "lib", "dist-python")) - else: - sitedirs = [prefix, os.path.join(prefix, "lib", "site-packages")] - if sys.platform == "darwin": - # for framework builds *only* we add the standard Apple - # locations. Currently only per-user, but /Library and - # /Network/Library could be added too - if "Python.framework" in prefix: - home = os.environ.get("HOME") - if home: - sitedirs.append(os.path.join(home, "Library", "Python", sys.version[:3], "site-packages")) - for sitedir in sitedirs: - if os.path.isdir(sitedir): - addsitedir(sitedir, known_paths) - return None - - -def check_enableusersite(): - """Check if user site directory is safe for inclusion - - The function tests for the command line flag (including environment var), - process uid/gid equal to effective uid/gid. - - None: Disabled for security reasons - False: Disabled by user (command line option) - True: Safe and enabled - """ - if hasattr(sys, "flags") and getattr(sys.flags, "no_user_site", False): - return False - - if hasattr(os, "getuid") and hasattr(os, "geteuid"): - # check process uid == effective uid - if os.geteuid() != os.getuid(): - return None - if hasattr(os, "getgid") and hasattr(os, "getegid"): - # check process gid == effective gid - if os.getegid() != os.getgid(): - return None - - return True - - -def addusersitepackages(known_paths): - """Add a per user site-package to sys.path - - Each user has its own python directory with site-packages in the - home directory. - - USER_BASE is the root directory for all Python versions - - USER_SITE is the user specific site-packages directory - - USER_SITE/.. can be used for data. - """ - global USER_BASE, USER_SITE, ENABLE_USER_SITE - env_base = os.environ.get("PYTHONUSERBASE", None) - - def joinuser(*args): - return os.path.expanduser(os.path.join(*args)) - - # if sys.platform in ('os2emx', 'riscos'): - # # Don't know what to put here - # USER_BASE = '' - # USER_SITE = '' - if os.name == "nt": - base = os.environ.get("APPDATA") or "~" - if env_base: - USER_BASE = env_base - else: - USER_BASE = joinuser(base, "Python") - USER_SITE = os.path.join(USER_BASE, "Python" + sys.version[0] + sys.version[2], "site-packages") - else: - if env_base: - USER_BASE = env_base - else: - USER_BASE = joinuser("~", ".local") - USER_SITE = os.path.join(USER_BASE, "lib", "python" + sys.version[:3], "site-packages") - - if ENABLE_USER_SITE and os.path.isdir(USER_SITE): - addsitedir(USER_SITE, known_paths) - if ENABLE_USER_SITE: - for dist_libdir in ("lib", "local/lib"): - user_site = os.path.join(USER_BASE, dist_libdir, "python" + sys.version[:3], "dist-packages") - if os.path.isdir(user_site): - addsitedir(user_site, known_paths) - return known_paths - - -def setBEGINLIBPATH(): - """The OS/2 EMX port has optional extension modules that do double duty - as DLLs (and must use the .DLL file extension) for other extensions. - The library search path needs to be amended so these will be found - during module import. Use BEGINLIBPATH so that these are at the start - of the library search path. - - """ - dllpath = os.path.join(sys.prefix, "Lib", "lib-dynload") - libpath = os.environ["BEGINLIBPATH"].split(";") - if libpath[-1]: - libpath.append(dllpath) - else: - libpath[-1] = dllpath - os.environ["BEGINLIBPATH"] = ";".join(libpath) - - -def setquit(): - """Define new built-ins 'quit' and 'exit'. - These are simply strings that display a hint on how to exit. - - """ - if os.sep == ":": - eof = "Cmd-Q" - elif os.sep == "\\": - eof = "Ctrl-Z plus Return" - else: - eof = "Ctrl-D (i.e. EOF)" - - class Quitter(object): - def __init__(self, name): - self.name = name - - def __repr__(self): - return "Use {}() or {} to exit".format(self.name, eof) - - def __call__(self, code=None): - # Shells like IDLE catch the SystemExit, but listen when their - # stdin wrapper is closed. - try: - sys.stdin.close() - except: - pass - raise SystemExit(code) - - builtins.quit = Quitter("quit") - builtins.exit = Quitter("exit") - - -class _Printer(object): - """interactive prompt objects for printing the license text, a list of - contributors and the copyright notice.""" - - MAXLINES = 23 - - def __init__(self, name, data, files=(), dirs=()): - self.__name = name - self.__data = data - self.__files = files - self.__dirs = dirs - self.__lines = None - - def __setup(self): - if self.__lines: - return - data = None - for dir in self.__dirs: - for filename in self.__files: - filename = os.path.join(dir, filename) - try: - fp = open(filename, "r") - data = fp.read() - fp.close() - break - except IOError: - pass - if data: - break - if not data: - data = self.__data - self.__lines = data.split("\n") - self.__linecnt = len(self.__lines) - - def __repr__(self): - self.__setup() - if len(self.__lines) <= self.MAXLINES: - return "\n".join(self.__lines) - else: - return "Type %s() to see the full %s text" % ((self.__name,) * 2) - - def __call__(self): - self.__setup() - prompt = "Hit Return for more, or q (and Return) to quit: " - lineno = 0 - while 1: - try: - for i in range(lineno, lineno + self.MAXLINES): - print(self.__lines[i]) - except IndexError: - break - else: - lineno += self.MAXLINES - key = None - while key is None: - try: - key = raw_input(prompt) - except NameError: - key = input(prompt) - if key not in ("", "q"): - key = None - if key == "q": - break - - -def setcopyright(): - """Set 'copyright' and 'credits' in __builtin__""" - builtins.copyright = _Printer("copyright", sys.copyright) - if _is_jython: - builtins.credits = _Printer("credits", "Jython is maintained by the Jython developers (www.jython.org).") - elif _is_pypy: - builtins.credits = _Printer("credits", "PyPy is maintained by the PyPy developers: http://pypy.org/") - else: - builtins.credits = _Printer( - "credits", - """\ - Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands - for supporting Python development. See www.python.org for more information.""", - ) - here = os.path.dirname(os.__file__) - builtins.license = _Printer( - "license", - "See http://www.python.org/%.3s/license.html" % sys.version, - ["LICENSE.txt", "LICENSE"], - [os.path.join(here, os.pardir), here, os.curdir], - ) - - -class _Helper(object): - """Define the built-in 'help'. - This is a wrapper around pydoc.help (with a twist). - - """ - - def __repr__(self): - return "Type help() for interactive help, " "or help(object) for help about object." - - def __call__(self, *args, **kwds): - import pydoc - - return pydoc.help(*args, **kwds) - - -def sethelper(): - builtins.help = _Helper() - - -def aliasmbcs(): - """On Windows, some default encodings are not provided by Python, - while they are always available as "mbcs" in each locale. Make - them usable by aliasing to "mbcs" in such a case.""" - if sys.platform == "win32": - import locale, codecs - - enc = locale.getdefaultlocale()[1] - if enc.startswith("cp"): # "cp***" ? - try: - codecs.lookup(enc) - except LookupError: - import encodings - - encodings._cache[enc] = encodings._unknown - encodings.aliases.aliases[enc] = "mbcs" - - -def setencoding(): - """Set the string encoding used by the Unicode implementation. The - default is 'ascii', but if you're willing to experiment, you can - change this.""" - encoding = "ascii" # Default value set by _PyUnicode_Init() - if 0: - # Enable to support locale aware default string encodings. - import locale - - loc = locale.getdefaultlocale() - if loc[1]: - encoding = loc[1] - if 0: - # Enable to switch off string to Unicode coercion and implicit - # Unicode to string conversion. - encoding = "undefined" - if encoding != "ascii": - # On Non-Unicode builds this will raise an AttributeError... - sys.setdefaultencoding(encoding) # Needs Python Unicode build ! - - -def execsitecustomize(): - """Run custom site specific code, if available.""" - try: - import sitecustomize - except ImportError: - pass - - -def virtual_install_main_packages(): - f = open(os.path.join(os.path.dirname(__file__), "orig-prefix.txt")) - sys.real_prefix = f.read().strip() - f.close() - pos = 2 - hardcoded_relative_dirs = [] - if sys.path[0] == "": - pos += 1 - if _is_jython: - paths = [os.path.join(sys.real_prefix, "Lib")] - elif _is_pypy: - if sys.version_info > (3, 2): - cpyver = "%d" % sys.version_info[0] - elif sys.pypy_version_info >= (1, 5): - cpyver = "%d.%d" % sys.version_info[:2] - else: - cpyver = "%d.%d.%d" % sys.version_info[:3] - paths = [os.path.join(sys.real_prefix, "lib_pypy"), os.path.join(sys.real_prefix, "lib-python", cpyver)] - if sys.pypy_version_info < (1, 9): - paths.insert(1, os.path.join(sys.real_prefix, "lib-python", "modified-%s" % cpyver)) - hardcoded_relative_dirs = paths[:] # for the special 'darwin' case below - # - # This is hardcoded in the Python executable, but relative to sys.prefix: - for path in paths[:]: - plat_path = os.path.join(path, "plat-%s" % sys.platform) - if os.path.exists(plat_path): - paths.append(plat_path) - elif sys.platform == "win32": - paths = [os.path.join(sys.real_prefix, "Lib"), os.path.join(sys.real_prefix, "DLLs")] - else: - paths = [os.path.join(sys.real_prefix, "lib", "python" + sys.version[:3])] - hardcoded_relative_dirs = paths[:] # for the special 'darwin' case below - lib64_path = os.path.join(sys.real_prefix, "lib64", "python" + sys.version[:3]) - if os.path.exists(lib64_path): - if _is_64bit: - paths.insert(0, lib64_path) - else: - paths.append(lib64_path) - # This is hardcoded in the Python executable, but relative to - # sys.prefix. Debian change: we need to add the multiarch triplet - # here, which is where the real stuff lives. As per PEP 421, in - # Python 3.3+, this lives in sys.implementation, while in Python 2.7 - # it lives in sys. - try: - arch = getattr(sys, "implementation", sys)._multiarch - except AttributeError: - # This is a non-multiarch aware Python. Fallback to the old way. - arch = sys.platform - plat_path = os.path.join(sys.real_prefix, "lib", "python" + sys.version[:3], "plat-%s" % arch) - if os.path.exists(plat_path): - paths.append(plat_path) - # This is hardcoded in the Python executable, but - # relative to sys.prefix, so we have to fix up: - for path in list(paths): - tk_dir = os.path.join(path, "lib-tk") - if os.path.exists(tk_dir): - paths.append(tk_dir) - - # These are hardcoded in the Apple's Python executable, - # but relative to sys.prefix, so we have to fix them up: - if sys.platform == "darwin": - hardcoded_paths = [ - os.path.join(relative_dir, module) - for relative_dir in hardcoded_relative_dirs - for module in ("plat-darwin", "plat-mac", "plat-mac/lib-scriptpackages") - ] - - for path in hardcoded_paths: - if os.path.exists(path): - paths.append(path) - - sys.path.extend(paths) - - -def force_global_eggs_after_local_site_packages(): - """ - Force easy_installed eggs in the global environment to get placed - in sys.path after all packages inside the virtualenv. This - maintains the "least surprise" result that packages in the - virtualenv always mask global packages, never the other way - around. - - """ - egginsert = getattr(sys, "__egginsert", 0) - for i, path in enumerate(sys.path): - if i > egginsert and path.startswith(sys.prefix): - egginsert = i - sys.__egginsert = egginsert + 1 - - -def virtual_addsitepackages(known_paths): - force_global_eggs_after_local_site_packages() - return addsitepackages(known_paths, sys_prefix=sys.real_prefix) - - -def fixclasspath(): - """Adjust the special classpath sys.path entries for Jython. These - entries should follow the base virtualenv lib directories. - """ - paths = [] - classpaths = [] - for path in sys.path: - if path == "__classpath__" or path.startswith("__pyclasspath__"): - classpaths.append(path) - else: - paths.append(path) - sys.path = paths - sys.path.extend(classpaths) - - -def execusercustomize(): - """Run custom user specific code, if available.""" - try: - import usercustomize - except ImportError: - pass - - -def enablerlcompleter(): - """Enable default readline configuration on interactive prompts, by - registering a sys.__interactivehook__. - If the readline module can be imported, the hook will set the Tab key - as completion key and register ~/.python_history as history file. - This can be overridden in the sitecustomize or usercustomize module, - or in a PYTHONSTARTUP file. - """ - - def register_readline(): - import atexit - - try: - import readline - import rlcompleter - except ImportError: - return - - # Reading the initialization (config) file may not be enough to set a - # completion key, so we set one first and then read the file. - readline_doc = getattr(readline, "__doc__", "") - if readline_doc is not None and "libedit" in readline_doc: - readline.parse_and_bind("bind ^I rl_complete") - else: - readline.parse_and_bind("tab: complete") - - try: - readline.read_init_file() - except OSError: - # An OSError here could have many causes, but the most likely one - # is that there's no .inputrc file (or .editrc file in the case of - # Mac OS X + libedit) in the expected location. In that case, we - # want to ignore the exception. - pass - - if readline.get_current_history_length() == 0: - # If no history was loaded, default to .python_history. - # The guard is necessary to avoid doubling history size at - # each interpreter exit when readline was already configured - # through a PYTHONSTARTUP hook, see: - # http://bugs.python.org/issue5845#msg198636 - history = os.path.join(os.path.expanduser("~"), ".python_history") - try: - readline.read_history_file(history) - except OSError: - pass - - def write_history(): - try: - readline.write_history_file(history) - except (FileNotFoundError, PermissionError): - # home directory does not exist or is not writable - # https://bugs.python.org/issue19891 - pass - - atexit.register(write_history) - - sys.__interactivehook__ = register_readline - - -def main(): - global ENABLE_USER_SITE - virtual_install_main_packages() - abs__file__() - paths_in_sys = removeduppaths() - if os.name == "posix" and sys.path and os.path.basename(sys.path[-1]) == "Modules": - addbuilddir() - if _is_jython: - fixclasspath() - GLOBAL_SITE_PACKAGES = not os.path.exists(os.path.join(os.path.dirname(__file__), "no-global-site-packages.txt")) - if not GLOBAL_SITE_PACKAGES: - ENABLE_USER_SITE = False - if ENABLE_USER_SITE is None: - ENABLE_USER_SITE = check_enableusersite() - paths_in_sys = addsitepackages(paths_in_sys) - paths_in_sys = addusersitepackages(paths_in_sys) - if GLOBAL_SITE_PACKAGES: - paths_in_sys = virtual_addsitepackages(paths_in_sys) - if sys.platform == "os2emx": - setBEGINLIBPATH() - setquit() - setcopyright() - sethelper() - if sys.version_info[0] == 3: - enablerlcompleter() - aliasmbcs() - setencoding() - execsitecustomize() - if ENABLE_USER_SITE: - execusercustomize() - # Remove sys.setdefaultencoding() so that users cannot change the - # encoding after initialization. The test for presence is needed when - # this module is run as a script, because this code is executed twice. - if hasattr(sys, "setdefaultencoding"): - del sys.setdefaultencoding - - -main() - - -def _script(): - help = """\ - %s [--user-base] [--user-site] - - Without arguments print some useful information - With arguments print the value of USER_BASE and/or USER_SITE separated - by '%s'. - - Exit codes with --user-base or --user-site: - 0 - user site directory is enabled - 1 - user site directory is disabled by user - 2 - uses site directory is disabled by super user - or for security reasons - >2 - unknown error - """ - args = sys.argv[1:] - if not args: - print("sys.path = [") - for dir in sys.path: - print(" {!r},".format(dir)) - print("]") - - def exists(path): - if os.path.isdir(path): - return "exists" - else: - return "doesn't exist" - - print("USER_BASE: {!r} ({})".format(USER_BASE, exists(USER_BASE))) - print("USER_SITE: {!r} ({})".format(USER_SITE, exists(USER_BASE))) - print("ENABLE_USER_SITE: %r" % ENABLE_USER_SITE) - sys.exit(0) - - buffer = [] - if "--user-base" in args: - buffer.append(USER_BASE) - if "--user-site" in args: - buffer.append(USER_SITE) - - if buffer: - print(os.pathsep.join(buffer)) - if ENABLE_USER_SITE: - sys.exit(0) - elif ENABLE_USER_SITE is False: - sys.exit(1) - elif ENABLE_USER_SITE is None: - sys.exit(2) - else: - sys.exit(3) - else: - import textwrap - - print(textwrap.dedent(help % (sys.argv[0], os.pathsep))) - sys.exit(10) - - -if __name__ == "__main__": - _script() diff --git a/env/lib/python3.7/sre_compile.py b/env/lib/python3.7/sre_compile.py deleted file mode 120000 index 8df75bd..0000000 --- a/env/lib/python3.7/sre_compile.py +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/sre_compile.py \ No newline at end of file diff --git a/env/lib/python3.7/sre_constants.py b/env/lib/python3.7/sre_constants.py deleted file mode 120000 index c08169c..0000000 --- a/env/lib/python3.7/sre_constants.py +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/sre_constants.py \ No newline at end of file diff --git a/env/lib/python3.7/sre_parse.py b/env/lib/python3.7/sre_parse.py deleted file mode 120000 index 481f82d..0000000 --- a/env/lib/python3.7/sre_parse.py +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/sre_parse.py \ No newline at end of file diff --git a/env/lib/python3.7/stat.py b/env/lib/python3.7/stat.py deleted file mode 120000 index 5d1b626..0000000 --- a/env/lib/python3.7/stat.py +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/stat.py \ No newline at end of file diff --git a/env/lib/python3.7/struct.py b/env/lib/python3.7/struct.py deleted file mode 120000 index af49495..0000000 --- a/env/lib/python3.7/struct.py +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/struct.py \ No newline at end of file diff --git a/env/lib/python3.7/tarfile.py b/env/lib/python3.7/tarfile.py deleted file mode 120000 index b7fa773..0000000 --- a/env/lib/python3.7/tarfile.py +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/tarfile.py \ No newline at end of file diff --git a/env/lib/python3.7/tempfile.py b/env/lib/python3.7/tempfile.py deleted file mode 120000 index 570b094..0000000 --- a/env/lib/python3.7/tempfile.py +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/tempfile.py \ No newline at end of file diff --git a/env/lib/python3.7/token.py b/env/lib/python3.7/token.py deleted file mode 120000 index d67b104..0000000 --- a/env/lib/python3.7/token.py +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/token.py \ No newline at end of file diff --git a/env/lib/python3.7/tokenize.py b/env/lib/python3.7/tokenize.py deleted file mode 120000 index 55e6050..0000000 --- a/env/lib/python3.7/tokenize.py +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/tokenize.py \ No newline at end of file diff --git a/env/lib/python3.7/types.py b/env/lib/python3.7/types.py deleted file mode 120000 index aa3096f..0000000 --- a/env/lib/python3.7/types.py +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/types.py \ No newline at end of file diff --git a/env/lib/python3.7/warnings.py b/env/lib/python3.7/warnings.py deleted file mode 120000 index 8dd72e2..0000000 --- a/env/lib/python3.7/warnings.py +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/warnings.py \ No newline at end of file diff --git a/env/lib/python3.7/weakref.py b/env/lib/python3.7/weakref.py deleted file mode 120000 index c02784d..0000000 --- a/env/lib/python3.7/weakref.py +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/python3.7/weakref.py \ No newline at end of file

`t*vV?Bu{5Trk>DtmFclDlyJ?78zx zilo0{^RQ8MnU6Vrz^LK`S91DfQN=xeGZX5c;g$gKf59v`cd?4SUOZ=2k%)lr!H!R* zev^3x9)&9W7GED=@F0VS7?3^)1RM6HGD7genLj*+6^B|Pm9QG7wuWF)eG}3Do?!Si z9xR*MY7zu8CbH`fq1Iz3L%k1>HWye-CXxh#0uzs6yQ?BwIxanue(>{&Cdon>W8AMH zc%JPNZFbR4!vSvIdBAx_Qer4Zj=rSD;gM65ap)ox)9{s{I6}GuBZ;_j)@A_ykxH5x zh9ndi;dMwMZ5-Ajr4$PoO%xxaeRO-&^M2|Ub5Q;T5w#ciV+<>zYpO**&;Y%SIoxiq zYGOB*`2=5~Ylu6A8m`n_$gotm$9rTyKsjPMyRss98`7hwMK~7%D2Na)nASY?_ZbXg zHbu<*KRIjUM6C&)sRD%sW8)bk-ii6t1-t|X>qK*=js@Ty=!4RO+p74dWO|uSDS*}f zHuz6k-@6%g24*kdqLhUrRA`OQ*7yl3FGO1=jz@dUN?)w$TiaI~*gs;74Xb8y8HW*- zeG_`3wZe3ERkk`Z3J#FsGamrx;mFUUd@%Yla+|eaEz*3~ptXgr7={2S?OJyR#1H)kj<{iJi{`*-uAtjY?xYwWg6$7Yj0Ybl`BQzuO)*L7#aj0 z$1dKau$(apta?@C%;(!K{4 zuIT3DwC_opBWd3UOICE9IPLqA1}7=EfVe`lv}$#WUj?D-7GN)iq|YZTiejyV_4Z2b z8nz)*eXp=FRI5P^94-R~>Ue@HoM~b6*SciwI|?sM9I++acKhqagJXxMSvwwICFexp zuB~s_bqnn@JaM^)S8Br=LN+aXNA{ThcV$mO(U&Z@5ghFYd&4YO^9{<5Uh zqFj(=7VRiDhBjKBC2@Y~oavwV-WkK;Ub}Af($-s|`r{BG1APz`F+#leBZ(1ov1lKT zcyCCT`^9At->1Bws=*4R$a5w^ek4M=3Usb#&rqkX~R zgMG(-M){7^pE%h}4v0G0YL}UPMyodCP3wbO&-bwP&qvL|&p?6nNJlo?zTd!BDfyD@ z;LzusMOlUE0!%e<3>waqfbbo`$!uazkHO4)A5n*R>@g*U2=6FMxY;?p>M=*!5%A6Nn}kGP3l96N;jKJ}Z3j}Idvu|*#0kq++WB?n~1 z>LJ4${)2Q(1|v3KyGjDD*81xzLRfuTCqu1qAZb=q7=Cd0JqvDw8IqZ%Jcw|nrLq%#3|A$s| zToIcTeHB})(OCH@qsTnV*45ybfzM-GbR9o}6j5pE)}z{TJzPo-&md+rnflerP8E=H z?VG}l%vUr{ufynjH5M{vrJzCAdyt4oXp(GXjCB{lxVIzZ3k%$q@^LUqwRQu0VYsbl z0R6`fGD~NKENPdjVZ=5nh%HVfZlij`Is^|<=p*Q*$*r8kSX5mf5ZtEz9ovAPWSPc&VR3O` znQnBM1@&+6u6~b+Ps*<>@>eHUx477*WeJTcQWD^;aEKStuemHj#OPxn8V7L#Kv2d^d}@qd~M|ua(Gmw zBst~C1RhAmH+oCyczV&Xk}yww5oArhA3w*Qh)mX>eTqf$bCMPQj%eTJFv0kJ3?>=u zXF&axXs$$KC7LSyoQ-hzS`Q$;55K@%q7k52FM?RY@=RhPvyzzKSg8{_&+DK5e1RYJ zR}k3gQd&-oN^5GhXP7>aIbh>oR{ygz@-IE{d5izHaeoYY0Q@Vyi07xVjq*WisK!2R GrT!nCR|I?j diff --git a/env/lib/python3.7/site-packages/dns/__pycache__/name.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/__pycache__/name.cpython-37.pyc deleted file mode 100644 index 30fb654a6bb638229dc9b993c3dcd8e74ff34fd0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28440 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 diff --git a/env/lib/python3.7/site-packages/dns/__pycache__/query.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/__pycache__/query.cpython-37.pyc deleted file mode 100644 index 806ecda636336dde3562535ded4e47a6f48ea281..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17205 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 diff --git a/env/lib/python3.7/site-packages/dns/__pycache__/rcode.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/__pycache__/rcode.cpython-37.pyc deleted file mode 100644 index 10030665e0b62144e9e33b8ce105b7b203c5e582..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2675 zcmb_eTXWk)6yB9&OLm=m+N3QPJ!FQuq)uoH12buGE)JBTHe;uqRzs0p?jZ8_N=S zzW#Ck{+r{3{DzI;GX|9+yur@^j97$GrnIT0FqLU-wWC=Yg>P1hsaBe$ES;q-gXva= z8CI5MtTQZY<=7c(jODCxHfBw*ach#Nc$(|n;2ECfXLyc}@o_%EC)vagIcthdvZ?2U zPaRDklTGrBS~H&zHqB<96E?$@hqDjQK2xo8Y?hsUPOLe0j?F>`vG zm{KG8Hx8yY%QdsggKj%CH$29JLLUx7%6$r$r;*n7+}*wcjlPPYA*2w}2s(m+kU>D6 z`jY_pT%?yPrE0ZOjr6Tb^%hhkqgJZk*;>2#d1RFDZdPus-7H7xa%KDGtuG?ITH3l@ zD{V%`ynqkxH_^WbfBrHwD+fX#&O&&C}2ycKS zabi(Mz*VTFN;%XhciU~b-V?Wq3m?p_nJACk#dHF*8+R7Uc`Y(*+ii5XZAV$#?s%-* z#(K`SA9Wk;L62_R%xl{A=xA~6E!bR`09)_|XsbbGJE0N3B{Z%>qeqU&F%b(P?Sac3 z(jH~Bl@be3DlLj-jfBdP3gfh6avYCPTZUK-Q{Td9a5nAW*A35o%tdI1{Ap-9Zs?f} zH$Gk=n>FFNj6IhZ&4yX8W3^siG{ZeEC&0M|RCogC!F;~U1(Zqmjwd>Um8uOV-~lWH zIu&A_PI6nXo6e40I%c=y@{Z>^&6708CRKUZ6>fk#*6XlmydFwMei4WvZo##gMS{GYXPm z{Obq5$HzOt#N$T0%T4a02Qu@)zPZzG?Bem6$$?AR8mc85C|ANwEEjrhJZ;C}Z8jX9 z%s*vH>GU~?jCatik`SJVrAvZh#auSQAy&=n%OAb}ddd1A7U|CdIDbHOq~O6@125c)-)?Mm4m;6Z39e|BsU9^Ld0E# zdJ=Je6Z1ppK`}wNNhlQ%ZXSeFrEr94MRG_n5?QJU(a6%PC^SgA6N~!GK-7kLNp8J3 zQZ8?XUBAuECwoqFZ=iB8Qh%tFJj^L7#ep73)i9>M7oXlY9o}Q3ity?1jezzD^yG&Oe4%7U~G%C2zd94IfQwH z^9b(%L@6iaoj_d2dSMxjVkAMIG diff --git a/env/lib/python3.7/site-packages/dns/__pycache__/rdata.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/__pycache__/rdata.cpython-37.pyc deleted file mode 100644 index 1bbf9a0460dd49cc3633883cd7c0df1509181ec2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13710 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 P`!m&-s?W`o9s9olj8{9s diff --git a/env/lib/python3.7/site-packages/dns/__pycache__/rdataclass.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/__pycache__/rdataclass.cpython-37.pyc deleted file mode 100644 index 918ebcd74e5a1854e7192f0331dc81a43c6c411e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2427 zcmb_eOK;mo5Z)yziIU}aV!IEZTlbMFbz}#r1GGrexQyib7rEwOqo)G>MZETuzmP-InWbd8aeFCBg0s8i&hE^7-^}u>(a{ot>!)Am zHlLRX`2z=os{ozb@Wj7^;KU)Ea-&Ths$0V`Idv>Yyret}Ikm2KSW5 zR@+`2i@5p{ydd?L6y!@2g@xiz6t6*4@@cVAYt|a~Yj>7XW4)dlt81yT)=aJXy?QM* zSL)xlP#G`ONA*>B;u#P=>5F=%?yJ%b?zdDc>_oQ~ zaC-wpp2#V^kz=pdH)@S~ZNtf}uC3f_I{CF)bN$|(jl;3kZ&#YlPkvas^7-bcl@D7m z|MWt?Zo?B#fDi;ACXNB{nmU|jI{96&7liwPj;OZeaCU`ZjP-!|F-x);)q2HBZPyLF zj&R+ykb2w^(MgrISt}VvE|Vfo+Gsu)qK(B3uJ%`Hcs}F@+u8!IRkd5H z8;R;U$hWqbpP6+I^vw0sh3;cKYEp)BsBKhI(75eIbJL>sE?D%=mfNK9^Rf(96dDQ(F$Kcrw7Fsh&lnS0YsfsgquiI zMUM?la-_WlB)`sc%Irajoh6tGn#R@{8lNRE!rZ3=&>G$7hkiYSIb+JM2N*D&{%pY4 z1?H5_;o8kcM0SAYn{XeJ!%!w6{Fk{Yt;7lFLD3;BN zCEo)W(jpQlgZeETTT(=_V#xPlAQ_4`z%Qs!L%#{%VmM(589}%a`ZARt!T1z(WHbV= zLB~SegUYs-mt_txW`+3h=M9-aeaY~NBhm7Ad?+fX3F)zp7@QTudelm!6oG1YPpi=B zEJ%D$3I>Op&Otot`jA|fTrYbW6ZOp`+_+nzP|(jTQ=v|wukmIK%6>eY8G&PQ9t5$G z{qhp@Dsyrcn$(cO8O16j4q75oei*EEV72e)0A%2|3;vMg$wW99|Re%qe@3+`)l@c;k- diff --git a/env/lib/python3.7/site-packages/dns/__pycache__/rdataset.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/__pycache__/rdataset.cpython-37.pyc deleted file mode 100644 index 31db4a4a73996eea449088c8940dc236644c355d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9418 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 diff --git a/env/lib/python3.7/site-packages/dns/__pycache__/rdatatype.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/__pycache__/rdatatype.cpython-37.pyc deleted file mode 100644 index 52ffb26f36c97b06d16b9df334a9fe2141757a6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5027 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 diff --git a/env/lib/python3.7/site-packages/dns/__pycache__/resolver.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/__pycache__/resolver.cpython-37.pyc deleted file mode 100644 index 808e52a08b0fe5ebf3f1bc3877e80385fa9981ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33613 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 diff --git a/env/lib/python3.7/site-packages/dns/__pycache__/reversename.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/__pycache__/reversename.cpython-37.pyc deleted file mode 100644 index c0ea6c5d0ff5b7cc2c78d3e37cd509e6f6651747..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2526 zcmb7GPj4GV6rb5$uh)*9rlo`y3SA+U;HufAZAej76-3(u2cjxLDz&KWiD!~*vfka! zj?>t(g+$Ad1K+?F5)yn64t#{+$f@Vvdg8rV+i{~-lwIwcH{+T2|NX{aRjXwJ&kw(z zd-QjOkbiJ8d2C?5gfIIZ2q$&IDYqh8r)IS3wi%uASTLgPYu(rs8=b)Kv)Tp-aKfK9b zNS|_>J3m?H$zAf44y<^Q7hbon3IjX#!2vj! zzfpoOFPak-&|b|gneGRP4@qo&NBY)qegu1A&#Ca`oeD!f;huJ}tgZ(d!h00@)>f@~ASP913KS z{9-+Jpi*hiy2O7cHA`E;s&=-!N=O?v8}f2}MYYqFG)$MnI8!W&malgoXKC6wSOHJc zuG&jtrxmC z)nF=#>!mPjKqsVvOU#6R2R5uV#yM-`{h{qlN$qWiG0R$EsEd2zC<=GF+U25^aA6Lu zpFC8$Hz{Ua!rEa{vaT^;O&7-sw1Z`#OD6f)U)tGEz*ePB0O3HpWB*Ez{W>24?^$-;CF@z>8-L zCe6tGKS+q@0lfh@<3#y;>`?g3$eUF%D|-eTa~#hh@de(dfkgTOKJpx!(JbEVecXu; z;^av@36!}prtx6yFzRm9PS-2YL0M-zZxx9EQ7=moF%=$$J)s?hJMBhnTSS>W4?oKb zNUBH>xW?TG_ZO3=aPeJSv?CE~7aKF?a^7s4UJiP0=60yL@_jsY3CV{@um>~^HH}X8 zOIaloi2VXKWuE{cl``}Nc1GF44#{~3x(8P11?VGKx8ySHtj+6U12Cc0Xvi}#uX~g9 z8*lO{0?d?KgFit~Aq|9krVPU5)_wrTO{|Q!rYDVx8H>$TgZ-(!TkV8*B5@m)W=I^% Qvpg`+vnm#}y6s*37apc~zW@LL diff --git a/env/lib/python3.7/site-packages/dns/__pycache__/rrset.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/__pycache__/rrset.cpython-37.pyc deleted file mode 100644 index 4c5e1196e79b41069049b277598c6f0302c9daa4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5376 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 diff --git a/env/lib/python3.7/site-packages/dns/__pycache__/set.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/__pycache__/set.cpython-37.pyc deleted file mode 100644 index 0a21f73884c2bf4b041d50af3075285a8bb34da3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7444 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 diff --git a/env/lib/python3.7/site-packages/dns/__pycache__/tokenizer.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/__pycache__/tokenizer.cpython-37.pyc deleted file mode 100644 index 3e852fa01f79464a43f39e7955f9b7cadc3242cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14095 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 M+$w<3n*OceZ*@6YssI20 diff --git a/env/lib/python3.7/site-packages/dns/__pycache__/update.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/__pycache__/update.cpython-37.pyc deleted file mode 100644 index 17552f4b8d5e3ad305c3967453a9100139514067..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7374 zcmc&(&5t8T74I+GZI9=3H=D@)qC&vUOhiQJ6qH6`R$Y~OE7g{#$fZXOzog@q`#^eTE~p-M31Yt4e>1A*A8bA{YXF16U^<@(PzlM zHu`4KXQ0nW4D`(<+F%~n0YO(NG8XB7>Etq7Ls0X0r z1t9dVM3p$1jI_cuiH!H0K}eAEvax>SB_|gx4xMqtn~rm%@3;j^EBS2VHX8As*Y`Mc zHpelp6^3k+1d9*6w|_vr$!g6VEI-EUyHZhn1&WK zLczEoEn-$g)7&XtWXn5@_q~9#RVNA^cQo?7o>YERP>Hs~vCo_cp6u^|M8-e#!HFV% zN-aYg;(65>2R;mj7@0_OGYEI26#3|02qW`?$O!`wCH11`gaYI)eTs#&FfG>#jm_;f z*H9sW($X^|syp^$@D{=>)bysa0lUZI&Tx$V#b#$4l5cay@d@5se=8JTygke<~pV8!*sIz;Mmq~lj*YOT4!Jl6UhR`_YQg5)Aw<@=I@ zbHyr^sWpBM`rA3x0~<7LDc4^h!2;y65uOpw#m5<4#rKnvV)LMiQF9oj4HgqSsp7tL zWSzFod-^Tw4P_jb`yn=v>_hM#;5wRy8No-s+f#vp>?Qk6@!1)|*;Ux-cCWjBL_k;o z%i3DxxB_vXF$57<8^R#p_29LL#^~hnGmh5>1a63NfuQnzK>}!=Ek{u(-j)VC31tM| zU?Tzx1fQ_AFkr=GS8T~Ff2o|&TL1fs@aHZ9)v1Uw@fT};O;*WYmwvXHm{C9=^W zNFnveMn_H$Qf>05CrM16%v^LNFhR^_b80^)-SC!GHRjU?kh38!%4C&B<`h~&C9>kH zaDm1dL9QdQRgiB;mlSh&O6{DH)LtWO1xsmJx+oW4qM;5oU!kFv5B;Pja+TB^g`>12 zr=}%2Pn@A~gaKk6O`|4#Kdodcl6)v6u&_S}39uw_KMg0^a;a30PP)HE?*AGFM3>QM z3pIUCUjjl}xYzXi4O{-UClol)W z_BaHKFXP>Ja7A(hXZLH_rb08to>tILh9&p3uK-s+2DmsE0C4rVlo+>hLbz#&H9!;r zX$7YbV_**moN8G+qn>f9GmmUtdruD*0Ck985~}NiS-|J}yZ=ZG!0{soCV<(Lzzk?R zoJ&AIu_VozBLe0az&rqO{x+Vc)enp*S_^|k(E7vfhmzLv!RZu!f!XgS#^Dly`9TTu zOH#VO5uX6ml6+gp_MR>-Or(R1XE2_mBe@`HE?4mM?o)Ez%Lirj5P-|E0DNt57SMbu zHvs2m4$k|3zDD7ckoP1w|5r_Pg%3yZ-pc1dHVGPc0X3C8tUBK+0PW4fa}=U&H14@O zmYF^eR4zh>Ef&zE=GE3WB{rp2>($na;sNS;kQ#@YhpBm#nhVrCLd^ukDkojzG3uA7 zC9!dpex7ibhw$zPxS}V~X!C?bb(yU!Nt9BkMHqHI!z)6vvi#QYM&j0N=3)wm3orYR zkjveK8?LGN{J*vispBs`xJ_)KI7=c&*bB$bj*El?Swt3XWJpKw_mE)(NJCcTpzM^$ z!h#MCo638#Bep!E^+Vqecjz#zPJKA)4?_^@xxO#YWdOcOpxyY-z_bCI_$66~1k;5g zgUuK(R80Y@0Mw811CaCY0QKbw zG=FMlcK-g}8kyYZu+(S||M< zOCe8FW!c>%P5za3oic9CQh_ehB*I>yxjgi#86SP}iKZRX9swh1F>=r#)0@;j0FN>1 z(x`WvsC%Hgfy##Az6`@&yr0!ih7cYS_UXCa>D(H- zzUom&dztkbH(G6r>YVMxY{NQ54O3PiRrV_nfpoqT4^czOiFksVuTevMrn6bOv&VhE z)0rf@xmZ-CliNUrhKTBYHlX<2!?l|Im_2Vd?Irus+8H^bF^6(q2mjx6I{4=c)#yxF zl5f-nv-&jt9m7*rEUwbCjBNN*EPs^sSNv&~|3;>%rjx{2gIw5+RVlfWEs|DVQN}M> bnaDBGOKN{z?d!8t&WxzBP;8w3*3Ewcb1qPw diff --git a/env/lib/python3.7/site-packages/dns/__pycache__/version.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/__pycache__/version.cpython-37.pyc deleted file mode 100644 index de9077355891a5a25143e3cdf18d95647dcf4d83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 475 zcmX|6O;5r=5Z&EwY2_ml4u*pM|V0wTcBqi~%i6O*ULPIIF1p__k#ed?- zztpRz{sm7?OY7{;dvD(EPG(vME_ixU11)nndTQcH3VN4F2CPf^L@IES zGKXTyYM%%VN>kD*hnL_6-eJ4kxD8)AavsRWoAd)4YujCH{Plc`x)W0zIj$yvN#aw4 zP;Wvf-C-$L`zD0tyl7$-*OTjd0vuu7(j#p)gU!oqCe+8?aAF}1#z%UvCZcSaBeOR} zcrr(#Fg2|~Zxm_SP*HIy_nH1CehFKq@Oxuy*Ph|oUfXtq?c8zNw};oj^L8ua|A&b( kvd10o5b1a84eT7*tznzs9DysGf*p7@iq>cfDU}Qqs@>f>i+tqqdPKDm_%FYQsl4M3tg8twl9B_N3jc*Si_d zs@cd9Qn#oVencw{z~A5(aGootN}M=y;(2Fx^MNWZj5M#uGq30UdY;!e+wBI!`2MH! z4}V@@><@aG4ZN|>_5H~2SE5S48dW*_ilvpb`i!Mj>#>PDU#o1W^eb3p z8?QKI=-K9WH;?sLn()mBErqGEc|6Ezwe|#&rwIJ= zaBQ1WK2oM@RA0&t*>g_tgA1?s@$w1v#DhK!dR8!;*Ht2Dyvfs}dNS5n%Bl>I?E%4m&i z_eOCxJ#o%xa$1waCtRRZYVt!<=HJD1B?v^|`P}U#*gG2Y92D2EHLv}1w!>Zh16Tjf zas3IhQFRK=sP>%s04wrSw*kSC(0GIba*mQj7K*J(0OZBn&_o1HpbVF6qgyy==ZVs7YynLs z)<)Mzhw^35%F!{au?oFSH(LTrvXv^)g-JFzUtI z(A^#z6>A-jZFQ7C(ecnWZs)1mcOQin2Vh;Nk5)*K54O@J4Y0H>Ws=23A>}c!-Q|~{ zR$PQ&T=0fp@<*TyR)@Vd(Gp|Νb-iSZ?U~9 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 BspbFx diff --git a/env/lib/python3.7/site-packages/dns/_compat.py b/env/lib/python3.7/site-packages/dns/_compat.py deleted file mode 100644 index ca0931c..0000000 --- a/env/lib/python3.7/site-packages/dns/_compat.py +++ /dev/null @@ -1,59 +0,0 @@ -import sys -import decimal -from decimal import Context - -PY3 = sys.version_info[0] == 3 -PY2 = sys.version_info[0] == 2 - - -if PY3: - long = int - xrange = range -else: - long = long # pylint: disable=long-builtin - xrange = xrange # pylint: disable=xrange-builtin - -# unicode / binary types -if PY3: - text_type = str - binary_type = bytes - string_types = (str,) - unichr = chr - def maybe_decode(x): - return x.decode() - def maybe_encode(x): - return x.encode() - def maybe_chr(x): - return x - def maybe_ord(x): - return x -else: - text_type = unicode # pylint: disable=unicode-builtin, undefined-variable - binary_type = str - string_types = ( - basestring, # pylint: disable=basestring-builtin, undefined-variable - ) - unichr = unichr # pylint: disable=unichr-builtin - def maybe_decode(x): - return x - def maybe_encode(x): - return x - def maybe_chr(x): - return chr(x) - def maybe_ord(x): - return ord(x) - - -def round_py2_compat(what): - """ - Python 2 and Python 3 use different rounding strategies in round(). This - function ensures that results are python2/3 compatible and backward - compatible with previous py2 releases - :param what: float - :return: rounded long - """ - d = Context( - prec=len(str(long(what))), # round to integer with max precision - rounding=decimal.ROUND_HALF_UP - ).create_decimal(str(what)) # str(): python 2.6 compat - return long(d) diff --git a/env/lib/python3.7/site-packages/dns/dnssec.py b/env/lib/python3.7/site-packages/dns/dnssec.py deleted file mode 100644 index 35da6b5..0000000 --- a/env/lib/python3.7/site-packages/dns/dnssec.py +++ /dev/null @@ -1,519 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""Common DNSSEC-related functions and constants.""" - -from io import BytesIO -import struct -import time - -import dns.exception -import dns.name -import dns.node -import dns.rdataset -import dns.rdata -import dns.rdatatype -import dns.rdataclass -from ._compat import string_types - - -class UnsupportedAlgorithm(dns.exception.DNSException): - """The DNSSEC algorithm is not supported.""" - - -class ValidationFailure(dns.exception.DNSException): - """The DNSSEC signature is invalid.""" - - -#: RSAMD5 -RSAMD5 = 1 -#: DH -DH = 2 -#: DSA -DSA = 3 -#: ECC -ECC = 4 -#: RSASHA1 -RSASHA1 = 5 -#: DSANSEC3SHA1 -DSANSEC3SHA1 = 6 -#: RSASHA1NSEC3SHA1 -RSASHA1NSEC3SHA1 = 7 -#: RSASHA256 -RSASHA256 = 8 -#: RSASHA512 -RSASHA512 = 10 -#: ECDSAP256SHA256 -ECDSAP256SHA256 = 13 -#: ECDSAP384SHA384 -ECDSAP384SHA384 = 14 -#: INDIRECT -INDIRECT = 252 -#: PRIVATEDNS -PRIVATEDNS = 253 -#: PRIVATEOID -PRIVATEOID = 254 - -_algorithm_by_text = { - 'RSAMD5': RSAMD5, - 'DH': DH, - 'DSA': DSA, - 'ECC': ECC, - 'RSASHA1': RSASHA1, - 'DSANSEC3SHA1': DSANSEC3SHA1, - 'RSASHA1NSEC3SHA1': RSASHA1NSEC3SHA1, - 'RSASHA256': RSASHA256, - 'RSASHA512': RSASHA512, - 'INDIRECT': INDIRECT, - 'ECDSAP256SHA256': ECDSAP256SHA256, - 'ECDSAP384SHA384': ECDSAP384SHA384, - 'PRIVATEDNS': PRIVATEDNS, - 'PRIVATEOID': PRIVATEOID, -} - -# We construct the inverse mapping programmatically to ensure that we -# cannot make any mistakes (e.g. omissions, cut-and-paste errors) that -# would cause the mapping not to be true inverse. - -_algorithm_by_value = {y: x for x, y in _algorithm_by_text.items()} - - -def algorithm_from_text(text): - """Convert text into a DNSSEC algorithm value. - - Returns an ``int``. - """ - - value = _algorithm_by_text.get(text.upper()) - if value is None: - value = int(text) - return value - - -def algorithm_to_text(value): - """Convert a DNSSEC algorithm value to text - - Returns a ``str``. - """ - - text = _algorithm_by_value.get(value) - if text is None: - text = str(value) - return text - - -def _to_rdata(record, origin): - s = BytesIO() - record.to_wire(s, origin=origin) - return s.getvalue() - - -def key_id(key, origin=None): - """Return the key id (a 16-bit number) for the specified key. - - Note the *origin* parameter of this function is historical and - is not needed. - - Returns an ``int`` between 0 and 65535. - """ - - rdata = _to_rdata(key, origin) - rdata = bytearray(rdata) - if key.algorithm == RSAMD5: - return (rdata[-3] << 8) + rdata[-2] - else: - total = 0 - for i in range(len(rdata) // 2): - total += (rdata[2 * i] << 8) + \ - rdata[2 * i + 1] - if len(rdata) % 2 != 0: - total += rdata[len(rdata) - 1] << 8 - total += ((total >> 16) & 0xffff) - return total & 0xffff - - -def make_ds(name, key, algorithm, origin=None): - """Create a DS record for a DNSSEC key. - - *name* is the owner name of the DS record. - - *key* is a ``dns.rdtypes.ANY.DNSKEY``. - - *algorithm* is a string describing which hash algorithm to use. The - currently supported hashes are "SHA1" and "SHA256". Case does not - matter for these strings. - - *origin* is a ``dns.name.Name`` and will be used as the origin - if *key* is a relative name. - - Returns a ``dns.rdtypes.ANY.DS``. - """ - - if algorithm.upper() == 'SHA1': - dsalg = 1 - hash = SHA1.new() - elif algorithm.upper() == 'SHA256': - dsalg = 2 - hash = SHA256.new() - else: - raise UnsupportedAlgorithm('unsupported algorithm "%s"' % algorithm) - - if isinstance(name, string_types): - name = dns.name.from_text(name, origin) - hash.update(name.canonicalize().to_wire()) - hash.update(_to_rdata(key, origin)) - digest = hash.digest() - - dsrdata = struct.pack("!HBB", key_id(key), key.algorithm, dsalg) + digest - return dns.rdata.from_wire(dns.rdataclass.IN, dns.rdatatype.DS, dsrdata, 0, - len(dsrdata)) - - -def _find_candidate_keys(keys, rrsig): - candidate_keys = [] - value = keys.get(rrsig.signer) - if value is None: - return None - if isinstance(value, dns.node.Node): - try: - rdataset = value.find_rdataset(dns.rdataclass.IN, - dns.rdatatype.DNSKEY) - except KeyError: - return None - else: - rdataset = value - for rdata in rdataset: - if rdata.algorithm == rrsig.algorithm and \ - key_id(rdata) == rrsig.key_tag: - candidate_keys.append(rdata) - return candidate_keys - - -def _is_rsa(algorithm): - return algorithm in (RSAMD5, RSASHA1, - RSASHA1NSEC3SHA1, RSASHA256, - RSASHA512) - - -def _is_dsa(algorithm): - return algorithm in (DSA, DSANSEC3SHA1) - - -def _is_ecdsa(algorithm): - return _have_ecdsa and (algorithm in (ECDSAP256SHA256, ECDSAP384SHA384)) - - -def _is_md5(algorithm): - return algorithm == RSAMD5 - - -def _is_sha1(algorithm): - return algorithm in (DSA, RSASHA1, - DSANSEC3SHA1, RSASHA1NSEC3SHA1) - - -def _is_sha256(algorithm): - return algorithm in (RSASHA256, ECDSAP256SHA256) - - -def _is_sha384(algorithm): - return algorithm == ECDSAP384SHA384 - - -def _is_sha512(algorithm): - return algorithm == RSASHA512 - - -def _make_hash(algorithm): - if _is_md5(algorithm): - return MD5.new() - if _is_sha1(algorithm): - return SHA1.new() - if _is_sha256(algorithm): - return SHA256.new() - if _is_sha384(algorithm): - return SHA384.new() - if _is_sha512(algorithm): - return SHA512.new() - raise ValidationFailure('unknown hash for algorithm %u' % algorithm) - - -def _make_algorithm_id(algorithm): - if _is_md5(algorithm): - oid = [0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x02, 0x05] - elif _is_sha1(algorithm): - oid = [0x2b, 0x0e, 0x03, 0x02, 0x1a] - elif _is_sha256(algorithm): - oid = [0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01] - elif _is_sha512(algorithm): - oid = [0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03] - else: - raise ValidationFailure('unknown algorithm %u' % algorithm) - olen = len(oid) - dlen = _make_hash(algorithm).digest_size - idbytes = [0x30] + [8 + olen + dlen] + \ - [0x30, olen + 4] + [0x06, olen] + oid + \ - [0x05, 0x00] + [0x04, dlen] - return struct.pack('!%dB' % len(idbytes), *idbytes) - - -def _validate_rrsig(rrset, rrsig, keys, origin=None, now=None): - """Validate an RRset against a single signature rdata - - The owner name of *rrsig* is assumed to be the same as the owner name - of *rrset*. - - *rrset* is the RRset to validate. It can be a ``dns.rrset.RRset`` or - a ``(dns.name.Name, dns.rdataset.Rdataset)`` tuple. - - *rrsig* is a ``dns.rdata.Rdata``, the signature to validate. - - *keys* is the key dictionary, used to find the DNSKEY associated with - a given name. The dictionary is keyed by a ``dns.name.Name``, and has - ``dns.node.Node`` or ``dns.rdataset.Rdataset`` values. - - *origin* is a ``dns.name.Name``, the origin to use for relative names. - - *now* is an ``int``, the time to use when validating the signatures, - in seconds since the UNIX epoch. The default is the current time. - """ - - if isinstance(origin, string_types): - origin = dns.name.from_text(origin, dns.name.root) - - candidate_keys = _find_candidate_keys(keys, rrsig) - if candidate_keys is None: - raise ValidationFailure('unknown key') - - for candidate_key in candidate_keys: - # For convenience, allow the rrset to be specified as a (name, - # rdataset) tuple as well as a proper rrset - if isinstance(rrset, tuple): - rrname = rrset[0] - rdataset = rrset[1] - else: - rrname = rrset.name - rdataset = rrset - - if now is None: - now = time.time() - if rrsig.expiration < now: - raise ValidationFailure('expired') - if rrsig.inception > now: - raise ValidationFailure('not yet valid') - - hash = _make_hash(rrsig.algorithm) - - if _is_rsa(rrsig.algorithm): - keyptr = candidate_key.key - (bytes_,) = struct.unpack('!B', keyptr[0:1]) - keyptr = keyptr[1:] - if bytes_ == 0: - (bytes_,) = struct.unpack('!H', keyptr[0:2]) - keyptr = keyptr[2:] - rsa_e = keyptr[0:bytes_] - rsa_n = keyptr[bytes_:] - try: - pubkey = CryptoRSA.construct( - (number.bytes_to_long(rsa_n), - number.bytes_to_long(rsa_e))) - except ValueError: - raise ValidationFailure('invalid public key') - sig = rrsig.signature - elif _is_dsa(rrsig.algorithm): - keyptr = candidate_key.key - (t,) = struct.unpack('!B', keyptr[0:1]) - keyptr = keyptr[1:] - octets = 64 + t * 8 - dsa_q = keyptr[0:20] - keyptr = keyptr[20:] - dsa_p = keyptr[0:octets] - keyptr = keyptr[octets:] - dsa_g = keyptr[0:octets] - keyptr = keyptr[octets:] - dsa_y = keyptr[0:octets] - pubkey = CryptoDSA.construct( - (number.bytes_to_long(dsa_y), - number.bytes_to_long(dsa_g), - number.bytes_to_long(dsa_p), - number.bytes_to_long(dsa_q))) - sig = rrsig.signature[1:] - elif _is_ecdsa(rrsig.algorithm): - # use ecdsa for NIST-384p -- not currently supported by pycryptodome - - keyptr = candidate_key.key - - if rrsig.algorithm == ECDSAP256SHA256: - curve = ecdsa.curves.NIST256p - key_len = 32 - elif rrsig.algorithm == ECDSAP384SHA384: - curve = ecdsa.curves.NIST384p - key_len = 48 - - x = number.bytes_to_long(keyptr[0:key_len]) - y = number.bytes_to_long(keyptr[key_len:key_len * 2]) - if not ecdsa.ecdsa.point_is_valid(curve.generator, x, y): - raise ValidationFailure('invalid ECDSA key') - point = ecdsa.ellipticcurve.Point(curve.curve, x, y, curve.order) - verifying_key = ecdsa.keys.VerifyingKey.from_public_point(point, - curve) - pubkey = ECKeyWrapper(verifying_key, key_len) - r = rrsig.signature[:key_len] - s = rrsig.signature[key_len:] - sig = ecdsa.ecdsa.Signature(number.bytes_to_long(r), - number.bytes_to_long(s)) - - else: - raise ValidationFailure('unknown algorithm %u' % rrsig.algorithm) - - hash.update(_to_rdata(rrsig, origin)[:18]) - hash.update(rrsig.signer.to_digestable(origin)) - - if rrsig.labels < len(rrname) - 1: - suffix = rrname.split(rrsig.labels + 1)[1] - rrname = dns.name.from_text('*', suffix) - rrnamebuf = rrname.to_digestable(origin) - rrfixed = struct.pack('!HHI', rdataset.rdtype, rdataset.rdclass, - rrsig.original_ttl) - rrlist = sorted(rdataset) - for rr in rrlist: - hash.update(rrnamebuf) - hash.update(rrfixed) - rrdata = rr.to_digestable(origin) - rrlen = struct.pack('!H', len(rrdata)) - hash.update(rrlen) - hash.update(rrdata) - - try: - if _is_rsa(rrsig.algorithm): - verifier = pkcs1_15.new(pubkey) - # will raise ValueError if verify fails: - verifier.verify(hash, sig) - elif _is_dsa(rrsig.algorithm): - verifier = DSS.new(pubkey, 'fips-186-3') - verifier.verify(hash, sig) - elif _is_ecdsa(rrsig.algorithm): - digest = hash.digest() - if not pubkey.verify(digest, sig): - raise ValueError - else: - # Raise here for code clarity; this won't actually ever happen - # since if the algorithm is really unknown we'd already have - # raised an exception above - raise ValidationFailure('unknown algorithm %u' % rrsig.algorithm) - # If we got here, we successfully verified so we can return without error - return - except ValueError: - # this happens on an individual validation failure - continue - # nothing verified -- raise failure: - raise ValidationFailure('verify failure') - - -def _validate(rrset, rrsigset, keys, origin=None, now=None): - """Validate an RRset. - - *rrset* is the RRset to validate. It can be a ``dns.rrset.RRset`` or - a ``(dns.name.Name, dns.rdataset.Rdataset)`` tuple. - - *rrsigset* is the signature RRset to be validated. It can be a - ``dns.rrset.RRset`` or a ``(dns.name.Name, dns.rdataset.Rdataset)`` tuple. - - *keys* is the key dictionary, used to find the DNSKEY associated with - a given name. The dictionary is keyed by a ``dns.name.Name``, and has - ``dns.node.Node`` or ``dns.rdataset.Rdataset`` values. - - *origin* is a ``dns.name.Name``, the origin to use for relative names. - - *now* is an ``int``, the time to use when validating the signatures, - in seconds since the UNIX epoch. The default is the current time. - """ - - if isinstance(origin, string_types): - origin = dns.name.from_text(origin, dns.name.root) - - if isinstance(rrset, tuple): - rrname = rrset[0] - else: - rrname = rrset.name - - if isinstance(rrsigset, tuple): - rrsigname = rrsigset[0] - rrsigrdataset = rrsigset[1] - else: - rrsigname = rrsigset.name - rrsigrdataset = rrsigset - - rrname = rrname.choose_relativity(origin) - rrsigname = rrsigname.choose_relativity(origin) - if rrname != rrsigname: - raise ValidationFailure("owner names do not match") - - for rrsig in rrsigrdataset: - try: - _validate_rrsig(rrset, rrsig, keys, origin, now) - return - except ValidationFailure: - pass - raise ValidationFailure("no RRSIGs validated") - - -def _need_pycrypto(*args, **kwargs): - raise NotImplementedError("DNSSEC validation requires pycryptodome/pycryptodomex") - - -try: - try: - # test we're using pycryptodome, not pycrypto (which misses SHA1 for example) - from Crypto.Hash import MD5, SHA1, SHA256, SHA384, SHA512 - from Crypto.PublicKey import RSA as CryptoRSA, DSA as CryptoDSA - from Crypto.Signature import pkcs1_15, DSS - from Crypto.Util import number - except ImportError: - from Cryptodome.Hash import MD5, SHA1, SHA256, SHA384, SHA512 - from Cryptodome.PublicKey import RSA as CryptoRSA, DSA as CryptoDSA - from Cryptodome.Signature import pkcs1_15, DSS - from Cryptodome.Util import number -except ImportError: - validate = _need_pycrypto - validate_rrsig = _need_pycrypto - _have_pycrypto = False - _have_ecdsa = False -else: - validate = _validate - validate_rrsig = _validate_rrsig - _have_pycrypto = True - - try: - import ecdsa - import ecdsa.ecdsa - import ecdsa.ellipticcurve - import ecdsa.keys - except ImportError: - _have_ecdsa = False - else: - _have_ecdsa = True - - class ECKeyWrapper(object): - - def __init__(self, key, key_len): - self.key = key - self.key_len = key_len - - def verify(self, digest, sig): - diglong = number.bytes_to_long(digest) - return self.key.pubkey.verifies(diglong, sig) diff --git a/env/lib/python3.7/site-packages/dns/e164.py b/env/lib/python3.7/site-packages/dns/e164.py deleted file mode 100644 index 758c47a..0000000 --- a/env/lib/python3.7/site-packages/dns/e164.py +++ /dev/null @@ -1,105 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2006-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""DNS E.164 helpers.""" - -import dns.exception -import dns.name -import dns.resolver -from ._compat import string_types, maybe_decode - -#: The public E.164 domain. -public_enum_domain = dns.name.from_text('e164.arpa.') - - -def from_e164(text, origin=public_enum_domain): - """Convert an E.164 number in textual form into a Name object whose - value is the ENUM domain name for that number. - - Non-digits in the text are ignored, i.e. "16505551212", - "+1.650.555.1212" and "1 (650) 555-1212" are all the same. - - *text*, a ``text``, is an E.164 number in textual form. - - *origin*, a ``dns.name.Name``, the domain in which the number - should be constructed. The default is ``e164.arpa.``. - - Returns a ``dns.name.Name``. - """ - - parts = [d for d in text if d.isdigit()] - parts.reverse() - return dns.name.from_text('.'.join(parts), origin=origin) - - -def to_e164(name, origin=public_enum_domain, want_plus_prefix=True): - """Convert an ENUM domain name into an E.164 number. - - Note that dnspython does not have any information about preferred - number formats within national numbering plans, so all numbers are - emitted as a simple string of digits, prefixed by a '+' (unless - *want_plus_prefix* is ``False``). - - *name* is a ``dns.name.Name``, the ENUM domain name. - - *origin* is a ``dns.name.Name``, a domain containing the ENUM - domain name. The name is relativized to this domain before being - converted to text. If ``None``, no relativization is done. - - *want_plus_prefix* is a ``bool``. If True, add a '+' to the beginning of - the returned number. - - Returns a ``text``. - - """ - if origin is not None: - name = name.relativize(origin) - dlabels = [d for d in name.labels if d.isdigit() and len(d) == 1] - if len(dlabels) != len(name.labels): - raise dns.exception.SyntaxError('non-digit labels in ENUM domain name') - dlabels.reverse() - text = b''.join(dlabels) - if want_plus_prefix: - text = b'+' + text - return maybe_decode(text) - - -def query(number, domains, resolver=None): - """Look for NAPTR RRs for the specified number in the specified domains. - - e.g. lookup('16505551212', ['e164.dnspython.org.', 'e164.arpa.']) - - *number*, a ``text`` is the number to look for. - - *domains* is an iterable containing ``dns.name.Name`` values. - - *resolver*, a ``dns.resolver.Resolver``, is the resolver to use. If - ``None``, the default resolver is used. - """ - - if resolver is None: - resolver = dns.resolver.get_default_resolver() - e_nx = dns.resolver.NXDOMAIN() - for domain in domains: - if isinstance(domain, string_types): - domain = dns.name.from_text(domain) - qname = dns.e164.from_e164(number, domain) - try: - return resolver.query(qname, 'NAPTR') - except dns.resolver.NXDOMAIN as e: - e_nx += e - raise e_nx diff --git a/env/lib/python3.7/site-packages/dns/edns.py b/env/lib/python3.7/site-packages/dns/edns.py deleted file mode 100644 index 5660f7b..0000000 --- a/env/lib/python3.7/site-packages/dns/edns.py +++ /dev/null @@ -1,269 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2009-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""EDNS Options""" - -from __future__ import absolute_import - -import math -import struct - -import dns.inet - -#: NSID -NSID = 3 -#: DAU -DAU = 5 -#: DHU -DHU = 6 -#: N3U -N3U = 7 -#: ECS (client-subnet) -ECS = 8 -#: EXPIRE -EXPIRE = 9 -#: COOKIE -COOKIE = 10 -#: KEEPALIVE -KEEPALIVE = 11 -#: PADDING -PADDING = 12 -#: CHAIN -CHAIN = 13 - -class Option(object): - - """Base class for all EDNS option types.""" - - def __init__(self, otype): - """Initialize an option. - - *otype*, an ``int``, is the option type. - """ - self.otype = otype - - def to_wire(self, file): - """Convert an option to wire format. - """ - raise NotImplementedError - - @classmethod - def from_wire(cls, otype, wire, current, olen): - """Build an EDNS option object from wire format. - - *otype*, an ``int``, is the option type. - - *wire*, a ``binary``, is the wire-format message. - - *current*, an ``int``, is the offset in *wire* of the beginning - of the rdata. - - *olen*, an ``int``, is the length of the wire-format option data - - Returns a ``dns.edns.Option``. - """ - - raise NotImplementedError - - def _cmp(self, other): - """Compare an EDNS option with another option of the same type. - - Returns < 0 if < *other*, 0 if == *other*, and > 0 if > *other*. - """ - raise NotImplementedError - - def __eq__(self, other): - if not isinstance(other, Option): - return False - if self.otype != other.otype: - return False - return self._cmp(other) == 0 - - def __ne__(self, other): - if not isinstance(other, Option): - return False - if self.otype != other.otype: - return False - return self._cmp(other) != 0 - - def __lt__(self, other): - if not isinstance(other, Option) or \ - self.otype != other.otype: - return NotImplemented - return self._cmp(other) < 0 - - def __le__(self, other): - if not isinstance(other, Option) or \ - self.otype != other.otype: - return NotImplemented - return self._cmp(other) <= 0 - - def __ge__(self, other): - if not isinstance(other, Option) or \ - self.otype != other.otype: - return NotImplemented - return self._cmp(other) >= 0 - - def __gt__(self, other): - if not isinstance(other, Option) or \ - self.otype != other.otype: - return NotImplemented - return self._cmp(other) > 0 - - -class GenericOption(Option): - - """Generic Option Class - - This class is used for EDNS option types for which we have no better - implementation. - """ - - def __init__(self, otype, data): - super(GenericOption, self).__init__(otype) - self.data = data - - def to_wire(self, file): - file.write(self.data) - - def to_text(self): - return "Generic %d" % self.otype - - @classmethod - def from_wire(cls, otype, wire, current, olen): - return cls(otype, wire[current: current + olen]) - - def _cmp(self, other): - if self.data == other.data: - return 0 - if self.data > other.data: - return 1 - return -1 - - -class ECSOption(Option): - """EDNS Client Subnet (ECS, RFC7871)""" - - def __init__(self, address, srclen=None, scopelen=0): - """*address*, a ``text``, is the client address information. - - *srclen*, an ``int``, the source prefix length, which is the - leftmost number of bits of the address to be used for the - lookup. The default is 24 for IPv4 and 56 for IPv6. - - *scopelen*, an ``int``, the scope prefix length. This value - must be 0 in queries, and should be set in responses. - """ - - super(ECSOption, self).__init__(ECS) - af = dns.inet.af_for_address(address) - - if af == dns.inet.AF_INET6: - self.family = 2 - if srclen is None: - srclen = 56 - elif af == dns.inet.AF_INET: - self.family = 1 - if srclen is None: - srclen = 24 - else: - raise ValueError('Bad ip family') - - self.address = address - self.srclen = srclen - self.scopelen = scopelen - - addrdata = dns.inet.inet_pton(af, address) - nbytes = int(math.ceil(srclen/8.0)) - - # Truncate to srclen and pad to the end of the last octet needed - # See RFC section 6 - self.addrdata = addrdata[:nbytes] - nbits = srclen % 8 - if nbits != 0: - last = struct.pack('B', ord(self.addrdata[-1:]) & (0xff << nbits)) - self.addrdata = self.addrdata[:-1] + last - - def to_text(self): - return "ECS {}/{} scope/{}".format(self.address, self.srclen, - self.scopelen) - - def to_wire(self, file): - file.write(struct.pack('!H', self.family)) - file.write(struct.pack('!BB', self.srclen, self.scopelen)) - file.write(self.addrdata) - - @classmethod - def from_wire(cls, otype, wire, cur, olen): - family, src, scope = struct.unpack('!HBB', wire[cur:cur+4]) - cur += 4 - - addrlen = int(math.ceil(src/8.0)) - - if family == 1: - af = dns.inet.AF_INET - pad = 4 - addrlen - elif family == 2: - af = dns.inet.AF_INET6 - pad = 16 - addrlen - else: - raise ValueError('unsupported family') - - addr = dns.inet.inet_ntop(af, wire[cur:cur+addrlen] + b'\x00' * pad) - return cls(addr, src, scope) - - def _cmp(self, other): - if self.addrdata == other.addrdata: - return 0 - if self.addrdata > other.addrdata: - return 1 - return -1 - -_type_to_class = { - ECS: ECSOption -} - -def get_option_class(otype): - """Return the class for the specified option type. - - The GenericOption class is used if a more specific class is not - known. - """ - - cls = _type_to_class.get(otype) - if cls is None: - cls = GenericOption - return cls - - -def option_from_wire(otype, wire, current, olen): - """Build an EDNS option object from wire format. - - *otype*, an ``int``, is the option type. - - *wire*, a ``binary``, is the wire-format message. - - *current*, an ``int``, is the offset in *wire* of the beginning - of the rdata. - - *olen*, an ``int``, is the length of the wire-format option data - - Returns an instance of a subclass of ``dns.edns.Option``. - """ - - cls = get_option_class(otype) - return cls.from_wire(otype, wire, current, olen) diff --git a/env/lib/python3.7/site-packages/dns/entropy.py b/env/lib/python3.7/site-packages/dns/entropy.py deleted file mode 100644 index 00c6a4b..0000000 --- a/env/lib/python3.7/site-packages/dns/entropy.py +++ /dev/null @@ -1,148 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2009-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import os -import random -import time -from ._compat import long, binary_type -try: - import threading as _threading -except ImportError: - import dummy_threading as _threading - - -class EntropyPool(object): - - # This is an entropy pool for Python implementations that do not - # have a working SystemRandom. I'm not sure there are any, but - # leaving this code doesn't hurt anything as the library code - # is used if present. - - def __init__(self, seed=None): - self.pool_index = 0 - self.digest = None - self.next_byte = 0 - self.lock = _threading.Lock() - try: - import hashlib - self.hash = hashlib.sha1() - self.hash_len = 20 - except ImportError: - try: - import sha - self.hash = sha.new() - self.hash_len = 20 - except ImportError: - import md5 # pylint: disable=import-error - self.hash = md5.new() - self.hash_len = 16 - self.pool = bytearray(b'\0' * self.hash_len) - if seed is not None: - self.stir(bytearray(seed)) - self.seeded = True - self.seed_pid = os.getpid() - else: - self.seeded = False - self.seed_pid = 0 - - def stir(self, entropy, already_locked=False): - if not already_locked: - self.lock.acquire() - try: - for c in entropy: - if self.pool_index == self.hash_len: - self.pool_index = 0 - b = c & 0xff - self.pool[self.pool_index] ^= b - self.pool_index += 1 - finally: - if not already_locked: - self.lock.release() - - def _maybe_seed(self): - if not self.seeded or self.seed_pid != os.getpid(): - try: - seed = os.urandom(16) - except Exception: - try: - r = open('/dev/urandom', 'rb', 0) - try: - seed = r.read(16) - finally: - r.close() - except Exception: - seed = str(time.time()) - self.seeded = True - self.seed_pid = os.getpid() - self.digest = None - seed = bytearray(seed) - self.stir(seed, True) - - def random_8(self): - self.lock.acquire() - try: - self._maybe_seed() - if self.digest is None or self.next_byte == self.hash_len: - self.hash.update(binary_type(self.pool)) - self.digest = bytearray(self.hash.digest()) - self.stir(self.digest, True) - self.next_byte = 0 - value = self.digest[self.next_byte] - self.next_byte += 1 - finally: - self.lock.release() - return value - - def random_16(self): - return self.random_8() * 256 + self.random_8() - - def random_32(self): - return self.random_16() * 65536 + self.random_16() - - def random_between(self, first, last): - size = last - first + 1 - if size > long(4294967296): - raise ValueError('too big') - if size > 65536: - rand = self.random_32 - max = long(4294967295) - elif size > 256: - rand = self.random_16 - max = 65535 - else: - rand = self.random_8 - max = 255 - return first + size * rand() // (max + 1) - -pool = EntropyPool() - -try: - system_random = random.SystemRandom() -except Exception: - system_random = None - -def random_16(): - if system_random is not None: - return system_random.randrange(0, 65536) - else: - return pool.random_16() - -def between(first, last): - if system_random is not None: - return system_random.randrange(first, last + 1) - else: - return pool.random_between(first, last) diff --git a/env/lib/python3.7/site-packages/dns/exception.py b/env/lib/python3.7/site-packages/dns/exception.py deleted file mode 100644 index 71ff04f..0000000 --- a/env/lib/python3.7/site-packages/dns/exception.py +++ /dev/null @@ -1,128 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""Common DNS Exceptions. - -Dnspython modules may also define their own exceptions, which will -always be subclasses of ``DNSException``. -""" - -class DNSException(Exception): - """Abstract base class shared by all dnspython exceptions. - - It supports two basic modes of operation: - - a) Old/compatible mode is used if ``__init__`` was called with - empty *kwargs*. In compatible mode all *args* are passed - to the standard Python Exception class as before and all *args* are - printed by the standard ``__str__`` implementation. Class variable - ``msg`` (or doc string if ``msg`` is ``None``) is returned from ``str()`` - if *args* is empty. - - b) New/parametrized mode is used if ``__init__`` was called with - non-empty *kwargs*. - In the new mode *args* must be empty and all kwargs must match - those set in class variable ``supp_kwargs``. All kwargs are stored inside - ``self.kwargs`` and used in a new ``__str__`` implementation to construct - a formatted message based on the ``fmt`` class variable, a ``string``. - - In the simplest case it is enough to override the ``supp_kwargs`` - and ``fmt`` class variables to get nice parametrized messages. - """ - - msg = None # non-parametrized message - supp_kwargs = set() # accepted parameters for _fmt_kwargs (sanity check) - fmt = None # message parametrized with results from _fmt_kwargs - - def __init__(self, *args, **kwargs): - self._check_params(*args, **kwargs) - if kwargs: - self.kwargs = self._check_kwargs(**kwargs) - self.msg = str(self) - else: - self.kwargs = dict() # defined but empty for old mode exceptions - if self.msg is None: - # doc string is better implicit message than empty string - self.msg = self.__doc__ - if args: - super(DNSException, self).__init__(*args) - else: - super(DNSException, self).__init__(self.msg) - - def _check_params(self, *args, **kwargs): - """Old exceptions supported only args and not kwargs. - - For sanity we do not allow to mix old and new behavior.""" - if args or kwargs: - assert bool(args) != bool(kwargs), \ - 'keyword arguments are mutually exclusive with positional args' - - def _check_kwargs(self, **kwargs): - if kwargs: - assert set(kwargs.keys()) == self.supp_kwargs, \ - 'following set of keyword args is required: %s' % ( - self.supp_kwargs) - return kwargs - - def _fmt_kwargs(self, **kwargs): - """Format kwargs before printing them. - - Resulting dictionary has to have keys necessary for str.format call - on fmt class variable. - """ - fmtargs = {} - for kw, data in kwargs.items(): - if isinstance(data, (list, set)): - # convert list of to list of str() - fmtargs[kw] = list(map(str, data)) - if len(fmtargs[kw]) == 1: - # remove list brackets [] from single-item lists - fmtargs[kw] = fmtargs[kw].pop() - else: - fmtargs[kw] = data - return fmtargs - - def __str__(self): - if self.kwargs and self.fmt: - # provide custom message constructed from keyword arguments - fmtargs = self._fmt_kwargs(**self.kwargs) - return self.fmt.format(**fmtargs) - else: - # print *args directly in the same way as old DNSException - return super(DNSException, self).__str__() - - -class FormError(DNSException): - """DNS message is malformed.""" - - -class SyntaxError(DNSException): - """Text input is malformed.""" - - -class UnexpectedEnd(SyntaxError): - """Text input ended unexpectedly.""" - - -class TooBig(DNSException): - """The DNS message is too big.""" - - -class Timeout(DNSException): - """The DNS operation timed out.""" - supp_kwargs = {'timeout'} - fmt = "The DNS operation timed out after {timeout} seconds" diff --git a/env/lib/python3.7/site-packages/dns/flags.py b/env/lib/python3.7/site-packages/dns/flags.py deleted file mode 100644 index 0119dec..0000000 --- a/env/lib/python3.7/site-packages/dns/flags.py +++ /dev/null @@ -1,130 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2001-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""DNS Message Flags.""" - -# Standard DNS flags - -#: Query Response -QR = 0x8000 -#: Authoritative Answer -AA = 0x0400 -#: Truncated Response -TC = 0x0200 -#: Recursion Desired -RD = 0x0100 -#: Recursion Available -RA = 0x0080 -#: Authentic Data -AD = 0x0020 -#: Checking Disabled -CD = 0x0010 - -# EDNS flags - -#: DNSSEC answer OK -DO = 0x8000 - -_by_text = { - 'QR': QR, - 'AA': AA, - 'TC': TC, - 'RD': RD, - 'RA': RA, - 'AD': AD, - 'CD': CD -} - -_edns_by_text = { - 'DO': DO -} - - -# We construct the inverse mappings programmatically to ensure that we -# cannot make any mistakes (e.g. omissions, cut-and-paste errors) that -# would cause the mappings not to be true inverses. - -_by_value = {y: x for x, y in _by_text.items()} - -_edns_by_value = {y: x for x, y in _edns_by_text.items()} - - -def _order_flags(table): - order = list(table.items()) - order.sort() - order.reverse() - return order - -_flags_order = _order_flags(_by_value) - -_edns_flags_order = _order_flags(_edns_by_value) - - -def _from_text(text, table): - flags = 0 - tokens = text.split() - for t in tokens: - flags = flags | table[t.upper()] - return flags - - -def _to_text(flags, table, order): - text_flags = [] - for k, v in order: - if flags & k != 0: - text_flags.append(v) - return ' '.join(text_flags) - - -def from_text(text): - """Convert a space-separated list of flag text values into a flags - value. - - Returns an ``int`` - """ - - return _from_text(text, _by_text) - - -def to_text(flags): - """Convert a flags value into a space-separated list of flag text - values. - - Returns a ``text``. - """ - - return _to_text(flags, _by_value, _flags_order) - - -def edns_from_text(text): - """Convert a space-separated list of EDNS flag text values into a EDNS - flags value. - - Returns an ``int`` - """ - - return _from_text(text, _edns_by_text) - - -def edns_to_text(flags): - """Convert an EDNS flags value into a space-separated list of EDNS flag - text values. - - Returns a ``text``. - """ - - return _to_text(flags, _edns_by_value, _edns_flags_order) diff --git a/env/lib/python3.7/site-packages/dns/grange.py b/env/lib/python3.7/site-packages/dns/grange.py deleted file mode 100644 index ffe8be7..0000000 --- a/env/lib/python3.7/site-packages/dns/grange.py +++ /dev/null @@ -1,69 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2012-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""DNS GENERATE range conversion.""" - -import dns - -def from_text(text): - """Convert the text form of a range in a ``$GENERATE`` statement to an - integer. - - *text*, a ``str``, the textual range in ``$GENERATE`` form. - - Returns a tuple of three ``int`` values ``(start, stop, step)``. - """ - - # TODO, figure out the bounds on start, stop and step. - step = 1 - cur = '' - state = 0 - # state 0 1 2 3 4 - # x - y / z - - if text and text[0] == '-': - raise dns.exception.SyntaxError("Start cannot be a negative number") - - for c in text: - if c == '-' and state == 0: - start = int(cur) - cur = '' - state = 2 - elif c == '/': - stop = int(cur) - cur = '' - state = 4 - elif c.isdigit(): - cur += c - else: - raise dns.exception.SyntaxError("Could not parse %s" % (c)) - - if state in (1, 3): - raise dns.exception.SyntaxError() - - if state == 2: - stop = int(cur) - - if state == 4: - step = int(cur) - - assert step >= 1 - assert start >= 0 - assert start <= stop - # TODO, can start == stop? - - return (start, stop, step) diff --git a/env/lib/python3.7/site-packages/dns/hash.py b/env/lib/python3.7/site-packages/dns/hash.py deleted file mode 100644 index 1713e62..0000000 --- a/env/lib/python3.7/site-packages/dns/hash.py +++ /dev/null @@ -1,37 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""Hashing backwards compatibility wrapper""" - -import hashlib -import warnings - -warnings.warn( - "dns.hash module will be removed in future versions. Please use hashlib instead.", - DeprecationWarning) - -hashes = {} -hashes['MD5'] = hashlib.md5 -hashes['SHA1'] = hashlib.sha1 -hashes['SHA224'] = hashlib.sha224 -hashes['SHA256'] = hashlib.sha256 -hashes['SHA384'] = hashlib.sha384 -hashes['SHA512'] = hashlib.sha512 - - -def get(algorithm): - return hashes[algorithm.upper()] diff --git a/env/lib/python3.7/site-packages/dns/inet.py b/env/lib/python3.7/site-packages/dns/inet.py deleted file mode 100644 index c8d7c1b..0000000 --- a/env/lib/python3.7/site-packages/dns/inet.py +++ /dev/null @@ -1,124 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""Generic Internet address helper functions.""" - -import socket - -import dns.ipv4 -import dns.ipv6 - -from ._compat import maybe_ord - -# We assume that AF_INET is always defined. - -AF_INET = socket.AF_INET - -# AF_INET6 might not be defined in the socket module, but we need it. -# We'll try to use the socket module's value, and if it doesn't work, -# we'll use our own value. - -try: - AF_INET6 = socket.AF_INET6 -except AttributeError: - AF_INET6 = 9999 - - -def inet_pton(family, text): - """Convert the textual form of a network address into its binary form. - - *family* is an ``int``, the address family. - - *text* is a ``text``, the textual address. - - Raises ``NotImplementedError`` if the address family specified is not - implemented. - - Returns a ``binary``. - """ - - if family == AF_INET: - return dns.ipv4.inet_aton(text) - elif family == AF_INET6: - return dns.ipv6.inet_aton(text) - else: - raise NotImplementedError - - -def inet_ntop(family, address): - """Convert the binary form of a network address into its textual form. - - *family* is an ``int``, the address family. - - *address* is a ``binary``, the network address in binary form. - - Raises ``NotImplementedError`` if the address family specified is not - implemented. - - Returns a ``text``. - """ - - if family == AF_INET: - return dns.ipv4.inet_ntoa(address) - elif family == AF_INET6: - return dns.ipv6.inet_ntoa(address) - else: - raise NotImplementedError - - -def af_for_address(text): - """Determine the address family of a textual-form network address. - - *text*, a ``text``, the textual address. - - Raises ``ValueError`` if the address family cannot be determined - from the input. - - Returns an ``int``. - """ - - try: - dns.ipv4.inet_aton(text) - return AF_INET - except Exception: - try: - dns.ipv6.inet_aton(text) - return AF_INET6 - except: - raise ValueError - - -def is_multicast(text): - """Is the textual-form network address a multicast address? - - *text*, a ``text``, the textual address. - - Raises ``ValueError`` if the address family cannot be determined - from the input. - - Returns a ``bool``. - """ - - try: - first = maybe_ord(dns.ipv4.inet_aton(text)[0]) - return first >= 224 and first <= 239 - except Exception: - try: - first = maybe_ord(dns.ipv6.inet_aton(text)[0]) - return first == 255 - except Exception: - raise ValueError diff --git a/env/lib/python3.7/site-packages/dns/ipv4.py b/env/lib/python3.7/site-packages/dns/ipv4.py deleted file mode 100644 index 8fc4f7d..0000000 --- a/env/lib/python3.7/site-packages/dns/ipv4.py +++ /dev/null @@ -1,63 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""IPv4 helper functions.""" - -import struct - -import dns.exception -from ._compat import binary_type - -def inet_ntoa(address): - """Convert an IPv4 address in binary form to text form. - - *address*, a ``binary``, the IPv4 address in binary form. - - Returns a ``text``. - """ - - if len(address) != 4: - raise dns.exception.SyntaxError - if not isinstance(address, bytearray): - address = bytearray(address) - return ('%u.%u.%u.%u' % (address[0], address[1], - address[2], address[3])) - -def inet_aton(text): - """Convert an IPv4 address in text form to binary form. - - *text*, a ``text``, the IPv4 address in textual form. - - Returns a ``binary``. - """ - - if not isinstance(text, binary_type): - text = text.encode() - parts = text.split(b'.') - if len(parts) != 4: - raise dns.exception.SyntaxError - for part in parts: - if not part.isdigit(): - raise dns.exception.SyntaxError - if len(part) > 1 and part[0] == '0': - # No leading zeros - raise dns.exception.SyntaxError - try: - bytes = [int(part) for part in parts] - return struct.pack('BBBB', *bytes) - except: - raise dns.exception.SyntaxError diff --git a/env/lib/python3.7/site-packages/dns/ipv6.py b/env/lib/python3.7/site-packages/dns/ipv6.py deleted file mode 100644 index 128e56c..0000000 --- a/env/lib/python3.7/site-packages/dns/ipv6.py +++ /dev/null @@ -1,181 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""IPv6 helper functions.""" - -import re -import binascii - -import dns.exception -import dns.ipv4 -from ._compat import xrange, binary_type, maybe_decode - -_leading_zero = re.compile(r'0+([0-9a-f]+)') - -def inet_ntoa(address): - """Convert an IPv6 address in binary form to text form. - - *address*, a ``binary``, the IPv6 address in binary form. - - Raises ``ValueError`` if the address isn't 16 bytes long. - Returns a ``text``. - """ - - if len(address) != 16: - raise ValueError("IPv6 addresses are 16 bytes long") - hex = binascii.hexlify(address) - chunks = [] - i = 0 - l = len(hex) - while i < l: - chunk = maybe_decode(hex[i : i + 4]) - # strip leading zeros. we do this with an re instead of - # with lstrip() because lstrip() didn't support chars until - # python 2.2.2 - m = _leading_zero.match(chunk) - if not m is None: - chunk = m.group(1) - chunks.append(chunk) - i += 4 - # - # Compress the longest subsequence of 0-value chunks to :: - # - best_start = 0 - best_len = 0 - start = -1 - last_was_zero = False - for i in xrange(8): - if chunks[i] != '0': - if last_was_zero: - end = i - current_len = end - start - if current_len > best_len: - best_start = start - best_len = current_len - last_was_zero = False - elif not last_was_zero: - start = i - last_was_zero = True - if last_was_zero: - end = 8 - current_len = end - start - if current_len > best_len: - best_start = start - best_len = current_len - if best_len > 1: - if best_start == 0 and \ - (best_len == 6 or - best_len == 5 and chunks[5] == 'ffff'): - # We have an embedded IPv4 address - if best_len == 6: - prefix = '::' - else: - prefix = '::ffff:' - hex = prefix + dns.ipv4.inet_ntoa(address[12:]) - else: - hex = ':'.join(chunks[:best_start]) + '::' + \ - ':'.join(chunks[best_start + best_len:]) - else: - hex = ':'.join(chunks) - return hex - -_v4_ending = re.compile(br'(.*):(\d+\.\d+\.\d+\.\d+)$') -_colon_colon_start = re.compile(br'::.*') -_colon_colon_end = re.compile(br'.*::$') - -def inet_aton(text): - """Convert an IPv6 address in text form to binary form. - - *text*, a ``text``, the IPv6 address in textual form. - - Returns a ``binary``. - """ - - # - # Our aim here is not something fast; we just want something that works. - # - if not isinstance(text, binary_type): - text = text.encode() - - if text == b'::': - text = b'0::' - # - # Get rid of the icky dot-quad syntax if we have it. - # - m = _v4_ending.match(text) - if not m is None: - b = bytearray(dns.ipv4.inet_aton(m.group(2))) - text = (u"{}:{:02x}{:02x}:{:02x}{:02x}".format(m.group(1).decode(), - b[0], b[1], b[2], - b[3])).encode() - # - # Try to turn '::' into ':'; if no match try to - # turn '::' into ':' - # - m = _colon_colon_start.match(text) - if not m is None: - text = text[1:] - else: - m = _colon_colon_end.match(text) - if not m is None: - text = text[:-1] - # - # Now canonicalize into 8 chunks of 4 hex digits each - # - chunks = text.split(b':') - l = len(chunks) - if l > 8: - raise dns.exception.SyntaxError - seen_empty = False - canonical = [] - for c in chunks: - if c == b'': - if seen_empty: - raise dns.exception.SyntaxError - seen_empty = True - for i in xrange(0, 8 - l + 1): - canonical.append(b'0000') - else: - lc = len(c) - if lc > 4: - raise dns.exception.SyntaxError - if lc != 4: - c = (b'0' * (4 - lc)) + c - canonical.append(c) - if l < 8 and not seen_empty: - raise dns.exception.SyntaxError - text = b''.join(canonical) - - # - # Finally we can go to binary. - # - try: - return binascii.unhexlify(text) - except (binascii.Error, TypeError): - raise dns.exception.SyntaxError - -_mapped_prefix = b'\x00' * 10 + b'\xff\xff' - -def is_mapped(address): - """Is the specified address a mapped IPv4 address? - - *address*, a ``binary`` is an IPv6 address in binary form. - - Returns a ``bool``. - """ - - return address.startswith(_mapped_prefix) diff --git a/env/lib/python3.7/site-packages/dns/message.py b/env/lib/python3.7/site-packages/dns/message.py deleted file mode 100644 index 9d2b2f4..0000000 --- a/env/lib/python3.7/site-packages/dns/message.py +++ /dev/null @@ -1,1175 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2001-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""DNS Messages""" - -from __future__ import absolute_import - -from io import StringIO -import struct -import time - -import dns.edns -import dns.exception -import dns.flags -import dns.name -import dns.opcode -import dns.entropy -import dns.rcode -import dns.rdata -import dns.rdataclass -import dns.rdatatype -import dns.rrset -import dns.renderer -import dns.tsig -import dns.wiredata - -from ._compat import long, xrange, string_types - - -class ShortHeader(dns.exception.FormError): - """The DNS packet passed to from_wire() is too short.""" - - -class TrailingJunk(dns.exception.FormError): - """The DNS packet passed to from_wire() has extra junk at the end of it.""" - - -class UnknownHeaderField(dns.exception.DNSException): - """The header field name was not recognized when converting from text - into a message.""" - - -class BadEDNS(dns.exception.FormError): - """An OPT record occurred somewhere other than the start of - the additional data section.""" - - -class BadTSIG(dns.exception.FormError): - """A TSIG record occurred somewhere other than the end of - the additional data section.""" - - -class UnknownTSIGKey(dns.exception.DNSException): - """A TSIG with an unknown key was received.""" - - -#: The question section number -QUESTION = 0 - -#: The answer section number -ANSWER = 1 - -#: The authority section number -AUTHORITY = 2 - -#: The additional section number -ADDITIONAL = 3 - -class Message(object): - """A DNS message.""" - - def __init__(self, id=None): - if id is None: - self.id = dns.entropy.random_16() - else: - self.id = id - self.flags = 0 - self.question = [] - self.answer = [] - self.authority = [] - self.additional = [] - self.edns = -1 - self.ednsflags = 0 - self.payload = 0 - self.options = [] - self.request_payload = 0 - self.keyring = None - self.keyname = None - self.keyalgorithm = dns.tsig.default_algorithm - self.request_mac = b'' - self.other_data = b'' - self.tsig_error = 0 - self.fudge = 300 - self.original_id = self.id - self.mac = b'' - self.xfr = False - self.origin = None - self.tsig_ctx = None - self.had_tsig = False - self.multi = False - self.first = True - self.index = {} - - def __repr__(self): - return '' - - def __str__(self): - return self.to_text() - - def to_text(self, origin=None, relativize=True, **kw): - """Convert the message to text. - - The *origin*, *relativize*, and any other keyword - arguments are passed to the RRset ``to_wire()`` method. - - Returns a ``text``. - """ - - s = StringIO() - s.write(u'id %d\n' % self.id) - s.write(u'opcode %s\n' % - dns.opcode.to_text(dns.opcode.from_flags(self.flags))) - rc = dns.rcode.from_flags(self.flags, self.ednsflags) - s.write(u'rcode %s\n' % dns.rcode.to_text(rc)) - s.write(u'flags %s\n' % dns.flags.to_text(self.flags)) - if self.edns >= 0: - s.write(u'edns %s\n' % self.edns) - if self.ednsflags != 0: - s.write(u'eflags %s\n' % - dns.flags.edns_to_text(self.ednsflags)) - s.write(u'payload %d\n' % self.payload) - for opt in self.options: - s.write(u'option %s\n' % opt.to_text()) - is_update = dns.opcode.is_update(self.flags) - if is_update: - s.write(u';ZONE\n') - else: - s.write(u';QUESTION\n') - for rrset in self.question: - s.write(rrset.to_text(origin, relativize, **kw)) - s.write(u'\n') - if is_update: - s.write(u';PREREQ\n') - else: - s.write(u';ANSWER\n') - for rrset in self.answer: - s.write(rrset.to_text(origin, relativize, **kw)) - s.write(u'\n') - if is_update: - s.write(u';UPDATE\n') - else: - s.write(u';AUTHORITY\n') - for rrset in self.authority: - s.write(rrset.to_text(origin, relativize, **kw)) - s.write(u'\n') - s.write(u';ADDITIONAL\n') - for rrset in self.additional: - s.write(rrset.to_text(origin, relativize, **kw)) - s.write(u'\n') - # - # We strip off the final \n so the caller can print the result without - # doing weird things to get around eccentricities in Python print - # formatting - # - return s.getvalue()[:-1] - - def __eq__(self, other): - """Two messages are equal if they have the same content in the - header, question, answer, and authority sections. - - Returns a ``bool``. - """ - - if not isinstance(other, Message): - return False - if self.id != other.id: - return False - if self.flags != other.flags: - return False - for n in self.question: - if n not in other.question: - return False - for n in other.question: - if n not in self.question: - return False - for n in self.answer: - if n not in other.answer: - return False - for n in other.answer: - if n not in self.answer: - return False - for n in self.authority: - if n not in other.authority: - return False - for n in other.authority: - if n not in self.authority: - return False - return True - - def __ne__(self, other): - return not self.__eq__(other) - - def is_response(self, other): - """Is this message a response to *other*? - - Returns a ``bool``. - """ - - if other.flags & dns.flags.QR == 0 or \ - self.id != other.id or \ - dns.opcode.from_flags(self.flags) != \ - dns.opcode.from_flags(other.flags): - return False - if dns.rcode.from_flags(other.flags, other.ednsflags) != \ - dns.rcode.NOERROR: - return True - if dns.opcode.is_update(self.flags): - return True - for n in self.question: - if n not in other.question: - return False - for n in other.question: - if n not in self.question: - return False - return True - - def section_number(self, section): - """Return the "section number" of the specified section for use - in indexing. The question section is 0, the answer section is 1, - the authority section is 2, and the additional section is 3. - - *section* is one of the section attributes of this message. - - Raises ``ValueError`` if the section isn't known. - - Returns an ``int``. - """ - - if section is self.question: - return QUESTION - elif section is self.answer: - return ANSWER - elif section is self.authority: - return AUTHORITY - elif section is self.additional: - return ADDITIONAL - else: - raise ValueError('unknown section') - - def section_from_number(self, number): - """Return the "section number" of the specified section for use - in indexing. The question section is 0, the answer section is 1, - the authority section is 2, and the additional section is 3. - - *section* is one of the section attributes of this message. - - Raises ``ValueError`` if the section isn't known. - - Returns an ``int``. - """ - - if number == QUESTION: - return self.question - elif number == ANSWER: - return self.answer - elif number == AUTHORITY: - return self.authority - elif number == ADDITIONAL: - return self.additional - else: - raise ValueError('unknown section') - - def find_rrset(self, section, name, rdclass, rdtype, - covers=dns.rdatatype.NONE, deleting=None, create=False, - force_unique=False): - """Find the RRset with the given attributes in the specified section. - - *section*, an ``int`` section number, or one of the section - attributes of this message. This specifies the - the section of the message to search. For example:: - - my_message.find_rrset(my_message.answer, name, rdclass, rdtype) - my_message.find_rrset(dns.message.ANSWER, name, rdclass, rdtype) - - *name*, a ``dns.name.Name``, the name of the RRset. - - *rdclass*, an ``int``, the class of the RRset. - - *rdtype*, an ``int``, the type of the RRset. - - *covers*, an ``int`` or ``None``, the covers value of the RRset. - The default is ``None``. - - *deleting*, an ``int`` or ``None``, the deleting value of the RRset. - The default is ``None``. - - *create*, a ``bool``. If ``True``, create the RRset if it is not found. - The created RRset is appended to *section*. - - *force_unique*, a ``bool``. If ``True`` and *create* is also ``True``, - create a new RRset regardless of whether a matching RRset exists - already. The default is ``False``. This is useful when creating - DDNS Update messages, as order matters for them. - - Raises ``KeyError`` if the RRset was not found and create was - ``False``. - - Returns a ``dns.rrset.RRset object``. - """ - - if isinstance(section, int): - section_number = section - section = self.section_from_number(section_number) - else: - section_number = self.section_number(section) - key = (section_number, name, rdclass, rdtype, covers, deleting) - if not force_unique: - if self.index is not None: - rrset = self.index.get(key) - if rrset is not None: - return rrset - else: - for rrset in section: - if rrset.match(name, rdclass, rdtype, covers, deleting): - return rrset - if not create: - raise KeyError - rrset = dns.rrset.RRset(name, rdclass, rdtype, covers, deleting) - section.append(rrset) - if self.index is not None: - self.index[key] = rrset - return rrset - - def get_rrset(self, section, name, rdclass, rdtype, - covers=dns.rdatatype.NONE, deleting=None, create=False, - force_unique=False): - """Get the RRset with the given attributes in the specified section. - - If the RRset is not found, None is returned. - - *section*, an ``int`` section number, or one of the section - attributes of this message. This specifies the - the section of the message to search. For example:: - - my_message.get_rrset(my_message.answer, name, rdclass, rdtype) - my_message.get_rrset(dns.message.ANSWER, name, rdclass, rdtype) - - *name*, a ``dns.name.Name``, the name of the RRset. - - *rdclass*, an ``int``, the class of the RRset. - - *rdtype*, an ``int``, the type of the RRset. - - *covers*, an ``int`` or ``None``, the covers value of the RRset. - The default is ``None``. - - *deleting*, an ``int`` or ``None``, the deleting value of the RRset. - The default is ``None``. - - *create*, a ``bool``. If ``True``, create the RRset if it is not found. - The created RRset is appended to *section*. - - *force_unique*, a ``bool``. If ``True`` and *create* is also ``True``, - create a new RRset regardless of whether a matching RRset exists - already. The default is ``False``. This is useful when creating - DDNS Update messages, as order matters for them. - - Returns a ``dns.rrset.RRset object`` or ``None``. - """ - - try: - rrset = self.find_rrset(section, name, rdclass, rdtype, covers, - deleting, create, force_unique) - except KeyError: - rrset = None - return rrset - - def to_wire(self, origin=None, max_size=0, **kw): - """Return a string containing the message in DNS compressed wire - format. - - Additional keyword arguments are passed to the RRset ``to_wire()`` - method. - - *origin*, a ``dns.name.Name`` or ``None``, the origin to be appended - to any relative names. - - *max_size*, an ``int``, the maximum size of the wire format - output; default is 0, which means "the message's request - payload, if nonzero, or 65535". - - Raises ``dns.exception.TooBig`` if *max_size* was exceeded. - - Returns a ``binary``. - """ - - if max_size == 0: - if self.request_payload != 0: - max_size = self.request_payload - else: - max_size = 65535 - if max_size < 512: - max_size = 512 - elif max_size > 65535: - max_size = 65535 - r = dns.renderer.Renderer(self.id, self.flags, max_size, origin) - for rrset in self.question: - r.add_question(rrset.name, rrset.rdtype, rrset.rdclass) - for rrset in self.answer: - r.add_rrset(dns.renderer.ANSWER, rrset, **kw) - for rrset in self.authority: - r.add_rrset(dns.renderer.AUTHORITY, rrset, **kw) - if self.edns >= 0: - r.add_edns(self.edns, self.ednsflags, self.payload, self.options) - for rrset in self.additional: - r.add_rrset(dns.renderer.ADDITIONAL, rrset, **kw) - r.write_header() - if self.keyname is not None: - r.add_tsig(self.keyname, self.keyring[self.keyname], - self.fudge, self.original_id, self.tsig_error, - self.other_data, self.request_mac, - self.keyalgorithm) - self.mac = r.mac - return r.get_wire() - - def use_tsig(self, keyring, keyname=None, fudge=300, - original_id=None, tsig_error=0, other_data=b'', - algorithm=dns.tsig.default_algorithm): - """When sending, a TSIG signature using the specified keyring - and keyname should be added. - - See the documentation of the Message class for a complete - description of the keyring dictionary. - - *keyring*, a ``dict``, the TSIG keyring to use. If a - *keyring* is specified but a *keyname* is not, then the key - used will be the first key in the *keyring*. Note that the - order of keys in a dictionary is not defined, so applications - should supply a keyname when a keyring is used, unless they - know the keyring contains only one key. - - *keyname*, a ``dns.name.Name`` or ``None``, the name of the TSIG key - to use; defaults to ``None``. The key must be defined in the keyring. - - *fudge*, an ``int``, the TSIG time fudge. - - *original_id*, an ``int``, the TSIG original id. If ``None``, - the message's id is used. - - *tsig_error*, an ``int``, the TSIG error code. - - *other_data*, a ``binary``, the TSIG other data. - - *algorithm*, a ``dns.name.Name``, the TSIG algorithm to use. - """ - - self.keyring = keyring - if keyname is None: - self.keyname = list(self.keyring.keys())[0] - else: - if isinstance(keyname, string_types): - keyname = dns.name.from_text(keyname) - self.keyname = keyname - self.keyalgorithm = algorithm - self.fudge = fudge - if original_id is None: - self.original_id = self.id - else: - self.original_id = original_id - self.tsig_error = tsig_error - self.other_data = other_data - - def use_edns(self, edns=0, ednsflags=0, payload=1280, request_payload=None, - options=None): - """Configure EDNS behavior. - - *edns*, an ``int``, is the EDNS level to use. Specifying - ``None``, ``False``, or ``-1`` means "do not use EDNS", and in this case - the other parameters are ignored. Specifying ``True`` is - equivalent to specifying 0, i.e. "use EDNS0". - - *ednsflags*, an ``int``, the EDNS flag values. - - *payload*, an ``int``, is the EDNS sender's payload field, which is the - maximum size of UDP datagram the sender can handle. I.e. how big - a response to this message can be. - - *request_payload*, an ``int``, is the EDNS payload size to use when - sending this message. If not specified, defaults to the value of - *payload*. - - *options*, a list of ``dns.edns.Option`` objects or ``None``, the EDNS - options. - """ - - if edns is None or edns is False: - edns = -1 - if edns is True: - edns = 0 - if request_payload is None: - request_payload = payload - if edns < 0: - ednsflags = 0 - payload = 0 - request_payload = 0 - options = [] - else: - # make sure the EDNS version in ednsflags agrees with edns - ednsflags &= long(0xFF00FFFF) - ednsflags |= (edns << 16) - if options is None: - options = [] - self.edns = edns - self.ednsflags = ednsflags - self.payload = payload - self.options = options - self.request_payload = request_payload - - def want_dnssec(self, wanted=True): - """Enable or disable 'DNSSEC desired' flag in requests. - - *wanted*, a ``bool``. If ``True``, then DNSSEC data is - desired in the response, EDNS is enabled if required, and then - the DO bit is set. If ``False``, the DO bit is cleared if - EDNS is enabled. - """ - - if wanted: - if self.edns < 0: - self.use_edns() - self.ednsflags |= dns.flags.DO - elif self.edns >= 0: - self.ednsflags &= ~dns.flags.DO - - def rcode(self): - """Return the rcode. - - Returns an ``int``. - """ - return dns.rcode.from_flags(self.flags, self.ednsflags) - - def set_rcode(self, rcode): - """Set the rcode. - - *rcode*, an ``int``, is the rcode to set. - """ - (value, evalue) = dns.rcode.to_flags(rcode) - self.flags &= 0xFFF0 - self.flags |= value - self.ednsflags &= long(0x00FFFFFF) - self.ednsflags |= evalue - if self.ednsflags != 0 and self.edns < 0: - self.edns = 0 - - def opcode(self): - """Return the opcode. - - Returns an ``int``. - """ - return dns.opcode.from_flags(self.flags) - - def set_opcode(self, opcode): - """Set the opcode. - - *opcode*, an ``int``, is the opcode to set. - """ - self.flags &= 0x87FF - self.flags |= dns.opcode.to_flags(opcode) - - -class _WireReader(object): - - """Wire format reader. - - wire: a binary, is the wire-format message. - message: The message object being built - current: When building a message object from wire format, this - variable contains the offset from the beginning of wire of the next octet - to be read. - updating: Is the message a dynamic update? - one_rr_per_rrset: Put each RR into its own RRset? - ignore_trailing: Ignore trailing junk at end of request? - zone_rdclass: The class of the zone in messages which are - DNS dynamic updates. - """ - - def __init__(self, wire, message, question_only=False, - one_rr_per_rrset=False, ignore_trailing=False): - self.wire = dns.wiredata.maybe_wrap(wire) - self.message = message - self.current = 0 - self.updating = False - self.zone_rdclass = dns.rdataclass.IN - self.question_only = question_only - self.one_rr_per_rrset = one_rr_per_rrset - self.ignore_trailing = ignore_trailing - - def _get_question(self, qcount): - """Read the next *qcount* records from the wire data and add them to - the question section. - """ - - if self.updating and qcount > 1: - raise dns.exception.FormError - - for i in xrange(0, qcount): - (qname, used) = dns.name.from_wire(self.wire, self.current) - if self.message.origin is not None: - qname = qname.relativize(self.message.origin) - self.current = self.current + used - (rdtype, rdclass) = \ - struct.unpack('!HH', - self.wire[self.current:self.current + 4]) - self.current = self.current + 4 - self.message.find_rrset(self.message.question, qname, - rdclass, rdtype, create=True, - force_unique=True) - if self.updating: - self.zone_rdclass = rdclass - - def _get_section(self, section, count): - """Read the next I{count} records from the wire data and add them to - the specified section. - - section: the section of the message to which to add records - count: the number of records to read - """ - - if self.updating or self.one_rr_per_rrset: - force_unique = True - else: - force_unique = False - seen_opt = False - for i in xrange(0, count): - rr_start = self.current - (name, used) = dns.name.from_wire(self.wire, self.current) - absolute_name = name - if self.message.origin is not None: - name = name.relativize(self.message.origin) - self.current = self.current + used - (rdtype, rdclass, ttl, rdlen) = \ - struct.unpack('!HHIH', - self.wire[self.current:self.current + 10]) - self.current = self.current + 10 - if rdtype == dns.rdatatype.OPT: - if section is not self.message.additional or seen_opt: - raise BadEDNS - self.message.payload = rdclass - self.message.ednsflags = ttl - self.message.edns = (ttl & 0xff0000) >> 16 - self.message.options = [] - current = self.current - optslen = rdlen - while optslen > 0: - (otype, olen) = \ - struct.unpack('!HH', - self.wire[current:current + 4]) - current = current + 4 - opt = dns.edns.option_from_wire( - otype, self.wire, current, olen) - self.message.options.append(opt) - current = current + olen - optslen = optslen - 4 - olen - seen_opt = True - elif rdtype == dns.rdatatype.TSIG: - if not (section is self.message.additional and - i == (count - 1)): - raise BadTSIG - if self.message.keyring is None: - raise UnknownTSIGKey('got signed message without keyring') - secret = self.message.keyring.get(absolute_name) - if secret is None: - raise UnknownTSIGKey("key '%s' unknown" % name) - self.message.keyname = absolute_name - (self.message.keyalgorithm, self.message.mac) = \ - dns.tsig.get_algorithm_and_mac(self.wire, self.current, - rdlen) - self.message.tsig_ctx = \ - dns.tsig.validate(self.wire, - absolute_name, - secret, - int(time.time()), - self.message.request_mac, - rr_start, - self.current, - rdlen, - self.message.tsig_ctx, - self.message.multi, - self.message.first) - self.message.had_tsig = True - else: - if ttl < 0: - ttl = 0 - if self.updating and \ - (rdclass == dns.rdataclass.ANY or - rdclass == dns.rdataclass.NONE): - deleting = rdclass - rdclass = self.zone_rdclass - else: - deleting = None - if deleting == dns.rdataclass.ANY or \ - (deleting == dns.rdataclass.NONE and - section is self.message.answer): - covers = dns.rdatatype.NONE - rd = None - else: - rd = dns.rdata.from_wire(rdclass, rdtype, self.wire, - self.current, rdlen, - self.message.origin) - covers = rd.covers() - if self.message.xfr and rdtype == dns.rdatatype.SOA: - force_unique = True - rrset = self.message.find_rrset(section, name, - rdclass, rdtype, covers, - deleting, True, force_unique) - if rd is not None: - rrset.add(rd, ttl) - self.current = self.current + rdlen - - def read(self): - """Read a wire format DNS message and build a dns.message.Message - object.""" - - l = len(self.wire) - if l < 12: - raise ShortHeader - (self.message.id, self.message.flags, qcount, ancount, - aucount, adcount) = struct.unpack('!HHHHHH', self.wire[:12]) - self.current = 12 - if dns.opcode.is_update(self.message.flags): - self.updating = True - self._get_question(qcount) - if self.question_only: - return - self._get_section(self.message.answer, ancount) - self._get_section(self.message.authority, aucount) - self._get_section(self.message.additional, adcount) - if not self.ignore_trailing and self.current != l: - raise TrailingJunk - if self.message.multi and self.message.tsig_ctx and \ - not self.message.had_tsig: - self.message.tsig_ctx.update(self.wire) - - -def from_wire(wire, keyring=None, request_mac=b'', xfr=False, origin=None, - tsig_ctx=None, multi=False, first=True, - question_only=False, one_rr_per_rrset=False, - ignore_trailing=False): - """Convert a DNS wire format message into a message - object. - - *keyring*, a ``dict``, the keyring to use if the message is signed. - - *request_mac*, a ``binary``. If the message is a response to a - TSIG-signed request, *request_mac* should be set to the MAC of - that request. - - *xfr*, a ``bool``, should be set to ``True`` if this message is part of - a zone transfer. - - *origin*, a ``dns.name.Name`` or ``None``. If the message is part - of a zone transfer, *origin* should be the origin name of the - zone. - - *tsig_ctx*, a ``hmac.HMAC`` objext, the ongoing TSIG context, used - when validating zone transfers. - - *multi*, a ``bool``, should be set to ``True`` if this message - part of a multiple message sequence. - - *first*, a ``bool``, should be set to ``True`` if this message is - stand-alone, or the first message in a multi-message sequence. - - *question_only*, a ``bool``. If ``True``, read only up to - the end of the question section. - - *one_rr_per_rrset*, a ``bool``. If ``True``, put each RR into its - own RRset. - - *ignore_trailing*, a ``bool``. If ``True``, ignore trailing - junk at end of the message. - - Raises ``dns.message.ShortHeader`` if the message is less than 12 octets - long. - - Raises ``dns.messaage.TrailingJunk`` if there were octets in the message - past the end of the proper DNS message, and *ignore_trailing* is ``False``. - - Raises ``dns.message.BadEDNS`` if an OPT record was in the - wrong section, or occurred more than once. - - Raises ``dns.message.BadTSIG`` if a TSIG record was not the last - record of the additional data section. - - Returns a ``dns.message.Message``. - """ - - m = Message(id=0) - m.keyring = keyring - m.request_mac = request_mac - m.xfr = xfr - m.origin = origin - m.tsig_ctx = tsig_ctx - m.multi = multi - m.first = first - - reader = _WireReader(wire, m, question_only, one_rr_per_rrset, - ignore_trailing) - reader.read() - - return m - - -class _TextReader(object): - - """Text format reader. - - tok: the tokenizer. - message: The message object being built. - updating: Is the message a dynamic update? - zone_rdclass: The class of the zone in messages which are - DNS dynamic updates. - last_name: The most recently read name when building a message object. - """ - - def __init__(self, text, message): - self.message = message - self.tok = dns.tokenizer.Tokenizer(text) - self.last_name = None - self.zone_rdclass = dns.rdataclass.IN - self.updating = False - - def _header_line(self, section): - """Process one line from the text format header section.""" - - token = self.tok.get() - what = token.value - if what == 'id': - self.message.id = self.tok.get_int() - elif what == 'flags': - while True: - token = self.tok.get() - if not token.is_identifier(): - self.tok.unget(token) - break - self.message.flags = self.message.flags | \ - dns.flags.from_text(token.value) - if dns.opcode.is_update(self.message.flags): - self.updating = True - elif what == 'edns': - self.message.edns = self.tok.get_int() - self.message.ednsflags = self.message.ednsflags | \ - (self.message.edns << 16) - elif what == 'eflags': - if self.message.edns < 0: - self.message.edns = 0 - while True: - token = self.tok.get() - if not token.is_identifier(): - self.tok.unget(token) - break - self.message.ednsflags = self.message.ednsflags | \ - dns.flags.edns_from_text(token.value) - elif what == 'payload': - self.message.payload = self.tok.get_int() - if self.message.edns < 0: - self.message.edns = 0 - elif what == 'opcode': - text = self.tok.get_string() - self.message.flags = self.message.flags | \ - dns.opcode.to_flags(dns.opcode.from_text(text)) - elif what == 'rcode': - text = self.tok.get_string() - self.message.set_rcode(dns.rcode.from_text(text)) - else: - raise UnknownHeaderField - self.tok.get_eol() - - def _question_line(self, section): - """Process one line from the text format question section.""" - - token = self.tok.get(want_leading=True) - if not token.is_whitespace(): - self.last_name = dns.name.from_text(token.value, None) - name = self.last_name - token = self.tok.get() - if not token.is_identifier(): - raise dns.exception.SyntaxError - # Class - try: - rdclass = dns.rdataclass.from_text(token.value) - token = self.tok.get() - if not token.is_identifier(): - raise dns.exception.SyntaxError - except dns.exception.SyntaxError: - raise dns.exception.SyntaxError - except Exception: - rdclass = dns.rdataclass.IN - # Type - rdtype = dns.rdatatype.from_text(token.value) - self.message.find_rrset(self.message.question, name, - rdclass, rdtype, create=True, - force_unique=True) - if self.updating: - self.zone_rdclass = rdclass - self.tok.get_eol() - - def _rr_line(self, section): - """Process one line from the text format answer, authority, or - additional data sections. - """ - - deleting = None - # Name - token = self.tok.get(want_leading=True) - if not token.is_whitespace(): - self.last_name = dns.name.from_text(token.value, None) - name = self.last_name - token = self.tok.get() - if not token.is_identifier(): - raise dns.exception.SyntaxError - # TTL - try: - ttl = int(token.value, 0) - token = self.tok.get() - if not token.is_identifier(): - raise dns.exception.SyntaxError - except dns.exception.SyntaxError: - raise dns.exception.SyntaxError - except Exception: - ttl = 0 - # Class - try: - rdclass = dns.rdataclass.from_text(token.value) - token = self.tok.get() - if not token.is_identifier(): - raise dns.exception.SyntaxError - if rdclass == dns.rdataclass.ANY or rdclass == dns.rdataclass.NONE: - deleting = rdclass - rdclass = self.zone_rdclass - except dns.exception.SyntaxError: - raise dns.exception.SyntaxError - except Exception: - rdclass = dns.rdataclass.IN - # Type - rdtype = dns.rdatatype.from_text(token.value) - token = self.tok.get() - if not token.is_eol_or_eof(): - self.tok.unget(token) - rd = dns.rdata.from_text(rdclass, rdtype, self.tok, None) - covers = rd.covers() - else: - rd = None - covers = dns.rdatatype.NONE - rrset = self.message.find_rrset(section, name, - rdclass, rdtype, covers, - deleting, True, self.updating) - if rd is not None: - rrset.add(rd, ttl) - - def read(self): - """Read a text format DNS message and build a dns.message.Message - object.""" - - line_method = self._header_line - section = None - while 1: - token = self.tok.get(True, True) - if token.is_eol_or_eof(): - break - if token.is_comment(): - u = token.value.upper() - if u == 'HEADER': - line_method = self._header_line - elif u == 'QUESTION' or u == 'ZONE': - line_method = self._question_line - section = self.message.question - elif u == 'ANSWER' or u == 'PREREQ': - line_method = self._rr_line - section = self.message.answer - elif u == 'AUTHORITY' or u == 'UPDATE': - line_method = self._rr_line - section = self.message.authority - elif u == 'ADDITIONAL': - line_method = self._rr_line - section = self.message.additional - self.tok.get_eol() - continue - self.tok.unget(token) - line_method(section) - - -def from_text(text): - """Convert the text format message into a message object. - - *text*, a ``text``, the text format message. - - Raises ``dns.message.UnknownHeaderField`` if a header is unknown. - - Raises ``dns.exception.SyntaxError`` if the text is badly formed. - - Returns a ``dns.message.Message object`` - """ - - # 'text' can also be a file, but we don't publish that fact - # since it's an implementation detail. The official file - # interface is from_file(). - - m = Message() - - reader = _TextReader(text, m) - reader.read() - - return m - - -def from_file(f): - """Read the next text format message from the specified file. - - *f*, a ``file`` or ``text``. If *f* is text, it is treated as the - pathname of a file to open. - - Raises ``dns.message.UnknownHeaderField`` if a header is unknown. - - Raises ``dns.exception.SyntaxError`` if the text is badly formed. - - Returns a ``dns.message.Message object`` - """ - - str_type = string_types - opts = 'rU' - - if isinstance(f, str_type): - f = open(f, opts) - want_close = True - else: - want_close = False - - try: - m = from_text(f) - finally: - if want_close: - f.close() - return m - - -def make_query(qname, rdtype, rdclass=dns.rdataclass.IN, use_edns=None, - want_dnssec=False, ednsflags=None, payload=None, - request_payload=None, options=None): - """Make a query message. - - The query name, type, and class may all be specified either - as objects of the appropriate type, or as strings. - - The query will have a randomly chosen query id, and its DNS flags - will be set to dns.flags.RD. - - qname, a ``dns.name.Name`` or ``text``, the query name. - - *rdtype*, an ``int`` or ``text``, the desired rdata type. - - *rdclass*, an ``int`` or ``text``, the desired rdata class; the default - is class IN. - - *use_edns*, an ``int``, ``bool`` or ``None``. The EDNS level to use; the - default is None (no EDNS). - See the description of dns.message.Message.use_edns() for the possible - values for use_edns and their meanings. - - *want_dnssec*, a ``bool``. If ``True``, DNSSEC data is desired. - - *ednsflags*, an ``int``, the EDNS flag values. - - *payload*, an ``int``, is the EDNS sender's payload field, which is the - maximum size of UDP datagram the sender can handle. I.e. how big - a response to this message can be. - - *request_payload*, an ``int``, is the EDNS payload size to use when - sending this message. If not specified, defaults to the value of - *payload*. - - *options*, a list of ``dns.edns.Option`` objects or ``None``, the EDNS - options. - - Returns a ``dns.message.Message`` - """ - - if isinstance(qname, string_types): - qname = dns.name.from_text(qname) - if isinstance(rdtype, string_types): - rdtype = dns.rdatatype.from_text(rdtype) - if isinstance(rdclass, string_types): - rdclass = dns.rdataclass.from_text(rdclass) - m = Message() - m.flags |= dns.flags.RD - m.find_rrset(m.question, qname, rdclass, rdtype, create=True, - force_unique=True) - # only pass keywords on to use_edns if they have been set to a - # non-None value. Setting a field will turn EDNS on if it hasn't - # been configured. - kwargs = {} - if ednsflags is not None: - kwargs['ednsflags'] = ednsflags - if use_edns is None: - use_edns = 0 - if payload is not None: - kwargs['payload'] = payload - if use_edns is None: - use_edns = 0 - if request_payload is not None: - kwargs['request_payload'] = request_payload - if use_edns is None: - use_edns = 0 - if options is not None: - kwargs['options'] = options - if use_edns is None: - use_edns = 0 - kwargs['edns'] = use_edns - m.use_edns(**kwargs) - m.want_dnssec(want_dnssec) - return m - - -def make_response(query, recursion_available=False, our_payload=8192, - fudge=300): - """Make a message which is a response for the specified query. - The message returned is really a response skeleton; it has all - of the infrastructure required of a response, but none of the - content. - - The response's question section is a shallow copy of the query's - question section, so the query's question RRsets should not be - changed. - - *query*, a ``dns.message.Message``, the query to respond to. - - *recursion_available*, a ``bool``, should RA be set in the response? - - *our_payload*, an ``int``, the payload size to advertise in EDNS - responses. - - *fudge*, an ``int``, the TSIG time fudge. - - Returns a ``dns.message.Message`` object. - """ - - if query.flags & dns.flags.QR: - raise dns.exception.FormError('specified query message is not a query') - response = dns.message.Message(query.id) - response.flags = dns.flags.QR | (query.flags & dns.flags.RD) - if recursion_available: - response.flags |= dns.flags.RA - response.set_opcode(query.opcode()) - response.question = list(query.question) - if query.edns >= 0: - response.use_edns(0, 0, our_payload, query.payload) - if query.had_tsig: - response.use_tsig(query.keyring, query.keyname, fudge, None, 0, b'', - query.keyalgorithm) - response.request_mac = query.mac - return response diff --git a/env/lib/python3.7/site-packages/dns/name.py b/env/lib/python3.7/site-packages/dns/name.py deleted file mode 100644 index 0bcfd83..0000000 --- a/env/lib/python3.7/site-packages/dns/name.py +++ /dev/null @@ -1,994 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2001-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""DNS Names. -""" - -from io import BytesIO -import struct -import sys -import copy -import encodings.idna -try: - import idna - have_idna_2008 = True -except ImportError: - have_idna_2008 = False - -import dns.exception -import dns.wiredata - -from ._compat import long, binary_type, text_type, unichr, maybe_decode - -try: - maxint = sys.maxint # pylint: disable=sys-max-int -except AttributeError: - maxint = (1 << (8 * struct.calcsize("P"))) // 2 - 1 - - -# fullcompare() result values - -#: The compared names have no relationship to each other. -NAMERELN_NONE = 0 -#: the first name is a superdomain of the second. -NAMERELN_SUPERDOMAIN = 1 -#: The first name is a subdomain of the second. -NAMERELN_SUBDOMAIN = 2 -#: The compared names are equal. -NAMERELN_EQUAL = 3 -#: The compared names have a common ancestor. -NAMERELN_COMMONANCESTOR = 4 - - -class EmptyLabel(dns.exception.SyntaxError): - """A DNS label is empty.""" - - -class BadEscape(dns.exception.SyntaxError): - """An escaped code in a text format of DNS name is invalid.""" - - -class BadPointer(dns.exception.FormError): - """A DNS compression pointer points forward instead of backward.""" - - -class BadLabelType(dns.exception.FormError): - """The label type in DNS name wire format is unknown.""" - - -class NeedAbsoluteNameOrOrigin(dns.exception.DNSException): - """An attempt was made to convert a non-absolute name to - wire when there was also a non-absolute (or missing) origin.""" - - -class NameTooLong(dns.exception.FormError): - """A DNS name is > 255 octets long.""" - - -class LabelTooLong(dns.exception.SyntaxError): - """A DNS label is > 63 octets long.""" - - -class AbsoluteConcatenation(dns.exception.DNSException): - """An attempt was made to append anything other than the - empty name to an absolute DNS name.""" - - -class NoParent(dns.exception.DNSException): - """An attempt was made to get the parent of the root name - or the empty name.""" - -class NoIDNA2008(dns.exception.DNSException): - """IDNA 2008 processing was requested but the idna module is not - available.""" - - -class IDNAException(dns.exception.DNSException): - """IDNA processing raised an exception.""" - - supp_kwargs = {'idna_exception'} - fmt = "IDNA processing exception: {idna_exception}" - - -class IDNACodec(object): - """Abstract base class for IDNA encoder/decoders.""" - - def __init__(self): - pass - - def encode(self, label): - raise NotImplementedError - - def decode(self, label): - # We do not apply any IDNA policy on decode; we just - downcased = label.lower() - if downcased.startswith(b'xn--'): - try: - label = downcased[4:].decode('punycode') - except Exception as e: - raise IDNAException(idna_exception=e) - else: - label = maybe_decode(label) - return _escapify(label, True) - - -class IDNA2003Codec(IDNACodec): - """IDNA 2003 encoder/decoder.""" - - def __init__(self, strict_decode=False): - """Initialize the IDNA 2003 encoder/decoder. - - *strict_decode* is a ``bool``. If `True`, then IDNA2003 checking - is done when decoding. This can cause failures if the name - was encoded with IDNA2008. The default is `False`. - """ - - super(IDNA2003Codec, self).__init__() - self.strict_decode = strict_decode - - def encode(self, label): - """Encode *label*.""" - - if label == '': - return b'' - try: - return encodings.idna.ToASCII(label) - except UnicodeError: - raise LabelTooLong - - def decode(self, label): - """Decode *label*.""" - if not self.strict_decode: - return super(IDNA2003Codec, self).decode(label) - if label == b'': - return u'' - try: - return _escapify(encodings.idna.ToUnicode(label), True) - except Exception as e: - raise IDNAException(idna_exception=e) - - -class IDNA2008Codec(IDNACodec): - """IDNA 2008 encoder/decoder. - - *uts_46* is a ``bool``. If True, apply Unicode IDNA - compatibility processing as described in Unicode Technical - Standard #46 (http://unicode.org/reports/tr46/). - If False, do not apply the mapping. The default is False. - - *transitional* is a ``bool``: If True, use the - "transitional" mode described in Unicode Technical Standard - #46. The default is False. - - *allow_pure_ascii* is a ``bool``. If True, then a label which - consists of only ASCII characters is allowed. This is less - strict than regular IDNA 2008, but is also necessary for mixed - names, e.g. a name with starting with "_sip._tcp." and ending - in an IDN suffix which would otherwise be disallowed. The - default is False. - - *strict_decode* is a ``bool``: If True, then IDNA2008 checking - is done when decoding. This can cause failures if the name - was encoded with IDNA2003. The default is False. - """ - - def __init__(self, uts_46=False, transitional=False, - allow_pure_ascii=False, strict_decode=False): - """Initialize the IDNA 2008 encoder/decoder.""" - super(IDNA2008Codec, self).__init__() - self.uts_46 = uts_46 - self.transitional = transitional - self.allow_pure_ascii = allow_pure_ascii - self.strict_decode = strict_decode - - def is_all_ascii(self, label): - for c in label: - if ord(c) > 0x7f: - return False - return True - - def encode(self, label): - if label == '': - return b'' - if self.allow_pure_ascii and self.is_all_ascii(label): - return label.encode('ascii') - if not have_idna_2008: - raise NoIDNA2008 - try: - if self.uts_46: - label = idna.uts46_remap(label, False, self.transitional) - return idna.alabel(label) - except idna.IDNAError as e: - raise IDNAException(idna_exception=e) - - def decode(self, label): - if not self.strict_decode: - return super(IDNA2008Codec, self).decode(label) - if label == b'': - return u'' - if not have_idna_2008: - raise NoIDNA2008 - try: - if self.uts_46: - label = idna.uts46_remap(label, False, False) - return _escapify(idna.ulabel(label), True) - except idna.IDNAError as e: - raise IDNAException(idna_exception=e) - -_escaped = bytearray(b'"().;\\@$') - -IDNA_2003_Practical = IDNA2003Codec(False) -IDNA_2003_Strict = IDNA2003Codec(True) -IDNA_2003 = IDNA_2003_Practical -IDNA_2008_Practical = IDNA2008Codec(True, False, True, False) -IDNA_2008_UTS_46 = IDNA2008Codec(True, False, False, False) -IDNA_2008_Strict = IDNA2008Codec(False, False, False, True) -IDNA_2008_Transitional = IDNA2008Codec(True, True, False, False) -IDNA_2008 = IDNA_2008_Practical - -def _escapify(label, unicode_mode=False): - """Escape the characters in label which need it. - @param unicode_mode: escapify only special and whitespace (<= 0x20) - characters - @returns: the escaped string - @rtype: string""" - if not unicode_mode: - text = '' - if isinstance(label, text_type): - label = label.encode() - for c in bytearray(label): - if c in _escaped: - text += '\\' + chr(c) - elif c > 0x20 and c < 0x7F: - text += chr(c) - else: - text += '\\%03d' % c - return text.encode() - - text = u'' - if isinstance(label, binary_type): - label = label.decode() - for c in label: - if c > u'\x20' and c < u'\x7f': - text += c - else: - if c >= u'\x7f': - text += c - else: - text += u'\\%03d' % ord(c) - return text - -def _validate_labels(labels): - """Check for empty labels in the middle of a label sequence, - labels that are too long, and for too many labels. - - Raises ``dns.name.NameTooLong`` if the name as a whole is too long. - - Raises ``dns.name.EmptyLabel`` if a label is empty (i.e. the root - label) and appears in a position other than the end of the label - sequence - - """ - - l = len(labels) - total = 0 - i = -1 - j = 0 - for label in labels: - ll = len(label) - total += ll + 1 - if ll > 63: - raise LabelTooLong - if i < 0 and label == b'': - i = j - j += 1 - if total > 255: - raise NameTooLong - if i >= 0 and i != l - 1: - raise EmptyLabel - - -def _maybe_convert_to_binary(label): - """If label is ``text``, convert it to ``binary``. If it is already - ``binary`` just return it. - - """ - - if isinstance(label, binary_type): - return label - if isinstance(label, text_type): - return label.encode() - raise ValueError - - -class Name(object): - - """A DNS name. - - The dns.name.Name class represents a DNS name as a tuple of - labels. Each label is a `binary` in DNS wire format. Instances - of the class are immutable. - """ - - __slots__ = ['labels'] - - def __init__(self, labels): - """*labels* is any iterable whose values are ``text`` or ``binary``. - """ - - labels = [_maybe_convert_to_binary(x) for x in labels] - super(Name, self).__setattr__('labels', tuple(labels)) - _validate_labels(self.labels) - - def __setattr__(self, name, value): - # Names are immutable - raise TypeError("object doesn't support attribute assignment") - - def __copy__(self): - return Name(self.labels) - - def __deepcopy__(self, memo): - return Name(copy.deepcopy(self.labels, memo)) - - def __getstate__(self): - # Names can be pickled - return {'labels': self.labels} - - def __setstate__(self, state): - super(Name, self).__setattr__('labels', state['labels']) - _validate_labels(self.labels) - - def is_absolute(self): - """Is the most significant label of this name the root label? - - Returns a ``bool``. - """ - - return len(self.labels) > 0 and self.labels[-1] == b'' - - def is_wild(self): - """Is this name wild? (I.e. Is the least significant label '*'?) - - Returns a ``bool``. - """ - - return len(self.labels) > 0 and self.labels[0] == b'*' - - def __hash__(self): - """Return a case-insensitive hash of the name. - - Returns an ``int``. - """ - - h = long(0) - for label in self.labels: - for c in bytearray(label.lower()): - h += (h << 3) + c - return int(h % maxint) - - def fullcompare(self, other): - """Compare two names, returning a 3-tuple - ``(relation, order, nlabels)``. - - *relation* describes the relation ship between the names, - and is one of: ``dns.name.NAMERELN_NONE``, - ``dns.name.NAMERELN_SUPERDOMAIN``, ``dns.name.NAMERELN_SUBDOMAIN``, - ``dns.name.NAMERELN_EQUAL``, or ``dns.name.NAMERELN_COMMONANCESTOR``. - - *order* is < 0 if *self* < *other*, > 0 if *self* > *other*, and == - 0 if *self* == *other*. A relative name is always less than an - absolute name. If both names have the same relativity, then - the DNSSEC order relation is used to order them. - - *nlabels* is the number of significant labels that the two names - have in common. - - Here are some examples. Names ending in "." are absolute names, - those not ending in "." are relative names. - - ============= ============= =========== ===== ======= - self other relation order nlabels - ============= ============= =========== ===== ======= - www.example. www.example. equal 0 3 - www.example. example. subdomain > 0 2 - example. www.example. superdomain < 0 2 - example1.com. example2.com. common anc. < 0 2 - example1 example2. none < 0 0 - example1. example2 none > 0 0 - ============= ============= =========== ===== ======= - """ - - sabs = self.is_absolute() - oabs = other.is_absolute() - if sabs != oabs: - if sabs: - return (NAMERELN_NONE, 1, 0) - else: - return (NAMERELN_NONE, -1, 0) - l1 = len(self.labels) - l2 = len(other.labels) - ldiff = l1 - l2 - if ldiff < 0: - l = l1 - else: - l = l2 - - order = 0 - nlabels = 0 - namereln = NAMERELN_NONE - while l > 0: - l -= 1 - l1 -= 1 - l2 -= 1 - label1 = self.labels[l1].lower() - label2 = other.labels[l2].lower() - if label1 < label2: - order = -1 - if nlabels > 0: - namereln = NAMERELN_COMMONANCESTOR - return (namereln, order, nlabels) - elif label1 > label2: - order = 1 - if nlabels > 0: - namereln = NAMERELN_COMMONANCESTOR - return (namereln, order, nlabels) - nlabels += 1 - order = ldiff - if ldiff < 0: - namereln = NAMERELN_SUPERDOMAIN - elif ldiff > 0: - namereln = NAMERELN_SUBDOMAIN - else: - namereln = NAMERELN_EQUAL - return (namereln, order, nlabels) - - def is_subdomain(self, other): - """Is self a subdomain of other? - - Note that the notion of subdomain includes equality, e.g. - "dnpython.org" is a subdomain of itself. - - Returns a ``bool``. - """ - - (nr, o, nl) = self.fullcompare(other) - if nr == NAMERELN_SUBDOMAIN or nr == NAMERELN_EQUAL: - return True - return False - - def is_superdomain(self, other): - """Is self a superdomain of other? - - Note that the notion of superdomain includes equality, e.g. - "dnpython.org" is a superdomain of itself. - - Returns a ``bool``. - """ - - (nr, o, nl) = self.fullcompare(other) - if nr == NAMERELN_SUPERDOMAIN or nr == NAMERELN_EQUAL: - return True - return False - - def canonicalize(self): - """Return a name which is equal to the current name, but is in - DNSSEC canonical form. - """ - - return Name([x.lower() for x in self.labels]) - - def __eq__(self, other): - if isinstance(other, Name): - return self.fullcompare(other)[1] == 0 - else: - return False - - def __ne__(self, other): - if isinstance(other, Name): - return self.fullcompare(other)[1] != 0 - else: - return True - - def __lt__(self, other): - if isinstance(other, Name): - return self.fullcompare(other)[1] < 0 - else: - return NotImplemented - - def __le__(self, other): - if isinstance(other, Name): - return self.fullcompare(other)[1] <= 0 - else: - return NotImplemented - - def __ge__(self, other): - if isinstance(other, Name): - return self.fullcompare(other)[1] >= 0 - else: - return NotImplemented - - def __gt__(self, other): - if isinstance(other, Name): - return self.fullcompare(other)[1] > 0 - else: - return NotImplemented - - def __repr__(self): - return '' - - def __str__(self): - return self.to_text(False) - - def to_text(self, omit_final_dot=False): - """Convert name to DNS text format. - - *omit_final_dot* is a ``bool``. If True, don't emit the final - dot (denoting the root label) for absolute names. The default - is False. - - Returns a ``text``. - """ - - if len(self.labels) == 0: - return maybe_decode(b'@') - if len(self.labels) == 1 and self.labels[0] == b'': - return maybe_decode(b'.') - if omit_final_dot and self.is_absolute(): - l = self.labels[:-1] - else: - l = self.labels - s = b'.'.join(map(_escapify, l)) - return maybe_decode(s) - - def to_unicode(self, omit_final_dot=False, idna_codec=None): - """Convert name to Unicode text format. - - IDN ACE labels are converted to Unicode. - - *omit_final_dot* is a ``bool``. If True, don't emit the final - dot (denoting the root label) for absolute names. The default - is False. - *idna_codec* specifies the IDNA encoder/decoder. If None, the - dns.name.IDNA_2003_Practical encoder/decoder is used. - The IDNA_2003_Practical decoder does - not impose any policy, it just decodes punycode, so if you - don't want checking for compliance, you can use this decoder - for IDNA2008 as well. - - Returns a ``text``. - """ - - if len(self.labels) == 0: - return u'@' - if len(self.labels) == 1 and self.labels[0] == b'': - return u'.' - if omit_final_dot and self.is_absolute(): - l = self.labels[:-1] - else: - l = self.labels - if idna_codec is None: - idna_codec = IDNA_2003_Practical - return u'.'.join([idna_codec.decode(x) for x in l]) - - def to_digestable(self, origin=None): - """Convert name to a format suitable for digesting in hashes. - - The name is canonicalized and converted to uncompressed wire - format. All names in wire format are absolute. If the name - is a relative name, then an origin must be supplied. - - *origin* is a ``dns.name.Name`` or ``None``. If the name is - relative and origin is not ``None``, then origin will be appended - to the name. - - Raises ``dns.name.NeedAbsoluteNameOrOrigin`` if the name is - relative and no origin was provided. - - Returns a ``binary``. - """ - - if not self.is_absolute(): - if origin is None or not origin.is_absolute(): - raise NeedAbsoluteNameOrOrigin - labels = list(self.labels) - labels.extend(list(origin.labels)) - else: - labels = self.labels - dlabels = [struct.pack('!B%ds' % len(x), len(x), x.lower()) - for x in labels] - return b''.join(dlabels) - - def to_wire(self, file=None, compress=None, origin=None): - """Convert name to wire format, possibly compressing it. - - *file* is the file where the name is emitted (typically a - BytesIO file). If ``None`` (the default), a ``binary`` - containing the wire name will be returned. - - *compress*, a ``dict``, is the compression table to use. If - ``None`` (the default), names will not be compressed. - - *origin* is a ``dns.name.Name`` or ``None``. If the name is - relative and origin is not ``None``, then *origin* will be appended - to it. - - Raises ``dns.name.NeedAbsoluteNameOrOrigin`` if the name is - relative and no origin was provided. - - Returns a ``binary`` or ``None``. - """ - - if file is None: - file = BytesIO() - want_return = True - else: - want_return = False - - if not self.is_absolute(): - if origin is None or not origin.is_absolute(): - raise NeedAbsoluteNameOrOrigin - labels = list(self.labels) - labels.extend(list(origin.labels)) - else: - labels = self.labels - i = 0 - for label in labels: - n = Name(labels[i:]) - i += 1 - if compress is not None: - pos = compress.get(n) - else: - pos = None - if pos is not None: - value = 0xc000 + pos - s = struct.pack('!H', value) - file.write(s) - break - else: - if compress is not None and len(n) > 1: - pos = file.tell() - if pos <= 0x3fff: - compress[n] = pos - l = len(label) - file.write(struct.pack('!B', l)) - if l > 0: - file.write(label) - if want_return: - return file.getvalue() - - def __len__(self): - """The length of the name (in labels). - - Returns an ``int``. - """ - - return len(self.labels) - - def __getitem__(self, index): - return self.labels[index] - - def __add__(self, other): - return self.concatenate(other) - - def __sub__(self, other): - return self.relativize(other) - - def split(self, depth): - """Split a name into a prefix and suffix names at the specified depth. - - *depth* is an ``int`` specifying the number of labels in the suffix - - Raises ``ValueError`` if *depth* was not >= 0 and <= the length of the - name. - - Returns the tuple ``(prefix, suffix)``. - """ - - l = len(self.labels) - if depth == 0: - return (self, dns.name.empty) - elif depth == l: - return (dns.name.empty, self) - elif depth < 0 or depth > l: - raise ValueError( - 'depth must be >= 0 and <= the length of the name') - return (Name(self[: -depth]), Name(self[-depth:])) - - def concatenate(self, other): - """Return a new name which is the concatenation of self and other. - - Raises ``dns.name.AbsoluteConcatenation`` if the name is - absolute and *other* is not the empty name. - - Returns a ``dns.name.Name``. - """ - - if self.is_absolute() and len(other) > 0: - raise AbsoluteConcatenation - labels = list(self.labels) - labels.extend(list(other.labels)) - return Name(labels) - - def relativize(self, origin): - """If the name is a subdomain of *origin*, return a new name which is - the name relative to origin. Otherwise return the name. - - For example, relativizing ``www.dnspython.org.`` to origin - ``dnspython.org.`` returns the name ``www``. Relativizing ``example.`` - to origin ``dnspython.org.`` returns ``example.``. - - Returns a ``dns.name.Name``. - """ - - if origin is not None and self.is_subdomain(origin): - return Name(self[: -len(origin)]) - else: - return self - - def derelativize(self, origin): - """If the name is a relative name, return a new name which is the - concatenation of the name and origin. Otherwise return the name. - - For example, derelativizing ``www`` to origin ``dnspython.org.`` - returns the name ``www.dnspython.org.``. Derelativizing ``example.`` - to origin ``dnspython.org.`` returns ``example.``. - - Returns a ``dns.name.Name``. - """ - - if not self.is_absolute(): - return self.concatenate(origin) - else: - return self - - def choose_relativity(self, origin=None, relativize=True): - """Return a name with the relativity desired by the caller. - - If *origin* is ``None``, then the name is returned. - Otherwise, if *relativize* is ``True`` the name is - relativized, and if *relativize* is ``False`` the name is - derelativized. - - Returns a ``dns.name.Name``. - """ - - if origin: - if relativize: - return self.relativize(origin) - else: - return self.derelativize(origin) - else: - return self - - def parent(self): - """Return the parent of the name. - - For example, the parent of ``www.dnspython.org.`` is ``dnspython.org``. - - Raises ``dns.name.NoParent`` if the name is either the root name or the - empty name, and thus has no parent. - - Returns a ``dns.name.Name``. - """ - - if self == root or self == empty: - raise NoParent - return Name(self.labels[1:]) - -#: The root name, '.' -root = Name([b'']) - -#: The empty name. -empty = Name([]) - -def from_unicode(text, origin=root, idna_codec=None): - """Convert unicode text into a Name object. - - Labels are encoded in IDN ACE form according to rules specified by - the IDNA codec. - - *text*, a ``text``, is the text to convert into a name. - - *origin*, a ``dns.name.Name``, specifies the origin to - append to non-absolute names. The default is the root name. - - *idna_codec*, a ``dns.name.IDNACodec``, specifies the IDNA - encoder/decoder. If ``None``, the default IDNA 2003 encoder/decoder - is used. - - Returns a ``dns.name.Name``. - """ - - if not isinstance(text, text_type): - raise ValueError("input to from_unicode() must be a unicode string") - if not (origin is None or isinstance(origin, Name)): - raise ValueError("origin must be a Name or None") - labels = [] - label = u'' - escaping = False - edigits = 0 - total = 0 - if idna_codec is None: - idna_codec = IDNA_2003 - if text == u'@': - text = u'' - if text: - if text == u'.': - return Name([b'']) # no Unicode "u" on this constant! - for c in text: - if escaping: - if edigits == 0: - if c.isdigit(): - total = int(c) - edigits += 1 - else: - label += c - escaping = False - else: - if not c.isdigit(): - raise BadEscape - total *= 10 - total += int(c) - edigits += 1 - if edigits == 3: - escaping = False - label += unichr(total) - elif c in [u'.', u'\u3002', u'\uff0e', u'\uff61']: - if len(label) == 0: - raise EmptyLabel - labels.append(idna_codec.encode(label)) - label = u'' - elif c == u'\\': - escaping = True - edigits = 0 - total = 0 - else: - label += c - if escaping: - raise BadEscape - if len(label) > 0: - labels.append(idna_codec.encode(label)) - else: - labels.append(b'') - - if (len(labels) == 0 or labels[-1] != b'') and origin is not None: - labels.extend(list(origin.labels)) - return Name(labels) - - -def from_text(text, origin=root, idna_codec=None): - """Convert text into a Name object. - - *text*, a ``text``, is the text to convert into a name. - - *origin*, a ``dns.name.Name``, specifies the origin to - append to non-absolute names. The default is the root name. - - *idna_codec*, a ``dns.name.IDNACodec``, specifies the IDNA - encoder/decoder. If ``None``, the default IDNA 2003 encoder/decoder - is used. - - Returns a ``dns.name.Name``. - """ - - if isinstance(text, text_type): - return from_unicode(text, origin, idna_codec) - if not isinstance(text, binary_type): - raise ValueError("input to from_text() must be a string") - if not (origin is None or isinstance(origin, Name)): - raise ValueError("origin must be a Name or None") - labels = [] - label = b'' - escaping = False - edigits = 0 - total = 0 - if text == b'@': - text = b'' - if text: - if text == b'.': - return Name([b'']) - for c in bytearray(text): - byte_ = struct.pack('!B', c) - if escaping: - if edigits == 0: - if byte_.isdigit(): - total = int(byte_) - edigits += 1 - else: - label += byte_ - escaping = False - else: - if not byte_.isdigit(): - raise BadEscape - total *= 10 - total += int(byte_) - edigits += 1 - if edigits == 3: - escaping = False - label += struct.pack('!B', total) - elif byte_ == b'.': - if len(label) == 0: - raise EmptyLabel - labels.append(label) - label = b'' - elif byte_ == b'\\': - escaping = True - edigits = 0 - total = 0 - else: - label += byte_ - if escaping: - raise BadEscape - if len(label) > 0: - labels.append(label) - else: - labels.append(b'') - if (len(labels) == 0 or labels[-1] != b'') and origin is not None: - labels.extend(list(origin.labels)) - return Name(labels) - - -def from_wire(message, current): - """Convert possibly compressed wire format into a Name. - - *message* is a ``binary`` containing an entire DNS message in DNS - wire form. - - *current*, an ``int``, is the offset of the beginning of the name - from the start of the message - - Raises ``dns.name.BadPointer`` if a compression pointer did not - point backwards in the message. - - Raises ``dns.name.BadLabelType`` if an invalid label type was encountered. - - Returns a ``(dns.name.Name, int)`` tuple consisting of the name - that was read and the number of bytes of the wire format message - which were consumed reading it. - """ - - if not isinstance(message, binary_type): - raise ValueError("input to from_wire() must be a byte string") - message = dns.wiredata.maybe_wrap(message) - labels = [] - biggest_pointer = current - hops = 0 - count = message[current] - current += 1 - cused = 1 - while count != 0: - if count < 64: - labels.append(message[current: current + count].unwrap()) - current += count - if hops == 0: - cused += count - elif count >= 192: - current = (count & 0x3f) * 256 + message[current] - if hops == 0: - cused += 1 - if current >= biggest_pointer: - raise BadPointer - biggest_pointer = current - hops += 1 - else: - raise BadLabelType - count = message[current] - current += 1 - if hops == 0: - cused += 1 - labels.append('') - return (Name(labels), cused) diff --git a/env/lib/python3.7/site-packages/dns/namedict.py b/env/lib/python3.7/site-packages/dns/namedict.py deleted file mode 100644 index 37a1310..0000000 --- a/env/lib/python3.7/site-packages/dns/namedict.py +++ /dev/null @@ -1,108 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2017 Nominum, Inc. -# Copyright (C) 2016 Coresec Systems AB -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND CORESEC SYSTEMS AB DISCLAIMS ALL -# WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL CORESEC -# SYSTEMS AB BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR -# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -# OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, -# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION -# WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""DNS name dictionary""" - -import collections -import dns.name -from ._compat import xrange - - -class NameDict(collections.MutableMapping): - """A dictionary whose keys are dns.name.Name objects. - - In addition to being like a regular Python dictionary, this - dictionary can also get the deepest match for a given key. - """ - - __slots__ = ["max_depth", "max_depth_items", "__store"] - - def __init__(self, *args, **kwargs): - super(NameDict, self).__init__() - self.__store = dict() - #: the maximum depth of the keys that have ever been added - self.max_depth = 0 - #: the number of items of maximum depth - self.max_depth_items = 0 - self.update(dict(*args, **kwargs)) - - def __update_max_depth(self, key): - if len(key) == self.max_depth: - self.max_depth_items = self.max_depth_items + 1 - elif len(key) > self.max_depth: - self.max_depth = len(key) - self.max_depth_items = 1 - - def __getitem__(self, key): - return self.__store[key] - - def __setitem__(self, key, value): - if not isinstance(key, dns.name.Name): - raise ValueError('NameDict key must be a name') - self.__store[key] = value - self.__update_max_depth(key) - - def __delitem__(self, key): - value = self.__store.pop(key) - if len(value) == self.max_depth: - self.max_depth_items = self.max_depth_items - 1 - if self.max_depth_items == 0: - self.max_depth = 0 - for k in self.__store: - self.__update_max_depth(k) - - def __iter__(self): - return iter(self.__store) - - def __len__(self): - return len(self.__store) - - def has_key(self, key): - return key in self.__store - - def get_deepest_match(self, name): - """Find the deepest match to *fname* in the dictionary. - - The deepest match is the longest name in the dictionary which is - a superdomain of *name*. Note that *superdomain* includes matching - *name* itself. - - *name*, a ``dns.name.Name``, the name to find. - - Returns a ``(key, value)`` where *key* is the deepest - ``dns.name.Name``, and *value* is the value associated with *key*. - """ - - depth = len(name) - if depth > self.max_depth: - depth = self.max_depth - for i in xrange(-depth, 0): - n = dns.name.Name(name[i:]) - if n in self: - return (n, self[n]) - v = self[dns.name.empty] - return (dns.name.empty, v) diff --git a/env/lib/python3.7/site-packages/dns/node.py b/env/lib/python3.7/site-packages/dns/node.py deleted file mode 100644 index 8a7f19f..0000000 --- a/env/lib/python3.7/site-packages/dns/node.py +++ /dev/null @@ -1,182 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2001-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""DNS nodes. A node is a set of rdatasets.""" - -from io import StringIO - -import dns.rdataset -import dns.rdatatype -import dns.renderer - - -class Node(object): - - """A Node is a set of rdatasets.""" - - __slots__ = ['rdatasets'] - - def __init__(self): - #: the set of rdatsets, represented as a list. - self.rdatasets = [] - - def to_text(self, name, **kw): - """Convert a node to text format. - - Each rdataset at the node is printed. Any keyword arguments - to this method are passed on to the rdataset's to_text() method. - - *name*, a ``dns.name.Name`` or ``text``, the owner name of the rdatasets. - - Returns a ``text``. - """ - - s = StringIO() - for rds in self.rdatasets: - if len(rds) > 0: - s.write(rds.to_text(name, **kw)) - s.write(u'\n') - return s.getvalue()[:-1] - - def __repr__(self): - return '' - - def __eq__(self, other): - # - # This is inefficient. Good thing we don't need to do it much. - # - for rd in self.rdatasets: - if rd not in other.rdatasets: - return False - for rd in other.rdatasets: - if rd not in self.rdatasets: - return False - return True - - def __ne__(self, other): - return not self.__eq__(other) - - def __len__(self): - return len(self.rdatasets) - - def __iter__(self): - return iter(self.rdatasets) - - def find_rdataset(self, rdclass, rdtype, covers=dns.rdatatype.NONE, - create=False): - """Find an rdataset matching the specified properties in the - current node. - - *rdclass*, an ``int``, the class of the rdataset. - - *rdtype*, an ``int``, the type of the rdataset. - - *covers*, an ``int``, the covered type. Usually this value is - dns.rdatatype.NONE, but if the rdtype is dns.rdatatype.SIG or - dns.rdatatype.RRSIG, then the covers value will be the rdata - type the SIG/RRSIG covers. The library treats the SIG and RRSIG - types as if they were a family of - types, e.g. RRSIG(A), RRSIG(NS), RRSIG(SOA). This makes RRSIGs much - easier to work with than if RRSIGs covering different rdata - types were aggregated into a single RRSIG rdataset. - - *create*, a ``bool``. If True, create the rdataset if it is not found. - - Raises ``KeyError`` if an rdataset of the desired type and class does - not exist and *create* is not ``True``. - - Returns a ``dns.rdataset.Rdataset``. - """ - - for rds in self.rdatasets: - if rds.match(rdclass, rdtype, covers): - return rds - if not create: - raise KeyError - rds = dns.rdataset.Rdataset(rdclass, rdtype) - self.rdatasets.append(rds) - return rds - - def get_rdataset(self, rdclass, rdtype, covers=dns.rdatatype.NONE, - create=False): - """Get an rdataset matching the specified properties in the - current node. - - None is returned if an rdataset of the specified type and - class does not exist and *create* is not ``True``. - - *rdclass*, an ``int``, the class of the rdataset. - - *rdtype*, an ``int``, the type of the rdataset. - - *covers*, an ``int``, the covered type. Usually this value is - dns.rdatatype.NONE, but if the rdtype is dns.rdatatype.SIG or - dns.rdatatype.RRSIG, then the covers value will be the rdata - type the SIG/RRSIG covers. The library treats the SIG and RRSIG - types as if they were a family of - types, e.g. RRSIG(A), RRSIG(NS), RRSIG(SOA). This makes RRSIGs much - easier to work with than if RRSIGs covering different rdata - types were aggregated into a single RRSIG rdataset. - - *create*, a ``bool``. If True, create the rdataset if it is not found. - - Returns a ``dns.rdataset.Rdataset`` or ``None``. - """ - - try: - rds = self.find_rdataset(rdclass, rdtype, covers, create) - except KeyError: - rds = None - return rds - - def delete_rdataset(self, rdclass, rdtype, covers=dns.rdatatype.NONE): - """Delete the rdataset matching the specified properties in the - current node. - - If a matching rdataset does not exist, it is not an error. - - *rdclass*, an ``int``, the class of the rdataset. - - *rdtype*, an ``int``, the type of the rdataset. - - *covers*, an ``int``, the covered type. - """ - - rds = self.get_rdataset(rdclass, rdtype, covers) - if rds is not None: - self.rdatasets.remove(rds) - - def replace_rdataset(self, replacement): - """Replace an rdataset. - - It is not an error if there is no rdataset matching *replacement*. - - Ownership of the *replacement* object is transferred to the node; - in other words, this method does not store a copy of *replacement* - at the node, it stores *replacement* itself. - - *replacement*, a ``dns.rdataset.Rdataset``. - - Raises ``ValueError`` if *replacement* is not a - ``dns.rdataset.Rdataset``. - """ - - if not isinstance(replacement, dns.rdataset.Rdataset): - raise ValueError('replacement is not an rdataset') - self.delete_rdataset(replacement.rdclass, replacement.rdtype, - replacement.covers) - self.rdatasets.append(replacement) diff --git a/env/lib/python3.7/site-packages/dns/opcode.py b/env/lib/python3.7/site-packages/dns/opcode.py deleted file mode 100644 index c0735ba..0000000 --- a/env/lib/python3.7/site-packages/dns/opcode.py +++ /dev/null @@ -1,119 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2001-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""DNS Opcodes.""" - -import dns.exception - -#: Query -QUERY = 0 -#: Inverse Query (historical) -IQUERY = 1 -#: Server Status (unspecified and unimplemented anywhere) -STATUS = 2 -#: Notify -NOTIFY = 4 -#: Dynamic Update -UPDATE = 5 - -_by_text = { - 'QUERY': QUERY, - 'IQUERY': IQUERY, - 'STATUS': STATUS, - 'NOTIFY': NOTIFY, - 'UPDATE': UPDATE -} - -# We construct the inverse mapping programmatically to ensure that we -# cannot make any mistakes (e.g. omissions, cut-and-paste errors) that -# would cause the mapping not to be true inverse. - -_by_value = {y: x for x, y in _by_text.items()} - - -class UnknownOpcode(dns.exception.DNSException): - """An DNS opcode is unknown.""" - - -def from_text(text): - """Convert text into an opcode. - - *text*, a ``text``, the textual opcode - - Raises ``dns.opcode.UnknownOpcode`` if the opcode is unknown. - - Returns an ``int``. - """ - - if text.isdigit(): - value = int(text) - if value >= 0 and value <= 15: - return value - value = _by_text.get(text.upper()) - if value is None: - raise UnknownOpcode - return value - - -def from_flags(flags): - """Extract an opcode from DNS message flags. - - *flags*, an ``int``, the DNS flags. - - Returns an ``int``. - """ - - return (flags & 0x7800) >> 11 - - -def to_flags(value): - """Convert an opcode to a value suitable for ORing into DNS message - flags. - - *value*, an ``int``, the DNS opcode value. - - Returns an ``int``. - """ - - return (value << 11) & 0x7800 - - -def to_text(value): - """Convert an opcode to text. - - *value*, an ``int`` the opcode value, - - Raises ``dns.opcode.UnknownOpcode`` if the opcode is unknown. - - Returns a ``text``. - """ - - text = _by_value.get(value) - if text is None: - text = str(value) - return text - - -def is_update(flags): - """Is the opcode in flags UPDATE? - - *flags*, an ``int``, the DNS message flags. - - Returns a ``bool``. - """ - - return from_flags(flags) == UPDATE diff --git a/env/lib/python3.7/site-packages/dns/py.typed b/env/lib/python3.7/site-packages/dns/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/env/lib/python3.7/site-packages/dns/query.py b/env/lib/python3.7/site-packages/dns/query.py deleted file mode 100644 index c0c517c..0000000 --- a/env/lib/python3.7/site-packages/dns/query.py +++ /dev/null @@ -1,683 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""Talk to a DNS server.""" - -from __future__ import generators - -import errno -import select -import socket -import struct -import sys -import time - -import dns.exception -import dns.inet -import dns.name -import dns.message -import dns.rcode -import dns.rdataclass -import dns.rdatatype -from ._compat import long, string_types, PY3 - -if PY3: - select_error = OSError -else: - select_error = select.error - -# Function used to create a socket. Can be overridden if needed in special -# situations. -socket_factory = socket.socket - -class UnexpectedSource(dns.exception.DNSException): - """A DNS query response came from an unexpected address or port.""" - - -class BadResponse(dns.exception.FormError): - """A DNS query response does not respond to the question asked.""" - - -class TransferError(dns.exception.DNSException): - """A zone transfer response got a non-zero rcode.""" - - def __init__(self, rcode): - message = 'Zone transfer error: %s' % dns.rcode.to_text(rcode) - super(TransferError, self).__init__(message) - self.rcode = rcode - - -def _compute_expiration(timeout): - if timeout is None: - return None - else: - return time.time() + timeout - -# This module can use either poll() or select() as the "polling backend". -# -# A backend function takes an fd, bools for readability, writablity, and -# error detection, and a timeout. - -def _poll_for(fd, readable, writable, error, timeout): - """Poll polling backend.""" - - event_mask = 0 - if readable: - event_mask |= select.POLLIN - if writable: - event_mask |= select.POLLOUT - if error: - event_mask |= select.POLLERR - - pollable = select.poll() - pollable.register(fd, event_mask) - - if timeout: - event_list = pollable.poll(long(timeout * 1000)) - else: - event_list = pollable.poll() - - return bool(event_list) - - -def _select_for(fd, readable, writable, error, timeout): - """Select polling backend.""" - - rset, wset, xset = [], [], [] - - if readable: - rset = [fd] - if writable: - wset = [fd] - if error: - xset = [fd] - - if timeout is None: - (rcount, wcount, xcount) = select.select(rset, wset, xset) - else: - (rcount, wcount, xcount) = select.select(rset, wset, xset, timeout) - - return bool((rcount or wcount or xcount)) - - -def _wait_for(fd, readable, writable, error, expiration): - # Use the selected polling backend to wait for any of the specified - # events. An "expiration" absolute time is converted into a relative - # timeout. - - done = False - while not done: - if expiration is None: - timeout = None - else: - timeout = expiration - time.time() - if timeout <= 0.0: - raise dns.exception.Timeout - try: - if not _polling_backend(fd, readable, writable, error, timeout): - raise dns.exception.Timeout - except select_error as e: - if e.args[0] != errno.EINTR: - raise e - done = True - - -def _set_polling_backend(fn): - # Internal API. Do not use. - - global _polling_backend - - _polling_backend = fn - -if hasattr(select, 'poll'): - # Prefer poll() on platforms that support it because it has no - # limits on the maximum value of a file descriptor (plus it will - # be more efficient for high values). - _polling_backend = _poll_for -else: - _polling_backend = _select_for - - -def _wait_for_readable(s, expiration): - _wait_for(s, True, False, True, expiration) - - -def _wait_for_writable(s, expiration): - _wait_for(s, False, True, True, expiration) - - -def _addresses_equal(af, a1, a2): - # Convert the first value of the tuple, which is a textual format - # address into binary form, so that we are not confused by different - # textual representations of the same address - try: - n1 = dns.inet.inet_pton(af, a1[0]) - n2 = dns.inet.inet_pton(af, a2[0]) - except dns.exception.SyntaxError: - return False - return n1 == n2 and a1[1:] == a2[1:] - - -def _destination_and_source(af, where, port, source, source_port): - # Apply defaults and compute destination and source tuples - # suitable for use in connect(), sendto(), or bind(). - if af is None: - try: - af = dns.inet.af_for_address(where) - except Exception: - af = dns.inet.AF_INET - if af == dns.inet.AF_INET: - destination = (where, port) - if source is not None or source_port != 0: - if source is None: - source = '0.0.0.0' - source = (source, source_port) - elif af == dns.inet.AF_INET6: - destination = (where, port, 0, 0) - if source is not None or source_port != 0: - if source is None: - source = '::' - source = (source, source_port, 0, 0) - return (af, destination, source) - - -def send_udp(sock, what, destination, expiration=None): - """Send a DNS message to the specified UDP socket. - - *sock*, a ``socket``. - - *what*, a ``binary`` or ``dns.message.Message``, the message to send. - - *destination*, a destination tuple appropriate for the address family - of the socket, specifying where to send the query. - - *expiration*, a ``float`` or ``None``, the absolute time at which - a timeout exception should be raised. If ``None``, no timeout will - occur. - - Returns an ``(int, float)`` tuple of bytes sent and the sent time. - """ - - if isinstance(what, dns.message.Message): - what = what.to_wire() - _wait_for_writable(sock, expiration) - sent_time = time.time() - n = sock.sendto(what, destination) - return (n, sent_time) - - -def receive_udp(sock, destination, expiration=None, - ignore_unexpected=False, one_rr_per_rrset=False, - keyring=None, request_mac=b'', ignore_trailing=False): - """Read a DNS message from a UDP socket. - - *sock*, a ``socket``. - - *destination*, a destination tuple appropriate for the address family - of the socket, specifying where the associated query was sent. - - *expiration*, a ``float`` or ``None``, the absolute time at which - a timeout exception should be raised. If ``None``, no timeout will - occur. - - *ignore_unexpected*, a ``bool``. If ``True``, ignore responses from - unexpected sources. - - *one_rr_per_rrset*, a ``bool``. If ``True``, put each RR into its own - RRset. - - *keyring*, a ``dict``, the keyring to use for TSIG. - - *request_mac*, a ``binary``, the MAC of the request (for TSIG). - - *ignore_trailing*, a ``bool``. If ``True``, ignore trailing - junk at end of the received message. - - Raises if the message is malformed, if network errors occur, of if - there is a timeout. - - Returns a ``dns.message.Message`` object. - """ - - wire = b'' - while 1: - _wait_for_readable(sock, expiration) - (wire, from_address) = sock.recvfrom(65535) - if _addresses_equal(sock.family, from_address, destination) or \ - (dns.inet.is_multicast(destination[0]) and - from_address[1:] == destination[1:]): - break - if not ignore_unexpected: - raise UnexpectedSource('got a response from ' - '%s instead of %s' % (from_address, - destination)) - received_time = time.time() - r = dns.message.from_wire(wire, keyring=keyring, request_mac=request_mac, - one_rr_per_rrset=one_rr_per_rrset, - ignore_trailing=ignore_trailing) - return (r, received_time) - -def udp(q, where, timeout=None, port=53, af=None, source=None, source_port=0, - ignore_unexpected=False, one_rr_per_rrset=False, ignore_trailing=False): - """Return the response obtained after sending a query via UDP. - - *q*, a ``dns.message.Message``, the query to send - - *where*, a ``text`` containing an IPv4 or IPv6 address, where - to send the message. - - *timeout*, a ``float`` or ``None``, the number of seconds to wait before the - query times out. If ``None``, the default, wait forever. - - *port*, an ``int``, the port send the message to. The default is 53. - - *af*, an ``int``, the address family to use. The default is ``None``, - which causes the address family to use to be inferred from the form of - *where*. If the inference attempt fails, AF_INET is used. This - parameter is historical; you need never set it. - - *source*, a ``text`` containing an IPv4 or IPv6 address, specifying - the source address. The default is the wildcard address. - - *source_port*, an ``int``, the port from which to send the message. - The default is 0. - - *ignore_unexpected*, a ``bool``. If ``True``, ignore responses from - unexpected sources. - - *one_rr_per_rrset*, a ``bool``. If ``True``, put each RR into its own - RRset. - - *ignore_trailing*, a ``bool``. If ``True``, ignore trailing - junk at end of the received message. - - Returns a ``dns.message.Message``. - """ - - wire = q.to_wire() - (af, destination, source) = _destination_and_source(af, where, port, - source, source_port) - s = socket_factory(af, socket.SOCK_DGRAM, 0) - received_time = None - sent_time = None - try: - expiration = _compute_expiration(timeout) - s.setblocking(0) - if source is not None: - s.bind(source) - (_, sent_time) = send_udp(s, wire, destination, expiration) - (r, received_time) = receive_udp(s, destination, expiration, - ignore_unexpected, one_rr_per_rrset, - q.keyring, q.mac, ignore_trailing) - finally: - if sent_time is None or received_time is None: - response_time = 0 - else: - response_time = received_time - sent_time - s.close() - r.time = response_time - if not q.is_response(r): - raise BadResponse - return r - - -def _net_read(sock, count, expiration): - """Read the specified number of bytes from sock. Keep trying until we - either get the desired amount, or we hit EOF. - A Timeout exception will be raised if the operation is not completed - by the expiration time. - """ - s = b'' - while count > 0: - _wait_for_readable(sock, expiration) - n = sock.recv(count) - if n == b'': - raise EOFError - count = count - len(n) - s = s + n - return s - - -def _net_write(sock, data, expiration): - """Write the specified data to the socket. - A Timeout exception will be raised if the operation is not completed - by the expiration time. - """ - current = 0 - l = len(data) - while current < l: - _wait_for_writable(sock, expiration) - current += sock.send(data[current:]) - - -def send_tcp(sock, what, expiration=None): - """Send a DNS message to the specified TCP socket. - - *sock*, a ``socket``. - - *what*, a ``binary`` or ``dns.message.Message``, the message to send. - - *expiration*, a ``float`` or ``None``, the absolute time at which - a timeout exception should be raised. If ``None``, no timeout will - occur. - - Returns an ``(int, float)`` tuple of bytes sent and the sent time. - """ - - if isinstance(what, dns.message.Message): - what = what.to_wire() - l = len(what) - # copying the wire into tcpmsg is inefficient, but lets us - # avoid writev() or doing a short write that would get pushed - # onto the net - tcpmsg = struct.pack("!H", l) + what - _wait_for_writable(sock, expiration) - sent_time = time.time() - _net_write(sock, tcpmsg, expiration) - return (len(tcpmsg), sent_time) - -def receive_tcp(sock, expiration=None, one_rr_per_rrset=False, - keyring=None, request_mac=b'', ignore_trailing=False): - """Read a DNS message from a TCP socket. - - *sock*, a ``socket``. - - *expiration*, a ``float`` or ``None``, the absolute time at which - a timeout exception should be raised. If ``None``, no timeout will - occur. - - *one_rr_per_rrset*, a ``bool``. If ``True``, put each RR into its own - RRset. - - *keyring*, a ``dict``, the keyring to use for TSIG. - - *request_mac*, a ``binary``, the MAC of the request (for TSIG). - - *ignore_trailing*, a ``bool``. If ``True``, ignore trailing - junk at end of the received message. - - Raises if the message is malformed, if network errors occur, of if - there is a timeout. - - Returns a ``dns.message.Message`` object. - """ - - ldata = _net_read(sock, 2, expiration) - (l,) = struct.unpack("!H", ldata) - wire = _net_read(sock, l, expiration) - received_time = time.time() - r = dns.message.from_wire(wire, keyring=keyring, request_mac=request_mac, - one_rr_per_rrset=one_rr_per_rrset, - ignore_trailing=ignore_trailing) - return (r, received_time) - -def _connect(s, address): - try: - s.connect(address) - except socket.error: - (ty, v) = sys.exc_info()[:2] - - if hasattr(v, 'errno'): - v_err = v.errno - else: - v_err = v[0] - if v_err not in [errno.EINPROGRESS, errno.EWOULDBLOCK, errno.EALREADY]: - raise v - - -def tcp(q, where, timeout=None, port=53, af=None, source=None, source_port=0, - one_rr_per_rrset=False, ignore_trailing=False): - """Return the response obtained after sending a query via TCP. - - *q*, a ``dns.message.Message``, the query to send - - *where*, a ``text`` containing an IPv4 or IPv6 address, where - to send the message. - - *timeout*, a ``float`` or ``None``, the number of seconds to wait before the - query times out. If ``None``, the default, wait forever. - - *port*, an ``int``, the port send the message to. The default is 53. - - *af*, an ``int``, the address family to use. The default is ``None``, - which causes the address family to use to be inferred from the form of - *where*. If the inference attempt fails, AF_INET is used. This - parameter is historical; you need never set it. - - *source*, a ``text`` containing an IPv4 or IPv6 address, specifying - the source address. The default is the wildcard address. - - *source_port*, an ``int``, the port from which to send the message. - The default is 0. - - *one_rr_per_rrset*, a ``bool``. If ``True``, put each RR into its own - RRset. - - *ignore_trailing*, a ``bool``. If ``True``, ignore trailing - junk at end of the received message. - - Returns a ``dns.message.Message``. - """ - - wire = q.to_wire() - (af, destination, source) = _destination_and_source(af, where, port, - source, source_port) - s = socket_factory(af, socket.SOCK_STREAM, 0) - begin_time = None - received_time = None - try: - expiration = _compute_expiration(timeout) - s.setblocking(0) - begin_time = time.time() - if source is not None: - s.bind(source) - _connect(s, destination) - send_tcp(s, wire, expiration) - (r, received_time) = receive_tcp(s, expiration, one_rr_per_rrset, - q.keyring, q.mac, ignore_trailing) - finally: - if begin_time is None or received_time is None: - response_time = 0 - else: - response_time = received_time - begin_time - s.close() - r.time = response_time - if not q.is_response(r): - raise BadResponse - return r - - -def xfr(where, zone, rdtype=dns.rdatatype.AXFR, rdclass=dns.rdataclass.IN, - timeout=None, port=53, keyring=None, keyname=None, relativize=True, - af=None, lifetime=None, source=None, source_port=0, serial=0, - use_udp=False, keyalgorithm=dns.tsig.default_algorithm): - """Return a generator for the responses to a zone transfer. - - *where*. If the inference attempt fails, AF_INET is used. This - parameter is historical; you need never set it. - - *zone*, a ``dns.name.Name`` or ``text``, the name of the zone to transfer. - - *rdtype*, an ``int`` or ``text``, the type of zone transfer. The - default is ``dns.rdatatype.AXFR``. ``dns.rdatatype.IXFR`` can be - used to do an incremental transfer instead. - - *rdclass*, an ``int`` or ``text``, the class of the zone transfer. - The default is ``dns.rdataclass.IN``. - - *timeout*, a ``float``, the number of seconds to wait for each - response message. If None, the default, wait forever. - - *port*, an ``int``, the port send the message to. The default is 53. - - *keyring*, a ``dict``, the keyring to use for TSIG. - - *keyname*, a ``dns.name.Name`` or ``text``, the name of the TSIG - key to use. - - *relativize*, a ``bool``. If ``True``, all names in the zone will be - relativized to the zone origin. It is essential that the - relativize setting matches the one specified to - ``dns.zone.from_xfr()`` if using this generator to make a zone. - - *af*, an ``int``, the address family to use. The default is ``None``, - which causes the address family to use to be inferred from the form of - *where*. If the inference attempt fails, AF_INET is used. This - parameter is historical; you need never set it. - - *lifetime*, a ``float``, the total number of seconds to spend - doing the transfer. If ``None``, the default, then there is no - limit on the time the transfer may take. - - *source*, a ``text`` containing an IPv4 or IPv6 address, specifying - the source address. The default is the wildcard address. - - *source_port*, an ``int``, the port from which to send the message. - The default is 0. - - *serial*, an ``int``, the SOA serial number to use as the base for - an IXFR diff sequence (only meaningful if *rdtype* is - ``dns.rdatatype.IXFR``). - - *use_udp*, a ``bool``. If ``True``, use UDP (only meaningful for IXFR). - - *keyalgorithm*, a ``dns.name.Name`` or ``text``, the TSIG algorithm to use. - - Raises on errors, and so does the generator. - - Returns a generator of ``dns.message.Message`` objects. - """ - - if isinstance(zone, string_types): - zone = dns.name.from_text(zone) - if isinstance(rdtype, string_types): - rdtype = dns.rdatatype.from_text(rdtype) - q = dns.message.make_query(zone, rdtype, rdclass) - if rdtype == dns.rdatatype.IXFR: - rrset = dns.rrset.from_text(zone, 0, 'IN', 'SOA', - '. . %u 0 0 0 0' % serial) - q.authority.append(rrset) - if keyring is not None: - q.use_tsig(keyring, keyname, algorithm=keyalgorithm) - wire = q.to_wire() - (af, destination, source) = _destination_and_source(af, where, port, - source, source_port) - if use_udp: - if rdtype != dns.rdatatype.IXFR: - raise ValueError('cannot do a UDP AXFR') - s = socket_factory(af, socket.SOCK_DGRAM, 0) - else: - s = socket_factory(af, socket.SOCK_STREAM, 0) - s.setblocking(0) - if source is not None: - s.bind(source) - expiration = _compute_expiration(lifetime) - _connect(s, destination) - l = len(wire) - if use_udp: - _wait_for_writable(s, expiration) - s.send(wire) - else: - tcpmsg = struct.pack("!H", l) + wire - _net_write(s, tcpmsg, expiration) - done = False - delete_mode = True - expecting_SOA = False - soa_rrset = None - if relativize: - origin = zone - oname = dns.name.empty - else: - origin = None - oname = zone - tsig_ctx = None - first = True - while not done: - mexpiration = _compute_expiration(timeout) - if mexpiration is None or mexpiration > expiration: - mexpiration = expiration - if use_udp: - _wait_for_readable(s, expiration) - (wire, from_address) = s.recvfrom(65535) - else: - ldata = _net_read(s, 2, mexpiration) - (l,) = struct.unpack("!H", ldata) - wire = _net_read(s, l, mexpiration) - is_ixfr = (rdtype == dns.rdatatype.IXFR) - r = dns.message.from_wire(wire, keyring=q.keyring, request_mac=q.mac, - xfr=True, origin=origin, tsig_ctx=tsig_ctx, - multi=True, first=first, - one_rr_per_rrset=is_ixfr) - rcode = r.rcode() - if rcode != dns.rcode.NOERROR: - raise TransferError(rcode) - tsig_ctx = r.tsig_ctx - first = False - answer_index = 0 - if soa_rrset is None: - if not r.answer or r.answer[0].name != oname: - raise dns.exception.FormError( - "No answer or RRset not for qname") - rrset = r.answer[0] - if rrset.rdtype != dns.rdatatype.SOA: - raise dns.exception.FormError("first RRset is not an SOA") - answer_index = 1 - soa_rrset = rrset.copy() - if rdtype == dns.rdatatype.IXFR: - if soa_rrset[0].serial <= serial: - # - # We're already up-to-date. - # - done = True - else: - expecting_SOA = True - # - # Process SOAs in the answer section (other than the initial - # SOA in the first message). - # - for rrset in r.answer[answer_index:]: - if done: - raise dns.exception.FormError("answers after final SOA") - if rrset.rdtype == dns.rdatatype.SOA and rrset.name == oname: - if expecting_SOA: - if rrset[0].serial != serial: - raise dns.exception.FormError( - "IXFR base serial mismatch") - expecting_SOA = False - elif rdtype == dns.rdatatype.IXFR: - delete_mode = not delete_mode - # - # If this SOA RRset is equal to the first we saw then we're - # finished. If this is an IXFR we also check that we're seeing - # the record in the expected part of the response. - # - if rrset == soa_rrset and \ - (rdtype == dns.rdatatype.AXFR or - (rdtype == dns.rdatatype.IXFR and delete_mode)): - done = True - elif expecting_SOA: - # - # We made an IXFR request and are expecting another - # SOA RR, but saw something else, so this must be an - # AXFR response. - # - rdtype = dns.rdatatype.AXFR - expecting_SOA = False - if done and q.keyring and not r.had_tsig: - raise dns.exception.FormError("missing TSIG") - yield r - s.close() diff --git a/env/lib/python3.7/site-packages/dns/rcode.py b/env/lib/python3.7/site-packages/dns/rcode.py deleted file mode 100644 index 5191e1b..0000000 --- a/env/lib/python3.7/site-packages/dns/rcode.py +++ /dev/null @@ -1,144 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2001-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""DNS Result Codes.""" - -import dns.exception -from ._compat import long - -#: No error -NOERROR = 0 -#: Form error -FORMERR = 1 -#: Server failure -SERVFAIL = 2 -#: Name does not exist ("Name Error" in RFC 1025 terminology). -NXDOMAIN = 3 -#: Not implemented -NOTIMP = 4 -#: Refused -REFUSED = 5 -#: Name exists. -YXDOMAIN = 6 -#: RRset exists. -YXRRSET = 7 -#: RRset does not exist. -NXRRSET = 8 -#: Not authoritative. -NOTAUTH = 9 -#: Name not in zone. -NOTZONE = 10 -#: Bad EDNS version. -BADVERS = 16 - -_by_text = { - 'NOERROR': NOERROR, - 'FORMERR': FORMERR, - 'SERVFAIL': SERVFAIL, - 'NXDOMAIN': NXDOMAIN, - 'NOTIMP': NOTIMP, - 'REFUSED': REFUSED, - 'YXDOMAIN': YXDOMAIN, - 'YXRRSET': YXRRSET, - 'NXRRSET': NXRRSET, - 'NOTAUTH': NOTAUTH, - 'NOTZONE': NOTZONE, - 'BADVERS': BADVERS -} - -# We construct the inverse mapping programmatically to ensure that we -# cannot make any mistakes (e.g. omissions, cut-and-paste errors) that -# would cause the mapping not to be a true inverse. - -_by_value = {y: x for x, y in _by_text.items()} - - -class UnknownRcode(dns.exception.DNSException): - """A DNS rcode is unknown.""" - - -def from_text(text): - """Convert text into an rcode. - - *text*, a ``text``, the textual rcode or an integer in textual form. - - Raises ``dns.rcode.UnknownRcode`` if the rcode mnemonic is unknown. - - Returns an ``int``. - """ - - if text.isdigit(): - v = int(text) - if v >= 0 and v <= 4095: - return v - v = _by_text.get(text.upper()) - if v is None: - raise UnknownRcode - return v - - -def from_flags(flags, ednsflags): - """Return the rcode value encoded by flags and ednsflags. - - *flags*, an ``int``, the DNS flags field. - - *ednsflags*, an ``int``, the EDNS flags field. - - Raises ``ValueError`` if rcode is < 0 or > 4095 - - Returns an ``int``. - """ - - value = (flags & 0x000f) | ((ednsflags >> 20) & 0xff0) - if value < 0 or value > 4095: - raise ValueError('rcode must be >= 0 and <= 4095') - return value - - -def to_flags(value): - """Return a (flags, ednsflags) tuple which encodes the rcode. - - *value*, an ``int``, the rcode. - - Raises ``ValueError`` if rcode is < 0 or > 4095. - - Returns an ``(int, int)`` tuple. - """ - - if value < 0 or value > 4095: - raise ValueError('rcode must be >= 0 and <= 4095') - v = value & 0xf - ev = long(value & 0xff0) << 20 - return (v, ev) - - -def to_text(value): - """Convert rcode into text. - - *value*, and ``int``, the rcode. - - Raises ``ValueError`` if rcode is < 0 or > 4095. - - Returns a ``text``. - """ - - if value < 0 or value > 4095: - raise ValueError('rcode must be >= 0 and <= 4095') - text = _by_value.get(value) - if text is None: - text = str(value) - return text diff --git a/env/lib/python3.7/site-packages/dns/rdata.py b/env/lib/python3.7/site-packages/dns/rdata.py deleted file mode 100644 index ea1971d..0000000 --- a/env/lib/python3.7/site-packages/dns/rdata.py +++ /dev/null @@ -1,456 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2001-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""DNS rdata.""" - -from io import BytesIO -import base64 -import binascii - -import dns.exception -import dns.name -import dns.rdataclass -import dns.rdatatype -import dns.tokenizer -import dns.wiredata -from ._compat import xrange, string_types, text_type - -try: - import threading as _threading -except ImportError: - import dummy_threading as _threading - -_hex_chunksize = 32 - - -def _hexify(data, chunksize=_hex_chunksize): - """Convert a binary string into its hex encoding, broken up into chunks - of chunksize characters separated by a space. - """ - - line = binascii.hexlify(data) - return b' '.join([line[i:i + chunksize] - for i - in range(0, len(line), chunksize)]).decode() - -_base64_chunksize = 32 - - -def _base64ify(data, chunksize=_base64_chunksize): - """Convert a binary string into its base64 encoding, broken up into chunks - of chunksize characters separated by a space. - """ - - line = base64.b64encode(data) - return b' '.join([line[i:i + chunksize] - for i - in range(0, len(line), chunksize)]).decode() - -__escaped = bytearray(b'"\\') - -def _escapify(qstring): - """Escape the characters in a quoted string which need it.""" - - if isinstance(qstring, text_type): - qstring = qstring.encode() - if not isinstance(qstring, bytearray): - qstring = bytearray(qstring) - - text = '' - for c in qstring: - if c in __escaped: - text += '\\' + chr(c) - elif c >= 0x20 and c < 0x7F: - text += chr(c) - else: - text += '\\%03d' % c - return text - - -def _truncate_bitmap(what): - """Determine the index of greatest byte that isn't all zeros, and - return the bitmap that contains all the bytes less than that index. - """ - - for i in xrange(len(what) - 1, -1, -1): - if what[i] != 0: - return what[0: i + 1] - return what[0:1] - - -class Rdata(object): - """Base class for all DNS rdata types.""" - - __slots__ = ['rdclass', 'rdtype'] - - def __init__(self, rdclass, rdtype): - """Initialize an rdata. - - *rdclass*, an ``int`` is the rdataclass of the Rdata. - *rdtype*, an ``int`` is the rdatatype of the Rdata. - """ - - self.rdclass = rdclass - self.rdtype = rdtype - - def covers(self): - """Return the type a Rdata covers. - - DNS SIG/RRSIG rdatas apply to a specific type; this type is - returned by the covers() function. If the rdata type is not - SIG or RRSIG, dns.rdatatype.NONE is returned. This is useful when - creating rdatasets, allowing the rdataset to contain only RRSIGs - of a particular type, e.g. RRSIG(NS). - - Returns an ``int``. - """ - - return dns.rdatatype.NONE - - def extended_rdatatype(self): - """Return a 32-bit type value, the least significant 16 bits of - which are the ordinary DNS type, and the upper 16 bits of which are - the "covered" type, if any. - - Returns an ``int``. - """ - - return self.covers() << 16 | self.rdtype - - def to_text(self, origin=None, relativize=True, **kw): - """Convert an rdata to text format. - - Returns a ``text``. - """ - - raise NotImplementedError - - def to_wire(self, file, compress=None, origin=None): - """Convert an rdata to wire format. - - Returns a ``binary``. - """ - - raise NotImplementedError - - def to_digestable(self, origin=None): - """Convert rdata to a format suitable for digesting in hashes. This - is also the DNSSEC canonical form. - - Returns a ``binary``. - """ - - f = BytesIO() - self.to_wire(f, None, origin) - return f.getvalue() - - def validate(self): - """Check that the current contents of the rdata's fields are - valid. - - If you change an rdata by assigning to its fields, - it is a good idea to call validate() when you are done making - changes. - - Raises various exceptions if there are problems. - - Returns ``None``. - """ - - dns.rdata.from_text(self.rdclass, self.rdtype, self.to_text()) - - def __repr__(self): - covers = self.covers() - if covers == dns.rdatatype.NONE: - ctext = '' - else: - ctext = '(' + dns.rdatatype.to_text(covers) + ')' - return '' - - def __str__(self): - return self.to_text() - - def _cmp(self, other): - """Compare an rdata with another rdata of the same rdtype and - rdclass. - - Return < 0 if self < other in the DNSSEC ordering, 0 if self - == other, and > 0 if self > other. - - """ - our = self.to_digestable(dns.name.root) - their = other.to_digestable(dns.name.root) - if our == their: - return 0 - elif our > their: - return 1 - else: - return -1 - - def __eq__(self, other): - if not isinstance(other, Rdata): - return False - if self.rdclass != other.rdclass or self.rdtype != other.rdtype: - return False - return self._cmp(other) == 0 - - def __ne__(self, other): - if not isinstance(other, Rdata): - return True - if self.rdclass != other.rdclass or self.rdtype != other.rdtype: - return True - return self._cmp(other) != 0 - - def __lt__(self, other): - if not isinstance(other, Rdata) or \ - self.rdclass != other.rdclass or self.rdtype != other.rdtype: - - return NotImplemented - return self._cmp(other) < 0 - - def __le__(self, other): - if not isinstance(other, Rdata) or \ - self.rdclass != other.rdclass or self.rdtype != other.rdtype: - return NotImplemented - return self._cmp(other) <= 0 - - def __ge__(self, other): - if not isinstance(other, Rdata) or \ - self.rdclass != other.rdclass or self.rdtype != other.rdtype: - return NotImplemented - return self._cmp(other) >= 0 - - def __gt__(self, other): - if not isinstance(other, Rdata) or \ - self.rdclass != other.rdclass or self.rdtype != other.rdtype: - return NotImplemented - return self._cmp(other) > 0 - - def __hash__(self): - return hash(self.to_digestable(dns.name.root)) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - raise NotImplementedError - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - raise NotImplementedError - - def choose_relativity(self, origin=None, relativize=True): - """Convert any domain names in the rdata to the specified - relativization. - """ - -class GenericRdata(Rdata): - - """Generic Rdata Class - - This class is used for rdata types for which we have no better - implementation. It implements the DNS "unknown RRs" scheme. - """ - - __slots__ = ['data'] - - def __init__(self, rdclass, rdtype, data): - super(GenericRdata, self).__init__(rdclass, rdtype) - self.data = data - - def to_text(self, origin=None, relativize=True, **kw): - return r'\# %d ' % len(self.data) + _hexify(self.data) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - token = tok.get() - if not token.is_identifier() or token.value != r'\#': - raise dns.exception.SyntaxError( - r'generic rdata does not start with \#') - length = tok.get_int() - chunks = [] - while 1: - token = tok.get() - if token.is_eol_or_eof(): - break - chunks.append(token.value.encode()) - hex = b''.join(chunks) - data = binascii.unhexlify(hex) - if len(data) != length: - raise dns.exception.SyntaxError( - 'generic rdata hex data has wrong length') - return cls(rdclass, rdtype, data) - - def to_wire(self, file, compress=None, origin=None): - file.write(self.data) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - return cls(rdclass, rdtype, wire[current: current + rdlen]) - -_rdata_modules = {} -_module_prefix = 'dns.rdtypes' -_import_lock = _threading.Lock() - -def get_rdata_class(rdclass, rdtype): - - def import_module(name): - with _import_lock: - mod = __import__(name) - components = name.split('.') - for comp in components[1:]: - mod = getattr(mod, comp) - return mod - - mod = _rdata_modules.get((rdclass, rdtype)) - rdclass_text = dns.rdataclass.to_text(rdclass) - rdtype_text = dns.rdatatype.to_text(rdtype) - rdtype_text = rdtype_text.replace('-', '_') - if not mod: - mod = _rdata_modules.get((dns.rdatatype.ANY, rdtype)) - if not mod: - try: - mod = import_module('.'.join([_module_prefix, - rdclass_text, rdtype_text])) - _rdata_modules[(rdclass, rdtype)] = mod - except ImportError: - try: - mod = import_module('.'.join([_module_prefix, - 'ANY', rdtype_text])) - _rdata_modules[(dns.rdataclass.ANY, rdtype)] = mod - except ImportError: - mod = None - if mod: - cls = getattr(mod, rdtype_text) - else: - cls = GenericRdata - return cls - - -def from_text(rdclass, rdtype, tok, origin=None, relativize=True): - """Build an rdata object from text format. - - This function attempts to dynamically load a class which - implements the specified rdata class and type. If there is no - class-and-type-specific implementation, the GenericRdata class - is used. - - Once a class is chosen, its from_text() class method is called - with the parameters to this function. - - If *tok* is a ``text``, then a tokenizer is created and the string - is used as its input. - - *rdclass*, an ``int``, the rdataclass. - - *rdtype*, an ``int``, the rdatatype. - - *tok*, a ``dns.tokenizer.Tokenizer`` or a ``text``. - - *origin*, a ``dns.name.Name`` (or ``None``), the - origin to use for relative names. - - *relativize*, a ``bool``. If true, name will be relativized to - the specified origin. - - Returns an instance of the chosen Rdata subclass. - """ - - if isinstance(tok, string_types): - tok = dns.tokenizer.Tokenizer(tok) - cls = get_rdata_class(rdclass, rdtype) - if cls != GenericRdata: - # peek at first token - token = tok.get() - tok.unget(token) - if token.is_identifier() and \ - token.value == r'\#': - # - # Known type using the generic syntax. Extract the - # wire form from the generic syntax, and then run - # from_wire on it. - # - rdata = GenericRdata.from_text(rdclass, rdtype, tok, origin, - relativize) - return from_wire(rdclass, rdtype, rdata.data, 0, len(rdata.data), - origin) - return cls.from_text(rdclass, rdtype, tok, origin, relativize) - - -def from_wire(rdclass, rdtype, wire, current, rdlen, origin=None): - """Build an rdata object from wire format - - This function attempts to dynamically load a class which - implements the specified rdata class and type. If there is no - class-and-type-specific implementation, the GenericRdata class - is used. - - Once a class is chosen, its from_wire() class method is called - with the parameters to this function. - - *rdclass*, an ``int``, the rdataclass. - - *rdtype*, an ``int``, the rdatatype. - - *wire*, a ``binary``, the wire-format message. - - *current*, an ``int``, the offset in wire of the beginning of - the rdata. - - *rdlen*, an ``int``, the length of the wire-format rdata - - *origin*, a ``dns.name.Name`` (or ``None``). If not ``None``, - then names will be relativized to this origin. - - Returns an instance of the chosen Rdata subclass. - """ - - wire = dns.wiredata.maybe_wrap(wire) - cls = get_rdata_class(rdclass, rdtype) - return cls.from_wire(rdclass, rdtype, wire, current, rdlen, origin) - - -class RdatatypeExists(dns.exception.DNSException): - """DNS rdatatype already exists.""" - supp_kwargs = {'rdclass', 'rdtype'} - fmt = "The rdata type with class {rdclass} and rdtype {rdtype} " + \ - "already exists." - - -def register_type(implementation, rdtype, rdtype_text, is_singleton=False, - rdclass=dns.rdataclass.IN): - """Dynamically register a module to handle an rdatatype. - - *implementation*, a module implementing the type in the usual dnspython - way. - - *rdtype*, an ``int``, the rdatatype to register. - - *rdtype_text*, a ``text``, the textual form of the rdatatype. - - *is_singleton*, a ``bool``, indicating if the type is a singleton (i.e. - RRsets of the type can have only one member.) - - *rdclass*, the rdataclass of the type, or ``dns.rdataclass.ANY`` if - it applies to all classes. - """ - - existing_cls = get_rdata_class(rdclass, rdtype) - if existing_cls != GenericRdata: - raise RdatatypeExists(rdclass=rdclass, rdtype=rdtype) - _rdata_modules[(rdclass, rdtype)] = implementation - dns.rdatatype.register_type(rdtype, rdtype_text, is_singleton) diff --git a/env/lib/python3.7/site-packages/dns/rdataclass.py b/env/lib/python3.7/site-packages/dns/rdataclass.py deleted file mode 100644 index b88aa85..0000000 --- a/env/lib/python3.7/site-packages/dns/rdataclass.py +++ /dev/null @@ -1,122 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2001-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""DNS Rdata Classes.""" - -import re - -import dns.exception - -RESERVED0 = 0 -IN = 1 -CH = 3 -HS = 4 -NONE = 254 -ANY = 255 - -_by_text = { - 'RESERVED0': RESERVED0, - 'IN': IN, - 'CH': CH, - 'HS': HS, - 'NONE': NONE, - 'ANY': ANY -} - -# We construct the inverse mapping programmatically to ensure that we -# cannot make any mistakes (e.g. omissions, cut-and-paste errors) that -# would cause the mapping not to be true inverse. - -_by_value = {y: x for x, y in _by_text.items()} - -# Now that we've built the inverse map, we can add class aliases to -# the _by_text mapping. - -_by_text.update({ - 'INTERNET': IN, - 'CHAOS': CH, - 'HESIOD': HS -}) - -_metaclasses = { - NONE: True, - ANY: True -} - -_unknown_class_pattern = re.compile('CLASS([0-9]+)$', re.I) - - -class UnknownRdataclass(dns.exception.DNSException): - """A DNS class is unknown.""" - - -def from_text(text): - """Convert text into a DNS rdata class value. - - The input text can be a defined DNS RR class mnemonic or - instance of the DNS generic class syntax. - - For example, "IN" and "CLASS1" will both result in a value of 1. - - Raises ``dns.rdatatype.UnknownRdataclass`` if the class is unknown. - - Raises ``ValueError`` if the rdata class value is not >= 0 and <= 65535. - - Returns an ``int``. - """ - - value = _by_text.get(text.upper()) - if value is None: - match = _unknown_class_pattern.match(text) - if match is None: - raise UnknownRdataclass - value = int(match.group(1)) - if value < 0 or value > 65535: - raise ValueError("class must be between >= 0 and <= 65535") - return value - - -def to_text(value): - """Convert a DNS rdata type value to text. - - If the value has a known mnemonic, it will be used, otherwise the - DNS generic class syntax will be used. - - Raises ``ValueError`` if the rdata class value is not >= 0 and <= 65535. - - Returns a ``str``. - """ - - if value < 0 or value > 65535: - raise ValueError("class must be between >= 0 and <= 65535") - text = _by_value.get(value) - if text is None: - text = 'CLASS' + repr(value) - return text - - -def is_metaclass(rdclass): - """True if the specified class is a metaclass. - - The currently defined metaclasses are ANY and NONE. - - *rdclass* is an ``int``. - """ - - if rdclass in _metaclasses: - return True - return False diff --git a/env/lib/python3.7/site-packages/dns/rdataset.py b/env/lib/python3.7/site-packages/dns/rdataset.py deleted file mode 100644 index f1afe24..0000000 --- a/env/lib/python3.7/site-packages/dns/rdataset.py +++ /dev/null @@ -1,347 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2001-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""DNS rdatasets (an rdataset is a set of rdatas of a given type and class)""" - -import random -from io import StringIO -import struct - -import dns.exception -import dns.rdatatype -import dns.rdataclass -import dns.rdata -import dns.set -from ._compat import string_types - -# define SimpleSet here for backwards compatibility -SimpleSet = dns.set.Set - - -class DifferingCovers(dns.exception.DNSException): - """An attempt was made to add a DNS SIG/RRSIG whose covered type - is not the same as that of the other rdatas in the rdataset.""" - - -class IncompatibleTypes(dns.exception.DNSException): - """An attempt was made to add DNS RR data of an incompatible type.""" - - -class Rdataset(dns.set.Set): - - """A DNS rdataset.""" - - __slots__ = ['rdclass', 'rdtype', 'covers', 'ttl'] - - def __init__(self, rdclass, rdtype, covers=dns.rdatatype.NONE, ttl=0): - """Create a new rdataset of the specified class and type. - - *rdclass*, an ``int``, the rdataclass. - - *rdtype*, an ``int``, the rdatatype. - - *covers*, an ``int``, the covered rdatatype. - - *ttl*, an ``int``, the TTL. - """ - - super(Rdataset, self).__init__() - self.rdclass = rdclass - self.rdtype = rdtype - self.covers = covers - self.ttl = ttl - - def _clone(self): - obj = super(Rdataset, self)._clone() - obj.rdclass = self.rdclass - obj.rdtype = self.rdtype - obj.covers = self.covers - obj.ttl = self.ttl - return obj - - def update_ttl(self, ttl): - """Perform TTL minimization. - - Set the TTL of the rdataset to be the lesser of the set's current - TTL or the specified TTL. If the set contains no rdatas, set the TTL - to the specified TTL. - - *ttl*, an ``int``. - """ - - if len(self) == 0: - self.ttl = ttl - elif ttl < self.ttl: - self.ttl = ttl - - def add(self, rd, ttl=None): - """Add the specified rdata to the rdataset. - - If the optional *ttl* parameter is supplied, then - ``self.update_ttl(ttl)`` will be called prior to adding the rdata. - - *rd*, a ``dns.rdata.Rdata``, the rdata - - *ttl*, an ``int``, the TTL. - - Raises ``dns.rdataset.IncompatibleTypes`` if the type and class - do not match the type and class of the rdataset. - - Raises ``dns.rdataset.DifferingCovers`` if the type is a signature - type and the covered type does not match that of the rdataset. - """ - - # - # If we're adding a signature, do some special handling to - # check that the signature covers the same type as the - # other rdatas in this rdataset. If this is the first rdata - # in the set, initialize the covers field. - # - if self.rdclass != rd.rdclass or self.rdtype != rd.rdtype: - raise IncompatibleTypes - if ttl is not None: - self.update_ttl(ttl) - if self.rdtype == dns.rdatatype.RRSIG or \ - self.rdtype == dns.rdatatype.SIG: - covers = rd.covers() - if len(self) == 0 and self.covers == dns.rdatatype.NONE: - self.covers = covers - elif self.covers != covers: - raise DifferingCovers - if dns.rdatatype.is_singleton(rd.rdtype) and len(self) > 0: - self.clear() - super(Rdataset, self).add(rd) - - def union_update(self, other): - self.update_ttl(other.ttl) - super(Rdataset, self).union_update(other) - - def intersection_update(self, other): - self.update_ttl(other.ttl) - super(Rdataset, self).intersection_update(other) - - def update(self, other): - """Add all rdatas in other to self. - - *other*, a ``dns.rdataset.Rdataset``, the rdataset from which - to update. - """ - - self.update_ttl(other.ttl) - super(Rdataset, self).update(other) - - def __repr__(self): - if self.covers == 0: - ctext = '' - else: - ctext = '(' + dns.rdatatype.to_text(self.covers) + ')' - return '' - - def __str__(self): - return self.to_text() - - def __eq__(self, other): - if not isinstance(other, Rdataset): - return False - if self.rdclass != other.rdclass or \ - self.rdtype != other.rdtype or \ - self.covers != other.covers: - return False - return super(Rdataset, self).__eq__(other) - - def __ne__(self, other): - return not self.__eq__(other) - - def to_text(self, name=None, origin=None, relativize=True, - override_rdclass=None, **kw): - """Convert the rdataset into DNS master file format. - - See ``dns.name.Name.choose_relativity`` for more information - on how *origin* and *relativize* determine the way names - are emitted. - - Any additional keyword arguments are passed on to the rdata - ``to_text()`` method. - - *name*, a ``dns.name.Name``. If name is not ``None``, emit RRs with - *name* as the owner name. - - *origin*, a ``dns.name.Name`` or ``None``, the origin for relative - names. - - *relativize*, a ``bool``. If ``True``, names will be relativized - to *origin*. - """ - - if name is not None: - name = name.choose_relativity(origin, relativize) - ntext = str(name) - pad = ' ' - else: - ntext = '' - pad = '' - s = StringIO() - if override_rdclass is not None: - rdclass = override_rdclass - else: - rdclass = self.rdclass - if len(self) == 0: - # - # Empty rdatasets are used for the question section, and in - # some dynamic updates, so we don't need to print out the TTL - # (which is meaningless anyway). - # - s.write(u'{}{}{} {}\n'.format(ntext, pad, - dns.rdataclass.to_text(rdclass), - dns.rdatatype.to_text(self.rdtype))) - else: - for rd in self: - s.write(u'%s%s%d %s %s %s\n' % - (ntext, pad, self.ttl, dns.rdataclass.to_text(rdclass), - dns.rdatatype.to_text(self.rdtype), - rd.to_text(origin=origin, relativize=relativize, - **kw))) - # - # We strip off the final \n for the caller's convenience in printing - # - return s.getvalue()[:-1] - - def to_wire(self, name, file, compress=None, origin=None, - override_rdclass=None, want_shuffle=True): - """Convert the rdataset to wire format. - - *name*, a ``dns.name.Name`` is the owner name to use. - - *file* is the file where the name is emitted (typically a - BytesIO file). - - *compress*, a ``dict``, is the compression table to use. If - ``None`` (the default), names will not be compressed. - - *origin* is a ``dns.name.Name`` or ``None``. If the name is - relative and origin is not ``None``, then *origin* will be appended - to it. - - *override_rdclass*, an ``int``, is used as the class instead of the - class of the rdataset. This is useful when rendering rdatasets - associated with dynamic updates. - - *want_shuffle*, a ``bool``. If ``True``, then the order of the - Rdatas within the Rdataset will be shuffled before rendering. - - Returns an ``int``, the number of records emitted. - """ - - if override_rdclass is not None: - rdclass = override_rdclass - want_shuffle = False - else: - rdclass = self.rdclass - file.seek(0, 2) - if len(self) == 0: - name.to_wire(file, compress, origin) - stuff = struct.pack("!HHIH", self.rdtype, rdclass, 0, 0) - file.write(stuff) - return 1 - else: - if want_shuffle: - l = list(self) - random.shuffle(l) - else: - l = self - for rd in l: - name.to_wire(file, compress, origin) - stuff = struct.pack("!HHIH", self.rdtype, rdclass, - self.ttl, 0) - file.write(stuff) - start = file.tell() - rd.to_wire(file, compress, origin) - end = file.tell() - assert end - start < 65536 - file.seek(start - 2) - stuff = struct.pack("!H", end - start) - file.write(stuff) - file.seek(0, 2) - return len(self) - - def match(self, rdclass, rdtype, covers): - """Returns ``True`` if this rdataset matches the specified class, - type, and covers. - """ - if self.rdclass == rdclass and \ - self.rdtype == rdtype and \ - self.covers == covers: - return True - return False - - -def from_text_list(rdclass, rdtype, ttl, text_rdatas): - """Create an rdataset with the specified class, type, and TTL, and with - the specified list of rdatas in text format. - - Returns a ``dns.rdataset.Rdataset`` object. - """ - - if isinstance(rdclass, string_types): - rdclass = dns.rdataclass.from_text(rdclass) - if isinstance(rdtype, string_types): - rdtype = dns.rdatatype.from_text(rdtype) - r = Rdataset(rdclass, rdtype) - r.update_ttl(ttl) - for t in text_rdatas: - rd = dns.rdata.from_text(r.rdclass, r.rdtype, t) - r.add(rd) - return r - - -def from_text(rdclass, rdtype, ttl, *text_rdatas): - """Create an rdataset with the specified class, type, and TTL, and with - the specified rdatas in text format. - - Returns a ``dns.rdataset.Rdataset`` object. - """ - - return from_text_list(rdclass, rdtype, ttl, text_rdatas) - - -def from_rdata_list(ttl, rdatas): - """Create an rdataset with the specified TTL, and with - the specified list of rdata objects. - - Returns a ``dns.rdataset.Rdataset`` object. - """ - - if len(rdatas) == 0: - raise ValueError("rdata list must not be empty") - r = None - for rd in rdatas: - if r is None: - r = Rdataset(rd.rdclass, rd.rdtype) - r.update_ttl(ttl) - r.add(rd) - return r - - -def from_rdata(ttl, *rdatas): - """Create an rdataset with the specified TTL, and with - the specified rdata objects. - - Returns a ``dns.rdataset.Rdataset`` object. - """ - - return from_rdata_list(ttl, rdatas) diff --git a/env/lib/python3.7/site-packages/dns/rdatatype.py b/env/lib/python3.7/site-packages/dns/rdatatype.py deleted file mode 100644 index b247bc9..0000000 --- a/env/lib/python3.7/site-packages/dns/rdatatype.py +++ /dev/null @@ -1,287 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2001-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""DNS Rdata Types.""" - -import re - -import dns.exception - -NONE = 0 -A = 1 -NS = 2 -MD = 3 -MF = 4 -CNAME = 5 -SOA = 6 -MB = 7 -MG = 8 -MR = 9 -NULL = 10 -WKS = 11 -PTR = 12 -HINFO = 13 -MINFO = 14 -MX = 15 -TXT = 16 -RP = 17 -AFSDB = 18 -X25 = 19 -ISDN = 20 -RT = 21 -NSAP = 22 -NSAP_PTR = 23 -SIG = 24 -KEY = 25 -PX = 26 -GPOS = 27 -AAAA = 28 -LOC = 29 -NXT = 30 -SRV = 33 -NAPTR = 35 -KX = 36 -CERT = 37 -A6 = 38 -DNAME = 39 -OPT = 41 -APL = 42 -DS = 43 -SSHFP = 44 -IPSECKEY = 45 -RRSIG = 46 -NSEC = 47 -DNSKEY = 48 -DHCID = 49 -NSEC3 = 50 -NSEC3PARAM = 51 -TLSA = 52 -HIP = 55 -CDS = 59 -CDNSKEY = 60 -OPENPGPKEY = 61 -CSYNC = 62 -SPF = 99 -UNSPEC = 103 -EUI48 = 108 -EUI64 = 109 -TKEY = 249 -TSIG = 250 -IXFR = 251 -AXFR = 252 -MAILB = 253 -MAILA = 254 -ANY = 255 -URI = 256 -CAA = 257 -AVC = 258 -TA = 32768 -DLV = 32769 - -_by_text = { - 'NONE': NONE, - 'A': A, - 'NS': NS, - 'MD': MD, - 'MF': MF, - 'CNAME': CNAME, - 'SOA': SOA, - 'MB': MB, - 'MG': MG, - 'MR': MR, - 'NULL': NULL, - 'WKS': WKS, - 'PTR': PTR, - 'HINFO': HINFO, - 'MINFO': MINFO, - 'MX': MX, - 'TXT': TXT, - 'RP': RP, - 'AFSDB': AFSDB, - 'X25': X25, - 'ISDN': ISDN, - 'RT': RT, - 'NSAP': NSAP, - 'NSAP-PTR': NSAP_PTR, - 'SIG': SIG, - 'KEY': KEY, - 'PX': PX, - 'GPOS': GPOS, - 'AAAA': AAAA, - 'LOC': LOC, - 'NXT': NXT, - 'SRV': SRV, - 'NAPTR': NAPTR, - 'KX': KX, - 'CERT': CERT, - 'A6': A6, - 'DNAME': DNAME, - 'OPT': OPT, - 'APL': APL, - 'DS': DS, - 'SSHFP': SSHFP, - 'IPSECKEY': IPSECKEY, - 'RRSIG': RRSIG, - 'NSEC': NSEC, - 'DNSKEY': DNSKEY, - 'DHCID': DHCID, - 'NSEC3': NSEC3, - 'NSEC3PARAM': NSEC3PARAM, - 'TLSA': TLSA, - 'HIP': HIP, - 'CDS': CDS, - 'CDNSKEY': CDNSKEY, - 'OPENPGPKEY': OPENPGPKEY, - 'CSYNC': CSYNC, - 'SPF': SPF, - 'UNSPEC': UNSPEC, - 'EUI48': EUI48, - 'EUI64': EUI64, - 'TKEY': TKEY, - 'TSIG': TSIG, - 'IXFR': IXFR, - 'AXFR': AXFR, - 'MAILB': MAILB, - 'MAILA': MAILA, - 'ANY': ANY, - 'URI': URI, - 'CAA': CAA, - 'AVC': AVC, - 'TA': TA, - 'DLV': DLV, -} - -# We construct the inverse mapping programmatically to ensure that we -# cannot make any mistakes (e.g. omissions, cut-and-paste errors) that -# would cause the mapping not to be true inverse. - -_by_value = {y: x for x, y in _by_text.items()} - -_metatypes = { - OPT: True -} - -_singletons = { - SOA: True, - NXT: True, - DNAME: True, - NSEC: True, - CNAME: True, -} - -_unknown_type_pattern = re.compile('TYPE([0-9]+)$', re.I) - - -class UnknownRdatatype(dns.exception.DNSException): - """DNS resource record type is unknown.""" - - -def from_text(text): - """Convert text into a DNS rdata type value. - - The input text can be a defined DNS RR type mnemonic or - instance of the DNS generic type syntax. - - For example, "NS" and "TYPE2" will both result in a value of 2. - - Raises ``dns.rdatatype.UnknownRdatatype`` if the type is unknown. - - Raises ``ValueError`` if the rdata type value is not >= 0 and <= 65535. - - Returns an ``int``. - """ - - value = _by_text.get(text.upper()) - if value is None: - match = _unknown_type_pattern.match(text) - if match is None: - raise UnknownRdatatype - value = int(match.group(1)) - if value < 0 or value > 65535: - raise ValueError("type must be between >= 0 and <= 65535") - return value - - -def to_text(value): - """Convert a DNS rdata type value to text. - - If the value has a known mnemonic, it will be used, otherwise the - DNS generic type syntax will be used. - - Raises ``ValueError`` if the rdata type value is not >= 0 and <= 65535. - - Returns a ``str``. - """ - - if value < 0 or value > 65535: - raise ValueError("type must be between >= 0 and <= 65535") - text = _by_value.get(value) - if text is None: - text = 'TYPE' + repr(value) - return text - - -def is_metatype(rdtype): - """True if the specified type is a metatype. - - *rdtype* is an ``int``. - - The currently defined metatypes are TKEY, TSIG, IXFR, AXFR, MAILA, - MAILB, ANY, and OPT. - - Returns a ``bool``. - """ - - if rdtype >= TKEY and rdtype <= ANY or rdtype in _metatypes: - return True - return False - - -def is_singleton(rdtype): - """Is the specified type a singleton type? - - Singleton types can only have a single rdata in an rdataset, or a single - RR in an RRset. - - The currently defined singleton types are CNAME, DNAME, NSEC, NXT, and - SOA. - - *rdtype* is an ``int``. - - Returns a ``bool``. - """ - - if rdtype in _singletons: - return True - return False - - -def register_type(rdtype, rdtype_text, is_singleton=False): # pylint: disable=redefined-outer-name - """Dynamically register an rdatatype. - - *rdtype*, an ``int``, the rdatatype to register. - - *rdtype_text*, a ``text``, the textual form of the rdatatype. - - *is_singleton*, a ``bool``, indicating if the type is a singleton (i.e. - RRsets of the type can have only one member.) - """ - - _by_text[rdtype_text] = rdtype - _by_value[rdtype] = rdtype_text - if is_singleton: - _singletons[rdtype] = True diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/AFSDB.py b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/AFSDB.py deleted file mode 100644 index c6a700c..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/AFSDB.py +++ /dev/null @@ -1,55 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import dns.rdtypes.mxbase - - -class AFSDB(dns.rdtypes.mxbase.UncompressedDowncasingMX): - - """AFSDB record - - @ivar subtype: the subtype value - @type subtype: int - @ivar hostname: the hostname name - @type hostname: dns.name.Name object""" - - # Use the property mechanism to make "subtype" an alias for the - # "preference" attribute, and "hostname" an alias for the "exchange" - # attribute. - # - # This lets us inherit the UncompressedMX implementation but lets - # the caller use appropriate attribute names for the rdata type. - # - # We probably lose some performance vs. a cut-and-paste - # implementation, but this way we don't copy code, and that's - # good. - - def get_subtype(self): - return self.preference - - def set_subtype(self, subtype): - self.preference = subtype - - subtype = property(get_subtype, set_subtype) - - def get_hostname(self): - return self.exchange - - def set_hostname(self, hostname): - self.exchange = hostname - - hostname = property(get_hostname, set_hostname) diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/AVC.py b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/AVC.py deleted file mode 100644 index 7f340b3..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/AVC.py +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2016 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import dns.rdtypes.txtbase - - -class AVC(dns.rdtypes.txtbase.TXTBase): - - """AVC record - - @see: U{http://www.iana.org/assignments/dns-parameters/AVC/avc-completed-template}""" diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/CAA.py b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/CAA.py deleted file mode 100644 index 0acf201..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/CAA.py +++ /dev/null @@ -1,75 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import struct - -import dns.exception -import dns.rdata -import dns.tokenizer - - -class CAA(dns.rdata.Rdata): - - """CAA (Certification Authority Authorization) record - - @ivar flags: the flags - @type flags: int - @ivar tag: the tag - @type tag: string - @ivar value: the value - @type value: string - @see: RFC 6844""" - - __slots__ = ['flags', 'tag', 'value'] - - def __init__(self, rdclass, rdtype, flags, tag, value): - super(CAA, self).__init__(rdclass, rdtype) - self.flags = flags - self.tag = tag - self.value = value - - def to_text(self, origin=None, relativize=True, **kw): - return '%u %s "%s"' % (self.flags, - dns.rdata._escapify(self.tag), - dns.rdata._escapify(self.value)) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - flags = tok.get_uint8() - tag = tok.get_string().encode() - if len(tag) > 255: - raise dns.exception.SyntaxError("tag too long") - if not tag.isalnum(): - raise dns.exception.SyntaxError("tag is not alphanumeric") - value = tok.get_string().encode() - return cls(rdclass, rdtype, flags, tag, value) - - def to_wire(self, file, compress=None, origin=None): - file.write(struct.pack('!B', self.flags)) - l = len(self.tag) - assert l < 256 - file.write(struct.pack('!B', l)) - file.write(self.tag) - file.write(self.value) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - (flags, l) = struct.unpack('!BB', wire[current: current + 2]) - current += 2 - tag = wire[current: current + l] - value = wire[current + l:current + rdlen - 2] - return cls(rdclass, rdtype, flags, tag, value) diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/CDNSKEY.py b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/CDNSKEY.py deleted file mode 100644 index 653ae1b..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/CDNSKEY.py +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2004-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import dns.rdtypes.dnskeybase -from dns.rdtypes.dnskeybase import flags_to_text_set, flags_from_text_set - - -__all__ = ['flags_to_text_set', 'flags_from_text_set'] - - -class CDNSKEY(dns.rdtypes.dnskeybase.DNSKEYBase): - - """CDNSKEY record""" diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/CDS.py b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/CDS.py deleted file mode 100644 index a63041d..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/CDS.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import dns.rdtypes.dsbase - - -class CDS(dns.rdtypes.dsbase.DSBase): - - """CDS record""" diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/CERT.py b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/CERT.py deleted file mode 100644 index eea27b5..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/CERT.py +++ /dev/null @@ -1,123 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import struct -import base64 - -import dns.exception -import dns.dnssec -import dns.rdata -import dns.tokenizer - -_ctype_by_value = { - 1: 'PKIX', - 2: 'SPKI', - 3: 'PGP', - 253: 'URI', - 254: 'OID', -} - -_ctype_by_name = { - 'PKIX': 1, - 'SPKI': 2, - 'PGP': 3, - 'URI': 253, - 'OID': 254, -} - - -def _ctype_from_text(what): - v = _ctype_by_name.get(what) - if v is not None: - return v - return int(what) - - -def _ctype_to_text(what): - v = _ctype_by_value.get(what) - if v is not None: - return v - return str(what) - - -class CERT(dns.rdata.Rdata): - - """CERT record - - @ivar certificate_type: certificate type - @type certificate_type: int - @ivar key_tag: key tag - @type key_tag: int - @ivar algorithm: algorithm - @type algorithm: int - @ivar certificate: the certificate or CRL - @type certificate: string - @see: RFC 2538""" - - __slots__ = ['certificate_type', 'key_tag', 'algorithm', 'certificate'] - - def __init__(self, rdclass, rdtype, certificate_type, key_tag, algorithm, - certificate): - super(CERT, self).__init__(rdclass, rdtype) - self.certificate_type = certificate_type - self.key_tag = key_tag - self.algorithm = algorithm - self.certificate = certificate - - def to_text(self, origin=None, relativize=True, **kw): - certificate_type = _ctype_to_text(self.certificate_type) - return "%s %d %s %s" % (certificate_type, self.key_tag, - dns.dnssec.algorithm_to_text(self.algorithm), - dns.rdata._base64ify(self.certificate)) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - certificate_type = _ctype_from_text(tok.get_string()) - key_tag = tok.get_uint16() - algorithm = dns.dnssec.algorithm_from_text(tok.get_string()) - if algorithm < 0 or algorithm > 255: - raise dns.exception.SyntaxError("bad algorithm type") - chunks = [] - while 1: - t = tok.get().unescape() - if t.is_eol_or_eof(): - break - if not t.is_identifier(): - raise dns.exception.SyntaxError - chunks.append(t.value.encode()) - b64 = b''.join(chunks) - certificate = base64.b64decode(b64) - return cls(rdclass, rdtype, certificate_type, key_tag, - algorithm, certificate) - - def to_wire(self, file, compress=None, origin=None): - prefix = struct.pack("!HHB", self.certificate_type, self.key_tag, - self.algorithm) - file.write(prefix) - file.write(self.certificate) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - prefix = wire[current: current + 5].unwrap() - current += 5 - rdlen -= 5 - if rdlen < 0: - raise dns.exception.FormError - (certificate_type, key_tag, algorithm) = struct.unpack("!HHB", prefix) - certificate = wire[current: current + rdlen].unwrap() - return cls(rdclass, rdtype, certificate_type, key_tag, algorithm, - certificate) diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/CNAME.py b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/CNAME.py deleted file mode 100644 index 11d42aa..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/CNAME.py +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import dns.rdtypes.nsbase - - -class CNAME(dns.rdtypes.nsbase.NSBase): - - """CNAME record - - Note: although CNAME is officially a singleton type, dnspython allows - non-singleton CNAME rdatasets because such sets have been commonly - used by BIND and other nameservers for load balancing.""" diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/CSYNC.py b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/CSYNC.py deleted file mode 100644 index 06292fb..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/CSYNC.py +++ /dev/null @@ -1,126 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2004-2007, 2009-2011, 2016 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import struct - -import dns.exception -import dns.rdata -import dns.rdatatype -import dns.name -from dns._compat import xrange - -class CSYNC(dns.rdata.Rdata): - - """CSYNC record - - @ivar serial: the SOA serial number - @type serial: int - @ivar flags: the CSYNC flags - @type flags: int - @ivar windows: the windowed bitmap list - @type windows: list of (window number, string) tuples""" - - __slots__ = ['serial', 'flags', 'windows'] - - def __init__(self, rdclass, rdtype, serial, flags, windows): - super(CSYNC, self).__init__(rdclass, rdtype) - self.serial = serial - self.flags = flags - self.windows = windows - - def to_text(self, origin=None, relativize=True, **kw): - text = '' - for (window, bitmap) in self.windows: - bits = [] - for i in xrange(0, len(bitmap)): - byte = bitmap[i] - for j in xrange(0, 8): - if byte & (0x80 >> j): - bits.append(dns.rdatatype.to_text(window * 256 + - i * 8 + j)) - text += (' ' + ' '.join(bits)) - return '%d %d%s' % (self.serial, self.flags, text) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - serial = tok.get_uint32() - flags = tok.get_uint16() - rdtypes = [] - while 1: - token = tok.get().unescape() - if token.is_eol_or_eof(): - break - nrdtype = dns.rdatatype.from_text(token.value) - if nrdtype == 0: - raise dns.exception.SyntaxError("CSYNC with bit 0") - if nrdtype > 65535: - raise dns.exception.SyntaxError("CSYNC with bit > 65535") - rdtypes.append(nrdtype) - rdtypes.sort() - window = 0 - octets = 0 - prior_rdtype = 0 - bitmap = bytearray(b'\0' * 32) - windows = [] - for nrdtype in rdtypes: - if nrdtype == prior_rdtype: - continue - prior_rdtype = nrdtype - new_window = nrdtype // 256 - if new_window != window: - windows.append((window, bitmap[0:octets])) - bitmap = bytearray(b'\0' * 32) - window = new_window - offset = nrdtype % 256 - byte = offset // 8 - bit = offset % 8 - octets = byte + 1 - bitmap[byte] = bitmap[byte] | (0x80 >> bit) - - windows.append((window, bitmap[0:octets])) - return cls(rdclass, rdtype, serial, flags, windows) - - def to_wire(self, file, compress=None, origin=None): - file.write(struct.pack('!IH', self.serial, self.flags)) - for (window, bitmap) in self.windows: - file.write(struct.pack('!BB', window, len(bitmap))) - file.write(bitmap) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - if rdlen < 6: - raise dns.exception.FormError("CSYNC too short") - (serial, flags) = struct.unpack("!IH", wire[current: current + 6]) - current += 6 - rdlen -= 6 - windows = [] - while rdlen > 0: - if rdlen < 3: - raise dns.exception.FormError("CSYNC too short") - window = wire[current] - octets = wire[current + 1] - if octets == 0 or octets > 32: - raise dns.exception.FormError("bad CSYNC octets") - current += 2 - rdlen -= 2 - if rdlen < octets: - raise dns.exception.FormError("bad CSYNC bitmap length") - bitmap = bytearray(wire[current: current + octets].unwrap()) - current += octets - rdlen -= octets - windows.append((window, bitmap)) - return cls(rdclass, rdtype, serial, flags, windows) diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/DLV.py b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/DLV.py deleted file mode 100644 index 1635212..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/DLV.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import dns.rdtypes.dsbase - - -class DLV(dns.rdtypes.dsbase.DSBase): - - """DLV record""" diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/DNAME.py b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/DNAME.py deleted file mode 100644 index 2499283..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/DNAME.py +++ /dev/null @@ -1,26 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import dns.rdtypes.nsbase - - -class DNAME(dns.rdtypes.nsbase.UncompressedNS): - - """DNAME record""" - - def to_digestable(self, origin=None): - return self.target.to_digestable(origin) diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/DNSKEY.py b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/DNSKEY.py deleted file mode 100644 index e36f7bc..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/DNSKEY.py +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2004-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import dns.rdtypes.dnskeybase -from dns.rdtypes.dnskeybase import flags_to_text_set, flags_from_text_set - - -__all__ = ['flags_to_text_set', 'flags_from_text_set'] - - -class DNSKEY(dns.rdtypes.dnskeybase.DNSKEYBase): - - """DNSKEY record""" diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/DS.py b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/DS.py deleted file mode 100644 index 7d457b2..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/DS.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import dns.rdtypes.dsbase - - -class DS(dns.rdtypes.dsbase.DSBase): - - """DS record""" diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/EUI48.py b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/EUI48.py deleted file mode 100644 index aa260e2..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/EUI48.py +++ /dev/null @@ -1,29 +0,0 @@ -# Copyright (C) 2015 Red Hat, Inc. -# Author: Petr Spacek -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED 'AS IS' AND RED HAT DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import dns.rdtypes.euibase - - -class EUI48(dns.rdtypes.euibase.EUIBase): - - """EUI48 record - - @ivar fingerprint: 48-bit Extended Unique Identifier (EUI-48) - @type fingerprint: string - @see: rfc7043.txt""" - - byte_len = 6 # 0123456789ab (in hex) - text_len = byte_len * 3 - 1 # 01-23-45-67-89-ab diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/EUI64.py b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/EUI64.py deleted file mode 100644 index 5eba350..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/EUI64.py +++ /dev/null @@ -1,29 +0,0 @@ -# Copyright (C) 2015 Red Hat, Inc. -# Author: Petr Spacek -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED 'AS IS' AND RED HAT DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import dns.rdtypes.euibase - - -class EUI64(dns.rdtypes.euibase.EUIBase): - - """EUI64 record - - @ivar fingerprint: 64-bit Extended Unique Identifier (EUI-64) - @type fingerprint: string - @see: rfc7043.txt""" - - byte_len = 8 # 0123456789abcdef (in hex) - text_len = byte_len * 3 - 1 # 01-23-45-67-89-ab-cd-ef diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/GPOS.py b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/GPOS.py deleted file mode 100644 index 422822f..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/GPOS.py +++ /dev/null @@ -1,162 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import struct - -import dns.exception -import dns.rdata -import dns.tokenizer -from dns._compat import long, text_type - - -def _validate_float_string(what): - if what[0] == b'-'[0] or what[0] == b'+'[0]: - what = what[1:] - if what.isdigit(): - return - (left, right) = what.split(b'.') - if left == b'' and right == b'': - raise dns.exception.FormError - if not left == b'' and not left.decode().isdigit(): - raise dns.exception.FormError - if not right == b'' and not right.decode().isdigit(): - raise dns.exception.FormError - - -def _sanitize(value): - if isinstance(value, text_type): - return value.encode() - return value - - -class GPOS(dns.rdata.Rdata): - - """GPOS record - - @ivar latitude: latitude - @type latitude: string - @ivar longitude: longitude - @type longitude: string - @ivar altitude: altitude - @type altitude: string - @see: RFC 1712""" - - __slots__ = ['latitude', 'longitude', 'altitude'] - - def __init__(self, rdclass, rdtype, latitude, longitude, altitude): - super(GPOS, self).__init__(rdclass, rdtype) - if isinstance(latitude, float) or \ - isinstance(latitude, int) or \ - isinstance(latitude, long): - latitude = str(latitude) - if isinstance(longitude, float) or \ - isinstance(longitude, int) or \ - isinstance(longitude, long): - longitude = str(longitude) - if isinstance(altitude, float) or \ - isinstance(altitude, int) or \ - isinstance(altitude, long): - altitude = str(altitude) - latitude = _sanitize(latitude) - longitude = _sanitize(longitude) - altitude = _sanitize(altitude) - _validate_float_string(latitude) - _validate_float_string(longitude) - _validate_float_string(altitude) - self.latitude = latitude - self.longitude = longitude - self.altitude = altitude - - def to_text(self, origin=None, relativize=True, **kw): - return '{} {} {}'.format(self.latitude.decode(), - self.longitude.decode(), - self.altitude.decode()) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - latitude = tok.get_string() - longitude = tok.get_string() - altitude = tok.get_string() - tok.get_eol() - return cls(rdclass, rdtype, latitude, longitude, altitude) - - def to_wire(self, file, compress=None, origin=None): - l = len(self.latitude) - assert l < 256 - file.write(struct.pack('!B', l)) - file.write(self.latitude) - l = len(self.longitude) - assert l < 256 - file.write(struct.pack('!B', l)) - file.write(self.longitude) - l = len(self.altitude) - assert l < 256 - file.write(struct.pack('!B', l)) - file.write(self.altitude) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - l = wire[current] - current += 1 - rdlen -= 1 - if l > rdlen: - raise dns.exception.FormError - latitude = wire[current: current + l].unwrap() - current += l - rdlen -= l - l = wire[current] - current += 1 - rdlen -= 1 - if l > rdlen: - raise dns.exception.FormError - longitude = wire[current: current + l].unwrap() - current += l - rdlen -= l - l = wire[current] - current += 1 - rdlen -= 1 - if l != rdlen: - raise dns.exception.FormError - altitude = wire[current: current + l].unwrap() - return cls(rdclass, rdtype, latitude, longitude, altitude) - - def _get_float_latitude(self): - return float(self.latitude) - - def _set_float_latitude(self, value): - self.latitude = str(value) - - float_latitude = property(_get_float_latitude, _set_float_latitude, - doc="latitude as a floating point value") - - def _get_float_longitude(self): - return float(self.longitude) - - def _set_float_longitude(self, value): - self.longitude = str(value) - - float_longitude = property(_get_float_longitude, _set_float_longitude, - doc="longitude as a floating point value") - - def _get_float_altitude(self): - return float(self.altitude) - - def _set_float_altitude(self, value): - self.altitude = str(value) - - float_altitude = property(_get_float_altitude, _set_float_altitude, - doc="altitude as a floating point value") diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/HINFO.py b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/HINFO.py deleted file mode 100644 index e4e0b34..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/HINFO.py +++ /dev/null @@ -1,86 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import struct - -import dns.exception -import dns.rdata -import dns.tokenizer -from dns._compat import text_type - - -class HINFO(dns.rdata.Rdata): - - """HINFO record - - @ivar cpu: the CPU type - @type cpu: string - @ivar os: the OS type - @type os: string - @see: RFC 1035""" - - __slots__ = ['cpu', 'os'] - - def __init__(self, rdclass, rdtype, cpu, os): - super(HINFO, self).__init__(rdclass, rdtype) - if isinstance(cpu, text_type): - self.cpu = cpu.encode() - else: - self.cpu = cpu - if isinstance(os, text_type): - self.os = os.encode() - else: - self.os = os - - def to_text(self, origin=None, relativize=True, **kw): - return '"{}" "{}"'.format(dns.rdata._escapify(self.cpu), - dns.rdata._escapify(self.os)) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - cpu = tok.get_string() - os = tok.get_string() - tok.get_eol() - return cls(rdclass, rdtype, cpu, os) - - def to_wire(self, file, compress=None, origin=None): - l = len(self.cpu) - assert l < 256 - file.write(struct.pack('!B', l)) - file.write(self.cpu) - l = len(self.os) - assert l < 256 - file.write(struct.pack('!B', l)) - file.write(self.os) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - l = wire[current] - current += 1 - rdlen -= 1 - if l > rdlen: - raise dns.exception.FormError - cpu = wire[current:current + l].unwrap() - current += l - rdlen -= l - l = wire[current] - current += 1 - rdlen -= 1 - if l != rdlen: - raise dns.exception.FormError - os = wire[current: current + l].unwrap() - return cls(rdclass, rdtype, cpu, os) diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/HIP.py b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/HIP.py deleted file mode 100644 index 7c876b2..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/HIP.py +++ /dev/null @@ -1,115 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2010, 2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import struct -import base64 -import binascii - -import dns.exception -import dns.rdata -import dns.rdatatype - - -class HIP(dns.rdata.Rdata): - - """HIP record - - @ivar hit: the host identity tag - @type hit: string - @ivar algorithm: the public key cryptographic algorithm - @type algorithm: int - @ivar key: the public key - @type key: string - @ivar servers: the rendezvous servers - @type servers: list of dns.name.Name objects - @see: RFC 5205""" - - __slots__ = ['hit', 'algorithm', 'key', 'servers'] - - def __init__(self, rdclass, rdtype, hit, algorithm, key, servers): - super(HIP, self).__init__(rdclass, rdtype) - self.hit = hit - self.algorithm = algorithm - self.key = key - self.servers = servers - - def to_text(self, origin=None, relativize=True, **kw): - hit = binascii.hexlify(self.hit).decode() - key = base64.b64encode(self.key).replace(b'\n', b'').decode() - text = u'' - servers = [] - for server in self.servers: - servers.append(server.choose_relativity(origin, relativize)) - if len(servers) > 0: - text += (u' ' + u' '.join((x.to_unicode() for x in servers))) - return u'%u %s %s%s' % (self.algorithm, hit, key, text) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - algorithm = tok.get_uint8() - hit = binascii.unhexlify(tok.get_string().encode()) - if len(hit) > 255: - raise dns.exception.SyntaxError("HIT too long") - key = base64.b64decode(tok.get_string().encode()) - servers = [] - while 1: - token = tok.get() - if token.is_eol_or_eof(): - break - server = dns.name.from_text(token.value, origin) - server.choose_relativity(origin, relativize) - servers.append(server) - return cls(rdclass, rdtype, hit, algorithm, key, servers) - - def to_wire(self, file, compress=None, origin=None): - lh = len(self.hit) - lk = len(self.key) - file.write(struct.pack("!BBH", lh, self.algorithm, lk)) - file.write(self.hit) - file.write(self.key) - for server in self.servers: - server.to_wire(file, None, origin) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - (lh, algorithm, lk) = struct.unpack('!BBH', - wire[current: current + 4]) - current += 4 - rdlen -= 4 - hit = wire[current: current + lh].unwrap() - current += lh - rdlen -= lh - key = wire[current: current + lk].unwrap() - current += lk - rdlen -= lk - servers = [] - while rdlen > 0: - (server, cused) = dns.name.from_wire(wire[: current + rdlen], - current) - current += cused - rdlen -= cused - if origin is not None: - server = server.relativize(origin) - servers.append(server) - return cls(rdclass, rdtype, hit, algorithm, key, servers) - - def choose_relativity(self, origin=None, relativize=True): - servers = [] - for server in self.servers: - server = server.choose_relativity(origin, relativize) - servers.append(server) - self.servers = servers diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/ISDN.py b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/ISDN.py deleted file mode 100644 index f5f5f8b..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/ISDN.py +++ /dev/null @@ -1,99 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import struct - -import dns.exception -import dns.rdata -import dns.tokenizer -from dns._compat import text_type - - -class ISDN(dns.rdata.Rdata): - - """ISDN record - - @ivar address: the ISDN address - @type address: string - @ivar subaddress: the ISDN subaddress (or '' if not present) - @type subaddress: string - @see: RFC 1183""" - - __slots__ = ['address', 'subaddress'] - - def __init__(self, rdclass, rdtype, address, subaddress): - super(ISDN, self).__init__(rdclass, rdtype) - if isinstance(address, text_type): - self.address = address.encode() - else: - self.address = address - if isinstance(address, text_type): - self.subaddress = subaddress.encode() - else: - self.subaddress = subaddress - - def to_text(self, origin=None, relativize=True, **kw): - if self.subaddress: - return '"{}" "{}"'.format(dns.rdata._escapify(self.address), - dns.rdata._escapify(self.subaddress)) - else: - return '"%s"' % dns.rdata._escapify(self.address) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - address = tok.get_string() - t = tok.get() - if not t.is_eol_or_eof(): - tok.unget(t) - subaddress = tok.get_string() - else: - tok.unget(t) - subaddress = '' - tok.get_eol() - return cls(rdclass, rdtype, address, subaddress) - - def to_wire(self, file, compress=None, origin=None): - l = len(self.address) - assert l < 256 - file.write(struct.pack('!B', l)) - file.write(self.address) - l = len(self.subaddress) - if l > 0: - assert l < 256 - file.write(struct.pack('!B', l)) - file.write(self.subaddress) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - l = wire[current] - current += 1 - rdlen -= 1 - if l > rdlen: - raise dns.exception.FormError - address = wire[current: current + l].unwrap() - current += l - rdlen -= l - if rdlen > 0: - l = wire[current] - current += 1 - rdlen -= 1 - if l != rdlen: - raise dns.exception.FormError - subaddress = wire[current: current + l].unwrap() - else: - subaddress = '' - return cls(rdclass, rdtype, address, subaddress) diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/LOC.py b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/LOC.py deleted file mode 100644 index da9bb03..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/LOC.py +++ /dev/null @@ -1,327 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -from __future__ import division - -import struct - -import dns.exception -import dns.rdata -from dns._compat import long, xrange, round_py2_compat - - -_pows = tuple(long(10**i) for i in range(0, 11)) - -# default values are in centimeters -_default_size = 100.0 -_default_hprec = 1000000.0 -_default_vprec = 1000.0 - - -def _exponent_of(what, desc): - if what == 0: - return 0 - exp = None - for i in xrange(len(_pows)): - if what // _pows[i] == long(0): - exp = i - 1 - break - if exp is None or exp < 0: - raise dns.exception.SyntaxError("%s value out of bounds" % desc) - return exp - - -def _float_to_tuple(what): - if what < 0: - sign = -1 - what *= -1 - else: - sign = 1 - what = round_py2_compat(what * 3600000) - degrees = int(what // 3600000) - what -= degrees * 3600000 - minutes = int(what // 60000) - what -= minutes * 60000 - seconds = int(what // 1000) - what -= int(seconds * 1000) - what = int(what) - return (degrees, minutes, seconds, what, sign) - - -def _tuple_to_float(what): - value = float(what[0]) - value += float(what[1]) / 60.0 - value += float(what[2]) / 3600.0 - value += float(what[3]) / 3600000.0 - return float(what[4]) * value - - -def _encode_size(what, desc): - what = long(what) - exponent = _exponent_of(what, desc) & 0xF - base = what // pow(10, exponent) & 0xF - return base * 16 + exponent - - -def _decode_size(what, desc): - exponent = what & 0x0F - if exponent > 9: - raise dns.exception.SyntaxError("bad %s exponent" % desc) - base = (what & 0xF0) >> 4 - if base > 9: - raise dns.exception.SyntaxError("bad %s base" % desc) - return long(base) * pow(10, exponent) - - -class LOC(dns.rdata.Rdata): - - """LOC record - - @ivar latitude: latitude - @type latitude: (int, int, int, int, sign) tuple specifying the degrees, minutes, - seconds, milliseconds, and sign of the coordinate. - @ivar longitude: longitude - @type longitude: (int, int, int, int, sign) tuple specifying the degrees, - minutes, seconds, milliseconds, and sign of the coordinate. - @ivar altitude: altitude - @type altitude: float - @ivar size: size of the sphere - @type size: float - @ivar horizontal_precision: horizontal precision - @type horizontal_precision: float - @ivar vertical_precision: vertical precision - @type vertical_precision: float - @see: RFC 1876""" - - __slots__ = ['latitude', 'longitude', 'altitude', 'size', - 'horizontal_precision', 'vertical_precision'] - - def __init__(self, rdclass, rdtype, latitude, longitude, altitude, - size=_default_size, hprec=_default_hprec, - vprec=_default_vprec): - """Initialize a LOC record instance. - - The parameters I{latitude} and I{longitude} may be either a 4-tuple - of integers specifying (degrees, minutes, seconds, milliseconds), - or they may be floating point values specifying the number of - degrees. The other parameters are floats. Size, horizontal precision, - and vertical precision are specified in centimeters.""" - - super(LOC, self).__init__(rdclass, rdtype) - if isinstance(latitude, int) or isinstance(latitude, long): - latitude = float(latitude) - if isinstance(latitude, float): - latitude = _float_to_tuple(latitude) - self.latitude = latitude - if isinstance(longitude, int) or isinstance(longitude, long): - longitude = float(longitude) - if isinstance(longitude, float): - longitude = _float_to_tuple(longitude) - self.longitude = longitude - self.altitude = float(altitude) - self.size = float(size) - self.horizontal_precision = float(hprec) - self.vertical_precision = float(vprec) - - def to_text(self, origin=None, relativize=True, **kw): - if self.latitude[4] > 0: - lat_hemisphere = 'N' - else: - lat_hemisphere = 'S' - if self.longitude[4] > 0: - long_hemisphere = 'E' - else: - long_hemisphere = 'W' - text = "%d %d %d.%03d %s %d %d %d.%03d %s %0.2fm" % ( - self.latitude[0], self.latitude[1], - self.latitude[2], self.latitude[3], lat_hemisphere, - self.longitude[0], self.longitude[1], self.longitude[2], - self.longitude[3], long_hemisphere, - self.altitude / 100.0 - ) - - # do not print default values - if self.size != _default_size or \ - self.horizontal_precision != _default_hprec or \ - self.vertical_precision != _default_vprec: - text += " {:0.2f}m {:0.2f}m {:0.2f}m".format( - self.size / 100.0, self.horizontal_precision / 100.0, - self.vertical_precision / 100.0 - ) - return text - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - latitude = [0, 0, 0, 0, 1] - longitude = [0, 0, 0, 0, 1] - size = _default_size - hprec = _default_hprec - vprec = _default_vprec - - latitude[0] = tok.get_int() - t = tok.get_string() - if t.isdigit(): - latitude[1] = int(t) - t = tok.get_string() - if '.' in t: - (seconds, milliseconds) = t.split('.') - if not seconds.isdigit(): - raise dns.exception.SyntaxError( - 'bad latitude seconds value') - latitude[2] = int(seconds) - if latitude[2] >= 60: - raise dns.exception.SyntaxError('latitude seconds >= 60') - l = len(milliseconds) - if l == 0 or l > 3 or not milliseconds.isdigit(): - raise dns.exception.SyntaxError( - 'bad latitude milliseconds value') - if l == 1: - m = 100 - elif l == 2: - m = 10 - else: - m = 1 - latitude[3] = m * int(milliseconds) - t = tok.get_string() - elif t.isdigit(): - latitude[2] = int(t) - t = tok.get_string() - if t == 'S': - latitude[4] = -1 - elif t != 'N': - raise dns.exception.SyntaxError('bad latitude hemisphere value') - - longitude[0] = tok.get_int() - t = tok.get_string() - if t.isdigit(): - longitude[1] = int(t) - t = tok.get_string() - if '.' in t: - (seconds, milliseconds) = t.split('.') - if not seconds.isdigit(): - raise dns.exception.SyntaxError( - 'bad longitude seconds value') - longitude[2] = int(seconds) - if longitude[2] >= 60: - raise dns.exception.SyntaxError('longitude seconds >= 60') - l = len(milliseconds) - if l == 0 or l > 3 or not milliseconds.isdigit(): - raise dns.exception.SyntaxError( - 'bad longitude milliseconds value') - if l == 1: - m = 100 - elif l == 2: - m = 10 - else: - m = 1 - longitude[3] = m * int(milliseconds) - t = tok.get_string() - elif t.isdigit(): - longitude[2] = int(t) - t = tok.get_string() - if t == 'W': - longitude[4] = -1 - elif t != 'E': - raise dns.exception.SyntaxError('bad longitude hemisphere value') - - t = tok.get_string() - if t[-1] == 'm': - t = t[0: -1] - altitude = float(t) * 100.0 # m -> cm - - token = tok.get().unescape() - if not token.is_eol_or_eof(): - value = token.value - if value[-1] == 'm': - value = value[0: -1] - size = float(value) * 100.0 # m -> cm - token = tok.get().unescape() - if not token.is_eol_or_eof(): - value = token.value - if value[-1] == 'm': - value = value[0: -1] - hprec = float(value) * 100.0 # m -> cm - token = tok.get().unescape() - if not token.is_eol_or_eof(): - value = token.value - if value[-1] == 'm': - value = value[0: -1] - vprec = float(value) * 100.0 # m -> cm - tok.get_eol() - - return cls(rdclass, rdtype, latitude, longitude, altitude, - size, hprec, vprec) - - def to_wire(self, file, compress=None, origin=None): - milliseconds = (self.latitude[0] * 3600000 + - self.latitude[1] * 60000 + - self.latitude[2] * 1000 + - self.latitude[3]) * self.latitude[4] - latitude = long(0x80000000) + milliseconds - milliseconds = (self.longitude[0] * 3600000 + - self.longitude[1] * 60000 + - self.longitude[2] * 1000 + - self.longitude[3]) * self.longitude[4] - longitude = long(0x80000000) + milliseconds - altitude = long(self.altitude) + long(10000000) - size = _encode_size(self.size, "size") - hprec = _encode_size(self.horizontal_precision, "horizontal precision") - vprec = _encode_size(self.vertical_precision, "vertical precision") - wire = struct.pack("!BBBBIII", 0, size, hprec, vprec, latitude, - longitude, altitude) - file.write(wire) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - (version, size, hprec, vprec, latitude, longitude, altitude) = \ - struct.unpack("!BBBBIII", wire[current: current + rdlen]) - if latitude > long(0x80000000): - latitude = float(latitude - long(0x80000000)) / 3600000 - else: - latitude = -1 * float(long(0x80000000) - latitude) / 3600000 - if latitude < -90.0 or latitude > 90.0: - raise dns.exception.FormError("bad latitude") - if longitude > long(0x80000000): - longitude = float(longitude - long(0x80000000)) / 3600000 - else: - longitude = -1 * float(long(0x80000000) - longitude) / 3600000 - if longitude < -180.0 or longitude > 180.0: - raise dns.exception.FormError("bad longitude") - altitude = float(altitude) - 10000000.0 - size = _decode_size(size, "size") - hprec = _decode_size(hprec, "horizontal precision") - vprec = _decode_size(vprec, "vertical precision") - return cls(rdclass, rdtype, latitude, longitude, altitude, - size, hprec, vprec) - - def _get_float_latitude(self): - return _tuple_to_float(self.latitude) - - def _set_float_latitude(self, value): - self.latitude = _float_to_tuple(value) - - float_latitude = property(_get_float_latitude, _set_float_latitude, - doc="latitude as a floating point value") - - def _get_float_longitude(self): - return _tuple_to_float(self.longitude) - - def _set_float_longitude(self, value): - self.longitude = _float_to_tuple(value) - - float_longitude = property(_get_float_longitude, _set_float_longitude, - doc="longitude as a floating point value") diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/MX.py b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/MX.py deleted file mode 100644 index 0a06494..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/MX.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import dns.rdtypes.mxbase - - -class MX(dns.rdtypes.mxbase.MXBase): - - """MX record""" diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/NS.py b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/NS.py deleted file mode 100644 index f9fcf63..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/NS.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import dns.rdtypes.nsbase - - -class NS(dns.rdtypes.nsbase.NSBase): - - """NS record""" diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/NSEC.py b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/NSEC.py deleted file mode 100644 index 4e3da72..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/NSEC.py +++ /dev/null @@ -1,128 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2004-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import struct - -import dns.exception -import dns.rdata -import dns.rdatatype -import dns.name -from dns._compat import xrange - - -class NSEC(dns.rdata.Rdata): - - """NSEC record - - @ivar next: the next name - @type next: dns.name.Name object - @ivar windows: the windowed bitmap list - @type windows: list of (window number, string) tuples""" - - __slots__ = ['next', 'windows'] - - def __init__(self, rdclass, rdtype, next, windows): - super(NSEC, self).__init__(rdclass, rdtype) - self.next = next - self.windows = windows - - def to_text(self, origin=None, relativize=True, **kw): - next = self.next.choose_relativity(origin, relativize) - text = '' - for (window, bitmap) in self.windows: - bits = [] - for i in xrange(0, len(bitmap)): - byte = bitmap[i] - for j in xrange(0, 8): - if byte & (0x80 >> j): - bits.append(dns.rdatatype.to_text(window * 256 + - i * 8 + j)) - text += (' ' + ' '.join(bits)) - return '{}{}'.format(next, text) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - next = tok.get_name() - next = next.choose_relativity(origin, relativize) - rdtypes = [] - while 1: - token = tok.get().unescape() - if token.is_eol_or_eof(): - break - nrdtype = dns.rdatatype.from_text(token.value) - if nrdtype == 0: - raise dns.exception.SyntaxError("NSEC with bit 0") - if nrdtype > 65535: - raise dns.exception.SyntaxError("NSEC with bit > 65535") - rdtypes.append(nrdtype) - rdtypes.sort() - window = 0 - octets = 0 - prior_rdtype = 0 - bitmap = bytearray(b'\0' * 32) - windows = [] - for nrdtype in rdtypes: - if nrdtype == prior_rdtype: - continue - prior_rdtype = nrdtype - new_window = nrdtype // 256 - if new_window != window: - windows.append((window, bitmap[0:octets])) - bitmap = bytearray(b'\0' * 32) - window = new_window - offset = nrdtype % 256 - byte = offset // 8 - bit = offset % 8 - octets = byte + 1 - bitmap[byte] = bitmap[byte] | (0x80 >> bit) - - windows.append((window, bitmap[0:octets])) - return cls(rdclass, rdtype, next, windows) - - def to_wire(self, file, compress=None, origin=None): - self.next.to_wire(file, None, origin) - for (window, bitmap) in self.windows: - file.write(struct.pack('!BB', window, len(bitmap))) - file.write(bitmap) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - (next, cused) = dns.name.from_wire(wire[: current + rdlen], current) - current += cused - rdlen -= cused - windows = [] - while rdlen > 0: - if rdlen < 3: - raise dns.exception.FormError("NSEC too short") - window = wire[current] - octets = wire[current + 1] - if octets == 0 or octets > 32: - raise dns.exception.FormError("bad NSEC octets") - current += 2 - rdlen -= 2 - if rdlen < octets: - raise dns.exception.FormError("bad NSEC bitmap length") - bitmap = bytearray(wire[current: current + octets].unwrap()) - current += octets - rdlen -= octets - windows.append((window, bitmap)) - if origin is not None: - next = next.relativize(origin) - return cls(rdclass, rdtype, next, windows) - - def choose_relativity(self, origin=None, relativize=True): - self.next = self.next.choose_relativity(origin, relativize) diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/NSEC3.py b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/NSEC3.py deleted file mode 100644 index 1c281c4..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/NSEC3.py +++ /dev/null @@ -1,196 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2004-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import base64 -import binascii -import string -import struct - -import dns.exception -import dns.rdata -import dns.rdatatype -from dns._compat import xrange, text_type, PY3 - -# pylint: disable=deprecated-string-function -if PY3: - b32_hex_to_normal = bytes.maketrans(b'0123456789ABCDEFGHIJKLMNOPQRSTUV', - b'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567') - b32_normal_to_hex = bytes.maketrans(b'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567', - b'0123456789ABCDEFGHIJKLMNOPQRSTUV') -else: - b32_hex_to_normal = string.maketrans('0123456789ABCDEFGHIJKLMNOPQRSTUV', - 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567') - b32_normal_to_hex = string.maketrans('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567', - '0123456789ABCDEFGHIJKLMNOPQRSTUV') -# pylint: enable=deprecated-string-function - - -# hash algorithm constants -SHA1 = 1 - -# flag constants -OPTOUT = 1 - - -class NSEC3(dns.rdata.Rdata): - - """NSEC3 record - - @ivar algorithm: the hash algorithm number - @type algorithm: int - @ivar flags: the flags - @type flags: int - @ivar iterations: the number of iterations - @type iterations: int - @ivar salt: the salt - @type salt: string - @ivar next: the next name hash - @type next: string - @ivar windows: the windowed bitmap list - @type windows: list of (window number, string) tuples""" - - __slots__ = ['algorithm', 'flags', 'iterations', 'salt', 'next', 'windows'] - - def __init__(self, rdclass, rdtype, algorithm, flags, iterations, salt, - next, windows): - super(NSEC3, self).__init__(rdclass, rdtype) - self.algorithm = algorithm - self.flags = flags - self.iterations = iterations - if isinstance(salt, text_type): - self.salt = salt.encode() - else: - self.salt = salt - self.next = next - self.windows = windows - - def to_text(self, origin=None, relativize=True, **kw): - next = base64.b32encode(self.next).translate( - b32_normal_to_hex).lower().decode() - if self.salt == b'': - salt = '-' - else: - salt = binascii.hexlify(self.salt).decode() - text = u'' - for (window, bitmap) in self.windows: - bits = [] - for i in xrange(0, len(bitmap)): - byte = bitmap[i] - for j in xrange(0, 8): - if byte & (0x80 >> j): - bits.append(dns.rdatatype.to_text(window * 256 + - i * 8 + j)) - text += (u' ' + u' '.join(bits)) - return u'%u %u %u %s %s%s' % (self.algorithm, self.flags, - self.iterations, salt, next, text) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - algorithm = tok.get_uint8() - flags = tok.get_uint8() - iterations = tok.get_uint16() - salt = tok.get_string() - if salt == u'-': - salt = b'' - else: - salt = binascii.unhexlify(salt.encode('ascii')) - next = tok.get_string().encode( - 'ascii').upper().translate(b32_hex_to_normal) - next = base64.b32decode(next) - rdtypes = [] - while 1: - token = tok.get().unescape() - if token.is_eol_or_eof(): - break - nrdtype = dns.rdatatype.from_text(token.value) - if nrdtype == 0: - raise dns.exception.SyntaxError("NSEC3 with bit 0") - if nrdtype > 65535: - raise dns.exception.SyntaxError("NSEC3 with bit > 65535") - rdtypes.append(nrdtype) - rdtypes.sort() - window = 0 - octets = 0 - prior_rdtype = 0 - bitmap = bytearray(b'\0' * 32) - windows = [] - for nrdtype in rdtypes: - if nrdtype == prior_rdtype: - continue - prior_rdtype = nrdtype - new_window = nrdtype // 256 - if new_window != window: - if octets != 0: - windows.append((window, bitmap[0:octets])) - bitmap = bytearray(b'\0' * 32) - window = new_window - offset = nrdtype % 256 - byte = offset // 8 - bit = offset % 8 - octets = byte + 1 - bitmap[byte] = bitmap[byte] | (0x80 >> bit) - if octets != 0: - windows.append((window, bitmap[0:octets])) - return cls(rdclass, rdtype, algorithm, flags, iterations, salt, next, - windows) - - def to_wire(self, file, compress=None, origin=None): - l = len(self.salt) - file.write(struct.pack("!BBHB", self.algorithm, self.flags, - self.iterations, l)) - file.write(self.salt) - l = len(self.next) - file.write(struct.pack("!B", l)) - file.write(self.next) - for (window, bitmap) in self.windows: - file.write(struct.pack("!BB", window, len(bitmap))) - file.write(bitmap) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - (algorithm, flags, iterations, slen) = \ - struct.unpack('!BBHB', wire[current: current + 5]) - - current += 5 - rdlen -= 5 - salt = wire[current: current + slen].unwrap() - current += slen - rdlen -= slen - nlen = wire[current] - current += 1 - rdlen -= 1 - next = wire[current: current + nlen].unwrap() - current += nlen - rdlen -= nlen - windows = [] - while rdlen > 0: - if rdlen < 3: - raise dns.exception.FormError("NSEC3 too short") - window = wire[current] - octets = wire[current + 1] - if octets == 0 or octets > 32: - raise dns.exception.FormError("bad NSEC3 octets") - current += 2 - rdlen -= 2 - if rdlen < octets: - raise dns.exception.FormError("bad NSEC3 bitmap length") - bitmap = bytearray(wire[current: current + octets].unwrap()) - current += octets - rdlen -= octets - windows.append((window, bitmap)) - return cls(rdclass, rdtype, algorithm, flags, iterations, salt, next, - windows) diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/NSEC3PARAM.py b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/NSEC3PARAM.py deleted file mode 100644 index 87c36e5..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/NSEC3PARAM.py +++ /dev/null @@ -1,90 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2004-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import struct -import binascii - -import dns.exception -import dns.rdata -from dns._compat import text_type - - -class NSEC3PARAM(dns.rdata.Rdata): - - """NSEC3PARAM record - - @ivar algorithm: the hash algorithm number - @type algorithm: int - @ivar flags: the flags - @type flags: int - @ivar iterations: the number of iterations - @type iterations: int - @ivar salt: the salt - @type salt: string""" - - __slots__ = ['algorithm', 'flags', 'iterations', 'salt'] - - def __init__(self, rdclass, rdtype, algorithm, flags, iterations, salt): - super(NSEC3PARAM, self).__init__(rdclass, rdtype) - self.algorithm = algorithm - self.flags = flags - self.iterations = iterations - if isinstance(salt, text_type): - self.salt = salt.encode() - else: - self.salt = salt - - def to_text(self, origin=None, relativize=True, **kw): - if self.salt == b'': - salt = '-' - else: - salt = binascii.hexlify(self.salt).decode() - return '%u %u %u %s' % (self.algorithm, self.flags, self.iterations, - salt) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - algorithm = tok.get_uint8() - flags = tok.get_uint8() - iterations = tok.get_uint16() - salt = tok.get_string() - if salt == '-': - salt = '' - else: - salt = binascii.unhexlify(salt.encode()) - tok.get_eol() - return cls(rdclass, rdtype, algorithm, flags, iterations, salt) - - def to_wire(self, file, compress=None, origin=None): - l = len(self.salt) - file.write(struct.pack("!BBHB", self.algorithm, self.flags, - self.iterations, l)) - file.write(self.salt) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - (algorithm, flags, iterations, slen) = \ - struct.unpack('!BBHB', - wire[current: current + 5]) - current += 5 - rdlen -= 5 - salt = wire[current: current + slen].unwrap() - current += slen - rdlen -= slen - if rdlen != 0: - raise dns.exception.FormError - return cls(rdclass, rdtype, algorithm, flags, iterations, salt) diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/OPENPGPKEY.py b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/OPENPGPKEY.py deleted file mode 100644 index a066cf9..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/OPENPGPKEY.py +++ /dev/null @@ -1,60 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2016 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import base64 - -import dns.exception -import dns.rdata -import dns.tokenizer - -class OPENPGPKEY(dns.rdata.Rdata): - - """OPENPGPKEY record - - @ivar key: the key - @type key: bytes - @see: RFC 7929 - """ - - def __init__(self, rdclass, rdtype, key): - super(OPENPGPKEY, self).__init__(rdclass, rdtype) - self.key = key - - def to_text(self, origin=None, relativize=True, **kw): - return dns.rdata._base64ify(self.key) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - chunks = [] - while 1: - t = tok.get().unescape() - if t.is_eol_or_eof(): - break - if not t.is_identifier(): - raise dns.exception.SyntaxError - chunks.append(t.value.encode()) - b64 = b''.join(chunks) - key = base64.b64decode(b64) - return cls(rdclass, rdtype, key) - - def to_wire(self, file, compress=None, origin=None): - file.write(self.key) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - key = wire[current: current + rdlen].unwrap() - return cls(rdclass, rdtype, key) diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/PTR.py b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/PTR.py deleted file mode 100644 index 20cd507..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/PTR.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import dns.rdtypes.nsbase - - -class PTR(dns.rdtypes.nsbase.NSBase): - - """PTR record""" diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/RP.py b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/RP.py deleted file mode 100644 index 8f07be9..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/RP.py +++ /dev/null @@ -1,82 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import dns.exception -import dns.rdata -import dns.name - - -class RP(dns.rdata.Rdata): - - """RP record - - @ivar mbox: The responsible person's mailbox - @type mbox: dns.name.Name object - @ivar txt: The owner name of a node with TXT records, or the root name - if no TXT records are associated with this RP. - @type txt: dns.name.Name object - @see: RFC 1183""" - - __slots__ = ['mbox', 'txt'] - - def __init__(self, rdclass, rdtype, mbox, txt): - super(RP, self).__init__(rdclass, rdtype) - self.mbox = mbox - self.txt = txt - - def to_text(self, origin=None, relativize=True, **kw): - mbox = self.mbox.choose_relativity(origin, relativize) - txt = self.txt.choose_relativity(origin, relativize) - return "{} {}".format(str(mbox), str(txt)) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - mbox = tok.get_name() - txt = tok.get_name() - mbox = mbox.choose_relativity(origin, relativize) - txt = txt.choose_relativity(origin, relativize) - tok.get_eol() - return cls(rdclass, rdtype, mbox, txt) - - def to_wire(self, file, compress=None, origin=None): - self.mbox.to_wire(file, None, origin) - self.txt.to_wire(file, None, origin) - - def to_digestable(self, origin=None): - return self.mbox.to_digestable(origin) + \ - self.txt.to_digestable(origin) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - (mbox, cused) = dns.name.from_wire(wire[: current + rdlen], - current) - current += cused - rdlen -= cused - if rdlen <= 0: - raise dns.exception.FormError - (txt, cused) = dns.name.from_wire(wire[: current + rdlen], - current) - if cused != rdlen: - raise dns.exception.FormError - if origin is not None: - mbox = mbox.relativize(origin) - txt = txt.relativize(origin) - return cls(rdclass, rdtype, mbox, txt) - - def choose_relativity(self, origin=None, relativize=True): - self.mbox = self.mbox.choose_relativity(origin, relativize) - self.txt = self.txt.choose_relativity(origin, relativize) diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/RRSIG.py b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/RRSIG.py deleted file mode 100644 index d3756ec..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/RRSIG.py +++ /dev/null @@ -1,158 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2004-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import base64 -import calendar -import struct -import time - -import dns.dnssec -import dns.exception -import dns.rdata -import dns.rdatatype - - -class BadSigTime(dns.exception.DNSException): - - """Time in DNS SIG or RRSIG resource record cannot be parsed.""" - - -def sigtime_to_posixtime(what): - if len(what) != 14: - raise BadSigTime - year = int(what[0:4]) - month = int(what[4:6]) - day = int(what[6:8]) - hour = int(what[8:10]) - minute = int(what[10:12]) - second = int(what[12:14]) - return calendar.timegm((year, month, day, hour, minute, second, - 0, 0, 0)) - - -def posixtime_to_sigtime(what): - return time.strftime('%Y%m%d%H%M%S', time.gmtime(what)) - - -class RRSIG(dns.rdata.Rdata): - - """RRSIG record - - @ivar type_covered: the rdata type this signature covers - @type type_covered: int - @ivar algorithm: the algorithm used for the sig - @type algorithm: int - @ivar labels: number of labels - @type labels: int - @ivar original_ttl: the original TTL - @type original_ttl: long - @ivar expiration: signature expiration time - @type expiration: long - @ivar inception: signature inception time - @type inception: long - @ivar key_tag: the key tag - @type key_tag: int - @ivar signer: the signer - @type signer: dns.name.Name object - @ivar signature: the signature - @type signature: string""" - - __slots__ = ['type_covered', 'algorithm', 'labels', 'original_ttl', - 'expiration', 'inception', 'key_tag', 'signer', - 'signature'] - - def __init__(self, rdclass, rdtype, type_covered, algorithm, labels, - original_ttl, expiration, inception, key_tag, signer, - signature): - super(RRSIG, self).__init__(rdclass, rdtype) - self.type_covered = type_covered - self.algorithm = algorithm - self.labels = labels - self.original_ttl = original_ttl - self.expiration = expiration - self.inception = inception - self.key_tag = key_tag - self.signer = signer - self.signature = signature - - def covers(self): - return self.type_covered - - def to_text(self, origin=None, relativize=True, **kw): - return '%s %d %d %d %s %s %d %s %s' % ( - dns.rdatatype.to_text(self.type_covered), - self.algorithm, - self.labels, - self.original_ttl, - posixtime_to_sigtime(self.expiration), - posixtime_to_sigtime(self.inception), - self.key_tag, - self.signer.choose_relativity(origin, relativize), - dns.rdata._base64ify(self.signature) - ) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - type_covered = dns.rdatatype.from_text(tok.get_string()) - algorithm = dns.dnssec.algorithm_from_text(tok.get_string()) - labels = tok.get_int() - original_ttl = tok.get_ttl() - expiration = sigtime_to_posixtime(tok.get_string()) - inception = sigtime_to_posixtime(tok.get_string()) - key_tag = tok.get_int() - signer = tok.get_name() - signer = signer.choose_relativity(origin, relativize) - chunks = [] - while 1: - t = tok.get().unescape() - if t.is_eol_or_eof(): - break - if not t.is_identifier(): - raise dns.exception.SyntaxError - chunks.append(t.value.encode()) - b64 = b''.join(chunks) - signature = base64.b64decode(b64) - return cls(rdclass, rdtype, type_covered, algorithm, labels, - original_ttl, expiration, inception, key_tag, signer, - signature) - - def to_wire(self, file, compress=None, origin=None): - header = struct.pack('!HBBIIIH', self.type_covered, - self.algorithm, self.labels, - self.original_ttl, self.expiration, - self.inception, self.key_tag) - file.write(header) - self.signer.to_wire(file, None, origin) - file.write(self.signature) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - header = struct.unpack('!HBBIIIH', wire[current: current + 18]) - current += 18 - rdlen -= 18 - (signer, cused) = dns.name.from_wire(wire[: current + rdlen], current) - current += cused - rdlen -= cused - if origin is not None: - signer = signer.relativize(origin) - signature = wire[current: current + rdlen].unwrap() - return cls(rdclass, rdtype, header[0], header[1], header[2], - header[3], header[4], header[5], header[6], signer, - signature) - - def choose_relativity(self, origin=None, relativize=True): - self.signer = self.signer.choose_relativity(origin, relativize) diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/RT.py b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/RT.py deleted file mode 100644 index d0feb79..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/RT.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import dns.rdtypes.mxbase - - -class RT(dns.rdtypes.mxbase.UncompressedDowncasingMX): - - """RT record""" diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/SOA.py b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/SOA.py deleted file mode 100644 index aec81ca..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/SOA.py +++ /dev/null @@ -1,116 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import struct - -import dns.exception -import dns.rdata -import dns.name - - -class SOA(dns.rdata.Rdata): - - """SOA record - - @ivar mname: the SOA MNAME (master name) field - @type mname: dns.name.Name object - @ivar rname: the SOA RNAME (responsible name) field - @type rname: dns.name.Name object - @ivar serial: The zone's serial number - @type serial: int - @ivar refresh: The zone's refresh value (in seconds) - @type refresh: int - @ivar retry: The zone's retry value (in seconds) - @type retry: int - @ivar expire: The zone's expiration value (in seconds) - @type expire: int - @ivar minimum: The zone's negative caching time (in seconds, called - "minimum" for historical reasons) - @type minimum: int - @see: RFC 1035""" - - __slots__ = ['mname', 'rname', 'serial', 'refresh', 'retry', 'expire', - 'minimum'] - - def __init__(self, rdclass, rdtype, mname, rname, serial, refresh, retry, - expire, minimum): - super(SOA, self).__init__(rdclass, rdtype) - self.mname = mname - self.rname = rname - self.serial = serial - self.refresh = refresh - self.retry = retry - self.expire = expire - self.minimum = minimum - - def to_text(self, origin=None, relativize=True, **kw): - mname = self.mname.choose_relativity(origin, relativize) - rname = self.rname.choose_relativity(origin, relativize) - return '%s %s %d %d %d %d %d' % ( - mname, rname, self.serial, self.refresh, self.retry, - self.expire, self.minimum) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - mname = tok.get_name() - rname = tok.get_name() - mname = mname.choose_relativity(origin, relativize) - rname = rname.choose_relativity(origin, relativize) - serial = tok.get_uint32() - refresh = tok.get_ttl() - retry = tok.get_ttl() - expire = tok.get_ttl() - minimum = tok.get_ttl() - tok.get_eol() - return cls(rdclass, rdtype, mname, rname, serial, refresh, retry, - expire, minimum) - - def to_wire(self, file, compress=None, origin=None): - self.mname.to_wire(file, compress, origin) - self.rname.to_wire(file, compress, origin) - five_ints = struct.pack('!IIIII', self.serial, self.refresh, - self.retry, self.expire, self.minimum) - file.write(five_ints) - - def to_digestable(self, origin=None): - return self.mname.to_digestable(origin) + \ - self.rname.to_digestable(origin) + \ - struct.pack('!IIIII', self.serial, self.refresh, - self.retry, self.expire, self.minimum) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - (mname, cused) = dns.name.from_wire(wire[: current + rdlen], current) - current += cused - rdlen -= cused - (rname, cused) = dns.name.from_wire(wire[: current + rdlen], current) - current += cused - rdlen -= cused - if rdlen != 20: - raise dns.exception.FormError - five_ints = struct.unpack('!IIIII', - wire[current: current + rdlen]) - if origin is not None: - mname = mname.relativize(origin) - rname = rname.relativize(origin) - return cls(rdclass, rdtype, mname, rname, - five_ints[0], five_ints[1], five_ints[2], five_ints[3], - five_ints[4]) - - def choose_relativity(self, origin=None, relativize=True): - self.mname = self.mname.choose_relativity(origin, relativize) - self.rname = self.rname.choose_relativity(origin, relativize) diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/SPF.py b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/SPF.py deleted file mode 100644 index 41dee62..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/SPF.py +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2006, 2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import dns.rdtypes.txtbase - - -class SPF(dns.rdtypes.txtbase.TXTBase): - - """SPF record - - @see: RFC 4408""" diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/SSHFP.py b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/SSHFP.py deleted file mode 100644 index c18311e..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/SSHFP.py +++ /dev/null @@ -1,79 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2005-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import struct -import binascii - -import dns.rdata -import dns.rdatatype - - -class SSHFP(dns.rdata.Rdata): - - """SSHFP record - - @ivar algorithm: the algorithm - @type algorithm: int - @ivar fp_type: the digest type - @type fp_type: int - @ivar fingerprint: the fingerprint - @type fingerprint: string - @see: draft-ietf-secsh-dns-05.txt""" - - __slots__ = ['algorithm', 'fp_type', 'fingerprint'] - - def __init__(self, rdclass, rdtype, algorithm, fp_type, - fingerprint): - super(SSHFP, self).__init__(rdclass, rdtype) - self.algorithm = algorithm - self.fp_type = fp_type - self.fingerprint = fingerprint - - def to_text(self, origin=None, relativize=True, **kw): - return '%d %d %s' % (self.algorithm, - self.fp_type, - dns.rdata._hexify(self.fingerprint, - chunksize=128)) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - algorithm = tok.get_uint8() - fp_type = tok.get_uint8() - chunks = [] - while 1: - t = tok.get().unescape() - if t.is_eol_or_eof(): - break - if not t.is_identifier(): - raise dns.exception.SyntaxError - chunks.append(t.value.encode()) - fingerprint = b''.join(chunks) - fingerprint = binascii.unhexlify(fingerprint) - return cls(rdclass, rdtype, algorithm, fp_type, fingerprint) - - def to_wire(self, file, compress=None, origin=None): - header = struct.pack("!BB", self.algorithm, self.fp_type) - file.write(header) - file.write(self.fingerprint) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - header = struct.unpack("!BB", wire[current: current + 2]) - current += 2 - rdlen -= 2 - fingerprint = wire[current: current + rdlen].unwrap() - return cls(rdclass, rdtype, header[0], header[1], fingerprint) diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/TLSA.py b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/TLSA.py deleted file mode 100644 index a135c2b..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/TLSA.py +++ /dev/null @@ -1,84 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2005-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import struct -import binascii - -import dns.rdata -import dns.rdatatype - - -class TLSA(dns.rdata.Rdata): - - """TLSA record - - @ivar usage: The certificate usage - @type usage: int - @ivar selector: The selector field - @type selector: int - @ivar mtype: The 'matching type' field - @type mtype: int - @ivar cert: The 'Certificate Association Data' field - @type cert: string - @see: RFC 6698""" - - __slots__ = ['usage', 'selector', 'mtype', 'cert'] - - def __init__(self, rdclass, rdtype, usage, selector, - mtype, cert): - super(TLSA, self).__init__(rdclass, rdtype) - self.usage = usage - self.selector = selector - self.mtype = mtype - self.cert = cert - - def to_text(self, origin=None, relativize=True, **kw): - return '%d %d %d %s' % (self.usage, - self.selector, - self.mtype, - dns.rdata._hexify(self.cert, - chunksize=128)) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - usage = tok.get_uint8() - selector = tok.get_uint8() - mtype = tok.get_uint8() - cert_chunks = [] - while 1: - t = tok.get().unescape() - if t.is_eol_or_eof(): - break - if not t.is_identifier(): - raise dns.exception.SyntaxError - cert_chunks.append(t.value.encode()) - cert = b''.join(cert_chunks) - cert = binascii.unhexlify(cert) - return cls(rdclass, rdtype, usage, selector, mtype, cert) - - def to_wire(self, file, compress=None, origin=None): - header = struct.pack("!BBB", self.usage, self.selector, self.mtype) - file.write(header) - file.write(self.cert) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - header = struct.unpack("!BBB", wire[current: current + 3]) - current += 3 - rdlen -= 3 - cert = wire[current: current + rdlen].unwrap() - return cls(rdclass, rdtype, header[0], header[1], header[2], cert) diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/TXT.py b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/TXT.py deleted file mode 100644 index c5ae919..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/TXT.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import dns.rdtypes.txtbase - - -class TXT(dns.rdtypes.txtbase.TXTBase): - - """TXT record""" diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/URI.py b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/URI.py deleted file mode 100644 index f5b65ed..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/URI.py +++ /dev/null @@ -1,82 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# Copyright (C) 2015 Red Hat, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import struct - -import dns.exception -import dns.rdata -import dns.name -from dns._compat import text_type - - -class URI(dns.rdata.Rdata): - - """URI record - - @ivar priority: the priority - @type priority: int - @ivar weight: the weight - @type weight: int - @ivar target: the target host - @type target: dns.name.Name object - @see: draft-faltstrom-uri-13""" - - __slots__ = ['priority', 'weight', 'target'] - - def __init__(self, rdclass, rdtype, priority, weight, target): - super(URI, self).__init__(rdclass, rdtype) - self.priority = priority - self.weight = weight - if len(target) < 1: - raise dns.exception.SyntaxError("URI target cannot be empty") - if isinstance(target, text_type): - self.target = target.encode() - else: - self.target = target - - def to_text(self, origin=None, relativize=True, **kw): - return '%d %d "%s"' % (self.priority, self.weight, - self.target.decode()) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - priority = tok.get_uint16() - weight = tok.get_uint16() - target = tok.get().unescape() - if not (target.is_quoted_string() or target.is_identifier()): - raise dns.exception.SyntaxError("URI target must be a string") - tok.get_eol() - return cls(rdclass, rdtype, priority, weight, target.value) - - def to_wire(self, file, compress=None, origin=None): - two_ints = struct.pack("!HH", self.priority, self.weight) - file.write(two_ints) - file.write(self.target) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - if rdlen < 5: - raise dns.exception.FormError('URI RR is shorter than 5 octets') - - (priority, weight) = struct.unpack('!HH', wire[current: current + 4]) - current += 4 - rdlen -= 4 - target = wire[current: current + rdlen] - current += rdlen - - return cls(rdclass, rdtype, priority, weight, target) diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/X25.py b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/X25.py deleted file mode 100644 index e530a2c..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/X25.py +++ /dev/null @@ -1,66 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import struct - -import dns.exception -import dns.rdata -import dns.tokenizer -from dns._compat import text_type - - -class X25(dns.rdata.Rdata): - - """X25 record - - @ivar address: the PSDN address - @type address: string - @see: RFC 1183""" - - __slots__ = ['address'] - - def __init__(self, rdclass, rdtype, address): - super(X25, self).__init__(rdclass, rdtype) - if isinstance(address, text_type): - self.address = address.encode() - else: - self.address = address - - def to_text(self, origin=None, relativize=True, **kw): - return '"%s"' % dns.rdata._escapify(self.address) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - address = tok.get_string() - tok.get_eol() - return cls(rdclass, rdtype, address) - - def to_wire(self, file, compress=None, origin=None): - l = len(self.address) - assert l < 256 - file.write(struct.pack('!B', l)) - file.write(self.address) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - l = wire[current] - current += 1 - rdlen -= 1 - if l != rdlen: - raise dns.exception.FormError - address = wire[current: current + l].unwrap() - return cls(rdclass, rdtype, address) diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__init__.py b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__init__.py deleted file mode 100644 index ca41ef8..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__init__.py +++ /dev/null @@ -1,57 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""Class ANY (generic) rdata type classes.""" - -__all__ = [ - 'AFSDB', - 'AVC', - 'CAA', - 'CDNSKEY', - 'CDS', - 'CERT', - 'CNAME', - 'CSYNC', - 'DLV', - 'DNAME', - 'DNSKEY', - 'DS', - 'EUI48', - 'EUI64', - 'GPOS', - 'HINFO', - 'HIP', - 'ISDN', - 'LOC', - 'MX', - 'NS', - 'NSEC', - 'NSEC3', - 'NSEC3PARAM', - 'OPENPGPKEY', - 'PTR', - 'RP', - 'RRSIG', - 'RT', - 'SOA', - 'SPF', - 'SSHFP', - 'TLSA', - 'TXT', - 'URI', - 'X25', -] diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/AFSDB.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/AFSDB.cpython-37.pyc deleted file mode 100644 index 18b504bf09d24db045135ea4d4715f7ac3577b04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1124 zcma)5&uiN-6qbL*ijxc$DD-G{3#>6?JB2dRE^MdeQU;r02**koj&MsDD|2P7>{}~zxN$}X_Fq^>rZHmOEEtTz^aMb_eojJ@8=x zDPM19`BsXNpD#o`@h_ufBle4stoM^*$R7}J4Kcv6XTp+p)BnAut+=f8<^VAa3lAYaQsF6GfO z)p?X8N3XXRTFTA00OHAQzQ|G>1&X5<9h^+R1m$fE<+kX|Mb4@_7+_=*fEd@$_bVD~ zTrxmnk5(p%1+g=Bgu$Cv$trxtfvK<}3b#7D%ykc_t?20cxG%x+AZ~+w+67T@6)&Q6 z4%br#ei*NdO6r$*)d<+X7h2O#SBmOurL^AuC^U+x$v2NfH|Z%-l7?&}g#f&NVhD5ai3My45h03>zqOXI{L+B!4sWbrJK;a`Efazxd)U|um zqLybOmfWBf_OWEE!WpiwW|0=~8&e&+l{0Kr-osC6oUNfuwHADmeNW>^FVp$Q&*f2# U&}AlN4bbDgy0?8y0<)pkf0BF$Bme*a diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/AVC.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/AVC.cpython-37.pyc deleted file mode 100644 index 772e419131a7457a3005d88288afeed72aaa9b25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 475 zcmYLFyH3L}6m{Z2qKHZegv3~}bx1t0RS18yD)(pe0F{QGy-TVkyeU_VH>Qc zh3K}go+rl0E+LD>BFfcMg(!_Cyws6oiWR~Lr3tJd>>-WPs*pLPcw_`H zX2i>&<23=LCA3o7gp?K)pXZkEP&%8ld|mM=O`h&o)?>^^WKvjRSUt_1Oim zcffv?U1XPxJ^Vl%5_jR-A8C7cdwc#Di0Ixf7b+j+S*r4?jJBuhbtQ5&JJIIGK8OU* zD#5}qg7zeTn~G>uqlwUDiP}~h zO>S)uf7*f(vf`)0kDSiaB~`M%IMCfyfg63b+ip9(ym~sO5;w#WtP_YXm$n-N8p*X z2c+7|OC1Vc0HfaKbFQuZccKT2t>~khuc}1x_v$`OqSy-U^%5MBa%ILl$K3C4zU3kn|(qC!gFZ?BuPgXYD*iQEa4M9RQ zUgI~xp^FJSJpLEHG4BDbB2`sUQI&i1>p070R8}fVi~4n1PA6RC*&v8Jdt4<`$bm<3 zh-yn%?eQ|J7}s{eOK|}r>JERO@fy=lcc0HnmA-!}L?yJJ%d~)agO0YdLJGXEz`6v~ zuJ*+xoL)xpe*&Jzv@;Ub#Gv{GI7{3{tN>8OUpvnGi0|4jLxx~OKCcme36q8{fF}zm zO289)2}n|+AXUchAw6&!hgthXex^LY_tevA{m_D*xM!vNsGIb%hjZ)p&M~2oK!JAO zK?&m81IVVC(oUUb`|T~S!66L0^o4CHv2<0XL95L@w`H3%$_uW8teVtmFDlyx&{2WL~qbD z{6G(=1us^8h=s9-#js2#JV|tzB$J9w3)Fi_@@5JYZdd#yVO0iZD0{M~l!VfWP>L%c zbk|hE35PPr#4R*$q8Q*>e^ndCAF9@ab=H|Ij5}y+3z=Dl6yqh7DIqRGz}S6;HO@piJwU6O$`yRmUi&-z Nys5(hBpLkd{{UtL_#FTM diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/CDNSKEY.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/CDNSKEY.cpython-37.pyc deleted file mode 100644 index 3c2c0b3bc0870691cd0edb7c25414d3350cd7236..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 507 zcmYjOJx{|h5OwUfNh^x@kPvLF9oh_R2vwzk7?8rysg}?w)NW~;ug0!KSQy}+F!7hN zGVvFfI43FPBwyay_j2#q!*;txFkU~7AMR^}e3@bsSd#%Rb&g38VFiR+_@w~}DW@Uh z%p!t`+KlqrEfICmcqgJEtwnv&SlDljJHi@~j{S{%;&o`gKMnku0v&^v&l;4}`C+*= zP2=!yGo{#{GE5W0+=PW-fJ^ORl7$vdg~gemIECf*)wMUeyBWXiR^T+1lQ{j!8NtT*RJTan;Cx;ewr^%0y(yJ&v#7mhy`bwggNNw%s qC<#XbaJ%Z|t$)p}((e$7#ecW5OJtrlcP>i1{R5+-VN_Uq%wfNBE`L-2 diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/CDS.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/CDS.cpython-37.pyc deleted file mode 100644 index a9d0eb6160c03a329dddbeb4e971efcc2e7462b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 384 zcmYLEyGq1R5WSC>gy4cK2$o`(Vw1v7MAmh|E=?*g$R%b1Zp`CuZc@a?LjT0dKk!@9 zTKNlB&dp|ZU=C+y&b(H$nMcrG-cRm7IU!#r*qeo9iLTEOfB-Fsptl4V@HYZHqdCiY zZoP7G05m4P^^H0br3Uv#ku1^m5kiLjKm-FSI56zs1HW0v&mO{QlcjY7k#7yIlvPq@ zQVyP!Wer_n_@R{BE-9vpBPGm4`XSL7-d<_pOi5u+S$iF? XusSyW-?U>c&K%s!-7i=3zcu_9c*|TA diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/CERT.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/CERT.cpython-37.pyc deleted file mode 100644 index df2aa21b89f41b0d8810ab09de374ec5883ff44a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3075 zcmbtWTW=h<6(;9Cv%9h^DNfR&?dIa5iy&5$sIIFPsT(Iwj1-C^yGS!|F&GcI((I0A z)+E=uU={@|75Ni=*hPT?{SW;meC?B;`xYQc&*7|AE2GFuIGDpj@{q%G_??gQL8lWD zD1ZIOD}VX-6+-@ljq~DxavNTG1cDJp3lcXqjj3r{v2AK+Uc2+!gW6&?bC}CK=KtM| zeHO5gMXbfztOMv_SM+f#w3u zg@eLHfi7pb7#1|Z@jLL!pMp?iN^3Hs6Iz4+!%$qSVTa19$tmuX?(}TEl4R<5#FNLz zNtqsSZSQfV?YvYyOFM`AsnYc6zlgXB%YFUZO?5EZ9Oa|8^HQp`DBgbW_=y~i#=}ik z%F(gfuS(Q51;aJv<{x&x+`RMA?!z0SW4${6P+wFBiQ-4QJ!``VaHw z%7r&i(_+j;2bR>fRHA1IzzY$pDA1cmtl{{13{+({_Ac~Y-q3cSJOM275eQBY zUa`gK1&sEb*!ha|DZ=S2h+O~+fa#3J9{1Tgg6fQ(Qh?Ql0Tzuz=zqz83;Uz5h(qEQ z9MU!IUZ?fhvfx)~QL@8?;nc!F`?Uhe5)Ph*VQ^3dEE&U$IF zAwN!3y0_g0r3=c^)Wy){8ELUsiCpa;Y!uwaeniYX*-fKWt1 z`kY!*tEROzvnZ+Unk07ZfOKjXq+5F+Jw}>z^0h0+BQC_tFkJ^pl9#zk67dQ&#j7ZO zgyP2_dcJlfFZ$XSEGtqewbx|L|23vMOcG-Ts~PknaK%qR+=EvdQnc2nXP%ReNxJjT z?>x-VCoD)B=;x>K%3p#|q$UGE+{9rN{Tf)x9yn9*ZQ#u)=>9YSJ)F_La}B+;c1~K? zW%oMkqLjTzU~*h+TH8PX+5;hZ7GGV&Jeen#iGX$mOH~?2$>UV=n_GGRxCx3Ykhio4 zfZEGT9SL5fDu0@vaBU3_o3Ff(y#9RQ&(Wm|I%(6Bwu!=gI76z$f{cJ6Ff92`P#^^M zl+J(?Cmv|lj74vE}?+8R3IHjH~ypV>3|jP8+1c(e^OgBh8IFgvQF zX*46^(R~71Yer;&_5=SJt;1=%js~6S$_#j!k|%e+Ak3LwsUg6VmRg-&ty`eAYl4si zaQSsmw@*C?yt^aJt??af`DE>J$}Y0aYHZHc!?y$ zh4#|Xh?h*ehJm%m%dBEtJA(>N)N2l0hmUV=F<>&rdmU|Og%m%-t#v_YTUA4G9h*N# zaXERkm+g#3zxot6(o91tTtRStMIhpsmaKRMuJOe;-Wp!`}xs}ZeuDO=7JAlv-4C~0SCdg zMJnL%g7Mm5w@8Ho8o+N(4NUMd`J44BnG#F|Z2y{odoH85$i#)(8WORk=)fA-&!_^n zV0P`#tVi}Fn1ld-vr6qQtij6CO`{hY*K% zD{;`k@Hfy#3k+SaEw*s>0yeROzG*)j3jtV+fno|?HaL18EidEfdvJs6Jb@V!IhI%( z1|^7;HNXn+$`Ve{6e#iG{N2HSsx}fo{!1l^j*{e{V&ek!c9J|9r^S54PZCyT&<(^c zi%Ll#cBFIh3lMNY;gxW};g5=mTiE@36d&SPXMPi8yeQ6Z1LVXW6|bR@xf$>R!f+WM zg0^F|t#%N3fctfn=7Q?22s9D+zXLz7rM$67e-r;W!oE3^hp0EKZA>9Yc?rBM#0IW` zP%_lhTnBIBlI|{&y!q4;QVo6M9(C}$CN}S5OX3s=vW0<$$F?9n@d=y@E${>Xf0n1= A&j0`b diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/CNAME.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/CNAME.cpython-37.pyc deleted file mode 100644 index dca3fe78ecf63ea68bca893ee7a4429c4504b0dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 595 zcmYLGv2NQi5Tzu?HjD-+0tCo-=w_g{hHgPnBu;}ML$ze8fP$b!I+8S7mE-^(-yPpO@{Wt$-3cSR|9$ZDX~5XOHh49P*)c8rL{2gpXqE=& zOolRgWHM60I$THV!9$ep$l#Jq2hYS~N!I#T3kV$3!jI$>=_N};8KjX6NfB*!PLq@G zXTSb-8#t9&CnpmiORQIiAhgeIeU-zOP$1aVs>lkVbpryhFjrc6Yrr>^`V7)w)sVuF zP}@7~Dj92L@5KHlDZD`C5tb?wH7dY5%c0BU;#N^w8OUr|TBDn;43Q)(8(3T<-#{1% z*5}HB5v4-qZk0n=SqIt*q6sZbMvt2()4^uUdCTH_GvU0nveqsB!1+xrbbm79T-uED zKg^A2RGoV{ihWtdRZ-0fgPvNNeQ9p6s_N_bt}lAM#ALeMvt+Kg_=Nq0mb{Kwi?By%S{{0dmC7?#|B4E@x+cv-dll zfWY_Xe{O$vv`)x>adPolFxZ7w{Q(FgjOHY&dm0&fZZ^Hu^tSGe+!?u%OUZ8uGnw^_ zFe^2N-q1fYqkz#zq-&ppMbhh1xi(EBcBksp?W@J7vPPIxn{ z1kZ~7ZYU<>Jgt;d{~=}Tot4|@_Z{tTLa;~go6xEoKm-v~k~3p&NGgqmL5VaaiA`w% zwWJNyW(0gmdtFD_)nuGEFpC=U@iZlE(FUwKo z$FY`(n6cX5rGn*Zi3kUq0y@E+t8-<9s%6xPt5 zJJM$M29X{!H^>%|!4_H21*PO@_c1xT@t8=9In0^6(p}Ik@+&g4j@pk2bKxu=G+$Z+ za}%$?>nXx1ob??4VnWu$vlJPh#m@>h4%I7Q* z3EqZsMH!29DwH)Wv*Pk{x-IUbvQzSGKPyzg(>xK`lk7BA#^JHDw31UtmU8O2RTlJ> zq8SWMM5^eJcfd$ZR&cZprY8BElY`Z~dXSpm0L~PlpEY0oR`g z%vjLRDe%lgi|;i&OY^*WO9uLuHsOZ6d3yn#h8Sr&)9Cv$kB3>(>bL<<ReCCJqpI!Z)&Sza`{!^CkAX;oEoa+`dzV;P~(RI20Gc*MOX3i1I5yx+_tzpNe<_ z0C@Y&%keMYRwnS3H!0GppN!L}lT~qA=5fiP8*q#fz6C`21742mIJKW7`6N|-I_;-p zk(GsNJvu2wGW`wbCFif8xK)*0C?8`m;XFC%ZYZ;#R~%EFW6mp6l!yFPoc;jG61yUR zE6j^Z*&vY?ky|vd^&?bs%DzZN6}87agF`k;KSmP>dQniM$MHo@l!HN)3jR}6G{L_w z=K=!NJJ70!K#1W%7Fg7PJn(?70L4*Tk1SZR^m?FIaqK~^pazccw{1Y~tk$`+bXWhP z$l~!Zp>_6r3aJ5mjWx*fRC)b! zH0Ehl)z^b==i0$9B8djBX2sCiN4JfkxJbvJMA29fI$}Xn;m@I0Sa#mZ2qT_0VMjI3cEg?Y}KcmI|~8` z)P@tcYF*jVx<24tAlo&%96bbdsByrRp7b>iw0h?l7EREEqAbJe05V74VqIdeQ1aJ+ zoQEj6wwJK5hKD*6&auLrZe6nLLJ&g9*%t?0ug>8v2u1$Gl8@>neGBHwnG`xAZZ?x+ zo{V++b~_wP#AUWd7G9)s`xDO7LPR!aV84zJjPJ`=2iM{92J*fuW@;EgWBVXd;m(+M zZTdr$+XROeM2VhTs=FJ>27=^DLHng);DUbl_Up&}Wjajb$k9+hm8gy4cK2$o`(Vw1v7MAl`&M$#+@UXV-7TySF^cXN{>HWvCPTUq!+ zX|4PPD<|2k4$R@q%$e6>GVuu7>-OZ~lN0jQ2Ya)S%+bvm0uZ1X5%h)t1O85cE1I&D zr`8)62S8WEx4uzFqNK;YQ6zJ8bA+IhxJJ4;#aLRFiXir==#J(-2C=W(?0Om0^3U4oraK@yt$E>|v YEwDN?{@=7?F3#-S%iS+m)4w(R7lsvFEdT%j diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/DNAME.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/DNAME.cpython-37.pyc deleted file mode 100644 index 9c823ecf3b7c0240d0679dd9fa02b883a243729c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 552 zcmY*VJx{|h5VeyujjEQR2nm=FTZc9SYlT`q#6%XvKqO?PIa5;7#I@6*RV4=aAs{CH zQdTDZ0uy(kmC8x?e7>*ubZ4zrgP}ct?B5?bjD68(WB6wSbaRXV40y^ye#O87`;~z$ z`NW#o6X(SaYrt<<$N9!S7Q}=bvoRQ;n?nSN^T0w2cxXcnY;azA=zxW@ZdtnshS!(N zX7wCt8Rr^;*upU~dTG}=x@jV;*o3|D6@MpY9(1hIEh0UZMcFEH0m)dJA{wO<3yzWL zL+R!^87J8%({&vG>HEc0`6^M}B*V@$?Vc=VMydIe51CPm;xW%C@--9-C5=A}?)*wy zPc1Z^=76MB`uKA9ukxQ6RnOw#s3sJ4DwUp%dx6V#|_&kvA34k%giV;5^tNCu)a=)?mD}3o5lH5X=#jv;HFxzMMFo? R#8rCzKbfa(A|z(d{sq)tf>r)XA@5P6p`e6oVkbhzK`ur4flKr!nKq zAc6^VM!9)IL`zt2L|D>Tv=-LFer4Pd#)x?K7xGEq(Q0=Zg);?33Waj+ z8vkwP6zg+_VWOG8W*``#t1bpvYvEKFoC%6uSY=%WqucB8bEjF4b2&+K5qM_h03=~7 z0V)?DPQ^OXcn4s$4x`P94It79zz50Ocz+$f&;26K{A`}}=7}o8DC(V*E0tyIr7sed zmBnM4XyoUjC^M=2%V6v`?fY4o>lZxIiuFJat#hx<50KH{F#3p>vU~`Y#6c3ZoxMUu p*b#u+n_BMvD|VYULnPMsZdEr(|7+!(HPc?~X%&`MVRV_pegOKSeue-5 diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/DS.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/DS.cpython-37.pyc deleted file mode 100644 index 4ed56833fd4ca355f4df39ac122657d0c5a753cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 381 zcmYLEJxjzu5Z&y?Bpx2ffnX_iDK1-B2_okauuGH51zBQd!HfCW%O*u^EcBmP`3L+l zX|4PVR!(v`9hk?PnfGRA*Yo*|V7$Da-hVPezJ_8SHj)*lIY$5jR!)RVMYlCtw@(~O zqr2v@DhI}EXgaM7zlrX67zetmDK0q~t{jL*$J%$q0@cB!4!}GlM&aS55$@C!&eV0n Zc#YH1_}7egSH`TSfo? diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/EUI48.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/EUI48.cpython-37.pyc deleted file mode 100644 index 4bb546ffa84ef8ee293be281bf654b543d9d83f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 567 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 diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/HINFO.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/HINFO.cpython-37.pyc deleted file mode 100644 index 9b1279f404821d17f3303fa8debf83a8c1d609d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2087 zcmah~OK;pZ5GE<=vGT6-MAGz7Y*V1f9uhYQf);^MBysA#fK8F4Kr5gS1d(=RYbAx` z#_?80(b`4+LC?GBsehtBgx8+(7kcUpwRYSb5-vC#a%QM`e4M>M7{mm|FMq!G)8D}T zgPY^Qfw>D)KL8?#pe0GVl_t#Xz2(Z?%1VC{BmpH~65$DcL0qz z!A)d5qPAz`3zM4tM&@{QJn)k^^bbHJNvI%jHBCIhgtyHS{*r7_!G(VmCB8T-BGEgd zNgzXUPQ+s6h#t};66Zx<4B)&6=NH7PIOERamxPmK1>Cr3{ja_rZ$6y;>XxCBd96eo z4`JLbo@Z*9H`6;q^HdHuzWaWNUUo9%I+-@AsJ2g8)Vecx`1nnIl$=)AQr;Op+T0l4 z{N&bc>%pfit99)8N6>V<3hY+LA*yXDw~nf>C0;)-(K&scWq__ZOrkX;1~N zhbzdqlRaqpQWk=YgDeyTf~VtAWPLqtq*C||8>MMc6(&t>TWW}<+YFs z{ZZ)H$hTa}a?6HF0jjE^))kT)|#TZ?(Qzj>$mow>86?P zu8B%F`{rp~A-C3Dq}T3^e_V5QxzX&a5I*`bOuY(((DO8=eHJ)6TkW)t-5)>6F&-S~ zZvgXKn0g3A&^csrhs_~JJA6S;cz;0`46?$;v)w#z1S0Xc6 z(o3bzv!>YEKNT%k_<(Fst75yTY^-FNnc{gdla}r7DRjFdXHYFPb&ANp2^)=G5_*=- z23;UaS&p9Lh+tyUH(+W^0#utU$N^N^ts$&*K`7K8kCoYeVEzk6G%o;c5MgPumu2#YBGW@kF@Pc(8D7bu|b z7>o121jc};JMcsgc*_OdCHj(KztNV?0nKw?u$C{_fs@L2R#8eD z<@KadQfrqkOUpM?gr(gplw5~E^;sYUQ3{CdFV|CLM!g)NjRWy>QszHk0}q*BAqOEQ z=~Dv9@&)~j9QbY6`nz0RGmx4cOdROJFT6~CXIIGF1879J?`+!8*}Uy8Pnoye)my?U zYI_b=Z2SuHNk&|qgT?mbi(EFC$E3FjkEP3IFs=4f){J6x8I)clE#Vlm4fCl|vN8!g zDXfTt-c{6m2lUW-6ZG^4K#rk@@Vn?h*g>(|{|}I82ao&7a>8HFc+|(1S7j54EiX+c zwV0O3_tW&*G%J^qFil0B!!dL-UDigYsq04S5;$O2T!WiP=w3oyffMx+l4~d%EZbi$ z%My%ETEK{^0V-i9aIN=!VDxz)QN&rq`YSPKv>(JVqfQQ4#Bh@VG@%2~RdKU6sD z`jQjFLzWeE9hI!0Bt^Jp#i*u>nuuU+am*P5dBE)k!jwnk7!%NO4F{sUMz Bf5$+~Ae9U7dZRC}dC z4A-CkarMdUB4hudn^%{E!KY~D0|>zc&sfy-JmTiwiY(LHkz@MSvUelrw@g^Ve$Ip~ zosl>4&+RA>{43UXUceh0BqU#5^d`E>eF(|OJ3RBqCLh8Ptpg`=zG3@ZxWaqxM=fz# zv_qQ&`~dpSH_TyC7wfpD?FYa6 zV)zMX41K6%QYg`GhqyjXPlhTyOsn0nI+WpIQC49pWL~A!X;=*p8l&oTjAvw2Rw~Vx zS~GQ+9TY094v!lLNm6Nel%EEN*$8nmcRU9jFsmQl#k#Hek>y$Fv*PaqdHY`i+ zDnSW*t1;I>92>JZ{wI66yHg#HcgE@XgETLzVU~UH^V6s0csx1UK~To0)nSp-Xs2;m z?)+--ryXEudwi;Vy!@wVrJ)tyjGz!fh(8|9-RBVp0jI0Hp z+Y2^xDrb&Rj9lD%f(r!7=v%^`xd&|KO+!5OKW9(2W`6C>gW8|Bn}9AjXHV}uVpXU1 z&be@o9CcQ^q9t1MuHg}@z0cV>U+^pJV>WYz4^KUWA7S5jwkYVq;9JmxwZDa6nkl+@ z$-{(tx+oDQq3Fvkh?+gwnDLs=*@At|@P5>XCV4z+S4BL@)1(lxZ)t1$L(QkEhe?gt z!02Ug_dw=yI#%~~$tC%B*x9=jJj|}-wA#L#70ECw?`^M4&)PR8;f)gi8)bh(`+I3V zER!_V-l3dk>Heunx^@L9E~Iw%hNb-ImJaqlx+QZ`8QcIWa-0nlX#k|%;dl(b=u63A zQIs-PG8<#pSKg$r--KZNBEQNV{JMM#?K(f}tVJUsu+!B=BOHB(R{kBLwkZcQx8fj}O_-TG z3%1}huWA`QaNyx)<&M0$4^;8L@G1au)-8SDE12Get^-f)x;^hMn0ovL!>rzXqi&Bb z)Xu`1b?VOiBH_l6IGA6mI|h5de*`=b7Hbbg_Uqu>1s3eVi~nJL#E6GsRTN=Xd!MQwW2)HdxdQ}!;|*kGX!ZN5Yi!3e_x_#|Xh10>lDvk}hbn9f8O{DrU=Bn!u{jRo?tW-p2)gg~| zRUE01Zr>we>W-;EtKy?uFp;@>pPs)CaJ2*7Cuk)(XO@o&(Zz2Q3AVV8pM`{X`367h zQJPl^OXxjxQIe_1m_*ZdSs}^#qn6lvNWO8R(6PX^wyAl3@-z;k}3q_ZTzm9pmo3F z0=;0h)m(ttiVOe64b@bHg0>b%SXbCzt!r#yJ+^1w%%26ML;VAOg>{D^c*d^w8oRk= zu&-Tx+gQ%s zF#fUW9R=!Nb#IP@fVI84JNN1yCF^Ou;#C{0>eOAsD`%OY7Y313q5HnNjZV9hoN_|_ zGaNirA4)}A@DlhGyavn$@fXz3$Y6!|$RPvmB@=}cL>0A^KmlwhKvlZQ^)G1jIuA@X zqgFC0rFfGEzl8ZCwDKnq%yN-ZLjUD8=^)XU(Ma#3e~l9+;q*GXh`@eL^HsXHJm@4c%P@0Qo%&qS7NUq_=6v-d49d$8 ze%G}XVe{Aw=_E!tB5mtS e>Ws(lmeY)AG1|Y|MB*N8hb1l200N~GKl}e;+5<)a diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/ISDN.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/ISDN.cpython-37.pyc deleted file mode 100644 index 41b05f27b6feaa00bf256a80591e0f1304fb1257..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2315 zcmaJ@TZOvCGY(OHtkD)L;s0h`;@=Xr=BBw*P9epMn}@QXf&U`bH)$5-Izf8<&RH(T<;R{ z4=#=xhsk~D`Y{MW1T9Fi7-_=X+FOp?jjZs;K@w2%4H2H;heUA6w!`h{z)MpaIT4HYAw8f;B+iSD=z_il`U_%BoN@a29pNNt!!a&e{_XR}gX!NWdrD@N5^>yv zc0YeJRK1}PN@{(#XI{yk^I2*ZK6vVtk2WeVw@yUs$xr{^V5RI`t5omm)m}d8m6hq$ z@FZE9{)w$uzIS^kch^$h?LB+?sCVnuo!d5CKE%c=|IByj5rQLP=|R^65QZ4qkOMYj z4Q<$*QDVHtGyH(5YmGPa=cFNNPzH^MHMqX`#x(tl z{QK3W8P}V2Uf*zg7sZX+d#`m}Pj)s%sp~!Ssw#1|x!6c=J{Y{*#GAWW@2L=;c?G&& z13~C{8q*F7oSb%@)6wAvFEV@^Yn{$d)lm~xm+*Bl_nt{Lu#4dFm|93%!N z2JauL%RX4(-UWVv|nwFg>DW%8$RB|0 zO9IgOg5DwfeiJr6z;Vq0P}>M2_`xr{M1EtJ$;<=JMYvwXG@*+DkRj&xQ}^^#bIP8r zk_&IYwd7{hv>Z19WW?41tS-R}vh5rUwk6+YvPOWD)>FvQ1>X@4e zM=WfZO_YLqoF- z?_fnPhhvEqIZelvm=rkgr0MI)uvl8cG!<0_YACk4sEkfiS1r{#oWZtT{T)jvu0nkV z8g&)Lb+mPt)j5+z0YS$Vs81FAjUWmOk^3?rN{&WR#972T?Kot#(}~-RIy(S~Z=7_Y z{M|f8+}!~DX#m}#B04iPU;3tBldT1rT4O Nw?@83%bL*f{sU_qBSruK diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/LOC.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/LOC.cpython-37.pyc deleted file mode 100644 index 809d704cf1d612d98f038b60bc50096dc918b07d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8286 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 diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/MX.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/MX.cpython-37.pyc deleted file mode 100644 index 57e8bb322fd45a4474ce5b91ef890d6b861ad1c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 381 zcmYLEJxjzu5Z&y?OFTS~1Hn@4Qe0A42_ok;R!L(M7i5W<1uy1fFPng|vCw~FA*bR%)B={yPD0W1morX`0kSt@@0x$*hrR``V;{OSUKU=H316jjR2EY zMl+V#uZ-`3bwfP+8+9Z~4er81vc%Mf2on83I0cI{py*&d4ddtiFg~eeTGbGFcJB&N zCWREDp9)b_(B_682(f9Ce4IE!K$QydL23v04)AjxG=&P(S}oS4ZjwA-oOK(mRQnh} zsa4lJRHb1-4Na${4z8lxAdG$0)fAT;nJW!(=}>zUK1a1bs{P{WKG6~nFEw|@CZCMm aNf@tiIvD>?+A7JzJUp diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/NS.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/NS.cpython-37.pyc deleted file mode 100644 index 9b0eb285697cf23d1d5777b7d5b349f3d9936a1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 381 zcmYLEJxjzu5Z#ZM#KQwQ5G=(m#U+K6AaY(~w@oS+WQmytFXm$}n-sCJ(0^j(AMnSd zwel}mImzX8U>oJe|0fB}Caz%|WS z#xv)Y%LAY>37l`#5s?nK4~k@kX^#;!`hiFWRB~YG;5`%Z^Pz~(YMoX!h`{N6rOKqx zO7%0PiVE6%;73Yr+a#YRo>EYyN_~*p!@VQ?Tt-b{BC|2eO=+7X&zBe7)*913MNnGP zHIG#}u&9QnGulQs;w}<#Xu6u=l9S=ef%t5!16M9k9Zu@7v=52Zcz9{0H#Ma@bzKp! XaXK3RPuejbclQ3(?km@ezi0R_ikn-4 diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/NSEC.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/NSEC.cpython-37.pyc deleted file mode 100644 index b50ecf18ba68b76d7c780780fa6bebc356db1c01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3304 zcmai1TW=&s6|U-g_ssaVyS6tVXh1{^B2Ca^@=WkZ4lXcT25t!NQ-+EYDt+vDkR zbu?4Q)QOb#mdkgMNA2qyTDB~8f_%e3uf=`2gvl-AHY@)Mu4-!Ned=Lr)| zZXE;%;klhefzb|G?>aKW%HPi$ccd(TRoPuYMA zN4QUd#1$JN5aAP^c)2gGiAc1b@N=F7;<{*y4)h`PH^hoqHTpZ@LNUcPJGbVR=Gt0VoM~IL)YcB9BN!~f zdtJA7tI0T*lIGPxniiu%rKzN)B&~@NPL&S_wJ$|~m{nEnNkIpHY6!2xG&P-R`ZxB~ zFL%_@cxPOUUo1wI%7()iUpYOl#^cH14(v8QRr}?LYCFwB)y}Vaf7qeRxHUeNKK6Vb zx$+zK~Vv-RHZ(_tyKk;$Qdhg^LDq1geO^X7wRj^HzQ`e*2@U$YM$|IwOx zGk=fGg6W3}&ZQjfpYwC->&-&#>+mLUe7JAUmU)2{G@HxG5N;9KlK{T=*=nt;3UMQ^(Bn z8ZWE8#&v54WmWS6l~a}1{6NwTG@?VbZHS*CS5#qqg*$u=`8p3!wt2*3zRAzp=02B) z>zj+l=xfMy`)?svcVG!^&)I^_Jni91joD@%uFsz)=&=@TZlgEAr8o;FUwW4*_rRO` zIyivQaiO8$hn9Q~+Hf8TYr#L^bYX{%94vK?(fRY14$bA^inKp(FK`WT9dOsIh1^yh z;hytZ2YatfA8Q{DGo|%)8|(k|_%j{O+F03pj?Gr}s*VnA`47EIM(`&-V%ylZ!-q7nJ*kW+Jj$XgXM5s6Jvipo$Z?NOfaKit&vS#G; z+S4oN4xB6M8P_^nH5_+RsC{Ce_@(0OuNgbL@onv!@oTqlzjC{ZVfg=-)VR@?nyB|}<}c%Zgbc__a_ z&F_*R7E3@}godhi(V34Df3zg9@6!yg?5kW=NqZ~{oNw6`(`=%@BpT%>=_L%x!Jx{O z{1HvGVbEvYzl)AvAXo1|Fe`w|JKTZ{AXgx%);2Wp`u7QnJ% zz;b1%{^fH?u%Qn(aQQ7Nm)s`+oQ2KV^wlNv{S?gS%v{aqwsPh!T+&gVhD$GOa!S&J zlZd^x!BO-uSiLj*2lwxH{e}#PM@|Zv8;jKLi7Wtq5AV{X4{jM}{X=;j2k3eYu{eWb znAbtSJQ~Zqs+#*CW6PMtGn8=~x(|^nA|(czSmWDIQ3UPVCt9FH97Er2zWLv%D0aZ{ zz}fg_5X2TEsA*?m;fsAxgQEj*FM4$Fb8s*K98SLgH*=7{-%(nJOumaX?71Ug3lIdJ zM|uUQ6wVeyy`@0{hgPLfx|sKPIo>nl9pN`S2%mPqPA#nYm*p4`(I;HFv>JYRCFp!} zZ^1w(ZPF}H*D`ZMkXNMJ4OJY!3aER69ftB>ASJvwAT@spbG%gs=3xW#3mc|r93@s| z8CUzjiTp8?7cup$?q(u3m~Wi@f}W1E%`0ug?lGQ{J+3BbB&PV57z<3_jidq{>C}rWr4J zndZkNo^h4C&<&8Q7a*ARJp+;kKn<|yjcK6Mh7(b313CH@h>Sy#!6;ElhcFIBK70ux zikJ{5HE=+jWEmtFcI(>4&7Y!~XO2k}_%U)tW@h|s(;)c2UU8u8{bfdIj4jaYPzXkb zPt!U|)1y*MhE#8->G32RE_?hm6=ff4gk9CJR22d?f{1y3>z0Ycj&g)qLJ}iMf|w-Z zHSFA325bF%IK<4W(|5US(IE4ZlVylVE3!)9J62$|-Dm}5_I%_)Zkvb^G0N-cPdXG3 zUs1Plpd=)n2}YXktGEQw`Z9b@T2xDkDKcdO8gdVWFNyme6=sib4%pP_cy;hbW1Bbe QFNRh02?6MKdH42z0CvC&9RL6T diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/NSEC3.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/NSEC3.cpython-37.pyc deleted file mode 100644 index 88911c4e05da5328ae7133caa6d89ffab8fb2359..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4581 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 DNVH{9 diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/NSEC3PARAM.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/NSEC3PARAM.cpython-37.pyc deleted file mode 100644 index 24eacc5e51dc8ad73113fcd46b014556f1bad879..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2382 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 YT2ggr{J&|-T$nJDA|R-n~pXPm6F_P8^X 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 ZO3kr8%>JLXVLr-s{>A2<%Y(m7>=!JuUIzdG diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/URI.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/URI.cpython-37.pyc deleted file mode 100644 index 8b8fff3ecdd9e77df61a51e0246bb2fc1854fe29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2296 zcmZ8jTaVl{6t;7p%uLzdXlW6om5MZi?W!u2YK2fKmllEMVOx-hKv5cdb~BqvQrpw* zjIu&v7xiZ_BcAw6enUL%U*L&zoY@QOSsx!CA3NuK`FygE`~8qW`}NQ3zx>f9zGD4i4@But?BN^YkhlwhT-EjuTi?$A1`!FKRf2_K1np7& zDiu*J@=D}twi&4%ellwvFys@{W|Wue%*H*QZ||sfTdSYhbiDZgEh-h;e6^+3qn%2w z4mA%u_F$#FTc#6!cL*Y?UW|FRa+92IMogq5wLVGr;`h-@C7a<7Bkg2B5w6 zz|1p96M`e+ZbO$pf>1=!h8$Q6tD%jxv?yuph9q|5fOM4GxCfNcT_PSRZ|pAuW-aM& zRCO9xg$I`SzHt}bB>~@F=`}8ni~#2L@QA|c^BV~ID%C74%SuHrc*G~QnhpBemD8FF zfx+k?N%AsRNg^;l;iAnhc&Tl`LU;JdXYauG3!(8U2RB4%UVc`~! zms!QQz(fb0b|f!G+7~P}N&X`LZf>Yay;0}&x;eWj*6+_= z%DSHJZa^&cOzl)9Y8&loa^s8PPaBZv-FhZE_+0364FsW=s0Y6u{6gBZ<~{T}PIUM@ z!_2W^%9!zY(B*Xy3|`6@U>)OVE$k&3*>5AT)^Hx)VG;b@z9VlBoO7vYj{(COhXo8k zd%*4OywsuKMXK^w`J8KOcTZe_#a3KJH(yl=Ueb?YBF(*oc;{V=cC~WCAWRU!{SsZb zKs5G(EXlsN8hse)k}NE+1x)_9N*@tD6nzk}k4N#U(C(|WnDRkK+gTySMRd3XLffj^71wZzZ{{4}=aKA;;655G zAA+;I0D@Qn4S)e_&;vT}BdRA}nL!(z@bzOixPAnRA`7^A`1+ySOMBmG=)!57B?Zh- zBV!kJbKig#_N}K+f$<(BJNMLu4OY8*P~}$l!fnanjPio(Agd;|;8L0#<3R0I za1)h0pBZvwFBkkV#3qpe$nG;N!L`gsJ2d>zpl-6+0i|(G6}h5-(hF-rAZ()!uj_klTJ`IJD;E^{7|eYf>$+}3Nq1AAPv-m(X{)3n@ihertG{Cyf3uNbXbuQilScmeD6sl_{>I!RrXoAGoKKh&$g@Vq$8GxCLw4o0bUVAQbPx^pq8` zgZXMdn+gHUie15=ShY04LrnoQ)#W^nEkkhk6Yy*61Tds$y$kFJfF*%-h9l?)m;U*x z!{>B3=wY$MuS1gPFi9pAn--||5+HtBtXBLaVO0iZsBN;Sl!VfXmsi{Xp}VHsO*qst zCL%O{fZ{`3>#vGo#)|?roz#i}6_?QoONJ@hH$jnjM}p9?LaWz>f%ZC~Yf-Zfs3C}P zA3tX&72Kc=|0IA-uvDe+315Bf;x1|l5;9e$o+Ga4;%?z!4n2*h)l2~kK5J3<90Qcd LzQEi%z}5Z_k&842 diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/X25.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/X25.cpython-37.pyc deleted file mode 100644 index e30b920634daf886bf9335885a270657d6777ed9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1775 zcmZ8i-HzKt6rLIX#!0sAQd)|*NGm{%P&aA|Vzol3e-tF72(=Xg3uIZI*{u`Dc4sEt zZsZjbyQnX~18l?*m7Z0d(~Q22MCFNZigeX7<@x&90qU;m!Qmr{r709qyhI?g};uCgF(_cQ}1chTb{s zM8-pEI$FHZi9V`DhNgAHPhwL)!XQXYIf1Qd>~MBKWA`oDr*`Ww_V^_p@bHwzz6khb z-r>PukbGKfxQFvZQkcw)*ihjE{VI4#Cyj1>E0KMUtkzWkyVmM(E!?m{B1LLWAEu_SKOqe8j znd>AmQLge*>9ov*Wa#omnN?g!{N~U#t`fz*2_(;oR4L<2j!0TBu#qIzo+N*hfA>au zR*&kuzGHVRiaYm@Ua7jCPe;5|^^tyAmAD$Ud#KUF@y{bT%$@p3`tY@np)05*Lg+S) zXpb#==v}8eevx7B*w$zAJ*?F>44i5*p>QH(;w%IipKLfg@zE@lTwV9~MUkLMLru!~w2FRRC>HRw#*D zlU*2$qpPXBf{%#XVz`)OXJ1w`o8}ILD4P-sX-F4+Om*Ykl$Zx$7-f^)g@uOnCLoGq zw{bb05_L_p-)Te7pv=xZ&Kh^gmJ~pM1tW273(Xmy12(c?Hy;gs;}oK_8Jew!N(rg+ zs{BUEN*eD_=2{pZ;LbB`+&aysL$9U6-OmeQ!mOIrC@2fo(BdLWq~b7_;&a5M?$rjo7GA76T%qG(5A|QBGlBX~ zl3B&)1+IHZ@@k$ID^HLlyvo1~B3DJFRgzel%B%1>)3v&v2@o}x*TEuh;_xZ@`m0+Z z6GZ_pZ8S8bvWG#Ku)T*qgoV{_=)25ky&!TJ?Rk;UsPzvciQ0+#AmE+Nx!QAvKL)V1 znznAxg(yL`GVY=$!TL$Hz0>4n+{Al^7l7UOT}tiBYCHU@J&3PSSPB&vt`4>5{0G!q Bomc<> diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 7d792246cf1d36f7d9809fc35973af989982c13d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 579 zcmb_Z%Wl&^6m|S)N+3|mtGo>jk1SeCv>+A;aBU~Cnv5-vTP0UQqbSEJ7O7)mcM&#x z3@d&qTmFI-V+;O(JDPLOz4z#9bmyquZYeUp|JeBy8H)0&O8!MhijVRZu>>fjpaB&c zbQst`6Pvh%7B1ro+PI2q*ur&e;|6Zx7H;DXc5oN>a32rw5RdQ}CZ6CacF{TOPy^4n z(tZBzg)^TPg=w>i`SL8ul4UyUnoCT}sadY_#GF;_q}V6J?s4~sH2c&c&9QB2IxgeK z-b7|DC*AR)m<)&6BTo{aFllp#r)0QwY2&Y1m0rU;@ekkD^yZNCei+Ewz-PUHw1FRz z?sJ!sHVhn6M`Kc%9M8DtkWt|QwQ36O$R1HE2t5||!}=j%9FZD@WJD47`%=cF@xYc4 z_Q>FT(38XCA(xeS9Iv&L$R}<5>NV@C>!uJ`%!H`KbUqj2r?S-L-fQ^%!79&lD^K&i zG%HHk-#b`+E%N;0i-oMnSLNqLRw-+VYHfuj7itNSW@#zJe!g07zB^ywVxGL;u0C`i LLD$sA|2TgD>)nRE diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/CH/A.py b/env/lib/python3.7/site-packages/dns/rdtypes/CH/A.py deleted file mode 100644 index e65d192..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/CH/A.py +++ /dev/null @@ -1,70 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import dns.rdtypes.mxbase -import struct - -class A(dns.rdtypes.mxbase.MXBase): - - """A record for Chaosnet - @ivar domain: the domain of the address - @type domain: dns.name.Name object - @ivar address: the 16-bit address - @type address: int""" - - __slots__ = ['domain', 'address'] - - def __init__(self, rdclass, rdtype, address, domain): - super(A, self).__init__(rdclass, rdtype, address, domain) - self.domain = domain - self.address = address - - def to_text(self, origin=None, relativize=True, **kw): - domain = self.domain.choose_relativity(origin, relativize) - return '%s %o' % (domain, self.address) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - domain = tok.get_name() - address = tok.get_uint16(base=8) - domain = domain.choose_relativity(origin, relativize) - tok.get_eol() - return cls(rdclass, rdtype, address, domain) - - def to_wire(self, file, compress=None, origin=None): - self.domain.to_wire(file, compress, origin) - pref = struct.pack("!H", self.address) - file.write(pref) - - def to_digestable(self, origin=None): - return self.domain.to_digestable(origin) + \ - struct.pack("!H", self.address) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - (domain, cused) = dns.name.from_wire(wire[: current + rdlen-2], - current) - current += cused - (address,) = struct.unpack('!H', wire[current: current + 2]) - if cused+2 != rdlen: - raise dns.exception.FormError - if origin is not None: - domain = domain.relativize(origin) - return cls(rdclass, rdtype, address, domain) - - def choose_relativity(self, origin=None, relativize=True): - self.domain = self.domain.choose_relativity(origin, relativize) diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/CH/__init__.py b/env/lib/python3.7/site-packages/dns/rdtypes/CH/__init__.py deleted file mode 100644 index 7184a73..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/CH/__init__.py +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""Class CH rdata type classes.""" - -__all__ = [ - 'A', -] diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/CH/__pycache__/A.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/CH/__pycache__/A.cpython-37.pyc deleted file mode 100644 index 507dc7ea1a4174100548111363f2cb02cffb9b9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2211 zcmZWqUvC>l5Z~SVYsXIiCuxPiAc`=e4i%ym6+(5RLM4P>+K1`{IytxNntP^)F-}!EyM#~X>!35;L<*!lS%(Ei57 zYPg_0gsDCQ!3n1siKu1t`gb61d=CNUn%2DjzI0HwQEyTi(`8j z$A6K3@9*l-cz2wR@1(iX{Vcol<;e>*9#4*TAt~b%eOTnE?N*M|?%tE#ZfATV5yJ;C z6)J>oQJ+rh-Oehg-m?V5!hwh}x*uSw_dt|nNahsLF4)ZF6tNE3fNdd8)|+~_RqJ-q zc5J}rN^)2fO2krReVx8c^~n;e48WK13z;6Ixv8(tr^2wKS5;Crz(QKlK-)kUu@=Yr zV^}E5W4cMFwQgs*pI9t#7{bJ`_t5Yjh|-yp1)2G!Go+ky_B)*gr4J=@OAkQ6{@hs* zC>yawgtJo@z&O1(=n9hV?)Q~wyCyskI!3BRb<`%nmAm(36O5t&H$;)OL*pcwlK7^q zfiR9Pj^rjTFQHi1yMlI(uQrgy$Rhj{?3C>XETj$ig><^n?X1reiyn*+a%8JzyjL>S zqU}{ha|dZAOqdj-G2TdvEpkC0yah?_KuBM}T+;0FdBO0X61)jG@VSO@3l=LF3wja2 z_JyFmD(EHz&C>$`rKQiwQB4lZU=9>qAW17i*2-W-NKDlfs|GZKi)~zFqp7HaIkhP; z{v^lZnVL9G#8{_A9@V}pM97rc4!?Kd&}}R1bxk2TXb}W1E0uao7U@~tcs3}1sZ3?QD~g3 zx-xjnpsQddF5ITKB0;0aFqNeionGs9-f2M4q@FEj4;wT71?+5MPsVJ-a3l5DFm&1DNu zM3%wpYY1&Bk!upWo&8E+h13>^(05tL8eZLHv=P*+=Z3Xu2hmmh04_UxXLO9cO197k rUWW+2CioFikzXA}{*TWep$Vqw{Ld@RHrnu;3jDWNPJ2N@8nXWYOV948 diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/CH/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/CH/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index b4317b9ca7598491a11c4bd1df9f93875779aa3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 209 zcmZ?b<>g`kg8Ic0v9p;O7#@Q-Fu(|8H~?`mACO34h+;@#OlOQ@OkoOU&}6QXan4CB zE>>{%P$)`CEJ;)-sVqoUNCt_e7VF(&boA3?y2TzJpOT*(9}i+A=H$f3uVg4<0U8D- ze%a}lD6p-P?`pzEu@$s2? dnI-Y@dIgoYIBatBQ%ZAE?Sw#%WC9W_%m86^ITZi^ diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/IN/A.py b/env/lib/python3.7/site-packages/dns/rdtypes/IN/A.py deleted file mode 100644 index 8998982..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/IN/A.py +++ /dev/null @@ -1,54 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import dns.exception -import dns.ipv4 -import dns.rdata -import dns.tokenizer - - -class A(dns.rdata.Rdata): - - """A record. - - @ivar address: an IPv4 address - @type address: string (in the standard "dotted quad" format)""" - - __slots__ = ['address'] - - def __init__(self, rdclass, rdtype, address): - super(A, self).__init__(rdclass, rdtype) - # check that it's OK - dns.ipv4.inet_aton(address) - self.address = address - - def to_text(self, origin=None, relativize=True, **kw): - return self.address - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - address = tok.get_identifier() - tok.get_eol() - return cls(rdclass, rdtype, address) - - def to_wire(self, file, compress=None, origin=None): - file.write(dns.ipv4.inet_aton(self.address)) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - address = dns.ipv4.inet_ntoa(wire[current: current + rdlen]) - return cls(rdclass, rdtype, address) diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/IN/AAAA.py b/env/lib/python3.7/site-packages/dns/rdtypes/IN/AAAA.py deleted file mode 100644 index a77c5bf..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/IN/AAAA.py +++ /dev/null @@ -1,55 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import dns.exception -import dns.inet -import dns.rdata -import dns.tokenizer - - -class AAAA(dns.rdata.Rdata): - - """AAAA record. - - @ivar address: an IPv6 address - @type address: string (in the standard IPv6 format)""" - - __slots__ = ['address'] - - def __init__(self, rdclass, rdtype, address): - super(AAAA, self).__init__(rdclass, rdtype) - # check that it's OK - dns.inet.inet_pton(dns.inet.AF_INET6, address) - self.address = address - - def to_text(self, origin=None, relativize=True, **kw): - return self.address - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - address = tok.get_identifier() - tok.get_eol() - return cls(rdclass, rdtype, address) - - def to_wire(self, file, compress=None, origin=None): - file.write(dns.inet.inet_pton(dns.inet.AF_INET6, self.address)) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - address = dns.inet.inet_ntop(dns.inet.AF_INET6, - wire[current: current + rdlen]) - return cls(rdclass, rdtype, address) diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/IN/APL.py b/env/lib/python3.7/site-packages/dns/rdtypes/IN/APL.py deleted file mode 100644 index 48faf88..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/IN/APL.py +++ /dev/null @@ -1,165 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import binascii -import codecs -import struct - -import dns.exception -import dns.inet -import dns.rdata -import dns.tokenizer -from dns._compat import xrange, maybe_chr - - -class APLItem(object): - - """An APL list item. - - @ivar family: the address family (IANA address family registry) - @type family: int - @ivar negation: is this item negated? - @type negation: bool - @ivar address: the address - @type address: string - @ivar prefix: the prefix length - @type prefix: int - """ - - __slots__ = ['family', 'negation', 'address', 'prefix'] - - def __init__(self, family, negation, address, prefix): - self.family = family - self.negation = negation - self.address = address - self.prefix = prefix - - def __str__(self): - if self.negation: - return "!%d:%s/%s" % (self.family, self.address, self.prefix) - else: - return "%d:%s/%s" % (self.family, self.address, self.prefix) - - def to_wire(self, file): - if self.family == 1: - address = dns.inet.inet_pton(dns.inet.AF_INET, self.address) - elif self.family == 2: - address = dns.inet.inet_pton(dns.inet.AF_INET6, self.address) - else: - address = binascii.unhexlify(self.address) - # - # Truncate least significant zero bytes. - # - last = 0 - for i in xrange(len(address) - 1, -1, -1): - if address[i] != maybe_chr(0): - last = i + 1 - break - address = address[0: last] - l = len(address) - assert l < 128 - if self.negation: - l |= 0x80 - header = struct.pack('!HBB', self.family, self.prefix, l) - file.write(header) - file.write(address) - - -class APL(dns.rdata.Rdata): - - """APL record. - - @ivar items: a list of APL items - @type items: list of APL_Item - @see: RFC 3123""" - - __slots__ = ['items'] - - def __init__(self, rdclass, rdtype, items): - super(APL, self).__init__(rdclass, rdtype) - self.items = items - - def to_text(self, origin=None, relativize=True, **kw): - return ' '.join(map(str, self.items)) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - items = [] - while 1: - token = tok.get().unescape() - if token.is_eol_or_eof(): - break - item = token.value - if item[0] == '!': - negation = True - item = item[1:] - else: - negation = False - (family, rest) = item.split(':', 1) - family = int(family) - (address, prefix) = rest.split('/', 1) - prefix = int(prefix) - item = APLItem(family, negation, address, prefix) - items.append(item) - - return cls(rdclass, rdtype, items) - - def to_wire(self, file, compress=None, origin=None): - for item in self.items: - item.to_wire(file) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - - items = [] - while 1: - if rdlen == 0: - break - if rdlen < 4: - raise dns.exception.FormError - header = struct.unpack('!HBB', wire[current: current + 4]) - afdlen = header[2] - if afdlen > 127: - negation = True - afdlen -= 128 - else: - negation = False - current += 4 - rdlen -= 4 - if rdlen < afdlen: - raise dns.exception.FormError - address = wire[current: current + afdlen].unwrap() - l = len(address) - if header[0] == 1: - if l < 4: - address += b'\x00' * (4 - l) - address = dns.inet.inet_ntop(dns.inet.AF_INET, address) - elif header[0] == 2: - if l < 16: - address += b'\x00' * (16 - l) - address = dns.inet.inet_ntop(dns.inet.AF_INET6, address) - else: - # - # This isn't really right according to the RFC, but it - # seems better than throwing an exception - # - address = codecs.encode(address, 'hex_codec') - current += afdlen - rdlen -= afdlen - item = APLItem(header[0], negation, address, header[1]) - items.append(item) - return cls(rdclass, rdtype, items) diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/IN/DHCID.py b/env/lib/python3.7/site-packages/dns/rdtypes/IN/DHCID.py deleted file mode 100644 index cec6459..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/IN/DHCID.py +++ /dev/null @@ -1,61 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2006, 2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import base64 - -import dns.exception - - -class DHCID(dns.rdata.Rdata): - - """DHCID record - - @ivar data: the data (the content of the RR is opaque as far as the - DNS is concerned) - @type data: string - @see: RFC 4701""" - - __slots__ = ['data'] - - def __init__(self, rdclass, rdtype, data): - super(DHCID, self).__init__(rdclass, rdtype) - self.data = data - - def to_text(self, origin=None, relativize=True, **kw): - return dns.rdata._base64ify(self.data) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - chunks = [] - while 1: - t = tok.get().unescape() - if t.is_eol_or_eof(): - break - if not t.is_identifier(): - raise dns.exception.SyntaxError - chunks.append(t.value.encode()) - b64 = b''.join(chunks) - data = base64.b64decode(b64) - return cls(rdclass, rdtype, data) - - def to_wire(self, file, compress=None, origin=None): - file.write(self.data) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - data = wire[current: current + rdlen].unwrap() - return cls(rdclass, rdtype, data) diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/IN/IPSECKEY.py b/env/lib/python3.7/site-packages/dns/rdtypes/IN/IPSECKEY.py deleted file mode 100644 index 8f49ba1..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/IN/IPSECKEY.py +++ /dev/null @@ -1,150 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2006, 2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import struct -import base64 - -import dns.exception -import dns.inet -import dns.name - - -class IPSECKEY(dns.rdata.Rdata): - - """IPSECKEY record - - @ivar precedence: the precedence for this key data - @type precedence: int - @ivar gateway_type: the gateway type - @type gateway_type: int - @ivar algorithm: the algorithm to use - @type algorithm: int - @ivar gateway: the public key - @type gateway: None, IPv4 address, IPV6 address, or domain name - @ivar key: the public key - @type key: string - @see: RFC 4025""" - - __slots__ = ['precedence', 'gateway_type', 'algorithm', 'gateway', 'key'] - - def __init__(self, rdclass, rdtype, precedence, gateway_type, algorithm, - gateway, key): - super(IPSECKEY, self).__init__(rdclass, rdtype) - if gateway_type == 0: - if gateway != '.' and gateway is not None: - raise SyntaxError('invalid gateway for gateway type 0') - gateway = None - elif gateway_type == 1: - # check that it's OK - dns.inet.inet_pton(dns.inet.AF_INET, gateway) - elif gateway_type == 2: - # check that it's OK - dns.inet.inet_pton(dns.inet.AF_INET6, gateway) - elif gateway_type == 3: - pass - else: - raise SyntaxError( - 'invalid IPSECKEY gateway type: %d' % gateway_type) - self.precedence = precedence - self.gateway_type = gateway_type - self.algorithm = algorithm - self.gateway = gateway - self.key = key - - def to_text(self, origin=None, relativize=True, **kw): - if self.gateway_type == 0: - gateway = '.' - elif self.gateway_type == 1: - gateway = self.gateway - elif self.gateway_type == 2: - gateway = self.gateway - elif self.gateway_type == 3: - gateway = str(self.gateway.choose_relativity(origin, relativize)) - else: - raise ValueError('invalid gateway type') - return '%d %d %d %s %s' % (self.precedence, self.gateway_type, - self.algorithm, gateway, - dns.rdata._base64ify(self.key)) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - precedence = tok.get_uint8() - gateway_type = tok.get_uint8() - algorithm = tok.get_uint8() - if gateway_type == 3: - gateway = tok.get_name().choose_relativity(origin, relativize) - else: - gateway = tok.get_string() - chunks = [] - while 1: - t = tok.get().unescape() - if t.is_eol_or_eof(): - break - if not t.is_identifier(): - raise dns.exception.SyntaxError - chunks.append(t.value.encode()) - b64 = b''.join(chunks) - key = base64.b64decode(b64) - return cls(rdclass, rdtype, precedence, gateway_type, algorithm, - gateway, key) - - def to_wire(self, file, compress=None, origin=None): - header = struct.pack("!BBB", self.precedence, self.gateway_type, - self.algorithm) - file.write(header) - if self.gateway_type == 0: - pass - elif self.gateway_type == 1: - file.write(dns.inet.inet_pton(dns.inet.AF_INET, self.gateway)) - elif self.gateway_type == 2: - file.write(dns.inet.inet_pton(dns.inet.AF_INET6, self.gateway)) - elif self.gateway_type == 3: - self.gateway.to_wire(file, None, origin) - else: - raise ValueError('invalid gateway type') - file.write(self.key) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - if rdlen < 3: - raise dns.exception.FormError - header = struct.unpack('!BBB', wire[current: current + 3]) - gateway_type = header[1] - current += 3 - rdlen -= 3 - if gateway_type == 0: - gateway = None - elif gateway_type == 1: - gateway = dns.inet.inet_ntop(dns.inet.AF_INET, - wire[current: current + 4]) - current += 4 - rdlen -= 4 - elif gateway_type == 2: - gateway = dns.inet.inet_ntop(dns.inet.AF_INET6, - wire[current: current + 16]) - current += 16 - rdlen -= 16 - elif gateway_type == 3: - (gateway, cused) = dns.name.from_wire(wire[: current + rdlen], - current) - current += cused - rdlen -= cused - else: - raise dns.exception.FormError('invalid IPSECKEY gateway type') - key = wire[current: current + rdlen].unwrap() - return cls(rdclass, rdtype, header[0], gateway_type, header[2], - gateway, key) diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/IN/KX.py b/env/lib/python3.7/site-packages/dns/rdtypes/IN/KX.py deleted file mode 100644 index 1318a58..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/IN/KX.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import dns.rdtypes.mxbase - - -class KX(dns.rdtypes.mxbase.UncompressedMX): - - """KX record""" diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/IN/NAPTR.py b/env/lib/python3.7/site-packages/dns/rdtypes/IN/NAPTR.py deleted file mode 100644 index 32fa474..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/IN/NAPTR.py +++ /dev/null @@ -1,127 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import struct - -import dns.exception -import dns.name -import dns.rdata -from dns._compat import xrange, text_type - - -def _write_string(file, s): - l = len(s) - assert l < 256 - file.write(struct.pack('!B', l)) - file.write(s) - - -def _sanitize(value): - if isinstance(value, text_type): - return value.encode() - return value - - -class NAPTR(dns.rdata.Rdata): - - """NAPTR record - - @ivar order: order - @type order: int - @ivar preference: preference - @type preference: int - @ivar flags: flags - @type flags: string - @ivar service: service - @type service: string - @ivar regexp: regular expression - @type regexp: string - @ivar replacement: replacement name - @type replacement: dns.name.Name object - @see: RFC 3403""" - - __slots__ = ['order', 'preference', 'flags', 'service', 'regexp', - 'replacement'] - - def __init__(self, rdclass, rdtype, order, preference, flags, service, - regexp, replacement): - super(NAPTR, self).__init__(rdclass, rdtype) - self.flags = _sanitize(flags) - self.service = _sanitize(service) - self.regexp = _sanitize(regexp) - self.order = order - self.preference = preference - self.replacement = replacement - - def to_text(self, origin=None, relativize=True, **kw): - replacement = self.replacement.choose_relativity(origin, relativize) - return '%d %d "%s" "%s" "%s" %s' % \ - (self.order, self.preference, - dns.rdata._escapify(self.flags), - dns.rdata._escapify(self.service), - dns.rdata._escapify(self.regexp), - replacement) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - order = tok.get_uint16() - preference = tok.get_uint16() - flags = tok.get_string() - service = tok.get_string() - regexp = tok.get_string() - replacement = tok.get_name() - replacement = replacement.choose_relativity(origin, relativize) - tok.get_eol() - return cls(rdclass, rdtype, order, preference, flags, service, - regexp, replacement) - - def to_wire(self, file, compress=None, origin=None): - two_ints = struct.pack("!HH", self.order, self.preference) - file.write(two_ints) - _write_string(file, self.flags) - _write_string(file, self.service) - _write_string(file, self.regexp) - self.replacement.to_wire(file, compress, origin) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - (order, preference) = struct.unpack('!HH', wire[current: current + 4]) - current += 4 - rdlen -= 4 - strings = [] - for i in xrange(3): - l = wire[current] - current += 1 - rdlen -= 1 - if l > rdlen or rdlen < 0: - raise dns.exception.FormError - s = wire[current: current + l].unwrap() - current += l - rdlen -= l - strings.append(s) - (replacement, cused) = dns.name.from_wire(wire[: current + rdlen], - current) - if cused != rdlen: - raise dns.exception.FormError - if origin is not None: - replacement = replacement.relativize(origin) - return cls(rdclass, rdtype, order, preference, strings[0], strings[1], - strings[2], replacement) - - def choose_relativity(self, origin=None, relativize=True): - self.replacement = self.replacement.choose_relativity(origin, - relativize) diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/IN/NSAP.py b/env/lib/python3.7/site-packages/dns/rdtypes/IN/NSAP.py deleted file mode 100644 index 336befc..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/IN/NSAP.py +++ /dev/null @@ -1,60 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import binascii - -import dns.exception -import dns.rdata -import dns.tokenizer - - -class NSAP(dns.rdata.Rdata): - - """NSAP record. - - @ivar address: a NASP - @type address: string - @see: RFC 1706""" - - __slots__ = ['address'] - - def __init__(self, rdclass, rdtype, address): - super(NSAP, self).__init__(rdclass, rdtype) - self.address = address - - def to_text(self, origin=None, relativize=True, **kw): - return "0x%s" % binascii.hexlify(self.address).decode() - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - address = tok.get_string() - tok.get_eol() - if address[0:2] != '0x': - raise dns.exception.SyntaxError('string does not start with 0x') - address = address[2:].replace('.', '') - if len(address) % 2 != 0: - raise dns.exception.SyntaxError('hexstring has odd length') - address = binascii.unhexlify(address.encode()) - return cls(rdclass, rdtype, address) - - def to_wire(self, file, compress=None, origin=None): - file.write(self.address) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - address = wire[current: current + rdlen].unwrap() - return cls(rdclass, rdtype, address) diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/IN/NSAP_PTR.py b/env/lib/python3.7/site-packages/dns/rdtypes/IN/NSAP_PTR.py deleted file mode 100644 index a5b66c8..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/IN/NSAP_PTR.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import dns.rdtypes.nsbase - - -class NSAP_PTR(dns.rdtypes.nsbase.UncompressedNS): - - """NSAP-PTR record""" diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/IN/PX.py b/env/lib/python3.7/site-packages/dns/rdtypes/IN/PX.py deleted file mode 100644 index 2dbaee6..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/IN/PX.py +++ /dev/null @@ -1,89 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import struct - -import dns.exception -import dns.rdata -import dns.name - - -class PX(dns.rdata.Rdata): - - """PX record. - - @ivar preference: the preference value - @type preference: int - @ivar map822: the map822 name - @type map822: dns.name.Name object - @ivar mapx400: the mapx400 name - @type mapx400: dns.name.Name object - @see: RFC 2163""" - - __slots__ = ['preference', 'map822', 'mapx400'] - - def __init__(self, rdclass, rdtype, preference, map822, mapx400): - super(PX, self).__init__(rdclass, rdtype) - self.preference = preference - self.map822 = map822 - self.mapx400 = mapx400 - - def to_text(self, origin=None, relativize=True, **kw): - map822 = self.map822.choose_relativity(origin, relativize) - mapx400 = self.mapx400.choose_relativity(origin, relativize) - return '%d %s %s' % (self.preference, map822, mapx400) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - preference = tok.get_uint16() - map822 = tok.get_name() - map822 = map822.choose_relativity(origin, relativize) - mapx400 = tok.get_name(None) - mapx400 = mapx400.choose_relativity(origin, relativize) - tok.get_eol() - return cls(rdclass, rdtype, preference, map822, mapx400) - - def to_wire(self, file, compress=None, origin=None): - pref = struct.pack("!H", self.preference) - file.write(pref) - self.map822.to_wire(file, None, origin) - self.mapx400.to_wire(file, None, origin) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - (preference, ) = struct.unpack('!H', wire[current: current + 2]) - current += 2 - rdlen -= 2 - (map822, cused) = dns.name.from_wire(wire[: current + rdlen], - current) - if cused > rdlen: - raise dns.exception.FormError - current += cused - rdlen -= cused - if origin is not None: - map822 = map822.relativize(origin) - (mapx400, cused) = dns.name.from_wire(wire[: current + rdlen], - current) - if cused != rdlen: - raise dns.exception.FormError - if origin is not None: - mapx400 = mapx400.relativize(origin) - return cls(rdclass, rdtype, preference, map822, mapx400) - - def choose_relativity(self, origin=None, relativize=True): - self.map822 = self.map822.choose_relativity(origin, relativize) - self.mapx400 = self.mapx400.choose_relativity(origin, relativize) diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/IN/SRV.py b/env/lib/python3.7/site-packages/dns/rdtypes/IN/SRV.py deleted file mode 100644 index b2c1bc9..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/IN/SRV.py +++ /dev/null @@ -1,83 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import struct - -import dns.exception -import dns.rdata -import dns.name - - -class SRV(dns.rdata.Rdata): - - """SRV record - - @ivar priority: the priority - @type priority: int - @ivar weight: the weight - @type weight: int - @ivar port: the port of the service - @type port: int - @ivar target: the target host - @type target: dns.name.Name object - @see: RFC 2782""" - - __slots__ = ['priority', 'weight', 'port', 'target'] - - def __init__(self, rdclass, rdtype, priority, weight, port, target): - super(SRV, self).__init__(rdclass, rdtype) - self.priority = priority - self.weight = weight - self.port = port - self.target = target - - def to_text(self, origin=None, relativize=True, **kw): - target = self.target.choose_relativity(origin, relativize) - return '%d %d %d %s' % (self.priority, self.weight, self.port, - target) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - priority = tok.get_uint16() - weight = tok.get_uint16() - port = tok.get_uint16() - target = tok.get_name(None) - target = target.choose_relativity(origin, relativize) - tok.get_eol() - return cls(rdclass, rdtype, priority, weight, port, target) - - def to_wire(self, file, compress=None, origin=None): - three_ints = struct.pack("!HHH", self.priority, self.weight, self.port) - file.write(three_ints) - self.target.to_wire(file, compress, origin) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - (priority, weight, port) = struct.unpack('!HHH', - wire[current: current + 6]) - current += 6 - rdlen -= 6 - (target, cused) = dns.name.from_wire(wire[: current + rdlen], - current) - if cused != rdlen: - raise dns.exception.FormError - if origin is not None: - target = target.relativize(origin) - return cls(rdclass, rdtype, priority, weight, port, target) - - def choose_relativity(self, origin=None, relativize=True): - self.target = self.target.choose_relativity(origin, relativize) diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/IN/WKS.py b/env/lib/python3.7/site-packages/dns/rdtypes/IN/WKS.py deleted file mode 100644 index 96f98ad..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/IN/WKS.py +++ /dev/null @@ -1,107 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import socket -import struct - -import dns.ipv4 -import dns.rdata -from dns._compat import xrange - -_proto_tcp = socket.getprotobyname('tcp') -_proto_udp = socket.getprotobyname('udp') - - -class WKS(dns.rdata.Rdata): - - """WKS record - - @ivar address: the address - @type address: string - @ivar protocol: the protocol - @type protocol: int - @ivar bitmap: the bitmap - @type bitmap: string - @see: RFC 1035""" - - __slots__ = ['address', 'protocol', 'bitmap'] - - def __init__(self, rdclass, rdtype, address, protocol, bitmap): - super(WKS, self).__init__(rdclass, rdtype) - self.address = address - self.protocol = protocol - if not isinstance(bitmap, bytearray): - self.bitmap = bytearray(bitmap) - else: - self.bitmap = bitmap - - def to_text(self, origin=None, relativize=True, **kw): - bits = [] - for i in xrange(0, len(self.bitmap)): - byte = self.bitmap[i] - for j in xrange(0, 8): - if byte & (0x80 >> j): - bits.append(str(i * 8 + j)) - text = ' '.join(bits) - return '%s %d %s' % (self.address, self.protocol, text) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - address = tok.get_string() - protocol = tok.get_string() - if protocol.isdigit(): - protocol = int(protocol) - else: - protocol = socket.getprotobyname(protocol) - bitmap = bytearray() - while 1: - token = tok.get().unescape() - if token.is_eol_or_eof(): - break - if token.value.isdigit(): - serv = int(token.value) - else: - if protocol != _proto_udp and protocol != _proto_tcp: - raise NotImplementedError("protocol must be TCP or UDP") - if protocol == _proto_udp: - protocol_text = "udp" - else: - protocol_text = "tcp" - serv = socket.getservbyname(token.value, protocol_text) - i = serv // 8 - l = len(bitmap) - if l < i + 1: - for j in xrange(l, i + 1): - bitmap.append(0) - bitmap[i] = bitmap[i] | (0x80 >> (serv % 8)) - bitmap = dns.rdata._truncate_bitmap(bitmap) - return cls(rdclass, rdtype, address, protocol, bitmap) - - def to_wire(self, file, compress=None, origin=None): - file.write(dns.ipv4.inet_aton(self.address)) - protocol = struct.pack('!B', self.protocol) - file.write(protocol) - file.write(self.bitmap) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - address = dns.ipv4.inet_ntoa(wire[current: current + 4]) - protocol, = struct.unpack('!B', wire[current + 4: current + 5]) - current += 5 - rdlen -= 5 - bitmap = wire[current: current + rdlen].unwrap() - return cls(rdclass, rdtype, address, protocol, bitmap) diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/IN/__init__.py b/env/lib/python3.7/site-packages/dns/rdtypes/IN/__init__.py deleted file mode 100644 index d7e69c9..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/IN/__init__.py +++ /dev/null @@ -1,33 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""Class IN rdata type classes.""" - -__all__ = [ - 'A', - 'AAAA', - 'APL', - 'DHCID', - 'IPSECKEY', - 'KX', - 'NAPTR', - 'NSAP', - 'NSAP_PTR', - 'PX', - 'SRV', - 'WKS', -] diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/IN/__pycache__/A.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/IN/__pycache__/A.cpython-37.pyc deleted file mode 100644 index 376844f33a1808aa476fb4e0f8d50c2cbf62c68b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1548 zcmZ`(-HO~c6qaOr?D^ZI8%j6O3pW&+31p^_Kuahk(_WNN7)l#@VJN~_nvG^Xwj*hF zvx7q^yCttNL$CTuy6sh8p;tY}_GFvVYS58%j&y!Le`mfLj|T+C&%d4g^h-#{A9y$n zA2v^6n$JN9B4|z$+N`Wwy>9gr`VA3Gc-KUDlCFYP@5)O;L4P0<|4(>L78%OJK+ibL zk04~@HDQ7#o?xdm@!yao6`t^~qa+ZwL@1(bn)GBSZi~JcT+=I>MB+U$6eH00L4Pd9 z;;7LN-VmQ8Lx_9F(fPKR$698k7Sq8XhVfLLr#eoB(9)PEaazRBzB_+>P_$R|AGu3US5hVYT-`SYl~S zuGo&%v}SuoiS<_gE~vddrKI+1!h3>1{&X=3U0^nq)SAIV7jdo%WjS}AD2($}b^h4( zRUs`;ZCPjxG4Y*mWWIEv7FnJe<9b?PL9La#KIe^|^WVu|pUv#LnpLWLs0t`7&mTUz zd}*p`b2ftr)unw=7PyRAKGqmiq5B`%7J}n?xUgwS|dAG@{$#eEQb*4oeWzCfyU* z)N}_tS+O1PVdd{Ba^t{?zy%jtS*fvDjg{&M1?DmFTQvQp%B734a$O>$_u6C zr||AwC{dfCV;txkBQ?2w3>!;U6xi$4KKz0Y$gk`!+0)ly2WfbK)VoQrqiJEwbQ0-1 z;N%9*#K&+h%r;sB_(`BeE{itf|A!XeJOV!k2}an-4X|jLu*LIkF0heC*gQqLme4!{ z&ex^bVmXLE%W}t>9F?neX=MB^KF@$i#rf=2~nnLLJL8I@YKytZp*HxL! zb9nR?=n2&$yoA(kni#*WL3dH$vmP7u1|FlM0A*vJM9CN$ZYp18va$-g8li`OJJ4aj uCw<&$k=nGq2vn2>^omB@P#b)YOXKV&kAE~!^hI0!mzagYkBhW~pZ7P;Bx1e* diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/IN/__pycache__/AAAA.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/IN/__pycache__/AAAA.cpython-37.pyc deleted file mode 100644 index 93ad30e78ed5cdd3c33392993104790b925904e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1603 zcmZ`(&u`l{6ecOjk{vs3(_-z0ZSYQ=1~eW}pcsN;Xgh2}Fu)kPUr~L~%?LA6v+WnxxkJNi2-}gSf=VznQfWY|q*Ly$x9uo2g zK5T~%neRJmDHNSaT{^23S~IAo+xVTt3n#vN92_$ z3mZNCh96G9K6<1vWb9kNmif$vT4Z@z*S4nx=GA(s?Q`zzoc~7tI+&P6HK|nfKoyW* zo>@sRTt)@EO0kz@2Dq-(+NtuUtQ<`qJ09h?g0?G$M)!Ip^)5JDxPh;QrsPJxH23j7 zl!?&Q&;{=tnPUZZC~z13D_H9f0UB>jHslp3zor`?)e!tH4HR#yK1+6wL0ctcVbn}X zorL%-%RCOPm*utIfm`$tzD&Th8mi)wTC$OLAzkXHk3kxww!x5IM>QZjpsC`tRsXz0_FQTCIh^~Kw&=((01k|Sd&d;hGh|NJ3~}y3P5bZ*?vh{F`((pjg`Lvj zR%!p5ZdcHSDJw@hj`SV4?^^1_$H+F!mRiGyNdhf$S+xBBUv@n65bo(@A5y5%w`50m z%%(@(oMQ70vEhnzA)(<0oG(hT%yB>D{KYcOJ5R{DC^IlaJJoqi`YWr)@_8M@ugO4v|tU#ND3mscD=KdmRj!8 zvnyK?mPiq~2+*hefId*@OY;Z%)F093c`Di`Js0SMU)t}?l9KFti8(WK=5{#eJLj9* zolcA4`|{5hzxc;F#{NZ}Dpe@&Z2g8ZDiiW zANrHlu*KOgm@tL)j0r1gADF`ceOox_JBc;!jJwdS2>uD{yGJ;c4f=+1c4d@rCd!{g zdykSZ-jXp5Ex%(ke+W&&$TXP6ho&&-C}D3}FvAhnK~<5TNTW(u zgI=)i)Vkwg7?kFlrxs3SGD>%wbxpgMCHZExb!zo;&eCe-GX$a%?Z0 zM74o(2c>)yqUJRVS#3b_+JrP}3(^z}{@{bYC25ItNVp_Ch`z0?GRa1-8vB+>Lh|#E z)~d;LZJJK6rg>RKS$6gM-s5sQ-Pv9fc{$yywu+ouYf_Le%C&ogHF*2lbWeFY80w33wQ)1vme^e6!^*{R%jhc;_d_&;>jj7-tj?IyI9{)>F`(+*d zUvseUU%n#Nuas+7%6)Iy!X@bcuW#by61ennjQ+QcXrrs#Foajb@H#prEhF2{8T%_I zmh17D+&~{~Nb|Je|3m}EA;z~2*{k^2n42WWaLU*|G-gKrfgU$7e)H70b37hY?%dNo zK11Nm%-tK6U$tuEfD3*R@h+?b^XKe~w`LaHZe3zkTbKuY+mxf)68r+2nfKY_(PsdK zFl+M<#w9j0n)NfgwuQaT%D+^>S9F0L`B&2XhRy7%J6{oG1=+t^+lSW7srmd&?HqCr zn4x7*O9RUt9Ff0{=nkZA{TJWS@6p}2F8}iO?fzMfEoA~B%1ZO3Qa;IWS`|66#71~; zaQC4`r1BQM8_Ii>=201^sq%O7tzs6#-;`+T-Uic7l+_>OtS5P{^Z65{9Z3hLb|NqWf;l;XUYzVcSuk~o)QF9Nx|}6l#&L$z%l~Eb38}uW2lZlnn+*yDa4C; zeUlHZui1!eD)ErjSA;9PXME@+u2>bmXg%WxeCUZYqAddGedy1Mj_7KA>uZGUu#L!j zO__*~{Sib@CUGIf3(1}maJk-#8ZIbCnisV4R9;+6(sa>G3GZQDGowtB_1=SxJH6{a z`0%>2_1t**�zC0MS{oVin+hV9X8VN8``{fGIbgWJP6{J5xBmj}^^je;+L*3Q7se zl_Ca8O64@kP3l2T4$^u!NP9&4fn4=DN~x{kXZe1BTR2W|gNHGhMITL|9P}%c@+^el za~N9b)OLXA!bKW`=e*aqlr=8WT$z(-s!V{pv0!1IQ^<4^qb-?aV7e#iexi)+r!N6S zxxitS>{h>{<8-#-`)x99p^tTT!(bPM?7Bk}{{*qgX3p*(Yje&H*_&rH&sudGdUv4@ zW*z7|(03}QZq<(tP2G8xgFQ9B1FZpa(xjPsmdekjTEjpuy*IbTDt znVU#6-cFvBaWqYaowN*-A`1(NYNYHZQMQx7@zX4=lnM6Lp`x5b~ZkUT|g?X9=a*u6+u8;sBeBUp1@bA4~#XHBlgBf!wc z>r~RW8`h(R%8QE$9vEfW{7u^NCDZkqJ?Izc4o)CM2{I<~qmLXxZEe)2U<5$O{f6(} z2E7m!o&|7hz=g@TD{%MN_=;C1fB=HRd&LsQ1q~h$BtZ+L1_1e>Dog%WH~@_=+@C-P zXnE*i{*M{{EOvwzq*nXbxnAzv>{^C;msTY`=0PfUZ{tReK&_UO+wkSHH2m z_Q~?9)9efAx6$%1F@V2=VC&YMr4tw6cQyDs4fu};01ea16*P~&gm@^=KyK)u_&1R< zJ6eTMKA1F&3z5YA6-jAF`N?jaOo>B>{zf4u4U>L{hMb+8IF#zAGMdUuP|DZzBF*1< zRZQjUq&%;u>wS?Zlbl*QqU6UI>38K#nsppbLyG{T+;~UIB(H|H6vXK|z9_v)ii)8V zjkKClQxi{@sr3qEswSvt(;23eHzAm5aSP#Npm_YEmKJXzu&7VJb0|dHt7vtb+M&J& zdhha6AxHZn89!W<0llRI`7X|oS4e!1#Cs&(C!zWJ23o4E8Df&)eJtc%8heMtCp6Ys z@JF0v*^)zuNcvn}qe+@ih>{+lXom0{%W&}MXqiYBueU6NYs%`c$_upMJ_+*Mu!D!z zwPUwxH-omJBd-m8YDp1QQ8Q6zG0=t_wrK?Dm`tNeKed`ymQy?$CvlS@$yKz{en3@2 gnVSAi1R1WppEeJipAp6y>*;2V=H_wd=IW3B2bfTIcK`qY diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/IN/__pycache__/DHCID.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/IN/__pycache__/DHCID.cpython-37.pyc deleted file mode 100644 index 79198f3e76ce4a073be4a8ab0754133f61804d1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1717 zcmZux-*4MC5GEyAl4Uz-vtr$_4$uZ{sDZX_v7iOAVJMdDM=`({l41h{44Nv^jvQH1 zNIHoF1p}50{R{SPV^8~+_`0V(?`==JqwEyjN1kwrO_;^(E5dAUP3(ztX-6$a4@lqn3s#e1igMjB5;plg z2u>o(NMtb@*~}W#$azUdl-bO=@*&11^O%1{BbR&Z25Yn6ieA#lXE#}gbz!~@^INRP zHq3nRk~k#lz`k$k*4{U}&-TuLGhHZnS_&2fA+)F2Ng_g)sAMNphumo4UDVRDP`prK zIWmU*{VOKV}(w6>NOCAD3X*k%NBqr<+VTXI%$AuL#| z{W#8wOvSOl0AO?^&qvx5EX@-swJR7Ns@p8)tw4LTs zco0)Su@h~p@<`y#h)o>2>EWz6lA5Z>1}}35{{^`{66Msu+y@u=HV9%l)S_MLgY@CM zMFaTGHyh}$*T2Snse*%I3&jPfh2mm(3;F<*?44~v3_*%EguhzQ+xd1$9ZqYNh2$ZGTofW4dsrtTn zAADZH895kTd+AIFxWEWlo%5nOB_PbdAMKa}a ztb;h7mTZ=z-i_nqS(2|TUL3PBg=r{$nU_k!V}aExZi3Jq^Bzn&6gv|i;Pgi*@TJ$i z)oYRRJO`(1eEU?iaS;}qd4_I-BDX;Jo@2RI*9mOkK@X*|_g(QGSfd`)_=9T>8%~QJ d8e02U_h#*@Z5qu~wEtO?+~>H70m!#}`(G&fnTP-Y diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/IN/__pycache__/IPSECKEY.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/IN/__pycache__/IPSECKEY.cpython-37.pyc deleted file mode 100644 index e45b77f37fc95d6f73c4f52ff986011afd1ab28c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3646 zcma)9&5s*N6|esOusxY%Ctt7&&T6xgMUq*DY=|Nhg=7?~n>H%pdu>Sz!Y{La4j-2^J>dGl+Bo3VR_o~|-PuNAYr(V5!Rqxfu`<%O-PRQ{6 z_Rkl7^_z2y{gVcZ&jxY_tt7x1H%4qw_r}1`V{>5X-fntlVEv47lUr{Xw^D294!t95 z;B(^%>)CH1h4mAHi_dA0^4CC8Mp6eRHy{l%xXm5z?l=ScE4FQLkNa=@fy3Y9E#7`( z4BXV?8@$8U-WW#)_BhK=@paGx(9iMH{EViDUoo2vTG;=*@*h5Wa{t~J_kR)p(O_&b z=!!Hc1P{Y5zB}2=SaioAr991(^j25yrYqy_b|FB@%I;oz(B-j=Yc_c>UR`#po8@vv z;7%;lSMfna%W9DgrAw3*5hoX(6cUei3X#d({aV6u*p)?hQm#r_PJPQcnp;htkFta= z^4|xz)$JE~dZqjD(aY=Im~)YqC5@ilI3D38c(EU6c{h*uo9*@ULE`_|LC=;_Wcg0L zZ<*pv9zVF(z5dD8rz$*teAQlk4izk~rMzZBS&)|ajTKQ(Hfy1ke*ut88WlS-XJ%zo z=G-(`WpiWC6gMlEn|qenLeKUBu_Y~T9T{K3{tn%|k5x8SJ(c#*nYjdqUgZ*hzJ)ml zbK{jcznMFSITv%&ybXC?WuIdtv$84{1(gjLRt{jRask_w2iV~Zw(0i;ERreX+VsOL ze;JQ5-d$J-S=<8GX7I`g-47%GS&y*7&e%KmeEQ|^y9$JzL5mX|UfjjsOa;6*tePxdx( zxbcD9Epoy(Yq{m-!~W*t*4M@dqJvXhK`TE3VCEUaH`dWy!#6kTW|*dFgrL;F>FFi= z;!*lf6S^RMbUm`FFVM;gpkhPBLFjm$n}>G(xgJ{>e+bL~<))^P^;~Z#A8QKP%wuU1 zZD!Thctq=c37gTD2WuF@I)=1|TiMbZ`m+FdI5)PPb1PON=tLqQK(Sl20HzxY8(3BS zbnP;S_Vr)cys%7PE7)5&g8lxZZ=Q7p5UnLJS8vv@Q~wMEow(>gvyERLXv zHwdHWahcw@o^2o0YInp2O}hwBJ6W#6g|um^%)M8&eO$l_p}|F3>&YUL>1+8J1|^Z1 zR!RtE)osHh%r&O#O9eG72_2ulH8gsQduZjK04i(7=J4RA_nO|XJgu`WjEy-%G_WgY zZXO1?4~hkjV22%suWw;wW8ML!RkddBoQY?T7%*?n%5CWngJB4N4riDhwr8C=n;Qmu zap&jAd9$?&nmTODQ?vD|4Xjf!(ldPBtNbdcI!7Kn-Rf(7{R^jMz0-qW2W~b&oWH4j zLMf7p?_zEc(y$Jb$^x$ZNuHKTJWdCltc=oP6cqy9wjO54Rx;bp;Nere3 zYn&YTG0jU9EHj_ruy#F@)@wIMIf7NM-&xfHe>ksKeWYcPqyK@Zvv!4aQdx5g5`5XI z-CUo74cADn4*gz#YG1m0_pVL=|Cd+yPAM0LF-fGd$8oavjxv<<3ROa??Le&KImBrK zX9&Fm4t=8jm_fbZyU7ln%GZkOBa;XD-!UTP{vOgOlLI1?*Rq_YEaYbHG%_5L zkyqfOO#Y7*KEw)r2JZx)*YJ6o?=$dGcKA2=f>~IhI;L1tbHMn_Un1%phM$=K+R{i)Qyb*67}rLn?a8LdrE2#k1ry6F z5sxAEDwvKV$-vgrUNR8^F>8RFGD`D0wA`eX`qX5o11CXQ%fBg(h})PyKr3$mFqoKc zT+k7NFl2kg49fkKN{%s#CZL&ZV*|f;V+tLsXZD{qt=}{Hy*8CfbTgDnVHE8bd@>@u z9YrrD@u->cqKFp>$S7sXQ6bAH(uIh)gtMuZu5R{IlrCKS5ESh-`Ua}g)ILc%8i8r) zT|Gmbr!zXSd#GV)?GFG39TZ5{juQYS1pI#l p8WnXlrt{1PG~qm^oUVl&?_Xm&QTsosZ+)9~FUgwl#QMQ~>uW!8d5-`9 diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/IN/__pycache__/KX.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/IN/__pycache__/KX.cpython-37.pyc deleted file mode 100644 index 5ee9c00c6d993c8a2b0dd89a34b1ebf4a53e3ec7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 388 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 XG2w3wA^4(k{7dpjQznBNfPwQDR6C*; diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/IN/__pycache__/NSAP_PTR.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/IN/__pycache__/NSAP_PTR.cpython-37.pyc deleted file mode 100644 index 4a78614dfe5a8db4b130585cfd2daf26e1598358..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 406 zcmYL^y-ve05XYT3G*LwXRYGD!Y#ovetf(q1h$X5hESAtIU3<^wh*|ReAE*|l0=;(Qsyx=k}gq3 m_+3%-y6VBb%F04l(in-!Y}4R>zbysSyA3Y3ca4XCv>S4j z#KIZ{Y8QFzFIebH`wRVqega?nls_o?)EQEe7574!L(c4QmNRo^)_2?On85h{=L_Hd z)F$K)Wah(#%^jF(3kWBi79_DNO_<@G+3F_jbHW*S4heSz8+Zf%z)1p5ACa#622PV+ zhIBsAG7iOo2$E1vz!FUyw87n{PU5~MJCu9eKMWI(zr!OQAJW7Z0bk=Qymd$qXcF>w zd7H0-JOcSSeu|$q@|d6JXZTr=ue>HMNm_7=3z|LHp8WY>yCX$bO1>V)9T<1=7k$~O zq}UNsj52YnQ$G_+eCI{K7z?Xf?^Vl>Zguiey<}wAueLTftpU65jQYdnvvUnTQtS9= zy$7UIem4-=2}7?wzIJV437LN}Wp)1BmJ;C2!~6F-o7ZpN(DAX4+P4?c0jy{x^Gz}c z!4*^Ez*HXssYy*6a=?yQLmM__lr&C5Qm1i&x{U|a;{?J>dtG09YFr5^864DMn&zXt zPE(1-BwCdo5KwcKD0Xxpc~y_()3sI*VaZotTw8=x|)wv-7ku( zH};;Zsv7TZKnSY6`dK-`-G;TMHooj_JlI~Z_GAEW{Q#y4fe?C@`tX~qz{B|!dyg}` zB#wCmzJ|T}2uMQ)m&yIo)6rLM~kFJpo1#+Q1>e!jdMh%WZ#FC!WuLIq!*l+GT4KRlPTQ~n{XiwLF!Bi zB%fd)8ovpe@W8Waca!+3sM9eN!}Xgw#64nLuELv=09jEM-AFrGp(Nf#V#Co+UGB>Hb_po8|}z)XdK=IWrd~*3u#DOG=>?{NedibC}s2Zf`G$mT)z#Q8ggl}23Uq{ z(j&;;l%it;_sDC&^~RYxhWD3wgK@|%yZl8r(7vkWIIFc=^|M`bb?v>Bc`aZVg2qR*{ExkOX3vqoEbQ6yzcumfd^|%I;HrrYvK$la zH`q(Mp*#59f?<&sOr2NCDHv-4nLE!lm=Yg6}blIkHMF? z=0uQ=Ga_q-&5UTvp%iRWgEAoqe13Y|mZP7WlHDDoFlsN`vO9ge}#;ExXOl3*~0ksAd z^N-d99qjRJ_OPcT+s0mw(N0qxr|Gcd;{x}sG<`nq7qcfpn({IOF?4NJl(mA+kJyxF zf#?;}$cF;DG?(X4j3_s8G>t;HXT3fXMFA%lx9?JkD3{pv%!lP7Y!s$5j9nJ9mLGeJ zwxZYvx@I(Ha7o(uXpuMRF#8H)`cdFL#Ko96e!tzBo*Uk_u78Ri Mnc@sh4+@>X0Wa1YQ~&?~ diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/IN/__pycache__/SRV.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/IN/__pycache__/SRV.cpython-37.pyc deleted file mode 100644 index b02c0f9fbcc16552714de2ef57084722d6fe77fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2327 zcmZuzOK;mo5Z)!14^dK_r{ka(wP+4H#BS3^(zIxUrcGTG(7_3MAW{%2cV$ziL}hms z#{z{GwTt`>2|e{M?X{=;g`PUIq~u4l^3FauGn~gaLx0^?C!mSOF6!Wnd;2VAZ^(dhp9iO5?D3mC;>}YU`y$}Cc#F4B=?RTPzR9of4Y+T> z{cV1gU$gfS-{RN#4Y+T({r zKkDcMu|8D{`gn47^{A7L^*O;Kk?kMoO03$S6IwmIC^9KzEr7dDF|hAcLcYpUaZbA8 zyC|#sa$nTa)xL93sM;WF=!%1n)%LhQ65Bl>o#NM_NNYAF#G}sM(`Bqz?oDQW2}9ZE{KB#B!xpse(OdZiE4=LAwf zd)>fzYB~{8Iv{SsB+15^P7;YKCF+(Q5+4ZgG9~hX2_#SRzEZ}Q9Q}JIGc}DQv2025 zH~IIA9X*=tOtQ(nY^-!Y&+mP5{8CLO)59Hz%H&ud6l2`&R4UcZkG&m$#rEV_hWKun z%2o!wPJR2Eweb1M;NJ5TO~!!+2n`*W5Sbw>*??_gES%n~ zd6#$UKh^cD&*oZsP!vieQsjM|y#hF1@)j5y@DAexR`;{9iB_C5VVuJwt3|efqas(3 zH_%0*#cTZ$92AC@&@1qpHPNH`S!(a$5qgb@egaeN0x8`ES(3S5uR*AX=k z005Bgr2~6+;VuaPfnWe2`9T?$jT660KZ_&4ZZZW#fBd-#agP9%8}Obuz@sSgZe-jv zR}w9eO(4eA#i6{4$7@L50hY@yHwLm8S*Je(358)GPDt?=(H78I8=YTsrK^^NnZ!_7 z_dkV=hFo6E;gZc+Nf%zpmJ}Tw`isCi>n>di4YJBEdw+L#w;LK?X*o?blvF=GykxrZ zj-ca+D)pG9qfClbhS?y?g$dJQG?79n>wg^S11SVljaHXjmhXYF-@vRhya|r3GmLuI zWek1(EW^LUp>`3=mT~7c`O~>Wmd*=z9?V0?DBL|D;IhY^hh*+)XXq|i>2iWOuec!; z&I@NA&6{Pj^bTG50=VES@CPlS^bZ?yTt*NiAJ7uj$gsF5BZ~~TH?!e-i;?e!atjvY zPsbQC<3gDlhA=TzR?!*L5U*1)(OEH$8&3;4`d-RHT6lC@@)pRS!6#-`B1orFim{G8 z$#XHT@bnHS#a=p9f?p2r2cYvim}(OUaeTUE(R35Syu#HvOxb{=avZoKzAUD0!Uiz2 z?hw!&E6hN5bgJ^jYUsMQ&d;I#Vo}?Y*#ky}os`hoEyVNxx(D=`=k@Gi|HWe)`!2>a zNlcU^qk>O!+_#eC<+PvIPl6=jMGDu@S5;nU1zj3jqr3scG;OOL3FxC--o|T$pTr

A*vRoZEbj6Z+II(Wf9Ep$~lRlfFWpGQ+)-RqtWR;c$lJ4uA8Td)V*C1fFmH z_1agv*9iF^4%Uwc!YA;`FQH+C(UK%>PZMg#PU70$v%ORLlOPEw;ba*y_nan?l{}C- zeIM!z7#@B&sRqaiiHsmQ8BZd{c&#+|Yz$C>qmr@==i&~Sn$ zNE}9CXNS4WJ9HE8dvZYSE>YsM>#W1#7c>cY$ZoJM>%E{0I1#(a`fLOA9nf#FYi!f% zp?rM&YDZj{ee`X zs1C0{0JIF6xC$mEFDd?bM8>0T}@I~d(e8y*S-oCj@(m$ z_7`B8h80NIGXfE$qhVxxIc>NQJ}hUVG%cz^rK!NJM2Nb$kVPd`R^{Auo}DS436Y(N z2T6!FbwZY_tuV@PMTVaH2pXE>BAj0X?B{TdDpI7mhZlIb}XA_ zdbGnT*_^4b>k6fvb~U;4>1YRT`EGM2FbRGOuk1lX=nWdcFQz?b)1#-&dBkwN0NzkX2ktfoJQxWIC%C}i zU3?48PjoPg?#RI%Hn<~)k#Im~+>%!|ZYIc@hF8qE02||t>!NxY*4RjAxouYmZ267V`LOr?-A>E`s z`X=2=7`GOh6rIxa)-vHyw>;Z>;lp zFqujanP&}8`h`q+U8c2w?!fpbSvlneES6@(HgLXMYf)7N!p?N-j=TyKLh@5vAgm-4C+V_=06BOEyy_rd6IPp0>O- zyk^|Ilwt$T5in3N>Lc+w4&T7$l4M%6`!LI^1SmzEB>i>tEIP%T=uS)V7W%yc;m(1m zC)Nx(Q6iFw6H)xdP7M6u0F)zWkta5-K5#s`VWl430_m4vG3z7HFW1V~bqtviUkmjI zAZWS--W@wj;My^yI)X*{%YY%BgaA4ZEsz9&k5M9H011VP48U+kGw1Dx!;bNvi$Za6 z7Zx;L(VXm=PEo<7XR2a5D7lI9deUH}YvYPc_iB7F z#h({~{|)9OQV+4;d?mGUHb+-{kYZ7`-#Z3Dkuik|gH^?2^cMMtbDP*ShJ zS98u^F(qL90Z=UvrF)M6xmte>sfYec-zI&VHjp&BW7EbPU0~QTL>CzIVPFF!-UoRV zpGwu4xQF9lT47|ce=f3S7>iv{zl2-j;dhxZp9%qpP5`IKtQLR&54~3-)*=eM8LZgW z8s{~jL&Vh9RivN|-09QR3;&Kr!yeXA%*ix`{7NS^o0cf|()4(mm8+RBOt=3xe|CeyQ-t-#8c_h3CFc{(=x0b{sbGp0>Z*NlCVRt5OQ_l(L7 zr@Z2msu5D%Cl}pLaK3+~*a+Uqmu;gRZBc(HXq-~Us-}{RO?lV5mzyo_>vDFY^N$p4 I%QXJ0ADp32=Kufz diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/__init__.py b/env/lib/python3.7/site-packages/dns/rdtypes/__init__.py deleted file mode 100644 index 1ac137f..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/__init__.py +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""DNS rdata type classes""" - -__all__ = [ - 'ANY', - 'IN', - 'CH', - 'euibase', - 'mxbase', - 'nsbase', -] diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index ee835b0199ef9bc6d0d9b326f4c27fe4b6cf9ad5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 255 zcmZ?b<>g`kg8Ic0vDcUx7#@Q-Fu(?6H~?|61dvE!h+;@#Okql4PGL!5O<_xCi(*V+ z4`$Hhs1kGW3sxvfNi0cJD5)$+RY=ZBEG|whzQye57kP`x(=Uq2*&~WQwKOv+u{bq~ zEw=(f=M{r!KTW1v?D6p_`N{F|AVy+NPJH}Ih9Xv=onYdZwSGx%fqp?|fo^7AaS2df z*SNBzs(l1H@SzoLlAD@|*SrQ+wS5SG2!zMRBr8FniP6*@? M9w5QO%)|(T0H}LJ;s5{u diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/__pycache__/dnskeybase.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/__pycache__/dnskeybase.cpython-37.pyc deleted file mode 100644 index 66641daa0babd6464cc6e87ad3b82f1f09a88103..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3659 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 JP(N5j_J0xDNsIsh diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/__pycache__/euibase.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/__pycache__/euibase.cpython-37.pyc deleted file mode 100644 index 6be97eaf15f50d5d48c9e231d0795b3161da3afe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2180 zcmZuyTW{P%6rSUq%H7ZA*i~7B$ZkTDXLH@ZK0yt2YSU)WjUVN#EI8-W@a1j z$^nTj>J$HAS3L1g_ytJ#m8blLK5>q{+p4Iun&X){Gw1r9v$t1PJObmFKQ2B02Uh>$ zW;qO4+=3}@0AYmDlmzXU1{&CAXZn8CFp^T?X&fz9Yc(lgKDCF%EQ zZIvR*4tR|F;+VGKEE1`hv%~V4mm0xRtz!gg;2Y zGEs;mQ+s|{Zto|`zgsGvG0yzQS#mPs{(Z(Xl?)Ot{Hq{myDWRH1T`-ByAq@VNe3-g za=zz_LHyOV8`pPKscM~%l6dJjeodG<2H_qMMHH>bRGVoPt+csDiP9^53TH>gu`X^Z z2<{9*i+iSR68sLdEi$LS(n_yL=r96K>-~ujMt&}R!6Fs;hmrJE4xbm?hr|7`;_}=9 zeLc4}<*497pb51ThDnyFFs${IXSIVDLtN=BleNpsm=`L^v%tNVi{V`%av{)%o>3c; zr-RxSEKVaSYfCT;Ov|OU8-~q!82(9K@9nB#v0Eg?c9KaIrRnzd@rf*o(eW;*DaPtB z&v3Qd%8X>`(2wE2(!6{fbE}aa03AA#)qTqSSAzxn)3vo@QM26lMJ%VaQa zJOsaakw!7^8KR4qtXw1qNmhG;r;$otfRtK0J{9Z0Y{><@W~)3@yi{MnMxtIqCu>Vj z7QEQPa~K_%Xu-EI<=;RmeMaWw%z`hS6M%|VSq)TlfXX#x9GNq#fr{P&MA;0Tc9^~i zm3j$kcB-G*<<-i*L!SF*PGwcjWx`B&{b2DLPTIF851x|Bnz_tm_FOx&#v96;b>O5s z2k@P_Pf50C5VfLK2imbG{-Wf}qhxYvA;(c`l{clWtf$yRfd8}ijQm70?HRxr;a<5@ z9a7--C!gNWijnd$H2!cT)f?o-hmnY4#f20b5P@?{@i_$|J_IuPF z-FZ09R8+PFfO!)xl8eZ5_LD4r4E{V zom!7mDOOO@DoWB-ek?BG_A+h_G$hzqdKWVAHB4A3Yns#s)_JY*^8XNX2O=LfAlm^U z(g#8`2a0BuTC_{Is0Y-6*`*qk(Xs#843d=BPMi-5!KG{+drv)_CW3zh@7`Ar$cwQB;K1ylg2ogd7SI3< z_?Z{UZ`x(j)P}u4mfau=OoKn7QFbb#qUVS!@aAo}0|TYkc03XST73X@j!AFgk80i@ zSbTE_xDu}r4LZ@g!9#ve>pxmdFreS-VxP^TA%{Neh2bz~qZHTOFgzJW>4Ia2Ayuqnr+O}6dt{aagT~Myo9Z%>Gz0N ziFM>yhGv;v+tW4L-9Xy#Ax1uM0~ea{PSf_98VEYL4>6OG5)J&f@S6D}g0Ok{R%yFx Ux}9^gb@gl9No;ElAhE0e2e@b+-~a#s diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/__pycache__/mxbase.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/__pycache__/mxbase.cpython-37.pyc deleted file mode 100644 index bb631651bf2e638cd9d7ceef5d1759c8447da59c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3512 zcmcInTW=gS6t+Fr-R!2Ngf=Zj8juRCXcI0{DHWhn%1x+?)D|fkK%?o{NhX<{S!{39 ztR_MtMg0xDWyJ&HfAA~jm8bp%o;b%ddr2=y6~dCQbL>5r&!5j;?{?b+%1^(o{_yKE zA%EdyT5K3xgQ~Wn;UpxSa+c8n3mL_+m06)>dOLJX?>4;`I$scObLRo!j&OGToz|fh zwqecX9;|ty4f7?K`@9A7mYH|Bb({3s=Rj)y#iKZnvWJj!|C7S>;N~o6-DM_6#YT|{$O1XhU>$0cqz@5j&ftXuUp2tq<-apw@=_(t}@o1FCYNA@me=>G(t)#kHw!{W}RNi)Cu` z*DzM+p()7@Iij_}2Q~)>?6A__WT(+w)*m|;cyK}WEMr>rLb6>HN<>m*u}<%$dfyn; zbEFSvRc;~Etu(LN)9+(ZvE4nhS9U<6Zn`Mz=_1nNzP<<(WiU^d>3F$Oz4@3Jt3U#e zN8LX~>35+its^oa2QKs!dav{#YunWYeFD=1nnx_(mS;4;Mrk&OXz3>V0-6s z<>MGpBY`hS=;2fpS(14A3{%wu-RbD+`{s13-L zY5Q2D@X&<8cP!YWT_#evanTmg-#P+&CiKjL=8ilAa&i@$nQyBusLRtW0T<$KCVI?3 ztd7EQD9Kk~<3~^%79R@o|@T}y6&l(XahOiP!O-Im-b{Ufh*C-lH? zAnBF9fuz+RL+Bo%&w9S`LgkKf3}0ozeXndpXH~-ry7ykMIN?3FXZ4eDGO;( z*=x%cIA)I8&^9}~WF&!&b?8W*iM)2;%*&yZjFjMy2OR0}6Q~N0BVM zMbF)WYJStVZMJL~Z$2H6i2h@M1n5DI+5pnP&;b~_)#{?!H|i*-`4#|j^uGi0DRBIc z@LEUzp*x=kUYqFEhQ)$sxnl}66G`{kVf>c}qH;0*7G50RvYEt{Ue|!2Vrfw$5ntZ0 zi|O<1Wsw1{wQ$Yk{qS$1$*%DYfjQ@oi?BgZL?%%pOD;(# zjiF$`lC6Iu#;}L|CB5!xe_>BMhm!3&>C0&Ih$0WkkLP?mM^C!lHi7cX9~(c9*9iF= zU*^Sz#$%}Jdk~z2gj3EkI$|NC*tRk&w9V6Lo^EJACEVuDIpL1554;2a%nDo3=W-AF zJkf&pHn+A(-=E$ZZr{(+LlNx6N(4z3D<#z6AJ~laY2`gR(L#Oo-7vw9c|lBA)By-V zLJGJTr=i8!9u4i6WEXI8``iy5{s#BBe@;VJczm6=c>A25(a`6&_!{p(e~aJdUEYIM z8#M0lYy7&=SmPV~2EPgYotMNWVHeQet=!@E6TmtB9c7I+*ezrrd933=@5eewRbb8& z=fQA0kRmB0AGF&6l*j2&ECU_OJ)s|gwrJWx9*;y&?3ymKRIRR0#&eZN0ngO{^#((u zymKHDUAgsQ$=o9N#A=~+?t#!m(~_LA3s%yS&A?}+Rg%c!1kOW;eYPJ zX`bpRlDG&A+Dc@*l_$AzOyx?BnCeklwW7%MN6}y8--lazG~ODg%&%XOpVvI}!V4_`%*^}WhUG9`WJlr0dIrHey( z4PURLz%4HWZ|%xrWT0=tsKU8~`LsiQI=$Y&U#P6m3GHnTunvu-txIcWK>%oI#A-{U zd5%*l`gUzvdpFHQ(~T{xvXqo-cuaBuE#x3b`RR5p6N zs{Mrqs9NGhBE~u`^04(~AxB?GSxDpQeoLZLmP`n3Gs8%$`}LMNFh z!7q_Rz70bUp{gDT!q#aUXo0`>C2|;tpcAm*bHVOaa?BXSm`mg^B<@?UxWkb35*v`| z#=;F7HX5H?xx#%meAd()7c$NDV-CZ)KrV7#vzp<3b9@M3fSngc~wzMVi-O%2X0dDpVig!`G zhXT)7Q}zRFy`G+Exu;Ogp1y6fo@K1rUo(qTEG^7Q!Y+P&EaH$vO2d~E^qH>}_?&7! sPB7xYmr&^ZfDc3M+C7W?Yb5A~%KxOko}c2aQ`lv*4kRV`S?ins0Tk|A9RL6T diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/__pycache__/txtbase.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/__pycache__/txtbase.cpython-37.pyc deleted file mode 100644 index 236dec78d0e5e00036368ff925737f568eb31083..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2470 zcmZ8jTdx~65VpP7+|D^|fwoeSma7PAdqAa7DpZwndjKNT9w=G~t+s3DusNIEt?jfq zVIw3?QU3rxAQ4aeCBO32zrYL3c#{Lv8{cNe_RRR3aqbKTT>|Cj-!J??288^HlWlQf za2u-n3K~vg!YOA3jj8Qf?AYGj^q%dV!k-3lFb(67k}n8%x%Y%{PdJm#q;CsBoyHDr|jYEEh_jn)Z9iX4( z1HNPF-KWGQaSv2IX97_54k)=e!M0U38doxsJk@EWe@u0htH>IYMj#wXkyVm+yAhPz z`J+@utqJNTNQ>>HWuu8(%1zir>8Kh0SDj|IvRG2r)IT~63;ealH_Hslf-m$m6uAVWhNv8 zmPEZIDrtOCW)&C4PwQHgeCQchiDGO5$?g3cUvhNEM!Ge0NKGe6EI Ab;K5*VB5x z&g(1on4-9H?f9Xp>)FvhFI9c4f2>Lz?YDcWeLdF*v8(m53_y!Fp{ldc5PFt&;q&3c zKBSAi%}rn3S~EJxP<<@8HiY^mRCNOyPM0oJ51dCP1l$)b{l?{NMH^4EiL-JWe@)ly z18^dDmfpj?`=oKfdG5%Nh5ys?RrviyqoKF47a%oFwQ)ds<5_IQokXZCt@H8mFpxbs z)cBRm5A)J=r6^LJKgt)vu%pMu0W*zXOEJ#phAO!S!fkT~mj${?w3zF6VWRrb5bDC$ zrx(!f-L2glsmw^MHzn?%=D`*bM(w{FHXGPXzMFAf{6Rg;p$V=Z47&&Y34fHPd z+5_YSoUZ9FREJG4>6}3RICACP4aY$a(wCv`HlgkT?#jkr^_$S5&2Pu6!J4%5`vms! zVHfv^$=`67$qwv55a&R5z`5RNaYoE*k!iuBbQ4(5{sz?-yDgw1T~$$0m4}i7b+~Js zL!nJLE3K}zKY??e3m5BVsQp}AO4?iBeNCV>24{=gdR%5eimT_j7$ zi`)h{(Af;TZC`W99T3v zBMZ`J7O9?vntTP6i94S|vS{7p&&tO#ttDza?8-Nw`xij5i&mK+n@I_XjUlf9B3pMM znB+UypyQtRS_>syeE?jA@IxqJp4@&f*wGGs4nnwQ$VLa7I>OhYk1s@-P6fUYNiwbY ztiW+Uf#6Du4JSwvUS&XrjIWAHt0b{GTfPj3o1T3HrUEiNmu~?@Vm6c4kvG^p5t%3o zSacc|Ln?Ps2$P_FsnArL{zKnoKI`|oAwJCH%DkPJ)n3^?#nemvATVF8)`rC;Y2iJF@vX{HS%wEqs}5f_7QRT1W3W F{{Yd*U=#oV diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/dnskeybase.py b/env/lib/python3.7/site-packages/dns/rdtypes/dnskeybase.py deleted file mode 100644 index 3e7e87e..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/dnskeybase.py +++ /dev/null @@ -1,138 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2004-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import base64 -import struct - -import dns.exception -import dns.dnssec -import dns.rdata - -# wildcard import -__all__ = ["SEP", "REVOKE", "ZONE", - "flags_to_text_set", "flags_from_text_set"] - -# flag constants -SEP = 0x0001 -REVOKE = 0x0080 -ZONE = 0x0100 - -_flag_by_text = { - 'SEP': SEP, - 'REVOKE': REVOKE, - 'ZONE': ZONE -} - -# We construct the inverse mapping programmatically to ensure that we -# cannot make any mistakes (e.g. omissions, cut-and-paste errors) that -# would cause the mapping not to be true inverse. -_flag_by_value = {y: x for x, y in _flag_by_text.items()} - - -def flags_to_text_set(flags): - """Convert a DNSKEY flags value to set texts - @rtype: set([string])""" - - flags_set = set() - mask = 0x1 - while mask <= 0x8000: - if flags & mask: - text = _flag_by_value.get(mask) - if not text: - text = hex(mask) - flags_set.add(text) - mask <<= 1 - return flags_set - - -def flags_from_text_set(texts_set): - """Convert set of DNSKEY flag mnemonic texts to DNSKEY flag value - @rtype: int""" - - flags = 0 - for text in texts_set: - try: - flags += _flag_by_text[text] - except KeyError: - raise NotImplementedError( - "DNSKEY flag '%s' is not supported" % text) - return flags - - -class DNSKEYBase(dns.rdata.Rdata): - - """Base class for rdata that is like a DNSKEY record - - @ivar flags: the key flags - @type flags: int - @ivar protocol: the protocol for which this key may be used - @type protocol: int - @ivar algorithm: the algorithm used for the key - @type algorithm: int - @ivar key: the public key - @type key: string""" - - __slots__ = ['flags', 'protocol', 'algorithm', 'key'] - - def __init__(self, rdclass, rdtype, flags, protocol, algorithm, key): - super(DNSKEYBase, self).__init__(rdclass, rdtype) - self.flags = flags - self.protocol = protocol - self.algorithm = algorithm - self.key = key - - def to_text(self, origin=None, relativize=True, **kw): - return '%d %d %d %s' % (self.flags, self.protocol, self.algorithm, - dns.rdata._base64ify(self.key)) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - flags = tok.get_uint16() - protocol = tok.get_uint8() - algorithm = dns.dnssec.algorithm_from_text(tok.get_string()) - chunks = [] - while 1: - t = tok.get().unescape() - if t.is_eol_or_eof(): - break - if not t.is_identifier(): - raise dns.exception.SyntaxError - chunks.append(t.value.encode()) - b64 = b''.join(chunks) - key = base64.b64decode(b64) - return cls(rdclass, rdtype, flags, protocol, algorithm, key) - - def to_wire(self, file, compress=None, origin=None): - header = struct.pack("!HBB", self.flags, self.protocol, self.algorithm) - file.write(header) - file.write(self.key) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - if rdlen < 4: - raise dns.exception.FormError - header = struct.unpack('!HBB', wire[current: current + 4]) - current += 4 - rdlen -= 4 - key = wire[current: current + rdlen].unwrap() - return cls(rdclass, rdtype, header[0], header[1], header[2], - key) - - def flags_to_text_set(self): - """Convert a DNSKEY flags value to set texts - @rtype: set([string])""" - return flags_to_text_set(self.flags) diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/dsbase.py b/env/lib/python3.7/site-packages/dns/rdtypes/dsbase.py deleted file mode 100644 index 26ae9d5..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/dsbase.py +++ /dev/null @@ -1,85 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2010, 2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import struct -import binascii - -import dns.rdata -import dns.rdatatype - - -class DSBase(dns.rdata.Rdata): - - """Base class for rdata that is like a DS record - - @ivar key_tag: the key tag - @type key_tag: int - @ivar algorithm: the algorithm - @type algorithm: int - @ivar digest_type: the digest type - @type digest_type: int - @ivar digest: the digest - @type digest: int - @see: draft-ietf-dnsext-delegation-signer-14.txt""" - - __slots__ = ['key_tag', 'algorithm', 'digest_type', 'digest'] - - def __init__(self, rdclass, rdtype, key_tag, algorithm, digest_type, - digest): - super(DSBase, self).__init__(rdclass, rdtype) - self.key_tag = key_tag - self.algorithm = algorithm - self.digest_type = digest_type - self.digest = digest - - def to_text(self, origin=None, relativize=True, **kw): - return '%d %d %d %s' % (self.key_tag, self.algorithm, - self.digest_type, - dns.rdata._hexify(self.digest, - chunksize=128)) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - key_tag = tok.get_uint16() - algorithm = tok.get_uint8() - digest_type = tok.get_uint8() - chunks = [] - while 1: - t = tok.get().unescape() - if t.is_eol_or_eof(): - break - if not t.is_identifier(): - raise dns.exception.SyntaxError - chunks.append(t.value.encode()) - digest = b''.join(chunks) - digest = binascii.unhexlify(digest) - return cls(rdclass, rdtype, key_tag, algorithm, digest_type, - digest) - - def to_wire(self, file, compress=None, origin=None): - header = struct.pack("!HBB", self.key_tag, self.algorithm, - self.digest_type) - file.write(header) - file.write(self.digest) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - header = struct.unpack("!HBB", wire[current: current + 4]) - current += 4 - rdlen -= 4 - digest = wire[current: current + rdlen].unwrap() - return cls(rdclass, rdtype, header[0], header[1], header[2], digest) diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/euibase.py b/env/lib/python3.7/site-packages/dns/rdtypes/euibase.py deleted file mode 100644 index cc5fdaa..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/euibase.py +++ /dev/null @@ -1,71 +0,0 @@ -# Copyright (C) 2015 Red Hat, Inc. -# Author: Petr Spacek -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED 'AS IS' AND RED HAT DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -import binascii - -import dns.rdata -from dns._compat import xrange - - -class EUIBase(dns.rdata.Rdata): - - """EUIxx record - - @ivar fingerprint: xx-bit Extended Unique Identifier (EUI-xx) - @type fingerprint: string - @see: rfc7043.txt""" - - __slots__ = ['eui'] - # define these in subclasses - # byte_len = 6 # 0123456789ab (in hex) - # text_len = byte_len * 3 - 1 # 01-23-45-67-89-ab - - def __init__(self, rdclass, rdtype, eui): - super(EUIBase, self).__init__(rdclass, rdtype) - if len(eui) != self.byte_len: - raise dns.exception.FormError('EUI%s rdata has to have %s bytes' - % (self.byte_len * 8, self.byte_len)) - self.eui = eui - - def to_text(self, origin=None, relativize=True, **kw): - return dns.rdata._hexify(self.eui, chunksize=2).replace(' ', '-') - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - text = tok.get_string() - tok.get_eol() - if len(text) != cls.text_len: - raise dns.exception.SyntaxError( - 'Input text must have %s characters' % cls.text_len) - expected_dash_idxs = xrange(2, cls.byte_len * 3 - 1, 3) - for i in expected_dash_idxs: - if text[i] != '-': - raise dns.exception.SyntaxError('Dash expected at position %s' - % i) - text = text.replace('-', '') - try: - data = binascii.unhexlify(text.encode()) - except (ValueError, TypeError) as ex: - raise dns.exception.SyntaxError('Hex decoding error: %s' % str(ex)) - return cls(rdclass, rdtype, data) - - def to_wire(self, file, compress=None, origin=None): - file.write(self.eui) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - eui = wire[current:current + rdlen].unwrap() - return cls(rdclass, rdtype, eui) diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/mxbase.py b/env/lib/python3.7/site-packages/dns/rdtypes/mxbase.py deleted file mode 100644 index 9a3fa62..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/mxbase.py +++ /dev/null @@ -1,103 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""MX-like base classes.""" - -from io import BytesIO -import struct - -import dns.exception -import dns.rdata -import dns.name - - -class MXBase(dns.rdata.Rdata): - - """Base class for rdata that is like an MX record. - - @ivar preference: the preference value - @type preference: int - @ivar exchange: the exchange name - @type exchange: dns.name.Name object""" - - __slots__ = ['preference', 'exchange'] - - def __init__(self, rdclass, rdtype, preference, exchange): - super(MXBase, self).__init__(rdclass, rdtype) - self.preference = preference - self.exchange = exchange - - def to_text(self, origin=None, relativize=True, **kw): - exchange = self.exchange.choose_relativity(origin, relativize) - return '%d %s' % (self.preference, exchange) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - preference = tok.get_uint16() - exchange = tok.get_name() - exchange = exchange.choose_relativity(origin, relativize) - tok.get_eol() - return cls(rdclass, rdtype, preference, exchange) - - def to_wire(self, file, compress=None, origin=None): - pref = struct.pack("!H", self.preference) - file.write(pref) - self.exchange.to_wire(file, compress, origin) - - def to_digestable(self, origin=None): - return struct.pack("!H", self.preference) + \ - self.exchange.to_digestable(origin) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - (preference, ) = struct.unpack('!H', wire[current: current + 2]) - current += 2 - rdlen -= 2 - (exchange, cused) = dns.name.from_wire(wire[: current + rdlen], - current) - if cused != rdlen: - raise dns.exception.FormError - if origin is not None: - exchange = exchange.relativize(origin) - return cls(rdclass, rdtype, preference, exchange) - - def choose_relativity(self, origin=None, relativize=True): - self.exchange = self.exchange.choose_relativity(origin, relativize) - - -class UncompressedMX(MXBase): - - """Base class for rdata that is like an MX record, but whose name - is not compressed when converted to DNS wire format, and whose - digestable form is not downcased.""" - - def to_wire(self, file, compress=None, origin=None): - super(UncompressedMX, self).to_wire(file, None, origin) - - def to_digestable(self, origin=None): - f = BytesIO() - self.to_wire(f, None, origin) - return f.getvalue() - - -class UncompressedDowncasingMX(MXBase): - - """Base class for rdata that is like an MX record, but whose name - is not compressed when convert to DNS wire format.""" - - def to_wire(self, file, compress=None, origin=None): - super(UncompressedDowncasingMX, self).to_wire(file, None, origin) diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/nsbase.py b/env/lib/python3.7/site-packages/dns/rdtypes/nsbase.py deleted file mode 100644 index 97a2232..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/nsbase.py +++ /dev/null @@ -1,83 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""NS-like base classes.""" - -from io import BytesIO - -import dns.exception -import dns.rdata -import dns.name - - -class NSBase(dns.rdata.Rdata): - - """Base class for rdata that is like an NS record. - - @ivar target: the target name of the rdata - @type target: dns.name.Name object""" - - __slots__ = ['target'] - - def __init__(self, rdclass, rdtype, target): - super(NSBase, self).__init__(rdclass, rdtype) - self.target = target - - def to_text(self, origin=None, relativize=True, **kw): - target = self.target.choose_relativity(origin, relativize) - return str(target) - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - target = tok.get_name() - target = target.choose_relativity(origin, relativize) - tok.get_eol() - return cls(rdclass, rdtype, target) - - def to_wire(self, file, compress=None, origin=None): - self.target.to_wire(file, compress, origin) - - def to_digestable(self, origin=None): - return self.target.to_digestable(origin) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - (target, cused) = dns.name.from_wire(wire[: current + rdlen], - current) - if cused != rdlen: - raise dns.exception.FormError - if origin is not None: - target = target.relativize(origin) - return cls(rdclass, rdtype, target) - - def choose_relativity(self, origin=None, relativize=True): - self.target = self.target.choose_relativity(origin, relativize) - - -class UncompressedNS(NSBase): - - """Base class for rdata that is like an NS record, but whose name - is not compressed when convert to DNS wire format, and whose - digestable form is not downcased.""" - - def to_wire(self, file, compress=None, origin=None): - super(UncompressedNS, self).to_wire(file, None, origin) - - def to_digestable(self, origin=None): - f = BytesIO() - self.to_wire(f, None, origin) - return f.getvalue() diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/txtbase.py b/env/lib/python3.7/site-packages/dns/rdtypes/txtbase.py deleted file mode 100644 index 645a57e..0000000 --- a/env/lib/python3.7/site-packages/dns/rdtypes/txtbase.py +++ /dev/null @@ -1,97 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2006-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""TXT-like base class.""" - -import struct - -import dns.exception -import dns.rdata -import dns.tokenizer -from dns._compat import binary_type, string_types - - -class TXTBase(dns.rdata.Rdata): - - """Base class for rdata that is like a TXT record - - @ivar strings: the strings - @type strings: list of binary - @see: RFC 1035""" - - __slots__ = ['strings'] - - def __init__(self, rdclass, rdtype, strings): - super(TXTBase, self).__init__(rdclass, rdtype) - if isinstance(strings, binary_type) or \ - isinstance(strings, string_types): - strings = [strings] - self.strings = [] - for string in strings: - if isinstance(string, string_types): - string = string.encode() - self.strings.append(string) - - def to_text(self, origin=None, relativize=True, **kw): - txt = '' - prefix = '' - for s in self.strings: - txt += '{}"{}"'.format(prefix, dns.rdata._escapify(s)) - prefix = ' ' - return txt - - @classmethod - def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True): - strings = [] - while 1: - token = tok.get().unescape() - if token.is_eol_or_eof(): - break - if not (token.is_quoted_string() or token.is_identifier()): - raise dns.exception.SyntaxError("expected a string") - if len(token.value) > 255: - raise dns.exception.SyntaxError("string too long") - value = token.value - if isinstance(value, binary_type): - strings.append(value) - else: - strings.append(value.encode()) - if len(strings) == 0: - raise dns.exception.UnexpectedEnd - return cls(rdclass, rdtype, strings) - - def to_wire(self, file, compress=None, origin=None): - for s in self.strings: - l = len(s) - assert l < 256 - file.write(struct.pack('!B', l)) - file.write(s) - - @classmethod - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): - strings = [] - while rdlen > 0: - l = wire[current] - current += 1 - rdlen -= 1 - if l > rdlen: - raise dns.exception.FormError - s = wire[current: current + l].unwrap() - current += l - rdlen -= l - strings.append(s) - return cls(rdclass, rdtype, strings) diff --git a/env/lib/python3.7/site-packages/dns/renderer.py b/env/lib/python3.7/site-packages/dns/renderer.py deleted file mode 100644 index d7ef8c7..0000000 --- a/env/lib/python3.7/site-packages/dns/renderer.py +++ /dev/null @@ -1,291 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2001-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""Help for building DNS wire format messages""" - -from io import BytesIO -import struct -import random -import time - -import dns.exception -import dns.tsig -from ._compat import long - - -QUESTION = 0 -ANSWER = 1 -AUTHORITY = 2 -ADDITIONAL = 3 - - -class Renderer(object): - """Helper class for building DNS wire-format messages. - - Most applications can use the higher-level L{dns.message.Message} - class and its to_wire() method to generate wire-format messages. - This class is for those applications which need finer control - over the generation of messages. - - Typical use:: - - r = dns.renderer.Renderer(id=1, flags=0x80, max_size=512) - r.add_question(qname, qtype, qclass) - r.add_rrset(dns.renderer.ANSWER, rrset_1) - r.add_rrset(dns.renderer.ANSWER, rrset_2) - r.add_rrset(dns.renderer.AUTHORITY, ns_rrset) - r.add_edns(0, 0, 4096) - r.add_rrset(dns.renderer.ADDTIONAL, ad_rrset_1) - r.add_rrset(dns.renderer.ADDTIONAL, ad_rrset_2) - r.write_header() - r.add_tsig(keyname, secret, 300, 1, 0, '', request_mac) - wire = r.get_wire() - - output, a BytesIO, where rendering is written - - id: the message id - - flags: the message flags - - max_size: the maximum size of the message - - origin: the origin to use when rendering relative names - - compress: the compression table - - section: an int, the section currently being rendered - - counts: list of the number of RRs in each section - - mac: the MAC of the rendered message (if TSIG was used) - """ - - def __init__(self, id=None, flags=0, max_size=65535, origin=None): - """Initialize a new renderer.""" - - self.output = BytesIO() - if id is None: - self.id = random.randint(0, 65535) - else: - self.id = id - self.flags = flags - self.max_size = max_size - self.origin = origin - self.compress = {} - self.section = QUESTION - self.counts = [0, 0, 0, 0] - self.output.write(b'\x00' * 12) - self.mac = '' - - def _rollback(self, where): - """Truncate the output buffer at offset *where*, and remove any - compression table entries that pointed beyond the truncation - point. - """ - - self.output.seek(where) - self.output.truncate() - keys_to_delete = [] - for k, v in self.compress.items(): - if v >= where: - keys_to_delete.append(k) - for k in keys_to_delete: - del self.compress[k] - - def _set_section(self, section): - """Set the renderer's current section. - - Sections must be rendered order: QUESTION, ANSWER, AUTHORITY, - ADDITIONAL. Sections may be empty. - - Raises dns.exception.FormError if an attempt was made to set - a section value less than the current section. - """ - - if self.section != section: - if self.section > section: - raise dns.exception.FormError - self.section = section - - def add_question(self, qname, rdtype, rdclass=dns.rdataclass.IN): - """Add a question to the message.""" - - self._set_section(QUESTION) - before = self.output.tell() - qname.to_wire(self.output, self.compress, self.origin) - self.output.write(struct.pack("!HH", rdtype, rdclass)) - after = self.output.tell() - if after >= self.max_size: - self._rollback(before) - raise dns.exception.TooBig - self.counts[QUESTION] += 1 - - def add_rrset(self, section, rrset, **kw): - """Add the rrset to the specified section. - - Any keyword arguments are passed on to the rdataset's to_wire() - routine. - """ - - self._set_section(section) - before = self.output.tell() - n = rrset.to_wire(self.output, self.compress, self.origin, **kw) - after = self.output.tell() - if after >= self.max_size: - self._rollback(before) - raise dns.exception.TooBig - self.counts[section] += n - - def add_rdataset(self, section, name, rdataset, **kw): - """Add the rdataset to the specified section, using the specified - name as the owner name. - - Any keyword arguments are passed on to the rdataset's to_wire() - routine. - """ - - self._set_section(section) - before = self.output.tell() - n = rdataset.to_wire(name, self.output, self.compress, self.origin, - **kw) - after = self.output.tell() - if after >= self.max_size: - self._rollback(before) - raise dns.exception.TooBig - self.counts[section] += n - - def add_edns(self, edns, ednsflags, payload, options=None): - """Add an EDNS OPT record to the message.""" - - # make sure the EDNS version in ednsflags agrees with edns - ednsflags &= long(0xFF00FFFF) - ednsflags |= (edns << 16) - self._set_section(ADDITIONAL) - before = self.output.tell() - self.output.write(struct.pack('!BHHIH', 0, dns.rdatatype.OPT, payload, - ednsflags, 0)) - if options is not None: - lstart = self.output.tell() - for opt in options: - stuff = struct.pack("!HH", opt.otype, 0) - self.output.write(stuff) - start = self.output.tell() - opt.to_wire(self.output) - end = self.output.tell() - assert end - start < 65536 - self.output.seek(start - 2) - stuff = struct.pack("!H", end - start) - self.output.write(stuff) - self.output.seek(0, 2) - lend = self.output.tell() - assert lend - lstart < 65536 - self.output.seek(lstart - 2) - stuff = struct.pack("!H", lend - lstart) - self.output.write(stuff) - self.output.seek(0, 2) - after = self.output.tell() - if after >= self.max_size: - self._rollback(before) - raise dns.exception.TooBig - self.counts[ADDITIONAL] += 1 - - def add_tsig(self, keyname, secret, fudge, id, tsig_error, other_data, - request_mac, algorithm=dns.tsig.default_algorithm): - """Add a TSIG signature to the message.""" - - s = self.output.getvalue() - (tsig_rdata, self.mac, ctx) = dns.tsig.sign(s, - keyname, - secret, - int(time.time()), - fudge, - id, - tsig_error, - other_data, - request_mac, - algorithm=algorithm) - self._write_tsig(tsig_rdata, keyname) - - def add_multi_tsig(self, ctx, keyname, secret, fudge, id, tsig_error, - other_data, request_mac, - algorithm=dns.tsig.default_algorithm): - """Add a TSIG signature to the message. Unlike add_tsig(), this can be - used for a series of consecutive DNS envelopes, e.g. for a zone - transfer over TCP [RFC2845, 4.4]. - - For the first message in the sequence, give ctx=None. For each - subsequent message, give the ctx that was returned from the - add_multi_tsig() call for the previous message.""" - - s = self.output.getvalue() - (tsig_rdata, self.mac, ctx) = dns.tsig.sign(s, - keyname, - secret, - int(time.time()), - fudge, - id, - tsig_error, - other_data, - request_mac, - ctx=ctx, - first=ctx is None, - multi=True, - algorithm=algorithm) - self._write_tsig(tsig_rdata, keyname) - return ctx - - def _write_tsig(self, tsig_rdata, keyname): - self._set_section(ADDITIONAL) - before = self.output.tell() - - keyname.to_wire(self.output, self.compress, self.origin) - self.output.write(struct.pack('!HHIH', dns.rdatatype.TSIG, - dns.rdataclass.ANY, 0, 0)) - rdata_start = self.output.tell() - self.output.write(tsig_rdata) - - after = self.output.tell() - assert after - rdata_start < 65536 - if after >= self.max_size: - self._rollback(before) - raise dns.exception.TooBig - - self.output.seek(rdata_start - 2) - self.output.write(struct.pack('!H', after - rdata_start)) - self.counts[ADDITIONAL] += 1 - self.output.seek(10) - self.output.write(struct.pack('!H', self.counts[ADDITIONAL])) - self.output.seek(0, 2) - - def write_header(self): - """Write the DNS message header. - - Writing the DNS message header is done after all sections - have been rendered, but before the optional TSIG signature - is added. - """ - - self.output.seek(0) - self.output.write(struct.pack('!HHHHHH', self.id, self.flags, - self.counts[0], self.counts[1], - self.counts[2], self.counts[3])) - self.output.seek(0, 2) - - def get_wire(self): - """Return the wire format message.""" - - return self.output.getvalue() diff --git a/env/lib/python3.7/site-packages/dns/resolver.py b/env/lib/python3.7/site-packages/dns/resolver.py deleted file mode 100644 index 806e5b2..0000000 --- a/env/lib/python3.7/site-packages/dns/resolver.py +++ /dev/null @@ -1,1383 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""DNS stub resolver.""" - -import socket -import sys -import time -import random - -try: - import threading as _threading -except ImportError: - import dummy_threading as _threading - -import dns.exception -import dns.flags -import dns.ipv4 -import dns.ipv6 -import dns.message -import dns.name -import dns.query -import dns.rcode -import dns.rdataclass -import dns.rdatatype -import dns.reversename -import dns.tsig -from ._compat import xrange, string_types - -if sys.platform == 'win32': - try: - import winreg as _winreg - except ImportError: - import _winreg # pylint: disable=import-error - -class NXDOMAIN(dns.exception.DNSException): - """The DNS query name does not exist.""" - supp_kwargs = {'qnames', 'responses'} - fmt = None # we have our own __str__ implementation - - def _check_kwargs(self, qnames, responses=None): - if not isinstance(qnames, (list, tuple, set)): - raise AttributeError("qnames must be a list, tuple or set") - if len(qnames) == 0: - raise AttributeError("qnames must contain at least one element") - if responses is None: - responses = {} - elif not isinstance(responses, dict): - raise AttributeError("responses must be a dict(qname=response)") - kwargs = dict(qnames=qnames, responses=responses) - return kwargs - - def __str__(self): - if 'qnames' not in self.kwargs: - return super(NXDOMAIN, self).__str__() - qnames = self.kwargs['qnames'] - if len(qnames) > 1: - msg = 'None of DNS query names exist' - else: - msg = 'The DNS query name does not exist' - qnames = ', '.join(map(str, qnames)) - return "{}: {}".format(msg, qnames) - - def canonical_name(self): - if not 'qnames' in self.kwargs: - raise TypeError("parametrized exception required") - IN = dns.rdataclass.IN - CNAME = dns.rdatatype.CNAME - cname = None - for qname in self.kwargs['qnames']: - response = self.kwargs['responses'][qname] - for answer in response.answer: - if answer.rdtype != CNAME or answer.rdclass != IN: - continue - cname = answer.items[0].target.to_text() - if cname is not None: - return dns.name.from_text(cname) - return self.kwargs['qnames'][0] - canonical_name = property(canonical_name, doc=( - "Return the unresolved canonical name.")) - - def __add__(self, e_nx): - """Augment by results from another NXDOMAIN exception.""" - qnames0 = list(self.kwargs.get('qnames', [])) - responses0 = dict(self.kwargs.get('responses', {})) - responses1 = e_nx.kwargs.get('responses', {}) - for qname1 in e_nx.kwargs.get('qnames', []): - if qname1 not in qnames0: - qnames0.append(qname1) - if qname1 in responses1: - responses0[qname1] = responses1[qname1] - return NXDOMAIN(qnames=qnames0, responses=responses0) - - def qnames(self): - """All of the names that were tried. - - Returns a list of ``dns.name.Name``. - """ - return self.kwargs['qnames'] - - def responses(self): - """A map from queried names to their NXDOMAIN responses. - - Returns a dict mapping a ``dns.name.Name`` to a - ``dns.message.Message``. - """ - return self.kwargs['responses'] - - def response(self, qname): - """The response for query *qname*. - - Returns a ``dns.message.Message``. - """ - return self.kwargs['responses'][qname] - - -class YXDOMAIN(dns.exception.DNSException): - """The DNS query name is too long after DNAME substitution.""" - -# The definition of the Timeout exception has moved from here to the -# dns.exception module. We keep dns.resolver.Timeout defined for -# backwards compatibility. - -Timeout = dns.exception.Timeout - - -class NoAnswer(dns.exception.DNSException): - """The DNS response does not contain an answer to the question.""" - fmt = 'The DNS response does not contain an answer ' + \ - 'to the question: {query}' - supp_kwargs = {'response'} - - def _fmt_kwargs(self, **kwargs): - return super(NoAnswer, self)._fmt_kwargs( - query=kwargs['response'].question) - - -class NoNameservers(dns.exception.DNSException): - """All nameservers failed to answer the query. - - errors: list of servers and respective errors - The type of errors is - [(server IP address, any object convertible to string)]. - Non-empty errors list will add explanatory message () - """ - - msg = "All nameservers failed to answer the query." - fmt = "%s {query}: {errors}" % msg[:-1] - supp_kwargs = {'request', 'errors'} - - def _fmt_kwargs(self, **kwargs): - srv_msgs = [] - for err in kwargs['errors']: - srv_msgs.append('Server {} {} port {} answered {}'.format(err[0], - 'TCP' if err[1] else 'UDP', err[2], err[3])) - return super(NoNameservers, self)._fmt_kwargs( - query=kwargs['request'].question, errors='; '.join(srv_msgs)) - - -class NotAbsolute(dns.exception.DNSException): - """An absolute domain name is required but a relative name was provided.""" - - -class NoRootSOA(dns.exception.DNSException): - """There is no SOA RR at the DNS root name. This should never happen!""" - - -class NoMetaqueries(dns.exception.DNSException): - """DNS metaqueries are not allowed.""" - - -class Answer(object): - """DNS stub resolver answer. - - Instances of this class bundle up the result of a successful DNS - resolution. - - For convenience, the answer object implements much of the sequence - protocol, forwarding to its ``rrset`` attribute. E.g. - ``for a in answer`` is equivalent to ``for a in answer.rrset``. - ``answer[i]`` is equivalent to ``answer.rrset[i]``, and - ``answer[i:j]`` is equivalent to ``answer.rrset[i:j]``. - - Note that CNAMEs or DNAMEs in the response may mean that answer - RRset's name might not be the query name. - """ - - def __init__(self, qname, rdtype, rdclass, response, - raise_on_no_answer=True): - self.qname = qname - self.rdtype = rdtype - self.rdclass = rdclass - self.response = response - min_ttl = -1 - rrset = None - for count in xrange(0, 15): - try: - rrset = response.find_rrset(response.answer, qname, - rdclass, rdtype) - if min_ttl == -1 or rrset.ttl < min_ttl: - min_ttl = rrset.ttl - break - except KeyError: - if rdtype != dns.rdatatype.CNAME: - try: - crrset = response.find_rrset(response.answer, - qname, - rdclass, - dns.rdatatype.CNAME) - if min_ttl == -1 or crrset.ttl < min_ttl: - min_ttl = crrset.ttl - for rd in crrset: - qname = rd.target - break - continue - except KeyError: - if raise_on_no_answer: - raise NoAnswer(response=response) - if raise_on_no_answer: - raise NoAnswer(response=response) - if rrset is None and raise_on_no_answer: - raise NoAnswer(response=response) - self.canonical_name = qname - self.rrset = rrset - if rrset is None: - while 1: - # Look for a SOA RR whose owner name is a superdomain - # of qname. - try: - srrset = response.find_rrset(response.authority, qname, - rdclass, dns.rdatatype.SOA) - if min_ttl == -1 or srrset.ttl < min_ttl: - min_ttl = srrset.ttl - if srrset[0].minimum < min_ttl: - min_ttl = srrset[0].minimum - break - except KeyError: - try: - qname = qname.parent() - except dns.name.NoParent: - break - self.expiration = time.time() + min_ttl - - def __getattr__(self, attr): - if attr == 'name': - return self.rrset.name - elif attr == 'ttl': - return self.rrset.ttl - elif attr == 'covers': - return self.rrset.covers - elif attr == 'rdclass': - return self.rrset.rdclass - elif attr == 'rdtype': - return self.rrset.rdtype - else: - raise AttributeError(attr) - - def __len__(self): - return self.rrset and len(self.rrset) or 0 - - def __iter__(self): - return self.rrset and iter(self.rrset) or iter(tuple()) - - def __getitem__(self, i): - if self.rrset is None: - raise IndexError - return self.rrset[i] - - def __delitem__(self, i): - if self.rrset is None: - raise IndexError - del self.rrset[i] - - -class Cache(object): - """Simple thread-safe DNS answer cache.""" - - def __init__(self, cleaning_interval=300.0): - """*cleaning_interval*, a ``float`` is the number of seconds between - periodic cleanings. - """ - - self.data = {} - self.cleaning_interval = cleaning_interval - self.next_cleaning = time.time() + self.cleaning_interval - self.lock = _threading.Lock() - - def _maybe_clean(self): - """Clean the cache if it's time to do so.""" - - now = time.time() - if self.next_cleaning <= now: - keys_to_delete = [] - for (k, v) in self.data.items(): - if v.expiration <= now: - keys_to_delete.append(k) - for k in keys_to_delete: - del self.data[k] - now = time.time() - self.next_cleaning = now + self.cleaning_interval - - def get(self, key): - """Get the answer associated with *key*. - - Returns None if no answer is cached for the key. - - *key*, a ``(dns.name.Name, int, int)`` tuple whose values are the - query name, rdtype, and rdclass respectively. - - Returns a ``dns.resolver.Answer`` or ``None``. - """ - - try: - self.lock.acquire() - self._maybe_clean() - v = self.data.get(key) - if v is None or v.expiration <= time.time(): - return None - return v - finally: - self.lock.release() - - def put(self, key, value): - """Associate key and value in the cache. - - *key*, a ``(dns.name.Name, int, int)`` tuple whose values are the - query name, rdtype, and rdclass respectively. - - *value*, a ``dns.resolver.Answer``, the answer. - """ - - try: - self.lock.acquire() - self._maybe_clean() - self.data[key] = value - finally: - self.lock.release() - - def flush(self, key=None): - """Flush the cache. - - If *key* is not ``None``, only that item is flushed. Otherwise - the entire cache is flushed. - - *key*, a ``(dns.name.Name, int, int)`` tuple whose values are the - query name, rdtype, and rdclass respectively. - """ - - try: - self.lock.acquire() - if key is not None: - if key in self.data: - del self.data[key] - else: - self.data = {} - self.next_cleaning = time.time() + self.cleaning_interval - finally: - self.lock.release() - - -class LRUCacheNode(object): - """LRUCache node.""" - - def __init__(self, key, value): - self.key = key - self.value = value - self.prev = self - self.next = self - - def link_before(self, node): - self.prev = node.prev - self.next = node - node.prev.next = self - node.prev = self - - def link_after(self, node): - self.prev = node - self.next = node.next - node.next.prev = self - node.next = self - - def unlink(self): - self.next.prev = self.prev - self.prev.next = self.next - - -class LRUCache(object): - """Thread-safe, bounded, least-recently-used DNS answer cache. - - This cache is better than the simple cache (above) if you're - running a web crawler or other process that does a lot of - resolutions. The LRUCache has a maximum number of nodes, and when - it is full, the least-recently used node is removed to make space - for a new one. - """ - - def __init__(self, max_size=100000): - """*max_size*, an ``int``, is the maximum number of nodes to cache; - it must be greater than 0. - """ - - self.data = {} - self.set_max_size(max_size) - self.sentinel = LRUCacheNode(None, None) - self.lock = _threading.Lock() - - def set_max_size(self, max_size): - if max_size < 1: - max_size = 1 - self.max_size = max_size - - def get(self, key): - """Get the answer associated with *key*. - - Returns None if no answer is cached for the key. - - *key*, a ``(dns.name.Name, int, int)`` tuple whose values are the - query name, rdtype, and rdclass respectively. - - Returns a ``dns.resolver.Answer`` or ``None``. - """ - - try: - self.lock.acquire() - node = self.data.get(key) - if node is None: - return None - # Unlink because we're either going to move the node to the front - # of the LRU list or we're going to free it. - node.unlink() - if node.value.expiration <= time.time(): - del self.data[node.key] - return None - node.link_after(self.sentinel) - return node.value - finally: - self.lock.release() - - def put(self, key, value): - """Associate key and value in the cache. - - *key*, a ``(dns.name.Name, int, int)`` tuple whose values are the - query name, rdtype, and rdclass respectively. - - *value*, a ``dns.resolver.Answer``, the answer. - """ - - try: - self.lock.acquire() - node = self.data.get(key) - if node is not None: - node.unlink() - del self.data[node.key] - while len(self.data) >= self.max_size: - node = self.sentinel.prev - node.unlink() - del self.data[node.key] - node = LRUCacheNode(key, value) - node.link_after(self.sentinel) - self.data[key] = node - finally: - self.lock.release() - - def flush(self, key=None): - """Flush the cache. - - If *key* is not ``None``, only that item is flushed. Otherwise - the entire cache is flushed. - - *key*, a ``(dns.name.Name, int, int)`` tuple whose values are the - query name, rdtype, and rdclass respectively. - """ - - try: - self.lock.acquire() - if key is not None: - node = self.data.get(key) - if node is not None: - node.unlink() - del self.data[node.key] - else: - node = self.sentinel.next - while node != self.sentinel: - next = node.next - node.prev = None - node.next = None - node = next - self.data = {} - finally: - self.lock.release() - - -class Resolver(object): - """DNS stub resolver.""" - - def __init__(self, filename='/etc/resolv.conf', configure=True): - """*filename*, a ``text`` or file object, specifying a file - in standard /etc/resolv.conf format. This parameter is meaningful - only when *configure* is true and the platform is POSIX. - - *configure*, a ``bool``. If True (the default), the resolver - instance is configured in the normal fashion for the operating - system the resolver is running on. (I.e. by reading a - /etc/resolv.conf file on POSIX systems and from the registry - on Windows systems.) - """ - - self.domain = None - self.nameservers = None - self.nameserver_ports = None - self.port = None - self.search = None - self.timeout = None - self.lifetime = None - self.keyring = None - self.keyname = None - self.keyalgorithm = None - self.edns = None - self.ednsflags = None - self.payload = None - self.cache = None - self.flags = None - self.retry_servfail = False - self.rotate = False - - self.reset() - if configure: - if sys.platform == 'win32': - self.read_registry() - elif filename: - self.read_resolv_conf(filename) - - def reset(self): - """Reset all resolver configuration to the defaults.""" - - self.domain = \ - dns.name.Name(dns.name.from_text(socket.gethostname())[1:]) - if len(self.domain) == 0: - self.domain = dns.name.root - self.nameservers = [] - self.nameserver_ports = {} - self.port = 53 - self.search = [] - self.timeout = 2.0 - self.lifetime = 30.0 - self.keyring = None - self.keyname = None - self.keyalgorithm = dns.tsig.default_algorithm - self.edns = -1 - self.ednsflags = 0 - self.payload = 0 - self.cache = None - self.flags = None - self.retry_servfail = False - self.rotate = False - - def read_resolv_conf(self, f): - """Process *f* as a file in the /etc/resolv.conf format. If f is - a ``text``, it is used as the name of the file to open; otherwise it - is treated as the file itself.""" - - if isinstance(f, string_types): - try: - f = open(f, 'r') - except IOError: - # /etc/resolv.conf doesn't exist, can't be read, etc. - # We'll just use the default resolver configuration. - self.nameservers = ['127.0.0.1'] - return - want_close = True - else: - want_close = False - try: - for l in f: - if len(l) == 0 or l[0] == '#' or l[0] == ';': - continue - tokens = l.split() - - # Any line containing less than 2 tokens is malformed - if len(tokens) < 2: - continue - - if tokens[0] == 'nameserver': - self.nameservers.append(tokens[1]) - elif tokens[0] == 'domain': - self.domain = dns.name.from_text(tokens[1]) - elif tokens[0] == 'search': - for suffix in tokens[1:]: - self.search.append(dns.name.from_text(suffix)) - elif tokens[0] == 'options': - if 'rotate' in tokens[1:]: - self.rotate = True - finally: - if want_close: - f.close() - if len(self.nameservers) == 0: - self.nameservers.append('127.0.0.1') - - def _determine_split_char(self, entry): - # - # The windows registry irritatingly changes the list element - # delimiter in between ' ' and ',' (and vice-versa) in various - # versions of windows. - # - if entry.find(' ') >= 0: - split_char = ' ' - elif entry.find(',') >= 0: - split_char = ',' - else: - # probably a singleton; treat as a space-separated list. - split_char = ' ' - return split_char - - def _config_win32_nameservers(self, nameservers): - # we call str() on nameservers to convert it from unicode to ascii - nameservers = str(nameservers) - split_char = self._determine_split_char(nameservers) - ns_list = nameservers.split(split_char) - for ns in ns_list: - if ns not in self.nameservers: - self.nameservers.append(ns) - - def _config_win32_domain(self, domain): - # we call str() on domain to convert it from unicode to ascii - self.domain = dns.name.from_text(str(domain)) - - def _config_win32_search(self, search): - # we call str() on search to convert it from unicode to ascii - search = str(search) - split_char = self._determine_split_char(search) - search_list = search.split(split_char) - for s in search_list: - if s not in self.search: - self.search.append(dns.name.from_text(s)) - - def _config_win32_fromkey(self, key, always_try_domain): - try: - servers, rtype = _winreg.QueryValueEx(key, 'NameServer') - except WindowsError: # pylint: disable=undefined-variable - servers = None - if servers: - self._config_win32_nameservers(servers) - if servers or always_try_domain: - try: - dom, rtype = _winreg.QueryValueEx(key, 'Domain') - if dom: - self._config_win32_domain(dom) - except WindowsError: # pylint: disable=undefined-variable - pass - else: - try: - servers, rtype = _winreg.QueryValueEx(key, 'DhcpNameServer') - except WindowsError: # pylint: disable=undefined-variable - servers = None - if servers: - self._config_win32_nameservers(servers) - try: - dom, rtype = _winreg.QueryValueEx(key, 'DhcpDomain') - if dom: - self._config_win32_domain(dom) - except WindowsError: # pylint: disable=undefined-variable - pass - try: - search, rtype = _winreg.QueryValueEx(key, 'SearchList') - except WindowsError: # pylint: disable=undefined-variable - search = None - if search: - self._config_win32_search(search) - - def read_registry(self): - """Extract resolver configuration from the Windows registry.""" - - lm = _winreg.ConnectRegistry(None, _winreg.HKEY_LOCAL_MACHINE) - want_scan = False - try: - try: - # XP, 2000 - tcp_params = _winreg.OpenKey(lm, - r'SYSTEM\CurrentControlSet' - r'\Services\Tcpip\Parameters') - want_scan = True - except EnvironmentError: - # ME - tcp_params = _winreg.OpenKey(lm, - r'SYSTEM\CurrentControlSet' - r'\Services\VxD\MSTCP') - try: - self._config_win32_fromkey(tcp_params, True) - finally: - tcp_params.Close() - if want_scan: - interfaces = _winreg.OpenKey(lm, - r'SYSTEM\CurrentControlSet' - r'\Services\Tcpip\Parameters' - r'\Interfaces') - try: - i = 0 - while True: - try: - guid = _winreg.EnumKey(interfaces, i) - i += 1 - key = _winreg.OpenKey(interfaces, guid) - if not self._win32_is_nic_enabled(lm, guid, key): - continue - try: - self._config_win32_fromkey(key, False) - finally: - key.Close() - except EnvironmentError: - break - finally: - interfaces.Close() - finally: - lm.Close() - - def _win32_is_nic_enabled(self, lm, guid, interface_key): - # Look in the Windows Registry to determine whether the network - # interface corresponding to the given guid is enabled. - # - # (Code contributed by Paul Marks, thanks!) - # - try: - # This hard-coded location seems to be consistent, at least - # from Windows 2000 through Vista. - connection_key = _winreg.OpenKey( - lm, - r'SYSTEM\CurrentControlSet\Control\Network' - r'\{4D36E972-E325-11CE-BFC1-08002BE10318}' - r'\%s\Connection' % guid) - - try: - # The PnpInstanceID points to a key inside Enum - (pnp_id, ttype) = _winreg.QueryValueEx( - connection_key, 'PnpInstanceID') - - if ttype != _winreg.REG_SZ: - raise ValueError - - device_key = _winreg.OpenKey( - lm, r'SYSTEM\CurrentControlSet\Enum\%s' % pnp_id) - - try: - # Get ConfigFlags for this device - (flags, ttype) = _winreg.QueryValueEx( - device_key, 'ConfigFlags') - - if ttype != _winreg.REG_DWORD: - raise ValueError - - # Based on experimentation, bit 0x1 indicates that the - # device is disabled. - return not flags & 0x1 - - finally: - device_key.Close() - finally: - connection_key.Close() - except (EnvironmentError, ValueError): - # Pre-vista, enabled interfaces seem to have a non-empty - # NTEContextList; this was how dnspython detected enabled - # nics before the code above was contributed. We've retained - # the old method since we don't know if the code above works - # on Windows 95/98/ME. - try: - (nte, ttype) = _winreg.QueryValueEx(interface_key, - 'NTEContextList') - return nte is not None - except WindowsError: # pylint: disable=undefined-variable - return False - - def _compute_timeout(self, start, lifetime=None): - lifetime = self.lifetime if lifetime is None else lifetime - now = time.time() - duration = now - start - if duration < 0: - if duration < -1: - # Time going backwards is bad. Just give up. - raise Timeout(timeout=duration) - else: - # Time went backwards, but only a little. This can - # happen, e.g. under vmware with older linux kernels. - # Pretend it didn't happen. - now = start - if duration >= lifetime: - raise Timeout(timeout=duration) - return min(lifetime - duration, self.timeout) - - def query(self, qname, rdtype=dns.rdatatype.A, rdclass=dns.rdataclass.IN, - tcp=False, source=None, raise_on_no_answer=True, source_port=0, - lifetime=None): - """Query nameservers to find the answer to the question. - - The *qname*, *rdtype*, and *rdclass* parameters may be objects - of the appropriate type, or strings that can be converted into objects - of the appropriate type. - - *qname*, a ``dns.name.Name`` or ``text``, the query name. - - *rdtype*, an ``int`` or ``text``, the query type. - - *rdclass*, an ``int`` or ``text``, the query class. - - *tcp*, a ``bool``. If ``True``, use TCP to make the query. - - *source*, a ``text`` or ``None``. If not ``None``, bind to this IP - address when making queries. - - *raise_on_no_answer*, a ``bool``. If ``True``, raise - ``dns.resolver.NoAnswer`` if there's no answer to the question. - - *source_port*, an ``int``, the port from which to send the message. - - *lifetime*, a ``float``, how long query should run before timing out. - - Raises ``dns.exception.Timeout`` if no answers could be found - in the specified lifetime. - - Raises ``dns.resolver.NXDOMAIN`` if the query name does not exist. - - Raises ``dns.resolver.YXDOMAIN`` if the query name is too long after - DNAME substitution. - - Raises ``dns.resolver.NoAnswer`` if *raise_on_no_answer* is - ``True`` and the query name exists but has no RRset of the - desired type and class. - - Raises ``dns.resolver.NoNameservers`` if no non-broken - nameservers are available to answer the question. - - Returns a ``dns.resolver.Answer`` instance. - """ - - if isinstance(qname, string_types): - qname = dns.name.from_text(qname, None) - if isinstance(rdtype, string_types): - rdtype = dns.rdatatype.from_text(rdtype) - if dns.rdatatype.is_metatype(rdtype): - raise NoMetaqueries - if isinstance(rdclass, string_types): - rdclass = dns.rdataclass.from_text(rdclass) - if dns.rdataclass.is_metaclass(rdclass): - raise NoMetaqueries - qnames_to_try = [] - if qname.is_absolute(): - qnames_to_try.append(qname) - else: - if len(qname) > 1: - qnames_to_try.append(qname.concatenate(dns.name.root)) - if self.search: - for suffix in self.search: - qnames_to_try.append(qname.concatenate(suffix)) - else: - qnames_to_try.append(qname.concatenate(self.domain)) - all_nxdomain = True - nxdomain_responses = {} - start = time.time() - _qname = None # make pylint happy - for _qname in qnames_to_try: - if self.cache: - answer = self.cache.get((_qname, rdtype, rdclass)) - if answer is not None: - if answer.rrset is None and raise_on_no_answer: - raise NoAnswer(response=answer.response) - else: - return answer - request = dns.message.make_query(_qname, rdtype, rdclass) - if self.keyname is not None: - request.use_tsig(self.keyring, self.keyname, - algorithm=self.keyalgorithm) - request.use_edns(self.edns, self.ednsflags, self.payload) - if self.flags is not None: - request.flags = self.flags - response = None - # - # make a copy of the servers list so we can alter it later. - # - nameservers = self.nameservers[:] - errors = [] - if self.rotate: - random.shuffle(nameservers) - backoff = 0.10 - while response is None: - if len(nameservers) == 0: - raise NoNameservers(request=request, errors=errors) - for nameserver in nameservers[:]: - timeout = self._compute_timeout(start, lifetime) - port = self.nameserver_ports.get(nameserver, self.port) - try: - tcp_attempt = tcp - if tcp: - response = dns.query.tcp(request, nameserver, - timeout, port, - source=source, - source_port=source_port) - else: - response = dns.query.udp(request, nameserver, - timeout, port, - source=source, - source_port=source_port) - if response.flags & dns.flags.TC: - # Response truncated; retry with TCP. - tcp_attempt = True - timeout = self._compute_timeout(start, lifetime) - response = \ - dns.query.tcp(request, nameserver, - timeout, port, - source=source, - source_port=source_port) - except (socket.error, dns.exception.Timeout) as ex: - # - # Communication failure or timeout. Go to the - # next server - # - errors.append((nameserver, tcp_attempt, port, ex, - response)) - response = None - continue - except dns.query.UnexpectedSource as ex: - # - # Who knows? Keep going. - # - errors.append((nameserver, tcp_attempt, port, ex, - response)) - response = None - continue - except dns.exception.FormError as ex: - # - # We don't understand what this server is - # saying. Take it out of the mix and - # continue. - # - nameservers.remove(nameserver) - errors.append((nameserver, tcp_attempt, port, ex, - response)) - response = None - continue - except EOFError as ex: - # - # We're using TCP and they hung up on us. - # Probably they don't support TCP (though - # they're supposed to!). Take it out of the - # mix and continue. - # - nameservers.remove(nameserver) - errors.append((nameserver, tcp_attempt, port, ex, - response)) - response = None - continue - rcode = response.rcode() - if rcode == dns.rcode.YXDOMAIN: - ex = YXDOMAIN() - errors.append((nameserver, tcp_attempt, port, ex, - response)) - raise ex - if rcode == dns.rcode.NOERROR or \ - rcode == dns.rcode.NXDOMAIN: - break - # - # We got a response, but we're not happy with the - # rcode in it. Remove the server from the mix if - # the rcode isn't SERVFAIL. - # - if rcode != dns.rcode.SERVFAIL or not self.retry_servfail: - nameservers.remove(nameserver) - errors.append((nameserver, tcp_attempt, port, - dns.rcode.to_text(rcode), response)) - response = None - if response is not None: - break - # - # All nameservers failed! - # - if len(nameservers) > 0: - # - # But we still have servers to try. Sleep a bit - # so we don't pound them! - # - timeout = self._compute_timeout(start, lifetime) - sleep_time = min(timeout, backoff) - backoff *= 2 - time.sleep(sleep_time) - if response.rcode() == dns.rcode.NXDOMAIN: - nxdomain_responses[_qname] = response - continue - all_nxdomain = False - break - if all_nxdomain: - raise NXDOMAIN(qnames=qnames_to_try, responses=nxdomain_responses) - answer = Answer(_qname, rdtype, rdclass, response, - raise_on_no_answer) - if self.cache: - self.cache.put((_qname, rdtype, rdclass), answer) - return answer - - def use_tsig(self, keyring, keyname=None, - algorithm=dns.tsig.default_algorithm): - """Add a TSIG signature to the query. - - See the documentation of the Message class for a complete - description of the keyring dictionary. - - *keyring*, a ``dict``, the TSIG keyring to use. If a - *keyring* is specified but a *keyname* is not, then the key - used will be the first key in the *keyring*. Note that the - order of keys in a dictionary is not defined, so applications - should supply a keyname when a keyring is used, unless they - know the keyring contains only one key. - - *keyname*, a ``dns.name.Name`` or ``None``, the name of the TSIG key - to use; defaults to ``None``. The key must be defined in the keyring. - - *algorithm*, a ``dns.name.Name``, the TSIG algorithm to use. - """ - - self.keyring = keyring - if keyname is None: - self.keyname = list(self.keyring.keys())[0] - else: - self.keyname = keyname - self.keyalgorithm = algorithm - - def use_edns(self, edns, ednsflags, payload): - """Configure EDNS behavior. - - *edns*, an ``int``, is the EDNS level to use. Specifying - ``None``, ``False``, or ``-1`` means "do not use EDNS", and in this case - the other parameters are ignored. Specifying ``True`` is - equivalent to specifying 0, i.e. "use EDNS0". - - *ednsflags*, an ``int``, the EDNS flag values. - - *payload*, an ``int``, is the EDNS sender's payload field, which is the - maximum size of UDP datagram the sender can handle. I.e. how big - a response to this message can be. - """ - - if edns is None: - edns = -1 - self.edns = edns - self.ednsflags = ednsflags - self.payload = payload - - def set_flags(self, flags): - """Overrides the default flags with your own. - - *flags*, an ``int``, the message flags to use. - """ - - self.flags = flags - - -#: The default resolver. -default_resolver = None - - -def get_default_resolver(): - """Get the default resolver, initializing it if necessary.""" - if default_resolver is None: - reset_default_resolver() - return default_resolver - - -def reset_default_resolver(): - """Re-initialize default resolver. - - Note that the resolver configuration (i.e. /etc/resolv.conf on UNIX - systems) will be re-read immediately. - """ - - global default_resolver - default_resolver = Resolver() - - -def query(qname, rdtype=dns.rdatatype.A, rdclass=dns.rdataclass.IN, - tcp=False, source=None, raise_on_no_answer=True, - source_port=0, lifetime=None): - """Query nameservers to find the answer to the question. - - This is a convenience function that uses the default resolver - object to make the query. - - See ``dns.resolver.Resolver.query`` for more information on the - parameters. - """ - - return get_default_resolver().query(qname, rdtype, rdclass, tcp, source, - raise_on_no_answer, source_port, - lifetime) - - -def zone_for_name(name, rdclass=dns.rdataclass.IN, tcp=False, resolver=None): - """Find the name of the zone which contains the specified name. - - *name*, an absolute ``dns.name.Name`` or ``text``, the query name. - - *rdclass*, an ``int``, the query class. - - *tcp*, a ``bool``. If ``True``, use TCP to make the query. - - *resolver*, a ``dns.resolver.Resolver`` or ``None``, the resolver to use. - If ``None``, the default resolver is used. - - Raises ``dns.resolver.NoRootSOA`` if there is no SOA RR at the DNS - root. (This is only likely to happen if you're using non-default - root servers in your network and they are misconfigured.) - - Returns a ``dns.name.Name``. - """ - - if isinstance(name, string_types): - name = dns.name.from_text(name, dns.name.root) - if resolver is None: - resolver = get_default_resolver() - if not name.is_absolute(): - raise NotAbsolute(name) - while 1: - try: - answer = resolver.query(name, dns.rdatatype.SOA, rdclass, tcp) - if answer.rrset.name == name: - return name - # otherwise we were CNAMEd or DNAMEd and need to look higher - except (dns.resolver.NXDOMAIN, dns.resolver.NoAnswer): - pass - try: - name = name.parent() - except dns.name.NoParent: - raise NoRootSOA - -# -# Support for overriding the system resolver for all python code in the -# running process. -# - -_protocols_for_socktype = { - socket.SOCK_DGRAM: [socket.SOL_UDP], - socket.SOCK_STREAM: [socket.SOL_TCP], -} - -_resolver = None -_original_getaddrinfo = socket.getaddrinfo -_original_getnameinfo = socket.getnameinfo -_original_getfqdn = socket.getfqdn -_original_gethostbyname = socket.gethostbyname -_original_gethostbyname_ex = socket.gethostbyname_ex -_original_gethostbyaddr = socket.gethostbyaddr - - -def _getaddrinfo(host=None, service=None, family=socket.AF_UNSPEC, socktype=0, - proto=0, flags=0): - if flags & (socket.AI_ADDRCONFIG | socket.AI_V4MAPPED) != 0: - raise NotImplementedError - if host is None and service is None: - raise socket.gaierror(socket.EAI_NONAME) - v6addrs = [] - v4addrs = [] - canonical_name = None - try: - # Is host None or a V6 address literal? - if host is None: - canonical_name = 'localhost' - if flags & socket.AI_PASSIVE != 0: - v6addrs.append('::') - v4addrs.append('0.0.0.0') - else: - v6addrs.append('::1') - v4addrs.append('127.0.0.1') - else: - parts = host.split('%') - if len(parts) == 2: - ahost = parts[0] - else: - ahost = host - addr = dns.ipv6.inet_aton(ahost) - v6addrs.append(host) - canonical_name = host - except Exception: - try: - # Is it a V4 address literal? - addr = dns.ipv4.inet_aton(host) - v4addrs.append(host) - canonical_name = host - except Exception: - if flags & socket.AI_NUMERICHOST == 0: - try: - if family == socket.AF_INET6 or family == socket.AF_UNSPEC: - v6 = _resolver.query(host, dns.rdatatype.AAAA, - raise_on_no_answer=False) - # Note that setting host ensures we query the same name - # for A as we did for AAAA. - host = v6.qname - canonical_name = v6.canonical_name.to_text(True) - if v6.rrset is not None: - for rdata in v6.rrset: - v6addrs.append(rdata.address) - if family == socket.AF_INET or family == socket.AF_UNSPEC: - v4 = _resolver.query(host, dns.rdatatype.A, - raise_on_no_answer=False) - host = v4.qname - canonical_name = v4.canonical_name.to_text(True) - if v4.rrset is not None: - for rdata in v4.rrset: - v4addrs.append(rdata.address) - except dns.resolver.NXDOMAIN: - raise socket.gaierror(socket.EAI_NONAME) - except Exception: - raise socket.gaierror(socket.EAI_SYSTEM) - port = None - try: - # Is it a port literal? - if service is None: - port = 0 - else: - port = int(service) - except Exception: - if flags & socket.AI_NUMERICSERV == 0: - try: - port = socket.getservbyname(service) - except Exception: - pass - if port is None: - raise socket.gaierror(socket.EAI_NONAME) - tuples = [] - if socktype == 0: - socktypes = [socket.SOCK_DGRAM, socket.SOCK_STREAM] - else: - socktypes = [socktype] - if flags & socket.AI_CANONNAME != 0: - cname = canonical_name - else: - cname = '' - if family == socket.AF_INET6 or family == socket.AF_UNSPEC: - for addr in v6addrs: - for socktype in socktypes: - for proto in _protocols_for_socktype[socktype]: - tuples.append((socket.AF_INET6, socktype, proto, - cname, (addr, port, 0, 0))) - if family == socket.AF_INET or family == socket.AF_UNSPEC: - for addr in v4addrs: - for socktype in socktypes: - for proto in _protocols_for_socktype[socktype]: - tuples.append((socket.AF_INET, socktype, proto, - cname, (addr, port))) - if len(tuples) == 0: - raise socket.gaierror(socket.EAI_NONAME) - return tuples - - -def _getnameinfo(sockaddr, flags=0): - host = sockaddr[0] - port = sockaddr[1] - if len(sockaddr) == 4: - scope = sockaddr[3] - family = socket.AF_INET6 - else: - scope = None - family = socket.AF_INET - tuples = _getaddrinfo(host, port, family, socket.SOCK_STREAM, - socket.SOL_TCP, 0) - if len(tuples) > 1: - raise socket.error('sockaddr resolved to multiple addresses') - addr = tuples[0][4][0] - if flags & socket.NI_DGRAM: - pname = 'udp' - else: - pname = 'tcp' - qname = dns.reversename.from_address(addr) - if flags & socket.NI_NUMERICHOST == 0: - try: - answer = _resolver.query(qname, 'PTR') - hostname = answer.rrset[0].target.to_text(True) - except (dns.resolver.NXDOMAIN, dns.resolver.NoAnswer): - if flags & socket.NI_NAMEREQD: - raise socket.gaierror(socket.EAI_NONAME) - hostname = addr - if scope is not None: - hostname += '%' + str(scope) - else: - hostname = addr - if scope is not None: - hostname += '%' + str(scope) - if flags & socket.NI_NUMERICSERV: - service = str(port) - else: - service = socket.getservbyport(port, pname) - return (hostname, service) - - -def _getfqdn(name=None): - if name is None: - name = socket.gethostname() - try: - return _getnameinfo(_getaddrinfo(name, 80)[0][4])[0] - except Exception: - return name - - -def _gethostbyname(name): - return _gethostbyname_ex(name)[2][0] - - -def _gethostbyname_ex(name): - aliases = [] - addresses = [] - tuples = _getaddrinfo(name, 0, socket.AF_INET, socket.SOCK_STREAM, - socket.SOL_TCP, socket.AI_CANONNAME) - canonical = tuples[0][3] - for item in tuples: - addresses.append(item[4][0]) - # XXX we just ignore aliases - return (canonical, aliases, addresses) - - -def _gethostbyaddr(ip): - try: - dns.ipv6.inet_aton(ip) - sockaddr = (ip, 80, 0, 0) - family = socket.AF_INET6 - except Exception: - sockaddr = (ip, 80) - family = socket.AF_INET - (name, port) = _getnameinfo(sockaddr, socket.NI_NAMEREQD) - aliases = [] - addresses = [] - tuples = _getaddrinfo(name, 0, family, socket.SOCK_STREAM, socket.SOL_TCP, - socket.AI_CANONNAME) - canonical = tuples[0][3] - for item in tuples: - addresses.append(item[4][0]) - # XXX we just ignore aliases - return (canonical, aliases, addresses) - - -def override_system_resolver(resolver=None): - """Override the system resolver routines in the socket module with - versions which use dnspython's resolver. - - This can be useful in testing situations where you want to control - the resolution behavior of python code without having to change - the system's resolver settings (e.g. /etc/resolv.conf). - - The resolver to use may be specified; if it's not, the default - resolver will be used. - - resolver, a ``dns.resolver.Resolver`` or ``None``, the resolver to use. - """ - - if resolver is None: - resolver = get_default_resolver() - global _resolver - _resolver = resolver - socket.getaddrinfo = _getaddrinfo - socket.getnameinfo = _getnameinfo - socket.getfqdn = _getfqdn - socket.gethostbyname = _gethostbyname - socket.gethostbyname_ex = _gethostbyname_ex - socket.gethostbyaddr = _gethostbyaddr - - -def restore_system_resolver(): - """Undo the effects of prior override_system_resolver().""" - - global _resolver - _resolver = None - socket.getaddrinfo = _original_getaddrinfo - socket.getnameinfo = _original_getnameinfo - socket.getfqdn = _original_getfqdn - socket.gethostbyname = _original_gethostbyname - socket.gethostbyname_ex = _original_gethostbyname_ex - socket.gethostbyaddr = _original_gethostbyaddr diff --git a/env/lib/python3.7/site-packages/dns/reversename.py b/env/lib/python3.7/site-packages/dns/reversename.py deleted file mode 100644 index 8f095fa..0000000 --- a/env/lib/python3.7/site-packages/dns/reversename.py +++ /dev/null @@ -1,96 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2006-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""DNS Reverse Map Names.""" - -import binascii - -import dns.name -import dns.ipv6 -import dns.ipv4 - -from dns._compat import PY3 - -ipv4_reverse_domain = dns.name.from_text('in-addr.arpa.') -ipv6_reverse_domain = dns.name.from_text('ip6.arpa.') - - -def from_address(text): - """Convert an IPv4 or IPv6 address in textual form into a Name object whose - value is the reverse-map domain name of the address. - - *text*, a ``text``, is an IPv4 or IPv6 address in textual form - (e.g. '127.0.0.1', '::1') - - Raises ``dns.exception.SyntaxError`` if the address is badly formed. - - Returns a ``dns.name.Name``. - """ - - try: - v6 = dns.ipv6.inet_aton(text) - if dns.ipv6.is_mapped(v6): - if PY3: - parts = ['%d' % byte for byte in v6[12:]] - else: - parts = ['%d' % ord(byte) for byte in v6[12:]] - origin = ipv4_reverse_domain - else: - parts = [x for x in str(binascii.hexlify(v6).decode())] - origin = ipv6_reverse_domain - except Exception: - parts = ['%d' % - byte for byte in bytearray(dns.ipv4.inet_aton(text))] - origin = ipv4_reverse_domain - parts.reverse() - return dns.name.from_text('.'.join(parts), origin=origin) - - -def to_address(name): - """Convert a reverse map domain name into textual address form. - - *name*, a ``dns.name.Name``, an IPv4 or IPv6 address in reverse-map name - form. - - Raises ``dns.exception.SyntaxError`` if the name does not have a - reverse-map form. - - Returns a ``text``. - """ - - if name.is_subdomain(ipv4_reverse_domain): - name = name.relativize(ipv4_reverse_domain) - labels = list(name.labels) - labels.reverse() - text = b'.'.join(labels) - # run through inet_aton() to check syntax and make pretty. - return dns.ipv4.inet_ntoa(dns.ipv4.inet_aton(text)) - elif name.is_subdomain(ipv6_reverse_domain): - name = name.relativize(ipv6_reverse_domain) - labels = list(name.labels) - labels.reverse() - parts = [] - i = 0 - l = len(labels) - while i < l: - parts.append(b''.join(labels[i:i + 4])) - i += 4 - text = b':'.join(parts) - # run through inet_aton() to check syntax and make pretty. - return dns.ipv6.inet_ntoa(dns.ipv6.inet_aton(text)) - else: - raise dns.exception.SyntaxError('unknown reverse-map address family') diff --git a/env/lib/python3.7/site-packages/dns/rrset.py b/env/lib/python3.7/site-packages/dns/rrset.py deleted file mode 100644 index a53ec32..0000000 --- a/env/lib/python3.7/site-packages/dns/rrset.py +++ /dev/null @@ -1,189 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""DNS RRsets (an RRset is a named rdataset)""" - - -import dns.name -import dns.rdataset -import dns.rdataclass -import dns.renderer -from ._compat import string_types - - -class RRset(dns.rdataset.Rdataset): - - """A DNS RRset (named rdataset). - - RRset inherits from Rdataset, and RRsets can be treated as - Rdatasets in most cases. There are, however, a few notable - exceptions. RRsets have different to_wire() and to_text() method - arguments, reflecting the fact that RRsets always have an owner - name. - """ - - __slots__ = ['name', 'deleting'] - - def __init__(self, name, rdclass, rdtype, covers=dns.rdatatype.NONE, - deleting=None): - """Create a new RRset.""" - - super(RRset, self).__init__(rdclass, rdtype, covers) - self.name = name - self.deleting = deleting - - def _clone(self): - obj = super(RRset, self)._clone() - obj.name = self.name - obj.deleting = self.deleting - return obj - - def __repr__(self): - if self.covers == 0: - ctext = '' - else: - ctext = '(' + dns.rdatatype.to_text(self.covers) + ')' - if self.deleting is not None: - dtext = ' delete=' + dns.rdataclass.to_text(self.deleting) - else: - dtext = '' - return '' - - def __str__(self): - return self.to_text() - - def __eq__(self, other): - if not isinstance(other, RRset): - return False - if self.name != other.name: - return False - return super(RRset, self).__eq__(other) - - def match(self, name, rdclass, rdtype, covers, deleting=None): - """Returns ``True`` if this rrset matches the specified class, type, - covers, and deletion state. - """ - - if not super(RRset, self).match(rdclass, rdtype, covers): - return False - if self.name != name or self.deleting != deleting: - return False - return True - - def to_text(self, origin=None, relativize=True, **kw): - """Convert the RRset into DNS master file format. - - See ``dns.name.Name.choose_relativity`` for more information - on how *origin* and *relativize* determine the way names - are emitted. - - Any additional keyword arguments are passed on to the rdata - ``to_text()`` method. - - *origin*, a ``dns.name.Name`` or ``None``, the origin for relative - names. - - *relativize*, a ``bool``. If ``True``, names will be relativized - to *origin*. - """ - - return super(RRset, self).to_text(self.name, origin, relativize, - self.deleting, **kw) - - def to_wire(self, file, compress=None, origin=None, **kw): - """Convert the RRset to wire format. - - All keyword arguments are passed to ``dns.rdataset.to_wire()``; see - that function for details. - - Returns an ``int``, the number of records emitted. - """ - - return super(RRset, self).to_wire(self.name, file, compress, origin, - self.deleting, **kw) - - def to_rdataset(self): - """Convert an RRset into an Rdataset. - - Returns a ``dns.rdataset.Rdataset``. - """ - return dns.rdataset.from_rdata_list(self.ttl, list(self)) - - -def from_text_list(name, ttl, rdclass, rdtype, text_rdatas, - idna_codec=None): - """Create an RRset with the specified name, TTL, class, and type, and with - the specified list of rdatas in text format. - - Returns a ``dns.rrset.RRset`` object. - """ - - if isinstance(name, string_types): - name = dns.name.from_text(name, None, idna_codec=idna_codec) - if isinstance(rdclass, string_types): - rdclass = dns.rdataclass.from_text(rdclass) - if isinstance(rdtype, string_types): - rdtype = dns.rdatatype.from_text(rdtype) - r = RRset(name, rdclass, rdtype) - r.update_ttl(ttl) - for t in text_rdatas: - rd = dns.rdata.from_text(r.rdclass, r.rdtype, t) - r.add(rd) - return r - - -def from_text(name, ttl, rdclass, rdtype, *text_rdatas): - """Create an RRset with the specified name, TTL, class, and type and with - the specified rdatas in text format. - - Returns a ``dns.rrset.RRset`` object. - """ - - return from_text_list(name, ttl, rdclass, rdtype, text_rdatas) - - -def from_rdata_list(name, ttl, rdatas, idna_codec=None): - """Create an RRset with the specified name and TTL, and with - the specified list of rdata objects. - - Returns a ``dns.rrset.RRset`` object. - """ - - if isinstance(name, string_types): - name = dns.name.from_text(name, None, idna_codec=idna_codec) - - if len(rdatas) == 0: - raise ValueError("rdata list must not be empty") - r = None - for rd in rdatas: - if r is None: - r = RRset(name, rd.rdclass, rd.rdtype) - r.update_ttl(ttl) - r.add(rd) - return r - - -def from_rdata(name, ttl, *rdatas): - """Create an RRset with the specified name and TTL, and with - the specified rdata objects. - - Returns a ``dns.rrset.RRset`` object. - """ - - return from_rdata_list(name, ttl, rdatas) diff --git a/env/lib/python3.7/site-packages/dns/set.py b/env/lib/python3.7/site-packages/dns/set.py deleted file mode 100644 index 81329bf..0000000 --- a/env/lib/python3.7/site-packages/dns/set.py +++ /dev/null @@ -1,261 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -class Set(object): - - """A simple set class. - - This class was originally used to deal with sets being missing in - ancient versions of python, but dnspython will continue to use it - as these sets are based on lists and are thus indexable, and this - ability is widely used in dnspython applications. - """ - - __slots__ = ['items'] - - def __init__(self, items=None): - """Initialize the set. - - *items*, an iterable or ``None``, the initial set of items. - """ - - self.items = [] - if items is not None: - for item in items: - self.add(item) - - def __repr__(self): - return "dns.simpleset.Set(%s)" % repr(self.items) - - def add(self, item): - """Add an item to the set. - """ - - if item not in self.items: - self.items.append(item) - - def remove(self, item): - """Remove an item from the set. - """ - - self.items.remove(item) - - def discard(self, item): - """Remove an item from the set if present. - """ - - try: - self.items.remove(item) - except ValueError: - pass - - def _clone(self): - """Make a (shallow) copy of the set. - - There is a 'clone protocol' that subclasses of this class - should use. To make a copy, first call your super's _clone() - method, and use the object returned as the new instance. Then - make shallow copies of the attributes defined in the subclass. - - This protocol allows us to write the set algorithms that - return new instances (e.g. union) once, and keep using them in - subclasses. - """ - - cls = self.__class__ - obj = cls.__new__(cls) - obj.items = list(self.items) - return obj - - def __copy__(self): - """Make a (shallow) copy of the set. - """ - - return self._clone() - - def copy(self): - """Make a (shallow) copy of the set. - """ - - return self._clone() - - def union_update(self, other): - """Update the set, adding any elements from other which are not - already in the set. - """ - - if not isinstance(other, Set): - raise ValueError('other must be a Set instance') - if self is other: - return - for item in other.items: - self.add(item) - - def intersection_update(self, other): - """Update the set, removing any elements from other which are not - in both sets. - """ - - if not isinstance(other, Set): - raise ValueError('other must be a Set instance') - if self is other: - return - # we make a copy of the list so that we can remove items from - # the list without breaking the iterator. - for item in list(self.items): - if item not in other.items: - self.items.remove(item) - - def difference_update(self, other): - """Update the set, removing any elements from other which are in - the set. - """ - - if not isinstance(other, Set): - raise ValueError('other must be a Set instance') - if self is other: - self.items = [] - else: - for item in other.items: - self.discard(item) - - def union(self, other): - """Return a new set which is the union of ``self`` and ``other``. - - Returns the same Set type as this set. - """ - - obj = self._clone() - obj.union_update(other) - return obj - - def intersection(self, other): - """Return a new set which is the intersection of ``self`` and - ``other``. - - Returns the same Set type as this set. - """ - - obj = self._clone() - obj.intersection_update(other) - return obj - - def difference(self, other): - """Return a new set which ``self`` - ``other``, i.e. the items - in ``self`` which are not also in ``other``. - - Returns the same Set type as this set. - """ - - obj = self._clone() - obj.difference_update(other) - return obj - - def __or__(self, other): - return self.union(other) - - def __and__(self, other): - return self.intersection(other) - - def __add__(self, other): - return self.union(other) - - def __sub__(self, other): - return self.difference(other) - - def __ior__(self, other): - self.union_update(other) - return self - - def __iand__(self, other): - self.intersection_update(other) - return self - - def __iadd__(self, other): - self.union_update(other) - return self - - def __isub__(self, other): - self.difference_update(other) - return self - - def update(self, other): - """Update the set, adding any elements from other which are not - already in the set. - - *other*, the collection of items with which to update the set, which - may be any iterable type. - """ - - for item in other: - self.add(item) - - def clear(self): - """Make the set empty.""" - self.items = [] - - def __eq__(self, other): - # Yes, this is inefficient but the sets we're dealing with are - # usually quite small, so it shouldn't hurt too much. - for item in self.items: - if item not in other.items: - return False - for item in other.items: - if item not in self.items: - return False - return True - - def __ne__(self, other): - return not self.__eq__(other) - - def __len__(self): - return len(self.items) - - def __iter__(self): - return iter(self.items) - - def __getitem__(self, i): - return self.items[i] - - def __delitem__(self, i): - del self.items[i] - - def issubset(self, other): - """Is this set a subset of *other*? - - Returns a ``bool``. - """ - - if not isinstance(other, Set): - raise ValueError('other must be a Set instance') - for item in self.items: - if item not in other.items: - return False - return True - - def issuperset(self, other): - """Is this set a superset of *other*? - - Returns a ``bool``. - """ - - if not isinstance(other, Set): - raise ValueError('other must be a Set instance') - for item in other.items: - if item not in self.items: - return False - return True diff --git a/env/lib/python3.7/site-packages/dns/tokenizer.py b/env/lib/python3.7/site-packages/dns/tokenizer.py deleted file mode 100644 index 880b71c..0000000 --- a/env/lib/python3.7/site-packages/dns/tokenizer.py +++ /dev/null @@ -1,571 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""Tokenize DNS master file format""" - -from io import StringIO -import sys - -import dns.exception -import dns.name -import dns.ttl -from ._compat import long, text_type, binary_type - -_DELIMITERS = { - ' ': True, - '\t': True, - '\n': True, - ';': True, - '(': True, - ')': True, - '"': True} - -_QUOTING_DELIMITERS = {'"': True} - -EOF = 0 -EOL = 1 -WHITESPACE = 2 -IDENTIFIER = 3 -QUOTED_STRING = 4 -COMMENT = 5 -DELIMITER = 6 - - -class UngetBufferFull(dns.exception.DNSException): - """An attempt was made to unget a token when the unget buffer was full.""" - - -class Token(object): - """A DNS master file format token. - - ttype: The token type - value: The token value - has_escape: Does the token value contain escapes? - """ - - def __init__(self, ttype, value='', has_escape=False): - """Initialize a token instance.""" - - self.ttype = ttype - self.value = value - self.has_escape = has_escape - - def is_eof(self): - return self.ttype == EOF - - def is_eol(self): - return self.ttype == EOL - - def is_whitespace(self): - return self.ttype == WHITESPACE - - def is_identifier(self): - return self.ttype == IDENTIFIER - - def is_quoted_string(self): - return self.ttype == QUOTED_STRING - - def is_comment(self): - return self.ttype == COMMENT - - def is_delimiter(self): - return self.ttype == DELIMITER - - def is_eol_or_eof(self): - return self.ttype == EOL or self.ttype == EOF - - def __eq__(self, other): - if not isinstance(other, Token): - return False - return (self.ttype == other.ttype and - self.value == other.value) - - def __ne__(self, other): - if not isinstance(other, Token): - return True - return (self.ttype != other.ttype or - self.value != other.value) - - def __str__(self): - return '%d "%s"' % (self.ttype, self.value) - - def unescape(self): - if not self.has_escape: - return self - unescaped = '' - l = len(self.value) - i = 0 - while i < l: - c = self.value[i] - i += 1 - if c == '\\': - if i >= l: - raise dns.exception.UnexpectedEnd - c = self.value[i] - i += 1 - if c.isdigit(): - if i >= l: - raise dns.exception.UnexpectedEnd - c2 = self.value[i] - i += 1 - if i >= l: - raise dns.exception.UnexpectedEnd - c3 = self.value[i] - i += 1 - if not (c2.isdigit() and c3.isdigit()): - raise dns.exception.SyntaxError - c = chr(int(c) * 100 + int(c2) * 10 + int(c3)) - unescaped += c - return Token(self.ttype, unescaped) - - # compatibility for old-style tuple tokens - - def __len__(self): - return 2 - - def __iter__(self): - return iter((self.ttype, self.value)) - - def __getitem__(self, i): - if i == 0: - return self.ttype - elif i == 1: - return self.value - else: - raise IndexError - - -class Tokenizer(object): - """A DNS master file format tokenizer. - - A token object is basically a (type, value) tuple. The valid - types are EOF, EOL, WHITESPACE, IDENTIFIER, QUOTED_STRING, - COMMENT, and DELIMITER. - - file: The file to tokenize - - ungotten_char: The most recently ungotten character, or None. - - ungotten_token: The most recently ungotten token, or None. - - multiline: The current multiline level. This value is increased - by one every time a '(' delimiter is read, and decreased by one every time - a ')' delimiter is read. - - quoting: This variable is true if the tokenizer is currently - reading a quoted string. - - eof: This variable is true if the tokenizer has encountered EOF. - - delimiters: The current delimiter dictionary. - - line_number: The current line number - - filename: A filename that will be returned by the where() method. - """ - - def __init__(self, f=sys.stdin, filename=None): - """Initialize a tokenizer instance. - - f: The file to tokenize. The default is sys.stdin. - This parameter may also be a string, in which case the tokenizer - will take its input from the contents of the string. - - filename: the name of the filename that the where() method - will return. - """ - - if isinstance(f, text_type): - f = StringIO(f) - if filename is None: - filename = '' - elif isinstance(f, binary_type): - f = StringIO(f.decode()) - if filename is None: - filename = '' - else: - if filename is None: - if f is sys.stdin: - filename = '' - else: - filename = '' - self.file = f - self.ungotten_char = None - self.ungotten_token = None - self.multiline = 0 - self.quoting = False - self.eof = False - self.delimiters = _DELIMITERS - self.line_number = 1 - self.filename = filename - - def _get_char(self): - """Read a character from input. - """ - - if self.ungotten_char is None: - if self.eof: - c = '' - else: - c = self.file.read(1) - if c == '': - self.eof = True - elif c == '\n': - self.line_number += 1 - else: - c = self.ungotten_char - self.ungotten_char = None - return c - - def where(self): - """Return the current location in the input. - - Returns a (string, int) tuple. The first item is the filename of - the input, the second is the current line number. - """ - - return (self.filename, self.line_number) - - def _unget_char(self, c): - """Unget a character. - - The unget buffer for characters is only one character large; it is - an error to try to unget a character when the unget buffer is not - empty. - - c: the character to unget - raises UngetBufferFull: there is already an ungotten char - """ - - if self.ungotten_char is not None: - raise UngetBufferFull - self.ungotten_char = c - - def skip_whitespace(self): - """Consume input until a non-whitespace character is encountered. - - The non-whitespace character is then ungotten, and the number of - whitespace characters consumed is returned. - - If the tokenizer is in multiline mode, then newlines are whitespace. - - Returns the number of characters skipped. - """ - - skipped = 0 - while True: - c = self._get_char() - if c != ' ' and c != '\t': - if (c != '\n') or not self.multiline: - self._unget_char(c) - return skipped - skipped += 1 - - def get(self, want_leading=False, want_comment=False): - """Get the next token. - - want_leading: If True, return a WHITESPACE token if the - first character read is whitespace. The default is False. - - want_comment: If True, return a COMMENT token if the - first token read is a comment. The default is False. - - Raises dns.exception.UnexpectedEnd: input ended prematurely - - Raises dns.exception.SyntaxError: input was badly formed - - Returns a Token. - """ - - if self.ungotten_token is not None: - token = self.ungotten_token - self.ungotten_token = None - if token.is_whitespace(): - if want_leading: - return token - elif token.is_comment(): - if want_comment: - return token - else: - return token - skipped = self.skip_whitespace() - if want_leading and skipped > 0: - return Token(WHITESPACE, ' ') - token = '' - ttype = IDENTIFIER - has_escape = False - while True: - c = self._get_char() - if c == '' or c in self.delimiters: - if c == '' and self.quoting: - raise dns.exception.UnexpectedEnd - if token == '' and ttype != QUOTED_STRING: - if c == '(': - self.multiline += 1 - self.skip_whitespace() - continue - elif c == ')': - if self.multiline <= 0: - raise dns.exception.SyntaxError - self.multiline -= 1 - self.skip_whitespace() - continue - elif c == '"': - if not self.quoting: - self.quoting = True - self.delimiters = _QUOTING_DELIMITERS - ttype = QUOTED_STRING - continue - else: - self.quoting = False - self.delimiters = _DELIMITERS - self.skip_whitespace() - continue - elif c == '\n': - return Token(EOL, '\n') - elif c == ';': - while 1: - c = self._get_char() - if c == '\n' or c == '': - break - token += c - if want_comment: - self._unget_char(c) - return Token(COMMENT, token) - elif c == '': - if self.multiline: - raise dns.exception.SyntaxError( - 'unbalanced parentheses') - return Token(EOF) - elif self.multiline: - self.skip_whitespace() - token = '' - continue - else: - return Token(EOL, '\n') - else: - # This code exists in case we ever want a - # delimiter to be returned. It never produces - # a token currently. - token = c - ttype = DELIMITER - else: - self._unget_char(c) - break - elif self.quoting: - if c == '\\': - c = self._get_char() - if c == '': - raise dns.exception.UnexpectedEnd - if c.isdigit(): - c2 = self._get_char() - if c2 == '': - raise dns.exception.UnexpectedEnd - c3 = self._get_char() - if c == '': - raise dns.exception.UnexpectedEnd - if not (c2.isdigit() and c3.isdigit()): - raise dns.exception.SyntaxError - c = chr(int(c) * 100 + int(c2) * 10 + int(c3)) - elif c == '\n': - raise dns.exception.SyntaxError('newline in quoted string') - elif c == '\\': - # - # It's an escape. Put it and the next character into - # the token; it will be checked later for goodness. - # - token += c - has_escape = True - c = self._get_char() - if c == '' or c == '\n': - raise dns.exception.UnexpectedEnd - token += c - if token == '' and ttype != QUOTED_STRING: - if self.multiline: - raise dns.exception.SyntaxError('unbalanced parentheses') - ttype = EOF - return Token(ttype, token, has_escape) - - def unget(self, token): - """Unget a token. - - The unget buffer for tokens is only one token large; it is - an error to try to unget a token when the unget buffer is not - empty. - - token: the token to unget - - Raises UngetBufferFull: there is already an ungotten token - """ - - if self.ungotten_token is not None: - raise UngetBufferFull - self.ungotten_token = token - - def next(self): - """Return the next item in an iteration. - - Returns a Token. - """ - - token = self.get() - if token.is_eof(): - raise StopIteration - return token - - __next__ = next - - def __iter__(self): - return self - - # Helpers - - def get_int(self, base=10): - """Read the next token and interpret it as an integer. - - Raises dns.exception.SyntaxError if not an integer. - - Returns an int. - """ - - token = self.get().unescape() - if not token.is_identifier(): - raise dns.exception.SyntaxError('expecting an identifier') - if not token.value.isdigit(): - raise dns.exception.SyntaxError('expecting an integer') - return int(token.value, base) - - def get_uint8(self): - """Read the next token and interpret it as an 8-bit unsigned - integer. - - Raises dns.exception.SyntaxError if not an 8-bit unsigned integer. - - Returns an int. - """ - - value = self.get_int() - if value < 0 or value > 255: - raise dns.exception.SyntaxError( - '%d is not an unsigned 8-bit integer' % value) - return value - - def get_uint16(self, base=10): - """Read the next token and interpret it as a 16-bit unsigned - integer. - - Raises dns.exception.SyntaxError if not a 16-bit unsigned integer. - - Returns an int. - """ - - value = self.get_int(base=base) - if value < 0 or value > 65535: - if base == 8: - raise dns.exception.SyntaxError( - '%o is not an octal unsigned 16-bit integer' % value) - else: - raise dns.exception.SyntaxError( - '%d is not an unsigned 16-bit integer' % value) - return value - - def get_uint32(self): - """Read the next token and interpret it as a 32-bit unsigned - integer. - - Raises dns.exception.SyntaxError if not a 32-bit unsigned integer. - - Returns an int. - """ - - token = self.get().unescape() - if not token.is_identifier(): - raise dns.exception.SyntaxError('expecting an identifier') - if not token.value.isdigit(): - raise dns.exception.SyntaxError('expecting an integer') - value = long(token.value) - if value < 0 or value > long(4294967296): - raise dns.exception.SyntaxError( - '%d is not an unsigned 32-bit integer' % value) - return value - - def get_string(self, origin=None): - """Read the next token and interpret it as a string. - - Raises dns.exception.SyntaxError if not a string. - - Returns a string. - """ - - token = self.get().unescape() - if not (token.is_identifier() or token.is_quoted_string()): - raise dns.exception.SyntaxError('expecting a string') - return token.value - - def get_identifier(self, origin=None): - """Read the next token, which should be an identifier. - - Raises dns.exception.SyntaxError if not an identifier. - - Returns a string. - """ - - token = self.get().unescape() - if not token.is_identifier(): - raise dns.exception.SyntaxError('expecting an identifier') - return token.value - - def get_name(self, origin=None): - """Read the next token and interpret it as a DNS name. - - Raises dns.exception.SyntaxError if not a name. - - Returns a dns.name.Name. - """ - - token = self.get() - if not token.is_identifier(): - raise dns.exception.SyntaxError('expecting an identifier') - return dns.name.from_text(token.value, origin) - - def get_eol(self): - """Read the next token and raise an exception if it isn't EOL or - EOF. - - Returns a string. - """ - - token = self.get() - if not token.is_eol_or_eof(): - raise dns.exception.SyntaxError( - 'expected EOL or EOF, got %d "%s"' % (token.ttype, - token.value)) - return token.value - - def get_ttl(self): - """Read the next token and interpret it as a DNS TTL. - - Raises dns.exception.SyntaxError or dns.ttl.BadTTL if not an - identifier or badly formed. - - Returns an int. - """ - - token = self.get().unescape() - if not token.is_identifier(): - raise dns.exception.SyntaxError('expecting an identifier') - return dns.ttl.from_text(token.value) diff --git a/env/lib/python3.7/site-packages/dns/tsig.py b/env/lib/python3.7/site-packages/dns/tsig.py deleted file mode 100644 index 3daa387..0000000 --- a/env/lib/python3.7/site-packages/dns/tsig.py +++ /dev/null @@ -1,236 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2001-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""DNS TSIG support.""" - -import hashlib -import hmac -import struct - -import dns.exception -import dns.rdataclass -import dns.name -from ._compat import long, string_types, text_type - -class BadTime(dns.exception.DNSException): - - """The current time is not within the TSIG's validity time.""" - - -class BadSignature(dns.exception.DNSException): - - """The TSIG signature fails to verify.""" - - -class PeerError(dns.exception.DNSException): - - """Base class for all TSIG errors generated by the remote peer""" - - -class PeerBadKey(PeerError): - - """The peer didn't know the key we used""" - - -class PeerBadSignature(PeerError): - - """The peer didn't like the signature we sent""" - - -class PeerBadTime(PeerError): - - """The peer didn't like the time we sent""" - - -class PeerBadTruncation(PeerError): - - """The peer didn't like amount of truncation in the TSIG we sent""" - -# TSIG Algorithms - -HMAC_MD5 = dns.name.from_text("HMAC-MD5.SIG-ALG.REG.INT") -HMAC_SHA1 = dns.name.from_text("hmac-sha1") -HMAC_SHA224 = dns.name.from_text("hmac-sha224") -HMAC_SHA256 = dns.name.from_text("hmac-sha256") -HMAC_SHA384 = dns.name.from_text("hmac-sha384") -HMAC_SHA512 = dns.name.from_text("hmac-sha512") - -_hashes = { - HMAC_SHA224: hashlib.sha224, - HMAC_SHA256: hashlib.sha256, - HMAC_SHA384: hashlib.sha384, - HMAC_SHA512: hashlib.sha512, - HMAC_SHA1: hashlib.sha1, - HMAC_MD5: hashlib.md5, -} - -default_algorithm = HMAC_MD5 - -BADSIG = 16 -BADKEY = 17 -BADTIME = 18 -BADTRUNC = 22 - - -def sign(wire, keyname, secret, time, fudge, original_id, error, - other_data, request_mac, ctx=None, multi=False, first=True, - algorithm=default_algorithm): - """Return a (tsig_rdata, mac, ctx) tuple containing the HMAC TSIG rdata - for the input parameters, the HMAC MAC calculated by applying the - TSIG signature algorithm, and the TSIG digest context. - @rtype: (string, string, hmac.HMAC object) - @raises ValueError: I{other_data} is too long - @raises NotImplementedError: I{algorithm} is not supported - """ - - if isinstance(other_data, text_type): - other_data = other_data.encode() - (algorithm_name, digestmod) = get_algorithm(algorithm) - if first: - ctx = hmac.new(secret, digestmod=digestmod) - ml = len(request_mac) - if ml > 0: - ctx.update(struct.pack('!H', ml)) - ctx.update(request_mac) - id = struct.pack('!H', original_id) - ctx.update(id) - ctx.update(wire[2:]) - if first: - ctx.update(keyname.to_digestable()) - ctx.update(struct.pack('!H', dns.rdataclass.ANY)) - ctx.update(struct.pack('!I', 0)) - long_time = time + long(0) - upper_time = (long_time >> 32) & long(0xffff) - lower_time = long_time & long(0xffffffff) - time_mac = struct.pack('!HIH', upper_time, lower_time, fudge) - pre_mac = algorithm_name + time_mac - ol = len(other_data) - if ol > 65535: - raise ValueError('TSIG Other Data is > 65535 bytes') - post_mac = struct.pack('!HH', error, ol) + other_data - if first: - ctx.update(pre_mac) - ctx.update(post_mac) - else: - ctx.update(time_mac) - mac = ctx.digest() - mpack = struct.pack('!H', len(mac)) - tsig_rdata = pre_mac + mpack + mac + id + post_mac - if multi: - ctx = hmac.new(secret, digestmod=digestmod) - ml = len(mac) - ctx.update(struct.pack('!H', ml)) - ctx.update(mac) - else: - ctx = None - return (tsig_rdata, mac, ctx) - - -def hmac_md5(wire, keyname, secret, time, fudge, original_id, error, - other_data, request_mac, ctx=None, multi=False, first=True, - algorithm=default_algorithm): - return sign(wire, keyname, secret, time, fudge, original_id, error, - other_data, request_mac, ctx, multi, first, algorithm) - - -def validate(wire, keyname, secret, now, request_mac, tsig_start, tsig_rdata, - tsig_rdlen, ctx=None, multi=False, first=True): - """Validate the specified TSIG rdata against the other input parameters. - - @raises FormError: The TSIG is badly formed. - @raises BadTime: There is too much time skew between the client and the - server. - @raises BadSignature: The TSIG signature did not validate - @rtype: hmac.HMAC object""" - - (adcount,) = struct.unpack("!H", wire[10:12]) - if adcount == 0: - raise dns.exception.FormError - adcount -= 1 - new_wire = wire[0:10] + struct.pack("!H", adcount) + wire[12:tsig_start] - current = tsig_rdata - (aname, used) = dns.name.from_wire(wire, current) - current = current + used - (upper_time, lower_time, fudge, mac_size) = \ - struct.unpack("!HIHH", wire[current:current + 10]) - time = ((upper_time + long(0)) << 32) + (lower_time + long(0)) - current += 10 - mac = wire[current:current + mac_size] - current += mac_size - (original_id, error, other_size) = \ - struct.unpack("!HHH", wire[current:current + 6]) - current += 6 - other_data = wire[current:current + other_size] - current += other_size - if current != tsig_rdata + tsig_rdlen: - raise dns.exception.FormError - if error != 0: - if error == BADSIG: - raise PeerBadSignature - elif error == BADKEY: - raise PeerBadKey - elif error == BADTIME: - raise PeerBadTime - elif error == BADTRUNC: - raise PeerBadTruncation - else: - raise PeerError('unknown TSIG error code %d' % error) - time_low = time - fudge - time_high = time + fudge - if now < time_low or now > time_high: - raise BadTime - (junk, our_mac, ctx) = sign(new_wire, keyname, secret, time, fudge, - original_id, error, other_data, - request_mac, ctx, multi, first, aname) - if our_mac != mac: - raise BadSignature - return ctx - - -def get_algorithm(algorithm): - """Returns the wire format string and the hash module to use for the - specified TSIG algorithm - - @rtype: (string, hash constructor) - @raises NotImplementedError: I{algorithm} is not supported - """ - - if isinstance(algorithm, string_types): - algorithm = dns.name.from_text(algorithm) - - try: - return (algorithm.to_digestable(), _hashes[algorithm]) - except KeyError: - raise NotImplementedError("TSIG algorithm " + str(algorithm) + - " is not supported") - - -def get_algorithm_and_mac(wire, tsig_rdata, tsig_rdlen): - """Return the tsig algorithm for the specified tsig_rdata - @raises FormError: The TSIG is badly formed. - """ - current = tsig_rdata - (aname, used) = dns.name.from_wire(wire, current) - current = current + used - (upper_time, lower_time, fudge, mac_size) = \ - struct.unpack("!HIHH", wire[current:current + 10]) - current += 10 - mac = wire[current:current + mac_size] - current += mac_size - if current > tsig_rdata + tsig_rdlen: - raise dns.exception.FormError - return (aname, mac) diff --git a/env/lib/python3.7/site-packages/dns/tsigkeyring.py b/env/lib/python3.7/site-packages/dns/tsigkeyring.py deleted file mode 100644 index 5e5fe1c..0000000 --- a/env/lib/python3.7/site-packages/dns/tsigkeyring.py +++ /dev/null @@ -1,50 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""A place to store TSIG keys.""" - -from dns._compat import maybe_decode, maybe_encode - -import base64 - -import dns.name - - -def from_text(textring): - """Convert a dictionary containing (textual DNS name, base64 secret) pairs - into a binary keyring which has (dns.name.Name, binary secret) pairs. - @rtype: dict""" - - keyring = {} - for keytext in textring: - keyname = dns.name.from_text(keytext) - secret = base64.decodestring(maybe_encode(textring[keytext])) - keyring[keyname] = secret - return keyring - - -def to_text(keyring): - """Convert a dictionary containing (dns.name.Name, binary secret) pairs - into a text keyring which has (textual DNS name, base64 secret) pairs. - @rtype: dict""" - - textring = {} - for keyname in keyring: - keytext = maybe_decode(keyname.to_text()) - secret = maybe_decode(base64.encodestring(keyring[keyname])) - textring[keytext] = secret - return textring diff --git a/env/lib/python3.7/site-packages/dns/ttl.py b/env/lib/python3.7/site-packages/dns/ttl.py deleted file mode 100644 index 4be16be..0000000 --- a/env/lib/python3.7/site-packages/dns/ttl.py +++ /dev/null @@ -1,70 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""DNS TTL conversion.""" - -import dns.exception -from ._compat import long - - -class BadTTL(dns.exception.SyntaxError): - """DNS TTL value is not well-formed.""" - - -def from_text(text): - """Convert the text form of a TTL to an integer. - - The BIND 8 units syntax for TTLs (e.g. '1w6d4h3m10s') is supported. - - *text*, a ``text``, the textual TTL. - - Raises ``dns.ttl.BadTTL`` if the TTL is not well-formed. - - Returns an ``int``. - """ - - if text.isdigit(): - total = long(text) - else: - if not text[0].isdigit(): - raise BadTTL - total = long(0) - current = long(0) - for c in text: - if c.isdigit(): - current *= 10 - current += long(c) - else: - c = c.lower() - if c == 'w': - total += current * long(604800) - elif c == 'd': - total += current * long(86400) - elif c == 'h': - total += current * long(3600) - elif c == 'm': - total += current * long(60) - elif c == 's': - total += current - else: - raise BadTTL("unknown unit '%s'" % c) - current = 0 - if not current == 0: - raise BadTTL("trailing integer") - if total < long(0) or total > long(2147483647): - raise BadTTL("TTL should be between 0 and 2^31 - 1 (inclusive)") - return total diff --git a/env/lib/python3.7/site-packages/dns/update.py b/env/lib/python3.7/site-packages/dns/update.py deleted file mode 100644 index 96a00d5..0000000 --- a/env/lib/python3.7/site-packages/dns/update.py +++ /dev/null @@ -1,279 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""DNS Dynamic Update Support""" - - -import dns.message -import dns.name -import dns.opcode -import dns.rdata -import dns.rdataclass -import dns.rdataset -import dns.tsig -from ._compat import string_types - - -class Update(dns.message.Message): - - def __init__(self, zone, rdclass=dns.rdataclass.IN, keyring=None, - keyname=None, keyalgorithm=dns.tsig.default_algorithm): - """Initialize a new DNS Update object. - - See the documentation of the Message class for a complete - description of the keyring dictionary. - - *zone*, a ``dns.name.Name`` or ``text``, the zone which is being - updated. - - *rdclass*, an ``int`` or ``text``, the class of the zone. - - *keyring*, a ``dict``, the TSIG keyring to use. If a - *keyring* is specified but a *keyname* is not, then the key - used will be the first key in the *keyring*. Note that the - order of keys in a dictionary is not defined, so applications - should supply a keyname when a keyring is used, unless they - know the keyring contains only one key. - - *keyname*, a ``dns.name.Name`` or ``None``, the name of the TSIG key - to use; defaults to ``None``. The key must be defined in the keyring. - - *keyalgorithm*, a ``dns.name.Name``, the TSIG algorithm to use. - """ - super(Update, self).__init__() - self.flags |= dns.opcode.to_flags(dns.opcode.UPDATE) - if isinstance(zone, string_types): - zone = dns.name.from_text(zone) - self.origin = zone - if isinstance(rdclass, string_types): - rdclass = dns.rdataclass.from_text(rdclass) - self.zone_rdclass = rdclass - self.find_rrset(self.question, self.origin, rdclass, dns.rdatatype.SOA, - create=True, force_unique=True) - if keyring is not None: - self.use_tsig(keyring, keyname, algorithm=keyalgorithm) - - def _add_rr(self, name, ttl, rd, deleting=None, section=None): - """Add a single RR to the update section.""" - - if section is None: - section = self.authority - covers = rd.covers() - rrset = self.find_rrset(section, name, self.zone_rdclass, rd.rdtype, - covers, deleting, True, True) - rrset.add(rd, ttl) - - def _add(self, replace, section, name, *args): - """Add records. - - *replace* is the replacement mode. If ``False``, - RRs are added to an existing RRset; if ``True``, the RRset - is replaced with the specified contents. The second - argument is the section to add to. The third argument - is always a name. The other arguments can be: - - - rdataset... - - - ttl, rdata... - - - ttl, rdtype, string... - """ - - if isinstance(name, string_types): - name = dns.name.from_text(name, None) - if isinstance(args[0], dns.rdataset.Rdataset): - for rds in args: - if replace: - self.delete(name, rds.rdtype) - for rd in rds: - self._add_rr(name, rds.ttl, rd, section=section) - else: - args = list(args) - ttl = int(args.pop(0)) - if isinstance(args[0], dns.rdata.Rdata): - if replace: - self.delete(name, args[0].rdtype) - for rd in args: - self._add_rr(name, ttl, rd, section=section) - else: - rdtype = args.pop(0) - if isinstance(rdtype, string_types): - rdtype = dns.rdatatype.from_text(rdtype) - if replace: - self.delete(name, rdtype) - for s in args: - rd = dns.rdata.from_text(self.zone_rdclass, rdtype, s, - self.origin) - self._add_rr(name, ttl, rd, section=section) - - def add(self, name, *args): - """Add records. - - The first argument is always a name. The other - arguments can be: - - - rdataset... - - - ttl, rdata... - - - ttl, rdtype, string... - """ - - self._add(False, self.authority, name, *args) - - def delete(self, name, *args): - """Delete records. - - The first argument is always a name. The other - arguments can be: - - - *empty* - - - rdataset... - - - rdata... - - - rdtype, [string...] - """ - - if isinstance(name, string_types): - name = dns.name.from_text(name, None) - if len(args) == 0: - self.find_rrset(self.authority, name, dns.rdataclass.ANY, - dns.rdatatype.ANY, dns.rdatatype.NONE, - dns.rdatatype.ANY, True, True) - elif isinstance(args[0], dns.rdataset.Rdataset): - for rds in args: - for rd in rds: - self._add_rr(name, 0, rd, dns.rdataclass.NONE) - else: - args = list(args) - if isinstance(args[0], dns.rdata.Rdata): - for rd in args: - self._add_rr(name, 0, rd, dns.rdataclass.NONE) - else: - rdtype = args.pop(0) - if isinstance(rdtype, string_types): - rdtype = dns.rdatatype.from_text(rdtype) - if len(args) == 0: - self.find_rrset(self.authority, name, - self.zone_rdclass, rdtype, - dns.rdatatype.NONE, - dns.rdataclass.ANY, - True, True) - else: - for s in args: - rd = dns.rdata.from_text(self.zone_rdclass, rdtype, s, - self.origin) - self._add_rr(name, 0, rd, dns.rdataclass.NONE) - - def replace(self, name, *args): - """Replace records. - - The first argument is always a name. The other - arguments can be: - - - rdataset... - - - ttl, rdata... - - - ttl, rdtype, string... - - Note that if you want to replace the entire node, you should do - a delete of the name followed by one or more calls to add. - """ - - self._add(True, self.authority, name, *args) - - def present(self, name, *args): - """Require that an owner name (and optionally an rdata type, - or specific rdataset) exists as a prerequisite to the - execution of the update. - - The first argument is always a name. - The other arguments can be: - - - rdataset... - - - rdata... - - - rdtype, string... - """ - - if isinstance(name, string_types): - name = dns.name.from_text(name, None) - if len(args) == 0: - self.find_rrset(self.answer, name, - dns.rdataclass.ANY, dns.rdatatype.ANY, - dns.rdatatype.NONE, None, - True, True) - elif isinstance(args[0], dns.rdataset.Rdataset) or \ - isinstance(args[0], dns.rdata.Rdata) or \ - len(args) > 1: - if not isinstance(args[0], dns.rdataset.Rdataset): - # Add a 0 TTL - args = list(args) - args.insert(0, 0) - self._add(False, self.answer, name, *args) - else: - rdtype = args[0] - if isinstance(rdtype, string_types): - rdtype = dns.rdatatype.from_text(rdtype) - self.find_rrset(self.answer, name, - dns.rdataclass.ANY, rdtype, - dns.rdatatype.NONE, None, - True, True) - - def absent(self, name, rdtype=None): - """Require that an owner name (and optionally an rdata type) does - not exist as a prerequisite to the execution of the update.""" - - if isinstance(name, string_types): - name = dns.name.from_text(name, None) - if rdtype is None: - self.find_rrset(self.answer, name, - dns.rdataclass.NONE, dns.rdatatype.ANY, - dns.rdatatype.NONE, None, - True, True) - else: - if isinstance(rdtype, string_types): - rdtype = dns.rdatatype.from_text(rdtype) - self.find_rrset(self.answer, name, - dns.rdataclass.NONE, rdtype, - dns.rdatatype.NONE, None, - True, True) - - def to_wire(self, origin=None, max_size=65535): - """Return a string containing the update in DNS compressed wire - format. - - *origin*, a ``dns.name.Name`` or ``None``, the origin to be - appended to any relative names. If *origin* is ``None``, then - the origin of the ``dns.update.Update`` message object is used - (i.e. the *zone* parameter passed when the Update object was - created). - - *max_size*, an ``int``, the maximum size of the wire format - output; default is 0, which means "the message's request - payload, if nonzero, or 65535". - - Returns a ``binary``. - """ - - if origin is None: - origin = self.origin - return super(Update, self).to_wire(origin, max_size) diff --git a/env/lib/python3.7/site-packages/dns/version.py b/env/lib/python3.7/site-packages/dns/version.py deleted file mode 100644 index f116904..0000000 --- a/env/lib/python3.7/site-packages/dns/version.py +++ /dev/null @@ -1,43 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""dnspython release version information.""" - -#: MAJOR -MAJOR = 1 -#: MINOR -MINOR = 16 -#: MICRO -MICRO = 0 -#: RELEASELEVEL -RELEASELEVEL = 0x0f -#: SERIAL -SERIAL = 0 - -if RELEASELEVEL == 0x0f: - #: version - version = '%d.%d.%d' % (MAJOR, MINOR, MICRO) -elif RELEASELEVEL == 0x00: - version = '%d.%d.%dx%d' % \ - (MAJOR, MINOR, MICRO, SERIAL) -else: - version = '%d.%d.%d%x%d' % \ - (MAJOR, MINOR, MICRO, RELEASELEVEL, SERIAL) - -#: hexversion -hexversion = MAJOR << 24 | MINOR << 16 | MICRO << 8 | RELEASELEVEL << 4 | \ - SERIAL diff --git a/env/lib/python3.7/site-packages/dns/wiredata.py b/env/lib/python3.7/site-packages/dns/wiredata.py deleted file mode 100644 index ea3c1e6..0000000 --- a/env/lib/python3.7/site-packages/dns/wiredata.py +++ /dev/null @@ -1,103 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2011,2017 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""DNS Wire Data Helper""" - -import dns.exception -from ._compat import binary_type, string_types, PY2 - -# Figure out what constant python passes for an unspecified slice bound. -# It's supposed to be sys.maxint, yet on 64-bit windows sys.maxint is 2^31 - 1 -# but Python uses 2^63 - 1 as the constant. Rather than making pointless -# extra comparisons, duplicating code, or weakening WireData, we just figure -# out what constant Python will use. - - -class _SliceUnspecifiedBound(binary_type): - - def __getitem__(self, key): - return key.stop - - if PY2: - def __getslice__(self, i, j): # pylint: disable=getslice-method - return self.__getitem__(slice(i, j)) - -_unspecified_bound = _SliceUnspecifiedBound()[1:] - - -class WireData(binary_type): - # WireData is a binary type with stricter slicing - - def __getitem__(self, key): - try: - if isinstance(key, slice): - # make sure we are not going outside of valid ranges, - # do stricter control of boundaries than python does - # by default - start = key.start - stop = key.stop - - if PY2: - if stop == _unspecified_bound: - # handle the case where the right bound is unspecified - stop = len(self) - - if start < 0 or stop < 0: - raise dns.exception.FormError - # If it's not an empty slice, access left and right bounds - # to make sure they're valid - if start != stop: - super(WireData, self).__getitem__(start) - super(WireData, self).__getitem__(stop - 1) - else: - for index in (start, stop): - if index is None: - continue - elif abs(index) > len(self): - raise dns.exception.FormError - - return WireData(super(WireData, self).__getitem__( - slice(start, stop))) - return bytearray(self.unwrap())[key] - except IndexError: - raise dns.exception.FormError - - if PY2: - def __getslice__(self, i, j): # pylint: disable=getslice-method - return self.__getitem__(slice(i, j)) - - def __iter__(self): - i = 0 - while 1: - try: - yield self[i] - i += 1 - except dns.exception.FormError: - raise StopIteration - - def unwrap(self): - return binary_type(self) - - -def maybe_wrap(wire): - if isinstance(wire, WireData): - return wire - elif isinstance(wire, binary_type): - return WireData(wire) - elif isinstance(wire, string_types): - return WireData(wire.encode()) - raise ValueError("unhandled type %s" % type(wire)) diff --git a/env/lib/python3.7/site-packages/dns/zone.py b/env/lib/python3.7/site-packages/dns/zone.py deleted file mode 100644 index 1e2fe78..0000000 --- a/env/lib/python3.7/site-packages/dns/zone.py +++ /dev/null @@ -1,1127 +0,0 @@ -# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license - -# Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose with or without fee is hereby granted, -# provided that the above copyright notice and this permission notice -# appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -"""DNS Zones.""" - -from __future__ import generators - -import sys -import re -import os -from io import BytesIO - -import dns.exception -import dns.name -import dns.node -import dns.rdataclass -import dns.rdatatype -import dns.rdata -import dns.rdtypes.ANY.SOA -import dns.rrset -import dns.tokenizer -import dns.ttl -import dns.grange -from ._compat import string_types, text_type, PY3 - - -class BadZone(dns.exception.DNSException): - - """The DNS zone is malformed.""" - - -class NoSOA(BadZone): - - """The DNS zone has no SOA RR at its origin.""" - - -class NoNS(BadZone): - - """The DNS zone has no NS RRset at its origin.""" - - -class UnknownOrigin(BadZone): - - """The DNS zone's origin is unknown.""" - - -class Zone(object): - - """A DNS zone. - - A Zone is a mapping from names to nodes. The zone object may be - treated like a Python dictionary, e.g. zone[name] will retrieve - the node associated with that name. The I{name} may be a - dns.name.Name object, or it may be a string. In the either case, - if the name is relative it is treated as relative to the origin of - the zone. - - @ivar rdclass: The zone's rdata class; the default is class IN. - @type rdclass: int - @ivar origin: The origin of the zone. - @type origin: dns.name.Name object - @ivar nodes: A dictionary mapping the names of nodes in the zone to the - nodes themselves. - @type nodes: dict - @ivar relativize: should names in the zone be relativized? - @type relativize: bool - @cvar node_factory: the factory used to create a new node - @type node_factory: class or callable - """ - - node_factory = dns.node.Node - - __slots__ = ['rdclass', 'origin', 'nodes', 'relativize'] - - def __init__(self, origin, rdclass=dns.rdataclass.IN, relativize=True): - """Initialize a zone object. - - @param origin: The origin of the zone. - @type origin: dns.name.Name object - @param rdclass: The zone's rdata class; the default is class IN. - @type rdclass: int""" - - if origin is not None: - if isinstance(origin, string_types): - origin = dns.name.from_text(origin) - elif not isinstance(origin, dns.name.Name): - raise ValueError("origin parameter must be convertible to a " - "DNS name") - if not origin.is_absolute(): - raise ValueError("origin parameter must be an absolute name") - self.origin = origin - self.rdclass = rdclass - self.nodes = {} - self.relativize = relativize - - def __eq__(self, other): - """Two zones are equal if they have the same origin, class, and - nodes. - @rtype: bool - """ - - if not isinstance(other, Zone): - return False - if self.rdclass != other.rdclass or \ - self.origin != other.origin or \ - self.nodes != other.nodes: - return False - return True - - def __ne__(self, other): - """Are two zones not equal? - @rtype: bool - """ - - return not self.__eq__(other) - - def _validate_name(self, name): - if isinstance(name, string_types): - name = dns.name.from_text(name, None) - elif not isinstance(name, dns.name.Name): - raise KeyError("name parameter must be convertible to a DNS name") - if name.is_absolute(): - if not name.is_subdomain(self.origin): - raise KeyError( - "name parameter must be a subdomain of the zone origin") - if self.relativize: - name = name.relativize(self.origin) - return name - - def __getitem__(self, key): - key = self._validate_name(key) - return self.nodes[key] - - def __setitem__(self, key, value): - key = self._validate_name(key) - self.nodes[key] = value - - def __delitem__(self, key): - key = self._validate_name(key) - del self.nodes[key] - - def __iter__(self): - return self.nodes.__iter__() - - def iterkeys(self): - if PY3: - return self.nodes.keys() # pylint: disable=dict-keys-not-iterating - else: - return self.nodes.iterkeys() # pylint: disable=dict-iter-method - - def keys(self): - return self.nodes.keys() # pylint: disable=dict-keys-not-iterating - - def itervalues(self): - if PY3: - return self.nodes.values() # pylint: disable=dict-values-not-iterating - else: - return self.nodes.itervalues() # pylint: disable=dict-iter-method - - def values(self): - return self.nodes.values() # pylint: disable=dict-values-not-iterating - - def items(self): - return self.nodes.items() # pylint: disable=dict-items-not-iterating - - iteritems = items - - def get(self, key): - key = self._validate_name(key) - return self.nodes.get(key) - - def __contains__(self, other): - return other in self.nodes - - def find_node(self, name, create=False): - """Find a node in the zone, possibly creating it. - - @param name: the name of the node to find - @type name: dns.name.Name object or string - @param create: should the node be created if it doesn't exist? - @type create: bool - @raises KeyError: the name is not known and create was not specified. - @rtype: dns.node.Node object - """ - - name = self._validate_name(name) - node = self.nodes.get(name) - if node is None: - if not create: - raise KeyError - node = self.node_factory() - self.nodes[name] = node - return node - - def get_node(self, name, create=False): - """Get a node in the zone, possibly creating it. - - This method is like L{find_node}, except it returns None instead - of raising an exception if the node does not exist and creation - has not been requested. - - @param name: the name of the node to find - @type name: dns.name.Name object or string - @param create: should the node be created if it doesn't exist? - @type create: bool - @rtype: dns.node.Node object or None - """ - - try: - node = self.find_node(name, create) - except KeyError: - node = None - return node - - def delete_node(self, name): - """Delete the specified node if it exists. - - It is not an error if the node does not exist. - """ - - name = self._validate_name(name) - if name in self.nodes: - del self.nodes[name] - - def find_rdataset(self, name, rdtype, covers=dns.rdatatype.NONE, - create=False): - """Look for rdata with the specified name and type in the zone, - and return an rdataset encapsulating it. - - The I{name}, I{rdtype}, and I{covers} parameters may be - strings, in which case they will be converted to their proper - type. - - The rdataset returned is not a copy; changes to it will change - the zone. - - KeyError is raised if the name or type are not found. - Use L{get_rdataset} if you want to have None returned instead. - - @param name: the owner name to look for - @type name: DNS.name.Name object or string - @param rdtype: the rdata type desired - @type rdtype: int or string - @param covers: the covered type (defaults to None) - @type covers: int or string - @param create: should the node and rdataset be created if they do not - exist? - @type create: bool - @raises KeyError: the node or rdata could not be found - @rtype: dns.rdataset.Rdataset object - """ - - name = self._validate_name(name) - if isinstance(rdtype, string_types): - rdtype = dns.rdatatype.from_text(rdtype) - if isinstance(covers, string_types): - covers = dns.rdatatype.from_text(covers) - node = self.find_node(name, create) - return node.find_rdataset(self.rdclass, rdtype, covers, create) - - def get_rdataset(self, name, rdtype, covers=dns.rdatatype.NONE, - create=False): - """Look for rdata with the specified name and type in the zone, - and return an rdataset encapsulating it. - - The I{name}, I{rdtype}, and I{covers} parameters may be - strings, in which case they will be converted to their proper - type. - - The rdataset returned is not a copy; changes to it will change - the zone. - - None is returned if the name or type are not found. - Use L{find_rdataset} if you want to have KeyError raised instead. - - @param name: the owner name to look for - @type name: DNS.name.Name object or string - @param rdtype: the rdata type desired - @type rdtype: int or string - @param covers: the covered type (defaults to None) - @type covers: int or string - @param create: should the node and rdataset be created if they do not - exist? - @type create: bool - @rtype: dns.rdataset.Rdataset object or None - """ - - try: - rdataset = self.find_rdataset(name, rdtype, covers, create) - except KeyError: - rdataset = None - return rdataset - - def delete_rdataset(self, name, rdtype, covers=dns.rdatatype.NONE): - """Delete the rdataset matching I{rdtype} and I{covers}, if it - exists at the node specified by I{name}. - - The I{name}, I{rdtype}, and I{covers} parameters may be - strings, in which case they will be converted to their proper - type. - - It is not an error if the node does not exist, or if there is no - matching rdataset at the node. - - If the node has no rdatasets after the deletion, it will itself - be deleted. - - @param name: the owner name to look for - @type name: DNS.name.Name object or string - @param rdtype: the rdata type desired - @type rdtype: int or string - @param covers: the covered type (defaults to None) - @type covers: int or string - """ - - name = self._validate_name(name) - if isinstance(rdtype, string_types): - rdtype = dns.rdatatype.from_text(rdtype) - if isinstance(covers, string_types): - covers = dns.rdatatype.from_text(covers) - node = self.get_node(name) - if node is not None: - node.delete_rdataset(self.rdclass, rdtype, covers) - if len(node) == 0: - self.delete_node(name) - - def replace_rdataset(self, name, replacement): - """Replace an rdataset at name. - - It is not an error if there is no rdataset matching I{replacement}. - - Ownership of the I{replacement} object is transferred to the zone; - in other words, this method does not store a copy of I{replacement} - at the node, it stores I{replacement} itself. - - If the I{name} node does not exist, it is created. - - @param name: the owner name - @type name: DNS.name.Name object or string - @param replacement: the replacement rdataset - @type replacement: dns.rdataset.Rdataset - """ - - if replacement.rdclass != self.rdclass: - raise ValueError('replacement.rdclass != zone.rdclass') - node = self.find_node(name, True) - node.replace_rdataset(replacement) - - def find_rrset(self, name, rdtype, covers=dns.rdatatype.NONE): - """Look for rdata with the specified name and type in the zone, - and return an RRset encapsulating it. - - The I{name}, I{rdtype}, and I{covers} parameters may be - strings, in which case they will be converted to their proper - type. - - This method is less efficient than the similar - L{find_rdataset} because it creates an RRset instead of - returning the matching rdataset. It may be more convenient - for some uses since it returns an object which binds the owner - name to the rdata. - - This method may not be used to create new nodes or rdatasets; - use L{find_rdataset} instead. - - KeyError is raised if the name or type are not found. - Use L{get_rrset} if you want to have None returned instead. - - @param name: the owner name to look for - @type name: DNS.name.Name object or string - @param rdtype: the rdata type desired - @type rdtype: int or string - @param covers: the covered type (defaults to None) - @type covers: int or string - @raises KeyError: the node or rdata could not be found - @rtype: dns.rrset.RRset object - """ - - name = self._validate_name(name) - if isinstance(rdtype, string_types): - rdtype = dns.rdatatype.from_text(rdtype) - if isinstance(covers, string_types): - covers = dns.rdatatype.from_text(covers) - rdataset = self.nodes[name].find_rdataset(self.rdclass, rdtype, covers) - rrset = dns.rrset.RRset(name, self.rdclass, rdtype, covers) - rrset.update(rdataset) - return rrset - - def get_rrset(self, name, rdtype, covers=dns.rdatatype.NONE): - """Look for rdata with the specified name and type in the zone, - and return an RRset encapsulating it. - - The I{name}, I{rdtype}, and I{covers} parameters may be - strings, in which case they will be converted to their proper - type. - - This method is less efficient than the similar L{get_rdataset} - because it creates an RRset instead of returning the matching - rdataset. It may be more convenient for some uses since it - returns an object which binds the owner name to the rdata. - - This method may not be used to create new nodes or rdatasets; - use L{find_rdataset} instead. - - None is returned if the name or type are not found. - Use L{find_rrset} if you want to have KeyError raised instead. - - @param name: the owner name to look for - @type name: DNS.name.Name object or string - @param rdtype: the rdata type desired - @type rdtype: int or string - @param covers: the covered type (defaults to None) - @type covers: int or string - @rtype: dns.rrset.RRset object - """ - - try: - rrset = self.find_rrset(name, rdtype, covers) - except KeyError: - rrset = None - return rrset - - def iterate_rdatasets(self, rdtype=dns.rdatatype.ANY, - covers=dns.rdatatype.NONE): - """Return a generator which yields (name, rdataset) tuples for - all rdatasets in the zone which have the specified I{rdtype} - and I{covers}. If I{rdtype} is dns.rdatatype.ANY, the default, - then all rdatasets will be matched. - - @param rdtype: int or string - @type rdtype: int or string - @param covers: the covered type (defaults to None) - @type covers: int or string - """ - - if isinstance(rdtype, string_types): - rdtype = dns.rdatatype.from_text(rdtype) - if isinstance(covers, string_types): - covers = dns.rdatatype.from_text(covers) - for (name, node) in self.iteritems(): # pylint: disable=dict-iter-method - for rds in node: - if rdtype == dns.rdatatype.ANY or \ - (rds.rdtype == rdtype and rds.covers == covers): - yield (name, rds) - - def iterate_rdatas(self, rdtype=dns.rdatatype.ANY, - covers=dns.rdatatype.NONE): - """Return a generator which yields (name, ttl, rdata) tuples for - all rdatas in the zone which have the specified I{rdtype} - and I{covers}. If I{rdtype} is dns.rdatatype.ANY, the default, - then all rdatas will be matched. - - @param rdtype: int or string - @type rdtype: int or string - @param covers: the covered type (defaults to None) - @type covers: int or string - """ - - if isinstance(rdtype, string_types): - rdtype = dns.rdatatype.from_text(rdtype) - if isinstance(covers, string_types): - covers = dns.rdatatype.from_text(covers) - for (name, node) in self.iteritems(): # pylint: disable=dict-iter-method - for rds in node: - if rdtype == dns.rdatatype.ANY or \ - (rds.rdtype == rdtype and rds.covers == covers): - for rdata in rds: - yield (name, rds.ttl, rdata) - - def to_file(self, f, sorted=True, relativize=True, nl=None): - """Write a zone to a file. - - @param f: file or string. If I{f} is a string, it is treated - as the name of a file to open. - @param sorted: if True, the file will be written with the - names sorted in DNSSEC order from least to greatest. Otherwise - the names will be written in whatever order they happen to have - in the zone's dictionary. - @param relativize: if True, domain names in the output will be - relativized to the zone's origin (if possible). - @type relativize: bool - @param nl: The end of line string. If not specified, the - output will use the platform's native end-of-line marker (i.e. - LF on POSIX, CRLF on Windows, CR on Macintosh). - @type nl: string or None - """ - - if isinstance(f, string_types): - f = open(f, 'wb') - want_close = True - else: - want_close = False - - # must be in this way, f.encoding may contain None, or even attribute - # may not be there - file_enc = getattr(f, 'encoding', None) - if file_enc is None: - file_enc = 'utf-8' - - if nl is None: - nl_b = os.linesep.encode(file_enc) # binary mode, '\n' is not enough - nl = u'\n' - elif isinstance(nl, string_types): - nl_b = nl.encode(file_enc) - else: - nl_b = nl - nl = nl.decode() - - try: - if sorted: - names = list(self.keys()) - names.sort() - else: - names = self.iterkeys() # pylint: disable=dict-iter-method - for n in names: - l = self[n].to_text(n, origin=self.origin, - relativize=relativize) - if isinstance(l, text_type): - l_b = l.encode(file_enc) - else: - l_b = l - l = l.decode() - - try: - f.write(l_b) - f.write(nl_b) - except TypeError: # textual mode - f.write(l) - f.write(nl) - finally: - if want_close: - f.close() - - def to_text(self, sorted=True, relativize=True, nl=None): - """Return a zone's text as though it were written to a file. - - @param sorted: if True, the file will be written with the - names sorted in DNSSEC order from least to greatest. Otherwise - the names will be written in whatever order they happen to have - in the zone's dictionary. - @param relativize: if True, domain names in the output will be - relativized to the zone's origin (if possible). - @type relativize: bool - @param nl: The end of line string. If not specified, the - output will use the platform's native end-of-line marker (i.e. - LF on POSIX, CRLF on Windows, CR on Macintosh). - @type nl: string or None - """ - temp_buffer = BytesIO() - self.to_file(temp_buffer, sorted, relativize, nl) - return_value = temp_buffer.getvalue() - temp_buffer.close() - return return_value - - def check_origin(self): - """Do some simple checking of the zone's origin. - - @raises dns.zone.NoSOA: there is no SOA RR - @raises dns.zone.NoNS: there is no NS RRset - @raises KeyError: there is no origin node - """ - if self.relativize: - name = dns.name.empty - else: - name = self.origin - if self.get_rdataset(name, dns.rdatatype.SOA) is None: - raise NoSOA - if self.get_rdataset(name, dns.rdatatype.NS) is None: - raise NoNS - - -class _MasterReader(object): - - """Read a DNS master file - - @ivar tok: The tokenizer - @type tok: dns.tokenizer.Tokenizer object - @ivar last_ttl: The last seen explicit TTL for an RR - @type last_ttl: int - @ivar last_ttl_known: Has last TTL been detected - @type last_ttl_known: bool - @ivar default_ttl: The default TTL from a $TTL directive or SOA RR - @type default_ttl: int - @ivar default_ttl_known: Has default TTL been detected - @type default_ttl_known: bool - @ivar last_name: The last name read - @type last_name: dns.name.Name object - @ivar current_origin: The current origin - @type current_origin: dns.name.Name object - @ivar relativize: should names in the zone be relativized? - @type relativize: bool - @ivar zone: the zone - @type zone: dns.zone.Zone object - @ivar saved_state: saved reader state (used when processing $INCLUDE) - @type saved_state: list of (tokenizer, current_origin, last_name, file, - last_ttl, last_ttl_known, default_ttl, default_ttl_known) tuples. - @ivar current_file: the file object of the $INCLUDed file being parsed - (None if no $INCLUDE is active). - @ivar allow_include: is $INCLUDE allowed? - @type allow_include: bool - @ivar check_origin: should sanity checks of the origin node be done? - The default is True. - @type check_origin: bool - """ - - def __init__(self, tok, origin, rdclass, relativize, zone_factory=Zone, - allow_include=False, check_origin=True): - if isinstance(origin, string_types): - origin = dns.name.from_text(origin) - self.tok = tok - self.current_origin = origin - self.relativize = relativize - self.last_ttl = 0 - self.last_ttl_known = False - self.default_ttl = 0 - self.default_ttl_known = False - self.last_name = self.current_origin - self.zone = zone_factory(origin, rdclass, relativize=relativize) - self.saved_state = [] - self.current_file = None - self.allow_include = allow_include - self.check_origin = check_origin - - def _eat_line(self): - while 1: - token = self.tok.get() - if token.is_eol_or_eof(): - break - - def _rr_line(self): - """Process one line from a DNS master file.""" - # Name - if self.current_origin is None: - raise UnknownOrigin - token = self.tok.get(want_leading=True) - if not token.is_whitespace(): - self.last_name = dns.name.from_text( - token.value, self.current_origin) - else: - token = self.tok.get() - if token.is_eol_or_eof(): - # treat leading WS followed by EOL/EOF as if they were EOL/EOF. - return - self.tok.unget(token) - name = self.last_name - if not name.is_subdomain(self.zone.origin): - self._eat_line() - return - if self.relativize: - name = name.relativize(self.zone.origin) - token = self.tok.get() - if not token.is_identifier(): - raise dns.exception.SyntaxError - # TTL - try: - ttl = dns.ttl.from_text(token.value) - self.last_ttl = ttl - self.last_ttl_known = True - token = self.tok.get() - if not token.is_identifier(): - raise dns.exception.SyntaxError - except dns.ttl.BadTTL: - if not (self.last_ttl_known or self.default_ttl_known): - raise dns.exception.SyntaxError("Missing default TTL value") - if self.default_ttl_known: - ttl = self.default_ttl - else: - ttl = self.last_ttl - # Class - try: - rdclass = dns.rdataclass.from_text(token.value) - token = self.tok.get() - if not token.is_identifier(): - raise dns.exception.SyntaxError - except dns.exception.SyntaxError: - raise dns.exception.SyntaxError - except Exception: - rdclass = self.zone.rdclass - if rdclass != self.zone.rdclass: - raise dns.exception.SyntaxError("RR class is not zone's class") - # Type - try: - rdtype = dns.rdatatype.from_text(token.value) - except: - raise dns.exception.SyntaxError( - "unknown rdatatype '%s'" % token.value) - n = self.zone.nodes.get(name) - if n is None: - n = self.zone.node_factory() - self.zone.nodes[name] = n - try: - rd = dns.rdata.from_text(rdclass, rdtype, self.tok, - self.current_origin, False) - except dns.exception.SyntaxError: - # Catch and reraise. - (ty, va) = sys.exc_info()[:2] - raise va - except: - # All exceptions that occur in the processing of rdata - # are treated as syntax errors. This is not strictly - # correct, but it is correct almost all of the time. - # We convert them to syntax errors so that we can emit - # helpful filename:line info. - (ty, va) = sys.exc_info()[:2] - raise dns.exception.SyntaxError( - "caught exception {}: {}".format(str(ty), str(va))) - - if not self.default_ttl_known and isinstance(rd, dns.rdtypes.ANY.SOA.SOA): - # The pre-RFC2308 and pre-BIND9 behavior inherits the zone default - # TTL from the SOA minttl if no $TTL statement is present before the - # SOA is parsed. - self.default_ttl = rd.minimum - self.default_ttl_known = True - - rd.choose_relativity(self.zone.origin, self.relativize) - covers = rd.covers() - rds = n.find_rdataset(rdclass, rdtype, covers, True) - rds.add(rd, ttl) - - def _parse_modify(self, side): - # Here we catch everything in '{' '}' in a group so we can replace it - # with ''. - is_generate1 = re.compile("^.*\$({(\+|-?)(\d+),(\d+),(.)}).*$") - is_generate2 = re.compile("^.*\$({(\+|-?)(\d+)}).*$") - is_generate3 = re.compile("^.*\$({(\+|-?)(\d+),(\d+)}).*$") - # Sometimes there are modifiers in the hostname. These come after - # the dollar sign. They are in the form: ${offset[,width[,base]]}. - # Make names - g1 = is_generate1.match(side) - if g1: - mod, sign, offset, width, base = g1.groups() - if sign == '': - sign = '+' - g2 = is_generate2.match(side) - if g2: - mod, sign, offset = g2.groups() - if sign == '': - sign = '+' - width = 0 - base = 'd' - g3 = is_generate3.match(side) - if g3: - mod, sign, offset, width = g1.groups() - if sign == '': - sign = '+' - width = g1.groups()[2] - base = 'd' - - if not (g1 or g2 or g3): - mod = '' - sign = '+' - offset = 0 - width = 0 - base = 'd' - - if base != 'd': - raise NotImplementedError() - - return mod, sign, offset, width, base - - def _generate_line(self): - # range lhs [ttl] [class] type rhs [ comment ] - """Process one line containing the GENERATE statement from a DNS - master file.""" - if self.current_origin is None: - raise UnknownOrigin - - token = self.tok.get() - # Range (required) - try: - start, stop, step = dns.grange.from_text(token.value) - token = self.tok.get() - if not token.is_identifier(): - raise dns.exception.SyntaxError - except: - raise dns.exception.SyntaxError - - # lhs (required) - try: - lhs = token.value - token = self.tok.get() - if not token.is_identifier(): - raise dns.exception.SyntaxError - except: - raise dns.exception.SyntaxError - - # TTL - try: - ttl = dns.ttl.from_text(token.value) - self.last_ttl = ttl - self.last_ttl_known = True - token = self.tok.get() - if not token.is_identifier(): - raise dns.exception.SyntaxError - except dns.ttl.BadTTL: - if not (self.last_ttl_known or self.default_ttl_known): - raise dns.exception.SyntaxError("Missing default TTL value") - if self.default_ttl_known: - ttl = self.default_ttl - else: - ttl = self.last_ttl - # Class - try: - rdclass = dns.rdataclass.from_text(token.value) - token = self.tok.get() - if not token.is_identifier(): - raise dns.exception.SyntaxError - except dns.exception.SyntaxError: - raise dns.exception.SyntaxError - except Exception: - rdclass = self.zone.rdclass - if rdclass != self.zone.rdclass: - raise dns.exception.SyntaxError("RR class is not zone's class") - # Type - try: - rdtype = dns.rdatatype.from_text(token.value) - token = self.tok.get() - if not token.is_identifier(): - raise dns.exception.SyntaxError - except Exception: - raise dns.exception.SyntaxError("unknown rdatatype '%s'" % - token.value) - - # lhs (required) - try: - rhs = token.value - except: - raise dns.exception.SyntaxError - - lmod, lsign, loffset, lwidth, lbase = self._parse_modify(lhs) - rmod, rsign, roffset, rwidth, rbase = self._parse_modify(rhs) - for i in range(start, stop + 1, step): - # +1 because bind is inclusive and python is exclusive - - if lsign == u'+': - lindex = i + int(loffset) - elif lsign == u'-': - lindex = i - int(loffset) - - if rsign == u'-': - rindex = i - int(roffset) - elif rsign == u'+': - rindex = i + int(roffset) - - lzfindex = str(lindex).zfill(int(lwidth)) - rzfindex = str(rindex).zfill(int(rwidth)) - - name = lhs.replace(u'$%s' % (lmod), lzfindex) - rdata = rhs.replace(u'$%s' % (rmod), rzfindex) - - self.last_name = dns.name.from_text(name, self.current_origin) - name = self.last_name - if not name.is_subdomain(self.zone.origin): - self._eat_line() - return - if self.relativize: - name = name.relativize(self.zone.origin) - - n = self.zone.nodes.get(name) - if n is None: - n = self.zone.node_factory() - self.zone.nodes[name] = n - try: - rd = dns.rdata.from_text(rdclass, rdtype, rdata, - self.current_origin, False) - except dns.exception.SyntaxError: - # Catch and reraise. - (ty, va) = sys.exc_info()[:2] - raise va - except: - # All exceptions that occur in the processing of rdata - # are treated as syntax errors. This is not strictly - # correct, but it is correct almost all of the time. - # We convert them to syntax errors so that we can emit - # helpful filename:line info. - (ty, va) = sys.exc_info()[:2] - raise dns.exception.SyntaxError("caught exception %s: %s" % - (str(ty), str(va))) - - rd.choose_relativity(self.zone.origin, self.relativize) - covers = rd.covers() - rds = n.find_rdataset(rdclass, rdtype, covers, True) - rds.add(rd, ttl) - - def read(self): - """Read a DNS master file and build a zone object. - - @raises dns.zone.NoSOA: No SOA RR was found at the zone origin - @raises dns.zone.NoNS: No NS RRset was found at the zone origin - """ - - try: - while 1: - token = self.tok.get(True, True) - if token.is_eof(): - if self.current_file is not None: - self.current_file.close() - if len(self.saved_state) > 0: - (self.tok, - self.current_origin, - self.last_name, - self.current_file, - self.last_ttl, - self.last_ttl_known, - self.default_ttl, - self.default_ttl_known) = self.saved_state.pop(-1) - continue - break - elif token.is_eol(): - continue - elif token.is_comment(): - self.tok.get_eol() - continue - elif token.value[0] == u'$': - c = token.value.upper() - if c == u'$TTL': - token = self.tok.get() - if not token.is_identifier(): - raise dns.exception.SyntaxError("bad $TTL") - self.default_ttl = dns.ttl.from_text(token.value) - self.default_ttl_known = True - self.tok.get_eol() - elif c == u'$ORIGIN': - self.current_origin = self.tok.get_name() - self.tok.get_eol() - if self.zone.origin is None: - self.zone.origin = self.current_origin - elif c == u'$INCLUDE' and self.allow_include: - token = self.tok.get() - filename = token.value - token = self.tok.get() - if token.is_identifier(): - new_origin =\ - dns.name.from_text(token.value, - self.current_origin) - self.tok.get_eol() - elif not token.is_eol_or_eof(): - raise dns.exception.SyntaxError( - "bad origin in $INCLUDE") - else: - new_origin = self.current_origin - self.saved_state.append((self.tok, - self.current_origin, - self.last_name, - self.current_file, - self.last_ttl, - self.last_ttl_known, - self.default_ttl, - self.default_ttl_known)) - self.current_file = open(filename, 'r') - self.tok = dns.tokenizer.Tokenizer(self.current_file, - filename) - self.current_origin = new_origin - elif c == u'$GENERATE': - self._generate_line() - else: - raise dns.exception.SyntaxError( - "Unknown master file directive '" + c + "'") - continue - self.tok.unget(token) - self._rr_line() - except dns.exception.SyntaxError as detail: - (filename, line_number) = self.tok.where() - if detail is None: - detail = "syntax error" - raise dns.exception.SyntaxError( - "%s:%d: %s" % (filename, line_number, detail)) - - # Now that we're done reading, do some basic checking of the zone. - if self.check_origin: - self.zone.check_origin() - - -def from_text(text, origin=None, rdclass=dns.rdataclass.IN, - relativize=True, zone_factory=Zone, filename=None, - allow_include=False, check_origin=True): - """Build a zone object from a master file format string. - - @param text: the master file format input - @type text: string. - @param origin: The origin of the zone; if not specified, the first - $ORIGIN statement in the master file will determine the origin of the - zone. - @type origin: dns.name.Name object or string - @param rdclass: The zone's rdata class; the default is class IN. - @type rdclass: int - @param relativize: should names be relativized? The default is True - @type relativize: bool - @param zone_factory: The zone factory to use - @type zone_factory: function returning a Zone - @param filename: The filename to emit when describing where an error - occurred; the default is ''. - @type filename: string - @param allow_include: is $INCLUDE allowed? - @type allow_include: bool - @param check_origin: should sanity checks of the origin node be done? - The default is True. - @type check_origin: bool - @raises dns.zone.NoSOA: No SOA RR was found at the zone origin - @raises dns.zone.NoNS: No NS RRset was found at the zone origin - @rtype: dns.zone.Zone object - """ - - # 'text' can also be a file, but we don't publish that fact - # since it's an implementation detail. The official file - # interface is from_file(). - - if filename is None: - filename = '' - tok = dns.tokenizer.Tokenizer(text, filename) - reader = _MasterReader(tok, origin, rdclass, relativize, zone_factory, - allow_include=allow_include, - check_origin=check_origin) - reader.read() - return reader.zone - - -def from_file(f, origin=None, rdclass=dns.rdataclass.IN, - relativize=True, zone_factory=Zone, filename=None, - allow_include=True, check_origin=True): - """Read a master file and build a zone object. - - @param f: file or string. If I{f} is a string, it is treated - as the name of a file to open. - @param origin: The origin of the zone; if not specified, the first - $ORIGIN statement in the master file will determine the origin of the - zone. - @type origin: dns.name.Name object or string - @param rdclass: The zone's rdata class; the default is class IN. - @type rdclass: int - @param relativize: should names be relativized? The default is True - @type relativize: bool - @param zone_factory: The zone factory to use - @type zone_factory: function returning a Zone - @param filename: The filename to emit when describing where an error - occurred; the default is '', or the value of I{f} if I{f} is a - string. - @type filename: string - @param allow_include: is $INCLUDE allowed? - @type allow_include: bool - @param check_origin: should sanity checks of the origin node be done? - The default is True. - @type check_origin: bool - @raises dns.zone.NoSOA: No SOA RR was found at the zone origin - @raises dns.zone.NoNS: No NS RRset was found at the zone origin - @rtype: dns.zone.Zone object - """ - - str_type = string_types - if PY3: - opts = 'r' - else: - opts = 'rU' - - if isinstance(f, str_type): - if filename is None: - filename = f - f = open(f, opts) - want_close = True - else: - if filename is None: - filename = '' - want_close = False - - try: - z = from_text(f, origin, rdclass, relativize, zone_factory, - filename, allow_include, check_origin) - finally: - if want_close: - f.close() - return z - - -def from_xfr(xfr, zone_factory=Zone, relativize=True, check_origin=True): - """Convert the output of a zone transfer generator into a zone object. - - @param xfr: The xfr generator - @type xfr: generator of dns.message.Message objects - @param relativize: should names be relativized? The default is True. - It is essential that the relativize setting matches the one specified - to dns.query.xfr(). - @type relativize: bool - @param check_origin: should sanity checks of the origin node be done? - The default is True. - @type check_origin: bool - @raises dns.zone.NoSOA: No SOA RR was found at the zone origin - @raises dns.zone.NoNS: No NS RRset was found at the zone origin - @rtype: dns.zone.Zone object - """ - - z = None - for r in xfr: - if z is None: - if relativize: - origin = r.origin - else: - origin = r.answer[0].name - rdclass = r.answer[0].rdclass - z = zone_factory(origin, rdclass, relativize=relativize) - for rrset in r.answer: - znode = z.nodes.get(rrset.name) - if not znode: - znode = z.node_factory() - z.nodes[rrset.name] = znode - zrds = znode.find_rdataset(rrset.rdclass, rrset.rdtype, - rrset.covers, True) - zrds.update_ttl(rrset.ttl) - for rd in rrset: - rd.choose_relativity(z.origin, relativize) - zrds.add(rd) - if check_origin: - z.check_origin() - return z diff --git a/env/lib/python3.7/site-packages/dnspython-1.16.0.dist-info/DESCRIPTION.rst b/env/lib/python3.7/site-packages/dnspython-1.16.0.dist-info/DESCRIPTION.rst deleted file mode 100644 index 615ae68..0000000 --- a/env/lib/python3.7/site-packages/dnspython-1.16.0.dist-info/DESCRIPTION.rst +++ /dev/null @@ -1,9 +0,0 @@ -dnspython is a DNS toolkit for Python. It supports almost all -record types. It can be used for queries, zone transfers, and dynamic -updates. It supports TSIG authenticated messages and EDNS0. - -dnspython provides both high and low level access to DNS. The high -level classes perform queries for data of a given name, type, and -class, and return an answer set. The low level classes allow -direct manipulation of DNS zones, messages, names, and records. - diff --git a/env/lib/python3.7/site-packages/dnspython-1.16.0.dist-info/INSTALLER b/env/lib/python3.7/site-packages/dnspython-1.16.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/env/lib/python3.7/site-packages/dnspython-1.16.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/env/lib/python3.7/site-packages/dnspython-1.16.0.dist-info/LICENSE.txt b/env/lib/python3.7/site-packages/dnspython-1.16.0.dist-info/LICENSE.txt deleted file mode 100644 index 390a726..0000000 --- a/env/lib/python3.7/site-packages/dnspython-1.16.0.dist-info/LICENSE.txt +++ /dev/null @@ -1,35 +0,0 @@ -ISC License - -Copyright (C) Dnspython Contributors - -Permission to use, copy, modify, and/or distribute this software for -any purpose with or without fee is hereby granted, provided that the -above copyright notice and this permission notice appear in all -copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL -WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE -AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL -DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR -PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. - - - -Copyright (C) 2001-2017 Nominum, Inc. -Copyright (C) Google Inc. - -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose with or without fee is hereby granted, -provided that the above copyright notice and this permission notice -appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/env/lib/python3.7/site-packages/dnspython-1.16.0.dist-info/METADATA b/env/lib/python3.7/site-packages/dnspython-1.16.0.dist-info/METADATA deleted file mode 100644 index 0dc8f67..0000000 --- a/env/lib/python3.7/site-packages/dnspython-1.16.0.dist-info/METADATA +++ /dev/null @@ -1,44 +0,0 @@ -Metadata-Version: 2.0 -Name: dnspython -Version: 1.16.0 -Summary: DNS toolkit -Home-page: http://www.dnspython.org -Author: Bob Halley -Author-email: halley@dnspython.org -License: BSD-like -Download-URL: http://www.dnspython.org/kits/1.16.0/dnspython-1.16.0.tar.gz -Description-Content-Type: UNKNOWN -Platform: UNKNOWN -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: Intended Audience :: System Administrators -Classifier: License :: Freeware -Classifier: Operating System :: Microsoft :: Windows :: Windows 95/98/2000 -Classifier: Operating System :: POSIX -Classifier: Programming Language :: Python -Classifier: Topic :: Internet :: Name Service (DNS) -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.4 -Classifier: Programming Language :: Python :: 3.5 -Classifier: Programming Language :: Python :: 3.6 -Classifier: Programming Language :: Python :: 3.7 -Provides: dns -Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* -Provides-Extra: DNSSEC -Requires-Dist: pycryptodome; extra == 'DNSSEC' -Requires-Dist: ecdsa (>=0.13); extra == 'DNSSEC' -Provides-Extra: IDNA -Requires-Dist: idna (>=2.1); extra == 'IDNA' - -dnspython is a DNS toolkit for Python. It supports almost all -record types. It can be used for queries, zone transfers, and dynamic -updates. It supports TSIG authenticated messages and EDNS0. - -dnspython provides both high and low level access to DNS. The high -level classes perform queries for data of a given name, type, and -class, and return an answer set. The low level classes allow -direct manipulation of DNS zones, messages, names, and records. - diff --git a/env/lib/python3.7/site-packages/dnspython-1.16.0.dist-info/RECORD b/env/lib/python3.7/site-packages/dnspython-1.16.0.dist-info/RECORD deleted file mode 100644 index 899689b..0000000 --- a/env/lib/python3.7/site-packages/dnspython-1.16.0.dist-info/RECORD +++ /dev/null @@ -1,201 +0,0 @@ -dns/__init__.py,sha256=YT8dlV94eA9ycHtSAbLNjvBHJSYl3pM9nPkkR5d7HCw,1404 -dns/__pycache__/__init__.cpython-37.pyc,, -dns/__pycache__/_compat.cpython-37.pyc,, -dns/__pycache__/dnssec.cpython-37.pyc,, -dns/__pycache__/e164.cpython-37.pyc,, -dns/__pycache__/edns.cpython-37.pyc,, -dns/__pycache__/entropy.cpython-37.pyc,, -dns/__pycache__/exception.cpython-37.pyc,, -dns/__pycache__/flags.cpython-37.pyc,, -dns/__pycache__/grange.cpython-37.pyc,, -dns/__pycache__/hash.cpython-37.pyc,, -dns/__pycache__/inet.cpython-37.pyc,, -dns/__pycache__/ipv4.cpython-37.pyc,, -dns/__pycache__/ipv6.cpython-37.pyc,, -dns/__pycache__/message.cpython-37.pyc,, -dns/__pycache__/name.cpython-37.pyc,, -dns/__pycache__/namedict.cpython-37.pyc,, -dns/__pycache__/node.cpython-37.pyc,, -dns/__pycache__/opcode.cpython-37.pyc,, -dns/__pycache__/query.cpython-37.pyc,, -dns/__pycache__/rcode.cpython-37.pyc,, -dns/__pycache__/rdata.cpython-37.pyc,, -dns/__pycache__/rdataclass.cpython-37.pyc,, -dns/__pycache__/rdataset.cpython-37.pyc,, -dns/__pycache__/rdatatype.cpython-37.pyc,, -dns/__pycache__/renderer.cpython-37.pyc,, -dns/__pycache__/resolver.cpython-37.pyc,, -dns/__pycache__/reversename.cpython-37.pyc,, -dns/__pycache__/rrset.cpython-37.pyc,, -dns/__pycache__/set.cpython-37.pyc,, -dns/__pycache__/tokenizer.cpython-37.pyc,, -dns/__pycache__/tsig.cpython-37.pyc,, -dns/__pycache__/tsigkeyring.cpython-37.pyc,, -dns/__pycache__/ttl.cpython-37.pyc,, -dns/__pycache__/update.cpython-37.pyc,, -dns/__pycache__/version.cpython-37.pyc,, -dns/__pycache__/wiredata.cpython-37.pyc,, -dns/__pycache__/zone.cpython-37.pyc,, -dns/_compat.py,sha256=_z_CnqBp0U_8VXGaAEgM6YP0xWsGWC7Xibm3uBlgJpg,1503 -dns/dnssec.py,sha256=MjoQ6ldvWSW3KHBSIO0bxCmsLpLapeYW2T8Rzy2DbI0,16504 -dns/e164.py,sha256=uEHNlLy8p6j4S2WPQdMU9wAM4b2xbprWz_Hsc2EPwO8,3753 -dns/edns.py,sha256=ITjQuaPXdW7ZHlk7qSyHYsFk3Yk1jqagwaia10aQx7g,7424 -dns/entropy.py,sha256=LZRtKxcTTd7Ng4P5m2rBJGz3r_qq0G-JqbqybrbBx8I,4771 -dns/exception.py,sha256=_SYm0BLa0MrfpU2B0jMnRDPdKCVs6jmx8_ZSAcwzAJY,4876 -dns/flags.py,sha256=5nsxoZCLqeNmxsLGIKpJBVk8_hhhgpTleEc-421kh-8,2933 -dns/grange.py,sha256=sfbj8pZPMSIdYVORMrBXPcSXusjwRipOxRgMEoywqTk,2055 -dns/hash.py,sha256=2UG0QEO_5D8NNEvr1YdDXcRQcxmQdzgbNCaXgtKYlY0,1319 -dns/inet.py,sha256=C78xVq0uxIh0PYLH7S48DPVaUeJ1GfF9re1w7BOIu70,3377 -dns/ipv4.py,sha256=fkXKFagx7pLwccrtXA4AF7iQCj_6lSkFYRSTbyC7DNk,2096 -dns/ipv6.py,sha256=Z3O21oNPpah3vRG0l4qQ9fnTrG0dy5DvfPU-GVBb20Q,5527 -dns/message.py,sha256=GRq9c8TsZTOd6Pin2v4wnAFT5N0OZ_daAP_Epx_fvrc,41458 -dns/name.py,sha256=TaQOg32XZ2rJKMpQdt-MZk_Kf5QDwDsv87OIPjIuBrY,31259 -dns/namedict.py,sha256=9_rRigVZkJGyfxEepLTjX-aaNiyP_ZgmW_tlEP4mR-U,3958 -dns/node.py,sha256=lOuOEIBvo8t4XumjYc0DxUPpmjXntbYI9qP4kMuqrCw,6352 -dns/opcode.py,sha256=fV5_ysudkxiUsXRHJPKOnzopShXTzLSNLtb5CauRosA,2832 -dns/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -dns/query.py,sha256=wXvMrhGRmGejSa2OOBZBOpl83WeD3-5D7u_isQCvtaY,23691 -dns/rcode.py,sha256=5t18m2ZaDgrNQsyguKjzFWAOR0oBaHXjujjZUxs1uJ4,3613 -dns/rdata.py,sha256=zcn8qsDK3oZlcnfEGcf275XCwJ1Vh1c49yey8TEfF7M,14451 -dns/rdataclass.py,sha256=E1zIUb8f3BotxiKvrcDZGTLt8jaEJ8WThvTU7_hDv2g,3219 -dns/rdataset.py,sha256=4Nrn5tPsb8dpz78UAej98GDiK6uNeHh0Cqss1p7oxPQ,11463 -dns/rdatatype.py,sha256=qTGY1IPbR8cu4oGcGw0e5HPyXWEluBNcrsLL9navOtA,5917 -dns/rdtypes/ANY/AFSDB.py,sha256=TivfOjrAjOCLrli_3xE33ufzbUGug28ZC2fHo6WOups,1925 -dns/rdtypes/ANY/AVC.py,sha256=eiCzYvivS3ecZjVWIW4KaJ_ki3WuNDXQ_Iv_1bnlrT0,1027 -dns/rdtypes/ANY/CAA.py,sha256=eOR3lhOk0PhVjhSwtup4XbstENKM_kn0XkeLRLF-DBw,2699 -dns/rdtypes/ANY/CDNSKEY.py,sha256=_C5m5PHSr3YWXJm-a50yRf11NQsGATjtQBm_9uGarso,1103 -dns/rdtypes/ANY/CDS.py,sha256=RglDWyG-ZQn8NiVhVeI1QuSj8Do5EREf2aclzE-JwGE,952 -dns/rdtypes/ANY/CERT.py,sha256=UGKOYvAtGmGnEDJFKgo1NOihsIyLJohQw4ExG4RHl_8,4028 -dns/rdtypes/ANY/CNAME.py,sha256=9kuO5FBKKIHaAjcvo02_65Sg6dletz2wAWd5qNGaHDw,1161 -dns/rdtypes/ANY/CSYNC.py,sha256=lNl6vrOgCWdrVx7WF0-l_T5_s7zYWI66_3D9VwCma8Q,4721 -dns/rdtypes/ANY/DLV.py,sha256=wM1BUX0ufYMXMOqNyfCTMVDFy5dBvwpqmrJydwEd4vQ,941 -dns/rdtypes/ANY/DNAME.py,sha256=Wf02V8IB-lEIJT2wVqTtvOP5_OCpHowKcG5wpLs-4Pk,1056 -dns/rdtypes/ANY/DNSKEY.py,sha256=gHEWjBjO0zHpz0yamASTfC3U7sUIom58gBRSOuPnxJ8,1101 -dns/rdtypes/ANY/DS.py,sha256=zE7c-rxxwzqnqBDEDotvCrD45piCgg_kTp7DOEKhpIA,950 -dns/rdtypes/ANY/EUI48.py,sha256=bX_FaWgbh96dRb_CNr9Ltc03rPRtheQp99luJJpP-WE,1124 -dns/rdtypes/ANY/EUI64.py,sha256=9FzHF90pc7Ls0RO1jfPFnezfC_5iDjAdZEdSljRqEt0,1134 -dns/rdtypes/ANY/GPOS.py,sha256=0A3uPPrb4FKuUQsKnPPxXcGkfR-STQi4P7ntlVOQi-k,5450 -dns/rdtypes/ANY/HINFO.py,sha256=OrmLq8oD-JxjlgZI5MJFP6OilW7YLLwKkKrGceuAtYQ,2750 -dns/rdtypes/ANY/HIP.py,sha256=qnjxZtJ27bh31o2RLWDdIm3uDis3oirqf5uwCrmiLvM,4221 -dns/rdtypes/ANY/ISDN.py,sha256=0Ysj_ugB1feFvSyjRh82cwnDlmzIECxk9R5HGrF8OcA,3350 -dns/rdtypes/ANY/LOC.py,sha256=ud8bHZ3dBJ4jtE_r8naH1rfKSI3TQnx6txohJMbDTaU,12351 -dns/rdtypes/ANY/MX.py,sha256=DMw5gGSBQcwokT6ScqaXqOuluXg9IebOg-Nyi__RS14,950 -dns/rdtypes/ANY/NS.py,sha256=OcTL4Cg9snF5tOBFcxm-qeB6aII-oXEzsxqJozNxQl4,950 -dns/rdtypes/ANY/NSEC.py,sha256=oYJZLMmj1isl7TOyo72zgkNLiskL1ud6aa52_qJy4CI,4771 -dns/rdtypes/ANY/NSEC3.py,sha256=vZJCQ7OWSgCsOIbOKLie5Q6a5LlfQuKOUj1mBN4As_M,7211 -dns/rdtypes/ANY/NSEC3PARAM.py,sha256=UcqvoUrFzsuu_6Ba6ufpwnqb-hwgnXi43qt69Pa2qGI,3175 -dns/rdtypes/ANY/OPENPGPKEY.py,sha256=eaOu9n_GSC1GBKpYzBshRnDzeObMoZ0G0csFZPvhZPg,2028 -dns/rdtypes/ANY/PTR.py,sha256=bWEntdSYSZHZl8yVOsiCaU1V_JRBOMYjmeRtzfJPUBU,952 -dns/rdtypes/ANY/RP.py,sha256=4xc4eEM-l6IQmKr0dlpzY3mRkZyAe1fUkeRKxd5JIWI,3151 -dns/rdtypes/ANY/RRSIG.py,sha256=PQp-jckD0s9GyI01vi24gwVv6mzDYtKX5I_X8jCi1l8,5740 -dns/rdtypes/ANY/RT.py,sha256=Pb57qTz4O_ZKzP3IBOeii4IX7gGV_DeUZADxh8UuDA4,968 -dns/rdtypes/ANY/SOA.py,sha256=hhcigkLhIMPlgoD9zBYSduKGsHJM4LO7hVjmnXUsfg8,4597 -dns/rdtypes/ANY/SPF.py,sha256=2shb4N_8gRfIy0Yi6WAHSE4kIau_4ca-3fACfIWxeCg,976 -dns/rdtypes/ANY/SSHFP.py,sha256=3uSooQ_wYkXIqi2jYeRkfPedLFdko90vqNexd9Wkyi8,2905 -dns/rdtypes/ANY/TLSA.py,sha256=7d3r3TqKDV9E_ElrfAv_ZIPi67OcXM2hvXRA3DWtom0,3033 -dns/rdtypes/ANY/TXT.py,sha256=6Xb_tt8MRgMv-G6FMBluoxUhMN1G18zrMGB7WvwZIyE,955 -dns/rdtypes/ANY/URI.py,sha256=-eXBeUQDClnaok4stZCyCg9GbkdZaBBqQ4Z5zrgFqmI,2975 -dns/rdtypes/ANY/X25.py,sha256=6IYIyZ2iVEh0fXnRJHHiO0XU-HwJi-eafbjbyU6CGK0,2196 -dns/rdtypes/ANY/__init__.py,sha256=Sn0vG1e7mSZuSfaRKauVLTLnalp8qLkjVE57bJ2F8ls,1362 -dns/rdtypes/ANY/__pycache__/AFSDB.cpython-37.pyc,, -dns/rdtypes/ANY/__pycache__/AVC.cpython-37.pyc,, -dns/rdtypes/ANY/__pycache__/CAA.cpython-37.pyc,, -dns/rdtypes/ANY/__pycache__/CDNSKEY.cpython-37.pyc,, -dns/rdtypes/ANY/__pycache__/CDS.cpython-37.pyc,, -dns/rdtypes/ANY/__pycache__/CERT.cpython-37.pyc,, -dns/rdtypes/ANY/__pycache__/CNAME.cpython-37.pyc,, -dns/rdtypes/ANY/__pycache__/CSYNC.cpython-37.pyc,, -dns/rdtypes/ANY/__pycache__/DLV.cpython-37.pyc,, -dns/rdtypes/ANY/__pycache__/DNAME.cpython-37.pyc,, -dns/rdtypes/ANY/__pycache__/DNSKEY.cpython-37.pyc,, -dns/rdtypes/ANY/__pycache__/DS.cpython-37.pyc,, -dns/rdtypes/ANY/__pycache__/EUI48.cpython-37.pyc,, -dns/rdtypes/ANY/__pycache__/EUI64.cpython-37.pyc,, -dns/rdtypes/ANY/__pycache__/GPOS.cpython-37.pyc,, -dns/rdtypes/ANY/__pycache__/HINFO.cpython-37.pyc,, -dns/rdtypes/ANY/__pycache__/HIP.cpython-37.pyc,, -dns/rdtypes/ANY/__pycache__/ISDN.cpython-37.pyc,, -dns/rdtypes/ANY/__pycache__/LOC.cpython-37.pyc,, -dns/rdtypes/ANY/__pycache__/MX.cpython-37.pyc,, -dns/rdtypes/ANY/__pycache__/NS.cpython-37.pyc,, -dns/rdtypes/ANY/__pycache__/NSEC.cpython-37.pyc,, -dns/rdtypes/ANY/__pycache__/NSEC3.cpython-37.pyc,, -dns/rdtypes/ANY/__pycache__/NSEC3PARAM.cpython-37.pyc,, -dns/rdtypes/ANY/__pycache__/OPENPGPKEY.cpython-37.pyc,, -dns/rdtypes/ANY/__pycache__/PTR.cpython-37.pyc,, -dns/rdtypes/ANY/__pycache__/RP.cpython-37.pyc,, -dns/rdtypes/ANY/__pycache__/RRSIG.cpython-37.pyc,, -dns/rdtypes/ANY/__pycache__/RT.cpython-37.pyc,, -dns/rdtypes/ANY/__pycache__/SOA.cpython-37.pyc,, -dns/rdtypes/ANY/__pycache__/SPF.cpython-37.pyc,, -dns/rdtypes/ANY/__pycache__/SSHFP.cpython-37.pyc,, -dns/rdtypes/ANY/__pycache__/TLSA.cpython-37.pyc,, -dns/rdtypes/ANY/__pycache__/TXT.cpython-37.pyc,, -dns/rdtypes/ANY/__pycache__/URI.cpython-37.pyc,, -dns/rdtypes/ANY/__pycache__/X25.cpython-37.pyc,, -dns/rdtypes/ANY/__pycache__/__init__.cpython-37.pyc,, -dns/rdtypes/CH/A.py,sha256=m1UXsasKInSoeNNmmEl2Tp7B_2nI90PUVu01HzttguM,2797 -dns/rdtypes/CH/__init__.py,sha256=Ef8Z58kdxbLpTqtgP_u3MfVQoqwb3If2T68YEwIMosw,923 -dns/rdtypes/CH/__pycache__/A.cpython-37.pyc,, -dns/rdtypes/CH/__pycache__/__init__.cpython-37.pyc,, -dns/rdtypes/IN/A.py,sha256=QQgxIU06-fPMyO9g_lcitItWMa9HQMxP4hVK3s-X9BY,1921 -dns/rdtypes/IN/AAAA.py,sha256=GUs2fIXxJmNGaOJPdTkbJPoSd4841RE61wuwrDaB1B4,2015 -dns/rdtypes/IN/APL.py,sha256=O-dQdw6sDOYDkP0k34NjO0jGQ802yWULHYVNf0Q_wUE,5344 -dns/rdtypes/IN/DHCID.py,sha256=4J6H3ByUhNYWDD8HqZ3iL-xc0EiNmnBFzrwtB899PL0,2096 -dns/rdtypes/IN/IPSECKEY.py,sha256=twKeJ3fsWCAvJhwDCuF6TAKLLpQuoq0w6UElX1jk4cs,5758 -dns/rdtypes/IN/KX.py,sha256=vxNd0l6qH5lgxmyLpqB3wuAlBOdoCM1833zvoAgPuv4,958 -dns/rdtypes/IN/NAPTR.py,sha256=KF-NbGiG3156nolAn667sebs7oi8M3B54cNK9qHK1aw,4547 -dns/rdtypes/IN/NSAP.py,sha256=Z0WR3gba4PnOEL7JY-EiLEVOIFG1hUx7PPY446XuwaE,2156 -dns/rdtypes/IN/NSAP_PTR.py,sha256=EH_tKmNfHJqys5qmRv3GwwmRH2ojjGnw1mUgEDXOcaA,970 -dns/rdtypes/IN/PX.py,sha256=ZSsAI9zmQA2Io7Xbp-1cz3YwIIhRjaAsvYhYKH0b8JY,3471 -dns/rdtypes/IN/SRV.py,sha256=1S8PTQWI5WqcLSV4fheW32USi9edkUdkQEamJuF-RTg,3131 -dns/rdtypes/IN/WKS.py,sha256=5yMZhMZ6sxiyzKgeEEL-H-E4kyfnykjjeBCt6SqzEIU,3888 -dns/rdtypes/IN/__init__.py,sha256=mNZ9A4tfstUe-moGqbJUVC0QVih_72I1cyeOe7nyREY,1058 -dns/rdtypes/IN/__pycache__/A.cpython-37.pyc,, -dns/rdtypes/IN/__pycache__/AAAA.cpython-37.pyc,, -dns/rdtypes/IN/__pycache__/APL.cpython-37.pyc,, -dns/rdtypes/IN/__pycache__/DHCID.cpython-37.pyc,, -dns/rdtypes/IN/__pycache__/IPSECKEY.cpython-37.pyc,, -dns/rdtypes/IN/__pycache__/KX.cpython-37.pyc,, -dns/rdtypes/IN/__pycache__/NAPTR.cpython-37.pyc,, -dns/rdtypes/IN/__pycache__/NSAP.cpython-37.pyc,, -dns/rdtypes/IN/__pycache__/NSAP_PTR.cpython-37.pyc,, -dns/rdtypes/IN/__pycache__/PX.cpython-37.pyc,, -dns/rdtypes/IN/__pycache__/SRV.cpython-37.pyc,, -dns/rdtypes/IN/__pycache__/WKS.cpython-37.pyc,, -dns/rdtypes/IN/__pycache__/__init__.cpython-37.pyc,, -dns/rdtypes/__init__.py,sha256=7pq8IJL8HfnyKC0beC-jhh7pKQ0Gr7KFtzGAvUndhRQ,982 -dns/rdtypes/__pycache__/__init__.cpython-37.pyc,, -dns/rdtypes/__pycache__/dnskeybase.cpython-37.pyc,, -dns/rdtypes/__pycache__/dsbase.cpython-37.pyc,, -dns/rdtypes/__pycache__/euibase.cpython-37.pyc,, -dns/rdtypes/__pycache__/mxbase.cpython-37.pyc,, -dns/rdtypes/__pycache__/nsbase.cpython-37.pyc,, -dns/rdtypes/__pycache__/txtbase.cpython-37.pyc,, -dns/rdtypes/dnskeybase.py,sha256=xqmBGcdg0uFl1FVTOBVtL9LJUip5VoeiBzk2o4cZRXs,4458 -dns/rdtypes/dsbase.py,sha256=2aKIy2azXkEDLAsf-GMXlHvpxtQ5a2FQUhbfT6PKDCg,3157 -dns/rdtypes/euibase.py,sha256=UaY1YOQBPZ3KKMEmFku9JL6S1CyQVJVzeFtJzyrwZHU,2777 -dns/rdtypes/mxbase.py,sha256=Hn9RJqnIz9LAt4kizE9jciw5wFazJs-BOA9MbGVE-SE,3737 -dns/rdtypes/nsbase.py,sha256=lYWBj09-aqMHwAL2tJF_jC5-_QcBS_t9v2o1uvGOzYA,2928 -dns/rdtypes/txtbase.py,sha256=uai-BeKwCZZpK4IiftS4IckjYIk9T0zxKI5RcNVmCZM,3328 -dns/renderer.py,sha256=TOrnxiYw91UnPUd4tR1C3OE9C5mVBNsuTlOrD1GeSp4,10826 -dns/resolver.py,sha256=yAXPLBxex3uD0780bZZSeVjBaclnG8BhjLpuwvZ-ikI,50210 -dns/reversename.py,sha256=I0rLFjFF0YXo1S6oZm2_1V_PVJyI_JfLdwv_YLIKpA4,3291 -dns/rrset.py,sha256=MaIKqdUfgo6BBRavfXb5w0M68Or9LtpDn5wdmSf12qc,6159 -dns/set.py,sha256=t3LFOnlRzMVY8jjit7kn4v9dDER1HHB8V1uMnHW2J44,7310 -dns/tokenizer.py,sha256=Z7pUpN__yNfWDhl4IBAQ96BaXOi8sCnOXnVRmaxGwT8,18040 -dns/tsig.py,sha256=GPnq7VBLfLjZrD3Cp7uYBeGjHpMHUfqwsQqKHZ0FIno,7813 -dns/tsigkeyring.py,sha256=HuOyV7UAT2TzcX2Xxi1YFGW7tDR_MlfXgsuzWJBT4A8,1814 -dns/ttl.py,sha256=5sukYG5gdkXgtkRjh8cDAJ0ZthSdR42QsPRshDQJJuc,2349 -dns/update.py,sha256=MOqvO2mNn3SOnTo9acDeTGq-YGRHjw60_FIRG309bGI,10343 -dns/version.py,sha256=iXOyp-lf9A1LC-XfdUU1NbkIKtqV4s61KI5XElbtMRs,1406 -dns/wiredata.py,sha256=RtfOFtbkzmxGUnJ9EuK4fdHU8shJLA46hWWH1y2NTtI,3751 -dns/zone.py,sha256=2alLKjAQ3X5VS22rvauolG0J-251kd5sKJSGzjJiu1M,42381 -dnspython-1.16.0.dist-info/DESCRIPTION.rst,sha256=6hmWFB2RbH9czYdOGp9iL1mpM00S6_G0I4kfijc1kwQ,454 -dnspython-1.16.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -dnspython-1.16.0.dist-info/LICENSE.txt,sha256=w-o_9WVLMpwZ07xfdIGvYjw93tSmFFWFSZ-EOtPXQc0,1526 -dnspython-1.16.0.dist-info/METADATA,sha256=MhWnFzd-dWhj5UKVHxoet9SSCcqgH5JQc6crlSbnfBI,1837 -dnspython-1.16.0.dist-info/RECORD,, -dnspython-1.16.0.dist-info/WHEEL,sha256=kdsN-5OJAZIiHN-iO4Rhl82KyS0bDWf4uBwMbkNafr8,110 -dnspython-1.16.0.dist-info/metadata.json,sha256=tR-xBI8ymSFJzryXXPK8cQaAEdES4COhW5fSlxPtJHE,1469 -dnspython-1.16.0.dist-info/top_level.txt,sha256=pNgzNfVoNIdUseB5acMPCTmUyu6m6aH47olUCAzzWTo,4 diff --git a/env/lib/python3.7/site-packages/dnspython-1.16.0.dist-info/WHEEL b/env/lib/python3.7/site-packages/dnspython-1.16.0.dist-info/WHEEL deleted file mode 100644 index 7332a41..0000000 --- a/env/lib/python3.7/site-packages/dnspython-1.16.0.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.30.0) -Root-Is-Purelib: true -Tag: py2-none-any -Tag: py3-none-any - diff --git a/env/lib/python3.7/site-packages/dnspython-1.16.0.dist-info/metadata.json b/env/lib/python3.7/site-packages/dnspython-1.16.0.dist-info/metadata.json deleted file mode 100644 index 893283d..0000000 --- a/env/lib/python3.7/site-packages/dnspython-1.16.0.dist-info/metadata.json +++ /dev/null @@ -1 +0,0 @@ -{"classifiers": ["Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "Intended Audience :: System Administrators", "License :: Freeware", "Operating System :: Microsoft :: Windows :: Windows 95/98/2000", "Operating System :: POSIX", "Programming Language :: Python", "Topic :: Internet :: Name Service (DNS)", "Topic :: Software Development :: Libraries :: Python Modules", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7"], "description_content_type": "UNKNOWN", "download_url": "http://www.dnspython.org/kits/1.16.0/dnspython-1.16.0.tar.gz", "extensions": {"python.details": {"contacts": [{"email": "halley@dnspython.org", "name": "Bob Halley", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst", "license": "LICENSE.txt"}, "project_urls": {"Home": "http://www.dnspython.org"}}}, "extras": ["DNSSEC", "IDNA"], "generator": "bdist_wheel (0.30.0)", "license": "BSD-like", "metadata_version": "2.0", "name": "dnspython", "provides": "dns", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "run_requires": [{"extra": "DNSSEC", "requires": ["ecdsa (>=0.13)", "pycryptodome"]}, {"extra": "IDNA", "requires": ["idna (>=2.1)"]}], "summary": "DNS toolkit", "version": "1.16.0"} \ No newline at end of file diff --git a/env/lib/python3.7/site-packages/dnspython-1.16.0.dist-info/top_level.txt b/env/lib/python3.7/site-packages/dnspython-1.16.0.dist-info/top_level.txt deleted file mode 100644 index 2e7065c..0000000 --- a/env/lib/python3.7/site-packages/dnspython-1.16.0.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -dns diff --git a/env/lib/python3.7/site-packages/easy_install.py b/env/lib/python3.7/site-packages/easy_install.py deleted file mode 100644 index d87e984..0000000 --- a/env/lib/python3.7/site-packages/easy_install.py +++ /dev/null @@ -1,5 +0,0 @@ -"""Run the EasyInstall command""" - -if __name__ == '__main__': - from setuptools.command.easy_install import main - main() diff --git a/env/lib/python3.7/site-packages/ipwhois/__init__.py b/env/lib/python3.7/site-packages/ipwhois/__init__.py deleted file mode 100644 index bc3e6de..0000000 --- a/env/lib/python3.7/site-packages/ipwhois/__init__.py +++ /dev/null @@ -1,29 +0,0 @@ -# Copyright (c) 2013-2019 Philip Hane -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. - -from .exceptions import * -from .net import Net -from .ipwhois import IPWhois - -__version__ = '1.1.0' diff --git a/env/lib/python3.7/site-packages/ipwhois/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/ipwhois/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 57ee300388adac866bc2aa015e42578454a593a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 263 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 K`L`AMFa3Y)sz2`l diff --git a/env/lib/python3.7/site-packages/ipwhois/__pycache__/exceptions.cpython-37.pyc b/env/lib/python3.7/site-packages/ipwhois/__pycache__/exceptions.cpython-37.pyc deleted file mode 100644 index d710d2bee1eecfd5135209bae1617bb2a0b5090e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3993 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 L$Su20hw}deXWf+s diff --git a/env/lib/python3.7/site-packages/ipwhois/__pycache__/hr.cpython-37.pyc b/env/lib/python3.7/site-packages/ipwhois/__pycache__/hr.cpython-37.pyc deleted file mode 100644 index 08fab051268bb847052396267a31c22c69f06eab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7387 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 diff --git a/env/lib/python3.7/site-packages/ipwhois/__pycache__/ipwhois.cpython-37.pyc b/env/lib/python3.7/site-packages/ipwhois/__pycache__/ipwhois.cpython-37.pyc deleted file mode 100644 index e6b67e2350dff4d2e89feb02573dc010f96bb753..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12476 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 V;_19gh6Ccd>i~z>t!BAZ`7MDjZZH4< diff --git a/env/lib/python3.7/site-packages/ipwhois/__pycache__/net.cpython-37.pyc b/env/lib/python3.7/site-packages/ipwhois/__pycache__/net.cpython-37.pyc deleted file mode 100644 index 239396dba855f3380d44cc9f742658acb0399235..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19747 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 diff --git a/env/lib/python3.7/site-packages/ipwhois/__pycache__/nir.cpython-37.pyc b/env/lib/python3.7/site-packages/ipwhois/__pycache__/nir.cpython-37.pyc deleted file mode 100644 index 5611da8e49fa7866e4fea1357697481a4016c463..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14963 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 D=MKf+ diff --git a/env/lib/python3.7/site-packages/ipwhois/__pycache__/utils.cpython-37.pyc b/env/lib/python3.7/site-packages/ipwhois/__pycache__/utils.cpython-37.pyc deleted file mode 100644 index 32c6d2eb73c277ae179ed4cdb0ae041efc2126d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12535 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 u{Bm5uw*@`87LpMKKQio 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 TX(MV)rUKdn)Q!08OG^Jg@f~39 diff --git a/env/lib/python3.7/site-packages/ipwhois/asn.py b/env/lib/python3.7/site-packages/ipwhois/asn.py deleted file mode 100644 index d73b477..0000000 --- a/env/lib/python3.7/site-packages/ipwhois/asn.py +++ /dev/null @@ -1,956 +0,0 @@ -# Copyright (c) 2013-2019 Philip Hane -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. - -import re -import sys -import copy -import logging - -from .exceptions import (NetError, ASNRegistryError, ASNParseError, - ASNLookupError, HTTPLookupError, WhoisLookupError, - WhoisRateLimitError, ASNOriginLookupError) - -if sys.version_info >= (3, 3): # pragma: no cover - from ipaddress import ip_network - -else: # pragma: no cover - from ipaddr import IPNetwork as ip_network - -log = logging.getLogger(__name__) - -BASE_NET = { - 'cidr': None, - 'description': None, - 'maintainer': None, - 'updated': None, - 'source': None -} - -ASN_ORIGIN_WHOIS = { - 'radb': { - 'server': 'whois.radb.net', - 'fields': { - 'description': r'(descr):[^\S\n]+(?P.+?)\n', - 'maintainer': r'(mnt-by):[^\S\n]+(?P.+?)\n', - 'updated': r'(changed):[^\S\n]+(?P.+?)\n', - 'source': r'(source):[^\S\n]+(?P.+?)\n', - } - }, -} - -ASN_ORIGIN_HTTP = { - 'radb': { - 'url': 'http://www.radb.net/query/', - 'form_data_asn_field': 'keywords', - 'form_data': { - 'advanced_query': '1', - 'query': 'Query', - '-T option': 'inet-rtr', - 'ip_option': '', - '-i': '1', - '-i option': 'origin' - }, - 'fields': { - 'description': r'(descr):[^\S\n]+(?P.+?)\', - 'maintainer': r'(mnt-by):[^\S\n]+(?P.+?)\', - 'updated': r'(changed):[^\S\n]+(?P.+?)\', - 'source': r'(source):[^\S\n]+(?P.+?)\', - } - }, -} - - -class IPASN: - """ - The class for parsing ASN data for an IP address. - - Args: - net (:obj:`ipwhois.net.Net`): A ipwhois.net.Net object. - - Raises: - NetError: The parameter provided is not an instance of - ipwhois.net.Net - """ - - def __init__(self, net): - - from .net import (Net, ORG_MAP) - from .whois import RIR_WHOIS - - # ipwhois.net.Net validation - if isinstance(net, Net): - - self._net = net - - else: - - raise NetError('The provided net parameter is not an instance of ' - 'ipwhois.net.Net') - - self.org_map = ORG_MAP - self.rir_whois = RIR_WHOIS - - def parse_fields_dns(self, response): - """ - The function for parsing ASN fields from a dns response. - - Args: - response (:obj:`str`): The response from the ASN dns server. - - Returns: - dict: The ASN lookup results - - :: - - { - 'asn' (str) - The Autonomous System Number - 'asn_date' (str) - The ASN Allocation date - 'asn_registry' (str) - The assigned ASN registry - 'asn_cidr' (str) - The assigned ASN CIDR - 'asn_country_code' (str) - The assigned ASN country code - 'asn_description' (None) - Cannot retrieve with this - method. - } - - Raises: - ASNRegistryError: The ASN registry is not known. - ASNParseError: ASN parsing failed. - """ - - try: - - temp = response.split('|') - - # Parse out the ASN information. - ret = {'asn_registry': temp[3].strip(' \n')} - - if ret['asn_registry'] not in self.rir_whois.keys(): - - raise ASNRegistryError( - 'ASN registry {0} is not known.'.format( - ret['asn_registry']) - ) - - ret['asn'] = temp[0].strip(' "\n') - ret['asn_cidr'] = temp[1].strip(' \n') - ret['asn_country_code'] = temp[2].strip(' \n').upper() - ret['asn_date'] = temp[4].strip(' "\n') - ret['asn_description'] = None - - except ASNRegistryError: - - raise - - except Exception as e: - - raise ASNParseError('Parsing failed for "{0}" with exception: {1}.' - ''.format(response, e)[:100]) - - return ret - - def _parse_fields_dns(self, *args, **kwargs): - """ - Deprecated. This will be removed in a future release. - """ - - from warnings import warn - warn('IPASN._parse_fields_dns() has been deprecated and will be ' - 'removed. You should now use IPASN.parse_fields_dns().') - return self.parse_fields_dns(*args, **kwargs) - - def parse_fields_verbose_dns(self, response): - """ - The function for parsing ASN fields from a verbose dns response. - - Args: - response (:obj:`str`): The response from the ASN dns server. - - Returns: - dict: The ASN lookup results - - :: - - { - 'asn' (str) - The Autonomous System Number - 'asn_date' (str) - The ASN Allocation date - 'asn_registry' (str) - The assigned ASN registry - 'asn_cidr' (None) - Cannot retrieve with this method. - 'asn_country_code' (str) - The assigned ASN country code - 'asn_description' (str) - The ASN description - } - - Raises: - ASNRegistryError: The ASN registry is not known. - ASNParseError: ASN parsing failed. - """ - - try: - - temp = response.split('|') - - # Parse out the ASN information. - ret = {'asn_registry': temp[2].strip(' \n')} - - if ret['asn_registry'] not in self.rir_whois.keys(): - - raise ASNRegistryError( - 'ASN registry {0} is not known.'.format( - ret['asn_registry']) - ) - - ret['asn'] = temp[0].strip(' "\n') - ret['asn_cidr'] = None - ret['asn_country_code'] = temp[1].strip(' \n').upper() - ret['asn_date'] = temp[3].strip(' \n') - ret['asn_description'] = temp[4].strip(' "\n') - - except ASNRegistryError: - - raise - - except Exception as e: - - raise ASNParseError('Parsing failed for "{0}" with exception: {1}.' - ''.format(response, e)[:100]) - - return ret - - def parse_fields_whois(self, response): - """ - The function for parsing ASN fields from a whois response. - - Args: - response (:obj:`str`): The response from the ASN whois server. - - Returns: - dict: The ASN lookup results - - :: - - { - 'asn' (str) - The Autonomous System Number - 'asn_date' (str) - The ASN Allocation date - 'asn_registry' (str) - The assigned ASN registry - 'asn_cidr' (str) - The assigned ASN CIDR - 'asn_country_code' (str) - The assigned ASN country code - 'asn_description' (str) - The ASN description - } - - Raises: - ASNRegistryError: The ASN registry is not known. - ASNParseError: ASN parsing failed. - """ - - try: - - temp = response.split('|') - - # Parse out the ASN information. - ret = {'asn_registry': temp[4].strip(' \n')} - - if ret['asn_registry'] not in self.rir_whois.keys(): - - raise ASNRegistryError( - 'ASN registry {0} is not known.'.format( - ret['asn_registry']) - ) - - ret['asn'] = temp[0].strip(' \n') - ret['asn_cidr'] = temp[2].strip(' \n') - ret['asn_country_code'] = temp[3].strip(' \n').upper() - ret['asn_date'] = temp[5].strip(' \n') - ret['asn_description'] = temp[6].strip(' \n') - - except ASNRegistryError: - - raise - - except Exception as e: - - raise ASNParseError('Parsing failed for "{0}" with exception: {1}.' - ''.format(response, e)[:100]) - - return ret - - def _parse_fields_whois(self, *args, **kwargs): - """ - Deprecated. This will be removed in a future release. - """ - - from warnings import warn - warn('IPASN._parse_fields_whois() has been deprecated and will be ' - 'removed. You should now use IPASN.parse_fields_whois().') - return self.parse_fields_whois(*args, **kwargs) - - def parse_fields_http(self, response, extra_org_map=None): - """ - The function for parsing ASN fields from a http response. - - Args: - response (:obj:`str`): The response from the ASN http server. - extra_org_map (:obj:`dict`): Dictionary mapping org handles to - RIRs. This is for limited cases where ARIN REST (ASN fallback - HTTP lookup) does not show an RIR as the org handle e.g., DNIC - (which is now the built in ORG_MAP) e.g., {'DNIC': 'arin'}. - Valid RIR values are (note the case-sensitive - this is meant - to match the REST result): 'ARIN', 'RIPE', 'apnic', 'lacnic', - 'afrinic'. Defaults to None. - - Returns: - dict: The ASN lookup results - - :: - - { - 'asn' (None) - Cannot retrieve with this method. - 'asn_date' (None) - Cannot retrieve with this method. - 'asn_registry' (str) - The assigned ASN registry - 'asn_cidr' (None) - Cannot retrieve with this method. - 'asn_country_code' (None) - Cannot retrieve with this - method. - 'asn_description' (None) - Cannot retrieve with this - method. - } - - Raises: - ASNRegistryError: The ASN registry is not known. - ASNParseError: ASN parsing failed. - """ - - # Set the org_map. Map the orgRef handle to an RIR. - org_map = self.org_map.copy() - try: - - org_map.update(extra_org_map) - - except (TypeError, ValueError, IndexError, KeyError): - - pass - - try: - - asn_data = { - 'asn_registry': None, - 'asn': None, - 'asn_cidr': None, - 'asn_country_code': None, - 'asn_date': None, - 'asn_description': None - } - - try: - - net_list = response['nets']['net'] - - if not isinstance(net_list, list): - net_list = [net_list] - - except (KeyError, TypeError): - - log.debug('No networks found') - net_list = [] - - for n in reversed(net_list): - - try: - - asn_data['asn_registry'] = ( - org_map[n['orgRef']['@handle'].upper()] - ) - - except KeyError as e: - - log.debug('Could not parse ASN registry via HTTP: ' - '{0}'.format(str(e))) - continue - - break - - if not asn_data['asn_registry']: - - log.debug('Could not parse ASN registry via HTTP') - raise ASNRegistryError('ASN registry lookup failed.') - - except ASNRegistryError: - - raise - - except Exception as e: # pragma: no cover - - raise ASNParseError('Parsing failed for "{0}" with exception: {1}.' - ''.format(response, e)[:100]) - - return asn_data - - def _parse_fields_http(self, *args, **kwargs): - """ - Deprecated. This will be removed in a future release. - """ - - from warnings import warn - warn('IPASN._parse_fields_http() has been deprecated and will be ' - 'removed. You should now use IPASN.parse_fields_http().') - return self.parse_fields_http(*args, **kwargs) - - def lookup(self, inc_raw=False, retry_count=3, asn_alts=None, - extra_org_map=None, asn_methods=None, - get_asn_description=True): - """ - The wrapper function for retrieving and parsing ASN information for an - IP address. - - Args: - inc_raw (:obj:`bool`): Whether to include the raw results in the - returned dictionary. Defaults to False. - retry_count (:obj:`int`): The number of times to retry in case - socket errors, timeouts, connection resets, etc. are - encountered. Defaults to 3. - asn_alts (:obj:`list`): Additional lookup types to attempt if the - ASN dns lookup fails. Allow permutations must be enabled. - Defaults to all ['whois', 'http']. *WARNING* deprecated in - favor of new argument asn_methods. Defaults to None. - extra_org_map (:obj:`dict`): Mapping org handles to RIRs. This is - for limited cases where ARIN REST (ASN fallback HTTP lookup) - does not show an RIR as the org handle e.g., DNIC (which is - now the built in ORG_MAP) e.g., {'DNIC': 'arin'}. Valid RIR - values are (note the case-sensitive - this is meant to match - the REST result): 'ARIN', 'RIPE', 'apnic', 'lacnic', 'afrinic' - Defaults to None. - asn_methods (:obj:`list`): ASN lookup types to attempt, in order. - If None, defaults to all: ['dns', 'whois', 'http']. - get_asn_description (:obj:`bool`): Whether to run an additional - query when pulling ASN information via dns, in order to get - the ASN description. Defaults to True. - - Returns: - dict: The ASN lookup results - - :: - - { - 'asn' (str) - The Autonomous System Number - 'asn_date' (str) - The ASN Allocation date - 'asn_registry' (str) - The assigned ASN registry - 'asn_cidr' (str) - The assigned ASN CIDR - 'asn_country_code' (str) - The assigned ASN country code - 'asn_description' (str) - The ASN description - 'raw' (str) - Raw ASN results if the inc_raw parameter is - True. - } - - Raises: - ValueError: methods argument requires one of dns, whois, http. - ASNRegistryError: ASN registry does not match. - """ - - if asn_methods is None: - - if asn_alts is None: - - lookups = ['dns', 'whois', 'http'] - - else: - - from warnings import warn - warn('IPASN.lookup() asn_alts argument has been deprecated ' - 'and will be removed. You should now use the asn_methods ' - 'argument.') - lookups = ['dns'] + asn_alts - - else: - - if {'dns', 'whois', 'http'}.isdisjoint(asn_methods): - - raise ValueError('methods argument requires at least one of ' - 'dns, whois, http.') - - lookups = asn_methods - - response = None - asn_data = None - dns_success = False - for index, lookup_method in enumerate(lookups): - - if index > 0 and not asn_methods and not ( - self._net.allow_permutations): - - raise ASNRegistryError('ASN registry lookup failed. ' - 'Permutations not allowed.') - - if lookup_method == 'dns': - - try: - - self._net.dns_resolver.lifetime = ( - self._net.dns_resolver.timeout * ( - retry_count and retry_count or 1 - ) - ) - response = self._net.get_asn_dns() - asn_data_list = [] - for asn_entry in response: - - asn_data_list.append(self.parse_fields_dns( - str(asn_entry))) - - # Iterate through the parsed ASN results to find the - # smallest CIDR - asn_data = asn_data_list.pop(0) - try: - - prefix_len = ip_network(asn_data['asn_cidr']).prefixlen - for asn_parsed in asn_data_list: - prefix_len_comp = ip_network( - asn_parsed['asn_cidr']).prefixlen - if prefix_len_comp > prefix_len: - asn_data = asn_parsed - prefix_len = prefix_len_comp - - except (KeyError, ValueError): # pragma: no cover - - pass - - dns_success = True - break - - except (ASNLookupError, ASNRegistryError) as e: - - log.debug('ASN DNS lookup failed: {0}'.format(e)) - pass - - elif lookup_method == 'whois': - - try: - - response = self._net.get_asn_whois(retry_count) - asn_data = self.parse_fields_whois( - response) # pragma: no cover - break - - except (ASNLookupError, ASNRegistryError) as e: - - log.debug('ASN WHOIS lookup failed: {0}'.format(e)) - pass - - elif lookup_method == 'http': - - try: - - response = self._net.get_asn_http( - retry_count=retry_count - ) - asn_data = self.parse_fields_http(response, - extra_org_map) - break - - except (ASNLookupError, ASNRegistryError) as e: - - log.debug('ASN HTTP lookup failed: {0}'.format(e)) - pass - - if asn_data is None: - - raise ASNRegistryError('ASN lookup failed with no more methods to ' - 'try.') - - if get_asn_description and dns_success: - - try: - - response = self._net.get_asn_verbose_dns('AS{0}'.format( - asn_data['asn'])) - asn_verbose_data = self.parse_fields_verbose_dns(response) - asn_data['asn_description'] = asn_verbose_data[ - 'asn_description'] - - except (ASNLookupError, ASNRegistryError) as e: # pragma: no cover - - log.debug('ASN DNS verbose lookup failed: {0}'.format(e)) - pass - - if inc_raw: - - asn_data['raw'] = response - - return asn_data - - -class ASNOrigin: - """ - The class for parsing ASN origin whois data - - Args: - net (:obj:`ipwhois.net.Net`): A ipwhois.net.Net object. - - Raises: - NetError: The parameter provided is not an instance of - ipwhois.net.Net - """ - - def __init__(self, net): - - from .net import Net - - # ipwhois.net.Net validation - if isinstance(net, Net): - - self._net = net - - else: - - raise NetError('The provided net parameter is not an instance of ' - 'ipwhois.net.Net') - - def parse_fields(self, response, fields_dict, net_start=None, - net_end=None, field_list=None): - """ - The function for parsing ASN whois fields from a data input. - - Args: - response (:obj:`str`): The response from the whois/rwhois server. - fields_dict (:obj:`dict`): Mapping of fields->regex search values. - net_start (:obj:`int`): The starting point of the network (if - parsing multiple networks). Defaults to None. - net_end (:obj:`int`): The ending point of the network (if parsing - multiple networks). Defaults to None. - field_list (:obj:`list`): If provided, a list of fields to parse: - ['description', 'maintainer', 'updated', 'source'] - If None, defaults to all fields. - - Returns: - dict: A dictionary of fields provided in fields_dict. - """ - - ret = {} - - if not field_list: - - field_list = ['description', 'maintainer', 'updated', 'source'] - - generate = ((field, pattern) for (field, pattern) in - fields_dict.items() if field in field_list) - - for field, pattern in generate: - - pattern = re.compile( - str(pattern), - re.DOTALL - ) - - if net_start is not None: - - match = pattern.finditer(response, net_end, net_start) - - elif net_end is not None: - - match = pattern.finditer(response, net_end) - - else: - - match = pattern.finditer(response) - - values = [] - sub_section_end = None - for m in match: - - if sub_section_end: - - if sub_section_end != (m.start() - 1): - break - - try: - - values.append(m.group('val').strip()) - - except IndexError: # pragma: no cover - - pass - - sub_section_end = m.end() - - if len(values) > 0: - - value = None - try: - - value = values[0] - - except ValueError as e: # pragma: no cover - - log.debug('ASN origin Whois field parsing failed for {0}: ' - '{1}'.format(field, e)) - pass - - ret[field] = value - - return ret - - def _parse_fields(self, *args, **kwargs): - """ - Deprecated. This will be removed in a future release. - """ - - from warnings import warn - warn('ASNOrigin._parse_fields() has been deprecated and will be ' - 'removed. You should now use ASNOrigin.parse_fields().') - return self.parse_fields(*args, **kwargs) - - def get_nets_radb(self, response, is_http=False): - """ - The function for parsing network blocks from ASN origin data. - - Args: - response (:obj:`str`): The response from the RADB whois/http - server. - is_http (:obj:`bool`): If the query is RADB HTTP instead of whois, - set to True. Defaults to False. - - Returns: - list: A list of network block dictionaries - - :: - - [{ - 'cidr' (str) - The assigned CIDR - 'start' (int) - The index for the start of the parsed - network block - 'end' (int) - The index for the end of the parsed network - block - }] - """ - - nets = [] - - if is_http: - regex = r'route(?:6)?:[^\S\n]+(?P.+?)
' - else: - regex = r'^route(?:6)?:[^\S\n]+(?P.+|.+)$' - - # Iterate through all of the networks found, storing the CIDR value - # and the start and end positions. - for match in re.finditer( - regex, - response, - re.MULTILINE - ): - - try: - - net = copy.deepcopy(BASE_NET) - net['cidr'] = match.group(1).strip() - net['start'] = match.start() - net['end'] = match.end() - nets.append(net) - - except ValueError: # pragma: no cover - - pass - - return nets - - def _get_nets_radb(self, *args, **kwargs): - """ - Deprecated. This will be removed in a future release. - """ - - from warnings import warn - warn('ASNOrigin._get_nets_radb() has been deprecated and will be ' - 'removed. You should now use ASNOrigin.get_nets_radb().') - return self.get_nets_radb(*args, **kwargs) - - def lookup(self, asn=None, inc_raw=False, retry_count=3, response=None, - field_list=None, asn_alts=None, asn_methods=None): - """ - The function for retrieving and parsing ASN origin whois information - via port 43/tcp (WHOIS). - - Args: - asn (:obj:`str`): The ASN (required). - inc_raw (:obj:`bool`): Whether to include the raw results in the - returned dictionary. Defaults to False. - retry_count (:obj:`int`): The number of times to retry in case - socket errors, timeouts, connection resets, etc. are - encountered. Defaults to 3. - response (:obj:`str`): Optional response object, this bypasses the - Whois lookup. Defaults to None. - field_list (:obj:`list`): If provided, fields to parse: - ['description', 'maintainer', 'updated', 'source'] - If None, defaults to all. - asn_alts (:obj:`list`): Additional lookup types to attempt if the - ASN whois lookup fails. If None, defaults to all ['http']. - *WARNING* deprecated in favor of new argument asn_methods. - asn_methods (:obj:`list`): ASN lookup types to attempt, in order. - If None, defaults to all ['whois', 'http']. - - Returns: - dict: The ASN origin lookup results - - :: - - { - 'query' (str) - The Autonomous System Number - 'nets' (list) - Dictionaries containing network - information which consists of the fields listed in the - ASN_ORIGIN_WHOIS dictionary. - 'raw' (str) - Raw ASN origin whois results if the inc_raw - parameter is True. - } - - Raises: - ValueError: methods argument requires one of whois, http. - ASNOriginLookupError: ASN origin lookup failed. - """ - - if asn[0:2] != 'AS': - - asn = 'AS{0}'.format(asn) - - if asn_methods is None: - - if asn_alts is None: - - lookups = ['whois', 'http'] - - else: - - from warnings import warn - warn('ASNOrigin.lookup() asn_alts argument has been deprecated' - ' and will be removed. You should now use the asn_methods' - ' argument.') - lookups = ['whois'] + asn_alts - - else: - - if {'whois', 'http'}.isdisjoint(asn_methods): - - raise ValueError('methods argument requires at least one of ' - 'whois, http.') - - lookups = asn_methods - - # Create the return dictionary. - results = { - 'query': asn, - 'nets': [], - 'raw': None - } - - is_http = False - - # Only fetch the response if we haven't already. - if response is None: - - for index, lookup_method in enumerate(lookups): - - if lookup_method == 'whois': - - try: - - log.debug('Response not given, perform ASN origin ' - 'WHOIS lookup for {0}'.format(asn)) - - # Retrieve the whois data. - response = self._net.get_asn_origin_whois( - asn=asn, retry_count=retry_count - ) - - except (WhoisLookupError, WhoisRateLimitError) as e: - - log.debug('ASN origin WHOIS lookup failed: {0}' - ''.format(e)) - pass - - elif lookup_method == 'http': - - try: - - log.debug('Response not given, perform ASN origin ' - 'HTTP lookup for: {0}'.format(asn)) - - tmp = ASN_ORIGIN_HTTP['radb']['form_data'] - tmp[str(ASN_ORIGIN_HTTP['radb']['form_data_asn_field'] - )] = asn - response = self._net.get_http_raw( - url=ASN_ORIGIN_HTTP['radb']['url'], - retry_count=retry_count, - request_type='POST', - form_data=tmp - ) - is_http = True # pragma: no cover - - except HTTPLookupError as e: - - log.debug('ASN origin HTTP lookup failed: {0}' - ''.format(e)) - pass - - if response is None: - - raise ASNOriginLookupError('ASN origin lookup failed with no ' - 'more methods to try.') - - # If inc_raw parameter is True, add the response to return dictionary. - if inc_raw: - - results['raw'] = response - - nets = [] - nets_response = self.get_nets_radb(response, is_http) - - nets.extend(nets_response) - - if is_http: # pragma: no cover - fields = ASN_ORIGIN_HTTP - else: - fields = ASN_ORIGIN_WHOIS - - # Iterate through all of the network sections and parse out the - # appropriate fields for each. - log.debug('Parsing ASN origin data') - - for index, net in enumerate(nets): - - section_end = None - if index + 1 < len(nets): - - section_end = nets[index + 1]['start'] - - temp_net = self.parse_fields( - response, - fields['radb']['fields'], - section_end, - net['end'], - field_list - ) - - # Merge the net dictionaries. - net.update(temp_net) - - # The start and end values are no longer needed. - del net['start'], net['end'] - - # Add the networks to the return dictionary. - results['nets'] = nets - - return results diff --git a/env/lib/python3.7/site-packages/ipwhois/data/iso_3166-1.csv b/env/lib/python3.7/site-packages/ipwhois/data/iso_3166-1.csv deleted file mode 100644 index d9ba3ff..0000000 --- a/env/lib/python3.7/site-packages/ipwhois/data/iso_3166-1.csv +++ /dev/null @@ -1,252 +0,0 @@ -AD,Andorra, -AE,United Arab Emirates, -AF,Afghanistan, -AG,Antigua and Barbuda, -AI,Anguilla, -AL,Albania, -AM,Armenia, -AN,Netherlands Antilles, -AO,Angola, -AP,"Asia/Pacific Region", -AQ,Antarctica, -AR,Argentina, -AS,American Samoa, -AT,Austria, -AU,Australia, -AW,Aruba, -AX,Aland Islands, -AZ,Azerbaijan, -BA,Bosnia and Herzegovina, -BB,Barbados, -BD,Bangladesh, -BE,Belgium, -BF,Burkina Faso, -BG,Bulgaria, -BH,Bahrain, -BI,Burundi, -BJ,Benin, -BL,Saint Bartelemey, -BM,Bermuda, -BN,Brunei Darussalam, -BO,Bolivia, -BQ,"Bonaire, Saint Eustatius and Saba", -BR,Brazil, -BS,Bahamas, -BT,Bhutan, -BV,Bouvet Island, -BW,Botswana, -BY,Belarus, -BZ,Belize, -CA,Canada, -CC,Cocos (Keeling) Islands, -CD,"Congo, The Democratic Republic of the", -CF,Central African Republic, -CG,Congo, -CH,Switzerland, -CI,Cote d'Ivoire, -CK,Cook Islands, -CL,Chile, -CM,Cameroon, -CN,China, -CO,Colombia, -CR,Costa Rica, -CU,Cuba, -CV,Cape Verde, -CW,Curacao, -CX,Christmas Island, -CY,Cyprus, -CZ,Czech Republic, -DE,Germany, -DJ,Djibouti, -DK,Denmark, -DM,Dominica, -DO,Dominican Republic, -DZ,Algeria, -EC,Ecuador, -EE,Estonia, -EG,Egypt, -EH,Western Sahara, -ER,Eritrea, -ES,Spain, -ET,Ethiopia, -EU,Europe, -FI,Finland, -FJ,Fiji, -FK,Falkland Islands (Malvinas), -FM,"Micronesia, Federated States of", -FO,Faroe Islands, -FR,France, -GA,Gabon, -GB,United Kingdom, -GD,Grenada, -GE,Georgia, -GF,French Guiana, -GG,Guernsey, -GH,Ghana, -GI,Gibraltar, -GL,Greenland, -GM,Gambia, -GN,Guinea, -GP,Guadeloupe, -GQ,Equatorial Guinea, -GR,Greece, -GS,South Georgia and the South Sandwich Islands, -GT,Guatemala, -GU,Guam, -GW,Guinea-Bissau, -GY,Guyana, -HK,Hong Kong, -HM,Heard Island and McDonald Islands, -HN,Honduras, -HR,Croatia, -HT,Haiti, -HU,Hungary, -ID,Indonesia, -IE,Ireland, -IL,Israel, -IM,Isle of Man, -IN,India, -IO,British Indian Ocean Territory, -IQ,Iraq, -IR,"Iran, Islamic Republic of", -IS,Iceland, -IT,Italy, -JE,Jersey, -JM,Jamaica, -JO,Jordan, -JP,Japan, -KE,Kenya, -KG,Kyrgyzstan, -KH,Cambodia, -KI,Kiribati, -KM,Comoros, -KN,Saint Kitts and Nevis, -KP,"Korea, Democratic People's Republic of", -KR,"Korea, Republic of", -KW,Kuwait, -KY,Cayman Islands, -KZ,Kazakhstan, -LA,Lao People's Democratic Republic, -LB,Lebanon, -LC,Saint Lucia, -LI,Liechtenstein, -LK,Sri Lanka, -LR,Liberia, -LS,Lesotho, -LT,Lithuania, -LU,Luxembourg, -LV,Latvia, -LY,Libyan Arab Jamahiriya, -MA,Morocco, -MC,Monaco, -MD,"Moldova, Republic of", -ME,Montenegro, -MF,Saint Martin, -MG,Madagascar, -MH,Marshall Islands, -MK,Macedonia, -ML,Mali, -MM,Myanmar, -MN,Mongolia, -MO,Macao, -MP,Northern Mariana Islands, -MQ,Martinique, -MR,Mauritania, -MS,Montserrat, -MT,Malta, -MU,Mauritius, -MV,Maldives, -MW,Malawi, -MX,Mexico, -MY,Malaysia, -MZ,Mozambique, -NA,Namibia, -NC,New Caledonia, -NE,Niger, -NF,Norfolk Island, -NG,Nigeria, -NI,Nicaragua, -NL,Netherlands, -NO,Norway, -NP,Nepal, -NR,Nauru, -NU,Niue, -NZ,New Zealand, -OM,Oman, -PA,Panama, -PE,Peru, -PF,French Polynesia, -PG,Papua New Guinea, -PH,Philippines, -PK,Pakistan, -PL,Poland, -PM,Saint Pierre and Miquelon, -PN,Pitcairn, -PR,Puerto Rico, -PS,Palestinian Territory, -PT,Portugal, -PW,Palau, -PY,Paraguay, -QA,Qatar, -RE,Reunion, -RO,Romania, -RS,Serbia, -RU,Russian Federation, -RW,Rwanda, -SA,Saudi Arabia, -SB,Solomon Islands, -SC,Seychelles, -SD,Sudan, -SE,Sweden, -SG,Singapore, -SH,Saint Helena, -SI,Slovenia, -SJ,Svalbard and Jan Mayen, -SK,Slovakia, -SL,Sierra Leone, -SM,San Marino, -SN,Senegal, -SO,Somalia, -SR,Suriname, -SS,South Sudan, -ST,Sao Tome and Principe, -SV,El Salvador, -SX,Sint Maarten, -SY,Syrian Arab Republic, -SZ,Swaziland, -TC,Turks and Caicos Islands, -TD,Chad, -TF,French Southern Territories, -TG,Togo, -TH,Thailand, -TJ,Tajikistan, -TK,Tokelau, -TL,Timor-Leste, -TM,Turkmenistan, -TN,Tunisia, -TO,Tonga, -TR,Turkey, -TT,Trinidad and Tobago, -TV,Tuvalu, -TW,Taiwan, -TZ,"Tanzania, United Republic of", -UA,Ukraine, -UG,Uganda, -UM,United States Minor Outlying Islands, -US,United States, -UY,Uruguay, -UZ,Uzbekistan, -VA,Holy See (Vatican City State), -VC,Saint Vincent and the Grenadines, -VE,Venezuela, -VG,"Virgin Islands, British", -VI,"Virgin Islands, U.S.", -VN,Vietnam, -VU,Vanuatu, -WF,Wallis and Futuna, -WS,Samoa, -YE,Yemen, -YT,Mayotte, -ZA,South Africa, -ZM,Zambia, -ZW,Zimbabwe, \ No newline at end of file diff --git a/env/lib/python3.7/site-packages/ipwhois/data/iso_3166-1_list_en.xml b/env/lib/python3.7/site-packages/ipwhois/data/iso_3166-1_list_en.xml deleted file mode 100644 index 31d5e02..0000000 --- a/env/lib/python3.7/site-packages/ipwhois/data/iso_3166-1_list_en.xml +++ /dev/null @@ -1,1003 +0,0 @@ - - - - AFGHANISTAN - AF - - - ALAND ISLANDS - AX - - - ALBANIA - AL - - - ALGERIA - DZ - - - AMERICAN SAMOA - AS - - - ANDORRA - AD - - - ANGOLA - AO - - - ANGUILLA - AI - - - ANTARCTICA - AQ - - - ANTIGUA AND BARBUDA - AG - - - NETHERLANDS ANTILLES - AN - - - ARGENTINA - AR - - - ARMENIA - AM - - - ARUBA - AW - - - AUSTRALIA - AU - - - AUSTRIA - AT - - - AZERBAIJAN - AZ - - - BAHAMAS - BS - - - BAHRAIN - BH - - - BANGLADESH - BD - - - BARBADOS - BB - - - BELARUS - BY - - - BELGIUM - BE - - - BELIZE - BZ - - - BENIN - BJ - - - BERMUDA - BM - - - BHUTAN - BT - - - BOLIVIA, PLURINATIONAL STATE OF - BO - - - BONAIRE, SINT EUSTATIUS AND SABA - BQ - - - BOSNIA AND HERZEGOVINA - BA - - - BOTSWANA - BW - - - BOUVET ISLAND - BV - - - BRAZIL - BR - - - BRITISH INDIAN OCEAN TERRITORY - IO - - - BRUNEI DARUSSALAM - BN - - - BULGARIA - BG - - - BURKINA FASO - BF - - - BURUNDI - BI - - - CAMBODIA - KH - - - CAMEROON - CM - - - CANADA - CA - - - CAPE VERDE - CV - - - CAYMAN ISLANDS - KY - - - CENTRAL AFRICAN REPUBLIC - CF - - - CHAD - TD - - - CHILE - CL - - - CHINA - CN - - - CHRISTMAS ISLAND - CX - - - COCOS (KEELING) ISLANDS - CC - - - COLOMBIA - CO - - - COMOROS - KM - - - CONGO - CG - - - CONGO, THE DEMOCRATIC REPUBLIC OF THE - CD - - - COOK ISLANDS - CK - - - COSTA RICA - CR - - - COTE D'IVOIRE - CI - - - CROATIA - HR - - - CURACAO - CW - - - CUBA - CU - - - CYPRUS - CY - - - CZECH REPUBLIC - CZ - - - DENMARK - DK - - - DJIBOUTI - DJ - - - DOMINICA - DM - - - DOMINICAN REPUBLIC - DO - - - ECUADOR - EC - - - EGYPT - EG - - - EL SALVADOR - SV - - - EQUATORIAL GUINEA - GQ - - - ERITREA - ER - - - ESTONIA - EE - - - ETHIOPIA - ET - - - FALKLAND ISLANDS (MALVINAS) - FK - - - FAROE ISLANDS - FO - - - FIJI - FJ - - - FINLAND - FI - - - FRANCE - FR - - - FRENCH GUIANA - GF - - - FRENCH POLYNESIA - PF - - - FRENCH SOUTHERN TERRITORIES - TF - - - GABON - GA - - - GAMBIA - GM - - - GEORGIA - GE - - - GERMANY - DE - - - GHANA - GH - - - GIBRALTAR - GI - - - GREECE - GR - - - GREENLAND - GL - - - GRENADA - GD - - - GUADELOUPE - GP - - - GUAM - GU - - - GUATEMALA - GT - - - GUERNSEY - GG - - - GUINEA - GN - - - GUINEA-BISSAU - GW - - - GUYANA - GY - - - HAITI - HT - - - HEARD ISLAND AND MCDONALD ISLANDS - HM - - - HOLY SEE (VATICAN CITY STATE) - VA - - - HONDURAS - HN - - - HONG KONG - HK - - - HUNGARY - HU - - - ICELAND - IS - - - INDIA - IN - - - INDONESIA - ID - - - IRAN, ISLAMIC REPUBLIC OF - IR - - - IRAQ - IQ - - - IRELAND - IE - - - ISLE OF MAN - IM - - - ISRAEL - IL - - - ITALY - IT - - - JAMAICA - JM - - - JAPAN - JP - - - JERSEY - JE - - - JORDAN - JO - - - KAZAKHSTAN - KZ - - - KENYA - KE - - - KIRIBATI - KI - - - KOREA, DEMOCRATIC PEOPLE'S REPUBLIC OF - KP - - - KOREA, REPUBLIC OF - KR - - - KUWAIT - KW - - - KYRGYZSTAN - KG - - - LAO PEOPLE'S DEMOCRATIC REPUBLIC - LA - - - LATVIA - LV - - - LEBANON - LB - - - LESOTHO - LS - - - LIBERIA - LR - - - LIBYA - LY - - - LIECHTENSTEIN - LI - - - LITHUANIA - LT - - - LUXEMBOURG - LU - - - MACAO - MO - - - MACEDONIA, THE FORMER YUGOSLAV REPUBLIC OF - MK - - - MADAGASCAR - MG - - - MALAWI - MW - - - MALAYSIA - MY - - - MALDIVES - MV - - - MALI - ML - - - MALTA - MT - - - MARSHALL ISLANDS - MH - - - MARTINIQUE - MQ - - - MAURITANIA - MR - - - MAURITIUS - MU - - - MAYOTTE - YT - - - MEXICO - MX - - - MICRONESIA, FEDERATED STATES OF - FM - - - MOLDOVA, REPUBLIC OF - MD - - - MONACO - MC - - - MONGOLIA - MN - - - MONTENEGRO - ME - - - MONTSERRAT - MS - - - MOROCCO - MA - - - MOZAMBIQUE - MZ - - - MYANMAR - MM - - - NAMIBIA - NA - - - NAURU - NR - - - NEPAL - NP - - - NETHERLANDS - NL - - - NEW CALEDONIA - NC - - - NEW ZEALAND - NZ - - - NICARAGUA - NI - - - NIGER - NE - - - NIGERIA - NG - - - NIUE - NU - - - NORFOLK ISLAND - NF - - - NORTHERN MARIANA ISLANDS - MP - - - NORWAY - NO - - - OMAN - OM - - - PAKISTAN - PK - - - PALAU - PW - - - PALESTINIAN TERRITORY, OCCUPIED - PS - - - PANAMA - PA - - - PAPUA NEW GUINEA - PG - - - PARAGUAY - PY - - - PERU - PE - - - PHILIPPINES - PH - - - PITCAIRN - PN - - - POLAND - PL - - - PORTUGAL - PT - - - PUERTO RICO - PR - - - QATAR - QA - - - REUNION - RE - - - ROMANIA - RO - - - RUSSIAN FEDERATION - RU - - - RWANDA - RW - - - SAINT BARTHELEMY - BL - - - SAINT HELENA, ASCENSION AND TRISTAN DA CUNHA - SH - - - SAINT KITTS AND NEVIS - KN - - - SAINT LUCIA - LC - - - SAINT MARTIN (FRENCH PART) - MF - - - SAINT PIERRE AND MIQUELON - PM - - - SAINT VINCENT AND THE GRENADINES - VC - - - SAMOA - WS - - - SAN MARINO - SM - - - SAO TOME AND PRINCIPE - ST - - - SAUDI ARABIA - SA - - - SENEGAL - SN - - - SERBIA - RS - - - SEYCHELLES - SC - - - SIERRA LEONE - SL - - - SINGAPORE - SG - - - SINT MAARTEN (DUTCH PART) - SX - - - SLOVAKIA - SK - - - SLOVENIA - SI - - - SOLOMON ISLANDS - SB - - - SOMALIA - SO - - - SOUTH AFRICA - ZA - - - SOUTH GEORGIA AND THE SOUTH SANDWICH ISLANDS - GS - - - SOUTH SUDAN - SS - - - SPAIN - ES - - - SRI LANKA - LK - - - SUDAN - SD - - - SURINAME - SR - - - SVALBARD AND JAN MAYEN - SJ - - - SWAZILAND - SZ - - - SWEDEN - SE - - - SWITZERLAND - CH - - - SYRIAN ARAB REPUBLIC - SY - - - TAIWAN, PROVINCE OF CHINA - TW - - - TAJIKISTAN - TJ - - - TANZANIA, UNITED REPUBLIC OF - TZ - - - THAILAND - TH - - - TIMOR-LESTE - TL - - - TOGO - TG - - - TOKELAU - TK - - - TONGA - TO - - - TRINIDAD AND TOBAGO - TT - - - TUNISIA - TN - - - TURKEY - TR - - - TURKMENISTAN - TM - - - TURKS AND CAICOS ISLANDS - TC - - - TUVALU - TV - - - UGANDA - UG - - - UKRAINE - UA - - - UNITED ARAB EMIRATES - AE - - - UNITED KINGDOM - GB - - - UNITED STATES - US - - - UNITED STATES MINOR OUTLYING ISLANDS - UM - - - URUGUAY - UY - - - UZBEKISTAN - UZ - - - VANUATU - VU - - - VENEZUELA, BOLIVARIAN REPUBLIC OF - VE - - - VIET NAM - VN - - - VIRGIN ISLANDS, BRITISH - VG - - - VIRGIN ISLANDS, U.S. - VI - - - WALLIS AND FUTUNA - WF - - - WESTERN SAHARA - EH - - - YEMEN - YE - - - ZAMBIA - ZM - - - ZIMBABWE - ZW - - diff --git a/env/lib/python3.7/site-packages/ipwhois/exceptions.py b/env/lib/python3.7/site-packages/ipwhois/exceptions.py deleted file mode 100644 index 7a0c77f..0000000 --- a/env/lib/python3.7/site-packages/ipwhois/exceptions.py +++ /dev/null @@ -1,127 +0,0 @@ -# Copyright (c) 2013-2019 Philip Hane -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. - - -class BaseIpwhoisException(Exception): - """ - Base exception for all the ipwhois custom ones. - """ - - -class NetError(BaseIpwhoisException): - """ - An Exception for when a parameter provided is not an instance of - ipwhois.net.Net. - """ - - -class IPDefinedError(BaseIpwhoisException): - """ - An Exception for when the IP is defined (does not need to be resolved). - """ - - -class ASNLookupError(BaseIpwhoisException): - """ - An Exception for when the ASN lookup failed. - """ - - -class ASNRegistryError(BaseIpwhoisException): - """ - An Exception for when the ASN registry does not match one of the five - expected values (arin, ripencc, apnic, lacnic, afrinic). - """ - - -class ASNParseError(BaseIpwhoisException): - """ - An Exception for when the ASN parsing failed. - """ - - -class ASNOriginLookupError(BaseIpwhoisException): - """ - An Exception for when the ASN origin lookup failed. - """ - - -class HostLookupError(BaseIpwhoisException): - """ - An Exception for when the host lookup failed. - """ - - -class BlacklistError(BaseIpwhoisException): - """ - An Exception for when the server is in a blacklist. - """ - - -class WhoisLookupError(BaseIpwhoisException): - """ - An Exception for when the whois lookup failed. - """ - - -class WhoisRateLimitError(BaseIpwhoisException): - """ - An Exception for when Whois queries exceed the NIC's request limit and have - exhausted all retries. - """ - - -class HTTPLookupError(BaseIpwhoisException): - """ - An Exception for when the RDAP lookup failed. - """ - - -class HTTPRateLimitError(BaseIpwhoisException): - """ - An Exception for when HTTP queries exceed the NIC's request limit and have - exhausted all retries. - """ - - -class InvalidEntityContactObject(BaseIpwhoisException): - """ - An Exception for when JSON output is not an RDAP entity contact information - object: - https://tools.ietf.org/html/rfc7483#section-5.4 - """ - - -class InvalidNetworkObject(BaseIpwhoisException): - """ - An Exception for when JSON output is not an RDAP network object: - https://tools.ietf.org/html/rfc7483#section-5.4 - """ - - -class InvalidEntityObject(BaseIpwhoisException): - """ - An Exception for when JSON output is not an RDAP entity object: - https://tools.ietf.org/html/rfc7483#section-5.1 - """ diff --git a/env/lib/python3.7/site-packages/ipwhois/experimental.py b/env/lib/python3.7/site-packages/ipwhois/experimental.py deleted file mode 100644 index c9fc4ac..0000000 --- a/env/lib/python3.7/site-packages/ipwhois/experimental.py +++ /dev/null @@ -1,457 +0,0 @@ -# Copyright (c) 2017-2019 Philip Hane -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. - -import socket -import logging -import time -from collections import namedtuple - -from .exceptions import (ASNLookupError, HTTPLookupError, HTTPRateLimitError, - ASNRegistryError) -from .asn import IPASN -from .net import (CYMRU_WHOIS, Net) -from .rdap import RDAP -from .utils import unique_everseen - -log = logging.getLogger(__name__) - - -def get_bulk_asn_whois(addresses=None, retry_count=3, timeout=120): - """ - The function for retrieving ASN information for multiple IP addresses from - Cymru via port 43/tcp (WHOIS). - - Args: - addresses (:obj:`list` of :obj:`str`): IP addresses to lookup. - retry_count (:obj:`int`): The number of times to retry in case socket - errors, timeouts, connection resets, etc. are encountered. - Defaults to 3. - timeout (:obj:`int`): The default timeout for socket connections in - seconds. Defaults to 120. - - Returns: - str: The raw ASN bulk data, new line separated. - - Raises: - ValueError: addresses argument must be a list of IPv4/v6 address - strings. - ASNLookupError: The ASN bulk lookup failed. - """ - - if not isinstance(addresses, list): - - raise ValueError('addresses argument must be a list of IPv4/v6 ' - 'address strings.') - - try: - - # Create the connection for the Cymru whois query. - conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - conn.settimeout(timeout) - log.debug('ASN bulk query initiated.') - conn.connect((CYMRU_WHOIS, 43)) - - # Query the Cymru whois server, and store the results. - conn.sendall(( - ' -r -a -c -p -f begin\n{0}\nend'.format( - '\n'.join(addresses)) - ).encode()) - - data = '' - while True: - - d = conn.recv(4096).decode() - data += d - - if not d: - - break - - conn.close() - - return str(data) - - except (socket.timeout, socket.error) as e: # pragma: no cover - - log.debug('ASN bulk query socket error: {0}'.format(e)) - if retry_count > 0: - - log.debug('ASN bulk query retrying (count: {0})'.format( - str(retry_count))) - return get_bulk_asn_whois(addresses, retry_count - 1, timeout) - - else: - - raise ASNLookupError('ASN bulk lookup failed.') - - except: # pragma: no cover - - raise ASNLookupError('ASN bulk lookup failed.') - - -def bulk_lookup_rdap(addresses=None, inc_raw=False, retry_count=3, depth=0, - excluded_entities=None, rate_limit_timeout=60, - socket_timeout=10, asn_timeout=240, proxy_openers=None): - """ - The function for bulk retrieving and parsing whois information for a list - of IP addresses via HTTP (RDAP). This bulk lookup method uses bulk - ASN Whois lookups first to retrieve the ASN for each IP. It then optimizes - RDAP queries to achieve the fastest overall time, accounting for - rate-limiting RIRs. - - Args: - addresses (:obj:`list` of :obj:`str`): IP addresses to lookup. - inc_raw (:obj:`bool`, optional): Whether to include the raw whois - results in the returned dictionary. Defaults to False. - retry_count (:obj:`int`): The number of times to retry in case socket - errors, timeouts, connection resets, etc. are encountered. - Defaults to 3. - depth (:obj:`int`): How many levels deep to run queries when additional - referenced objects are found. Defaults to 0. - excluded_entities (:obj:`list` of :obj:`str`): Entity handles to not - perform lookups. Defaults to None. - rate_limit_timeout (:obj:`int`): The number of seconds to wait before - retrying when a rate limit notice is returned via rdap+json. - Defaults to 60. - socket_timeout (:obj:`int`): The default timeout for socket - connections in seconds. Defaults to 10. - asn_timeout (:obj:`int`): The default timeout for bulk ASN lookups in - seconds. Defaults to 240. - proxy_openers (:obj:`list` of :obj:`OpenerDirector`): Proxy openers - for single/rotating proxy support. Defaults to None. - - Returns: - namedtuple: - - :results (dict): IP address keys with the values as dictionaries - returned by IPWhois.lookup_rdap(). - :stats (dict): Stats for the lookups: - - :: - - { - 'ip_input_total' (int) - The total number of addresses - originally provided for lookup via the addresses argument. - 'ip_unique_total' (int) - The total number of unique addresses - found in the addresses argument. - 'ip_lookup_total' (int) - The total number of addresses that - lookups were attempted for, excluding any that failed ASN - registry checks. - 'lacnic' (dict) - - { - 'failed' (list) - The addresses that failed to lookup. - Excludes any that failed initially, but succeeded after - futher retries. - 'rate_limited' (list) - The addresses that encountered - rate-limiting. Unless an address is also in 'failed', - it eventually succeeded. - 'total' (int) - The total number of addresses belonging to - this RIR that lookups were attempted for. - } - 'ripencc' (dict) - Same as 'lacnic' above. - 'apnic' (dict) - Same as 'lacnic' above. - 'afrinic' (dict) - Same as 'lacnic' above. - 'arin' (dict) - Same as 'lacnic' above. - 'unallocated_addresses' (list) - The addresses that are - unallocated/failed ASN lookups. These can be addresses that - are not listed for one of the 5 RIRs (other). No attempt - was made to perform an RDAP lookup for these. - } - - Raises: - ASNLookupError: The ASN bulk lookup failed, cannot proceed with bulk - RDAP lookup. - """ - - if not isinstance(addresses, list): - - raise ValueError('addresses must be a list of IP address strings') - - # Initialize the dicts/lists - results = {} - failed_lookups_dict = {} - rated_lookups = [] - stats = { - 'ip_input_total': len(addresses), - 'ip_unique_total': 0, - 'ip_lookup_total': 0, - 'lacnic': {'failed': [], 'rate_limited': [], 'total': 0}, - 'ripencc': {'failed': [], 'rate_limited': [], 'total': 0}, - 'apnic': {'failed': [], 'rate_limited': [], 'total': 0}, - 'afrinic': {'failed': [], 'rate_limited': [], 'total': 0}, - 'arin': {'failed': [], 'rate_limited': [], 'total': 0}, - 'unallocated_addresses': [] - } - asn_parsed_results = {} - - if proxy_openers is None: - - proxy_openers = [None] - - proxy_openers_copy = iter(proxy_openers) - - # Make sure addresses is unique - unique_ip_list = list(unique_everseen(addresses)) - - # Get the unique count to return - stats['ip_unique_total'] = len(unique_ip_list) - - # This is needed for iteration order - rir_keys_ordered = ['lacnic', 'ripencc', 'apnic', 'afrinic', 'arin'] - - # First query the ASN data for all IPs, can raise ASNLookupError, no catch - bulk_asn = get_bulk_asn_whois(unique_ip_list, timeout=asn_timeout) - - # ASN results are returned as string, parse lines to list and remove first - asn_result_list = bulk_asn.split('\n') - del asn_result_list[0] - - # We need to instantiate IPASN, which currently needs a Net object, - # IP doesn't matter here - net = Net('1.2.3.4') - ipasn = IPASN(net) - - # Iterate each IP ASN result, and add valid RIR results to - # asn_parsed_results for RDAP lookups - for asn_result in asn_result_list: - - temp = asn_result.split('|') - - # Not a valid entry, move on to next - if len(temp) == 1: - - continue - - ip = temp[1].strip() - - # We need this since ASN bulk lookup is returning duplicates - # This is an issue on the Cymru end - if ip in asn_parsed_results.keys(): # pragma: no cover - - continue - - try: - - results = ipasn.parse_fields_whois(asn_result) - - except ASNRegistryError: # pragma: no cover - - continue - - # Add valid IP ASN result to asn_parsed_results for RDAP lookup - asn_parsed_results[ip] = results - stats[results['asn_registry']]['total'] += 1 - - # Set the list of IPs that are not allocated/failed ASN lookup - stats['unallocated_addresses'] = list(k for k in addresses if k not in - asn_parsed_results) - - # Set the total lookup count after unique IP and ASN result filtering - stats['ip_lookup_total'] = len(asn_parsed_results) - - # Track the total number of LACNIC queries left. This is tracked in order - # to ensure the 9 priority LACNIC queries/min don't go into infinite loop - lacnic_total_left = stats['lacnic']['total'] - - # Set the start time, this value is updated when the rate limit is reset - old_time = time.time() - - # Rate limit tracking dict for all RIRs - rate_tracker = { - 'lacnic': {'time': old_time, 'count': 0}, - 'ripencc': {'time': old_time, 'count': 0}, - 'apnic': {'time': old_time, 'count': 0}, - 'afrinic': {'time': old_time, 'count': 0}, - 'arin': {'time': old_time, 'count': 0} - } - - # Iterate all of the IPs to perform RDAP lookups until none are left - while len(asn_parsed_results) > 0: - - # Sequentially run through each RIR to minimize lookups in a row to - # the same RIR. - for rir in rir_keys_ordered: - - # If there are still LACNIC IPs left to lookup and the rate limit - # hasn't been reached, skip to find a LACNIC IP to lookup - if ( - rir != 'lacnic' and lacnic_total_left > 0 and - (rate_tracker['lacnic']['count'] != 9 or - (time.time() - rate_tracker['lacnic']['time'] - ) >= rate_limit_timeout - ) - ): # pragma: no cover - - continue - - # If the RIR rate limit has been reached and hasn't expired, - # move on to the next RIR - if ( - rate_tracker[rir]['count'] == 9 and ( - (time.time() - rate_tracker[rir]['time'] - ) < rate_limit_timeout) - ): # pragma: no cover - - continue - - # If the RIR rate limit has expired, reset the count/timer - # and perform the lookup - elif ((time.time() - rate_tracker[rir]['time'] - ) >= rate_limit_timeout): # pragma: no cover - - rate_tracker[rir]['count'] = 0 - rate_tracker[rir]['time'] = time.time() - - # Create a copy of the lookup IP dict so we can modify on - # successful/failed queries. Loop each IP until it matches the - # correct RIR in the parent loop, and attempt lookup - tmp_dict = asn_parsed_results.copy() - - for ip, asn_data in tmp_dict.items(): - - # Check to see if IP matches parent loop RIR for lookup - if asn_data['asn_registry'] == rir: - - log.debug('Starting lookup for IP: {0} ' - 'RIR: {1}'.format(ip, rir)) - - # Add to count for rate-limit tracking only for LACNIC, - # since we have not seen aggressive rate-limiting from the - # other RIRs yet - if rir == 'lacnic': - - rate_tracker[rir]['count'] += 1 - - # Get the next proxy opener to use, or None - try: - - opener = next(proxy_openers_copy) - - # Start at the beginning if all have been used - except StopIteration: - - proxy_openers_copy = iter(proxy_openers) - opener = next(proxy_openers_copy) - - # Instantiate the objects needed for the RDAP lookup - net = Net(ip, timeout=socket_timeout, proxy_opener=opener) - rdap = RDAP(net) - - try: - - # Perform the RDAP lookup. retry_count is set to 0 - # here since we handle that in this function - results = rdap.lookup( - inc_raw=inc_raw, retry_count=0, asn_data=asn_data, - depth=depth, excluded_entities=excluded_entities - ) - - log.debug('Successful lookup for IP: {0} ' - 'RIR: {1}'.format(ip, rir)) - - # Lookup was successful, add to result. Set the nir - # key to None as this is not supported - # (yet - requires more queries) - results[ip] = results - results[ip]['nir'] = None - - # Remove the IP from the lookup queue - del asn_parsed_results[ip] - - # If this was LACNIC IP, reduce the total left count - if rir == 'lacnic': - - lacnic_total_left -= 1 - - log.debug( - '{0} total lookups left, {1} LACNIC lookups left' - ''.format(str(len(asn_parsed_results)), - str(lacnic_total_left)) - ) - - # If this IP failed previously, remove it from the - # failed return dict - if ( - ip in failed_lookups_dict.keys() - ): # pragma: no cover - - del failed_lookups_dict[ip] - - # Break out of the IP list loop, we need to change to - # the next RIR - break - - except HTTPLookupError: # pragma: no cover - - log.debug('Failed lookup for IP: {0} ' - 'RIR: {1}'.format(ip, rir)) - - # Add the IP to the failed lookups dict if not there - if ip not in failed_lookups_dict.keys(): - - failed_lookups_dict[ip] = 1 - - # This IP has already failed at least once, increment - # the failure count until retry_count reached, then - # stop trying - else: - - failed_lookups_dict[ip] += 1 - - if failed_lookups_dict[ip] == retry_count: - - del asn_parsed_results[ip] - stats[rir]['failed'].append(ip) - - if rir == 'lacnic': - - lacnic_total_left -= 1 - - # Since this IP failed, we don't break to move to next - # RIR, we check the next IP for this RIR - continue - - except HTTPRateLimitError: # pragma: no cover - - # Add the IP to the rate-limited lookups dict if not - # there - if ip not in rated_lookups: - - rated_lookups.append(ip) - stats[rir]['rate_limited'].append(ip) - - log.debug('Rate limiting triggered for IP: {0} ' - 'RIR: {1}'.format(ip, rir)) - - # Since rate-limit was reached, reset the timer and - # max out the count - rate_tracker[rir]['time'] = time.time() - rate_tracker[rir]['count'] = 9 - - # Break out of the IP list loop, we need to change to - # the next RIR - break - - return_tuple = namedtuple('return_tuple', ['results', 'stats']) - return return_tuple(results, stats) diff --git a/env/lib/python3.7/site-packages/ipwhois/hr.py b/env/lib/python3.7/site-packages/ipwhois/hr.py deleted file mode 100644 index 6220d71..0000000 --- a/env/lib/python3.7/site-packages/ipwhois/hr.py +++ /dev/null @@ -1,509 +0,0 @@ -# Copyright (c) 2013-2019 Philip Hane -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. - -# TODO: Add '_links' for RFC/other references - -HR_ASN = { - 'asn': { - '_short': 'ASN', - '_name': 'Autonomous System Number', - '_description': 'Globally unique identifier used for routing ' - 'information exchange with Autonomous Systems.' - }, - 'asn_cidr': { - '_short': 'ASN CIDR Block', - '_name': 'ASN Classless Inter-Domain Routing Block', - '_description': 'Network routing block assigned to an ASN.' - }, - 'asn_country_code': { - '_short': 'ASN Country Code', - '_name': 'ASN Assigned Country Code', - '_description': 'ASN assigned country code in ISO 3166-1 format.' - }, - 'asn_date': { - '_short': 'ASN Date', - '_name': 'ASN Allocation Date', - '_description': 'ASN allocation date in ISO 8601 format.' - }, - 'asn_registry': { - '_short': 'ASN Registry', - '_name': 'ASN Assigned Registry', - '_description': 'ASN assigned regional internet registry.' - }, - 'asn_description': { - '_short': 'ASN Description', - '_name': 'ASN Description', - '_description': 'A brief description for the assigned ASN.' - } -} - -HR_ASN_ORIGIN = { - 'nets': { - '_short': 'Network', - '_name': 'ASN Network', - '_description': 'A network associated with an Autonomous System Number' - ' (ASN)', - 'cidr': { - '_short': 'CIDR', - '_name': 'Classless Inter-Domain Routing Block', - '_description': 'The network routing block.' - }, - 'description': { - '_short': 'Description', - '_name': 'Description', - '_description': 'Description for the registered network.' - }, - 'maintainer': { - '_short': 'Maintainer', - '_name': 'Maintainer', - '_description': 'The entity that maintains the network.' - }, - 'updated': { - '_short': 'Updated', - '_name': 'Updated Timestamp', - '_description': 'Network registration updated information.' - }, - 'source': { - '_short': 'Source', - '_name': 'ASN Network Information Source', - '_description': 'The source of the network information.' - } - } -} - -HR_RDAP_COMMON = { - 'entities': { - '_short': 'Entities', - '_name': 'RIR Object Entities', - '_description': 'List of object names referenced by an RIR object.' - }, - 'events': { - '_short': 'Events', - '_name': 'Events', - '_description': 'Events for an RIR object.', - 'action': { - '_short': 'Action', - '_name': 'Event Action (Reason)', - '_description': 'The reason for an event.' - }, - 'timestamp': { - '_short': 'Timestamp', - '_name': 'Event Timestamp', - '_description': 'The date an event occured in ISO 8601 ' - 'format.' - }, - 'actor': { - '_short': 'Actor', - '_name': 'Event Actor', - '_description': 'The identifier for an event initiator.' - } - }, - 'handle': { - '_short': 'Handle', - '_name': 'RIR Handle', - '_description': 'Unique identifier for a registered object.' - }, - 'links': { - '_short': 'Links', - '_name': 'Links', - '_description': 'HTTP/HTTPS links provided for an RIR object.' - }, - 'notices': { - '_short': 'Notices', - '_name': 'Notices', - '_description': 'Notices for an RIR object.', - 'description': { - '_short': 'Description', - '_name': 'Notice Description', - '_description': 'The description/body of a notice.' - }, - 'title': { - '_short': 'Title', - '_name': 'Notice Title', - '_description': 'The title/header for a notice.' - }, - 'links': { - '_short': 'Links', - '_name': 'Notice Links', - '_description': 'HTTP/HTTPS links provided for a notice.' - } - }, - 'remarks': { - '_short': 'Remarks', - '_name': 'Remarks', - '_description': 'Remarks for an RIR object.', - 'description': { - '_short': 'Description', - '_name': 'Remark Description', - '_description': 'The description/body of a remark.' - }, - 'title': { - '_short': 'Title', - '_name': 'Remark Title', - '_description': 'The title/header for a remark.' - }, - 'links': { - '_short': 'Links', - '_name': 'Remark Links', - '_description': 'HTTP/HTTPS links provided for a remark.' - } - }, - 'status': { - '_short': 'Status', - '_name': 'Object Status', - '_description': 'List indicating the state of a registered object.' - } -} - -HR_RDAP = { - 'network': { - '_short': 'Network', - '_name': 'RIR Network', - '_description': 'The assigned network for an IP address.', - 'cidr': { - '_short': 'CIDR Block', - '_name': 'Classless Inter-Domain Routing Block', - '_description': 'Network routing block an IP address belongs to.' - }, - 'country': { - '_short': 'Country Code', - '_name': 'Country Code', - '_description': 'Country code registered with the RIR in ' - 'ISO 3166-1 format.' - }, - 'end_address': { - '_short': 'End Address', - '_name': 'Ending IP Address', - '_description': 'The last IP address in a network block.' - }, - 'events': HR_RDAP_COMMON['events'], - 'handle': HR_RDAP_COMMON['handle'], - 'ip_version': { - '_short': 'IP Version', - '_name': 'IP Protocol Version', - '_description': 'The IP protocol version (v4 or v6) of an IP ' - 'address.' - }, - 'links': HR_RDAP_COMMON['links'], - 'name': { - '_short': 'Name', - '_name': 'RIR Network Name', - '_description': 'The identifier assigned to the network ' - 'registration for an IP address.' - }, - 'notices': HR_RDAP_COMMON['notices'], - 'parent_handle': { - '_short': 'Parent Handle', - '_name': 'RIR Parent Handle', - '_description': 'Unique identifier for the parent network of ' - 'a registered network.' - }, - 'remarks': HR_RDAP_COMMON['remarks'], - 'start_address': { - '_short': 'Start Address', - '_name': 'Starting IP Address', - '_description': 'The first IP address in a network block.' - }, - 'status': HR_RDAP_COMMON['status'], - 'type': { - '_short': 'Type', - '_name': 'RIR Network Type', - '_description': 'The RIR classification of a registered network.' - } - }, - 'entities': HR_RDAP_COMMON['entities'], - 'objects': { - '_short': 'Objects', - '_name': 'RIR Objects', - '_description': 'The objects (entities) referenced by an RIR network.', - 'contact': { - '_short': 'Contact', - '_name': 'Contact Information', - '_description': 'Contact information registered with an RIR ' - 'object.', - 'address': { - '_short': 'Address', - '_name': 'Postal Address', - '_description': 'The contact postal address.' - }, - 'email': { - '_short': 'Email', - '_name': 'Email Address', - '_description': 'The contact email address.' - }, - 'kind': { - '_short': 'Kind', - '_name': 'Kind', - '_description': 'The contact information kind (individual, ' - 'group, org, etc).' - }, - 'name': { - '_short': 'Name', - '_name': 'Name', - '_description': 'The contact name.' - }, - 'phone': { - '_short': 'Phone', - '_name': 'Phone Number', - '_description': 'The contact phone number.' - }, - 'role': { - '_short': 'Role', - '_name': 'Role', - '_description': 'The contact\'s role.' - }, - 'title': { - '_short': 'Title', - '_name': 'Title', - '_description': 'The contact\'s position or job title.' - } - }, - 'entities': HR_RDAP_COMMON['entities'], - 'events': HR_RDAP_COMMON['events'], - 'events_actor': { - '_short': 'Events Misc', - '_name': 'Events w/o Actor', - '_description': 'An event for an RIR object with no event actor.', - 'action': { - '_short': 'Action', - '_name': 'Event Action (Reason)', - '_description': 'The reason for an event.' - }, - 'timestamp': { - '_short': 'Timestamp', - '_name': 'Event Timestamp', - '_description': 'The date an event occured in ISO 8601 ' - 'format.' - } - }, - 'handle': HR_RDAP_COMMON['handle'], - 'links': HR_RDAP_COMMON['links'], - 'notices': HR_RDAP_COMMON['notices'], - 'remarks': HR_RDAP_COMMON['remarks'], - 'roles': { - '_short': 'Roles', - '_name': 'Roles', - '_description': 'List of roles assigned to a registered object.' - }, - 'status': HR_RDAP_COMMON['status'], - } -} - -HR_WHOIS = { - 'nets': { - '_short': 'Network', - '_name': 'RIR Network', - '_description': 'The assigned network for an IP address. May be a ' - 'parent or child network.', - 'address': { - '_short': 'Address', - '_name': 'Postal Address', - '_description': 'The contact postal address.' - }, - 'cidr': { - '_short': 'CIDR Blocks', - '_name': 'Classless Inter-Domain Routing Blocks', - '_description': 'Network routing blocks an IP address belongs to.' - }, - 'city': { - '_short': 'City', - '_name': 'City', - '_description': 'The city registered with a whois network.' - }, - 'country': { - '_short': 'Country Code', - '_name': 'Country Code', - '_description': 'Country code registered for the network in ' - 'ISO 3166-1 format.' - }, - 'created': { - '_short': 'Created', - '_name': 'Created Timestamp', - '_description': 'The date the network was created in ISO 8601 ' - 'format.' - }, - 'description': { - '_short': 'Description', - '_name': 'Description', - '_description': 'The description for the network.' - }, - 'emails': { - '_short': 'Emails', - '_name': 'Email Addresses', - '_description': 'The contact email addresses.' - }, - 'handle': { - '_short': 'Handle', - '_name': 'RIR Network Handle', - '_description': 'Unique identifier for a registered network.' - }, - 'name': { - '_short': 'Name', - '_name': 'RIR Network Name', - '_description': 'The identifier assigned to the network ' - 'registration for an IP address.' - }, - 'postal_code': { - '_short': 'Postal', - '_name': 'Postal Code', - '_description': 'The postal code registered with a whois network.' - }, - 'range': { - '_short': 'Ranges', - '_name': 'CIDR Block Ranges', - '_description': 'Network routing blocks an IP address belongs to.' - }, - 'state': { - '_short': 'State', - '_name': 'State', - '_description': 'The state registered with a whois network.' - }, - 'updated': { - '_short': 'Updated', - '_name': 'Updated Timestamp', - '_description': 'The date the network was updated in ISO 8601 ' - 'format.' - } - }, - 'referral': { - '_short': 'Referral', - '_name': 'Referral Whois', - '_description': 'The referral whois data if referenced and enabled.', - } -} - -HR_WHOIS_NIR = { - 'nets': { - '_short': 'NIR Network', - '_name': 'National Internet Registry Network', - '_description': 'The assigned NIR (JPNIC, KRNIC) network for an IP ' - 'address. May be a parent or child network.', - 'address': { - '_short': 'Address', - '_name': 'Postal Address', - '_description': 'The network contact postal address.' - }, - 'cidr': { - '_short': 'CIDR Blocks', - '_name': 'Classless Inter-Domain Routing Blocks', - '_description': 'Network routing blocks an IP address belongs to.' - }, - 'country': { - '_short': 'Country Code', - '_name': 'Country Code', - '_description': 'Country code registered for the network in ' - 'ISO 3166-1 format.' - }, - 'handle': { - '_short': 'Handle', - '_name': 'NIR Network Handle', - '_description': 'Unique identifier for a registered NIR network.' - }, - 'name': { - '_short': 'Name', - '_name': 'NIR Network Name', - '_description': 'The identifier assigned to the network ' - 'registration for an IP address.' - }, - 'postal_code': { - '_short': 'Postal', - '_name': 'Postal Code', - '_description': 'The postal code registered with a NIR network.' - }, - 'range': { - '_short': 'Ranges', - '_name': 'CIDR Block Ranges', - '_description': 'Network routing blocks an IP address belongs to.' - }, - 'nameservers': { - '_short': 'NS', - '_name': 'Nameservers', - '_description': 'Nameservers associated with a NIR network.' - }, - 'created': { - '_short': 'Created', - '_name': 'Created Timestamp', - '_description': 'The date the network was created in ISO 8601 ' - 'format.' - }, - 'updated': { - '_short': 'Updated', - '_name': 'Updated Timestamp', - '_description': 'The date the network was updated in ISO 8601 ' - 'format.' - }, - 'contacts': { - '_short': 'Contacts', - '_name': 'NIR Contacts', - '_description': 'The contacts (admin, tech) registered with a NIR ' - 'network.', - 'organization': { - '_short': 'Org', - '_name': 'Organization', - '_description': 'The contact organization.' - }, - 'division': { - '_short': 'Div', - '_name': 'Division', - '_description': 'The contact division of the organization.' - }, - 'name': { - '_short': 'Name', - '_name': 'Name', - '_description': 'The contact name.' - }, - 'title': { - '_short': 'Title', - '_name': 'Title', - '_description': 'The contact position or job title.' - }, - 'phone': { - '_short': 'Phone', - '_name': 'Phone Number', - '_description': 'The contact phone number.' - }, - 'fax': { - '_short': 'Fax', - '_name': 'Fax Number', - '_description': 'The contact fax number.' - }, - 'email': { - '_short': 'Email', - '_name': 'Email Address', - '_description': 'The contact email address.' - }, - 'reply_email': { - '_short': 'Reply Email', - '_name': 'Reply Email Address', - '_description': 'The contact reply email address.' - }, - 'updated': { - '_short': 'Updated', - '_name': 'Updated Timestamp', - '_description': 'The date the contact was updated in ISO 8601 ' - 'format.' - } - } - } -} diff --git a/env/lib/python3.7/site-packages/ipwhois/ipwhois.py b/env/lib/python3.7/site-packages/ipwhois/ipwhois.py deleted file mode 100644 index 778a582..0000000 --- a/env/lib/python3.7/site-packages/ipwhois/ipwhois.py +++ /dev/null @@ -1,346 +0,0 @@ -# Copyright (c) 2013-2019 Philip Hane -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. - -from . import Net -from .asn import IPASN -from .nir import NIRWhois -import logging - -log = logging.getLogger(__name__) - - -class IPWhois: - """ - The wrapper class for performing whois/RDAP lookups and parsing for - IPv4 and IPv6 addresses. - - Args: - address (:obj:`str`/:obj:`int`/:obj:`IPv4Address`/:obj:`IPv6Address`): - An IPv4 or IPv6 address - timeout (:obj:`int`): The default timeout for socket connections in - seconds. Defaults to 5. - proxy_opener (:obj:`urllib.request.OpenerDirector`): The request for - proxy support. Defaults to None. - allow_permutations (:obj:`bool`): Allow net.Net() to use additional - methods if DNS lookups to Cymru fail. *WARNING* deprecated in - favor of new argument asn_methods. Defaults to True. - """ - - def __init__(self, address, timeout=5, proxy_opener=None, - allow_permutations=False): - - self.net = Net( - address=address, timeout=timeout, proxy_opener=proxy_opener, - allow_permutations=allow_permutations - ) - self.ipasn = IPASN(self.net) - - self.address = self.net.address - self.timeout = self.net.timeout - self.address_str = self.net.address_str - self.version = self.net.version - self.reversed = self.net.reversed - self.dns_zone = self.net.dns_zone - - def __repr__(self): - - return 'IPWhois({0}, {1}, {2})'.format( - self.address_str, str(self.timeout), repr(self.net.opener) - ) - - def lookup_whois(self, inc_raw=False, retry_count=3, get_referral=False, - extra_blacklist=None, ignore_referral_errors=False, - field_list=None, asn_alts=None, extra_org_map=None, - inc_nir=True, nir_field_list=None, asn_methods=None, - get_asn_description=True): - """ - The function for retrieving and parsing whois information for an IP - address via port 43 (WHOIS). - - Args: - inc_raw (:obj:`bool`): Whether to include the raw whois results in - the returned dictionary. Defaults to False. - retry_count (:obj:`int`): The number of times to retry in case - socket errors, timeouts, connection resets, etc. are - encountered. Defaults to 3. - get_referral (:obj:`bool`): Whether to retrieve referral whois - information, if available. Defaults to False. - extra_blacklist (:obj:`list`): Blacklisted whois servers in - addition to the global BLACKLIST. Defaults to None. - ignore_referral_errors (:obj:`bool`): Whether to ignore and - continue when an exception is encountered on referral whois - lookups. Defaults to False. - field_list (:obj:`list`): If provided, a list of fields to parse: - ['name', 'handle', 'description', 'country', 'state', 'city', - 'address', 'postal_code', 'emails', 'created', 'updated'] - If None, defaults to all. - asn_alts (:obj:`list`): Additional lookup types to attempt if the - ASN dns lookup fails. Allow permutations must be enabled. - If None, defaults to all ['whois', 'http']. *WARNING* - deprecated in favor of new argument asn_methods. - extra_org_map (:obj:`dict`): Dictionary mapping org handles to - RIRs. This is for limited cases where ARIN REST (ASN fallback - HTTP lookup) does not show an RIR as the org handle e.g., DNIC - (which is now the built in ORG_MAP) e.g., {'DNIC': 'arin'}. - Valid RIR values are (note the case-sensitive - this is meant - to match the REST result): - 'ARIN', 'RIPE', 'apnic', 'lacnic', 'afrinic' - Defaults to None. - inc_nir (:obj:`bool`): Whether to retrieve NIR (National Internet - Registry) information, if registry is JPNIC (Japan) or KRNIC - (Korea). If True, extra network requests will be required. - If False, the information returned for JP or KR IPs is - severely restricted. Defaults to True. - nir_field_list (:obj:`list`): If provided and inc_nir, a list of - fields to parse: - ['name', 'handle', 'country', 'address', 'postal_code', - 'nameservers', 'created', 'updated', 'contacts'] - If None, defaults to all. - asn_methods (:obj:`list`): ASN lookup types to attempt, in order. - If None, defaults to all ['dns', 'whois', 'http']. - get_asn_description (:obj:`bool`): Whether to run an additional - query when pulling ASN information via dns, in order to get - the ASN description. Defaults to True. - - Returns: - dict: The IP whois lookup results - - :: - - { - 'query' (str) - The IP address - 'asn' (str) - The Autonomous System Number - 'asn_date' (str) - The ASN Allocation date - 'asn_registry' (str) - The assigned ASN registry - 'asn_cidr' (str) - The assigned ASN CIDR - 'asn_country_code' (str) - The assigned ASN country code - 'asn_description' (str) - The ASN description - 'nets' (list) - Dictionaries containing network - information which consists of the fields listed in the - ipwhois.whois.RIR_WHOIS dictionary. - 'raw' (str) - Raw whois results if the inc_raw parameter - is True. - 'referral' (dict) - Referral whois information if - get_referral is True and the server is not blacklisted. - Consists of fields listed in the ipwhois.whois.RWHOIS - dictionary. - 'raw_referral' (str) - Raw referral whois results if the - inc_raw parameter is True. - 'nir' (dict) - ipwhois.nir.NIRWhois() results if inc_nir - is True. - } - """ - - from .whois import Whois - - # Create the return dictionary. - results = {'nir': None} - - # Retrieve the ASN information. - log.debug('ASN lookup for {0}'.format(self.address_str)) - - asn_data = self.ipasn.lookup( - inc_raw=inc_raw, retry_count=retry_count, asn_alts=asn_alts, - extra_org_map=extra_org_map, asn_methods=asn_methods, - get_asn_description=get_asn_description - ) - - # Add the ASN information to the return dictionary. - results.update(asn_data) - - # Retrieve the whois data and parse. - whois = Whois(self.net) - log.debug('WHOIS lookup for {0}'.format(self.address_str)) - whois_data = whois.lookup( - inc_raw=inc_raw, retry_count=retry_count, response=None, - get_referral=get_referral, extra_blacklist=extra_blacklist, - ignore_referral_errors=ignore_referral_errors, asn_data=asn_data, - field_list=field_list - ) - - # Add the WHOIS information to the return dictionary. - results.update(whois_data) - - if inc_nir: - - nir = None - if 'JP' == asn_data['asn_country_code']: - nir = 'jpnic' - elif 'KR' == asn_data['asn_country_code']: - nir = 'krnic' - - if nir: - - nir_whois = NIRWhois(self.net) - nir_data = nir_whois.lookup( - nir=nir, inc_raw=inc_raw, retry_count=retry_count, - response=None, - field_list=nir_field_list, is_offline=False - ) - - # Add the NIR information to the return dictionary. - results['nir'] = nir_data - - return results - - def lookup_rdap(self, inc_raw=False, retry_count=3, depth=0, - excluded_entities=None, bootstrap=False, - rate_limit_timeout=120, asn_alts=None, extra_org_map=None, - inc_nir=True, nir_field_list=None, asn_methods=None, - get_asn_description=True): - """ - The function for retrieving and parsing whois information for an IP - address via HTTP (RDAP). - - **This is now the recommended method, as RDAP contains much better - information to parse.** - - Args: - inc_raw (:obj:`bool`): Whether to include the raw whois results in - the returned dictionary. Defaults to False. - retry_count (:obj:`int`): The number of times to retry in case - socket errors, timeouts, connection resets, etc. are - encountered. Defaults to 3. - depth (:obj:`int`): How many levels deep to run queries when - additional referenced objects are found. Defaults to 0. - excluded_entities (:obj:`list`): Entity handles to not perform - lookups. Defaults to None. - bootstrap (:obj:`bool`): If True, performs lookups via ARIN - bootstrap rather than lookups based on ASN data. ASN lookups - are not performed and no output for any of the asn* fields is - provided. Defaults to False. - rate_limit_timeout (:obj:`int`): The number of seconds to wait - before retrying when a rate limit notice is returned via - rdap+json. Defaults to 120. - asn_alts (:obj:`list`): Additional lookup types to attempt if the - ASN dns lookup fails. Allow permutations must be enabled. - If None, defaults to all ['whois', 'http']. *WARNING* - deprecated in favor of new argument asn_methods. - extra_org_map (:obj:`dict`): Dictionary mapping org handles to - RIRs. This is for limited cases where ARIN REST (ASN fallback - HTTP lookup) does not show an RIR as the org handle e.g., DNIC - (which is now the built in ORG_MAP) e.g., {'DNIC': 'arin'}. - Valid RIR values are (note the case-sensitive - this is meant - to match the REST result): - 'ARIN', 'RIPE', 'apnic', 'lacnic', 'afrinic' - Defaults to None. - inc_nir (:obj:`bool`): Whether to retrieve NIR (National Internet - Registry) information, if registry is JPNIC (Japan) or KRNIC - (Korea). If True, extra network requests will be required. - If False, the information returned for JP or KR IPs is - severely restricted. Defaults to True. - nir_field_list (:obj:`list`): If provided and inc_nir, a list of - fields to parse: - ['name', 'handle', 'country', 'address', 'postal_code', - 'nameservers', 'created', 'updated', 'contacts'] - If None, defaults to all. - asn_methods (:obj:`list`): ASN lookup types to attempt, in order. - If None, defaults to all ['dns', 'whois', 'http']. - get_asn_description (:obj:`bool`): Whether to run an additional - query when pulling ASN information via dns, in order to get - the ASN description. Defaults to True. - - Returns: - dict: The IP RDAP lookup results - - :: - - { - 'query' (str) - The IP address - 'asn' (str) - The Autonomous System Number - 'asn_date' (str) - The ASN Allocation date - 'asn_registry' (str) - The assigned ASN registry - 'asn_cidr' (str) - The assigned ASN CIDR - 'asn_country_code' (str) - The assigned ASN country code - 'asn_description' (str) - The ASN description - 'entities' (list) - Entity handles referred by the top - level query. - 'network' (dict) - Network information which consists of - the fields listed in the ipwhois.rdap._RDAPNetwork - dict. - 'objects' (dict) - Mapping of entity handle->entity dict - which consists of the fields listed in the - ipwhois.rdap._RDAPEntity dict. The raw result is - included for each object if the inc_raw parameter - is True. - 'raw' (dict) - Whois results in json format if the inc_raw - parameter is True. - 'nir' (dict) - ipwhois.nir.NIRWhois results if inc_nir is - True. - } - """ - - from .rdap import RDAP - - # Create the return dictionary. - results = {'nir': None} - - asn_data = None - response = None - if not bootstrap: - - # Retrieve the ASN information. - log.debug('ASN lookup for {0}'.format(self.address_str)) - asn_data = self.ipasn.lookup( - inc_raw=inc_raw, retry_count=retry_count, asn_alts=asn_alts, - extra_org_map=extra_org_map, asn_methods=asn_methods, - get_asn_description=get_asn_description - ) - - # Add the ASN information to the return dictionary. - results.update(asn_data) - - # Retrieve the RDAP data and parse. - rdap = RDAP(self.net) - log.debug('RDAP lookup for {0}'.format(self.address_str)) - rdap_data = rdap.lookup( - inc_raw=inc_raw, retry_count=retry_count, asn_data=asn_data, - depth=depth, excluded_entities=excluded_entities, - response=response, bootstrap=bootstrap, - rate_limit_timeout=rate_limit_timeout - ) - - # Add the RDAP information to the return dictionary. - results.update(rdap_data) - - if inc_nir: - - nir = None - if 'JP' == asn_data['asn_country_code']: - nir = 'jpnic' - elif 'KR' == asn_data['asn_country_code']: - nir = 'krnic' - - if nir: - nir_whois = NIRWhois(self.net) - nir_data = nir_whois.lookup( - nir=nir, inc_raw=inc_raw, retry_count=retry_count, - response=None, - field_list=nir_field_list, is_offline=False - ) - - # Add the NIR information to the return dictionary. - results['nir'] = nir_data - - return results diff --git a/env/lib/python3.7/site-packages/ipwhois/net.py b/env/lib/python3.7/site-packages/ipwhois/net.py deleted file mode 100644 index b2b1095..0000000 --- a/env/lib/python3.7/site-packages/ipwhois/net.py +++ /dev/null @@ -1,954 +0,0 @@ -# Copyright (c) 2013-2019 Philip Hane -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. - -import sys -import socket -import dns.resolver -import json -from collections import namedtuple -import logging -from time import sleep - -# Import the dnspython rdtypes to fix the dynamic import problem when frozen. -import dns.rdtypes.ANY.TXT # @UnusedImport - -from .exceptions import (IPDefinedError, ASNLookupError, BlacklistError, - WhoisLookupError, HTTPLookupError, HostLookupError, - HTTPRateLimitError, WhoisRateLimitError) -from .whois import RIR_WHOIS -from .asn import ASN_ORIGIN_WHOIS -from .utils import ipv4_is_defined, ipv6_is_defined - -if sys.version_info >= (3, 3): # pragma: no cover - from ipaddress import (ip_address, - IPv4Address, - IPv6Address) -else: # pragma: no cover - from ipaddr import (IPAddress as ip_address, - IPv4Address, - IPv6Address) - -try: # pragma: no cover - from urllib.request import (OpenerDirector, - ProxyHandler, - build_opener, - Request, - URLError, - HTTPError) - from urllib.parse import urlencode -except ImportError: # pragma: no cover - from urllib2 import (OpenerDirector, - ProxyHandler, - build_opener, - Request, - URLError, - HTTPError) - from urllib import urlencode - -log = logging.getLogger(__name__) - -# POSSIBLY UPDATE TO USE RDAP -ARIN = 'http://whois.arin.net/rest/nets;q={0}?showDetails=true&showARIN=true' - -CYMRU_WHOIS = 'whois.cymru.com' - -IPV4_DNS_ZONE = '{0}.origin.asn.cymru.com' - -IPV6_DNS_ZONE = '{0}.origin6.asn.cymru.com' - -BLACKLIST = [ - 'root.rwhois.net' -] - -ORG_MAP = { - 'ARIN': 'arin', - 'VR-ARIN': 'arin', - 'RIPE': 'ripencc', - 'APNIC': 'apnic', - 'LACNIC': 'lacnic', - 'AFRINIC': 'afrinic', - 'DNIC': 'arin' -} - - -class Net: - """ - The class for performing network queries. - - Args: - address (:obj:`str`/:obj:`int`/:obj:`IPv4Address`/:obj:`IPv6Address`): - An IPv4 or IPv6 address - timeout (:obj:`int`): The default timeout for socket connections in - seconds. Defaults to 5. - proxy_opener (:obj:`urllib.request.OpenerDirector`): The request for - proxy support. Defaults to None. - allow_permutations (:obj:`bool`): Allow net.Net() to use additional - methods if DNS lookups to Cymru fail. *WARNING* deprecated in - favor of new argument asn_methods. Defaults to True. - - Raises: - IPDefinedError: The address provided is defined (does not need to be - resolved). - """ - - def __init__(self, address, timeout=5, proxy_opener=None, - allow_permutations=False): - - # IPv4Address or IPv6Address - if isinstance(address, IPv4Address) or isinstance( - address, IPv6Address): - - self.address = address - - else: - - # Use ipaddress package exception handling. - self.address = ip_address(address) - - # Default timeout for socket connections. - self.timeout = timeout - - # Allow other than DNS lookups for ASNs. - self.allow_permutations = allow_permutations - - if self.allow_permutations: - - from warnings import warn - warn('allow_permutations has been deprecated and will be removed. ' - 'It is no longer needed, due to the deprecation of asn_alts, ' - 'and the addition of the asn_methods argument.') - - self.dns_resolver = dns.resolver.Resolver() - self.dns_resolver.timeout = timeout - self.dns_resolver.lifetime = timeout - - # Proxy opener. - if isinstance(proxy_opener, OpenerDirector): - - self.opener = proxy_opener - - else: - - handler = ProxyHandler() - self.opener = build_opener(handler) - - # IP address in string format for use in queries. - self.address_str = self.address.__str__() - - # Determine the IP version, 4 or 6 - self.version = self.address.version - - if self.version == 4: - - # Check if no ASN/whois resolution needs to occur. - is_defined = ipv4_is_defined(self.address_str) - - if is_defined[0]: - - raise IPDefinedError( - 'IPv4 address {0} is already defined as {1} via ' - '{2}.'.format( - self.address_str, is_defined[1], is_defined[2] - ) - ) - - # Reverse the IPv4Address for the DNS ASN query. - split = self.address_str.split('.') - split.reverse() - self.reversed = '.'.join(split) - - self.dns_zone = IPV4_DNS_ZONE.format(self.reversed) - - else: - - # Check if no ASN/whois resolution needs to occur. - is_defined = ipv6_is_defined(self.address_str) - - if is_defined[0]: - - raise IPDefinedError( - 'IPv6 address {0} is already defined as {1} via ' - '{2}.'.format( - self.address_str, is_defined[1], is_defined[2] - ) - ) - - # Explode the IPv6Address to fill in any missing 0's. - exploded = self.address.exploded - - # Cymru seems to timeout when the IPv6 address has trailing '0000' - # groups. Remove these groups. - groups = exploded.split(':') - for index, value in reversed(list(enumerate(groups))): - - if value == '0000': - - del groups[index] - - else: - - break - - exploded = ':'.join(groups) - - # Reverse the IPv6Address for the DNS ASN query. - val = str(exploded).replace(':', '') - val = val[::-1] - self.reversed = '.'.join(val) - - self.dns_zone = IPV6_DNS_ZONE.format(self.reversed) - - def lookup_asn(self, *args, **kwargs): - """ - Temporary wrapper for IP ASN lookups (moved to - asn.IPASN.lookup()). This will be removed in a future - release (1.1.0). - """ - - from warnings import warn - warn('Net.lookup_asn() has been deprecated and will be removed. ' - 'You should now use asn.IPASN.lookup() for IP ASN lookups.') - from .asn import IPASN - response = None - ipasn = IPASN(self) - return ipasn.lookup(*args, **kwargs), response - - def get_asn_dns(self): - """ - The function for retrieving ASN information for an IP address from - Cymru via port 53 (DNS). - - Returns: - list: The raw ASN data. - - Raises: - ASNLookupError: The ASN lookup failed. - """ - - try: - - log.debug('ASN query for {0}'.format(self.dns_zone)) - data = self.dns_resolver.query(self.dns_zone, 'TXT') - return list(data) - - except (dns.resolver.NXDOMAIN, dns.resolver.NoNameservers, - dns.resolver.NoAnswer, dns.exception.Timeout) as e: - - raise ASNLookupError( - 'ASN lookup failed (DNS {0}) for {1}.'.format( - e.__class__.__name__, self.address_str) - ) - - except: # pragma: no cover - - raise ASNLookupError( - 'ASN lookup failed for {0}.'.format(self.address_str) - ) - - def get_asn_verbose_dns(self, asn=None): - """ - The function for retrieving the information for an ASN from - Cymru via port 53 (DNS). This is needed since IP to ASN mapping via - Cymru DNS does not return the ASN Description like Cymru Whois does. - - Args: - asn (:obj:`str`): The AS number (required). - - Returns: - str: The raw ASN data. - - Raises: - ASNLookupError: The ASN lookup failed. - """ - - if asn[0:2] != 'AS': - - asn = 'AS{0}'.format(asn) - - zone = '{0}.asn.cymru.com'.format(asn) - - try: - - log.debug('ASN verbose query for {0}'.format(zone)) - data = self.dns_resolver.query(zone, 'TXT') - return str(data[0]) - - except (dns.resolver.NXDOMAIN, dns.resolver.NoNameservers, - dns.resolver.NoAnswer, dns.exception.Timeout) as e: - - raise ASNLookupError( - 'ASN lookup failed (DNS {0}) for {1}.'.format( - e.__class__.__name__, asn) - ) - - except: # pragma: no cover - - raise ASNLookupError( - 'ASN lookup failed for {0}.'.format(asn) - ) - - def get_asn_whois(self, retry_count=3): - """ - The function for retrieving ASN information for an IP address from - Cymru via port 43/tcp (WHOIS). - - Args: - retry_count (:obj:`int`): The number of times to retry in case - socket errors, timeouts, connection resets, etc. are - encountered. Defaults to 3. - - Returns: - str: The raw ASN data. - - Raises: - ASNLookupError: The ASN lookup failed. - """ - - try: - - # Create the connection for the Cymru whois query. - conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - conn.settimeout(self.timeout) - log.debug('ASN query for {0}'.format(self.address_str)) - conn.connect((CYMRU_WHOIS, 43)) - - # Query the Cymru whois server, and store the results. - conn.send(( - ' -r -a -c -p -f {0}{1}'.format( - self.address_str, '\r\n') - ).encode()) - - data = '' - while True: - - d = conn.recv(4096).decode() - data += d - - if not d: - - break - - conn.close() - - return str(data) - - except (socket.timeout, socket.error) as e: # pragma: no cover - - log.debug('ASN query socket error: {0}'.format(e)) - if retry_count > 0: - - log.debug('ASN query retrying (count: {0})'.format( - str(retry_count))) - return self.get_asn_whois(retry_count - 1) - - else: - - raise ASNLookupError( - 'ASN lookup failed for {0}.'.format(self.address_str) - ) - - except: # pragma: no cover - - raise ASNLookupError( - 'ASN lookup failed for {0}.'.format(self.address_str) - ) - - def get_asn_http(self, retry_count=3): - """ - The function for retrieving ASN information for an IP address from - Arin via port 80 (HTTP). Currently limited to fetching asn_registry - through a Arin whois (REST) lookup. The other values are returned as - None to keep a consistent dict output. This should be used as a last - chance fallback call behind ASN DNS & ASN Whois lookups. - - Args: - retry_count (:obj:`int`): The number of times to retry in case - socket errors, timeouts, connection resets, etc. are - encountered. Defaults to 3. - - Returns: - dict: The ASN data in json format. - - Raises: - ASNLookupError: The ASN lookup failed. - """ - - try: - - # Lets attempt to get the ASN registry information from - # ARIN. - log.debug('ASN query for {0}'.format(self.address_str)) - response = self.get_http_json( - url=str(ARIN).format(self.address_str), - retry_count=retry_count, - headers={'Accept': 'application/json'} - ) - - return response - - except (socket.timeout, socket.error) as e: # pragma: no cover - - log.debug('ASN query socket error: {0}'.format(e)) - if retry_count > 0: - - log.debug('ASN query retrying (count: {0})'.format( - str(retry_count))) - return self.get_asn_http(retry_count=retry_count-1) - - else: - - raise ASNLookupError( - 'ASN lookup failed for {0}.'.format(self.address_str) - ) - - except: - - raise ASNLookupError( - 'ASN lookup failed for {0}.'.format(self.address_str) - ) - - def get_asn_origin_whois(self, asn_registry='radb', asn=None, - retry_count=3, server=None, port=43): - """ - The function for retrieving CIDR info for an ASN via whois. - - Args: - asn_registry (:obj:`str`): The source to run the query against - (asn.ASN_ORIGIN_WHOIS). - asn (:obj:`str`): The AS number (required). - retry_count (:obj:`int`): The number of times to retry in case - socket errors, timeouts, connection resets, etc. are - encountered. Defaults to 3. - server (:obj:`str`): An optional server to connect to. - port (:obj:`int`): The network port to connect on. Defaults to 43. - - Returns: - str: The raw ASN origin whois data. - - Raises: - WhoisLookupError: The ASN origin whois lookup failed. - WhoisRateLimitError: The ASN origin Whois request rate limited and - retries were exhausted. - """ - - try: - - if server is None: - server = ASN_ORIGIN_WHOIS[asn_registry]['server'] - - # Create the connection for the whois query. - conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - conn.settimeout(self.timeout) - log.debug('ASN origin WHOIS query for {0} at {1}:{2}'.format( - asn, server, port)) - conn.connect((server, port)) - - # Prep the query. - query = ' -i origin {0}{1}'.format(asn, '\r\n') - - # Query the whois server, and store the results. - conn.send(query.encode()) - - response = '' - while True: - - d = conn.recv(4096).decode() - - response += d - - if not d: - - break - - conn.close() - - # TODO: this was taken from get_whois(). Need to test rate limiting - if 'Query rate limit exceeded' in response: # pragma: no cover - - if retry_count > 0: - - log.debug('ASN origin WHOIS query rate limit exceeded. ' - 'Waiting...') - sleep(1) - return self.get_asn_origin_whois( - asn_registry=asn_registry, asn=asn, - retry_count=retry_count-1, - server=server, port=port - ) - - else: - - raise WhoisRateLimitError( - 'ASN origin Whois lookup failed for {0}. Rate limit ' - 'exceeded, wait and try again (possibly a ' - 'temporary block).'.format(asn)) - - elif ('error 501' in response or 'error 230' in response - ): # pragma: no cover - - log.debug('ASN origin WHOIS query error: {0}'.format(response)) - raise ValueError - - return str(response) - - except (socket.timeout, socket.error) as e: - - log.debug('ASN origin WHOIS query socket error: {0}'.format(e)) - if retry_count > 0: - - log.debug('ASN origin WHOIS query retrying (count: {0})' - ''.format(str(retry_count))) - return self.get_asn_origin_whois( - asn_registry=asn_registry, asn=asn, - retry_count=retry_count-1, server=server, port=port - ) - - else: - - raise WhoisLookupError( - 'ASN origin WHOIS lookup failed for {0}.'.format(asn) - ) - - except WhoisRateLimitError: # pragma: no cover - - raise - - except: # pragma: no cover - - raise WhoisLookupError( - 'ASN origin WHOIS lookup failed for {0}.'.format(asn) - ) - - def get_whois(self, asn_registry='arin', retry_count=3, server=None, - port=43, extra_blacklist=None): - """ - The function for retrieving whois or rwhois information for an IP - address via any port. Defaults to port 43/tcp (WHOIS). - - Args: - asn_registry (:obj:`str`): The NIC to run the query against. - Defaults to 'arin'. - retry_count (:obj:`int`): The number of times to retry in case - socket errors, timeouts, connection resets, etc. are - encountered. Defaults to 3. - server (:obj:`str`): An optional server to connect to. If - provided, asn_registry will be ignored. - port (:obj:`int`): The network port to connect on. Defaults to 43. - extra_blacklist (:obj:`list` of :obj:`str`): Blacklisted whois - servers in addition to the global BLACKLIST. Defaults to None. - - Returns: - str: The raw whois data. - - Raises: - BlacklistError: Raised if the whois server provided is in the - global BLACKLIST or extra_blacklist. - WhoisLookupError: The whois lookup failed. - WhoisRateLimitError: The Whois request rate limited and retries - were exhausted. - """ - - try: - - extra_bl = extra_blacklist if extra_blacklist else [] - - if any(server in srv for srv in (BLACKLIST, extra_bl)): - raise BlacklistError( - 'The server {0} is blacklisted.'.format(server) - ) - - if server is None: - server = RIR_WHOIS[asn_registry]['server'] - - # Create the connection for the whois query. - conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - conn.settimeout(self.timeout) - log.debug('WHOIS query for {0} at {1}:{2}'.format( - self.address_str, server, port)) - conn.connect((server, port)) - - # Prep the query. - query = self.address_str + '\r\n' - if asn_registry == 'arin': - - query = 'n + {0}'.format(query) - - # Query the whois server, and store the results. - conn.send(query.encode()) - - response = '' - while True: - - d = conn.recv(4096).decode('ascii', 'ignore') - - response += d - - if not d: - - break - - conn.close() - - if 'Query rate limit exceeded' in response: # pragma: no cover - - if retry_count > 0: - - log.debug('WHOIS query rate limit exceeded. Waiting...') - sleep(1) - return self.get_whois( - asn_registry=asn_registry, retry_count=retry_count-1, - server=server, port=port, - extra_blacklist=extra_blacklist - ) - - else: - - raise WhoisRateLimitError( - 'Whois lookup failed for {0}. Rate limit ' - 'exceeded, wait and try again (possibly a ' - 'temporary block).'.format(self.address_str)) - - elif ('error 501' in response or 'error 230' in response - ): # pragma: no cover - - log.debug('WHOIS query error: {0}'.format(response)) - raise ValueError - - return str(response) - - except (socket.timeout, socket.error) as e: - - log.debug('WHOIS query socket error: {0}'.format(e)) - if retry_count > 0: - - log.debug('WHOIS query retrying (count: {0})'.format( - str(retry_count))) - return self.get_whois( - asn_registry=asn_registry, retry_count=retry_count-1, - server=server, port=port, extra_blacklist=extra_blacklist - ) - - else: - - raise WhoisLookupError( - 'WHOIS lookup failed for {0}.'.format(self.address_str) - ) - - except WhoisRateLimitError: # pragma: no cover - - raise - - except BlacklistError: - - raise - - except: # pragma: no cover - - raise WhoisLookupError( - 'WHOIS lookup failed for {0}.'.format(self.address_str) - ) - - def get_http_json(self, url=None, retry_count=3, rate_limit_timeout=120, - headers=None): - """ - The function for retrieving a json result via HTTP. - - Args: - url (:obj:`str`): The URL to retrieve (required). - retry_count (:obj:`int`): The number of times to retry in case - socket errors, timeouts, connection resets, etc. are - encountered. Defaults to 3. - rate_limit_timeout (:obj:`int`): The number of seconds to wait - before retrying when a rate limit notice is returned via - rdap+json or HTTP error 429. Defaults to 60. - headers (:obj:`dict`): The HTTP headers. The Accept header - defaults to 'application/rdap+json'. - - Returns: - dict: The data in json format. - - Raises: - HTTPLookupError: The HTTP lookup failed. - HTTPRateLimitError: The HTTP request rate limited and retries - were exhausted. - """ - - if headers is None: - headers = {'Accept': 'application/rdap+json'} - - try: - - # Create the connection for the whois query. - log.debug('HTTP query for {0} at {1}'.format( - self.address_str, url)) - conn = Request(url, headers=headers) - data = self.opener.open(conn, timeout=self.timeout) - try: - d = json.loads(data.readall().decode('utf-8', 'ignore')) - except AttributeError: # pragma: no cover - d = json.loads(data.read().decode('utf-8', 'ignore')) - - try: - # Tests written but commented out. I do not want to send a - # flood of requests on every test. - for tmp in d['notices']: # pragma: no cover - if tmp['title'] == 'Rate Limit Notice': - log.debug('RDAP query rate limit exceeded.') - - if retry_count > 0: - log.debug('Waiting {0} seconds...'.format( - str(rate_limit_timeout))) - - sleep(rate_limit_timeout) - return self.get_http_json( - url=url, retry_count=retry_count-1, - rate_limit_timeout=rate_limit_timeout, - headers=headers - ) - else: - raise HTTPRateLimitError( - 'HTTP lookup failed for {0}. Rate limit ' - 'exceeded, wait and try again (possibly a ' - 'temporary block).'.format(url)) - - except (KeyError, IndexError): # pragma: no cover - - pass - - return d - - except HTTPError as e: # pragma: no cover - - # RIPE is producing this HTTP error rather than a JSON error. - if e.code == 429: - - log.debug('HTTP query rate limit exceeded.') - - if retry_count > 0: - log.debug('Waiting {0} seconds...'.format( - str(rate_limit_timeout))) - - sleep(rate_limit_timeout) - return self.get_http_json( - url=url, retry_count=retry_count - 1, - rate_limit_timeout=rate_limit_timeout, - headers=headers - ) - else: - raise HTTPRateLimitError( - 'HTTP lookup failed for {0}. Rate limit ' - 'exceeded, wait and try again (possibly a ' - 'temporary block).'.format(url)) - - else: - - raise HTTPLookupError('HTTP lookup failed for {0} with error ' - 'code {1}.'.format(url, str(e.code))) - - except (URLError, socket.timeout, socket.error) as e: - - # Check needed for Python 2.6, also why URLError is caught. - try: # pragma: no cover - if not isinstance(e.reason, (socket.timeout, socket.error)): - raise HTTPLookupError('HTTP lookup failed for {0}.' - ''.format(url)) - except AttributeError: # pragma: no cover - - pass - - log.debug('HTTP query socket error: {0}'.format(e)) - if retry_count > 0: - - log.debug('HTTP query retrying (count: {0})'.format( - str(retry_count))) - - return self.get_http_json( - url=url, retry_count=retry_count-1, - rate_limit_timeout=rate_limit_timeout, headers=headers - ) - - else: - - raise HTTPLookupError('HTTP lookup failed for {0}.'.format( - url)) - - except (HTTPLookupError, HTTPRateLimitError) as e: # pragma: no cover - - raise e - - except: # pragma: no cover - - raise HTTPLookupError('HTTP lookup failed for {0}.'.format(url)) - - def get_host(self, retry_count=3): - """ - The function for retrieving host information for an IP address. - - Args: - retry_count (:obj:`int`): The number of times to retry in case - socket errors, timeouts, connection resets, etc. are - encountered. Defaults to 3. - - Returns: - namedtuple: - - :hostname (str): The hostname returned mapped to the given IP - address. - :aliaslist (list): Alternate names for the given IP address. - :ipaddrlist (list): IPv4/v6 addresses mapped to the same hostname. - - Raises: - HostLookupError: The host lookup failed. - """ - - try: - - default_timeout_set = False - if not socket.getdefaulttimeout(): - - socket.setdefaulttimeout(self.timeout) - default_timeout_set = True - - log.debug('Host query for {0}'.format(self.address_str)) - ret = socket.gethostbyaddr(self.address_str) - - if default_timeout_set: # pragma: no cover - - socket.setdefaulttimeout(None) - - results = namedtuple('get_host_results', 'hostname, aliaslist, ' - 'ipaddrlist') - return results(ret) - - except (socket.timeout, socket.error) as e: - - log.debug('Host query socket error: {0}'.format(e)) - if retry_count > 0: - - log.debug('Host query retrying (count: {0})'.format( - str(retry_count))) - - return self.get_host(retry_count - 1) - - else: - - raise HostLookupError( - 'Host lookup failed for {0}.'.format(self.address_str) - ) - - except: # pragma: no cover - - raise HostLookupError( - 'Host lookup failed for {0}.'.format(self.address_str) - ) - - def get_http_raw(self, url=None, retry_count=3, headers=None, - request_type='GET', form_data=None): - """ - The function for retrieving a raw HTML result via HTTP. - - Args: - url (:obj:`str`): The URL to retrieve (required). - retry_count (:obj:`int`): The number of times to retry in case - socket errors, timeouts, connection resets, etc. are - encountered. Defaults to 3. - headers (:obj:`dict`): The HTTP headers. The Accept header - defaults to 'text/html'. - request_type (:obj:`str`): Request type 'GET' or 'POST'. Defaults - to 'GET'. - form_data (:obj:`dict`): Optional form POST data. - - Returns: - str: The raw data. - - Raises: - HTTPLookupError: The HTTP lookup failed. - """ - - if headers is None: - headers = {'Accept': 'text/html'} - - enc_form_data = None - if form_data: - enc_form_data = urlencode(form_data) - try: - # Py 2 inspection will alert on the encoding arg, no harm done. - enc_form_data = bytes(enc_form_data, encoding='ascii') - except TypeError: # pragma: no cover - pass - - try: - - # Create the connection for the HTTP query. - log.debug('HTTP query for {0} at {1}'.format( - self.address_str, url)) - try: - # Py 2 inspection alert bypassed by using kwargs dict. - conn = Request(url=url, data=enc_form_data, headers=headers, - **{'method': request_type}) - except TypeError: # pragma: no cover - conn = Request(url=url, data=enc_form_data, headers=headers) - data = self.opener.open(conn, timeout=self.timeout) - - try: - d = data.readall().decode('ascii', 'ignore') - except AttributeError: # pragma: no cover - d = data.read().decode('ascii', 'ignore') - - return str(d) - - except (URLError, socket.timeout, socket.error) as e: - - # Check needed for Python 2.6, also why URLError is caught. - try: # pragma: no cover - if not isinstance(e.reason, (socket.timeout, socket.error)): - raise HTTPLookupError('HTTP lookup failed for {0}.' - ''.format(url)) - except AttributeError: # pragma: no cover - - pass - - log.debug('HTTP query socket error: {0}'.format(e)) - if retry_count > 0: - - log.debug('HTTP query retrying (count: {0})'.format( - str(retry_count))) - - return self.get_http_raw( - url=url, retry_count=retry_count - 1, headers=headers, - request_type=request_type, form_data=form_data - ) - - else: - - raise HTTPLookupError('HTTP lookup failed for {0}.'.format( - url)) - - except HTTPLookupError as e: # pragma: no cover - - raise e - - except Exception: # pragma: no cover - - raise HTTPLookupError('HTTP lookup failed for {0}.'.format(url)) diff --git a/env/lib/python3.7/site-packages/ipwhois/nir.py b/env/lib/python3.7/site-packages/ipwhois/nir.py deleted file mode 100644 index fc7a49a..0000000 --- a/env/lib/python3.7/site-packages/ipwhois/nir.py +++ /dev/null @@ -1,682 +0,0 @@ -# Copyright (c) 2013-2019 Philip Hane -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. - -from . import NetError -from .utils import unique_everseen -import logging -import sys -import re -import copy -from datetime import (datetime, timedelta) - -if sys.version_info >= (3, 3): # pragma: no cover - from ipaddress import (ip_address, - ip_network, - summarize_address_range, - collapse_addresses) -else: # pragma: no cover - from ipaddr import (IPAddress as ip_address, - IPNetwork as ip_network, - summarize_address_range, - collapse_address_list as collapse_addresses) - -log = logging.getLogger(__name__) - -# Base NIR whois output dictionary. -BASE_NET = { - 'cidr': None, - 'name': None, - 'handle': None, - 'range': None, - 'country': None, - 'address': None, - 'postal_code': None, - 'nameservers': None, - 'created': None, - 'updated': None, - 'contacts': None -} - -# Base NIR whois contact output dictionary. -BASE_CONTACT = { - 'name': None, - 'email': None, - 'reply_email': None, - 'organization': None, - 'division': None, - 'title': None, - 'phone': None, - 'fax': None, - 'updated': None -} - -# National Internet Registry -NIR_WHOIS = { - 'jpnic': { - 'country_code': 'JP', - 'url': ('http://whois.nic.ad.jp/cgi-bin/whois_gw?lang=%2Fe&key={0}' - '&submit=query'), - 'request_type': 'GET', - 'request_headers': {'Accept': 'text/html'}, - 'form_data_ip_field': None, - 'fields': { - 'name': r'(\[Organization\])[^\S\n]+(?P.*?)\n', - 'handle': r'(\[Network Name\])[^\S\n]+(?P.*?)\n', - 'created': r'(\[Assigned Date\])[^\S\n]+(?P.*?)\n', - 'updated': r'(\[Last Update\])[^\S\n]+(?P.*?)\n', - 'nameservers': r'(\[Nameserver\])[^\S\n]+(?P.*?)\n', - 'contact_admin': r'(\[Administrative Contact\])[^\S\n]+.+?\>' - '(?P.+?)\<\/A\>\n', - 'contact_tech': r'(\[Technical Contact\])[^\S\n]+.+?\>' - '(?P.+?)\<\/A\>\n' - }, - 'contact_fields': { - 'name': r'(\[Last, First\])[^\S\n]+(?P.*?)\n', - 'email': r'(\[E-Mail\])[^\S\n]+(?P.*?)\n', - 'reply_email': r'(\[Reply Mail\])[^\S\n]+(?P.*?)\n', - 'organization': r'(\[Organization\])[^\S\n]+(?P.*?)\n', - 'division': r'(\[Division\])[^\S\n]+(?P.*?)\n', - 'title': r'(\[Title\])[^\S\n]+(?P.*?)\n', - 'phone': r'(\[TEL\])[^\S\n]+(?P.*?)\n', - 'fax': r'(\[FAX\])[^\S\n]+(?P.*?)\n', - 'updated': r'(\[Last Update\])[^\S\n]+(?P.*?)\n' - }, - 'dt_format': '%Y/%m/%d %H:%M:%S(JST)', - 'dt_hourdelta': 9, - 'multi_net': False - }, - 'krnic': { - 'country_code': 'KR', - 'url': 'https://whois.kisa.or.kr/eng/whois.jsc', - 'request_type': 'POST', - 'request_headers': {'Accept': 'text/html'}, - 'form_data_ip_field': 'query', - 'fields': { - 'name': r'(Organization Name)[\s]+\:[^\S\n]+(?P.+?)\n', - 'handle': r'(Service Name|Network Type)[\s]+\:[^\S\n]+(?P.+?)' - '\n', - 'address': r'(Address)[\s]+\:[^\S\n]+(?P.+?)\n', - 'postal_code': r'(Zip Code)[\s]+\:[^\S\n]+(?P.+?)\n', - 'created': r'(Registration Date)[\s]+\:[^\S\n]+(?P.+?)\n', - 'contact_admin': r'(id="eng_isp_contact").+?\>(?P.*?)\<' - '\/div\>\n', - 'contact_tech': r'(id="eng_user_contact").+?\>(?P.*?)\<' - '\/div\>\n' - }, - 'contact_fields': { - 'name': r'(Name)[^\S\n]+?:[^\S\n]+?(?P.*?)\n', - 'email': r'(E-Mail)[^\S\n]+?:[^\S\n]+?(?P.*?)\n', - 'phone': r'(Phone)[^\S\n]+?:[^\S\n]+?(?P.*?)\n' - }, - 'dt_format': '%Y%m%d', - 'dt_hourdelta': 0, - 'multi_net': True - } -} - - -class NIRWhois: - """ - The class for parsing whois data for NIRs (National Internet Registry). - JPNIC and KRNIC are currently the only NIRs supported. Output varies - based on NIR specific whois formatting. - - Args: - net (:obj:`ipwhois.net.Net`): The network object. - - Raises: - NetError: The parameter provided is not an instance of - ipwhois.net.Net - IPDefinedError: The address provided is defined (does not need to be - resolved). - """ - - def __init__(self, net): - - from .net import Net - - # ipwhois.net.Net validation - if isinstance(net, Net): - - self._net = net - - else: - - raise NetError('The provided net parameter is not an instance of ' - 'ipwhois.net.Net') - - def parse_fields(self, response, fields_dict, net_start=None, - net_end=None, dt_format=None, field_list=None, - hourdelta=0, is_contact=False): - """ - The function for parsing whois fields from a data input. - - Args: - response (:obj:`str`): The response from the whois/rwhois server. - fields_dict (:obj:`dict`): The mapping of fields to regex search - values (required). - net_start (:obj:`int`): The starting point of the network (if - parsing multiple networks). Defaults to None. - net_end (:obj:`int`): The ending point of the network (if parsing - multiple networks). Defaults to None. - dt_format (:obj:`str`): The format of datetime fields if known. - Defaults to None. - field_list (:obj:`list` of :obj:`str`): If provided, fields to - parse. Defaults to :obj:`ipwhois.nir.BASE_NET` if is_contact - is False. Otherwise, defaults to - :obj:`ipwhois.nir.BASE_CONTACT`. - hourdelta (:obj:`int`): The timezone delta for created/updated - fields. Defaults to 0. - is_contact (:obj:`bool`): If True, uses contact information - field parsing. Defaults to False. - - Returns: - dict: A dictionary of fields provided in fields_dict, mapping to - the results of the regex searches. - """ - - response = '{0}\n'.format(response) - if is_contact: - - ret = {} - - if not field_list: - - field_list = list(BASE_CONTACT.keys()) - - else: - - ret = { - 'contacts': {'admin': None, 'tech': None}, - 'contact_admin': {}, - 'contact_tech': {} - } - - if not field_list: - - field_list = list(BASE_NET.keys()) - field_list.remove('contacts') - field_list.append('contact_admin') - field_list.append('contact_tech') - - generate = ((field, pattern) for (field, pattern) in - fields_dict.items() if field in field_list) - - for field, pattern in generate: - - pattern = re.compile( - str(pattern), - re.DOTALL - ) - - if net_start is not None: - - match = pattern.finditer(response, net_end, net_start) - - elif net_end is not None: - - match = pattern.finditer(response, net_end) - - else: - - match = pattern.finditer(response) - - values = [] - for m in match: - - try: - - values.append(m.group('val').strip()) - - except IndexError: - - pass - - if len(values) > 0: - - value = None - try: - - if field in ['created', 'updated'] and dt_format: - - value = ( - datetime.strptime( - values[0], - str(dt_format) - ) - timedelta(hours=hourdelta) - ).isoformat('T') - - elif field in ['nameservers']: - - value = list(unique_everseen(values)) - - else: - - values = unique_everseen(values) - value = '\n'.join(values) - - except ValueError as e: - - log.debug('NIR whois field parsing failed for {0}: {1}' - ''.format(field, e)) - pass - - ret[field] = value - - return ret - - def _parse_fields(self, *args, **kwargs): - """ - Deprecated. This will be removed in a future release. - """ - - from warnings import warn - warn('NIRWhois._parse_fields() has been deprecated and will be ' - 'removed. You should now use NIRWhois.parse_fields().') - return self.parse_fields(*args, **kwargs) - - def get_nets_jpnic(self, response): - """ - The function for parsing network blocks from jpnic whois data. - - Args: - response (:obj:`str`): The response from the jpnic server. - - Returns: - list of dict: Mapping of networks with start and end positions. - - :: - - [{ - 'cidr' (str) - The network routing block - 'start' (int) - The starting point of the network - 'end' (int) - The endpoint point of the network - }] - """ - - nets = [] - - # Iterate through all of the networks found, storing the CIDR value - # and the start and end positions. - for match in re.finditer( - r'^.*?(\[Network Number\])[^\S\n]+.+?>(?P.+?)
$', - response, - re.MULTILINE - ): - - try: - - net = copy.deepcopy(BASE_NET) - tmp = ip_network(match.group(2)) - - try: # pragma: no cover - network_address = tmp.network_address - except AttributeError: # pragma: no cover - network_address = tmp.ip - pass - - try: # pragma: no cover - broadcast_address = tmp.broadcast_address - except AttributeError: # pragma: no cover - broadcast_address = tmp.broadcast - pass - - net['range'] = '{0} - {1}'.format( - network_address + 1, broadcast_address - ) - - cidr = ip_network(match.group(2).strip()).__str__() - - net['cidr'] = cidr - net['start'] = match.start() - net['end'] = match.end() - nets.append(net) - - except (ValueError, TypeError): - - pass - - return nets - - def _get_nets_jpnic(self, *args, **kwargs): - """ - Deprecated. This will be removed in a future release. - """ - - from warnings import warn - warn('NIRWhois._get_nets_jpnic() has been deprecated and will be ' - 'removed. You should now use NIRWhois.get_nets_jpnic().') - return self.get_nets_jpnic(*args, **kwargs) - - def get_nets_krnic(self, response): - """ - The function for parsing network blocks from krnic whois data. - - Args: - response (:obj:`str`): The response from the krnic server. - - Returns: - list of dict: Mapping of networks with start and end positions. - - :: - - [{ - 'cidr' (str) - The network routing block - 'start' (int) - The starting point of the network - 'end' (int) - The endpoint point of the network - }] - """ - - nets = [] - - # Iterate through all of the networks found, storing the CIDR value - # and the start and end positions. - for match in re.finditer( - r'^(IPv4 Address)[\s]+:[^\S\n]+((.+?)[^\S\n]-[^\S\n](.+?)' - '[^\S\n]\((.+?)\)|.+)$', - response, - re.MULTILINE - ): - - try: - - net = copy.deepcopy(BASE_NET) - net['range'] = match.group(2) - - if match.group(3) and match.group(4): - - addrs = [] - addrs.extend(summarize_address_range( - ip_address(match.group(3).strip()), - ip_address(match.group(4).strip()))) - - cidr = ', '.join( - [i.__str__() for i in collapse_addresses(addrs)] - ) - - net['range'] = '{0} - {1}'.format( - match.group(3), match.group(4) - ) - - else: - - cidr = ip_network(match.group(2).strip()).__str__() - - net['cidr'] = cidr - net['start'] = match.start() - net['end'] = match.end() - nets.append(net) - - except (ValueError, TypeError): - - pass - - return nets - - def _get_nets_krnic(self, *args, **kwargs): - """ - Deprecated. This will be removed in a future release. - """ - - from warnings import warn - warn('NIRWhois._get_nets_krnic() has been deprecated and will be ' - 'removed. You should now use NIRWhois.get_nets_krnic().') - return self.get_nets_krnic(*args, **kwargs) - - def get_contact(self, response=None, nir=None, handle=None, - retry_count=3, dt_format=None): - """ - The function for retrieving and parsing NIR whois data based on - NIR_WHOIS contact_fields. - - Args: - response (:obj:`str`): Optional response object, this bypasses the - lookup. - nir (:obj:`str`): The NIR to query ('jpnic' or 'krnic'). Required - if response is None. - handle (:obj:`str`): For NIRs that have separate contact queries - (JPNIC), this is the contact handle to use in the query. - Defaults to None. - retry_count (:obj:`int`): The number of times to retry in case - socket errors, timeouts, connection resets, etc. are - encountered. Defaults to 3. - dt_format (:obj:`str`): The format of datetime fields if known. - Defaults to None. - - Returns: - dict: Mapping of the fields provided in contact_fields, to their - parsed results. - """ - - if response or nir == 'krnic': - - contact_response = response - - else: - - # Retrieve the whois data. - contact_response = self._net.get_http_raw( - url=str(NIR_WHOIS[nir]['url']).format(handle), - retry_count=retry_count, - headers=NIR_WHOIS[nir]['request_headers'], - request_type=NIR_WHOIS[nir]['request_type'] - ) - - return self.parse_fields( - response=contact_response, - fields_dict=NIR_WHOIS[nir]['contact_fields'], - dt_format=dt_format, - hourdelta=int(NIR_WHOIS[nir]['dt_hourdelta']), - is_contact=True - ) - - def _get_contact(self, *args, **kwargs): - """ - Deprecated. This will be removed in a future release. - """ - - from warnings import warn - warn('NIRWhois._get_contact() has been deprecated and will be ' - 'removed. You should now use NIRWhois.get_contact().') - return self.get_contact(*args, **kwargs) - - def lookup(self, nir=None, inc_raw=False, retry_count=3, response=None, - field_list=None, is_offline=False): - """ - The function for retrieving and parsing NIR whois information for an IP - address via HTTP (HTML scraping). - - Args: - nir (:obj:`str`): The NIR to query ('jpnic' or 'krnic'). Required - if response is None. - inc_raw (:obj:`bool`, optional): Whether to include the raw - results in the returned dictionary. Defaults to False. - retry_count (:obj:`int`): The number of times to retry in case - socket errors, timeouts, connection resets, etc. are - encountered. Defaults to 3. - response (:obj:`str`): Optional response object, this bypasses the - NIR lookup. Required when is_offline=True. - field_list (:obj:`list` of :obj:`str`): If provided, fields to - parse. Defaults to :obj:`ipwhois.nir.BASE_NET`. - is_offline (:obj:`bool`): Whether to perform lookups offline. If - True, response and asn_data must be provided. Primarily used - for testing. - - Returns: - dict: The NIR whois results: - - :: - - { - 'query' (str) - The IP address. - 'nets' (list of dict) - Network information which consists - of the fields listed in the ipwhois.nir.NIR_WHOIS - dictionary. - 'raw' (str) - Raw NIR whois results if the inc_raw - parameter is True. - } - """ - - if nir not in NIR_WHOIS.keys(): - - raise KeyError('Invalid arg for nir (National Internet Registry') - - # Create the return dictionary. - results = { - 'query': self._net.address_str, - 'raw': None - } - - # Only fetch the response if we haven't already. - if response is None: - - if is_offline: - - raise KeyError('response argument required when ' - 'is_offline=True') - - log.debug('Response not given, perform WHOIS lookup for {0}' - .format(self._net.address_str)) - - form_data = None - if NIR_WHOIS[nir]['form_data_ip_field']: - form_data = {NIR_WHOIS[nir]['form_data_ip_field']: - self._net.address_str} - - # Retrieve the whois data. - response = self._net.get_http_raw( - url=str(NIR_WHOIS[nir]['url']).format(self._net.address_str), - retry_count=retry_count, - headers=NIR_WHOIS[nir]['request_headers'], - request_type=NIR_WHOIS[nir]['request_type'], - form_data=form_data - ) - - # If inc_raw parameter is True, add the response to return dictionary. - if inc_raw: - - results['raw'] = response - - nets = [] - nets_response = None - if nir == 'jpnic': - - nets_response = self.get_nets_jpnic(response) - - elif nir == 'krnic': - - nets_response = self.get_nets_krnic(response) - - nets.extend(nets_response) - - global_contacts = {} - - # Iterate through all of the network sections and parse out the - # appropriate fields for each. - log.debug('Parsing NIR WHOIS data') - for index, net in enumerate(nets): - - section_end = None - if index + 1 < len(nets): - section_end = nets[index + 1]['start'] - - try: - - dt_format = NIR_WHOIS[nir]['dt_format'] - - except KeyError: # pragma: no cover - - dt_format = None - - temp_net = self.parse_fields( - response=response, - fields_dict=NIR_WHOIS[nir]['fields'], - net_start=section_end, - net_end=net['end'], - dt_format=dt_format, - field_list=field_list, - hourdelta=int(NIR_WHOIS[nir]['dt_hourdelta']) - ) - temp_net['country'] = NIR_WHOIS[nir]['country_code'] - contacts = { - 'admin': temp_net['contact_admin'], - 'tech': temp_net['contact_tech'] - } - - del ( - temp_net['contact_admin'], - temp_net['contact_tech'] - ) - - if not is_offline: - - for key, val in contacts.items(): - - if len(val) > 0: - - if isinstance(val, str): - - val = val.splitlines() - - for contact in val: - - if contact in global_contacts.keys(): - - temp_net['contacts'][key] = ( - global_contacts[contact] - ) - - else: - - if nir == 'krnic': - - tmp_response = contact - tmp_handle = None - - else: - - tmp_response = None - tmp_handle = contact - - temp_net['contacts'][key] = self.get_contact( - response=tmp_response, - handle=tmp_handle, - nir=nir, - retry_count=retry_count, - dt_format=dt_format - ) - global_contacts[contact] = ( - temp_net['contacts'][key] - ) - - # Merge the net dictionaries. - net.update(temp_net) - - # The start and end values are no longer needed. - del net['start'], net['end'] - - # Add the networks to the return dictionary. - results['nets'] = nets - - return results diff --git a/env/lib/python3.7/site-packages/ipwhois/rdap.py b/env/lib/python3.7/site-packages/ipwhois/rdap.py deleted file mode 100644 index 4a44b3a..0000000 --- a/env/lib/python3.7/site-packages/ipwhois/rdap.py +++ /dev/null @@ -1,898 +0,0 @@ -# Copyright (c) 2013-2019 Philip Hane -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. - -from . import (Net, NetError, InvalidEntityContactObject, InvalidNetworkObject, - InvalidEntityObject, HTTPLookupError) -from .utils import ipv4_lstrip_zeros, calculate_cidr, unique_everseen -from .net import ip_address -import logging -import json - -log = logging.getLogger(__name__) - -BOOTSTRAP_URL = 'http://rdap.arin.net/bootstrap' - -RIR_RDAP = { - 'arin': { - 'ip_url': 'http://rdap.arin.net/registry/ip/{0}', - 'entity_url': 'http://rdap.arin.net/registry/entity/{0}' - }, - 'ripencc': { - 'ip_url': 'http://rdap.db.ripe.net/ip/{0}', - 'entity_url': 'http://rdap.db.ripe.net/entity/{0}' - }, - 'apnic': { - 'ip_url': 'http://rdap.apnic.net/ip/{0}', - 'entity_url': 'http://rdap.apnic.net/entity/{0}' - }, - 'lacnic': { - 'ip_url': 'http://rdap.lacnic.net/rdap/ip/{0}', - 'entity_url': 'http://rdap.lacnic.net/rdap/entity/{0}' - }, - 'afrinic': { - 'ip_url': 'http://rdap.afrinic.net/rdap/ip/{0}', - 'entity_url': 'http://rdap.afrinic.net/rdap/entity/{0}' - } -} - - -class _RDAPContact: - """ - The class for parsing RDAP entity contact information objects: - https://tools.ietf.org/html/rfc7483#section-5.1 - https://tools.ietf.org/html/rfc7095 - - Args: - vcard (:obj:`list` of :obj:`list`): The vcard list from an RDAP IP - address query. - - Raises: - InvalidEntityContactObject: vcard is not an RDAP entity contact - information object. - """ - - def __init__(self, vcard): - - if not isinstance(vcard, list): - - raise InvalidEntityContactObject('JSON result must be a list.') - - self.vcard = vcard - self.vars = { - 'name': None, - 'kind': None, - 'address': None, - 'phone': None, - 'email': None, - 'role': None, - 'title': None - } - - def _parse_name(self, val): - """ - The function for parsing the vcard name. - - Args: - val (:obj:`list`): The value to parse. - """ - - self.vars['name'] = val[3].strip() - - def _parse_kind(self, val): - """ - The function for parsing the vcard kind. - - Args: - val (:obj:`list`): The value to parse. - """ - - self.vars['kind'] = val[3].strip() - - def _parse_address(self, val): - """ - The function for parsing the vcard address. - - Args: - val (:obj:`list`): The value to parse. - """ - - ret = { - 'type': None, - 'value': None - } - - try: - - ret['type'] = val[1]['type'] - - except (KeyError, ValueError, TypeError): - - pass - - try: - - ret['value'] = val[1]['label'] - - except (KeyError, ValueError, TypeError): - - ret['value'] = '\n'.join(val[3]).strip() - - try: - - self.vars['address'].append(ret) - - except AttributeError: - - self.vars['address'] = [] - self.vars['address'].append(ret) - - def _parse_phone(self, val): - """ - The function for parsing the vcard phone numbers. - - Args: - val (:obj:`list`): The value to parse. - """ - - ret = { - 'type': None, - 'value': None - } - - try: - - ret['type'] = val[1]['type'] - - except (IndexError, KeyError, ValueError, TypeError): - - pass - - ret['value'] = val[3].strip() - - try: - - self.vars['phone'].append(ret) - - except AttributeError: - - self.vars['phone'] = [] - self.vars['phone'].append(ret) - - def _parse_email(self, val): - """ - The function for parsing the vcard email addresses. - - Args: - val (:obj:`list`): The value to parse. - """ - - ret = { - 'type': None, - 'value': None - } - - try: - - ret['type'] = val[1]['type'] - - except (KeyError, ValueError, TypeError): - - pass - - ret['value'] = val[3].strip() - - try: - - self.vars['email'].append(ret) - - except AttributeError: - - self.vars['email'] = [] - self.vars['email'].append(ret) - - def _parse_role(self, val): - """ - The function for parsing the vcard role. - - Args: - val (:obj:`list`): The value to parse. - """ - - self.vars['role'] = val[3].strip() - - def _parse_title(self, val): - """ - The function for parsing the vcard title. - - Args: - val (:obj:`list`): The value to parse. - """ - - self.vars['title'] = val[3].strip() - - def parse(self): - """ - The function for parsing the vcard to the vars dictionary. - """ - - keys = { - 'fn': self._parse_name, - 'kind': self._parse_kind, - 'adr': self._parse_address, - 'tel': self._parse_phone, - 'email': self._parse_email, - 'role': self._parse_role, - 'title': self._parse_title - } - - for val in self.vcard: - - try: - - parser = keys.get(val[0]) - parser(val) - - except (KeyError, ValueError, TypeError): - - pass - - -class _RDAPCommon: - """ - The common class for parsing RDAP objects: - https://tools.ietf.org/html/rfc7483#section-5 - - Args: - json_result (:obj:`dict`): The JSON response from an RDAP query. - - Raises: - ValueError: vcard is not a known RDAP object. - """ - - def __init__(self, json_result): - - if not isinstance(json_result, dict): - - raise ValueError - - self.json = json_result - self.vars = { - 'handle': None, - 'status': None, - 'remarks': None, - 'notices': None, - 'links': None, - 'events': None, - 'raw': None - } - - def summarize_links(self, links_json): - """ - The function for summarizing RDAP links in to a unique list. - https://tools.ietf.org/html/rfc7483#section-4.2 - - Args: - links_json (:obj:`dict`): A json mapping of links from RDAP - results. - - Returns: - list of str: Unique RDAP links. - """ - - ret = [] - - for link_dict in links_json: - - ret.append(link_dict['href']) - - ret = list(unique_everseen(ret)) - - return ret - - def summarize_notices(self, notices_json): - """ - The function for summarizing RDAP notices in to a unique list. - https://tools.ietf.org/html/rfc7483#section-4.3 - - Args: - notices_json (:obj:`dict`): A json mapping of notices from RDAP - results. - - Returns: - list of dict: Unique RDAP notices information: - - :: - - [{ - 'title' (str) - The title/header of the notice. - 'description' (str) - The description/body of the notice. - 'links' (list) - Unique links returned by - :obj:`ipwhois.rdap._RDAPCommon.summarize_links()`. - }] - """ - - ret = [] - - for notices_dict in notices_json: - - tmp = { - 'title': None, - 'description': None, - 'links': None - } - - try: - - tmp['title'] = notices_dict['title'] - - except (KeyError, ValueError, TypeError): - - pass - - try: - - tmp['description'] = '\n'.join(notices_dict['description']) - - except (KeyError, ValueError, TypeError): - - pass - - try: - - tmp['links'] = self.summarize_links(notices_dict['links']) - - except (KeyError, ValueError, TypeError): - - pass - - if any(tmp.values()): - - ret.append(tmp) - - return ret - - def summarize_events(self, events_json): - """ - The function for summarizing RDAP events in to a unique list. - https://tools.ietf.org/html/rfc7483#section-4.5 - - Args: - events_json (:obj:`dict`): A json mapping of events from RDAP - results. - - Returns: - list of dict: Unique RDAP events information: - - :: - - [{ - 'action' (str) - The reason for an event. - 'timestamp' (str) - The timestamp for when an event - occured. - 'actor' (str) - The identifier for an event initiator. - }] - """ - - ret = [] - - for event in events_json: - - event_dict = { - 'action': event['eventAction'], - 'timestamp': event['eventDate'], - 'actor': None - } - - try: - - event_dict['actor'] = event['eventActor'] - - except (KeyError, ValueError, TypeError): - - pass - - ret.append(event_dict) - - return ret - - def _parse(self): - """ - The function for parsing the JSON response to the vars dictionary. - """ - - try: - - self.vars['status'] = self.json['status'] - - except (KeyError, ValueError, TypeError): - - pass - - for v in ['remarks', 'notices']: - - try: - - self.vars[v] = self.summarize_notices(self.json[v]) - - except (KeyError, ValueError, TypeError): - - pass - - try: - - self.vars['links'] = self.summarize_links(self.json['links']) - - except (KeyError, ValueError, TypeError): - - pass - - try: - - self.vars['events'] = self.summarize_events(self.json['events']) - - except (KeyError, ValueError, TypeError): - - pass - - -class _RDAPNetwork(_RDAPCommon): - """ - The class for parsing RDAP network objects: - https://tools.ietf.org/html/rfc7483#section-5.4 - - Args: - json_result (:obj:`dict`): The JSON response from an RDAP IP address - query. - - Raises: - InvalidNetworkObject: json_result is not an RDAP network object. - """ - - def __init__(self, json_result): - - try: - - _RDAPCommon.__init__(self, json_result) - - except ValueError: - - raise InvalidNetworkObject('JSON result must be a dict.') - - self.vars.update({ - 'start_address': None, - 'end_address': None, - 'cidr': None, - 'ip_version': None, - 'type': None, - 'name': None, - 'country': None, - 'parent_handle': None - }) - - def parse(self): - """ - The function for parsing the JSON response to the vars dictionary. - """ - - try: - - self.vars['handle'] = self.json['handle'].strip() - - except (KeyError, ValueError): - - log.debug('Handle missing, json_output: {0}'.format(json.dumps( - self.json))) - raise InvalidNetworkObject('Handle is missing for RDAP network ' - 'object') - - try: - - self.vars['ip_version'] = self.json['ipVersion'].strip() - - # RDAP IPv4 addresses are padded to 3 digits per octet, remove - # the leading 0's. - if self.vars['ip_version'] == 'v4': - - self.vars['start_address'] = ip_address( - ipv4_lstrip_zeros(self.json['startAddress']) - ).__str__() - - self.vars['end_address'] = ip_address( - ipv4_lstrip_zeros(self.json['endAddress']) - ).__str__() - - # No bugs found for IPv6 yet, proceed as normal. - else: - - self.vars['start_address'] = self.json['startAddress'].strip() - self.vars['end_address'] = self.json['endAddress'].strip() - - except (KeyError, ValueError, TypeError): - - log.debug('IP address data incomplete. Data parsed prior to ' - 'exception: {0}'.format(json.dumps(self.vars))) - raise InvalidNetworkObject('IP address data is missing for RDAP ' - 'network object.') - - try: - - self.vars['cidr'] = ', '.join(calculate_cidr( - self.vars['start_address'], self.vars['end_address'] - )) - - except (KeyError, ValueError, TypeError, AttributeError) as \ - e: # pragma: no cover - - log.debug('CIDR calculation failed: {0}'.format(e)) - pass - - for v in ['name', 'type', 'country']: - - try: - - self.vars[v] = self.json[v].strip() - - except (KeyError, ValueError): - - pass - - try: - - self.vars['parent_handle'] = self.json['parentHandle'].strip() - - except (KeyError, ValueError): - - pass - - self._parse() - - -class _RDAPEntity(_RDAPCommon): - """ - The class for parsing RDAP entity objects: - https://tools.ietf.org/html/rfc7483#section-5.1 - - Args: - json_result (:obj:`dict`): The JSON response from an RDAP query. - - Raises: - InvalidEntityObject: json_result is not an RDAP entity object. - """ - - def __init__(self, json_result): - - try: - - _RDAPCommon.__init__(self, json_result) - - except ValueError: - - raise InvalidEntityObject('JSON result must be a dict.') - - self.vars.update({ - 'roles': None, - 'contact': None, - 'events_actor': None, - 'entities': [] - }) - - def parse(self): - """ - The function for parsing the JSON response to the vars dictionary. - """ - - try: - - self.vars['handle'] = self.json['handle'].strip() - - except (KeyError, ValueError, TypeError): - - raise InvalidEntityObject('Handle is missing for RDAP entity') - - for v in ['roles', 'country']: - - try: - - self.vars[v] = self.json[v] - - except (KeyError, ValueError): - - pass - - try: - - vcard = self.json['vcardArray'][1] - c = _RDAPContact(vcard) - c.parse() - - self.vars['contact'] = c.vars - - except (KeyError, ValueError, TypeError): - - pass - - try: - - self.vars['events_actor'] = self.summarize_events( - self.json['asEventActor']) - - except (KeyError, ValueError, TypeError): - - pass - - self.vars['entities'] = [] - try: - - for ent in self.json['entities']: - - if ent['handle'] not in self.vars['entities']: - - self.vars['entities'].append(ent['handle']) - - except (KeyError, ValueError, TypeError): - - pass - - if not self.vars['entities']: - - self.vars['entities'] = None - - self._parse() - - -class RDAP: - """ - The class for parsing IP address whois information via RDAP: - https://tools.ietf.org/html/rfc7483 - https://www.arin.net/resources/rdap.html - - Args: - net (:obj:`ipwhois.net.Net`): The network object. - - Raises: - NetError: The parameter provided is not an instance of - ipwhois.net.Net - IPDefinedError: The address provided is defined (does not need to be - resolved). - """ - - def __init__(self, net): - - if isinstance(net, Net): - - self._net = net - - else: - - raise NetError('The provided net parameter is not an instance of ' - 'ipwhois.net.Net') - - def lookup(self, inc_raw=False, retry_count=3, asn_data=None, depth=0, - excluded_entities=None, response=None, bootstrap=False, - rate_limit_timeout=120): - """ - The function for retrieving and parsing information for an IP - address via RDAP (HTTP). - - Args: - inc_raw (:obj:`bool`, optional): Whether to include the raw - results in the returned dictionary. Defaults to False. - retry_count (:obj:`int`): The number of times to retry in case - socket errors, timeouts, connection resets, etc. are - encountered. Defaults to 3. - asn_data (:obj:`dict`): Result from - :obj:`ipwhois.asn.IPASN.lookup`. Optional if the bootstrap - parameter is True. - depth (:obj:`int`): How many levels deep to run queries when - additional referenced objects are found. Defaults to 0. - excluded_entities (:obj:`list`): Entity handles to not perform - lookups. Defaults to None. - response (:obj:`str`): Optional response object, this bypasses the - RDAP lookup. - bootstrap (:obj:`bool`): If True, performs lookups via ARIN - bootstrap rather than lookups based on ASN data. Defaults to - False. - rate_limit_timeout (:obj:`int`): The number of seconds to wait - before retrying when a rate limit notice is returned via - rdap+json. Defaults to 120. - - Returns: - dict: The IP RDAP lookup results - - :: - - { - 'query' (str) - The IP address - 'entities' (list) - Entity handles referred by the top - level query. - 'network' (dict) - Network information which consists of - the fields listed in the ipwhois.rdap._RDAPNetwork - dict. - 'objects' (dict) - Mapping of entity handle->entity dict - which consists of the fields listed in the - ipwhois.rdap._RDAPEntity dict. The raw result is - included for each object if the inc_raw parameter - is True. - } - """ - - if not excluded_entities: - - excluded_entities = [] - - # Create the return dictionary. - results = { - 'query': self._net.address_str, - 'network': None, - 'entities': None, - 'objects': None, - 'raw': None - } - - if bootstrap: - - ip_url = '{0}/ip/{1}'.format(BOOTSTRAP_URL, self._net.address_str) - - else: - - ip_url = str(RIR_RDAP[asn_data['asn_registry']]['ip_url']).format( - self._net.address_str) - - # Only fetch the response if we haven't already. - if response is None: - - log.debug('Response not given, perform RDAP lookup for {0}'.format( - ip_url)) - - # Retrieve the whois data. - response = self._net.get_http_json( - url=ip_url, retry_count=retry_count, - rate_limit_timeout=rate_limit_timeout - ) - - if inc_raw: - - results['raw'] = response - - log.debug('Parsing RDAP network object') - result_net = _RDAPNetwork(response) - result_net.parse() - results['network'] = result_net.vars - results['entities'] = [] - results['objects'] = {} - roles = {} - - # Iterate through and parse the root level entities. - log.debug('Parsing RDAP root level entities') - try: - - for ent in response['entities']: - - if ent['handle'] not in [results['entities'], - excluded_entities]: - - result_ent = _RDAPEntity(ent) - result_ent.parse() - - results['objects'][ent['handle']] = result_ent.vars - - results['entities'].append(ent['handle']) - - try: - - for tmp in ent['entities']: - - roles[tmp['handle']] = tmp['roles'] - - except KeyError: - - pass - - except KeyError: - - pass - - # Iterate through to the defined depth, retrieving and parsing all - # unique entities. - temp_objects = results['objects'] - - if depth > 0 and len(temp_objects) > 0: - - log.debug('Parsing RDAP sub-entities to depth: {0}'.format(str( - depth))) - - while depth > 0 and len(temp_objects) > 0: - - new_objects = {} - for obj in temp_objects.values(): - - try: - - for ent in obj['entities']: - - if ent not in (list(results['objects'].keys()) + - list(new_objects.keys()) + - excluded_entities): - - if bootstrap: - entity_url = '{0}/entity/{1}'.format( - BOOTSTRAP_URL, ent) - else: - tmp_reg = asn_data['asn_registry'] - entity_url = RIR_RDAP[tmp_reg]['entity_url'] - entity_url = str(entity_url).format(ent) - - try: - - # RDAP entity query - response = self._net.get_http_json( - url=entity_url, retry_count=retry_count, - rate_limit_timeout=rate_limit_timeout - ) - - # Parse the entity - result_ent = _RDAPEntity(response) - result_ent.parse() - new_objects[ent] = result_ent.vars - - new_objects[ent]['roles'] = None - try: - - new_objects[ent]['roles'] = roles[ent] - - except KeyError: # pragma: no cover - - pass - - try: - - for tmp in response['entities']: - - if tmp['handle'] not in roles: - - roles[tmp['handle']] = tmp['roles'] - - except (IndexError, KeyError): - - pass - - if inc_raw: - - new_objects[ent]['raw'] = response - - except (HTTPLookupError, InvalidEntityObject): - - pass - - except TypeError: - - pass - - # Update the result objects, and set the new temp object list to - # iterate for the next depth of entities. - results['objects'].update(new_objects) - temp_objects = new_objects - depth -= 1 - - return results diff --git a/env/lib/python3.7/site-packages/ipwhois/utils.py b/env/lib/python3.7/site-packages/ipwhois/utils.py deleted file mode 100644 index 8fd94d9..0000000 --- a/env/lib/python3.7/site-packages/ipwhois/utils.py +++ /dev/null @@ -1,631 +0,0 @@ -# Copyright (c) 2013-2019 Philip Hane -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. - -import sys -from xml.dom.minidom import parseString -from os import path -import re -import copy -import io -import csv -import random -from collections import namedtuple -import logging - -if sys.version_info >= (3, 3): # pragma: no cover - from ipaddress import (ip_address, - ip_network, - IPv4Address, - IPv4Network, - IPv6Address, - summarize_address_range, - collapse_addresses) -else: # pragma: no cover - from ipaddr import (IPAddress as ip_address, - IPNetwork as ip_network, - IPv4Address, - IPv4Network, - IPv6Address, - summarize_address_range, - collapse_address_list as collapse_addresses) - -try: # pragma: no cover - from itertools import filterfalse - -except ImportError: # pragma: no cover - from itertools import ifilterfalse as filterfalse - -log = logging.getLogger(__name__) - -IETF_RFC_REFERENCES = { - # IPv4 - 'RFC 1122, Section 3.2.1.3': - 'http://tools.ietf.org/html/rfc1122#section-3.2.1.3', - 'RFC 1918': 'http://tools.ietf.org/html/rfc1918', - 'RFC 3927': 'http://tools.ietf.org/html/rfc3927', - 'RFC 5736': 'http://tools.ietf.org/html/rfc5736', - 'RFC 5737': 'http://tools.ietf.org/html/rfc5737', - 'RFC 3068': 'http://tools.ietf.org/html/rfc3068', - 'RFC 2544': 'http://tools.ietf.org/html/rfc2544', - 'RFC 3171': 'http://tools.ietf.org/html/rfc3171', - 'RFC 919, Section 7': 'http://tools.ietf.org/html/rfc919#section-7', - # IPv6 - 'RFC 4291, Section 2.7': 'http://tools.ietf.org/html/rfc4291#section-2.7', - 'RFC 4291': 'http://tools.ietf.org/html/rfc4291', - 'RFC 4291, Section 2.5.2': - 'http://tools.ietf.org/html/rfc4291#section-2.5.2', - 'RFC 4291, Section 2.5.3': - 'http://tools.ietf.org/html/rfc4291#section-2.5.3', - 'RFC 4291, Section 2.5.6': - 'http://tools.ietf.org/html/rfc4291#section-2.5.6', - 'RFC 4291, Section 2.5.7': - 'http://tools.ietf.org/html/rfc4291#section-2.5.7', - 'RFC 4193': 'https://tools.ietf.org/html/rfc4193' -} - -IP_REGEX = ( - r'(?P' - # IPv4 - '(((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.)){3}' - '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' - # IPv6 - '|\[?(((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:)' - '{6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|' - '2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]' - '{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d' - '\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|' - '((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|' - '2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]' - '{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)' - '(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}((' - '(:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1' - '\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|((' - '[0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4})' - '{0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]' - '?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((' - '25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})' - ')|:)))(%.+)?))\]?' - # Optional IPv4 Port - '((:(6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|[1-5]\d{4}|[1-9]\d{0,3}' - # Optional CIDR block - '))|(\/(?:[012]\d?|3[012]?|[4-9])))?' - ')' -) - - -def ipv4_lstrip_zeros(address): - """ - The function to strip leading zeros in each octet of an IPv4 address. - - Args: - address (:obj:`str`): An IPv4 address. - - Returns: - str: The modified IPv4 address. - """ - - # Split the octets. - obj = address.strip().split('.') - - for x, y in enumerate(obj): - - # Strip leading zeros. Split / here in case CIDR is attached. - obj[x] = y.split('/')[0].lstrip('0') - if obj[x] in ['', None]: - obj[x] = '0' - - return '.'.join(obj) - - -def calculate_cidr(start_address, end_address): - """ - The function to calculate a CIDR range(s) from a start and end IP address. - - Args: - start_address (:obj:`str`): The starting IP address. - end_address (:obj:`str`): The ending IP address. - - Returns: - list of str: The calculated CIDR ranges. - """ - - tmp_addrs = [] - - try: - - tmp_addrs.extend(summarize_address_range( - ip_address(start_address), - ip_address(end_address))) - - except (KeyError, ValueError, TypeError): # pragma: no cover - - try: - - tmp_addrs.extend(summarize_address_range( - ip_network(start_address).network_address, - ip_network(end_address).network_address)) - - except AttributeError: # pragma: no cover - - tmp_addrs.extend(summarize_address_range( - ip_network(start_address).ip, - ip_network(end_address).ip)) - - return [i.__str__() for i in collapse_addresses(tmp_addrs)] - - -def get_countries(is_legacy_xml=False): - """ - The function to generate a dictionary containing ISO_3166-1 country codes - to names. - - Args: - is_legacy_xml (:obj:`bool`): Whether to use the older country code - list (iso_3166-1_list_en.xml). - - Returns: - dict: A mapping of country codes as the keys to the country names as - the values. - """ - - # Initialize the countries dictionary. - countries = {} - - # Set the data directory based on if the script is a frozen executable. - if sys.platform == 'win32' and getattr(sys, 'frozen', False): - - data_dir = path.dirname(sys.executable) # pragma: no cover - - else: - - data_dir = path.dirname(__file__) - - if is_legacy_xml: - - log.debug('Opening country code legacy XML: {0}'.format( - str(data_dir) + '/data/iso_3166-1_list_en.xml')) - - # Create the country codes file object. - f = io.open(str(data_dir) + '/data/iso_3166-1_list_en.xml', 'r', - encoding='ISO-8859-1') - - # Read the file. - data = f.read() - - # Check if there is data. - if not data: # pragma: no cover - - return {} - - # Parse the data to get the DOM. - dom = parseString(data) - - # Retrieve the country entries. - entries = dom.getElementsByTagName('ISO_3166-1_Entry') - - # Iterate through the entries and add to the countries dictionary. - for entry in entries: - - # Retrieve the country code and name from the DOM. - code = entry.getElementsByTagName( - 'ISO_3166-1_Alpha-2_Code_element')[0].firstChild.data - name = entry.getElementsByTagName( - 'ISO_3166-1_Country_name')[0].firstChild.data - - # Add to the countries dictionary. - countries[code] = name.title() - - else: - - log.debug('Opening country code CSV: {0}'.format( - str(data_dir) + '/data/iso_3166-1_list_en.xml')) - - # Create the country codes file object. - f = io.open(str(data_dir) + '/data/iso_3166-1.csv', 'r', - encoding='utf-8') - - # Create csv reader object. - csv_reader = csv.reader(f, delimiter=',', quotechar='"') - - # Iterate through the rows and add to the countries dictionary. - for row in csv_reader: - - # Retrieve the country code and name columns. - code = row[0] - name = row[1] - - # Add to the countries dictionary. - countries[code] = name - - return countries - - -def ipv4_is_defined(address): - """ - The function for checking if an IPv4 address is defined (does not need to - be resolved). - - Args: - address (:obj:`str`): An IPv4 address. - - Returns: - namedtuple: - - :is_defined (bool): True if given address is defined, otherwise - False - :ietf_name (str): IETF assignment name if given address is - defined, otherwise '' - :ietf_rfc (str): IETF assignment RFC if given address is defined, - otherwise '' - """ - - # Initialize the IP address object. - query_ip = IPv4Address(str(address)) - - # Initialize the results named tuple - results = namedtuple('ipv4_is_defined_results', 'is_defined, ietf_name, ' - 'ietf_rfc') - - # This Network - if query_ip in IPv4Network('0.0.0.0/8'): - - return results(True, 'This Network', 'RFC 1122, Section 3.2.1.3') - - # Loopback - elif query_ip.is_loopback: - - return results(True, 'Loopback', 'RFC 1122, Section 3.2.1.3') - - # Link Local - elif query_ip.is_link_local: - - return results(True, 'Link Local', 'RFC 3927') - - # IETF Protocol Assignments - elif query_ip in IPv4Network('192.0.0.0/24'): - - return results(True, 'IETF Protocol Assignments', 'RFC 5736') - - # TEST-NET-1 - elif query_ip in IPv4Network('192.0.2.0/24'): - - return results(True, 'TEST-NET-1', 'RFC 5737') - - # 6to4 Relay Anycast - elif query_ip in IPv4Network('192.88.99.0/24'): - - return results(True, '6to4 Relay Anycast', 'RFC 3068') - - # Network Interconnect Device Benchmark Testing - elif query_ip in IPv4Network('198.18.0.0/15'): - - return (results(True, - 'Network Interconnect Device Benchmark Testing', - 'RFC 2544')) - - # TEST-NET-2 - elif query_ip in IPv4Network('198.51.100.0/24'): - - return results(True, 'TEST-NET-2', 'RFC 5737') - - # TEST-NET-3 - elif query_ip in IPv4Network('203.0.113.0/24'): - - return results(True, 'TEST-NET-3', 'RFC 5737') - - # Multicast - elif query_ip.is_multicast: - - return results(True, 'Multicast', 'RFC 3171') - - # Limited Broadcast - elif query_ip in IPv4Network('255.255.255.255/32'): - - return results(True, 'Limited Broadcast', 'RFC 919, Section 7') - - # Private-Use Networks - elif query_ip.is_private: - - return results(True, 'Private-Use Networks', 'RFC 1918') - - # New IANA Reserved - # TODO: Someone needs to find the RFC for this - elif query_ip in IPv4Network('198.97.38.0/24'): - - return results(True, 'IANA Reserved', '') - - return results(False, '', '') - - -def ipv6_is_defined(address): - """ - The function for checking if an IPv6 address is defined (does not need to - be resolved). - - Args: - address (:obj:`str`): An IPv6 address. - - Returns: - namedtuple: - - :is_defined (bool): True if given address is defined, otherwise - False - :ietf_name (str): IETF assignment name if given address is - defined, otherwise '' - :ietf_rfc (str): IETF assignment RFC if given address is defined, - otherwise '' - """ - - # Initialize the IP address object. - query_ip = IPv6Address(str(address)) - - # Initialize the results named tuple - results = namedtuple('ipv6_is_defined_results', 'is_defined, ietf_name, ' - 'ietf_rfc') - # Multicast - if query_ip.is_multicast: - - return results(True, 'Multicast', 'RFC 4291, Section 2.7') - - # Unspecified - elif query_ip.is_unspecified: - - return results(True, 'Unspecified', 'RFC 4291, Section 2.5.2') - - # Loopback. - elif query_ip.is_loopback: - - return results(True, 'Loopback', 'RFC 4291, Section 2.5.3') - - # Reserved - elif query_ip.is_reserved: - - return results(True, 'Reserved', 'RFC 4291') - - # Link-Local - elif query_ip.is_link_local: - - return results(True, 'Link-Local', 'RFC 4291, Section 2.5.6') - - # Site-Local - elif query_ip.is_site_local: - - return results(True, 'Site-Local', 'RFC 4291, Section 2.5.7') - - # Unique Local Unicast - elif query_ip.is_private: - - return results(True, 'Unique Local Unicast', 'RFC 4193') - - return results(False, '', '') - - -def unique_everseen(iterable, key=None): - """ - The generator to list unique elements, preserving the order. Remember all - elements ever seen. This was taken from the itertools recipes. - - Args: - iterable (:obj:`iter`): An iterable to process. - key (:obj:`callable`): Optional function to run when checking - elements (e.g., str.lower) - - Yields: - The next unique element found. - """ - - seen = set() - seen_add = seen.add - - if key is None: - - for element in filterfalse(seen.__contains__, iterable): - - seen_add(element) - yield element - - else: - - for element in iterable: - - k = key(element) - - if k not in seen: - - seen_add(k) - yield element - - -def unique_addresses(data=None, file_path=None): - """ - The function to search an input string and/or file, extracting and - counting IPv4/IPv6 addresses/networks. Summarizes ports with sub-counts. - If both a string and file_path are provided, it will process them both. - - Args: - data (:obj:`str`): The data to process. - file_path (:obj:`str`): An optional file path to process. - - Returns: - dict: The addresses/networks mapped to ports and counts: - - :: - - { - '1.2.3.4' (dict) - Each address or network found is a - dictionary: - { - 'count' (int) - Total number of times seen. - 'ports' (dict) - Mapping of port numbers as keys and - the number of times seen for this ip as values. - } - } - - Raises: - ValueError: Arguments provided are invalid. - """ - - if not data and not file_path: - - raise ValueError('No data or file path provided.') - - ret = {} - base = { - 'count': 0, - 'ports': {} - } - - file_data = None - if file_path: - - log.debug('Opening file for unique address analysis: {0}'.format( - str(file_path))) - - f = open(str(file_path), 'r') - - # Read the file. - file_data = f.read() - - pattern = re.compile( - str(IP_REGEX), - re.DOTALL - ) - - # Check if there is data. - log.debug('Analyzing input/file data'.format( - str(file_path))) - for input_data in [data, file_data]: - - if input_data: - - # Search for IPs. - for match in pattern.finditer(input_data): - - is_net = False - port = None - try: - - found = match.group('ip') - - if '.' in found and ':' in found: - - split = found.split(':') - ip_or_net = split[0] - port = split[1] - - elif '[' in found: - - split = found.split(']:') - ip_or_net = split[0][1:] - port = split[1] - - elif '/' in found: - - is_net = True - ip_or_net = found - - else: - - ip_or_net = found - - if is_net: - - ip_obj = ip_network(ip_or_net) - - else: - ip_obj = ip_address(ip_or_net) - - obj_str = ip_obj.__str__() - - if obj_str not in ret.keys(): - - ret[obj_str] = copy.deepcopy(base) - - ret[obj_str]['count'] += 1 - - if port: - - try: - - ret[obj_str]['ports'][str(port)] += 1 - - except KeyError: - - ret[obj_str]['ports'][str(port)] = 1 - - except (KeyError, ValueError): - - continue - - return ret - - -def ipv4_generate_random(total=100): - """ - The generator to produce random, unique IPv4 addresses that are not - defined (can be looked up using ipwhois). - - Args: - total (:obj:`int`): The total number of IPv4 addresses to generate. - - Yields: - str: The next IPv4 address. - """ - - count = 0 - yielded = set() - while count < total: - - address = str(IPv4Address(random.randint(0, 2**32-1))) - - if not ipv4_is_defined(address)[0] and address not in yielded: - - count += 1 - yielded.add(address) - yield address - - -def ipv6_generate_random(total=100): - """ - The generator to produce random, unique IPv6 addresses that are not - defined (can be looked up using ipwhois). - - Args: - total (:obj:`int`): The total number of IPv6 addresses to generate. - - Yields: - str: The next IPv6 address. - """ - - count = 0 - yielded = set() - while count < total: - - address = str(IPv6Address(random.randint(0, 2**128-1))) - - if not ipv6_is_defined(address)[0] and address not in yielded: - - count += 1 - yielded.add(address) - yield address diff --git a/env/lib/python3.7/site-packages/ipwhois/whois.py b/env/lib/python3.7/site-packages/ipwhois/whois.py deleted file mode 100644 index f3f6333..0000000 --- a/env/lib/python3.7/site-packages/ipwhois/whois.py +++ /dev/null @@ -1,809 +0,0 @@ -# Copyright (c) 2013-2019 Philip Hane -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. - -import sys -import re -import copy -from datetime import datetime -import logging -from .utils import unique_everseen -from . import (BlacklistError, WhoisLookupError, NetError) - -if sys.version_info >= (3, 3): # pragma: no cover - from ipaddress import (ip_address, - ip_network, - summarize_address_range, - collapse_addresses) -else: # pragma: no cover - from ipaddr import (IPAddress as ip_address, - IPNetwork as ip_network, - summarize_address_range, - collapse_address_list as collapse_addresses) - -log = logging.getLogger(__name__) - -# Legacy base whois output dictionary. -BASE_NET = { - 'cidr': None, - 'name': None, - 'handle': None, - 'range': None, - 'description': None, - 'country': None, - 'state': None, - 'city': None, - 'address': None, - 'postal_code': None, - 'emails': None, - 'created': None, - 'updated': None -} - -RIR_WHOIS = { - 'arin': { - 'server': 'whois.arin.net', - 'fields': { - 'name': r'(NetName):[^\S\n]+(?P.+?)\n', - 'handle': r'(NetHandle):[^\S\n]+(?P.+?)\n', - 'description': r'(OrgName|CustName):[^\S\n]+(?P.+?)' - '(?=(\n\S):?)', - 'country': r'(Country):[^\S\n]+(?P.+?)\n', - 'state': r'(StateProv):[^\S\n]+(?P.+?)\n', - 'city': r'(City):[^\S\n]+(?P.+?)\n', - 'address': r'(Address):[^\S\n]+(?P.+?)(?=(\n\S):?)', - 'postal_code': r'(PostalCode):[^\S\n]+(?P.+?)\n', - 'emails': ( - r'.+?:.*?[^\S\n]+(?P[\w\-\.]+?@[\w\-\.]+\.[\w\-]+)(' - '[^\S\n]+.*?)*?\n' - ), - 'created': r'(RegDate):[^\S\n]+(?P.+?)\n', - 'updated': r'(Updated):[^\S\n]+(?P.+?)\n', - }, - 'dt_format': '%Y-%m-%d' - }, - 'ripencc': { - 'server': 'whois.ripe.net', - 'fields': { - 'name': r'(netname):[^\S\n]+(?P.+?)\n', - 'handle': r'(nic-hdl):[^\S\n]+(?P.+?)\n', - 'description': r'(descr):[^\S\n]+(?P.+?)(?=(\n\S):?)', - 'country': r'(country):[^\S\n]+(?P.+?)\n', - 'address': r'(address):[^\S\n]+(?P.+?)(?=(\n\S):?)', - 'emails': ( - r'.+?:.*?[^\S\n]+(?P[\w\-\.]+?@[\w\-\.]+\.[\w\-]+)(' - '[^\S\n]+.*?)*?\n' - ), - 'created': ( - r'(created):[^\S\n]+(?P[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]' - '{2}:[0-9]{2}:[0-9]{2}Z).*?\n' - ), - 'updated': ( - r'(last-modified):[^\S\n]+(?P[0-9]{4}-[0-9]{2}-[0-9]{2}T' - '[0-9]{2}:[0-9]{2}:[0-9]{2}Z).*?\n' - ) - }, - 'dt_format': '%Y-%m-%dT%H:%M:%SZ' - }, - 'apnic': { - 'server': 'whois.apnic.net', - 'fields': { - 'name': r'(netname):[^\S\n]+(?P.+?)\n', - 'handle': r'(nic-hdl):[^\S\n]+(?P.+?)\n', - 'description': r'(descr):[^\S\n]+(?P.+?)(?=(\n\S):?)', - 'country': r'(country):[^\S\n]+(?P.+?)\n', - 'address': r'(address):[^\S\n]+(?P.+?)(?=(\n\S):?)', - 'emails': ( - r'.+?:.*?[^\S\n]+(?P[\w\-\.]+?@[\w\-\.]+\.[\w\-]+)(' - '[^\S\n]+.*?)*?\n' - ), - 'updated': r'(changed):[^\S\n]+.*(?P[0-9]{8}).*?\n' - }, - 'dt_format': '%Y%m%d' - }, - 'lacnic': { - 'server': 'whois.lacnic.net', - 'fields': { - 'handle': r'(nic-hdl):[^\S\n]+(?P.+?)\n', - 'description': r'(owner):[^\S\n]+(?P.+?)(?=(\n\S):?)', - 'country': r'(country):[^\S\n]+(?P.+?)\n', - 'emails': ( - r'.+?:.*?[^\S\n]+(?P[\w\-\.]+?@[\w\-\.]+\.[\w\-]+)(' - '[^\S\n]+.*?)*?\n' - ), - 'created': r'(created):[^\S\n]+(?P[0-9]{8}).*?\n', - 'updated': r'(changed):[^\S\n]+(?P[0-9]{8}).*?\n' - }, - 'dt_format': '%Y%m%d' - }, - 'afrinic': { - 'server': 'whois.afrinic.net', - 'fields': { - 'name': r'(netname):[^\S\n]+(?P.+?)\n', - 'handle': r'(nic-hdl):[^\S\n]+(?P.+?)\n', - 'description': r'(descr):[^\S\n]+(?P.+?)(?=(\n\S):?)', - 'country': r'(country):[^\S\n]+(?P.+?)\n', - 'address': r'(address):[^\S\n]+(?P.+?)(?=(\n\S):?)', - 'emails': ( - r'.+?:.*?[^\S\n]+(?P[\w\-\.]+?@[\w\-\.]+\.[\w\-]+)(' - '[^\S\n]+.*?)*?\n' - ), - } - } -} - -RWHOIS = { - 'fields': { - 'cidr': r'(network:IP-Network):(?P.+?)\n', - 'name': r'(network:ID):(?P.+?)\n', - 'description': ( - r'(network:(Org-Name|Organization(;I)?)):(?P.+?)\n' - ), - 'country': r'(network:(Country|Country-Code)):(?P.+?)\n', - 'state': r'(network:State):(?P.+?)\n', - 'city': r'(network:City):(?P.+?)\n', - 'address': r'(network:Street-Address):(?P.+?)\n', - 'postal_code': r'(network:Postal-Code):(?P.+?)\n', - 'emails': ( - r'.+?:.*?[^\S\n]+(?P[\w\-\.]+?@[\w\-\.]+\.[\w\-]+)(' - '[^\S\n]+.*?)*?\n' - ), - 'created': r'(network:Created):(?P.+?)\n', - 'updated': r'(network:Updated):(?P.+?)\n' - } -} - -ASN_REFERRALS = { - 'whois://whois.ripe.net': 'ripencc', - 'whois://whois.apnic.net': 'apnic', - 'whois://whois.lacnic.net': 'lacnic', - 'whois://whois.afrinic.net': 'afrinic', -} - - -class Whois: - """ - The class for parsing via whois - - Args: - net (:obj:`ipwhois.net.Net`): The network object. - - Raises: - NetError: The parameter provided is not an instance of - ipwhois.net.Net - IPDefinedError: The address provided is defined (does not need to be - resolved). - """ - - def __init__(self, net): - - from .net import Net - - # ipwhois.net.Net validation - if isinstance(net, Net): - - self._net = net - - else: - - raise NetError('The provided net parameter is not an instance of ' - 'ipwhois.net.Net') - - def parse_fields(self, response, fields_dict, net_start=None, - net_end=None, dt_format=None, field_list=None): - """ - The function for parsing whois fields from a data input. - - Args: - response (:obj:`str`): The response from the whois/rwhois server. - fields_dict (:obj:`dict`): The mapping of fields to regex search - values (required). - net_start (:obj:`int`): The starting point of the network (if - parsing multiple networks). Defaults to None. - net_end (:obj:`int`): The ending point of the network (if parsing - multiple networks). Defaults to None. - dt_format (:obj:`str`): The format of datetime fields if known. - Defaults to None. - field_list (:obj:`list` of :obj:`str`): If provided, fields to - parse. Defaults to: - - :: - - ['name', 'handle', 'description', 'country', 'state', - 'city', 'address', 'postal_code', 'emails', 'created', - 'updated'] - - Returns: - dict: A dictionary of fields provided in fields_dict, mapping to - the results of the regex searches. - """ - - ret = {} - - if not field_list: - - field_list = ['name', 'handle', 'description', 'country', 'state', - 'city', 'address', 'postal_code', 'emails', - 'created', 'updated'] - - generate = ((field, pattern) for (field, pattern) in - fields_dict.items() if field in field_list) - - for field, pattern in generate: - - pattern = re.compile( - str(pattern), - re.DOTALL - ) - - if net_start is not None: - - match = pattern.finditer(response, net_end, net_start) - - elif net_end is not None: - - match = pattern.finditer(response, net_end) - - else: - - match = pattern.finditer(response) - - values = [] - sub_section_end = None - for m in match: - - if sub_section_end: - - if field not in ( - 'emails' - ) and (sub_section_end != (m.start() - 1)): - - break - - try: - - values.append(m.group('val').strip()) - - except IndexError: - - pass - - sub_section_end = m.end() - - if len(values) > 0: - - value = None - try: - - if field == 'country': - - value = values[0].upper() - - elif field in ['created', 'updated'] and dt_format: - - value = datetime.strptime( - values[0], - str(dt_format)).isoformat('T') - - elif field in ['emails']: - - value = list(unique_everseen(values)) - - else: - - values = unique_everseen(values) - value = '\n'.join(values).strip() - - except ValueError as e: - - log.debug('Whois field parsing failed for {0}: {1}'.format( - field, e)) - pass - - ret[field] = value - - return ret - - def _parse_fields(self, *args, **kwargs): - """ - Deprecated. This will be removed in a future release. - """ - - from warnings import warn - warn('Whois._parse_fields() has been deprecated and will be ' - 'removed. You should now use Whois.parse_fields().') - return self.parse_fields(*args, **kwargs) - - def get_nets_arin(self, response): - """ - The function for parsing network blocks from ARIN whois data. - - Args: - response (:obj:`str`): The response from the ARIN whois server. - - Returns: - list of dict: Mapping of networks with start and end positions. - - :: - - [{ - 'cidr' (str) - The network routing block - 'start' (int) - The starting point of the network - 'end' (int) - The endpoint point of the network - }] - """ - - nets = [] - - # Find the first NetRange value. - pattern = re.compile( - r'^NetRange:[^\S\n]+(.+)$', - re.MULTILINE - ) - temp = pattern.search(response) - net_range = None - net_range_start = None - if temp is not None: - net_range = temp.group(1).strip() - net_range_start = temp.start() - - # Iterate through all of the networks found, storing the CIDR value - # and the start and end positions. - for match in re.finditer( - r'^CIDR:[^\S\n]+(.+?,[^\S\n].+|.+)$', - response, - re.MULTILINE - ): - - try: - - net = copy.deepcopy(BASE_NET) - - if len(nets) > 0: - temp = pattern.search(response, match.start()) - net_range = None - net_range_start = None - if temp is not None: - net_range = temp.group(1).strip() - net_range_start = temp.start() - - if net_range is not None: - if net_range_start < match.start() or len(nets) > 0: - - try: - - net['range'] = '{0} - {1}'.format( - ip_network(net_range)[0].__str__(), - ip_network(net_range)[-1].__str__() - ) if '/' in net_range else net_range - - except ValueError: # pragma: no cover - - net['range'] = net_range - - net['cidr'] = ', '.join( - [ip_network(c.strip()).__str__() - for c in match.group(1).split(', ')] - ) - net['start'] = match.start() - net['end'] = match.end() - nets.append(net) - - except ValueError: - - pass - - return nets - - def _get_nets_arin(self, *args, **kwargs): - """ - Deprecated. This will be removed in a future release. - """ - - from warnings import warn - warn('Whois._get_nets_arin() has been deprecated and will be ' - 'removed. You should now use Whois.get_nets_arin().') - return self.get_nets_arin(*args, **kwargs) - - def get_nets_lacnic(self, response): - """ - The function for parsing network blocks from LACNIC whois data. - - Args: - response (:obj:`str`): The response from the LACNIC whois server. - - Returns: - list of dict: Mapping of networks with start and end positions. - - :: - - [{ - 'cidr' (str) - The network routing block - 'start' (int) - The starting point of the network - 'end' (int) - The endpoint point of the network - }] - """ - - nets = [] - - # Iterate through all of the networks found, storing the CIDR value - # and the start and end positions. - for match in re.finditer( - r'^(inetnum|inet6num|route):[^\S\n]+(.+?,[^\S\n].+|.+)$', - response, - re.MULTILINE - ): - - try: - - net = copy.deepcopy(BASE_NET) - net_range = match.group(2).strip() - - try: - - net['range'] = net['range'] = '{0} - {1}'.format( - ip_network(net_range)[0].__str__(), - ip_network(net_range)[-1].__str__() - ) if '/' in net_range else net_range - - except ValueError: # pragma: no cover - - net['range'] = net_range - - temp = [] - for addr in net_range.split(', '): - - count = addr.count('.') - if count is not 0 and count < 4: - - addr_split = addr.strip().split('/') - for i in range(count + 1, 4): - addr_split[0] += '.0' - - addr = '/'.join(addr_split) - - temp.append(ip_network(addr.strip()).__str__()) - - net['cidr'] = ', '.join(temp) - net['start'] = match.start() - net['end'] = match.end() - nets.append(net) - - except ValueError: - - pass - - return nets - - def _get_nets_lacnic(self, *args, **kwargs): - """ - Deprecated. This will be removed in a future release. - """ - - from warnings import warn - warn('Whois._get_nets_lacnic() has been deprecated and will be ' - 'removed. You should now use Whois.get_nets_lacnic().') - return self.get_nets_lacnic(*args, **kwargs) - - def get_nets_other(self, response): - """ - The function for parsing network blocks from generic whois data. - - Args: - response (:obj:`str`): The response from the whois/rwhois server. - - Returns: - list of dict: Mapping of networks with start and end positions. - - :: - - [{ - 'cidr' (str) - The network routing block - 'start' (int) - The starting point of the network - 'end' (int) - The endpoint point of the network - }] - """ - - nets = [] - - # Iterate through all of the networks found, storing the CIDR value - # and the start and end positions. - for match in re.finditer( - r'^(inetnum|inet6num|route):[^\S\n]+((.+?)[^\S\n]-[^\S\n](.+)|' - '.+)$', - response, - re.MULTILINE - ): - - try: - - net = copy.deepcopy(BASE_NET) - net_range = match.group(2).strip() - - try: - - net['range'] = net['range'] = '{0} - {1}'.format( - ip_network(net_range)[0].__str__(), - ip_network(net_range)[-1].__str__() - ) if '/' in net_range else net_range - - except ValueError: # pragma: no cover - - net['range'] = net_range - - if match.group(3) and match.group(4): - - addrs = [] - addrs.extend(summarize_address_range( - ip_address(match.group(3).strip()), - ip_address(match.group(4).strip()))) - - cidr = ', '.join( - [i.__str__() for i in collapse_addresses(addrs)] - ) - - else: - - cidr = ip_network(net_range).__str__() - - net['cidr'] = cidr - net['start'] = match.start() - net['end'] = match.end() - nets.append(net) - - except (ValueError, TypeError): - - pass - - return nets - - def _get_nets_other(self, *args, **kwargs): - """ - Deprecated. This will be removed in a future release. - """ - - from warnings import warn - warn('Whois._get_nets_other() has been deprecated and will be ' - 'removed. You should now use Whois.get_nets_other().') - return self.get_nets_other(*args, **kwargs) - - def lookup(self, inc_raw=False, retry_count=3, response=None, - get_referral=False, extra_blacklist=None, - ignore_referral_errors=False, asn_data=None, - field_list=None, is_offline=False): - """ - The function for retrieving and parsing whois information for an IP - address via port 43/tcp (WHOIS). - - Args: - inc_raw (:obj:`bool`, optional): Whether to include the raw - results in the returned dictionary. Defaults to False. - retry_count (:obj:`int`): The number of times to retry in case - socket errors, timeouts, connection resets, etc. are - encountered. Defaults to 3. - response (:obj:`str`): Optional response object, this bypasses the - NIR lookup. Required when is_offline=True. - get_referral (:obj:`bool`): Whether to retrieve referral whois - information, if available. Defaults to False. - extra_blacklist (:obj:`list`): Blacklisted whois servers in - addition to the global BLACKLIST. Defaults to None. - ignore_referral_errors (:obj:`bool`): Whether to ignore and - continue when an exception is encountered on referral whois - lookups. Defaults to False. - asn_data (:obj:`dict`): Result from - :obj:`ipwhois.asn.IPASN.lookup` (required). - field_list (:obj:`list` of :obj:`str`): If provided, fields to - parse. Defaults to: - - :: - - ['name', 'handle', 'description', 'country', 'state', - 'city', 'address', 'postal_code', 'emails', 'created', - 'updated'] - - is_offline (:obj:`bool`): Whether to perform lookups offline. If - True, response and asn_data must be provided. Primarily used - for testing. Defaults to False. - - Returns: - dict: The IP whois lookup results - - :: - - { - 'query' (str) - The IP address - 'asn' (str) - The Autonomous System Number - 'asn_date' (str) - The ASN Allocation date - 'asn_registry' (str) - The assigned ASN registry - 'asn_cidr' (str) - The assigned ASN CIDR - 'asn_country_code' (str) - The assigned ASN country code - 'asn_description' (str) - The ASN description - 'nets' (list) - Dictionaries containing network - information which consists of the fields listed in the - ipwhois.whois.RIR_WHOIS dictionary. - 'raw' (str) - Raw whois results if the inc_raw parameter - is True. - 'referral' (dict) - Referral whois information if - get_referral is True and the server is not blacklisted. - Consists of fields listed in the ipwhois.whois.RWHOIS - dictionary. - 'raw_referral' (str) - Raw referral whois results if the - inc_raw parameter is True. - } - """ - - # Create the return dictionary. - results = { - 'query': self._net.address_str, - 'nets': [], - 'raw': None, - 'referral': None, - 'raw_referral': None - } - - # The referral server and port. Only used if get_referral is True. - referral_server = None - referral_port = 0 - - # Only fetch the response if we haven't already. - if response is None or (not is_offline and - asn_data['asn_registry'] is not 'arin'): - - log.debug('Response not given, perform WHOIS lookup for {0}' - .format(self._net.address_str)) - - # Retrieve the whois data. - response = self._net.get_whois( - asn_registry=asn_data['asn_registry'], retry_count=retry_count, - extra_blacklist=extra_blacklist - ) - - if get_referral: - - # Search for a referral server. - for match in re.finditer( - r'^ReferralServer:[^\S\n]+(.+:[0-9]+)$', - response, - re.MULTILINE - ): - - try: - - temp = match.group(1) - if 'rwhois://' not in temp: # pragma: no cover - raise ValueError - - temp = temp.replace('rwhois://', '').split(':') - - if int(temp[1]) > 65535: # pragma: no cover - raise ValueError - - referral_server = temp[0] - referral_port = int(temp[1]) - - except (ValueError, KeyError): # pragma: no cover - - continue - - break - - # Retrieve the referral whois data. - if get_referral and referral_server: - - log.debug('Perform referral WHOIS lookup') - - response_ref = None - - try: - - response_ref = self._net.get_whois( - asn_registry='', retry_count=retry_count, - server=referral_server, port=referral_port, - extra_blacklist=extra_blacklist - ) - - except (BlacklistError, WhoisLookupError): - - if ignore_referral_errors: - - pass - - else: - - raise - - if response_ref: - - log.debug('Parsing referral WHOIS data') - - if inc_raw: - - results['raw_referral'] = response_ref - - temp_rnet = self.parse_fields( - response_ref, - RWHOIS['fields'], - field_list=field_list - ) - - # Add the networks to the return dictionary. - results['referral'] = temp_rnet - - # If inc_raw parameter is True, add the response to return dictionary. - if inc_raw: - - results['raw'] = response - - nets = [] - - if asn_data['asn_registry'] == 'arin': - - nets_response = self.get_nets_arin(response) - - elif asn_data['asn_registry'] == 'lacnic': - - nets_response = self.get_nets_lacnic(response) - - else: - - nets_response = self.get_nets_other(response) - - nets.extend(nets_response) - - # Iterate through all of the network sections and parse out the - # appropriate fields for each. - log.debug('Parsing WHOIS data') - for index, net in enumerate(nets): - - section_end = None - if index + 1 < len(nets): - - section_end = nets[index + 1]['start'] - - try: - - dt_format = RIR_WHOIS[results['asn_registry']]['dt_format'] - - except KeyError: - - dt_format = None - - temp_net = self.parse_fields( - response, - RIR_WHOIS[asn_data['asn_registry']]['fields'], - section_end, - net['end'], - dt_format, - field_list - ) - - # Merge the net dictionaries. - net.update(temp_net) - - # The start and end values are no longer needed. - del net['start'], net['end'] - - # Add the networks to the return dictionary. - results['nets'] = nets - - return results diff --git a/env/lib/python3.7/site-packages/pip/__init__.py b/env/lib/python3.7/site-packages/pip/__init__.py deleted file mode 100644 index 5d05da3..0000000 --- a/env/lib/python3.7/site-packages/pip/__init__.py +++ /dev/null @@ -1 +0,0 @@ -__version__ = "19.1.1" diff --git a/env/lib/python3.7/site-packages/pip/__main__.py b/env/lib/python3.7/site-packages/pip/__main__.py deleted file mode 100644 index 0c223f8..0000000 --- a/env/lib/python3.7/site-packages/pip/__main__.py +++ /dev/null @@ -1,19 +0,0 @@ -from __future__ import absolute_import - -import os -import sys - -# If we are running from a wheel, add the wheel to sys.path -# This allows the usage python pip-*.whl/pip install pip-*.whl -if __package__ == '': - # __file__ is pip-*.whl/pip/__main__.py - # first dirname call strips of '/__main__.py', second strips off '/pip' - # Resulting path is the name of the wheel itself - # Add that to sys.path so we can import pip - path = os.path.dirname(os.path.dirname(__file__)) - sys.path.insert(0, path) - -from pip._internal import main as _main # isort:skip # noqa - -if __name__ == '__main__': - sys.exit(_main()) diff --git a/env/lib/python3.7/site-packages/pip/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 387875bba8e5112289cde2a9cdb6befefc3e37b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 154 zcmZ?b<>g`kg1p5NvEo4bF^B^Lj6jA15EpX*i4=w?h7`tN22G|aHbYB2Lp?)3O~zZ? z@$qG;Ma7xqG0k?n}P zmt;$iqdy$?xW^Th8Pp1aB<;z-%=L+xR8x%POi*CeGCP)X`i}afOdio<^bPya0>@MS z>|5Oh$&|6J3lA|>bHh~=3&v7pY%z}$#_BF~PBP};6DX3_$IKsmoHAzl%Z|T7E9RDm zO&km58g67#sFhBQk!rkjA(mFz6;n-+Fri(Zr0B3F4JT4kk$V+BkvoU(06)uhFm?^x vCFlgM^-{bYn*CM1NyWkck6qbAEUrx}IxTN7DEKpg87Xj)7xV(pNy>i#`#*4r diff --git a/env/lib/python3.7/site-packages/pip/_internal/__init__.py b/env/lib/python3.7/site-packages/pip/_internal/__init__.py deleted file mode 100644 index 9c1637c..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/__init__.py +++ /dev/null @@ -1,78 +0,0 @@ -#!/usr/bin/env python -from __future__ import absolute_import - -import locale -import logging -import os -import warnings - -import sys - -# 2016-06-17 barry@debian.org: urllib3 1.14 added optional support for socks, -# but if invoked (i.e. imported), it will issue a warning to stderr if socks -# isn't available. requests unconditionally imports urllib3's socks contrib -# module, triggering this warning. The warning breaks DEP-8 tests (because of -# the stderr output) and is just plain annoying in normal usage. I don't want -# to add socks as yet another dependency for pip, nor do I want to allow-stderr -# in the DEP-8 tests, so just suppress the warning. pdb tells me this has to -# be done before the import of pip.vcs. -from pip._vendor.urllib3.exceptions import DependencyWarning -warnings.filterwarnings("ignore", category=DependencyWarning) # noqa - -# We want to inject the use of SecureTransport as early as possible so that any -# references or sessions or what have you are ensured to have it, however we -# only want to do this in the case that we're running on macOS and the linked -# OpenSSL is too old to handle TLSv1.2 -try: - import ssl -except ImportError: - pass -else: - # Checks for OpenSSL 1.0.1 on MacOS - if sys.platform == "darwin" and ssl.OPENSSL_VERSION_NUMBER < 0x1000100f: - try: - from pip._vendor.urllib3.contrib import securetransport - except (ImportError, OSError): - pass - else: - securetransport.inject_into_urllib3() - -from pip._internal.cli.autocompletion import autocomplete -from pip._internal.cli.main_parser import parse_command -from pip._internal.commands import commands_dict -from pip._internal.exceptions import PipError -from pip._internal.utils import deprecation -from pip._internal.vcs import git, mercurial, subversion, bazaar # noqa -from pip._vendor.urllib3.exceptions import InsecureRequestWarning - -logger = logging.getLogger(__name__) - -# Hide the InsecureRequestWarning from urllib3 -warnings.filterwarnings("ignore", category=InsecureRequestWarning) - - -def main(args=None): - if args is None: - args = sys.argv[1:] - - # Configure our deprecation warnings to be sent through loggers - deprecation.install_warning_logger() - - autocomplete() - - try: - cmd_name, cmd_args = parse_command(args) - except PipError as exc: - sys.stderr.write("ERROR: %s" % exc) - sys.stderr.write(os.linesep) - sys.exit(1) - - # Needed for locale.getpreferredencoding(False) to work - # in pip._internal.utils.encoding.auto_decode - try: - locale.setlocale(locale.LC_ALL, '') - except locale.Error as e: - # setlocale can apparently crash if locale are uninitialized - logger.debug("Ignoring error %s when setting locale", e) - command = commands_dict[cmd_name](isolated=("--isolated" in cmd_args)) - return command.main(cmd_args) diff --git a/env/lib/python3.7/site-packages/pip/_internal/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 01c8bb79e5e6ba0530a5992e25aa5dddddad9313..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1798 zcmZuxUvC^W5VyU1dwZMvmrHt0+9thFf)pSr2&qV@LeLV4ppaCFpkW1CZO+bhFW%j& z?Mr&mr7wlYeus;ALgKj}fREuPB%b;ecw+3mR4K65j>luq?9BXr-Uqc>fZ)k~UHIwV z3_^dI#pP20?*P0Tli3T11?MZgmCl88RuA}mdM&(W^%>qyuZP#IUgZnv zVz_Aa8o!a=3~yS!&Tpkl;ZnLBE~mG{+i554SbGDiS_xO6DrfQzyK{lVcc=BO6!p;- zZPMAFakxs!K3bc5ZF;(fbt68MIUgz(CFvj+Y6onyU$FtpD9gH|$Fazgtf#%Cm*s-N zrr(Vf>*ZpkJsOMCBug4i)HIPK>kb7|BF?0V1g2^{RCzZ~2b?M6TN}hevIs0`oKa(# zsxqQU*Le7klEJ1Bxd45JvVmamxg^ilT;^!EhI~bjP2;Sw1Ps!M6qYEHpu~wCSP^>016dUcaAprP1 zcMc4#$N?I)RCQ8Q)qb5i7eGXa{t-m4_8SoY4~XwV{HAJ7W~n=NixW16``o>Zp;}|S zh-hg{jy>wV#OI}PX)-q^7Z{)}@4Pm}pH(*Z_ICF^>#RzR&Q`Y!o`7tJnQnuzbNYm3 z9m$k3R-Sib&d!4M^#tevh#R#0H~PGG(KrJjs}31MRYBfUsA5T2~;Isp@S%jK197)+NgfbHaqy zCCUzmJz>z)ZW<@qnrAbTz|oXOS)8&$gDj`R1|FtM&b^5--B0nKp^bny5kd%5Ztt*j&HdH zw{VLrgS4mD@Xp$MI*6j9p@N$dMS_5*SONiEfTE!D;)YrI(=JMJ4VK|DWU>*Rz@5y+ z#!zsc9DcF^^{|1t8&WvNr+$=hNb}MY5RzQaY}s2~G|nFYl1I5nb$j>G=Fa~9cJ%$` z-u~9^PPFsgw+}Y=^v(bKP&dz%NDf8W=DE9XgN1WR)@NO1dXq=foOH+fU$$$b%ae^O zzW~V9@7v{JI#c{JWC8cW+nZNfVOci!_V!REToyE)eS7DmD@6^; z5_KaQMl_9>1)(cFrnU>J`H`g)Ahu$*4fK{hSHuU##lN5CbjaD~23Tp>Q6)Z50|xPf eDz1A3gT$UQj}1{;*dsovf~^<}xJm-2?)(E%C-a&B diff --git a/env/lib/python3.7/site-packages/pip/_internal/__pycache__/build_env.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/__pycache__/build_env.cpython-37.pyc deleted file mode 100644 index 8cb8c4b6dd438bf3097dad5ead2a810d0a93b838..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7395 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 diff --git a/env/lib/python3.7/site-packages/pip/_internal/__pycache__/cache.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/__pycache__/cache.cpython-37.pyc deleted file mode 100644 index 5231c3e4ce64b60838be0dc8565b535a6c25eddc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7006 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 diff --git a/env/lib/python3.7/site-packages/pip/_internal/__pycache__/configuration.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/__pycache__/configuration.cpython-37.pyc deleted file mode 100644 index adff3430a9f24cf7c135aa0b816349386a6e0d7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9700 zcmb7KTXP#ncAgu60SJ;1MTwLw%VSxV1V@A~Ygaa2*|Dsfxt3wBWLq+_uJH)n1cw~V zKs^JAfWd6aa-|7l4@uSdbd!g6jZ5}30%#&`XRJtFvxs!0w_QNQM zTD^Bm8&2r8dC76E$IesXCkYQ7KXjUEAZObTcw9rLCtlE{USH7O@!~jY`d-4B^VCmv z94{SY!`b6KbgE-SjL?4MhvOc8ayiB%nrdEGMh7)|bybZnd@oFB7EbJkt$;gEBf%WT zKD7PhY__N<56ag1gKY(&Ayajj67D^5xc-?v0Ob-T2tO_j$d(S-(>)Nb`Ewlh#eY znMivR%JUutTv~ViIFW@qfBIRk!=?RcheYcIGWS`xL-#-SL)L^zs2}YuY&WpQub~-e zL+wx-Dt|aM4(Qxq=AkYw4K!x4+#effG`b4Q%J*-7;_X4{O35Vt7_TOy5?H!mu#nh^ zww*ZYiY9li@bHN*qEMM#B$NqNp;^a~y8ENP(Kj|WelReFdexM9REnq^o#!v4cCBq z8sQzVuKH_j8+ga8?}`oRnB{>lIaXjc_IXxhCF~1qft9hh*&sBMmbN9LCqBT# z@d(Ud6WcH@Cy5-d*@U$co?xtWAUc^DV+?v~q|bKz*l7k(A$5AfVVq89YV_+{n*b#* zaT2&l>|7Wl8^IFU*###~dI2G)L*Pg=Vz?9ubS5xMp=%yb{R9x}T$l{f4H*~ofEs9w zqvN+-sHMwRlZ9tQPh)2ruIFLqd`1KcMFH>h>PHcfn-0dq(bUGT7{A)_fVv&bmWwCA zay*LhxEJ?GnrVEYSGDO5jdhG9)s#nLJIqVGbp03%(g@Iosb2M_sZ2KoD+=#) z9{)9(L`(F6_RJU>hnlV>=B|Y;hb_;vmUUnbjDfjV5I;`}Ods0J7#5RKvM?~2#!LdU zXU3s^s6W%c)dv{IEu+8YE{?{avGUlKur0T8xKkkzY*C*REYAwx0RVO@H(~6!vcl}S zD<@mH@2)a}%VNF%&YdWMK%iTnjWkT^2oOlzC=7beh7<2ld~qIeCknA`JKr4ijjPTN z|An6{z|LZzxwLk8(8)lFV1u0dKFMSSjgPl}RXWh|cKy$c$JYHR{6T~OMt9!drr~JpyxxE9#&mG4xjgOW2nU+WM!DS5&4H3QnZc8`xrsOliQ^$&U5-G=+QeBc{V* zjs7j-I11sW*dwv1}r(y;m;+yhw_VG7X1@=}t!I@kT(N&6G8N=bq=%yM8d)2 z4sR+OaXb}TMwdDB6T}{&XoQuT%F=aE1wlkErKP9b7EeZ|E#mPau+*h>T{H^}Jz#@hs{6^Rreo|ImzdGixGPCg~3KL&7_~|Mgg26f`DW zJaz&fw2^S823FIKuT;SpRV)c<j-jsz;l&82ZsZGn=8+l2;QjeUt+uR{OfJpGoLA`2;pX1%q{+RcaRu!0ucW|w0DF2Wq zI?p>vk@ThH{ioi@=XjzO>^#;S($scQEyoNiXbpu{+{2a=~LPJ28>{iub9b0%V}J zC-z+Q9;0`)kfP8h=p%DVq%yZn{7vRl(3geL$j8$BB3_Vc;0bP8JBYQx4GjKI8{yr(*0GDuSaNA?3PTn9*&;Q@a>0!ib* zPVIgGg0*Lhzr~Y_^dyCq;Sy0W(s5{GewLzI*{lcpd#ShN`d2>>vGo6=>W}f3+x@q1 zgGC0;<|x~95V=9G{=jGNz4=wm*#hT{IYCV%6p!|tN8MJfx-340NGEnMak7aK35vgR zQSdhSfE%ftT3Wyip>PEmDc?`z;{7D*Y*HppP%W26-NzO}{H$7>Sd{pj-uneL52&GV zELX<1=ftJDhj(zlQggHP5{@im3Dki= zz62vIflL^B-t3>5g@vinGOQiV8{vMPjPR!R)lC3_eqbcV5M~G?gvt{u z$?fK0V#*|OZVxEx8o#L!Gatgl$VeW5i~mBqr#;jjSLhhg!|K0w9}b-YW>*L*EBN6? z8wwCTBnqHx6CCI-K0x4Ap(Ao$jivsyUM;0s{e4VS=26mWL2{NKf(Mc}Nh6A-)$x)Y zSwNvhd9)REcqnsJ?BYP)572F*A*pZA%iM}F!GA=rQT!xfm(7Y%KEg<-VsiU= zB2FMZlp^6a#7I;oq9jOQsVQirXlmB`mx()oJ$Pg0(43|X%4~X&L9KuBfgc3KFimYH_c|2tg_yao9q9Y#X_c^@)dPf*p@Omjz>KWoarptlgkloct}D7gg)C_QIb>m$bWNUH28}hIZNj44m6(D?n zYhdE+BZOaVx5zBOd7?sUanBTqdO8OHSE2UtUA(b`y9lla$Xj<8NUFm!0sJ;HUP$-u z1MTtq@HV^)rM!3kKTJQPWs0PVm$1Zs5#P%b)$WAI%Q0YCk{iA80>e7?W6p= zwYlZq__Tg|^NxFa^X@HJEv1Bw&2f4n?NRWGQz=VGJM&|FqA;{jvHr>keeH7;r^YA>AE1#pb7BPO4Q=6t1BoUQb zP`E@s&(CRyvdc51p>-T+hMg;ed@O;IQ1yc7 z$ck}J@4qysEl6R;gfd{I(3t`21)NauNOWSq$UU?nvJ$l5ys0&hvasKMF0@U-P-^KY z#>W}B^>go{!@G5ur7~ItBd_7Dg3MR!qk+9s1~nSze<)mto9O)pNrJ>oAaEplDtDin zks2*?d0I9-s$vQyq==s8{*{4&h~OYTfX>7I^fih#pxA2~NPG^-RsNdxxHNX^{y*2p zA3I=TlzI~wXX19e=_sp6!^A^Xm3mZ9cJNa*Wf65jyEs*BC*R?SOvM0k6cPEPwoUco zHgbB!=wfuqmu+G-AhDEy{CRJfw^RvPr+W0;8vdgnWqVY3V)k zW`AD=Txn6*{efmn7M@1N(Q_$MpTRA$M$I)eV~1B_`x+PIiL_SjKH_fA=K-kcyg0u_ zw_BMw%~jCG(}s1_;pcrQlc$LRGI`QysWj6MZp5WjQj4^A7l_@`Qz?aII&W#|8IE&F zK0)f5o%S?yy80; z;1{I$RUBx=C1eZ8i_D5?>nnz3RF0CJBdjg60g7z2-M|(*XbAMNfxeIh#OqXmOTXVR z1Oh}-MT})fr=y3|c+~7sLpi3j@f8){c9NdTzXS7dgBTe9kI7vrTUcRdeD&jYEyGad2 zUR7>Y$RqR7qh0({j}qII)hT*NT9Ed&)N0@0ufFSr3MXer`xDpBKWj!cbA_g+kEiYZJN62mzy^IkS|fE`Ouf^ zYC27SzyG;p3+T7*slD^!=SaY|xTjI&acyo`pN8+i*-sV1UpTyIR{mld3f#yN) zprkX6yPAi*L(RLryCt1%9B$s@-P0_3MM>ux_crhI?vwaX zaO0uoQLiNN0^$#Qk4Su^ajbdVJ1%jjG2u;M+@p;X%}2dQn~!;qN&c?J*g>E`p^^UW8$7n-NN z)6Fy9ndVvVY;)3^Y@YMZHP3tJn-{zb%@@5F<(qwti_Ix-O5*z)FEwBGUY7WQ#--*f z-YXJ6*qCl!_Ac9&|MG{9-iuM+)wt4p)qAyh)w|l9@n)K{-fZ)lcddEdyDncGYP{Bb z-Fsc)cQ@W>dY&io!)WPE?@ilUF?)BzyYZUUI_O&dTT3~#eag1@ryTFb8&=DC-STfJ zXDR!k(|O51?tMnxql)TYb)ULlJ)n-L2h~IBs46WCd1XJn{Irv1m6COmO7yxea}*l`iIsM-aOKesmGCi+&_Ty0@6>YCy{>A--Glb(w|aKA^ntp z5a}AyPpfB;e#RfE*O9ZNURTemd)~9XhCj64R44tRdTYb++LC%MPIc5NRYd>qs86eV z@z&~jbsye=dO_Wfcc@OQ2k>52XVh7|Z>mZ4Al|psIrR|Ux7B%d0q+&{qPmE8S52vx z@cyiNSzW@rr`}N0>L^CBsyuaB9YO3}jP;6o6=QwXf3W^nFxJnhH`RFZ}@mMD|*S- z<$0_EnscwLT$#dq2xDlYO0}(+J&Kj9E|oi#aIxIJ)sltFU|p-_n}`oZV`r{TUYxpq zzI^_5OnqkR^7IULCy2lBZ`ZgXxw%SpX}MEYH65j^SdHbTALUgo=rk%T(snd7-_{s; zIjD90Xb)GUW+vb(_7q?iQA#&M?fcPQd{+x)vC8wh-Q?mm+SMo{`Tp%N8d`33&}Dya z!?S*~bFQZSYS`8*nAO-TZ(Ml;+jM^NRzwjl^@rz{(Bu zHOP>L`AH6+uv8jGd{EH;bTJG&Qksj~Ld{ab8$Nq&>e9Kggj46dj7cKqOiopK0{cJE zOluNPFoqxm^;FJ#R%oBI*6cMK=QYuNAy>rjsvj=vR`J%NA1?a3SPP4dc6%u(Hfl?L zu~X|5Ye7*jw_3H?{a>{-2mJBVC&Fgu1iC&RgV}NQ&Pwa{WAls5 zlm`F^Jb|q~p<=L@=&XF4J+@Bge|R2oB}jf8o~1ugUT2~ zqS9K4_D@cg&re^Ux_Wu~6=I6(XRc12IeY2+j0|f_a1ISe!?H~MX1#ugRz_b$yoyJD zX@q=aE6!m^N>)WV-*7@_J+T3n18;Z3s@cl@Mq(9fr;-Pdizl_@=(DC)oSQynwZ68c zMg}#$7AEVddRk=>Z!xZNYUmf81JvyutY@w7R(IE|4M!!=p0hqKrN3!nTS^a0=^iQl zJ(MDb7VkmsUbOZ{;lBEQq>D%&Q1@b1$zD?Bz;M|5r@bUf?nBAJH4ChXtL|?(Du=uW zkat)8(E8o#$cDX|>S5o=qUeWvDU?2V%2E&25BIF_o;uh6D43Pf2MP7?2PC$Sbf4OK zcq_#q)I6Zt?*KOfX)%HGTwD%tU@JHlp*gcr0!OF>umVU%=@@xS3RF7VN9#IDbymVf zp!EW1c*Aevdm&c(75Q%Rij?Y?m?CjniIVd*9LMR8hzBBjVjFI7kvD@U7)P*xm3u3{ zic`=7BKoTHjyq${J+N>B)4<@)NE^3zoVbs3ry8JG)poP<{0dv+`A%8g!<=K;%yIK@ z52{9~m&{ahQ@}T7;87AtdHJ>`0wWm!wFCPx7&EikxQsc22-e>|K>X!Qf5bu=S;^M3 z{kR#b;DyYoMx{BYD$oBS3jaGEt9$6qBQ(__r>6c~J!|5apVPB`6XlShEPVq(lmH_T zx#R})8%(EEMc=BmqGYpDy*v}8f|Vfjn-Q3nhEI+uQSB^8Bkc|tprA1z>$w2rp%b>- zjUXD^jQ7iDJ*Qgp_FtL0Qoc5G{%ZNmi$t6fJ$GjIOq7+Gt4dhuKKog|-W-6~TW=EQ zzqNYe6ZtVzzO`EXY&~eVR!h#u_OXxclfcs$4!ErfIE5g}24F7BOa4lL0+)?PF6)=> z)l;1CP`N+KayiO?n+eIrL zbJ(ArV~UHf{Q1gq1N>*dc(K;L z^VF!Xj%|VV+$L!IC<#7; zz)I%qlr!p%+GF;powrAwl$lmMZkTy>q`8g+J z=j=>s+{yEe`i`x?fF8ISgC9}OX*|IM0^jm%WkEMEq=3{Rtt6DIl8{ndl~QTElPaUK zcmv(yK~Cffn83-+_M z5M?`+Ah^}mO5if^8}nLD<&Krhl(E3zl*|8wEfYmrm~r>+I}K-|Uw1GpVx<%w8P*RG z39WT7Ty+Pe#0f!S>+YI;!&yzNx+qEZs4KC_6!a4F_C5<~<`2)-An8DdTEfgM89V6^jJ&bO4?OLe}Z+%<>jpG@L`2^vIc}rUlh~#AOG@osKNZkFlhdkMdxI zf!4r=L+pw&NSRmyG5r9(iBhr5kwXrdXVlYQM1fvoz)jS7)*IIT0ze(qV-YNGlv}K{ z6!`upAAPKp(SMya5)kP?3)zCwe*-z*F0@$|pzm)phJf~o%z$O$t&eh>GULu8gN+9R z+9;QQ3+)Am5Lk9TQAj+P7)xaAOkxzEKI&wgLSk>C;QUO0Fl}rD2m;Z|Z1mRy|iq4?W-WI-QjEGSb(OAM}m{ZZthCFq9=>`%b1n^3WCz!Xb31bTn-?k zK_Zdk^&v~Y%HV4ZxE7#w?VElOC2OtDawz*3rGW;yO9Bug@QRF=(3M*Q+)l}_B_N`A zv#r0$wuWw1bgSHM5j>(CYd~V9w_bp{fr-E+IEcE#d2hK>re( z`#TJNnZe&?!P@iK@owK$k}cJh}6j^#_Sv*Wz+?NOzgJ{fSA0~ zz2}aIV-utYkdi=S14ucHL<}j8J{a2TKnzGH03SGxg5MI;W@k#6cu}+!$BL8MSL8Aw zNEKV{uvi7L!*ay?R!Zu>i*}<_qrI>InwRF%0X3S{#XwTv@ej`HR5JIj@ZDbZg-tNI%Z zxXRMqmLbSs&avQq1mDFI5aDK=TrzWS=6=boB4hANB6b>2!1WxEpwuTw5YbyYDnOrA zX2)1k9wt!9+n%anP1`L2D;~*z0JxtCv<8;BU0r%hc2LF~sm-YT4ZyVCKyg?{Ri-&zP4yTg|%L3sR?wyMq7 zd=)u*uC!Y}g;vbrE-*$A6aEG#5Xc}(U!D=@)Zauwl=MN+p$P(W1=clZ_#QBcK+-{2 zZiY3W>ueKYi2hMw0qV)1%!D4{_i5A;eOG$XuK>pckxSk&?fX#0i@{1QEYm4@c4 z0#=%hwwJ+WfrG2fuS9Ou*BBRAgWEOq0qPJg68;42qa;TSg{XfU+A)BsnQ9)Gg&4^U zWyh)bhv+VY#S9)m1g8QF0~sgBE`ZS@Lp27L%fX)uiUO9&>F(YRY7@j&+oTO{jer|b zLd?&|Nq~4m61e45$btABvqF$>6Ag&-;Qk4;>eHzKrKeoP1x#OG=!)U&c#G zocv$LOMd}a&?D65qT!j!ynmsuaqiv{+4@Y8I=SK;gdSv`C_%{M1&@Zw^%U>|QU+y%F@;48^Kz!U|7jMZ-W9jBfOguu2B2A4Dw54koR?&60nFASODIE2NlI2Pi5F zZma=*pjaxju<-$EY6*r!A6H}m<&_%3E=LN#&Tt>R`GF!g!Zq|lKxi=WS(n`ks@gd z4^evRvS7YGRsB7dnEB~{!}ufvnHj%4Gng6ZstfEfW{LhFCY6G|Cd&R={^KgOJ3+>F6*>n4qF-z3vPDZ2yBM(J`{ zwW|PW0&cR=f@6LMB(+*8GZlc;kXnJ{l65DGssAN|-(|q2H_t#cB;Okvy~H`X zD7VOA-gAe6PHd??U2=CUwT=dDZ|_C_dlb~zIwzNLBwa;x@Jqz8;20vCEBEsV83TMO$;9-(5kC@VJ;l%xhk)QKY$>q3g9GDtz4K#eB=WN zg5hu+OGBYvP@}yR>6FC5Ne<#;;m8_BWLvin_mbzVxAv}Pq|Wa3(Ow2R3aR@Y?^tZq)u41Mn7BZ3F@JTKN6` z3($Ti!#0ev(P%7Lf@8!9flwC}Xd!LS&zI*bv{90=&4VD)Vp@hVX$czZ|At<-i3r?Om(M>ZZ5waDG4E4)CyLzIu3!3?M$Kd!s#FysiQrD%w$KZVg zpj@y)Yo3@W3A>$M(cEuC6L?Ss$SCzL!<ioJ`Kmq^YvYK~Bx3a!}$y z&*A3m?(R+S-6Wy?^T6rxL<$%mMWp8vi~*81!6T%4iv-jq0flBF@%NmbOF{~UNB;}d z2QGLQFNtqiQ1a@1G?4<|zt~m=Q4H4QlN01OzrhI#ihxR{JGN!$eS3d;CsN=j%m#}7 z;18ITRb$ZaMOKho-C+lYF6?zzdp4hS9O(_j!jwv3?W}ocFO0#Tx8qtr#BodGfI|UD z>mzMguo~jH3!2ET=X&^BdiiF*7nO!8F^R8o{jc`nyKrbdFLl{M65reUcNLU>>%)w* zMlZQ)wGIOf6=dYp6~Q71q>!ouJ=Ay2!^XApU^oW5%g~zhl`)9FyL)L`=O7AafCB7S zt*h4S7KGj>!9MMQ(~qssLhQ{#>>bDa^5NcIcFi{PV|@h?`Q5CDzHkTXS-lMVC=FL0 z#*)71gCC}~ES9~D z9mH&Qtlx48rLm|>F=Dw@qXKIpCrz9LOI~Rfp-G47MF5Mo@@r!W8Di za{!uWd~jLU7HZ(e{h+FA;t0WM5JVx0(0~_g`!+Dt!}J8Q7gkzTh$Qpmz9$Ao^)0|I zL!9mcm2P*BI9e(Sj}ONEv3_@|2(t`T;6tj9e~T_o=H} zMrow3BXBzK=Y0qt5SO^DPzN5{l)t#J4PD2X_}ISjv3=rWyQja4RQG|&_HsiRK?dS_ ze?T(-c-M{urF~JBY6oGOp(F}GIiN4nK16w+ejHJ9LARGXFcY?KLAJPsmi1l)5H{%D zLec|0M%9mY(?g>iK!8{*D^2$gG?ElAA5DcMJe^waEVrR`NHu8d=?F6xjp|Ab1Oz0e zY^aSOqR6F&ME`U4c7Pv4cUV!v2nvKz4=c6O2Zk4srWZTIcCT1{}oG zN*v@KfJp;b4D6sv8rEaM4Iwz~vzEvOWxFNgyMnW;m;GXmVx?c?0p04tQX%vRs9Z1> zR7}{?e~KVV%3$?>VLUM(cEH{JgoXc;0ZAGhuD~OkMTIp-?Bv=;13OppQ>gr>TuI6= z7L>EDJ#G(XOyWVRCNpj!VrIEv2YW-XXFbc{DbdUWlix_L!iWRY4b3BtehL^r0W5w> zxvLJ83@%wSq^|&rJHVz+D-VnZ<|=L_y`JfTD$=k+Y>k!5bdSpE1?B?_ZZ)6^pofqY5C;WCc;B=o&BX?uqu$_%E=5^6m*f>h zSsx`~aDL+Pu5;r?_hhTxIxfZLfM2^h1)YG#e&Jh)@bnaf-l0t`3NT~eTziu3X5|D% zg);$|xq;7|IbgK^$f48$7FKr=*2=Sh+x|Ef7DqysOyn(2c?)uR z8p%;Chtc4t#(^jX2ZF1_M^>qb2=v?_?R2u}ANkN(O6fyH2}X$QK5GtpaW+2dZ*vfD zlZsYIT?6_80)U{E0@TLNcmiq@a_na>K$&m^U76E;2(kD;Qv)0BJkZae{4S2(9OzLX zJlEc4LP?;8jGu(TjDOVuOM|_nQLC@JaiTqCl1vB;aF&F_AB71Tj8ev}4}u4rG~gka z=`#z_(3WaD$Mq~adw}B-h7_Y3tSQGc7}Eq2w~rF)AW0ntd|A{S))QD$SZ$Gl=8&VE zvECs&6`Qe>2I*zuAwsg^j;CY%Cr1T~xK}dcI(k1+I|n(AywYItKqW{&G;;@|MSOF# zc_d;DCu|)!3F0Q`&cW+Mz5>V0PIq?m96o!L-QWQ{-MQ^i6k)ysS1@j2Z+OzC`v)K) zvobJ2GXFEWI)$Q7-JvV?JXrKTAc(;RYQB169Wsh^Xm`IBgKyu@(r}Xy1B;ii`^63p z7@1IFR!H5s+j{Ojq zR?5U^?j+YrKs1A$FK*p=E*E$IG9IbYGteik;WT961+A%2-XgC~qOR$ULKCuAx8Bg~9IF`abqYg3Dh44+SXp8=OT6bgz_?0kJZ4MF;z+ z(ZMQcM~ogeOui461jg+Iv>CwK8)7?Ka`jb^*dh2#B#~c-?JV6Y^kCwV z7{oAmN!az=YUT?ztQ63qyq8(ciZvpua)?8RvO0tsaF?v-LEOLH%dF;G5Yy^~)ja$w z{v;fsAs$*6*y&)Fk1&o=mG9+YjZ3cC8wuMY8-TpwUVZ~e8RAt+e=Iq$;YrT6a+Hjz z5r8M^!a_LI%Z9txY&`VnfW`&_)l(4j#(TrWX01%Pr#HOT$7`e0-9juY9dC%m&M0AW z;_+RjCgwuz^fzDx92`oX6ynk+xD7WDtUPf0@cTHJFlCbCb3Sl@s&XWS;x9b@8l}6( zxiL_SUpHHF`w+i?{{nd%)C?|Oftpb2KlK{Tnvm@TnI)z#Kuc3Fp7MQ1ZczJgqGSDi z1YjmY@Z&f#hELG{7nyW0t1d1Byv6dDlsGVgSg8dD1^lu!)`Ot{)g{pJ*ju&(S0!g( z9_(=eTmc=N99XQOhBaR6JQSO*$Abp8Ef3F&EYE$2+&SHh__*WVC^%)|MKocz*-|Y&kmx)`x+yY^r~eGa$nPV;lauM}EeLw||B96Hs<_ zclVw0X|{pLb`-Kzx3E34J8~^xu|S1Ft?s_96$ml0dG<@B(uXAxEYdk5awUt>Q{>{?kT#UgipG6G_^Rmhc!Xx=p3y?+C0%fQIppDSTG<@Jt z0#yVcmHAXXmjm>8&WSk1QfhHyv39fMRI5DMa&gi|AkbqHq{Kywy? ziVL`L^yhl%;B#<-q_l0VfdC`@W%$p*-G-1wByF^m0z=8^?&42i@ zPb2R~go|T{^c7Kg!9oHF5*tl0&L`&7ehF; z!CMLpxqc7_93TROlCEd4$+j>c+(Jj6;}%kd4jB$t6M!JDgAam*%j5u6Il2z(7QrY1 zFaqk*Ar#uF7LXgQT~KPLj1Lvm)+4yg0o&C8XnqAe;je^Ha`%CTeUwt&uU?Z&akzB_ zVL;R?{i78#>+q1+x(AedK`3|w4l*wsGvvdqQUuT1F{lP`i>m?wxnsOg#Plu^;i()}c)s$lPW8wS?4C0N8@D z4l{W_Hc4L;_~GbydC*`gBA#e$I{_BRd6l0H;8_pA7Fvt}r0Q8#64<Qr%S8@+f@!Q$3I{rKpW{~L13?n4+p;lVyE$lSJqZTE{rFT8sLNO zsw`EQh$R)BU2_r5NUzI9(pg<;!M9n5-K$s3hGLE1HkVAHxSAN0L)WqGE>7`gt-`9C zI{LSBMf}=xb?lGX#0!H1!o$JCGRc8Hj3B1Z0Pqb`)>u}h&8QCiR~7&*;|jeI$1{2t zzJc1jKU!nnqK?}*-Qu`_L5p>zaKViA(tU#)t`;f(w(w%a9gS6cDnuGTu?!eHaUAR$Re>P$f))*ViJ`BrE zED8q;hzpRg8{&8^K9?X2Vov_g(xh=P2EQ9CSj%&5wW6!+nHQtOz$jS0hsvgjA27xp zF#$PN@e6*Idwd8f_*-F*p;tx7y#~LD9G*dVIUl^kzQ;Yo`xiprg;GlY8r%GJ2H#=u z?-&q_jQ{aw-x8An(A#E$10ZveNw`ifrI~kO;F?Pwmqdo&1aBiSDnC6=$2<@doT1jK znAA+rLQOaWziEE}ZlQG_Y^)Bfwx{S^0bZCK2Ft-;;5tR(19&}x(A?;gCAm=VR&D|{ zZJ`V1NaKWq76<|t-RJem8A+X#!%qZ2O9<8W11fwB3@b5=AuL;QwU7?M;EA;!0 zzuhrYUYs9HMf}mlNeYfK+l;J6W;3N1 zb??|<6j%W^(ZAde&qbq@7ZV?xBC%OCOU2z_%fKv!E61S6198TG1AzSmW{^R11ZEIe zbxgKqxy7ET4J!^7IIdw#nn&fDHemn*?^{R*jolJsDD1Gfo2hFs}A&i~M02!1Xq@lR2y~*c67@)>gQw6P0F(COAZv|oC^gbj}X*(^BhPQ3d4&HGm zBA_AiWu8MyDAoaxW02%A7f3+FPl^g+av|&2$MU17Il%H1ql~(j*u3w_uu_B~ji(VV z!MJA)YZ;uE=yibm*W}b&&p^)vx(6&?2NqAmi(o$#WKh%fz#zi)$r@nstjeyY-%SrZ z2~zbO)XH#&f{Y7?rTWln7Lo(=@}MfYUQT~o-0E{1HspvQDD(0tgHo;YtzH&VMS*?_ z3Ky}UbQ=zS9F7=wC#Lj|A#Dsl4XV)_{?HC^D;U%(RkxO?oJ)nf>SJUz>(GVuzh{2` z8!6un97F$&LO9+lr~-T`_O6aVm4~)^BcN~YT2dsHtdUfDh1f4*r2EvlnBzC72I7jr z0DWE`F2Q8{20Um???1Nh-?XxJN6u8MekVMBz6Cc2REKg`u8o8%vw$q23E#)={r@N% zh-6>eC=U8x<~O_hS@1swi363wB}z)Gk#lRVwAYZGpP;7ke?~fD$PLS9}I&SU&gB8)|CbaW9b&EMMH8SXF~4d=zq%Wbtz-;I4T&)PUhP|9`5}3A|4vM z{%uyn2+hSl;{v(Avw78eqDloTQ3C#rka$H#_x!A4Q#a6L>7wziwZH-`5mdxw+q-*f zQOslp6R}HVps9P(Bs|`MJ6EKy<`668S?R7jR>Hj>Fj=B>)&*AEHtIpA;NX|5T+%>p zCwT|&*qB*c(nD|0)(ZHSOA~Sv(g<;f?pQVf6c2e*k8#8wGT6<4Mt^VHN}GC5$WH2U z)|o;OnL1Ei$p2-Tz^x`=exS#|z$UFE(LU*UP^Zsv2EsZ-W>SMvvosST8fvQTBQx+p z1)1&yJj8^y7?-KT+j}roxTWUb9q5B>$L!aRb`~)Cs=0-~V=AT*IJs3d&xg^hl0nfl z2pApfy^P(*;C==VFgU`1T8cXlyiZAu@@~iEO`pK`Km__I+t_=jnSoU-v2fS+LO2i@ zQ+_IL;Smny7=z;sCK#Mx@F;?v>k%(J8F~E}%kMZgB2a+i<80*#2EV|nLsRlUzl;R= zIp*Llg4}kFvJh1-$%RlOpa}+hkzZb9@C63%GZ4q+A2CKB`Y1gUySV)!v!0YJ{u2;v zYGhC8|Hj;(GN2QdQ93=%*fR`-Ssf>O5#E(#P|VTBB19@}G@sN!8h-W$^C8X74Fco7~5?UxxAan3}r5lULC!6^z3MQ?4{fZVCzICn>mR5Y$lmW<4I=n Z88WKOx)vgREw87s*PCn@uVkSEVZ7*9~AWBxP&7%CH*5 z0UF)soIdaFYZDV=27bXGj(z_RXAR>&2_(M)Zmy!qe=!ZiF_sO-baKAg$}Q(i-sk;% ztFT;X6_<;x(sD^XEBGU=@^V?-7yZ%J*z%ZZxMSkC=wI^pwZ@mn)w>aYqBXfZX&N^T zr|gWrG@Ma)|BL+c6yPyuAK-oN6yO7Z$DIkl6AGRNJn8HQykEfw0Z%yx03UFt(f<(O zY3Cr|g9<(j_>glL@L|>e2;d{mQNTwPd=&68=Q!Zw3O)w-gmV(`Nd+GV{GM|P@F_Lk z3Bd0=9{~P9!6yM*&S}7>75pCHGtODSXBB)3@Q2O};2HN6@OvNdN6tCG=M?+_;PXxe za7Dou;E$b80Dq$3(||8Hvw&w6d(sit8O@y7*wXhReZM*TrUUlDaohxQ>jWyc~ zdLyg&roFP+D+#yl+7UXBdXX#8S`xtYo$u~_S6{fbxbSs->0zyQyLJ;#%Xihhw$C27 z0~y)AzvMpcc*1SDLDb;1$q$01MQjQ;uCZ)F%yN#ooOf~{Bi}3E^V*9-grYlr&6cj! z_S%-4P*$rHdgXdOuv>1u-W#jeTcOkOc|TsSKke9l{AQ$Hcfv-!{!fP3k7?B9hhJZe zTJ4J%Z`RW&&N@#wgJ+*M*Z5Gix)*@h!1gbuQ_5<4Q&3|#kj&vyHWfS+RnrS$(DYV2 z!sY^L`p(>R16SC7pFGP8tVXsY=oR}&z&I}xyiD?v5~c6RN^t;}gJ=nkgoncMK)iAp z6lZp$=yZe^tO8TD%Bt@$SWW}0qZup-4~6Byhe393&B}9c#j`Wedl*c~%aa*Q2@i$o zq3fQEgtyY+lGnoMM%W3Q?!uDoQ9C!*+`zIeC)3Aj*g+6R){1L2+1H9fOM=6)xrv^l zuTaB~aR_LCkRgNcP-L9QXtKQF`R+YiNLTay`XDi@i9l0-t+3JP2npLGBqe5m0%H^bZc31qBYlQg)*`_?b#@t zb?nHs*7b*0*aSJTQMEj2*?Ocg3%^)8U1uo5j)0JJDPcK5cqqcguG!8)*lO93u}fJx z);$ryGP=RKg+;MpU{oifO<_}#Hp~)GdoQGznu739n2yJ2Y7zQn7FY0GxQd~Ht%?z$ItR})|Z3ZE(Mz1@ad7@Dp3L~2A%NdLa4`4(Wew7`F_h10x z1cI%L`SL1WoI0L%0zGMmMzzm9LVn6osJ)QZCJGQp|%4- z!M>wv0NWaLi`b5LuO!MlcF1 zNY`&>f<|#zkJ>MfJKGfFl`Z_h5>TtS0Xp>K$J5e;!SJz%jOr$Hpsj%Y1DjVvpy| ziBovfE7|R~8#tAmc%NWV;j#k-Vd2#cG!=qi_5+#O_4g^Y%ruHpS8tT zH4ewI3r2V5M`=yI=$T`c5iL3e2}u`Ra3vtU!Wz6Tr1@C{f$9|=hhBg%SBn*GyzJ#0 zzU)nCaj%C>a6;}NzlR84vH3PJV@zzA1#{XwVUC-}aMzvQjb+NDU78kg>CG3A5o%hF zj0t^(JeW_!cFw*JIY=0ET@lvnOT<8_l-WHpFl*Xn@0rW^aLeGr#6l;&#FMwo2<;|P z_4>oibc5Qh-`6Umd!`JG0Tutn=e*-o;upN^l}o&b7gy0F^NzAv$d&W>8!hJr-!#zD zA1S|zCh1@Y%_&T29%fXV(^70sM`CkYR{7poZ!~3@{dX8kg;4WW)AsxhLIGGz#9W>V zfRlL3UPY#gxa>&~ZUnQdVdz+EFvYGMQy8+^01N`uEXPICEfD|6jw>%9I)36>j~4EyV>oyn zIBwAJ_!_)%T%?a1UbI%V=6zuE1Ov!8a?&0~f_}@+jDY;M1wSDpuc4V#RWCKysF`4z zB@v_`K(+{zVtOoODsA6JCb9ySSnUwn8+l0dH!Z}Ro9PVw#FX}6y+5!qdga?Ij*Dhiz<)Nz|Oq|riw z##coYm1$d&@FpTmNHs%E$CVA?sp^Ynx7(*nbCJuJNgXru%po(gTR*)VZ4s`APX<=w zf)cuPDq`IZ+Z`XQuET^sIbVT1uXE}+GXndO?vl-}qnXNYx+Pv`7}6Z5XOL6{p1lpB zI1irtXxikCbthB%QKdT@FtzkKYN1$V;6gp7!8KnS&75AYTDLeO$ACai%%Y1L{4Mj+ zYCc0tOnpDLL13j^(ZJL+i)w1-+niWTMG66W8Hb)G*Zs#-PH!AIt?UcEdBe+$2U4Z5GF{2J+= z?61@ArQX|R&EfO@x@f<}VfS=dzr>60IG=J^`wIvH;I_u$viPQfmj0;2SJ5Q%z`b1- z)~DE;e$!A+iU27dyk_z_Mi&2rex) zcRQ!pfCY!+;KvEVOjC(4255)ULv{-HGFPjV_KYLW0293^dj$^6y#5MJ#na_nAy+U3 zpZzTUpG2aqv*m}v|NpTNZ`49O{PBfgX>0D{#l05DS9H%w9%1*SNdrQ2^c{4#8G+?y1k6gclcm$%@{VXH;f$R1KKO=Y)ZB@Tnkq8f} zZ#c2N0j6;vNUM#QF7D2R*qWVnxc!PTzW4uUJk z!Qez47b6;RD%)^+-!$``OGv4V$VGHqqj#_jfIe<{JQ&r2hxwQGs_(-Z5U}w{uQmE7!j46v?H>#b#cG3#FQ}!@zvv z#{8qZOSc~^)^E+G4qI7__~*len%8%Hmx-$wDJH4oh4rOywud zvY9ixQ&|==ZmLzvKVj}w0?AP`GbtCK*67di;_uOvY%ybm`z@D81fMt1(jS-UD%wvu z-*IC2Fiw}c_vW+eOr^B6h+DGlHoT?>-KFWFTV_=|&a$9~cG9DvWG}AZSKm-fy7uk2 znjk2Dc1l<#O0sg)+G@ljAq>zNow6-gt}s!db#Ou=@-yA&O(6HLWD?6#u^Z*H0Zvk# zuc8f~d5^)k@9QZJLycfc8f)GEQtZiYS?MhrN~VSCF*4FPSW*4s2y{+mbg>Akuw9!A z7LpTlk=UhOxt%t{sY!sH*F#%3R6Sa_%EoSR^O+V^C4+Ct^#nK7&?y}Zc@m;Crh7>~ z+;XMF9(auS8=8pjA0OOWyuWDOn_u{P{^sI+>-t@*cK3mGXa2#$Eer1~syCkBSh{;h z!Apz3d3bwi@y=rH0iNFeX0d9;MqNopr_F65=B>z(V{@Fy$ps6U9Cx&JC)G!*ebu^) z55xvYxPa<}jr^Qezdr;6H12sIff8=B1Gn^N$`P`d+(JO7rBXQ>OrAKoR<%JP=a2s> zE(>VNAZY8q1zT7*V;}IRly|WYfCixGq3Qt+HZi!Iw!aFy6s@%^E-*x&af}L6L*;y> z?xem;hofCwbDzQOtzz%3pTPHBjbzQ?UFOjI+Ua9bUk!hvqXaUKQ5a4_s6<=p2#Osp!ay5bvN`T=h0hW?!lr05tUC9`{&HY(Ae-JXc1F7-sr1Cv_8 z&LmV}1&1-FGEt^Dy(#5;>)5PAmhQ(kFZ|KiJcz3e&I zO$cfHBTmhCz4YlEC^S&O?sGjUqg=sNGlELLFkkRIO|GVEETKSv#bp67M|S;C$NbpF(jlJ>SO zfioCQr}F*Sj&o%sq95RKqvhYwbbY0)>MO4`!PX$$alvrl4|f z6BUl&kv><^y_0!kwbiS%N?|t|DC)<~W=S80k+b^y#Mvr^Llwn_8@7kqHhut9{})XO zOF1V94-ln{K08pX28b#v%g9}hQS5l=P2=M4AnnT~kUQEty^uZ9#qIZnu;V+mFuLY` zqtedq73|ChbooekneytbFYFDVGpcvG2yd(N1nD6%<=_;-KOAguKo$7n?2t}nYmEeB z{-^4*$&YY}43;8az@~5I_4X;k0Bok>3OkN#G1((5^@`Y?2R7VwQh68;2HJ2(y<(Fg zfH;j8@$Q}YEjzIWr=OaF2U;=;Nh!mbQA3t-W0+HrUO3T@f08}BJ!@i37BG&yh6`K} za=Ry^;+SJ%2OH39bXOJM~WO8pHPF6@(n`HBDuq)*WF<;`w&9 zTda;f-yZ889Y9UT!_T*$Z=*CuGJ7Qy-w?7Ya(k2W68k{u@xIDbQ0Y0R=}pA@ z%MI7ZreYrx7#_813L&mK4*vGjkjavggj!`rokQda%w`9537o(bToZj*G{Q!u)ZT`& zr(8~Nze;=8v40hcs)V7Y!Q49;=8jCTDn{6$6ay5Qc@O zo-z?yG5UdGYAml8!lB8P|0r6?{*h!81J5Jfd+&SS{T?rlj^+(~T0g$`{ewSg82_FR(I<_Y^Z0tt zB@Dwc%7$Y)R>N#sWy|D!qLC;k2OBS95oHx7_C%dzyR8 z`{X{~*xx)*KF~Z^KG=Mu{7Crz5Z*s3_alu%O}qR#xi2&hHylPc^5@)6FN#Pd1+_KPBnK#mHVBI=bF!#pO^c|#tY5Qmp?D}yBcSjFP2|yo-LnkzEpmxd9Hk} z`GxWq>r1*d#*bLF|_8|62e*UHzLZ7{hJ;-mj^o#P#c)c_iH{8DgzMf*loy?o&MBlXA^o)TG}51z^kwH6=UJrJo#&kA z@w?*8IWIV$|Hv%gcHVH#I4|O^fih>Emr&*p8Q|EBN)D%gz=2uA$tk&TA<5nw0y%EjU-5*Y8>7yG~-> zn7-Ee-1YXFUvIgdt=vY{cOBbr+t)U(T{&jgTaLT#df(!Ln>K^7>MgI`So7UVy}8;} z{v6Wst!mSC{I%7FJDmu!%YL)*Y@>cF$SU{Fn(O&qknrm3$e3M26SeB9%R=6&TdObD zUFG3vN3Ggwx9YWOquy~VtPhE))vEGXW$yCA!nI3EwN;S6?)qv&-)HCNugV?rX2Q0n zlR@V4h55?D)%hS@_bO|u5sa)>{pE_^)(=SGJ=2i+z(oM~Hh`$NTNfJ2tvVZ5TAp8R zG+ZZ`e7WxVs(uS&({9bR{n_?f3#nIH9{^70#sR9XkdUjdRvkyV9!D$B zNoo0&Mtf;G6-->XK6ClX+m|Yr-dVUbH-F`gx%psn{;g}*-nhPS>E-^^u^X2!UAo#! z35qSkA!E+*2=*%1sn&c9j_2KNE2pxk+D#4{8r@Y}c5AmQ9OpXVsH|@I%k36kOuYW? zwRbBsmoLq{R=NJx+}xG9SCE>L;lWM%YI|wPRnz$(wLlaJvTv+%JgSW#aiO)rE_;5E zdaH%BAUlJRuiiqg#JuYV*?D46tA;{Xd{@bf;_GWZZ(gsiuGU*iXrWNKSoPd+67ih9 z?s}{37ElM{cFkRV=Jc}*Rc4$B=i|EWLla|&)cm#j>O2M(?U&SEpm{JR6CF>O7mQx3 z)^1mq+*uC10!F5meSg&p%qP|7xh@j&6XY6gVDNGqNYj_x898FTxup)AU@!8MiSo{e7%dffWBG{qiJrMrm=pqYpz%? z8}C1{X?2aQ!~+YO-tisjhX;+-Eq6+i5&o^TwUY8-|kv1xR(4uD08^?ZvjT z-=3MbJ-yDFK5yfL)wiZvo}>bSkx;~y+@qe| zYTJ^tBo!!jgM{zX@mMZlYCK||5`k>~imykKggwO=3M*FS{ z5`g8YeD7`@2%Es_<4^%bb>_6r{L_ZIgtDJLbHZ<~ov~lmckXPo)=w=iGf}>A zizkHCl~y-`9TkDN0uU;?zBf>rCsIhdU>3|nX4X`%AZ`0uc@l4YqiftVS1>E<`+d&H z1ZKqCO2}-CJ0?bd9HWm}m`-#~>v6U3F1sAIXwdBjCdIQG_1mspZP`^-TdsfL>VaIC zoldI#Xeh`MYe<9CA$fFLjtma4k~pF+Gc|Lo>QvlyUxr0rW|=-&(L}PsMk-+o@8ON^ zZ8C52550X2X*GP~5Al#6?;tL&Q8pc;Y<MNNWy^`L0Zq%qF7Sj3sORN{*RR&1 zQv4+r^Vd6!i*NWQM$Fp6C}E5sz2VoWV7zcmItJ=7=RoaJpo*?iS5XAjV)E*Kr4kfs zAf+UU{>G{s6hdZDalmfSeA06pi;8oouHizmP^r`!Aaa#TZ!FXt-Yw(nQK&Sm2{UbW zc0`buqP747+U0no-F&6eY&&ZW-WMvBJ8RX3ej}9yqhT{Ox6z22B3@3L>Ns<1<2eO@@D4@}`Q|NCzFgm$7!`yTx$Y^LFDS+{*^XR9#zzfGh6>$mD zO)QPJGi_0<&_L=L<#_fcG1ytr-KntcimtYeEP7JYMYCus;&%<-_(P&}9$&A3ON7f@ zqijxhci|dnvYN+xwZO|;y!6_ZJDJY+@uGuoG@X2|aT@u_;+w*E24C-GTzpJs*LYyQ zm)f*86PwA+)MmPCIp*z*I_z8bj1MuzD~T=$g_F2%ZDzWet>gp4Br(t21Hlg``B&$$ z>g}q1`O<}#A;XE-#i@Di9JOTB?S(+Nk@AB?VKIorsVO?8T)8HeT z9Uu^PB`;|)z z8XuG}^MQ3AuJnavtYVM=52Bf8x5>!J?u-7{JeI90N*2$QFD5Hc!n&0DS4>g_eJ zu`$fGj@e!xiZ0fb2O7~9G=W?pvZX-MPbP?L1pXLNx%xr7?$}QIZmZF*I*|N;?v1KK zugL#2l|fC{Ipqcd?Uw3tRg+aQg)<=T!5aia;<$BD5Pl?)^0*`GUTzGs+gkVoE%YD)H|pK3yD&JpmvakG6FF_NICAUwIy|!FW%*)#tSKK zB##gRRp+HgK4m#gRH*d`-Hz7M_amD(iHlLpngwgzN}85s6$^=M25YK?^oJyh85W@= z1Tt#e&Z?qsKnlZ3ab#`XOMqxnny}_NM`qe<4M*73q6=YGQ2B^=#y;ZN$8GO+U27PY zYM?sR#D&5{11egOhN|d6VM&rL4R>T$Wf_wKp@9A2!mDtye~EylaWT@M3Z_!HizxzS zOMV6VJeDu00HGiEA>ZFK!3NNaEsJd6f#twjv1$2`jqaJ7iEcuj_mf*GC)EX`co6o_ zPj7)HfU%@CQvqYaUpMKbZ(Hhz{p?C^EANkN6}ssMCiH_J1|=DFGLRxZ#7JeHXZ`7| zBJQ)0GeCtw3G9bEBl<{eT?Z)Ym2C1 z|H=WWt=UDj(w=aGg9K9l=!`HoS1){dEYf!lkXV*Bi+o(A$(1IAH4_L zj9}`Hxy~1QON00{HElQR&{(m8PYJsRTXgK(?go{1=m|?}WLjtJqalks`lV;kPiS8ugM?Cc+@_cHZ=!k`3y~MTHc}xiG8OZ{ItXXhdZ5*?K-a!%bWAzqKPOAXl$*z28s+Kx~(>&Sy7K53nxHlZf%G#Q|g@kwpCKN0qBvqLyFkX zJ-CcJ&n!?4weMEJ3GG$YhT)(|&ISeqs=p*O+w&TB%~d|EQ8n0S&e-V99SlTg5*b^N zH((jCp>wpARGIVZFn8Iom`&S3jb51ppNm^ z#_xWl@|#2++nj_pK4Fd{U40exk=?|f1n$n`>rr!x<@ym)QP^8Wl7f8{G||c6H|1oV z9DdVI9{iyYOvDzTOECDYRsFV_9bh*g)0$w9<3@iD9Eury zMKXojNJSEaKY}wC8ynU4AlI~|K}*3R;WmcA2qs`NkQY4@sVbV zz97AtS?1JL2l^E973*~M>*#JIa@n(MElnpt>%@A#XnNbN-`jm2IH<0R>eFk+Fe z$@F+quqCZ)lKO$RbVCkpYz&m$wj5g($iYJl=G=2 zLF}#9(BDwmrv1JTRL*Rz-2~aMLt3=kP!&i4OqBfNCR#MDzWN;FbWHcv6KT5qc~1hzMp%k5=IU zqCNu!&$q#tkBXwC$Eu`!EYP{m$d{(xbDo->Dm^*<`1B5S5s5-Kf|THOkfkM@d^5;K zD_5PdWho)eh9dhr z)_rX&{ve*z&}dA&xCJj3=SmL%HBuoNvJBB#nBjZtxZg@2*99wmTpXej7RM4y&8;4d zprbE=&V#2VpdqRs1&k4w$oGm4kJ}(|SmO4ZP#4Nq~jz$Fs+av2@%kf?$^OeM2sG&7HEMrw6rV}Pt3U~ zF22|qJ2ib%sEDuDY9Lf$qZdMrA~OCwY2WPi;^rCq0*pJ_QAcADscg?a*vkkK1OKT; zDbx_Ri3;W;XE6H!dk(oE{Cf=u!CE52)d$3`lD3aTNdI7 zqFAlf&@Kj}WMAX3iG!+VdcyF5{@NS{Su-(MF`#ZF{Yg(}qE!|PH+K8h3Z|E!%PQ*w zyw~}7rGbTNc8ZbGyo%&VH&!DF;D^6J9W4`SasW4oK?T18_Xw^qZfMyp0hzMb3_KDs zxbSj>G}42wh@z%?fJ=~#QiEKaw{O+Rg5knih!-j(O;EDELvGQYpqWB$ez>Z6FQOb} zZt(>{G+q(A#dMp7>{SdN&Tz(xtfmwSPM2d^+tLogH2*jlE zM*uM@4H`Ytw+Qf<){6=D@G{vaD6W1M@TkAc%TMvrBb`Kopg1@t6~aa%m5~FN z%Yx@6I*0!7VT{L&(;6c*>xhJWB5`L*y!#NAL+T_Xq=(c!E`&)=)#+LEGAie_HMCax(v^_|*t2;6*MC;53 z*=g4_L8b{lrUfEzMNGQa%NQn(7~y#uU-6Ox)Asi;?PFubf-fJoxIvst^l(o7B#MTJ zr~WGM`v*;y`p+QsUNlrdyVJu{s)s73#(hhphj;344%HpCBZxFMRK;f0oRRK4`WekV zG#E2zNtPW^Xv=&+GC~mv?vie((RQ3~FB`?2sb3C)Ox(wB;`!;DSc*i8J^n?h9N|MS z2E)YibAU+w1TR0vQP8@xthM14m5l_O@8$>ywNDkcp{!B1x#|3n$P;8L6{lT;H<=_l z7!fzN_Km8)P7pW|8lrFTuD3YkPG+2<$;$+wfSYVFX=O(Wd$Z|mwua~UL%sYwz8=N( z0b%G-5rWK~;lxeDGehGE$RENfwIGyr3eKnqL`7!|zj=h$jXOJFco}gfoSjH1IFrsU z{EoWCtubde!t2JJJ~Quu`|&&B9B>Zecc=4+a|pka60mkyJr9sNTjHjooaDjW zC;>W<5M=V?4dkPyTcuw*3_-CWFl<1{l=v>l#J*cwZq*^UXtf;HP_A6)K2k?iC3Lk7 z2x{8rMC&V^YK~Yl!|X&I)rKk&>HDFeGCNn}2=hY=Q5s)C-v5G|E}~FF`#!ArADT-* z=8Cy~h8*(!)0>5E0oHza_0>h#`3petQP`qWTj}m7)4HR`0n-NzAcY4e_|3r^+5naH zbN5(NzMEcM^+))`?>&kP1ueUFlj_56vSlp^MML_ih!sU}VWTqUk9V`(OgGof!^4=| zEc!dT#qNlcxz8FV{GHx^UVp)#+=AtLB`by%@bUK_-z@mMxAqX0&9Uy-%3dc6FT*$e zeOvpT9O1iW-1#Of=%kS5shjF>v?Dnzor$f|JmxVX+hXRbCm8PNSIv`ND8L`id2 zQf72QBzlE$Mh*vVJ6a^YmV=Re>R)lDx?Gv_E6JuTs-iXh2&JECpKZeiiD+97a3RHIT##-t&uIF4 z3C5q|q`h5aI{S@GP5xv6U&(nB)9@?L_eQEaP%>I84;5lXRd3y zxpc4^k^Y*5@5bi9D4eG>eL#Icxbk9u5M!hc#rhn9+2Cc7@6%%I^@22bAFK~LCV8E) z!VLFD>~28<0vrSuf-vg1+TtKJ4~m`(`sG&Is=frS9PEP7jxZlwX{d`-dF8Ot1H90T z6YPwovYx7|#`q>jG1G6i0Ya*_jPNyelcm;qd6}06Es~FeUcbaNW`}v zB<`HUlW|zwV9={{xMcxW#BnQ~$Xb)hv^kMXC(;Sp7x|ZkTda^un!6=$(o82iySK-? z0raQkOQermxLGnpWH!_p@Nh(4u2@Uv?F60>q3W1hNymZ*AO10D?08Sj=Yjko!pK-j zt9K+{O6Oxr^wvpl!9gQ#rOaGsH-n1F^MG%{DP6=?e0j5D9kT~OO8_E|U#?8OF140F zsMeSgRT3#P?91?&{tVLoTeKdb%DgZ*E+q0A1v$U*+UZ-KkwVj%>;qjen1Ban9wtaZ zm3?Rlk;sArM0)l2n2^@B2T5_&60t&M0I|#5UNHo3u;<%A^!x0?1d1C7c$ow)Xj?Mw zVJ`iS`V;wKk>1-m1Ca(I?SvO{0~EIU>9l8(?Z~mWCdRLp5JJdUA1aE!fNsR37A- zaP%`i*9-DX*p%Z*q_kiyP?Qv1-21Svqy+3BNw_t>l3WEj@qREUp=beOqLo3kglE2U zau6l8cOxFp-tvm8=tv`HI@8xspMCVpCpV9h6V;cnAH{XV>4wKDBm#zeBG#nTIrElk z*hi0e+huIIFsg_&LD-?oQ?TeO`{p)f#k++@;-c7pbUgN7vY!+z8_-S&NN6#ug*zik z(_=kWsQxa7Li0#2S;gRA1}Rq?tR=`08vu;@4Zb9q(19WUgm=Hryx6BixD|E8>8##G zLf;vt3N}ILniUrR*UUe|{G)KGadg2Y*}w=MSzgExXHraLO_@8)?QgMMz>Cb|*wE}G zIGe(PGVsPEikUo|S$RZdfU)38MpQ7z&At2uF-qbc-!m2?Yr*j)clku;kv|j%;;;!C z75HUGyavb-1E76G=aIuOmJPwqaP;GwTBQ3Pdp7qOTWR`V!nn88C+52C)A66(1CsTL z3EL|i`(5nj+-HD?-PCtZiuZTUZ!G%~>4uuHnEb-Z=sgQDZt^4%cHgV-TLt~QRdhhE z080kt#{3b~7MBBolPBbr-#BmfhS7Qz@m+|4LyX&mj_%U+;kg*ryyJlpmc!lcguIb@ z2rHlNo<|&5@f`#DclLG$DfXT7D4W^Ga=1#aYx+Jc6FnKXbI5<~&Uq(0k61PE=Ly8? z>5)uIOdw-gM&^V*d}=-=e%x>UFMLGe#d7x-U-%Yq!C2`0KD0fElB;d6&b6m0BP328 zDTXzp9mt`a#ATx8I7pk&%xD`yo?EUke!Zf@SYaghRg0(C7ALU)43?d@5!;GI-)=(J zaqNxun$74j{fd?w*kNF}<8r5#D;b*A4co&4fExvZE~*U$JOM>SN_z3Dt&O|LC?U{C zj~@@AKQ1tXtdwS_clL>k^eE`~rYv(X5DTH<;1h`aln}3=IDcv8t?QR6Z(P6f%9Xi! z^$%I%ATAJvS1aLWJ=`No5B4T{oYQ=CjOjMFNbRx%C2)Jj5NNel}r-=?)#P$BLm z!mnrJ2I7gZ!H=@vqiyk&M`?2sc@)^3>ii9D=GFVrVul0L1N@AFQW8cYqNivk+BisC zkOW)na$t0_ohPz?G@&?(OW?n_3tM?))Keg;R8z{;&P`b6zrkgPAi%13k6^dU6#`CJ|2Axcjfwl~DviPeL(4vau70x`&2lybQEJ{A|BR>^x^l0GPER+|>?xI@l-Pc{s}2ZZrjv9!R5G;AQ!nwy`%-p@og z^#B%H2$mV~XQiChE@~g|j_yGl zd+1c3s3Jn$n8mCPg)&^xo`b>d+}di}x1M@LM$Cc|&*@X!~_8mQS9q+B!ITdy4c(YNMP~3yIjY{2a);3 z!i;DMZ1`|{G!FZ()V~E54lG+iOQPmyY3$sg+P`pn%UN%Jq{jZU(Xxfc{>c#nxqgQiF;4zt-u)^s4PKhOT;xUg`!C}z*hwxd zvMwxJ+6o2R?7Ykd_OlOD0fY&$fOs>7p{hq%3yiu9C4)rD5DFPIY@UYHE20GgJ!5_t zjA?=vO}__ws8Bf3M3D+DHKKSF34)QuhSpN~kjDcB4c-@{5<*sS)HX;U!q7(-O^|2ASC?(^u{%E}@v@W)PBZg2S_HL2@2o6SUES7q82Cl>@ zx3pBUZ{E}xiIh^@uveOo!T{%8|K`o;lIZ`@i}}$QJI*(2}22Bzz!d2Emx%TaPLIJ7P!?C5=KBGBORe zu#cF-R*|7n@jMeW>H;#)!@$U$x^C>DRNw%a*W@D4*>Pj!;f5nq~~dsL92zh z)zJ@4c{3ty47@{15%^l@{MG_Y4nQQ1m0h*3!hO_>s)B>7Cth7z2fDz}ibNV@BgyEx zc7oAYDu}(dx}f_WiW}3gg=vh z69ysn$45RKf+&$-!|d~~pqh~c@EEvE4eGUR=v3%n*xL?>Ybe}z0~2*zN1xUCcc=JGK}h~W_%_W8(?`;Nfw z%=K*t*2ovK3GH0#361ra3y?W+>f1ndQjACA}xrHARxk-0GLh;*+%6e1Mv!Nibn zcA<0i($Kyc7~7(zr%)5^X-(SJ)>e=E?c+Q|N|WpuqCRLkZ+%v6y^i!1v!{kzh#)}Y z?9EG|;_)58HiZZb`2Y1@BiT+p-I;z%wyQ>!a>(E&<+cTghXYw*Ti=5P0$kylHbQ;B zLEI@sa66S-8)`oZ_75RlWTGHjQ*|HF;td`DHpv$vC;c4ncJlHGF4(e85hh5W=h#!J zDT9uRE#4Z~r4Z~8w!(A3BFt0=2$s$lzkCQohY{`%$Ql@{XJp4=GKT>j0z)=GPLTkf z+#>wCc?b+-8F`2g6czX;i!{DR3I6H4`VQ}lR_D+kzC2^zLir(uZw+7XRa|_7o9foj zNu=3xw6S-2BGmpn1<-1sX)U7u8z#_9!?SqeUXce3t0 z5ADF1clHjBa!+dROdem|nEK+W(@($uUg-;8JbC={?|)(X@z{RDQ73_(!Pi^BWeI;4 zBsMx&G5*Oo(hsBCP2#wh-Q6TcKgH3a5{)?r;?EJ}i z@FHG@05_6nDED+kBKCqtOxba842FC7xRzpdh$hZscAOAb1#@t_1v5Kr18}FgjXHMZ zVbVy&aDp3FneX;?sD%@uj&N}lP#F%5(}$*rvn!ktae&|Uf+R9{FiE#7yireZN~muS z%?tK4h_g^S@OE#0xZjF1#NPtusIzZqetM-IS^zQ?XJjgX{wKAFC7$WSSOhex@u)P7 z?r^6l?Dd2nTu%Uw>gsZXf=S8pDfV>t_U4uTKC3DA4(EhIvBH5C2qDy6{ppAMs~}Ao zOYEnZThmZ6z|FEyHad?E^>B5_pcD5KrF)w%rtlye#|)s><35j$fG~;v0pV#vAMhaK zD2&N?mpz9Z1ph@6{iON_gte!2a*`wASf*|D;l4oKMCeaNRyV^eP@m79aY-0ZmA2{A zaQ?VYG=Y-4%iO&TN(uoOzV8)7?dKKq25Dy#E5J-b$t~UmERYK`ggG5;MrR73RYs z8KLki(MnMqeNgA5 z2l+u5FneQL|ZI~ z6J-M_-xcP@5g`2|fYx_zO-ghKc1@$!U&Ce|99OZm>w)pz7LFxJ;C{C=1`}|$oAvjs z?11@ooNuI0zZTZIBZ3#Bv=^ha52KXBD3vfu`dAH1;m}?F`3JWiaV9vD%qL35&dnSg zr4}5exlb%_N^(pByQB9QPf6Q_w1lWThu8~{O;ffR?d}}a)Ur=&5T-N(=Z>7wN#TAD zqUu~HubrK=8gve=_0IT&u~bguqp1tZH6^|vtz#WK2O;>$Ermtw#cbAn$hl$^L#}MI zT5Egjr%rZ~B?R_$3ehvnv2JH~U7s$>&|_Ddq$me<4%}635a38-XBs3Z#LkMODVxE? zFH0LE`odjv;_4Llln(Zzz|B3*odbX`-0u7kc%4J9hbN0fO+_M`7FV_7n6##IAdDf5 zGC)wQw`y$!B-i}T(;?XceD<=oTt_{-t`#)zcvv3XN^Nie7dlnCo=*liutq!{i)2p`*&kI$Nv&~;1x~~eH!qJ& zEFn!jiXJPTa-eM7;VmMu8+F&wu`@^b_A)QKcoDlCoEC8R#+EBFEa<(e6k96ZQmFV52uaI9DT%l z4~k(wiP-Rjc#}1W3>{=6Sk%)@P+;#IiOsCOCn{CCCLc^*QC(=;qnZ94zJ=fHz-U}+w%KA4%nmFS9;Z7ZS% zB&)v-2xqA?Q#JNn?%hD>2)5XW5!k+kjk-87C){741sJ@H*M?1U7FzpmMyPnxZXytu zdjnwGK_co}1l`iRC`gR@?3lVr3Cj~HmfMs2492~xSSF+|-wpur+AT)sd4K}7T$j76 zp}*GX?#HH!sB#=ujpM^eik&t{J;^bS*Fkh0&U*+q9_Z5ucu;CMpP`e!R1_>v>?Zw zXwvt4z%Yqzg9Lewm|esrFzegdoghhX3)MGCMMN5&n4m6(wT{D4XHn4rR>#ued9;b6 z$spZ=%UcpEVL_spghXLN?t-SlKjJIo1{%@@ziC?a&N5Zx`$Xp#udTri%h`!|3ulF= zJyD^mhWHoaYPdTk8ox940w-EyC?i2=*DBeUXz|9J9Y0+2}52sG&6f6uNBd{Jw3`?^5 z2dM7l=mbXTC6A#3iq+%*Gpq|z4xT&~4!EpMeU2C@0K5S=&oaxon{YlHBgHL zpJ6`%&Yy&~TZd+h!z>qN2&+Ek3VT(seqAhHEMb<8+LQ@z)s{(Wuv>_FG+#&1g+XoD zrvNcUs>3EyZw=mbLNbL?uqQ(>i%El!f~wvZBQPMME^L2V4yX~hr6!7-=zVzLDnuKY z!UusH#J~t9>}FU`+~=ETUck+VnBYS)d-y{f&?E1Zjjh8QK2}@t7*4QJ}Cu&y2cC48~VJc;Bu}78b6dB|Q>Y$KsEIm|&?X z#t`94ZxmEfyt7)n5u~3%Uc~Y+jou8NQHvB&gfVK#`^X71N~*K%k6=Q4~BPin25pw(KpWyrA5>um;1E zO+V6+(q$TXaY!^6BShXqn{Ji7Mr)O%qFCT_pLt*j zcMU@c$JL4tEK&E+hVC=*7#vDelEKuW^)1r(X?9+lk>o&<9nqnM@lLyVWpjnYT%-kF zk^l+@bc|^uo+Vp}qEJF< zpQOAE%NF0jCW(;uv})02bkA(zFlg+<8HFJkH8VW?enQOjCt;>fqr=(G!O%Jn@+!+E zW@en(Sx}h?UsYQ;Rvjl?MMNXmMM2Sn+~Km{mqNQTtQIFuRD}k2CgF;z9*-1J7{vKs zf-qF)EXIGjs4#Yh;^^xsCza8pi&R)+z-8XO%Pd4rW-x=yh=kn;K^aD#6pFsciQJ2P)Jmya^3*P}1q5%%x3e>z-d^|%)xn2Oo$9HB z_-}>`#oGH?j2Et~r4wwHLMl{WE1%9LBvqLx)7c*x5qffWXima`su;$(>2*;(`QHpI zuHigD{5J!NSgq#RB*TKRy#(hjgO;g(#qLj(P>G3uZ>DFCFNcH8MIK!=Gn#Iz_#y7`2TaTmxxA@@*~^l z2<1|ZD|GFZAMMY`X@z&rEA@`jRwD$Nlu(Vb>4W|G5fEK!g3@~>5L|RXqZQ*bG_~F> znR#xO{8uBwCHpq7K;?9$uOk=p;6n>wIF*|?<1#bZ+N6MwCYii?EfoRlTaJ= zpWIn{&ArJeMgJbu&tls<*?Wh>d=Xlg$fu({&z6-=<`Xb!jf`jUO~SnOTt1tBZv4Xd atK)yd(0>=R`?C|-o!NYL|M;PN=6?gVPhGbF diff --git a/env/lib/python3.7/site-packages/pip/_internal/__pycache__/locations.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/__pycache__/locations.cpython-37.pyc deleted file mode 100644 index 499302a1fbca17bf96bc86e7ad76a9a1bbf34a94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4387 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 Itf7&A11Y@bHvj+t diff --git a/env/lib/python3.7/site-packages/pip/_internal/__pycache__/pep425tags.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/__pycache__/pep425tags.cpython-37.pyc deleted file mode 100644 index c15177d29be2415243cf084af978b4f09cd8eb50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8117 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 diff --git a/env/lib/python3.7/site-packages/pip/_internal/build_env.py b/env/lib/python3.7/site-packages/pip/_internal/build_env.py deleted file mode 100644 index 89830e7..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/build_env.py +++ /dev/null @@ -1,215 +0,0 @@ -"""Build Environment used for isolation during sdist building -""" - -import logging -import os -import sys -import textwrap -from collections import OrderedDict -from distutils.sysconfig import get_python_lib -from sysconfig import get_paths - -from pip._vendor.pkg_resources import Requirement, VersionConflict, WorkingSet - -from pip import __file__ as pip_location -from pip._internal.utils.misc import call_subprocess -from pip._internal.utils.temp_dir import TempDirectory -from pip._internal.utils.typing import MYPY_CHECK_RUNNING -from pip._internal.utils.ui import open_spinner - -if MYPY_CHECK_RUNNING: - from typing import Tuple, Set, Iterable, Optional, List - from pip._internal.index import PackageFinder - -logger = logging.getLogger(__name__) - - -class _Prefix: - - def __init__(self, path): - # type: (str) -> None - self.path = path - self.setup = False - self.bin_dir = get_paths( - 'nt' if os.name == 'nt' else 'posix_prefix', - vars={'base': path, 'platbase': path} - )['scripts'] - # Note: prefer distutils' sysconfig to get the - # library paths so PyPy is correctly supported. - purelib = get_python_lib(plat_specific=False, prefix=path) - platlib = get_python_lib(plat_specific=True, prefix=path) - if purelib == platlib: - self.lib_dirs = [purelib] - else: - self.lib_dirs = [purelib, platlib] - - -class BuildEnvironment(object): - """Creates and manages an isolated environment to install build deps - """ - - def __init__(self): - # type: () -> None - self._temp_dir = TempDirectory(kind="build-env") - self._temp_dir.create() - - self._prefixes = OrderedDict(( - (name, _Prefix(os.path.join(self._temp_dir.path, name))) - for name in ('normal', 'overlay') - )) - - self._bin_dirs = [] # type: List[str] - self._lib_dirs = [] # type: List[str] - for prefix in reversed(list(self._prefixes.values())): - self._bin_dirs.append(prefix.bin_dir) - self._lib_dirs.extend(prefix.lib_dirs) - - # Customize site to: - # - ensure .pth files are honored - # - prevent access to system site packages - system_sites = { - os.path.normcase(site) for site in ( - get_python_lib(plat_specific=False), - get_python_lib(plat_specific=True), - ) - } - self._site_dir = os.path.join(self._temp_dir.path, 'site') - if not os.path.exists(self._site_dir): - os.mkdir(self._site_dir) - with open(os.path.join(self._site_dir, 'sitecustomize.py'), 'w') as fp: - fp.write(textwrap.dedent( - ''' - import os, site, sys - - # First, drop system-sites related paths. - original_sys_path = sys.path[:] - known_paths = set() - for path in {system_sites!r}: - site.addsitedir(path, known_paths=known_paths) - system_paths = set( - os.path.normcase(path) - for path in sys.path[len(original_sys_path):] - ) - original_sys_path = [ - path for path in original_sys_path - if os.path.normcase(path) not in system_paths - ] - sys.path = original_sys_path - - # Second, add lib directories. - # ensuring .pth file are processed. - for path in {lib_dirs!r}: - assert not path in sys.path - site.addsitedir(path) - ''' - ).format(system_sites=system_sites, lib_dirs=self._lib_dirs)) - - def __enter__(self): - self._save_env = { - name: os.environ.get(name, None) - for name in ('PATH', 'PYTHONNOUSERSITE', 'PYTHONPATH') - } - - path = self._bin_dirs[:] - old_path = self._save_env['PATH'] - if old_path: - path.extend(old_path.split(os.pathsep)) - - pythonpath = [self._site_dir] - - os.environ.update({ - 'PATH': os.pathsep.join(path), - 'PYTHONNOUSERSITE': '1', - 'PYTHONPATH': os.pathsep.join(pythonpath), - }) - - def __exit__(self, exc_type, exc_val, exc_tb): - for varname, old_value in self._save_env.items(): - if old_value is None: - os.environ.pop(varname, None) - else: - os.environ[varname] = old_value - - def cleanup(self): - # type: () -> None - self._temp_dir.cleanup() - - def check_requirements(self, reqs): - # type: (Iterable[str]) -> Tuple[Set[Tuple[str, str]], Set[str]] - """Return 2 sets: - - conflicting requirements: set of (installed, wanted) reqs tuples - - missing requirements: set of reqs - """ - missing = set() - conflicting = set() - if reqs: - ws = WorkingSet(self._lib_dirs) - for req in reqs: - try: - if ws.find(Requirement.parse(req)) is None: - missing.add(req) - except VersionConflict as e: - conflicting.add((str(e.args[0].as_requirement()), - str(e.args[1]))) - return conflicting, missing - - def install_requirements( - self, - finder, # type: PackageFinder - requirements, # type: Iterable[str] - prefix_as_string, # type: str - message # type: Optional[str] - ): - # type: (...) -> None - prefix = self._prefixes[prefix_as_string] - assert not prefix.setup - prefix.setup = True - if not requirements: - return - args = [ - sys.executable, os.path.dirname(pip_location), 'install', - '--ignore-installed', '--no-user', '--prefix', prefix.path, - '--no-warn-script-location', - ] # type: List[str] - if logger.getEffectiveLevel() <= logging.DEBUG: - args.append('-v') - for format_control in ('no_binary', 'only_binary'): - formats = getattr(finder.format_control, format_control) - args.extend(('--' + format_control.replace('_', '-'), - ','.join(sorted(formats or {':none:'})))) - if finder.index_urls: - args.extend(['-i', finder.index_urls[0]]) - for extra_index in finder.index_urls[1:]: - args.extend(['--extra-index-url', extra_index]) - else: - args.append('--no-index') - for link in finder.find_links: - args.extend(['--find-links', link]) - for _, host, _ in finder.secure_origins: - args.extend(['--trusted-host', host]) - if finder.allow_all_prereleases: - args.append('--pre') - args.append('--') - args.extend(requirements) - with open_spinner(message) as spinner: - call_subprocess(args, spinner=spinner) - - -class NoOpBuildEnvironment(BuildEnvironment): - """A no-op drop-in replacement for BuildEnvironment - """ - - def __init__(self): - pass - - def __enter__(self): - pass - - def __exit__(self, exc_type, exc_val, exc_tb): - pass - - def cleanup(self): - pass - - def install_requirements(self, finder, requirements, prefix, message): - raise NotImplementedError() diff --git a/env/lib/python3.7/site-packages/pip/_internal/cache.py b/env/lib/python3.7/site-packages/pip/_internal/cache.py deleted file mode 100644 index 9379343..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/cache.py +++ /dev/null @@ -1,224 +0,0 @@ -"""Cache Management -""" - -import errno -import hashlib -import logging -import os - -from pip._vendor.packaging.utils import canonicalize_name - -from pip._internal.download import path_to_url -from pip._internal.models.link import Link -from pip._internal.utils.compat import expanduser -from pip._internal.utils.temp_dir import TempDirectory -from pip._internal.utils.typing import MYPY_CHECK_RUNNING -from pip._internal.wheel import InvalidWheelFilename, Wheel - -if MYPY_CHECK_RUNNING: - from typing import Optional, Set, List, Any - from pip._internal.index import FormatControl - -logger = logging.getLogger(__name__) - - -class Cache(object): - """An abstract class - provides cache directories for data from links - - - :param cache_dir: The root of the cache. - :param format_control: An object of FormatControl class to limit - binaries being read from the cache. - :param allowed_formats: which formats of files the cache should store. - ('binary' and 'source' are the only allowed values) - """ - - def __init__(self, cache_dir, format_control, allowed_formats): - # type: (str, FormatControl, Set[str]) -> None - super(Cache, self).__init__() - self.cache_dir = expanduser(cache_dir) if cache_dir else None - self.format_control = format_control - self.allowed_formats = allowed_formats - - _valid_formats = {"source", "binary"} - assert self.allowed_formats.union(_valid_formats) == _valid_formats - - def _get_cache_path_parts(self, link): - # type: (Link) -> List[str] - """Get parts of part that must be os.path.joined with cache_dir - """ - - # We want to generate an url to use as our cache key, we don't want to - # just re-use the URL because it might have other items in the fragment - # and we don't care about those. - key_parts = [link.url_without_fragment] - if link.hash_name is not None and link.hash is not None: - key_parts.append("=".join([link.hash_name, link.hash])) - key_url = "#".join(key_parts) - - # Encode our key url with sha224, we'll use this because it has similar - # security properties to sha256, but with a shorter total output (and - # thus less secure). However the differences don't make a lot of - # difference for our use case here. - hashed = hashlib.sha224(key_url.encode()).hexdigest() - - # We want to nest the directories some to prevent having a ton of top - # level directories where we might run out of sub directories on some - # FS. - parts = [hashed[:2], hashed[2:4], hashed[4:6], hashed[6:]] - - return parts - - def _get_candidates(self, link, package_name): - # type: (Link, Optional[str]) -> List[Any] - can_not_cache = ( - not self.cache_dir or - not package_name or - not link - ) - if can_not_cache: - return [] - - canonical_name = canonicalize_name(package_name) - formats = self.format_control.get_allowed_formats( - canonical_name - ) - if not self.allowed_formats.intersection(formats): - return [] - - root = self.get_path_for_link(link) - try: - return os.listdir(root) - except OSError as err: - if err.errno in {errno.ENOENT, errno.ENOTDIR}: - return [] - raise - - def get_path_for_link(self, link): - # type: (Link) -> str - """Return a directory to store cached items in for link. - """ - raise NotImplementedError() - - def get(self, link, package_name): - # type: (Link, Optional[str]) -> Link - """Returns a link to a cached item if it exists, otherwise returns the - passed link. - """ - raise NotImplementedError() - - def _link_for_candidate(self, link, candidate): - # type: (Link, str) -> Link - root = self.get_path_for_link(link) - path = os.path.join(root, candidate) - - return Link(path_to_url(path)) - - def cleanup(self): - # type: () -> None - pass - - -class SimpleWheelCache(Cache): - """A cache of wheels for future installs. - """ - - def __init__(self, cache_dir, format_control): - # type: (str, FormatControl) -> None - super(SimpleWheelCache, self).__init__( - cache_dir, format_control, {"binary"} - ) - - def get_path_for_link(self, link): - # type: (Link) -> str - """Return a directory to store cached wheels for link - - Because there are M wheels for any one sdist, we provide a directory - to cache them in, and then consult that directory when looking up - cache hits. - - We only insert things into the cache if they have plausible version - numbers, so that we don't contaminate the cache with things that were - not unique. E.g. ./package might have dozens of installs done for it - and build a version of 0.0...and if we built and cached a wheel, we'd - end up using the same wheel even if the source has been edited. - - :param link: The link of the sdist for which this will cache wheels. - """ - parts = self._get_cache_path_parts(link) - - # Store wheels within the root cache_dir - return os.path.join(self.cache_dir, "wheels", *parts) - - def get(self, link, package_name): - # type: (Link, Optional[str]) -> Link - candidates = [] - - for wheel_name in self._get_candidates(link, package_name): - try: - wheel = Wheel(wheel_name) - except InvalidWheelFilename: - continue - if not wheel.supported(): - # Built for a different python/arch/etc - continue - candidates.append((wheel.support_index_min(), wheel_name)) - - if not candidates: - return link - - return self._link_for_candidate(link, min(candidates)[1]) - - -class EphemWheelCache(SimpleWheelCache): - """A SimpleWheelCache that creates it's own temporary cache directory - """ - - def __init__(self, format_control): - # type: (FormatControl) -> None - self._temp_dir = TempDirectory(kind="ephem-wheel-cache") - self._temp_dir.create() - - super(EphemWheelCache, self).__init__( - self._temp_dir.path, format_control - ) - - def cleanup(self): - # type: () -> None - self._temp_dir.cleanup() - - -class WheelCache(Cache): - """Wraps EphemWheelCache and SimpleWheelCache into a single Cache - - This Cache allows for gracefully degradation, using the ephem wheel cache - when a certain link is not found in the simple wheel cache first. - """ - - def __init__(self, cache_dir, format_control): - # type: (str, FormatControl) -> None - super(WheelCache, self).__init__( - cache_dir, format_control, {'binary'} - ) - self._wheel_cache = SimpleWheelCache(cache_dir, format_control) - self._ephem_cache = EphemWheelCache(format_control) - - def get_path_for_link(self, link): - # type: (Link) -> str - return self._wheel_cache.get_path_for_link(link) - - def get_ephem_path_for_link(self, link): - # type: (Link) -> str - return self._ephem_cache.get_path_for_link(link) - - def get(self, link, package_name): - # type: (Link, Optional[str]) -> Link - retval = self._wheel_cache.get(link, package_name) - if retval is link: - retval = self._ephem_cache.get(link, package_name) - return retval - - def cleanup(self): - # type: () -> None - self._wheel_cache.cleanup() - self._ephem_cache.cleanup() diff --git a/env/lib/python3.7/site-packages/pip/_internal/cli/__init__.py b/env/lib/python3.7/site-packages/pip/_internal/cli/__init__.py deleted file mode 100644 index e589bb9..0000000 --- a/env/lib/python3.7/site-packages/pip/_internal/cli/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -"""Subpackage containing all of pip's command line interface related code -""" - -# This file intentionally does not import submodules diff --git a/env/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index f73d4453582eca1d1f0f6a43d0382c9739da8b9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 229 zcmXv{u?oU46imBV3f&#ENrzgT6%iLVmu`ZDn4~qBzQ#5M>+GL6`Ac2>1UDyN3m)9P zclY4lHi|-mfamo1!1*4`A093nWD}rBav;*nNbKKtS$ncvTzH|VsK9Xz8Vbsdp;b<; zwzCHFvg9DC(V(aXr|O&wMQdfaQxeZoh5Oj+CydETF!my~k6%XlE>l<96pIoKjlv@KKDh)*SWrnb)oOZx`De9nvL9gjuVa< zT8;dAzG1K1`aKsG8qT_dXUoq&X6s|V?H6z_`i?(_`?xPwS-E)l&YfthUUQReFL7JZ zqd>;4x1U6{sL=|8q#iZhdNWSEFbsTm#4hf=a`y zH!Ceq#(^vgH4f~C*Yx9xU#}%mynnE-tzK#CJt-`FSKag9jRHHl$k z7#OjM+2;w{;k$WRB1P!gH|E%hIAy-+i{Fbm)?taE;kh|>#5??8GG!?YHOuDMFZO$rS1LC@yLY$p?%hvT?%ck2ds#X3SXsOK>8;hL90At_yh{+pY6PN-V$sA{#fYad zZQ-;Z6n`r^IMI~o83_V~^AP8TN0lSxvsDV{Tn zq0J&mO2r>Sh(b#S4=eDz^Okw%J2;c3n)CO2oacL-PuLS^`vTr%IFu@x#E*u7?F1pr}%Nj5u3-qn9fEQR{n%E%KISBF05)NzuuPpPf z8M<~C^+fULJge`4$`?IWCOhNqh+6$)KkwkZBOh|LGM6udQdceQYyiCqP{y?H-F}as z#mX-$5ydJWG#}Pw)Rc2rQU)@Maz1SOLHo9pk(87LB-vgW@j_aMUo_@ zGIoOlWqGYu(DYTVB|$}!wUm{$K5Amf_!V?ek{nvufNBIazWUk9%BQziS1TXfzO$m7 zN*Fb_bdadA3KD}%vX@-blUuQxr9P?UCEJxj`&CH}T7kMie$;~o8YfocUG7^l+Hb}3 z2gKXlL7ga1Dy#M=l76gm`mXXBYOE#(DXh};8i9P1c3p%l`=PI$XwaysLceEIBCIKs z8aD)BztBjRHWTd%IyyCRUTQ1jstSY=dK*EgOgv^80@15alDtlmkL!3<#o>q<2RLqH zVy44QKEq2~@JY;$nB=Aqd|p3W!V)%j44W5)1w0!#ukcAcJ9^y_CETa@f-%ph#1!_G z%f_Dcs==~r;(;v9xK-4LaV+}VC zuUD&^^)RSb-$2jr*JbuVSkbe`laa=Ff)Vp!kK-Tp_ z_aRz-ZzBvqanNB@tIrYne`x5YWRwOu(RKG8l=B{Xb$AvyX1)fYBDc03)OItTGD!Ai z^ZIkjYoq*c7N90dQjwBWCYI0mHJz+=T^LDikD4VM$NNhaA?nPhxr!0;o* zMQ6DeD}KsP4Bb`Wxf_C67gILn>%f-OsVTb|$wtk? zKN-*W8p@`l(RFg*_tfBgg%J~LlL>zK+6$`l3nEe8#Rf@#43)$pZ=bq^%6p7}bSIv6qaXsm$JhyrS2o)uJ3XUu8DcaclNE0o0OjFx67NA(X(*-MSc-w%Tul!#(#HB7V%_=zGKg`#2q#=iJpNvqz; diff --git a/env/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-37.pyc deleted file mode 100644 index 86bc1a7ea604f1beb075082a438b14fd0e4d56ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7749 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 On=EN%efSTR5C0FS7;qZ^ diff --git a/env/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-37.pyc deleted file mode 100644 index 30734361c6c60216c29bba36c8d0bcac35e32f0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16813 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 lg-brO$IMLhNXp+^LjQ+6SVm|5le*q;1A5s7S diff --git a/env/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-37.pyc deleted file mode 100644 index 655ea9f95b5d114c3153345ae9184169b7cf86e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2315 zcmZWrTW=gS6drqSyR)|@*``TUq){O)E0GQG01^sOA#G^|go?Hg9jHc=wRba{xz+Zz z$!hk66p1G!-VsU!4Ny{{e&;fk6<#2?~%Nae!eo6En2}3#m0Lu~R2-G;b$vS_^7vJ*exs zlXz((Xr#@cnYMzKmbpng?F1do*OCkALa?Cuda{@<1xv`FOYA4m>m}XvVsJ5C4whlP zL7F2RTp}&fcxD7Eq)nPIt`dCD=yj%_e&+Ky8zs~)l4wBvVb1(Po^in@0|5(ulo6jE z7P;Exi+$>+QJncj#5iT%b1>A{?IGC+!zYySIM2cmrrsbWc_CoRdsr^+JDeWL|; z^-1~GgMvirf*W)gO%lOx)1)avqX+AY^w$MabhcP9hebEyD{=Qv(^o8rvt1rmm(nQ9nh*Ciba$ie{KN!Yi?8jGM$IwIA`SF*KKr5`|6CI%$j6 zxKpB2JTpPxg%VCcfa|cjAQq2}nMJ%2QUQNvl-3R77+o@EHff!>rF{x72$xC(L2pk# z+R;A!+j;xJ&ZF*%q&Va2T8p7T7vY8 zqZi&*0_g)@DYidRk5ZMuF{W4FOsD=aXfL7F zy}ST)Q4&UM#3jx-xGoa=(v9}GW~^}@XVN7xybv5)3&UXyXG5l5B29k8r8@^GQ|^-s zX>>s6feA+}pA-sA8D&v2pI%Vmt0Fg-SjuWvQ^y;G@&SuAqI-_4S6B%To=Rs9n+7;8 zEDlBhU#4J~DP3GH%u^@iXQ*ZGfx=g@U@D-j4P*^Ee+P)+V1$tc-7`H@!%fu17_C@s zm^-F}x~Pd?CWm^Sa-hcLzrZL=YW$(nI7N^o3O#s?*|spp)`?xBF;+OLX2Kb})$F9E z@LHNIC{2P^4T29a8;g2r9zz*dJYdk%m^RP$s(mx7v_#{;Wq*riX&oa#AV`*t5t=!r z&3-GLlNPZ{dl_B>x3-CM(kY!&bc}w07ZUg>)X&_~1%z8_Pid9zP?c+UmnjTLOQGty zVyE3nc97*yGbq}+T>4km`ITumjgI!Hf0R%Blt!7Tq^7^&_ZGBorB_uol~3#%C}LNY zVuuToPlU9evKX@6S28z=Gs5mr}{x3z@P zG=D;SHEHRa`byY2%d>gykae{d(u70e!iOW&DQu4>lyhmOd{jxbf|ro3(xe0Wu0!YQ z^#*q8ZAgbU{A%W9R0CSWK(PnO)5dMHi9Fm}lWrK2d;s9^;ZS9`3E8T#5-b4Me+l+J zfV~3D${X^2mFXI;8ohG)+@ARt?3Ifu@SIac4+pgRR%*}5bITJEC%m7=fHzegq$-uK zJ+N99M+JOK8T=!GFw7@SWnD{2z+k9pV6cJ}Q%-vgZ`!2_bh5UU=46u4ZB;aMVYRgT Tny85`m|bum{ICT)IQHuQ$1R2i diff --git a/env/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/parser.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/parser.cpython-37.pyc deleted file mode 100644 index 60abd8f9f0a2b88228f6d8f83827d9667799d773..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8893 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